@colijnit/configurator 261.1.1 → 261.20.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/{fesm2015/colijnit-configurator.js → fesm2022/colijnit-configurator.mjs} +19092 -18478
- package/fesm2022/colijnit-configurator.mjs.map +1 -0
- package/index.d.ts +3301 -0
- package/lib/components/answer-card/style/_layout.scss +3 -3
- package/lib/components/answers-slideout/style/_layout.scss +1 -0
- package/package.json +17 -13
- package/bundles/colijnit-configurator.umd.js +0 -20167
- package/bundles/colijnit-configurator.umd.js.map +0 -1
- package/colijnit-configurator.d.ts +0 -5
- package/esm2015/colijnit-configurator.js +0 -5
- package/esm2015/lib/builder.js +0 -795
- package/esm2015/lib/components/answer-card/answer-card.component.js +0 -313
- package/esm2015/lib/components/answer-card/answer-card.module.js +0 -50
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +0 -182
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +0 -34
- package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +0 -490
- package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +0 -61
- package/esm2015/lib/components/color-filter/color-filter.component.js +0 -59
- package/esm2015/lib/components/color-filter/color-filter.module.js +0 -26
- package/esm2015/lib/components/configurator/configurator.component.js +0 -133
- package/esm2015/lib/components/configurator/configurator.module.js +0 -42
- package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +0 -222
- package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +0 -48
- package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +0 -82
- package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +0 -163
- package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +0 -49
- package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +0 -33
- package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +0 -60
- package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +0 -17
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +0 -46
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +0 -26
- package/esm2015/lib/components/element-buttons/element-buttons.component.js +0 -168
- package/esm2015/lib/components/element-buttons/element-buttons.module.js +0 -30
- package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +0 -186
- package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +0 -34
- package/esm2015/lib/components/image-zoom/image-zoom.component.js +0 -61
- package/esm2015/lib/components/image-zoom/image-zoom.module.js +0 -30
- package/esm2015/lib/components/lite-selector/lite-selector.component.js +0 -206
- package/esm2015/lib/components/lite-selector/lite-selector.module.js +0 -34
- package/esm2015/lib/components/product-configurator/product-configurator.component.js +0 -184
- package/esm2015/lib/components/product-configurator/product-configurator.module.js +0 -72
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +0 -237
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +0 -38
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +0 -284
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +0 -42
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +0 -72
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +0 -34
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +0 -82
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +0 -30
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +0 -80
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +0 -34
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +0 -93
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +0 -34
- package/esm2015/lib/components/progress-bar/progress-bar.component.js +0 -55
- package/esm2015/lib/components/progress-bar/progress-bar.module.js +0 -29
- package/esm2015/lib/components/scene-options/scene-options.component.js +0 -164
- package/esm2015/lib/components/scene-options/scene-options.module.js +0 -38
- package/esm2015/lib/components/selections-summary/selections-summary.component.js +0 -163
- package/esm2015/lib/components/selections-summary/selections-summary.module.js +0 -45
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +0 -171
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +0 -34
- package/esm2015/lib/components/slideout/slideout.component.js +0 -83
- package/esm2015/lib/components/slideout/slideout.module.js +0 -17
- package/esm2015/lib/components/summary-line/summary-line.component.js +0 -273
- package/esm2015/lib/components/summary-line/summary-line.module.js +0 -44
- package/esm2015/lib/components/tag-filter/tag-filter.component.js +0 -39
- package/esm2015/lib/components/tag-filter/tag-filter.module.js +0 -21
- package/esm2015/lib/components/threedselector/threedselector.component.js +0 -155
- package/esm2015/lib/components/threedselector/threedselector.module.js +0 -34
- package/esm2015/lib/core/helper/variation-helper.js +0 -553
- package/esm2015/lib/core/shader/floor-fade.shader.js +0 -33
- package/esm2015/lib/core/textures/depth-data-texture.js +0 -19
- package/esm2015/lib/directives/directives.module.js +0 -26
- package/esm2015/lib/directives/visibility-observer-master.directive.js +0 -53
- package/esm2015/lib/directives/visibility-observer.directive.js +0 -54
- package/esm2015/lib/enum/ar-feature.enum.js +0 -14
- package/esm2015/lib/enum/configuration-key.enum.js +0 -41
- package/esm2015/lib/enum/configuration-template.enum.js +0 -6
- package/esm2015/lib/enum/device-size-type.js +0 -7
- package/esm2015/lib/enum/device-tier.enum.js +0 -7
- package/esm2015/lib/enum/icon.enum.js +0 -113
- package/esm2015/lib/enum/item-type.enum.js +0 -23
- package/esm2015/lib/enum/light.enum.js +0 -9
- package/esm2015/lib/enum/navigator-type.enum.js +0 -6
- package/esm2015/lib/enum/output-encoding.enum.js +0 -9
- package/esm2015/lib/enum/result-type.enum.js +0 -21
- package/esm2015/lib/enum/scene-event.enum.js +0 -12
- package/esm2015/lib/enum/shadow-map-type.enum.js +0 -8
- package/esm2015/lib/enum/texture-type.js +0 -9
- package/esm2015/lib/enum/tone-mapping-local.enum.js +0 -12
- package/esm2015/lib/enum/view-mode.enum.js +0 -7
- package/esm2015/lib/enum/xr-mode.enum.js +0 -6
- package/esm2015/lib/environments/environment.js +0 -8
- package/esm2015/lib/interfaces/aa-options.interface.js +0 -2
- package/esm2015/lib/interfaces/adjustable-element.interface.js +0 -2
- package/esm2015/lib/interfaces/ao-options.interface.js +0 -2
- package/esm2015/lib/interfaces/changes.interface.js +0 -2
- package/esm2015/lib/interfaces/configuration-data.interface.js +0 -2
- package/esm2015/lib/interfaces/light-preset.interface.js +0 -2
- package/esm2015/lib/interfaces/post-processing-setting.interface.js +0 -2
- package/esm2015/lib/interfaces/scene-option-button.interface.js +0 -6
- package/esm2015/lib/interfaces/screen-size-info.js +0 -2
- package/esm2015/lib/interfaces/setting.interface.js +0 -2
- package/esm2015/lib/interfaces/texture.interface.js +0 -2
- package/esm2015/lib/interfaces/vignette-options.interface.js +0 -2
- package/esm2015/lib/model/ar-position-indicator.js +0 -18
- package/esm2015/lib/model/camera-settings.js +0 -14
- package/esm2015/lib/model/configuration-result-object.js +0 -6
- package/esm2015/lib/model/configurator-error-message.js +0 -9
- package/esm2015/lib/model/configurator-settings.js +0 -25
- package/esm2015/lib/model/custom-button.js +0 -16
- package/esm2015/lib/model/factory.js +0 -28
- package/esm2015/lib/model/icon.js +0 -112
- package/esm2015/lib/model/intersected-objects.js +0 -7
- package/esm2015/lib/model/light-preset.js +0 -73
- package/esm2015/lib/model/light-properties.js +0 -45
- package/esm2015/lib/model/material.js +0 -11
- package/esm2015/lib/model/metadata.js +0 -2
- package/esm2015/lib/model/render-parameters.js +0 -16
- package/esm2015/lib/model/setting-options.js +0 -71
- package/esm2015/lib/model/settings.js +0 -16
- package/esm2015/lib/model/shadow-properties.js +0 -10
- package/esm2015/lib/model/skin.js +0 -3
- package/esm2015/lib/model/texture.js +0 -76
- package/esm2015/lib/model/variation-settings.js +0 -54
- package/esm2015/lib/model/variation.js +0 -3
- package/esm2015/lib/model/xr-reticle.js +0 -79
- package/esm2015/lib/modules/render/enum/scene-type.enum.js +0 -6
- package/esm2015/lib/modules/render/model/ar-parameters.js +0 -12
- package/esm2015/lib/modules/render/model/scene-setting.js +0 -6
- package/esm2015/lib/modules/render/model/scene-settings.js +0 -3
- package/esm2015/lib/pipes/append.pipe.js +0 -21
- package/esm2015/lib/pipes/google-translate.pipe.js +0 -21
- package/esm2015/lib/pipes/localize.pipe.js +0 -28
- package/esm2015/lib/pipes/pipes.module.js +0 -41
- package/esm2015/lib/pipes/prepend.pipe.js +0 -21
- package/esm2015/lib/pipes/strip-html.pipe.js +0 -17
- package/esm2015/lib/services/app-event.service.js +0 -36
- package/esm2015/lib/services/app-initializer.service.js +0 -27
- package/esm2015/lib/services/ar.service.js +0 -844
- package/esm2015/lib/services/build-furniture-base.service.js +0 -1181
- package/esm2015/lib/services/build-furniture-without-scene.service.js +0 -86
- package/esm2015/lib/services/build-furniture.service.js +0 -169
- package/esm2015/lib/services/bundle-initialzer.service.js +0 -113
- package/esm2015/lib/services/camera.service.js +0 -123
- package/esm2015/lib/services/configuration.service.js +0 -79
- package/esm2015/lib/services/configurator-connector.service.js +0 -830
- package/esm2015/lib/services/configurator.service.js +0 -285
- package/esm2015/lib/services/configuring.service.js +0 -119
- package/esm2015/lib/services/controls.js +0 -799
- package/esm2015/lib/services/debug.service.js +0 -43
- package/esm2015/lib/services/dictionary.service.js +0 -65
- package/esm2015/lib/services/dynamic-camera.service.js +0 -96
- package/esm2015/lib/services/floor-plane.service.js +0 -252
- package/esm2015/lib/services/font.service.js +0 -27
- package/esm2015/lib/services/google-translate.service.js +0 -79
- package/esm2015/lib/services/icon-cache.service.js +0 -44
- package/esm2015/lib/services/intersection.service.js +0 -47
- package/esm2015/lib/services/item.service.js +0 -75
- package/esm2015/lib/services/json-utils.service.js +0 -48
- package/esm2015/lib/services/light-creation.service.js +0 -35
- package/esm2015/lib/services/light-presets.service.js +0 -157
- package/esm2015/lib/services/lights.service.js +0 -146
- package/esm2015/lib/services/load-furniture-base.service.js +0 -164
- package/esm2015/lib/services/load-furniture-without-scene.service.js +0 -45
- package/esm2015/lib/services/load-furniture.service.js +0 -72
- package/esm2015/lib/services/loader.service.js +0 -32
- package/esm2015/lib/services/locator.service.js +0 -11
- package/esm2015/lib/services/message-board.service.js +0 -50
- package/esm2015/lib/services/post-processing.service.js +0 -378
- package/esm2015/lib/services/product-configurator.service.js +0 -16
- package/esm2015/lib/services/progress.service.js +0 -20
- package/esm2015/lib/services/scene-event.service.js +0 -246
- package/esm2015/lib/services/scene-options.service.js +0 -24
- package/esm2015/lib/services/scene.service.js +0 -313
- package/esm2015/lib/services/screen-size-analysis.service.js +0 -97
- package/esm2015/lib/services/settings.service.js +0 -142
- package/esm2015/lib/services/switch-build-furniture.service.js +0 -37
- package/esm2015/lib/services/switch-load-furniture.service.js +0 -35
- package/esm2015/lib/services/threedselector.service.js +0 -72
- package/esm2015/lib/services/utils.service.js +0 -207
- package/esm2015/lib/services/variation-cache.service.js +0 -143
- package/esm2015/lib/services/variation.service.js +0 -490
- package/esm2015/lib/services/view-mode.service.js +0 -37
- package/esm2015/lib/services/vr.service.js +0 -191
- package/esm2015/lib/services/xr.service.js +0 -294
- package/esm2015/lib/utils/asset.utils.js +0 -120
- package/esm2015/lib/utils/base-utils.js +0 -9
- package/esm2015/lib/utils/color.utils.js +0 -30
- package/esm2015/lib/utils/debug.utils.js +0 -9
- package/esm2015/lib/utils/device.utils.js +0 -25
- package/esm2015/lib/utils/file.utils.js +0 -167
- package/esm2015/lib/utils/image.utils.js +0 -61
- package/esm2015/lib/utils/json-parser.utils.js +0 -180
- package/esm2015/lib/utils/material.utils.js +0 -433
- package/esm2015/lib/utils/object.utils.js +0 -360
- package/esm2015/lib/utils/relative-position.utils.js +0 -75
- package/esm2015/lib/utils/rotation-helper.utils.js +0 -15
- package/esm2015/lib/utils/scene-3d.utils.js +0 -213
- package/esm2015/lib/utils/scene-utils.js +0 -191
- package/esm2015/lib/utils/text-utils.js +0 -68
- package/esm2015/lib/utils/threed.utils.js +0 -281
- package/esm2015/lib/utils/variation-utils.js +0 -459
- package/esm2015/public-api.js +0 -65
- package/fesm2015/colijnit-configurator.js.map +0 -1
- package/lib/builder.d.ts +0 -83
- package/lib/components/answer-card/answer-card.component.d.ts +0 -58
- package/lib/components/answer-card/answer-card.module.d.ts +0 -11
- package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +0 -38
- package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +0 -10
- package/lib/components/answers-slideout/answers-slideout.component.d.ts +0 -86
- package/lib/components/answers-slideout/answers-slideout.module.d.ts +0 -16
- package/lib/components/color-filter/color-filter.component.d.ts +0 -20
- package/lib/components/color-filter/color-filter.module.d.ts +0 -8
- package/lib/components/configurator/configurator.component.d.ts +0 -37
- package/lib/components/configurator/configurator.module.d.ts +0 -12
- package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +0 -30
- package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +0 -13
- package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +0 -16
- package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +0 -26
- package/lib/components/configurator-loader/configurator-loader.component.d.ts +0 -7
- package/lib/components/configurator-loader/configurator-loader.module.d.ts +0 -9
- package/lib/components/configurator-scene/configurator-scene.component.d.ts +0 -24
- package/lib/components/configurator-scene/configurator-scene.module.d.ts +0 -7
- package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +0 -7
- package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +0 -8
- package/lib/components/element-buttons/element-buttons.component.d.ts +0 -32
- package/lib/components/element-buttons/element-buttons.module.d.ts +0 -9
- package/lib/components/element-toolbar/element-toolbar.component.d.ts +0 -27
- package/lib/components/element-toolbar/element-toolbar.module.d.ts +0 -10
- package/lib/components/image-zoom/image-zoom.component.d.ts +0 -15
- package/lib/components/image-zoom/image-zoom.module.d.ts +0 -9
- package/lib/components/lite-selector/lite-selector.component.d.ts +0 -40
- package/lib/components/lite-selector/lite-selector.module.d.ts +0 -10
- package/lib/components/product-configurator/product-configurator.component.d.ts +0 -50
- package/lib/components/product-configurator/product-configurator.module.d.ts +0 -15
- package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +0 -35
- package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +0 -11
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +0 -31
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +0 -13
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +0 -20
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +0 -20
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +0 -21
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +0 -10
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +0 -21
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +0 -10
- package/lib/components/progress-bar/progress-bar.component.d.ts +0 -10
- package/lib/components/progress-bar/progress-bar.module.d.ts +0 -8
- package/lib/components/scene-options/scene-options.component.d.ts +0 -24
- package/lib/components/scene-options/scene-options.module.d.ts +0 -11
- package/lib/components/selections-summary/selections-summary.component.d.ts +0 -38
- package/lib/components/selections-summary/selections-summary.module.d.ts +0 -12
- package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +0 -27
- package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +0 -10
- package/lib/components/slideout/slideout.component.d.ts +0 -22
- package/lib/components/slideout/slideout.module.d.ts +0 -7
- package/lib/components/summary-line/summary-line.component.d.ts +0 -50
- package/lib/components/summary-line/summary-line.module.d.ts +0 -11
- package/lib/components/tag-filter/tag-filter.component.d.ts +0 -9
- package/lib/components/tag-filter/tag-filter.module.d.ts +0 -7
- package/lib/components/threedselector/threedselector.component.d.ts +0 -38
- package/lib/components/threedselector/threedselector.module.d.ts +0 -10
- package/lib/core/helper/variation-helper.d.ts +0 -25
- package/lib/core/shader/floor-fade.shader.d.ts +0 -5
- package/lib/core/textures/depth-data-texture.d.ts +0 -5
- package/lib/directives/directives.module.d.ts +0 -8
- package/lib/directives/visibility-observer-master.directive.d.ts +0 -12
- package/lib/directives/visibility-observer.directive.d.ts +0 -16
- package/lib/enum/ar-feature.enum.d.ts +0 -12
- package/lib/enum/configuration-key.enum.d.ts +0 -39
- package/lib/enum/configuration-template.enum.d.ts +0 -4
- package/lib/enum/device-size-type.d.ts +0 -5
- package/lib/enum/device-tier.enum.d.ts +0 -5
- package/lib/enum/icon.enum.d.ts +0 -111
- package/lib/enum/item-type.enum.d.ts +0 -21
- package/lib/enum/light.enum.d.ts +0 -7
- package/lib/enum/navigator-type.enum.d.ts +0 -4
- package/lib/enum/output-encoding.enum.d.ts +0 -7
- package/lib/enum/result-type.enum.d.ts +0 -19
- package/lib/enum/scene-event.enum.d.ts +0 -10
- package/lib/enum/shadow-map-type.enum.d.ts +0 -6
- package/lib/enum/texture-type.d.ts +0 -7
- package/lib/enum/tone-mapping-local.enum.d.ts +0 -10
- package/lib/enum/view-mode.enum.d.ts +0 -5
- package/lib/enum/xr-mode.enum.d.ts +0 -4
- package/lib/environments/environment.d.ts +0 -4
- package/lib/interfaces/aa-options.interface.d.ts +0 -4
- package/lib/interfaces/adjustable-element.interface.d.ts +0 -5
- package/lib/interfaces/ao-options.interface.d.ts +0 -18
- package/lib/interfaces/changes.interface.d.ts +0 -9
- package/lib/interfaces/configuration-data.interface.d.ts +0 -40
- package/lib/interfaces/light-preset.interface.d.ts +0 -22
- package/lib/interfaces/post-processing-setting.interface.d.ts +0 -11
- package/lib/interfaces/scene-option-button.interface.d.ts +0 -19
- package/lib/interfaces/screen-size-info.d.ts +0 -10
- package/lib/interfaces/setting.interface.d.ts +0 -8
- package/lib/interfaces/texture.interface.d.ts +0 -44
- package/lib/interfaces/vignette-options.interface.d.ts +0 -4
- package/lib/model/ar-position-indicator.d.ts +0 -4
- package/lib/model/camera-settings.d.ts +0 -12
- package/lib/model/configuration-result-object.d.ts +0 -30
- package/lib/model/configurator-error-message.d.ts +0 -8
- package/lib/model/configurator-settings.d.ts +0 -62
- package/lib/model/custom-button.d.ts +0 -10
- package/lib/model/factory.d.ts +0 -5
- package/lib/model/icon.d.ts +0 -4
- package/lib/model/intersected-objects.d.ts +0 -6
- package/lib/model/light-preset.d.ts +0 -33
- package/lib/model/light-properties.d.ts +0 -25
- package/lib/model/material.d.ts +0 -41
- package/lib/model/metadata.d.ts +0 -78
- package/lib/model/render-parameters.d.ts +0 -12
- package/lib/model/setting-options.d.ts +0 -67
- package/lib/model/settings.d.ts +0 -10
- package/lib/model/shadow-properties.d.ts +0 -7
- package/lib/model/skin.d.ts +0 -15
- package/lib/model/texture.d.ts +0 -52
- package/lib/model/variation-settings.d.ts +0 -55
- package/lib/model/variation.d.ts +0 -11
- package/lib/model/xr-reticle.d.ts +0 -17
- package/lib/modules/render/enum/scene-type.enum.d.ts +0 -4
- package/lib/modules/render/model/ar-parameters.d.ts +0 -9
- package/lib/modules/render/model/scene-setting.d.ts +0 -13
- package/lib/modules/render/model/scene-settings.d.ts +0 -4
- package/lib/pipes/append.pipe.d.ts +0 -7
- package/lib/pipes/google-translate.pipe.d.ts +0 -11
- package/lib/pipes/localize.pipe.d.ts +0 -10
- package/lib/pipes/pipes.module.d.ts +0 -11
- package/lib/pipes/prepend.pipe.d.ts +0 -7
- package/lib/pipes/strip-html.pipe.d.ts +0 -7
- package/lib/services/app-event.service.d.ts +0 -32
- package/lib/services/app-initializer.service.d.ts +0 -14
- package/lib/services/ar.service.d.ts +0 -120
- package/lib/services/build-furniture-base.service.d.ts +0 -117
- package/lib/services/build-furniture-without-scene.service.d.ts +0 -14
- package/lib/services/build-furniture.service.d.ts +0 -14
- package/lib/services/bundle-initialzer.service.d.ts +0 -45
- package/lib/services/camera.service.d.ts +0 -44
- package/lib/services/configuration.service.d.ts +0 -18
- package/lib/services/configurator-connector.service.d.ts +0 -140
- package/lib/services/configurator.service.d.ts +0 -62
- package/lib/services/configuring.service.d.ts +0 -46
- package/lib/services/controls.d.ts +0 -11
- package/lib/services/debug.service.d.ts +0 -16
- package/lib/services/dictionary.service.d.ts +0 -15
- package/lib/services/dynamic-camera.service.d.ts +0 -21
- package/lib/services/floor-plane.service.d.ts +0 -47
- package/lib/services/font.service.d.ts +0 -10
- package/lib/services/google-translate.service.d.ts +0 -26
- package/lib/services/icon-cache.service.d.ts +0 -21
- package/lib/services/intersection.service.d.ts +0 -11
- package/lib/services/item.service.d.ts +0 -18
- package/lib/services/json-utils.service.d.ts +0 -7
- package/lib/services/light-creation.service.d.ts +0 -9
- package/lib/services/light-presets.service.d.ts +0 -34
- package/lib/services/lights.service.d.ts +0 -34
- package/lib/services/load-furniture-base.service.d.ts +0 -37
- package/lib/services/load-furniture-without-scene.service.d.ts +0 -9
- package/lib/services/load-furniture.service.d.ts +0 -9
- package/lib/services/loader.service.d.ts +0 -11
- package/lib/services/locator.service.d.ts +0 -7
- package/lib/services/message-board.service.d.ts +0 -18
- package/lib/services/post-processing.service.d.ts +0 -74
- package/lib/services/product-configurator.service.d.ts +0 -11
- package/lib/services/progress.service.d.ts +0 -9
- package/lib/services/scene-event.service.d.ts +0 -72
- package/lib/services/scene-options.service.d.ts +0 -11
- package/lib/services/scene.service.d.ts +0 -71
- package/lib/services/screen-size-analysis.service.d.ts +0 -32
- package/lib/services/settings.service.d.ts +0 -24
- package/lib/services/switch-build-furniture.service.d.ts +0 -21
- package/lib/services/switch-load-furniture.service.d.ts +0 -21
- package/lib/services/threedselector.service.d.ts +0 -17
- package/lib/services/utils.service.d.ts +0 -24
- package/lib/services/variation-cache.service.d.ts +0 -23
- package/lib/services/variation.service.d.ts +0 -26
- package/lib/services/view-mode.service.d.ts +0 -17
- package/lib/services/vr.service.d.ts +0 -42
- package/lib/services/xr.service.d.ts +0 -56
- package/lib/utils/asset.utils.d.ts +0 -19
- package/lib/utils/base-utils.d.ts +0 -4
- package/lib/utils/color.utils.d.ts +0 -8
- package/lib/utils/debug.utils.d.ts +0 -3
- package/lib/utils/device.utils.d.ts +0 -7
- package/lib/utils/file.utils.d.ts +0 -30
- package/lib/utils/image.utils.d.ts +0 -9
- package/lib/utils/json-parser.utils.d.ts +0 -9
- package/lib/utils/material.utils.d.ts +0 -34
- package/lib/utils/object.utils.d.ts +0 -32
- package/lib/utils/relative-position.utils.d.ts +0 -12
- package/lib/utils/rotation-helper.utils.d.ts +0 -6
- package/lib/utils/scene-3d.utils.d.ts +0 -8
- package/lib/utils/scene-utils.d.ts +0 -7
- package/lib/utils/text-utils.d.ts +0 -4
- package/lib/utils/threed.utils.d.ts +0 -20
- package/lib/utils/variation-utils.d.ts +0 -18
- package/public-api.d.ts +0 -60
|
@@ -1,799 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import * as TWEEN from '@tweenjs/tween.js';
|
|
3
|
-
import * as THREE from 'three';
|
|
4
|
-
import { EventDispatcher } from 'three';
|
|
5
|
-
import { RelativePositionUtils } from '../utils/relative-position.utils';
|
|
6
|
-
/**
|
|
7
|
-
This file is a modified version of THREE.OrbitControls
|
|
8
|
-
Contributors:
|
|
9
|
-
* @author qiao / https://github.com/qiao
|
|
10
|
-
* @author mrdoob / http://mrdoob.com
|
|
11
|
-
* @author alteredq / http://alteredqualia.com/
|
|
12
|
-
* @author WestLangley / http://github.com/WestLangley
|
|
13
|
-
* @author erich666 / http://erichaines.com
|
|
14
|
-
*/
|
|
15
|
-
let Controls;
|
|
16
|
-
Controls = function (camera, domElement) {
|
|
17
|
-
this.camera = camera;
|
|
18
|
-
this.domElement = (domElement !== undefined) ? domElement : document;
|
|
19
|
-
// Set to false to disable this control
|
|
20
|
-
this.enabled = true;
|
|
21
|
-
// Use to handle long touch behaviour
|
|
22
|
-
this.longTouchDuration = 600;
|
|
23
|
-
this.longTouchTimer = null;
|
|
24
|
-
// "target" sets the location of focus, where the control orbits around
|
|
25
|
-
// and where it pans with respect to.
|
|
26
|
-
this.target = new THREE.Vector3();
|
|
27
|
-
// center is old, deprecated; use "target" instead
|
|
28
|
-
this.center = this.target;
|
|
29
|
-
// This option actually enables dollying in and out; left as "zoom" for
|
|
30
|
-
// backwards compatibility
|
|
31
|
-
this.noZoom = false;
|
|
32
|
-
this.zoomSpeed = 1.0;
|
|
33
|
-
// Limits to how far you can dolly in and out
|
|
34
|
-
this.minDistance = 0;
|
|
35
|
-
this.maxDistance = 1500; // Infinity;
|
|
36
|
-
// Set to true to disable this control
|
|
37
|
-
this.noRotate = false;
|
|
38
|
-
this.noRotateHorizontal = false;
|
|
39
|
-
this.noRotateVertical = false;
|
|
40
|
-
this.exploreRotateSpeed = Math.PI / 12;
|
|
41
|
-
this.rotateSpeed = Math.PI / 4;
|
|
42
|
-
this.exploreMode = false;
|
|
43
|
-
this.birdsEyeMode = false;
|
|
44
|
-
this.vrMode = false;
|
|
45
|
-
this.lookAroundMode = false;
|
|
46
|
-
this.useGyroscope = false;
|
|
47
|
-
this.rotateBy = Math.PI / 32;
|
|
48
|
-
this.moveBy = .3;
|
|
49
|
-
// Set to true to disable this control
|
|
50
|
-
this.noPan = false;
|
|
51
|
-
this.keyPanSpeed = 40.0; // pixels moved per arrow key push
|
|
52
|
-
// Set to true to automatically rotate around the target
|
|
53
|
-
this.autoRotate = false;
|
|
54
|
-
this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60
|
|
55
|
-
// How far you can orbit vertically, upper and lower limits.
|
|
56
|
-
// Range is 0 to Math.PI radians.
|
|
57
|
-
this.minPolarAngle = 0; // radians
|
|
58
|
-
this.maxPolarAngle = Math.PI / 2; // radians
|
|
59
|
-
// How far you can orbit horizontally, upper and lower limits.
|
|
60
|
-
// Range is 0 to Math.PI radians.
|
|
61
|
-
this.minAzimuthAngle = -Infinity; // radians
|
|
62
|
-
this.maxAzimuthAngle = Infinity; // radians
|
|
63
|
-
// Set to true to disable use of the keys
|
|
64
|
-
this.noKeys = false;
|
|
65
|
-
// The four arrow keys
|
|
66
|
-
this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };
|
|
67
|
-
// internals
|
|
68
|
-
const scope = this;
|
|
69
|
-
const changeEvent = { type: 'change' };
|
|
70
|
-
const EPS = 0.000001;
|
|
71
|
-
const rotateStart = new THREE.Vector2();
|
|
72
|
-
const rotateEnd = new THREE.Vector2();
|
|
73
|
-
const rotateDelta = new THREE.Vector2();
|
|
74
|
-
const panStart = new THREE.Vector2();
|
|
75
|
-
const panEnd = new THREE.Vector2();
|
|
76
|
-
const panDelta = new THREE.Vector2();
|
|
77
|
-
const dollyStart = new THREE.Vector2();
|
|
78
|
-
const dollyEnd = new THREE.Vector2();
|
|
79
|
-
const dollyDelta = new THREE.Vector2();
|
|
80
|
-
let phiDelta = 0;
|
|
81
|
-
let thetaDelta = 0;
|
|
82
|
-
let scale = 1;
|
|
83
|
-
let pan = new THREE.Vector3();
|
|
84
|
-
let thetaVelocity = 0;
|
|
85
|
-
let phiVelocity = 0;
|
|
86
|
-
let lastPointerMoveTime = performance.now();
|
|
87
|
-
const inertiaFriction = 0.92;
|
|
88
|
-
const minInertiaSpeed = 0.002;
|
|
89
|
-
// rotation -PI/2 around the x-axis, used to make up for the difference in three.js coordinates and real world
|
|
90
|
-
// when using gyroscope to rotate the camera
|
|
91
|
-
// without it the 'down' direction in the real world would be the same direction as 'forward' in three.js scene
|
|
92
|
-
const worldTransform = new THREE.Quaternion(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5));
|
|
93
|
-
const twoPI = 2 * Math.PI;
|
|
94
|
-
let worldRotationY = 0;
|
|
95
|
-
const STATE = {
|
|
96
|
-
NONE: -1,
|
|
97
|
-
ROTATE: 0,
|
|
98
|
-
DOLLY: 1,
|
|
99
|
-
PAN: 2,
|
|
100
|
-
TOUCH_ROTATE: 3,
|
|
101
|
-
TOUCH_DOLLY: 4,
|
|
102
|
-
TOUCH_PAN: 5,
|
|
103
|
-
EXPLORE: 7,
|
|
104
|
-
EXPLORE_DRAG: 8,
|
|
105
|
-
BIRDS_EYE: 9,
|
|
106
|
-
BIRDS_EYE_DOLLY: 10,
|
|
107
|
-
BIRDS_EYE_PAN: 11
|
|
108
|
-
};
|
|
109
|
-
let state = STATE.NONE;
|
|
110
|
-
this.controlsActive = function () {
|
|
111
|
-
return (state === STATE.NONE);
|
|
112
|
-
};
|
|
113
|
-
this.setPan = function (vec3) {
|
|
114
|
-
pan = vec3;
|
|
115
|
-
scope.dispatchEvent(changeEvent);
|
|
116
|
-
};
|
|
117
|
-
this.getPan = function () {
|
|
118
|
-
return pan;
|
|
119
|
-
};
|
|
120
|
-
this.panTo = function (vec3) {
|
|
121
|
-
const newTarget = new THREE.Vector3(vec3.x, scope.target.y, vec3.z);
|
|
122
|
-
const delta = scope.target.clone().sub(newTarget);
|
|
123
|
-
pan.sub(delta);
|
|
124
|
-
scope.update();
|
|
125
|
-
};
|
|
126
|
-
this.rotateLeft = function (angle) {
|
|
127
|
-
if (angle === undefined) {
|
|
128
|
-
angle = getAutoRotationAngle();
|
|
129
|
-
}
|
|
130
|
-
if (this.noRotateHorizontal) {
|
|
131
|
-
thetaDelta = 0;
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
thetaDelta -= angle;
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
this.rotateUp = function (angle) {
|
|
138
|
-
if (angle === undefined) {
|
|
139
|
-
angle = getAutoRotationAngle();
|
|
140
|
-
}
|
|
141
|
-
if (this.noRotateVertical) {
|
|
142
|
-
phiDelta = 0;
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
phiDelta -= angle;
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
// pass in distance in world space to move left
|
|
149
|
-
this.panLeft = function (distance) {
|
|
150
|
-
const panOffset = new THREE.Vector3();
|
|
151
|
-
const te = this.camera.matrix.elements;
|
|
152
|
-
// get X column of matrix
|
|
153
|
-
panOffset.set(te[0], 0, te[2]);
|
|
154
|
-
panOffset.normalize();
|
|
155
|
-
panOffset.multiplyScalar(-distance);
|
|
156
|
-
pan.add(panOffset);
|
|
157
|
-
};
|
|
158
|
-
// pass in distance in world space to move up
|
|
159
|
-
this.panUp = function (distance) {
|
|
160
|
-
const panOffset = new THREE.Vector3();
|
|
161
|
-
const te = this.camera.matrix.elements;
|
|
162
|
-
// get Y column of matrix
|
|
163
|
-
panOffset.set(te[4], 0, te[6]);
|
|
164
|
-
panOffset.normalize();
|
|
165
|
-
panOffset.multiplyScalar(distance);
|
|
166
|
-
pan.add(panOffset);
|
|
167
|
-
};
|
|
168
|
-
// main entry point; pass in Vector2 of change desired in pixel space,
|
|
169
|
-
// right and down are positive
|
|
170
|
-
this.pan = function (delta) {
|
|
171
|
-
const element = scope.domElement === document ? scope.domElement.body : scope.domElement;
|
|
172
|
-
if (scope.camera.fov !== undefined) {
|
|
173
|
-
// perspective
|
|
174
|
-
const position = scope.camera.position;
|
|
175
|
-
const offset = position.clone().sub(scope.target);
|
|
176
|
-
let targetDistance = offset.length();
|
|
177
|
-
// half of the fov is center to top of screen
|
|
178
|
-
targetDistance *= Math.tan((scope.camera.fov / 2) * Math.PI / 180.0);
|
|
179
|
-
// we actually don't use screenWidth, since perspective camera is fixed to screen height
|
|
180
|
-
scope.panLeft(2 * delta.x * targetDistance / element.clientHeight);
|
|
181
|
-
scope.panUp(2 * delta.y * targetDistance / element.clientHeight);
|
|
182
|
-
}
|
|
183
|
-
else if (scope.camera.top !== undefined) {
|
|
184
|
-
// orthographic
|
|
185
|
-
scope.panLeft(delta.x * (scope.camera.right - scope.camera.left) / element.clientWidth);
|
|
186
|
-
scope.panUp(delta.y * (scope.camera.top - scope.camera.bottom) / element.clientHeight);
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
// camera neither orthographic or perspective - warn user
|
|
190
|
-
console.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');
|
|
191
|
-
}
|
|
192
|
-
scope.update();
|
|
193
|
-
};
|
|
194
|
-
this.setCamera = function (newCamera) {
|
|
195
|
-
scope.camera = newCamera;
|
|
196
|
-
};
|
|
197
|
-
this.panXY = function (x, y) {
|
|
198
|
-
scope.pan(new THREE.Vector2(x, y));
|
|
199
|
-
};
|
|
200
|
-
this.animateCamera = function (type, change) {
|
|
201
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
202
|
-
const changing = new THREE.Vector2();
|
|
203
|
-
const tween = new TWEEN.Tween(changing).to(new THREE.Vector2(change, 0), 200);
|
|
204
|
-
tween.easing(TWEEN.Easing.Quadratic.In);
|
|
205
|
-
tween.onUpdate(() => {
|
|
206
|
-
this.updatePositionTarget(this.camera.position, this.target, { [type]: changing.x });
|
|
207
|
-
});
|
|
208
|
-
return new Promise(resolve => tween.onComplete(resolve).start());
|
|
209
|
-
});
|
|
210
|
-
};
|
|
211
|
-
this.animateCameraMovement = function (endPosition, endTarget, endDuration) {
|
|
212
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
213
|
-
if (!isFinite(endPosition.x) || !isFinite(endPosition.y) || !isFinite(endPosition.z)) {
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
const duration = endDuration !== undefined ? endDuration : .66 * camera.position.distanceTo(endPosition);
|
|
217
|
-
const position = camera.position.clone();
|
|
218
|
-
const target = this.target.clone();
|
|
219
|
-
const targetTween = new TWEEN.Tween(target)
|
|
220
|
-
.to(endTarget, duration)
|
|
221
|
-
.easing(TWEEN.Easing.Quadratic.InOut)
|
|
222
|
-
.onUpdate(() => {
|
|
223
|
-
this.target = target;
|
|
224
|
-
this.update();
|
|
225
|
-
this.dispatchEvent(changeEvent);
|
|
226
|
-
});
|
|
227
|
-
const positionTween = new TWEEN.Tween(position)
|
|
228
|
-
.to(endPosition, duration)
|
|
229
|
-
.easing(TWEEN.Easing.Quadratic.In)
|
|
230
|
-
.onUpdate(() => {
|
|
231
|
-
this.camera.position.copy(position);
|
|
232
|
-
this.update();
|
|
233
|
-
this.dispatchEvent(changeEvent);
|
|
234
|
-
});
|
|
235
|
-
const targetPromise = new Promise(resolve => {
|
|
236
|
-
targetTween
|
|
237
|
-
.onComplete(() => {
|
|
238
|
-
this.update();
|
|
239
|
-
this.dispatchEvent(changeEvent);
|
|
240
|
-
resolve(targetTween);
|
|
241
|
-
})
|
|
242
|
-
.start();
|
|
243
|
-
});
|
|
244
|
-
const positionPromise = new Promise(resolve => {
|
|
245
|
-
positionTween
|
|
246
|
-
.onComplete(() => {
|
|
247
|
-
this.update();
|
|
248
|
-
this.dispatchEvent(changeEvent);
|
|
249
|
-
resolve(positionTween);
|
|
250
|
-
})
|
|
251
|
-
.start();
|
|
252
|
-
});
|
|
253
|
-
return Promise.all([targetPromise, positionPromise]);
|
|
254
|
-
});
|
|
255
|
-
};
|
|
256
|
-
this.fixedCameraMovement = function (endPosition, endTarget, endDuration) {
|
|
257
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
258
|
-
if (!isFinite(endPosition.x) ||
|
|
259
|
-
!isFinite(endPosition.y) ||
|
|
260
|
-
!isFinite(endPosition.z)) {
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
this.camera.position.copy(endPosition);
|
|
264
|
-
this.target.copy(endTarget);
|
|
265
|
-
this.update();
|
|
266
|
-
this.dispatchEvent(changeEvent);
|
|
267
|
-
return;
|
|
268
|
-
});
|
|
269
|
-
};
|
|
270
|
-
this.cameraLeft = function () {
|
|
271
|
-
return this.animateCamera('rotate', +this.rotateBy);
|
|
272
|
-
};
|
|
273
|
-
this.cameraRight = function () {
|
|
274
|
-
return this.animateCamera('rotate', -this.rotateBy);
|
|
275
|
-
};
|
|
276
|
-
this.cameraForward = function () {
|
|
277
|
-
return this.animateCamera('move', -this.moveBy);
|
|
278
|
-
};
|
|
279
|
-
this.cameraBackward = function () {
|
|
280
|
-
return this.animateCamera('move', +this.moveBy);
|
|
281
|
-
};
|
|
282
|
-
this.dollyIn = function (dollyScale) {
|
|
283
|
-
if (dollyScale === undefined) {
|
|
284
|
-
dollyScale = getZoomScale();
|
|
285
|
-
}
|
|
286
|
-
scale /= dollyScale;
|
|
287
|
-
};
|
|
288
|
-
this.dollyOut = function (dollyScale) {
|
|
289
|
-
if (dollyScale === undefined) {
|
|
290
|
-
dollyScale = getZoomScale();
|
|
291
|
-
}
|
|
292
|
-
scale *= dollyScale;
|
|
293
|
-
};
|
|
294
|
-
this.update = function () {
|
|
295
|
-
applyRotationAndPan();
|
|
296
|
-
thetaDelta = 0;
|
|
297
|
-
phiDelta = 0;
|
|
298
|
-
scale = 1;
|
|
299
|
-
pan.set(0, 0, 0);
|
|
300
|
-
};
|
|
301
|
-
function applyRotationAndPan() {
|
|
302
|
-
scope.updatePositionTarget(scope.camera.position, scope.target);
|
|
303
|
-
}
|
|
304
|
-
this.animateMoveTo = function (target) {
|
|
305
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
306
|
-
const position = scope.target.clone();
|
|
307
|
-
const distance = target.distanceTo(position);
|
|
308
|
-
const tween = new TWEEN.Tween(position).to(target, distance);
|
|
309
|
-
tween.easing(TWEEN.Easing.Quadratic.Out);
|
|
310
|
-
tween.onUpdate(scope.moveTo.bind(scope, position));
|
|
311
|
-
return new Promise(resolve => tween.onComplete(resolve).start());
|
|
312
|
-
});
|
|
313
|
-
};
|
|
314
|
-
this.moveTo = function (vec3) {
|
|
315
|
-
vec3.setY(scope.target.y);
|
|
316
|
-
const diff = vec3.clone().sub(scope.target);
|
|
317
|
-
const offset = scope.camera.position.clone().sub(scope.target);
|
|
318
|
-
scope.target.add(pan).add(diff);
|
|
319
|
-
scope.camera.position.copy(scope.target).add(offset);
|
|
320
|
-
this.update();
|
|
321
|
-
};
|
|
322
|
-
this.updatePositionTarget = function (position, target, options) {
|
|
323
|
-
const { rotate: thetaDiff = thetaDelta, move: moveDiff = 0 } = options || {};
|
|
324
|
-
// added this line to be able to zoom in further
|
|
325
|
-
// target.y = this.minDistance;
|
|
326
|
-
const offset = position.clone().sub(target);
|
|
327
|
-
// angle from z-axis around y-axis
|
|
328
|
-
let theta = Math.atan2(offset.x, offset.z);
|
|
329
|
-
// angle from y-axis
|
|
330
|
-
let phi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y);
|
|
331
|
-
theta += thetaDiff;
|
|
332
|
-
phi += phiDelta;
|
|
333
|
-
let min = this.minAzimuthAngle;
|
|
334
|
-
let max = this.maxAzimuthAngle;
|
|
335
|
-
if (isFinite(min) && isFinite(max)) {
|
|
336
|
-
if (min < -Math.PI) {
|
|
337
|
-
min += twoPI;
|
|
338
|
-
}
|
|
339
|
-
else if (min > Math.PI) {
|
|
340
|
-
min -= twoPI;
|
|
341
|
-
}
|
|
342
|
-
if (max < -Math.PI) {
|
|
343
|
-
max += twoPI;
|
|
344
|
-
}
|
|
345
|
-
else if (max > Math.PI) {
|
|
346
|
-
max -= twoPI;
|
|
347
|
-
}
|
|
348
|
-
if (min <= max) {
|
|
349
|
-
theta = Math.max(min, Math.min(max, theta));
|
|
350
|
-
}
|
|
351
|
-
else {
|
|
352
|
-
theta = theta > (min + max) / 2 ? Math.max(min, theta) : Math.min(max, theta);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
// restrict phi to be between desired limits
|
|
356
|
-
phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, phi));
|
|
357
|
-
// restrict phi to be betwee EPS and PI-EPS
|
|
358
|
-
phi = Math.max(EPS, Math.min(Math.PI - EPS, phi));
|
|
359
|
-
let radius = offset.length() * (moveDiff ? Math.abs(moveDiff) : 1) * scale;
|
|
360
|
-
// restrict radius to be between desired limits
|
|
361
|
-
radius = Math.max(this.minDistance, Math.min(this.maxDistance, radius));
|
|
362
|
-
this.target.add(pan);
|
|
363
|
-
// move target to panned location
|
|
364
|
-
offset.x = radius * Math.sin(phi) * Math.sin(theta);
|
|
365
|
-
offset.y = moveDiff ? 0 : radius * Math.cos(phi);
|
|
366
|
-
offset.z = radius * Math.sin(phi) * Math.cos(theta);
|
|
367
|
-
if (!moveDiff) {
|
|
368
|
-
position.copy(this.target).add(offset);
|
|
369
|
-
}
|
|
370
|
-
else {
|
|
371
|
-
if (moveDiff < 0) {
|
|
372
|
-
this.target.sub(offset);
|
|
373
|
-
position.sub(offset);
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
this.target.add(offset);
|
|
377
|
-
position.add(offset);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
if (this.exploreMode && this.useGyroscope && !this.lookAroundMode) {
|
|
381
|
-
const lookVector = new THREE.Vector3(this.target.x, camera.position.y, this.target.z).sub(camera.position);
|
|
382
|
-
worldRotationY = Math.atan2(lookVector.x, lookVector.z);
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
this.camera.lookAt(this.target);
|
|
386
|
-
}
|
|
387
|
-
scope.dispatchEvent(changeEvent);
|
|
388
|
-
};
|
|
389
|
-
this.setExploreMode = function (on = true) {
|
|
390
|
-
this.exploreMode = on;
|
|
391
|
-
state = on ? STATE.EXPLORE : STATE.NONE;
|
|
392
|
-
};
|
|
393
|
-
this.setExploreDragMode = function (on = true) {
|
|
394
|
-
state = on ? STATE.EXPLORE_DRAG : STATE.EXPLORE;
|
|
395
|
-
};
|
|
396
|
-
this.setBirdsEyeMode = function (on = true) {
|
|
397
|
-
this.birdsEyeMode = on;
|
|
398
|
-
state = on ? STATE.BIRDS_EYE : STATE.NONE;
|
|
399
|
-
};
|
|
400
|
-
this.setVrMode = function (on = true) {
|
|
401
|
-
this.vrMode = on;
|
|
402
|
-
};
|
|
403
|
-
function calculateCameraQuaternion(alpha, beta, gamma) {
|
|
404
|
-
// get device rotation in euler angles from gyroscope
|
|
405
|
-
// https://developers.google.com/web/fundamentals/native-hardware/device-orientation/
|
|
406
|
-
const deviceEuler = new THREE.Euler(beta, alpha + worldRotationY, -gamma, 'YXZ');
|
|
407
|
-
// create result quaternion from euler angles
|
|
408
|
-
const result = new THREE.Quaternion();
|
|
409
|
-
result.setFromEuler(deviceEuler);
|
|
410
|
-
// calculate necessary rotation to make up for different screen orientation
|
|
411
|
-
// window.orientation is 0 in portrait mode, 90 or -90 in respective landscape modes
|
|
412
|
-
const minusHalfAngle = -THREE.MathUtils.degToRad(Number(window.orientation)) / 2;
|
|
413
|
-
const screenTransform = new THREE.Quaternion(0, Math.sin(minusHalfAngle), 0, Math.cos(minusHalfAngle));
|
|
414
|
-
result.multiply(screenTransform);
|
|
415
|
-
// rotate result quaternion to make up difference in world coordinates
|
|
416
|
-
result.multiply(worldTransform);
|
|
417
|
-
return result;
|
|
418
|
-
}
|
|
419
|
-
function getAutoRotationAngle() {
|
|
420
|
-
return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;
|
|
421
|
-
}
|
|
422
|
-
function getZoomScale() {
|
|
423
|
-
return Math.pow(0.95, scope.zoomSpeed);
|
|
424
|
-
}
|
|
425
|
-
function onMouseDown(event) {
|
|
426
|
-
if (!isMouseEventAllowed(event)) {
|
|
427
|
-
return;
|
|
428
|
-
}
|
|
429
|
-
event.preventDefault();
|
|
430
|
-
const mousePos = RelativePositionUtils.GetClientMousePosition(event);
|
|
431
|
-
if (state === STATE.BIRDS_EYE ||
|
|
432
|
-
state === STATE.BIRDS_EYE_DOLLY ||
|
|
433
|
-
state === STATE.BIRDS_EYE_PAN) {
|
|
434
|
-
state = STATE.BIRDS_EYE_PAN;
|
|
435
|
-
panStart.set(mousePos.x, mousePos.y);
|
|
436
|
-
scope.domElement.addEventListener('mousemove', onMouseMove, false);
|
|
437
|
-
scope.domElement.addEventListener('mouseup', onMouseUp, false);
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
if (event.button === 0) {
|
|
441
|
-
if (scope.noRotate === true) {
|
|
442
|
-
return;
|
|
443
|
-
}
|
|
444
|
-
if (state !== STATE.EXPLORE && state !== STATE.EXPLORE_DRAG) {
|
|
445
|
-
state = STATE.ROTATE;
|
|
446
|
-
}
|
|
447
|
-
rotateStart.set(mousePos.x, mousePos.y);
|
|
448
|
-
}
|
|
449
|
-
else if (event.button === 1) {
|
|
450
|
-
if (scope.noZoom === true) {
|
|
451
|
-
return;
|
|
452
|
-
}
|
|
453
|
-
state = STATE.DOLLY;
|
|
454
|
-
dollyStart.set(mousePos.x, mousePos.y);
|
|
455
|
-
}
|
|
456
|
-
else if (event.button === 2) {
|
|
457
|
-
if (scope.noPan === true) {
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
state = STATE.PAN;
|
|
461
|
-
panStart.set(mousePos.x, mousePos.y);
|
|
462
|
-
}
|
|
463
|
-
// Greggman fix: https://github.com/greggman/three.js/commit/fde9f9917d6d8381f06bf22cdff766029d1761be
|
|
464
|
-
scope.domElement.addEventListener('mousemove', onMouseMove, false);
|
|
465
|
-
scope.domElement.addEventListener('mouseup', onMouseUp, false);
|
|
466
|
-
}
|
|
467
|
-
function setRotationParameters(endPoint, direction, speed) {
|
|
468
|
-
const element = scope.domElement === document ? scope.domElement.body : scope.domElement;
|
|
469
|
-
rotateEnd.copy(endPoint);
|
|
470
|
-
rotateDelta.subVectors(rotateEnd, rotateStart);
|
|
471
|
-
const angleX = 2 * Math.PI * direction * rotateDelta.x / element.clientWidth * speed;
|
|
472
|
-
const angleY = 2 * Math.PI * direction * rotateDelta.y / element.clientHeight * speed;
|
|
473
|
-
scope.rotateLeft(angleX);
|
|
474
|
-
scope.rotateUp(angleY);
|
|
475
|
-
thetaVelocity = angleX;
|
|
476
|
-
phiVelocity = angleY;
|
|
477
|
-
lastPointerMoveTime = performance.now();
|
|
478
|
-
rotateStart.copy(rotateEnd);
|
|
479
|
-
}
|
|
480
|
-
function isMouseEventAllowed(event) {
|
|
481
|
-
const isCanvas = event ? (event.target && event.target.nodeName === 'CANVAS') : true;
|
|
482
|
-
return isCanvas && scope.enabled;
|
|
483
|
-
}
|
|
484
|
-
function originateOnCanvas(event) {
|
|
485
|
-
return event && event.target && event.target === document.body;
|
|
486
|
-
}
|
|
487
|
-
function onMouseMove(event) {
|
|
488
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
489
|
-
if (!isMouseEventAllowed(event)) {
|
|
490
|
-
return;
|
|
491
|
-
}
|
|
492
|
-
event.preventDefault();
|
|
493
|
-
const mousePos = RelativePositionUtils.GetClientMousePosition(event);
|
|
494
|
-
if (state === STATE.ROTATE) {
|
|
495
|
-
if (scope.noRotate === true) {
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
setRotationParameters(new THREE.Vector2(mousePos.x, mousePos.y), 1, scope.rotateSpeed);
|
|
499
|
-
scope.update();
|
|
500
|
-
}
|
|
501
|
-
else if (state === STATE.EXPLORE) {
|
|
502
|
-
if (scope.noRotate === true) {
|
|
503
|
-
return;
|
|
504
|
-
}
|
|
505
|
-
setRotationParameters(new THREE.Vector2(mousePos.x, mousePos.y), -1, scope.exploreRotateSpeed);
|
|
506
|
-
scope.update();
|
|
507
|
-
}
|
|
508
|
-
else if (state === STATE.EXPLORE_DRAG) {
|
|
509
|
-
scope.update();
|
|
510
|
-
return;
|
|
511
|
-
}
|
|
512
|
-
else if (state === STATE.DOLLY || state === STATE.BIRDS_EYE_DOLLY) {
|
|
513
|
-
if (scope.noZoom === true) {
|
|
514
|
-
return;
|
|
515
|
-
}
|
|
516
|
-
dollyEnd.set(mousePos.x, mousePos.y);
|
|
517
|
-
dollyDelta.subVectors(dollyEnd, dollyStart);
|
|
518
|
-
if (dollyDelta.y > 0) {
|
|
519
|
-
scope.dollyIn();
|
|
520
|
-
}
|
|
521
|
-
else {
|
|
522
|
-
scope.dollyOut();
|
|
523
|
-
}
|
|
524
|
-
dollyStart.copy(dollyEnd);
|
|
525
|
-
scope.update();
|
|
526
|
-
}
|
|
527
|
-
else if (state === STATE.PAN || state === STATE.BIRDS_EYE_PAN) {
|
|
528
|
-
if (scope.noPan === true) {
|
|
529
|
-
return;
|
|
530
|
-
}
|
|
531
|
-
panEnd.set(mousePos.x, mousePos.y);
|
|
532
|
-
panDelta.subVectors(panEnd, panStart);
|
|
533
|
-
scope.pan(panDelta);
|
|
534
|
-
panStart.copy(panEnd);
|
|
535
|
-
scope.update();
|
|
536
|
-
}
|
|
537
|
-
});
|
|
538
|
-
}
|
|
539
|
-
function onMouseUp(event) {
|
|
540
|
-
if (!scope.enabled) {
|
|
541
|
-
return;
|
|
542
|
-
}
|
|
543
|
-
// Greggman fix: https://github.com/greggman/three.js/commit/fde9f9917d6d8381f06bf22cdff766029d1761be
|
|
544
|
-
scope.domElement.removeEventListener('mousemove', onMouseMove, false);
|
|
545
|
-
scope.domElement.removeEventListener('mouseup', onMouseUp, false);
|
|
546
|
-
if (state === STATE.EXPLORE) {
|
|
547
|
-
return;
|
|
548
|
-
}
|
|
549
|
-
if (state === STATE.EXPLORE_DRAG) {
|
|
550
|
-
state = STATE.EXPLORE;
|
|
551
|
-
return;
|
|
552
|
-
}
|
|
553
|
-
if (state === STATE.BIRDS_EYE || state === STATE.BIRDS_EYE_PAN || state === STATE.BIRDS_EYE_DOLLY) {
|
|
554
|
-
state = STATE.BIRDS_EYE;
|
|
555
|
-
return;
|
|
556
|
-
}
|
|
557
|
-
state = STATE.NONE;
|
|
558
|
-
}
|
|
559
|
-
function onMouseWheel(event) {
|
|
560
|
-
if (!scope.enabled || scope.noZoom === true) {
|
|
561
|
-
return;
|
|
562
|
-
}
|
|
563
|
-
event.preventDefault();
|
|
564
|
-
event.stopPropagation();
|
|
565
|
-
if (event.deltaY < 0) {
|
|
566
|
-
scope.dollyOut();
|
|
567
|
-
}
|
|
568
|
-
else {
|
|
569
|
-
scope.dollyIn();
|
|
570
|
-
}
|
|
571
|
-
scope.update();
|
|
572
|
-
}
|
|
573
|
-
function onKeyDown(event) {
|
|
574
|
-
if (scope.enabled === false) {
|
|
575
|
-
return;
|
|
576
|
-
}
|
|
577
|
-
if (scope.noKeys === true) {
|
|
578
|
-
return;
|
|
579
|
-
}
|
|
580
|
-
if (scope.noPan === true) {
|
|
581
|
-
return;
|
|
582
|
-
}
|
|
583
|
-
if (!originateOnCanvas(event)) {
|
|
584
|
-
return;
|
|
585
|
-
}
|
|
586
|
-
switch (event.keyCode) {
|
|
587
|
-
case scope.keys.UP:
|
|
588
|
-
if (scope.exploreMode) {
|
|
589
|
-
scope.cameraForward();
|
|
590
|
-
}
|
|
591
|
-
else {
|
|
592
|
-
scope.pan(new THREE.Vector2(0, scope.keyPanSpeed));
|
|
593
|
-
}
|
|
594
|
-
break;
|
|
595
|
-
case scope.keys.BOTTOM:
|
|
596
|
-
if (scope.exploreMode) {
|
|
597
|
-
scope.cameraBackward();
|
|
598
|
-
}
|
|
599
|
-
else {
|
|
600
|
-
scope.pan(new THREE.Vector2(0, -scope.keyPanSpeed));
|
|
601
|
-
}
|
|
602
|
-
break;
|
|
603
|
-
case scope.keys.LEFT:
|
|
604
|
-
if (scope.exploreMode) {
|
|
605
|
-
scope.cameraLeft();
|
|
606
|
-
}
|
|
607
|
-
else {
|
|
608
|
-
scope.pan(new THREE.Vector2(scope.keyPanSpeed, 0));
|
|
609
|
-
}
|
|
610
|
-
break;
|
|
611
|
-
case scope.keys.RIGHT:
|
|
612
|
-
if (scope.exploreMode) {
|
|
613
|
-
scope.cameraRight();
|
|
614
|
-
}
|
|
615
|
-
else {
|
|
616
|
-
scope.pan(new THREE.Vector2(-scope.keyPanSpeed, 0));
|
|
617
|
-
}
|
|
618
|
-
break;
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
function touchstart(event) {
|
|
622
|
-
if (!isMouseEventAllowed(event)) {
|
|
623
|
-
return;
|
|
624
|
-
}
|
|
625
|
-
if (state === STATE.BIRDS_EYE ||
|
|
626
|
-
state === STATE.BIRDS_EYE_DOLLY ||
|
|
627
|
-
state === STATE.BIRDS_EYE_PAN) {
|
|
628
|
-
if (event.touches.length === 1 || event.touches.length === 3) {
|
|
629
|
-
state = STATE.BIRDS_EYE_PAN;
|
|
630
|
-
panStart.set(event.touches[0].pageX, event.touches[0].pageY);
|
|
631
|
-
}
|
|
632
|
-
else if (event.touches.length === 2) {
|
|
633
|
-
state = STATE.BIRDS_EYE_DOLLY;
|
|
634
|
-
const dx = event.touches[0].pageX - event.touches[1].pageX;
|
|
635
|
-
const dy = event.touches[0].pageY - event.touches[1].pageY;
|
|
636
|
-
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
637
|
-
dollyStart.set(0, distance);
|
|
638
|
-
}
|
|
639
|
-
return;
|
|
640
|
-
}
|
|
641
|
-
switch (event.touches.length) {
|
|
642
|
-
case 1: // one-fingered touch: rotate
|
|
643
|
-
if (scope.noRotate === true) {
|
|
644
|
-
return;
|
|
645
|
-
}
|
|
646
|
-
scope.longTouchTimer = setTimeout(() => {
|
|
647
|
-
scope.lookAroundMode = true;
|
|
648
|
-
}, scope.longTouchDuration);
|
|
649
|
-
state = STATE.TOUCH_ROTATE;
|
|
650
|
-
rotateStart.set(event.touches[0].pageX, event.touches[0].pageY);
|
|
651
|
-
break;
|
|
652
|
-
case 2: // two-fingered touch: dolly
|
|
653
|
-
if (scope.noZoom === true) {
|
|
654
|
-
return;
|
|
655
|
-
}
|
|
656
|
-
state = STATE.TOUCH_DOLLY;
|
|
657
|
-
const dx = event.touches[0].pageX - event.touches[1].pageX;
|
|
658
|
-
const dy = event.touches[0].pageY - event.touches[1].pageY;
|
|
659
|
-
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
660
|
-
dollyStart.set(0, distance);
|
|
661
|
-
break;
|
|
662
|
-
case 3: // three-fingered touch: pan
|
|
663
|
-
if (scope.noPan === true) {
|
|
664
|
-
return;
|
|
665
|
-
}
|
|
666
|
-
state = STATE.TOUCH_PAN;
|
|
667
|
-
panStart.set(event.touches[0].pageX, event.touches[0].pageY);
|
|
668
|
-
break;
|
|
669
|
-
default:
|
|
670
|
-
state = STATE.NONE;
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
function touchmove(event) {
|
|
674
|
-
if (!isMouseEventAllowed(event)) {
|
|
675
|
-
return;
|
|
676
|
-
}
|
|
677
|
-
clearTimeout(scope.longTouchTimer);
|
|
678
|
-
event.preventDefault();
|
|
679
|
-
event.stopPropagation();
|
|
680
|
-
const element = scope.domElement === document ? scope.domElement.body : scope.domElement;
|
|
681
|
-
// disable use of two or three finger touch gestures in explore mode
|
|
682
|
-
const touchCountToProcess = scope.exploreMode ? 1 :
|
|
683
|
-
state === STATE.BIRDS_EYE_PAN && event.touches.length === 1 ? 3 :
|
|
684
|
-
event.touches.length;
|
|
685
|
-
switch (touchCountToProcess) {
|
|
686
|
-
case 1: // one-fingered touch: rotate
|
|
687
|
-
if (scope.noRotate === true) {
|
|
688
|
-
return;
|
|
689
|
-
}
|
|
690
|
-
if (state !== STATE.TOUCH_ROTATE) {
|
|
691
|
-
return;
|
|
692
|
-
}
|
|
693
|
-
rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);
|
|
694
|
-
rotateDelta.subVectors(rotateEnd, rotateStart);
|
|
695
|
-
const rotationSpeed = scope.exploreMode
|
|
696
|
-
? scope.exploreRotateSpeed
|
|
697
|
-
: scope.rotateSpeed;
|
|
698
|
-
const angleX = 2 * Math.PI * rotateDelta.x / element.clientWidth * rotationSpeed;
|
|
699
|
-
const angleY = 2 * Math.PI * rotateDelta.y / element.clientHeight * rotationSpeed;
|
|
700
|
-
scope.rotateLeft(angleX);
|
|
701
|
-
scope.rotateUp(angleY);
|
|
702
|
-
thetaVelocity = angleX;
|
|
703
|
-
phiVelocity = angleY;
|
|
704
|
-
rotateStart.copy(rotateEnd);
|
|
705
|
-
break;
|
|
706
|
-
case 2: // two-fingered touch: dolly
|
|
707
|
-
if (scope.noZoom === true) {
|
|
708
|
-
return;
|
|
709
|
-
}
|
|
710
|
-
if (state !== STATE.TOUCH_DOLLY && state !== STATE.BIRDS_EYE_DOLLY) {
|
|
711
|
-
return;
|
|
712
|
-
}
|
|
713
|
-
const dx = event.touches[0].pageX - event.touches[1].pageX;
|
|
714
|
-
const dy = event.touches[0].pageY - event.touches[1].pageY;
|
|
715
|
-
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
716
|
-
dollyEnd.set(0, distance);
|
|
717
|
-
dollyDelta.subVectors(dollyEnd, dollyStart);
|
|
718
|
-
if (dollyDelta.y > 0) {
|
|
719
|
-
scope.dollyOut();
|
|
720
|
-
}
|
|
721
|
-
else {
|
|
722
|
-
scope.dollyIn();
|
|
723
|
-
}
|
|
724
|
-
dollyStart.copy(dollyEnd);
|
|
725
|
-
break;
|
|
726
|
-
case 3: // three-fingered touch: pan
|
|
727
|
-
if (scope.noPan === true) {
|
|
728
|
-
return;
|
|
729
|
-
}
|
|
730
|
-
if (state !== STATE.TOUCH_PAN && state !== STATE.BIRDS_EYE_PAN) {
|
|
731
|
-
return;
|
|
732
|
-
}
|
|
733
|
-
panEnd.set(event.touches[0].pageX, event.touches[0].pageY);
|
|
734
|
-
panDelta.subVectors(panEnd, panStart);
|
|
735
|
-
scope.pan(panDelta);
|
|
736
|
-
panStart.copy(panEnd);
|
|
737
|
-
break;
|
|
738
|
-
default:
|
|
739
|
-
state = STATE.NONE;
|
|
740
|
-
}
|
|
741
|
-
scope.update();
|
|
742
|
-
}
|
|
743
|
-
function touchend(event) {
|
|
744
|
-
if (!scope.enabled) {
|
|
745
|
-
return;
|
|
746
|
-
}
|
|
747
|
-
clearTimeout(scope.longTouchTimer);
|
|
748
|
-
scope.lookAroundMode = false;
|
|
749
|
-
if (state === STATE.BIRDS_EYE || state === STATE.BIRDS_EYE_PAN || state === STATE.BIRDS_EYE_DOLLY) {
|
|
750
|
-
state = STATE.BIRDS_EYE;
|
|
751
|
-
return;
|
|
752
|
-
}
|
|
753
|
-
state = STATE.NONE;
|
|
754
|
-
}
|
|
755
|
-
function onDeviceMove(event) {
|
|
756
|
-
if (!scope.exploreMode || scope.vrMode || scope.lookAroundMode) {
|
|
757
|
-
return;
|
|
758
|
-
}
|
|
759
|
-
const alpha = THREE.MathUtils.degToRad(event.alpha || 0);
|
|
760
|
-
const beta = THREE.MathUtils.degToRad(event.beta || 0);
|
|
761
|
-
const gamma = THREE.MathUtils.degToRad(event.gamma || 0);
|
|
762
|
-
if (alpha !== 0 && beta !== 0 && gamma !== 0) {
|
|
763
|
-
scope.useGyroscope = true;
|
|
764
|
-
const cameraQuaternion = calculateCameraQuaternion(alpha, beta, gamma);
|
|
765
|
-
camera.quaternion.slerp(cameraQuaternion, 0.5); // smooth using spherical linear interpolation
|
|
766
|
-
scope.dispatchEvent(changeEvent);
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
this.inertiaLoop = function () {
|
|
770
|
-
if (state !== STATE.NONE) {
|
|
771
|
-
return;
|
|
772
|
-
}
|
|
773
|
-
const speed = Math.max(Math.abs(thetaVelocity), Math.abs(phiVelocity));
|
|
774
|
-
// no movement, return
|
|
775
|
-
if (speed < minInertiaSpeed) {
|
|
776
|
-
thetaVelocity = 0;
|
|
777
|
-
phiVelocity = 0;
|
|
778
|
-
return;
|
|
779
|
-
}
|
|
780
|
-
this.updatePositionTarget(this.camera.position, this.target, { rotate: -thetaVelocity });
|
|
781
|
-
phiDelta = -phiVelocity;
|
|
782
|
-
thetaVelocity *= inertiaFriction;
|
|
783
|
-
phiVelocity *= inertiaFriction;
|
|
784
|
-
scope.dispatchEvent(changeEvent);
|
|
785
|
-
};
|
|
786
|
-
this.domElement.addEventListener('contextmenu', function (event) {
|
|
787
|
-
event.preventDefault();
|
|
788
|
-
}, false);
|
|
789
|
-
this.domElement.addEventListener('mousedown', onMouseDown, false);
|
|
790
|
-
this.domElement.addEventListener('wheel', onMouseWheel, false);
|
|
791
|
-
this.domElement.addEventListener('touchstart', touchstart, false);
|
|
792
|
-
this.domElement.addEventListener('touchend', touchend, false);
|
|
793
|
-
this.domElement.addEventListener('touchmove', touchmove, false);
|
|
794
|
-
window.addEventListener('deviceorientation', onDeviceMove, false);
|
|
795
|
-
window.addEventListener('keydown', onKeyDown, false);
|
|
796
|
-
};
|
|
797
|
-
Controls.prototype = Object.create(EventDispatcher.prototype);
|
|
798
|
-
export { Controls };
|
|
799
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25maWd1cmF0b3Ivc3JjL2xpYi9zZXJ2aWNlcy9jb250cm9scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUMsZUFBZSxFQUFVLE1BQU0sT0FBTyxDQUFDO0FBQy9DLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRXZFOzs7Ozs7OztHQVFHO0FBQ0gsSUFBSSxRQUFzQyxDQUFDO0FBQzNDLFFBQVEsR0FBRyxVQUFVLE1BQU0sRUFBRSxVQUFVO0lBRXJDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBRXJFLHVDQUF1QztJQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUVwQixxQ0FBcUM7SUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztJQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUUzQix1RUFBdUU7SUFDdkUscUNBQXFDO0lBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEMsa0RBQWtEO0lBQ2xELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUUxQix1RUFBdUU7SUFDdkUsMEJBQTBCO0lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLDZDQUE2QztJQUM3QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7SUFFckMsc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUM5QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUUvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUU1QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBRWpCLHNDQUFzQztJQUN0QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLGtDQUFrQztJQUUzRCx3REFBd0Q7SUFDeEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsQ0FBQyxzQ0FBc0M7SUFFbEUsNERBQTREO0lBQzVELGlDQUFpQztJQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVU7SUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVU7SUFFNUMsOERBQThEO0lBQzlELGlDQUFpQztJQUNqQyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVTtJQUM1QyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxDQUFDLFVBQVU7SUFFM0MseUNBQXlDO0lBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLHNCQUFzQjtJQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXRELFlBQVk7SUFFWixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUM7SUFFbkIsTUFBTSxXQUFXLEdBQUcsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFFckMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDO0lBRXJCLE1BQU0sV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hDLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRXhDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRXJDLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRXZDLElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQztJQUN6QixJQUFJLFVBQVUsR0FBVyxDQUFDLENBQUM7SUFDM0IsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO0lBQ3RCLElBQUksR0FBRyxHQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLElBQUksYUFBYSxHQUFXLENBQUMsQ0FBQztJQUM5QixJQUFJLFdBQVcsR0FBVyxDQUFDLENBQUM7SUFDNUIsSUFBSSxtQkFBbUIsR0FBVyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDcEQsTUFBTSxlQUFlLEdBQVcsSUFBSSxDQUFDO0lBQ3JDLE1BQU0sZUFBZSxHQUFXLEtBQUssQ0FBQztJQUV0Qyw4R0FBOEc7SUFDOUcsNENBQTRDO0lBQzVDLCtHQUErRztJQUMvRyxNQUFNLGNBQWMsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25GLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQzFCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztJQUV2QixNQUFNLEtBQUssR0FBRztRQUNaLElBQUksRUFBRSxDQUFDLENBQUM7UUFDUixNQUFNLEVBQUUsQ0FBQztRQUNULEtBQUssRUFBRSxDQUFDO1FBQ1IsR0FBRyxFQUFFLENBQUM7UUFDTixZQUFZLEVBQUUsQ0FBQztRQUNmLFdBQVcsRUFBRSxDQUFDO1FBQ2QsU0FBUyxFQUFFLENBQUM7UUFDWixPQUFPLEVBQUUsQ0FBQztRQUNWLFlBQVksRUFBRSxDQUFDO1FBQ2YsU0FBUyxFQUFFLENBQUM7UUFDWixlQUFlLEVBQUUsRUFBRTtRQUNuQixhQUFhLEVBQUUsRUFBRTtLQUNsQixDQUFDO0lBRUYsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUV2QixJQUFJLENBQUMsY0FBYyxHQUFHO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxJQUFtQjtRQUN6QyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ1gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsTUFBTSxHQUFHO1FBQ1osT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsSUFBSTtRQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNmLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNqQixDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsS0FBSztRQUMvQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsS0FBSyxHQUFHLG9CQUFvQixFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixVQUFVLEdBQUcsQ0FBQyxDQUFDO1NBQ2hCO2FBQU07WUFDTCxVQUFVLElBQUksS0FBSyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLEtBQUs7UUFDN0IsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUNkO2FBQU07WUFDTCxRQUFRLElBQUksS0FBSyxDQUFDO1NBQ25CO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsK0NBQStDO0lBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxRQUFRO1FBRS9CLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN2Qyx5QkFBeUI7UUFDekIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QixTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFcEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVyQixDQUFDLENBQUM7SUFFRiw2Q0FBNkM7SUFDN0MsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLFFBQVE7UUFFN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3ZDLHlCQUF5QjtRQUN6QixTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQixDQUFDLENBQUM7SUFFRixzRUFBc0U7SUFDdEUsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxLQUFLO1FBRXhCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUV6RixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUVsQyxjQUFjO1lBQ2QsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDdkMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRXJDLDZDQUE2QztZQUM3QyxjQUFjLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDckUsd0ZBQXdGO1lBQ3hGLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsY0FBYyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLGNBQWMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDbEU7YUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUV6QyxlQUFlO1lBQ2YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEYsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDeEY7YUFBTTtZQUVMLHlEQUF5RDtZQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLDhFQUE4RSxDQUFDLENBQUM7U0FDOUY7UUFFRCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDakIsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLFNBQXVCO1FBQ2hELEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQzNCLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQWdCLElBQVksRUFBRSxNQUFjOztZQUMvRCxNQUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQU0sUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO1lBQ3JGLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDO0tBQUEsQ0FBQztJQUVGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxVQUFnQixXQUEwQixFQUFFLFNBQXdCLEVBQUUsV0FBb0I7O1lBQ3JILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BGLE9BQU87YUFDUjtZQUVELE1BQU0sUUFBUSxHQUFHLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pHLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQU0sTUFBTSxDQUFDO2lCQUM3QyxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztpQkFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztpQkFDcEMsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDckIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxNQUFNLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQU0sUUFBUSxDQUFDO2lCQUNqRCxFQUFFLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQztpQkFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztpQkFDakMsUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLENBQW1CLE9BQU8sQ0FBQyxFQUFFO2dCQUM1RCxXQUFXO3FCQUNSLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ2hDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDO3FCQUNELEtBQUssRUFBRSxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sQ0FBbUIsT0FBTyxDQUFDLEVBQUU7Z0JBQzlELGFBQWE7cUJBQ1YsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN6QixDQUFDLENBQUM7cUJBQ0QsS0FBSyxFQUFFLENBQUM7WUFDYixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7S0FBQSxDQUFDO0lBRUYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQ3pCLFdBQTBCLEVBQzFCLFNBQXdCLEVBQ3hCLFdBQW9COztZQUVwQixJQUNFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFDeEI7Z0JBQ0EsT0FBTzthQUNSO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7S0FBQSxDQUFDO0lBRUYsSUFBSSxDQUFDLFVBQVUsR0FBRztRQUNoQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxXQUFXLEdBQUc7UUFDakIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsYUFBYSxHQUFHO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRztRQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxVQUFVO1FBQ2pDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUM1QixVQUFVLEdBQUcsWUFBWSxFQUFFLENBQUM7U0FDN0I7UUFFRCxLQUFLLElBQUksVUFBVSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxVQUFVO1FBQ2xDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUM1QixVQUFVLEdBQUcsWUFBWSxFQUFFLENBQUM7U0FDN0I7UUFFRCxLQUFLLElBQUksVUFBVSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxNQUFNLEdBQUc7UUFDWixtQkFBbUIsRUFBRSxDQUFDO1FBQ3RCLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNWLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixTQUFTLG1CQUFtQjtRQUMxQixLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQWdCLE1BQXFCOztZQUN4RCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFNLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ25ELE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQztLQUFBLENBQUM7SUFFRixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsSUFBSTtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTztRQUM3RCxNQUFNLEVBQ0osTUFBTSxFQUFFLFNBQVMsR0FBRyxVQUFVLEVBQzlCLElBQUksRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUNuQixHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFbEIsZ0RBQWdEO1FBQ2hELCtCQUErQjtRQUUvQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVDLGtDQUFrQztRQUNsQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNDLG9CQUFvQjtRQUNwQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRixLQUFLLElBQUksU0FBUyxDQUFDO1FBQ25CLEdBQUcsSUFBSSxRQUFRLENBQUM7UUFFaEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUMvQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRS9CLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLEdBQUcsSUFBSSxLQUFLLENBQUM7YUFDZDtpQkFBTSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUN4QixHQUFHLElBQUksS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLEdBQUcsSUFBSSxLQUFLLENBQUM7YUFDZDtpQkFBTSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUN4QixHQUFHLElBQUksS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7Z0JBQ2QsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDN0M7aUJBQU07Z0JBQ0wsS0FBSyxHQUFHLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMvRTtTQUNGO1FBRUQsNENBQTRDO1FBQzVDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdEUsMkNBQTJDO1FBQzNDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFbEQsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFM0UsK0NBQStDO1FBQy9DLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFckIsaUNBQWlDO1FBRWpDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QzthQUFNO1lBQ0wsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN0QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN0QjtTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pFLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0csY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekQ7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqQztRQUNELEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLEVBQUUsR0FBRyxJQUFJO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsRUFBRSxHQUFHLElBQUk7UUFDM0MsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUNsRCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsRUFBRSxHQUFHLElBQUk7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM1QyxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsRUFBRSxHQUFHLElBQUk7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsU0FBUyx5QkFBeUIsQ0FBQyxLQUFhLEVBQUUsSUFBWSxFQUFFLEtBQWE7UUFDM0UscURBQXFEO1FBQ3JELHFGQUFxRjtRQUNyRixNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFakYsNkNBQTZDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFakMsMkVBQTJFO1FBQzNFLG9GQUFvRjtRQUNwRixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakYsTUFBTSxlQUFlLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDdkcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVqQyxzRUFBc0U7UUFDdEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVoQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUyxvQkFBb0I7UUFDM0IsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7SUFDdkQsQ0FBQztJQUVELFNBQVMsWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsU0FBUyxXQUFXLENBQUMsS0FBSztRQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDL0IsT0FBTztTQUNSO1FBQ0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sUUFBUSxHQUFrQixxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwRixJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsU0FBUztZQUMzQixLQUFLLEtBQUssS0FBSyxDQUFDLGVBQWU7WUFDL0IsS0FBSyxLQUFLLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFFL0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDNUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxLQUFLLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9ELE9BQU87U0FDUjtRQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTtnQkFDM0IsT0FBTzthQUNSO1lBRUQsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDM0QsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7YUFDdEI7WUFFRCxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBRXpDO2FBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUN6QixPQUFPO2FBQ1I7WUFFRCxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUVwQixVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBRXhDO2FBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUN4QixPQUFPO2FBQ1I7WUFFRCxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUVsQixRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO1FBRUQscUdBQXFHO1FBQ3JHLEtBQUssQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRSxLQUFLLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFakUsQ0FBQztJQUVELFNBQVMscUJBQXFCLENBQUMsUUFBdUIsRUFBRSxTQUFpQixFQUFFLEtBQWE7UUFFdEYsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBRXpGLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFL0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDckYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFFdEYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXZCLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDdkIsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUNyQixtQkFBbUIsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFeEMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsU0FBUyxtQkFBbUIsQ0FBQyxLQUFhO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFLLEtBQUssQ0FBQyxNQUFrQixDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xHLE9BQU8sUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDbkMsQ0FBQztJQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBWTtRQUNyQyxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQztJQUNqRSxDQUFDO0lBRUQsU0FBZSxXQUFXLENBQUMsS0FBSzs7WUFFOUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixPQUFPO2FBQ1I7WUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQWtCLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXBGLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBRTFCLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7b0JBQzNCLE9BQU87aUJBQ1I7Z0JBQ0QscUJBQXFCLENBQ25CLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFDekMsQ0FBQyxFQUNELEtBQUssQ0FBQyxXQUFXLENBQ2xCLENBQUM7Z0JBQ0YsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBRWhCO2lCQUFNLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBRWxDLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7b0JBQzNCLE9BQU87aUJBQ1I7Z0JBQ0QscUJBQXFCLENBQ25CLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFDekMsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxDQUFDLGtCQUFrQixDQUN6QixDQUFDO2dCQUNGLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUVoQjtpQkFBTSxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsWUFBWSxFQUFFO2dCQUV2QyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2YsT0FBTzthQUVSO2lCQUFNLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxlQUFlLEVBQUU7Z0JBRW5FLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7b0JBQ3pCLE9BQU87aUJBQ1I7Z0JBRUQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBRTVDLElBQUksVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBRXBCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFFakI7cUJBQU07b0JBRUwsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUVsQjtnQkFFRCxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7YUFFaEI7aUJBQU0sSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLGFBQWEsRUFBRTtnQkFFL0QsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRTtvQkFDeEIsT0FBTztpQkFDUjtnQkFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFdEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFcEIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2hCO1FBQ0gsQ0FBQztLQUFBO0lBRUQsU0FBUyxTQUFTLENBQUMsS0FBSztRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFFRCxxR0FBcUc7UUFDckcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLEtBQUssQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsRSxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQzNCLE9BQU87U0FDUjtRQUNELElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxZQUFZLEVBQUU7WUFDaEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDdEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUNqRyxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsU0FBUyxZQUFZLENBQUMsS0FBSztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUMzQyxPQUFPO1NBQ1I7UUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEIsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2xCO2FBQU07WUFDTCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDakI7UUFDRCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVMsU0FBUyxDQUFDLEtBQUs7UUFFdEIsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtZQUMzQixPQUFPO1NBQ1I7UUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3pCLE9BQU87U0FDUjtRQUNELElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDUjtRQUVELFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUVyQixLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO29CQUNyQixLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNMLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNO2dCQUNwQixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7b0JBQ3JCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0wsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2dCQUNELE1BQU07WUFDUixLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFDbEIsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFO29CQUNyQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQ3BCO3FCQUFNO29CQUNMLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEQ7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNuQixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7b0JBQ3JCLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFDckI7cUJBQU07b0JBQ0wsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2dCQUNELE1BQU07U0FDVDtJQUVILENBQUM7SUFFRCxTQUFTLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMvQixPQUFPO1NBQ1I7UUFFRCxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsU0FBUztZQUMzQixLQUFLLEtBQUssS0FBSyxDQUFDLGVBQWU7WUFDL0IsS0FBSyxLQUFLLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDL0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM1RCxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDNUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlEO2lCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNyQyxLQUFLLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFDOUIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzNELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUMzRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUM3QjtZQUNELE9BQU87U0FDUjtRQUVELFFBQVEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFFNUIsS0FBSyxDQUFDLEVBQUUsNkJBQTZCO2dCQUNuQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO29CQUMzQixPQUFPO2lCQUNSO2dCQUVELEtBQUssQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDckMsS0FBSyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzlCLENBQUMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFFNUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7Z0JBQzNCLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsTUFBTTtZQUVSLEtBQUssQ0FBQyxFQUFFLDRCQUE0QjtnQkFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtvQkFDekIsT0FBTztpQkFDUjtnQkFFRCxLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztnQkFFMUIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzNELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUMzRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDNUIsTUFBTTtZQUVSLEtBQUssQ0FBQyxFQUFFLDRCQUE0QjtnQkFDbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRTtvQkFDeEIsT0FBTztpQkFDUjtnQkFFRCxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFFeEIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3RCxNQUFNO1lBRVI7Z0JBQ0UsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FFdEI7SUFDSCxDQUFDO0lBRUQsU0FBUyxTQUFTLENBQUMsS0FBSztRQUN0QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDL0IsT0FBTztTQUNSO1FBRUQsWUFBWSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUV6RixvRUFBb0U7UUFDcEUsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxLQUFLLEtBQUssS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN6QixRQUFRLG1CQUFtQixFQUFFO1lBRTNCLEtBQUssQ0FBQyxFQUFFLDZCQUE2QjtnQkFDbkMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTtvQkFDM0IsT0FBTztpQkFDUjtnQkFDRCxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsWUFBWSxFQUFFO29CQUNoQyxPQUFPO2lCQUNSO2dCQUVELFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBRS9DLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxXQUFXO29CQUNyQyxDQUFDLENBQUMsS0FBSyxDQUFDLGtCQUFrQjtvQkFDMUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7Z0JBRXRCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUM7Z0JBQ2pGLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7Z0JBRWxGLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXZCLGFBQWEsR0FBRyxNQUFNLENBQUM7Z0JBQ3ZCLFdBQVcsR0FBRyxNQUFNLENBQUM7Z0JBRXJCLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVCLE1BQU07WUFFUixLQUFLLENBQUMsRUFBRSw0QkFBNEI7Z0JBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7b0JBQ3pCLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLGVBQWUsRUFBRTtvQkFDbEUsT0FBTztpQkFDUjtnQkFFRCxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDM0QsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBRTlDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFFNUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDcEIsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNsQjtxQkFBTTtvQkFDTCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ2pCO2dCQUVELFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFCLE1BQU07WUFFUixLQUFLLENBQUMsRUFBRSw0QkFBNEI7Z0JBQ2xDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7b0JBQ3hCLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLGFBQWEsRUFBRTtvQkFDOUQsT0FBTztpQkFDUjtnQkFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNELFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUV0QyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUVwQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QixNQUFNO1lBRVI7Z0JBQ0UsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7U0FDdEI7UUFDRCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVMsUUFBUSxDQUFDLEtBQU07UUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsWUFBWSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuQyxLQUFLLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUU3QixJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQ2pHLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ3hCLE9BQU87U0FDUjtRQUNELEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxTQUFTLFlBQVksQ0FBQyxLQUE2QjtRQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUU7WUFDOUQsT0FBTztTQUNSO1FBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFekQsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtZQUM1QyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUMxQixNQUFNLGdCQUFnQixHQUFHLHlCQUF5QixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFdkUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyw4Q0FBOEM7WUFDOUYsS0FBSyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHO1FBQ2pCLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBQ0QsTUFBTSxLQUFLLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FDdEIsQ0FBQztRQUVGLHNCQUFzQjtRQUN0QixJQUFJLEtBQUssR0FBRyxlQUFlLEVBQUU7WUFDM0IsYUFBYSxHQUFHLENBQUMsQ0FBQztZQUNsQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQ3BCLElBQUksQ0FBQyxNQUFNLEVBQ1gsRUFBQyxNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUMsQ0FDekIsQ0FBQztRQUNGLFFBQVEsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUN4QixhQUFhLElBQUksZUFBZSxDQUFDO1FBQ2pDLFdBQVcsSUFBSSxlQUFlLENBQUM7UUFDL0IsS0FBSyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxVQUFVLEtBQUs7UUFDN0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5RCxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFDRixRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRTlELE9BQU8sRUFBQyxRQUFRLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRXRUVOIGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJztcclxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0V2ZW50RGlzcGF0Y2hlciwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1JlbGF0aXZlUG9zaXRpb25VdGlsc30gZnJvbSAnLi4vdXRpbHMvcmVsYXRpdmUtcG9zaXRpb24udXRpbHMnO1xyXG5cclxuLyoqXHJcbiBUaGlzIGZpbGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIFRIUkVFLk9yYml0Q29udHJvbHNcclxuIENvbnRyaWJ1dG9yczpcclxuICogQGF1dGhvciBxaWFvIC8gaHR0cHM6Ly9naXRodWIuY29tL3FpYW9cclxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbVxyXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xyXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcclxuICogQGF1dGhvciBlcmljaDY2NiAvIGh0dHA6Ly9lcmljaGFpbmVzLmNvbVxyXG4gKi9cclxubGV0IENvbnRyb2xzOiAoY2FtZXJhLCBkb21FbGVtZW50KSA9PiB2b2lkO1xyXG5Db250cm9scyA9IGZ1bmN0aW9uIChjYW1lcmEsIGRvbUVsZW1lbnQpIHtcclxuXHJcbiAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XHJcbiAgdGhpcy5kb21FbGVtZW50ID0gKGRvbUVsZW1lbnQgIT09IHVuZGVmaW5lZCkgPyBkb21FbGVtZW50IDogZG9jdW1lbnQ7XHJcblxyXG4gIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoaXMgY29udHJvbFxyXG4gIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG4gIC8vIFVzZSB0byBoYW5kbGUgbG9uZyB0b3VjaCBiZWhhdmlvdXJcclxuICB0aGlzLmxvbmdUb3VjaER1cmF0aW9uID0gNjAwO1xyXG4gIHRoaXMubG9uZ1RvdWNoVGltZXIgPSBudWxsO1xyXG5cclxuICAvLyBcInRhcmdldFwiIHNldHMgdGhlIGxvY2F0aW9uIG9mIGZvY3VzLCB3aGVyZSB0aGUgY29udHJvbCBvcmJpdHMgYXJvdW5kXHJcbiAgLy8gYW5kIHdoZXJlIGl0IHBhbnMgd2l0aCByZXNwZWN0IHRvLlxyXG4gIHRoaXMudGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAvLyBjZW50ZXIgaXMgb2xkLCBkZXByZWNhdGVkOyB1c2UgXCJ0YXJnZXRcIiBpbnN0ZWFkXHJcbiAgdGhpcy5jZW50ZXIgPSB0aGlzLnRhcmdldDtcclxuXHJcbiAgLy8gVGhpcyBvcHRpb24gYWN0dWFsbHkgZW5hYmxlcyBkb2xseWluZyBpbiBhbmQgb3V0OyBsZWZ0IGFzIFwiem9vbVwiIGZvclxyXG4gIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcbiAgdGhpcy5ub1pvb20gPSBmYWxzZTtcclxuICB0aGlzLnpvb21TcGVlZCA9IDEuMDtcclxuICAvLyBMaW1pdHMgdG8gaG93IGZhciB5b3UgY2FuIGRvbGx5IGluIGFuZCBvdXRcclxuICB0aGlzLm1pbkRpc3RhbmNlID0gMDtcclxuICB0aGlzLm1heERpc3RhbmNlID0gMTUwMDsgLy8gSW5maW5pdHk7XHJcblxyXG4gIC8vIFNldCB0byB0cnVlIHRvIGRpc2FibGUgdGhpcyBjb250cm9sXHJcbiAgdGhpcy5ub1JvdGF0ZSA9IGZhbHNlO1xyXG4gIHRoaXMubm9Sb3RhdGVIb3Jpem9udGFsID0gZmFsc2U7XHJcbiAgdGhpcy5ub1JvdGF0ZVZlcnRpY2FsID0gZmFsc2U7XHJcbiAgdGhpcy5leHBsb3JlUm90YXRlU3BlZWQgPSBNYXRoLlBJIC8gMTI7XHJcbiAgdGhpcy5yb3RhdGVTcGVlZCA9IE1hdGguUEkgLyA0O1xyXG5cclxuICB0aGlzLmV4cGxvcmVNb2RlID0gZmFsc2U7XHJcbiAgdGhpcy5iaXJkc0V5ZU1vZGUgPSBmYWxzZTtcclxuICB0aGlzLnZyTW9kZSA9IGZhbHNlO1xyXG4gIHRoaXMubG9va0Fyb3VuZE1vZGUgPSBmYWxzZTtcclxuXHJcbiAgdGhpcy51c2VHeXJvc2NvcGUgPSBmYWxzZTtcclxuICB0aGlzLnJvdGF0ZUJ5ID0gTWF0aC5QSSAvIDMyO1xyXG4gIHRoaXMubW92ZUJ5ID0gLjM7XHJcblxyXG4gIC8vIFNldCB0byB0cnVlIHRvIGRpc2FibGUgdGhpcyBjb250cm9sXHJcbiAgdGhpcy5ub1BhbiA9IGZhbHNlO1xyXG4gIHRoaXMua2V5UGFuU3BlZWQgPSA0MC4wO1x0Ly8gcGl4ZWxzIG1vdmVkIHBlciBhcnJvdyBrZXkgcHVzaFxyXG5cclxuICAvLyBTZXQgdG8gdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IHJvdGF0ZSBhcm91bmQgdGhlIHRhcmdldFxyXG4gIHRoaXMuYXV0b1JvdGF0ZSA9IGZhbHNlO1xyXG4gIHRoaXMuYXV0b1JvdGF0ZVNwZWVkID0gMi4wOyAvLyAzMCBzZWNvbmRzIHBlciByb3VuZCB3aGVuIGZwcyBpcyA2MFxyXG5cclxuICAvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgdmVydGljYWxseSwgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy5cclxuICAvLyBSYW5nZSBpcyAwIHRvIE1hdGguUEkgcmFkaWFucy5cclxuICB0aGlzLm1pblBvbGFyQW5nbGUgPSAwOyAvLyByYWRpYW5zXHJcbiAgdGhpcy5tYXhQb2xhckFuZ2xlID0gTWF0aC5QSSAvIDI7IC8vIHJhZGlhbnNcclxuXHJcbiAgLy8gSG93IGZhciB5b3UgY2FuIG9yYml0IGhvcml6b250YWxseSwgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy5cclxuICAvLyBSYW5nZSBpcyAwIHRvIE1hdGguUEkgcmFkaWFucy5cclxuICB0aGlzLm1pbkF6aW11dGhBbmdsZSA9IC1JbmZpbml0eTsgLy8gcmFkaWFuc1xyXG4gIHRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7IC8vIHJhZGlhbnNcclxuXHJcbiAgLy8gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSB1c2Ugb2YgdGhlIGtleXNcclxuICB0aGlzLm5vS2V5cyA9IGZhbHNlO1xyXG4gIC8vIFRoZSBmb3VyIGFycm93IGtleXNcclxuICB0aGlzLmtleXMgPSB7TEVGVDogMzcsIFVQOiAzOCwgUklHSFQ6IDM5LCBCT1RUT006IDQwfTtcclxuXHJcbiAgLy8gaW50ZXJuYWxzXHJcblxyXG4gIGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcbiAgY29uc3QgY2hhbmdlRXZlbnQgPSB7dHlwZTogJ2NoYW5nZSd9O1xyXG5cclxuICBjb25zdCBFUFMgPSAwLjAwMDAwMTtcclxuXHJcbiAgY29uc3Qgcm90YXRlU3RhcnQgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gIGNvbnN0IHJvdGF0ZUVuZCA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XHJcbiAgY29uc3Qgcm90YXRlRGVsdGEgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG5cclxuICBjb25zdCBwYW5TdGFydCA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XHJcbiAgY29uc3QgcGFuRW5kID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBjb25zdCBwYW5EZWx0YSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XHJcblxyXG4gIGNvbnN0IGRvbGx5U3RhcnQgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gIGNvbnN0IGRvbGx5RW5kID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBjb25zdCBkb2xseURlbHRhID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuXHJcbiAgbGV0IHBoaURlbHRhOiBudW1iZXIgPSAwO1xyXG4gIGxldCB0aGV0YURlbHRhOiBudW1iZXIgPSAwO1xyXG4gIGxldCBzY2FsZTogbnVtYmVyID0gMTtcclxuICBsZXQgcGFuOiBWZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICBsZXQgdGhldGFWZWxvY2l0eTogbnVtYmVyID0gMDtcclxuICBsZXQgcGhpVmVsb2NpdHk6IG51bWJlciA9IDA7XHJcbiAgbGV0IGxhc3RQb2ludGVyTW92ZVRpbWU6IG51bWJlciA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gIGNvbnN0IGluZXJ0aWFGcmljdGlvbjogbnVtYmVyID0gMC45MjtcclxuICBjb25zdCBtaW5JbmVydGlhU3BlZWQ6IG51bWJlciA9IDAuMDAyO1xyXG5cclxuICAvLyByb3RhdGlvbiAtUEkvMiBhcm91bmQgdGhlIHgtYXhpcywgdXNlZCB0byBtYWtlIHVwIGZvciB0aGUgZGlmZmVyZW5jZSBpbiB0aHJlZS5qcyBjb29yZGluYXRlcyBhbmQgcmVhbCB3b3JsZFxyXG4gIC8vIHdoZW4gdXNpbmcgZ3lyb3Njb3BlIHRvIHJvdGF0ZSB0aGUgY2FtZXJhXHJcbiAgLy8gd2l0aG91dCBpdCB0aGUgJ2Rvd24nIGRpcmVjdGlvbiBpbiB0aGUgcmVhbCB3b3JsZCB3b3VsZCBiZSB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgJ2ZvcndhcmQnIGluIHRocmVlLmpzIHNjZW5lXHJcbiAgY29uc3Qgd29ybGRUcmFuc2Zvcm0gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigtTWF0aC5zcXJ0KDAuNSksIDAsIDAsIE1hdGguc3FydCgwLjUpKTtcclxuICBjb25zdCB0d29QSSA9IDIgKiBNYXRoLlBJO1xyXG4gIGxldCB3b3JsZFJvdGF0aW9uWSA9IDA7XHJcblxyXG4gIGNvbnN0IFNUQVRFID0ge1xyXG4gICAgTk9ORTogLTEsXHJcbiAgICBST1RBVEU6IDAsXHJcbiAgICBET0xMWTogMSxcclxuICAgIFBBTjogMixcclxuICAgIFRPVUNIX1JPVEFURTogMyxcclxuICAgIFRPVUNIX0RPTExZOiA0LFxyXG4gICAgVE9VQ0hfUEFOOiA1LFxyXG4gICAgRVhQTE9SRTogNyxcclxuICAgIEVYUExPUkVfRFJBRzogOCxcclxuICAgIEJJUkRTX0VZRTogOSxcclxuICAgIEJJUkRTX0VZRV9ET0xMWTogMTAsXHJcbiAgICBCSVJEU19FWUVfUEFOOiAxMVxyXG4gIH07XHJcblxyXG4gIGxldCBzdGF0ZSA9IFNUQVRFLk5PTkU7XHJcblxyXG4gIHRoaXMuY29udHJvbHNBY3RpdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gKHN0YXRlID09PSBTVEFURS5OT05FKTtcclxuICB9O1xyXG5cclxuICB0aGlzLnNldFBhbiA9IGZ1bmN0aW9uICh2ZWMzOiBUSFJFRS5WZWN0b3IzKSB7XHJcbiAgICBwYW4gPSB2ZWMzO1xyXG4gICAgc2NvcGUuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5nZXRQYW4gPSBmdW5jdGlvbiAoKTogVEhSRUUuVmVjdG9yMyB7XHJcbiAgICByZXR1cm4gcGFuO1xyXG4gIH07XHJcblxyXG4gIHRoaXMucGFuVG8gPSBmdW5jdGlvbiAodmVjMykge1xyXG4gICAgY29uc3QgbmV3VGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjModmVjMy54LCBzY29wZS50YXJnZXQueSwgdmVjMy56KTtcclxuICAgIGNvbnN0IGRlbHRhID0gc2NvcGUudGFyZ2V0LmNsb25lKCkuc3ViKG5ld1RhcmdldCk7XHJcbiAgICBwYW4uc3ViKGRlbHRhKTtcclxuICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMucm90YXRlTGVmdCA9IGZ1bmN0aW9uIChhbmdsZSkge1xyXG4gICAgaWYgKGFuZ2xlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgYW5nbGUgPSBnZXRBdXRvUm90YXRpb25BbmdsZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubm9Sb3RhdGVIb3Jpem9udGFsKSB7XHJcbiAgICAgIHRoZXRhRGVsdGEgPSAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhldGFEZWx0YSAtPSBhbmdsZTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICB0aGlzLnJvdGF0ZVVwID0gZnVuY3Rpb24gKGFuZ2xlKSB7XHJcbiAgICBpZiAoYW5nbGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBhbmdsZSA9IGdldEF1dG9Sb3RhdGlvbkFuZ2xlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ub1JvdGF0ZVZlcnRpY2FsKSB7XHJcbiAgICAgIHBoaURlbHRhID0gMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBoaURlbHRhIC09IGFuZ2xlO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIHBhc3MgaW4gZGlzdGFuY2UgaW4gd29ybGQgc3BhY2UgdG8gbW92ZSBsZWZ0XHJcbiAgdGhpcy5wYW5MZWZ0ID0gZnVuY3Rpb24gKGRpc3RhbmNlKSB7XHJcblxyXG4gICAgY29uc3QgcGFuT2Zmc2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IHRlID0gdGhpcy5jYW1lcmEubWF0cml4LmVsZW1lbnRzO1xyXG4gICAgLy8gZ2V0IFggY29sdW1uIG9mIG1hdHJpeFxyXG4gICAgcGFuT2Zmc2V0LnNldCh0ZVswXSwgMCwgdGVbMl0pO1xyXG4gICAgcGFuT2Zmc2V0Lm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgIHBhbk9mZnNldC5tdWx0aXBseVNjYWxhcigtZGlzdGFuY2UpO1xyXG5cclxuICAgIHBhbi5hZGQocGFuT2Zmc2V0KTtcclxuXHJcbiAgfTtcclxuXHJcbiAgLy8gcGFzcyBpbiBkaXN0YW5jZSBpbiB3b3JsZCBzcGFjZSB0byBtb3ZlIHVwXHJcbiAgdGhpcy5wYW5VcCA9IGZ1bmN0aW9uIChkaXN0YW5jZSkge1xyXG5cclxuICAgIGNvbnN0IHBhbk9mZnNldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBjb25zdCB0ZSA9IHRoaXMuY2FtZXJhLm1hdHJpeC5lbGVtZW50cztcclxuICAgIC8vIGdldCBZIGNvbHVtbiBvZiBtYXRyaXhcclxuICAgIHBhbk9mZnNldC5zZXQodGVbNF0sIDAsIHRlWzZdKTtcclxuICAgIHBhbk9mZnNldC5ub3JtYWxpemUoKTtcclxuICAgIHBhbk9mZnNldC5tdWx0aXBseVNjYWxhcihkaXN0YW5jZSk7XHJcblxyXG4gICAgcGFuLmFkZChwYW5PZmZzZXQpO1xyXG4gIH07XHJcblxyXG4gIC8vIG1haW4gZW50cnkgcG9pbnQ7IHBhc3MgaW4gVmVjdG9yMiBvZiBjaGFuZ2UgZGVzaXJlZCBpbiBwaXhlbCBzcGFjZSxcclxuICAvLyByaWdodCBhbmQgZG93biBhcmUgcG9zaXRpdmVcclxuICB0aGlzLnBhbiA9IGZ1bmN0aW9uIChkZWx0YSkge1xyXG5cclxuICAgIGNvbnN0IGVsZW1lbnQgPSBzY29wZS5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IHNjb3BlLmRvbUVsZW1lbnQuYm9keSA6IHNjb3BlLmRvbUVsZW1lbnQ7XHJcblxyXG4gICAgaWYgKHNjb3BlLmNhbWVyYS5mb3YgIT09IHVuZGVmaW5lZCkge1xyXG5cclxuICAgICAgLy8gcGVyc3BlY3RpdmVcclxuICAgICAgY29uc3QgcG9zaXRpb24gPSBzY29wZS5jYW1lcmEucG9zaXRpb247XHJcbiAgICAgIGNvbnN0IG9mZnNldCA9IHBvc2l0aW9uLmNsb25lKCkuc3ViKHNjb3BlLnRhcmdldCk7XHJcbiAgICAgIGxldCB0YXJnZXREaXN0YW5jZSA9IG9mZnNldC5sZW5ndGgoKTtcclxuXHJcbiAgICAgIC8vIGhhbGYgb2YgdGhlIGZvdiBpcyBjZW50ZXIgdG8gdG9wIG9mIHNjcmVlblxyXG4gICAgICB0YXJnZXREaXN0YW5jZSAqPSBNYXRoLnRhbigoc2NvcGUuY2FtZXJhLmZvdiAvIDIpICogTWF0aC5QSSAvIDE4MC4wKTtcclxuICAgICAgLy8gd2UgYWN0dWFsbHkgZG9uJ3QgdXNlIHNjcmVlbldpZHRoLCBzaW5jZSBwZXJzcGVjdGl2ZSBjYW1lcmEgaXMgZml4ZWQgdG8gc2NyZWVuIGhlaWdodFxyXG4gICAgICBzY29wZS5wYW5MZWZ0KDIgKiBkZWx0YS54ICogdGFyZ2V0RGlzdGFuY2UgLyBlbGVtZW50LmNsaWVudEhlaWdodCk7XHJcbiAgICAgIHNjb3BlLnBhblVwKDIgKiBkZWx0YS55ICogdGFyZ2V0RGlzdGFuY2UgLyBlbGVtZW50LmNsaWVudEhlaWdodCk7XHJcbiAgICB9IGVsc2UgaWYgKHNjb3BlLmNhbWVyYS50b3AgIT09IHVuZGVmaW5lZCkge1xyXG5cclxuICAgICAgLy8gb3J0aG9ncmFwaGljXHJcbiAgICAgIHNjb3BlLnBhbkxlZnQoZGVsdGEueCAqIChzY29wZS5jYW1lcmEucmlnaHQgLSBzY29wZS5jYW1lcmEubGVmdCkgLyBlbGVtZW50LmNsaWVudFdpZHRoKTtcclxuICAgICAgc2NvcGUucGFuVXAoZGVsdGEueSAqIChzY29wZS5jYW1lcmEudG9wIC0gc2NvcGUuY2FtZXJhLmJvdHRvbSkgLyBlbGVtZW50LmNsaWVudEhlaWdodCk7XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgLy8gY2FtZXJhIG5laXRoZXIgb3J0aG9ncmFwaGljIG9yIHBlcnNwZWN0aXZlIC0gd2FybiB1c2VyXHJcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuc2V0Q2FtZXJhID0gZnVuY3Rpb24gKG5ld0NhbWVyYTogVEhSRUUuQ2FtZXJhKSB7XHJcbiAgICBzY29wZS5jYW1lcmEgPSBuZXdDYW1lcmE7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5wYW5YWSA9IGZ1bmN0aW9uICh4LCB5KSB7XHJcbiAgICBzY29wZS5wYW4obmV3IFRIUkVFLlZlY3RvcjIoeCwgeSkpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuYW5pbWF0ZUNhbWVyYSA9IGFzeW5jIGZ1bmN0aW9uICh0eXBlOiBzdHJpbmcsIGNoYW5nZTogbnVtYmVyKTogUHJvbWlzZTxUV0VFTi5Ud2Vlbjxhbnk+PiB7XHJcbiAgICBjb25zdCBjaGFuZ2luZyA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XHJcbiAgICBjb25zdCB0d2VlbiA9IG5ldyBUV0VFTi5Ud2Vlbjxhbnk+KGNoYW5naW5nKS50byhuZXcgVEhSRUUuVmVjdG9yMihjaGFuZ2UsIDApLCAyMDApO1xyXG4gICAgdHdlZW4uZWFzaW5nKFRXRUVOLkVhc2luZy5RdWFkcmF0aWMuSW4pO1xyXG4gICAgdHdlZW4ub25VcGRhdGUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uVGFyZ2V0KHRoaXMuY2FtZXJhLnBvc2l0aW9uLCB0aGlzLnRhcmdldCwge1t0eXBlXTogY2hhbmdpbmcueH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0d2Vlbi5vbkNvbXBsZXRlKHJlc29sdmUpLnN0YXJ0KCkpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuYW5pbWF0ZUNhbWVyYU1vdmVtZW50ID0gYXN5bmMgZnVuY3Rpb24gKGVuZFBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzLCBlbmRUYXJnZXQ6IFRIUkVFLlZlY3RvcjMsIGVuZER1cmF0aW9uPzogbnVtYmVyKTogUHJvbWlzZTxUV0VFTi5Ud2Vlbjxhbnk+W10+IHtcclxuICAgIGlmICghaXNGaW5pdGUoZW5kUG9zaXRpb24ueCkgfHwgIWlzRmluaXRlKGVuZFBvc2l0aW9uLnkpIHx8ICFpc0Zpbml0ZShlbmRQb3NpdGlvbi56KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZHVyYXRpb24gPSBlbmREdXJhdGlvbiAhPT0gdW5kZWZpbmVkID8gZW5kRHVyYXRpb24gOiAuNjYgKiBjYW1lcmEucG9zaXRpb24uZGlzdGFuY2VUbyhlbmRQb3NpdGlvbik7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy50YXJnZXQuY2xvbmUoKTtcclxuICAgIGNvbnN0IHRhcmdldFR3ZWVuID0gbmV3IFRXRUVOLlR3ZWVuPGFueT4odGFyZ2V0KVxyXG4gICAgICAudG8oZW5kVGFyZ2V0LCBkdXJhdGlvbilcclxuICAgICAgLmVhc2luZyhUV0VFTi5FYXNpbmcuUXVhZHJhdGljLkluT3V0KVxyXG4gICAgICAub25VcGRhdGUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcclxuICAgICAgfSk7XHJcbiAgICBjb25zdCBwb3NpdGlvblR3ZWVuID0gbmV3IFRXRUVOLlR3ZWVuPGFueT4ocG9zaXRpb24pXHJcbiAgICAgIC50byhlbmRQb3NpdGlvbiwgZHVyYXRpb24pXHJcbiAgICAgIC5lYXNpbmcoVFdFRU4uRWFzaW5nLlF1YWRyYXRpYy5JbilcclxuICAgICAgLm9uVXBkYXRlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XHJcbiAgICAgIH0pO1xyXG4gICAgY29uc3QgdGFyZ2V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPFRXRUVOLlR3ZWVuPGFueT4+KHJlc29sdmUgPT4ge1xyXG4gICAgICB0YXJnZXRUd2VlblxyXG4gICAgICAgIC5vbkNvbXBsZXRlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0YXJnZXRUd2Vlbik7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3RhcnQoKTtcclxuICAgIH0pO1xyXG4gICAgY29uc3QgcG9zaXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8VFdFRU4uVHdlZW48YW55Pj4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgIHBvc2l0aW9uVHdlZW5cclxuICAgICAgICAub25Db21wbGV0ZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcclxuICAgICAgICAgIHJlc29sdmUocG9zaXRpb25Ud2Vlbik7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3RhcnQoKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFt0YXJnZXRQcm9taXNlLCBwb3NpdGlvblByb21pc2VdKTtcclxuICB9O1xyXG5cclxuICB0aGlzLmZpeGVkQ2FtZXJhTW92ZW1lbnQgPSBhc3luYyBmdW5jdGlvbiAoXHJcbiAgICBlbmRQb3NpdGlvbjogVEhSRUUuVmVjdG9yMyxcclxuICAgIGVuZFRhcmdldDogVEhSRUUuVmVjdG9yMyxcclxuICAgIGVuZER1cmF0aW9uPzogbnVtYmVyXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoXHJcbiAgICAgICFpc0Zpbml0ZShlbmRQb3NpdGlvbi54KSB8fFxyXG4gICAgICAhaXNGaW5pdGUoZW5kUG9zaXRpb24ueSkgfHxcclxuICAgICAgIWlzRmluaXRlKGVuZFBvc2l0aW9uLnopXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24uY29weShlbmRQb3NpdGlvbik7XHJcbiAgICB0aGlzLnRhcmdldC5jb3B5KGVuZFRhcmdldCk7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcclxuICAgIHJldHVybjtcclxuICB9O1xyXG5cclxuICB0aGlzLmNhbWVyYUxlZnQgPSBmdW5jdGlvbiAoKTogUHJvbWlzZTxUV0VFTi5Ud2Vlbjxhbnk+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbmltYXRlQ2FtZXJhKCdyb3RhdGUnLCArdGhpcy5yb3RhdGVCeSk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5jYW1lcmFSaWdodCA9IGZ1bmN0aW9uICgpOiBQcm9taXNlPFRXRUVOLlR3ZWVuPGFueT4+IHtcclxuICAgIHJldHVybiB0aGlzLmFuaW1hdGVDYW1lcmEoJ3JvdGF0ZScsIC10aGlzLnJvdGF0ZUJ5KTtcclxuICB9O1xyXG5cclxuICB0aGlzLmNhbWVyYUZvcndhcmQgPSBmdW5jdGlvbiAoKTogUHJvbWlzZTxUV0VFTi5Ud2Vlbjxhbnk+PiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbmltYXRlQ2FtZXJhKCdtb3ZlJywgLXRoaXMubW92ZUJ5KTtcclxuICB9O1xyXG5cclxuICB0aGlzLmNhbWVyYUJhY2t3YXJkID0gZnVuY3Rpb24gKCk6IFByb21pc2U8VFdFRU4uVHdlZW48YW55Pj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0ZUNhbWVyYSgnbW92ZScsICt0aGlzLm1vdmVCeSk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5kb2xseUluID0gZnVuY3Rpb24gKGRvbGx5U2NhbGUpIHtcclxuICAgIGlmIChkb2xseVNjYWxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZG9sbHlTY2FsZSA9IGdldFpvb21TY2FsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjYWxlIC89IGRvbGx5U2NhbGU7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5kb2xseU91dCA9IGZ1bmN0aW9uIChkb2xseVNjYWxlKSB7XHJcbiAgICBpZiAoZG9sbHlTY2FsZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGRvbGx5U2NhbGUgPSBnZXRab29tU2NhbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzY2FsZSAqPSBkb2xseVNjYWxlO1xyXG4gIH07XHJcblxyXG4gIHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgYXBwbHlSb3RhdGlvbkFuZFBhbigpO1xyXG4gICAgdGhldGFEZWx0YSA9IDA7XHJcbiAgICBwaGlEZWx0YSA9IDA7XHJcbiAgICBzY2FsZSA9IDE7XHJcbiAgICBwYW4uc2V0KDAsIDAsIDApO1xyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIGFwcGx5Um90YXRpb25BbmRQYW4oKSB7XHJcbiAgICBzY29wZS51cGRhdGVQb3NpdGlvblRhcmdldChzY29wZS5jYW1lcmEucG9zaXRpb24sIHNjb3BlLnRhcmdldCk7XHJcbiAgfVxyXG5cclxuICB0aGlzLmFuaW1hdGVNb3ZlVG8gPSBhc3luYyBmdW5jdGlvbiAodGFyZ2V0OiBUSFJFRS5WZWN0b3IzKTogUHJvbWlzZTxUV0VFTi5Ud2Vlbjxhbnk+PiB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IHNjb3BlLnRhcmdldC5jbG9uZSgpO1xyXG4gICAgY29uc3QgZGlzdGFuY2UgPSB0YXJnZXQuZGlzdGFuY2VUbyhwb3NpdGlvbik7XHJcbiAgICBjb25zdCB0d2VlbiA9IG5ldyBUV0VFTi5Ud2Vlbjxhbnk+KHBvc2l0aW9uKS50byh0YXJnZXQsIGRpc3RhbmNlKTtcclxuICAgIHR3ZWVuLmVhc2luZyhUV0VFTi5FYXNpbmcuUXVhZHJhdGljLk91dCk7XHJcbiAgICB0d2Vlbi5vblVwZGF0ZShzY29wZS5tb3ZlVG8uYmluZChzY29wZSwgcG9zaXRpb24pKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHR3ZWVuLm9uQ29tcGxldGUocmVzb2x2ZSkuc3RhcnQoKSk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5tb3ZlVG8gPSBmdW5jdGlvbiAodmVjMykge1xyXG4gICAgdmVjMy5zZXRZKHNjb3BlLnRhcmdldC55KTtcclxuICAgIGNvbnN0IGRpZmYgPSB2ZWMzLmNsb25lKCkuc3ViKHNjb3BlLnRhcmdldCk7XHJcbiAgICBjb25zdCBvZmZzZXQgPSBzY29wZS5jYW1lcmEucG9zaXRpb24uY2xvbmUoKS5zdWIoc2NvcGUudGFyZ2V0KTtcclxuICAgIHNjb3BlLnRhcmdldC5hZGQocGFuKS5hZGQoZGlmZik7XHJcbiAgICBzY29wZS5jYW1lcmEucG9zaXRpb24uY29weShzY29wZS50YXJnZXQpLmFkZChvZmZzZXQpO1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9O1xyXG5cclxuICB0aGlzLnVwZGF0ZVBvc2l0aW9uVGFyZ2V0ID0gZnVuY3Rpb24gKHBvc2l0aW9uLCB0YXJnZXQsIG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgcm90YXRlOiB0aGV0YURpZmYgPSB0aGV0YURlbHRhLFxyXG4gICAgICBtb3ZlOiBtb3ZlRGlmZiA9IDBcclxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xyXG5cclxuICAgIC8vIGFkZGVkIHRoaXMgbGluZSB0byBiZSBhYmxlIHRvIHpvb20gaW4gZnVydGhlclxyXG4gICAgLy8gdGFyZ2V0LnkgPSB0aGlzLm1pbkRpc3RhbmNlO1xyXG5cclxuICAgIGNvbnN0IG9mZnNldCA9IHBvc2l0aW9uLmNsb25lKCkuc3ViKHRhcmdldCk7XHJcblxyXG4gICAgLy8gYW5nbGUgZnJvbSB6LWF4aXMgYXJvdW5kIHktYXhpc1xyXG4gICAgbGV0IHRoZXRhID0gTWF0aC5hdGFuMihvZmZzZXQueCwgb2Zmc2V0LnopO1xyXG5cclxuICAgIC8vIGFuZ2xlIGZyb20geS1heGlzXHJcbiAgICBsZXQgcGhpID0gTWF0aC5hdGFuMihNYXRoLnNxcnQob2Zmc2V0LnggKiBvZmZzZXQueCArIG9mZnNldC56ICogb2Zmc2V0LnopLCBvZmZzZXQueSk7XHJcblxyXG4gICAgdGhldGEgKz0gdGhldGFEaWZmO1xyXG4gICAgcGhpICs9IHBoaURlbHRhO1xyXG5cclxuICAgIGxldCBtaW4gPSB0aGlzLm1pbkF6aW11dGhBbmdsZTtcclxuICAgIGxldCBtYXggPSB0aGlzLm1heEF6aW11dGhBbmdsZTtcclxuXHJcbiAgICBpZiAoaXNGaW5pdGUobWluKSAmJiBpc0Zpbml0ZShtYXgpKSB7XHJcbiAgICAgIGlmIChtaW4gPCAtTWF0aC5QSSkge1xyXG4gICAgICAgIG1pbiArPSB0d29QSTtcclxuICAgICAgfSBlbHNlIGlmIChtaW4gPiBNYXRoLlBJKSB7XHJcbiAgICAgICAgbWluIC09IHR3b1BJO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYXggPCAtTWF0aC5QSSkge1xyXG4gICAgICAgIG1heCArPSB0d29QSTtcclxuICAgICAgfSBlbHNlIGlmIChtYXggPiBNYXRoLlBJKSB7XHJcbiAgICAgICAgbWF4IC09IHR3b1BJO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtaW4gPD0gbWF4KSB7XHJcbiAgICAgICAgdGhldGEgPSBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdGhldGEpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGV0YSA9IHRoZXRhID4gKG1pbiArIG1heCkgLyAyID8gTWF0aC5tYXgobWluLCB0aGV0YSkgOiBNYXRoLm1pbihtYXgsIHRoZXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXHJcbiAgICBwaGkgPSBNYXRoLm1heCh0aGlzLm1pblBvbGFyQW5nbGUsIE1hdGgubWluKHRoaXMubWF4UG9sYXJBbmdsZSwgcGhpKSk7XHJcblxyXG4gICAgLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZSBFUFMgYW5kIFBJLUVQU1xyXG4gICAgcGhpID0gTWF0aC5tYXgoRVBTLCBNYXRoLm1pbihNYXRoLlBJIC0gRVBTLCBwaGkpKTtcclxuXHJcbiAgICBsZXQgcmFkaXVzID0gb2Zmc2V0Lmxlbmd0aCgpICogKG1vdmVEaWZmID8gTWF0aC5hYnMobW92ZURpZmYpIDogMSkgKiBzY2FsZTtcclxuXHJcbiAgICAvLyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xyXG4gICAgcmFkaXVzID0gTWF0aC5tYXgodGhpcy5taW5EaXN0YW5jZSwgTWF0aC5taW4odGhpcy5tYXhEaXN0YW5jZSwgcmFkaXVzKSk7XHJcbiAgICB0aGlzLnRhcmdldC5hZGQocGFuKTtcclxuXHJcbiAgICAvLyBtb3ZlIHRhcmdldCB0byBwYW5uZWQgbG9jYXRpb25cclxuXHJcbiAgICBvZmZzZXQueCA9IHJhZGl1cyAqIE1hdGguc2luKHBoaSkgKiBNYXRoLnNpbih0aGV0YSk7XHJcbiAgICBvZmZzZXQueSA9IG1vdmVEaWZmID8gMCA6IHJhZGl1cyAqIE1hdGguY29zKHBoaSk7XHJcbiAgICBvZmZzZXQueiA9IHJhZGl1cyAqIE1hdGguc2luKHBoaSkgKiBNYXRoLmNvcyh0aGV0YSk7XHJcblxyXG4gICAgaWYgKCFtb3ZlRGlmZikge1xyXG4gICAgICBwb3NpdGlvbi5jb3B5KHRoaXMudGFyZ2V0KS5hZGQob2Zmc2V0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChtb3ZlRGlmZiA8IDApIHtcclxuICAgICAgICB0aGlzLnRhcmdldC5zdWIob2Zmc2V0KTtcclxuICAgICAgICBwb3NpdGlvbi5zdWIob2Zmc2V0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRhcmdldC5hZGQob2Zmc2V0KTtcclxuICAgICAgICBwb3NpdGlvbi5hZGQob2Zmc2V0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZXhwbG9yZU1vZGUgJiYgdGhpcy51c2VHeXJvc2NvcGUgJiYgIXRoaXMubG9va0Fyb3VuZE1vZGUpIHtcclxuICAgICAgY29uc3QgbG9va1ZlY3RvciA9IG5ldyBUSFJFRS5WZWN0b3IzKHRoaXMudGFyZ2V0LngsIGNhbWVyYS5wb3NpdGlvbi55LCB0aGlzLnRhcmdldC56KS5zdWIoY2FtZXJhLnBvc2l0aW9uKTtcclxuICAgICAgd29ybGRSb3RhdGlvblkgPSBNYXRoLmF0YW4yKGxvb2tWZWN0b3IueCwgbG9va1ZlY3Rvci56KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLmxvb2tBdCh0aGlzLnRhcmdldCk7XHJcbiAgICB9XHJcbiAgICBzY29wZS5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcclxuICB9O1xyXG5cclxuICB0aGlzLnNldEV4cGxvcmVNb2RlID0gZnVuY3Rpb24gKG9uID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5leHBsb3JlTW9kZSA9IG9uO1xyXG4gICAgc3RhdGUgPSBvbiA/IFNUQVRFLkVYUExPUkUgOiBTVEFURS5OT05FO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuc2V0RXhwbG9yZURyYWdNb2RlID0gZnVuY3Rpb24gKG9uID0gdHJ1ZSkge1xyXG4gICAgc3RhdGUgPSBvbiA/IFNUQVRFLkVYUExPUkVfRFJBRyA6IFNUQVRFLkVYUExPUkU7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5zZXRCaXJkc0V5ZU1vZGUgPSBmdW5jdGlvbiAob24gPSB0cnVlKSB7XHJcbiAgICB0aGlzLmJpcmRzRXllTW9kZSA9IG9uO1xyXG4gICAgc3RhdGUgPSBvbiA/IFNUQVRFLkJJUkRTX0VZRSA6IFNUQVRFLk5PTkU7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5zZXRWck1vZGUgPSBmdW5jdGlvbiAob24gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnZyTW9kZSA9IG9uO1xyXG4gIH07XHJcblxyXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZUNhbWVyYVF1YXRlcm5pb24oYWxwaGE6IG51bWJlciwgYmV0YTogbnVtYmVyLCBnYW1tYTogbnVtYmVyKTogVEhSRUUuUXVhdGVybmlvbiB7XHJcbiAgICAvLyBnZXQgZGV2aWNlIHJvdGF0aW9uIGluIGV1bGVyIGFuZ2xlcyBmcm9tIGd5cm9zY29wZVxyXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL2Z1bmRhbWVudGFscy9uYXRpdmUtaGFyZHdhcmUvZGV2aWNlLW9yaWVudGF0aW9uL1xyXG4gICAgY29uc3QgZGV2aWNlRXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoYmV0YSwgYWxwaGEgKyB3b3JsZFJvdGF0aW9uWSwgLWdhbW1hLCAnWVhaJyk7XHJcblxyXG4gICAgLy8gY3JlYXRlIHJlc3VsdCBxdWF0ZXJuaW9uIGZyb20gZXVsZXIgYW5nbGVzXHJcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgcmVzdWx0LnNldEZyb21FdWxlcihkZXZpY2VFdWxlcik7XHJcblxyXG4gICAgLy8gY2FsY3VsYXRlIG5lY2Vzc2FyeSByb3RhdGlvbiB0byBtYWtlIHVwIGZvciBkaWZmZXJlbnQgc2NyZWVuIG9yaWVudGF0aW9uXHJcbiAgICAvLyB3aW5kb3cub3JpZW50YXRpb24gaXMgMCBpbiBwb3J0cmFpdCBtb2RlLCA5MCBvciAtOTAgaW4gcmVzcGVjdGl2ZSBsYW5kc2NhcGUgbW9kZXNcclxuICAgIGNvbnN0IG1pbnVzSGFsZkFuZ2xlID0gLVRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChOdW1iZXIod2luZG93Lm9yaWVudGF0aW9uKSkgLyAyO1xyXG4gICAgY29uc3Qgc2NyZWVuVHJhbnNmb3JtID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oMCwgTWF0aC5zaW4obWludXNIYWxmQW5nbGUpLCAwLCBNYXRoLmNvcyhtaW51c0hhbGZBbmdsZSkpO1xyXG4gICAgcmVzdWx0Lm11bHRpcGx5KHNjcmVlblRyYW5zZm9ybSk7XHJcblxyXG4gICAgLy8gcm90YXRlIHJlc3VsdCBxdWF0ZXJuaW9uIHRvIG1ha2UgdXAgZGlmZmVyZW5jZSBpbiB3b3JsZCBjb29yZGluYXRlc1xyXG4gICAgcmVzdWx0Lm11bHRpcGx5KHdvcmxkVHJhbnNmb3JtKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSB7XHJcbiAgICByZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAvIDYwICogc2NvcGUuYXV0b1JvdGF0ZVNwZWVkO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0Wm9vbVNjYWxlKCkge1xyXG4gICAgcmV0dXJuIE1hdGgucG93KDAuOTUsIHNjb3BlLnpvb21TcGVlZCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudCkge1xyXG4gICAgaWYgKCFpc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgY29uc3QgbW91c2VQb3M6IFRIUkVFLlZlY3RvcjIgPSBSZWxhdGl2ZVBvc2l0aW9uVXRpbHMuR2V0Q2xpZW50TW91c2VQb3NpdGlvbihldmVudCk7XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBTVEFURS5CSVJEU19FWUUgfHxcclxuICAgICAgc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRV9ET0xMWSB8fFxyXG4gICAgICBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX1BBTikge1xyXG5cclxuICAgICAgc3RhdGUgPSBTVEFURS5CSVJEU19FWUVfUEFOO1xyXG4gICAgICBwYW5TdGFydC5zZXQobW91c2VQb3MueCwgbW91c2VQb3MueSk7XHJcbiAgICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcclxuICAgICAgc2NvcGUuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChldmVudC5idXR0b24gPT09IDApIHtcclxuICAgICAgaWYgKHNjb3BlLm5vUm90YXRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLkVYUExPUkUgJiYgc3RhdGUgIT09IFNUQVRFLkVYUExPUkVfRFJBRykge1xyXG4gICAgICAgIHN0YXRlID0gU1RBVEUuUk9UQVRFO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByb3RhdGVTdGFydC5zZXQobW91c2VQb3MueCwgbW91c2VQb3MueSk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChldmVudC5idXR0b24gPT09IDEpIHtcclxuICAgICAgaWYgKHNjb3BlLm5vWm9vbSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RhdGUgPSBTVEFURS5ET0xMWTtcclxuXHJcbiAgICAgIGRvbGx5U3RhcnQuc2V0KG1vdXNlUG9zLngsIG1vdXNlUG9zLnkpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSAyKSB7XHJcbiAgICAgIGlmIChzY29wZS5ub1BhbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RhdGUgPSBTVEFURS5QQU47XHJcblxyXG4gICAgICBwYW5TdGFydC5zZXQobW91c2VQb3MueCwgbW91c2VQb3MueSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR3JlZ2dtYW4gZml4OiBodHRwczovL2dpdGh1Yi5jb20vZ3JlZ2dtYW4vdGhyZWUuanMvY29tbWl0L2ZkZTlmOTkxN2Q2ZDgzODFmMDZiZjIyY2RmZjc2NjAyOWQxNzYxYmVcclxuICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcclxuICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xyXG5cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHNldFJvdGF0aW9uUGFyYW1ldGVycyhlbmRQb2ludDogVEhSRUUuVmVjdG9yMiwgZGlyZWN0aW9uOiBudW1iZXIsIHNwZWVkOiBudW1iZXIpIHtcclxuXHJcbiAgICBjb25zdCBlbGVtZW50ID0gc2NvcGUuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBzY29wZS5kb21FbGVtZW50LmJvZHkgOiBzY29wZS5kb21FbGVtZW50O1xyXG5cclxuICAgIHJvdGF0ZUVuZC5jb3B5KGVuZFBvaW50KTtcclxuICAgIHJvdGF0ZURlbHRhLnN1YlZlY3RvcnMocm90YXRlRW5kLCByb3RhdGVTdGFydCk7XHJcblxyXG4gICAgY29uc3QgYW5nbGVYID0gMiAqIE1hdGguUEkgKiBkaXJlY3Rpb24gKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIHNwZWVkO1xyXG4gICAgY29uc3QgYW5nbGVZID0gMiAqIE1hdGguUEkgKiBkaXJlY3Rpb24gKiByb3RhdGVEZWx0YS55IC8gZWxlbWVudC5jbGllbnRIZWlnaHQgKiBzcGVlZDtcclxuXHJcbiAgICBzY29wZS5yb3RhdGVMZWZ0KGFuZ2xlWCk7XHJcbiAgICBzY29wZS5yb3RhdGVVcChhbmdsZVkpO1xyXG5cclxuICAgIHRoZXRhVmVsb2NpdHkgPSBhbmdsZVg7XHJcbiAgICBwaGlWZWxvY2l0eSA9IGFuZ2xlWTtcclxuICAgIGxhc3RQb2ludGVyTW92ZVRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuXHJcbiAgICByb3RhdGVTdGFydC5jb3B5KHJvdGF0ZUVuZCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBpc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50PzogRXZlbnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlzQ2FudmFzID0gZXZlbnQgPyAoZXZlbnQudGFyZ2V0ICYmIChldmVudC50YXJnZXQgYXMgRWxlbWVudCkubm9kZU5hbWUgPT09ICdDQU5WQVMnKSA6IHRydWU7XHJcbiAgICByZXR1cm4gaXNDYW52YXMgJiYgc2NvcGUuZW5hYmxlZDtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIG9yaWdpbmF0ZU9uQ2FudmFzKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQgPT09IGRvY3VtZW50LmJvZHk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkge1xyXG5cclxuICAgIGlmICghaXNNb3VzZUV2ZW50QWxsb3dlZChldmVudCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBjb25zdCBtb3VzZVBvczogVEhSRUUuVmVjdG9yMiA9IFJlbGF0aXZlUG9zaXRpb25VdGlscy5HZXRDbGllbnRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IFNUQVRFLlJPVEFURSkge1xyXG5cclxuICAgICAgaWYgKHNjb3BlLm5vUm90YXRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHNldFJvdGF0aW9uUGFyYW1ldGVycyhcclxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMihtb3VzZVBvcy54LCBtb3VzZVBvcy55KSxcclxuICAgICAgICAxLFxyXG4gICAgICAgIHNjb3BlLnJvdGF0ZVNwZWVkXHJcbiAgICAgICk7XHJcbiAgICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNUQVRFLkVYUExPUkUpIHtcclxuXHJcbiAgICAgIGlmIChzY29wZS5ub1JvdGF0ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBzZXRSb3RhdGlvblBhcmFtZXRlcnMoXHJcbiAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjIobW91c2VQb3MueCwgbW91c2VQb3MueSksXHJcbiAgICAgICAgLTEsXHJcbiAgICAgICAgc2NvcGUuZXhwbG9yZVJvdGF0ZVNwZWVkXHJcbiAgICAgICk7XHJcbiAgICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNUQVRFLkVYUExPUkVfRFJBRykge1xyXG5cclxuICAgICAgc2NvcGUudXBkYXRlKCk7XHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5ET0xMWSB8fCBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX0RPTExZKSB7XHJcblxyXG4gICAgICBpZiAoc2NvcGUubm9ab29tID09PSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkb2xseUVuZC5zZXQobW91c2VQb3MueCwgbW91c2VQb3MueSk7XHJcbiAgICAgIGRvbGx5RGVsdGEuc3ViVmVjdG9ycyhkb2xseUVuZCwgZG9sbHlTdGFydCk7XHJcblxyXG4gICAgICBpZiAoZG9sbHlEZWx0YS55ID4gMCkge1xyXG5cclxuICAgICAgICBzY29wZS5kb2xseUluKCk7XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICBzY29wZS5kb2xseU91dCgpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgZG9sbHlTdGFydC5jb3B5KGRvbGx5RW5kKTtcclxuICAgICAgc2NvcGUudXBkYXRlKCk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEUuUEFOIHx8IHN0YXRlID09PSBTVEFURS5CSVJEU19FWUVfUEFOKSB7XHJcblxyXG4gICAgICBpZiAoc2NvcGUubm9QYW4gPT09IHRydWUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBhbkVuZC5zZXQobW91c2VQb3MueCwgbW91c2VQb3MueSk7XHJcbiAgICAgIHBhbkRlbHRhLnN1YlZlY3RvcnMocGFuRW5kLCBwYW5TdGFydCk7XHJcblxyXG4gICAgICBzY29wZS5wYW4ocGFuRGVsdGEpO1xyXG5cclxuICAgICAgcGFuU3RhcnQuY29weShwYW5FbmQpO1xyXG4gICAgICBzY29wZS51cGRhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIG9uTW91c2VVcChldmVudCkge1xyXG4gICAgaWYgKCFzY29wZS5lbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHcmVnZ21hbiBmaXg6IGh0dHBzOi8vZ2l0aHViLmNvbS9ncmVnZ21hbi90aHJlZS5qcy9jb21taXQvZmRlOWY5OTE3ZDZkODM4MWYwNmJmMjJjZGZmNzY2MDI5ZDE3NjFiZVxyXG4gICAgc2NvcGUuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xyXG4gICAgc2NvcGUuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBTVEFURS5FWFBMT1JFKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChzdGF0ZSA9PT0gU1RBVEUuRVhQTE9SRV9EUkFHKSB7XHJcbiAgICAgIHN0YXRlID0gU1RBVEUuRVhQTE9SRTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0YXRlID09PSBTVEFURS5CSVJEU19FWUUgfHwgc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRV9QQU4gfHwgc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRV9ET0xMWSkge1xyXG4gICAgICBzdGF0ZSA9IFNUQVRFLkJJUkRTX0VZRTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgc3RhdGUgPSBTVEFURS5OT05FO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gb25Nb3VzZVdoZWVsKGV2ZW50KSB7XHJcbiAgICBpZiAoIXNjb3BlLmVuYWJsZWQgfHwgc2NvcGUubm9ab29tID09PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcclxuICAgICAgc2NvcGUuZG9sbHlPdXQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNjb3BlLmRvbGx5SW4oKTtcclxuICAgIH1cclxuICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XHJcblxyXG4gICAgaWYgKHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChzY29wZS5ub0tleXMgPT09IHRydWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHNjb3BlLm5vUGFuID09PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghb3JpZ2luYXRlT25DYW52YXMoZXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuXHJcbiAgICAgIGNhc2Ugc2NvcGUua2V5cy5VUDpcclxuICAgICAgICBpZiAoc2NvcGUuZXhwbG9yZU1vZGUpIHtcclxuICAgICAgICAgIHNjb3BlLmNhbWVyYUZvcndhcmQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2NvcGUucGFuKG5ldyBUSFJFRS5WZWN0b3IyKDAsIHNjb3BlLmtleVBhblNwZWVkKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHNjb3BlLmtleXMuQk9UVE9NOlxyXG4gICAgICAgIGlmIChzY29wZS5leHBsb3JlTW9kZSkge1xyXG4gICAgICAgICAgc2NvcGUuY2FtZXJhQmFja3dhcmQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2NvcGUucGFuKG5ldyBUSFJFRS5WZWN0b3IyKDAsIC1zY29wZS5rZXlQYW5TcGVlZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBzY29wZS5rZXlzLkxFRlQ6XHJcbiAgICAgICAgaWYgKHNjb3BlLmV4cGxvcmVNb2RlKSB7XHJcbiAgICAgICAgICBzY29wZS5jYW1lcmFMZWZ0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNjb3BlLnBhbihuZXcgVEhSRUUuVmVjdG9yMihzY29wZS5rZXlQYW5TcGVlZCwgMCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBzY29wZS5rZXlzLlJJR0hUOlxyXG4gICAgICAgIGlmIChzY29wZS5leHBsb3JlTW9kZSkge1xyXG4gICAgICAgICAgc2NvcGUuY2FtZXJhUmlnaHQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2NvcGUucGFuKG5ldyBUSFJFRS5WZWN0b3IyKC1zY29wZS5rZXlQYW5TcGVlZCwgMCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0KGV2ZW50KSB7XHJcbiAgICBpZiAoIWlzTW91c2VFdmVudEFsbG93ZWQoZXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRSB8fFxyXG4gICAgICBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX0RPTExZIHx8XHJcbiAgICAgIHN0YXRlID09PSBTVEFURS5CSVJEU19FWUVfUEFOKSB7XHJcbiAgICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSB8fCBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMykge1xyXG4gICAgICAgIHN0YXRlID0gU1RBVEUuQklSRFNfRVlFX1BBTjtcclxuICAgICAgICBwYW5TdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICBzdGF0ZSA9IFNUQVRFLkJJUkRTX0VZRV9ET0xMWTtcclxuICAgICAgICBjb25zdCBkeCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggLSBldmVudC50b3VjaGVzWzFdLnBhZ2VYO1xyXG4gICAgICAgIGNvbnN0IGR5ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVk7XHJcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xyXG4gICAgICAgIGRvbGx5U3RhcnQuc2V0KDAsIGRpc3RhbmNlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xyXG5cclxuICAgICAgY2FzZSAxOlx0Ly8gb25lLWZpbmdlcmVkIHRvdWNoOiByb3RhdGVcclxuICAgICAgICBpZiAoc2NvcGUubm9Sb3RhdGUgPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjb3BlLmxvbmdUb3VjaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBzY29wZS5sb29rQXJvdW5kTW9kZSA9IHRydWU7XHJcbiAgICAgICAgfSwgc2NvcGUubG9uZ1RvdWNoRHVyYXRpb24pO1xyXG5cclxuICAgICAgICBzdGF0ZSA9IFNUQVRFLlRPVUNIX1JPVEFURTtcclxuICAgICAgICByb3RhdGVTdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIDI6XHQvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XHJcbiAgICAgICAgaWYgKHNjb3BlLm5vWm9vbSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9ET0xMWTtcclxuXHJcbiAgICAgICAgY29uc3QgZHggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWDtcclxuICAgICAgICBjb25zdCBkeSA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkgLSBldmVudC50b3VjaGVzWzFdLnBhZ2VZO1xyXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcclxuICAgICAgICBkb2xseVN0YXJ0LnNldCgwLCBkaXN0YW5jZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cclxuICAgICAgICBpZiAoc2NvcGUubm9QYW4gPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfUEFOO1xyXG5cclxuICAgICAgICBwYW5TdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB0b3VjaG1vdmUoZXZlbnQpIHtcclxuICAgIGlmICghaXNNb3VzZUV2ZW50QWxsb3dlZChldmVudCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyVGltZW91dChzY29wZS5sb25nVG91Y2hUaW1lcik7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudCA9IHNjb3BlLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gc2NvcGUuZG9tRWxlbWVudC5ib2R5IDogc2NvcGUuZG9tRWxlbWVudDtcclxuXHJcbiAgICAvLyBkaXNhYmxlIHVzZSBvZiB0d28gb3IgdGhyZWUgZmluZ2VyIHRvdWNoIGdlc3R1cmVzIGluIGV4cGxvcmUgbW9kZVxyXG4gICAgY29uc3QgdG91Y2hDb3VudFRvUHJvY2VzcyA9IHNjb3BlLmV4cGxvcmVNb2RlID8gMSA6XHJcbiAgICAgIHN0YXRlID09PSBTVEFURS5CSVJEU19FWUVfUEFOICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxID8gMyA6XHJcbiAgICAgICAgZXZlbnQudG91Y2hlcy5sZW5ndGg7XHJcbiAgICBzd2l0Y2ggKHRvdWNoQ291bnRUb1Byb2Nlc3MpIHtcclxuXHJcbiAgICAgIGNhc2UgMTogLy8gb25lLWZpbmdlcmVkIHRvdWNoOiByb3RhdGVcclxuICAgICAgICBpZiAoc2NvcGUubm9Sb3RhdGUgPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9ST1RBVEUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgICAgcm90YXRlRGVsdGEuc3ViVmVjdG9ycyhyb3RhdGVFbmQsIHJvdGF0ZVN0YXJ0KTtcclxuXHJcbiAgICAgICAgY29uc3Qgcm90YXRpb25TcGVlZCA9IHNjb3BlLmV4cGxvcmVNb2RlXHJcbiAgICAgICAgICA/IHNjb3BlLmV4cGxvcmVSb3RhdGVTcGVlZFxyXG4gICAgICAgICAgOiBzY29wZS5yb3RhdGVTcGVlZDtcclxuXHJcbiAgICAgICAgY29uc3QgYW5nbGVYID0gMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIHJvdGF0aW9uU3BlZWQ7XHJcbiAgICAgICAgY29uc3QgYW5nbGVZID0gMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS55IC8gZWxlbWVudC5jbGllbnRIZWlnaHQgKiByb3RhdGlvblNwZWVkO1xyXG5cclxuICAgICAgICBzY29wZS5yb3RhdGVMZWZ0KGFuZ2xlWCk7XHJcbiAgICAgICAgc2NvcGUucm90YXRlVXAoYW5nbGVZKTtcclxuXHJcbiAgICAgICAgdGhldGFWZWxvY2l0eSA9IGFuZ2xlWDtcclxuICAgICAgICBwaGlWZWxvY2l0eSA9IGFuZ2xlWTtcclxuXHJcbiAgICAgICAgcm90YXRlU3RhcnQuY29weShyb3RhdGVFbmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAyOiAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XHJcbiAgICAgICAgaWYgKHNjb3BlLm5vWm9vbSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLlRPVUNIX0RPTExZICYmIHN0YXRlICE9PSBTVEFURS5CSVJEU19FWUVfRE9MTFkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGR4ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWCAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVg7XHJcbiAgICAgICAgY29uc3QgZHkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWTtcclxuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XHJcblxyXG4gICAgICAgIGRvbGx5RW5kLnNldCgwLCBkaXN0YW5jZSk7XHJcbiAgICAgICAgZG9sbHlEZWx0YS5zdWJWZWN0b3JzKGRvbGx5RW5kLCBkb2xseVN0YXJ0KTtcclxuXHJcbiAgICAgICAgaWYgKGRvbGx5RGVsdGEueSA+IDApIHtcclxuICAgICAgICAgIHNjb3BlLmRvbGx5T3V0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNjb3BlLmRvbGx5SW4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvbGx5U3RhcnQuY29weShkb2xseUVuZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cclxuICAgICAgICBpZiAoc2NvcGUubm9QYW4gPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9QQU4gJiYgc3RhdGUgIT09IFNUQVRFLkJJUkRTX0VZRV9QQU4pIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhbkVuZC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgICAgcGFuRGVsdGEuc3ViVmVjdG9ycyhwYW5FbmQsIHBhblN0YXJ0KTtcclxuXHJcbiAgICAgICAgc2NvcGUucGFuKHBhbkRlbHRhKTtcclxuXHJcbiAgICAgICAgcGFuU3RhcnQuY29weShwYW5FbmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XHJcbiAgICB9XHJcbiAgICBzY29wZS51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHRvdWNoZW5kKGV2ZW50Pykge1xyXG4gICAgaWYgKCFzY29wZS5lbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhclRpbWVvdXQoc2NvcGUubG9uZ1RvdWNoVGltZXIpO1xyXG4gICAgc2NvcGUubG9va0Fyb3VuZE1vZGUgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRSB8fCBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX1BBTiB8fCBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX0RPTExZKSB7XHJcbiAgICAgIHN0YXRlID0gU1RBVEUuQklSRFNfRVlFO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBvbkRldmljZU1vdmUoZXZlbnQ6IERldmljZU9yaWVudGF0aW9uRXZlbnQpIHtcclxuICAgIGlmICghc2NvcGUuZXhwbG9yZU1vZGUgfHwgc2NvcGUudnJNb2RlIHx8IHNjb3BlLmxvb2tBcm91bmRNb2RlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFscGhhID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKGV2ZW50LmFscGhhIHx8IDApO1xyXG4gICAgY29uc3QgYmV0YSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChldmVudC5iZXRhIHx8IDApO1xyXG4gICAgY29uc3QgZ2FtbWEgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoZXZlbnQuZ2FtbWEgfHwgMCk7XHJcblxyXG4gICAgaWYgKGFscGhhICE9PSAwICYmIGJldGEgIT09IDAgJiYgZ2FtbWEgIT09IDApIHtcclxuICAgICAgc2NvcGUudXNlR3lyb3Njb3BlID0gdHJ1ZTtcclxuICAgICAgY29uc3QgY2FtZXJhUXVhdGVybmlvbiA9IGNhbGN1bGF0ZUNhbWVyYVF1YXRlcm5pb24oYWxwaGEsIGJldGEsIGdhbW1hKTtcclxuXHJcbiAgICAgIGNhbWVyYS5xdWF0ZXJuaW9uLnNsZXJwKGNhbWVyYVF1YXRlcm5pb24sIDAuNSk7IC8vIHNtb290aCB1c2luZyBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb25cclxuICAgICAgc2NvcGUuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0aGlzLmluZXJ0aWFMb29wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHN0YXRlICE9PSBTVEFURS5OT05FKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNwZWVkOiBudW1iZXIgPSBNYXRoLm1heChcclxuICAgICAgTWF0aC5hYnModGhldGFWZWxvY2l0eSksXHJcbiAgICAgIE1hdGguYWJzKHBoaVZlbG9jaXR5KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBubyBtb3ZlbWVudCwgcmV0dXJuXHJcbiAgICBpZiAoc3BlZWQgPCBtaW5JbmVydGlhU3BlZWQpIHtcclxuICAgICAgdGhldGFWZWxvY2l0eSA9IDA7XHJcbiAgICAgIHBoaVZlbG9jaXR5ID0gMDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvblRhcmdldChcclxuICAgICAgdGhpcy5jYW1lcmEucG9zaXRpb24sXHJcbiAgICAgIHRoaXMudGFyZ2V0LFxyXG4gICAgICB7cm90YXRlOiAtdGhldGFWZWxvY2l0eX1cclxuICAgICk7XHJcbiAgICBwaGlEZWx0YSA9IC1waGlWZWxvY2l0eTtcclxuICAgIHRoZXRhVmVsb2NpdHkgKj0gaW5lcnRpYUZyaWN0aW9uO1xyXG4gICAgcGhpVmVsb2NpdHkgKj0gaW5lcnRpYUZyaWN0aW9uO1xyXG4gICAgc2NvcGUuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH0sIGZhbHNlKTtcclxuICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlKTtcclxuICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcclxuICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRvdWNoc3RhcnQsIGZhbHNlKTtcclxuICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZCwgZmFsc2UpO1xyXG4gIHRoaXMuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0b3VjaG1vdmUsIGZhbHNlKTtcclxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlb3JpZW50YXRpb24nLCBvbkRldmljZU1vdmUsIGZhbHNlKTtcclxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UpO1xyXG59O1xyXG5Db250cm9scy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUpO1xyXG5cclxuZXhwb3J0IHtDb250cm9sc307XHJcbiJdfQ==
|