@colijnit/configurator 260.1.2 → 261.1.1
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/bundles/colijnit-configurator.umd.js +18067 -1889
- package/bundles/colijnit-configurator.umd.js.map +1 -1
- package/colijnit-configurator.d.ts +2 -6
- package/esm2015/colijnit-configurator.js +2 -7
- package/esm2015/lib/builder.js +795 -0
- package/esm2015/lib/components/answer-card/answer-card.component.js +313 -0
- package/esm2015/lib/components/answer-card/answer-card.module.js +50 -0
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +182 -0
- package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +34 -0
- package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +490 -0
- package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +61 -0
- package/esm2015/lib/components/color-filter/color-filter.component.js +59 -0
- package/esm2015/lib/components/color-filter/color-filter.module.js +26 -0
- package/esm2015/lib/components/configurator/configurator.component.js +133 -0
- package/esm2015/lib/components/configurator/configurator.module.js +42 -0
- package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +222 -0
- package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +48 -0
- package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +82 -0
- package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +163 -0
- package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +49 -0
- package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +33 -0
- package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +60 -0
- package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +17 -0
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +46 -0
- package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +26 -0
- package/esm2015/lib/components/element-buttons/element-buttons.component.js +168 -0
- package/esm2015/lib/components/element-buttons/element-buttons.module.js +30 -0
- package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +186 -0
- package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +34 -0
- package/esm2015/lib/components/image-zoom/image-zoom.component.js +61 -0
- package/esm2015/lib/components/image-zoom/image-zoom.module.js +30 -0
- package/esm2015/lib/components/lite-selector/lite-selector.component.js +206 -0
- package/esm2015/lib/components/lite-selector/lite-selector.module.js +34 -0
- package/esm2015/lib/components/product-configurator/product-configurator.component.js +184 -0
- package/esm2015/lib/components/product-configurator/product-configurator.module.js +72 -0
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +237 -0
- package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +38 -0
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +284 -0
- package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +42 -0
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +72 -0
- package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +34 -0
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +82 -0
- package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +30 -0
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +80 -0
- package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +34 -0
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +93 -0
- package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +34 -0
- package/esm2015/lib/components/progress-bar/progress-bar.component.js +55 -0
- package/esm2015/lib/components/progress-bar/progress-bar.module.js +29 -0
- package/esm2015/lib/components/scene-options/scene-options.component.js +164 -0
- package/esm2015/lib/components/scene-options/scene-options.module.js +38 -0
- package/esm2015/lib/components/selections-summary/selections-summary.component.js +163 -0
- package/esm2015/lib/components/selections-summary/selections-summary.module.js +45 -0
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +171 -0
- package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +34 -0
- package/esm2015/lib/components/slideout/slideout.component.js +83 -0
- package/esm2015/lib/components/slideout/slideout.module.js +17 -0
- package/esm2015/lib/components/summary-line/summary-line.component.js +273 -0
- package/esm2015/lib/components/summary-line/summary-line.module.js +44 -0
- package/esm2015/lib/components/tag-filter/tag-filter.component.js +39 -0
- package/esm2015/lib/components/tag-filter/tag-filter.module.js +21 -0
- package/esm2015/lib/components/threedselector/threedselector.component.js +155 -0
- package/esm2015/lib/components/threedselector/threedselector.module.js +34 -0
- package/esm2015/lib/core/helper/variation-helper.js +553 -0
- package/esm2015/lib/core/shader/floor-fade.shader.js +33 -0
- package/esm2015/lib/core/textures/depth-data-texture.js +19 -0
- package/esm2015/lib/directives/directives.module.js +26 -0
- package/esm2015/lib/directives/visibility-observer-master.directive.js +53 -0
- package/esm2015/lib/directives/visibility-observer.directive.js +54 -0
- package/esm2015/lib/enum/ar-feature.enum.js +14 -0
- package/esm2015/lib/enum/configuration-key.enum.js +41 -0
- package/esm2015/lib/enum/configuration-template.enum.js +6 -0
- package/esm2015/lib/enum/device-size-type.js +7 -0
- package/esm2015/lib/enum/device-tier.enum.js +7 -0
- package/esm2015/lib/enum/icon.enum.js +113 -0
- package/esm2015/lib/enum/item-type.enum.js +23 -0
- package/esm2015/lib/enum/light.enum.js +9 -0
- package/esm2015/lib/enum/navigator-type.enum.js +6 -0
- package/esm2015/lib/enum/output-encoding.enum.js +9 -0
- package/esm2015/lib/enum/result-type.enum.js +21 -0
- package/esm2015/lib/enum/scene-event.enum.js +12 -0
- package/esm2015/lib/enum/shadow-map-type.enum.js +8 -0
- package/esm2015/lib/enum/texture-type.js +9 -0
- package/esm2015/lib/enum/tone-mapping-local.enum.js +12 -0
- package/esm2015/lib/enum/view-mode.enum.js +7 -0
- package/esm2015/lib/enum/xr-mode.enum.js +6 -0
- package/esm2015/lib/environments/environment.js +8 -0
- package/esm2015/lib/interfaces/aa-options.interface.js +2 -0
- package/esm2015/lib/interfaces/adjustable-element.interface.js +2 -0
- package/esm2015/lib/interfaces/ao-options.interface.js +2 -0
- package/esm2015/lib/interfaces/changes.interface.js +2 -0
- package/esm2015/lib/interfaces/configuration-data.interface.js +2 -0
- package/esm2015/lib/interfaces/light-preset.interface.js +2 -0
- package/esm2015/lib/interfaces/post-processing-setting.interface.js +2 -0
- package/esm2015/lib/interfaces/scene-option-button.interface.js +6 -0
- package/esm2015/lib/interfaces/screen-size-info.js +2 -0
- package/esm2015/lib/interfaces/setting.interface.js +2 -0
- package/esm2015/lib/interfaces/texture.interface.js +2 -0
- package/esm2015/lib/interfaces/vignette-options.interface.js +2 -0
- package/esm2015/lib/model/ar-position-indicator.js +18 -0
- package/esm2015/lib/model/camera-settings.js +14 -0
- package/esm2015/lib/model/configuration-result-object.js +6 -0
- package/esm2015/lib/model/configurator-error-message.js +9 -0
- package/esm2015/lib/model/configurator-settings.js +25 -0
- package/esm2015/lib/model/custom-button.js +16 -0
- package/esm2015/lib/model/factory.js +28 -0
- package/esm2015/lib/model/icon.js +112 -0
- package/esm2015/lib/model/intersected-objects.js +7 -0
- package/esm2015/lib/model/light-preset.js +73 -0
- package/esm2015/lib/model/light-properties.js +45 -0
- package/esm2015/lib/model/material.js +11 -0
- package/esm2015/lib/model/metadata.js +2 -0
- package/esm2015/lib/model/render-parameters.js +16 -0
- package/esm2015/lib/model/setting-options.js +71 -0
- package/esm2015/lib/model/settings.js +16 -0
- package/esm2015/lib/model/shadow-properties.js +10 -0
- package/esm2015/lib/model/skin.js +3 -0
- package/esm2015/lib/model/texture.js +76 -0
- package/esm2015/lib/model/variation-settings.js +54 -0
- package/esm2015/lib/model/variation.js +3 -0
- package/esm2015/lib/model/xr-reticle.js +79 -0
- package/esm2015/lib/modules/render/enum/scene-type.enum.js +6 -0
- package/esm2015/lib/modules/render/model/ar-parameters.js +12 -0
- package/esm2015/lib/modules/render/model/scene-setting.js +6 -0
- package/esm2015/lib/modules/render/model/scene-settings.js +3 -0
- package/esm2015/lib/pipes/append.pipe.js +21 -0
- package/esm2015/lib/pipes/google-translate.pipe.js +21 -0
- package/esm2015/lib/pipes/localize.pipe.js +28 -0
- package/esm2015/lib/pipes/pipes.module.js +41 -0
- package/esm2015/lib/pipes/prepend.pipe.js +21 -0
- package/esm2015/lib/pipes/strip-html.pipe.js +17 -0
- package/esm2015/lib/services/app-event.service.js +36 -0
- package/esm2015/lib/services/app-initializer.service.js +27 -0
- package/esm2015/lib/services/ar.service.js +844 -0
- package/esm2015/lib/services/build-furniture-base.service.js +1181 -0
- package/esm2015/lib/services/build-furniture-without-scene.service.js +86 -0
- package/esm2015/lib/services/build-furniture.service.js +169 -0
- package/esm2015/lib/services/bundle-initialzer.service.js +113 -0
- package/esm2015/lib/services/camera.service.js +123 -0
- package/esm2015/lib/services/configuration.service.js +79 -0
- package/esm2015/lib/services/configurator-connector.service.js +830 -0
- package/esm2015/lib/services/configurator.service.js +285 -0
- package/esm2015/lib/services/configuring.service.js +119 -0
- package/esm2015/lib/services/controls.js +799 -0
- package/esm2015/lib/services/debug.service.js +43 -0
- package/esm2015/lib/services/dictionary.service.js +65 -0
- package/esm2015/lib/services/dynamic-camera.service.js +96 -0
- package/esm2015/lib/services/floor-plane.service.js +252 -0
- package/esm2015/lib/services/font.service.js +27 -0
- package/esm2015/lib/services/google-translate.service.js +79 -0
- package/esm2015/lib/services/icon-cache.service.js +44 -0
- package/esm2015/lib/services/intersection.service.js +47 -0
- package/esm2015/lib/services/item.service.js +75 -0
- package/esm2015/lib/services/json-utils.service.js +48 -0
- package/esm2015/lib/services/light-creation.service.js +35 -0
- package/esm2015/lib/services/light-presets.service.js +157 -0
- package/esm2015/lib/services/lights.service.js +146 -0
- package/esm2015/lib/services/load-furniture-base.service.js +164 -0
- package/esm2015/lib/services/load-furniture-without-scene.service.js +45 -0
- package/esm2015/lib/services/load-furniture.service.js +72 -0
- package/esm2015/lib/services/loader.service.js +32 -0
- package/esm2015/lib/services/locator.service.js +11 -0
- package/esm2015/lib/services/message-board.service.js +50 -0
- package/esm2015/lib/services/post-processing.service.js +378 -0
- package/esm2015/lib/services/product-configurator.service.js +16 -0
- package/esm2015/lib/services/progress.service.js +20 -0
- package/esm2015/lib/services/scene-event.service.js +246 -0
- package/esm2015/lib/services/scene-options.service.js +24 -0
- package/esm2015/lib/services/scene.service.js +313 -0
- package/esm2015/lib/services/screen-size-analysis.service.js +97 -0
- package/esm2015/lib/services/settings.service.js +142 -0
- package/esm2015/lib/services/switch-build-furniture.service.js +37 -0
- package/esm2015/lib/services/switch-load-furniture.service.js +35 -0
- package/esm2015/lib/services/threedselector.service.js +72 -0
- package/esm2015/lib/services/utils.service.js +207 -0
- package/esm2015/lib/services/variation-cache.service.js +143 -0
- package/esm2015/lib/services/variation.service.js +490 -0
- package/esm2015/lib/services/view-mode.service.js +37 -0
- package/esm2015/lib/services/vr.service.js +191 -0
- package/esm2015/lib/services/xr.service.js +294 -0
- package/esm2015/lib/utils/asset.utils.js +120 -0
- package/esm2015/lib/utils/base-utils.js +9 -0
- package/esm2015/lib/utils/color.utils.js +30 -0
- package/esm2015/lib/utils/debug.utils.js +9 -0
- package/esm2015/lib/utils/device.utils.js +25 -0
- package/esm2015/lib/utils/file.utils.js +167 -0
- package/esm2015/lib/utils/image.utils.js +61 -0
- package/esm2015/lib/utils/json-parser.utils.js +180 -0
- package/esm2015/lib/utils/material.utils.js +433 -0
- package/esm2015/lib/utils/object.utils.js +360 -0
- package/esm2015/lib/utils/relative-position.utils.js +75 -0
- package/esm2015/lib/utils/rotation-helper.utils.js +15 -0
- package/esm2015/lib/utils/scene-3d.utils.js +213 -0
- package/esm2015/lib/utils/scene-utils.js +191 -0
- package/esm2015/lib/utils/text-utils.js +68 -0
- package/esm2015/lib/utils/threed.utils.js +281 -0
- package/esm2015/lib/utils/variation-utils.js +459 -0
- package/esm2015/public-api.js +65 -0
- package/fesm2015/colijnit-configurator.js +17538 -1477
- package/fesm2015/colijnit-configurator.js.map +1 -1
- package/{app → lib}/builder.d.ts +9 -1
- package/lib/components/answer-card/answer-card.component.d.ts +58 -0
- package/lib/components/answer-card/answer-card.module.d.ts +11 -0
- package/lib/components/answer-card/style/_layout.scss +88 -0
- package/lib/components/answer-card/style/_material-definition.scss +3 -0
- package/lib/components/answer-card/style/_theme.scss +67 -0
- package/lib/components/answer-card/style/material.scss +2 -0
- package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +38 -0
- package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +10 -0
- package/lib/components/answer-info-dialog/style/_layout.scss +88 -0
- package/lib/components/answer-info-dialog/style/_material-definition.scss +3 -0
- package/lib/components/answer-info-dialog/style/_theme.scss +44 -0
- package/lib/components/answer-info-dialog/style/material.scss +3 -0
- package/lib/components/answers-slideout/answers-slideout.component.d.ts +86 -0
- package/lib/components/answers-slideout/answers-slideout.module.d.ts +16 -0
- package/lib/components/answers-slideout/style/_layout.scss +198 -0
- package/lib/components/answers-slideout/style/_material-definition.scss +3 -0
- package/lib/components/answers-slideout/style/_theme.scss +54 -0
- package/lib/components/answers-slideout/style/material.scss +3 -0
- package/lib/components/color-filter/color-filter.component.d.ts +20 -0
- package/lib/components/color-filter/color-filter.module.d.ts +8 -0
- package/lib/components/color-filter/style/_layout.scss +41 -0
- package/lib/components/color-filter/style/_material-definition.scss +3 -0
- package/lib/components/color-filter/style/_theme.scss +7 -0
- package/lib/components/color-filter/style/material.scss +3 -0
- package/lib/components/configurator/configurator.component.d.ts +37 -0
- package/lib/components/configurator/configurator.module.d.ts +12 -0
- package/lib/components/configurator/style/_layout.scss +7 -0
- package/lib/components/configurator/style/_material-definition.scss +3 -0
- package/lib/components/configurator/style/_theme.scss +7 -0
- package/lib/components/configurator/style/material.scss +3 -0
- package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +30 -0
- package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +13 -0
- package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +16 -0
- package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +26 -0
- package/lib/components/configurator-dialog/style/_layout.scss +129 -0
- package/lib/components/configurator-dialog/style/_material-definition.scss +4 -0
- package/lib/components/configurator-dialog/style/_theme.scss +89 -0
- package/lib/components/configurator-dialog/style/material.scss +3 -0
- package/lib/components/configurator-loader/configurator-loader.component.d.ts +7 -0
- package/lib/components/configurator-loader/configurator-loader.module.d.ts +9 -0
- package/lib/components/configurator-loader/style/_layout.scss +72 -0
- package/lib/components/configurator-loader/style/_material-definition.scss +5 -0
- package/lib/components/configurator-loader/style/_theme.scss +26 -0
- package/lib/components/configurator-loader/style/material.scss +14 -0
- package/lib/components/configurator-scene/configurator-scene.component.d.ts +24 -0
- package/lib/components/configurator-scene/configurator-scene.module.d.ts +7 -0
- package/lib/components/configurator-scene/style/_layout.scss +22 -0
- package/lib/components/configurator-scene/style/_material-definition.scss +3 -0
- package/lib/components/configurator-scene/style/_theme.scss +7 -0
- package/lib/components/configurator-scene/style/material.scss +3 -0
- package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +7 -0
- package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +8 -0
- package/lib/components/configurator-scene-loader/style/_layout.scss +72 -0
- package/lib/components/configurator-scene-loader/style/_material-definition.scss +5 -0
- package/lib/components/configurator-scene-loader/style/_theme.scss +26 -0
- package/lib/components/configurator-scene-loader/style/material.scss +14 -0
- package/lib/components/element-buttons/element-buttons.component.d.ts +32 -0
- package/lib/components/element-buttons/element-buttons.module.d.ts +9 -0
- package/lib/components/element-buttons/style/_layout.scss +52 -0
- package/lib/components/element-buttons/style/_material-definition.scss +3 -0
- package/lib/components/element-buttons/style/_theme.scss +23 -0
- package/lib/components/element-buttons/style/material.scss +3 -0
- package/lib/components/element-toolbar/element-toolbar.component.d.ts +27 -0
- package/lib/components/element-toolbar/element-toolbar.component.scss +59 -0
- package/lib/components/element-toolbar/element-toolbar.module.d.ts +10 -0
- package/lib/components/element-toolbar/style/_layout.scss +107 -0
- package/lib/components/element-toolbar/style/_material-definition.scss +3 -0
- package/lib/components/element-toolbar/style/_theme.scss +47 -0
- package/lib/components/element-toolbar/style/material.scss +3 -0
- package/lib/components/image-zoom/image-zoom.component.d.ts +15 -0
- package/lib/components/image-zoom/image-zoom.module.d.ts +9 -0
- package/lib/components/image-zoom/style/_layout.scss +51 -0
- package/lib/components/image-zoom/style/_material-definition.scss +3 -0
- package/lib/components/image-zoom/style/_theme.scss +17 -0
- package/lib/components/image-zoom/style/material.scss +3 -0
- package/lib/components/lite-selector/lite-selector.component.d.ts +40 -0
- package/lib/components/lite-selector/lite-selector.module.d.ts +10 -0
- package/lib/components/lite-selector/style/_layout.scss +21 -0
- package/lib/components/lite-selector/style/_material-definition.scss +3 -0
- package/lib/components/lite-selector/style/_theme.scss +7 -0
- package/lib/components/lite-selector/style/material.scss +3 -0
- package/lib/components/product-configurator/product-configurator.component.d.ts +50 -0
- package/lib/components/product-configurator/product-configurator.module.d.ts +15 -0
- package/lib/components/product-configurator/style/_layout.scss +46 -0
- package/lib/components/product-configurator/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator/style/_theme.scss +22 -0
- package/lib/components/product-configurator/style/material.scss +3 -0
- package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +35 -0
- package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +11 -0
- package/lib/components/product-configurator-selector/style/_layout.scss +145 -0
- package/lib/components/product-configurator-selector/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector/style/_theme.scss +57 -0
- package/lib/components/product-configurator-selector/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +31 -0
- package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +13 -0
- package/lib/components/product-configurator-selector-option/style/_layout.scss +7 -0
- package/lib/components/product-configurator-selector-option/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option/style/_theme.scss +7 -0
- package/lib/components/product-configurator-selector-option/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +20 -0
- package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-button/style/_layout.scss +28 -0
- package/lib/components/product-configurator-selector-option-button/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-button/style/_theme.scss +33 -0
- package/lib/components/product-configurator-selector-option-button/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +20 -0
- package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_layout.scss +28 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/_theme.scss +27 -0
- package/lib/components/product-configurator-selector-option-checkbox/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +21 -0
- package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_layout.scss +34 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/_theme.scss +28 -0
- package/lib/components/product-configurator-selector-option-dropdown/style/material.scss +3 -0
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +21 -0
- package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +10 -0
- package/lib/components/product-configurator-selector-option-tile/style/_layout.scss +58 -0
- package/lib/components/product-configurator-selector-option-tile/style/_material-definition.scss +3 -0
- package/lib/components/product-configurator-selector-option-tile/style/_theme.scss +56 -0
- package/lib/components/product-configurator-selector-option-tile/style/material.scss +3 -0
- package/lib/components/progress-bar/progress-bar.component.d.ts +10 -0
- package/lib/components/progress-bar/progress-bar.component.scss +14 -0
- package/lib/components/progress-bar/progress-bar.module.d.ts +8 -0
- package/lib/components/progress-bar/style/_layout.scss +18 -0
- package/lib/components/progress-bar/style/_material-definition.scss +3 -0
- package/lib/components/progress-bar/style/_theme.scss +10 -0
- package/lib/components/progress-bar/style/material.scss +3 -0
- package/lib/components/scene-options/scene-options.component.d.ts +24 -0
- package/lib/components/scene-options/scene-options.module.d.ts +11 -0
- package/lib/components/scene-options/style/_layout.scss +52 -0
- package/lib/components/scene-options/style/_material-definition.scss +3 -0
- package/lib/components/scene-options/style/_theme.scss +7 -0
- package/lib/components/scene-options/style/material.scss +3 -0
- package/lib/components/selections-summary/selections-summary.component.d.ts +38 -0
- package/lib/components/selections-summary/selections-summary.module.d.ts +12 -0
- package/lib/components/selections-summary/style/_layout.scss +87 -0
- package/lib/components/selections-summary/style/_material-definition.scss +5 -0
- package/lib/components/selections-summary/style/_theme.scss +13 -0
- package/lib/components/selections-summary/style/material.scss +3 -0
- package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +27 -0
- package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +10 -0
- package/lib/components/selections-summary-line/style/_layout.scss +12 -0
- package/lib/components/selections-summary-line/style/_material-definition.scss +4 -0
- package/lib/components/selections-summary-line/style/_theme.scss +12 -0
- package/lib/components/selections-summary-line/style/material.scss +3 -0
- package/lib/components/slideout/slideout.component.d.ts +22 -0
- package/lib/components/slideout/slideout.module.d.ts +7 -0
- package/lib/components/slideout/style/_layout.scss +27 -0
- package/lib/components/slideout/style/_material-definition.scss +3 -0
- package/lib/components/slideout/style/_theme.scss +5 -0
- package/lib/components/slideout/style/material.scss +3 -0
- package/lib/components/summary-line/style/_layout.scss +137 -0
- package/lib/components/summary-line/style/_material-definition.scss +4 -0
- package/lib/components/summary-line/style/_theme.scss +56 -0
- package/lib/components/summary-line/style/material.scss +3 -0
- package/lib/components/summary-line/summary-line.component.d.ts +50 -0
- package/lib/components/summary-line/summary-line.module.d.ts +11 -0
- package/lib/components/tag-filter/style/_layout.scss +14 -0
- package/lib/components/tag-filter/style/_material-definition.scss +3 -0
- package/lib/components/tag-filter/style/_theme.scss +7 -0
- package/lib/components/tag-filter/style/material.scss +3 -0
- package/lib/components/tag-filter/tag-filter.component.d.ts +9 -0
- package/lib/components/tag-filter/tag-filter.module.d.ts +7 -0
- package/lib/components/threedselector/style/_layout.scss +32 -0
- package/lib/components/threedselector/style/_material-definition.scss +3 -0
- package/lib/components/threedselector/style/_theme.scss +7 -0
- package/lib/components/threedselector/style/material.scss +9 -0
- package/lib/components/threedselector/threedselector.component.d.ts +38 -0
- package/lib/components/threedselector/threedselector.module.d.ts +10 -0
- package/{helper → lib/core/helper}/variation-helper.d.ts +2 -2
- package/lib/core/shader/floor-fade.shader.d.ts +5 -0
- package/lib/core/textures/depth-data-texture.d.ts +5 -0
- package/lib/directives/directives.module.d.ts +8 -0
- package/{app → lib}/directives/visibility-observer-master.directive.d.ts +3 -0
- package/{app → lib}/directives/visibility-observer.directive.d.ts +3 -0
- package/lib/enum/ar-feature.enum.d.ts +12 -0
- package/lib/enum/configuration-key.enum.d.ts +39 -0
- package/lib/enum/configuration-template.enum.d.ts +4 -0
- package/lib/enum/device-size-type.d.ts +5 -0
- package/lib/enum/device-tier.enum.d.ts +5 -0
- package/lib/enum/icon.enum.d.ts +111 -0
- package/lib/enum/item-type.enum.d.ts +21 -0
- package/lib/enum/light.enum.d.ts +7 -0
- package/lib/enum/navigator-type.enum.d.ts +4 -0
- package/lib/enum/output-encoding.enum.d.ts +7 -0
- package/lib/enum/result-type.enum.d.ts +19 -0
- package/lib/enum/scene-event.enum.d.ts +10 -0
- package/lib/enum/shadow-map-type.enum.d.ts +6 -0
- package/lib/enum/texture-type.d.ts +7 -0
- package/lib/enum/tone-mapping-local.enum.d.ts +10 -0
- package/lib/enum/view-mode.enum.d.ts +5 -0
- package/lib/enum/xr-mode.enum.d.ts +4 -0
- package/lib/environments/environment.d.ts +4 -0
- package/lib/interfaces/aa-options.interface.d.ts +4 -0
- package/lib/interfaces/adjustable-element.interface.d.ts +5 -0
- package/lib/interfaces/ao-options.interface.d.ts +18 -0
- package/lib/interfaces/changes.interface.d.ts +9 -0
- package/lib/interfaces/configuration-data.interface.d.ts +40 -0
- package/lib/interfaces/light-preset.interface.d.ts +22 -0
- package/lib/interfaces/post-processing-setting.interface.d.ts +11 -0
- package/lib/interfaces/scene-option-button.interface.d.ts +19 -0
- package/lib/interfaces/screen-size-info.d.ts +10 -0
- package/lib/interfaces/setting.interface.d.ts +8 -0
- package/lib/interfaces/texture.interface.d.ts +44 -0
- package/lib/interfaces/vignette-options.interface.d.ts +4 -0
- package/lib/model/ar-position-indicator.d.ts +4 -0
- package/lib/model/camera-settings.d.ts +12 -0
- package/lib/model/configuration-result-object.d.ts +30 -0
- package/lib/model/configurator-error-message.d.ts +8 -0
- package/lib/model/configurator-settings.d.ts +62 -0
- package/lib/model/custom-button.d.ts +10 -0
- package/lib/model/factory.d.ts +5 -0
- package/lib/model/icon.d.ts +4 -0
- package/lib/model/intersected-objects.d.ts +6 -0
- package/lib/model/light-preset.d.ts +33 -0
- package/lib/model/light-properties.d.ts +25 -0
- package/lib/model/material.d.ts +41 -0
- package/lib/model/metadata.d.ts +78 -0
- package/lib/model/render-parameters.d.ts +12 -0
- package/lib/model/setting-options.d.ts +67 -0
- package/lib/model/settings.d.ts +10 -0
- package/lib/model/shadow-properties.d.ts +7 -0
- package/lib/model/skin.d.ts +15 -0
- package/lib/model/texture.d.ts +52 -0
- package/{model → lib/model}/variation-settings.d.ts +9 -8
- package/{model → lib/model}/variation.d.ts +2 -1
- package/lib/model/xr-reticle.d.ts +17 -0
- package/lib/modules/render/enum/scene-type.enum.d.ts +4 -0
- package/lib/modules/render/model/ar-parameters.d.ts +9 -0
- package/lib/modules/render/model/scene-setting.d.ts +13 -0
- package/lib/modules/render/model/scene-settings.d.ts +4 -0
- package/lib/pipes/append.pipe.d.ts +7 -0
- package/lib/pipes/google-translate.pipe.d.ts +11 -0
- package/lib/pipes/localize.pipe.d.ts +10 -0
- package/lib/pipes/pipes.module.d.ts +11 -0
- package/lib/pipes/prepend.pipe.d.ts +7 -0
- package/lib/pipes/strip-html.pipe.d.ts +7 -0
- package/lib/services/app-event.service.d.ts +32 -0
- package/lib/services/app-initializer.service.d.ts +14 -0
- package/lib/services/ar.service.d.ts +120 -0
- package/lib/services/build-furniture-base.service.d.ts +117 -0
- package/lib/services/build-furniture-without-scene.service.d.ts +14 -0
- package/lib/services/build-furniture.service.d.ts +14 -0
- package/lib/services/bundle-initialzer.service.d.ts +45 -0
- package/lib/services/camera.service.d.ts +44 -0
- package/lib/services/configuration.service.d.ts +18 -0
- package/lib/services/configurator-connector.service.d.ts +140 -0
- package/lib/services/configurator.service.d.ts +62 -0
- package/lib/services/configuring.service.d.ts +46 -0
- package/lib/services/controls.d.ts +11 -0
- package/lib/services/debug.service.d.ts +16 -0
- package/lib/services/dictionary.service.d.ts +15 -0
- package/lib/services/dynamic-camera.service.d.ts +21 -0
- package/lib/services/floor-plane.service.d.ts +47 -0
- package/lib/services/font.service.d.ts +10 -0
- package/lib/services/google-translate.service.d.ts +26 -0
- package/lib/services/icon-cache.service.d.ts +21 -0
- package/lib/services/intersection.service.d.ts +11 -0
- package/lib/services/item.service.d.ts +18 -0
- package/lib/services/json-utils.service.d.ts +7 -0
- package/lib/services/light-creation.service.d.ts +9 -0
- package/lib/services/light-presets.service.d.ts +34 -0
- package/lib/services/lights.service.d.ts +34 -0
- package/lib/services/load-furniture-base.service.d.ts +37 -0
- package/lib/services/load-furniture-without-scene.service.d.ts +9 -0
- package/lib/services/load-furniture.service.d.ts +9 -0
- package/lib/services/loader.service.d.ts +11 -0
- package/lib/services/locator.service.d.ts +7 -0
- package/lib/services/message-board.service.d.ts +18 -0
- package/lib/services/post-processing.service.d.ts +74 -0
- package/lib/services/product-configurator.service.d.ts +11 -0
- package/lib/services/progress.service.d.ts +9 -0
- package/lib/services/scene-event.service.d.ts +72 -0
- package/lib/services/scene-options.service.d.ts +11 -0
- package/lib/services/scene.service.d.ts +71 -0
- package/lib/services/screen-size-analysis.service.d.ts +32 -0
- package/lib/services/settings.service.d.ts +24 -0
- package/lib/services/switch-build-furniture.service.d.ts +21 -0
- package/lib/services/switch-load-furniture.service.d.ts +21 -0
- package/lib/services/threedselector.service.d.ts +17 -0
- package/lib/services/utils.service.d.ts +24 -0
- package/lib/services/variation-cache.service.d.ts +23 -0
- package/lib/services/variation.service.d.ts +26 -0
- package/lib/services/view-mode.service.d.ts +17 -0
- package/lib/services/vr.service.d.ts +42 -0
- package/lib/services/xr.service.d.ts +56 -0
- package/lib/style/_mixin.scss +9 -0
- package/lib/style/configurator-globals.scss +21 -0
- package/lib/style/template_variables.scss +37 -0
- package/lib/utils/color.utils.d.ts +8 -0
- package/lib/utils/debug.utils.d.ts +3 -0
- package/lib/utils/device.utils.d.ts +7 -0
- package/{utils → lib/utils}/file.utils.d.ts +3 -0
- package/{utils → lib/utils}/image.utils.d.ts +2 -3
- package/lib/utils/json-parser.utils.d.ts +9 -0
- package/lib/utils/material.utils.d.ts +34 -0
- package/lib/utils/object.utils.d.ts +32 -0
- package/lib/utils/relative-position.utils.d.ts +12 -0
- package/lib/utils/rotation-helper.utils.d.ts +6 -0
- package/lib/utils/scene-3d.utils.d.ts +8 -0
- package/lib/utils/text-utils.d.ts +4 -0
- package/{utils → lib/utils}/threed.utils.d.ts +7 -3
- package/{utils → lib/utils}/variation-utils.d.ts +4 -2
- package/package.json +17 -30
- package/public-api.d.ts +60 -0
- package/README.md +0 -28
- package/app/components/answers/answer/answer.component.d.ts +0 -11
- package/app/components/answers/answers.component.d.ts +0 -8
- package/app/components/answers/answers.module.d.ts +0 -2
- package/app/components/selections/selections.component.d.ts +0 -21
- package/app/components/selections/selections.module.d.ts +0 -2
- package/app/components/shared/loader/loader.component.d.ts +0 -2
- package/app/components/shared/shared.module.d.ts +0 -2
- package/app/services/configurator.service.d.ts +0 -19
- package/app/services/image-cache.service.d.ts +0 -10
- package/app/utils/object.utils.d.ts +0 -7
- package/colijnit-configurator.metadata.json +0 -1
- package/esm2015/app/builder.js +0 -706
- package/esm2015/app/components/answers/answer/answer.component.js +0 -66
- package/esm2015/app/components/answers/answers.component.js +0 -38
- package/esm2015/app/components/answers/answers.module.js +0 -27
- package/esm2015/app/components/selections/selections.component.js +0 -129
- package/esm2015/app/components/selections/selections.module.js +0 -21
- package/esm2015/app/components/shared/loader/loader.component.js +0 -22
- package/esm2015/app/components/shared/shared.module.js +0 -19
- package/esm2015/app/directives/visibility-observer-master.directive.js +0 -50
- package/esm2015/app/directives/visibility-observer.directive.js +0 -55
- package/esm2015/app/services/configurator.service.js +0 -79
- package/esm2015/app/services/image-cache.service.js +0 -63
- package/esm2015/app/utils/object.utils.js +0 -51
- package/esm2015/helper/variation-helper.js +0 -553
- package/esm2015/model/material.js +0 -11
- package/esm2015/model/variation-settings.js +0 -54
- package/esm2015/model/variation.js +0 -3
- package/esm2015/public_api.js +0 -7
- package/esm2015/utils/asset.utils.js +0 -124
- package/esm2015/utils/base-utils.js +0 -9
- package/esm2015/utils/file.utils.js +0 -142
- package/esm2015/utils/image.utils.js +0 -66
- package/esm2015/utils/object.utils.js +0 -49
- package/esm2015/utils/scene-utils.js +0 -187
- package/esm2015/utils/threed.utils.js +0 -226
- package/esm2015/utils/variation-utils.js +0 -388
- package/model/material.d.ts +0 -40
- package/public_api.d.ts +0 -6
- package/utils/object.utils.d.ts +0 -7
- /package/{utils → lib/utils}/asset.utils.d.ts +0 -0
- /package/{utils → lib/utils}/base-utils.d.ts +0 -0
- /package/{utils → lib/utils}/scene-utils.d.ts +0 -0
|
@@ -0,0 +1,1181 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
|
|
3
|
+
import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
|
|
4
|
+
import { DecoNodeKind } from '@colijnit/configuratorapi/build/enum/deco-node-kind.enum';
|
|
5
|
+
import { Injectable } from '@angular/core';
|
|
6
|
+
import { Euler, Object3D, Vector3 } from 'three';
|
|
7
|
+
import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
|
|
8
|
+
import { HdecoPositioning } from '@colijnit/configuratorapi/build/enum/hdeco-positioning.enum';
|
|
9
|
+
import { Subject } from 'rxjs';
|
|
10
|
+
import { ObjectUtils } from '../utils/object.utils';
|
|
11
|
+
import { MaterialUtils } from '../utils/material.utils';
|
|
12
|
+
import { ResultType } from '../enum/result-type.enum';
|
|
13
|
+
import { ConfiguratorErrorMessage } from '../model/configurator-error-message';
|
|
14
|
+
import { Scene3DUtil } from '../utils/scene-3d.utils';
|
|
15
|
+
import { DebugUtils } from '../utils/debug.utils';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "./configurator-connector.service";
|
|
18
|
+
import * as i2 from "./dictionary.service";
|
|
19
|
+
import * as i3 from "./app-event.service";
|
|
20
|
+
import * as i4 from "./settings.service";
|
|
21
|
+
import * as i5 from "./variation.service";
|
|
22
|
+
import * as i6 from "./variation-cache.service";
|
|
23
|
+
import * as i7 from "./utils.service";
|
|
24
|
+
import * as i8 from "./item.service";
|
|
25
|
+
export class BuildFurnitureBaseService {
|
|
26
|
+
constructor(configuratorConnectorService, dictionaryService, appEventService, settingsService, variationService, variationCacheService, utilsService, itemService) {
|
|
27
|
+
this.configuratorConnectorService = configuratorConnectorService;
|
|
28
|
+
this.dictionaryService = dictionaryService;
|
|
29
|
+
this.appEventService = appEventService;
|
|
30
|
+
this.settingsService = settingsService;
|
|
31
|
+
this.variationService = variationService;
|
|
32
|
+
this.variationCacheService = variationCacheService;
|
|
33
|
+
this.utilsService = utilsService;
|
|
34
|
+
this.itemService = itemService;
|
|
35
|
+
this.defaultPosition = new Vector3(4, 0, 1);
|
|
36
|
+
this.defaultRotation = new Euler(0, Math.PI, 0);
|
|
37
|
+
this.isMouseOverObject = false;
|
|
38
|
+
this.answerSelected = new Subject();
|
|
39
|
+
this.arPlacementUpdate = new Subject();
|
|
40
|
+
this.showElementToolbar = false;
|
|
41
|
+
this._useNodeIdToLink = true;
|
|
42
|
+
this._placedAddables = [];
|
|
43
|
+
this._adjustables = [];
|
|
44
|
+
this._addables = [];
|
|
45
|
+
this._genericSelection = false;
|
|
46
|
+
this._answerSelected = [];
|
|
47
|
+
this._selectionsSelected = [];
|
|
48
|
+
this.subs = [];
|
|
49
|
+
this.placedAdjustables = [];
|
|
50
|
+
}
|
|
51
|
+
get useNodeIdToLink() {
|
|
52
|
+
return this._useNodeIdToLink;
|
|
53
|
+
}
|
|
54
|
+
get currentCustomFloorGroup() {
|
|
55
|
+
return this._currentCustomFloorGroup;
|
|
56
|
+
}
|
|
57
|
+
set currentCustomFloorGroup(item) {
|
|
58
|
+
this._currentCustomFloorGroup = item;
|
|
59
|
+
}
|
|
60
|
+
get selections() {
|
|
61
|
+
return this.configuratorConnectorService.selections;
|
|
62
|
+
}
|
|
63
|
+
set scene(scene) {
|
|
64
|
+
this._scene = scene;
|
|
65
|
+
}
|
|
66
|
+
get scene() {
|
|
67
|
+
return this._scene;
|
|
68
|
+
}
|
|
69
|
+
ngOnDestroy() {
|
|
70
|
+
this.subs.forEach(s => s.unsubscribe());
|
|
71
|
+
this.cleanup();
|
|
72
|
+
}
|
|
73
|
+
emptyAnswerSelected() {
|
|
74
|
+
this._answerSelected.length = 0;
|
|
75
|
+
}
|
|
76
|
+
emptySelectionsSelected() {
|
|
77
|
+
this._selectionsSelected.length = 0;
|
|
78
|
+
}
|
|
79
|
+
getOptionsFromSelection(baseSelection) {
|
|
80
|
+
const selections = [];
|
|
81
|
+
let nodeLevel = -1;
|
|
82
|
+
const len = this.selections.length;
|
|
83
|
+
for (let i = 0; i < len; i++) {
|
|
84
|
+
const selection = this.selections[i];
|
|
85
|
+
const level = selection.presentationLevel;
|
|
86
|
+
if (nodeLevel !== -1) {
|
|
87
|
+
if (nodeLevel < level && this.canConnectSelections(baseSelection, selection) && this.selectionPublished(selection)) {
|
|
88
|
+
selections.push(selection);
|
|
89
|
+
}
|
|
90
|
+
if (nodeLevel >= level) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (selection.id === baseSelection.id && selection.node === baseSelection.node) {
|
|
95
|
+
nodeLevel = level;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return selections;
|
|
99
|
+
}
|
|
100
|
+
cancelConfiguringCurrentInstance() {
|
|
101
|
+
if (this._currentCustomFloorGroup) {
|
|
102
|
+
// TODO check what we should do with this this._currentCustomFloorGroup.configuring = false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
cancelAnswer(data, rebuild = true, getAnswers = false) {
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
yield this.configuratorConnectorService.cancelAnswer();
|
|
108
|
+
if (rebuild) {
|
|
109
|
+
this.startToBuildFromConfigurator(data);
|
|
110
|
+
}
|
|
111
|
+
else if (getAnswers) { // if not rebuild then check if we need to get answers
|
|
112
|
+
yield this.configuratorConnectorService.getQuestionAndAnswersAsync(); // see if there is user input needed
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
selectSelection(selection, data, forceBackToNode, after, connector) {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
yield this.configuratorConnectorService.selectSelection(selection, forceBackToNode, after, connector);
|
|
119
|
+
this._genericSelection = selection.generic;
|
|
120
|
+
yield this.startToBuildFromConfigurator(data);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
deleteSelection(selection, data) {
|
|
124
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
+
yield this.configuratorConnectorService.deleteSelection(selection);
|
|
126
|
+
yield this.startToBuildFromConfigurator(data);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
replaceSelection(selection, data) {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
yield this.configuratorConnectorService.replaceSelection(selection);
|
|
132
|
+
yield this.startToBuildFromConfigurator(data);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
selectAnswer(answer, input, data) {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
this.preloadMaterial(answer);
|
|
138
|
+
yield this.configuratorConnectorService.selectAnswer(answer, input);
|
|
139
|
+
this.handleAnswerSelected(answer);
|
|
140
|
+
const result = yield this.startToBuildFromConfigurator(data);
|
|
141
|
+
this.answerSelected.next(result);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
selectSelectionAsAnswer(chosenOption, data) {
|
|
145
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
146
|
+
this.preloadMaterialBySelection(chosenOption);
|
|
147
|
+
this.handleSelectionSelected(chosenOption);
|
|
148
|
+
const result = yield this.startToBuildFromConfigurator(data);
|
|
149
|
+
this.answerSelected.next(result);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
linkSelectionsAndDecos() {
|
|
153
|
+
const len = this.selections.length;
|
|
154
|
+
for (let i = 0; i < len; i++) {
|
|
155
|
+
// const id: string = this.selections[i].artNodeIdDeco;
|
|
156
|
+
let deco = this.configuratorConnectorService.decoNodes.find(d => d.nodeId === this.selections[i].node);
|
|
157
|
+
if (!deco) {
|
|
158
|
+
deco = new DecoNode();
|
|
159
|
+
}
|
|
160
|
+
if (deco.type !== DecoNodeType.Variation) {
|
|
161
|
+
const variation = this.getVariations().find(v => v.parentId === this.selections[i].artNodeIdDeco);
|
|
162
|
+
if (variation) {
|
|
163
|
+
deco.variation = variation;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
this.selections[i].decoNode = deco;
|
|
167
|
+
}
|
|
168
|
+
this.appEventService.selectionsAndDecosLinked.next();
|
|
169
|
+
}
|
|
170
|
+
prepareTheSelections(instanceId) {
|
|
171
|
+
const selections = this.selections.slice();
|
|
172
|
+
const selectionOfArticle = selections.find(s => s.nodeType === NodeType.Article);
|
|
173
|
+
const adjustableSelections = selections.filter(s => s.addAdjust === '2');
|
|
174
|
+
const isArticleWithMaterial = adjustableSelections.length === 0 &&
|
|
175
|
+
selectionOfArticle.gameObject &&
|
|
176
|
+
selectionOfArticle.gameObject.length > 0;
|
|
177
|
+
// get generic variations
|
|
178
|
+
const globalVariations = selections
|
|
179
|
+
.filter(s => (s.generic || adjustableSelections.length === 1) && s.decoNode.variation && (!s.elementType || s.elementType === 'variation'))
|
|
180
|
+
.map((value, index, array) => {
|
|
181
|
+
// find selection of variation
|
|
182
|
+
const sel = selections.find(s => s.artNodeIdDeco === value.decoNode.variation.parentId);
|
|
183
|
+
if (sel) {
|
|
184
|
+
value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
|
|
185
|
+
}
|
|
186
|
+
value.decoNode.variation.materialId = this.getMaterialIdFromParent(value.node);
|
|
187
|
+
return value.decoNode.variation;
|
|
188
|
+
});
|
|
189
|
+
let globalVariationsRewrite = true;
|
|
190
|
+
const len = selections.length;
|
|
191
|
+
let lastAdded;
|
|
192
|
+
let lastAdjustable;
|
|
193
|
+
let newPart = false;
|
|
194
|
+
let previousPresLevel = -1;
|
|
195
|
+
let positioning;
|
|
196
|
+
let optionText;
|
|
197
|
+
for (let i = 0; i < len; i++) {
|
|
198
|
+
const selection = selections[i];
|
|
199
|
+
if (selection.presentationLevel === 1) {
|
|
200
|
+
positioning = selection.hdecoPositioning;
|
|
201
|
+
optionText = selection.question;
|
|
202
|
+
}
|
|
203
|
+
if (selection.presentationLevel > previousPresLevel) {
|
|
204
|
+
selection.hdecoPositioning = selection.hdecoPositioning || positioning;
|
|
205
|
+
}
|
|
206
|
+
if (selection.decoNode) {
|
|
207
|
+
if (selection.decoNode.type === DecoNodeType.Variation) {
|
|
208
|
+
const decoNode = selection.decoNode;
|
|
209
|
+
decoNode.optionText = optionText;
|
|
210
|
+
// find selection of variation and set materialId in case of multimaterial
|
|
211
|
+
if (!decoNode.materialId) {
|
|
212
|
+
decoNode.materialId = this.getMaterialIdFromParent(decoNode.nodeId);
|
|
213
|
+
}
|
|
214
|
+
if (lastAdded) {
|
|
215
|
+
if (newPart) {
|
|
216
|
+
if (decoNode.materialId) {
|
|
217
|
+
lastAdded.variations.push(decoNode);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
lastAdded.variations = [decoNode];
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
lastAdded.variations.push(decoNode);
|
|
225
|
+
}
|
|
226
|
+
newPart = false;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
globalVariations.push(decoNode);
|
|
230
|
+
}
|
|
231
|
+
// else {
|
|
232
|
+
// if (globalVariationsRewrite) {
|
|
233
|
+
// globalVariations.length = 0;
|
|
234
|
+
// globalVariationsRewrite = false;
|
|
235
|
+
// }
|
|
236
|
+
// globalVariations.push(decoNode);
|
|
237
|
+
// }
|
|
238
|
+
// const variation: FurniturePartVariation = new FurniturePartVariation();
|
|
239
|
+
// variation.BrandId = selection.decoNode.brandId;
|
|
240
|
+
// variation.Description = selection.decoNode.gameObjectName;
|
|
241
|
+
// variation.MaterialId = (selection.decoNode as any).materialId;
|
|
242
|
+
// variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
|
|
243
|
+
// usedVariations.push(variation);
|
|
244
|
+
}
|
|
245
|
+
else if ((selection.decoNode.type === DecoNodeType.Part &&
|
|
246
|
+
typeof selection.decoNode.gameObjectName === 'string' &&
|
|
247
|
+
selection.decoNode.gameObjectName.length) || (isArticleWithMaterial)) {
|
|
248
|
+
if (selection.decoNode.kind === DecoNodeKind.Adjustable || (isArticleWithMaterial)) {
|
|
249
|
+
selection.variations = globalVariations.slice();
|
|
250
|
+
this._adjustables.push(selection);
|
|
251
|
+
if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
|
|
252
|
+
newPart = true;
|
|
253
|
+
}
|
|
254
|
+
lastAdded = selection;
|
|
255
|
+
lastAdjustable = selection;
|
|
256
|
+
}
|
|
257
|
+
else if (selection.decoNode.kind === DecoNodeKind.Addable) {
|
|
258
|
+
selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations.slice();
|
|
259
|
+
if (lastAdjustable) {
|
|
260
|
+
lastAdjustable.addables.push(selection);
|
|
261
|
+
}
|
|
262
|
+
this._addables.push(selection);
|
|
263
|
+
if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
|
|
264
|
+
newPart = true;
|
|
265
|
+
}
|
|
266
|
+
lastAdded = selection;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
previousPresLevel = selection.presentationLevel;
|
|
271
|
+
}
|
|
272
|
+
// this._upsertFurniture(this.activeInstance,
|
|
273
|
+
// {Variations: usedVariations});
|
|
274
|
+
}
|
|
275
|
+
preloadMaterials(schema) {
|
|
276
|
+
this.variationCacheService.preloadVariations(schema, this.configuratorConnectorService.decoNodes
|
|
277
|
+
.filter(d => (d.gameObjectName || d.materialUrl) && d.type === DecoNodeType.Variation)
|
|
278
|
+
.map(d => d), this.articleAssetPath);
|
|
279
|
+
}
|
|
280
|
+
prepareInstanceForBuild(shouldCopyInstance, loadFromProject, looseOriginalConfiguration, result) {
|
|
281
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
282
|
+
if (shouldCopyInstance && !loadFromProject) {
|
|
283
|
+
const originalInstanceId = result.instanceId;
|
|
284
|
+
result.originalItemId = originalInstanceId;
|
|
285
|
+
if (looseOriginalConfiguration) {
|
|
286
|
+
result.instanceId = yield this.configuratorConnectorService.copyInstanceAndLoseOriginalConfiguration(originalInstanceId, result)
|
|
287
|
+
.catch((e) => {
|
|
288
|
+
return originalInstanceId;
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
result.instanceId = yield this.configuratorConnectorService.copyInstanceAndSaveOriginalConfiguration(originalInstanceId, result)
|
|
293
|
+
.catch((e) => {
|
|
294
|
+
return originalInstanceId;
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (result.resultType !== ResultType.ArticleNotFound && !loadFromProject) {
|
|
299
|
+
yield this.setInstanceToConfigure(result).catch((e) => {
|
|
300
|
+
Promise.reject(e);
|
|
301
|
+
return e;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
return result;
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
getSelectionsAndDecos() {
|
|
308
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
309
|
+
try {
|
|
310
|
+
const selectionsAndDecoPromise = [];
|
|
311
|
+
selectionsAndDecoPromise.push(this.configuratorConnectorService.getSelectionsAsync(), this.configuratorConnectorService.getDecosAsync());
|
|
312
|
+
yield Promise.all(selectionsAndDecoPromise);
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
DebugUtils.log(`Error getting selections and decos: ${e}`);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
handlePrepareSelectionsDecos(result) {
|
|
320
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
321
|
+
if (this.configuratorConnectorService.selections.length < 2) { // no selections, only selection of type 'ART'
|
|
322
|
+
try {
|
|
323
|
+
if (result.resultType !== ResultType.ArticleNotFound && !result.originalItemId) { // article found, so init that first
|
|
324
|
+
result.originalItemId = result.instanceId;
|
|
325
|
+
result.instanceId = null;
|
|
326
|
+
yield this.setInstanceToConfigure(result);
|
|
327
|
+
result.resultType = ResultType.NoSelections;
|
|
328
|
+
return this.startToBuild(result); // 'restart' the build
|
|
329
|
+
}
|
|
330
|
+
this.getSelectionsAndDecosFromMetadata(result);
|
|
331
|
+
}
|
|
332
|
+
catch (e) {
|
|
333
|
+
DebugUtils.log(`Error preparing selections and decos: ${e}`);
|
|
334
|
+
return Promise.reject(e);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
this.configuratorConnectorService.selections.forEach(s => {
|
|
338
|
+
s.schema = result.schema;
|
|
339
|
+
s.instanceId = result.instanceId;
|
|
340
|
+
}); // add schema for material creation
|
|
341
|
+
// TODO add this function, it's used for GTM this.handleSelectionsReceived(result.metaData);
|
|
342
|
+
this.linkSelectionsAndDecos();
|
|
343
|
+
this.prepareTheSelections(result.instanceId);
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
// TODO check if we need this function for Habufa
|
|
347
|
+
// protected handleIntegrationConnections(id: string, object: Item): void {
|
|
348
|
+
// const parts: FurniturePartIntegration[] = [];
|
|
349
|
+
// const childParts: Object3D[] = object.configurable ? object.children : [object];
|
|
350
|
+
// const len: number = childParts.length;
|
|
351
|
+
// for (let i = 0; i < len; i++) {
|
|
352
|
+
// const child: any = <CustomObject3D>childParts[i];
|
|
353
|
+
// const connection: FurniturePartIntegration = new FurniturePartIntegration();
|
|
354
|
+
// const variations: FurniturePartVariation[] = [];
|
|
355
|
+
// if (child.userData && child.userData.selection && child.userData.selection.decoNode) {
|
|
356
|
+
// connection.Id = childParts.findIndex(c => c === child).toString();
|
|
357
|
+
// connection.SupplierArticleNr = child.userData.selection.supplierArticleNr;
|
|
358
|
+
// connection.BrandIdentifier = child.userData.selection.decoNode.brandId;
|
|
359
|
+
// connection.BrandDescription = child.userData.selection.decoNode.gameObjectName;
|
|
360
|
+
// connection.Position = child.position;
|
|
361
|
+
// connection.Rotation = child.rotation;
|
|
362
|
+
// if (child.userData.selection.variations) {
|
|
363
|
+
// if (child.userData.selection.variations.length === 1) {
|
|
364
|
+
// const variation: any = child.userData.selection.variations[0];
|
|
365
|
+
// connection.Variation = variation.brandId;
|
|
366
|
+
// connection.VariationDescription = variation.gameObjectName;
|
|
367
|
+
// } else {
|
|
368
|
+
// for (let j = 0; j < child.userData.selection.variations.length; j++) {
|
|
369
|
+
// const variation: any = child.userData.selection.variations[j];
|
|
370
|
+
// const variationPart: FurniturePartVariation = new FurniturePartVariation();
|
|
371
|
+
// variationPart.Variation = variation.brandId;
|
|
372
|
+
// variationPart.VariationDescription = variation.gameObjectName;
|
|
373
|
+
// variationPart.MaterialId = variation.materialId;
|
|
374
|
+
// variationPart.SupplierArticleNr = variation.supplierArticleNr;
|
|
375
|
+
// variationPart.Option = variation.optionText;
|
|
376
|
+
// variations.push(variationPart);
|
|
377
|
+
// }
|
|
378
|
+
// connection.Variations = variations;
|
|
379
|
+
// }
|
|
380
|
+
// }
|
|
381
|
+
// } else { // a-artikel
|
|
382
|
+
// connection.Id = childParts.findIndex(c => c === child).toString();
|
|
383
|
+
// connection.BrandIdentifier = child.metadata.itemIdentifier;
|
|
384
|
+
// connection.BrandDescription = child.metadata.itemName;
|
|
385
|
+
// connection.Position = child.position;
|
|
386
|
+
// connection.Rotation = child.rotation;
|
|
387
|
+
// }
|
|
388
|
+
// const connectors: FurnitureConnectedPartIntegration[] = [];
|
|
389
|
+
// const clen: number = child.children.length;
|
|
390
|
+
// for (let j = 0; j < clen; j++) {
|
|
391
|
+
// const connector: any = child.children[j];
|
|
392
|
+
// if ((connector instanceof CustomObject3D || connector instanceof CustomMesh) && (connector as any).connectedTo) {
|
|
393
|
+
// const conn: FurnitureConnectedPartIntegration = new FurnitureConnectedPartIntegration();
|
|
394
|
+
// conn.ConnectionLabel = connector.name;
|
|
395
|
+
// const foreignPartIdx: number =
|
|
396
|
+
// this._currentCustomFloorGroup.children.findIndex(c => c.name === (connector as any).connectedTo);
|
|
397
|
+
// conn.ForeignConnectionLabel = this._currentCustomFloorGroup.children[foreignPartIdx].userData.selection.decoNode.gameObjectName;
|
|
398
|
+
// conn.ForeignPartId = foreignPartIdx.toString();
|
|
399
|
+
// conn.Position = connector.position;
|
|
400
|
+
// conn.Rotation = connector.rotation;
|
|
401
|
+
// connectors.push(conn);
|
|
402
|
+
// }
|
|
403
|
+
// }
|
|
404
|
+
// connection.ConnectedParts = connectors;
|
|
405
|
+
// parts.push(connection);
|
|
406
|
+
// }
|
|
407
|
+
// this.upsertFurniture(id, {Parts: parts}, object);
|
|
408
|
+
// }
|
|
409
|
+
//
|
|
410
|
+
// protected upsertFurniture(id: string, object: any, item: Item): void {
|
|
411
|
+
// if (this._integrationEnabled && !item.metadata.obsolete) {
|
|
412
|
+
// const idx: number = this._furnitureConfigurations.findIndex(f => f.Id === id);
|
|
413
|
+
// let furniture: FurnitureIntegration;
|
|
414
|
+
// if (idx < 0) {
|
|
415
|
+
// // empty entry for mrp code, re-use that one
|
|
416
|
+
// if (this._furnitureConfigurations.length === 1 && !this._furnitureConfigurations[0].Id) {
|
|
417
|
+
// furniture = this._furnitureConfigurations[0];
|
|
418
|
+
// } else {
|
|
419
|
+
// furniture = new FurnitureIntegration();
|
|
420
|
+
// this._furnitureConfigurations.push(furniture);
|
|
421
|
+
// }
|
|
422
|
+
// furniture.Id = id;
|
|
423
|
+
// } else {
|
|
424
|
+
// furniture = this._furnitureConfigurations[idx];
|
|
425
|
+
// }
|
|
426
|
+
// furniture.MrpCode = this.permanentStoreService.code;
|
|
427
|
+
// for (const key in object) {
|
|
428
|
+
// if (furniture.hasOwnProperty(key) && object.hasOwnProperty(key)) {
|
|
429
|
+
// furniture[key] = object[key];
|
|
430
|
+
// }
|
|
431
|
+
// }
|
|
432
|
+
// }
|
|
433
|
+
// }
|
|
434
|
+
// protected generateLayingPattern(floor: FloorPlaneItem, floorPattern: FloorPattern): void {
|
|
435
|
+
// const floorPatternInfo: FloorPatternInfo = this.generateFloorPatternInfo(floor, floorPattern);
|
|
436
|
+
// floor.restoreFloorObject();
|
|
437
|
+
// const meshLeft =
|
|
438
|
+
// this.full3DObjectToUse.children.find(m => m.name === floorPatternInfo.meshIdLeft) as Mesh;
|
|
439
|
+
// this.normalizeMesh(meshLeft);
|
|
440
|
+
//
|
|
441
|
+
// let meshRight: Mesh = null;
|
|
442
|
+
// if (floorPatternInfo.meshIdRight !== null) {
|
|
443
|
+
// meshRight = this.full3DObjectToUse.children.find(m => m.name === floorPatternInfo.meshIdRight) as Mesh;
|
|
444
|
+
// this.normalizeMesh(meshRight);
|
|
445
|
+
// }
|
|
446
|
+
//
|
|
447
|
+
// const floorSize: Vector3 = floor.size;
|
|
448
|
+
// const plankSize: Vector3 = new Vector3();
|
|
449
|
+
//
|
|
450
|
+
// meshLeft.geometry.boundingBox.getSize(plankSize);
|
|
451
|
+
//
|
|
452
|
+
// const items: FloorPatternTransform[] = this.floorPatternService.generatePattern(
|
|
453
|
+
// floorPatternInfo.floorPattern,
|
|
454
|
+
// plankSize,
|
|
455
|
+
// floorSize,
|
|
456
|
+
// floorPatternInfo.floorPatternDirection,
|
|
457
|
+
// floorPatternInfo.heartLine
|
|
458
|
+
// );
|
|
459
|
+
//
|
|
460
|
+
// // Debugging option
|
|
461
|
+
// // this._floorTileIntersectionService.toggleDebug();
|
|
462
|
+
// const floorCountResult: FloorCountResult = this.floorTileIntersectionService.countTiles(
|
|
463
|
+
// floor.floorMesh,
|
|
464
|
+
// items,
|
|
465
|
+
// meshLeft.geometry,
|
|
466
|
+
// (meshRight) ? meshRight.geometry : null,
|
|
467
|
+
// true
|
|
468
|
+
// );
|
|
469
|
+
//
|
|
470
|
+
// floor.metadata.floorCountResult = floorCountResult;
|
|
471
|
+
//
|
|
472
|
+
// const leftItems: FloorPatternTransform[] = new Array<FloorPatternTransform>();
|
|
473
|
+
// const rightItems: FloorPatternTransform[] = new Array<FloorPatternTransform>();
|
|
474
|
+
//
|
|
475
|
+
// for (const item of floorCountResult.filtered) {
|
|
476
|
+
// if (item.isLeft) {
|
|
477
|
+
// leftItems.push(item);
|
|
478
|
+
// } else {
|
|
479
|
+
// rightItems.push(item);
|
|
480
|
+
// }
|
|
481
|
+
// }
|
|
482
|
+
//
|
|
483
|
+
// const selection: Selection[] = this.selections;
|
|
484
|
+
// let variationGameObject: string;
|
|
485
|
+
// for (const selectionKey of selection) {
|
|
486
|
+
// if (selectionKey.elementType === 'variation') {
|
|
487
|
+
// variationGameObject = selectionKey.gameObject;
|
|
488
|
+
// break;
|
|
489
|
+
// }
|
|
490
|
+
// }
|
|
491
|
+
//
|
|
492
|
+
// let floorVariationMaterial: any;
|
|
493
|
+
// if (variationGameObject !== null) {
|
|
494
|
+
// this.variationService.loadVariationForMaterial(this.articleAssetPath, variationGameObject, floor.metadata.schema).then(result => {
|
|
495
|
+
// floorVariationMaterial = result;
|
|
496
|
+
// const texture: Texture = floorVariationMaterial.map;
|
|
497
|
+
// if (floorPatternInfo.floorPatternDirection === FloorPatternDirection.LYING) {
|
|
498
|
+
// texture.rotation = Math.PI / 2;
|
|
499
|
+
// } else {
|
|
500
|
+
// texture.rotation = 0;
|
|
501
|
+
// }
|
|
502
|
+
// const meshLeftMaterial: Material | Material[] = meshLeft.material;
|
|
503
|
+
// const plankMaterial = new MeshStandardMaterial({
|
|
504
|
+
// color: 0xFF0000,
|
|
505
|
+
// transparent: true,
|
|
506
|
+
// opacity: 0.8
|
|
507
|
+
// });
|
|
508
|
+
//
|
|
509
|
+
// const planksLeft =
|
|
510
|
+
// this.instancedMeshFromFloorPatternTransform(meshLeft.geometry, leftItems, plankMaterial);
|
|
511
|
+
// let planksRight: InstancedMesh;
|
|
512
|
+
// if (meshRight) {
|
|
513
|
+
// const meshRightMaterial: Material | Material[] = meshRight.material;
|
|
514
|
+
// planksRight = this.instancedMeshFromFloorPatternTransform(meshRight.geometry, rightItems, plankMaterial);
|
|
515
|
+
// }
|
|
516
|
+
// const customFloorWrapper = new Object3D();
|
|
517
|
+
// customFloorWrapper.add(planksLeft);
|
|
518
|
+
// if (planksRight) {
|
|
519
|
+
// customFloorWrapper.add(planksRight);
|
|
520
|
+
// }
|
|
521
|
+
// floor.floorObject = customFloorWrapper;
|
|
522
|
+
// this.floorService.configurableFloor = customFloorWrapper;
|
|
523
|
+
//
|
|
524
|
+
// // Now we update the default floorplane with the mesh
|
|
525
|
+
// floor.floorMaterial = floorVariationMaterial;
|
|
526
|
+
// this.sceneService.needsRender = true;
|
|
527
|
+
// // Emit update toggleFloorFrame event.
|
|
528
|
+
// this.messageBus.emit(MessageType.FloorRebuild);
|
|
529
|
+
// });
|
|
530
|
+
// }
|
|
531
|
+
// }
|
|
532
|
+
// protected instancedMeshFromFloorPatternTransform(
|
|
533
|
+
// geom: BufferGeometry,
|
|
534
|
+
// pattern: Array<FloorPatternTransform>,
|
|
535
|
+
// material: Material | Material[]
|
|
536
|
+
// ) {
|
|
537
|
+
// if (pattern.length <= 0) {
|
|
538
|
+
// return null;
|
|
539
|
+
// }
|
|
540
|
+
// const targetPlankMesh = new InstancedMesh(geom, material, pattern.length);
|
|
541
|
+
// const dummy = new Object3D();
|
|
542
|
+
// for (let i: number = 0; i < pattern.length; i++) {
|
|
543
|
+
// const item: FloorPatternTransform = pattern[i];
|
|
544
|
+
// const position: Vector3 = item.position;
|
|
545
|
+
// position.y = 0.02;
|
|
546
|
+
// const rotation: Vector3 = item.rotation;
|
|
547
|
+
// dummy.position.set(position.x, position.y, position.z);
|
|
548
|
+
// dummy.rotation.set(rotation.x, rotation.y, rotation.z);
|
|
549
|
+
// dummy.updateMatrix();
|
|
550
|
+
//
|
|
551
|
+
// targetPlankMesh.setMatrixAt(i, dummy.matrix);
|
|
552
|
+
// }
|
|
553
|
+
// return targetPlankMesh;
|
|
554
|
+
// }
|
|
555
|
+
// protected generateFloorPatternInfo(item: Item, floorPattern: FloorPattern): FloorPatternInfo {
|
|
556
|
+
// this.generateSelectedInMetadata(item);
|
|
557
|
+
// const info: FloorPatternInfo = {
|
|
558
|
+
// meshIdLeft: null,
|
|
559
|
+
// meshIdRight: null,
|
|
560
|
+
// floorPattern: FloorPattern.NORMAL,
|
|
561
|
+
// floorPatternDirection: FloorPatternDirection.LYING,
|
|
562
|
+
// heartLine: 0
|
|
563
|
+
// };
|
|
564
|
+
//
|
|
565
|
+
// let floorGameObject: string;
|
|
566
|
+
// for (const selectionKey of this.selections) {
|
|
567
|
+
// if (selectionKey.nodeType === 'ART') {
|
|
568
|
+
// floorGameObject = selectionKey.gameObject;
|
|
569
|
+
// break;
|
|
570
|
+
// }
|
|
571
|
+
// }
|
|
572
|
+
//
|
|
573
|
+
// info.heartLine = Number(this.floorService.floorCenterLineXAxis);
|
|
574
|
+
// // TODO convert floorPatternDirection to type number to let the user use custom rotation, for now there are only 2 options based on enum
|
|
575
|
+
// if (this.floorService.floorRotation === 0) {
|
|
576
|
+
// info.floorPatternDirection = FloorPatternDirection.LYING;
|
|
577
|
+
// } else {
|
|
578
|
+
// info.floorPatternDirection = FloorPatternDirection.STANDING;
|
|
579
|
+
// }
|
|
580
|
+
// info.floorPattern = floorPattern;
|
|
581
|
+
// info.meshIdLeft = floorGameObject;
|
|
582
|
+
// if (info.floorPattern === FloorPattern.HON45 || info.floorPattern === FloorPattern.HON60) {
|
|
583
|
+
// info.meshIdRight = `r_${floorGameObject}`;
|
|
584
|
+
// }
|
|
585
|
+
// if (info.floorPattern === FloorPattern.HERRINGBONE) {
|
|
586
|
+
// info.meshIdRight = info.meshIdLeft;
|
|
587
|
+
// }
|
|
588
|
+
// const afmeting = selected.find(s => s.question.toLowerCase() === 'plank afmeting');
|
|
589
|
+
// let afmetingString: string = afmeting.answer.toLowerCase();
|
|
590
|
+
// afmetingString = afmetingString.substr(afmetingString.lastIndexOf(' ') + 1);
|
|
591
|
+
// const legPatroonAnswer = selected.find(s => s.question.toLowerCase() === 'leg patroon').answer.toLowerCase();
|
|
592
|
+
// let legPatroonString = '';
|
|
593
|
+
// const hartlineType = selected.find(s => s.question.toLowerCase() === 'hartlijn');
|
|
594
|
+
//
|
|
595
|
+
// if (hartlineType && hartlineType.answer.toLowerCase() === 'aangepast') {
|
|
596
|
+
// const hartlineValue = selected.find(s => s.question.toLowerCase() === 'hartlijn_aangepast');
|
|
597
|
+
// if (hartlineValue && hartlineValue.userInputValue !== undefined) {
|
|
598
|
+
// info.heartLine = Number(hartlineValue.userInputValue);
|
|
599
|
+
// }
|
|
600
|
+
// }
|
|
601
|
+
//
|
|
602
|
+
//
|
|
603
|
+
// switch (true) {
|
|
604
|
+
// case legPatroonAnswer.indexOf('recht') !== -1:
|
|
605
|
+
// legPatroonString = '90';
|
|
606
|
+
// info.floorPattern = FloorPattern.NORMAL;
|
|
607
|
+
// break;
|
|
608
|
+
// case legPatroonAnswer.indexOf('graat') !== -1:
|
|
609
|
+
// legPatroonString = '90';
|
|
610
|
+
// info.floorPattern = FloorPattern.HERRINGBONE;
|
|
611
|
+
// break;
|
|
612
|
+
// case legPatroonAnswer.indexOf('60') !== -1:
|
|
613
|
+
// legPatroonString = '60';
|
|
614
|
+
// info.floorPattern = FloorPattern.HON60;
|
|
615
|
+
// break;
|
|
616
|
+
// case legPatroonAnswer.indexOf('45') !== -1:
|
|
617
|
+
// legPatroonString = '45';
|
|
618
|
+
// info.floorPattern = FloorPattern.HON45;
|
|
619
|
+
// break;
|
|
620
|
+
// }
|
|
621
|
+
//
|
|
622
|
+
// info.meshIdLeft = `${afmetingString}_${legPatroonString}`;
|
|
623
|
+
// if ( info.floorPattern === FloorPattern.HON45 || info.floorPattern === FloorPattern.HON60) {
|
|
624
|
+
// info.meshIdRight = `r_${afmetingString}_${legPatroonString}`;
|
|
625
|
+
// }
|
|
626
|
+
//
|
|
627
|
+
// if (info.floorPattern === FloorPattern.HERRINGBONE) {
|
|
628
|
+
// info.meshIdRight = info.meshIdLeft;
|
|
629
|
+
// }
|
|
630
|
+
//
|
|
631
|
+
// const legRichtingAnswer = selected.find(s => s.question.toLowerCase() === 'leg richting').answer.toLowerCase();
|
|
632
|
+
// info.floorPatternDirection =
|
|
633
|
+
// (legRichtingAnswer.indexOf('verticaal') !== -1) ? FloorPatternDirection.STANDING : FloorPatternDirection.LYING;
|
|
634
|
+
// return info;
|
|
635
|
+
// }
|
|
636
|
+
// protected generateSelectedInMetadata(item: Item): void {
|
|
637
|
+
// const cloneSelections = JSON.parse(JSON.stringify(this.selections));
|
|
638
|
+
// cloneSelections.forEach(s => {
|
|
639
|
+
// s.imageData = undefined;
|
|
640
|
+
// s.imageDataLastAnswer = undefined;
|
|
641
|
+
// if (s.addables) {
|
|
642
|
+
// s.addables.forEach(a => {
|
|
643
|
+
// a.imageData = undefined;
|
|
644
|
+
// });
|
|
645
|
+
// }
|
|
646
|
+
// });
|
|
647
|
+
// item.metadata.decos = Array.from(this.configuratorConnectorService.decoNodes);
|
|
648
|
+
// item.metadata.selections = cloneSelections;
|
|
649
|
+
// }
|
|
650
|
+
normalizeMesh(mesh) {
|
|
651
|
+
const meshSize = new Vector3();
|
|
652
|
+
mesh.geometry.computeBoundingBox();
|
|
653
|
+
mesh.geometry.boundingBox.getSize(meshSize);
|
|
654
|
+
if (meshSize.z > meshSize.x) {
|
|
655
|
+
mesh.geometry.rotateY(Math.PI / 2);
|
|
656
|
+
}
|
|
657
|
+
mesh.geometry.center();
|
|
658
|
+
mesh.geometry.computeBoundingBox();
|
|
659
|
+
const center = new Vector3();
|
|
660
|
+
mesh.geometry.boundingBox.getCenter(center);
|
|
661
|
+
mesh.position.copy(center);
|
|
662
|
+
}
|
|
663
|
+
setInstanceToConfigure(result) {
|
|
664
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
665
|
+
if (result.resultType !== ResultType.Timeout) {
|
|
666
|
+
if (result.instanceId) {
|
|
667
|
+
yield this.configuratorConnectorService.setInstance(result.instanceId)
|
|
668
|
+
.catch((e) => {
|
|
669
|
+
result.errorMessages.push(new ConfiguratorErrorMessage(e));
|
|
670
|
+
Promise.reject(result);
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
else {
|
|
674
|
+
const response = yield this.configuratorConnectorService.initNodeInstance(result.goodId, true)
|
|
675
|
+
.catch((e) => {
|
|
676
|
+
result.errorMessages.push(new ConfiguratorErrorMessage(e));
|
|
677
|
+
Promise.reject(result);
|
|
678
|
+
});
|
|
679
|
+
if (response && response.validationResult && response.validationResult.success) {
|
|
680
|
+
result.instanceId = response.resultObject;
|
|
681
|
+
}
|
|
682
|
+
else {
|
|
683
|
+
// timeout / unable to set instanceid
|
|
684
|
+
result.errorMessages.push(new ConfiguratorErrorMessage('ERROR_SETTING_INSTANCE_ID'));
|
|
685
|
+
Promise.reject(result);
|
|
686
|
+
}
|
|
687
|
+
yield this.configuratorConnectorService.setInstance(result.instanceId)
|
|
688
|
+
.catch((e) => {
|
|
689
|
+
result.errorMessages.push(new ConfiguratorErrorMessage(e));
|
|
690
|
+
Promise.reject(result);
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
return result;
|
|
694
|
+
}
|
|
695
|
+
else {
|
|
696
|
+
return Promise.reject();
|
|
697
|
+
}
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
getSelectionsAndDecosFromMetadata(result) {
|
|
701
|
+
if (result.selections && result.decos) {
|
|
702
|
+
this.configuratorConnectorService.setSelections(result.selections);
|
|
703
|
+
this.configuratorConnectorService.setDecoNodes(Array.from(result.decos.values()));
|
|
704
|
+
result.obsolete = true;
|
|
705
|
+
if (result.resultType !== ResultType.ConfigurationNotFixed) {
|
|
706
|
+
result.resultType = ResultType.Obsolete;
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
if (this.configuratorConnectorService.selections.length < 2 || this.configuratorConnectorService.decoNodes.length === 0) {
|
|
711
|
+
result.errorMessages.push(new ConfiguratorErrorMessage('NO_SELECTIONS_OR_DECOS', 'NO_SELECTIONS_OR_DECOS_INFO'));
|
|
712
|
+
}
|
|
713
|
+
throw result;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
selectionPublished(selection) {
|
|
717
|
+
return ((selection.hierarchicalPublicationCode === null) || ((selection.hierarchicalPublicationCode & 2) > 0)) &&
|
|
718
|
+
((selection.nodeType === NodeType.Question &&
|
|
719
|
+
(((selection.questionPublicationCode & 2) > 0) ||
|
|
720
|
+
selection.questionPublicationCode === null || selection.questionPublicationCode === undefined)) ||
|
|
721
|
+
(selection.nodeType === NodeType.Answer &&
|
|
722
|
+
(((selection.answerPublicationCode & 2) > 0) ||
|
|
723
|
+
selection.answerPublicationCode === null || selection.answerPublicationCode === undefined)));
|
|
724
|
+
}
|
|
725
|
+
cleanupBeforePresetLoad() {
|
|
726
|
+
MaterialUtils.ClearCaches();
|
|
727
|
+
}
|
|
728
|
+
/*
|
|
729
|
+
* Clear variables to let objects being disposed properly
|
|
730
|
+
*/
|
|
731
|
+
handleAfterPresetLoad() {
|
|
732
|
+
// make sure nothing is keeping a lock
|
|
733
|
+
this.configuratorConnectorService.setInstance(null);
|
|
734
|
+
// clean
|
|
735
|
+
this.cleanup();
|
|
736
|
+
}
|
|
737
|
+
cleanup() {
|
|
738
|
+
ObjectUtils.DisposeObject(this.full3DObjectToUse);
|
|
739
|
+
this.full3DObjectToUse = undefined;
|
|
740
|
+
this._currentCustomFloorGroup = undefined;
|
|
741
|
+
ObjectUtils.DisposeObject(this._activeChildElement);
|
|
742
|
+
this._activeChildElement = undefined;
|
|
743
|
+
this.placedAdjustables.length = 0;
|
|
744
|
+
this._placedAddables.length = 0;
|
|
745
|
+
this._adjustables.length = 0;
|
|
746
|
+
this._addables.length = 0;
|
|
747
|
+
}
|
|
748
|
+
canConnectSelections(sel1, sel2) {
|
|
749
|
+
if (!sel1.decoNode || !sel2.decoNode) {
|
|
750
|
+
return false;
|
|
751
|
+
}
|
|
752
|
+
let canConnect = sel2.decoNode.type !== DecoNodeType.Part;
|
|
753
|
+
if (!canConnect) {
|
|
754
|
+
const len = sel1.decoNode.connectors.length;
|
|
755
|
+
for (let i = 0; i < len; i++) {
|
|
756
|
+
const leni = sel2.decoNode.connectors.length;
|
|
757
|
+
for (let ii = 0; ii < leni; ii++) {
|
|
758
|
+
canConnect = Scene3DUtil.CanSelectorConnect(sel1.decoNode.connectors, sel1.decoNode.connectors[i], sel2.decoNode.connectors[ii]);
|
|
759
|
+
if (canConnect) {
|
|
760
|
+
return true;
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
return false;
|
|
765
|
+
}
|
|
766
|
+
return canConnect;
|
|
767
|
+
}
|
|
768
|
+
handleAnswerSelected(answer) {
|
|
769
|
+
this._answerSelected.push(answer);
|
|
770
|
+
}
|
|
771
|
+
handleSelectionSelected(chosenOption) {
|
|
772
|
+
this._selectionsSelected.push(chosenOption.opvTreeNodeHierarchy);
|
|
773
|
+
}
|
|
774
|
+
createConfigurableItem(itemName) {
|
|
775
|
+
const item = new Object3D();
|
|
776
|
+
item.name = itemName + '_clone';
|
|
777
|
+
item.visible = true;
|
|
778
|
+
return item;
|
|
779
|
+
}
|
|
780
|
+
// @ts-ignore
|
|
781
|
+
// protected createPositionAnimation(object: Object3D, from: Vector3, to: Vector3, easing: TWEEN.Easing): Promise<void> {
|
|
782
|
+
// const tweenFrom: Vector3 = new Vector3().copy(from);
|
|
783
|
+
// const tween = new TWEEN.Tween(tweenFrom)
|
|
784
|
+
// .to(to, 1000)
|
|
785
|
+
// .easing(easing)
|
|
786
|
+
// .onUpdate(() => {
|
|
787
|
+
// object.position.copy(tweenFrom);
|
|
788
|
+
// this.sceneService.needsRender = true;
|
|
789
|
+
// });
|
|
790
|
+
// // @ts-ignore
|
|
791
|
+
// return new Promise((resolve: Function, reject: Function) => tween.onComplete(resolve.bind(this, tween)).onStop(reject).start());
|
|
792
|
+
// }
|
|
793
|
+
// protected async animateChanges(furniture: Item, changes: ChangesInterface[]): Promise<void[]> {
|
|
794
|
+
// // it's christmasss
|
|
795
|
+
// const animations: Promise<void>[] = [];
|
|
796
|
+
// if (furniture instanceof CustomFloorItem) {
|
|
797
|
+
// for (let i = 0; i < changes.length; i++) {
|
|
798
|
+
// // @ts-ignore
|
|
799
|
+
// const easing: TWEEN.Easing = !changes[i].oldPosition ? TWEEN.Easing.Exponential.Out :
|
|
800
|
+
// (!changes[i].newPosition ? TWEEN.Easing.Exponential.Out : TWEEN.Easing.Exponential.InOut);
|
|
801
|
+
// const from: Vector3 =
|
|
802
|
+
// // tslint:disable-next-line:max-line-length
|
|
803
|
+
// changes[i].oldPosition ? new Vector3().copy(changes[i].oldPosition) : new Vector3().copy(changes[i].newPosition).setY(10);
|
|
804
|
+
// const to: Vector3 =
|
|
805
|
+
// // tslint:disable-next-line:max-line-length
|
|
806
|
+
// changes[i].newPosition ? new Vector3().copy(changes[i].newPosition) : new Vector3().copy(changes[i].oldPosition).setY(10);
|
|
807
|
+
// const obj: Object3D = furniture.getObjectByName(changes[i].name);
|
|
808
|
+
// if (!from.equals(to)) {
|
|
809
|
+
// animations.push(
|
|
810
|
+
// this.createPositionAnimation(obj, from, to, easing)
|
|
811
|
+
// );
|
|
812
|
+
// }
|
|
813
|
+
// }
|
|
814
|
+
// }
|
|
815
|
+
// return await Promise.all(animations);
|
|
816
|
+
// }
|
|
817
|
+
cloneSelections() {
|
|
818
|
+
const cloneSelections = JSON.parse(JSON.stringify(this.selections));
|
|
819
|
+
cloneSelections.forEach(s => {
|
|
820
|
+
s.imageData = undefined;
|
|
821
|
+
s.imageDataLastAnswer = undefined;
|
|
822
|
+
if (s.addables) {
|
|
823
|
+
s.addables.forEach(a => {
|
|
824
|
+
a.imageData = undefined;
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
});
|
|
828
|
+
return cloneSelections;
|
|
829
|
+
}
|
|
830
|
+
updateBuildObject(newItem, resultObject) {
|
|
831
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
832
|
+
const cloneSelections = this.cloneSelections();
|
|
833
|
+
newItem.visible = true;
|
|
834
|
+
newItem.name = resultObject.articleName;
|
|
835
|
+
newItem.userData.rootObject = true;
|
|
836
|
+
if (resultObject.position) {
|
|
837
|
+
newItem.position.copy(resultObject.position);
|
|
838
|
+
}
|
|
839
|
+
// TODO ask why it could also be an number
|
|
840
|
+
if (resultObject.rotation && resultObject.rotation instanceof Euler) {
|
|
841
|
+
newItem.rotation.copy(resultObject.rotation);
|
|
842
|
+
}
|
|
843
|
+
else if (resultObject.default180 && !resultObject.rotation) {
|
|
844
|
+
newItem.rotation.set(this.defaultRotation.x, this.defaultRotation.y, this.defaultRotation.z);
|
|
845
|
+
newItem.updateMatrixWorld(true);
|
|
846
|
+
}
|
|
847
|
+
resultObject.object = newItem;
|
|
848
|
+
resultObject.selections = cloneSelections;
|
|
849
|
+
resultObject.decos = Array.from(this.configuratorConnectorService.decoNodes);
|
|
850
|
+
return resultObject;
|
|
851
|
+
});
|
|
852
|
+
}
|
|
853
|
+
isMoveableObject(obj) {
|
|
854
|
+
return obj.userData && obj.userData.selection && obj.userData.selection.hdecoPositioning === HdecoPositioning.Variable;
|
|
855
|
+
}
|
|
856
|
+
addElementOnConnector(currentItem, element, connector, connectedNodeId) {
|
|
857
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
858
|
+
// TODO this should do something, but not sure what
|
|
859
|
+
// const connectorFromElement = currentItem.connectorFromElement(element.userData.selection);
|
|
860
|
+
// const idFromBaseElement: number = connectedNodeId ? connectedNodeId : connectorFromElement.connectedNodeId;
|
|
861
|
+
// const baseElement: Object3D[] = currentItem.getObjectsByUserDataProp('selection', 'nodeId', idFromBaseElement);
|
|
862
|
+
//
|
|
863
|
+
// const item: Item = ObjectUtils.GetParentItem(element);
|
|
864
|
+
// if (item) {
|
|
865
|
+
// const conn: string =
|
|
866
|
+
// await this.elementService.placeElementOnConnector(
|
|
867
|
+
// item.metadata.itemId,
|
|
868
|
+
// element,
|
|
869
|
+
// baseElement.length > 0 ? baseElement[0] : null,
|
|
870
|
+
// false,
|
|
871
|
+
// connector,
|
|
872
|
+
// false
|
|
873
|
+
// );
|
|
874
|
+
// this.saveElementConnector(element, conn);
|
|
875
|
+
// }
|
|
876
|
+
});
|
|
877
|
+
}
|
|
878
|
+
saveElementConnector(element, connector) {
|
|
879
|
+
// if (element && element.userData && element.userData.selection) {
|
|
880
|
+
// this._currentCustomFloorGroup.updateElementConnector(element.userData.selection, connector, this.baseElementNodeId);
|
|
881
|
+
// }
|
|
882
|
+
}
|
|
883
|
+
getIdentifierFromSelection(selection) {
|
|
884
|
+
return `${selection.decoNode ? selection.decoNode.nodeId + '_' : ''}${selection.nodeId}`;
|
|
885
|
+
}
|
|
886
|
+
reset() {
|
|
887
|
+
this.placedAdjustables.length = 0;
|
|
888
|
+
this._placedAddables.length = 0;
|
|
889
|
+
this._adjustables.length = 0;
|
|
890
|
+
this._addables.length = 0;
|
|
891
|
+
// this._prepareTheSelections();
|
|
892
|
+
// todo: check this
|
|
893
|
+
// this._elementService.removeElement(this.activeInstance);
|
|
894
|
+
}
|
|
895
|
+
/**
|
|
896
|
+
* Returns the materialId of the parent up the tree until presentionlevel 1 is reached
|
|
897
|
+
* @param id
|
|
898
|
+
* @private
|
|
899
|
+
*/
|
|
900
|
+
getMaterialIdFromParent(id) {
|
|
901
|
+
const idx = this.selections.findIndex(s => s.node === id);
|
|
902
|
+
let currentLevel = 999;
|
|
903
|
+
if (idx > -1) {
|
|
904
|
+
for (let i = idx; i > 0; i--) {
|
|
905
|
+
const selection = this.selections[i];
|
|
906
|
+
if (selection.presentationLevel >= currentLevel) {
|
|
907
|
+
break;
|
|
908
|
+
}
|
|
909
|
+
currentLevel = selection.presentationLevel;
|
|
910
|
+
if (selection.hdecoGameObject) {
|
|
911
|
+
return selection.hdecoGameObject;
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
return undefined;
|
|
916
|
+
}
|
|
917
|
+
getAdjustables(checkGameObject = true, checkType = true) {
|
|
918
|
+
return this.selections.filter(s => {
|
|
919
|
+
const node = s.decoNode;
|
|
920
|
+
// tslint:disable-next-line:max-line-length
|
|
921
|
+
return node && (checkGameObject ? node.gameObjectName : true) && (checkType ? node.type === DecoNodeType.Part : true) && node.kind === DecoNodeKind.Adjustable;
|
|
922
|
+
});
|
|
923
|
+
}
|
|
924
|
+
getVariations() {
|
|
925
|
+
if (this.configuratorConnectorService.decoNodes.length === 0) {
|
|
926
|
+
return [];
|
|
927
|
+
}
|
|
928
|
+
return this.configuratorConnectorService.decoNodes.filter((deco) => {
|
|
929
|
+
return deco.type === DecoNodeType.Variation;
|
|
930
|
+
});
|
|
931
|
+
}
|
|
932
|
+
createAdjustable(item, adj) {
|
|
933
|
+
// tslint:disable-next-line:max-line-length
|
|
934
|
+
let obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(adj.decoNode.gameObjectName || adj.gameObject) : null;
|
|
935
|
+
if (!obj) {
|
|
936
|
+
// in case of glb files, the importer removes dots from names
|
|
937
|
+
const name = adj.decoNode.gameObjectName.replace(/[.]/g, '');
|
|
938
|
+
obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(name) : null;
|
|
939
|
+
if (!obj) {
|
|
940
|
+
DebugUtils.log(`No object with name ${adj.decoNode.gameObjectName} found!`);
|
|
941
|
+
return null;
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
let adjustable = obj.clone();
|
|
945
|
+
adjustable.name = this.createUniqueName(item, obj);
|
|
946
|
+
adjustable.userData.selection = adj;
|
|
947
|
+
adjustable.position.set(0, 0, 0);
|
|
948
|
+
adjustable.traverse(c => {
|
|
949
|
+
c.visible = !c.name.toLowerCase().startsWith('c_');
|
|
950
|
+
});
|
|
951
|
+
item.add(adjustable);
|
|
952
|
+
adjustable = item.getObjectByName(adjustable.name);
|
|
953
|
+
this.placedAdjustables.push(adjustable);
|
|
954
|
+
return adjustable;
|
|
955
|
+
}
|
|
956
|
+
createAddable(item, add, part2, part1) {
|
|
957
|
+
const obj = this.full3DObjectToUse.getObjectByName(add.decoNode.gameObjectName);
|
|
958
|
+
if (!obj) {
|
|
959
|
+
return null;
|
|
960
|
+
}
|
|
961
|
+
// const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
|
|
962
|
+
const addable = obj.clone();
|
|
963
|
+
addable.name = this.createUniqueName(item, obj);
|
|
964
|
+
addable.userData.selection = add;
|
|
965
|
+
addable.position.set(0, 0, 0);
|
|
966
|
+
addable.visible = true;
|
|
967
|
+
if (part1 && part2) {
|
|
968
|
+
return this.placeAddable(item, addable);
|
|
969
|
+
}
|
|
970
|
+
return addable;
|
|
971
|
+
}
|
|
972
|
+
placeAddable(item, add) {
|
|
973
|
+
item.add(add);
|
|
974
|
+
const addable = item.getObjectByName(add.name);
|
|
975
|
+
this._placedAddables.push(addable);
|
|
976
|
+
return addable;
|
|
977
|
+
}
|
|
978
|
+
createUniqueName(item, obj) {
|
|
979
|
+
let iteration = 0;
|
|
980
|
+
let name = `${item.name}_${obj.name}`;
|
|
981
|
+
let existingObj = item.getObjectByName(name);
|
|
982
|
+
while (existingObj) {
|
|
983
|
+
iteration++;
|
|
984
|
+
name = `${item.name}_${obj.name}` + (iteration !== 0 ? ('_' + iteration) : '');
|
|
985
|
+
existingObj = item.getObjectByName(name);
|
|
986
|
+
}
|
|
987
|
+
return name;
|
|
988
|
+
}
|
|
989
|
+
placeAddables(item) {
|
|
990
|
+
const len = this.placedAdjustables.length;
|
|
991
|
+
for (let i = 0; i < len; i++) {
|
|
992
|
+
if (this.placedAdjustables[i].userData.hasOwnProperty('selection') && this.placedAdjustables[i].userData.selection) {
|
|
993
|
+
const adjustableSelection = this.placedAdjustables[i].userData.selection;
|
|
994
|
+
if (adjustableSelection) {
|
|
995
|
+
const lena = adjustableSelection.addables.length;
|
|
996
|
+
let conAddable;
|
|
997
|
+
for (let ia = 0; ia < lena; ia++) {
|
|
998
|
+
Scene3DUtil.TrySelectorConnection(this.scene, item, this.placedAdjustables[i], adjustableSelection.addables[ia], false, (add, part2, part1) => this.createAddable(item, add, part2, part1));
|
|
999
|
+
if (conAddable) {
|
|
1000
|
+
Scene3DUtil.TrySelectorConnection(this.scene, item, conAddable, adjustableSelection.addables[ia], false, (add, part2, part1) => this.createAddable(item, add, part2, part1));
|
|
1001
|
+
}
|
|
1002
|
+
conAddable = this._placedAddables[this._placedAddables.length - 1];
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
loadVariations(item, instanceId) {
|
|
1009
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1010
|
+
if (this.settingsService.settings.options.useVariationOnPart) {
|
|
1011
|
+
yield this.variationService.loadPart(this.articleAssetPath, this._adjustables, instanceId, item, true);
|
|
1012
|
+
}
|
|
1013
|
+
yield this.variationService.loadVariation(this.articleAssetPath, this._adjustables, instanceId, item, true);
|
|
1014
|
+
yield this.variationService.loadVariation(this.articleAssetPath, this._addables, instanceId, item, true);
|
|
1015
|
+
this.variationService.clearCache();
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
preloadMaterial(answer) {
|
|
1019
|
+
if (answer.elementType === DecoNodeType.Variation && (answer.gameObject || answer.materialUrl)) {
|
|
1020
|
+
const variations = this.getVariations();
|
|
1021
|
+
const variationDecoNode = variations.find(v => ((v.parentId && answer.parentArticleDecoId && v.parentId.toString() === answer.parentArticleDecoId.toString()) ||
|
|
1022
|
+
// @ts-ignore
|
|
1023
|
+
(v.parentId && answer.parentNodeId && v.parentId.toString() === answer.parentNodeId.toString())));
|
|
1024
|
+
if (!variationDecoNode || !this.currentCustomFloorGroup) {
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
let affectedSelections = [];
|
|
1028
|
+
if (this._genericSelection) {
|
|
1029
|
+
affectedSelections = this._adjustables;
|
|
1030
|
+
}
|
|
1031
|
+
else {
|
|
1032
|
+
const currentSelection = ObjectUtils.GetSelectionFromSelectedObject(this._activeChildElement);
|
|
1033
|
+
if (currentSelection) {
|
|
1034
|
+
affectedSelections = [this._adjustables.find((selection) => selection.nodeId === currentSelection.nodeId)];
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
// tslint:disable-next-line:max-line-length
|
|
1038
|
+
const adjustablesClone = affectedSelections && affectedSelections.length > 0 ? affectedSelections.map(s => Object.assign({}, s)) : [];
|
|
1039
|
+
if (adjustablesClone.length === 0) {
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
adjustablesClone.forEach((selection) => {
|
|
1043
|
+
const variation = selection.variations.find(v => (
|
|
1044
|
+
// tslint:disable-next-line:max-line-length
|
|
1045
|
+
v).decoId.toString() === variationDecoNode.id.toString() && v.node.toString() === variationDecoNode.nodeId.toString());
|
|
1046
|
+
if (variation) {
|
|
1047
|
+
if (variation.materialUrl) {
|
|
1048
|
+
variation.materialUrl = answer.materialUrl;
|
|
1049
|
+
}
|
|
1050
|
+
else {
|
|
1051
|
+
variation.gameObjectName = answer.gameObject;
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
});
|
|
1055
|
+
this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [answer], this.articleAssetPath)
|
|
1056
|
+
.then(() => {
|
|
1057
|
+
this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true);
|
|
1058
|
+
});
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
preloadMaterialBySelection(answer) {
|
|
1062
|
+
if (answer.elementType === DecoNodeType.Variation && answer.gameObject) {
|
|
1063
|
+
const variationDecoNode = new DecoNode();
|
|
1064
|
+
variationDecoNode.gameObjectName = answer.gameObject;
|
|
1065
|
+
const adjustablesClone = this._adjustables.map(s => Object.assign({}, s));
|
|
1066
|
+
if (this._genericSelection) {
|
|
1067
|
+
if (this.currentCustomFloorGroup) {
|
|
1068
|
+
adjustablesClone.forEach((selection) => selection.variations = [variationDecoNode]);
|
|
1069
|
+
// tslint:disable-next-line:max-line-length
|
|
1070
|
+
this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode], this.articleAssetPath)
|
|
1071
|
+
.then(() => {
|
|
1072
|
+
this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true);
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
else {
|
|
1076
|
+
this._adjustables.forEach((selection) => selection.variations = [variationDecoNode]);
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
else {
|
|
1080
|
+
const currentSelection = ObjectUtils.GetSelectionFromSelectedObject(this._activeChildElement);
|
|
1081
|
+
if (currentSelection) {
|
|
1082
|
+
if (this.currentCustomFloorGroup) {
|
|
1083
|
+
const selectionFromAdjustables = adjustablesClone
|
|
1084
|
+
.find((selection) => selection.nodeId === currentSelection.nodeId);
|
|
1085
|
+
if (selectionFromAdjustables) {
|
|
1086
|
+
selectionFromAdjustables.variations = [variationDecoNode];
|
|
1087
|
+
this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode], this.articleAssetPath)
|
|
1088
|
+
.then(() => {
|
|
1089
|
+
this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true).then();
|
|
1090
|
+
});
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
else {
|
|
1094
|
+
const selectionFromAdjustables = this._adjustables
|
|
1095
|
+
.find((selection) => selection.nodeId === currentSelection.nodeId);
|
|
1096
|
+
selectionFromAdjustables.variations = [variationDecoNode];
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
buildFloor(result) {
|
|
1103
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1104
|
+
// let floorWithoutPlankCounter: boolean = true;
|
|
1105
|
+
// let floorPattern: FloorPattern;
|
|
1106
|
+
// const articleFullObject: ArticleFullObject = await this.connectorAdapterService.getArticleFullObject(+result.metaData.goodId);
|
|
1107
|
+
// if (articleFullObject.tags !== null && articleFullObject.tags.length > 0) {
|
|
1108
|
+
// for (const tag of articleFullObject.tags) {
|
|
1109
|
+
// if (tag.description === 'NORMAL') {
|
|
1110
|
+
// floorPattern = FloorPattern.NORMAL;
|
|
1111
|
+
// } else if (tag.description === 'HERRINGBONE') {
|
|
1112
|
+
// floorPattern = FloorPattern.HERRINGBONE;
|
|
1113
|
+
// } else if (tag.description === 'HON60') {
|
|
1114
|
+
// floorPattern = FloorPattern.HON60;
|
|
1115
|
+
// } else if (tag.description === 'HON45') {
|
|
1116
|
+
// floorPattern = FloorPattern.HON45;
|
|
1117
|
+
// } else {
|
|
1118
|
+
// floorPattern = FloorPattern.NORMAL;
|
|
1119
|
+
// }
|
|
1120
|
+
// }
|
|
1121
|
+
// floorWithoutPlankCounter = false;
|
|
1122
|
+
// }
|
|
1123
|
+
//
|
|
1124
|
+
// const item: FloorPlaneItem = this.floorService.floorToConfigure;
|
|
1125
|
+
// item.metadata = result.metaData;
|
|
1126
|
+
// item.metadata.selections = this.cloneSelections();
|
|
1127
|
+
// item.metadata.decos = Array.from(this.configuratorConnectorService.decoNodes);
|
|
1128
|
+
// this.handleCreateFloor(item);
|
|
1129
|
+
//
|
|
1130
|
+
// if (floorWithoutPlankCounter) {
|
|
1131
|
+
// const floorRotation: number = this.floorService.floorRotation;
|
|
1132
|
+
// item.children[0].userData.selection = this.selections[0];
|
|
1133
|
+
// await this.loadVariations(item, result.metaData.itemId);
|
|
1134
|
+
//
|
|
1135
|
+
// item.metadata.textureAssetName = this.variationService.loadedAsset;
|
|
1136
|
+
// this.floorService.unHighLightFloors();
|
|
1137
|
+
// this.sceneService.needsRender = true;
|
|
1138
|
+
// this.currentCustomFloorGroup = item;
|
|
1139
|
+
// result.furniture = this.currentCustomFloorGroup;
|
|
1140
|
+
// result.instanceId = result.metaData.itemId;
|
|
1141
|
+
//
|
|
1142
|
+
// } else {
|
|
1143
|
+
// this.floorService.unHighLightFloors();
|
|
1144
|
+
// this.sceneService.needsRender = true;
|
|
1145
|
+
// this.currentCustomFloorGroup = item;
|
|
1146
|
+
// result.furniture = this.currentCustomFloorGroup;
|
|
1147
|
+
// result.instanceId = result.metaData.itemId;
|
|
1148
|
+
// // this._generateLayingPattern(item, floorPattern);
|
|
1149
|
+
// }
|
|
1150
|
+
//
|
|
1151
|
+
// this.handleIntegration(result.metaData.itemId, this.currentCustomFloorGroup);
|
|
1152
|
+
// if (this.currentCustomFloorGroup.itemGroup) {
|
|
1153
|
+
// this.itemGroupService.reattachToItemGroup(
|
|
1154
|
+
// this.currentCustomFloorGroup,
|
|
1155
|
+
// this.currentCustomFloorGroup.itemGroup,
|
|
1156
|
+
// this.currentCustomFloorGroup.position);
|
|
1157
|
+
// }
|
|
1158
|
+
// this.emptyAnswerSelected();
|
|
1159
|
+
//
|
|
1160
|
+
// if (result.resultType === ResultType.NoSelections) {
|
|
1161
|
+
// result.resultType = ResultType.ConfigurationFixed;
|
|
1162
|
+
// } else if (result.resultType !== ResultType.Obsolete && result.resultType !== ResultType.ConfigurationFixed) { // don't override these
|
|
1163
|
+
// result.resultType = ResultType.Loaded;
|
|
1164
|
+
// }
|
|
1165
|
+
// this.floorService.floorResultObject = result;
|
|
1166
|
+
// this.buildFinished.next(result);
|
|
1167
|
+
// return result;
|
|
1168
|
+
});
|
|
1169
|
+
}
|
|
1170
|
+
downloadUDSZforARIOS() {
|
|
1171
|
+
const objects = this.itemService.sceneItems;
|
|
1172
|
+
const objectToExport = objects.values().next().value;
|
|
1173
|
+
this.utilsService.downloadUSDZforARIOS(objectToExport);
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
BuildFurnitureBaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService, deps: [{ token: i1.ConfiguratorConnectorService }, { token: i2.DictionaryService }, { token: i3.AppEventService }, { token: i4.SettingsService }, { token: i5.VariationService }, { token: i6.VariationCacheService }, { token: i7.UtilsService }, { token: i8.ItemService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1177
|
+
BuildFurnitureBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService });
|
|
1178
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService, decorators: [{
|
|
1179
|
+
type: Injectable
|
|
1180
|
+
}], ctorParameters: function () { return [{ type: i1.ConfiguratorConnectorService }, { type: i2.DictionaryService }, { type: i3.AppEventService }, { type: i4.SettingsService }, { type: i5.VariationService }, { type: i6.VariationCacheService }, { type: i7.UtilsService }, { type: i8.ItemService }]; } });
|
|
1181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtZnVybml0dXJlLWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL3NlcnZpY2VzL2J1aWxkLWZ1cm5pdHVyZS1iYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN6RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBRXRGLE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxFQUFDLEtBQUssRUFBUSxRQUFRLEVBQVMsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzVELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUM3RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2REFBNkQsQ0FBQztBQUk3RixPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFJdEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBSzdFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFHaEQsTUFBTSxPQUFnQix5QkFBeUI7SUF1RDdDLFlBQ1ksNEJBQTBELEVBQzFELGlCQUFvQyxFQUNwQyxlQUFnQyxFQUNoQyxlQUFnQyxFQUNoQyxnQkFBa0MsRUFDbEMscUJBQTRDLEVBQzVDLFlBQTBCLEVBQzFCLFdBQXdCO1FBUHhCLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBOEI7UUFDMUQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQXJDN0Isb0JBQWUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLG9CQUFlLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFNM0Msc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBSW5DLG1CQUFjLEdBQXVDLElBQUksT0FBTyxFQUE2QixDQUFDO1FBQzlGLHNCQUFpQixHQUFxQixJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQzdELHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNuQyxxQkFBZ0IsR0FBWSxJQUFJLENBQUM7UUFFakMsb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFDNUIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFDekIsY0FBUyxHQUFVLEVBQUUsQ0FBQztRQUV0QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFDL0Isd0JBQW1CLEdBQWEsRUFBRSxDQUFDO1FBSWpDLFNBQUksR0FBbUIsRUFBRSxDQUFDO1FBQzFCLHNCQUFpQixHQUFVLEVBQUUsQ0FBQztJQVl4QyxDQUFDO0lBL0RELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyx1QkFBdUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcsdUJBQXVCLENBQUMsSUFBYztRQUMvQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsVUFBVSxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFXLEtBQUssQ0FBQyxLQUFZO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQTJDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQXNCTSxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTSx1QkFBdUI7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVNLHVCQUF1QixDQUFDLGFBQXdCO1FBQ3JELE1BQU0sVUFBVSxHQUFnQixFQUFFLENBQUM7UUFDbkMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkIsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLFNBQVMsR0FBYyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sS0FBSyxHQUFXLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztZQUNsRCxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsSUFBSSxTQUFTLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNsSCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUM1QjtnQkFDRCxJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUU7b0JBQ3RCLE1BQU07aUJBQ1A7YUFDRjtZQUNELElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxhQUFhLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLElBQUksRUFBRTtnQkFDOUUsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUNuQjtTQUNGO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVNLGdDQUFnQztRQUNyQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNqQyw0RkFBNEY7U0FDN0Y7SUFDSCxDQUFDO0lBRVksWUFBWSxDQUFDLElBQStCLEVBQUUsVUFBbUIsSUFBSSxFQUFFLGFBQXNCLEtBQUs7O1lBQzdHLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZELElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN6QztpQkFBTSxJQUFJLFVBQVUsRUFBRSxFQUFFLHNEQUFzRDtnQkFDN0UsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLG9DQUFvQzthQUMzRztRQUNILENBQUM7S0FBQTtJQUVZLGVBQWUsQ0FDMUIsU0FBb0IsRUFBRSxJQUErQixFQUFFLGVBQXlCLEVBQUUsS0FBZSxFQUFFLFNBQWtCOztZQUNySCxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDM0MsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQztLQUFBO0lBRVksZUFBZSxDQUFDLFNBQW9CLEVBQUUsSUFBK0I7O1lBQ2hGLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNuRSxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxDQUFDO0tBQUE7SUFFWSxnQkFBZ0IsQ0FBQyxTQUFvQixFQUFFLElBQStCOztZQUNqRixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRSxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxDQUFDO0tBQUE7SUFFWSxZQUFZLENBQUMsTUFBYyxFQUFFLEtBQWEsRUFBRSxJQUErQjs7WUFDdEYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxNQUFNLE1BQU0sR0FBOEIsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQztLQUFBO0lBRVksdUJBQXVCLENBQUMsWUFBK0IsRUFBRSxJQUErQjs7WUFDbkcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMzQyxNQUFNLE1BQU0sR0FBOEIsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQztLQUFBO0lBRU0sc0JBQXNCO1FBQzNCLE1BQU0sR0FBRyxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsdURBQXVEO1lBQ3ZELElBQUksSUFBSSxHQUFRLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVHLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsSUFBSSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7YUFDdkI7WUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFNBQVMsRUFBRTtnQkFDeEMsTUFBTSxTQUFTLEdBQVEsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdkcsSUFBSSxTQUFTLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7aUJBQzVCO2FBQ0Y7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxVQUFtQjtRQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNDLE1BQU0sa0JBQWtCLEdBQWMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVGLE1BQU0sb0JBQW9CLEdBQWdCLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0scUJBQXFCLEdBQ3pCLG9CQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2pDLGtCQUFrQixDQUFDLFVBQVU7WUFDN0Isa0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0MseUJBQXlCO1FBQ3pCLE1BQU0sZ0JBQWdCLEdBQWUsVUFBVTthQUM1QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksb0JBQW9CLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFLLENBQUMsQ0FBQyxRQUFnQixDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxDQUFDO2FBQ25KLEdBQUcsQ0FBQyxDQUFDLEtBQWdCLEVBQUUsS0FBYSxFQUFFLEtBQWtCLEVBQUUsRUFBRTtZQUMzRCw4QkFBOEI7WUFDOUIsTUFBTSxHQUFHLEdBQWMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQU0sS0FBSyxDQUFDLFFBQWdCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVHLElBQUksR0FBRyxFQUFFO2dCQUNOLEtBQUssQ0FBQyxRQUFnQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUM7YUFDN0U7WUFDQSxLQUFLLENBQUMsUUFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEYsT0FBUSxLQUFLLENBQUMsUUFBZ0IsQ0FBQyxTQUFTLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLHVCQUF1QixHQUFZLElBQUksQ0FBQztRQUU1QyxNQUFNLEdBQUcsR0FBVyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksU0FBb0IsQ0FBQztRQUN6QixJQUFJLGNBQXlCLENBQUM7UUFDOUIsSUFBSSxPQUFPLEdBQVksS0FBSyxDQUFDO1FBQzdCLElBQUksaUJBQWlCLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxXQUFnQixDQUFDO1FBQ3JCLElBQUksVUFBa0IsQ0FBQztRQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0sU0FBUyxHQUFjLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLFNBQVMsQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLEVBQUU7Z0JBQ3JDLFdBQVcsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3pDLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO2FBQ2pDO1lBQ0QsSUFBSSxTQUFTLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLEVBQUU7Z0JBQ25ELFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLElBQUksV0FBVyxDQUFDO2FBQ3hFO1lBQ0QsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFO2dCQUN0QixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxTQUFTLEVBQUU7b0JBQ3RELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7b0JBQ25DLFFBQWdCLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztvQkFDMUMsMEVBQTBFO29CQUMxRSxJQUFJLENBQUUsUUFBZ0IsQ0FBQyxVQUFVLEVBQUU7d0JBQ2hDLFFBQWdCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQzlFO29CQUNELElBQUksU0FBUyxFQUFFO3dCQUNiLElBQUksT0FBTyxFQUFFOzRCQUNYLElBQUssUUFBZ0IsQ0FBQyxVQUFVLEVBQUU7Z0NBQ2hDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzZCQUNyQztpQ0FBTTtnQ0FDTCxTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7NkJBQ25DO3lCQUNGOzZCQUFNOzRCQUNMLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUNyQzt3QkFDRCxPQUFPLEdBQUcsS0FBSyxDQUFDO3FCQUNqQjt5QkFBTTt3QkFDTCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQ2pDO29CQUNELFNBQVM7b0JBQ1QsbUNBQW1DO29CQUNuQyxtQ0FBbUM7b0JBQ25DLHVDQUF1QztvQkFDdkMsTUFBTTtvQkFDTixxQ0FBcUM7b0JBQ3JDLElBQUk7b0JBQ0osMEVBQTBFO29CQUMxRSxrREFBa0Q7b0JBQ2xELDZEQUE2RDtvQkFDN0QsaUVBQWlFO29CQUNqRSwrRUFBK0U7b0JBQy9FLGtDQUFrQztpQkFDbkM7cUJBQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxJQUFJO29CQUN2RCxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxLQUFLLFFBQVE7b0JBQ3JELFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRTtvQkFDdEUsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsVUFBVSxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRTt3QkFDbEYsU0FBUyxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzlGLE9BQU8sR0FBRyxJQUFJLENBQUM7eUJBQ2hCO3dCQUNELFNBQVMsR0FBRyxTQUFTLENBQUM7d0JBQ3RCLGNBQWMsR0FBRyxTQUFTLENBQUM7cUJBQzVCO3lCQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLE9BQU8sRUFBRTt3QkFDM0QsU0FBUyxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUM3RixJQUFJLGNBQWMsRUFBRTs0QkFDbEIsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7eUJBQ3pDO3dCQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMvQixJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUM5RixPQUFPLEdBQUcsSUFBSSxDQUFDO3lCQUNoQjt3QkFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDO3FCQUN2QjtpQkFDRjthQUNGO1lBQ0QsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDO1NBQ2pEO1FBQ0QsNkNBQTZDO1FBQzdDLG1DQUFtQztJQUNyQyxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsTUFBYztRQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQzFDLE1BQU0sRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsU0FBUzthQUNoRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFNBQVMsQ0FBQzthQUNyRixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRWUsdUJBQXVCLENBQ3JDLGtCQUEyQixFQUMzQixlQUF3QixFQUN4QiwwQkFBbUMsRUFDbkMsTUFBaUM7O1lBRWpDLElBQUksa0JBQWtCLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQzFDLE1BQU0sa0JBQWtCLEdBQVcsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDckQsTUFBTSxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQztnQkFDM0MsSUFBSSwwQkFBMEIsRUFBRTtvQkFDOUIsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx3Q0FBd0MsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUM7eUJBQzdILEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNYLE9BQU8sa0JBQWtCLENBQUM7b0JBQzVCLENBQUMsQ0FBQyxDQUFDO2lCQUNOO3FCQUFNO29CQUNMLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsd0NBQXdDLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDO3lCQUM3SCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3QkFDWCxPQUFPLGtCQUFrQixDQUFDO29CQUM1QixDQUFDLENBQUMsQ0FBQztpQkFDTjthQUNGO1lBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxlQUFlLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3hFLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNwRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQixPQUFPLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUFBO0lBRWUscUJBQXFCOztZQUNuQyxJQUFJO2dCQUNGLE1BQU0sd0JBQXdCLEdBQW1CLEVBQUUsQ0FBQztnQkFDcEQsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUN6SSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQzthQUM3QztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLFVBQVUsQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDNUQ7UUFDSCxDQUFDO0tBQUE7SUFFZSw0QkFBNEIsQ0FBQyxNQUFpQzs7WUFDNUUsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSw4Q0FBOEM7Z0JBQzNHLElBQUk7b0JBQ0YsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxlQUFlLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsb0NBQW9DO3dCQUNwSCxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7d0JBQzFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUN6QixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDMUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO3dCQUM1QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7cUJBQ3pEO29CQUNELElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDaEQ7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsVUFBVSxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDN0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxQjthQUNGO1lBQ0QsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZELENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDekIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO1lBRXZDLDRGQUE0RjtZQUM1RixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7S0FBQTtJQUVELGlEQUFpRDtJQUNqRCwyRUFBMkU7SUFDM0Usa0RBQWtEO0lBQ2xELHFGQUFxRjtJQUNyRiwyQ0FBMkM7SUFDM0Msb0NBQW9DO0lBQ3BDLHdEQUF3RDtJQUN4RCxtRkFBbUY7SUFDbkYsdURBQXVEO0lBQ3ZELDZGQUE2RjtJQUM3RiwyRUFBMkU7SUFDM0UsbUZBQW1GO0lBQ25GLGdGQUFnRjtJQUNoRix3RkFBd0Y7SUFDeEYsOENBQThDO0lBQzlDLDhDQUE4QztJQUM5QyxtREFBbUQ7SUFDbkQsa0VBQWtFO0lBQ2xFLDJFQUEyRTtJQUMzRSxzREFBc0Q7SUFDdEQsd0VBQXdFO0lBQ3hFLG1CQUFtQjtJQUNuQixtRkFBbUY7SUFDbkYsNkVBQTZFO0lBQzdFLDBGQUEwRjtJQUMxRiwyREFBMkQ7SUFDM0QsNkVBQTZFO0lBQzdFLCtEQUErRDtJQUMvRCw2RUFBNkU7SUFDN0UsMkRBQTJEO0lBQzNELDhDQUE4QztJQUM5QyxjQUFjO0lBQ2QsZ0RBQWdEO0lBQ2hELFlBQVk7SUFDWixVQUFVO0lBQ1YsNEJBQTRCO0lBQzVCLDJFQUEyRTtJQUMzRSxvRUFBb0U7SUFDcEUsK0RBQStEO0lBQy9ELDhDQUE4QztJQUM5Qyw4Q0FBOEM7SUFDOUMsUUFBUTtJQUNSLGtFQUFrRTtJQUNsRSxrREFBa0Q7SUFDbEQsdUNBQXVDO0lBQ3ZDLGtEQUFrRDtJQUNsRCwwSEFBMEg7SUFDMUgsbUdBQW1HO0lBQ25HLGlEQUFpRDtJQUNqRCx5Q0FBeUM7SUFDekMsOEdBQThHO0lBQzlHLDJJQUEySTtJQUMzSSwwREFBMEQ7SUFDMUQsOENBQThDO0lBQzlDLDhDQUE4QztJQUM5QyxpQ0FBaUM7SUFDakMsVUFBVTtJQUNWLFFBQVE7SUFDUiw4Q0FBOEM7SUFDOUMsOEJBQThCO0lBQzlCLE1BQU07SUFDTixzREFBc0Q7SUFDdEQsSUFBSTtJQUNKLEVBQUU7SUFDRix5RUFBeUU7SUFDekUsK0RBQStEO0lBQy9ELHFGQUFxRjtJQUNyRiwyQ0FBMkM7SUFDM0MscUJBQXFCO0lBQ3JCLHFEQUFxRDtJQUNyRCxrR0FBa0c7SUFDbEcsd0RBQXdEO0lBQ3hELGlCQUFpQjtJQUNqQixrREFBa0Q7SUFDbEQseURBQXlEO0lBQ3pELFVBQVU7SUFDViwyQkFBMkI7SUFDM0IsZUFBZTtJQUNmLHdEQUF3RDtJQUN4RCxRQUFRO0lBQ1IsMkRBQTJEO0lBQzNELGtDQUFrQztJQUNsQywyRUFBMkU7SUFDM0Usd0NBQXdDO0lBQ3hDLFVBQVU7SUFDVixRQUFRO0lBQ1IsTUFBTTtJQUNOLElBQUk7SUFFSiw2RkFBNkY7SUFDN0YsbUdBQW1HO0lBQ25HLGdDQUFnQztJQUNoQyxxQkFBcUI7SUFDckIsaUdBQWlHO0lBQ2pHLGtDQUFrQztJQUNsQyxFQUFFO0lBQ0YsZ0NBQWdDO0lBQ2hDLGlEQUFpRDtJQUNqRCw4R0FBOEc7SUFDOUcscUNBQXFDO0lBQ3JDLE1BQU07SUFDTixFQUFFO0lBQ0YsMkNBQTJDO0lBQzNDLDhDQUE4QztJQUM5QyxFQUFFO0lBQ0Ysc0RBQXNEO0lBQ3RELEVBQUU7SUFDRixxRkFBcUY7SUFDckYscUNBQXFDO0lBQ3JDLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsOENBQThDO0lBQzlDLGlDQUFpQztJQUNqQyxPQUFPO0lBQ1AsRUFBRTtJQUNGLHdCQUF3QjtJQUN4Qix5REFBeUQ7SUFDekQsNkZBQTZGO0lBQzdGLHVCQUF1QjtJQUN2QixhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLCtDQUErQztJQUMvQyxXQUFXO0lBQ1gsT0FBTztJQUNQLEVBQUU7SUFDRix3REFBd0Q7SUFDeEQsRUFBRTtJQUNGLG1GQUFtRjtJQUNuRixvRkFBb0Y7SUFDcEYsRUFBRTtJQUNGLG9EQUFvRDtJQUNwRCx5QkFBeUI7SUFDekIsOEJBQThCO0lBQzlCLGVBQWU7SUFDZiwrQkFBK0I7SUFDL0IsUUFBUTtJQUNSLE1BQU07SUFDTixFQUFFO0lBQ0Ysb0RBQW9EO0lBQ3BELHFDQUFxQztJQUNyQyw0Q0FBNEM7SUFDNUMsc0RBQXNEO0lBQ3RELHVEQUF1RDtJQUN2RCxlQUFlO0lBQ2YsUUFBUTtJQUNSLE1BQU07SUFDTixFQUFFO0lBQ0YscUNBQXFDO0lBQ3JDLHdDQUF3QztJQUN4Qyx5SUFBeUk7SUFDekkseUNBQXlDO0lBQ3pDLDZEQUE2RDtJQUM3RCxzRkFBc0Y7SUFDdEYsMENBQTBDO0lBQzFDLGlCQUFpQjtJQUNqQixnQ0FBZ0M7SUFDaEMsVUFBVTtJQUNWLDJFQUEyRTtJQUMzRSx5REFBeUQ7SUFDekQsMkJBQTJCO0lBQzNCLDZCQUE2QjtJQUM3Qix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLEVBQUU7SUFDRiwyQkFBMkI7SUFDM0Isb0dBQW9HO0lBQ3BHLHdDQUF3QztJQUN4Qyx5QkFBeUI7SUFDekIsK0VBQStFO0lBQy9FLG9IQUFvSDtJQUNwSCxVQUFVO0lBQ1YsbURBQW1EO0lBQ25ELDRDQUE0QztJQUM1QywyQkFBMkI7SUFDM0IsK0NBQStDO0lBQy9DLFVBQVU7SUFDVixnREFBZ0Q7SUFDaEQsa0VBQWtFO0lBQ2xFLEVBQUU7SUFDRiw4REFBOEQ7SUFDOUQsc0RBQXNEO0lBQ3RELDhDQUE4QztJQUM5QywrQ0FBK0M7SUFDL0Msd0RBQXdEO0lBQ3hELFVBQVU7SUFDVixNQUFNO0lBQ04sSUFBSTtJQUVKLG9EQUFvRDtJQUNwRCwwQkFBMEI7SUFDMUIsMkNBQTJDO0lBQzNDLG9DQUFvQztJQUNwQyxNQUFNO0lBQ04sK0JBQStCO0lBQy9CLG1CQUFtQjtJQUNuQixNQUFNO0lBQ04sK0VBQStFO0lBQy9FLGtDQUFrQztJQUNsQyx1REFBdUQ7SUFDdkQsc0RBQXNEO0lBQ3RELCtDQUErQztJQUMvQyx5QkFBeUI7SUFDekIsK0NBQStDO0lBQy9DLDhEQUE4RDtJQUM5RCw4REFBOEQ7SUFDOUQsNEJBQTRCO0lBQzVCLEVBQUU7SUFDRixvREFBb0Q7SUFDcEQsTUFBTTtJQUNOLDRCQUE0QjtJQUM1QixJQUFJO0lBRUosaUdBQWlHO0lBQ2pHLDJDQUEyQztJQUMzQyxxQ0FBcUM7SUFDckMsd0JBQXdCO0lBQ3hCLHlCQUF5QjtJQUN6Qix5Q0FBeUM7SUFDekMsMERBQTBEO0lBQzFELG1CQUFtQjtJQUNuQixPQUFPO0lBQ1AsRUFBRTtJQUNGLGlDQUFpQztJQUNqQyxrREFBa0Q7SUFDbEQsNkNBQTZDO0lBQzdDLG1EQUFtRDtJQUNuRCxlQUFlO0lBQ2YsUUFBUTtJQUNSLE1BQU07SUFDTixFQUFFO0lBQ0YscUVBQXFFO0lBQ3JFLDZJQUE2STtJQUM3SSxpREFBaUQ7SUFDakQsZ0VBQWdFO0lBQ2hFLGFBQWE7SUFDYixtRUFBbUU7SUFDbkUsTUFBTTtJQUNOLHNDQUFzQztJQUN0Qyx1Q0FBdUM7SUFDdkMsZ0dBQWdHO0lBQ2hHLGlEQUFpRDtJQUNqRCxNQUFNO0lBQ04sMERBQTBEO0lBQzFELDBDQUEwQztJQUMxQyxNQUFNO0lBRU4sc0ZBQXNGO0lBQ3RGLDhEQUE4RDtJQUM5RCwrRUFBK0U7SUFDL0UsZ0hBQWdIO0lBQ2hILDZCQUE2QjtJQUM3QixvRkFBb0Y7SUFDcEYsRUFBRTtJQUNGLDJFQUEyRTtJQUMzRSxpR0FBaUc7SUFDakcsdUVBQXVFO0lBQ3ZFLDZEQUE2RDtJQUM3RCxNQUFNO0lBQ04sSUFBSTtJQUNKLEVBQUU7SUFDRixFQUFFO0lBQ0Ysa0JBQWtCO0lBQ2xCLG1EQUFtRDtJQUNuRCwrQkFBK0I7SUFDL0IsK0NBQStDO0lBQy9DLGFBQWE7SUFDYixtREFBbUQ7SUFDbkQsK0JBQStCO0lBQy9CLG9EQUFvRDtJQUNwRCxhQUFhO0lBQ2IsZ0RBQWdEO0lBQ2hELCtCQUErQjtJQUMvQiw4Q0FBOEM7SUFDOUMsYUFBYTtJQUNiLGdEQUFnRDtJQUNoRCwrQkFBK0I7SUFDL0IsOENBQThDO0lBQzlDLGFBQWE7SUFDYixJQUFJO0lBQ0osRUFBRTtJQUNGLDZEQUE2RDtJQUM3RCwrRkFBK0Y7SUFDL0Ysa0VBQWtFO0lBQ2xFLElBQUk7SUFDSixFQUFFO0lBQ0Ysd0RBQXdEO0lBQ3hELHdDQUF3QztJQUN4QyxJQUFJO0lBQ0osRUFBRTtJQUNGLGtIQUFrSDtJQUNsSCwrQkFBK0I7SUFDL0Isa0hBQWtIO0lBRWxILGlCQUFpQjtJQUNqQixJQUFJO0lBRUosMkRBQTJEO0lBQzNELHlFQUF5RTtJQUN6RSxtQ0FBbUM7SUFDbkMsK0JBQStCO0lBQy9CLHlDQUF5QztJQUN6Qyx3QkFBd0I7SUFDeEIsa0NBQWtDO0lBQ2xDLG1DQUFtQztJQUNuQyxZQUFZO0lBQ1osUUFBUTtJQUNSLFFBQVE7SUFDUixtRkFBbUY7SUFDbkYsZ0RBQWdEO0lBQ2hELElBQUk7SUFFTSxhQUFhLENBQUMsSUFBVTtRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFZSxzQkFBc0IsQ0FBQyxNQUFpQzs7WUFDdEUsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUU7Z0JBQzVDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtvQkFDckIsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7eUJBQ25FLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNYLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDekIsQ0FBQyxDQUFDLENBQUM7aUJBQ047cUJBQU07b0JBQ0wsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7eUJBQzNGLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNYLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDekIsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7d0JBQzlFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztxQkFDM0M7eUJBQU07d0JBQ0wscUNBQXFDO3dCQUNyQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLHdCQUF3QixDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQzt3QkFDckYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDeEI7b0JBQ0QsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7eUJBQ25FLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNYLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDekIsQ0FBQyxDQUFDLENBQUM7aUJBQ047Z0JBQ0QsT0FBTyxNQUFNLENBQUM7YUFDZjtpQkFBTTtnQkFDTCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUN6QjtRQUNILENBQUM7S0FBQTtJQUVTLGlDQUFpQyxDQUFDLE1BQWlDO1FBQzNFLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ3JDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRixNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLHFCQUFxQixFQUFFO2dCQUMxRCxNQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7YUFDekM7U0FDRjthQUFNO1lBQ0wsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN2SCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLHdCQUF3QixDQUFDLHdCQUF3QixFQUFFLDZCQUE2QixDQUFDLENBQUMsQ0FBQzthQUNsSDtZQUNELE1BQU0sTUFBTSxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRVMsa0JBQWtCLENBQUMsU0FBb0I7UUFDL0MsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLDJCQUEyQixLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDNUcsQ0FDRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVE7Z0JBQ3ZDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVDLFNBQVMsQ0FBQyx1QkFBdUIsS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLHVCQUF1QixLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUNuRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLE1BQU07b0JBQ3JDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzFDLFNBQVMsQ0FBQyxxQkFBcUIsS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLHFCQUFxQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQ2hHLENBQUM7SUFDTixDQUFDO0lBRVMsdUJBQXVCO1FBQy9CLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O01BRUU7SUFDUSxxQkFBcUI7UUFDN0Isc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsUUFBUTtRQUNSLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRVMsT0FBTztRQUNmLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFDO1FBQzFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRVMsb0JBQW9CLENBQUMsSUFBZSxFQUFFLElBQWU7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3BDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLFVBQVUsR0FBWSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQ25FLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsTUFBTSxJQUFJLEdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUNyRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFO29CQUNoQyxVQUFVLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2pJLElBQUksVUFBVSxFQUFFO3dCQUNkLE9BQU8sSUFBSSxDQUFDO3FCQUNiO2lCQUNGO2FBQ0Y7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVTLG9CQUFvQixDQUFDLE1BQWM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVTLHVCQUF1QixDQUFDLFlBQStCO1FBQy9ELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVTLHNCQUFzQixDQUFDLFFBQWdCO1FBQy9DLE1BQU0sSUFBSSxHQUFhLElBQUksUUFBUSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGFBQWE7SUFDYix5SEFBeUg7SUFDekgseURBQXlEO0lBQ3pELDZDQUE2QztJQUM3QyxvQkFBb0I7SUFDcEIsc0JBQXNCO0lBQ3RCLHdCQUF3QjtJQUN4Qix5Q0FBeUM7SUFDekMsOENBQThDO0lBQzlDLFVBQVU7SUFDVixrQkFBa0I7SUFDbEIscUlBQXFJO0lBQ3JJLElBQUk7SUFFSixrR0FBa0c7SUFDbEcsd0JBQXdCO0lBQ3hCLDRDQUE0QztJQUM1QyxnREFBZ0Q7SUFDaEQsaURBQWlEO0lBQ2pELHNCQUFzQjtJQUN0Qiw4RkFBOEY7SUFDOUYscUdBQXFHO0lBQ3JHLDhCQUE4QjtJQUM5QixzREFBc0Q7SUFDdEQscUlBQXFJO0lBQ3JJLDRCQUE0QjtJQUM1QixzREFBc0Q7SUFDdEQscUlBQXFJO0lBQ3JJLDBFQUEwRTtJQUMxRSxnQ0FBZ0M7SUFDaEMsMkJBQTJCO0lBQzNCLGdFQUFnRTtJQUNoRSxhQUFhO0lBQ2IsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBQ04sMENBQTBDO0lBQzFDLElBQUk7SUFFTSxlQUFlO1FBQ3ZCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNwRSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzFCLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7WUFDbEMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUNkLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNyQixDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztnQkFDMUIsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVlLGlCQUFpQixDQUFDLE9BQWlCLEVBQUUsWUFBdUM7O1lBQzFGLE1BQU0sZUFBZSxHQUFnQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUQsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDdkIsT0FBTyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUVuQyxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QztZQUNELDBDQUEwQztZQUMxQyxJQUFJLFlBQVksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLFFBQVEsWUFBWSxLQUFLLEVBQUU7Z0JBQ25FLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QztpQkFBTSxJQUFJLFlBQVksQ0FBQyxVQUFVLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO2dCQUM1RCxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3RixPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakM7WUFFRCxZQUFZLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUM5QixZQUFZLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQztZQUMxQyxZQUFZLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTdFLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7S0FBQTtJQUVTLGdCQUFnQixDQUFDLEdBQWE7UUFDdEMsT0FBTyxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztJQUN6SCxDQUFDO0lBRWUscUJBQXFCLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLFNBQWlCLEVBQUUsZUFBdUI7O1lBQ3hILG1EQUFtRDtZQUVuRCw2RkFBNkY7WUFDN0YsOEdBQThHO1lBQzlHLGtIQUFrSDtZQUNsSCxFQUFFO1lBQ0YseURBQXlEO1lBQ3pELGNBQWM7WUFDZCx5QkFBeUI7WUFDekIseURBQXlEO1lBQ3pELDhCQUE4QjtZQUM5QixpQkFBaUI7WUFDakIsd0RBQXdEO1lBQ3hELGVBQWU7WUFDZixtQkFBbUI7WUFDbkIsY0FBYztZQUNkLFNBQVM7WUFDVCw4Q0FBOEM7WUFDOUMsSUFBSTtRQUNOLENBQUM7S0FBQTtJQUVTLG9CQUFvQixDQUFDLE9BQWlCLEVBQUUsU0FBaUI7UUFDakUsbUVBQW1FO1FBQ25FLHlIQUF5SDtRQUN6SCxJQUFJO0lBQ04sQ0FBQztJQUVTLDBCQUEwQixDQUFDLFNBQW9CO1FBQ3ZELE9BQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0YsQ0FBQztJQUVTLEtBQUs7UUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMxQixnQ0FBZ0M7UUFDaEMsbUJBQW1CO1FBQ25CLDJEQUEyRDtJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLHVCQUF1QixDQUFDLEVBQVU7UUFDMUMsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksWUFBWSxHQUFXLEdBQUcsQ0FBQztRQUMvQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksU0FBUyxDQUFDLGlCQUFpQixJQUFJLFlBQVksRUFBRTtvQkFDL0MsTUFBTTtpQkFDUDtnQkFDRCxZQUFZLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDO2dCQUMzQyxJQUFJLFNBQVMsQ0FBQyxlQUFlLEVBQUU7b0JBQzdCLE9BQU8sU0FBUyxDQUFDLGVBQWUsQ0FBQztpQkFDbEM7YUFDRjtTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVTLGNBQWMsQ0FBQyxrQkFBMkIsSUFBSSxFQUFFLFlBQXFCLElBQUk7UUFDakYsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoQyxNQUFNLElBQUksR0FBYSxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ2xDLDJDQUEyQztZQUMzQyxPQUFPLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQ2pLLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGFBQWE7UUFDckIsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRTtZQUMzRSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxJQUFjLEVBQUUsR0FBYztRQUN2RCwyQ0FBMkM7UUFDM0MsSUFBSSxHQUFHLEdBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JJLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUiw2REFBNkQ7WUFDN0QsTUFBTSxJQUFJLEdBQVcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyRSxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkYsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixVQUFVLENBQUMsR0FBRyxDQUFDLHVCQUF1QixHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsU0FBUyxDQUFDLENBQUM7Z0JBQzVFLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELElBQUksVUFBVSxHQUFRLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ3BDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN0QixDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JCLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFUyxhQUFhLENBQUMsSUFBYyxFQUFFLEdBQWMsRUFBRSxLQUFXLEVBQUUsS0FBVztRQUM5RSxNQUFNLEdBQUcsR0FBUSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCw0RUFBNEU7UUFDNUUsTUFBTSxPQUFPLEdBQVEsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDakMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLEtBQUssSUFBSSxLQUFLLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN6QztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFUyxZQUFZLENBQUMsSUFBYyxFQUFFLEdBQVE7UUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLE1BQU0sT0FBTyxHQUFhLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBYSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxJQUFjLEVBQUUsR0FBYTtRQUN0RCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLE9BQU8sV0FBVyxFQUFFO1lBQ2xCLFNBQVMsRUFBRSxDQUFDO1lBQ1osSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0UsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUyxhQUFhLENBQUMsSUFBYztRQUNwQyxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1FBQ2xELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDbEgsTUFBTSxtQkFBbUIsR0FBYyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFDcEYsSUFBSSxtQkFBbUIsRUFBRTtvQkFDdkIsTUFBTSxJQUFJLEdBQVcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDekQsSUFBSSxVQUFlLENBQUM7b0JBQ3BCLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUU7d0JBQ2hDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUMxQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQ3hFLENBQUMsR0FBRyxFQUFFLEtBQU0sRUFBRSxLQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDeEUsSUFBSSxVQUFVLEVBQUU7NEJBQ2QsV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQzFDLElBQUksRUFBRSxVQUFVLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFDekQsQ0FBQyxHQUFHLEVBQUUsS0FBTSxFQUFFLEtBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO3lCQUN6RTt3QkFDRCxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDcEU7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVlLGNBQWMsQ0FBQyxJQUFjLEVBQUUsVUFBa0I7O1lBQy9ELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFO2dCQUM1RCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN4RztZQUNELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQyxDQUFDO0tBQUE7SUFFUyxlQUFlLENBQUMsTUFBYztRQUN0QyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzlGLE1BQU0sVUFBVSxHQUFlLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwRCxNQUFNLGlCQUFpQixHQUFhLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM1RyxhQUFhO2dCQUNiLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7Z0JBQ3ZELE9BQU87YUFDUjtZQUNELElBQUksa0JBQWtCLEdBQWdCLEVBQUUsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzthQUN4QztpQkFBTTtnQkFDTCxNQUFNLGdCQUFnQixHQUFjLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDekcsSUFBSSxnQkFBZ0IsRUFBRTtvQkFDcEIsa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQW9CLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDdkg7YUFDRjtZQUNELDJDQUEyQztZQUMzQyxNQUFNLGdCQUFnQixHQUFnQixrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkosSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxPQUFPO2FBQ1I7WUFDRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFvQixFQUFFLEVBQUU7Z0JBQ2hELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLDJDQUEyQztnQkFDM0MsQ0FBeUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUssQ0FBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssaUJBQWlCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUN4SyxDQUFDO2dCQUNGLElBQUksU0FBUyxFQUFFO29CQUNiLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRTt3QkFDekIsU0FBUyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO3FCQUM1Qzt5QkFBTTt3QkFDTCxTQUFTLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7cUJBQzlDO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUMzRyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkgsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNILENBQUM7SUFFUywwQkFBMEIsQ0FBQyxNQUF5QjtRQUM1RCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ3RFLE1BQU0saUJBQWlCLEdBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNuRCxpQkFBaUIsQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUNyRCxNQUFNLGdCQUFnQixHQUFnQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdkYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzFCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO29CQUNoQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFvQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO29CQUMvRiwyQ0FBMkM7b0JBQzNDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzt5QkFDdEgsSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLGdCQUFnQixFQUNoQixFQUFFLEVBQ0YsSUFBSSxDQUFDLHVCQUF1QixFQUM1QixJQUFJLENBQ0wsQ0FBQztvQkFDSixDQUFDLENBQUMsQ0FBQztpQkFDTjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQW9CLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7aUJBQ2pHO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxnQkFBZ0IsR0FBYyxXQUFXLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3pHLElBQUksZ0JBQWdCLEVBQUU7b0JBQ3BCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO3dCQUNoQyxNQUFNLHdCQUF3QixHQUFjLGdCQUFnQjs2QkFDekQsSUFBSSxDQUFDLENBQUMsU0FBb0IsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDaEYsSUFBSSx3QkFBd0IsRUFBRTs0QkFDNUIsd0JBQXdCLENBQUMsVUFBVSxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs0QkFDMUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixDQUMvQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQ0FDdEUsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQ0FDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLGdCQUFnQixFQUNoQixFQUFFLEVBQ0YsSUFBSSxDQUFDLHVCQUF1QixFQUM1QixJQUFJLENBQ0wsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDWCxDQUFDLENBQUMsQ0FBQzt5QkFDTjtxQkFDRjt5QkFBTTt3QkFDTCxNQUFNLHdCQUF3QixHQUFjLElBQUksQ0FBQyxZQUFZOzZCQUMxRCxJQUFJLENBQUMsQ0FBQyxTQUFvQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNoRix3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3FCQUMzRDtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRWUsVUFBVSxDQUFDLE1BQVc7O1lBQ3BDLGdEQUFnRDtZQUNoRCxrQ0FBa0M7WUFDbEMsaUlBQWlJO1lBQ2pJLDhFQUE4RTtZQUM5RSxnREFBZ0Q7WUFDaEQsMENBQTBDO1lBQzFDLDRDQUE0QztZQUM1QyxzREFBc0Q7WUFDdEQsaURBQWlEO1lBQ2pELGdEQUFnRDtZQUNoRCwyQ0FBMkM7WUFDM0MsZ0RBQWdEO1lBQ2hELDJDQUEyQztZQUMzQyxlQUFlO1lBQ2YsNENBQTRDO1lBQzVDLFFBQVE7WUFDUixNQUFNO1lBQ04sc0NBQXNDO1lBQ3RDLElBQUk7WUFDSixFQUFFO1lBQ0YsbUVBQW1FO1lBQ25FLG1DQUFtQztZQUNuQyxxREFBcUQ7WUFDckQsaUZBQWlGO1lBQ2pGLGdDQUFnQztZQUNoQyxFQUFFO1lBQ0Ysa0NBQWtDO1lBQ2xDLG1FQUFtRTtZQUNuRSw4REFBOEQ7WUFDOUQsNkRBQTZEO1lBQzdELEVBQUU7WUFDRix3RUFBd0U7WUFDeEUsMkNBQTJDO1lBQzNDLDBDQUEwQztZQUMxQyx5Q0FBeUM7WUFDekMscURBQXFEO1lBQ3JELGdEQUFnRDtZQUNoRCxFQUFFO1lBQ0YsV0FBVztZQUNYLDJDQUEyQztZQUMzQywwQ0FBMEM7WUFDMUMseUNBQXlDO1lBQ3pDLHFEQUFxRDtZQUNyRCxnREFBZ0Q7WUFDaEQsd0RBQXdEO1lBQ3hELElBQUk7WUFDSixFQUFFO1lBQ0YsZ0ZBQWdGO1lBQ2hGLGdEQUFnRDtZQUNoRCwrQ0FBK0M7WUFDL0Msb0NBQW9DO1lBQ3BDLDhDQUE4QztZQUM5Qyw4Q0FBOEM7WUFDOUMsSUFBSTtZQUNKLDhCQUE4QjtZQUM5QixFQUFFO1lBQ0YsdURBQXVEO1lBQ3ZELHVEQUF1RDtZQUN2RCx5SUFBeUk7WUFDekksMkNBQTJDO1lBQzNDLElBQUk7WUFDSixnREFBZ0Q7WUFDaEQsbUNBQW1DO1lBQ25DLGlCQUFpQjtRQUNuQixDQUFDO0tBQUE7SUFFTSxvQkFBb0I7UUFDekIsTUFBTSxPQUFPLEdBQWUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQWEsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7O3VIQXZ0Q21CLHlCQUF5QjsySEFBekIseUJBQXlCOzRGQUF6Qix5QkFBeUI7a0JBRDlDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlY29Ob2RlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZSc7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7RGVjb05vZGVLaW5kfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLWtpbmQuZW51bSc7XHJcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdGlvbic7XHJcbmltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtFdWxlciwgTWVzaCwgT2JqZWN0M0QsIFNjZW5lLCBWZWN0b3IzfSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7Tm9kZVR5cGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7SGRlY29Qb3NpdGlvbmluZ30gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL2hkZWNvLXBvc2l0aW9uaW5nLmVudW0nO1xyXG5pbXBvcnQge1ZhcmlhdGlvblNlcnZpY2V9IGZyb20gJy4vdmFyaWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZhcmlhdGlvbkNhY2hlU2VydmljZX0gZnJvbSAnLi92YXJpYXRpb24tY2FjaGUuc2VydmljZSc7XHJcbmltcG9ydCB7U2VsZWN0b3JTdHJ1Y3R1cmV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0b3Itc3RydWN0dXJlLmJvJztcclxuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4vY29uZmlndXJhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSAnLi4vdXRpbHMvb2JqZWN0LnV0aWxzJztcclxuaW1wb3J0IHtNYXRlcmlhbFV0aWxzfSBmcm9tICcuLi91dGlscy9tYXRlcmlhbC51dGlscyc7XHJcbmltcG9ydCB7U2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL3NldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tICcuL2RpY3Rpb25hcnkuc2VydmljZSc7XHJcbmltcG9ydCB7QXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuL2FwcC1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtSZXN1bHRUeXBlfSBmcm9tICcuLi9lbnVtL3Jlc3VsdC10eXBlLmVudW0nO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvckVycm9yTWVzc2FnZX0gZnJvbSAnLi4vbW9kZWwvY29uZmlndXJhdG9yLWVycm9yLW1lc3NhZ2UnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3R9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRpb24tcmVzdWx0LW9iamVjdCc7XHJcbmltcG9ydCB7VmFyaWF0aW9ufSBmcm9tICcuLi9tb2RlbC92YXJpYXRpb24nO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtJdGVtU2VydmljZX0gZnJvbSAnLi9pdGVtLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lM0RVdGlsfSBmcm9tICcuLi91dGlscy9zY2VuZS0zZC51dGlscyc7XHJcbmltcG9ydCB7RGVidWdVdGlsc30gZnJvbSAnLi4vdXRpbHMvZGVidWcudXRpbHMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnVpbGRGdXJuaXR1cmVCYXNlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBnZXQgdXNlTm9kZUlkVG9MaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZU5vZGVJZFRvTGluaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEN1c3RvbUZsb29yR3JvdXAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRDdXN0b21GbG9vckdyb3VwKGl0ZW06IE9iamVjdDNEKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGl0ZW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzY2VuZShzY2VuZTogU2NlbmUpIHtcclxuICAgIHRoaXMuX3NjZW5lID0gc2NlbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNjZW5lKCk6IFNjZW5lIHtcclxuICAgIHJldHVybiB0aGlzLl9zY2VuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWZhdWx0UG9zaXRpb24gPSBuZXcgVmVjdG9yMyg0LCAwLCAxKTtcclxuICBwdWJsaWMgZGVmYXVsdFJvdGF0aW9uID0gbmV3IEV1bGVyKDAsIE1hdGguUEksIDApO1xyXG5cclxuICBwdWJsaWMgYmFzZUVsZW1lbnROb2RlSWQ6IG51bWJlcjtcclxuICBwdWJsaWMgYXJ0aWNsZUFzc2V0UGF0aDogc3RyaW5nO1xyXG4gIHB1YmxpYyBzdGFydFBvc2l0aW9uOiBWZWN0b3IzO1xyXG4gIHB1YmxpYyBmdWxsM0RPYmplY3RUb1VzZTogT2JqZWN0M0Q7XHJcbiAgcHVibGljIGlzTW91c2VPdmVyT2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy8gdXNlZCBmb3IgZWxlbWVudHMsIHRvIHBsYWNlIG9iamVjdHMgb25cclxuICBwdWJsaWMgYWN0aXZlQ29ubmVjdG9yOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBhbnN3ZXJTZWxlY3RlZDogU3ViamVjdDxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PiA9IG5ldyBTdWJqZWN0PENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+KCk7XHJcbiAgcHVibGljIGFyUGxhY2VtZW50VXBkYXRlOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBwdWJsaWMgc2hvd0VsZW1lbnRUb29sYmFyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdXNlTm9kZUlkVG9MaW5rOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9hY3RpdmVDaGlsZEVsZW1lbnQ6IE1lc2g7XHJcbiAgcHJpdmF0ZSBfcGxhY2VkQWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYWRqdXN0YWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfY3VycmVudEN1c3RvbUZsb29yR3JvdXA6IE9iamVjdDNEO1xyXG4gIHByaXZhdGUgX2dlbmVyaWNTZWxlY3Rpb24gPSBmYWxzZTtcclxuICBwcml2YXRlIF9hbnN3ZXJTZWxlY3RlZDogQW5zd2VyW10gPSBbXTtcclxuICBwcml2YXRlIF9zZWxlY3Rpb25zU2VsZWN0ZWQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgX3NjZW5lOiBTY2VuZTtcclxuXHJcbiAgcHJvdGVjdGVkIHN1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHJvdGVjdGVkIHBsYWNlZEFkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBjb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlOiBDb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGRpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcclxuICAgIHByb3RlY3RlZCBhcHBFdmVudFNlcnZpY2U6IEFwcEV2ZW50U2VydmljZSxcclxuICAgIHByb3RlY3RlZCBzZXR0aW5nc1NlcnZpY2U6IFNldHRpbmdzU2VydmljZSxcclxuICAgIHByb3RlY3RlZCB2YXJpYXRpb25TZXJ2aWNlOiBWYXJpYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHZhcmlhdGlvbkNhY2hlU2VydmljZTogVmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHV0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGl0ZW1TZXJ2aWNlOiBJdGVtU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLmNsZWFudXAoKTtcclxuICB9XHJcblxyXG4gIGFic3RyYWN0IGJ1aWxkKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD47XHJcblxyXG4gIGFic3RyYWN0IGNyZWF0ZVNpbXBsZTNETW9kZWwocmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdDtcclxuXHJcbiAgYWJzdHJhY3Qgc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PjtcclxuXHJcbiAgYWJzdHJhY3QgcHJlcGFyZVNlbGVjdGlvbnNBbmREZWNvcyhyZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBhYnN0cmFjdCBjcmVhdGVOb25Db25maWd1cmFibGVGbG9vcihyZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBhYnN0cmFjdCBzdGFydFRvQnVpbGQoXHJcbiAgICByZXN1bHQ/OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0LFxyXG4gICAgc2hvdWxkQ29weUluc3RhbmNlPzogYm9vbGVhbixcclxuICAgIGxvb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uPzogYm9vbGVhbixcclxuICAgIHN0YW5kQWxvbmU/OiBib29sZWFuLFxyXG4gICAgZmlyc3RCdWlsZD86IGJvb2xlYW4sXHJcbiAgICBmcm9tUHJlc2V0PzogYm9vbGVhbixcclxuICAgIGxvYWRGcm9tUHJvamVjdD86IGJvb2xlYW5cclxuICApOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBwdWJsaWMgZW1wdHlBbnN3ZXJTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fuc3dlclNlbGVjdGVkLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1wdHlTZWxlY3Rpb25zU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zU2VsZWN0ZWQubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRPcHRpb25zRnJvbVNlbGVjdGlvbihiYXNlU2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBTZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgbGV0IG5vZGVMZXZlbCA9IC0xO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1tpXTtcclxuICAgICAgY29uc3QgbGV2ZWw6IG51bWJlciA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgICAgaWYgKG5vZGVMZXZlbCAhPT0gLTEpIHtcclxuICAgICAgICBpZiAobm9kZUxldmVsIDwgbGV2ZWwgJiYgdGhpcy5jYW5Db25uZWN0U2VsZWN0aW9ucyhiYXNlU2VsZWN0aW9uLCBzZWxlY3Rpb24pICYmIHRoaXMuc2VsZWN0aW9uUHVibGlzaGVkKHNlbGVjdGlvbikpIHtcclxuICAgICAgICAgIHNlbGVjdGlvbnMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZUxldmVsID49IGxldmVsKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNlbGVjdGlvbi5pZCA9PT0gYmFzZVNlbGVjdGlvbi5pZCAmJiBzZWxlY3Rpb24ubm9kZSA9PT0gYmFzZVNlbGVjdGlvbi5ub2RlKSB7XHJcbiAgICAgICAgbm9kZUxldmVsID0gbGV2ZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbENvbmZpZ3VyaW5nQ3VycmVudEluc3RhbmNlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwKSB7XHJcbiAgICAgIC8vIFRPRE8gY2hlY2sgd2hhdCB3ZSBzaG91bGQgZG8gd2l0aCB0aGlzIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNvbmZpZ3VyaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2FuY2VsQW5zd2VyKGRhdGE6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QsIHJlYnVpbGQ6IGJvb2xlYW4gPSB0cnVlLCBnZXRBbnN3ZXJzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5jYW5jZWxBbnN3ZXIoKTtcclxuICAgIGlmIChyZWJ1aWxkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAoZ2V0QW5zd2VycykgeyAvLyBpZiBub3QgcmVidWlsZCB0aGVuIGNoZWNrIGlmIHdlIG5lZWQgdG8gZ2V0IGFuc3dlcnNcclxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmdldFF1ZXN0aW9uQW5kQW5zd2Vyc0FzeW5jKCk7IC8vIHNlZSBpZiB0aGVyZSBpcyB1c2VyIGlucHV0IG5lZWRlZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNlbGVjdFNlbGVjdGlvbihcclxuICAgIHNlbGVjdGlvbjogU2VsZWN0aW9uLCBkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0LCBmb3JjZUJhY2tUb05vZGU/OiBib29sZWFuLCBhZnRlcj86IGJvb2xlYW4sIGNvbm5lY3Rvcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb24sIGZvcmNlQmFja1RvTm9kZSwgYWZ0ZXIsIGNvbm5lY3Rvcik7XHJcbiAgICB0aGlzLl9nZW5lcmljU2VsZWN0aW9uID0gc2VsZWN0aW9uLmdlbmVyaWM7XHJcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VG9CdWlsZEZyb21Db25maWd1cmF0b3IoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VG9CdWlsZEZyb21Db25maWd1cmF0b3IoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVwbGFjZVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbiwgZGF0YTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnJlcGxhY2VTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIGF3YWl0IHRoaXMuc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZWxlY3RBbnN3ZXIoYW5zd2VyOiBBbnN3ZXIsIGlucHV0OiBzdHJpbmcsIGRhdGE6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMucHJlbG9hZE1hdGVyaWFsKGFuc3dlcik7XHJcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2VsZWN0QW5zd2VyKGFuc3dlciwgaW5wdXQpO1xyXG4gICAgdGhpcy5oYW5kbGVBbnN3ZXJTZWxlY3RlZChhbnN3ZXIpO1xyXG4gICAgY29uc3QgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0ID0gYXdhaXQgdGhpcy5zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKGRhdGEpO1xyXG4gICAgdGhpcy5hbnN3ZXJTZWxlY3RlZC5uZXh0KHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0U2VsZWN0aW9uQXNBbnN3ZXIoY2hvc2VuT3B0aW9uOiBTZWxlY3RvclN0cnVjdHVyZSwgZGF0YTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5wcmVsb2FkTWF0ZXJpYWxCeVNlbGVjdGlvbihjaG9zZW5PcHRpb24pO1xyXG4gICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25TZWxlY3RlZChjaG9zZW5PcHRpb24pO1xyXG4gICAgY29uc3QgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0ID0gYXdhaXQgdGhpcy5zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKGRhdGEpO1xyXG4gICAgdGhpcy5hbnN3ZXJTZWxlY3RlZC5uZXh0KHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbGlua1NlbGVjdGlvbnNBbmREZWNvcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgLy8gY29uc3QgaWQ6IHN0cmluZyA9IHRoaXMuc2VsZWN0aW9uc1tpXS5hcnROb2RlSWREZWNvO1xyXG4gICAgICBsZXQgZGVjbzogYW55ID0gdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5maW5kKGQgPT4gZC5ub2RlSWQgPT09IHRoaXMuc2VsZWN0aW9uc1tpXS5ub2RlKTtcclxuICAgICAgaWYgKCFkZWNvKSB7XHJcbiAgICAgICAgZGVjbyA9IG5ldyBEZWNvTm9kZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkZWNvLnR5cGUgIT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICBjb25zdCB2YXJpYXRpb246IGFueSA9IHRoaXMuZ2V0VmFyaWF0aW9ucygpLmZpbmQodiA9PiB2LnBhcmVudElkID09PSB0aGlzLnNlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1tpXS5kZWNvTm9kZSA9IGRlY287XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcEV2ZW50U2VydmljZS5zZWxlY3Rpb25zQW5kRGVjb3NMaW5rZWQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHByZXBhcmVUaGVTZWxlY3Rpb25zKGluc3RhbmNlSWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnNlbGVjdGlvbnMuc2xpY2UoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbk9mQXJ0aWNsZTogU2VsZWN0aW9uID0gc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQXJ0aWNsZSk7XHJcbiAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBzZWxlY3Rpb25zLmZpbHRlcihzID0+IHMuYWRkQWRqdXN0ID09PSAnMicpO1xyXG4gICAgY29uc3QgaXNBcnRpY2xlV2l0aE1hdGVyaWFsOiBib29sZWFuID1cclxuICAgICAgYWRqdXN0YWJsZVNlbGVjdGlvbnMubGVuZ3RoID09PSAwICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0ICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0Lmxlbmd0aCA+IDA7XHJcbiAgICAvLyBnZXQgZ2VuZXJpYyB2YXJpYXRpb25zXHJcbiAgICBjb25zdCBnbG9iYWxWYXJpYXRpb25zOiBEZWNvTm9kZVtdID0gc2VsZWN0aW9uc1xyXG4gICAgICAuZmlsdGVyKHMgPT4gKHMuZ2VuZXJpYyB8fCBhZGp1c3RhYmxlU2VsZWN0aW9ucy5sZW5ndGggPT09IDEpICYmIChzLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uICYmICghcy5lbGVtZW50VHlwZSB8fCBzLmVsZW1lbnRUeXBlID09PSAndmFyaWF0aW9uJykpXHJcbiAgICAgIC5tYXAoKHZhbHVlOiBTZWxlY3Rpb24sIGluZGV4OiBudW1iZXIsIGFycmF5OiBTZWxlY3Rpb25bXSkgPT4ge1xyXG4gICAgICAgIC8vIGZpbmQgc2VsZWN0aW9uIG9mIHZhcmlhdGlvblxyXG4gICAgICAgIGNvbnN0IHNlbDogU2VsZWN0aW9uID0gc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24ucGFyZW50SWQpO1xyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB0aGlzLmdldE1hdGVyaWFsSWRGcm9tUGFyZW50KHZhbHVlLm5vZGUpO1xyXG4gICAgICAgIHJldHVybiAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb247XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgbGV0IG5ld1BhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgIGxldCBvcHRpb25UZXh0OiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgb3B0aW9uVGV4dCA9IHNlbGVjdGlvbi5xdWVzdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGRlY29Ob2RlID0gc2VsZWN0aW9uLmRlY29Ob2RlO1xyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkub3B0aW9uVGV4dCA9IG9wdGlvblRleHQ7XHJcbiAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb24gYW5kIHNldCBtYXRlcmlhbElkIGluIGNhc2Ugb2YgbXVsdGltYXRlcmlhbFxyXG4gICAgICAgICAgaWYgKCEoZGVjb05vZGUgYXMgYW55KS5tYXRlcmlhbElkKSB7XHJcbiAgICAgICAgICAgIChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQgPSB0aGlzLmdldE1hdGVyaWFsSWRGcm9tUGFyZW50KGRlY29Ob2RlLm5vZGVJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobGFzdEFkZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucyA9IFtkZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1BhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMucHVzaChkZWNvTm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgIC8vICAgaWYgKGdsb2JhbFZhcmlhdGlvbnNSZXdyaXRlKSB7XHJcbiAgICAgICAgICAvLyAgICAgZ2xvYmFsVmFyaWF0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgLy8gICAgIGdsb2JhbFZhcmlhdGlvbnNSZXdyaXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgIC8vICAgZ2xvYmFsVmFyaWF0aW9ucy5wdXNoKGRlY29Ob2RlKTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIGNvbnN0IHZhcmlhdGlvbjogRnVybml0dXJlUGFydFZhcmlhdGlvbiA9IG5ldyBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uKCk7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uQnJhbmRJZCA9IHNlbGVjdGlvbi5kZWNvTm9kZS5icmFuZElkO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLkRlc2NyaXB0aW9uID0gc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLk1hdGVyaWFsSWQgPSAoc2VsZWN0aW9uLmRlY29Ob2RlIGFzIGFueSkubWF0ZXJpYWxJZDtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5TdXBwbGllckFydGljbGVOciA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgIC8vIHVzZWRWYXJpYXRpb25zLnB1c2godmFyaWF0aW9uKTtcclxuICAgICAgICB9IGVsc2UgaWYgKChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgJiZcclxuICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUubGVuZ3RoKSB8fCAoaXNBcnRpY2xlV2l0aE1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZS5raW5kID09PSBEZWNvTm9kZUtpbmQuQWRqdXN0YWJsZSB8fCAoaXNBcnRpY2xlV2l0aE1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24udmFyaWF0aW9ucyA9IGdsb2JhbFZhcmlhdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICBsYXN0QWRqdXN0YWJsZSA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gbGFzdEFkanVzdGFibGUgPyBsYXN0QWRqdXN0YWJsZS52YXJpYXRpb25zIDogZ2xvYmFsVmFyaWF0aW9ucy5zbGljZSgpO1xyXG4gICAgICAgICAgICBpZiAobGFzdEFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICBsYXN0QWRqdXN0YWJsZS5hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwcmV2aW91c1ByZXNMZXZlbCA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZSh0aGlzLmFjdGl2ZUluc3RhbmNlLFxyXG4gICAgLy8gICB7VmFyaWF0aW9uczogdXNlZFZhcmlhdGlvbnN9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwcmVsb2FkTWF0ZXJpYWxzKHNjaGVtYTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9ucyhcclxuICAgICAgc2NoZW1hLCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVjb05vZGVzXHJcbiAgICAgICAgLmZpbHRlcihkID0+IChkLmdhbWVPYmplY3ROYW1lIHx8IGQubWF0ZXJpYWxVcmwpICYmIGQudHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbilcclxuICAgICAgICAubWFwKGQgPT4gZCksIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZUluc3RhbmNlRm9yQnVpbGQoXHJcbiAgICBzaG91bGRDb3B5SW5zdGFuY2U6IGJvb2xlYW4sXHJcbiAgICBsb2FkRnJvbVByb2plY3Q6IGJvb2xlYW4sXHJcbiAgICBsb29zZU9yaWdpbmFsQ29uZmlndXJhdGlvbjogYm9vbGVhbixcclxuICAgIHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdFxyXG4gICk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD4ge1xyXG4gICAgaWYgKHNob3VsZENvcHlJbnN0YW5jZSAmJiAhbG9hZEZyb21Qcm9qZWN0KSB7XHJcbiAgICAgIGNvbnN0IG9yaWdpbmFsSW5zdGFuY2VJZDogc3RyaW5nID0gcmVzdWx0Lmluc3RhbmNlSWQ7XHJcbiAgICAgIHJlc3VsdC5vcmlnaW5hbEl0ZW1JZCA9IG9yaWdpbmFsSW5zdGFuY2VJZDtcclxuICAgICAgaWYgKGxvb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuY29weUluc3RhbmNlQW5kTG9zZU9yaWdpbmFsQ29uZmlndXJhdGlvbihvcmlnaW5hbEluc3RhbmNlSWQsIHJlc3VsdClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxJbnN0YW5jZUlkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuY29weUluc3RhbmNlQW5kU2F2ZU9yaWdpbmFsQ29uZmlndXJhdGlvbihvcmlnaW5hbEluc3RhbmNlSWQsIHJlc3VsdClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxJbnN0YW5jZUlkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5BcnRpY2xlTm90Rm91bmQgJiYgIWxvYWRGcm9tUHJvamVjdCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnNldEluc3RhbmNlVG9Db25maWd1cmUocmVzdWx0KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIHJldHVybiBlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGdldFNlbGVjdGlvbnNBbmREZWNvcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbnNBbmREZWNvUHJvbWlzZTogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgc2VsZWN0aW9uc0FuZERlY29Qcm9taXNlLnB1c2godGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmdldFNlbGVjdGlvbnNBc3luYygpLCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZ2V0RGVjb3NBc3luYygpKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc2VsZWN0aW9uc0FuZERlY29Qcm9taXNlKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgRGVidWdVdGlscy5sb2coYEVycm9yIGdldHRpbmcgc2VsZWN0aW9ucyBhbmQgZGVjb3M6ICR7ZX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVQcmVwYXJlU2VsZWN0aW9uc0RlY29zKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmxlbmd0aCA8IDIpIHsgLy8gbm8gc2VsZWN0aW9ucywgb25seSBzZWxlY3Rpb24gb2YgdHlwZSAnQVJUJ1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5BcnRpY2xlTm90Rm91bmQgJiYgIXJlc3VsdC5vcmlnaW5hbEl0ZW1JZCkgeyAvLyBhcnRpY2xlIGZvdW5kLCBzbyBpbml0IHRoYXQgZmlyc3RcclxuICAgICAgICAgIHJlc3VsdC5vcmlnaW5hbEl0ZW1JZCA9IHJlc3VsdC5pbnN0YW5jZUlkO1xyXG4gICAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBudWxsO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnN0YW5jZVRvQ29uZmlndXJlKHJlc3VsdCk7XHJcbiAgICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTm9TZWxlY3Rpb25zO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUb0J1aWxkKHJlc3VsdCk7IC8vICdyZXN0YXJ0JyB0aGUgYnVpbGRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb25zQW5kRGVjb3NGcm9tTWV0YWRhdGEocmVzdWx0KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIERlYnVnVXRpbHMubG9nKGBFcnJvciBwcmVwYXJpbmcgc2VsZWN0aW9ucyBhbmQgZGVjb3M6ICR7ZX1gKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAgIHMuc2NoZW1hID0gcmVzdWx0LnNjaGVtYTtcclxuICAgICAgcy5pbnN0YW5jZUlkID0gcmVzdWx0Lmluc3RhbmNlSWQ7XHJcbiAgICB9KTsgLy8gYWRkIHNjaGVtYSBmb3IgbWF0ZXJpYWwgY3JlYXRpb25cclxuXHJcbiAgICAvLyBUT0RPIGFkZCB0aGlzIGZ1bmN0aW9uLCBpdCdzIHVzZWQgZm9yIEdUTSB0aGlzLmhhbmRsZVNlbGVjdGlvbnNSZWNlaXZlZChyZXN1bHQubWV0YURhdGEpO1xyXG4gICAgdGhpcy5saW5rU2VsZWN0aW9uc0FuZERlY29zKCk7XHJcbiAgICB0aGlzLnByZXBhcmVUaGVTZWxlY3Rpb25zKHJlc3VsdC5pbnN0YW5jZUlkKTtcclxuICB9XHJcblxyXG4gIC8vIFRPRE8gY2hlY2sgaWYgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uIGZvciBIYWJ1ZmFcclxuICAvLyBwcm90ZWN0ZWQgaGFuZGxlSW50ZWdyYXRpb25Db25uZWN0aW9ucyhpZDogc3RyaW5nLCBvYmplY3Q6IEl0ZW0pOiB2b2lkIHtcclxuICAvLyAgIGNvbnN0IHBhcnRzOiBGdXJuaXR1cmVQYXJ0SW50ZWdyYXRpb25bXSA9IFtdO1xyXG4gIC8vICAgY29uc3QgY2hpbGRQYXJ0czogT2JqZWN0M0RbXSA9IG9iamVjdC5jb25maWd1cmFibGUgPyBvYmplY3QuY2hpbGRyZW4gOiBbb2JqZWN0XTtcclxuICAvLyAgIGNvbnN0IGxlbjogbnVtYmVyID0gY2hpbGRQYXJ0cy5sZW5ndGg7XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgLy8gICAgIGNvbnN0IGNoaWxkOiBhbnkgPSA8Q3VzdG9tT2JqZWN0M0Q+Y2hpbGRQYXJ0c1tpXTtcclxuICAvLyAgICAgY29uc3QgY29ubmVjdGlvbjogRnVybml0dXJlUGFydEludGVncmF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRJbnRlZ3JhdGlvbigpO1xyXG4gIC8vICAgICBjb25zdCB2YXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAvLyAgICAgaWYgKGNoaWxkLnVzZXJEYXRhICYmIGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbiAmJiBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLklkID0gY2hpbGRQYXJ0cy5maW5kSW5kZXgoYyA9PiBjID09PSBjaGlsZCkudG9TdHJpbmcoKTtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gIC8vICAgICAgIGNvbm5lY3Rpb24uQnJhbmRJZGVudGlmaWVyID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5CcmFuZERlc2NyaXB0aW9uID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gIC8vICAgICAgIGNvbm5lY3Rpb24uUG9zaXRpb24gPSBjaGlsZC5wb3NpdGlvbjtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlJvdGF0aW9uID0gY2hpbGQucm90YXRpb247XHJcbiAgLy8gICAgICAgaWYgKGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zKSB7XHJcbiAgLy8gICAgICAgICBpZiAoY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IHZhcmlhdGlvbjogYW55ID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnNbMF07XHJcbiAgLy8gICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uID0gdmFyaWF0aW9uLmJyYW5kSWQ7XHJcbiAgLy8gICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24udmFyaWF0aW9uc1tqXTtcclxuICAvLyAgICAgICAgICAgICBjb25zdCB2YXJpYXRpb25QYXJ0OiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAvLyAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0LlZhcmlhdGlvbiA9IHZhcmlhdGlvbi5icmFuZElkO1xyXG4gIC8vICAgICAgICAgICAgIHZhcmlhdGlvblBhcnQuVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5NYXRlcmlhbElkID0gdmFyaWF0aW9uLm1hdGVyaWFsSWQ7XHJcbiAgLy8gICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5TdXBwbGllckFydGljbGVOciA9IHZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOcjtcclxuICAvLyAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0Lk9wdGlvbiA9IHZhcmlhdGlvbi5vcHRpb25UZXh0O1xyXG4gIC8vICAgICAgICAgICAgIHZhcmlhdGlvbnMucHVzaCh2YXJpYXRpb25QYXJ0KTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBjb25uZWN0aW9uLlZhcmlhdGlvbnMgPSB2YXJpYXRpb25zO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSBlbHNlIHsgLy8gYS1hcnRpa2VsXHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5JZCA9IGNoaWxkUGFydHMuZmluZEluZGV4KGMgPT4gYyA9PT0gY2hpbGQpLnRvU3RyaW5nKCk7XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5CcmFuZElkZW50aWZpZXIgPSBjaGlsZC5tZXRhZGF0YS5pdGVtSWRlbnRpZmllcjtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLkJyYW5kRGVzY3JpcHRpb24gPSBjaGlsZC5tZXRhZGF0YS5pdGVtTmFtZTtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlBvc2l0aW9uID0gY2hpbGQucG9zaXRpb247XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5Sb3RhdGlvbiA9IGNoaWxkLnJvdGF0aW9uO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGNvbnN0IGNvbm5lY3RvcnM6IEZ1cm5pdHVyZUNvbm5lY3RlZFBhcnRJbnRlZ3JhdGlvbltdID0gW107XHJcbiAgLy8gICAgIGNvbnN0IGNsZW46IG51bWJlciA9IGNoaWxkLmNoaWxkcmVuLmxlbmd0aDtcclxuICAvLyAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGVuOyBqKyspIHtcclxuICAvLyAgICAgICBjb25zdCBjb25uZWN0b3I6IGFueSA9IGNoaWxkLmNoaWxkcmVuW2pdO1xyXG4gIC8vICAgICAgIGlmICgoY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tT2JqZWN0M0QgfHwgY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tTWVzaCkgJiYgKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBjb25uOiBGdXJuaXR1cmVDb25uZWN0ZWRQYXJ0SW50ZWdyYXRpb24gPSBuZXcgRnVybml0dXJlQ29ubmVjdGVkUGFydEludGVncmF0aW9uKCk7XHJcbiAgLy8gICAgICAgICBjb25uLkNvbm5lY3Rpb25MYWJlbCA9IGNvbm5lY3Rvci5uYW1lO1xyXG4gIC8vICAgICAgICAgY29uc3QgZm9yZWlnblBhcnRJZHg6IG51bWJlciA9XHJcbiAgLy8gICAgICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuLmZpbmRJbmRleChjID0+IGMubmFtZSA9PT0gKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKTtcclxuICAvLyAgICAgICAgIGNvbm4uRm9yZWlnbkNvbm5lY3Rpb25MYWJlbCA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuW2ZvcmVpZ25QYXJ0SWR4XS51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICBjb25uLkZvcmVpZ25QYXJ0SWQgPSBmb3JlaWduUGFydElkeC50b1N0cmluZygpO1xyXG4gIC8vICAgICAgICAgY29ubi5Qb3NpdGlvbiA9IGNvbm5lY3Rvci5wb3NpdGlvbjtcclxuICAvLyAgICAgICAgIGNvbm4uUm90YXRpb24gPSBjb25uZWN0b3Iucm90YXRpb247XHJcbiAgLy8gICAgICAgICBjb25uZWN0b3JzLnB1c2goY29ubik7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGNvbm5lY3Rpb24uQ29ubmVjdGVkUGFydHMgPSBjb25uZWN0b3JzO1xyXG4gIC8vICAgICBwYXJ0cy5wdXNoKGNvbm5lY3Rpb24pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy51cHNlcnRGdXJuaXR1cmUoaWQsIHtQYXJ0czogcGFydHN9LCBvYmplY3QpO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIHByb3RlY3RlZCB1cHNlcnRGdXJuaXR1cmUoaWQ6IHN0cmluZywgb2JqZWN0OiBhbnksIGl0ZW06IEl0ZW0pOiB2b2lkIHtcclxuICAvLyAgIGlmICh0aGlzLl9pbnRlZ3JhdGlvbkVuYWJsZWQgJiYgIWl0ZW0ubWV0YWRhdGEub2Jzb2xldGUpIHtcclxuICAvLyAgICAgY29uc3QgaWR4OiBudW1iZXIgPSB0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucy5maW5kSW5kZXgoZiA9PiBmLklkID09PSBpZCk7XHJcbiAgLy8gICAgIGxldCBmdXJuaXR1cmU6IEZ1cm5pdHVyZUludGVncmF0aW9uO1xyXG4gIC8vICAgICBpZiAoaWR4IDwgMCkge1xyXG4gIC8vICAgICAgIC8vIGVtcHR5IGVudHJ5IGZvciBtcnAgY29kZSwgcmUtdXNlIHRoYXQgb25lXHJcbiAgLy8gICAgICAgaWYgKHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbMF0uSWQpIHtcclxuICAvLyAgICAgICAgIGZ1cm5pdHVyZSA9IHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zWzBdO1xyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICBmdXJuaXR1cmUgPSBuZXcgRnVybml0dXJlSW50ZWdyYXRpb24oKTtcclxuICAvLyAgICAgICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLnB1c2goZnVybml0dXJlKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgZnVybml0dXJlLklkID0gaWQ7XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgZnVybml0dXJlID0gdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbaWR4XTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBmdXJuaXR1cmUuTXJwQ29kZSA9IHRoaXMucGVybWFuZW50U3RvcmVTZXJ2aWNlLmNvZGU7XHJcbiAgLy8gICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xyXG4gIC8vICAgICAgIGlmIChmdXJuaXR1cmUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gIC8vICAgICAgICAgZnVybml0dXJlW2tleV0gPSBvYmplY3Rba2V5XTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIHByb3RlY3RlZCBnZW5lcmF0ZUxheWluZ1BhdHRlcm4oZmxvb3I6IEZsb29yUGxhbmVJdGVtLCBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybik6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgZmxvb3JQYXR0ZXJuSW5mbzogRmxvb3JQYXR0ZXJuSW5mbyA9IHRoaXMuZ2VuZXJhdGVGbG9vclBhdHRlcm5JbmZvKGZsb29yLCBmbG9vclBhdHRlcm4pO1xyXG4gIC8vICAgZmxvb3IucmVzdG9yZUZsb29yT2JqZWN0KCk7XHJcbiAgLy8gICBjb25zdCBtZXNoTGVmdCA9XHJcbiAgLy8gICAgIHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuY2hpbGRyZW4uZmluZChtID0+IG0ubmFtZSA9PT0gZmxvb3JQYXR0ZXJuSW5mby5tZXNoSWRMZWZ0KSBhcyBNZXNoO1xyXG4gIC8vICAgdGhpcy5ub3JtYWxpemVNZXNoKG1lc2hMZWZ0KTtcclxuICAvL1xyXG4gIC8vICAgbGV0IG1lc2hSaWdodDogTWVzaCA9IG51bGw7XHJcbiAgLy8gICBpZiAoZmxvb3JQYXR0ZXJuSW5mby5tZXNoSWRSaWdodCAhPT0gbnVsbCkge1xyXG4gIC8vICAgICBtZXNoUmlnaHQgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlLmNoaWxkcmVuLmZpbmQobSA9PiBtLm5hbWUgPT09IGZsb29yUGF0dGVybkluZm8ubWVzaElkUmlnaHQpIGFzIE1lc2g7XHJcbiAgLy8gICAgIHRoaXMubm9ybWFsaXplTWVzaChtZXNoUmlnaHQpO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBmbG9vclNpemU6IFZlY3RvcjMgPSBmbG9vci5zaXplO1xyXG4gIC8vICAgY29uc3QgcGxhbmtTaXplOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcclxuICAvL1xyXG4gIC8vICAgbWVzaExlZnQuZ2VvbWV0cnkuYm91bmRpbmdCb3guZ2V0U2l6ZShwbGFua1NpemUpO1xyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBpdGVtczogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtW10gPSB0aGlzLmZsb29yUGF0dGVyblNlcnZpY2UuZ2VuZXJhdGVQYXR0ZXJuKFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm5JbmZvLmZsb29yUGF0dGVybixcclxuICAvLyAgICAgcGxhbmtTaXplLFxyXG4gIC8vICAgICBmbG9vclNpemUsXHJcbiAgLy8gICAgIGZsb29yUGF0dGVybkluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uLFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm5JbmZvLmhlYXJ0TGluZVxyXG4gIC8vICAgKTtcclxuICAvL1xyXG4gIC8vICAgLy8gRGVidWdnaW5nIG9wdGlvblxyXG4gIC8vICAgLy8gdGhpcy5fZmxvb3JUaWxlSW50ZXJzZWN0aW9uU2VydmljZS50b2dnbGVEZWJ1ZygpO1xyXG4gIC8vICAgY29uc3QgZmxvb3JDb3VudFJlc3VsdDogRmxvb3JDb3VudFJlc3VsdCA9IHRoaXMuZmxvb3JUaWxlSW50ZXJzZWN0aW9uU2VydmljZS5jb3VudFRpbGVzKFxyXG4gIC8vICAgICBmbG9vci5mbG9vck1lc2gsXHJcbiAgLy8gICAgIGl0ZW1zLFxyXG4gIC8vICAgICBtZXNoTGVmdC5nZW9tZXRyeSxcclxuICAvLyAgICAgKG1lc2hSaWdodCkgPyBtZXNoUmlnaHQuZ2VvbWV0cnkgOiBudWxsLFxyXG4gIC8vICAgICB0cnVlXHJcbiAgLy8gICApO1xyXG4gIC8vXHJcbiAgLy8gICBmbG9vci5tZXRhZGF0YS5mbG9vckNvdW50UmVzdWx0ID0gZmxvb3JDb3VudFJlc3VsdDtcclxuICAvL1xyXG4gIC8vICAgY29uc3QgbGVmdEl0ZW1zOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSA9IG5ldyBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+KCk7XHJcbiAgLy8gICBjb25zdCByaWdodEl0ZW1zOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSA9IG5ldyBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+KCk7XHJcbiAgLy9cclxuICAvLyAgIGZvciAoY29uc3QgaXRlbSBvZiBmbG9vckNvdW50UmVzdWx0LmZpbHRlcmVkKSB7XHJcbiAgLy8gICAgIGlmIChpdGVtLmlzTGVmdCkge1xyXG4gIC8vICAgICAgIGxlZnRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIHJpZ2h0SXRlbXMucHVzaChpdGVtKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbltdID0gdGhpcy5zZWxlY3Rpb25zO1xyXG4gIC8vICAgbGV0IHZhcmlhdGlvbkdhbWVPYmplY3Q6IHN0cmluZztcclxuICAvLyAgIGZvciAoY29uc3Qgc2VsZWN0aW9uS2V5IG9mIHNlbGVjdGlvbikge1xyXG4gIC8vICAgICBpZiAoc2VsZWN0aW9uS2V5LmVsZW1lbnRUeXBlID09PSAndmFyaWF0aW9uJykge1xyXG4gIC8vICAgICAgIHZhcmlhdGlvbkdhbWVPYmplY3QgPSBzZWxlY3Rpb25LZXkuZ2FtZU9iamVjdDtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBsZXQgZmxvb3JWYXJpYXRpb25NYXRlcmlhbDogYW55O1xyXG4gIC8vICAgaWYgKHZhcmlhdGlvbkdhbWVPYmplY3QgIT09IG51bGwpIHtcclxuICAvLyAgICAgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb25Gb3JNYXRlcmlhbCh0aGlzLmFydGljbGVBc3NldFBhdGgsIHZhcmlhdGlvbkdhbWVPYmplY3QsIGZsb29yLm1ldGFkYXRhLnNjaGVtYSkudGhlbihyZXN1bHQgPT4ge1xyXG4gIC8vICAgICAgIGZsb29yVmFyaWF0aW9uTWF0ZXJpYWwgPSByZXN1bHQ7XHJcbiAgLy8gICAgICAgY29uc3QgdGV4dHVyZTogVGV4dHVyZSA9IGZsb29yVmFyaWF0aW9uTWF0ZXJpYWwubWFwO1xyXG4gIC8vICAgICAgIGlmIChmbG9vclBhdHRlcm5JbmZvLmZsb29yUGF0dGVybkRpcmVjdGlvbiA9PT0gRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HKSB7XHJcbiAgLy8gICAgICAgICB0ZXh0dXJlLnJvdGF0aW9uID0gTWF0aC5QSSAvIDI7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHRleHR1cmUucm90YXRpb24gPSAwO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBjb25zdCBtZXNoTGVmdE1hdGVyaWFsOiBNYXRlcmlhbCB8IE1hdGVyaWFsW10gPSBtZXNoTGVmdC5tYXRlcmlhbDtcclxuICAvLyAgICAgICBjb25zdCBwbGFua01hdGVyaWFsID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKHtcclxuICAvLyAgICAgICAgIGNvbG9yOiAweEZGMDAwMCxcclxuICAvLyAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gIC8vICAgICAgICAgb3BhY2l0eTogMC44XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy9cclxuICAvLyAgICAgICBjb25zdCBwbGFua3NMZWZ0ID1cclxuICAvLyAgICAgICAgIHRoaXMuaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0obWVzaExlZnQuZ2VvbWV0cnksIGxlZnRJdGVtcywgcGxhbmtNYXRlcmlhbCk7XHJcbiAgLy8gICAgICAgbGV0IHBsYW5rc1JpZ2h0OiBJbnN0YW5jZWRNZXNoO1xyXG4gIC8vICAgICAgIGlmIChtZXNoUmlnaHQpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IG1lc2hSaWdodE1hdGVyaWFsOiBNYXRlcmlhbCB8IE1hdGVyaWFsW10gPSBtZXNoUmlnaHQubWF0ZXJpYWw7XHJcbiAgLy8gICAgICAgICBwbGFua3NSaWdodCA9IHRoaXMuaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0obWVzaFJpZ2h0Lmdlb21ldHJ5LCByaWdodEl0ZW1zLCBwbGFua01hdGVyaWFsKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgY29uc3QgY3VzdG9tRmxvb3JXcmFwcGVyID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgLy8gICAgICAgY3VzdG9tRmxvb3JXcmFwcGVyLmFkZChwbGFua3NMZWZ0KTtcclxuICAvLyAgICAgICBpZiAocGxhbmtzUmlnaHQpIHtcclxuICAvLyAgICAgICAgIGN1c3RvbUZsb29yV3JhcHBlci5hZGQocGxhbmtzUmlnaHQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmbG9vci5mbG9vck9iamVjdCA9IGN1c3RvbUZsb29yV3JhcHBlcjtcclxuICAvLyAgICAgICB0aGlzLmZsb29yU2VydmljZS5jb25maWd1cmFibGVGbG9vciA9IGN1c3RvbUZsb29yV3JhcHBlcjtcclxuICAvL1xyXG4gIC8vICAgICAgIC8vIE5vdyB3ZSB1cGRhdGUgdGhlIGRlZmF1bHQgZmxvb3JwbGFuZSB3aXRoIHRoZSBtZXNoXHJcbiAgLy8gICAgICAgZmxvb3IuZmxvb3JNYXRlcmlhbCA9IGZsb29yVmFyaWF0aW9uTWF0ZXJpYWw7XHJcbiAgLy8gICAgICAgdGhpcy5zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gIC8vICAgICAgIC8vIEVtaXQgdXBkYXRlIHRvZ2dsZUZsb29yRnJhbWUgZXZlbnQuXHJcbiAgLy8gICAgICAgdGhpcy5tZXNzYWdlQnVzLmVtaXQoTWVzc2FnZVR5cGUuRmxvb3JSZWJ1aWxkKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwcm90ZWN0ZWQgaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0oXHJcbiAgLy8gICBnZW9tOiBCdWZmZXJHZW9tZXRyeSxcclxuICAvLyAgIHBhdHRlcm46IEFycmF5PEZsb29yUGF0dGVyblRyYW5zZm9ybT4sXHJcbiAgLy8gICBtYXRlcmlhbDogTWF0ZXJpYWwgfCBNYXRlcmlhbFtdXHJcbiAgLy8gKSB7XHJcbiAgLy8gICBpZiAocGF0dGVybi5sZW5ndGggPD0gMCkge1xyXG4gIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IHRhcmdldFBsYW5rTWVzaCA9IG5ldyBJbnN0YW5jZWRNZXNoKGdlb20sIG1hdGVyaWFsLCBwYXR0ZXJuLmxlbmd0aCk7XHJcbiAgLy8gICBjb25zdCBkdW1teSA9IG5ldyBPYmplY3QzRCgpO1xyXG4gIC8vICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgY29uc3QgaXRlbTogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtID0gcGF0dGVybltpXTtcclxuICAvLyAgICAgY29uc3QgcG9zaXRpb246IFZlY3RvcjMgPSBpdGVtLnBvc2l0aW9uO1xyXG4gIC8vICAgICBwb3NpdGlvbi55ID0gMC4wMjtcclxuICAvLyAgICAgY29uc3Qgcm90YXRpb246IFZlY3RvcjMgPSBpdGVtLnJvdGF0aW9uO1xyXG4gIC8vICAgICBkdW1teS5wb3NpdGlvbi5zZXQocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7XHJcbiAgLy8gICAgIGR1bW15LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcclxuICAvLyAgICAgZHVtbXkudXBkYXRlTWF0cml4KCk7XHJcbiAgLy9cclxuICAvLyAgICAgdGFyZ2V0UGxhbmtNZXNoLnNldE1hdHJpeEF0KGksIGR1bW15Lm1hdHJpeCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gdGFyZ2V0UGxhbmtNZXNoO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJvdGVjdGVkIGdlbmVyYXRlRmxvb3JQYXR0ZXJuSW5mbyhpdGVtOiBJdGVtLCBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybik6IEZsb29yUGF0dGVybkluZm8ge1xyXG4gIC8vICAgdGhpcy5nZW5lcmF0ZVNlbGVjdGVkSW5NZXRhZGF0YShpdGVtKTtcclxuICAvLyAgIGNvbnN0IGluZm86IEZsb29yUGF0dGVybkluZm8gPSB7XHJcbiAgLy8gICAgIG1lc2hJZExlZnQ6IG51bGwsXHJcbiAgLy8gICAgIG1lc2hJZFJpZ2h0OiBudWxsLFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybi5OT1JNQUwsXHJcbiAgLy8gICAgIGZsb29yUGF0dGVybkRpcmVjdGlvbjogRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HLFxyXG4gIC8vICAgICBoZWFydExpbmU6IDBcclxuICAvLyAgIH07XHJcbiAgLy9cclxuICAvLyAgIGxldCBmbG9vckdhbWVPYmplY3Q6IHN0cmluZztcclxuICAvLyAgIGZvciAoY29uc3Qgc2VsZWN0aW9uS2V5IG9mIHRoaXMuc2VsZWN0aW9ucykge1xyXG4gIC8vICAgICBpZiAoc2VsZWN0aW9uS2V5Lm5vZGVUeXBlID09PSAnQVJUJykge1xyXG4gIC8vICAgICAgIGZsb29yR2FtZU9iamVjdCA9IHNlbGVjdGlvbktleS5nYW1lT2JqZWN0O1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy9cclxuICAvLyAgIGluZm8uaGVhcnRMaW5lID0gTnVtYmVyKHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yQ2VudGVyTGluZVhBeGlzKTtcclxuICAvLyAgIC8vIFRPRE8gY29udmVydCBmbG9vclBhdHRlcm5EaXJlY3Rpb24gdG8gdHlwZSBudW1iZXIgdG8gbGV0IHRoZSB1c2VyIHVzZSBjdXN0b20gcm90YXRpb24sIGZvciBub3cgdGhlcmUgYXJlIG9ubHkgMiBvcHRpb25zIGJhc2VkIG9uIGVudW1cclxuICAvLyAgIGlmICh0aGlzLmZsb29yU2VydmljZS5mbG9vclJvdGF0aW9uID09PSAwKSB7XHJcbiAgLy8gICAgIGluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uID0gRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm5EaXJlY3Rpb24gPSBGbG9vclBhdHRlcm5EaXJlY3Rpb24uU1RBTkRJTkc7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpbmZvLmZsb29yUGF0dGVybiA9IGZsb29yUGF0dGVybjtcclxuICAvLyAgIGluZm8ubWVzaElkTGVmdCA9IGZsb29yR2FtZU9iamVjdDtcclxuICAvLyAgIGlmIChpbmZvLmZsb29yUGF0dGVybiA9PT0gRmxvb3JQYXR0ZXJuLkhPTjQ1IHx8IGluZm8uZmxvb3JQYXR0ZXJuID09PSBGbG9vclBhdHRlcm4uSE9ONjApIHtcclxuICAvLyAgICAgaW5mby5tZXNoSWRSaWdodCA9IGByXyR7Zmxvb3JHYW1lT2JqZWN0fWA7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoaW5mby5mbG9vclBhdHRlcm4gPT09IEZsb29yUGF0dGVybi5IRVJSSU5HQk9ORSkge1xyXG4gIC8vICAgICBpbmZvLm1lc2hJZFJpZ2h0ID0gaW5mby5tZXNoSWRMZWZ0O1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyBjb25zdCBhZm1ldGluZyA9IHNlbGVjdGVkLmZpbmQocyA9PiBzLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkgPT09ICdwbGFuayBhZm1ldGluZycpO1xyXG4gIC8vIGxldCBhZm1ldGluZ1N0cmluZzogc3RyaW5nID0gYWZtZXRpbmcuYW5zd2VyLnRvTG93ZXJDYXNlKCk7XHJcbiAgLy8gYWZtZXRpbmdTdHJpbmcgPSBhZm1ldGluZ1N0cmluZy5zdWJzdHIoYWZtZXRpbmdTdHJpbmcubGFzdEluZGV4T2YoJyAnKSArIDEpO1xyXG4gIC8vIGNvbnN0IGxlZ1BhdHJvb25BbnN3ZXIgPSBzZWxlY3RlZC5maW5kKHMgPT4gcy5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpID09PSAnbGVnIHBhdHJvb24nKS5hbnN3ZXIudG9Mb3dlckNhc2UoKTtcclxuICAvLyBsZXQgbGVnUGF0cm9vblN0cmluZyA9ICcnO1xyXG4gIC8vIGNvbnN0IGhhcnRsaW5lVHlwZSA9IHNlbGVjdGVkLmZpbmQocyA9PiBzLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkgPT09ICdoYXJ0bGlqbicpO1xyXG4gIC8vXHJcbiAgLy8gaWYgKGhhcnRsaW5lVHlwZSAmJiBoYXJ0bGluZVR5cGUuYW5zd2VyLnRvTG93ZXJDYXNlKCkgPT09ICdhYW5nZXBhc3QnKSB7XHJcbiAgLy8gICBjb25zdCBoYXJ0bGluZVZhbHVlID0gc2VsZWN0ZWQuZmluZChzID0+IHMucXVlc3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2hhcnRsaWpuX2FhbmdlcGFzdCcpO1xyXG4gIC8vICAgaWYgKGhhcnRsaW5lVmFsdWUgJiYgaGFydGxpbmVWYWx1ZS51c2VySW5wdXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICAgIGluZm8uaGVhcnRMaW5lID0gTnVtYmVyKGhhcnRsaW5lVmFsdWUudXNlcklucHV0VmFsdWUpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vXHJcbiAgLy8gc3dpdGNoICh0cnVlKSB7XHJcbiAgLy8gICBjYXNlIGxlZ1BhdHJvb25BbnN3ZXIuaW5kZXhPZigncmVjaHQnKSAhPT0gLTE6XHJcbiAgLy8gICAgIGxlZ1BhdHJvb25TdHJpbmcgPSAnOTAnO1xyXG4gIC8vICAgICBpbmZvLmZsb29yUGF0dGVybiA9IEZsb29yUGF0dGVybi5OT1JNQUw7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJ2dyYWF0JykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzkwJztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSEVSUklOR0JPTkU7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJzYwJykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzYwJztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSE9ONjA7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJzQ1JykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzQ1JztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSE9ONDU7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGluZm8ubWVzaElkTGVmdCA9IGAke2FmbWV0aW5nU3RyaW5nfV8ke2xlZ1BhdHJvb25TdHJpbmd9YDtcclxuICAvLyBpZiAoIGluZm8uZmxvb3JQYXR0ZXJuID09PSBGbG9vclBhdHRlcm4uSE9ONDUgfHwgaW5mby5mbG9vclBhdHRlcm4gPT09IEZsb29yUGF0dGVybi5IT042MCkge1xyXG4gIC8vICAgaW5mby5tZXNoSWRSaWdodCA9IGByXyR7YWZtZXRpbmdTdHJpbmd9XyR7bGVnUGF0cm9vblN0cmluZ31gO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGlmIChpbmZvLmZsb29yUGF0dGVybiA9PT0gRmxvb3JQYXR0ZXJuLkhFUlJJTkdCT05FKSB7XHJcbiAgLy8gICBpbmZvLm1lc2hJZFJpZ2h0ID0gaW5mby5tZXNoSWRMZWZ0O1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGNvbnN0IGxlZ1JpY2h0aW5nQW5zd2VyID0gc2VsZWN0ZWQuZmluZChzID0+IHMucXVlc3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2xlZyByaWNodGluZycpLmFuc3dlci50b0xvd2VyQ2FzZSgpO1xyXG4gIC8vIGluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uID1cclxuICAvLyAobGVnUmljaHRpbmdBbnN3ZXIuaW5kZXhPZigndmVydGljYWFsJykgIT09IC0xKSA/IEZsb29yUGF0dGVybkRpcmVjdGlvbi5TVEFORElORyA6IEZsb29yUGF0dGVybkRpcmVjdGlvbi5MWUlORztcclxuXHJcbiAgLy8gICByZXR1cm4gaW5mbztcclxuICAvLyB9XHJcblxyXG4gIC8vIHByb3RlY3RlZCBnZW5lcmF0ZVNlbGVjdGVkSW5NZXRhZGF0YShpdGVtOiBJdGVtKTogdm9pZCB7XHJcbiAgLy8gICBjb25zdCBjbG9uZVNlbGVjdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0aW9ucykpO1xyXG4gIC8vICAgY2xvbmVTZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgLy8gICAgIHMuaW1hZ2VEYXRhID0gdW5kZWZpbmVkO1xyXG4gIC8vICAgICBzLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSB1bmRlZmluZWQ7XHJcbiAgLy8gICAgIGlmIChzLmFkZGFibGVzKSB7XHJcbiAgLy8gICAgICAgcy5hZGRhYmxlcy5mb3JFYWNoKGEgPT4ge1xyXG4gIC8vICAgICAgICAgYS5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vICAgaXRlbS5tZXRhZGF0YS5kZWNvcyA9IEFycmF5LmZyb20odGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcyk7XHJcbiAgLy8gICBpdGVtLm1ldGFkYXRhLnNlbGVjdGlvbnMgPSBjbG9uZVNlbGVjdGlvbnM7XHJcbiAgLy8gfVxyXG5cclxuICBwcm90ZWN0ZWQgbm9ybWFsaXplTWVzaChtZXNoOiBNZXNoKSB7XHJcbiAgICBjb25zdCBtZXNoU2l6ZSA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICBtZXNoLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG4gICAgbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveC5nZXRTaXplKG1lc2hTaXplKTtcclxuICAgIGlmIChtZXNoU2l6ZS56ID4gbWVzaFNpemUueCkge1xyXG4gICAgICBtZXNoLmdlb21ldHJ5LnJvdGF0ZVkoTWF0aC5QSSAvIDIpO1xyXG4gICAgfVxyXG4gICAgbWVzaC5nZW9tZXRyeS5jZW50ZXIoKTtcclxuICAgIG1lc2guZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgICBjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xyXG4gICAgbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveC5nZXRDZW50ZXIoY2VudGVyKTtcclxuICAgIG1lc2gucG9zaXRpb24uY29weShjZW50ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNldEluc3RhbmNlVG9Db25maWd1cmUocmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PiB7XHJcbiAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuVGltZW91dCkge1xyXG4gICAgICBpZiAocmVzdWx0Lmluc3RhbmNlSWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0SW5zdGFuY2UocmVzdWx0Lmluc3RhbmNlSWQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgQ29uZmlndXJhdG9yRXJyb3JNZXNzYWdlKGUpKTtcclxuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UocmVzdWx0Lmdvb2RJZCwgdHJ1ZSlcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBDb25maWd1cmF0b3JFcnJvck1lc3NhZ2UoZSkpO1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gdGltZW91dCAvIHVuYWJsZSB0byBzZXQgaW5zdGFuY2VpZFxyXG4gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgQ29uZmlndXJhdG9yRXJyb3JNZXNzYWdlKCdFUlJPUl9TRVRUSU5HX0lOU1RBTkNFX0lEJykpO1xyXG4gICAgICAgICAgUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnNldEluc3RhbmNlKHJlc3VsdC5pbnN0YW5jZUlkKVxyXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IENvbmZpZ3VyYXRvckVycm9yTWVzc2FnZShlKSk7XHJcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0U2VsZWN0aW9uc0FuZERlY29zRnJvbU1ldGFkYXRhKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IHZvaWQge1xyXG4gICAgaWYgKHJlc3VsdC5zZWxlY3Rpb25zICYmIHJlc3VsdC5kZWNvcykge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0U2VsZWN0aW9ucyhyZXN1bHQuc2VsZWN0aW9ucyk7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZXREZWNvTm9kZXMoQXJyYXkuZnJvbShyZXN1bHQuZGVjb3MudmFsdWVzKCkpKTtcclxuICAgICAgcmVzdWx0Lm9ic29sZXRlID0gdHJ1ZTtcclxuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25Ob3RGaXhlZCkge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5PYnNvbGV0ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmxlbmd0aCA8IDIgfHwgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBDb25maWd1cmF0b3JFcnJvck1lc3NhZ2UoJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJykpO1xyXG4gICAgICB9XHJcbiAgICAgIHRocm93IHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzZWxlY3Rpb25QdWJsaXNoZWQoc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoKHNlbGVjdGlvbi5oaWVyYXJjaGljYWxQdWJsaWNhdGlvbkNvZGUgPT09IG51bGwpIHx8ICgoc2VsZWN0aW9uLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIDIpID4gMCkpICYmXHJcbiAgICAgIChcclxuICAgICAgICAoc2VsZWN0aW9uLm5vZGVUeXBlID09PSBOb2RlVHlwZS5RdWVzdGlvbiAmJlxyXG4gICAgICAgICAgKCgoc2VsZWN0aW9uLnF1ZXN0aW9uUHVibGljYXRpb25Db2RlICYgMikgPiAwKSB8fFxyXG4gICAgICAgICAgICBzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUgPT09IG51bGwgfHwgc2VsZWN0aW9uLnF1ZXN0aW9uUHVibGljYXRpb25Db2RlID09PSB1bmRlZmluZWQpKSB8fFxyXG4gICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJlxyXG4gICAgICAgICAgKCgoc2VsZWN0aW9uLmFuc3dlclB1YmxpY2F0aW9uQ29kZSAmIDIpID4gMCkgfHxcclxuICAgICAgICAgICAgc2VsZWN0aW9uLmFuc3dlclB1YmxpY2F0aW9uQ29kZSA9PT0gbnVsbCB8fCBzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlID09PSB1bmRlZmluZWQpKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNsZWFudXBCZWZvcmVQcmVzZXRMb2FkKCk6IHZvaWQge1xyXG4gICAgTWF0ZXJpYWxVdGlscy5DbGVhckNhY2hlcygpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAqIENsZWFyIHZhcmlhYmxlcyB0byBsZXQgb2JqZWN0cyBiZWluZyBkaXNwb3NlZCBwcm9wZXJseVxyXG4gICovXHJcbiAgcHJvdGVjdGVkIGhhbmRsZUFmdGVyUHJlc2V0TG9hZCgpOiB2b2lkIHtcclxuICAgIC8vIG1ha2Ugc3VyZSBub3RoaW5nIGlzIGtlZXBpbmcgYSBsb2NrXHJcbiAgICB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0SW5zdGFuY2UobnVsbCk7XHJcbiAgICAvLyBjbGVhblxyXG4gICAgdGhpcy5jbGVhbnVwKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYW51cCgpOiB2b2lkIHtcclxuICAgIE9iamVjdFV0aWxzLkRpc3Bvc2VPYmplY3QodGhpcy5mdWxsM0RPYmplY3RUb1VzZSk7XHJcbiAgICB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgICBPYmplY3RVdGlscy5EaXNwb3NlT2JqZWN0KHRoaXMuX2FjdGl2ZUNoaWxkRWxlbWVudCk7XHJcbiAgICB0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnBsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fYWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2FuQ29ubmVjdFNlbGVjdGlvbnMoc2VsMTogU2VsZWN0aW9uLCBzZWwyOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIGlmICghc2VsMS5kZWNvTm9kZSB8fCAhc2VsMi5kZWNvTm9kZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgY2FuQ29ubmVjdDogYm9vbGVhbiA9IHNlbDIuZGVjb05vZGUudHlwZSAhPT0gRGVjb05vZGVUeXBlLlBhcnQ7XHJcbiAgICBpZiAoIWNhbkNvbm5lY3QpIHtcclxuICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMubGVuZ3RoO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbGVuaTogbnVtYmVyID0gc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGVuaTsgaWkrKykge1xyXG4gICAgICAgICAgY2FuQ29ubmVjdCA9IFNjZW5lM0RVdGlsLkNhblNlbGVjdG9yQ29ubmVjdChzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMsIHNlbDEuZGVjb05vZGUuY29ubmVjdG9yc1tpXSwgc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzW2lpXSk7XHJcbiAgICAgICAgICBpZiAoY2FuQ29ubmVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhbkNvbm5lY3Q7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlQW5zd2VyU2VsZWN0ZWQoYW5zd2VyOiBBbnN3ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fuc3dlclNlbGVjdGVkLnB1c2goYW5zd2VyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVTZWxlY3Rpb25TZWxlY3RlZChjaG9zZW5PcHRpb246IFNlbGVjdG9yU3RydWN0dXJlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zU2VsZWN0ZWQucHVzaChjaG9zZW5PcHRpb24ub3B2VHJlZU5vZGVIaWVyYXJjaHkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbmZpZ3VyYWJsZUl0ZW0oaXRlbU5hbWU6IHN0cmluZyk6IE9iamVjdDNEIHtcclxuICAgIGNvbnN0IGl0ZW06IE9iamVjdDNEID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICBpdGVtLm5hbWUgPSBpdGVtTmFtZSArICdfY2xvbmUnO1xyXG4gICAgaXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIC8vIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvbkFuaW1hdGlvbihvYmplY3Q6IE9iamVjdDNELCBmcm9tOiBWZWN0b3IzLCB0bzogVmVjdG9yMywgZWFzaW5nOiBUV0VFTi5FYXNpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIGNvbnN0IHR3ZWVuRnJvbTogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCkuY29weShmcm9tKTtcclxuICAvLyAgIGNvbnN0IHR3ZWVuID0gbmV3IFRXRUVOLlR3ZWVuKHR3ZWVuRnJvbSlcclxuICAvLyAgICAgLnRvKHRvLCAxMDAwKVxyXG4gIC8vICAgICAuZWFzaW5nKGVhc2luZylcclxuICAvLyAgICAgLm9uVXBkYXRlKCgpID0+IHtcclxuICAvLyAgICAgICBvYmplY3QucG9zaXRpb24uY29weSh0d2VlbkZyb20pO1xyXG4gIC8vICAgICAgIHRoaXMuc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICAvLyBAdHMtaWdub3JlXHJcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB0d2Vlbi5vbkNvbXBsZXRlKHJlc29sdmUuYmluZCh0aGlzLCB0d2VlbikpLm9uU3RvcChyZWplY3QpLnN0YXJ0KCkpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJvdGVjdGVkIGFzeW5jIGFuaW1hdGVDaGFuZ2VzKGZ1cm5pdHVyZTogSXRlbSwgY2hhbmdlczogQ2hhbmdlc0ludGVyZmFjZVtdKTogUHJvbWlzZTx2b2lkW10+IHtcclxuICAvLyAgIC8vIGl0J3MgY2hyaXN0bWFzc3NcclxuICAvLyAgIGNvbnN0IGFuaW1hdGlvbnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xyXG4gIC8vICAgaWYgKGZ1cm5pdHVyZSBpbnN0YW5jZW9mIEN1c3RvbUZsb29ySXRlbSkge1xyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgLy8gICAgICAgY29uc3QgZWFzaW5nOiBUV0VFTi5FYXNpbmcgPSAhY2hhbmdlc1tpXS5vbGRQb3NpdGlvbiA/IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5PdXQgOlxyXG4gIC8vICAgICAgICAgKCFjaGFuZ2VzW2ldLm5ld1Bvc2l0aW9uID8gVFdFRU4uRWFzaW5nLkV4cG9uZW50aWFsLk91dCA6IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5Jbk91dCk7XHJcbiAgLy8gICAgICAgY29uc3QgZnJvbTogVmVjdG9yMyA9XHJcbiAgLy8gICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgLy8gICAgICAgICBjaGFuZ2VzW2ldLm9sZFBvc2l0aW9uID8gbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ub2xkUG9zaXRpb24pIDogbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ubmV3UG9zaXRpb24pLnNldFkoMTApO1xyXG4gIC8vICAgICAgIGNvbnN0IHRvOiBWZWN0b3IzID1cclxuICAvLyAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAvLyAgICAgICAgIGNoYW5nZXNbaV0ubmV3UG9zaXRpb24gPyBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5uZXdQb3NpdGlvbikgOiBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5vbGRQb3NpdGlvbikuc2V0WSgxMCk7XHJcbiAgLy8gICAgICAgY29uc3Qgb2JqOiBPYmplY3QzRCA9IGZ1cm5pdHVyZS5nZXRPYmplY3RCeU5hbWUoY2hhbmdlc1tpXS5uYW1lKTtcclxuICAvLyAgICAgICBpZiAoIWZyb20uZXF1YWxzKHRvKSkge1xyXG4gIC8vICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKFxyXG4gIC8vICAgICAgICAgICB0aGlzLmNyZWF0ZVBvc2l0aW9uQW5pbWF0aW9uKG9iaiwgZnJvbSwgdG8sIGVhc2luZylcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoYW5pbWF0aW9ucyk7XHJcbiAgLy8gfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xvbmVTZWxlY3Rpb25zKCk6IFNlbGVjdGlvbltdIHtcclxuICAgIGNvbnN0IGNsb25lU2VsZWN0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3Rpb25zKSk7XHJcbiAgICBjbG9uZVNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHMuaW1hZ2VEYXRhTGFzdEFuc3dlciA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHMuYWRkYWJsZXMpIHtcclxuICAgICAgICBzLmFkZGFibGVzLmZvckVhY2goYSA9PiB7XHJcbiAgICAgICAgICBhLmltYWdlRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY2xvbmVTZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZUJ1aWxkT2JqZWN0KG5ld0l0ZW06IE9iamVjdDNELCByZXN1bHRPYmplY3Q6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+IHtcclxuICAgIGNvbnN0IGNsb25lU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSB0aGlzLmNsb25lU2VsZWN0aW9ucygpO1xyXG4gICAgbmV3SXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIG5ld0l0ZW0ubmFtZSA9IHJlc3VsdE9iamVjdC5hcnRpY2xlTmFtZTtcclxuICAgIG5ld0l0ZW0udXNlckRhdGEucm9vdE9iamVjdCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHJlc3VsdE9iamVjdC5wb3NpdGlvbikge1xyXG4gICAgICBuZXdJdGVtLnBvc2l0aW9uLmNvcHkocmVzdWx0T2JqZWN0LnBvc2l0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIFRPRE8gYXNrIHdoeSBpdCBjb3VsZCBhbHNvIGJlIGFuIG51bWJlclxyXG4gICAgaWYgKHJlc3VsdE9iamVjdC5yb3RhdGlvbiAmJiByZXN1bHRPYmplY3Qucm90YXRpb24gaW5zdGFuY2VvZiBFdWxlcikge1xyXG4gICAgICBuZXdJdGVtLnJvdGF0aW9uLmNvcHkocmVzdWx0T2JqZWN0LnJvdGF0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqZWN0LmRlZmF1bHQxODAgJiYgIXJlc3VsdE9iamVjdC5yb3RhdGlvbikge1xyXG4gICAgICBuZXdJdGVtLnJvdGF0aW9uLnNldCh0aGlzLmRlZmF1bHRSb3RhdGlvbi54LCB0aGlzLmRlZmF1bHRSb3RhdGlvbi55LCB0aGlzLmRlZmF1bHRSb3RhdGlvbi56KTtcclxuICAgICAgbmV3SXRlbS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXN1bHRPYmplY3Qub2JqZWN0ID0gbmV3SXRlbTtcclxuICAgIHJlc3VsdE9iamVjdC5zZWxlY3Rpb25zID0gY2xvbmVTZWxlY3Rpb25zO1xyXG4gICAgcmVzdWx0T2JqZWN0LmRlY29zID0gQXJyYXkuZnJvbSh0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVjb05vZGVzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0T2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTW92ZWFibGVPYmplY3Qob2JqOiBPYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG9iai51c2VyRGF0YSAmJiBvYmoudXNlckRhdGEuc2VsZWN0aW9uICYmIG9iai51c2VyRGF0YS5zZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9PT0gSGRlY29Qb3NpdGlvbmluZy5WYXJpYWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBhZGRFbGVtZW50T25Db25uZWN0b3IoY3VycmVudEl0ZW06IE9iamVjdDNELCBlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcsIGNvbm5lY3RlZE5vZGVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGRvIHNvbWV0aGluZywgYnV0IG5vdCBzdXJlIHdoYXRcclxuXHJcbiAgICAvLyBjb25zdCBjb25uZWN0b3JGcm9tRWxlbWVudCA9IGN1cnJlbnRJdGVtLmNvbm5lY3RvckZyb21FbGVtZW50KGVsZW1lbnQudXNlckRhdGEuc2VsZWN0aW9uKTtcclxuICAgIC8vIGNvbnN0IGlkRnJvbUJhc2VFbGVtZW50OiBudW1iZXIgPSBjb25uZWN0ZWROb2RlSWQgPyBjb25uZWN0ZWROb2RlSWQgOiBjb25uZWN0b3JGcm9tRWxlbWVudC5jb25uZWN0ZWROb2RlSWQ7XHJcbiAgICAvLyBjb25zdCBiYXNlRWxlbWVudDogT2JqZWN0M0RbXSA9IGN1cnJlbnRJdGVtLmdldE9iamVjdHNCeVVzZXJEYXRhUHJvcCgnc2VsZWN0aW9uJywgJ25vZGVJZCcsIGlkRnJvbUJhc2VFbGVtZW50KTtcclxuICAgIC8vXHJcbiAgICAvLyBjb25zdCBpdGVtOiBJdGVtID0gT2JqZWN0VXRpbHMuR2V0UGFyZW50SXRlbShlbGVtZW50KTtcclxuICAgIC8vIGlmIChpdGVtKSB7XHJcbiAgICAvLyAgIGNvbnN0IGNvbm46IHN0cmluZyA9XHJcbiAgICAvLyAgICAgYXdhaXQgdGhpcy5lbGVtZW50U2VydmljZS5wbGFjZUVsZW1lbnRPbkNvbm5lY3RvcihcclxuICAgIC8vICAgICAgIGl0ZW0ubWV0YWRhdGEuaXRlbUlkLFxyXG4gICAgLy8gICAgICAgZWxlbWVudCxcclxuICAgIC8vICAgICAgIGJhc2VFbGVtZW50Lmxlbmd0aCA+IDAgPyBiYXNlRWxlbWVudFswXSA6IG51bGwsXHJcbiAgICAvLyAgICAgICBmYWxzZSxcclxuICAgIC8vICAgICAgIGNvbm5lY3RvcixcclxuICAgIC8vICAgICAgIGZhbHNlXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vICAgdGhpcy5zYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LCBjb25uKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudXNlckRhdGEgJiYgZWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgIC8vICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAudXBkYXRlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LnVzZXJEYXRhLnNlbGVjdGlvbiwgY29ubmVjdG9yLCB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRJZGVudGlmaWVyRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7c2VsZWN0aW9uLmRlY29Ob2RlID8gc2VsZWN0aW9uLmRlY29Ob2RlLm5vZGVJZCArICdfJyA6ICcnfSR7c2VsZWN0aW9uLm5vZGVJZH1gO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9hZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgLy8gdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgIC8vIHRvZG86IGNoZWNrIHRoaXNcclxuICAgIC8vIHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnJlbW92ZUVsZW1lbnQodGhpcy5hY3RpdmVJbnN0YW5jZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBtYXRlcmlhbElkIG9mIHRoZSBwYXJlbnQgdXAgdGhlIHRyZWUgdW50aWwgcHJlc2VudGlvbmxldmVsIDEgaXMgcmVhY2hlZFxyXG4gICAqIEBwYXJhbSBpZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGdldE1hdGVyaWFsSWRGcm9tUGFyZW50KGlkOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWR4OiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMuZmluZEluZGV4KHMgPT4gcy5ub2RlID09PSBpZCk7XHJcbiAgICBsZXQgY3VycmVudExldmVsOiBudW1iZXIgPSA5OTk7XHJcbiAgICBpZiAoaWR4ID4gLTEpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IGlkeDsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1tpXTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID49IGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1cnJlbnRMZXZlbCA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmhkZWNvR2FtZU9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFkanVzdGFibGVzKGNoZWNrR2FtZU9iamVjdDogYm9vbGVhbiA9IHRydWUsIGNoZWNrVHlwZTogYm9vbGVhbiA9IHRydWUpOiBTZWxlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmZpbHRlcihzID0+IHtcclxuICAgICAgY29uc3Qgbm9kZTogRGVjb05vZGUgPSBzLmRlY29Ob2RlO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIHJldHVybiBub2RlICYmIChjaGVja0dhbWVPYmplY3QgPyBub2RlLmdhbWVPYmplY3ROYW1lIDogdHJ1ZSkgJiYgKGNoZWNrVHlwZSA/IG5vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgOiB0cnVlKSAmJiBub2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGp1c3RhYmxlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0VmFyaWF0aW9ucygpOiBhbnlbXSB7XHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5kZWNvTm9kZXMuZmlsdGVyKChkZWNvOiBEZWNvTm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gZGVjby50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlQWRqdXN0YWJsZShpdGVtOiBPYmplY3QzRCwgYWRqOiBTZWxlY3Rpb24pOiBPYmplY3QzRCB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID8gdGhpcy5mdWxsM0RPYmplY3RUb1VzZS5nZXRPYmplY3RCeU5hbWUoYWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lIHx8IGFkai5nYW1lT2JqZWN0KSA6IG51bGw7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGFkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5yZXBsYWNlKC9bLl0vZywgJycpO1xyXG4gICAgICBvYmogPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID8gdGhpcy5mdWxsM0RPYmplY3RUb1VzZS5nZXRPYmplY3RCeU5hbWUobmFtZSkgOiBudWxsO1xyXG4gICAgICBpZiAoIW9iaikge1xyXG4gICAgICAgIERlYnVnVXRpbHMubG9nKGBObyBvYmplY3Qgd2l0aCBuYW1lICR7YWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lfSBmb3VuZCFgKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGFkanVzdGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgYWRqdXN0YWJsZS5uYW1lID0gdGhpcy5jcmVhdGVVbmlxdWVOYW1lKGl0ZW0sIG9iaik7XHJcbiAgICBhZGp1c3RhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkajtcclxuICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgYWRqdXN0YWJsZS50cmF2ZXJzZShjID0+IHtcclxuICAgICAgYy52aXNpYmxlID0gIWMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfJyk7XHJcbiAgICB9KTtcclxuICAgIGl0ZW0uYWRkKGFkanVzdGFibGUpO1xyXG4gICAgYWRqdXN0YWJsZSA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKGFkanVzdGFibGUubmFtZSk7XHJcbiAgICB0aGlzLnBsYWNlZEFkanVzdGFibGVzLnB1c2goYWRqdXN0YWJsZSk7XHJcbiAgICByZXR1cm4gYWRqdXN0YWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVBZGRhYmxlKGl0ZW06IE9iamVjdDNELCBhZGQ6IFNlbGVjdGlvbiwgcGFydDI/OiBhbnksIHBhcnQxPzogYW55KTogT2JqZWN0M0Qge1xyXG4gICAgY29uc3Qgb2JqOiBhbnkgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlLmdldE9iamVjdEJ5TmFtZShhZGQuZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpO1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbkZyb21JZChhZGouYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICBjb25zdCBhZGRhYmxlOiBhbnkgPSBvYmouY2xvbmUoKTtcclxuICAgIGFkZGFibGUubmFtZSA9IHRoaXMuY3JlYXRlVW5pcXVlTmFtZShpdGVtLCBvYmopO1xyXG4gICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIGFkZGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGxhY2VBZGRhYmxlKGl0ZW0sIGFkZGFibGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcGxhY2VBZGRhYmxlKGl0ZW06IE9iamVjdDNELCBhZGQ6IGFueSk6IE9iamVjdDNEIHtcclxuICAgIGl0ZW0uYWRkKGFkZCk7XHJcbiAgICBjb25zdCBhZGRhYmxlOiBPYmplY3QzRCA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKGFkZC5uYW1lKSBhcyBPYmplY3QzRDtcclxuICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLnB1c2goYWRkYWJsZSk7XHJcbiAgICByZXR1cm4gYWRkYWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVVbmlxdWVOYW1lKGl0ZW06IE9iamVjdDNELCBvYmo6IE9iamVjdDNEKTogc3RyaW5nIHtcclxuICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgbGV0IG5hbWUgPSBgJHtpdGVtLm5hbWV9XyR7b2JqLm5hbWV9YDtcclxuICAgIGxldCBleGlzdGluZ09iaiA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgd2hpbGUgKGV4aXN0aW5nT2JqKSB7XHJcbiAgICAgIGl0ZXJhdGlvbisrO1xyXG4gICAgICBuYW1lID0gYCR7aXRlbS5uYW1lfV8ke29iai5uYW1lfWAgKyAoaXRlcmF0aW9uICE9PSAwID8gKCdfJyArIGl0ZXJhdGlvbikgOiAnJyk7XHJcbiAgICAgIGV4aXN0aW5nT2JqID0gaXRlbS5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwbGFjZUFkZGFibGVzKGl0ZW06IE9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMucGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0aW9uJykgJiYgdGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB0aGlzLnBsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLnNlbGVjdGlvbjtcclxuICAgICAgICBpZiAoYWRqdXN0YWJsZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgbGVuYTogbnVtYmVyID0gYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlcy5sZW5ndGg7XHJcbiAgICAgICAgICBsZXQgY29uQWRkYWJsZTogYW55O1xyXG4gICAgICAgICAgZm9yIChsZXQgaWEgPSAwOyBpYSA8IGxlbmE7IGlhKyspIHtcclxuICAgICAgICAgICAgU2NlbmUzRFV0aWwuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuc2NlbmUsXHJcbiAgICAgICAgICAgICAgaXRlbSwgdGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXSwgYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlc1tpYV0sIGZhbHNlLFxyXG4gICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLmNyZWF0ZUFkZGFibGUoaXRlbSwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgaWYgKGNvbkFkZGFibGUpIHtcclxuICAgICAgICAgICAgICBTY2VuZTNEVXRpbC5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5zY2VuZSxcclxuICAgICAgICAgICAgICAgIGl0ZW0sIGNvbkFkZGFibGUsIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLmNyZWF0ZUFkZGFibGUoaXRlbSwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25BZGRhYmxlID0gdGhpcy5fcGxhY2VkQWRkYWJsZXNbdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFZhcmlhdGlvbnMoaXRlbTogT2JqZWN0M0QsIGluc3RhbmNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlVmFyaWF0aW9uT25QYXJ0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkUGFydCh0aGlzLmFydGljbGVBc3NldFBhdGgsIHRoaXMuX2FkanVzdGFibGVzLCBpbnN0YW5jZUlkLCBpdGVtLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCwgdGhpcy5fYWRqdXN0YWJsZXMsIGluc3RhbmNlSWQsIGl0ZW0sIHRydWUpO1xyXG4gICAgYXdhaXQgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb24odGhpcy5hcnRpY2xlQXNzZXRQYXRoLCB0aGlzLl9hZGRhYmxlcywgaW5zdGFuY2VJZCwgaXRlbSwgdHJ1ZSk7XHJcbiAgICB0aGlzLnZhcmlhdGlvblNlcnZpY2UuY2xlYXJDYWNoZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByZWxvYWRNYXRlcmlhbChhbnN3ZXI6IEFuc3dlcik6IHZvaWQge1xyXG4gICAgaWYgKGFuc3dlci5lbGVtZW50VHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbiAmJiAoYW5zd2VyLmdhbWVPYmplY3QgfHwgYW5zd2VyLm1hdGVyaWFsVXJsKSkge1xyXG4gICAgICBjb25zdCB2YXJpYXRpb25zOiBEZWNvTm9kZVtdID0gdGhpcy5nZXRWYXJpYXRpb25zKCk7XHJcbiAgICAgIGNvbnN0IHZhcmlhdGlvbkRlY29Ob2RlOiBEZWNvTm9kZSA9IHZhcmlhdGlvbnMuZmluZCh2ID0+XHJcbiAgICAgICAgKCh2LnBhcmVudElkICYmIGFuc3dlci5wYXJlbnRBcnRpY2xlRGVjb0lkICYmIHYucGFyZW50SWQudG9TdHJpbmcoKSA9PT0gYW5zd2VyLnBhcmVudEFydGljbGVEZWNvSWQudG9TdHJpbmcoKSkgfHxcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICh2LnBhcmVudElkICYmIGFuc3dlci5wYXJlbnROb2RlSWQgJiYgdi5wYXJlbnRJZC50b1N0cmluZygpID09PSBhbnN3ZXIucGFyZW50Tm9kZUlkLnRvU3RyaW5nKCkpKSk7XHJcbiAgICAgIGlmICghdmFyaWF0aW9uRGVjb05vZGUgfHwgIXRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFmZmVjdGVkU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBbXTtcclxuICAgICAgaWYgKHRoaXMuX2dlbmVyaWNTZWxlY3Rpb24pIHtcclxuICAgICAgICBhZmZlY3RlZFNlbGVjdGlvbnMgPSB0aGlzLl9hZGp1c3RhYmxlcztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBPYmplY3RVdGlscy5HZXRTZWxlY3Rpb25Gcm9tU2VsZWN0ZWRPYmplY3QodGhpcy5fYWN0aXZlQ2hpbGRFbGVtZW50KTtcclxuICAgICAgICBpZiAoY3VycmVudFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgYWZmZWN0ZWRTZWxlY3Rpb25zID0gW3RoaXMuX2FkanVzdGFibGVzLmZpbmQoKHNlbGVjdGlvbjogU2VsZWN0aW9uKSA9PiBzZWxlY3Rpb24ubm9kZUlkID09PSBjdXJyZW50U2VsZWN0aW9uLm5vZGVJZCldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIGNvbnN0IGFkanVzdGFibGVzQ2xvbmU6IFNlbGVjdGlvbltdID0gYWZmZWN0ZWRTZWxlY3Rpb25zICYmIGFmZmVjdGVkU2VsZWN0aW9ucy5sZW5ndGggPiAwID8gYWZmZWN0ZWRTZWxlY3Rpb25zLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMpKSA6IFtdO1xyXG4gICAgICBpZiAoYWRqdXN0YWJsZXNDbG9uZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgYWRqdXN0YWJsZXNDbG9uZS5mb3JFYWNoKChzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbiA9IHNlbGVjdGlvbi52YXJpYXRpb25zLmZpbmQodiA9PiAoXHJcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgICB2IGFzIHVua25vd24gYXMgVmFyaWF0aW9uKS5kZWNvSWQudG9TdHJpbmcoKSA9PT0gdmFyaWF0aW9uRGVjb05vZGUuaWQudG9TdHJpbmcoKSAmJiAodiBhcyB1bmtub3duIGFzIFZhcmlhdGlvbikubm9kZS50b1N0cmluZygpID09PSB2YXJpYXRpb25EZWNvTm9kZS5ub2RlSWQudG9TdHJpbmcoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgaWYgKHZhcmlhdGlvbi5tYXRlcmlhbFVybCkge1xyXG4gICAgICAgICAgICB2YXJpYXRpb24ubWF0ZXJpYWxVcmwgPSBhbnN3ZXIubWF0ZXJpYWxVcmw7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWUgPSBhbnN3ZXIuZ2FtZU9iamVjdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9uc0FzeW5jKGFkanVzdGFibGVzQ2xvbmVbMF0uc2NoZW1hLCBbYW5zd2VyXSwgdGhpcy5hcnRpY2xlQXNzZXRQYXRoKVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCwgYWRqdXN0YWJsZXNDbG9uZSwgJycsIHRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXAsIHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByZWxvYWRNYXRlcmlhbEJ5U2VsZWN0aW9uKGFuc3dlcjogU2VsZWN0b3JTdHJ1Y3R1cmUpOiB2b2lkIHtcclxuICAgIGlmIChhbnN3ZXIuZWxlbWVudFR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24gJiYgYW5zd2VyLmdhbWVPYmplY3QpIHtcclxuICAgICAgY29uc3QgdmFyaWF0aW9uRGVjb05vZGU6IERlY29Ob2RlID0gbmV3IERlY29Ob2RlKCk7XHJcbiAgICAgIHZhcmlhdGlvbkRlY29Ob2RlLmdhbWVPYmplY3ROYW1lID0gYW5zd2VyLmdhbWVPYmplY3Q7XHJcbiAgICAgIGNvbnN0IGFkanVzdGFibGVzQ2xvbmU6IFNlbGVjdGlvbltdID0gdGhpcy5fYWRqdXN0YWJsZXMubWFwKHMgPT4gT2JqZWN0LmFzc2lnbih7fSwgcykpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2dlbmVyaWNTZWxlY3Rpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZS5mb3JFYWNoKChzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4gc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBbdmFyaWF0aW9uRGVjb05vZGVdKTtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgIHRoaXMudmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLnByZWxvYWRWYXJpYXRpb25zQXN5bmMoYWRqdXN0YWJsZXNDbG9uZVswXS5zY2hlbWEsIFt2YXJpYXRpb25EZWNvTm9kZV0sIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aClcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpY2xlQXNzZXRQYXRoLFxyXG4gICAgICAgICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZSxcclxuICAgICAgICAgICAgICAgICcnLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMuZm9yRWFjaCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb246IFNlbGVjdGlvbiA9IE9iamVjdFV0aWxzLkdldFNlbGVjdGlvbkZyb21TZWxlY3RlZE9iamVjdCh0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Gcm9tQWRqdXN0YWJsZXM6IFNlbGVjdGlvbiA9IGFkanVzdGFibGVzQ2xvbmVcclxuICAgICAgICAgICAgICAuZmluZCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5ub2RlSWQgPT09IGN1cnJlbnRTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcykge1xyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcy52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXTtcclxuICAgICAgICAgICAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9uc0FzeW5jKFxyXG4gICAgICAgICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZVswXS5zY2hlbWEsIFt2YXJpYXRpb25EZWNvTm9kZV0sIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aClcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcnRpY2xlQXNzZXRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGFkanVzdGFibGVzQ2xvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgICAgICAgICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICkudGhlbigpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlczogU2VsZWN0aW9uID0gdGhpcy5fYWRqdXN0YWJsZXNcclxuICAgICAgICAgICAgICAuZmluZCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5ub2RlSWQgPT09IGN1cnJlbnRTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgc2VsZWN0aW9uRnJvbUFkanVzdGFibGVzLnZhcmlhdGlvbnMgPSBbdmFyaWF0aW9uRGVjb05vZGVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkRmxvb3IocmVzdWx0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGxldCBmbG9vcldpdGhvdXRQbGFua0NvdW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gbGV0IGZsb29yUGF0dGVybjogRmxvb3JQYXR0ZXJuO1xyXG4gICAgLy8gY29uc3QgYXJ0aWNsZUZ1bGxPYmplY3Q6IEFydGljbGVGdWxsT2JqZWN0ID0gYXdhaXQgdGhpcy5jb25uZWN0b3JBZGFwdGVyU2VydmljZS5nZXRBcnRpY2xlRnVsbE9iamVjdCgrcmVzdWx0Lm1ldGFEYXRhLmdvb2RJZCk7XHJcbiAgICAvLyBpZiAoYXJ0aWNsZUZ1bGxPYmplY3QudGFncyAhPT0gbnVsbCAmJiBhcnRpY2xlRnVsbE9iamVjdC50YWdzLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgZm9yIChjb25zdCB0YWcgb2YgYXJ0aWNsZUZ1bGxPYmplY3QudGFncykge1xyXG4gICAgLy8gICAgIGlmICh0YWcuZGVzY3JpcHRpb24gPT09ICdOT1JNQUwnKSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uTk9STUFMO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAodGFnLmRlc2NyaXB0aW9uID09PSAnSEVSUklOR0JPTkUnKSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSEVSUklOR0JPTkU7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmICh0YWcuZGVzY3JpcHRpb24gPT09ICdIT042MCcpIHtcclxuICAgIC8vICAgICAgIGZsb29yUGF0dGVybiA9IEZsb29yUGF0dGVybi5IT042MDtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKHRhZy5kZXNjcmlwdGlvbiA9PT0gJ0hPTjQ1Jykge1xyXG4gICAgLy8gICAgICAgZmxvb3JQYXR0ZXJuID0gRmxvb3JQYXR0ZXJuLkhPTjQ1O1xyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uTk9STUFMO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBmbG9vcldpdGhvdXRQbGFua0NvdW50ZXIgPSBmYWxzZTtcclxuICAgIC8vIH1cclxuICAgIC8vXHJcbiAgICAvLyBjb25zdCBpdGVtOiBGbG9vclBsYW5lSXRlbSA9IHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yVG9Db25maWd1cmU7XHJcbiAgICAvLyBpdGVtLm1ldGFkYXRhID0gcmVzdWx0Lm1ldGFEYXRhO1xyXG4gICAgLy8gaXRlbS5tZXRhZGF0YS5zZWxlY3Rpb25zID0gdGhpcy5jbG9uZVNlbGVjdGlvbnMoKTtcclxuICAgIC8vIGl0ZW0ubWV0YWRhdGEuZGVjb3MgPSBBcnJheS5mcm9tKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5kZWNvTm9kZXMpO1xyXG4gICAgLy8gdGhpcy5oYW5kbGVDcmVhdGVGbG9vcihpdGVtKTtcclxuICAgIC8vXHJcbiAgICAvLyBpZiAoZmxvb3JXaXRob3V0UGxhbmtDb3VudGVyKSB7XHJcbiAgICAvLyAgIGNvbnN0IGZsb29yUm90YXRpb246IG51bWJlciA9IHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yUm90YXRpb247XHJcbiAgICAvLyAgIGl0ZW0uY2hpbGRyZW5bMF0udXNlckRhdGEuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25zWzBdO1xyXG4gICAgLy8gICBhd2FpdCB0aGlzLmxvYWRWYXJpYXRpb25zKGl0ZW0sIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQpO1xyXG4gICAgLy9cclxuICAgIC8vICAgaXRlbS5tZXRhZGF0YS50ZXh0dXJlQXNzZXROYW1lID0gdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRlZEFzc2V0O1xyXG4gICAgLy8gICB0aGlzLmZsb29yU2VydmljZS51bkhpZ2hMaWdodEZsb29ycygpO1xyXG4gICAgLy8gICB0aGlzLnNjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICAvLyAgIHRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXAgPSBpdGVtO1xyXG4gICAgLy8gICByZXN1bHQuZnVybml0dXJlID0gdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cDtcclxuICAgIC8vICAgcmVzdWx0Lmluc3RhbmNlSWQgPSByZXN1bHQubWV0YURhdGEuaXRlbUlkO1xyXG4gICAgLy9cclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMuZmxvb3JTZXJ2aWNlLnVuSGlnaExpZ2h0Rmxvb3JzKCk7XHJcbiAgICAvLyAgIHRoaXMuc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgIC8vICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGl0ZW07XHJcbiAgICAvLyAgIHJlc3VsdC5mdXJuaXR1cmUgPSB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwO1xyXG4gICAgLy8gICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICAvLyAgIC8vIHRoaXMuX2dlbmVyYXRlTGF5aW5nUGF0dGVybihpdGVtLCBmbG9vclBhdHRlcm4pO1xyXG4gICAgLy8gfVxyXG4gICAgLy9cclxuICAgIC8vIHRoaXMuaGFuZGxlSW50ZWdyYXRpb24ocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCwgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCk7XHJcbiAgICAvLyBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5pdGVtR3JvdXApIHtcclxuICAgIC8vICAgdGhpcy5pdGVtR3JvdXBTZXJ2aWNlLnJlYXR0YWNoVG9JdGVtR3JvdXAoXHJcbiAgICAvLyAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgIC8vICAgICB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLml0ZW1Hcm91cCxcclxuICAgIC8vICAgICB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMuZW1wdHlBbnN3ZXJTZWxlY3RlZCgpO1xyXG4gICAgLy9cclxuICAgIC8vIGlmIChyZXN1bHQucmVzdWx0VHlwZSA9PT0gUmVzdWx0VHlwZS5Ob1NlbGVjdGlvbnMpIHtcclxuICAgIC8vICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25GaXhlZDtcclxuICAgIC8vIH0gZWxzZSBpZiAocmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuT2Jzb2xldGUgJiYgcmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuQ29uZmlndXJhdGlvbkZpeGVkKSB7IC8vIGRvbid0IG92ZXJyaWRlIHRoZXNlXHJcbiAgICAvLyAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Mb2FkZWQ7XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLmZsb29yU2VydmljZS5mbG9vclJlc3VsdE9iamVjdCA9IHJlc3VsdDtcclxuICAgIC8vIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHJlc3VsdCk7XHJcbiAgICAvLyByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvd25sb2FkVURTWmZvckFSSU9TKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb2JqZWN0czogT2JqZWN0M0RbXSA9IHRoaXMuaXRlbVNlcnZpY2Uuc2NlbmVJdGVtcztcclxuICAgIGNvbnN0IG9iamVjdFRvRXhwb3J0OiBPYmplY3QzRCA9IG9iamVjdHMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgdGhpcy51dGlsc1NlcnZpY2UuZG93bmxvYWRVU0RaZm9yQVJJT1Mob2JqZWN0VG9FeHBvcnQpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|