@vgai/editor 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +35 -0
- package/dist/a/b/c/test-nested.json +1 -0
- package/dist/assets/CCDIKSolver-Dz-ysxZF.js +1 -0
- package/dist/assets/SelectionBox-BXsv_6aH.js +1 -0
- package/dist/assets/browser-project-scripts-DOru4L1x.js +2 -0
- package/dist/assets/browserAll-CEkWYlFk.js +1 -0
- package/dist/assets/collision-world-DniMB0qq.glb +0 -0
- package/dist/assets/create-runtime-DYIWr3va.js +1 -0
- package/dist/assets/data-asset-Bb9sIM7i.js +5 -0
- package/dist/assets/esbuild-BHljloGq.wasm +0 -0
- package/dist/assets/fake-three-BMTQ9rl_.js +1 -0
- package/dist/assets/game-8SDZPPgH.js +1 -0
- package/dist/assets/game-BI111o5f.js +10 -0
- package/dist/assets/game-CevorxyV.js +1 -0
- package/dist/assets/game-Di1H0gFj.js +1 -0
- package/dist/assets/game-Di7XlywD.js +1 -0
- package/dist/assets/game-DjnCaw8R.js +1 -0
- package/dist/assets/game-Q9A0aXSV.js +1 -0
- package/dist/assets/game-pt_1lQLv.js +1 -0
- package/dist/assets/game-source-CvidN7AB.js +1 -0
- package/dist/assets/game-xsOho_wg.js +83 -0
- package/dist/assets/index-Bp5cecD6.js +12 -0
- package/dist/assets/index-CPVV6pjw.js +1 -0
- package/dist/assets/index-CpOnYyeD.js +213 -0
- package/dist/assets/index-Cs8xwv3e.js +1 -0
- package/dist/assets/index-DL7RcQ0n.js +27 -0
- package/dist/assets/index-Dr8H_6Rl.js +1 -0
- package/dist/assets/index-_bCaipUk.js +13650 -0
- package/dist/assets/ingest-siblings-Dz8eEqrV.js +1 -0
- package/dist/assets/mount-manifest-Bhk0ohsl.js +1 -0
- package/dist/assets/recast-navigation.wasm-compat-CvP4UGK6.js +1 -0
- package/dist/assets/scene-query-BivAHhJu.js +1 -0
- package/dist/assets/stats.module--VATS4Kh.js +1 -0
- package/dist/assets/webworkerAll-BLrH0F6F.js +1 -0
- package/dist/assets/xstate-animation-binding-1NGLmw6y.js +1 -0
- package/dist/assets/xstate.esm-BgUD33nl.js +3 -0
- package/dist/index.html +37 -0
- package/dist/ingest/racing-game/UPSTREAM.md +68 -0
- package/dist/ingest/racing-game/a/Inter-Black.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Black.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-BlackItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-BlackItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Bold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Bold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-BoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-BoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraBoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLight.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLight.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ExtraLightItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Italic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Italic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Light.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Light.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-LightItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-LightItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Medium.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Medium.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-MediumItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-MediumItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Regular.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Regular.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBold.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBold.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-SemiBoldItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-Thin.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-Thin.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-ThinItalic.woff +0 -0
- package/dist/ingest/racing-game/a/Inter-ThinItalic.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-italic.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter-roman.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/Inter.var.woff2 +0 -0
- package/dist/ingest/racing-game/a/index.css +1 -0
- package/dist/ingest/racing-game/images/bronze.png +0 -0
- package/dist/ingest/racing-game/images/gold.png +0 -0
- package/dist/ingest/racing-game/images/silver.png +0 -0
- package/dist/ingest/racing-game/index.html +15 -0
- package/dist/ingest/racing-game/models/chassis-draco.glb +0 -0
- package/dist/ingest/racing-game/models/track-draco.glb +0 -0
- package/dist/ingest/racing-game/models/wheel-draco.glb +0 -0
- package/dist/ingest/racing-game/rg-entry.js +1 -0
- package/dist/ingest/racing-game/sounds/accelerate.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/boost.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/crash.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/engine.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/honk.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/tire-brake.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/train.mp3 +0 -0
- package/dist/ingest/racing-game/sounds/water.mp3 +0 -0
- package/dist/ingest/racing-game/textures/cursor.svg +3 -0
- package/dist/ingest/racing-game/textures/dikhololo_night_1k.hdr +0 -0
- package/dist/ingest/racing-game/textures/heightmap_1024.png +0 -0
- package/dist/ingest/racing-game/textures/mask.svg +11 -0
- package/dist/ingest/racing-game/textures/no_sound.png +0 -0
- package/dist/ingest/racing-game/three-r139.module.js +50617 -0
- package/dist/ingest/racing-game/vendor.js +179 -0
- package/dist/ingest/racing-game/vgai.game.json +20 -0
- package/dist/ingest/simcity/UPSTREAM.md +65 -0
- package/dist/ingest/simcity/favicon.ico +0 -0
- package/dist/ingest/simcity/fonts/Bebas-Regular.otf +0 -0
- package/dist/ingest/simcity/fonts/Digitalt.otf +0 -0
- package/dist/ingest/simcity/fonts/Stanberry.ttf +0 -0
- package/dist/ingest/simcity/icons/bulldozer-color.png +0 -0
- package/dist/ingest/simcity/icons/bulldozer.png +0 -0
- package/dist/ingest/simcity/icons/calendar.png +0 -0
- package/dist/ingest/simcity/icons/factory-color.png +0 -0
- package/dist/ingest/simcity/icons/factory.png +0 -0
- package/dist/ingest/simcity/icons/house-color.png +0 -0
- package/dist/ingest/simcity/icons/house.png +0 -0
- package/dist/ingest/simcity/icons/job.png +0 -0
- package/dist/ingest/simcity/icons/office.png +0 -0
- package/dist/ingest/simcity/icons/pause-color.png +0 -0
- package/dist/ingest/simcity/icons/pause.png +0 -0
- package/dist/ingest/simcity/icons/person.png +0 -0
- package/dist/ingest/simcity/icons/play-color.png +0 -0
- package/dist/ingest/simcity/icons/play.png +0 -0
- package/dist/ingest/simcity/icons/power-color.png +0 -0
- package/dist/ingest/simcity/icons/power-line-color.png +0 -0
- package/dist/ingest/simcity/icons/power.png +0 -0
- package/dist/ingest/simcity/icons/road-color.png +0 -0
- package/dist/ingest/simcity/icons/road.png +0 -0
- package/dist/ingest/simcity/icons/select-color.png +0 -0
- package/dist/ingest/simcity/icons/select.png +0 -0
- package/dist/ingest/simcity/icons/store-color.png +0 -0
- package/dist/ingest/simcity/index.html +94 -0
- package/dist/ingest/simcity/index.js +58 -0
- package/dist/ingest/simcity/main.css +233 -0
- package/dist/ingest/simcity/models/armored-truck.glb +0 -0
- package/dist/ingest/simcity/models/building-block-4floor-corner.glb +0 -0
- package/dist/ingest/simcity/models/building-block-4floor-short.glb +0 -0
- package/dist/ingest/simcity/models/building-block-5floor.glb +0 -0
- package/dist/ingest/simcity/models/building-burger-joint.glb +0 -0
- package/dist/ingest/simcity/models/building-cafe.glb +0 -0
- package/dist/ingest/simcity/models/building-casino.glb +0 -0
- package/dist/ingest/simcity/models/building-cinema.glb +0 -0
- package/dist/ingest/simcity/models/building-house-block-big.glb +0 -0
- package/dist/ingest/simcity/models/building-house-family-large.glb +0 -0
- package/dist/ingest/simcity/models/building-house-family-small.glb +0 -0
- package/dist/ingest/simcity/models/building-office-balcony.glb +0 -0
- package/dist/ingest/simcity/models/building-office-big.glb +0 -0
- package/dist/ingest/simcity/models/building-office-pyramid.glb +0 -0
- package/dist/ingest/simcity/models/building-office-tall.glb +0 -0
- package/dist/ingest/simcity/models/building-office.glb +0 -0
- package/dist/ingest/simcity/models/building-restaurant.glb +0 -0
- package/dist/ingest/simcity/models/building-skyscraper.glb +0 -0
- package/dist/ingest/simcity/models/car-ambulance-pickup.glb +0 -0
- package/dist/ingest/simcity/models/car-baywatch.glb +0 -0
- package/dist/ingest/simcity/models/car-hippie-van.glb +0 -0
- package/dist/ingest/simcity/models/car-passenger-race.glb +0 -0
- package/dist/ingest/simcity/models/car-passenger.glb +0 -0
- package/dist/ingest/simcity/models/car-police.glb +0 -0
- package/dist/ingest/simcity/models/car-taxi.glb +0 -0
- package/dist/ingest/simcity/models/car-tow-truck.glb +0 -0
- package/dist/ingest/simcity/models/car-truck-dump.glb +0 -0
- package/dist/ingest/simcity/models/car-veteran.glb +0 -0
- package/dist/ingest/simcity/models/construction-small.glb +0 -0
- package/dist/ingest/simcity/models/data-center.glb +0 -0
- package/dist/ingest/simcity/models/industry-factory-old.glb +0 -0
- package/dist/ingest/simcity/models/industry-factory.glb +0 -0
- package/dist/ingest/simcity/models/industry-refinery.glb +0 -0
- package/dist/ingest/simcity/models/industry-warehouse.glb +0 -0
- package/dist/ingest/simcity/models/power_line_pole_modified.glb +0 -0
- package/dist/ingest/simcity/models/tile-plain_grass.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-curve.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-end.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-intersection-t.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-intersection.glb +0 -0
- package/dist/ingest/simcity/models/tile-road-straight.glb +0 -0
- package/dist/ingest/simcity/models/truck.glb +0 -0
- package/dist/ingest/simcity/statusIcons/no-power.png +0 -0
- package/dist/ingest/simcity/statusIcons/no-road-access.png +0 -0
- package/dist/ingest/simcity/textures/base.png +0 -0
- package/dist/ingest/simcity/textures/grid.png +0 -0
- package/dist/ingest/simcity/textures/specular.png +0 -0
- package/dist/ingest/simcity/three-r155.module.js +51466 -0
- package/dist/ingest/simcity/vgai.game.json +20 -0
- package/dist/ingest/tanks/UPSTREAM.md +69 -0
- package/dist/ingest/tanks/index.html +214 -0
- package/dist/ingest/tanks/models/pixelTank.fbx +0 -0
- package/dist/ingest/tanks/tanks-entry.js +92 -0
- package/dist/ingest/tanks/three-r170.module.js +54571 -0
- package/dist/ingest/tanks/vgai.game.json +20 -0
- package/dist/inputmaps/default.inputmap.json +41 -0
- package/dist/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/dist/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/dist/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/dist/scenes/untitled.vscn.json +29 -0
- package/dist/textures/waternormals.jpg +0 -0
- package/dist-server/packaged.mjs +18155 -0
- package/package.json +36 -0
- package/server/asset-library-routes.ts +833 -0
- package/server/canonical-path.ts +50 -0
- package/server/cloud-asset-catalog.ts +101 -0
- package/server/dev.ts +350 -0
- package/server/editor-server.ts +1537 -0
- package/server/editor-sse.ts +73 -0
- package/server/game-globals-shadow.ts +58 -0
- package/server/local-asset-catalog.ts +163 -0
- package/server/packaged.ts +571 -0
- package/server/prod.ts +75 -0
- package/server/project-optimize-deps-entries.ts +149 -0
- package/server/project-view.ts +65 -0
- package/server/server-utils.ts +430 -0
- package/server/session-registry.ts +93 -0
- package/src/EditorContext.tsx +87 -0
- package/src/achieved-tier.ts +126 -0
- package/src/action-registry.ts +268 -0
- package/src/adapter-resolver.ts +1858 -0
- package/src/asset-events.ts +100 -0
- package/src/authoring/active-adapter.ts +98 -0
- package/src/authoring/active-systems.ts +50 -0
- package/src/authoring/boundary-authoring-adapter.ts +178 -0
- package/src/authoring/composite-authoring-adapter.ts +891 -0
- package/src/authoring/design-time-layers.ts +776 -0
- package/src/authoring/edit-mode-authoring.ts +643 -0
- package/src/authoring/embed-only-adapter.ts +57 -0
- package/src/authoring/ephemeral-persistence.ts +26 -0
- package/src/authoring/eyedropper-session.ts +69 -0
- package/src/authoring/first-party-hierarchy-menu.ts +74 -0
- package/src/authoring/first-party-inspector/AddSectionMenu.tsx +118 -0
- package/src/authoring/first-party-inspector/EnvironmentSection.tsx +550 -0
- package/src/authoring/first-party-inspector/HeaderSection.tsx +329 -0
- package/src/authoring/first-party-inspector/is-first-party-selection.ts +44 -0
- package/src/authoring/first-party-inspector/register.tsx +108 -0
- package/src/authoring/ingest-authoring-adapter.ts +475 -0
- package/src/authoring/ingest-capture.ts +94 -0
- package/src/authoring/ingest-game-adapter.ts +291 -0
- package/src/authoring/ingest-iframe-adapter.ts +38 -0
- package/src/authoring/ingest-iframe-reachable-adapter.ts +401 -0
- package/src/authoring/ingest-overlay.ts +193 -0
- package/src/authoring/layered-pick.ts +87 -0
- package/src/authoring/mount-failure-report.ts +112 -0
- package/src/authoring/overlay-report.ts +52 -0
- package/src/authoring/project-scenes.ts +111 -0
- package/src/authoring/react-dom-authoring-adapter.ts +795 -0
- package/src/authoring/react-inspector-section.tsx +1041 -0
- package/src/authoring/react-world-authoring-adapter.ts +2400 -0
- package/src/authoring/root-activation.ts +61 -0
- package/src/authoring/scene-ui-layer.ts +485 -0
- package/src/authoring/story-overlay.ts +48 -0
- package/src/authoring/ui-authoring-adapter.ts +325 -0
- package/src/authoring/ui-hierarchy-menu.ts +40 -0
- package/src/authoring/ui-inspector-sections.tsx +156 -0
- package/src/authoring/undo-timeline.ts +145 -0
- package/src/authoring/vgai-scene-authoring-adapter.ts +746 -0
- package/src/authoring/viewport-pick-context.ts +31 -0
- package/src/authoring/viewport-raycast.ts +80 -0
- package/src/authoring/world-overlay.ts +76 -0
- package/src/authoring/world-pan-state.ts +115 -0
- package/src/authoring/world-session-state.ts +102 -0
- package/src/authoring/world2d-authoring-adapter.ts +313 -0
- package/src/browser-external-watch.ts +98 -0
- package/src/browser-play-entry.ts +112 -0
- package/src/browser-project-scripts.ts +112 -0
- package/src/browser-transpile.ts +246 -0
- package/src/browser-watch-reload.ts +100 -0
- package/src/command-listener.ts +326 -0
- package/src/components/AlignToolbar.tsx +189 -0
- package/src/components/AppRoot.tsx +73 -0
- package/src/components/AssetBrowser.tsx +502 -0
- package/src/components/BottomPanel.tsx +326 -0
- package/src/components/BuildPanel.tsx +455 -0
- package/src/components/CameraInfo.tsx +56 -0
- package/src/components/CommandPalette.tsx +265 -0
- package/src/components/ConsolePanel.tsx +272 -0
- package/src/components/DataPanel.tsx +1268 -0
- package/src/components/DefaultEditorLayout.tsx +509 -0
- package/src/components/FolderTree.tsx +179 -0
- package/src/components/GameHierarchy.tsx +1349 -0
- package/src/components/Inspector.tsx +671 -0
- package/src/components/InspectorToolSection.tsx +74 -0
- package/src/components/MountFailureBanner.tsx +110 -0
- package/src/components/NetworkSection.tsx +109 -0
- package/src/components/OnlineAssetBrowser.tsx +448 -0
- package/src/components/OverlayReportBanner.tsx +122 -0
- package/src/components/PlayBar.tsx +356 -0
- package/src/components/PrefabSaveDialog.tsx +201 -0
- package/src/components/ProjectHeader.tsx +174 -0
- package/src/components/ProjectScreen.tsx +1004 -0
- package/src/components/RightPanel.tsx +166 -0
- package/src/components/RootActivateDialog.tsx +105 -0
- package/src/components/SaveDialog.tsx +197 -0
- package/src/components/SaveStatus.tsx +69 -0
- package/src/components/StatsOverlay.tsx +35 -0
- package/src/components/ToolHost.tsx +80 -0
- package/src/components/Toolbar.tsx +307 -0
- package/src/components/ViewportOverlay.tsx +234 -0
- package/src/components/ViewportPanel.tsx +369 -0
- package/src/components/WorldContextMenu.tsx +257 -0
- package/src/components/WorldSelectionOverlay.tsx +2003 -0
- package/src/components/WorldTextEditor.tsx +86 -0
- package/src/components/asset-viewers/AssetViewer.tsx +38 -0
- package/src/components/asset-viewers/AudioViewer.tsx +149 -0
- package/src/components/asset-viewers/GenericJsonViewer.tsx +77 -0
- package/src/components/asset-viewers/ImageViewer.tsx +65 -0
- package/src/components/asset-viewers/InputMapViewer.tsx +206 -0
- package/src/components/asset-viewers/ModelViewer.tsx +180 -0
- package/src/components/asset-viewers/OnlineAssetDetail.tsx +236 -0
- package/src/components/data-csv.ts +301 -0
- package/src/components/entity-name-commit.ts +18 -0
- package/src/components/inspector-property-grouping.ts +65 -0
- package/src/components/inspector-widgets/AlignmentGrid.tsx +188 -0
- package/src/components/inspector-widgets/BorderEditor.tsx +305 -0
- package/src/components/inspector-widgets/ColorPicker.tsx +548 -0
- package/src/components/inspector-widgets/FilterEditor.tsx +108 -0
- package/src/components/inspector-widgets/FontPicker.tsx +196 -0
- package/src/components/inspector-widgets/GradientEditor.tsx +277 -0
- package/src/components/inspector-widgets/ScrubbableInput.tsx +152 -0
- package/src/components/inspector-widgets/ShadowEditor.tsx +332 -0
- package/src/components/inspector-widgets/color-utils.ts +202 -0
- package/src/components/inspector-widgets/gallery-main.tsx +167 -0
- package/src/components/inspector-widgets/index.ts +22 -0
- package/src/components/inspector-widgets/shared.tsx +135 -0
- package/src/components/inspectors/AnimationSection.tsx +143 -0
- package/src/components/inspectors/AudioSection.tsx +215 -0
- package/src/components/inspectors/BoneAttachmentSection.tsx +82 -0
- package/src/components/inspectors/CameraSection.tsx +105 -0
- package/src/components/inspectors/ComponentsSection.tsx +358 -0
- package/src/components/inspectors/JointsSection.tsx +255 -0
- package/src/components/inspectors/LightSection.tsx +116 -0
- package/src/components/inspectors/MaterialSection.tsx +1189 -0
- package/src/components/inspectors/MeshSection.tsx +99 -0
- package/src/components/inspectors/NavigationSection.tsx +58 -0
- package/src/components/inspectors/ParticleSection.tsx +681 -0
- package/src/components/inspectors/PhysicsSection.tsx +326 -0
- package/src/components/inspectors/PostProcessingSection.tsx +1290 -0
- package/src/components/inspectors/RenderingSection.tsx +109 -0
- package/src/components/inspectors/ShadowSection.tsx +84 -0
- package/src/components/inspectors/SplineSection.tsx +191 -0
- package/src/components/inspectors/TransformSection.tsx +191 -0
- package/src/components/inspectors/json-schema-fields.ts +281 -0
- package/src/components/inspectors/multi-edit-utils.ts +49 -0
- package/src/components/inspectors/zod-fields.ts +184 -0
- package/src/components/primitives/ColorInput.tsx +109 -0
- package/src/components/primitives/JsonInput.tsx +98 -0
- package/src/components/primitives/NumberInput.tsx +164 -0
- package/src/components/primitives/Panel.tsx +68 -0
- package/src/components/primitives/SectionHeader.tsx +45 -0
- package/src/components/primitives/Tooltip.tsx +82 -0
- package/src/components/primitives/Vec3Input.tsx +62 -0
- package/src/components/world-overlay-gestures.ts +1438 -0
- package/src/doctor/data-checks.ts +285 -0
- package/src/doctor/report.ts +386 -0
- package/src/editor-api.ts +700 -0
- package/src/editor-console.ts +194 -0
- package/src/editor-hotkeys.ts +441 -0
- package/src/editor-layers.ts +2 -0
- package/src/editor-mode.ts +28 -0
- package/src/editor-store.ts +2225 -0
- package/src/editor-viewport.ts +1924 -0
- package/src/entity-factory.ts +221 -0
- package/src/game-globals-prelude.ts +27 -0
- package/src/gated-globals.ts +131 -0
- package/src/generated/setup-by-example.generated.ts +53 -0
- package/src/gizmo-registry.ts +608 -0
- package/src/handle-system.ts +221 -0
- package/src/hierarchy-menu-registry.ts +70 -0
- package/src/hierarchy-rows.ts +73 -0
- package/src/hosted-example.ts +160 -0
- package/src/hotkeys.ts +142 -0
- package/src/ingest/discovery-react.ts +132 -0
- package/src/ingest/discovery.ts +205 -0
- package/src/ingest/discovery2d.ts +204 -0
- package/src/ingest/esm-entry-resolution.ts +102 -0
- package/src/ingest/games/bloom-composer/game.js +99 -0
- package/src/ingest/games/bloom-composer/vgai.game.json +21 -0
- package/src/ingest/games/embed-bundle/embed.html +10 -0
- package/src/ingest/games/embed-bundle/vgai.game.json +21 -0
- package/src/ingest/games/games-fps/assets/collision-world.glb +0 -0
- package/src/ingest/games/games-fps/game.js +479 -0
- package/src/ingest/games/games-fps/vgai.game.json +24 -0
- package/src/ingest/games/iframe-reachable/game-source.js +58 -0
- package/src/ingest/games/iframe-reachable/vgai.game.json +21 -0
- package/src/ingest/games/interactive-cubes/game.js +139 -0
- package/src/ingest/games/interactive-cubes/vgai.game.json +21 -0
- package/src/ingest/games/mismatched-three/fake-three.js +38 -0
- package/src/ingest/games/mismatched-three/game.js +10 -0
- package/src/ingest/games/mismatched-three/vgai.game.json +22 -0
- package/src/ingest/games/own-three-bundled/game.js +43 -0
- package/src/ingest/games/own-three-bundled/vgai.game.json +21 -0
- package/src/ingest/games/pointerlock-maze/game.js +288 -0
- package/src/ingest/games/pointerlock-maze/vgai.game.json +22 -0
- package/src/ingest/games-2d/_fixtures/first-party-scene.scn2d.json +124 -0
- package/src/ingest/games-2d/bubbo-bubbo/vgai.game.json +25 -0
- package/src/ingest/games-2d/bunnymark/game.ts +88 -0
- package/src/ingest/games-2d/bunnymark/vgai.game.json +21 -0
- package/src/ingest/games-2d/flappy/game.ts +148 -0
- package/src/ingest/games-2d/flappy/vgai.game.json +21 -0
- package/src/ingest/games-2d/flappy-pixi/vgai.game.json +25 -0
- package/src/ingest/games-2d/puzzling-potions/vgai.game.json +25 -0
- package/src/ingest/games-2d/tilemap-camera/game.ts +115 -0
- package/src/ingest/games-2d/tilemap-camera/vgai.game.json +21 -0
- package/src/ingest/games-react/react-rpg/entry.tsx +185 -0
- package/src/ingest/games-react/react-rpg/shims.d.ts +26 -0
- package/src/ingest/games-react/react-rpg/src/ui/game-state.tsx +129 -0
- package/src/ingest/games-react/react-rpg/vgai.game.json +21 -0
- package/src/ingest/host-namespace-registry.ts +196 -0
- package/src/ingest/types.ts +127 -0
- package/src/ingest-hierarchy-rows.ts +207 -0
- package/src/ingest-mode.ts +2092 -0
- package/src/ingest-siblings.ts +466 -0
- package/src/initial-scene.ts +194 -0
- package/src/inspector-section-registry.ts +117 -0
- package/src/interactive-edit-scope.ts +34 -0
- package/src/main.tsx +23 -0
- package/src/manifest-project.ts +43 -0
- package/src/model-thumbnail.ts +156 -0
- package/src/module-mode.ts +513 -0
- package/src/navmesh-handler.ts +94 -0
- package/src/packaged-runtime.ts +49 -0
- package/src/play-mode.ts +1148 -0
- package/src/playground/main.ts +206 -0
- package/src/project-manager.ts +173 -0
- package/src/scene-diff.ts +112 -0
- package/src/scene-serializer.ts +144 -0
- package/src/scene-sync.ts +587 -0
- package/src/scene-ui-mode/active-scene-ui.ts +58 -0
- package/src/scene-ui-mode/scene-ui-palette-panel.tsx +152 -0
- package/src/scene-ui-mode/scene-ui-timeline-tab.tsx +29 -0
- package/src/scene-ui-mode/ui-prefab-dialog-host.tsx +74 -0
- package/src/scene-ui-mode/ui-prefab-hierarchy-menu.ts +49 -0
- package/src/scene-ui-mode/ui-prefab-io.ts +76 -0
- package/src/script-loader.ts +143 -0
- package/src/storage/fsa-storage.ts +55 -0
- package/src/storage/handle-storage.ts +150 -0
- package/src/storage/handle-store.ts +116 -0
- package/src/storage/http-storage.ts +137 -0
- package/src/storage/index.ts +147 -0
- package/src/storage/mem-storage.ts +135 -0
- package/src/storage/opfs-storage.ts +25 -0
- package/src/storage/paths.ts +26 -0
- package/src/storage/seed.ts +106 -0
- package/src/storage/types.ts +110 -0
- package/src/tool-loader.ts +291 -0
- package/src/ui-editor/inspector.tsx +563 -0
- package/src/ui-editor/node-ops.ts +266 -0
- package/src/ui-editor/overlay.tsx +380 -0
- package/src/ui-editor/palette.tsx +114 -0
- package/src/ui-editor/react-store.ts +78 -0
- package/src/ui-editor/timeline-panel.tsx +443 -0
- package/src/ui-editor/ui-edit-store.ts +552 -0
- package/src/ui-editor/ui-prefab.ts +95 -0
- package/src/ui-source/inspect.ts +544 -0
- package/src/ui-source/oid-transform.ts +133 -0
- package/src/ui-source/source-write-backend.ts +203 -0
- package/src/ui-source/tailwind-map.ts +174 -0
- package/src/ui-source/writer.ts +1175 -0
- package/src/widgets/index.ts +73 -0
- package/template/.claude/skills/editor/SKILL.md +252 -0
- package/template/CLAUDE.md +512 -0
- package/template/LICENSE +30 -0
- package/template/emit-schemas.ts +42 -0
- package/template/index.html +17 -0
- package/template/package.json +53 -0
- package/template/project.json +9 -0
- package/template/public/audio/ambient-arena.wav +0 -0
- package/template/public/audio/ambient-music.wav +0 -0
- package/template/public/audio/ambient-nature.wav +0 -0
- package/template/public/audio/ambient-wind.wav +0 -0
- package/template/public/inputmaps/default.inputmap.json +41 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
- package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
- package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/template/public/scenes/default.vscn.json +43 -0
- package/template/public/scenes/untitled.vscn.json +29 -0
- package/template/public/textures/waternormals.jpg +0 -0
- package/template/server/colyseus-setup.ts +85 -0
- package/template/server/main.ts +34 -0
- package/template/server/rooms/arena-room.ts +420 -0
- package/template/server/rooms/game-room.ts +162 -0
- package/template/server/rooms.ts +15 -0
- package/template/server/tsconfig.json +19 -0
- package/template/src/data/README.md +40 -0
- package/template/src/data/assets.ts +31 -0
- package/template/src/data/tuning.data.json +5 -0
- package/template/src/data/tuning.schema.json +21 -0
- package/template/src/data/tuning.schema.ts +34 -0
- package/template/src/data/tuning.ts +24 -0
- package/template/src/main.ts +157 -0
- package/template/src/scripts/components/data-spinner.ts +45 -0
- package/template/src/scripts/components/scene-camera.ts +40 -0
- package/template/src/scripts/main.ts +94 -0
- package/template/src/scripts/registry.ts +46 -0
- package/template/src/tools/README.md +14 -0
- package/template/src/tools/example.tool.tsx +91 -0
- package/template/src/tools/spin.tool.tsx +101 -0
- package/template/src/ui/Button.tsx +27 -0
- package/template/src/ui/DefaultHud.tsx +40 -0
- package/template/src/ui/KeyHint.tsx +25 -0
- package/template/src/ui/Panel.tsx +52 -0
- package/template/src/ui/RebindPanel.tsx +129 -0
- package/template/src/ui/Slider.tsx +28 -0
- package/template/src/ui/StatusDot.tsx +22 -0
- package/template/src/ui/Toggle.tsx +19 -0
- package/template/src/ui/game-state.tsx +37 -0
- package/template/src/ui/index.ts +7 -0
- package/template/src/ui/mount-default-hud.tsx +19 -0
- package/template/src/ui/mount-ui.ts +15 -0
- package/template/tsconfig.json +36 -0
- package/template/validate-asset-content.ts +78 -0
- package/template/validate-manifest.ts +55 -0
- package/template/validate-scenes.ts +211 -0
- package/template/vgai.game.json +21 -0
- package/template/vite.config.ts +128 -0
- package/vite-plugin-example-assets.ts +60 -0
- package/vite-plugin-game-globals.ts +46 -0
- package/vite-plugin-game-static.ts +71 -0
- package/vite-plugin-project-game-static.ts +84 -0
- package/vite-plugin-react-game-static.ts +98 -0
- package/vite-plugin-react-world-provider.ts +81 -0
- package/vite-plugin-react-world-runtime.ts +76 -0
- package/vite-plugin-ui-oid.ts +561 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
var Hw=Object.defineProperty,Nw=Object.defineProperties;var Fw=Object.getOwnPropertyDescriptors;var Gr=Object.getOwnPropertySymbols;var Om=Object.prototype.hasOwnProperty,Pm=Object.prototype.propertyIsEnumerable;var jm=(t,e,g)=>e in t?Hw(t,e,{enumerable:!0,configurable:!0,writable:!0,value:g}):t[e]=g,_=(t,e)=>{for(var g in e||(e={}))Om.call(e,g)&&jm(t,g,e[g]);if(Gr)for(var g of Gr(e))Pm.call(e,g)&&jm(t,g,e[g]);return t},Ze=(t,e)=>Nw(t,Fw(e));var ye=(t,e)=>{var g={};for(var n in t)Om.call(t,n)&&e.indexOf(n)<0&&(g[n]=t[n]);if(t!=null&&Gr)for(var n of Gr(t))e.indexOf(n)<0&&Pm.call(t,n)&&(g[n]=t[n]);return g};import*as He from"/ingest/racing-game/three-r139.module.js";import{DefaultLoadingManager as mr,Mesh as En,BoxGeometry as id,Vector3 as mt,ShaderMaterial as kw,UniformsUtils as zw,BackSide as wZ,EventDispatcher as xw,MOUSE as yi,TOUCH as fi,PerspectiveCamera as Yo,Quaternion as oC,Spherical as _m,Vector2 as _g,OrthographicCamera as ic,Loader as VZ,LoaderUtils as Qo,FileLoader as yc,Color as fn,SpotLight as Lw,PointLight as Jw,DirectionalLight as Mw,MeshBasicMaterial as Fi,MeshPhysicalMaterial as ti,sRGBEncoding as Cd,TangentSpaceNormalMap as Ew,ImageBitmapLoader as Qw,TextureLoader as lA,InterleavedBuffer as Tw,InterleavedBufferAttribute as Uw,BufferAttribute as fc,LinearFilter as ki,LinearMipmapLinearFilter as RZ,RepeatWrapping as ld,PointsMaterial as Dw,Material as Pa,LineBasicMaterial as jw,MeshStandardMaterial as Fh,DoubleSide as Ow,PropertyBinding as Pw,BufferGeometry as Bl,SkinnedMesh as _w,LineSegments as qw,Line as $w,LineLoop as eV,Points as tV,Group as _a,MathUtils as gV,InterpolateLinear as XZ,AnimationClip as nV,Bone as IV,Object3D as ls,Matrix4 as sA,Skeleton as oV,TriangleFanDrawMode as YZ,Interpolant as iV,NearestFilter as CV,NearestMipmapNearestFilter as lV,LinearMipmapNearestFilter as sV,NearestMipmapLinearFilter as rV,ClampToEdgeWrapping as cV,MirroredRepeatWrapping as AV,InterpolateDiscrete as aV,FrontSide as uV,Texture as qm,TriangleStripDrawMode as dV,VectorKeyframeTrack as hV,QuaternionKeyframeTrack as $m,NumberKeyframeTrack as bV,Box3 as GV,Sphere as mV,DataTextureLoader as pV,HalfFloatType as dl,FloatType as qa,DataUtils as pr,LinearEncoding as ep,AudioListener as BV,AudioLoader as ZV,AnimationMixer as yV,Scene as KZ,WebGLCubeRenderTarget as fV,CubeTextureLoader as vV,CubeReflectionMapping as WV,EquirectangularReflectionMapping as wV,Euler as VV,InstancedMesh as Zl,DynamicDrawUsage as RV,SphereGeometry as tp,PlaneGeometry as gp,CylinderGeometry as XV,Float32BufferAttribute as $a}from"/ingest/racing-game/three-r139.module.js";function YV(t,e){return e.forEach(function(g){g&&typeof g!="string"&&!Array.isArray(g)&&Object.keys(g).forEach(function(n){if(n!=="default"&&!(n in t)){var I=Object.getOwnPropertyDescriptor(g,n);Object.defineProperty(t,n,I.get?I:{enumerable:!0,get:function(){return g[n]}})}})}),Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}var SZ=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{};function KV(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var kh={exports:{}},Jg={},W={exports:{}},Se={};/**
|
|
2
|
+
* @license React
|
|
3
|
+
* react.production.min.js
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the MIT license found in the
|
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/var ss=Symbol.for("react.element"),SV=Symbol.for("react.portal"),HV=Symbol.for("react.fragment"),NV=Symbol.for("react.strict_mode"),FV=Symbol.for("react.profiler"),kV=Symbol.for("react.provider"),zV=Symbol.for("react.context"),xV=Symbol.for("react.forward_ref"),LV=Symbol.for("react.suspense"),JV=Symbol.for("react.memo"),MV=Symbol.for("react.lazy"),np=Symbol.iterator;function EV(t){return t===null||typeof t!="object"?null:(t=np&&t[np]||t["@@iterator"],typeof t=="function"?t:null)}var HZ={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},NZ=Object.assign,FZ={};function bC(t,e,g){this.props=t,this.context=e,this.refs=FZ,this.updater=g||HZ}bC.prototype.isReactComponent={};bC.prototype.setState=function(t,e){if(typeof t!="object"&&typeof t!="function"&&t!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,t,e,"setState")};bC.prototype.forceUpdate=function(t){this.updater.enqueueForceUpdate(this,t,"forceUpdate")};function kZ(){}kZ.prototype=bC.prototype;function zh(t,e,g){this.props=t,this.context=e,this.refs=FZ,this.updater=g||HZ}var xh=zh.prototype=new kZ;xh.constructor=zh;NZ(xh,bC.prototype);xh.isPureReactComponent=!0;var Ip=Array.isArray,zZ=Object.prototype.hasOwnProperty,Lh={current:null},xZ={key:!0,ref:!0,__self:!0,__source:!0};function LZ(t,e,g){var n,I={},o=null,i=null;if(e!=null)for(n in e.ref!==void 0&&(i=e.ref),e.key!==void 0&&(o=""+e.key),e)zZ.call(e,n)&&!xZ.hasOwnProperty(n)&&(I[n]=e[n]);var l=arguments.length-2;if(l===1)I.children=g;else if(1<l){for(var r=Array(l),c=0;c<l;c++)r[c]=arguments[c+2];I.children=r}if(t&&t.defaultProps)for(n in l=t.defaultProps,l)I[n]===void 0&&(I[n]=l[n]);return{$$typeof:ss,type:t,key:o,ref:i,props:I,_owner:Lh.current}}function QV(t,e){return{$$typeof:ss,type:t.type,key:e,ref:t.ref,props:t.props,_owner:t._owner}}function Jh(t){return typeof t=="object"&&t!==null&&t.$$typeof===ss}function TV(t){var e={"=":"=0",":":"=2"};return"$"+t.replace(/[=:]/g,function(g){return e[g]})}var op=/\/+/g;function eu(t,e){return typeof t=="object"&&t!==null&&t.key!=null?TV(""+t.key):e.toString(36)}function Cc(t,e,g,n,I){var o=typeof t;(o==="undefined"||o==="boolean")&&(t=null);var i=!1;if(t===null)i=!0;else switch(o){case"string":case"number":i=!0;break;case"object":switch(t.$$typeof){case ss:case SV:i=!0}}if(i)return i=t,I=I(i),t=n===""?"."+eu(i,0):n,Ip(I)?(g="",t!=null&&(g=t.replace(op,"$&/")+"/"),Cc(I,e,g,"",function(c){return c})):I!=null&&(Jh(I)&&(I=QV(I,g+(!I.key||i&&i.key===I.key?"":(""+I.key).replace(op,"$&/")+"/")+t)),e.push(I)),1;if(i=0,n=n===""?".":n+":",Ip(t))for(var l=0;l<t.length;l++){o=t[l];var r=n+eu(o,l);i+=Cc(o,e,g,r,I)}else if(r=EV(t),typeof r=="function")for(t=r.call(t),l=0;!(o=t.next()).done;)o=o.value,r=n+eu(o,l++),i+=Cc(o,e,g,r,I);else if(o==="object")throw e=String(t),Error("Objects are not valid as a React child (found: "+(e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e)+"). If you meant to render a collection of children, use an array instead.");return i}function Br(t,e,g){if(t==null)return t;var n=[],I=0;return Cc(t,n,"","",function(o){return e.call(g,o,I++)}),n}function UV(t){if(t._status===-1){var e=t._result;e=e(),e.then(function(g){(t._status===0||t._status===-1)&&(t._status=1,t._result=g)},function(g){(t._status===0||t._status===-1)&&(t._status=2,t._result=g)}),t._status===-1&&(t._status=0,t._result=e)}if(t._status===1)return t._result.default;throw t._result}var cg={current:null},lc={transition:null},DV={ReactCurrentDispatcher:cg,ReactCurrentBatchConfig:lc,ReactCurrentOwner:Lh};Se.Children={map:Br,forEach:function(t,e,g){Br(t,function(){e.apply(this,arguments)},g)},count:function(t){var e=0;return Br(t,function(){e++}),e},toArray:function(t){return Br(t,function(e){return e})||[]},only:function(t){if(!Jh(t))throw Error("React.Children.only expected to receive a single React element child.");return t}};Se.Component=bC;Se.Fragment=HV;Se.Profiler=FV;Se.PureComponent=zh;Se.StrictMode=NV;Se.Suspense=LV;Se.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=DV;Se.cloneElement=function(t,e,g){if(t==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+t+".");var n=NZ({},t.props),I=t.key,o=t.ref,i=t._owner;if(e!=null){if(e.ref!==void 0&&(o=e.ref,i=Lh.current),e.key!==void 0&&(I=""+e.key),t.type&&t.type.defaultProps)var l=t.type.defaultProps;for(r in e)zZ.call(e,r)&&!xZ.hasOwnProperty(r)&&(n[r]=e[r]===void 0&&l!==void 0?l[r]:e[r])}var r=arguments.length-2;if(r===1)n.children=g;else if(1<r){l=Array(r);for(var c=0;c<r;c++)l[c]=arguments[c+2];n.children=l}return{$$typeof:ss,type:t.type,key:I,ref:o,props:n,_owner:i}};Se.createContext=function(t){return t={$$typeof:zV,_currentValue:t,_currentValue2:t,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},t.Provider={$$typeof:kV,_context:t},t.Consumer=t};Se.createElement=LZ;Se.createFactory=function(t){var e=LZ.bind(null,t);return e.type=t,e};Se.createRef=function(){return{current:null}};Se.forwardRef=function(t){return{$$typeof:xV,render:t}};Se.isValidElement=Jh;Se.lazy=function(t){return{$$typeof:MV,_payload:{_status:-1,_result:t},_init:UV}};Se.memo=function(t,e){return{$$typeof:JV,type:t,compare:e===void 0?null:e}};Se.startTransition=function(t){var e=lc.transition;lc.transition={};try{t()}finally{lc.transition=e}};Se.unstable_act=function(){throw Error("act(...) is not supported in production builds of React.")};Se.useCallback=function(t,e){return cg.current.useCallback(t,e)};Se.useContext=function(t){return cg.current.useContext(t)};Se.useDebugValue=function(){};Se.useDeferredValue=function(t){return cg.current.useDeferredValue(t)};Se.useEffect=function(t,e){return cg.current.useEffect(t,e)};Se.useId=function(){return cg.current.useId()};Se.useImperativeHandle=function(t,e,g){return cg.current.useImperativeHandle(t,e,g)};Se.useInsertionEffect=function(t,e){return cg.current.useInsertionEffect(t,e)};Se.useLayoutEffect=function(t,e){return cg.current.useLayoutEffect(t,e)};Se.useMemo=function(t,e){return cg.current.useMemo(t,e)};Se.useReducer=function(t,e,g){return cg.current.useReducer(t,e,g)};Se.useRef=function(t){return cg.current.useRef(t)};Se.useState=function(t){return cg.current.useState(t)};Se.useSyncExternalStore=function(t,e,g){return cg.current.useSyncExternalStore(t,e,g)};Se.useTransition=function(){return cg.current.useTransition()};Se.version="18.0.0-fc46dba67-20220329";W.exports=Se;var ae=W.exports,jV=YV({__proto__:null,default:ae},[W.exports]),Fl={exports:{}},JZ={};/**
|
|
10
|
+
* @license React
|
|
11
|
+
* scheduler.production.min.js
|
|
12
|
+
*
|
|
13
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
14
|
+
*
|
|
15
|
+
* This source code is licensed under the MIT license found in the
|
|
16
|
+
* LICENSE file in the root directory of this source tree.
|
|
17
|
+
*/(function(t){function e(T,q){var ge=T.length;T.push(q);e:for(;0<ge;){var se=ge-1>>>1,ue=T[se];if(0<I(ue,q))T[se]=q,T[ge]=ue,ge=se;else break e}}function g(T){return T.length===0?null:T[0]}function n(T){if(T.length===0)return null;var q=T[0],ge=T.pop();if(ge!==q){T[0]=ge;e:for(var se=0,ue=T.length,Ye=ue>>>1;se<Ye;){var Te=2*(se+1)-1,et=T[Te],yt=Te+1,dt=T[yt];if(0>I(et,ge))yt<ue&&0>I(dt,et)?(T[se]=dt,T[yt]=ge,se=yt):(T[se]=et,T[Te]=ge,se=Te);else if(yt<ue&&0>I(dt,ge))T[se]=dt,T[yt]=ge,se=yt;else break e}}return q}function I(T,q){var ge=T.sortIndex-q.sortIndex;return ge!==0?ge:T.id-q.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;t.unstable_now=function(){return o.now()}}else{var i=Date,l=i.now();t.unstable_now=function(){return i.now()-l}}var r=[],c=[],A=1,u=null,h=3,b=!1,p=!1,Z=!1,v=typeof setTimeout=="function"?setTimeout:null,y=typeof clearTimeout=="function"?clearTimeout:null,m=typeof setImmediate!="undefined"?setImmediate:null;typeof navigator!="undefined"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function B(T){for(var q=g(c);q!==null;){if(q.callback===null)n(c);else if(q.startTime<=T)n(c),q.sortIndex=q.expirationTime,e(r,q);else break;q=g(c)}}function w(T){if(Z=!1,B(T),!p)if(g(r)!==null)p=!0,P(X);else{var q=g(c);q!==null&&$(w,q.startTime-T)}}function X(T,q){p=!1,Z&&(Z=!1,y(Y),Y=-1),b=!0;var ge=h;try{for(B(q),u=g(r);u!==null&&(!(u.expirationTime>q)||T&&!z());){var se=u.callback;if(typeof se=="function"){u.callback=null,h=u.priorityLevel;var ue=se(u.expirationTime<=q);q=t.unstable_now(),typeof ue=="function"?u.callback=ue:u===g(r)&&n(r),B(q)}else n(r);u=g(r)}if(u!==null)var Ye=!0;else{var Te=g(c);Te!==null&&$(w,Te.startTime-q),Ye=!1}return Ye}finally{u=null,h=ge,b=!1}}var R=!1,S=null,Y=-1,k=5,N=-1;function z(){return!(t.unstable_now()-N<k)}function M(){if(S!==null){var T=t.unstable_now();N=T;var q=!0;try{q=S(!0,T)}finally{q?j():(R=!1,S=null)}}else R=!1}var j;if(typeof m=="function")j=function(){m(M)};else if(typeof MessageChannel!="undefined"){var F=new MessageChannel,L=F.port2;F.port1.onmessage=M,j=function(){L.postMessage(null)}}else j=function(){v(M,0)};function P(T){S=T,R||(R=!0,j())}function $(T,q){Y=v(function(){T(t.unstable_now())},q)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(T){T.callback=null},t.unstable_continueExecution=function(){p||b||(p=!0,P(X))},t.unstable_forceFrameRate=function(T){0>T||125<T?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):k=0<T?Math.floor(1e3/T):5},t.unstable_getCurrentPriorityLevel=function(){return h},t.unstable_getFirstCallbackNode=function(){return g(r)},t.unstable_next=function(T){switch(h){case 1:case 2:case 3:var q=3;break;default:q=h}var ge=h;h=q;try{return T()}finally{h=ge}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=function(){},t.unstable_runWithPriority=function(T,q){switch(T){case 1:case 2:case 3:case 4:case 5:break;default:T=3}var ge=h;h=T;try{return q()}finally{h=ge}},t.unstable_scheduleCallback=function(T,q,ge){var se=t.unstable_now();switch(typeof ge=="object"&&ge!==null?(ge=ge.delay,ge=typeof ge=="number"&&0<ge?se+ge:se):ge=se,T){case 1:var ue=-1;break;case 2:ue=250;break;case 5:ue=1073741823;break;case 4:ue=1e4;break;default:ue=5e3}return ue=ge+ue,T={id:A++,callback:q,priorityLevel:T,startTime:ge,expirationTime:ue,sortIndex:-1},ge>se?(T.sortIndex=ge,e(c,T),g(r)===null&&T===g(c)&&(Z?(y(Y),Y=-1):Z=!0,$(w,ge-se))):(T.sortIndex=ue,e(r,T),p||b||(p=!0,P(X))),T},t.unstable_shouldYield=z,t.unstable_wrapCallback=function(T){var q=h;return function(){var ge=h;h=q;try{return T.apply(this,arguments)}finally{h=ge}}}})(JZ);Fl.exports=JZ;/**
|
|
18
|
+
* @license React
|
|
19
|
+
* react-dom.production.min.js
|
|
20
|
+
*
|
|
21
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
22
|
+
*
|
|
23
|
+
* This source code is licensed under the MIT license found in the
|
|
24
|
+
* LICENSE file in the root directory of this source tree.
|
|
25
|
+
*/var MZ=W.exports,Lg=Fl.exports;function ee(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,g=1;g<arguments.length;g++)e+="&args[]="+encodeURIComponent(arguments[g]);return"Minified React error #"+t+"; visit "+e+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var EZ=new Set,kl={};function gi(t,e){iC(t,e),iC(t+"Capture",e)}function iC(t,e){for(kl[t]=e,t=0;t<e.length;t++)EZ.add(e[t])}var yI=!(typeof window=="undefined"||typeof window.document=="undefined"||typeof window.document.createElement=="undefined"),sd=Object.prototype.hasOwnProperty,OV=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ip={},Cp={};function PV(t){return sd.call(Cp,t)?!0:sd.call(ip,t)?!1:OV.test(t)?Cp[t]=!0:(ip[t]=!0,!1)}function _V(t,e,g,n){if(g!==null&&g.type===0)return!1;switch(typeof e){case"function":case"symbol":return!0;case"boolean":return n?!1:g!==null?!g.acceptsBooleans:(t=t.toLowerCase().slice(0,5),t!=="data-"&&t!=="aria-");default:return!1}}function qV(t,e,g,n){if(e===null||typeof e=="undefined"||_V(t,e,g,n))return!0;if(n)return!1;if(g!==null)switch(g.type){case 3:return!e;case 4:return e===!1;case 5:return isNaN(e);case 6:return isNaN(e)||1>e}return!1}function Ag(t,e,g,n,I,o,i){this.acceptsBooleans=e===2||e===3||e===4,this.attributeName=n,this.attributeNamespace=I,this.mustUseProperty=g,this.propertyName=t,this.type=e,this.sanitizeURL=o,this.removeEmptyString=i}var Jt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(t){Jt[t]=new Ag(t,0,!1,t,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(t){var e=t[0];Jt[e]=new Ag(e,1,!1,t[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(t){Jt[t]=new Ag(t,2,!1,t.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(t){Jt[t]=new Ag(t,2,!1,t,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(t){Jt[t]=new Ag(t,3,!1,t.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(t){Jt[t]=new Ag(t,3,!0,t,null,!1,!1)});["capture","download"].forEach(function(t){Jt[t]=new Ag(t,4,!1,t,null,!1,!1)});["cols","rows","size","span"].forEach(function(t){Jt[t]=new Ag(t,6,!1,t,null,!1,!1)});["rowSpan","start"].forEach(function(t){Jt[t]=new Ag(t,5,!1,t.toLowerCase(),null,!1,!1)});var Mh=/[\-:]([a-z])/g;function Eh(t){return t[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(t){var e=t.replace(Mh,Eh);Jt[e]=new Ag(e,1,!1,t,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(t){var e=t.replace(Mh,Eh);Jt[e]=new Ag(e,1,!1,t,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(t){var e=t.replace(Mh,Eh);Jt[e]=new Ag(e,1,!1,t,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(t){Jt[t]=new Ag(t,1,!1,t.toLowerCase(),null,!1,!1)});Jt.xlinkHref=new Ag("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(t){Jt[t]=new Ag(t,1,!1,t.toLowerCase(),null,!0,!0)});function Qh(t,e,g,n){var I=Jt.hasOwnProperty(e)?Jt[e]:null;(I!==null?I.type!==0:n||!(2<e.length)||e[0]!=="o"&&e[0]!=="O"||e[1]!=="n"&&e[1]!=="N")&&(qV(e,g,I,n)&&(g=null),n||I===null?PV(e)&&(g===null?t.removeAttribute(e):t.setAttribute(e,""+g)):I.mustUseProperty?t[I.propertyName]=g===null?I.type===3?!1:"":g:(e=I.attributeName,n=I.attributeNamespace,g===null?t.removeAttribute(e):(I=I.type,g=I===3||I===4&&g===!0?"":""+g,n?t.setAttributeNS(n,e,g):t.setAttribute(e,g))))}var wI=MZ.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Zr=Symbol.for("react.element"),zi=Symbol.for("react.portal"),xi=Symbol.for("react.fragment"),Th=Symbol.for("react.strict_mode"),rd=Symbol.for("react.profiler"),QZ=Symbol.for("react.provider"),TZ=Symbol.for("react.context"),Uh=Symbol.for("react.forward_ref"),cd=Symbol.for("react.suspense"),Ad=Symbol.for("react.suspense_list"),Dh=Symbol.for("react.memo"),OI=Symbol.for("react.lazy"),UZ=Symbol.for("react.offscreen"),lp=Symbol.iterator;function DC(t){return t===null||typeof t!="object"?null:(t=lp&&t[lp]||t["@@iterator"],typeof t=="function"?t:null)}var ct=Object.assign,tu;function hl(t){if(tu===void 0)try{throw Error()}catch(g){var e=g.stack.trim().match(/\n( *(at )?)/);tu=e&&e[1]||""}return`
|
|
26
|
+
`+tu+t}var gu=!1;function nu(t,e){if(!t||gu)return"";gu=!0;var g=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(e)if(e=function(){throw Error()},Object.defineProperty(e.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(e,[])}catch(c){var n=c}Reflect.construct(t,[],e)}else{try{e.call()}catch(c){n=c}t.call(e.prototype)}else{try{throw Error()}catch(c){n=c}t()}}catch(c){if(c&&n&&typeof c.stack=="string"){for(var I=c.stack.split(`
|
|
27
|
+
`),o=n.stack.split(`
|
|
28
|
+
`),i=I.length-1,l=o.length-1;1<=i&&0<=l&&I[i]!==o[l];)l--;for(;1<=i&&0<=l;i--,l--)if(I[i]!==o[l]){if(i!==1||l!==1)do if(i--,l--,0>l||I[i]!==o[l]){var r=`
|
|
29
|
+
`+I[i].replace(" at new "," at ");return t.displayName&&r.includes("<anonymous>")&&(r=r.replace("<anonymous>",t.displayName)),r}while(1<=i&&0<=l);break}}}finally{gu=!1,Error.prepareStackTrace=g}return(t=t?t.displayName||t.name:"")?hl(t):""}function $V(t){switch(t.tag){case 5:return hl(t.type);case 16:return hl("Lazy");case 13:return hl("Suspense");case 19:return hl("SuspenseList");case 0:case 2:case 15:return t=nu(t.type,!1),t;case 11:return t=nu(t.type.render,!1),t;case 1:return t=nu(t.type,!0),t;default:return""}}function ad(t){if(t==null)return null;if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t;switch(t){case xi:return"Fragment";case zi:return"Portal";case rd:return"Profiler";case Th:return"StrictMode";case cd:return"Suspense";case Ad:return"SuspenseList"}if(typeof t=="object")switch(t.$$typeof){case TZ:return(t.displayName||"Context")+".Consumer";case QZ:return(t._context.displayName||"Context")+".Provider";case Uh:var e=t.render;return t=t.displayName,t||(t=e.displayName||e.name||"",t=t!==""?"ForwardRef("+t+")":"ForwardRef"),t;case Dh:return e=t.displayName||null,e!==null?e:ad(t.type)||"Memo";case OI:e=t._payload,t=t._init;try{return ad(t(e))}catch{}}return null}function eR(t){var e=t.type;switch(t.tag){case 24:return"Cache";case 9:return(e.displayName||"Context")+".Consumer";case 10:return(e._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return t=e.render,t=t.displayName||t.name||"",e.displayName||(t!==""?"ForwardRef("+t+")":"ForwardRef");case 7:return"Fragment";case 5:return e;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ad(e);case 8:return e===Th?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e}return null}function so(t){switch(typeof t){case"boolean":case"number":case"string":case"undefined":return t;case"object":return t;default:return""}}function DZ(t){var e=t.type;return(t=t.nodeName)&&t.toLowerCase()==="input"&&(e==="checkbox"||e==="radio")}function tR(t){var e=DZ(t)?"checked":"value",g=Object.getOwnPropertyDescriptor(t.constructor.prototype,e),n=""+t[e];if(!t.hasOwnProperty(e)&&typeof g!="undefined"&&typeof g.get=="function"&&typeof g.set=="function"){var I=g.get,o=g.set;return Object.defineProperty(t,e,{configurable:!0,get:function(){return I.call(this)},set:function(i){n=""+i,o.call(this,i)}}),Object.defineProperty(t,e,{enumerable:g.enumerable}),{getValue:function(){return n},setValue:function(i){n=""+i},stopTracking:function(){t._valueTracker=null,delete t[e]}}}}function yr(t){t._valueTracker||(t._valueTracker=tR(t))}function jZ(t){if(!t)return!1;var e=t._valueTracker;if(!e)return!0;var g=e.getValue(),n="";return t&&(n=DZ(t)?t.checked?"true":"false":t.value),t=n,t!==g?(e.setValue(t),!0):!1}function vc(t){if(t=t||(typeof document!="undefined"?document:void 0),typeof t=="undefined")return null;try{return t.activeElement||t.body}catch{return t.body}}function ud(t,e){var g=e.checked;return ct({},e,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:g!=null?g:t._wrapperState.initialChecked})}function sp(t,e){var g=e.defaultValue==null?"":e.defaultValue,n=e.checked!=null?e.checked:e.defaultChecked;g=so(e.value!=null?e.value:g),t._wrapperState={initialChecked:n,initialValue:g,controlled:e.type==="checkbox"||e.type==="radio"?e.checked!=null:e.value!=null}}function OZ(t,e){e=e.checked,e!=null&&Qh(t,"checked",e,!1)}function dd(t,e){OZ(t,e);var g=so(e.value),n=e.type;if(g!=null)n==="number"?(g===0&&t.value===""||t.value!=g)&&(t.value=""+g):t.value!==""+g&&(t.value=""+g);else if(n==="submit"||n==="reset"){t.removeAttribute("value");return}e.hasOwnProperty("value")?hd(t,e.type,g):e.hasOwnProperty("defaultValue")&&hd(t,e.type,so(e.defaultValue)),e.checked==null&&e.defaultChecked!=null&&(t.defaultChecked=!!e.defaultChecked)}function rp(t,e,g){if(e.hasOwnProperty("value")||e.hasOwnProperty("defaultValue")){var n=e.type;if(!(n!=="submit"&&n!=="reset"||e.value!==void 0&&e.value!==null))return;e=""+t._wrapperState.initialValue,g||e===t.value||(t.value=e),t.defaultValue=e}g=t.name,g!==""&&(t.name=""),t.defaultChecked=!!t._wrapperState.initialChecked,g!==""&&(t.name=g)}function hd(t,e,g){(e!=="number"||vc(t.ownerDocument)!==t)&&(g==null?t.defaultValue=""+t._wrapperState.initialValue:t.defaultValue!==""+g&&(t.defaultValue=""+g))}var bl=Array.isArray;function Pi(t,e,g,n){if(t=t.options,e){e={};for(var I=0;I<g.length;I++)e["$"+g[I]]=!0;for(g=0;g<t.length;g++)I=e.hasOwnProperty("$"+t[g].value),t[g].selected!==I&&(t[g].selected=I),I&&n&&(t[g].defaultSelected=!0)}else{for(g=""+so(g),e=null,I=0;I<t.length;I++){if(t[I].value===g){t[I].selected=!0,n&&(t[I].defaultSelected=!0);return}e!==null||t[I].disabled||(e=t[I])}e!==null&&(e.selected=!0)}}function bd(t,e){if(e.dangerouslySetInnerHTML!=null)throw Error(ee(91));return ct({},e,{value:void 0,defaultValue:void 0,children:""+t._wrapperState.initialValue})}function cp(t,e){var g=e.value;if(g==null){if(g=e.children,e=e.defaultValue,g!=null){if(e!=null)throw Error(ee(92));if(bl(g)){if(1<g.length)throw Error(ee(93));g=g[0]}e=g}e==null&&(e=""),g=e}t._wrapperState={initialValue:so(g)}}function PZ(t,e){var g=so(e.value),n=so(e.defaultValue);g!=null&&(g=""+g,g!==t.value&&(t.value=g),e.defaultValue==null&&t.defaultValue!==g&&(t.defaultValue=g)),n!=null&&(t.defaultValue=""+n)}function Ap(t){var e=t.textContent;e===t._wrapperState.initialValue&&e!==""&&e!==null&&(t.value=e)}function _Z(t){switch(t){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Gd(t,e){return t==null||t==="http://www.w3.org/1999/xhtml"?_Z(e):t==="http://www.w3.org/2000/svg"&&e==="foreignObject"?"http://www.w3.org/1999/xhtml":t}var fr,qZ=function(t){return typeof MSApp!="undefined"&&MSApp.execUnsafeLocalFunction?function(e,g,n,I){MSApp.execUnsafeLocalFunction(function(){return t(e,g,n,I)})}:t}(function(t,e){if(t.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in t)t.innerHTML=e;else{for(fr=fr||document.createElement("div"),fr.innerHTML="<svg>"+e.valueOf().toString()+"</svg>",e=fr.firstChild;t.firstChild;)t.removeChild(t.firstChild);for(;e.firstChild;)t.appendChild(e.firstChild)}});function zl(t,e){if(e){var g=t.firstChild;if(g&&g===t.lastChild&&g.nodeType===3){g.nodeValue=e;return}}t.textContent=e}var yl={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},gR=["Webkit","ms","Moz","O"];Object.keys(yl).forEach(function(t){gR.forEach(function(e){e=e+t.charAt(0).toUpperCase()+t.substring(1),yl[e]=yl[t]})});function $Z(t,e,g){return e==null||typeof e=="boolean"||e===""?"":g||typeof e!="number"||e===0||yl.hasOwnProperty(t)&&yl[t]?(""+e).trim():e+"px"}function ey(t,e){t=t.style;for(var g in e)if(e.hasOwnProperty(g)){var n=g.indexOf("--")===0,I=$Z(g,e[g],n);g==="float"&&(g="cssFloat"),n?t.setProperty(g,I):t[g]=I}}var nR=ct({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function md(t,e){if(e){if(nR[t]&&(e.children!=null||e.dangerouslySetInnerHTML!=null))throw Error(ee(137,t));if(e.dangerouslySetInnerHTML!=null){if(e.children!=null)throw Error(ee(60));if(typeof e.dangerouslySetInnerHTML!="object"||!("__html"in e.dangerouslySetInnerHTML))throw Error(ee(61))}if(e.style!=null&&typeof e.style!="object")throw Error(ee(62))}}function pd(t,e){if(t.indexOf("-")===-1)return typeof e.is=="string";switch(t){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Bd=null;function jh(t){return t=t.target||t.srcElement||window,t.correspondingUseElement&&(t=t.correspondingUseElement),t.nodeType===3?t.parentNode:t}var Zd=null,_i=null,qi=null;function ap(t){if(t=As(t)){if(typeof Zd!="function")throw Error(ee(280));var e=t.stateNode;e&&(e=uA(e),Zd(t.stateNode,t.type,e))}}function ty(t){_i?qi?qi.push(t):qi=[t]:_i=t}function gy(){if(_i){var t=_i,e=qi;if(qi=_i=null,ap(t),e)for(t=0;t<e.length;t++)ap(e[t])}}function ny(t,e){return t(e)}function Iy(){}var Iu=!1;function oy(t,e,g){if(Iu)return t(e,g);Iu=!0;try{return ny(t,e,g)}finally{Iu=!1,(_i!==null||qi!==null)&&(Iy(),gy())}}function xl(t,e){var g=t.stateNode;if(g===null)return null;var n=uA(g);if(n===null)return null;g=n[e];e:switch(e){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(n=!n.disabled)||(t=t.type,n=!(t==="button"||t==="input"||t==="select"||t==="textarea")),t=!n;break e;default:t=!1}if(t)return null;if(g&&typeof g!="function")throw Error(ee(231,e,typeof g));return g}var yd=!1;if(yI)try{var jC={};Object.defineProperty(jC,"passive",{get:function(){yd=!0}}),window.addEventListener("test",jC,jC),window.removeEventListener("test",jC,jC)}catch{yd=!1}function IR(t,e,g,n,I,o,i,l,r){var c=Array.prototype.slice.call(arguments,3);try{e.apply(g,c)}catch(A){this.onError(A)}}var fl=!1,Wc=null,wc=!1,fd=null,oR={onError:function(t){fl=!0,Wc=t}};function iR(t,e,g,n,I,o,i,l,r){fl=!1,Wc=null,IR.apply(oR,arguments)}function CR(t,e,g,n,I,o,i,l,r){if(iR.apply(this,arguments),fl){if(fl){var c=Wc;fl=!1,Wc=null}else throw Error(ee(198));wc||(wc=!0,fd=c)}}function ni(t){var e=t,g=t;if(t.alternate)for(;e.return;)e=e.return;else{t=e;do e=t,(e.flags&4098)!==0&&(g=e.return),t=e.return;while(t)}return e.tag===3?g:null}function iy(t){if(t.tag===13){var e=t.memoizedState;if(e===null&&(t=t.alternate,t!==null&&(e=t.memoizedState)),e!==null)return e.dehydrated}return null}function up(t){if(ni(t)!==t)throw Error(ee(188))}function lR(t){var e=t.alternate;if(!e){if(e=ni(t),e===null)throw Error(ee(188));return e!==t?null:t}for(var g=t,n=e;;){var I=g.return;if(I===null)break;var o=I.alternate;if(o===null){if(n=I.return,n!==null){g=n;continue}break}if(I.child===o.child){for(o=I.child;o;){if(o===g)return up(I),t;if(o===n)return up(I),e;o=o.sibling}throw Error(ee(188))}if(g.return!==n.return)g=I,n=o;else{for(var i=!1,l=I.child;l;){if(l===g){i=!0,g=I,n=o;break}if(l===n){i=!0,n=I,g=o;break}l=l.sibling}if(!i){for(l=o.child;l;){if(l===g){i=!0,g=o,n=I;break}if(l===n){i=!0,n=o,g=I;break}l=l.sibling}if(!i)throw Error(ee(189))}}if(g.alternate!==n)throw Error(ee(190))}if(g.tag!==3)throw Error(ee(188));return g.stateNode.current===g?t:e}function Cy(t){return t=lR(t),t!==null?ly(t):null}function ly(t){if(t.tag===5||t.tag===6)return t;for(t=t.child;t!==null;){var e=ly(t);if(e!==null)return e;t=t.sibling}return null}var sy=Lg.unstable_scheduleCallback,dp=Lg.unstable_cancelCallback,sR=Lg.unstable_shouldYield,rR=Lg.unstable_requestPaint,Bt=Lg.unstable_now,cR=Lg.unstable_getCurrentPriorityLevel,Oh=Lg.unstable_ImmediatePriority,ry=Lg.unstable_UserBlockingPriority,Vc=Lg.unstable_NormalPriority,AR=Lg.unstable_LowPriority,cy=Lg.unstable_IdlePriority,rA=null,Dn=null;function aR(t){if(Dn&&typeof Dn.onCommitFiberRoot=="function")try{Dn.onCommitFiberRoot(rA,t,void 0,(t.current.flags&128)===128)}catch{}}var vn=Math.clz32?Math.clz32:hR,uR=Math.log,dR=Math.LN2;function hR(t){return t>>>=0,t===0?32:31-(uR(t)/dR|0)|0}var vr=64,Wr=4194304;function Gl(t){switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return t&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return t}}function Rc(t,e){var g=t.pendingLanes;if(g===0)return 0;var n=0,I=t.suspendedLanes,o=t.pingedLanes,i=g&268435455;if(i!==0){var l=i&~I;l!==0?n=Gl(l):(o&=i,o!==0&&(n=Gl(o)))}else i=g&~I,i!==0?n=Gl(i):o!==0&&(n=Gl(o));if(n===0)return 0;if(e!==0&&e!==n&&(e&I)===0&&(I=n&-n,o=e&-e,I>=o||I===16&&(o&4194240)!==0))return e;if((n&4)!==0&&(n|=g&16),e=t.entangledLanes,e!==0)for(t=t.entanglements,e&=n;0<e;)g=31-vn(e),I=1<<g,n|=t[g],e&=~I;return n}function bR(t,e){switch(t){case 1:case 2:case 4:return e+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function GR(t,e){for(var g=t.suspendedLanes,n=t.pingedLanes,I=t.expirationTimes,o=t.pendingLanes;0<o;){var i=31-vn(o),l=1<<i,r=I[i];r===-1?((l&g)===0||(l&n)!==0)&&(I[i]=bR(l,e)):r<=e&&(t.expiredLanes|=l),o&=~l}}function vd(t){return t=t.pendingLanes&-1073741825,t!==0?t:t&1073741824?1073741824:0}function ou(t){for(var e=[],g=0;31>g;g++)e.push(t);return e}function rs(t,e,g){t.pendingLanes|=e,e!==536870912&&(t.suspendedLanes=0,t.pingedLanes=0),t=t.eventTimes,e=31-vn(e),t[e]=g}function mR(t,e){var g=t.pendingLanes&~e;t.pendingLanes=e,t.suspendedLanes=0,t.pingedLanes=0,t.expiredLanes&=e,t.mutableReadLanes&=e,t.entangledLanes&=e,e=t.entanglements;var n=t.eventTimes;for(t=t.expirationTimes;0<g;){var I=31-vn(g),o=1<<I;e[I]=0,n[I]=-1,t[I]=-1,g&=~o}}function Ph(t,e){var g=t.entangledLanes|=e;for(t=t.entanglements;g;){var n=31-vn(g),I=1<<n;I&e|t[n]&e&&(t[n]|=e),g&=~I}}var Je=0;function Ay(t){return t&=-t,1<t?4<t?(t&268435455)!==0?16:536870912:4:1}var ay,_h,uy,dy,hy,Wd=!1,wr=[],no=null,Io=null,oo=null,Ll=new Map,Jl=new Map,_I=[],pR="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function hp(t,e){switch(t){case"focusin":case"focusout":no=null;break;case"dragenter":case"dragleave":Io=null;break;case"mouseover":case"mouseout":oo=null;break;case"pointerover":case"pointerout":Ll.delete(e.pointerId);break;case"gotpointercapture":case"lostpointercapture":Jl.delete(e.pointerId)}}function OC(t,e,g,n,I,o){return t===null||t.nativeEvent!==o?(t={blockedOn:e,domEventName:g,eventSystemFlags:n,nativeEvent:o,targetContainers:[I]},e!==null&&(e=As(e),e!==null&&_h(e)),t):(t.eventSystemFlags|=n,e=t.targetContainers,I!==null&&e.indexOf(I)===-1&&e.push(I),t)}function BR(t,e,g,n,I){switch(e){case"focusin":return no=OC(no,t,e,g,n,I),!0;case"dragenter":return Io=OC(Io,t,e,g,n,I),!0;case"mouseover":return oo=OC(oo,t,e,g,n,I),!0;case"pointerover":var o=I.pointerId;return Ll.set(o,OC(Ll.get(o)||null,t,e,g,n,I)),!0;case"gotpointercapture":return o=I.pointerId,Jl.set(o,OC(Jl.get(o)||null,t,e,g,n,I)),!0}return!1}function by(t){var e=Lo(t.target);if(e!==null){var g=ni(e);if(g!==null){if(e=g.tag,e===13){if(e=iy(g),e!==null){t.blockedOn=e,hy(t.priority,function(){uy(g)});return}}else if(e===3&&g.stateNode.current.memoizedState.isDehydrated){t.blockedOn=g.tag===3?g.stateNode.containerInfo:null;return}}}t.blockedOn=null}function sc(t){if(t.blockedOn!==null)return!1;for(var e=t.targetContainers;0<e.length;){var g=wd(t.domEventName,t.eventSystemFlags,e[0],t.nativeEvent);if(g===null){g=t.nativeEvent;var n=new g.constructor(g.type,g);Bd=n,g.target.dispatchEvent(n),Bd=null}else return e=As(g),e!==null&&_h(e),t.blockedOn=g,!1;e.shift()}return!0}function bp(t,e,g){sc(t)&&g.delete(e)}function ZR(){Wd=!1,no!==null&&sc(no)&&(no=null),Io!==null&&sc(Io)&&(Io=null),oo!==null&&sc(oo)&&(oo=null),Ll.forEach(bp),Jl.forEach(bp)}function PC(t,e){t.blockedOn===e&&(t.blockedOn=null,Wd||(Wd=!0,Lg.unstable_scheduleCallback(Lg.unstable_NormalPriority,ZR)))}function Ml(t){function e(I){return PC(I,t)}if(0<wr.length){PC(wr[0],t);for(var g=1;g<wr.length;g++){var n=wr[g];n.blockedOn===t&&(n.blockedOn=null)}}for(no!==null&&PC(no,t),Io!==null&&PC(Io,t),oo!==null&&PC(oo,t),Ll.forEach(e),Jl.forEach(e),g=0;g<_I.length;g++)n=_I[g],n.blockedOn===t&&(n.blockedOn=null);for(;0<_I.length&&(g=_I[0],g.blockedOn===null);)by(g),g.blockedOn===null&&_I.shift()}var $i=wI.ReactCurrentBatchConfig;function yR(t,e,g,n){var I=Je,o=$i.transition;$i.transition=null;try{Je=1,qh(t,e,g,n)}finally{Je=I,$i.transition=o}}function fR(t,e,g,n){var I=Je,o=$i.transition;$i.transition=null;try{Je=4,qh(t,e,g,n)}finally{Je=I,$i.transition=o}}function qh(t,e,g,n){var I=wd(t,e,g,n);if(I===null)du(t,e,n,Xc,g),hp(t,n);else if(BR(I,t,e,g,n))n.stopPropagation();else if(hp(t,n),e&4&&-1<pR.indexOf(t)){for(;I!==null;){var o=As(I);if(o!==null&&ay(o),o=wd(t,e,g,n),o===null&&du(t,e,n,Xc,g),o===I)break;I=o}I!==null&&n.stopPropagation()}else du(t,e,n,null,g)}var Xc=null;function wd(t,e,g,n){if(Xc=null,t=jh(n),t=Lo(t),t!==null)if(e=ni(t),e===null)t=null;else if(g=e.tag,g===13){if(t=iy(e),t!==null)return t;t=null}else if(g===3){if(e.stateNode.current.memoizedState.isDehydrated)return e.tag===3?e.stateNode.containerInfo:null;t=null}else e!==t&&(t=null);return Xc=t,null}function Gy(t){switch(t){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(cR()){case Oh:return 1;case ry:return 4;case Vc:case AR:return 16;case cy:return 536870912;default:return 16}default:return 16}}var $I=null,$h=null,rc=null;function my(){if(rc)return rc;var t,e=$h,g=e.length,n,I="value"in $I?$I.value:$I.textContent,o=I.length;for(t=0;t<g&&e[t]===I[t];t++);var i=g-t;for(n=1;n<=i&&e[g-n]===I[o-n];n++);return rc=I.slice(t,1<n?1-n:void 0)}function cc(t){var e=t.keyCode;return"charCode"in t?(t=t.charCode,t===0&&e===13&&(t=13)):t=e,t===10&&(t=13),32<=t||t===13?t:0}function Vr(){return!0}function Gp(){return!1}function Mg(t){function e(g,n,I,o,i){this._reactName=g,this._targetInst=I,this.type=n,this.nativeEvent=o,this.target=i,this.currentTarget=null;for(var l in t)t.hasOwnProperty(l)&&(g=t[l],this[l]=g?g(o):o[l]);return this.isDefaultPrevented=(o.defaultPrevented!=null?o.defaultPrevented:o.returnValue===!1)?Vr:Gp,this.isPropagationStopped=Gp,this}return ct(e.prototype,{preventDefault:function(){this.defaultPrevented=!0;var g=this.nativeEvent;g&&(g.preventDefault?g.preventDefault():typeof g.returnValue!="unknown"&&(g.returnValue=!1),this.isDefaultPrevented=Vr)},stopPropagation:function(){var g=this.nativeEvent;g&&(g.stopPropagation?g.stopPropagation():typeof g.cancelBubble!="unknown"&&(g.cancelBubble=!0),this.isPropagationStopped=Vr)},persist:function(){},isPersistent:Vr}),e}var GC={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(t){return t.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},eb=Mg(GC),cs=ct({},GC,{view:0,detail:0}),vR=Mg(cs),iu,Cu,_C,cA=ct({},cs,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:tb,button:0,buttons:0,relatedTarget:function(t){return t.relatedTarget===void 0?t.fromElement===t.srcElement?t.toElement:t.fromElement:t.relatedTarget},movementX:function(t){return"movementX"in t?t.movementX:(t!==_C&&(_C&&t.type==="mousemove"?(iu=t.screenX-_C.screenX,Cu=t.screenY-_C.screenY):Cu=iu=0,_C=t),iu)},movementY:function(t){return"movementY"in t?t.movementY:Cu}}),mp=Mg(cA),WR=ct({},cA,{dataTransfer:0}),wR=Mg(WR),VR=ct({},cs,{relatedTarget:0}),lu=Mg(VR),RR=ct({},GC,{animationName:0,elapsedTime:0,pseudoElement:0}),XR=Mg(RR),YR=ct({},GC,{clipboardData:function(t){return"clipboardData"in t?t.clipboardData:window.clipboardData}}),KR=Mg(YR),SR=ct({},GC,{data:0}),pp=Mg(SR),HR={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},NR={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},FR={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function kR(t){var e=this.nativeEvent;return e.getModifierState?e.getModifierState(t):(t=FR[t])?!!e[t]:!1}function tb(){return kR}var zR=ct({},cs,{key:function(t){if(t.key){var e=HR[t.key]||t.key;if(e!=="Unidentified")return e}return t.type==="keypress"?(t=cc(t),t===13?"Enter":String.fromCharCode(t)):t.type==="keydown"||t.type==="keyup"?NR[t.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:tb,charCode:function(t){return t.type==="keypress"?cc(t):0},keyCode:function(t){return t.type==="keydown"||t.type==="keyup"?t.keyCode:0},which:function(t){return t.type==="keypress"?cc(t):t.type==="keydown"||t.type==="keyup"?t.keyCode:0}}),xR=Mg(zR),LR=ct({},cA,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Bp=Mg(LR),JR=ct({},cs,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:tb}),MR=Mg(JR),ER=ct({},GC,{propertyName:0,elapsedTime:0,pseudoElement:0}),QR=Mg(ER),TR=ct({},cA,{deltaX:function(t){return"deltaX"in t?t.deltaX:"wheelDeltaX"in t?-t.wheelDeltaX:0},deltaY:function(t){return"deltaY"in t?t.deltaY:"wheelDeltaY"in t?-t.wheelDeltaY:"wheelDelta"in t?-t.wheelDelta:0},deltaZ:0,deltaMode:0}),UR=Mg(TR),DR=[9,13,27,32],gb=yI&&"CompositionEvent"in window,vl=null;yI&&"documentMode"in document&&(vl=document.documentMode);var jR=yI&&"TextEvent"in window&&!vl,py=yI&&(!gb||vl&&8<vl&&11>=vl),Zp=String.fromCharCode(32),yp=!1;function By(t,e){switch(t){case"keyup":return DR.indexOf(e.keyCode)!==-1;case"keydown":return e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Zy(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var Li=!1;function OR(t,e){switch(t){case"compositionend":return Zy(e);case"keypress":return e.which!==32?null:(yp=!0,Zp);case"textInput":return t=e.data,t===Zp&&yp?null:t;default:return null}}function PR(t,e){if(Li)return t==="compositionend"||!gb&&By(t,e)?(t=my(),rc=$h=$I=null,Li=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(e.ctrlKey||e.altKey||e.metaKey)||e.ctrlKey&&e.altKey){if(e.char&&1<e.char.length)return e.char;if(e.which)return String.fromCharCode(e.which)}return null;case"compositionend":return py&&e.locale!=="ko"?null:e.data;default:return null}}var _R={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function fp(t){var e=t&&t.nodeName&&t.nodeName.toLowerCase();return e==="input"?!!_R[t.type]:e==="textarea"}function yy(t,e,g,n){ty(n),e=Yc(e,"onChange"),0<e.length&&(g=new eb("onChange","change",null,g,n),t.push({event:g,listeners:e}))}var Wl=null,El=null;function qR(t){Hy(t,0)}function AA(t){var e=Ei(t);if(jZ(e))return t}function $R(t,e){if(t==="change")return e}var fy=!1;if(yI){var su;if(yI){var ru="oninput"in document;if(!ru){var vp=document.createElement("div");vp.setAttribute("oninput","return;"),ru=typeof vp.oninput=="function"}su=ru}else su=!1;fy=su&&(!document.documentMode||9<document.documentMode)}function Wp(){Wl&&(Wl.detachEvent("onpropertychange",vy),El=Wl=null)}function vy(t){if(t.propertyName==="value"&&AA(El)){var e=[];yy(e,El,t,jh(t)),oy(qR,e)}}function eX(t,e,g){t==="focusin"?(Wp(),Wl=e,El=g,Wl.attachEvent("onpropertychange",vy)):t==="focusout"&&Wp()}function tX(t){if(t==="selectionchange"||t==="keyup"||t==="keydown")return AA(El)}function gX(t,e){if(t==="click")return AA(e)}function nX(t,e){if(t==="input"||t==="change")return AA(e)}function IX(t,e){return t===e&&(t!==0||1/t===1/e)||t!==t&&e!==e}var On=typeof Object.is=="function"?Object.is:IX;function Ql(t,e){if(On(t,e))return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;var g=Object.keys(t),n=Object.keys(e);if(g.length!==n.length)return!1;for(n=0;n<g.length;n++){var I=g[n];if(!sd.call(e,I)||!On(t[I],e[I]))return!1}return!0}function wp(t){for(;t&&t.firstChild;)t=t.firstChild;return t}function Vp(t,e){var g=wp(t);t=0;for(var n;g;){if(g.nodeType===3){if(n=t+g.textContent.length,t<=e&&n>=e)return{node:g,offset:e-t};t=n}e:{for(;g;){if(g.nextSibling){g=g.nextSibling;break e}g=g.parentNode}g=void 0}g=wp(g)}}function Wy(t,e){return t&&e?t===e?!0:t&&t.nodeType===3?!1:e&&e.nodeType===3?Wy(t,e.parentNode):"contains"in t?t.contains(e):t.compareDocumentPosition?!!(t.compareDocumentPosition(e)&16):!1:!1}function wy(){for(var t=window,e=vc();e instanceof t.HTMLIFrameElement;){try{var g=typeof e.contentWindow.location.href=="string"}catch{g=!1}if(g)t=e.contentWindow;else break;e=vc(t.document)}return e}function nb(t){var e=t&&t.nodeName&&t.nodeName.toLowerCase();return e&&(e==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||e==="textarea"||t.contentEditable==="true")}function oX(t){var e=wy(),g=t.focusedElem,n=t.selectionRange;if(e!==g&&g&&g.ownerDocument&&Wy(g.ownerDocument.documentElement,g)){if(n!==null&&nb(g)){if(e=n.start,t=n.end,t===void 0&&(t=e),"selectionStart"in g)g.selectionStart=e,g.selectionEnd=Math.min(t,g.value.length);else if(t=(e=g.ownerDocument||document)&&e.defaultView||window,t.getSelection){t=t.getSelection();var I=g.textContent.length,o=Math.min(n.start,I);n=n.end===void 0?o:Math.min(n.end,I),!t.extend&&o>n&&(I=n,n=o,o=I),I=Vp(g,o);var i=Vp(g,n);I&&i&&(t.rangeCount!==1||t.anchorNode!==I.node||t.anchorOffset!==I.offset||t.focusNode!==i.node||t.focusOffset!==i.offset)&&(e=e.createRange(),e.setStart(I.node,I.offset),t.removeAllRanges(),o>n?(t.addRange(e),t.extend(i.node,i.offset)):(e.setEnd(i.node,i.offset),t.addRange(e)))}}for(e=[],t=g;t=t.parentNode;)t.nodeType===1&&e.push({element:t,left:t.scrollLeft,top:t.scrollTop});for(typeof g.focus=="function"&&g.focus(),g=0;g<e.length;g++)t=e[g],t.element.scrollLeft=t.left,t.element.scrollTop=t.top}}var iX=yI&&"documentMode"in document&&11>=document.documentMode,Ji=null,Vd=null,wl=null,Rd=!1;function Rp(t,e,g){var n=g.window===g?g.document:g.nodeType===9?g:g.ownerDocument;Rd||Ji==null||Ji!==vc(n)||(n=Ji,"selectionStart"in n&&nb(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),wl&&Ql(wl,n)||(wl=n,n=Yc(Vd,"onSelect"),0<n.length&&(e=new eb("onSelect","select",null,e,g),t.push({event:e,listeners:n}),e.target=Ji)))}function Rr(t,e){var g={};return g[t.toLowerCase()]=e.toLowerCase(),g["Webkit"+t]="webkit"+e,g["Moz"+t]="moz"+e,g}var Mi={animationend:Rr("Animation","AnimationEnd"),animationiteration:Rr("Animation","AnimationIteration"),animationstart:Rr("Animation","AnimationStart"),transitionend:Rr("Transition","TransitionEnd")},cu={},Vy={};yI&&(Vy=document.createElement("div").style,"AnimationEvent"in window||(delete Mi.animationend.animation,delete Mi.animationiteration.animation,delete Mi.animationstart.animation),"TransitionEvent"in window||delete Mi.transitionend.transition);function aA(t){if(cu[t])return cu[t];if(!Mi[t])return t;var e=Mi[t],g;for(g in e)if(e.hasOwnProperty(g)&&g in Vy)return cu[t]=e[g];return t}var Ry=aA("animationend"),Xy=aA("animationiteration"),Yy=aA("animationstart"),Ky=aA("transitionend"),Sy=new Map,Xp="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function ao(t,e){Sy.set(t,e),gi(e,[t])}for(var Au=0;Au<Xp.length;Au++){var au=Xp[Au],CX=au.toLowerCase(),lX=au[0].toUpperCase()+au.slice(1);ao(CX,"on"+lX)}ao(Ry,"onAnimationEnd");ao(Xy,"onAnimationIteration");ao(Yy,"onAnimationStart");ao("dblclick","onDoubleClick");ao("focusin","onFocus");ao("focusout","onBlur");ao(Ky,"onTransitionEnd");iC("onMouseEnter",["mouseout","mouseover"]);iC("onMouseLeave",["mouseout","mouseover"]);iC("onPointerEnter",["pointerout","pointerover"]);iC("onPointerLeave",["pointerout","pointerover"]);gi("onChange","change click focusin focusout input keydown keyup selectionchange".split(" "));gi("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));gi("onBeforeInput",["compositionend","keypress","textInput","paste"]);gi("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" "));gi("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" "));gi("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var ml="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),sX=new Set("cancel close invalid load scroll toggle".split(" ").concat(ml));function Yp(t,e,g){var n=t.type||"unknown-event";t.currentTarget=g,CR(n,e,void 0,t),t.currentTarget=null}function Hy(t,e){e=(e&4)!==0;for(var g=0;g<t.length;g++){var n=t[g],I=n.event;n=n.listeners;e:{var o=void 0;if(e)for(var i=n.length-1;0<=i;i--){var l=n[i],r=l.instance,c=l.currentTarget;if(l=l.listener,r!==o&&I.isPropagationStopped())break e;Yp(I,l,c),o=r}else for(i=0;i<n.length;i++){if(l=n[i],r=l.instance,c=l.currentTarget,l=l.listener,r!==o&&I.isPropagationStopped())break e;Yp(I,l,c),o=r}}}if(wc)throw t=fd,wc=!1,fd=null,t}function qe(t,e){var g=e[Sd];g===void 0&&(g=e[Sd]=new Set);var n=t+"__bubble";g.has(n)||(Ny(e,t,2,!1),g.add(n))}function uu(t,e,g){var n=0;e&&(n|=4),Ny(g,t,n,e)}var Xr="_reactListening"+Math.random().toString(36).slice(2);function Tl(t){if(!t[Xr]){t[Xr]=!0,EZ.forEach(function(g){g!=="selectionchange"&&(sX.has(g)||uu(g,!1,t),uu(g,!0,t))});var e=t.nodeType===9?t:t.ownerDocument;e===null||e[Xr]||(e[Xr]=!0,uu("selectionchange",!1,e))}}function Ny(t,e,g,n){switch(Gy(e)){case 1:var I=yR;break;case 4:I=fR;break;default:I=qh}g=I.bind(null,e,g,t),I=void 0,!yd||e!=="touchstart"&&e!=="touchmove"&&e!=="wheel"||(I=!0),n?I!==void 0?t.addEventListener(e,g,{capture:!0,passive:I}):t.addEventListener(e,g,!0):I!==void 0?t.addEventListener(e,g,{passive:I}):t.addEventListener(e,g,!1)}function du(t,e,g,n,I){var o=n;if((e&1)===0&&(e&2)===0&&n!==null)e:for(;;){if(n===null)return;var i=n.tag;if(i===3||i===4){var l=n.stateNode.containerInfo;if(l===I||l.nodeType===8&&l.parentNode===I)break;if(i===4)for(i=n.return;i!==null;){var r=i.tag;if((r===3||r===4)&&(r=i.stateNode.containerInfo,r===I||r.nodeType===8&&r.parentNode===I))return;i=i.return}for(;l!==null;){if(i=Lo(l),i===null)return;if(r=i.tag,r===5||r===6){n=o=i;continue e}l=l.parentNode}}n=n.return}oy(function(){var c=o,A=jh(g),u=[];e:{var h=Sy.get(t);if(h!==void 0){var b=eb,p=t;switch(t){case"keypress":if(cc(g)===0)break e;case"keydown":case"keyup":b=xR;break;case"focusin":p="focus",b=lu;break;case"focusout":p="blur",b=lu;break;case"beforeblur":case"afterblur":b=lu;break;case"click":if(g.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":b=mp;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":b=wR;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":b=MR;break;case Ry:case Xy:case Yy:b=XR;break;case Ky:b=QR;break;case"scroll":b=vR;break;case"wheel":b=UR;break;case"copy":case"cut":case"paste":b=KR;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":b=Bp}var Z=(e&4)!==0,v=!Z&&t==="scroll",y=Z?h!==null?h+"Capture":null:h;Z=[];for(var m=c,B;m!==null;){B=m;var w=B.stateNode;if(B.tag===5&&w!==null&&(B=w,y!==null&&(w=xl(m,y),w!=null&&Z.push(Ul(m,w,B)))),v)break;m=m.return}0<Z.length&&(h=new b(h,p,null,g,A),u.push({event:h,listeners:Z}))}}if((e&7)===0){e:{if(h=t==="mouseover"||t==="pointerover",b=t==="mouseout"||t==="pointerout",h&&g!==Bd&&(p=g.relatedTarget||g.fromElement)&&(Lo(p)||p[fI]))break e;if((b||h)&&(h=A.window===A?A:(h=A.ownerDocument)?h.defaultView||h.parentWindow:window,b?(p=g.relatedTarget||g.toElement,b=c,p=p?Lo(p):null,p!==null&&(v=ni(p),p!==v||p.tag!==5&&p.tag!==6)&&(p=null)):(b=null,p=c),b!==p)){if(Z=mp,w="onMouseLeave",y="onMouseEnter",m="mouse",(t==="pointerout"||t==="pointerover")&&(Z=Bp,w="onPointerLeave",y="onPointerEnter",m="pointer"),v=b==null?h:Ei(b),B=p==null?h:Ei(p),h=new Z(w,m+"leave",b,g,A),h.target=v,h.relatedTarget=B,w=null,Lo(A)===c&&(Z=new Z(y,m+"enter",p,g,A),Z.target=B,Z.relatedTarget=v,w=Z),v=w,b&&p)t:{for(Z=b,y=p,m=0,B=Z;B;B=vi(B))m++;for(B=0,w=y;w;w=vi(w))B++;for(;0<m-B;)Z=vi(Z),m--;for(;0<B-m;)y=vi(y),B--;for(;m--;){if(Z===y||y!==null&&Z===y.alternate)break t;Z=vi(Z),y=vi(y)}Z=null}else Z=null;b!==null&&Kp(u,h,b,Z,!1),p!==null&&v!==null&&Kp(u,v,p,Z,!0)}}e:{if(h=c?Ei(c):window,b=h.nodeName&&h.nodeName.toLowerCase(),b==="select"||b==="input"&&h.type==="file")var X=$R;else if(fp(h))if(fy)X=nX;else{X=tX;var R=eX}else(b=h.nodeName)&&b.toLowerCase()==="input"&&(h.type==="checkbox"||h.type==="radio")&&(X=gX);if(X&&(X=X(t,c))){yy(u,X,g,A);break e}R&&R(t,h,c),t==="focusout"&&(R=h._wrapperState)&&R.controlled&&h.type==="number"&&hd(h,"number",h.value)}switch(R=c?Ei(c):window,t){case"focusin":(fp(R)||R.contentEditable==="true")&&(Ji=R,Vd=c,wl=null);break;case"focusout":wl=Vd=Ji=null;break;case"mousedown":Rd=!0;break;case"contextmenu":case"mouseup":case"dragend":Rd=!1,Rp(u,g,A);break;case"selectionchange":if(iX)break;case"keydown":case"keyup":Rp(u,g,A)}var S;if(gb)e:{switch(t){case"compositionstart":var Y="onCompositionStart";break e;case"compositionend":Y="onCompositionEnd";break e;case"compositionupdate":Y="onCompositionUpdate";break e}Y=void 0}else Li?By(t,g)&&(Y="onCompositionEnd"):t==="keydown"&&g.keyCode===229&&(Y="onCompositionStart");Y&&(py&&g.locale!=="ko"&&(Li||Y!=="onCompositionStart"?Y==="onCompositionEnd"&&Li&&(S=my()):($I=A,$h="value"in $I?$I.value:$I.textContent,Li=!0)),R=Yc(c,Y),0<R.length&&(Y=new pp(Y,t,null,g,A),u.push({event:Y,listeners:R}),S?Y.data=S:(S=Zy(g),S!==null&&(Y.data=S)))),(S=jR?OR(t,g):PR(t,g))&&(c=Yc(c,"onBeforeInput"),0<c.length&&(A=new pp("onBeforeInput","beforeinput",null,g,A),u.push({event:A,listeners:c}),A.data=S))}Hy(u,e)})}function Ul(t,e,g){return{instance:t,listener:e,currentTarget:g}}function Yc(t,e){for(var g=e+"Capture",n=[];t!==null;){var I=t,o=I.stateNode;I.tag===5&&o!==null&&(I=o,o=xl(t,g),o!=null&&n.unshift(Ul(t,o,I)),o=xl(t,e),o!=null&&n.push(Ul(t,o,I))),t=t.return}return n}function vi(t){if(t===null)return null;do t=t.return;while(t&&t.tag!==5);return t||null}function Kp(t,e,g,n,I){for(var o=e._reactName,i=[];g!==null&&g!==n;){var l=g,r=l.alternate,c=l.stateNode;if(r!==null&&r===n)break;l.tag===5&&c!==null&&(l=c,I?(r=xl(g,o),r!=null&&i.unshift(Ul(g,r,l))):I||(r=xl(g,o),r!=null&&i.push(Ul(g,r,l)))),g=g.return}i.length!==0&&t.push({event:e,listeners:i})}var rX=/\r\n?/g,cX=/\u0000|\uFFFD/g;function Sp(t){return(typeof t=="string"?t:""+t).replace(rX,`
|
|
30
|
+
`).replace(cX,"")}function Yr(t,e,g){if(e=Sp(e),Sp(t)!==e&&g)throw Error(ee(425))}function Kc(){}var Xd=null;function Yd(t,e){return t==="textarea"||t==="noscript"||typeof e.children=="string"||typeof e.children=="number"||typeof e.dangerouslySetInnerHTML=="object"&&e.dangerouslySetInnerHTML!==null&&e.dangerouslySetInnerHTML.__html!=null}var Kd=typeof setTimeout=="function"?setTimeout:void 0,AX=typeof clearTimeout=="function"?clearTimeout:void 0,Hp=typeof Promise=="function"?Promise:void 0,aX=typeof queueMicrotask=="function"?queueMicrotask:typeof Hp!="undefined"?function(t){return Hp.resolve(null).then(t).catch(uX)}:Kd;function uX(t){setTimeout(function(){throw t})}function hu(t,e){var g=e,n=0;do{var I=g.nextSibling;if(t.removeChild(g),I&&I.nodeType===8)if(g=I.data,g==="/$"){if(n===0){t.removeChild(I),Ml(e);return}n--}else g!=="$"&&g!=="$?"&&g!=="$!"||n++;g=I}while(g);Ml(e)}function hI(t){for(;t!=null;t=t.nextSibling){var e=t.nodeType;if(e===1||e===3)break;if(e===8){if(e=t.data,e==="$"||e==="$!"||e==="$?")break;if(e==="/$")return null}}return t}function Np(t){t=t.previousSibling;for(var e=0;t;){if(t.nodeType===8){var g=t.data;if(g==="$"||g==="$!"||g==="$?"){if(e===0)return t;e--}else g==="/$"&&e++}t=t.previousSibling}return null}var mC=Math.random().toString(36).slice(2),Tn="__reactFiber$"+mC,Dl="__reactProps$"+mC,fI="__reactContainer$"+mC,Sd="__reactEvents$"+mC,dX="__reactListeners$"+mC,hX="__reactHandles$"+mC;function Lo(t){var e=t[Tn];if(e)return e;for(var g=t.parentNode;g;){if(e=g[fI]||g[Tn]){if(g=e.alternate,e.child!==null||g!==null&&g.child!==null)for(t=Np(t);t!==null;){if(g=t[Tn])return g;t=Np(t)}return e}t=g,g=t.parentNode}return null}function As(t){return t=t[Tn]||t[fI],!t||t.tag!==5&&t.tag!==6&&t.tag!==13&&t.tag!==3?null:t}function Ei(t){if(t.tag===5||t.tag===6)return t.stateNode;throw Error(ee(33))}function uA(t){return t[Dl]||null}var Hd=[],Qi=-1;function uo(t){return{current:t}}function $e(t){0>Qi||(t.current=Hd[Qi],Hd[Qi]=null,Qi--)}function Pe(t,e){Qi++,Hd[Qi]=t.current,t.current=e}var ro={},tg=uo(ro),Xg=uo(!1),Po=ro;function CC(t,e){var g=t.type.contextTypes;if(!g)return ro;var n=t.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===e)return n.__reactInternalMemoizedMaskedChildContext;var I={},o;for(o in g)I[o]=e[o];return n&&(t=t.stateNode,t.__reactInternalMemoizedUnmaskedChildContext=e,t.__reactInternalMemoizedMaskedChildContext=I),I}function Yg(t){return t=t.childContextTypes,t!=null}function Sc(){$e(Xg),$e(tg)}function Fp(t,e,g){if(tg.current!==ro)throw Error(ee(168));Pe(tg,e),Pe(Xg,g)}function Fy(t,e,g){var n=t.stateNode;if(e=e.childContextTypes,typeof n.getChildContext!="function")return g;n=n.getChildContext();for(var I in n)if(!(I in e))throw Error(ee(108,eR(t)||"Unknown",I));return ct({},g,n)}function Hc(t){return t=(t=t.stateNode)&&t.__reactInternalMemoizedMergedChildContext||ro,Po=tg.current,Pe(tg,t),Pe(Xg,Xg.current),!0}function kp(t,e,g){var n=t.stateNode;if(!n)throw Error(ee(169));g?(t=Fy(t,e,Po),n.__reactInternalMemoizedMergedChildContext=t,$e(Xg),$e(tg),Pe(tg,t)):$e(Xg),Pe(Xg,g)}var aI=null,dA=!1,bu=!1;function ky(t){aI===null?aI=[t]:aI.push(t)}function bX(t){dA=!0,ky(t)}function ho(){if(!bu&&aI!==null){bu=!0;var t=0,e=Je;try{var g=aI;for(Je=1;t<g.length;t++){var n=g[t];do n=n(!0);while(n!==null)}aI=null,dA=!1}catch(I){throw aI!==null&&(aI=aI.slice(t+1)),sy(Oh,ho),I}finally{Je=e,bu=!1}}return null}var GX=wI.ReactCurrentBatchConfig;function pn(t,e){if(t&&t.defaultProps){e=ct({},e),t=t.defaultProps;for(var g in t)e[g]===void 0&&(e[g]=t[g]);return e}return e}var Nc=uo(null),Fc=null,Ti=null,Ib=null;function ob(){Ib=Ti=Fc=null}function ib(t){var e=Nc.current;$e(Nc),t._currentValue=e}function Nd(t,e,g){for(;t!==null;){var n=t.alternate;if((t.childLanes&e)!==e?(t.childLanes|=e,n!==null&&(n.childLanes|=e)):n!==null&&(n.childLanes&e)!==e&&(n.childLanes|=e),t===g)break;t=t.return}}function eC(t,e){Fc=t,Ib=Ti=null,t=t.dependencies,t!==null&&t.firstContext!==null&&((t.lanes&e)!==0&&(zg=!0),t.firstContext=null)}function ln(t){var e=t._currentValue;if(Ib!==t)if(t={context:t,memoizedValue:e,next:null},Ti===null){if(Fc===null)throw Error(ee(308));Ti=t,Fc.dependencies={lanes:0,firstContext:t}}else Ti=Ti.next=t;return e}var Un=null,PI=!1;function Cb(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function zy(t,e){t=t.updateQueue,e.updateQueue===t&&(e.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,effects:t.effects})}function pI(t,e){return{eventTime:t,lane:e,tag:0,payload:null,callback:null,next:null}}function io(t,e){var g=t.updateQueue;g!==null&&(g=g.shared,wt!==null&&(t.mode&1)!==0&&(Fe&2)===0?(t=g.interleaved,t===null?(e.next=e,Un===null?Un=[g]:Un.push(g)):(e.next=t.next,t.next=e),g.interleaved=e):(t=g.pending,t===null?e.next=e:(e.next=t.next,t.next=e),g.pending=e))}function Ac(t,e,g){if(e=e.updateQueue,e!==null&&(e=e.shared,(g&4194240)!==0)){var n=e.lanes;n&=t.pendingLanes,g|=n,e.lanes=g,Ph(t,g)}}function zp(t,e){var g=t.updateQueue,n=t.alternate;if(n!==null&&(n=n.updateQueue,g===n)){var I=null,o=null;if(g=g.firstBaseUpdate,g!==null){do{var i={eventTime:g.eventTime,lane:g.lane,tag:g.tag,payload:g.payload,callback:g.callback,next:null};o===null?I=o=i:o=o.next=i,g=g.next}while(g!==null);o===null?I=o=e:o=o.next=e}else I=o=e;g={baseState:n.baseState,firstBaseUpdate:I,lastBaseUpdate:o,shared:n.shared,effects:n.effects},t.updateQueue=g;return}t=g.lastBaseUpdate,t===null?g.firstBaseUpdate=e:t.next=e,g.lastBaseUpdate=e}function kc(t,e,g,n){var I=t.updateQueue;PI=!1;var o=I.firstBaseUpdate,i=I.lastBaseUpdate,l=I.shared.pending;if(l!==null){I.shared.pending=null;var r=l,c=r.next;r.next=null,i===null?o=c:i.next=c,i=r;var A=t.alternate;A!==null&&(A=A.updateQueue,l=A.lastBaseUpdate,l!==i&&(l===null?A.firstBaseUpdate=c:l.next=c,A.lastBaseUpdate=r))}if(o!==null){var u=I.baseState;i=0,A=c=r=null,l=o;do{var h=l.lane,b=l.eventTime;if((n&h)===h){A!==null&&(A=A.next={eventTime:b,lane:0,tag:l.tag,payload:l.payload,callback:l.callback,next:null});e:{var p=t,Z=l;switch(h=e,b=g,Z.tag){case 1:if(p=Z.payload,typeof p=="function"){u=p.call(b,u,h);break e}u=p;break e;case 3:p.flags=p.flags&-65537|128;case 0:if(p=Z.payload,h=typeof p=="function"?p.call(b,u,h):p,h==null)break e;u=ct({},u,h);break e;case 2:PI=!0}}l.callback!==null&&l.lane!==0&&(t.flags|=64,h=I.effects,h===null?I.effects=[l]:h.push(l))}else b={eventTime:b,lane:h,tag:l.tag,payload:l.payload,callback:l.callback,next:null},A===null?(c=A=b,r=u):A=A.next=b,i|=h;if(l=l.next,l===null){if(l=I.shared.pending,l===null)break;h=l,l=h.next,h.next=null,I.lastBaseUpdate=h,I.shared.pending=null}}while(1);if(A===null&&(r=u),I.baseState=r,I.firstBaseUpdate=c,I.lastBaseUpdate=A,e=I.shared.interleaved,e!==null){I=e;do i|=I.lane,I=I.next;while(I!==e)}else o===null&&(I.shared.lanes=0);AC|=i,t.lanes=i,t.memoizedState=u}}function xp(t,e,g){if(t=e.effects,e.effects=null,t!==null)for(e=0;e<t.length;e++){var n=t[e],I=n.callback;if(I!==null){if(n.callback=null,n=g,typeof I!="function")throw Error(ee(191,I));I.call(n)}}}var xy=new MZ.Component().refs;function Fd(t,e,g,n){e=t.memoizedState,g=g(n,e),g=g==null?e:ct({},e,g),t.memoizedState=g,t.lanes===0&&(t.updateQueue.baseState=g)}var hA={isMounted:function(t){return(t=t._reactInternals)?ni(t)===t:!1},enqueueSetState:function(t,e,g){t=t._reactInternals;var n=sg(),I=lo(t),o=pI(n,I);o.payload=e,g!=null&&(o.callback=g),io(t,o),e=on(t,I,n),e!==null&&Ac(e,t,I)},enqueueReplaceState:function(t,e,g){t=t._reactInternals;var n=sg(),I=lo(t),o=pI(n,I);o.tag=1,o.payload=e,g!=null&&(o.callback=g),io(t,o),e=on(t,I,n),e!==null&&Ac(e,t,I)},enqueueForceUpdate:function(t,e){t=t._reactInternals;var g=sg(),n=lo(t),I=pI(g,n);I.tag=2,e!=null&&(I.callback=e),io(t,I),e=on(t,n,g),e!==null&&Ac(e,t,n)}};function Lp(t,e,g,n,I,o,i){return t=t.stateNode,typeof t.shouldComponentUpdate=="function"?t.shouldComponentUpdate(n,o,i):e.prototype&&e.prototype.isPureReactComponent?!Ql(g,n)||!Ql(I,o):!0}function Ly(t,e,g){var n=!1,I=ro,o=e.contextType;return typeof o=="object"&&o!==null?o=ln(o):(I=Yg(e)?Po:tg.current,n=e.contextTypes,o=(n=n!=null)?CC(t,I):ro),e=new e(g,o),t.memoizedState=e.state!==null&&e.state!==void 0?e.state:null,e.updater=hA,t.stateNode=e,e._reactInternals=t,n&&(t=t.stateNode,t.__reactInternalMemoizedUnmaskedChildContext=I,t.__reactInternalMemoizedMaskedChildContext=o),e}function Jp(t,e,g,n){t=e.state,typeof e.componentWillReceiveProps=="function"&&e.componentWillReceiveProps(g,n),typeof e.UNSAFE_componentWillReceiveProps=="function"&&e.UNSAFE_componentWillReceiveProps(g,n),e.state!==t&&hA.enqueueReplaceState(e,e.state,null)}function kd(t,e,g,n){var I=t.stateNode;I.props=g,I.state=t.memoizedState,I.refs=xy,Cb(t);var o=e.contextType;typeof o=="object"&&o!==null?I.context=ln(o):(o=Yg(e)?Po:tg.current,I.context=CC(t,o)),I.state=t.memoizedState,o=e.getDerivedStateFromProps,typeof o=="function"&&(Fd(t,e,o,g),I.state=t.memoizedState),typeof e.getDerivedStateFromProps=="function"||typeof I.getSnapshotBeforeUpdate=="function"||typeof I.UNSAFE_componentWillMount!="function"&&typeof I.componentWillMount!="function"||(e=I.state,typeof I.componentWillMount=="function"&&I.componentWillMount(),typeof I.UNSAFE_componentWillMount=="function"&&I.UNSAFE_componentWillMount(),e!==I.state&&hA.enqueueReplaceState(I,I.state,null),kc(t,g,I,n),I.state=t.memoizedState),typeof I.componentDidMount=="function"&&(t.flags|=4194308)}var Ui=[],Di=0,zc=null,xc=0,qg=[],$g=0,_o=null,bI=1,GI="";function Ko(t,e){Ui[Di++]=xc,Ui[Di++]=zc,zc=t,xc=e}function Jy(t,e,g){qg[$g++]=bI,qg[$g++]=GI,qg[$g++]=_o,_o=t;var n=bI;t=GI;var I=32-vn(n)-1;n&=~(1<<I),g+=1;var o=32-vn(e)+I;if(30<o){var i=I-I%5;o=(n&(1<<i)-1).toString(32),n>>=i,I-=i,bI=1<<32-vn(e)+I|g<<I|n,GI=o+t}else bI=1<<o|g<<I|n,GI=t}function lb(t){t.return!==null&&(Ko(t,1),Jy(t,1,0))}function sb(t){for(;t===zc;)zc=Ui[--Di],Ui[Di]=null,xc=Ui[--Di],Ui[Di]=null;for(;t===_o;)_o=qg[--$g],qg[$g]=null,GI=qg[--$g],qg[$g]=null,bI=qg[--$g],qg[$g]=null}var xg=null,wg=null,It=!1,Zn=null;function My(t,e){var g=tn(5,null,null,0);g.elementType="DELETED",g.stateNode=e,g.return=t,e=t.deletions,e===null?(t.deletions=[g],t.flags|=16):e.push(g)}function Mp(t,e){switch(t.tag){case 5:var g=t.type;return e=e.nodeType!==1||g.toLowerCase()!==e.nodeName.toLowerCase()?null:e,e!==null?(t.stateNode=e,xg=t,wg=hI(e.firstChild),!0):!1;case 6:return e=t.pendingProps===""||e.nodeType!==3?null:e,e!==null?(t.stateNode=e,xg=t,wg=null,!0):!1;case 13:return e=e.nodeType!==8?null:e,e!==null?(g=_o!==null?{id:bI,overflow:GI}:null,t.memoizedState={dehydrated:e,treeContext:g,retryLane:1073741824},g=tn(18,null,null,0),g.stateNode=e,g.return=t,t.child=g,xg=t,wg=null,!0):!1;default:return!1}}function zd(t){return(t.mode&1)!==0&&(t.flags&128)===0}function xd(t){if(It){var e=wg;if(e){var g=e;if(!Mp(t,e)){if(zd(t))throw Error(ee(418));e=hI(g.nextSibling);var n=xg;e&&Mp(t,e)?My(n,g):(t.flags=t.flags&-4097|2,It=!1,xg=t)}}else{if(zd(t))throw Error(ee(418));t.flags=t.flags&-4097|2,It=!1,xg=t}}}function Ep(t){for(t=t.return;t!==null&&t.tag!==5&&t.tag!==3&&t.tag!==13;)t=t.return;xg=t}function qC(t){if(t!==xg)return!1;if(!It)return Ep(t),It=!0,!1;var e;if((e=t.tag!==3)&&!(e=t.tag!==5)&&(e=t.type,e=e!=="head"&&e!=="body"&&!Yd(t.type,t.memoizedProps)),e&&(e=wg)){if(zd(t)){for(t=wg;t;)t=hI(t.nextSibling);throw Error(ee(418))}for(;e;)My(t,e),e=hI(e.nextSibling)}if(Ep(t),t.tag===13){if(t=t.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(ee(317));e:{for(t=t.nextSibling,e=0;t;){if(t.nodeType===8){var g=t.data;if(g==="/$"){if(e===0){wg=hI(t.nextSibling);break e}e--}else g!=="$"&&g!=="$!"&&g!=="$?"||e++}t=t.nextSibling}wg=null}}else wg=xg?hI(t.stateNode.nextSibling):null;return!0}function lC(){wg=xg=null,It=!1}function rb(t){Zn===null?Zn=[t]:Zn.push(t)}function $C(t,e,g){if(t=g.ref,t!==null&&typeof t!="function"&&typeof t!="object"){if(g._owner){if(g=g._owner,g){if(g.tag!==1)throw Error(ee(309));var n=g.stateNode}if(!n)throw Error(ee(147,t));var I=n,o=""+t;return e!==null&&e.ref!==null&&typeof e.ref=="function"&&e.ref._stringRef===o?e.ref:(e=function(i){var l=I.refs;l===xy&&(l=I.refs={}),i===null?delete l[o]:l[o]=i},e._stringRef=o,e)}if(typeof t!="string")throw Error(ee(284));if(!g._owner)throw Error(ee(290,t))}return t}function Kr(t,e){throw t=Object.prototype.toString.call(e),Error(ee(31,t==="[object Object]"?"object with keys {"+Object.keys(e).join(", ")+"}":t))}function Qp(t){var e=t._init;return e(t._payload)}function Ey(t){function e(y,m){if(t){var B=y.deletions;B===null?(y.deletions=[m],y.flags|=16):B.push(m)}}function g(y,m){if(!t)return null;for(;m!==null;)e(y,m),m=m.sibling;return null}function n(y,m){for(y=new Map;m!==null;)m.key!==null?y.set(m.key,m):y.set(m.index,m),m=m.sibling;return y}function I(y,m){return y=co(y,m),y.index=0,y.sibling=null,y}function o(y,m,B){return y.index=B,t?(B=y.alternate,B!==null?(B=B.index,B<m?(y.flags|=2,m):B):(y.flags|=2,m)):(y.flags|=1048576,m)}function i(y){return t&&y.alternate===null&&(y.flags|=2),y}function l(y,m,B,w){return m===null||m.tag!==6?(m=yu(B,y.mode,w),m.return=y,m):(m=I(m,B),m.return=y,m)}function r(y,m,B,w){var X=B.type;return X===xi?A(y,m,B.props.children,w,B.key):m!==null&&(m.elementType===X||typeof X=="object"&&X!==null&&X.$$typeof===OI&&Qp(X)===m.type)?(w=I(m,B.props),w.ref=$C(y,m,B),w.return=y,w):(w=bc(B.type,B.key,B.props,null,y.mode,w),w.ref=$C(y,m,B),w.return=y,w)}function c(y,m,B,w){return m===null||m.tag!==4||m.stateNode.containerInfo!==B.containerInfo||m.stateNode.implementation!==B.implementation?(m=fu(B,y.mode,w),m.return=y,m):(m=I(m,B.children||[]),m.return=y,m)}function A(y,m,B,w,X){return m===null||m.tag!==7?(m=Do(B,y.mode,w,X),m.return=y,m):(m=I(m,B),m.return=y,m)}function u(y,m,B){if(typeof m=="string"&&m!==""||typeof m=="number")return m=yu(""+m,y.mode,B),m.return=y,m;if(typeof m=="object"&&m!==null){switch(m.$$typeof){case Zr:return B=bc(m.type,m.key,m.props,null,y.mode,B),B.ref=$C(y,null,m),B.return=y,B;case zi:return m=fu(m,y.mode,B),m.return=y,m;case OI:var w=m._init;return u(y,w(m._payload),B)}if(bl(m)||DC(m))return m=Do(m,y.mode,B,null),m.return=y,m;Kr(y,m)}return null}function h(y,m,B,w){var X=m!==null?m.key:null;if(typeof B=="string"&&B!==""||typeof B=="number")return X!==null?null:l(y,m,""+B,w);if(typeof B=="object"&&B!==null){switch(B.$$typeof){case Zr:return B.key===X?r(y,m,B,w):null;case zi:return B.key===X?c(y,m,B,w):null;case OI:return X=B._init,h(y,m,X(B._payload),w)}if(bl(B)||DC(B))return X!==null?null:A(y,m,B,w,null);Kr(y,B)}return null}function b(y,m,B,w,X){if(typeof w=="string"&&w!==""||typeof w=="number")return y=y.get(B)||null,l(m,y,""+w,X);if(typeof w=="object"&&w!==null){switch(w.$$typeof){case Zr:return y=y.get(w.key===null?B:w.key)||null,r(m,y,w,X);case zi:return y=y.get(w.key===null?B:w.key)||null,c(m,y,w,X);case OI:var R=w._init;return b(y,m,B,R(w._payload),X)}if(bl(w)||DC(w))return y=y.get(B)||null,A(m,y,w,X,null);Kr(m,w)}return null}function p(y,m,B,w){for(var X=null,R=null,S=m,Y=m=0,k=null;S!==null&&Y<B.length;Y++){S.index>Y?(k=S,S=null):k=S.sibling;var N=h(y,S,B[Y],w);if(N===null){S===null&&(S=k);break}t&&S&&N.alternate===null&&e(y,S),m=o(N,m,Y),R===null?X=N:R.sibling=N,R=N,S=k}if(Y===B.length)return g(y,S),It&&Ko(y,Y),X;if(S===null){for(;Y<B.length;Y++)S=u(y,B[Y],w),S!==null&&(m=o(S,m,Y),R===null?X=S:R.sibling=S,R=S);return It&&Ko(y,Y),X}for(S=n(y,S);Y<B.length;Y++)k=b(S,y,Y,B[Y],w),k!==null&&(t&&k.alternate!==null&&S.delete(k.key===null?Y:k.key),m=o(k,m,Y),R===null?X=k:R.sibling=k,R=k);return t&&S.forEach(function(z){return e(y,z)}),It&&Ko(y,Y),X}function Z(y,m,B,w){var X=DC(B);if(typeof X!="function")throw Error(ee(150));if(B=X.call(B),B==null)throw Error(ee(151));for(var R=X=null,S=m,Y=m=0,k=null,N=B.next();S!==null&&!N.done;Y++,N=B.next()){S.index>Y?(k=S,S=null):k=S.sibling;var z=h(y,S,N.value,w);if(z===null){S===null&&(S=k);break}t&&S&&z.alternate===null&&e(y,S),m=o(z,m,Y),R===null?X=z:R.sibling=z,R=z,S=k}if(N.done)return g(y,S),It&&Ko(y,Y),X;if(S===null){for(;!N.done;Y++,N=B.next())N=u(y,N.value,w),N!==null&&(m=o(N,m,Y),R===null?X=N:R.sibling=N,R=N);return It&&Ko(y,Y),X}for(S=n(y,S);!N.done;Y++,N=B.next())N=b(S,y,Y,N.value,w),N!==null&&(t&&N.alternate!==null&&S.delete(N.key===null?Y:N.key),m=o(N,m,Y),R===null?X=N:R.sibling=N,R=N);return t&&S.forEach(function(M){return e(y,M)}),It&&Ko(y,Y),X}function v(y,m,B,w){if(typeof B=="object"&&B!==null&&B.type===xi&&B.key===null&&(B=B.props.children),typeof B=="object"&&B!==null){switch(B.$$typeof){case Zr:e:{for(var X=B.key,R=m;R!==null;){if(R.key===X){if(X=B.type,X===xi){if(R.tag===7){g(y,R.sibling),m=I(R,B.props.children),m.return=y,y=m;break e}}else if(R.elementType===X||typeof X=="object"&&X!==null&&X.$$typeof===OI&&Qp(X)===R.type){g(y,R.sibling),m=I(R,B.props),m.ref=$C(y,R,B),m.return=y,y=m;break e}g(y,R);break}else e(y,R);R=R.sibling}B.type===xi?(m=Do(B.props.children,y.mode,w,B.key),m.return=y,y=m):(w=bc(B.type,B.key,B.props,null,y.mode,w),w.ref=$C(y,m,B),w.return=y,y=w)}return i(y);case zi:e:{for(R=B.key;m!==null;){if(m.key===R)if(m.tag===4&&m.stateNode.containerInfo===B.containerInfo&&m.stateNode.implementation===B.implementation){g(y,m.sibling),m=I(m,B.children||[]),m.return=y,y=m;break e}else{g(y,m);break}else e(y,m);m=m.sibling}m=fu(B,y.mode,w),m.return=y,y=m}return i(y);case OI:return R=B._init,v(y,m,R(B._payload),w)}if(bl(B))return p(y,m,B,w);if(DC(B))return Z(y,m,B,w);Kr(y,B)}return typeof B=="string"&&B!==""||typeof B=="number"?(B=""+B,m!==null&&m.tag===6?(g(y,m.sibling),m=I(m,B),m.return=y,y=m):(g(y,m),m=yu(B,y.mode,w),m.return=y,y=m),i(y)):g(y,m)}return v}var sC=Ey(!0),Qy=Ey(!1),as={},jn=uo(as),jl=uo(as),Ol=uo(as);function Jo(t){if(t===as)throw Error(ee(174));return t}function cb(t,e){switch(Pe(Ol,e),Pe(jl,t),Pe(jn,as),t=e.nodeType,t){case 9:case 11:e=(e=e.documentElement)?e.namespaceURI:Gd(null,"");break;default:t=t===8?e.parentNode:e,e=t.namespaceURI||null,t=t.tagName,e=Gd(e,t)}$e(jn),Pe(jn,e)}function rC(){$e(jn),$e(jl),$e(Ol)}function Ty(t){Jo(Ol.current);var e=Jo(jn.current),g=Gd(e,t.type);e!==g&&(Pe(jl,t),Pe(jn,g))}function Ab(t){jl.current===t&&($e(jn),$e(jl))}var rt=uo(0);function Lc(t){for(var e=t;e!==null;){if(e.tag===13){var g=e.memoizedState;if(g!==null&&(g=g.dehydrated,g===null||g.data==="$?"||g.data==="$!"))return e}else if(e.tag===19&&e.memoizedProps.revealOrder!==void 0){if((e.flags&128)!==0)return e}else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break;for(;e.sibling===null;){if(e.return===null||e.return===t)return null;e=e.return}e.sibling.return=e.return,e=e.sibling}return null}var Gu=[];function ab(){for(var t=0;t<Gu.length;t++)Gu[t]._workInProgressVersionPrimary=null;Gu.length=0}var ac=wI.ReactCurrentDispatcher,nn=wI.ReactCurrentBatchConfig,cC=0,ut=null,$t=null,Nt=null,Jc=!1,Vl=!1,Pl=0,mX=0;function Ot(){throw Error(ee(321))}function ub(t,e){if(e===null)return!1;for(var g=0;g<e.length&&g<t.length;g++)if(!On(t[g],e[g]))return!1;return!0}function db(t,e,g,n,I,o){if(cC=o,ut=e,e.memoizedState=null,e.updateQueue=null,e.lanes=0,ac.current=t===null||t.memoizedState===null?yX:fX,t=g(n,I),Vl){o=0;do{if(Vl=!1,Pl=0,25<=o)throw Error(ee(301));o+=1,Nt=$t=null,e.updateQueue=null,ac.current=vX,t=g(n,I)}while(Vl)}if(ac.current=Mc,e=$t!==null&&$t.next!==null,cC=0,Nt=$t=ut=null,Jc=!1,e)throw Error(ee(300));return t}function hb(){var t=Pl!==0;return Pl=0,t}function AI(){var t={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Nt===null?ut.memoizedState=Nt=t:Nt=Nt.next=t,Nt}function _n(){if($t===null){var t=ut.alternate;t=t!==null?t.memoizedState:null}else t=$t.next;var e=Nt===null?ut.memoizedState:Nt.next;if(e!==null)Nt=e,$t=t;else{if(t===null)throw Error(ee(310));$t=t,t={memoizedState:$t.memoizedState,baseState:$t.baseState,baseQueue:$t.baseQueue,queue:$t.queue,next:null},Nt===null?ut.memoizedState=Nt=t:Nt=Nt.next=t}return Nt}function To(t,e){return typeof e=="function"?e(t):e}function Sr(t){var e=_n(),g=e.queue;if(g===null)throw Error(ee(311));g.lastRenderedReducer=t;var n=$t,I=n.baseQueue,o=g.pending;if(o!==null){if(I!==null){var i=I.next;I.next=o.next,o.next=i}n.baseQueue=I=o,g.pending=null}if(I!==null){o=I.next,n=n.baseState;var l=i=null,r=null,c=o;do{var A=c.lane;if((cC&A)===A)r!==null&&(r=r.next={lane:0,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null}),n=c.hasEagerState?c.eagerState:t(n,c.action);else{var u={lane:A,action:c.action,hasEagerState:c.hasEagerState,eagerState:c.eagerState,next:null};r===null?(l=r=u,i=n):r=r.next=u,ut.lanes|=A,AC|=A}c=c.next}while(c!==null&&c!==o);r===null?i=n:r.next=l,On(n,e.memoizedState)||(zg=!0),e.memoizedState=n,e.baseState=i,e.baseQueue=r,g.lastRenderedState=n}if(t=g.interleaved,t!==null){I=t;do o=I.lane,ut.lanes|=o,AC|=o,I=I.next;while(I!==t)}else I===null&&(g.lanes=0);return[e.memoizedState,g.dispatch]}function Hr(t){var e=_n(),g=e.queue;if(g===null)throw Error(ee(311));g.lastRenderedReducer=t;var n=g.dispatch,I=g.pending,o=e.memoizedState;if(I!==null){g.pending=null;var i=I=I.next;do o=t(o,i.action),i=i.next;while(i!==I);On(o,e.memoizedState)||(zg=!0),e.memoizedState=o,e.baseQueue===null&&(e.baseState=o),g.lastRenderedState=o}return[o,n]}function Uy(){}function Dy(t,e){var g=ut,n=_n(),I=e(),o=!On(n.memoizedState,I);if(o&&(n.memoizedState=I,zg=!0),n=n.queue,ql(Py.bind(null,g,n,t),[t]),n.getSnapshot!==e||o||Nt!==null&&Nt.memoizedState.tag&1){if(g.flags|=2048,_l(9,Oy.bind(null,g,n,I,e),void 0,null),wt===null)throw Error(ee(349));(cC&30)!==0||jy(g,e,I)}return I}function jy(t,e,g){t.flags|=16384,t={getSnapshot:e,value:g},e=ut.updateQueue,e===null?(e={lastEffect:null,stores:null},ut.updateQueue=e,e.stores=[t]):(g=e.stores,g===null?e.stores=[t]:g.push(t))}function Oy(t,e,g,n){e.value=g,e.getSnapshot=n,_y(e)&&on(t,1,-1)}function Py(t,e,g){return g(function(){_y(e)&&on(t,1,-1)})}function _y(t){var e=t.getSnapshot;t=t.value;try{var g=e();return!On(t,g)}catch{return!0}}function mu(t){var e=AI();return typeof t=="function"&&(t=t()),e.memoizedState=e.baseState=t,t={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:To,lastRenderedState:t},e.queue=t,t=t.dispatch=ZX.bind(null,ut,t),[e.memoizedState,t]}function _l(t,e,g,n){return t={tag:t,create:e,destroy:g,deps:n,next:null},e=ut.updateQueue,e===null?(e={lastEffect:null,stores:null},ut.updateQueue=e,e.lastEffect=t.next=t):(g=e.lastEffect,g===null?e.lastEffect=t.next=t:(n=g.next,g.next=t,t.next=n,e.lastEffect=t)),t}function qy(){return _n().memoizedState}function uc(t,e,g,n){var I=AI();ut.flags|=t,I.memoizedState=_l(1|e,g,void 0,n===void 0?null:n)}function bA(t,e,g,n){var I=_n();n=n===void 0?null:n;var o=void 0;if($t!==null){var i=$t.memoizedState;if(o=i.destroy,n!==null&&ub(n,i.deps)){I.memoizedState=_l(e,g,o,n);return}}ut.flags|=t,I.memoizedState=_l(1|e,g,o,n)}function pu(t,e){return uc(8390656,8,t,e)}function ql(t,e){return bA(2048,8,t,e)}function $y(t,e){return bA(4,2,t,e)}function ef(t,e){return bA(4,4,t,e)}function tf(t,e){if(typeof e=="function")return t=t(),e(t),function(){e(null)};if(e!=null)return t=t(),e.current=t,function(){e.current=null}}function gf(t,e,g){return g=g!=null?g.concat([t]):null,bA(4,4,tf.bind(null,e,t),g)}function bb(){}function nf(t,e){var g=_n();e=e===void 0?null:e;var n=g.memoizedState;return n!==null&&e!==null&&ub(e,n[1])?n[0]:(g.memoizedState=[t,e],t)}function If(t,e){var g=_n();e=e===void 0?null:e;var n=g.memoizedState;return n!==null&&e!==null&&ub(e,n[1])?n[0]:(t=t(),g.memoizedState=[t,e],t)}function pX(t,e){var g=Je;Je=g!==0&&4>g?g:4,t(!0);var n=nn.transition;nn.transition={};try{t(!1),e()}finally{Je=g,nn.transition=n}}function of(){return _n().memoizedState}function BX(t,e,g){var n=lo(t);g={lane:n,action:g,hasEagerState:!1,eagerState:null,next:null},Cf(t)?lf(e,g):(sf(t,e,g),g=sg(),t=on(t,n,g),t!==null&&rf(t,e,n))}function ZX(t,e,g){var n=lo(t),I={lane:n,action:g,hasEagerState:!1,eagerState:null,next:null};if(Cf(t))lf(e,I);else{sf(t,e,I);var o=t.alternate;if(t.lanes===0&&(o===null||o.lanes===0)&&(o=e.lastRenderedReducer,o!==null))try{var i=e.lastRenderedState,l=o(i,g);if(I.hasEagerState=!0,I.eagerState=l,On(l,i))return}catch{}finally{}g=sg(),t=on(t,n,g),t!==null&&rf(t,e,n)}}function Cf(t){var e=t.alternate;return t===ut||e!==null&&e===ut}function lf(t,e){Vl=Jc=!0;var g=t.pending;g===null?e.next=e:(e.next=g.next,g.next=e),t.pending=e}function sf(t,e,g){wt!==null&&(t.mode&1)!==0&&(Fe&2)===0?(t=e.interleaved,t===null?(g.next=g,Un===null?Un=[e]:Un.push(e)):(g.next=t.next,t.next=g),e.interleaved=g):(t=e.pending,t===null?g.next=g:(g.next=t.next,t.next=g),e.pending=g)}function rf(t,e,g){if((g&4194240)!==0){var n=e.lanes;n&=t.pendingLanes,g|=n,e.lanes=g,Ph(t,g)}}var Mc={readContext:ln,useCallback:Ot,useContext:Ot,useEffect:Ot,useImperativeHandle:Ot,useInsertionEffect:Ot,useLayoutEffect:Ot,useMemo:Ot,useReducer:Ot,useRef:Ot,useState:Ot,useDebugValue:Ot,useDeferredValue:Ot,useTransition:Ot,useMutableSource:Ot,useSyncExternalStore:Ot,useId:Ot,unstable_isNewReconciler:!1},yX={readContext:ln,useCallback:function(t,e){return AI().memoizedState=[t,e===void 0?null:e],t},useContext:ln,useEffect:pu,useImperativeHandle:function(t,e,g){return g=g!=null?g.concat([t]):null,uc(4194308,4,tf.bind(null,e,t),g)},useLayoutEffect:function(t,e){return uc(4194308,4,t,e)},useInsertionEffect:function(t,e){return uc(4,2,t,e)},useMemo:function(t,e){var g=AI();return e=e===void 0?null:e,t=t(),g.memoizedState=[t,e],t},useReducer:function(t,e,g){var n=AI();return e=g!==void 0?g(e):e,n.memoizedState=n.baseState=e,t={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:e},n.queue=t,t=t.dispatch=BX.bind(null,ut,t),[n.memoizedState,t]},useRef:function(t){var e=AI();return t={current:t},e.memoizedState=t},useState:mu,useDebugValue:bb,useDeferredValue:function(t){var e=mu(t),g=e[0],n=e[1];return pu(function(){var I=nn.transition;nn.transition={};try{n(t)}finally{nn.transition=I}},[t]),g},useTransition:function(){var t=mu(!1),e=t[0];return t=pX.bind(null,t[1]),AI().memoizedState=t,[e,t]},useMutableSource:function(){},useSyncExternalStore:function(t,e,g){var n=ut,I=AI();if(It){if(g===void 0)throw Error(ee(407));g=g()}else{if(g=e(),wt===null)throw Error(ee(349));(cC&30)!==0||jy(n,e,g)}I.memoizedState=g;var o={value:g,getSnapshot:e};return I.queue=o,pu(Py.bind(null,n,o,t),[t]),n.flags|=2048,_l(9,Oy.bind(null,n,o,g,e),void 0,null),g},useId:function(){var t=AI(),e=wt.identifierPrefix;if(It){var g=GI,n=bI;g=(n&~(1<<32-vn(n)-1)).toString(32)+g,e=":"+e+"R"+g,g=Pl++,0<g&&(e+="H"+g.toString(32)),e+=":"}else g=mX++,e=":"+e+"r"+g.toString(32)+":";return t.memoizedState=e},unstable_isNewReconciler:!1},fX={readContext:ln,useCallback:nf,useContext:ln,useEffect:ql,useImperativeHandle:gf,useInsertionEffect:$y,useLayoutEffect:ef,useMemo:If,useReducer:Sr,useRef:qy,useState:function(){return Sr(To)},useDebugValue:bb,useDeferredValue:function(t){var e=Sr(To),g=e[0],n=e[1];return ql(function(){var I=nn.transition;nn.transition={};try{n(t)}finally{nn.transition=I}},[t]),g},useTransition:function(){var t=Sr(To)[0],e=_n().memoizedState;return[t,e]},useMutableSource:Uy,useSyncExternalStore:Dy,useId:of,unstable_isNewReconciler:!1},vX={readContext:ln,useCallback:nf,useContext:ln,useEffect:ql,useImperativeHandle:gf,useInsertionEffect:$y,useLayoutEffect:ef,useMemo:If,useReducer:Hr,useRef:qy,useState:function(){return Hr(To)},useDebugValue:bb,useDeferredValue:function(t){var e=Hr(To),g=e[0],n=e[1];return ql(function(){var I=nn.transition;nn.transition={};try{n(t)}finally{nn.transition=I}},[t]),g},useTransition:function(){var t=Hr(To)[0],e=_n().memoizedState;return[t,e]},useMutableSource:Uy,useSyncExternalStore:Dy,useId:of,unstable_isNewReconciler:!1};function Gb(t,e){try{var g="",n=e;do g+=$V(n),n=n.return;while(n);var I=g}catch(o){I=`
|
|
31
|
+
Error generating stack: `+o.message+`
|
|
32
|
+
`+o.stack}return{value:t,source:e,stack:I}}function Ld(t,e){try{console.error(e.value)}catch(g){setTimeout(function(){throw g})}}var WX=typeof WeakMap=="function"?WeakMap:Map;function cf(t,e,g){g=pI(-1,g),g.tag=3,g.payload={element:null};var n=e.value;return g.callback=function(){Tc||(Tc=!0,Od=n),Ld(t,e)},g}function Af(t,e,g){g=pI(-1,g),g.tag=3;var n=t.type.getDerivedStateFromError;if(typeof n=="function"){var I=e.value;g.payload=function(){return n(I)},g.callback=function(){Ld(t,e)}}var o=t.stateNode;return o!==null&&typeof o.componentDidCatch=="function"&&(g.callback=function(){Ld(t,e),typeof n!="function"&&(Co===null?Co=new Set([this]):Co.add(this));var i=e.stack;this.componentDidCatch(e.value,{componentStack:i!==null?i:""})}),g}function Tp(t,e,g){var n=t.pingCache;if(n===null){n=t.pingCache=new WX;var I=new Set;n.set(e,I)}else I=n.get(e),I===void 0&&(I=new Set,n.set(e,I));I.has(g)||(I.add(g),t=LX.bind(null,t,e,g),e.then(t,t))}function Up(t){do{var e;if((e=t.tag===13)&&(e=t.memoizedState,e=e!==null?e.dehydrated!==null:!0),e)return t;t=t.return}while(t!==null);return null}function Dp(t,e,g,n,I){return(t.mode&1)===0?(t===e?t.flags|=65536:(t.flags|=128,g.flags|=131072,g.flags&=-52805,g.tag===1&&(g.alternate===null?g.tag=17:(e=pI(-1,1),e.tag=2,io(g,e))),g.lanes|=1),t):(t.flags|=65536,t.lanes=I,t)}var af,Jd,uf,df;af=function(t,e){for(var g=e.child;g!==null;){if(g.tag===5||g.tag===6)t.appendChild(g.stateNode);else if(g.tag!==4&&g.child!==null){g.child.return=g,g=g.child;continue}if(g===e)break;for(;g.sibling===null;){if(g.return===null||g.return===e)return;g=g.return}g.sibling.return=g.return,g=g.sibling}};Jd=function(){};uf=function(t,e,g,n){var I=t.memoizedProps;if(I!==n){t=e.stateNode,Jo(jn.current);var o=null;switch(g){case"input":I=ud(t,I),n=ud(t,n),o=[];break;case"select":I=ct({},I,{value:void 0}),n=ct({},n,{value:void 0}),o=[];break;case"textarea":I=bd(t,I),n=bd(t,n),o=[];break;default:typeof I.onClick!="function"&&typeof n.onClick=="function"&&(t.onclick=Kc)}md(g,n);var i;g=null;for(c in I)if(!n.hasOwnProperty(c)&&I.hasOwnProperty(c)&&I[c]!=null)if(c==="style"){var l=I[c];for(i in l)l.hasOwnProperty(i)&&(g||(g={}),g[i]="")}else c!=="dangerouslySetInnerHTML"&&c!=="children"&&c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(kl.hasOwnProperty(c)?o||(o=[]):(o=o||[]).push(c,null));for(c in n){var r=n[c];if(l=I!=null?I[c]:void 0,n.hasOwnProperty(c)&&r!==l&&(r!=null||l!=null))if(c==="style")if(l){for(i in l)!l.hasOwnProperty(i)||r&&r.hasOwnProperty(i)||(g||(g={}),g[i]="");for(i in r)r.hasOwnProperty(i)&&l[i]!==r[i]&&(g||(g={}),g[i]=r[i])}else g||(o||(o=[]),o.push(c,g)),g=r;else c==="dangerouslySetInnerHTML"?(r=r?r.__html:void 0,l=l?l.__html:void 0,r!=null&&l!==r&&(o=o||[]).push(c,r)):c==="children"?typeof r!="string"&&typeof r!="number"||(o=o||[]).push(c,""+r):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&(kl.hasOwnProperty(c)?(r!=null&&c==="onScroll"&&qe("scroll",t),o||l===r||(o=[])):(o=o||[]).push(c,r))}g&&(o=o||[]).push("style",g);var c=o;(e.updateQueue=c)&&(e.flags|=4)}};df=function(t,e,g,n){g!==n&&(e.flags|=4)};function el(t,e){if(!It)switch(t.tailMode){case"hidden":e=t.tail;for(var g=null;e!==null;)e.alternate!==null&&(g=e),e=e.sibling;g===null?t.tail=null:g.sibling=null;break;case"collapsed":g=t.tail;for(var n=null;g!==null;)g.alternate!==null&&(n=g),g=g.sibling;n===null?e||t.tail===null?t.tail=null:t.tail.sibling=null:n.sibling=null}}function Pt(t){var e=t.alternate!==null&&t.alternate.child===t.child,g=0,n=0;if(e)for(var I=t.child;I!==null;)g|=I.lanes|I.childLanes,n|=I.subtreeFlags&14680064,n|=I.flags&14680064,I.return=t,I=I.sibling;else for(I=t.child;I!==null;)g|=I.lanes|I.childLanes,n|=I.subtreeFlags,n|=I.flags,I.return=t,I=I.sibling;return t.subtreeFlags|=n,t.childLanes=g,e}function wX(t,e,g){var n=e.pendingProps;switch(sb(e),e.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Pt(e),null;case 1:return Yg(e.type)&&Sc(),Pt(e),null;case 3:return n=e.stateNode,rC(),$e(Xg),$e(tg),ab(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(t===null||t.child===null)&&(qC(e)?e.flags|=4:t===null||t.memoizedState.isDehydrated&&(e.flags&256)===0||(e.flags|=1024,Zn!==null&&(qd(Zn),Zn=null))),Jd(t,e),Pt(e),null;case 5:Ab(e);var I=Jo(Ol.current);if(g=e.type,t!==null&&e.stateNode!=null)uf(t,e,g,n,I),t.ref!==e.ref&&(e.flags|=512,e.flags|=2097152);else{if(!n){if(e.stateNode===null)throw Error(ee(166));return Pt(e),null}if(t=Jo(jn.current),qC(e)){n=e.stateNode,g=e.type;var o=e.memoizedProps;switch(n[Tn]=e,n[Dl]=o,t=(e.mode&1)!==0,g){case"dialog":qe("cancel",n),qe("close",n);break;case"iframe":case"object":case"embed":qe("load",n);break;case"video":case"audio":for(I=0;I<ml.length;I++)qe(ml[I],n);break;case"source":qe("error",n);break;case"img":case"image":case"link":qe("error",n),qe("load",n);break;case"details":qe("toggle",n);break;case"input":sp(n,o),qe("invalid",n);break;case"select":n._wrapperState={wasMultiple:!!o.multiple},qe("invalid",n);break;case"textarea":cp(n,o),qe("invalid",n)}md(g,o),I=null;for(var i in o)if(o.hasOwnProperty(i)){var l=o[i];i==="children"?typeof l=="string"?n.textContent!==l&&(Yr(n.textContent,l,t),I=["children",l]):typeof l=="number"&&n.textContent!==""+l&&(Yr(n.textContent,l,t),I=["children",""+l]):kl.hasOwnProperty(i)&&l!=null&&i==="onScroll"&&qe("scroll",n)}switch(g){case"input":yr(n),rp(n,o,!0);break;case"textarea":yr(n),Ap(n);break;case"select":case"option":break;default:typeof o.onClick=="function"&&(n.onclick=Kc)}n=I,e.updateQueue=n,n!==null&&(e.flags|=4)}else{i=I.nodeType===9?I:I.ownerDocument,t==="http://www.w3.org/1999/xhtml"&&(t=_Z(g)),t==="http://www.w3.org/1999/xhtml"?g==="script"?(t=i.createElement("div"),t.innerHTML="<script><\/script>",t=t.removeChild(t.firstChild)):typeof n.is=="string"?t=i.createElement(g,{is:n.is}):(t=i.createElement(g),g==="select"&&(i=t,n.multiple?i.multiple=!0:n.size&&(i.size=n.size))):t=i.createElementNS(t,g),t[Tn]=e,t[Dl]=n,af(t,e,!1,!1),e.stateNode=t;e:{switch(i=pd(g,n),g){case"dialog":qe("cancel",t),qe("close",t),I=n;break;case"iframe":case"object":case"embed":qe("load",t),I=n;break;case"video":case"audio":for(I=0;I<ml.length;I++)qe(ml[I],t);I=n;break;case"source":qe("error",t),I=n;break;case"img":case"image":case"link":qe("error",t),qe("load",t),I=n;break;case"details":qe("toggle",t),I=n;break;case"input":sp(t,n),I=ud(t,n),qe("invalid",t);break;case"option":I=n;break;case"select":t._wrapperState={wasMultiple:!!n.multiple},I=ct({},n,{value:void 0}),qe("invalid",t);break;case"textarea":cp(t,n),I=bd(t,n),qe("invalid",t);break;default:I=n}md(g,I),l=I;for(o in l)if(l.hasOwnProperty(o)){var r=l[o];o==="style"?ey(t,r):o==="dangerouslySetInnerHTML"?(r=r?r.__html:void 0,r!=null&&qZ(t,r)):o==="children"?typeof r=="string"?(g!=="textarea"||r!=="")&&zl(t,r):typeof r=="number"&&zl(t,""+r):o!=="suppressContentEditableWarning"&&o!=="suppressHydrationWarning"&&o!=="autoFocus"&&(kl.hasOwnProperty(o)?r!=null&&o==="onScroll"&&qe("scroll",t):r!=null&&Qh(t,o,r,i))}switch(g){case"input":yr(t),rp(t,n,!1);break;case"textarea":yr(t),Ap(t);break;case"option":n.value!=null&&t.setAttribute("value",""+so(n.value));break;case"select":t.multiple=!!n.multiple,o=n.value,o!=null?Pi(t,!!n.multiple,o,!1):n.defaultValue!=null&&Pi(t,!!n.multiple,n.defaultValue,!0);break;default:typeof I.onClick=="function"&&(t.onclick=Kc)}switch(g){case"button":case"input":case"select":case"textarea":n=!!n.autoFocus;break e;case"img":n=!0;break e;default:n=!1}}n&&(e.flags|=4)}e.ref!==null&&(e.flags|=512,e.flags|=2097152)}return Pt(e),null;case 6:if(t&&e.stateNode!=null)df(t,e,t.memoizedProps,n);else{if(typeof n!="string"&&e.stateNode===null)throw Error(ee(166));if(g=Jo(Ol.current),Jo(jn.current),qC(e)){if(n=e.stateNode,g=e.memoizedProps,n[Tn]=e,(o=n.nodeValue!==g)&&(t=xg,t!==null))switch(i=(t.mode&1)!==0,t.tag){case 3:Yr(n.nodeValue,g,i);break;case 5:t.memoizedProps[void 0]!==!0&&Yr(n.nodeValue,g,i)}o&&(e.flags|=4)}else n=(g.nodeType===9?g:g.ownerDocument).createTextNode(n),n[Tn]=e,e.stateNode=n}return Pt(e),null;case 13:if($e(rt),n=e.memoizedState,It&&wg!==null&&(e.mode&1)!==0&&(e.flags&128)===0){for(n=wg;n;)n=hI(n.nextSibling);return lC(),e.flags|=98560,e}if(n!==null&&n.dehydrated!==null){if(n=qC(e),t===null){if(!n)throw Error(ee(318));if(n=e.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(ee(317));n[Tn]=e}else lC(),(e.flags&128)===0&&(e.memoizedState=null),e.flags|=4;return Pt(e),null}return Zn!==null&&(qd(Zn),Zn=null),(e.flags&128)!==0?(e.lanes=g,e):(n=n!==null,g=!1,t===null?qC(e):g=t.memoizedState!==null,n&&!g&&(e.child.flags|=8192,(e.mode&1)!==0&&(t===null||(rt.current&1)!==0?Rt===0&&(Rt=3):fb())),e.updateQueue!==null&&(e.flags|=4),Pt(e),null);case 4:return rC(),Jd(t,e),t===null&&Tl(e.stateNode.containerInfo),Pt(e),null;case 10:return ib(e.type._context),Pt(e),null;case 17:return Yg(e.type)&&Sc(),Pt(e),null;case 19:if($e(rt),o=e.memoizedState,o===null)return Pt(e),null;if(n=(e.flags&128)!==0,i=o.rendering,i===null)if(n)el(o,!1);else{if(Rt!==0||t!==null&&(t.flags&128)!==0)for(t=e.child;t!==null;){if(i=Lc(t),i!==null){for(e.flags|=128,el(o,!1),n=i.updateQueue,n!==null&&(e.updateQueue=n,e.flags|=4),e.subtreeFlags=0,n=g,g=e.child;g!==null;)o=g,t=n,o.flags&=14680066,i=o.alternate,i===null?(o.childLanes=0,o.lanes=t,o.child=null,o.subtreeFlags=0,o.memoizedProps=null,o.memoizedState=null,o.updateQueue=null,o.dependencies=null,o.stateNode=null):(o.childLanes=i.childLanes,o.lanes=i.lanes,o.child=i.child,o.subtreeFlags=0,o.deletions=null,o.memoizedProps=i.memoizedProps,o.memoizedState=i.memoizedState,o.updateQueue=i.updateQueue,o.type=i.type,t=i.dependencies,o.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext}),g=g.sibling;return Pe(rt,rt.current&1|2),e.child}t=t.sibling}o.tail!==null&&Bt()>aC&&(e.flags|=128,n=!0,el(o,!1),e.lanes=4194304)}else{if(!n)if(t=Lc(i),t!==null){if(e.flags|=128,n=!0,g=t.updateQueue,g!==null&&(e.updateQueue=g,e.flags|=4),el(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!It)return Pt(e),null}else 2*Bt()-o.renderingStartTime>aC&&g!==1073741824&&(e.flags|=128,n=!0,el(o,!1),e.lanes=4194304);o.isBackwards?(i.sibling=e.child,e.child=i):(g=o.last,g!==null?g.sibling=i:e.child=i,o.last=i)}return o.tail!==null?(e=o.tail,o.rendering=e,o.tail=e.sibling,o.renderingStartTime=Bt(),e.sibling=null,g=rt.current,Pe(rt,n?g&1|2:g&1),e):(Pt(e),null);case 22:case 23:return yb(),n=e.memoizedState!==null,t!==null&&t.memoizedState!==null!==n&&(e.flags|=8192),n&&(e.mode&1)!==0?(kg&1073741824)!==0&&(Pt(e),e.subtreeFlags&6&&(e.flags|=8192)):Pt(e),null;case 24:return null;case 25:return null}throw Error(ee(156,e.tag))}var VX=wI.ReactCurrentOwner,zg=!1;function ig(t,e,g,n){e.child=t===null?Qy(e,null,g,n):sC(e,t.child,g,n)}function jp(t,e,g,n,I){g=g.render;var o=e.ref;return eC(e,I),n=db(t,e,g,n,o,I),g=hb(),t!==null&&!zg?(e.updateQueue=t.updateQueue,e.flags&=-2053,t.lanes&=~I,vI(t,e,I)):(It&&g&&lb(e),e.flags|=1,ig(t,e,n,I),e.child)}function Op(t,e,g,n,I){if(t===null){var o=g.type;return typeof o=="function"&&!vb(o)&&o.defaultProps===void 0&&g.compare===null&&g.defaultProps===void 0?(e.tag=15,e.type=o,hf(t,e,o,n,I)):(t=bc(g.type,null,n,e,e.mode,I),t.ref=e.ref,t.return=e,e.child=t)}if(o=t.child,(t.lanes&I)===0){var i=o.memoizedProps;if(g=g.compare,g=g!==null?g:Ql,g(i,n)&&t.ref===e.ref)return vI(t,e,I)}return e.flags|=1,t=co(o,n),t.ref=e.ref,t.return=e,e.child=t}function hf(t,e,g,n,I){if(t!==null&&Ql(t.memoizedProps,n)&&t.ref===e.ref)if(zg=!1,(t.lanes&I)!==0)(t.flags&131072)!==0&&(zg=!0);else return e.lanes=t.lanes,vI(t,e,I);return Md(t,e,g,n,I)}function bf(t,e,g){var n=e.pendingProps,I=n.children,o=t!==null?t.memoizedState:null;if(n.mode==="hidden")if((e.mode&1)===0)e.memoizedState={baseLanes:0,cachePool:null},Pe(ji,kg),kg|=g;else if((g&1073741824)!==0)e.memoizedState={baseLanes:0,cachePool:null},n=o!==null?o.baseLanes:g,Pe(ji,kg),kg|=n;else return t=o!==null?o.baseLanes|g:g,e.lanes=e.childLanes=1073741824,e.memoizedState={baseLanes:t,cachePool:null},e.updateQueue=null,Pe(ji,kg),kg|=t,null;else o!==null?(n=o.baseLanes|g,e.memoizedState=null):n=g,Pe(ji,kg),kg|=n;return ig(t,e,I,g),e.child}function Gf(t,e){var g=e.ref;(t===null&&g!==null||t!==null&&t.ref!==g)&&(e.flags|=512,e.flags|=2097152)}function Md(t,e,g,n,I){var o=Yg(g)?Po:tg.current;return o=CC(e,o),eC(e,I),g=db(t,e,g,n,o,I),n=hb(),t!==null&&!zg?(e.updateQueue=t.updateQueue,e.flags&=-2053,t.lanes&=~I,vI(t,e,I)):(It&&n&&lb(e),e.flags|=1,ig(t,e,g,I),e.child)}function Pp(t,e,g,n,I){if(Yg(g)){var o=!0;Hc(e)}else o=!1;if(eC(e,I),e.stateNode===null)t!==null&&(t.alternate=null,e.alternate=null,e.flags|=2),Ly(e,g,n),kd(e,g,n,I),n=!0;else if(t===null){var i=e.stateNode,l=e.memoizedProps;i.props=l;var r=i.context,c=g.contextType;typeof c=="object"&&c!==null?c=ln(c):(c=Yg(g)?Po:tg.current,c=CC(e,c));var A=g.getDerivedStateFromProps,u=typeof A=="function"||typeof i.getSnapshotBeforeUpdate=="function";u||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(l!==n||r!==c)&&Jp(e,i,n,c),PI=!1;var h=e.memoizedState;i.state=h,kc(e,n,i,I),r=e.memoizedState,l!==n||h!==r||Xg.current||PI?(typeof A=="function"&&(Fd(e,g,A,n),r=e.memoizedState),(l=PI||Lp(e,g,l,n,h,r,c))?(u||typeof i.UNSAFE_componentWillMount!="function"&&typeof i.componentWillMount!="function"||(typeof i.componentWillMount=="function"&&i.componentWillMount(),typeof i.UNSAFE_componentWillMount=="function"&&i.UNSAFE_componentWillMount()),typeof i.componentDidMount=="function"&&(e.flags|=4194308)):(typeof i.componentDidMount=="function"&&(e.flags|=4194308),e.memoizedProps=n,e.memoizedState=r),i.props=n,i.state=r,i.context=c,n=l):(typeof i.componentDidMount=="function"&&(e.flags|=4194308),n=!1)}else{i=e.stateNode,zy(t,e),l=e.memoizedProps,c=e.type===e.elementType?l:pn(e.type,l),i.props=c,u=e.pendingProps,h=i.context,r=g.contextType,typeof r=="object"&&r!==null?r=ln(r):(r=Yg(g)?Po:tg.current,r=CC(e,r));var b=g.getDerivedStateFromProps;(A=typeof b=="function"||typeof i.getSnapshotBeforeUpdate=="function")||typeof i.UNSAFE_componentWillReceiveProps!="function"&&typeof i.componentWillReceiveProps!="function"||(l!==u||h!==r)&&Jp(e,i,n,r),PI=!1,h=e.memoizedState,i.state=h,kc(e,n,i,I);var p=e.memoizedState;l!==u||h!==p||Xg.current||PI?(typeof b=="function"&&(Fd(e,g,b,n),p=e.memoizedState),(c=PI||Lp(e,g,c,n,h,p,r)||!1)?(A||typeof i.UNSAFE_componentWillUpdate!="function"&&typeof i.componentWillUpdate!="function"||(typeof i.componentWillUpdate=="function"&&i.componentWillUpdate(n,p,r),typeof i.UNSAFE_componentWillUpdate=="function"&&i.UNSAFE_componentWillUpdate(n,p,r)),typeof i.componentDidUpdate=="function"&&(e.flags|=4),typeof i.getSnapshotBeforeUpdate=="function"&&(e.flags|=1024)):(typeof i.componentDidUpdate!="function"||l===t.memoizedProps&&h===t.memoizedState||(e.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||l===t.memoizedProps&&h===t.memoizedState||(e.flags|=1024),e.memoizedProps=n,e.memoizedState=p),i.props=n,i.state=p,i.context=r,n=c):(typeof i.componentDidUpdate!="function"||l===t.memoizedProps&&h===t.memoizedState||(e.flags|=4),typeof i.getSnapshotBeforeUpdate!="function"||l===t.memoizedProps&&h===t.memoizedState||(e.flags|=1024),n=!1)}return Ed(t,e,g,n,o,I)}function Ed(t,e,g,n,I,o){Gf(t,e);var i=(e.flags&128)!==0;if(!n&&!i)return I&&kp(e,g,!1),vI(t,e,o);n=e.stateNode,VX.current=e;var l=i&&typeof g.getDerivedStateFromError!="function"?null:n.render();return e.flags|=1,t!==null&&i?(e.child=sC(e,t.child,null,o),e.child=sC(e,null,l,o)):ig(t,e,l,o),e.memoizedState=n.state,I&&kp(e,g,!0),e.child}function mf(t){var e=t.stateNode;e.pendingContext?Fp(t,e.pendingContext,e.pendingContext!==e.context):e.context&&Fp(t,e.context,!1),cb(t,e.containerInfo)}function _p(t,e,g,n,I){return lC(),rb(I),e.flags|=256,ig(t,e,g,n),e.child}var Nr={dehydrated:null,treeContext:null,retryLane:0};function Fr(t){return{baseLanes:t,cachePool:null}}function pf(t,e,g){var n=e.pendingProps,I=rt.current,o=!1,i=(e.flags&128)!==0,l;if((l=i)||(l=t!==null&&t.memoizedState===null?!1:(I&2)!==0),l?(o=!0,e.flags&=-129):(t===null||t.memoizedState!==null)&&(I|=1),Pe(rt,I&1),t===null)return xd(e),t=e.memoizedState,t!==null&&(t=t.dehydrated,t!==null)?((e.mode&1)===0?e.lanes=1:t.data==="$!"?e.lanes=8:e.lanes=1073741824,null):(I=n.children,t=n.fallback,o?(n=e.mode,o=e.child,I={mode:"hidden",children:I},(n&1)===0&&o!==null?(o.childLanes=0,o.pendingProps=I):o=jc(I,n,0,null),t=Do(t,n,g,null),o.return=e,t.return=e,o.sibling=t,e.child=o,e.child.memoizedState=Fr(g),e.memoizedState=Nr,t):Qd(e,I));if(I=t.memoizedState,I!==null){if(l=I.dehydrated,l!==null){if(i)return e.flags&256?(e.flags&=-257,kr(t,e,g,Error(ee(422)))):e.memoizedState!==null?(e.child=t.child,e.flags|=128,null):(o=n.fallback,I=e.mode,n=jc({mode:"visible",children:n.children},I,0,null),o=Do(o,I,g,null),o.flags|=2,n.return=e,o.return=e,n.sibling=o,e.child=n,(e.mode&1)!==0&&sC(e,t.child,null,g),e.child.memoizedState=Fr(g),e.memoizedState=Nr,o);if((e.mode&1)===0)e=kr(t,e,g,null);else if(l.data==="$!")e=kr(t,e,g,Error(ee(419)));else if(n=(g&t.childLanes)!==0,zg||n){if(n=wt,n!==null){switch(g&-g){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}n=(o&(n.suspendedLanes|g))!==0?0:o,n!==0&&n!==I.retryLane&&(I.retryLane=n,on(t,n,-1))}fb(),e=kr(t,e,g,Error(ee(421)))}else l.data==="$?"?(e.flags|=128,e.child=t.child,e=JX.bind(null,t),l._reactRetry=e,e=null):(g=I.treeContext,wg=hI(l.nextSibling),xg=e,It=!0,Zn=null,g!==null&&(qg[$g++]=bI,qg[$g++]=GI,qg[$g++]=_o,bI=g.id,GI=g.overflow,_o=e),e=Qd(e,e.pendingProps.children),e.flags|=4096);return e}return o?(n=$p(t,e,n.children,n.fallback,g),o=e.child,I=t.child.memoizedState,o.memoizedState=I===null?Fr(g):{baseLanes:I.baseLanes|g,cachePool:null},o.childLanes=t.childLanes&~g,e.memoizedState=Nr,n):(g=qp(t,e,n.children,g),e.memoizedState=null,g)}return o?(n=$p(t,e,n.children,n.fallback,g),o=e.child,I=t.child.memoizedState,o.memoizedState=I===null?Fr(g):{baseLanes:I.baseLanes|g,cachePool:null},o.childLanes=t.childLanes&~g,e.memoizedState=Nr,n):(g=qp(t,e,n.children,g),e.memoizedState=null,g)}function Qd(t,e){return e=jc({mode:"visible",children:e},t.mode,0,null),e.return=t,t.child=e}function qp(t,e,g,n){var I=t.child;return t=I.sibling,g=co(I,{mode:"visible",children:g}),(e.mode&1)===0&&(g.lanes=n),g.return=e,g.sibling=null,t!==null&&(n=e.deletions,n===null?(e.deletions=[t],e.flags|=16):n.push(t)),e.child=g}function $p(t,e,g,n,I){var o=e.mode;t=t.child;var i=t.sibling,l={mode:"hidden",children:g};return(o&1)===0&&e.child!==t?(g=e.child,g.childLanes=0,g.pendingProps=l,e.deletions=null):(g=co(t,l),g.subtreeFlags=t.subtreeFlags&14680064),i!==null?n=co(i,n):(n=Do(n,o,I,null),n.flags|=2),n.return=e,g.return=e,g.sibling=n,e.child=g,n}function kr(t,e,g,n){return n!==null&&rb(n),sC(e,t.child,null,g),t=Qd(e,e.pendingProps.children),t.flags|=2,e.memoizedState=null,t}function eB(t,e,g){t.lanes|=e;var n=t.alternate;n!==null&&(n.lanes|=e),Nd(t.return,e,g)}function Bu(t,e,g,n,I){var o=t.memoizedState;o===null?t.memoizedState={isBackwards:e,rendering:null,renderingStartTime:0,last:n,tail:g,tailMode:I}:(o.isBackwards=e,o.rendering=null,o.renderingStartTime=0,o.last=n,o.tail=g,o.tailMode=I)}function Bf(t,e,g){var n=e.pendingProps,I=n.revealOrder,o=n.tail;if(ig(t,e,n.children,g),n=rt.current,(n&2)!==0)n=n&1|2,e.flags|=128;else{if(t!==null&&(t.flags&128)!==0)e:for(t=e.child;t!==null;){if(t.tag===13)t.memoizedState!==null&&eB(t,g,e);else if(t.tag===19)eB(t,g,e);else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break e;for(;t.sibling===null;){if(t.return===null||t.return===e)break e;t=t.return}t.sibling.return=t.return,t=t.sibling}n&=1}if(Pe(rt,n),(e.mode&1)===0)e.memoizedState=null;else switch(I){case"forwards":for(g=e.child,I=null;g!==null;)t=g.alternate,t!==null&&Lc(t)===null&&(I=g),g=g.sibling;g=I,g===null?(I=e.child,e.child=null):(I=g.sibling,g.sibling=null),Bu(e,!1,I,g,o);break;case"backwards":for(g=null,I=e.child,e.child=null;I!==null;){if(t=I.alternate,t!==null&&Lc(t)===null){e.child=I;break}t=I.sibling,I.sibling=g,g=I,I=t}Bu(e,!0,g,null,o);break;case"together":Bu(e,!1,null,null,void 0);break;default:e.memoizedState=null}return e.child}function vI(t,e,g){if(t!==null&&(e.dependencies=t.dependencies),AC|=e.lanes,(g&e.childLanes)===0)return null;if(t!==null&&e.child!==t.child)throw Error(ee(153));if(e.child!==null){for(t=e.child,g=co(t,t.pendingProps),e.child=g,g.return=e;t.sibling!==null;)t=t.sibling,g=g.sibling=co(t,t.pendingProps),g.return=e;g.sibling=null}return e.child}function RX(t,e,g){switch(e.tag){case 3:mf(e),lC();break;case 5:Ty(e);break;case 1:Yg(e.type)&&Hc(e);break;case 4:cb(e,e.stateNode.containerInfo);break;case 10:var n=e.type._context,I=e.memoizedProps.value;Pe(Nc,n._currentValue),n._currentValue=I;break;case 13:if(n=e.memoizedState,n!==null)return n.dehydrated!==null?(Pe(rt,rt.current&1),e.flags|=128,null):(g&e.child.childLanes)!==0?pf(t,e,g):(Pe(rt,rt.current&1),t=vI(t,e,g),t!==null?t.sibling:null);Pe(rt,rt.current&1);break;case 19:if(n=(g&e.childLanes)!==0,(t.flags&128)!==0){if(n)return Bf(t,e,g);e.flags|=128}if(I=e.memoizedState,I!==null&&(I.rendering=null,I.tail=null,I.lastEffect=null),Pe(rt,rt.current),n)break;return null;case 22:case 23:return e.lanes=0,bf(t,e,g)}return vI(t,e,g)}function XX(t,e){switch(sb(e),e.tag){case 1:return Yg(e.type)&&Sc(),t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 3:return rC(),$e(Xg),$e(tg),ab(),t=e.flags,(t&65536)!==0&&(t&128)===0?(e.flags=t&-65537|128,e):null;case 5:return Ab(e),null;case 13:if($e(rt),t=e.memoizedState,t!==null&&t.dehydrated!==null){if(e.alternate===null)throw Error(ee(340));lC()}return t=e.flags,t&65536?(e.flags=t&-65537|128,e):null;case 19:return $e(rt),null;case 4:return rC(),null;case 10:return ib(e.type._context),null;case 22:case 23:return yb(),null;case 24:return null;default:return null}}var zr=!1,Mo=!1,YX=typeof WeakSet=="function"?WeakSet:Set,oe=null;function Ec(t,e){var g=t.ref;if(g!==null)if(typeof g=="function")try{g(null)}catch(n){Vg(t,e,n)}else g.current=null}function Td(t,e,g){try{g()}catch(n){Vg(t,e,n)}}var tB=!1;function KX(t,e){if(t=wy(),nb(t)){if("selectionStart"in t)var g={start:t.selectionStart,end:t.selectionEnd};else e:{g=(g=t.ownerDocument)&&g.defaultView||window;var n=g.getSelection&&g.getSelection();if(n&&n.rangeCount!==0){g=n.anchorNode;var I=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{g.nodeType,o.nodeType}catch{g=null;break e}var i=0,l=-1,r=-1,c=0,A=0,u=t,h=null;t:for(;;){for(var b;u!==g||I!==0&&u.nodeType!==3||(l=i+I),u!==o||n!==0&&u.nodeType!==3||(r=i+n),u.nodeType===3&&(i+=u.nodeValue.length),(b=u.firstChild)!==null;)h=u,u=b;for(;;){if(u===t)break t;if(h===g&&++c===I&&(l=i),h===o&&++A===n&&(r=i),(b=u.nextSibling)!==null)break;u=h,h=u.parentNode}u=b}g=l===-1||r===-1?null:{start:l,end:r}}else g=null}g=g||{start:0,end:0}}else g=null;for(Xd={focusedElem:t,selectionRange:g},oe=e;oe!==null;)if(e=oe,t=e.child,(e.subtreeFlags&1028)!==0&&t!==null)t.return=e,oe=t;else for(;oe!==null;){e=oe;try{var p=e.alternate;if((e.flags&1024)!==0)switch(e.tag){case 0:case 11:case 15:break;case 1:if(p!==null){var Z=p.memoizedProps,v=p.memoizedState,y=e.stateNode,m=y.getSnapshotBeforeUpdate(e.elementType===e.type?Z:pn(e.type,Z),v);y.__reactInternalSnapshotBeforeUpdate=m}break;case 3:var B=e.stateNode.containerInfo;if(B.nodeType===1)B.textContent="";else if(B.nodeType===9){var w=B.body;w!=null&&(w.textContent="")}break;case 5:case 6:case 4:case 17:break;default:throw Error(ee(163))}}catch(X){Vg(e,e.return,X)}if(t=e.sibling,t!==null){t.return=e.return,oe=t;break}oe=e.return}return p=tB,tB=!1,p}function $l(t,e,g){var n=e.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var I=n=n.next;do{if((I.tag&t)===t){var o=I.destroy;I.destroy=void 0,o!==void 0&&Td(e,g,o)}I=I.next}while(I!==n)}}function GA(t,e){if(e=e.updateQueue,e=e!==null?e.lastEffect:null,e!==null){var g=e=e.next;do{if((g.tag&t)===t){var n=g.create;g.destroy=n()}g=g.next}while(g!==e)}}function Ud(t){var e=t.ref;if(e!==null){var g=t.stateNode;switch(t.tag){case 5:t=g;break;default:t=g}typeof e=="function"?e(t):e.current=t}}function gB(t,e,g){if(Dn&&typeof Dn.onCommitFiberUnmount=="function")try{Dn.onCommitFiberUnmount(rA,e)}catch{}switch(e.tag){case 0:case 11:case 14:case 15:if(t=e.updateQueue,t!==null&&(t=t.lastEffect,t!==null)){var n=t=t.next;do{var I=n,o=I.destroy;I=I.tag,o!==void 0&&((I&2)!==0||(I&4)!==0)&&Td(e,g,o),n=n.next}while(n!==t)}break;case 1:if(Ec(e,g),t=e.stateNode,typeof t.componentWillUnmount=="function")try{t.props=e.memoizedProps,t.state=e.memoizedState,t.componentWillUnmount()}catch(i){Vg(e,g,i)}break;case 5:Ec(e,g);break;case 4:ff(t,e,g)}}function Zf(t){var e=t.alternate;e!==null&&(t.alternate=null,Zf(e)),t.child=null,t.deletions=null,t.sibling=null,t.tag===5&&(e=t.stateNode,e!==null&&(delete e[Tn],delete e[Dl],delete e[Sd],delete e[dX],delete e[hX])),t.stateNode=null,t.return=null,t.dependencies=null,t.memoizedProps=null,t.memoizedState=null,t.pendingProps=null,t.stateNode=null,t.updateQueue=null}function yf(t){return t.tag===5||t.tag===3||t.tag===4}function nB(t){e:for(;;){for(;t.sibling===null;){if(t.return===null||yf(t.return))return null;t=t.return}for(t.sibling.return=t.return,t=t.sibling;t.tag!==5&&t.tag!==6&&t.tag!==18;){if(t.flags&2||t.child===null||t.tag===4)continue e;t.child.return=t,t=t.child}if(!(t.flags&2))return t.stateNode}}function IB(t){e:{for(var e=t.return;e!==null;){if(yf(e))break e;e=e.return}throw Error(ee(160))}var g=e;switch(g.tag){case 5:e=g.stateNode,g.flags&32&&(zl(e,""),g.flags&=-33),g=nB(t),jd(t,g,e);break;case 3:case 4:e=g.stateNode.containerInfo,g=nB(t),Dd(t,g,e);break;default:throw Error(ee(161))}}function Dd(t,e,g){var n=t.tag;if(n===5||n===6)t=t.stateNode,e?g.nodeType===8?g.parentNode.insertBefore(t,e):g.insertBefore(t,e):(g.nodeType===8?(e=g.parentNode,e.insertBefore(t,g)):(e=g,e.appendChild(t)),g=g._reactRootContainer,g!=null||e.onclick!==null||(e.onclick=Kc));else if(n!==4&&(t=t.child,t!==null))for(Dd(t,e,g),t=t.sibling;t!==null;)Dd(t,e,g),t=t.sibling}function jd(t,e,g){var n=t.tag;if(n===5||n===6)t=t.stateNode,e?g.insertBefore(t,e):g.appendChild(t);else if(n!==4&&(t=t.child,t!==null))for(jd(t,e,g),t=t.sibling;t!==null;)jd(t,e,g),t=t.sibling}function ff(t,e,g){for(var n=e,I=!1,o,i;;){if(!I){I=n.return;e:for(;;){if(I===null)throw Error(ee(160));switch(o=I.stateNode,I.tag){case 5:i=!1;break e;case 3:o=o.containerInfo,i=!0;break e;case 4:o=o.containerInfo,i=!0;break e}I=I.return}I=!0}if(n.tag===5||n.tag===6){e:for(var l=t,r=n,c=g,A=r;;)if(gB(l,A,c),A.child!==null&&A.tag!==4)A.child.return=A,A=A.child;else{if(A===r)break e;for(;A.sibling===null;){if(A.return===null||A.return===r)break e;A=A.return}A.sibling.return=A.return,A=A.sibling}i?(l=o,r=n.stateNode,l.nodeType===8?l.parentNode.removeChild(r):l.removeChild(r)):o.removeChild(n.stateNode)}else if(n.tag===18)i?(l=o,r=n.stateNode,l.nodeType===8?hu(l.parentNode,r):l.nodeType===1&&hu(l,r),Ml(l)):hu(o,n.stateNode);else if(n.tag===4){if(n.child!==null){o=n.stateNode.containerInfo,i=!0,n.child.return=n,n=n.child;continue}}else if(gB(t,n,g),n.child!==null){n.child.return=n,n=n.child;continue}if(n===e)break;for(;n.sibling===null;){if(n.return===null||n.return===e)return;n=n.return,n.tag===4&&(I=!1)}n.sibling.return=n.return,n=n.sibling}}function Zu(t,e){switch(e.tag){case 0:case 11:case 14:case 15:$l(3,e,e.return),GA(3,e),$l(5,e,e.return);return;case 1:return;case 5:var g=e.stateNode;if(g!=null){var n=e.memoizedProps,I=t!==null?t.memoizedProps:n;t=e.type;var o=e.updateQueue;if(e.updateQueue=null,o!==null){for(t==="input"&&n.type==="radio"&&n.name!=null&&OZ(g,n),pd(t,I),e=pd(t,n),I=0;I<o.length;I+=2){var i=o[I],l=o[I+1];i==="style"?ey(g,l):i==="dangerouslySetInnerHTML"?qZ(g,l):i==="children"?zl(g,l):Qh(g,i,l,e)}switch(t){case"input":dd(g,n);break;case"textarea":PZ(g,n);break;case"select":t=g._wrapperState.wasMultiple,g._wrapperState.wasMultiple=!!n.multiple,o=n.value,o!=null?Pi(g,!!n.multiple,o,!1):t!==!!n.multiple&&(n.defaultValue!=null?Pi(g,!!n.multiple,n.defaultValue,!0):Pi(g,!!n.multiple,n.multiple?[]:"",!1))}g[Dl]=n}}return;case 6:if(e.stateNode===null)throw Error(ee(162));e.stateNode.nodeValue=e.memoizedProps;return;case 3:t!==null&&t.memoizedState.isDehydrated&&Ml(e.stateNode.containerInfo);return;case 12:return;case 13:oB(e);return;case 19:oB(e);return;case 17:return}throw Error(ee(163))}function oB(t){var e=t.updateQueue;if(e!==null){t.updateQueue=null;var g=t.stateNode;g===null&&(g=t.stateNode=new YX),e.forEach(function(n){var I=MX.bind(null,t,n);g.has(n)||(g.add(n),n.then(I,I))})}}function SX(t,e){for(oe=e;oe!==null;){e=oe;var g=e.deletions;if(g!==null)for(var n=0;n<g.length;n++){var I=g[n];try{ff(t,I,e);var o=I.alternate;o!==null&&(o.return=null),I.return=null}catch(Y){Vg(I,e,Y)}}if(g=e.child,(e.subtreeFlags&12854)!==0&&g!==null)g.return=e,oe=g;else for(;oe!==null;){e=oe;try{var i=e.flags;if(i&32&&zl(e.stateNode,""),i&512){var l=e.alternate;if(l!==null){var r=l.ref;r!==null&&(typeof r=="function"?r(null):r.current=null)}}if(i&8192)switch(e.tag){case 13:if(e.memoizedState!==null){var c=e.alternate;(c===null||c.memoizedState===null)&&(Bb=Bt())}break;case 22:var A=e.memoizedState!==null,u=e.alternate,h=u!==null&&u.memoizedState!==null;g=e;e:{n=g,I=A;for(var b=null,p=n;;){if(p.tag===5){if(b===null){b=p;var Z=p.stateNode;if(I){var v=Z.style;typeof v.setProperty=="function"?v.setProperty("display","none","important"):v.display="none"}else{var y=p.stateNode,m=p.memoizedProps.style,B=m!=null&&m.hasOwnProperty("display")?m.display:null;y.style.display=$Z("display",B)}}}else if(p.tag===6)b===null&&(p.stateNode.nodeValue=I?"":p.memoizedProps);else if((p.tag!==22&&p.tag!==23||p.memoizedState===null||p===n)&&p.child!==null){p.child.return=p,p=p.child;continue}if(p===n)break;for(;p.sibling===null;){if(p.return===null||p.return===n)break e;b===p&&(b=null),p=p.return}b===p&&(b=null),p.sibling.return=p.return,p=p.sibling}}if(A&&!h&&(g.mode&1)!==0){oe=g;for(var w=g.child;w!==null;){for(g=oe=w;oe!==null;){n=oe;var X=n.child;switch(n.tag){case 0:case 11:case 14:case 15:$l(4,n,n.return);break;case 1:Ec(n,n.return);var R=n.stateNode;if(typeof R.componentWillUnmount=="function"){var S=n.return;try{R.props=n.memoizedProps,R.state=n.memoizedState,R.componentWillUnmount()}catch(Y){Vg(n,S,Y)}}break;case 5:Ec(n,n.return);break;case 22:if(n.memoizedState!==null){CB(g);continue}}X!==null?(X.return=n,oe=X):CB(g)}w=w.sibling}}}switch(i&4102){case 2:IB(e),e.flags&=-3;break;case 6:IB(e),e.flags&=-3,Zu(e.alternate,e);break;case 4096:e.flags&=-4097;break;case 4100:e.flags&=-4097,Zu(e.alternate,e);break;case 4:Zu(e.alternate,e)}}catch(Y){Vg(e,e.return,Y)}if(g=e.sibling,g!==null){g.return=e.return,oe=g;break}oe=e.return}}}function HX(t,e,g){oe=t,vf(t)}function vf(t,e,g){for(var n=(t.mode&1)!==0;oe!==null;){var I=oe,o=I.child;if(I.tag===22&&n){var i=I.memoizedState!==null||zr;if(!i){var l=I.alternate,r=l!==null&&l.memoizedState!==null||Mo;l=zr;var c=Mo;if(zr=i,(Mo=r)&&!c)for(oe=I;oe!==null;)i=oe,r=i.child,i.tag===22&&i.memoizedState!==null?lB(I):r!==null?(r.return=i,oe=r):lB(I);for(;o!==null;)oe=o,vf(o),o=o.sibling;oe=I,zr=l,Mo=c}iB(t)}else(I.subtreeFlags&8772)!==0&&o!==null?(o.return=I,oe=o):iB(t)}}function iB(t){for(;oe!==null;){var e=oe;if((e.flags&8772)!==0){var g=e.alternate;try{if((e.flags&8772)!==0)switch(e.tag){case 0:case 11:case 15:Mo||GA(5,e);break;case 1:var n=e.stateNode;if(e.flags&4&&!Mo)if(g===null)n.componentDidMount();else{var I=e.elementType===e.type?g.memoizedProps:pn(e.type,g.memoizedProps);n.componentDidUpdate(I,g.memoizedState,n.__reactInternalSnapshotBeforeUpdate)}var o=e.updateQueue;o!==null&&xp(e,o,n);break;case 3:var i=e.updateQueue;if(i!==null){if(g=null,e.child!==null)switch(e.child.tag){case 5:g=e.child.stateNode;break;case 1:g=e.child.stateNode}xp(e,i,g)}break;case 5:var l=e.stateNode;if(g===null&&e.flags&4){g=l;var r=e.memoizedProps;switch(e.type){case"button":case"input":case"select":case"textarea":r.autoFocus&&g.focus();break;case"img":r.src&&(g.src=r.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(e.memoizedState===null){var c=e.alternate;if(c!==null){var A=c.memoizedState;if(A!==null){var u=A.dehydrated;u!==null&&Ml(u)}}}break;case 19:case 17:case 21:case 22:case 23:break;default:throw Error(ee(163))}Mo||e.flags&512&&Ud(e)}catch(h){Vg(e,e.return,h)}}if(e===t){oe=null;break}if(g=e.sibling,g!==null){g.return=e.return,oe=g;break}oe=e.return}}function CB(t){for(;oe!==null;){var e=oe;if(e===t){oe=null;break}var g=e.sibling;if(g!==null){g.return=e.return,oe=g;break}oe=e.return}}function lB(t){for(;oe!==null;){var e=oe;try{switch(e.tag){case 0:case 11:case 15:var g=e.return;try{GA(4,e)}catch(r){Vg(e,g,r)}break;case 1:var n=e.stateNode;if(typeof n.componentDidMount=="function"){var I=e.return;try{n.componentDidMount()}catch(r){Vg(e,I,r)}}var o=e.return;try{Ud(e)}catch(r){Vg(e,o,r)}break;case 5:var i=e.return;try{Ud(e)}catch(r){Vg(e,i,r)}}}catch(r){Vg(e,e.return,r)}if(e===t){oe=null;break}var l=e.sibling;if(l!==null){l.return=e.return,oe=l;break}oe=e.return}}var NX=Math.ceil,Qc=wI.ReactCurrentDispatcher,mb=wI.ReactCurrentOwner,In=wI.ReactCurrentBatchConfig,Fe=0,wt=null,Wt=null,Lt=0,kg=0,ji=uo(0),Rt=0,es=null,AC=0,mA=0,pb=0,Rl=null,Wg=null,Bb=0,aC=1/0,Tc=!1,Od=null,Co=null,xr=!1,eo=null,Uc=0,Xl=0,Pd=null,dc=-1,hc=0;function sg(){return(Fe&6)!==0?Bt():dc!==-1?dc:dc=Bt()}function lo(t){return(t.mode&1)===0?1:(Fe&2)!==0&&Lt!==0?Lt&-Lt:GX.transition!==null?(hc===0&&(t=vr,vr<<=1,(vr&4194240)===0&&(vr=64),hc=t),hc):(t=Je,t!==0||(t=window.event,t=t===void 0?16:Gy(t.type)),t)}function on(t,e,g){if(50<Xl)throw Xl=0,Pd=null,Error(ee(185));var n=pA(t,e);return n===null?null:(rs(n,e,g),((Fe&2)===0||n!==wt)&&(n===wt&&((Fe&2)===0&&(mA|=e),Rt===4&&qI(n,Lt)),Kg(n,g),e===1&&Fe===0&&(t.mode&1)===0&&(aC=Bt()+500,dA&&ho())),n)}function pA(t,e){t.lanes|=e;var g=t.alternate;for(g!==null&&(g.lanes|=e),g=t,t=t.return;t!==null;)t.childLanes|=e,g=t.alternate,g!==null&&(g.childLanes|=e),g=t,t=t.return;return g.tag===3?g.stateNode:null}function Kg(t,e){var g=t.callbackNode;GR(t,e);var n=Rc(t,t===wt?Lt:0);if(n===0)g!==null&&dp(g),t.callbackNode=null,t.callbackPriority=0;else if(e=n&-n,t.callbackPriority!==e){if(g!=null&&dp(g),e===1)t.tag===0?bX(sB.bind(null,t)):ky(sB.bind(null,t)),aX(function(){Fe===0&&ho()}),g=null;else{switch(Ay(n)){case 1:g=Oh;break;case 4:g=ry;break;case 16:g=Vc;break;case 536870912:g=cy;break;default:g=Vc}g=Sf(g,Wf.bind(null,t))}t.callbackPriority=e,t.callbackNode=g}}function Wf(t,e){if(dc=-1,hc=0,(Fe&6)!==0)throw Error(ee(327));var g=t.callbackNode;if(tC()&&t.callbackNode!==g)return null;var n=Rc(t,t===wt?Lt:0);if(n===0)return null;if((n&30)!==0||(n&t.expiredLanes)!==0||e)e=Dc(t,n);else{e=n;var I=Fe;Fe|=2;var o=Vf();(wt!==t||Lt!==e)&&(aC=Bt()+500,Uo(t,e));do try{zX();break}catch(l){wf(t,l)}while(1);ob(),Qc.current=o,Fe=I,Wt!==null?e=0:(wt=null,Lt=0,e=Rt)}if(e!==0){if(e===2&&(I=vd(t),I!==0&&(n=I,e=_d(t,I))),e===1)throw g=es,Uo(t,0),qI(t,n),Kg(t,Bt()),g;if(e===6)qI(t,n);else{if(I=t.current.alternate,(n&30)===0&&!FX(I)&&(e=Dc(t,n),e===2&&(o=vd(t),o!==0&&(n=o,e=_d(t,o))),e===1))throw g=es,Uo(t,0),qI(t,n),Kg(t,Bt()),g;switch(t.finishedWork=I,t.finishedLanes=n,e){case 0:case 1:throw Error(ee(345));case 2:So(t,Wg);break;case 3:if(qI(t,n),(n&130023424)===n&&(e=Bb+500-Bt(),10<e)){if(Rc(t,0)!==0)break;if(I=t.suspendedLanes,(I&n)!==n){sg(),t.pingedLanes|=t.suspendedLanes&I;break}t.timeoutHandle=Kd(So.bind(null,t,Wg),e);break}So(t,Wg);break;case 4:if(qI(t,n),(n&4194240)===n)break;for(e=t.eventTimes,I=-1;0<n;){var i=31-vn(n);o=1<<i,i=e[i],i>I&&(I=i),n&=~o}if(n=I,n=Bt()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*NX(n/1960))-n,10<n){t.timeoutHandle=Kd(So.bind(null,t,Wg),n);break}So(t,Wg);break;case 5:So(t,Wg);break;default:throw Error(ee(329))}}}return Kg(t,Bt()),t.callbackNode===g?Wf.bind(null,t):null}function _d(t,e){var g=Rl;return t.current.memoizedState.isDehydrated&&(Uo(t,e).flags|=256),t=Dc(t,e),t!==2&&(e=Wg,Wg=g,e!==null&&qd(e)),t}function qd(t){Wg===null?Wg=t:Wg.push.apply(Wg,t)}function FX(t){for(var e=t;;){if(e.flags&16384){var g=e.updateQueue;if(g!==null&&(g=g.stores,g!==null))for(var n=0;n<g.length;n++){var I=g[n],o=I.getSnapshot;I=I.value;try{if(!On(o(),I))return!1}catch{return!1}}}if(g=e.child,e.subtreeFlags&16384&&g!==null)g.return=e,e=g;else{if(e===t)break;for(;e.sibling===null;){if(e.return===null||e.return===t)return!0;e=e.return}e.sibling.return=e.return,e=e.sibling}}return!0}function qI(t,e){for(e&=~pb,e&=~mA,t.suspendedLanes|=e,t.pingedLanes&=~e,t=t.expirationTimes;0<e;){var g=31-vn(e),n=1<<g;t[g]=-1,e&=~n}}function sB(t){if((Fe&6)!==0)throw Error(ee(327));tC();var e=Rc(t,0);if((e&1)===0)return Kg(t,Bt()),null;var g=Dc(t,e);if(t.tag!==0&&g===2){var n=vd(t);n!==0&&(e=n,g=_d(t,n))}if(g===1)throw g=es,Uo(t,0),qI(t,e),Kg(t,Bt()),g;if(g===6)throw Error(ee(345));return t.finishedWork=t.current.alternate,t.finishedLanes=e,So(t,Wg),Kg(t,Bt()),null}function Zb(t,e){var g=Fe;Fe|=1;try{return t(e)}finally{Fe=g,Fe===0&&(aC=Bt()+500,dA&&ho())}}function qo(t){eo!==null&&eo.tag===0&&(Fe&6)===0&&tC();var e=Fe;Fe|=1;var g=In.transition,n=Je;try{if(In.transition=null,Je=1,t)return t()}finally{Je=n,In.transition=g,Fe=e,(Fe&6)===0&&ho()}}function yb(){kg=ji.current,$e(ji)}function Uo(t,e){t.finishedWork=null,t.finishedLanes=0;var g=t.timeoutHandle;if(g!==-1&&(t.timeoutHandle=-1,AX(g)),Wt!==null)for(g=Wt.return;g!==null;){var n=g;switch(sb(n),n.tag){case 1:n=n.type.childContextTypes,n!=null&&Sc();break;case 3:rC(),$e(Xg),$e(tg),ab();break;case 5:Ab(n);break;case 4:rC();break;case 13:$e(rt);break;case 19:$e(rt);break;case 10:ib(n.type._context);break;case 22:case 23:yb()}g=g.return}if(wt=t,Wt=t=co(t.current,null),Lt=kg=e,Rt=0,es=null,pb=mA=AC=0,Wg=Rl=null,Un!==null){for(e=0;e<Un.length;e++)if(g=Un[e],n=g.interleaved,n!==null){g.interleaved=null;var I=n.next,o=g.pending;if(o!==null){var i=o.next;o.next=I,n.next=i}g.pending=n}Un=null}return t}function wf(t,e){do{var g=Wt;try{if(ob(),ac.current=Mc,Jc){for(var n=ut.memoizedState;n!==null;){var I=n.queue;I!==null&&(I.pending=null),n=n.next}Jc=!1}if(cC=0,Nt=$t=ut=null,Vl=!1,Pl=0,mb.current=null,g===null||g.return===null){Rt=1,es=e,Wt=null;break}e:{var o=t,i=g.return,l=g,r=e;if(e=Lt,l.flags|=32768,r!==null&&typeof r=="object"&&typeof r.then=="function"){var c=r,A=l,u=A.tag;if((A.mode&1)===0&&(u===0||u===11||u===15)){var h=A.alternate;h?(A.updateQueue=h.updateQueue,A.memoizedState=h.memoizedState,A.lanes=h.lanes):(A.updateQueue=null,A.memoizedState=null)}var b=Up(i);if(b!==null){b.flags&=-257,Dp(b,i,l,o,e),b.mode&1&&Tp(o,c,e),e=b,r=c;var p=e.updateQueue;if(p===null){var Z=new Set;Z.add(r),e.updateQueue=Z}else p.add(r);break e}else{if((e&1)===0){Tp(o,c,e),fb();break e}r=Error(ee(426))}}else if(It&&l.mode&1){var v=Up(i);if(v!==null){(v.flags&65536)===0&&(v.flags|=256),Dp(v,i,l,o,e),rb(r);break e}}o=r,Rt!==4&&(Rt=2),Rl===null?Rl=[o]:Rl.push(o),r=Gb(r,l),l=i;do{switch(l.tag){case 3:l.flags|=65536,e&=-e,l.lanes|=e;var y=cf(l,r,e);zp(l,y);break e;case 1:o=r;var m=l.type,B=l.stateNode;if((l.flags&128)===0&&(typeof m.getDerivedStateFromError=="function"||B!==null&&typeof B.componentDidCatch=="function"&&(Co===null||!Co.has(B)))){l.flags|=65536,e&=-e,l.lanes|=e;var w=Af(l,o,e);zp(l,w);break e}}l=l.return}while(l!==null)}Xf(g)}catch(X){e=X,Wt===g&&g!==null&&(Wt=g=g.return);continue}break}while(1)}function Vf(){var t=Qc.current;return Qc.current=Mc,t===null?Mc:t}function fb(){(Rt===0||Rt===3||Rt===2)&&(Rt=4),wt===null||(AC&268435455)===0&&(mA&268435455)===0||qI(wt,Lt)}function Dc(t,e){var g=Fe;Fe|=2;var n=Vf();wt===t&&Lt===e||Uo(t,e);do try{kX();break}catch(I){wf(t,I)}while(1);if(ob(),Fe=g,Qc.current=n,Wt!==null)throw Error(ee(261));return wt=null,Lt=0,Rt}function kX(){for(;Wt!==null;)Rf(Wt)}function zX(){for(;Wt!==null&&!sR();)Rf(Wt)}function Rf(t){var e=Kf(t.alternate,t,kg);t.memoizedProps=t.pendingProps,e===null?Xf(t):Wt=e,mb.current=null}function Xf(t){var e=t;do{var g=e.alternate;if(t=e.return,(e.flags&32768)===0){if(g=wX(g,e,kg),g!==null){Wt=g;return}}else{if(g=XX(g,e),g!==null){g.flags&=32767,Wt=g;return}if(t!==null)t.flags|=32768,t.subtreeFlags=0,t.deletions=null;else{Rt=6,Wt=null;return}}if(e=e.sibling,e!==null){Wt=e;return}Wt=e=t}while(e!==null);Rt===0&&(Rt=5)}function So(t,e){var g=Je,n=In.transition;try{In.transition=null,Je=1,xX(t,e,g)}finally{In.transition=n,Je=g}return null}function xX(t,e,g){do tC();while(eo!==null);if((Fe&6)!==0)throw Error(ee(327));var n=t.finishedWork,I=t.finishedLanes;if(n===null)return null;if(t.finishedWork=null,t.finishedLanes=0,n===t.current)throw Error(ee(177));t.callbackNode=null,t.callbackPriority=0;var o=n.lanes|n.childLanes;if(mR(t,o),t===wt&&(Wt=wt=null,Lt=0),(n.subtreeFlags&2064)===0&&(n.flags&2064)===0||xr||(xr=!0,Sf(Vc,function(){return tC(),null})),o=(n.flags&15990)!==0,(n.subtreeFlags&15990)!==0||o){o=In.transition,In.transition=null;var i=Je;Je=1;var l=Fe;Fe|=4,mb.current=null,KX(t,n),SX(t,n),oX(Xd),Xd=null,t.current=n,HX(n),rR(),Fe=l,Je=i,In.transition=o}else t.current=n;if(xr&&(xr=!1,eo=t,Uc=I),o=t.pendingLanes,o===0&&(Co=null),aR(n.stateNode),Kg(t,Bt()),e!==null)for(g=t.onRecoverableError,n=0;n<e.length;n++)g(e[n]);if(Tc)throw Tc=!1,t=Od,Od=null,t;return(Uc&1)!==0&&t.tag!==0&&tC(),o=t.pendingLanes,(o&1)!==0?t===Pd?Xl++:(Xl=0,Pd=t):Xl=0,ho(),null}function tC(){if(eo!==null){var t=Ay(Uc),e=In.transition,g=Je;try{if(In.transition=null,Je=16>t?16:t,eo===null)var n=!1;else{if(t=eo,eo=null,Uc=0,(Fe&6)!==0)throw Error(ee(331));var I=Fe;for(Fe|=4,oe=t.current;oe!==null;){var o=oe,i=o.child;if((oe.flags&16)!==0){var l=o.deletions;if(l!==null){for(var r=0;r<l.length;r++){var c=l[r];for(oe=c;oe!==null;){var A=oe;switch(A.tag){case 0:case 11:case 15:$l(8,A,o)}var u=A.child;if(u!==null)u.return=A,oe=u;else for(;oe!==null;){A=oe;var h=A.sibling,b=A.return;if(Zf(A),A===c){oe=null;break}if(h!==null){h.return=b,oe=h;break}oe=b}}}var p=o.alternate;if(p!==null){var Z=p.child;if(Z!==null){p.child=null;do{var v=Z.sibling;Z.sibling=null,Z=v}while(Z!==null)}}oe=o}}if((o.subtreeFlags&2064)!==0&&i!==null)i.return=o,oe=i;else e:for(;oe!==null;){if(o=oe,(o.flags&2048)!==0)switch(o.tag){case 0:case 11:case 15:$l(9,o,o.return)}var y=o.sibling;if(y!==null){y.return=o.return,oe=y;break e}oe=o.return}}var m=t.current;for(oe=m;oe!==null;){i=oe;var B=i.child;if((i.subtreeFlags&2064)!==0&&B!==null)B.return=i,oe=B;else e:for(i=m;oe!==null;){if(l=oe,(l.flags&2048)!==0)try{switch(l.tag){case 0:case 11:case 15:GA(9,l)}}catch(X){Vg(l,l.return,X)}if(l===i){oe=null;break e}var w=l.sibling;if(w!==null){w.return=l.return,oe=w;break e}oe=l.return}}if(Fe=I,ho(),Dn&&typeof Dn.onPostCommitFiberRoot=="function")try{Dn.onPostCommitFiberRoot(rA,t)}catch{}n=!0}return n}finally{Je=g,In.transition=e}}return!1}function rB(t,e,g){e=Gb(g,e),e=cf(t,e,1),io(t,e),e=sg(),t=pA(t,1),t!==null&&(rs(t,1,e),Kg(t,e))}function Vg(t,e,g){if(t.tag===3)rB(t,t,g);else for(;e!==null;){if(e.tag===3){rB(e,t,g);break}else if(e.tag===1){var n=e.stateNode;if(typeof e.type.getDerivedStateFromError=="function"||typeof n.componentDidCatch=="function"&&(Co===null||!Co.has(n))){t=Gb(g,t),t=Af(e,t,1),io(e,t),t=sg(),e=pA(e,1),e!==null&&(rs(e,1,t),Kg(e,t));break}}e=e.return}}function LX(t,e,g){var n=t.pingCache;n!==null&&n.delete(e),e=sg(),t.pingedLanes|=t.suspendedLanes&g,wt===t&&(Lt&g)===g&&(Rt===4||Rt===3&&(Lt&130023424)===Lt&&500>Bt()-Bb?Uo(t,0):pb|=g),Kg(t,e)}function Yf(t,e){e===0&&((t.mode&1)===0?e=1:(e=Wr,Wr<<=1,(Wr&130023424)===0&&(Wr=4194304)));var g=sg();t=pA(t,e),t!==null&&(rs(t,e,g),Kg(t,g))}function JX(t){var e=t.memoizedState,g=0;e!==null&&(g=e.retryLane),Yf(t,g)}function MX(t,e){var g=0;switch(t.tag){case 13:var n=t.stateNode,I=t.memoizedState;I!==null&&(g=I.retryLane);break;case 19:n=t.stateNode;break;default:throw Error(ee(314))}n!==null&&n.delete(e),Yf(t,g)}var Kf;Kf=function(t,e,g){if(t!==null)if(t.memoizedProps!==e.pendingProps||Xg.current)zg=!0;else{if((t.lanes&g)===0&&(e.flags&128)===0)return zg=!1,RX(t,e,g);zg=(t.flags&131072)!==0}else zg=!1,It&&(e.flags&1048576)!==0&&Jy(e,xc,e.index);switch(e.lanes=0,e.tag){case 2:var n=e.type;t!==null&&(t.alternate=null,e.alternate=null,e.flags|=2),t=e.pendingProps;var I=CC(e,tg.current);eC(e,g),I=db(null,e,n,t,I,g);var o=hb();return e.flags|=1,typeof I=="object"&&I!==null&&typeof I.render=="function"&&I.$$typeof===void 0?(e.tag=1,e.memoizedState=null,e.updateQueue=null,Yg(n)?(o=!0,Hc(e)):o=!1,e.memoizedState=I.state!==null&&I.state!==void 0?I.state:null,Cb(e),I.updater=hA,e.stateNode=I,I._reactInternals=e,kd(e,n,t,g),e=Ed(null,e,n,!0,o,g)):(e.tag=0,It&&o&&lb(e),ig(null,e,I,g),e=e.child),e;case 16:n=e.elementType;e:{switch(t!==null&&(t.alternate=null,e.alternate=null,e.flags|=2),t=e.pendingProps,I=n._init,n=I(n._payload),e.type=n,I=e.tag=QX(n),t=pn(n,t),I){case 0:e=Md(null,e,n,t,g);break e;case 1:e=Pp(null,e,n,t,g);break e;case 11:e=jp(null,e,n,t,g);break e;case 14:e=Op(null,e,n,pn(n.type,t),g);break e}throw Error(ee(306,n,""))}return e;case 0:return n=e.type,I=e.pendingProps,I=e.elementType===n?I:pn(n,I),Md(t,e,n,I,g);case 1:return n=e.type,I=e.pendingProps,I=e.elementType===n?I:pn(n,I),Pp(t,e,n,I,g);case 3:e:{if(mf(e),t===null)throw Error(ee(387));n=e.pendingProps,o=e.memoizedState,I=o.element,zy(t,e),kc(e,n,null,g);var i=e.memoizedState;if(n=i.element,o.isDehydrated)if(o={element:n,isDehydrated:!1,cache:i.cache,transitions:i.transitions},e.updateQueue.baseState=o,e.memoizedState=o,e.flags&256){I=Error(ee(423)),e=_p(t,e,n,g,I);break e}else if(n!==I){I=Error(ee(424)),e=_p(t,e,n,g,I);break e}else for(wg=hI(e.stateNode.containerInfo.firstChild),xg=e,It=!0,Zn=null,g=Qy(e,null,n,g),e.child=g;g;)g.flags=g.flags&-3|4096,g=g.sibling;else{if(lC(),n===I){e=vI(t,e,g);break e}ig(t,e,n,g)}e=e.child}return e;case 5:return Ty(e),t===null&&xd(e),n=e.type,I=e.pendingProps,o=t!==null?t.memoizedProps:null,i=I.children,Yd(n,I)?i=null:o!==null&&Yd(n,o)&&(e.flags|=32),Gf(t,e),ig(t,e,i,g),e.child;case 6:return t===null&&xd(e),null;case 13:return pf(t,e,g);case 4:return cb(e,e.stateNode.containerInfo),n=e.pendingProps,t===null?e.child=sC(e,null,n,g):ig(t,e,n,g),e.child;case 11:return n=e.type,I=e.pendingProps,I=e.elementType===n?I:pn(n,I),jp(t,e,n,I,g);case 7:return ig(t,e,e.pendingProps,g),e.child;case 8:return ig(t,e,e.pendingProps.children,g),e.child;case 12:return ig(t,e,e.pendingProps.children,g),e.child;case 10:e:{if(n=e.type._context,I=e.pendingProps,o=e.memoizedProps,i=I.value,Pe(Nc,n._currentValue),n._currentValue=i,o!==null)if(On(o.value,i)){if(o.children===I.children&&!Xg.current){e=vI(t,e,g);break e}}else for(o=e.child,o!==null&&(o.return=e);o!==null;){var l=o.dependencies;if(l!==null){i=o.child;for(var r=l.firstContext;r!==null;){if(r.context===n){if(o.tag===1){r=pI(-1,g&-g),r.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var A=c.pending;A===null?r.next=r:(r.next=A.next,A.next=r),c.pending=r}}o.lanes|=g,r=o.alternate,r!==null&&(r.lanes|=g),Nd(o.return,g,e),l.lanes|=g;break}r=r.next}}else if(o.tag===10)i=o.type===e.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(ee(341));i.lanes|=g,l=i.alternate,l!==null&&(l.lanes|=g),Nd(i,g,e),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===e){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}ig(t,e,I.children,g),e=e.child}return e;case 9:return I=e.type,n=e.pendingProps.children,eC(e,g),I=ln(I),n=n(I),e.flags|=1,ig(t,e,n,g),e.child;case 14:return n=e.type,I=pn(n,e.pendingProps),I=pn(n.type,I),Op(t,e,n,I,g);case 15:return hf(t,e,e.type,e.pendingProps,g);case 17:return n=e.type,I=e.pendingProps,I=e.elementType===n?I:pn(n,I),t!==null&&(t.alternate=null,e.alternate=null,e.flags|=2),e.tag=1,Yg(n)?(t=!0,Hc(e)):t=!1,eC(e,g),Ly(e,n,I),kd(e,n,I,g),Ed(null,e,n,!0,t,g);case 19:return Bf(t,e,g);case 22:return bf(t,e,g)}throw Error(ee(156,e.tag))};function Sf(t,e){return sy(t,e)}function EX(t,e,g,n){this.tag=t,this.key=g,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=e,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function tn(t,e,g,n){return new EX(t,e,g,n)}function vb(t){return t=t.prototype,!(!t||!t.isReactComponent)}function QX(t){if(typeof t=="function")return vb(t)?1:0;if(t!=null){if(t=t.$$typeof,t===Uh)return 11;if(t===Dh)return 14}return 2}function co(t,e){var g=t.alternate;return g===null?(g=tn(t.tag,e,t.key,t.mode),g.elementType=t.elementType,g.type=t.type,g.stateNode=t.stateNode,g.alternate=t,t.alternate=g):(g.pendingProps=e,g.type=t.type,g.flags=0,g.subtreeFlags=0,g.deletions=null),g.flags=t.flags&14680064,g.childLanes=t.childLanes,g.lanes=t.lanes,g.child=t.child,g.memoizedProps=t.memoizedProps,g.memoizedState=t.memoizedState,g.updateQueue=t.updateQueue,e=t.dependencies,g.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext},g.sibling=t.sibling,g.index=t.index,g.ref=t.ref,g}function bc(t,e,g,n,I,o){var i=2;if(n=t,typeof t=="function")vb(t)&&(i=1);else if(typeof t=="string")i=5;else e:switch(t){case xi:return Do(g.children,I,o,e);case Th:i=8,I|=8;break;case rd:return t=tn(12,g,e,I|2),t.elementType=rd,t.lanes=o,t;case cd:return t=tn(13,g,e,I),t.elementType=cd,t.lanes=o,t;case Ad:return t=tn(19,g,e,I),t.elementType=Ad,t.lanes=o,t;case UZ:return jc(g,I,o,e);default:if(typeof t=="object"&&t!==null)switch(t.$$typeof){case QZ:i=10;break e;case TZ:i=9;break e;case Uh:i=11;break e;case Dh:i=14;break e;case OI:i=16,n=null;break e}throw Error(ee(130,t==null?t:typeof t,""))}return e=tn(i,g,e,I),e.elementType=t,e.type=n,e.lanes=o,e}function Do(t,e,g,n){return t=tn(7,t,n,e),t.lanes=g,t}function jc(t,e,g,n){return t=tn(22,t,n,e),t.elementType=UZ,t.lanes=g,t.stateNode={},t}function yu(t,e,g){return t=tn(6,t,null,e),t.lanes=g,t}function fu(t,e,g){return e=tn(4,t.children!==null?t.children:[],t.key,e),e.lanes=g,e.stateNode={containerInfo:t.containerInfo,pendingChildren:null,implementation:t.implementation},e}function TX(t,e,g,n,I){this.tag=e,this.containerInfo=t,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ou(0),this.expirationTimes=ou(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ou(0),this.identifierPrefix=n,this.onRecoverableError=I,this.mutableSourceEagerHydrationData=null}function Wb(t,e,g,n,I,o,i,l,r){return t=new TX(t,e,g,l,r),e===1?(e=1,o===!0&&(e|=8)):e=0,o=tn(3,null,null,e),t.current=o,o.stateNode=t,o.memoizedState={element:n,isDehydrated:g,cache:null,transitions:null},Cb(o),t}function UX(t,e,g){var n=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:zi,key:n==null?null:""+n,children:t,containerInfo:e,implementation:g}}function Hf(t){if(!t)return ro;t=t._reactInternals;e:{if(ni(t)!==t||t.tag!==1)throw Error(ee(170));var e=t;do{switch(e.tag){case 3:e=e.stateNode.context;break e;case 1:if(Yg(e.type)){e=e.stateNode.__reactInternalMemoizedMergedChildContext;break e}}e=e.return}while(e!==null);throw Error(ee(171))}if(t.tag===1){var g=t.type;if(Yg(g))return Fy(t,g,e)}return e}function Nf(t,e,g,n,I,o,i,l,r){return t=Wb(g,n,!0,t,I,o,i,l,r),t.context=Hf(null),g=t.current,n=sg(),I=lo(g),o=pI(n,I),o.callback=e!=null?e:null,io(g,o),t.current.lanes=I,rs(t,I,n),Kg(t,n),t}function BA(t,e,g,n){var I=e.current,o=sg(),i=lo(I);return g=Hf(g),e.context===null?e.context=g:e.pendingContext=g,e=pI(o,i),e.payload={element:t},n=n===void 0?null:n,n!==null&&(e.callback=n),io(I,e),t=on(I,i,o),t!==null&&Ac(t,I,i),i}function Oc(t){if(t=t.current,!t.child)return null;switch(t.child.tag){case 5:return t.child.stateNode;default:return t.child.stateNode}}function cB(t,e){if(t=t.memoizedState,t!==null&&t.dehydrated!==null){var g=t.retryLane;t.retryLane=g!==0&&g<e?g:e}}function wb(t,e){cB(t,e),(t=t.alternate)&&cB(t,e)}function DX(){return null}var Ff=typeof reportError=="function"?reportError:function(t){console.error(t)};function Vb(t){this._internalRoot=t}ZA.prototype.render=Vb.prototype.render=function(t){var e=this._internalRoot;if(e===null)throw Error(ee(409));BA(t,e,null,null)};ZA.prototype.unmount=Vb.prototype.unmount=function(){var t=this._internalRoot;if(t!==null){this._internalRoot=null;var e=t.containerInfo;qo(function(){BA(null,t,null,null)}),e[fI]=null}};function ZA(t){this._internalRoot=t}ZA.prototype.unstable_scheduleHydration=function(t){if(t){var e=dy();t={blockedOn:null,target:t,priority:e};for(var g=0;g<_I.length&&e!==0&&e<_I[g].priority;g++);_I.splice(g,0,t),g===0&&by(t)}};function Rb(t){return!(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)}function yA(t){return!(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11&&(t.nodeType!==8||t.nodeValue!==" react-mount-point-unstable "))}function AB(){}function jX(t,e,g,n,I){if(I){if(typeof n=="function"){var o=n;n=function(){var c=Oc(i);o.call(c)}}var i=Nf(e,n,t,0,null,!1,!1,"",AB);return t._reactRootContainer=i,t[fI]=i.current,Tl(t.nodeType===8?t.parentNode:t),qo(),i}for(;I=t.lastChild;)t.removeChild(I);if(typeof n=="function"){var l=n;n=function(){var c=Oc(r);l.call(c)}}var r=Wb(t,0,!1,null,null,!1,!1,"",AB);return t._reactRootContainer=r,t[fI]=r.current,Tl(t.nodeType===8?t.parentNode:t),qo(function(){BA(e,r,g,n)}),r}function fA(t,e,g,n,I){var o=g._reactRootContainer;if(o){var i=o;if(typeof I=="function"){var l=I;I=function(){var r=Oc(i);l.call(r)}}BA(e,i,t,I)}else i=jX(g,e,t,I,n);return Oc(i)}ay=function(t){switch(t.tag){case 3:var e=t.stateNode;if(e.current.memoizedState.isDehydrated){var g=Gl(e.pendingLanes);g!==0&&(Ph(e,g|1),Kg(e,Bt()),(Fe&6)===0&&(aC=Bt()+500,ho()))}break;case 13:var n=sg();qo(function(){return on(t,1,n)}),wb(t,1)}};_h=function(t){if(t.tag===13){var e=sg();on(t,134217728,e),wb(t,134217728)}};uy=function(t){if(t.tag===13){var e=sg(),g=lo(t);on(t,g,e),wb(t,g)}};dy=function(){return Je};hy=function(t,e){var g=Je;try{return Je=t,e()}finally{Je=g}};Zd=function(t,e,g){switch(e){case"input":if(dd(t,g),e=g.name,g.type==="radio"&&e!=null){for(g=t;g.parentNode;)g=g.parentNode;for(g=g.querySelectorAll("input[name="+JSON.stringify(""+e)+'][type="radio"]'),e=0;e<g.length;e++){var n=g[e];if(n!==t&&n.form===t.form){var I=uA(n);if(!I)throw Error(ee(90));jZ(n),dd(n,I)}}}break;case"textarea":PZ(t,g);break;case"select":e=g.value,e!=null&&Pi(t,!!g.multiple,e,!1)}};ny=Zb;Iy=qo;var OX={usingClientEntryPoint:!1,Events:[As,Ei,uA,ty,gy,Zb]},tl={findFiberByHostInstance:Lo,bundleType:0,version:"18.0.0-fc46dba67-20220329",rendererPackageName:"react-dom"},PX={bundleType:tl.bundleType,version:tl.version,rendererPackageName:tl.rendererPackageName,rendererConfig:tl.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:wI.ReactCurrentDispatcher,findHostInstanceByFiber:function(t){return t=Cy(t),t===null?null:t.stateNode},findFiberByHostInstance:tl.findFiberByHostInstance||DX,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.0.0-fc46dba67-20220329"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__!="undefined"){var Lr=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Lr.isDisabled&&Lr.supportsFiber)try{rA=Lr.inject(PX),Dn=Lr}catch{}}Jg.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=OX;Jg.createPortal=function(t,e){var g=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!Rb(e))throw Error(ee(200));return UX(t,e,null,g)};Jg.createRoot=function(t,e){if(!Rb(t))throw Error(ee(299));var g=!1,n="",I=Ff;return e!=null&&(e.unstable_strictMode===!0&&(g=!0),e.identifierPrefix!==void 0&&(n=e.identifierPrefix),e.onRecoverableError!==void 0&&(I=e.onRecoverableError)),e=Wb(t,1,!1,null,null,g,!1,n,I),t[fI]=e.current,Tl(t.nodeType===8?t.parentNode:t),new Vb(e)};Jg.findDOMNode=function(t){if(t==null)return null;if(t.nodeType===1)return t;var e=t._reactInternals;if(e===void 0)throw typeof t.render=="function"?Error(ee(188)):(t=Object.keys(t).join(","),Error(ee(268,t)));return t=Cy(e),t=t===null?null:t.stateNode,t};Jg.flushSync=function(t){return qo(t)};Jg.hydrate=function(t,e,g){if(!yA(e))throw Error(ee(200));return fA(null,t,e,!0,g)};Jg.hydrateRoot=function(t,e,g){if(!Rb(t))throw Error(ee(405));var n=g!=null&&g.hydratedSources||null,I=!1,o="",i=Ff;if(g!=null&&(g.unstable_strictMode===!0&&(I=!0),g.identifierPrefix!==void 0&&(o=g.identifierPrefix),g.onRecoverableError!==void 0&&(i=g.onRecoverableError)),e=Nf(e,null,t,1,g!=null?g:null,I,!1,o,i),t[fI]=e.current,Tl(t),n)for(t=0;t<n.length;t++)g=n[t],I=g._getVersion,I=I(g._source),e.mutableSourceEagerHydrationData==null?e.mutableSourceEagerHydrationData=[g,I]:e.mutableSourceEagerHydrationData.push(g,I);return new ZA(e)};Jg.render=function(t,e,g){if(!yA(e))throw Error(ee(200));return fA(null,t,e,!1,g)};Jg.unmountComponentAtNode=function(t){if(!yA(t))throw Error(ee(40));return t._reactRootContainer?(qo(function(){fA(null,null,t,!1,function(){t._reactRootContainer=null,t[fI]=null})}),!0):!1};Jg.unstable_batchedUpdates=Zb;Jg.unstable_renderSubtreeIntoContainer=function(t,e,g,n){if(!yA(g))throw Error(ee(200));if(t==null||t._reactInternals===void 0)throw Error(ee(38));return fA(t,e,g,!1,n)};Jg.version="18.0.0-fc46dba67-20220329";function kf(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__=="undefined"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(kf)}catch(t){console.error(t)}}kf(),kh.exports=Jg;var Xb=kh.exports,_X,qX=kh.exports;_X=qX.createRoot;function Le(){return Le=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var g=arguments[e];for(var n in g)Object.prototype.hasOwnProperty.call(g,n)&&(t[n]=g[n])}return t},Le.apply(this,arguments)}var gC={exports:{}},Ii={};/**
|
|
33
|
+
* @license React
|
|
34
|
+
* react-reconciler-constants.production.min.js
|
|
35
|
+
*
|
|
36
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
37
|
+
*
|
|
38
|
+
* This source code is licensed under the MIT license found in the
|
|
39
|
+
* LICENSE file in the root directory of this source tree.
|
|
40
|
+
*/Ii.ConcurrentRoot=1;Ii.ContinuousEventPriority=4;Ii.DefaultEventPriority=16;Ii.DiscreteEventPriority=1;Ii.IdleEventPriority=536870912;Ii.LegacyRoot=0;gC.exports=Ii;function $X(t){let e;const g=new Set,n=(c,A)=>{const u=typeof c=="function"?c(e):c;if(u!==e){const h=e;e=A?u:Object.assign({},e,u),g.forEach(b=>b(e,h))}},I=()=>e,o=(c,A=I,u=Object.is)=>{console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");let h=A(e);function b(){const p=A(e);if(!u(h,p)){const Z=h;c(h=p,Z)}}return g.add(b),()=>g.delete(b)},r={setState:n,getState:I,subscribe:(c,A,u)=>A||u?o(c,A,u):(g.add(c),()=>g.delete(c)),destroy:()=>g.clear()};return e=t(n,I,r),r}const eY=typeof window=="undefined"||!window.navigator||/ServerSideRendering|^Deno\//.test(window.navigator.userAgent),aB=eY?W.exports.useEffect:W.exports.useLayoutEffect;function vA(t){const e=typeof t=="function"?$X(t):t,g=(n=e.getState,I=Object.is)=>{const[,o]=W.exports.useReducer(v=>v+1,0),i=e.getState(),l=W.exports.useRef(i),r=W.exports.useRef(n),c=W.exports.useRef(I),A=W.exports.useRef(!1),u=W.exports.useRef();u.current===void 0&&(u.current=n(i));let h,b=!1;(l.current!==i||r.current!==n||c.current!==I||A.current)&&(h=n(i),b=!I(u.current,h)),aB(()=>{b&&(u.current=h),l.current=i,r.current=n,c.current=I,A.current=!1});const p=W.exports.useRef(i);aB(()=>{const v=()=>{try{const m=e.getState(),B=r.current(m);c.current(u.current,B)||(l.current=m,u.current=B,o())}catch{A.current=!0,o()}},y=e.subscribe(v);return e.getState()!==p.current&&v(),y},[]);const Z=b?h:u.current;return W.exports.useDebugValue(Z),Z};return Object.assign(g,e),g[Symbol.iterator]=function(){console.warn("[useStore, api] = create() is deprecated and will be removed in v4");const n=[g,e];return{next(){const I=n.length<=0;return{value:n.shift(),done:I}}}},g}var zf={exports:{}};/**
|
|
41
|
+
* @license React
|
|
42
|
+
* react-reconciler.production.min.js
|
|
43
|
+
*
|
|
44
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
45
|
+
*
|
|
46
|
+
* This source code is licensed under the MIT license found in the
|
|
47
|
+
* LICENSE file in the root directory of this source tree.
|
|
48
|
+
*/var tY=function(e){var g={},n=W.exports,I=Fl.exports,o=Object.assign;function i(C){for(var s="https://reactjs.org/docs/error-decoder.html?invariant="+C,a=1;a<arguments.length;a++)s+="&args[]="+encodeURIComponent(arguments[a]);return"Minified React error #"+C+"; visit "+s+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var l=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,r=Symbol.for("react.element"),c=Symbol.for("react.portal"),A=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),h=Symbol.for("react.profiler"),b=Symbol.for("react.provider"),p=Symbol.for("react.context"),Z=Symbol.for("react.forward_ref"),v=Symbol.for("react.suspense"),y=Symbol.for("react.suspense_list"),m=Symbol.for("react.memo"),B=Symbol.for("react.lazy"),w=Symbol.for("react.offscreen"),X=Symbol.iterator;function R(C){return C===null||typeof C!="object"?null:(C=X&&C[X]||C["@@iterator"],typeof C=="function"?C:null)}function S(C){if(C==null)return null;if(typeof C=="function")return C.displayName||C.name||null;if(typeof C=="string")return C;switch(C){case A:return"Fragment";case c:return"Portal";case h:return"Profiler";case u:return"StrictMode";case v:return"Suspense";case y:return"SuspenseList"}if(typeof C=="object")switch(C.$$typeof){case p:return(C.displayName||"Context")+".Consumer";case b:return(C._context.displayName||"Context")+".Provider";case Z:var s=C.render;return C=C.displayName,C||(C=s.displayName||s.name||"",C=C!==""?"ForwardRef("+C+")":"ForwardRef"),C;case m:return s=C.displayName||null,s!==null?s:S(C.type)||"Memo";case B:s=C._payload,C=C._init;try{return S(C(s))}catch{}}return null}function Y(C){var s=C.type;switch(C.tag){case 24:return"Cache";case 9:return(s.displayName||"Context")+".Consumer";case 10:return(s._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return C=s.render,C=C.displayName||C.name||"",s.displayName||(C!==""?"ForwardRef("+C+")":"ForwardRef");case 7:return"Fragment";case 5:return s;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return S(s);case 8:return s===u?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof s=="function")return s.displayName||s.name||null;if(typeof s=="string")return s}return null}function k(C){var s=C,a=C;if(C.alternate)for(;s.return;)s=s.return;else{C=s;do s=C,(s.flags&4098)!==0&&(a=s.return),C=s.return;while(C)}return s.tag===3?a:null}function N(C){if(k(C)!==C)throw Error(i(188))}function z(C){var s=C.alternate;if(!s){if(s=k(C),s===null)throw Error(i(188));return s!==C?null:C}for(var a=C,d=s;;){var G=a.return;if(G===null)break;var f=G.alternate;if(f===null){if(d=G.return,d!==null){a=d;continue}break}if(G.child===f.child){for(f=G.child;f;){if(f===a)return N(G),C;if(f===d)return N(G),s;f=f.sibling}throw Error(i(188))}if(a.return!==d.return)a=G,d=f;else{for(var H=!1,x=G.child;x;){if(x===a){H=!0,a=G,d=f;break}if(x===d){H=!0,d=G,a=f;break}x=x.sibling}if(!H){for(x=f.child;x;){if(x===a){H=!0,a=f,d=G;break}if(x===d){H=!0,d=f,a=G;break}x=x.sibling}if(!H)throw Error(i(189))}}if(a.alternate!==d)throw Error(i(190))}if(a.tag!==3)throw Error(i(188));return a.stateNode.current===a?C:s}function M(C){return C=z(C),C!==null?j(C):null}function j(C){if(C.tag===5||C.tag===6)return C;for(C=C.child;C!==null;){var s=j(C);if(s!==null)return s;C=C.sibling}return null}function F(C){if(C.tag===5||C.tag===6)return C;for(C=C.child;C!==null;){if(C.tag!==4){var s=F(C);if(s!==null)return s}C=C.sibling}return null}var L=Array.isArray,P=e.getPublicInstance,$=e.getRootHostContext,T=e.getChildHostContext,q=e.prepareForCommit,ge=e.resetAfterCommit,se=e.createInstance,ue=e.appendInitialChild,Ye=e.finalizeInitialChildren,Te=e.prepareUpdate,et=e.shouldSetTextContent,yt=e.createTextInstance,dt=e.scheduleTimeout,ag=e.cancelTimeout,$n=e.noTimeout,eI=e.isPrimaryRenderer,Mt=e.supportsMutation,Vn=e.supportsPersistence,ot=e.supportsHydration,RI=e.getInstanceFromNode,XI=e.preparePortalMount,YI=e.getCurrentEventPriority,Ci=e.detachDeletedInstance,bo=e.supportsMicrotasks,Go=e.scheduleMicrotask,cn=e.supportsTestSelectors,li=e.findFiberRoot,vC=e.getBoundingRect,le=e.getTextContent,me=e.isHiddenSubtree,ht=e.matchAccessibilityRole,Yt=e.setFocusIfFocusable,Et=e.setupIntersectionObserver,tI=e.appendChild,An=e.appendChildToContainer,KI=e.commitTextUpdate,gI=e.commitMount,E=e.commitUpdate,ne=e.insertBefore,Be=e.insertInContainerBefore,Ke=e.removeChild,it=e.removeChildFromContainer,kt=e.resetTextContent,SI=e.hideInstance,ys=e.hideTextInstance,an=e.unhideInstance,un=e.unhideTextInstance,ZW=e.clearContainer,yW=e.cloneInstance,CG=e.createContainerChildSet,lG=e.appendChildToContainerChildSet,fW=e.finalizeContainerChildren,sG=e.replaceContainerChildren,rG=e.cloneHiddenInstance,cG=e.cloneHiddenTextInstance,vW=e.canHydrateInstance,WW=e.canHydrateTextInstance,wW=e.canHydrateSuspenseInstance,AG=e.isSuspenseInstancePending,JA=e.isSuspenseInstanceFallback,VW=e.registerSuspenseInstanceRetry,WC=e.getNextHydratableSibling,RW=e.getFirstHydratableChild,XW=e.getFirstHydratableChildWithinContainer,YW=e.getFirstHydratableChildWithinSuspenseInstance,KW=e.hydrateInstance,SW=e.hydrateTextInstance,HW=e.hydrateSuspenseInstance,NW=e.getNextHydratableInstanceAfterSuspenseInstance,aG=e.commitHydratedContainer,FW=e.commitHydratedSuspenseInstance,kW=e.clearSuspenseBoundary,zW=e.clearSuspenseBoundaryFromContainer,xW=e.shouldDeleteUnhydratedTailInstances,LW=e.didNotMatchHydratedContainerTextInstance,JW=e.didNotMatchHydratedTextInstance,MA;function wC(C){if(MA===void 0)try{throw Error()}catch(a){var s=a.stack.trim().match(/\n( *(at )?)/);MA=s&&s[1]||""}return`
|
|
49
|
+
`+MA+C}var EA=!1;function QA(C,s){if(!C||EA)return"";EA=!0;var a=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(s)if(s=function(){throw Error()},Object.defineProperty(s.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(s,[])}catch(te){var d=te}Reflect.construct(C,[],s)}else{try{s.call()}catch(te){d=te}C.call(s.prototype)}else{try{throw Error()}catch(te){d=te}C()}}catch(te){if(te&&d&&typeof te.stack=="string"){for(var G=te.stack.split(`
|
|
50
|
+
`),f=d.stack.split(`
|
|
51
|
+
`),H=G.length-1,x=f.length-1;1<=H&&0<=x&&G[H]!==f[x];)x--;for(;1<=H&&0<=x;H--,x--)if(G[H]!==f[x]){if(H!==1||x!==1)do if(H--,x--,0>x||G[H]!==f[x]){var O=`
|
|
52
|
+
`+G[H].replace(" at new "," at ");return C.displayName&&O.includes("<anonymous>")&&(O=O.replace("<anonymous>",C.displayName)),O}while(1<=H&&0<=x);break}}}finally{EA=!1,Error.prepareStackTrace=a}return(C=C?C.displayName||C.name:"")?wC(C):""}var MW=Object.prototype.hasOwnProperty,TA=[],si=-1;function HI(C){return{current:C}}function _e(C){0>si||(C.current=TA[si],TA[si]=null,si--)}function De(C,s){si++,TA[si]=C.current,C.current=s}var NI={},Qt=HI(NI),ug=HI(!1),mo=NI;function ri(C,s){var a=C.type.contextTypes;if(!a)return NI;var d=C.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===s)return d.__reactInternalMemoizedMaskedChildContext;var G={},f;for(f in a)G[f]=s[f];return d&&(C=C.stateNode,C.__reactInternalMemoizedUnmaskedChildContext=s,C.__reactInternalMemoizedMaskedChildContext=G),G}function dg(C){return C=C.childContextTypes,C!=null}function fs(){_e(ug),_e(Qt)}function uG(C,s,a){if(Qt.current!==NI)throw Error(i(168));De(Qt,s),De(ug,a)}function dG(C,s,a){var d=C.stateNode;if(s=s.childContextTypes,typeof d.getChildContext!="function")return a;d=d.getChildContext();for(var G in d)if(!(G in s))throw Error(i(108,Y(C)||"Unknown",G));return o({},a,d)}function vs(C){return C=(C=C.stateNode)&&C.__reactInternalMemoizedMergedChildContext||NI,mo=Qt.current,De(Qt,C),De(ug,ug.current),!0}function hG(C,s,a){var d=C.stateNode;if(!d)throw Error(i(169));a?(C=dG(C,s,mo),d.__reactInternalMemoizedMergedChildContext=C,_e(ug),_e(Qt),De(Qt,C)):_e(ug),De(ug,a)}var dn=Math.clz32?Math.clz32:TW,EW=Math.log,QW=Math.LN2;function TW(C){return C>>>=0,C===0?32:31-(EW(C)/QW|0)|0}var Ws=64,ws=4194304;function VC(C){switch(C&-C){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return C&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return C&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return C}}function Vs(C,s){var a=C.pendingLanes;if(a===0)return 0;var d=0,G=C.suspendedLanes,f=C.pingedLanes,H=a&268435455;if(H!==0){var x=H&~G;x!==0?d=VC(x):(f&=H,f!==0&&(d=VC(f)))}else H=a&~G,H!==0?d=VC(H):f!==0&&(d=VC(f));if(d===0)return 0;if(s!==0&&s!==d&&(s&G)===0&&(G=d&-d,f=s&-s,G>=f||G===16&&(f&4194240)!==0))return s;if((d&4)!==0&&(d|=a&16),s=C.entangledLanes,s!==0)for(C=C.entanglements,s&=d;0<s;)a=31-dn(s),G=1<<a,d|=C[a],s&=~G;return d}function UW(C,s){switch(C){case 1:case 2:case 4:return s+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return s+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function DW(C,s){for(var a=C.suspendedLanes,d=C.pingedLanes,G=C.expirationTimes,f=C.pendingLanes;0<f;){var H=31-dn(f),x=1<<H,O=G[H];O===-1?((x&a)===0||(x&d)!==0)&&(G[H]=UW(x,s)):O<=s&&(C.expiredLanes|=x),f&=~x}}function UA(C){return C=C.pendingLanes&-1073741825,C!==0?C:C&1073741824?1073741824:0}function DA(C){for(var s=[],a=0;31>a;a++)s.push(C);return s}function RC(C,s,a){C.pendingLanes|=s,s!==536870912&&(C.suspendedLanes=0,C.pingedLanes=0),C=C.eventTimes,s=31-dn(s),C[s]=a}function jW(C,s){var a=C.pendingLanes&~s;C.pendingLanes=s,C.suspendedLanes=0,C.pingedLanes=0,C.expiredLanes&=s,C.mutableReadLanes&=s,C.entangledLanes&=s,s=C.entanglements;var d=C.eventTimes;for(C=C.expirationTimes;0<a;){var G=31-dn(a),f=1<<G;s[G]=0,d[G]=-1,C[G]=-1,a&=~f}}function jA(C,s){var a=C.entangledLanes|=s;for(C=C.entanglements;a;){var d=31-dn(a),G=1<<d;G&s|C[d]&s&&(C[d]|=s),a&=~G}}var ke=0;function bG(C){return C&=-C,1<C?4<C?(C&268435455)!==0?16:536870912:4:1}var OA=I.unstable_scheduleCallback,GG=I.unstable_cancelCallback,OW=I.unstable_shouldYield,PW=I.unstable_requestPaint,Kt=I.unstable_now,PA=I.unstable_ImmediatePriority,_W=I.unstable_UserBlockingPriority,_A=I.unstable_NormalPriority,qW=I.unstable_IdlePriority,Rs=null,Rn=null;function $W(C){if(Rn&&typeof Rn.onCommitFiberRoot=="function")try{Rn.onCommitFiberRoot(Rs,C,void 0,(C.current.flags&128)===128)}catch{}}function ew(C,s){return C===s&&(C!==0||1/C===1/s)||C!==C&&s!==s}var Xn=typeof Object.is=="function"?Object.is:ew,nI=null,Xs=!1,qA=!1;function mG(C){nI===null?nI=[C]:nI.push(C)}function tw(C){Xs=!0,mG(C)}function Yn(){if(!qA&&nI!==null){qA=!0;var C=0,s=ke;try{var a=nI;for(ke=1;C<a.length;C++){var d=a[C];do d=d(!0);while(d!==null)}nI=null,Xs=!1}catch(G){throw nI!==null&&(nI=nI.slice(C+1)),OA(PA,Yn),G}finally{ke=s,qA=!1}}return null}var gw=l.ReactCurrentBatchConfig;function Ys(C,s){if(Xn(C,s))return!0;if(typeof C!="object"||C===null||typeof s!="object"||s===null)return!1;var a=Object.keys(C),d=Object.keys(s);if(a.length!==d.length)return!1;for(d=0;d<a.length;d++){var G=a[d];if(!MW.call(s,G)||!Xn(C[G],s[G]))return!1}return!0}function nw(C){switch(C.tag){case 5:return wC(C.type);case 16:return wC("Lazy");case 13:return wC("Suspense");case 19:return wC("SuspenseList");case 0:case 2:case 15:return C=QA(C.type,!1),C;case 11:return C=QA(C.type.render,!1),C;case 1:return C=QA(C.type,!0),C;default:return""}}function hn(C,s){if(C&&C.defaultProps){s=o({},s),C=C.defaultProps;for(var a in C)s[a]===void 0&&(s[a]=C[a]);return s}return s}var Ks=HI(null),Ss=null,ci=null,$A=null;function ea(){$A=ci=Ss=null}function pG(C,s,a){eI?(De(Ks,s._currentValue),s._currentValue=a):(De(Ks,s._currentValue2),s._currentValue2=a)}function ta(C){var s=Ks.current;_e(Ks),eI?C._currentValue=s:C._currentValue2=s}function ga(C,s,a){for(;C!==null;){var d=C.alternate;if((C.childLanes&s)!==s?(C.childLanes|=s,d!==null&&(d.childLanes|=s)):d!==null&&(d.childLanes&s)!==s&&(d.childLanes|=s),C===a)break;C=C.return}}function Ai(C,s){Ss=C,$A=ci=null,C=C.dependencies,C!==null&&C.firstContext!==null&&((C.lanes&s)!==0&&(Ng=!0),C.firstContext=null)}function Eg(C){var s=eI?C._currentValue:C._currentValue2;if($A!==C)if(C={context:C,memoizedValue:s,next:null},ci===null){if(Ss===null)throw Error(i(308));ci=C,Ss.dependencies={lanes:0,firstContext:C}}else ci=ci.next=C;return s}var Kn=null,FI=!1;function na(C){C.updateQueue={baseState:C.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function BG(C,s){C=C.updateQueue,s.updateQueue===C&&(s.updateQueue={baseState:C.baseState,firstBaseUpdate:C.firstBaseUpdate,lastBaseUpdate:C.lastBaseUpdate,shared:C.shared,effects:C.effects})}function II(C,s){return{eventTime:C,lane:s,tag:0,payload:null,callback:null,next:null}}function kI(C,s){var a=C.updateQueue;a!==null&&(a=a.shared,ft!==null&&(C.mode&1)!==0&&(Xe&2)===0?(C=a.interleaved,C===null?(s.next=s,Kn===null?Kn=[a]:Kn.push(a)):(s.next=C.next,C.next=s),a.interleaved=s):(C=a.pending,C===null?s.next=s:(s.next=C.next,C.next=s),a.pending=s))}function Hs(C,s,a){if(s=s.updateQueue,s!==null&&(s=s.shared,(a&4194240)!==0)){var d=s.lanes;d&=C.pendingLanes,a|=d,s.lanes=a,jA(C,a)}}function ZG(C,s){var a=C.updateQueue,d=C.alternate;if(d!==null&&(d=d.updateQueue,a===d)){var G=null,f=null;if(a=a.firstBaseUpdate,a!==null){do{var H={eventTime:a.eventTime,lane:a.lane,tag:a.tag,payload:a.payload,callback:a.callback,next:null};f===null?G=f=H:f=f.next=H,a=a.next}while(a!==null);f===null?G=f=s:f=f.next=s}else G=f=s;a={baseState:d.baseState,firstBaseUpdate:G,lastBaseUpdate:f,shared:d.shared,effects:d.effects},C.updateQueue=a;return}C=a.lastBaseUpdate,C===null?a.firstBaseUpdate=s:C.next=s,a.lastBaseUpdate=s}function Ns(C,s,a,d){var G=C.updateQueue;FI=!1;var f=G.firstBaseUpdate,H=G.lastBaseUpdate,x=G.shared.pending;if(x!==null){G.shared.pending=null;var O=x,te=O.next;O.next=null,H===null?f=te:H.next=te,H=O;var ce=C.alternate;ce!==null&&(ce=ce.updateQueue,x=ce.lastBaseUpdate,x!==H&&(x===null?ce.firstBaseUpdate=te:x.next=te,ce.lastBaseUpdate=O))}if(f!==null){var ve=G.baseState;H=0,ce=te=O=null,x=f;do{var be=x.lane,Ue=x.eventTime;if((d&be)===be){ce!==null&&(ce=ce.next={eventTime:Ue,lane:0,tag:x.tag,payload:x.payload,callback:x.callback,next:null});e:{var he=C,jt=x;switch(be=s,Ue=a,jt.tag){case 1:if(he=jt.payload,typeof he=="function"){ve=he.call(Ue,ve,be);break e}ve=he;break e;case 3:he.flags=he.flags&-65537|128;case 0:if(he=jt.payload,be=typeof he=="function"?he.call(Ue,ve,be):he,be==null)break e;ve=o({},ve,be);break e;case 2:FI=!0}}x.callback!==null&&x.lane!==0&&(C.flags|=64,be=G.effects,be===null?G.effects=[x]:be.push(x))}else Ue={eventTime:Ue,lane:be,tag:x.tag,payload:x.payload,callback:x.callback,next:null},ce===null?(te=ce=Ue,O=ve):ce=ce.next=Ue,H|=be;if(x=x.next,x===null){if(x=G.shared.pending,x===null)break;be=x,x=be.next,be.next=null,G.lastBaseUpdate=be,G.shared.pending=null}}while(1);if(ce===null&&(O=ve),G.baseState=O,G.firstBaseUpdate=te,G.lastBaseUpdate=ce,s=G.shared.interleaved,s!==null){G=s;do H|=G.lane,G=G.next;while(G!==s)}else f===null&&(G.shared.lanes=0);Bi|=H,C.lanes=H,C.memoizedState=ve}}function yG(C,s,a){if(C=s.effects,s.effects=null,C!==null)for(s=0;s<C.length;s++){var d=C[s],G=d.callback;if(G!==null){if(d.callback=null,d=a,typeof G!="function")throw Error(i(191,G));G.call(d)}}}var fG=new n.Component().refs;function Ia(C,s,a,d){s=C.memoizedState,a=a(d,s),a=a==null?s:o({},s,a),C.memoizedState=a,C.lanes===0&&(C.updateQueue.baseState=a)}var Fs={isMounted:function(C){return(C=C._reactInternals)?k(C)===C:!1},enqueueSetState:function(C,s,a){C=C._reactInternals;var d=Ig(),G=LI(C),f=II(d,G);f.payload=s,a!=null&&(f.callback=a),kI(C,f),s=jg(C,G,d),s!==null&&Hs(s,C,G)},enqueueReplaceState:function(C,s,a){C=C._reactInternals;var d=Ig(),G=LI(C),f=II(d,G);f.tag=1,f.payload=s,a!=null&&(f.callback=a),kI(C,f),s=jg(C,G,d),s!==null&&Hs(s,C,G)},enqueueForceUpdate:function(C,s){C=C._reactInternals;var a=Ig(),d=LI(C),G=II(a,d);G.tag=2,s!=null&&(G.callback=s),kI(C,G),s=jg(C,d,a),s!==null&&Hs(s,C,d)}};function vG(C,s,a,d,G,f,H){return C=C.stateNode,typeof C.shouldComponentUpdate=="function"?C.shouldComponentUpdate(d,f,H):s.prototype&&s.prototype.isPureReactComponent?!Ys(a,d)||!Ys(G,f):!0}function WG(C,s,a){var d=!1,G=NI,f=s.contextType;return typeof f=="object"&&f!==null?f=Eg(f):(G=dg(s)?mo:Qt.current,d=s.contextTypes,f=(d=d!=null)?ri(C,G):NI),s=new s(a,f),C.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,s.updater=Fs,C.stateNode=s,s._reactInternals=C,d&&(C=C.stateNode,C.__reactInternalMemoizedUnmaskedChildContext=G,C.__reactInternalMemoizedMaskedChildContext=f),s}function wG(C,s,a,d){C=s.state,typeof s.componentWillReceiveProps=="function"&&s.componentWillReceiveProps(a,d),typeof s.UNSAFE_componentWillReceiveProps=="function"&&s.UNSAFE_componentWillReceiveProps(a,d),s.state!==C&&Fs.enqueueReplaceState(s,s.state,null)}function oa(C,s,a,d){var G=C.stateNode;G.props=a,G.state=C.memoizedState,G.refs=fG,na(C);var f=s.contextType;typeof f=="object"&&f!==null?G.context=Eg(f):(f=dg(s)?mo:Qt.current,G.context=ri(C,f)),G.state=C.memoizedState,f=s.getDerivedStateFromProps,typeof f=="function"&&(Ia(C,s,f,a),G.state=C.memoizedState),typeof s.getDerivedStateFromProps=="function"||typeof G.getSnapshotBeforeUpdate=="function"||typeof G.UNSAFE_componentWillMount!="function"&&typeof G.componentWillMount!="function"||(s=G.state,typeof G.componentWillMount=="function"&&G.componentWillMount(),typeof G.UNSAFE_componentWillMount=="function"&&G.UNSAFE_componentWillMount(),s!==G.state&&Fs.enqueueReplaceState(G,G.state,null),Ns(C,a,G,d),G.state=C.memoizedState),typeof G.componentDidMount=="function"&&(C.flags|=4194308)}var ai=[],ui=0,ks=null,zs=0,Qg=[],Tg=0,po=null,oI=1,iI="";function Bo(C,s){ai[ui++]=zs,ai[ui++]=ks,ks=C,zs=s}function VG(C,s,a){Qg[Tg++]=oI,Qg[Tg++]=iI,Qg[Tg++]=po,po=C;var d=oI;C=iI;var G=32-dn(d)-1;d&=~(1<<G),a+=1;var f=32-dn(s)+G;if(30<f){var H=G-G%5;f=(d&(1<<H)-1).toString(32),d>>=H,G-=H,oI=1<<32-dn(s)+G|a<<G|d,iI=f+C}else oI=1<<f|a<<G|d,iI=C}function ia(C){C.return!==null&&(Bo(C,1),VG(C,1,0))}function Ca(C){for(;C===ks;)ks=ai[--ui],ai[ui]=null,zs=ai[--ui],ai[ui]=null;for(;C===po;)po=Qg[--Tg],Qg[Tg]=null,iI=Qg[--Tg],Qg[Tg]=null,oI=Qg[--Tg],Qg[Tg]=null}var Sg=null,Hg=null,tt=!1,XC=!1,bn=null;function RG(C,s){var a=Og(5,null,null,0);a.elementType="DELETED",a.stateNode=s,a.return=C,s=C.deletions,s===null?(C.deletions=[a],C.flags|=16):s.push(a)}function XG(C,s){switch(C.tag){case 5:return s=vW(s,C.type,C.pendingProps),s!==null?(C.stateNode=s,Sg=C,Hg=RW(s),!0):!1;case 6:return s=WW(s,C.pendingProps),s!==null?(C.stateNode=s,Sg=C,Hg=null,!0):!1;case 13:if(s=wW(s),s!==null){var a=po!==null?{id:oI,overflow:iI}:null;return C.memoizedState={dehydrated:s,treeContext:a,retryLane:1073741824},a=Og(18,null,null,0),a.stateNode=s,a.return=C,C.child=a,Sg=C,Hg=null,!0}return!1;default:return!1}}function la(C){return(C.mode&1)!==0&&(C.flags&128)===0}function sa(C){if(tt){var s=Hg;if(s){var a=s;if(!XG(C,s)){if(la(C))throw Error(i(418));s=WC(a);var d=Sg;s&&XG(C,s)?RG(d,a):(C.flags=C.flags&-4097|2,tt=!1,Sg=C)}}else{if(la(C))throw Error(i(418));C.flags=C.flags&-4097|2,tt=!1,Sg=C}}}function YG(C){for(C=C.return;C!==null&&C.tag!==5&&C.tag!==3&&C.tag!==13;)C=C.return;Sg=C}function YC(C){if(!ot||C!==Sg)return!1;if(!tt)return YG(C),tt=!0,!1;if(C.tag!==3&&(C.tag!==5||xW(C.type)&&!et(C.type,C.memoizedProps))){var s=Hg;if(s){if(la(C)){for(C=Hg;C;)C=WC(C);throw Error(i(418))}for(;s;)RG(C,s),s=WC(s)}}if(YG(C),C.tag===13){if(!ot)throw Error(i(316));if(C=C.memoizedState,C=C!==null?C.dehydrated:null,!C)throw Error(i(317));Hg=NW(C)}else Hg=Sg?WC(C.stateNode):null;return!0}function di(){ot&&(Hg=Sg=null,XC=tt=!1)}function ra(C){bn===null?bn=[C]:bn.push(C)}function KC(C,s,a){if(C=a.ref,C!==null&&typeof C!="function"&&typeof C!="object"){if(a._owner){if(a=a._owner,a){if(a.tag!==1)throw Error(i(309));var d=a.stateNode}if(!d)throw Error(i(147,C));var G=d,f=""+C;return s!==null&&s.ref!==null&&typeof s.ref=="function"&&s.ref._stringRef===f?s.ref:(s=function(H){var x=G.refs;x===fG&&(x=G.refs={}),H===null?delete x[f]:x[f]=H},s._stringRef=f,s)}if(typeof C!="string")throw Error(i(284));if(!a._owner)throw Error(i(290,C))}return C}function xs(C,s){throw C=Object.prototype.toString.call(s),Error(i(31,C==="[object Object]"?"object with keys {"+Object.keys(s).join(", ")+"}":C))}function KG(C){var s=C._init;return s(C._payload)}function SG(C){function s(Q,J){if(C){var U=Q.deletions;U===null?(Q.deletions=[J],Q.flags|=16):U.push(J)}}function a(Q,J){if(!C)return null;for(;J!==null;)s(Q,J),J=J.sibling;return null}function d(Q,J){for(Q=new Map;J!==null;)J.key!==null?Q.set(J.key,J):Q.set(J.index,J),J=J.sibling;return Q}function G(Q,J){return Q=MI(Q,J),Q.index=0,Q.sibling=null,Q}function f(Q,J,U){return Q.index=U,C?(U=Q.alternate,U!==null?(U=U.index,U<J?(Q.flags|=2,J):U):(Q.flags|=2,J)):(Q.flags|=1048576,J)}function H(Q){return C&&Q.alternate===null&&(Q.flags|=2),Q}function x(Q,J,U,Ce){return J===null||J.tag!==6?(J=Da(U,Q.mode,Ce),J.return=Q,J):(J=G(J,U),J.return=Q,J)}function O(Q,J,U,Ce){var de=U.type;return de===A?ce(Q,J,U.props.children,Ce,U.key):J!==null&&(J.elementType===de||typeof de=="object"&&de!==null&&de.$$typeof===B&&KG(de)===J.type)?(Ce=G(J,U.props),Ce.ref=KC(Q,J,U),Ce.return=Q,Ce):(Ce=hr(U.type,U.key,U.props,null,Q.mode,Ce),Ce.ref=KC(Q,J,U),Ce.return=Q,Ce)}function te(Q,J,U,Ce){return J===null||J.tag!==4||J.stateNode.containerInfo!==U.containerInfo||J.stateNode.implementation!==U.implementation?(J=ja(U,Q.mode,Ce),J.return=Q,J):(J=G(J,U.children||[]),J.return=Q,J)}function ce(Q,J,U,Ce,de){return J===null||J.tag!==7?(J=Vo(U,Q.mode,Ce,de),J.return=Q,J):(J=G(J,U),J.return=Q,J)}function ve(Q,J,U){if(typeof J=="string"&&J!==""||typeof J=="number")return J=Da(""+J,Q.mode,U),J.return=Q,J;if(typeof J=="object"&&J!==null){switch(J.$$typeof){case r:return U=hr(J.type,J.key,J.props,null,Q.mode,U),U.ref=KC(Q,null,J),U.return=Q,U;case c:return J=ja(J,Q.mode,U),J.return=Q,J;case B:var Ce=J._init;return ve(Q,Ce(J._payload),U)}if(L(J)||R(J))return J=Vo(J,Q.mode,U,null),J.return=Q,J;xs(Q,J)}return null}function be(Q,J,U,Ce){var de=J!==null?J.key:null;if(typeof U=="string"&&U!==""||typeof U=="number")return de!==null?null:x(Q,J,""+U,Ce);if(typeof U=="object"&&U!==null){switch(U.$$typeof){case r:return U.key===de?O(Q,J,U,Ce):null;case c:return U.key===de?te(Q,J,U,Ce):null;case B:return de=U._init,be(Q,J,de(U._payload),Ce)}if(L(U)||R(U))return de!==null?null:ce(Q,J,U,Ce,null);xs(Q,U)}return null}function Ue(Q,J,U,Ce,de){if(typeof Ce=="string"&&Ce!==""||typeof Ce=="number")return Q=Q.get(U)||null,x(J,Q,""+Ce,de);if(typeof Ce=="object"&&Ce!==null){switch(Ce.$$typeof){case r:return Q=Q.get(Ce.key===null?U:Ce.key)||null,O(J,Q,Ce,de);case c:return Q=Q.get(Ce.key===null?U:Ce.key)||null,te(J,Q,Ce,de);case B:var Re=Ce._init;return Ue(Q,J,U,Re(Ce._payload),de)}if(L(Ce)||R(Ce))return Q=Q.get(U)||null,ce(J,Q,Ce,de,null);xs(J,Ce)}return null}function he(Q,J,U,Ce){for(var de=null,Re=null,We=J,ze=J=0,Ht=null;We!==null&&ze<U.length;ze++){We.index>ze?(Ht=We,We=null):Ht=We.sibling;var xe=be(Q,We,U[ze],Ce);if(xe===null){We===null&&(We=Ht);break}C&&We&&xe.alternate===null&&s(Q,We),J=f(xe,J,ze),Re===null?de=xe:Re.sibling=xe,Re=xe,We=Ht}if(ze===U.length)return a(Q,We),tt&&Bo(Q,ze),de;if(We===null){for(;ze<U.length;ze++)We=ve(Q,U[ze],Ce),We!==null&&(J=f(We,J,ze),Re===null?de=We:Re.sibling=We,Re=We);return tt&&Bo(Q,ze),de}for(We=d(Q,We);ze<U.length;ze++)Ht=Ue(We,Q,ze,U[ze],Ce),Ht!==null&&(C&&Ht.alternate!==null&&We.delete(Ht.key===null?ze:Ht.key),J=f(Ht,J,ze),Re===null?de=Ht:Re.sibling=Ht,Re=Ht);return C&&We.forEach(function(EI){return s(Q,EI)}),tt&&Bo(Q,ze),de}function jt(Q,J,U,Ce){var de=R(U);if(typeof de!="function")throw Error(i(150));if(U=de.call(U),U==null)throw Error(i(151));for(var Re=de=null,We=J,ze=J=0,Ht=null,xe=U.next();We!==null&&!xe.done;ze++,xe=U.next()){We.index>ze?(Ht=We,We=null):Ht=We.sibling;var EI=be(Q,We,xe.value,Ce);if(EI===null){We===null&&(We=Ht);break}C&&We&&EI.alternate===null&&s(Q,We),J=f(EI,J,ze),Re===null?de=EI:Re.sibling=EI,Re=EI,We=Ht}if(xe.done)return a(Q,We),tt&&Bo(Q,ze),de;if(We===null){for(;!xe.done;ze++,xe=U.next())xe=ve(Q,xe.value,Ce),xe!==null&&(J=f(xe,J,ze),Re===null?de=xe:Re.sibling=xe,Re=xe);return tt&&Bo(Q,ze),de}for(We=d(Q,We);!xe.done;ze++,xe=U.next())xe=Ue(We,Q,ze,xe.value,Ce),xe!==null&&(C&&xe.alternate!==null&&We.delete(xe.key===null?ze:xe.key),J=f(xe,J,ze),Re===null?de=xe:Re.sibling=xe,Re=xe);return C&&We.forEach(function(Sw){return s(Q,Sw)}),tt&&Bo(Q,ze),de}function Pg(Q,J,U,Ce){if(typeof U=="object"&&U!==null&&U.type===A&&U.key===null&&(U=U.props.children),typeof U=="object"&&U!==null){switch(U.$$typeof){case r:e:{for(var de=U.key,Re=J;Re!==null;){if(Re.key===de){if(de=U.type,de===A){if(Re.tag===7){a(Q,Re.sibling),J=G(Re,U.props.children),J.return=Q,Q=J;break e}}else if(Re.elementType===de||typeof de=="object"&&de!==null&&de.$$typeof===B&&KG(de)===Re.type){a(Q,Re.sibling),J=G(Re,U.props),J.ref=KC(Q,Re,U),J.return=Q,Q=J;break e}a(Q,Re);break}else s(Q,Re);Re=Re.sibling}U.type===A?(J=Vo(U.props.children,Q.mode,Ce,U.key),J.return=Q,Q=J):(Ce=hr(U.type,U.key,U.props,null,Q.mode,Ce),Ce.ref=KC(Q,J,U),Ce.return=Q,Q=Ce)}return H(Q);case c:e:{for(Re=U.key;J!==null;){if(J.key===Re)if(J.tag===4&&J.stateNode.containerInfo===U.containerInfo&&J.stateNode.implementation===U.implementation){a(Q,J.sibling),J=G(J,U.children||[]),J.return=Q,Q=J;break e}else{a(Q,J);break}else s(Q,J);J=J.sibling}J=ja(U,Q.mode,Ce),J.return=Q,Q=J}return H(Q);case B:return Re=U._init,Pg(Q,J,Re(U._payload),Ce)}if(L(U))return he(Q,J,U,Ce);if(R(U))return jt(Q,J,U,Ce);xs(Q,U)}return typeof U=="string"&&U!==""||typeof U=="number"?(U=""+U,J!==null&&J.tag===6?(a(Q,J.sibling),J=G(J,U),J.return=Q,Q=J):(a(Q,J),J=Da(U,Q.mode,Ce),J.return=Q,Q=J),H(Q)):a(Q,J)}return Pg}var hi=SG(!0),HG=SG(!1),SC={},Ug=HI(SC),HC=HI(SC),bi=HI(SC);function Sn(C){if(C===SC)throw Error(i(174));return C}function ca(C,s){De(bi,s),De(HC,C),De(Ug,SC),C=$(s),_e(Ug),De(Ug,C)}function Gi(){_e(Ug),_e(HC),_e(bi)}function NG(C){var s=Sn(bi.current),a=Sn(Ug.current);s=T(a,C.type,s),a!==s&&(De(HC,C),De(Ug,s))}function Aa(C){HC.current===C&&(_e(Ug),_e(HC))}var Ct=HI(0);function Ls(C){for(var s=C;s!==null;){if(s.tag===13){var a=s.memoizedState;if(a!==null&&(a=a.dehydrated,a===null||AG(a)||JA(a)))return s}else if(s.tag===19&&s.memoizedProps.revealOrder!==void 0){if((s.flags&128)!==0)return s}else if(s.child!==null){s.child.return=s,s=s.child;continue}if(s===C)break;for(;s.sibling===null;){if(s.return===null||s.return===C)return null;s=s.return}s.sibling.return=s.return,s=s.sibling}return null}var aa=[];function ua(){for(var C=0;C<aa.length;C++){var s=aa[C];eI?s._workInProgressVersionPrimary=null:s._workInProgressVersionSecondary=null}aa.length=0}var Js=l.ReactCurrentDispatcher,Dg=l.ReactCurrentBatchConfig,mi=0,At=null,Tt=null,St=null,Ms=!1,NC=!1,FC=0,Iw=0;function Ut(){throw Error(i(321))}function da(C,s){if(s===null)return!1;for(var a=0;a<s.length&&a<C.length;a++)if(!Xn(C[a],s[a]))return!1;return!0}function ha(C,s,a,d,G,f){if(mi=f,At=s,s.memoizedState=null,s.updateQueue=null,s.lanes=0,Js.current=C===null||C.memoizedState===null?lw:sw,C=a(d,G),NC){f=0;do{if(NC=!1,FC=0,25<=f)throw Error(i(301));f+=1,St=Tt=null,s.updateQueue=null,Js.current=rw,C=a(d,G)}while(NC)}if(Js.current=Ds,s=Tt!==null&&Tt.next!==null,mi=0,St=Tt=At=null,Ms=!1,s)throw Error(i(300));return C}function ba(){var C=FC!==0;return FC=0,C}function CI(){var C={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return St===null?At.memoizedState=St=C:St=St.next=C,St}function Hn(){if(Tt===null){var C=At.alternate;C=C!==null?C.memoizedState:null}else C=Tt.next;var s=St===null?At.memoizedState:St.next;if(s!==null)St=s,Tt=C;else{if(C===null)throw Error(i(310));Tt=C,C={memoizedState:Tt.memoizedState,baseState:Tt.baseState,baseQueue:Tt.baseQueue,queue:Tt.queue,next:null},St===null?At.memoizedState=St=C:St=St.next=C}return St}function Zo(C,s){return typeof s=="function"?s(C):s}function Es(C){var s=Hn(),a=s.queue;if(a===null)throw Error(i(311));a.lastRenderedReducer=C;var d=Tt,G=d.baseQueue,f=a.pending;if(f!==null){if(G!==null){var H=G.next;G.next=f.next,f.next=H}d.baseQueue=G=f,a.pending=null}if(G!==null){f=G.next,d=d.baseState;var x=H=null,O=null,te=f;do{var ce=te.lane;if((mi&ce)===ce)O!==null&&(O=O.next={lane:0,action:te.action,hasEagerState:te.hasEagerState,eagerState:te.eagerState,next:null}),d=te.hasEagerState?te.eagerState:C(d,te.action);else{var ve={lane:ce,action:te.action,hasEagerState:te.hasEagerState,eagerState:te.eagerState,next:null};O===null?(x=O=ve,H=d):O=O.next=ve,At.lanes|=ce,Bi|=ce}te=te.next}while(te!==null&&te!==f);O===null?H=d:O.next=x,Xn(d,s.memoizedState)||(Ng=!0),s.memoizedState=d,s.baseState=H,s.baseQueue=O,a.lastRenderedState=d}if(C=a.interleaved,C!==null){G=C;do f=G.lane,At.lanes|=f,Bi|=f,G=G.next;while(G!==C)}else G===null&&(a.lanes=0);return[s.memoizedState,a.dispatch]}function Qs(C){var s=Hn(),a=s.queue;if(a===null)throw Error(i(311));a.lastRenderedReducer=C;var d=a.dispatch,G=a.pending,f=s.memoizedState;if(G!==null){a.pending=null;var H=G=G.next;do f=C(f,H.action),H=H.next;while(H!==G);Xn(f,s.memoizedState)||(Ng=!0),s.memoizedState=f,s.baseQueue===null&&(s.baseState=f),a.lastRenderedState=f}return[f,d]}function FG(){}function kG(C,s){var a=At,d=Hn(),G=s(),f=!Xn(d.memoizedState,G);if(f&&(d.memoizedState=G,Ng=!0),d=d.queue,zC(LG.bind(null,a,d,C),[C]),d.getSnapshot!==s||f||St!==null&&St.memoizedState.tag&1){if(a.flags|=2048,kC(9,xG.bind(null,a,d,G,s),void 0,null),ft===null)throw Error(i(349));(mi&30)!==0||zG(a,s,G)}return G}function zG(C,s,a){C.flags|=16384,C={getSnapshot:s,value:a},s=At.updateQueue,s===null?(s={lastEffect:null,stores:null},At.updateQueue=s,s.stores=[C]):(a=s.stores,a===null?s.stores=[C]:a.push(C))}function xG(C,s,a,d){s.value=a,s.getSnapshot=d,JG(s)&&jg(C,1,-1)}function LG(C,s,a){return a(function(){JG(s)&&jg(C,1,-1)})}function JG(C){var s=C.getSnapshot;C=C.value;try{var a=s();return!Xn(C,a)}catch{return!0}}function Ga(C){var s=CI();return typeof C=="function"&&(C=C()),s.memoizedState=s.baseState=C,C={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Zo,lastRenderedState:C},s.queue=C,C=C.dispatch=Cw.bind(null,At,C),[s.memoizedState,C]}function kC(C,s,a,d){return C={tag:C,create:s,destroy:a,deps:d,next:null},s=At.updateQueue,s===null?(s={lastEffect:null,stores:null},At.updateQueue=s,s.lastEffect=C.next=C):(a=s.lastEffect,a===null?s.lastEffect=C.next=C:(d=a.next,a.next=C,C.next=d,s.lastEffect=C)),C}function MG(){return Hn().memoizedState}function Ts(C,s,a,d){var G=CI();At.flags|=C,G.memoizedState=kC(1|s,a,void 0,d===void 0?null:d)}function Us(C,s,a,d){var G=Hn();d=d===void 0?null:d;var f=void 0;if(Tt!==null){var H=Tt.memoizedState;if(f=H.destroy,d!==null&&da(d,H.deps)){G.memoizedState=kC(s,a,f,d);return}}At.flags|=C,G.memoizedState=kC(1|s,a,f,d)}function ma(C,s){return Ts(8390656,8,C,s)}function zC(C,s){return Us(2048,8,C,s)}function EG(C,s){return Us(4,2,C,s)}function QG(C,s){return Us(4,4,C,s)}function TG(C,s){if(typeof s=="function")return C=C(),s(C),function(){s(null)};if(s!=null)return C=C(),s.current=C,function(){s.current=null}}function UG(C,s,a){return a=a!=null?a.concat([C]):null,Us(4,4,TG.bind(null,s,C),a)}function pa(){}function DG(C,s){var a=Hn();s=s===void 0?null:s;var d=a.memoizedState;return d!==null&&s!==null&&da(s,d[1])?d[0]:(a.memoizedState=[C,s],C)}function jG(C,s){var a=Hn();s=s===void 0?null:s;var d=a.memoizedState;return d!==null&&s!==null&&da(s,d[1])?d[0]:(C=C(),a.memoizedState=[C,s],C)}function ow(C,s){var a=ke;ke=a!==0&&4>a?a:4,C(!0);var d=Dg.transition;Dg.transition={};try{C(!1),s()}finally{ke=a,Dg.transition=d}}function OG(){return Hn().memoizedState}function iw(C,s,a){var d=LI(C);a={lane:d,action:a,hasEagerState:!1,eagerState:null,next:null},PG(C)?_G(s,a):(qG(C,s,a),a=Ig(),C=jg(C,d,a),C!==null&&$G(C,s,d))}function Cw(C,s,a){var d=LI(C),G={lane:d,action:a,hasEagerState:!1,eagerState:null,next:null};if(PG(C))_G(s,G);else{qG(C,s,G);var f=C.alternate;if(C.lanes===0&&(f===null||f.lanes===0)&&(f=s.lastRenderedReducer,f!==null))try{var H=s.lastRenderedState,x=f(H,a);if(G.hasEagerState=!0,G.eagerState=x,Xn(x,H))return}catch{}finally{}a=Ig(),C=jg(C,d,a),C!==null&&$G(C,s,d)}}function PG(C){var s=C.alternate;return C===At||s!==null&&s===At}function _G(C,s){NC=Ms=!0;var a=C.pending;a===null?s.next=s:(s.next=a.next,a.next=s),C.pending=s}function qG(C,s,a){ft!==null&&(C.mode&1)!==0&&(Xe&2)===0?(C=s.interleaved,C===null?(a.next=a,Kn===null?Kn=[s]:Kn.push(s)):(a.next=C.next,C.next=a),s.interleaved=a):(C=s.pending,C===null?a.next=a:(a.next=C.next,C.next=a),s.pending=a)}function $G(C,s,a){if((a&4194240)!==0){var d=s.lanes;d&=C.pendingLanes,a|=d,s.lanes=a,jA(C,a)}}var Ds={readContext:Eg,useCallback:Ut,useContext:Ut,useEffect:Ut,useImperativeHandle:Ut,useInsertionEffect:Ut,useLayoutEffect:Ut,useMemo:Ut,useReducer:Ut,useRef:Ut,useState:Ut,useDebugValue:Ut,useDeferredValue:Ut,useTransition:Ut,useMutableSource:Ut,useSyncExternalStore:Ut,useId:Ut,unstable_isNewReconciler:!1},lw={readContext:Eg,useCallback:function(C,s){return CI().memoizedState=[C,s===void 0?null:s],C},useContext:Eg,useEffect:ma,useImperativeHandle:function(C,s,a){return a=a!=null?a.concat([C]):null,Ts(4194308,4,TG.bind(null,s,C),a)},useLayoutEffect:function(C,s){return Ts(4194308,4,C,s)},useInsertionEffect:function(C,s){return Ts(4,2,C,s)},useMemo:function(C,s){var a=CI();return s=s===void 0?null:s,C=C(),a.memoizedState=[C,s],C},useReducer:function(C,s,a){var d=CI();return s=a!==void 0?a(s):s,d.memoizedState=d.baseState=s,C={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:C,lastRenderedState:s},d.queue=C,C=C.dispatch=iw.bind(null,At,C),[d.memoizedState,C]},useRef:function(C){var s=CI();return C={current:C},s.memoizedState=C},useState:Ga,useDebugValue:pa,useDeferredValue:function(C){var s=Ga(C),a=s[0],d=s[1];return ma(function(){var G=Dg.transition;Dg.transition={};try{d(C)}finally{Dg.transition=G}},[C]),a},useTransition:function(){var C=Ga(!1),s=C[0];return C=ow.bind(null,C[1]),CI().memoizedState=C,[s,C]},useMutableSource:function(){},useSyncExternalStore:function(C,s,a){var d=At,G=CI();if(tt){if(a===void 0)throw Error(i(407));a=a()}else{if(a=s(),ft===null)throw Error(i(349));(mi&30)!==0||zG(d,s,a)}G.memoizedState=a;var f={value:a,getSnapshot:s};return G.queue=f,ma(LG.bind(null,d,f,C),[C]),d.flags|=2048,kC(9,xG.bind(null,d,f,a,s),void 0,null),a},useId:function(){var C=CI(),s=ft.identifierPrefix;if(tt){var a=iI,d=oI;a=(d&~(1<<32-dn(d)-1)).toString(32)+a,s=":"+s+"R"+a,a=FC++,0<a&&(s+="H"+a.toString(32)),s+=":"}else a=Iw++,s=":"+s+"r"+a.toString(32)+":";return C.memoizedState=s},unstable_isNewReconciler:!1},sw={readContext:Eg,useCallback:DG,useContext:Eg,useEffect:zC,useImperativeHandle:UG,useInsertionEffect:EG,useLayoutEffect:QG,useMemo:jG,useReducer:Es,useRef:MG,useState:function(){return Es(Zo)},useDebugValue:pa,useDeferredValue:function(C){var s=Es(Zo),a=s[0],d=s[1];return zC(function(){var G=Dg.transition;Dg.transition={};try{d(C)}finally{Dg.transition=G}},[C]),a},useTransition:function(){var C=Es(Zo)[0],s=Hn().memoizedState;return[C,s]},useMutableSource:FG,useSyncExternalStore:kG,useId:OG,unstable_isNewReconciler:!1},rw={readContext:Eg,useCallback:DG,useContext:Eg,useEffect:zC,useImperativeHandle:UG,useInsertionEffect:EG,useLayoutEffect:QG,useMemo:jG,useReducer:Qs,useRef:MG,useState:function(){return Qs(Zo)},useDebugValue:pa,useDeferredValue:function(C){var s=Qs(Zo),a=s[0],d=s[1];return zC(function(){var G=Dg.transition;Dg.transition={};try{d(C)}finally{Dg.transition=G}},[C]),a},useTransition:function(){var C=Qs(Zo)[0],s=Hn().memoizedState;return[C,s]},useMutableSource:FG,useSyncExternalStore:kG,useId:OG,unstable_isNewReconciler:!1};function Ba(C,s){try{var a="",d=s;do a+=nw(d),d=d.return;while(d);var G=a}catch(f){G=`
|
|
53
|
+
Error generating stack: `+f.message+`
|
|
54
|
+
`+f.stack}return{value:C,source:s,stack:G}}function Za(C,s){try{console.error(s.value)}catch(a){setTimeout(function(){throw a})}}var cw=typeof WeakMap=="function"?WeakMap:Map;function em(C,s,a){a=II(-1,a),a.tag=3,a.payload={element:null};var d=s.value;return a.callback=function(){sr||(sr=!0,La=d),Za(C,s)},a}function tm(C,s,a){a=II(-1,a),a.tag=3;var d=C.type.getDerivedStateFromError;if(typeof d=="function"){var G=s.value;a.payload=function(){return d(G)},a.callback=function(){Za(C,s)}}var f=C.stateNode;return f!==null&&typeof f.componentDidCatch=="function"&&(a.callback=function(){Za(C,s),typeof d!="function"&&(zI===null?zI=new Set([this]):zI.add(this));var H=s.stack;this.componentDidCatch(s.value,{componentStack:H!==null?H:""})}),a}function gm(C,s,a){var d=C.pingCache;if(d===null){d=C.pingCache=new cw;var G=new Set;d.set(s,G)}else G=d.get(s),G===void 0&&(G=new Set,d.set(s,G));G.has(a)||(G.add(a),C=vw.bind(null,C,s,a),s.then(C,C))}function nm(C){do{var s;if((s=C.tag===13)&&(s=C.memoizedState,s=s!==null?s.dehydrated!==null:!0),s)return C;C=C.return}while(C!==null);return null}function Im(C,s,a,d,G){return(C.mode&1)===0?(C===s?C.flags|=65536:(C.flags|=128,a.flags|=131072,a.flags&=-52805,a.tag===1&&(a.alternate===null?a.tag=17:(s=II(-1,1),s.tag=2,kI(a,s))),a.lanes|=1),C):(C.flags|=65536,C.lanes=G,C)}function Nn(C){C.flags|=4}function om(C,s){if(C!==null&&C.child===s.child)return!0;if((s.flags&16)!==0)return!1;for(C=s.child;C!==null;){if((C.flags&12854)!==0||(C.subtreeFlags&12854)!==0)return!1;C=C.sibling}return!0}var xC,LC,js,Os;if(Mt)xC=function(C,s){for(var a=s.child;a!==null;){if(a.tag===5||a.tag===6)ue(C,a.stateNode);else if(a.tag!==4&&a.child!==null){a.child.return=a,a=a.child;continue}if(a===s)break;for(;a.sibling===null;){if(a.return===null||a.return===s)return;a=a.return}a.sibling.return=a.return,a=a.sibling}},LC=function(){},js=function(C,s,a,d,G){if(C=C.memoizedProps,C!==d){var f=s.stateNode,H=Sn(Ug.current);a=Te(f,a,C,d,G,H),(s.updateQueue=a)&&Nn(s)}},Os=function(C,s,a,d){a!==d&&Nn(s)};else if(Vn){xC=function(C,s,a,d){for(var G=s.child;G!==null;){if(G.tag===5){var f=G.stateNode;a&&d&&(f=rG(f,G.type,G.memoizedProps,G)),ue(C,f)}else if(G.tag===6)f=G.stateNode,a&&d&&(f=cG(f,G.memoizedProps,G)),ue(C,f);else if(G.tag!==4){if(G.tag===22&&G.memoizedState!==null)f=G.child,f!==null&&(f.return=G),xC(C,G,!0,!0);else if(G.child!==null){G.child.return=G,G=G.child;continue}}if(G===s)break;for(;G.sibling===null;){if(G.return===null||G.return===s)return;G=G.return}G.sibling.return=G.return,G=G.sibling}};var im=function(C,s,a,d){for(var G=s.child;G!==null;){if(G.tag===5){var f=G.stateNode;a&&d&&(f=rG(f,G.type,G.memoizedProps,G)),lG(C,f)}else if(G.tag===6)f=G.stateNode,a&&d&&(f=cG(f,G.memoizedProps,G)),lG(C,f);else if(G.tag!==4){if(G.tag===22&&G.memoizedState!==null)f=G.child,f!==null&&(f.return=G),im(C,G,!0,!0);else if(G.child!==null){G.child.return=G,G=G.child;continue}}if(G===s)break;for(;G.sibling===null;){if(G.return===null||G.return===s)return;G=G.return}G.sibling.return=G.return,G=G.sibling}};LC=function(C,s){var a=s.stateNode;if(!om(C,s)){C=a.containerInfo;var d=CG(C);im(d,s,!1,!1),a.pendingChildren=d,Nn(s),fW(C,d)}},js=function(C,s,a,d,G){var f=C.stateNode,H=C.memoizedProps;if((C=om(C,s))&&H===d)s.stateNode=f;else{var x=s.stateNode,O=Sn(Ug.current),te=null;H!==d&&(te=Te(x,a,H,d,G,O)),C&&te===null?s.stateNode=f:(f=yW(f,te,a,H,d,s,C,x),Ye(f,a,d,G,O)&&Nn(s),s.stateNode=f,C?Nn(s):xC(f,s,!1,!1))}},Os=function(C,s,a,d){a!==d?(C=Sn(bi.current),a=Sn(Ug.current),s.stateNode=yt(d,C,a,s),Nn(s)):s.stateNode=C.stateNode}}else LC=function(){},js=function(){},Os=function(){};function JC(C,s){if(!tt)switch(C.tailMode){case"hidden":s=C.tail;for(var a=null;s!==null;)s.alternate!==null&&(a=s),s=s.sibling;a===null?C.tail=null:a.sibling=null;break;case"collapsed":a=C.tail;for(var d=null;a!==null;)a.alternate!==null&&(d=a),a=a.sibling;d===null?s||C.tail===null?C.tail=null:C.tail.sibling=null:d.sibling=null}}function Dt(C){var s=C.alternate!==null&&C.alternate.child===C.child,a=0,d=0;if(s)for(var G=C.child;G!==null;)a|=G.lanes|G.childLanes,d|=G.subtreeFlags&14680064,d|=G.flags&14680064,G.return=C,G=G.sibling;else for(G=C.child;G!==null;)a|=G.lanes|G.childLanes,d|=G.subtreeFlags,d|=G.flags,G.return=C,G=G.sibling;return C.subtreeFlags|=d,C.childLanes=a,s}function Aw(C,s,a){var d=s.pendingProps;switch(Ca(s),s.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Dt(s),null;case 1:return dg(s.type)&&fs(),Dt(s),null;case 3:return d=s.stateNode,Gi(),_e(ug),_e(Qt),ua(),d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null),(C===null||C.child===null)&&(YC(s)?Nn(s):C===null||C.memoizedState.isDehydrated&&(s.flags&256)===0||(s.flags|=1024,bn!==null&&(Ea(bn),bn=null))),LC(C,s),Dt(s),null;case 5:Aa(s),a=Sn(bi.current);var G=s.type;if(C!==null&&s.stateNode!=null)js(C,s,G,d,a),C.ref!==s.ref&&(s.flags|=512,s.flags|=2097152);else{if(!d){if(s.stateNode===null)throw Error(i(166));return Dt(s),null}if(C=Sn(Ug.current),YC(s)){if(!ot)throw Error(i(175));C=KW(s.stateNode,s.type,s.memoizedProps,a,C,s,!XC),s.updateQueue=C,C!==null&&Nn(s)}else{var f=se(G,d,a,C,s);xC(f,s,!1,!1),s.stateNode=f,Ye(f,G,d,a,C)&&Nn(s)}s.ref!==null&&(s.flags|=512,s.flags|=2097152)}return Dt(s),null;case 6:if(C&&s.stateNode!=null)Os(C,s,C.memoizedProps,d);else{if(typeof d!="string"&&s.stateNode===null)throw Error(i(166));if(C=Sn(bi.current),a=Sn(Ug.current),YC(s)){if(!ot)throw Error(i(176));if(C=s.stateNode,d=s.memoizedProps,(a=SW(C,d,s,!XC))&&(G=Sg,G!==null))switch(f=(G.mode&1)!==0,G.tag){case 3:LW(G.stateNode.containerInfo,C,d,f);break;case 5:JW(G.type,G.memoizedProps,G.stateNode,C,d,f)}a&&Nn(s)}else s.stateNode=yt(d,C,a,s)}return Dt(s),null;case 13:if(_e(Ct),d=s.memoizedState,tt&&Hg!==null&&(s.mode&1)!==0&&(s.flags&128)===0){for(C=Hg;C;)C=WC(C);return di(),s.flags|=98560,s}if(d!==null&&d.dehydrated!==null){if(d=YC(s),C===null){if(!d)throw Error(i(318));if(!ot)throw Error(i(344));if(C=s.memoizedState,C=C!==null?C.dehydrated:null,!C)throw Error(i(317));HW(C,s)}else di(),(s.flags&128)===0&&(s.memoizedState=null),s.flags|=4;return Dt(s),null}return bn!==null&&(Ea(bn),bn=null),(s.flags&128)!==0?(s.lanes=a,s):(d=d!==null,a=!1,C===null?YC(s):a=C.memoizedState!==null,d&&!a&&(s.child.flags|=8192,(s.mode&1)!==0&&(C===null||(Ct.current&1)!==0?Vt===0&&(Vt=3):Ta())),s.updateQueue!==null&&(s.flags|=4),Dt(s),null);case 4:return Gi(),LC(C,s),C===null&&XI(s.stateNode.containerInfo),Dt(s),null;case 10:return ta(s.type._context),Dt(s),null;case 17:return dg(s.type)&&fs(),Dt(s),null;case 19:if(_e(Ct),G=s.memoizedState,G===null)return Dt(s),null;if(d=(s.flags&128)!==0,f=G.rendering,f===null)if(d)JC(G,!1);else{if(Vt!==0||C!==null&&(C.flags&128)!==0)for(C=s.child;C!==null;){if(f=Ls(C),f!==null){for(s.flags|=128,JC(G,!1),C=f.updateQueue,C!==null&&(s.updateQueue=C,s.flags|=4),s.subtreeFlags=0,C=a,d=s.child;d!==null;)a=d,G=C,a.flags&=14680066,f=a.alternate,f===null?(a.childLanes=0,a.lanes=G,a.child=null,a.subtreeFlags=0,a.memoizedProps=null,a.memoizedState=null,a.updateQueue=null,a.dependencies=null,a.stateNode=null):(a.childLanes=f.childLanes,a.lanes=f.lanes,a.child=f.child,a.subtreeFlags=0,a.deletions=null,a.memoizedProps=f.memoizedProps,a.memoizedState=f.memoizedState,a.updateQueue=f.updateQueue,a.type=f.type,G=f.dependencies,a.dependencies=G===null?null:{lanes:G.lanes,firstContext:G.firstContext}),d=d.sibling;return De(Ct,Ct.current&1|2),s.child}C=C.sibling}G.tail!==null&&Kt()>xa&&(s.flags|=128,d=!0,JC(G,!1),s.lanes=4194304)}else{if(!d)if(C=Ls(f),C!==null){if(s.flags|=128,d=!0,C=C.updateQueue,C!==null&&(s.updateQueue=C,s.flags|=4),JC(G,!0),G.tail===null&&G.tailMode==="hidden"&&!f.alternate&&!tt)return Dt(s),null}else 2*Kt()-G.renderingStartTime>xa&&a!==1073741824&&(s.flags|=128,d=!0,JC(G,!1),s.lanes=4194304);G.isBackwards?(f.sibling=s.child,s.child=f):(C=G.last,C!==null?C.sibling=f:s.child=f,G.last=f)}return G.tail!==null?(s=G.tail,G.rendering=s,G.tail=s.sibling,G.renderingStartTime=Kt(),s.sibling=null,C=Ct.current,De(Ct,d?C&1|2:C&1),s):(Dt(s),null);case 22:case 23:return Qa(),d=s.memoizedState!==null,C!==null&&C.memoizedState!==null!==d&&(s.flags|=8192),d&&(s.mode&1)!==0?(Fg&1073741824)!==0&&(Dt(s),Mt&&s.subtreeFlags&6&&(s.flags|=8192)):Dt(s),null;case 24:return null;case 25:return null}throw Error(i(156,s.tag))}var aw=l.ReactCurrentOwner,Ng=!1;function ng(C,s,a,d){s.child=C===null?HG(s,null,a,d):hi(s,C.child,a,d)}function Cm(C,s,a,d,G){a=a.render;var f=s.ref;return Ai(s,G),d=ha(C,s,a,d,f,G),a=ba(),C!==null&&!Ng?(s.updateQueue=C.updateQueue,s.flags&=-2053,C.lanes&=~G,lI(C,s,G)):(tt&&a&&ia(s),s.flags|=1,ng(C,s,d,G),s.child)}function lm(C,s,a,d,G){if(C===null){var f=a.type;return typeof f=="function"&&!Ua(f)&&f.defaultProps===void 0&&a.compare===null&&a.defaultProps===void 0?(s.tag=15,s.type=f,sm(C,s,f,d,G)):(C=hr(a.type,null,d,s,s.mode,G),C.ref=s.ref,C.return=s,s.child=C)}if(f=C.child,(C.lanes&G)===0){var H=f.memoizedProps;if(a=a.compare,a=a!==null?a:Ys,a(H,d)&&C.ref===s.ref)return lI(C,s,G)}return s.flags|=1,C=MI(f,d),C.ref=s.ref,C.return=s,s.child=C}function sm(C,s,a,d,G){if(C!==null&&Ys(C.memoizedProps,d)&&C.ref===s.ref)if(Ng=!1,(C.lanes&G)!==0)(C.flags&131072)!==0&&(Ng=!0);else return s.lanes=C.lanes,lI(C,s,G);return ya(C,s,a,d,G)}function rm(C,s,a){var d=s.pendingProps,G=d.children,f=C!==null?C.memoizedState:null;if(d.mode==="hidden")if((s.mode&1)===0)s.memoizedState={baseLanes:0,cachePool:null},De(pi,Fg),Fg|=a;else if((a&1073741824)!==0)s.memoizedState={baseLanes:0,cachePool:null},d=f!==null?f.baseLanes:a,De(pi,Fg),Fg|=d;else return C=f!==null?f.baseLanes|a:a,s.lanes=s.childLanes=1073741824,s.memoizedState={baseLanes:C,cachePool:null},s.updateQueue=null,De(pi,Fg),Fg|=C,null;else f!==null?(d=f.baseLanes|a,s.memoizedState=null):d=a,De(pi,Fg),Fg|=d;return ng(C,s,G,a),s.child}function cm(C,s){var a=s.ref;(C===null&&a!==null||C!==null&&C.ref!==a)&&(s.flags|=512,s.flags|=2097152)}function ya(C,s,a,d,G){var f=dg(a)?mo:Qt.current;return f=ri(s,f),Ai(s,G),a=ha(C,s,a,d,f,G),d=ba(),C!==null&&!Ng?(s.updateQueue=C.updateQueue,s.flags&=-2053,C.lanes&=~G,lI(C,s,G)):(tt&&d&&ia(s),s.flags|=1,ng(C,s,a,G),s.child)}function Am(C,s,a,d,G){if(dg(a)){var f=!0;vs(s)}else f=!1;if(Ai(s,G),s.stateNode===null)C!==null&&(C.alternate=null,s.alternate=null,s.flags|=2),WG(s,a,d),oa(s,a,d,G),d=!0;else if(C===null){var H=s.stateNode,x=s.memoizedProps;H.props=x;var O=H.context,te=a.contextType;typeof te=="object"&&te!==null?te=Eg(te):(te=dg(a)?mo:Qt.current,te=ri(s,te));var ce=a.getDerivedStateFromProps,ve=typeof ce=="function"||typeof H.getSnapshotBeforeUpdate=="function";ve||typeof H.UNSAFE_componentWillReceiveProps!="function"&&typeof H.componentWillReceiveProps!="function"||(x!==d||O!==te)&&wG(s,H,d,te),FI=!1;var be=s.memoizedState;H.state=be,Ns(s,d,H,G),O=s.memoizedState,x!==d||be!==O||ug.current||FI?(typeof ce=="function"&&(Ia(s,a,ce,d),O=s.memoizedState),(x=FI||vG(s,a,x,d,be,O,te))?(ve||typeof H.UNSAFE_componentWillMount!="function"&&typeof H.componentWillMount!="function"||(typeof H.componentWillMount=="function"&&H.componentWillMount(),typeof H.UNSAFE_componentWillMount=="function"&&H.UNSAFE_componentWillMount()),typeof H.componentDidMount=="function"&&(s.flags|=4194308)):(typeof H.componentDidMount=="function"&&(s.flags|=4194308),s.memoizedProps=d,s.memoizedState=O),H.props=d,H.state=O,H.context=te,d=x):(typeof H.componentDidMount=="function"&&(s.flags|=4194308),d=!1)}else{H=s.stateNode,BG(C,s),x=s.memoizedProps,te=s.type===s.elementType?x:hn(s.type,x),H.props=te,ve=s.pendingProps,be=H.context,O=a.contextType,typeof O=="object"&&O!==null?O=Eg(O):(O=dg(a)?mo:Qt.current,O=ri(s,O));var Ue=a.getDerivedStateFromProps;(ce=typeof Ue=="function"||typeof H.getSnapshotBeforeUpdate=="function")||typeof H.UNSAFE_componentWillReceiveProps!="function"&&typeof H.componentWillReceiveProps!="function"||(x!==ve||be!==O)&&wG(s,H,d,O),FI=!1,be=s.memoizedState,H.state=be,Ns(s,d,H,G);var he=s.memoizedState;x!==ve||be!==he||ug.current||FI?(typeof Ue=="function"&&(Ia(s,a,Ue,d),he=s.memoizedState),(te=FI||vG(s,a,te,d,be,he,O)||!1)?(ce||typeof H.UNSAFE_componentWillUpdate!="function"&&typeof H.componentWillUpdate!="function"||(typeof H.componentWillUpdate=="function"&&H.componentWillUpdate(d,he,O),typeof H.UNSAFE_componentWillUpdate=="function"&&H.UNSAFE_componentWillUpdate(d,he,O)),typeof H.componentDidUpdate=="function"&&(s.flags|=4),typeof H.getSnapshotBeforeUpdate=="function"&&(s.flags|=1024)):(typeof H.componentDidUpdate!="function"||x===C.memoizedProps&&be===C.memoizedState||(s.flags|=4),typeof H.getSnapshotBeforeUpdate!="function"||x===C.memoizedProps&&be===C.memoizedState||(s.flags|=1024),s.memoizedProps=d,s.memoizedState=he),H.props=d,H.state=he,H.context=O,d=te):(typeof H.componentDidUpdate!="function"||x===C.memoizedProps&&be===C.memoizedState||(s.flags|=4),typeof H.getSnapshotBeforeUpdate!="function"||x===C.memoizedProps&&be===C.memoizedState||(s.flags|=1024),d=!1)}return fa(C,s,a,d,f,G)}function fa(C,s,a,d,G,f){cm(C,s);var H=(s.flags&128)!==0;if(!d&&!H)return G&&hG(s,a,!1),lI(C,s,f);d=s.stateNode,aw.current=s;var x=H&&typeof a.getDerivedStateFromError!="function"?null:d.render();return s.flags|=1,C!==null&&H?(s.child=hi(s,C.child,null,f),s.child=hi(s,null,x,f)):ng(C,s,x,f),s.memoizedState=d.state,G&&hG(s,a,!0),s.child}function am(C){var s=C.stateNode;s.pendingContext?uG(C,s.pendingContext,s.pendingContext!==s.context):s.context&&uG(C,s.context,!1),ca(C,s.containerInfo)}function um(C,s,a,d,G){return di(),ra(G),s.flags|=256,ng(C,s,a,d),s.child}var Ps={dehydrated:null,treeContext:null,retryLane:0};function _s(C){return{baseLanes:C,cachePool:null}}function dm(C,s,a){var d=s.pendingProps,G=Ct.current,f=!1,H=(s.flags&128)!==0,x;if((x=H)||(x=C!==null&&C.memoizedState===null?!1:(G&2)!==0),x?(f=!0,s.flags&=-129):(C===null||C.memoizedState!==null)&&(G|=1),De(Ct,G&1),C===null)return sa(s),C=s.memoizedState,C!==null&&(C=C.dehydrated,C!==null)?((s.mode&1)===0?s.lanes=1:JA(C)?s.lanes=8:s.lanes=1073741824,null):(G=d.children,C=d.fallback,f?(d=s.mode,f=s.child,G={mode:"hidden",children:G},(d&1)===0&&f!==null?(f.childLanes=0,f.pendingProps=G):f=br(G,d,0,null),C=Vo(C,d,a,null),f.return=s,C.return=s,f.sibling=C,s.child=f,s.child.memoizedState=_s(a),s.memoizedState=Ps,C):va(s,G));if(G=C.memoizedState,G!==null){if(x=G.dehydrated,x!==null){if(H)return s.flags&256?(s.flags&=-257,qs(C,s,a,Error(i(422)))):s.memoizedState!==null?(s.child=C.child,s.flags|=128,null):(f=d.fallback,G=s.mode,d=br({mode:"visible",children:d.children},G,0,null),f=Vo(f,G,a,null),f.flags|=2,d.return=s,f.return=s,d.sibling=f,s.child=d,(s.mode&1)!==0&&hi(s,C.child,null,a),s.child.memoizedState=_s(a),s.memoizedState=Ps,f);if((s.mode&1)===0)s=qs(C,s,a,null);else if(JA(x))s=qs(C,s,a,Error(i(419)));else if(d=(a&C.childLanes)!==0,Ng||d){if(d=ft,d!==null){switch(a&-a){case 4:f=2;break;case 16:f=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:f=32;break;case 536870912:f=268435456;break;default:f=0}d=(f&(d.suspendedLanes|a))!==0?0:f,d!==0&&d!==G.retryLane&&(G.retryLane=d,jg(C,d,-1))}Ta(),s=qs(C,s,a,Error(i(421)))}else AG(x)?(s.flags|=128,s.child=C.child,s=Ww.bind(null,C),VW(x,s),s=null):(a=G.treeContext,ot&&(Hg=YW(x),Sg=s,tt=!0,bn=null,XC=!1,a!==null&&(Qg[Tg++]=oI,Qg[Tg++]=iI,Qg[Tg++]=po,oI=a.id,iI=a.overflow,po=s)),s=va(s,s.pendingProps.children),s.flags|=4096);return s}return f?(d=bm(C,s,d.children,d.fallback,a),f=s.child,G=C.child.memoizedState,f.memoizedState=G===null?_s(a):{baseLanes:G.baseLanes|a,cachePool:null},f.childLanes=C.childLanes&~a,s.memoizedState=Ps,d):(a=hm(C,s,d.children,a),s.memoizedState=null,a)}return f?(d=bm(C,s,d.children,d.fallback,a),f=s.child,G=C.child.memoizedState,f.memoizedState=G===null?_s(a):{baseLanes:G.baseLanes|a,cachePool:null},f.childLanes=C.childLanes&~a,s.memoizedState=Ps,d):(a=hm(C,s,d.children,a),s.memoizedState=null,a)}function va(C,s){return s=br({mode:"visible",children:s},C.mode,0,null),s.return=C,C.child=s}function hm(C,s,a,d){var G=C.child;return C=G.sibling,a=MI(G,{mode:"visible",children:a}),(s.mode&1)===0&&(a.lanes=d),a.return=s,a.sibling=null,C!==null&&(d=s.deletions,d===null?(s.deletions=[C],s.flags|=16):d.push(C)),s.child=a}function bm(C,s,a,d,G){var f=s.mode;C=C.child;var H=C.sibling,x={mode:"hidden",children:a};return(f&1)===0&&s.child!==C?(a=s.child,a.childLanes=0,a.pendingProps=x,s.deletions=null):(a=MI(C,x),a.subtreeFlags=C.subtreeFlags&14680064),H!==null?d=MI(H,d):(d=Vo(d,f,G,null),d.flags|=2),d.return=s,a.return=s,a.sibling=d,s.child=a,d}function qs(C,s,a,d){return d!==null&&ra(d),hi(s,C.child,null,a),C=va(s,s.pendingProps.children),C.flags|=2,s.memoizedState=null,C}function Gm(C,s,a){C.lanes|=s;var d=C.alternate;d!==null&&(d.lanes|=s),ga(C.return,s,a)}function Wa(C,s,a,d,G){var f=C.memoizedState;f===null?C.memoizedState={isBackwards:s,rendering:null,renderingStartTime:0,last:d,tail:a,tailMode:G}:(f.isBackwards=s,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=a,f.tailMode=G)}function mm(C,s,a){var d=s.pendingProps,G=d.revealOrder,f=d.tail;if(ng(C,s,d.children,a),d=Ct.current,(d&2)!==0)d=d&1|2,s.flags|=128;else{if(C!==null&&(C.flags&128)!==0)e:for(C=s.child;C!==null;){if(C.tag===13)C.memoizedState!==null&&Gm(C,a,s);else if(C.tag===19)Gm(C,a,s);else if(C.child!==null){C.child.return=C,C=C.child;continue}if(C===s)break e;for(;C.sibling===null;){if(C.return===null||C.return===s)break e;C=C.return}C.sibling.return=C.return,C=C.sibling}d&=1}if(De(Ct,d),(s.mode&1)===0)s.memoizedState=null;else switch(G){case"forwards":for(a=s.child,G=null;a!==null;)C=a.alternate,C!==null&&Ls(C)===null&&(G=a),a=a.sibling;a=G,a===null?(G=s.child,s.child=null):(G=a.sibling,a.sibling=null),Wa(s,!1,G,a,f);break;case"backwards":for(a=null,G=s.child,s.child=null;G!==null;){if(C=G.alternate,C!==null&&Ls(C)===null){s.child=G;break}C=G.sibling,G.sibling=a,a=G,G=C}Wa(s,!0,a,null,f);break;case"together":Wa(s,!1,null,null,void 0);break;default:s.memoizedState=null}return s.child}function lI(C,s,a){if(C!==null&&(s.dependencies=C.dependencies),Bi|=s.lanes,(a&s.childLanes)===0)return null;if(C!==null&&s.child!==C.child)throw Error(i(153));if(s.child!==null){for(C=s.child,a=MI(C,C.pendingProps),s.child=a,a.return=s;C.sibling!==null;)C=C.sibling,a=a.sibling=MI(C,C.pendingProps),a.return=s;a.sibling=null}return s.child}function uw(C,s,a){switch(s.tag){case 3:am(s),di();break;case 5:NG(s);break;case 1:dg(s.type)&&vs(s);break;case 4:ca(s,s.stateNode.containerInfo);break;case 10:pG(s,s.type._context,s.memoizedProps.value);break;case 13:var d=s.memoizedState;if(d!==null)return d.dehydrated!==null?(De(Ct,Ct.current&1),s.flags|=128,null):(a&s.child.childLanes)!==0?dm(C,s,a):(De(Ct,Ct.current&1),C=lI(C,s,a),C!==null?C.sibling:null);De(Ct,Ct.current&1);break;case 19:if(d=(a&s.childLanes)!==0,(C.flags&128)!==0){if(d)return mm(C,s,a);s.flags|=128}var G=s.memoizedState;if(G!==null&&(G.rendering=null,G.tail=null,G.lastEffect=null),De(Ct,Ct.current),d)break;return null;case 22:case 23:return s.lanes=0,rm(C,s,a)}return lI(C,s,a)}function dw(C,s){switch(Ca(s),s.tag){case 1:return dg(s.type)&&fs(),C=s.flags,C&65536?(s.flags=C&-65537|128,s):null;case 3:return Gi(),_e(ug),_e(Qt),ua(),C=s.flags,(C&65536)!==0&&(C&128)===0?(s.flags=C&-65537|128,s):null;case 5:return Aa(s),null;case 13:if(_e(Ct),C=s.memoizedState,C!==null&&C.dehydrated!==null){if(s.alternate===null)throw Error(i(340));di()}return C=s.flags,C&65536?(s.flags=C&-65537|128,s):null;case 19:return _e(Ct),null;case 4:return Gi(),null;case 10:return ta(s.type._context),null;case 22:case 23:return Qa(),null;case 24:return null;default:return null}}var $s=!1,yo=!1,hw=typeof WeakSet=="function"?WeakSet:Set,Ie=null;function er(C,s){var a=C.ref;if(a!==null)if(typeof a=="function")try{a(null)}catch(d){Gg(C,s,d)}else a.current=null}function wa(C,s,a){try{a()}catch(d){Gg(C,s,d)}}var pm=!1;function bw(C,s){for(q(C.containerInfo),Ie=s;Ie!==null;)if(C=Ie,s=C.child,(C.subtreeFlags&1028)!==0&&s!==null)s.return=C,Ie=s;else for(;Ie!==null;){C=Ie;try{var a=C.alternate;if((C.flags&1024)!==0)switch(C.tag){case 0:case 11:case 15:break;case 1:if(a!==null){var d=a.memoizedProps,G=a.memoizedState,f=C.stateNode,H=f.getSnapshotBeforeUpdate(C.elementType===C.type?d:hn(C.type,d),G);f.__reactInternalSnapshotBeforeUpdate=H}break;case 3:Mt&&ZW(C.stateNode.containerInfo);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(x){Gg(C,C.return,x)}if(s=C.sibling,s!==null){s.return=C.return,Ie=s;break}Ie=C.return}return a=pm,pm=!1,a}function fo(C,s,a){var d=s.updateQueue;if(d=d!==null?d.lastEffect:null,d!==null){var G=d=d.next;do{if((G.tag&C)===C){var f=G.destroy;G.destroy=void 0,f!==void 0&&wa(s,a,f)}G=G.next}while(G!==d)}}function MC(C,s){if(s=s.updateQueue,s=s!==null?s.lastEffect:null,s!==null){var a=s=s.next;do{if((a.tag&C)===C){var d=a.create;a.destroy=d()}a=a.next}while(a!==s)}}function Va(C){var s=C.ref;if(s!==null){var a=C.stateNode;switch(C.tag){case 5:C=P(a);break;default:C=a}typeof s=="function"?s(C):s.current=C}}function Bm(C,s,a){if(Rn&&typeof Rn.onCommitFiberUnmount=="function")try{Rn.onCommitFiberUnmount(Rs,s)}catch{}switch(s.tag){case 0:case 11:case 14:case 15:if(C=s.updateQueue,C!==null&&(C=C.lastEffect,C!==null)){var d=C=C.next;do{var G=d,f=G.destroy;G=G.tag,f!==void 0&&((G&2)!==0||(G&4)!==0)&&wa(s,a,f),d=d.next}while(d!==C)}break;case 1:if(er(s,a),C=s.stateNode,typeof C.componentWillUnmount=="function")try{C.props=s.memoizedProps,C.state=s.memoizedState,C.componentWillUnmount()}catch(H){Gg(s,a,H)}break;case 5:er(s,a);break;case 4:Mt?wm(C,s,a):Vn&&Vn&&(s=s.stateNode.containerInfo,a=CG(s),sG(s,a))}}function Zm(C,s,a){for(var d=s;;)if(Bm(C,d,a),d.child===null||Mt&&d.tag===4){if(d===s)break;for(;d.sibling===null;){if(d.return===null||d.return===s)return;d=d.return}d.sibling.return=d.return,d=d.sibling}else d.child.return=d,d=d.child}function ym(C){var s=C.alternate;s!==null&&(C.alternate=null,ym(s)),C.child=null,C.deletions=null,C.sibling=null,C.tag===5&&(s=C.stateNode,s!==null&&Ci(s)),C.stateNode=null,C.return=null,C.dependencies=null,C.memoizedProps=null,C.memoizedState=null,C.pendingProps=null,C.stateNode=null,C.updateQueue=null}function fm(C){return C.tag===5||C.tag===3||C.tag===4}function vm(C){e:for(;;){for(;C.sibling===null;){if(C.return===null||fm(C.return))return null;C=C.return}for(C.sibling.return=C.return,C=C.sibling;C.tag!==5&&C.tag!==6&&C.tag!==18;){if(C.flags&2||C.child===null||C.tag===4)continue e;C.child.return=C,C=C.child}if(!(C.flags&2))return C.stateNode}}function Wm(C){if(Mt){e:{for(var s=C.return;s!==null;){if(fm(s))break e;s=s.return}throw Error(i(160))}var a=s;switch(a.tag){case 5:s=a.stateNode,a.flags&32&&(kt(s),a.flags&=-33),a=vm(C),Xa(C,a,s);break;case 3:case 4:s=a.stateNode.containerInfo,a=vm(C),Ra(C,a,s);break;default:throw Error(i(161))}}}function Ra(C,s,a){var d=C.tag;if(d===5||d===6)C=C.stateNode,s?Be(a,C,s):An(a,C);else if(d!==4&&(C=C.child,C!==null))for(Ra(C,s,a),C=C.sibling;C!==null;)Ra(C,s,a),C=C.sibling}function Xa(C,s,a){var d=C.tag;if(d===5||d===6)C=C.stateNode,s?ne(a,C,s):tI(a,C);else if(d!==4&&(C=C.child,C!==null))for(Xa(C,s,a),C=C.sibling;C!==null;)Xa(C,s,a),C=C.sibling}function wm(C,s,a){for(var d=s,G=!1,f,H;;){if(!G){G=d.return;e:for(;;){if(G===null)throw Error(i(160));switch(f=G.stateNode,G.tag){case 5:H=!1;break e;case 3:f=f.containerInfo,H=!0;break e;case 4:f=f.containerInfo,H=!0;break e}G=G.return}G=!0}if(d.tag===5||d.tag===6)Zm(C,d,a),H?it(f,d.stateNode):Ke(f,d.stateNode);else if(d.tag===18)H?zW(f,d.stateNode):kW(f,d.stateNode);else if(d.tag===4){if(d.child!==null){f=d.stateNode.containerInfo,H=!0,d.child.return=d,d=d.child;continue}}else if(Bm(C,d,a),d.child!==null){d.child.return=d,d=d.child;continue}if(d===s)break;for(;d.sibling===null;){if(d.return===null||d.return===s)return;d=d.return,d.tag===4&&(G=!1)}d.sibling.return=d.return,d=d.sibling}}function Ya(C,s){if(Mt){switch(s.tag){case 0:case 11:case 14:case 15:fo(3,s,s.return),MC(3,s),fo(5,s,s.return);return;case 1:return;case 5:var a=s.stateNode;if(a!=null){var d=s.memoizedProps;C=C!==null?C.memoizedProps:d;var G=s.type,f=s.updateQueue;s.updateQueue=null,f!==null&&E(a,f,G,C,d,s)}return;case 6:if(s.stateNode===null)throw Error(i(162));a=s.memoizedProps,KI(s.stateNode,C!==null?C.memoizedProps:a,a);return;case 3:ot&&C!==null&&C.memoizedState.isDehydrated&&aG(s.stateNode.containerInfo);return;case 12:return;case 13:tr(s);return;case 19:tr(s);return;case 17:return}throw Error(i(163))}switch(s.tag){case 0:case 11:case 14:case 15:fo(3,s,s.return),MC(3,s),fo(5,s,s.return);return;case 12:return;case 13:tr(s);return;case 19:tr(s);return;case 3:ot&&C!==null&&C.memoizedState.isDehydrated&&aG(s.stateNode.containerInfo);break;case 22:case 23:return}e:if(Vn){switch(s.tag){case 1:case 5:case 6:break e;case 3:case 4:s=s.stateNode,sG(s.containerInfo,s.pendingChildren);break e}throw Error(i(163))}}function tr(C){var s=C.updateQueue;if(s!==null){C.updateQueue=null;var a=C.stateNode;a===null&&(a=C.stateNode=new hw),s.forEach(function(d){var G=ww.bind(null,C,d);a.has(d)||(a.add(d),d.then(G,G))})}}function Gw(C,s){for(Ie=s;Ie!==null;){s=Ie;var a=s.deletions;if(a!==null)for(var d=0;d<a.length;d++){var G=a[d];try{var f=C;Mt?wm(f,G,s):Zm(f,G,s);var H=G.alternate;H!==null&&(H.return=null),G.return=null}catch(de){Gg(G,s,de)}}if(a=s.child,(s.subtreeFlags&12854)!==0&&a!==null)a.return=s,Ie=a;else for(;Ie!==null;){s=Ie;try{var x=s.flags;if(x&32&&Mt&&kt(s.stateNode),x&512){var O=s.alternate;if(O!==null){var te=O.ref;te!==null&&(typeof te=="function"?te(null):te.current=null)}}if(x&8192)switch(s.tag){case 13:if(s.memoizedState!==null){var ce=s.alternate;(ce===null||ce.memoizedState===null)&&(za=Kt())}break;case 22:var ve=s.memoizedState!==null,be=s.alternate,Ue=be!==null&&be.memoizedState!==null;if(a=s,Mt)e:if(d=a,G=ve,f=null,Mt)for(var he=d;;){if(he.tag===5){if(f===null){f=he;var jt=he.stateNode;G?SI(jt):an(he.stateNode,he.memoizedProps)}}else if(he.tag===6){if(f===null){var Pg=he.stateNode;G?ys(Pg):un(Pg,he.memoizedProps)}}else if((he.tag!==22&&he.tag!==23||he.memoizedState===null||he===d)&&he.child!==null){he.child.return=he,he=he.child;continue}if(he===d)break;for(;he.sibling===null;){if(he.return===null||he.return===d)break e;f===he&&(f=null),he=he.return}f===he&&(f=null),he.sibling.return=he.return,he=he.sibling}if(ve&&!Ue&&(a.mode&1)!==0){Ie=a;for(var Q=a.child;Q!==null;){for(a=Ie=Q;Ie!==null;){d=Ie;var J=d.child;switch(d.tag){case 0:case 11:case 14:case 15:fo(4,d,d.return);break;case 1:er(d,d.return);var U=d.stateNode;if(typeof U.componentWillUnmount=="function"){var Ce=d.return;try{U.props=d.memoizedProps,U.state=d.memoizedState,U.componentWillUnmount()}catch(de){Gg(d,Ce,de)}}break;case 5:er(d,d.return);break;case 22:if(d.memoizedState!==null){Xm(a);continue}}J!==null?(J.return=d,Ie=J):Xm(a)}Q=Q.sibling}}}switch(x&4102){case 2:Wm(s),s.flags&=-3;break;case 6:Wm(s),s.flags&=-3,Ya(s.alternate,s);break;case 4096:s.flags&=-4097;break;case 4100:s.flags&=-4097,Ya(s.alternate,s);break;case 4:Ya(s.alternate,s)}}catch(de){Gg(s,s.return,de)}if(a=s.sibling,a!==null){a.return=s.return,Ie=a;break}Ie=s.return}}}function mw(C,s,a){Ie=C,Vm(C)}function Vm(C,s,a){for(var d=(C.mode&1)!==0;Ie!==null;){var G=Ie,f=G.child;if(G.tag===22&&d){var H=G.memoizedState!==null||$s;if(!H){var x=G.alternate,O=x!==null&&x.memoizedState!==null||yo;x=$s;var te=yo;if($s=H,(yo=O)&&!te)for(Ie=G;Ie!==null;)H=Ie,O=H.child,H.tag===22&&H.memoizedState!==null?Ym(G):O!==null?(O.return=H,Ie=O):Ym(G);for(;f!==null;)Ie=f,Vm(f),f=f.sibling;Ie=G,$s=x,yo=te}Rm(C)}else(G.subtreeFlags&8772)!==0&&f!==null?(f.return=G,Ie=f):Rm(C)}}function Rm(C){for(;Ie!==null;){var s=Ie;if((s.flags&8772)!==0){var a=s.alternate;try{if((s.flags&8772)!==0)switch(s.tag){case 0:case 11:case 15:yo||MC(5,s);break;case 1:var d=s.stateNode;if(s.flags&4&&!yo)if(a===null)d.componentDidMount();else{var G=s.elementType===s.type?a.memoizedProps:hn(s.type,a.memoizedProps);d.componentDidUpdate(G,a.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var f=s.updateQueue;f!==null&&yG(s,f,d);break;case 3:var H=s.updateQueue;if(H!==null){if(a=null,s.child!==null)switch(s.child.tag){case 5:a=P(s.child.stateNode);break;case 1:a=s.child.stateNode}yG(s,H,a)}break;case 5:var x=s.stateNode;a===null&&s.flags&4&&gI(x,s.type,s.memoizedProps,s);break;case 6:break;case 4:break;case 12:break;case 13:if(ot&&s.memoizedState===null){var O=s.alternate;if(O!==null){var te=O.memoizedState;if(te!==null){var ce=te.dehydrated;ce!==null&&FW(ce)}}}break;case 19:case 17:case 21:case 22:case 23:break;default:throw Error(i(163))}yo||s.flags&512&&Va(s)}catch(ve){Gg(s,s.return,ve)}}if(s===C){Ie=null;break}if(a=s.sibling,a!==null){a.return=s.return,Ie=a;break}Ie=s.return}}function Xm(C){for(;Ie!==null;){var s=Ie;if(s===C){Ie=null;break}var a=s.sibling;if(a!==null){a.return=s.return,Ie=a;break}Ie=s.return}}function Ym(C){for(;Ie!==null;){var s=Ie;try{switch(s.tag){case 0:case 11:case 15:var a=s.return;try{MC(4,s)}catch(O){Gg(s,a,O)}break;case 1:var d=s.stateNode;if(typeof d.componentDidMount=="function"){var G=s.return;try{d.componentDidMount()}catch(O){Gg(s,G,O)}}var f=s.return;try{Va(s)}catch(O){Gg(s,f,O)}break;case 5:var H=s.return;try{Va(s)}catch(O){Gg(s,H,O)}}}catch(O){Gg(s,s.return,O)}if(s===C){Ie=null;break}var x=s.sibling;if(x!==null){x.return=s.return,Ie=x;break}Ie=s.return}}var gr=0,nr=1,Ir=2,or=3,ir=4;if(typeof Symbol=="function"&&Symbol.for){var EC=Symbol.for;gr=EC("selector.component"),nr=EC("selector.has_pseudo_class"),Ir=EC("selector.role"),or=EC("selector.test_id"),ir=EC("selector.text")}function Ka(C){var s=RI(C);if(s!=null){if(typeof s.memoizedProps["data-testname"]!="string")throw Error(i(364));return s}if(C=li(C),C===null)throw Error(i(362));return C.stateNode.current}function Sa(C,s){switch(s.$$typeof){case gr:if(C.type===s.value)return!0;break;case nr:e:{s=s.value,C=[C,0];for(var a=0;a<C.length;){var d=C[a++],G=C[a++],f=s[G];if(d.tag!==5||!me(d)){for(;f!=null&&Sa(d,f);)G++,f=s[G];if(G===s.length){s=!0;break e}else for(d=d.child;d!==null;)C.push(d,G),d=d.sibling}}s=!1}return s;case Ir:if(C.tag===5&&ht(C.stateNode,s.value))return!0;break;case ir:if((C.tag===5||C.tag===6)&&(C=le(C),C!==null&&0<=C.indexOf(s.value)))return!0;break;case or:if(C.tag===5&&(C=C.memoizedProps["data-testname"],typeof C=="string"&&C.toLowerCase()===s.value.toLowerCase()))return!0;break;default:throw Error(i(365))}return!1}function Ha(C){switch(C.$$typeof){case gr:return"<"+(S(C.value)||"Unknown")+">";case nr:return":has("+(Ha(C)||"")+")";case Ir:return'[role="'+C.value+'"]';case ir:return'"'+C.value+'"';case or:return'[data-testname="'+C.value+'"]';default:throw Error(i(365))}}function Km(C,s){var a=[];C=[C,0];for(var d=0;d<C.length;){var G=C[d++],f=C[d++],H=s[f];if(G.tag!==5||!me(G)){for(;H!=null&&Sa(G,H);)f++,H=s[f];if(f===s.length)a.push(G);else for(G=G.child;G!==null;)C.push(G,f),G=G.sibling}}return a}function Na(C,s){if(!cn)throw Error(i(363));C=Ka(C),C=Km(C,s),s=[],C=Array.from(C);for(var a=0;a<C.length;){var d=C[a++];if(d.tag===5)me(d)||s.push(d.stateNode);else for(d=d.child;d!==null;)C.push(d),d=d.sibling}return s}var pw=Math.ceil,Cr=l.ReactCurrentDispatcher,Fa=l.ReactCurrentOwner,bt=l.ReactCurrentBatchConfig,Xe=0,ft=null,vt=null,zt=0,Fg=0,pi=HI(0),Vt=0,QC=null,Bi=0,lr=0,ka=0,TC=null,hg=null,za=0,xa=1/0;function Zi(){xa=Kt()+500}var sr=!1,La=null,zI=null,rr=!1,xI=null,cr=0,UC=0,Ja=null,Ar=-1,ar=0;function Ig(){return(Xe&6)!==0?Kt():Ar!==-1?Ar:Ar=Kt()}function LI(C){return(C.mode&1)===0?1:(Xe&2)!==0&&zt!==0?zt&-zt:gw.transition!==null?(ar===0&&(C=Ws,Ws<<=1,(Ws&4194240)===0&&(Ws=64),ar=C),ar):(C=ke,C!==0?C:YI())}function jg(C,s,a){if(50<UC)throw UC=0,Ja=null,Error(i(185));var d=ur(C,s);return d===null?null:(RC(d,s,a),((Xe&2)===0||d!==ft)&&(d===ft&&((Xe&2)===0&&(lr|=s),Vt===4&&JI(d,zt)),bg(d,a),s===1&&Xe===0&&(C.mode&1)===0&&(Zi(),Xs&&Yn())),d)}function ur(C,s){C.lanes|=s;var a=C.alternate;for(a!==null&&(a.lanes|=s),a=C,C=C.return;C!==null;)C.childLanes|=s,a=C.alternate,a!==null&&(a.childLanes|=s),a=C,C=C.return;return a.tag===3?a.stateNode:null}function bg(C,s){var a=C.callbackNode;DW(C,s);var d=Vs(C,C===ft?zt:0);if(d===0)a!==null&&GG(a),C.callbackNode=null,C.callbackPriority=0;else if(s=d&-d,C.callbackPriority!==s){if(a!=null&&GG(a),s===1)C.tag===0?tw(Hm.bind(null,C)):mG(Hm.bind(null,C)),bo?Go(function(){Xe===0&&Yn()}):OA(PA,Yn),a=null;else{switch(bG(d)){case 1:a=PA;break;case 4:a=_W;break;case 16:a=_A;break;case 536870912:a=qW;break;default:a=_A}a=Em(a,Sm.bind(null,C))}C.callbackPriority=s,C.callbackNode=a}}function Sm(C,s){if(Ar=-1,ar=0,(Xe&6)!==0)throw Error(i(327));var a=C.callbackNode;if(wo()&&C.callbackNode!==a)return null;var d=Vs(C,C===ft?zt:0);if(d===0)return null;if((d&30)!==0||(d&C.expiredLanes)!==0||s)s=dr(C,d);else{s=d;var G=Xe;Xe|=2;var f=km();(ft!==C||zt!==s)&&(Zi(),vo(C,s));do try{yw();break}catch(x){Fm(C,x)}while(1);ea(),Cr.current=f,Xe=G,vt!==null?s=0:(ft=null,zt=0,s=Vt)}if(s!==0){if(s===2&&(G=UA(C),G!==0&&(d=G,s=Ma(C,G))),s===1)throw a=QC,vo(C,0),JI(C,d),bg(C,Kt()),a;if(s===6)JI(C,d);else{if(G=C.current.alternate,(d&30)===0&&!Bw(G)&&(s=dr(C,d),s===2&&(f=UA(C),f!==0&&(d=f,s=Ma(C,f))),s===1))throw a=QC,vo(C,0),JI(C,d),bg(C,Kt()),a;switch(C.finishedWork=G,C.finishedLanes=d,s){case 0:case 1:throw Error(i(345));case 2:Wo(C,hg);break;case 3:if(JI(C,d),(d&130023424)===d&&(s=za+500-Kt(),10<s)){if(Vs(C,0)!==0)break;if(G=C.suspendedLanes,(G&d)!==d){Ig(),C.pingedLanes|=C.suspendedLanes&G;break}C.timeoutHandle=dt(Wo.bind(null,C,hg),s);break}Wo(C,hg);break;case 4:if(JI(C,d),(d&4194240)===d)break;for(s=C.eventTimes,G=-1;0<d;){var H=31-dn(d);f=1<<H,H=s[H],H>G&&(G=H),d&=~f}if(d=G,d=Kt()-d,d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3e3>d?3e3:4320>d?4320:1960*pw(d/1960))-d,10<d){C.timeoutHandle=dt(Wo.bind(null,C,hg),d);break}Wo(C,hg);break;case 5:Wo(C,hg);break;default:throw Error(i(329))}}}return bg(C,Kt()),C.callbackNode===a?Sm.bind(null,C):null}function Ma(C,s){var a=TC;return C.current.memoizedState.isDehydrated&&(vo(C,s).flags|=256),C=dr(C,s),C!==2&&(s=hg,hg=a,s!==null&&Ea(s)),C}function Ea(C){hg===null?hg=C:hg.push.apply(hg,C)}function Bw(C){for(var s=C;;){if(s.flags&16384){var a=s.updateQueue;if(a!==null&&(a=a.stores,a!==null))for(var d=0;d<a.length;d++){var G=a[d],f=G.getSnapshot;G=G.value;try{if(!Xn(f(),G))return!1}catch{return!1}}}if(a=s.child,s.subtreeFlags&16384&&a!==null)a.return=s,s=a;else{if(s===C)break;for(;s.sibling===null;){if(s.return===null||s.return===C)return!0;s=s.return}s.sibling.return=s.return,s=s.sibling}}return!0}function JI(C,s){for(s&=~ka,s&=~lr,C.suspendedLanes|=s,C.pingedLanes&=~s,C=C.expirationTimes;0<s;){var a=31-dn(s),d=1<<a;C[a]=-1,s&=~d}}function Hm(C){if((Xe&6)!==0)throw Error(i(327));wo();var s=Vs(C,0);if((s&1)===0)return bg(C,Kt()),null;var a=dr(C,s);if(C.tag!==0&&a===2){var d=UA(C);d!==0&&(s=d,a=Ma(C,d))}if(a===1)throw a=QC,vo(C,0),JI(C,s),bg(C,Kt()),a;if(a===6)throw Error(i(345));return C.finishedWork=C.current.alternate,C.finishedLanes=s,Wo(C,hg),bg(C,Kt()),null}function Nm(C){xI!==null&&xI.tag===0&&(Xe&6)===0&&wo();var s=Xe;Xe|=1;var a=bt.transition,d=ke;try{if(bt.transition=null,ke=1,C)return C()}finally{ke=d,bt.transition=a,Xe=s,(Xe&6)===0&&Yn()}}function Qa(){Fg=pi.current,_e(pi)}function vo(C,s){C.finishedWork=null,C.finishedLanes=0;var a=C.timeoutHandle;if(a!==$n&&(C.timeoutHandle=$n,ag(a)),vt!==null)for(a=vt.return;a!==null;){var d=a;switch(Ca(d),d.tag){case 1:d=d.type.childContextTypes,d!=null&&fs();break;case 3:Gi(),_e(ug),_e(Qt),ua();break;case 5:Aa(d);break;case 4:Gi();break;case 13:_e(Ct);break;case 19:_e(Ct);break;case 10:ta(d.type._context);break;case 22:case 23:Qa()}a=a.return}if(ft=C,vt=C=MI(C.current,null),zt=Fg=s,Vt=0,QC=null,ka=lr=Bi=0,hg=TC=null,Kn!==null){for(s=0;s<Kn.length;s++)if(a=Kn[s],d=a.interleaved,d!==null){a.interleaved=null;var G=d.next,f=a.pending;if(f!==null){var H=f.next;f.next=G,d.next=H}a.pending=d}Kn=null}return C}function Fm(C,s){do{var a=vt;try{if(ea(),Js.current=Ds,Ms){for(var d=At.memoizedState;d!==null;){var G=d.queue;G!==null&&(G.pending=null),d=d.next}Ms=!1}if(mi=0,St=Tt=At=null,NC=!1,FC=0,Fa.current=null,a===null||a.return===null){Vt=1,QC=s,vt=null;break}e:{var f=C,H=a.return,x=a,O=s;if(s=zt,x.flags|=32768,O!==null&&typeof O=="object"&&typeof O.then=="function"){var te=O,ce=x,ve=ce.tag;if((ce.mode&1)===0&&(ve===0||ve===11||ve===15)){var be=ce.alternate;be?(ce.updateQueue=be.updateQueue,ce.memoizedState=be.memoizedState,ce.lanes=be.lanes):(ce.updateQueue=null,ce.memoizedState=null)}var Ue=nm(H);if(Ue!==null){Ue.flags&=-257,Im(Ue,H,x,f,s),Ue.mode&1&&gm(f,te,s),s=Ue,O=te;var he=s.updateQueue;if(he===null){var jt=new Set;jt.add(O),s.updateQueue=jt}else he.add(O);break e}else{if((s&1)===0){gm(f,te,s),Ta();break e}O=Error(i(426))}}else if(tt&&x.mode&1){var Pg=nm(H);if(Pg!==null){(Pg.flags&65536)===0&&(Pg.flags|=256),Im(Pg,H,x,f,s),ra(O);break e}}f=O,Vt!==4&&(Vt=2),TC===null?TC=[f]:TC.push(f),O=Ba(O,x),x=H;do{switch(x.tag){case 3:x.flags|=65536,s&=-s,x.lanes|=s;var Q=em(x,O,s);ZG(x,Q);break e;case 1:f=O;var J=x.type,U=x.stateNode;if((x.flags&128)===0&&(typeof J.getDerivedStateFromError=="function"||U!==null&&typeof U.componentDidCatch=="function"&&(zI===null||!zI.has(U)))){x.flags|=65536,s&=-s,x.lanes|=s;var Ce=tm(x,f,s);ZG(x,Ce);break e}}x=x.return}while(x!==null)}xm(a)}catch(de){s=de,vt===a&&a!==null&&(vt=a=a.return);continue}break}while(1)}function km(){var C=Cr.current;return Cr.current=Ds,C===null?Ds:C}function Ta(){(Vt===0||Vt===3||Vt===2)&&(Vt=4),ft===null||(Bi&268435455)===0&&(lr&268435455)===0||JI(ft,zt)}function dr(C,s){var a=Xe;Xe|=2;var d=km();ft===C&&zt===s||vo(C,s);do try{Zw();break}catch(G){Fm(C,G)}while(1);if(ea(),Xe=a,Cr.current=d,vt!==null)throw Error(i(261));return ft=null,zt=0,Vt}function Zw(){for(;vt!==null;)zm(vt)}function yw(){for(;vt!==null&&!OW();)zm(vt)}function zm(C){var s=Mm(C.alternate,C,Fg);C.memoizedProps=C.pendingProps,s===null?xm(C):vt=s,Fa.current=null}function xm(C){var s=C;do{var a=s.alternate;if(C=s.return,(s.flags&32768)===0){if(a=Aw(a,s,Fg),a!==null){vt=a;return}}else{if(a=dw(a,s),a!==null){a.flags&=32767,vt=a;return}if(C!==null)C.flags|=32768,C.subtreeFlags=0,C.deletions=null;else{Vt=6,vt=null;return}}if(s=s.sibling,s!==null){vt=s;return}vt=s=C}while(s!==null);Vt===0&&(Vt=5)}function Wo(C,s){var a=ke,d=bt.transition;try{bt.transition=null,ke=1,fw(C,s,a)}finally{bt.transition=d,ke=a}return null}function fw(C,s,a){do wo();while(xI!==null);if((Xe&6)!==0)throw Error(i(327));var d=C.finishedWork,G=C.finishedLanes;if(d===null)return null;if(C.finishedWork=null,C.finishedLanes=0,d===C.current)throw Error(i(177));C.callbackNode=null,C.callbackPriority=0;var f=d.lanes|d.childLanes;if(jW(C,f),C===ft&&(vt=ft=null,zt=0),(d.subtreeFlags&2064)===0&&(d.flags&2064)===0||rr||(rr=!0,Em(_A,function(){return wo(),null})),f=(d.flags&15990)!==0,(d.subtreeFlags&15990)!==0||f){f=bt.transition,bt.transition=null;var H=ke;ke=1;var x=Xe;Xe|=4,Fa.current=null,bw(C,d),Gw(C,d),ge(C.containerInfo),C.current=d,mw(d),PW(),Xe=x,ke=H,bt.transition=f}else C.current=d;if(rr&&(rr=!1,xI=C,cr=G),f=C.pendingLanes,f===0&&(zI=null),$W(d.stateNode),bg(C,Kt()),s!==null)for(a=C.onRecoverableError,d=0;d<s.length;d++)a(s[d]);if(sr)throw sr=!1,C=La,La=null,C;return(cr&1)!==0&&C.tag!==0&&wo(),f=C.pendingLanes,(f&1)!==0?C===Ja?UC++:(UC=0,Ja=C):UC=0,Yn(),null}function wo(){if(xI!==null){var C=bG(cr),s=bt.transition,a=ke;try{if(bt.transition=null,ke=16>C?16:C,xI===null)var d=!1;else{if(C=xI,xI=null,cr=0,(Xe&6)!==0)throw Error(i(331));var G=Xe;for(Xe|=4,Ie=C.current;Ie!==null;){var f=Ie,H=f.child;if((Ie.flags&16)!==0){var x=f.deletions;if(x!==null){for(var O=0;O<x.length;O++){var te=x[O];for(Ie=te;Ie!==null;){var ce=Ie;switch(ce.tag){case 0:case 11:case 15:fo(8,ce,f)}var ve=ce.child;if(ve!==null)ve.return=ce,Ie=ve;else for(;Ie!==null;){ce=Ie;var be=ce.sibling,Ue=ce.return;if(ym(ce),ce===te){Ie=null;break}if(be!==null){be.return=Ue,Ie=be;break}Ie=Ue}}}var he=f.alternate;if(he!==null){var jt=he.child;if(jt!==null){he.child=null;do{var Pg=jt.sibling;jt.sibling=null,jt=Pg}while(jt!==null)}}Ie=f}}if((f.subtreeFlags&2064)!==0&&H!==null)H.return=f,Ie=H;else e:for(;Ie!==null;){if(f=Ie,(f.flags&2048)!==0)switch(f.tag){case 0:case 11:case 15:fo(9,f,f.return)}var Q=f.sibling;if(Q!==null){Q.return=f.return,Ie=Q;break e}Ie=f.return}}var J=C.current;for(Ie=J;Ie!==null;){H=Ie;var U=H.child;if((H.subtreeFlags&2064)!==0&&U!==null)U.return=H,Ie=U;else e:for(H=J;Ie!==null;){if(x=Ie,(x.flags&2048)!==0)try{switch(x.tag){case 0:case 11:case 15:MC(9,x)}}catch(de){Gg(x,x.return,de)}if(x===H){Ie=null;break e}var Ce=x.sibling;if(Ce!==null){Ce.return=x.return,Ie=Ce;break e}Ie=x.return}}if(Xe=G,Yn(),Rn&&typeof Rn.onPostCommitFiberRoot=="function")try{Rn.onPostCommitFiberRoot(Rs,C)}catch{}d=!0}return d}finally{ke=a,bt.transition=s}}return!1}function Lm(C,s,a){s=Ba(a,s),s=em(C,s,1),kI(C,s),s=Ig(),C=ur(C,1),C!==null&&(RC(C,1,s),bg(C,s))}function Gg(C,s,a){if(C.tag===3)Lm(C,C,a);else for(;s!==null;){if(s.tag===3){Lm(s,C,a);break}else if(s.tag===1){var d=s.stateNode;if(typeof s.type.getDerivedStateFromError=="function"||typeof d.componentDidCatch=="function"&&(zI===null||!zI.has(d))){C=Ba(a,C),C=tm(s,C,1),kI(s,C),C=Ig(),s=ur(s,1),s!==null&&(RC(s,1,C),bg(s,C));break}}s=s.return}}function vw(C,s,a){var d=C.pingCache;d!==null&&d.delete(s),s=Ig(),C.pingedLanes|=C.suspendedLanes&a,ft===C&&(zt&a)===a&&(Vt===4||Vt===3&&(zt&130023424)===zt&&500>Kt()-za?vo(C,0):ka|=a),bg(C,s)}function Jm(C,s){s===0&&((C.mode&1)===0?s=1:(s=ws,ws<<=1,(ws&130023424)===0&&(ws=4194304)));var a=Ig();C=ur(C,s),C!==null&&(RC(C,s,a),bg(C,a))}function Ww(C){var s=C.memoizedState,a=0;s!==null&&(a=s.retryLane),Jm(C,a)}function ww(C,s){var a=0;switch(C.tag){case 13:var d=C.stateNode,G=C.memoizedState;G!==null&&(a=G.retryLane);break;case 19:d=C.stateNode;break;default:throw Error(i(314))}d!==null&&d.delete(s),Jm(C,a)}var Mm;Mm=function(C,s,a){if(C!==null)if(C.memoizedProps!==s.pendingProps||ug.current)Ng=!0;else{if((C.lanes&a)===0&&(s.flags&128)===0)return Ng=!1,uw(C,s,a);Ng=(C.flags&131072)!==0}else Ng=!1,tt&&(s.flags&1048576)!==0&&VG(s,zs,s.index);switch(s.lanes=0,s.tag){case 2:var d=s.type;C!==null&&(C.alternate=null,s.alternate=null,s.flags|=2),C=s.pendingProps;var G=ri(s,Qt.current);Ai(s,a),G=ha(null,s,d,C,G,a);var f=ba();return s.flags|=1,typeof G=="object"&&G!==null&&typeof G.render=="function"&&G.$$typeof===void 0?(s.tag=1,s.memoizedState=null,s.updateQueue=null,dg(d)?(f=!0,vs(s)):f=!1,s.memoizedState=G.state!==null&&G.state!==void 0?G.state:null,na(s),G.updater=Fs,s.stateNode=G,G._reactInternals=s,oa(s,d,C,a),s=fa(null,s,d,!0,f,a)):(s.tag=0,tt&&f&&ia(s),ng(null,s,G,a),s=s.child),s;case 16:d=s.elementType;e:{switch(C!==null&&(C.alternate=null,s.alternate=null,s.flags|=2),C=s.pendingProps,G=d._init,d=G(d._payload),s.type=d,G=s.tag=Rw(d),C=hn(d,C),G){case 0:s=ya(null,s,d,C,a);break e;case 1:s=Am(null,s,d,C,a);break e;case 11:s=Cm(null,s,d,C,a);break e;case 14:s=lm(null,s,d,hn(d.type,C),a);break e}throw Error(i(306,d,""))}return s;case 0:return d=s.type,G=s.pendingProps,G=s.elementType===d?G:hn(d,G),ya(C,s,d,G,a);case 1:return d=s.type,G=s.pendingProps,G=s.elementType===d?G:hn(d,G),Am(C,s,d,G,a);case 3:e:{if(am(s),C===null)throw Error(i(387));d=s.pendingProps,f=s.memoizedState,G=f.element,BG(C,s),Ns(s,d,null,a);var H=s.memoizedState;if(d=H.element,ot&&f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:H.cache,transitions:H.transitions},s.updateQueue.baseState=f,s.memoizedState=f,s.flags&256){G=Error(i(423)),s=um(C,s,d,a,G);break e}else if(d!==G){G=Error(i(424)),s=um(C,s,d,a,G);break e}else for(ot&&(Hg=XW(s.stateNode.containerInfo),Sg=s,tt=!0,bn=null,XC=!1),a=HG(s,null,d,a),s.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(di(),d===G){s=lI(C,s,a);break e}ng(C,s,d,a)}s=s.child}return s;case 5:return NG(s),C===null&&sa(s),d=s.type,G=s.pendingProps,f=C!==null?C.memoizedProps:null,H=G.children,et(d,G)?H=null:f!==null&&et(d,f)&&(s.flags|=32),cm(C,s),ng(C,s,H,a),s.child;case 6:return C===null&&sa(s),null;case 13:return dm(C,s,a);case 4:return ca(s,s.stateNode.containerInfo),d=s.pendingProps,C===null?s.child=hi(s,null,d,a):ng(C,s,d,a),s.child;case 11:return d=s.type,G=s.pendingProps,G=s.elementType===d?G:hn(d,G),Cm(C,s,d,G,a);case 7:return ng(C,s,s.pendingProps,a),s.child;case 8:return ng(C,s,s.pendingProps.children,a),s.child;case 12:return ng(C,s,s.pendingProps.children,a),s.child;case 10:e:{if(d=s.type._context,G=s.pendingProps,f=s.memoizedProps,H=G.value,pG(s,d,H),f!==null)if(Xn(f.value,H)){if(f.children===G.children&&!ug.current){s=lI(C,s,a);break e}}else for(f=s.child,f!==null&&(f.return=s);f!==null;){var x=f.dependencies;if(x!==null){H=f.child;for(var O=x.firstContext;O!==null;){if(O.context===d){if(f.tag===1){O=II(-1,a&-a),O.tag=2;var te=f.updateQueue;if(te!==null){te=te.shared;var ce=te.pending;ce===null?O.next=O:(O.next=ce.next,ce.next=O),te.pending=O}}f.lanes|=a,O=f.alternate,O!==null&&(O.lanes|=a),ga(f.return,a,s),x.lanes|=a;break}O=O.next}}else if(f.tag===10)H=f.type===s.type?null:f.child;else if(f.tag===18){if(H=f.return,H===null)throw Error(i(341));H.lanes|=a,x=H.alternate,x!==null&&(x.lanes|=a),ga(H,a,s),H=f.sibling}else H=f.child;if(H!==null)H.return=f;else for(H=f;H!==null;){if(H===s){H=null;break}if(f=H.sibling,f!==null){f.return=H.return,H=f;break}H=H.return}f=H}ng(C,s,G.children,a),s=s.child}return s;case 9:return G=s.type,d=s.pendingProps.children,Ai(s,a),G=Eg(G),d=d(G),s.flags|=1,ng(C,s,d,a),s.child;case 14:return d=s.type,G=hn(d,s.pendingProps),G=hn(d.type,G),lm(C,s,d,G,a);case 15:return sm(C,s,s.type,s.pendingProps,a);case 17:return d=s.type,G=s.pendingProps,G=s.elementType===d?G:hn(d,G),C!==null&&(C.alternate=null,s.alternate=null,s.flags|=2),s.tag=1,dg(d)?(C=!0,vs(s)):C=!1,Ai(s,a),WG(s,d,G),oa(s,d,G,a),fa(null,s,d,!0,C,a);case 19:return mm(C,s,a);case 22:return rm(C,s,a)}throw Error(i(156,s.tag))};function Em(C,s){return OA(C,s)}function Vw(C,s,a,d){this.tag=C,this.key=a,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=s,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=d,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Og(C,s,a,d){return new Vw(C,s,a,d)}function Ua(C){return C=C.prototype,!(!C||!C.isReactComponent)}function Rw(C){if(typeof C=="function")return Ua(C)?1:0;if(C!=null){if(C=C.$$typeof,C===Z)return 11;if(C===m)return 14}return 2}function MI(C,s){var a=C.alternate;return a===null?(a=Og(C.tag,s,C.key,C.mode),a.elementType=C.elementType,a.type=C.type,a.stateNode=C.stateNode,a.alternate=C,C.alternate=a):(a.pendingProps=s,a.type=C.type,a.flags=0,a.subtreeFlags=0,a.deletions=null),a.flags=C.flags&14680064,a.childLanes=C.childLanes,a.lanes=C.lanes,a.child=C.child,a.memoizedProps=C.memoizedProps,a.memoizedState=C.memoizedState,a.updateQueue=C.updateQueue,s=C.dependencies,a.dependencies=s===null?null:{lanes:s.lanes,firstContext:s.firstContext},a.sibling=C.sibling,a.index=C.index,a.ref=C.ref,a}function hr(C,s,a,d,G,f){var H=2;if(d=C,typeof C=="function")Ua(C)&&(H=1);else if(typeof C=="string")H=5;else e:switch(C){case A:return Vo(a.children,G,f,s);case u:H=8,G|=8;break;case h:return C=Og(12,a,s,G|2),C.elementType=h,C.lanes=f,C;case v:return C=Og(13,a,s,G),C.elementType=v,C.lanes=f,C;case y:return C=Og(19,a,s,G),C.elementType=y,C.lanes=f,C;case w:return br(a,G,f,s);default:if(typeof C=="object"&&C!==null)switch(C.$$typeof){case b:H=10;break e;case p:H=9;break e;case Z:H=11;break e;case m:H=14;break e;case B:H=16,d=null;break e}throw Error(i(130,C==null?C:typeof C,""))}return s=Og(H,a,s,G),s.elementType=C,s.type=d,s.lanes=f,s}function Vo(C,s,a,d){return C=Og(7,C,d,s),C.lanes=a,C}function br(C,s,a,d){return C=Og(22,C,d,s),C.elementType=w,C.lanes=a,C.stateNode={},C}function Da(C,s,a){return C=Og(6,C,null,s),C.lanes=a,C}function ja(C,s,a){return s=Og(4,C.children!==null?C.children:[],C.key,s),s.lanes=a,s.stateNode={containerInfo:C.containerInfo,pendingChildren:null,implementation:C.implementation},s}function Xw(C,s,a,d,G){this.tag=s,this.containerInfo=C,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=$n,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=DA(0),this.expirationTimes=DA(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=DA(0),this.identifierPrefix=d,this.onRecoverableError=G,ot&&(this.mutableSourceEagerHydrationData=null)}function Qm(C,s,a,d,G,f,H,x,O){return C=new Xw(C,s,a,x,O),s===1?(s=1,f===!0&&(s|=8)):s=0,f=Og(3,null,null,s),C.current=f,f.stateNode=C,f.memoizedState={element:d,isDehydrated:a,cache:null,transitions:null},na(f),C}function Tm(C){if(!C)return NI;C=C._reactInternals;e:{if(k(C)!==C||C.tag!==1)throw Error(i(170));var s=C;do{switch(s.tag){case 3:s=s.stateNode.context;break e;case 1:if(dg(s.type)){s=s.stateNode.__reactInternalMemoizedMergedChildContext;break e}}s=s.return}while(s!==null);throw Error(i(171))}if(C.tag===1){var a=C.type;if(dg(a))return dG(C,a,s)}return s}function Um(C){var s=C._reactInternals;if(s===void 0)throw typeof C.render=="function"?Error(i(188)):(C=Object.keys(C).join(","),Error(i(268,C)));return C=M(s),C===null?null:C.stateNode}function Dm(C,s){if(C=C.memoizedState,C!==null&&C.dehydrated!==null){var a=C.retryLane;C.retryLane=a!==0&&a<s?a:s}}function Oa(C,s){Dm(C,s),(C=C.alternate)&&Dm(C,s)}function Yw(C){return C=M(C),C===null?null:C.stateNode}function Kw(){return null}return g.attemptContinuousHydration=function(C){if(C.tag===13){var s=Ig();jg(C,134217728,s),Oa(C,134217728)}},g.attemptHydrationAtCurrentPriority=function(C){if(C.tag===13){var s=Ig(),a=LI(C);jg(C,a,s),Oa(C,a)}},g.attemptSynchronousHydration=function(C){switch(C.tag){case 3:var s=C.stateNode;if(s.current.memoizedState.isDehydrated){var a=VC(s.pendingLanes);a!==0&&(jA(s,a|1),bg(s,Kt()),(Xe&6)===0&&(Zi(),Yn()))}break;case 13:var d=Ig();Nm(function(){return jg(C,1,d)}),Oa(C,1)}},g.batchedUpdates=function(C,s){var a=Xe;Xe|=1;try{return C(s)}finally{Xe=a,Xe===0&&(Zi(),Xs&&Yn())}},g.createComponentSelector=function(C){return{$$typeof:gr,value:C}},g.createContainer=function(C,s,a,d,G,f,H){return Qm(C,s,!1,null,a,d,G,f,H)},g.createHasPseudoClassSelector=function(C){return{$$typeof:nr,value:C}},g.createHydrationContainer=function(C,s,a,d,G,f,H,x,O){return C=Qm(a,d,!0,C,G,f,H,x,O),C.context=Tm(null),a=C.current,d=Ig(),G=LI(a),f=II(d,G),f.callback=s!=null?s:null,kI(a,f),C.current.lanes=G,RC(C,G,d),bg(C,d),C},g.createPortal=function(C,s,a){var d=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:c,key:d==null?null:""+d,children:C,containerInfo:s,implementation:a}},g.createRoleSelector=function(C){return{$$typeof:Ir,value:C}},g.createTestNameSelector=function(C){return{$$typeof:or,value:C}},g.createTextSelector=function(C){return{$$typeof:ir,value:C}},g.deferredUpdates=function(C){var s=ke,a=bt.transition;try{return bt.transition=null,ke=16,C()}finally{ke=s,bt.transition=a}},g.discreteUpdates=function(C,s,a,d,G){var f=ke,H=bt.transition;try{return bt.transition=null,ke=1,C(s,a,d,G)}finally{ke=f,bt.transition=H,Xe===0&&Zi()}},g.findAllNodes=Na,g.findBoundingRects=function(C,s){if(!cn)throw Error(i(363));s=Na(C,s),C=[];for(var a=0;a<s.length;a++)C.push(vC(s[a]));for(s=C.length-1;0<s;s--){a=C[s];for(var d=a.x,G=d+a.width,f=a.y,H=f+a.height,x=s-1;0<=x;x--)if(s!==x){var O=C[x],te=O.x,ce=te+O.width,ve=O.y,be=ve+O.height;if(d>=te&&f>=ve&&G<=ce&&H<=be){C.splice(s,1);break}else if(d!==te||a.width!==O.width||be<f||ve>H){if(!(f!==ve||a.height!==O.height||ce<d||te>G)){te>d&&(O.width+=te-d,O.x=d),ce<G&&(O.width=G-te),C.splice(s,1);break}}else{ve>f&&(O.height+=ve-f,O.y=f),be<H&&(O.height=H-ve),C.splice(s,1);break}}}return C},g.findHostInstance=Um,g.findHostInstanceWithNoPortals=function(C){return C=z(C),C=C!==null?F(C):null,C===null?null:C.stateNode},g.findHostInstanceWithWarning=function(C){return Um(C)},g.flushControlled=function(C){var s=Xe;Xe|=1;var a=bt.transition,d=ke;try{bt.transition=null,ke=1,C()}finally{ke=d,bt.transition=a,Xe=s,Xe===0&&(Zi(),Yn())}},g.flushPassiveEffects=wo,g.flushSync=Nm,g.focusWithin=function(C,s){if(!cn)throw Error(i(363));for(C=Ka(C),s=Km(C,s),s=Array.from(s),C=0;C<s.length;){var a=s[C++];if(!me(a)){if(a.tag===5&&Yt(a.stateNode))return!0;for(a=a.child;a!==null;)s.push(a),a=a.sibling}}return!1},g.getCurrentUpdatePriority=function(){return ke},g.getFindAllNodesFailureDescription=function(C,s){if(!cn)throw Error(i(363));var a=0,d=[];C=[Ka(C),0];for(var G=0;G<C.length;){var f=C[G++],H=C[G++],x=s[H];if((f.tag!==5||!me(f))&&(Sa(f,x)&&(d.push(Ha(x)),H++,H>a&&(a=H)),H<s.length))for(f=f.child;f!==null;)C.push(f,H),f=f.sibling}if(a<s.length){for(C=[];a<s.length;a++)C.push(Ha(s[a]));return`findAllNodes was able to match part of the selector:
|
|
55
|
+
`+(d.join(" > ")+`
|
|
56
|
+
|
|
57
|
+
No matching component was found for:
|
|
58
|
+
`)+C.join(" > ")}return null},g.getPublicRootInstance=function(C){if(C=C.current,!C.child)return null;switch(C.child.tag){case 5:return P(C.child.stateNode);default:return C.child.stateNode}},g.injectIntoDevTools=function(C){if(C={bundleType:C.bundleType,version:C.version,rendererPackageName:C.rendererPackageName,rendererConfig:C.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:l.ReactCurrentDispatcher,findHostInstanceByFiber:Yw,findFiberByHostInstance:C.findFiberByHostInstance||Kw,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.0.0-fc46dba67-20220329"},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__=="undefined")C=!1;else{var s=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(s.isDisabled||!s.supportsFiber)C=!0;else{try{Rs=s.inject(C),Rn=s}catch{}C=!!s.checkDCE}}return C},g.isAlreadyRendering=function(){return!1},g.observeVisibleRects=function(C,s,a,d){if(!cn)throw Error(i(363));C=Na(C,s);var G=Et(C,a,d).disconnect;return{disconnect:function(){G()}}},g.registerMutableSourceForHydration=function(C,s){var a=s._getVersion;a=a(s._source),C.mutableSourceEagerHydrationData==null?C.mutableSourceEagerHydrationData=[s,a]:C.mutableSourceEagerHydrationData.push(s,a)},g.runWithPriority=function(C,s){var a=ke;try{return ke=C,s()}finally{ke=a}},g.shouldError=function(){return null},g.shouldSuspend=function(){return!1},g.updateContainer=function(C,s,a,d){var G=s.current,f=Ig(),H=LI(G);return a=Tm(a),s.context===null?s.context=a:s.pendingContext=a,s=II(f,H),s.payload={element:C},d=d===void 0?null:d,d!==null&&(s.callback=d),kI(G,s),C=jg(G,H,f),C!==null&&Hs(C,G,H),H},g};zf.exports=tY;var gY=zf.exports;function xf(t,e,g=(n,I)=>n===I){if(t===e)return!0;if(!t||!e)return!1;const n=t.length;if(e.length!==n)return!1;for(let I=0;I<n;I++)if(!g(t[I],e[I]))return!1;return!0}const uI=[];function Lf(t,e,g=!1,n={}){for(const o of uI)if(xf(e,o.keys,o.equal)){if(g)return;if(Object.prototype.hasOwnProperty.call(o,"error"))throw o.error;if(Object.prototype.hasOwnProperty.call(o,"response"))return o.response;if(!g)throw o.promise}const I={keys:e,equal:n.equal,promise:t(...e).then(o=>I.response=o).then(()=>{n.lifespan&&n.lifespan>0&&setTimeout(()=>{const o=uI.indexOf(I);o!==-1&&uI.splice(o,1)},n.lifespan)}).catch(o=>I.error=o)};if(uI.push(I),!g)throw I.promise}const nY=(t,e,g)=>Lf(t,e,!1,g),IY=(t,e,g)=>void Lf(t,e,!0,g),oY=t=>{if(t===void 0||t.length===0)uI.splice(0,uI.length);else{const e=uI.find(g=>xf(t,g.keys,g.equal));if(e){const g=uI.indexOf(e);g!==-1&&uI.splice(g,1)}}},Jf=t=>t&&t.isOrthographicCamera,iY=typeof window=="undefined"||!window.navigator||/ServerSideRendering|^Deno\//.test(window.navigator.userAgent),us=iY?W.exports.useEffect:W.exports.useLayoutEffect;function Mf(t){const e=W.exports.useRef(t);return us(()=>void(e.current=t),[t]),e}function CY({set:t}){return us(()=>(t(new Promise(()=>null)),()=>t(!1)),[t]),null}class Ef extends W.exports.Component{constructor(...e){super(...e);this.state={error:!1}}componentDidCatch(e){this.props.set(e)}render(){return this.state.error?null:this.props.children}}Ef.getDerivedStateFromError=()=>({error:!0});const Qf="__default",lY=t=>t&&!!t.memoized&&!!t.changes;function Tf(t){return Array.isArray(t)?Math.min(Math.max(t[0],window.devicePixelRatio),t[1]):t}const Jr=t=>{var e;return(e=t.__r3f)==null?void 0:e.root.getState()},nt={obj:t=>t===Object(t)&&!nt.arr(t)&&typeof t!="function",fun:t=>typeof t=="function",str:t=>typeof t=="string",num:t=>typeof t=="number",boo:t=>typeof t=="boolean",und:t=>t===void 0,arr:t=>Array.isArray(t),equ(t,e,{arrays:g="shallow",objects:n="reference",strict:I=!0}={}){if(typeof t!=typeof e||!!t!=!!e)return!1;if(nt.str(t)||nt.num(t))return t===e;const o=nt.obj(t);if(o&&n==="reference")return t===e;const i=nt.arr(t);if(i&&g==="reference")return t===e;if((i||o)&&t===e)return!0;let l;for(l in t)if(!(l in e))return!1;for(l in I?e:t)if(t[l]!==e[l])return!1;if(nt.und(l)){if(i&&t.length===0&&e.length===0||o&&Object.keys(t).length===0&&Object.keys(e).length===0)return!0;if(t!==e)return!1}return!0}};function sY(t){const e={nodes:{},materials:{}};return t&&t.traverse(g=>{g.name&&(e.nodes[g.name]=g),g.material&&!e.materials[g.material.name]&&(e.materials[g.material.name]=g.material)}),e}function rY(t){t.dispose&&t.type!=="Scene"&&t.dispose();for(const e in t)e.dispose==null||e.dispose(),delete t[e]}function Si(t,e){const g=t;return(e!=null&&e.primitive||!g.__r3f)&&(g.__r3f=_({type:"",root:null,previousAttach:null,memoizedProps:{},eventCount:0,handlers:{},objects:[],parent:null},e)),t}function $d(t,e){let g=t;if(e.includes("-")){const n=e.split("-"),I=n.pop();return g=n.reduce((o,i)=>o[i],t),{target:g,key:I}}else return{target:g,key:e}}const uB=/-\d+$/;function vu(t,e,g){if(nt.str(g)){if(uB.test(g)){const o=g.replace(uB,""),{target:i,key:l}=$d(t,o);Array.isArray(i[l])||(i[l]=[])}const{target:n,key:I}=$d(t,g);e.__r3f.previousAttach=n[I],n[I]=e}else e.__r3f.previousAttach=g(t,e)}function dB(t,e,g){var n,I;if(nt.str(g)){const{target:o,key:i}=$d(t,g);o[i]=e.__r3f.previousAttach}else(n=e.__r3f)==null||n.previousAttach==null||n.previousAttach(t,e);(I=e.__r3f)==null||delete I.previousAttach}function Uf(t,A,h={},c=!1){var u=A,{children:e,key:g,ref:n}=u,I=ye(u,["children","key","ref"]);var b=h,{children:o,key:i,ref:l}=b,r=ye(b,["children","key","ref"]);var p;const Z=(p=t==null?void 0:t.__r3f)!=null?p:{},v=Object.entries(I),y=[];if(c){const B=Object.keys(r);for(let w=0;w<B.length;w++)I.hasOwnProperty(B[w])||v.unshift([B[w],Qf+"remove"])}v.forEach(([B,w])=>{var X;if((X=t.__r3f)!=null&&X.primitive&&B==="object"||nt.equ(w,r[B]))return;if(/^on(Pointer|Click|DoubleClick|ContextMenu|Wheel)/.test(B))return y.push([B,w,!0,[]]);let R=[];B.includes("-")&&(R=B.split("-")),y.push([B,w,!1,R])});const m=_({},I);return Z.memoizedProps&&Z.memoizedProps.args&&(m.args=Z.memoizedProps.args),Z.memoizedProps&&Z.memoizedProps.attach&&(m.attach=Z.memoizedProps.attach),{memoized:m,changes:y}}function Wu(t,e){var g,n;const I=(g=t==null?void 0:t.__r3f)!=null?g:{},o=I.root,i=(n=o==null||o.getState==null?void 0:o.getState())!=null?n:{},{memoized:l,changes:r}=lY(e)?e:Uf(t,e),c=I.eventCount;if(t.__r3f&&(t.__r3f.memoizedProps=l),r.forEach(([A,u,h,b])=>{let p=t,Z=p[A];if(b.length&&(Z=b.reduce((m,B)=>m[B],t),!(Z&&Z.set))){const[m,...B]=b.reverse();p=B.reverse().reduce((w,X)=>w[X],t),A=m}if(u===Qf+"remove")if(Z&&Z.constructor){var v;u=new Z.constructor(...(v=l.args)!=null?v:[])}else if(p.constructor){var y;const m=new p.constructor(...(y=p.__r3f.memoizedProps.args)!=null?y:[]);u=m[Z],m.dispose&&m.dispose()}else u=0;if(h)u?I.handlers[A]=u:delete I.handlers[A],I.eventCount=Object.keys(I.handlers).length;else if(Z&&Z.set&&(Z.copy||Z instanceof He.Layers)){if(Array.isArray(u))Z.fromArray?Z.fromArray(u):Z.set(...u);else if(Z.copy&&u&&u.constructor&&Z.constructor.name===u.constructor.name)Z.copy(u);else if(u!==void 0){const m=Z instanceof He.Color;!m&&Z.setScalar?Z.setScalar(u):Z instanceof He.Layers&&u instanceof He.Layers?Z.mask=u.mask:Z.set(u),!He.ColorManagement&&!i.linear&&m&&Z.convertSRGBToLinear()}}else p[A]=u,!i.linear&&p[A]instanceof He.Texture&&(p[A].encoding=He.sRGBEncoding);Hi(t)}),I.parent&&i.internal&&t.raycast&&c!==I.eventCount){const A=i.internal.interaction.indexOf(t);A>-1&&i.internal.interaction.splice(A,1),I.eventCount&&i.internal.interaction.push(t)}return r.length&&t.parent&&eh(t),t}function Hi(t){var e,g;const n=(e=t.__r3f)==null||(g=e.root)==null||g.getState==null?void 0:g.getState();n&&n.internal.frames===0&&n.invalidate()}function eh(t){t.onUpdate==null||t.onUpdate(t)}function Df(t,e){t.manual||(Jf(t)?(t.left=e.width/-2,t.right=e.width/2,t.top=e.height/2,t.bottom=e.height/-2):t.aspect=e.width/e.height,t.updateProjectionMatrix(),t.updateMatrixWorld())}function wu(t){return(t.eventObject||t.object).uuid+"/"+t.index+t.instanceId}function cY(){var t,e;switch((t=window)==null||(e=t.event)==null?void 0:e.type){case"click":case"contextmenu":case"dblclick":case"pointercancel":case"pointerdown":case"pointerup":return gC.exports.DiscreteEventPriority;case"pointermove":case"pointerout":case"pointerover":case"pointerenter":case"pointerleave":case"wheel":return gC.exports.ContinuousEventPriority;default:return gC.exports.DefaultEventPriority}}function jf(t,e,g,n){const I=g.get(e);I&&(g.delete(e),g.size===0&&(t.delete(n),I.target.releasePointerCapture(n)))}function AY(t,e){const{events:g,internal:n}=t.getState();n.interaction=n.interaction.filter(I=>I!==e),n.initialHits=n.initialHits.filter(I=>I!==e),n.hovered.forEach((I,o)=>{(I.eventObject===e||I.object===e)&&n.hovered.delete(o)}),n.capturedMap.forEach((I,o)=>{jf(n.capturedMap,e,I,o)})}function aY(t){const e=new He.Vector3;function g(c){const{internal:A}=t.getState(),u=c.offsetX-A.initialClick[0],h=c.offsetY-A.initialClick[1];return Math.round(Math.sqrt(u*u+h*h))}function n(c){return c.filter(A=>["Move","Over","Enter","Out","Leave"].some(u=>{var h;return(h=A.__r3f)==null?void 0:h.handlers["onPointer"+u]}))}function I(c,A){const u=t.getState(),h=new Set,b=[],p=A?A(u.internal.interaction):u.internal.interaction;p.forEach(y=>{const m=Jr(y);m&&(m.raycaster.camera=void 0)}),u.previousRoot||u.events.compute==null||u.events.compute(c,u);let Z=p.flatMap(y=>{const m=Jr(y);if(!m||!m.events.enabled||m.raycaster.camera===null)return[];if(m.raycaster.camera===void 0){var B;m.events.compute==null||m.events.compute(c,m,(B=m.previousRoot)==null?void 0:B.getState()),m.raycaster.camera===void 0&&(m.raycaster.camera=null)}return m.raycaster.camera?m.raycaster.intersectObject(y,!0):[]}).sort((y,m)=>{const B=Jr(y.object),w=Jr(m.object);return!B||!w?0:w.events.priority-B.events.priority||y.distance-m.distance}).filter(y=>{const m=wu(y);return h.has(m)?!1:(h.add(m),!0)});u.events.filter&&(Z=u.events.filter(Z,u));for(const y of Z){let m=y.object;for(;m;){var v;(v=m.__r3f)!=null&&v.eventCount&&b.push(Ze(_({},y),{eventObject:m})),m=m.parent}}if("pointerId"in c&&u.internal.capturedMap.has(c.pointerId))for(let y of u.internal.capturedMap.get(c.pointerId).values())b.push(y.intersection);return b}function o(c,A,u,h){const{raycaster:b,pointer:p,camera:Z,internal:v}=t.getState();if(c.length){const y=e.set(p.x,p.y,0).unproject(Z),m={stopped:!1};for(const B of c){const w=k=>{var N,z;return(N=(z=v.capturedMap.get(k))==null?void 0:z.has(B.eventObject))!=null?N:!1},X=k=>{const N={intersection:B,target:A.target};v.capturedMap.has(k)?v.capturedMap.get(k).set(B.eventObject,N):v.capturedMap.set(k,new Map([[B.eventObject,N]])),A.target.setPointerCapture(k)},R=k=>{const N=v.capturedMap.get(k);N&&jf(v.capturedMap,B.eventObject,N,k)};let S={};for(let k in A){let N=A[k];typeof N!="function"&&(S[k]=N)}let Y=Ze(_(_({},B),S),{pointer:p,intersections:c,stopped:m.stopped,delta:u,unprojectedPoint:y,ray:b.ray,camera:Z,stopPropagation:()=>{const k="pointerId"in A&&v.capturedMap.get(A.pointerId);if((!k||k.has(B.eventObject))&&(Y.stopped=m.stopped=!0,v.hovered.size&&Array.from(v.hovered.values()).find(N=>N.eventObject===B.eventObject))){const N=c.slice(0,c.indexOf(B));i([...N,B])}},target:{hasPointerCapture:w,setPointerCapture:X,releasePointerCapture:R},currentTarget:{hasPointerCapture:w,setPointerCapture:X,releasePointerCapture:R},nativeEvent:A});if(h(Y),m.stopped===!0)break}}return c}function i(c){const{internal:A}=t.getState();Array.from(A.hovered.values()).forEach(u=>{if(!c.length||!c.find(h=>h.object===u.object&&h.index===u.index&&h.instanceId===u.instanceId)){const b=u.eventObject.__r3f,p=b==null?void 0:b.handlers;if(A.hovered.delete(wu(u)),b!=null&&b.eventCount){const Z=Ze(_({},u),{intersections:c||[]});p.onPointerOut==null||p.onPointerOut(Z),p.onPointerLeave==null||p.onPointerLeave(Z)}}})}const l=c=>{switch(c){case"onPointerLeave":case"onPointerCancel":return()=>i([]);case"onLostPointerCapture":return A=>{const{internal:u}=t.getState();"pointerId"in A&&!u.capturedMap.has(A.pointerId)&&(u.capturedMap.delete(A.pointerId),i([]))}}return A=>{const{onPointerMissed:u,internal:h}=t.getState();h.lastEvent.current=A;const b=c==="onPointerMove",p=c==="onClick"||c==="onContextMenu"||c==="onDoubleClick",v=I(A,b?n:void 0),y=p?g(A):0;c==="onPointerDown"&&(h.initialClick=[A.offsetX,A.offsetY],h.initialHits=v.map(m=>m.eventObject)),p&&!v.length&&y<=2&&(r(A,h.interaction),u&&u(A)),b&&i(v),o(v,A,y,m=>{const B=m.eventObject,w=B.__r3f,X=w==null?void 0:w.handlers;if(!!(w!=null&&w.eventCount))if(b){if(X.onPointerOver||X.onPointerEnter||X.onPointerOut||X.onPointerLeave){const R=wu(m),S=h.hovered.get(R);S?S.stopped&&m.stopPropagation():(h.hovered.set(R,m),X.onPointerOver==null||X.onPointerOver(m),X.onPointerEnter==null||X.onPointerEnter(m))}X.onPointerMove==null||X.onPointerMove(m)}else{const R=X[c];R?(!p||h.initialHits.includes(B))&&(r(A,h.interaction.filter(S=>!h.initialHits.includes(S))),R(m)):p&&h.initialHits.includes(B)&&r(A,h.interaction.filter(S=>!h.initialHits.includes(S)))}})}};function r(c,A){A.forEach(u=>{var h;return(h=u.__r3f)==null||h.handlers.onPointerMissed==null?void 0:h.handlers.onPointerMissed(c)})}return{handlePointer:l}}let th={},uY=t=>void(th=_(_({},th),t));function dY(t,e){function g(c,p,b){var Z=p,{args:A=[],attach:u}=Z,h=ye(Z,["args","attach"]);let v=`${c[0].toUpperCase()}${c.slice(1)}`,y;if(u===void 0&&(v.endsWith("Geometry")?u="geometry":v.endsWith("Material")&&(u="material")),c==="primitive"){if(h.object===void 0)throw"Primitives without 'object' are invalid!";const m=h.object;y=Si(m,{type:c,root:b,attach:u,primitive:!0})}else{const m=th[v];if(!m)throw`${v} is not part of the THREE namespace! Did you forget to extend? See: https://github.com/pmndrs/react-three-fiber/blob/master/markdown/api.md#using-3rd-party-objects-declaratively`;if(!Array.isArray(A))throw"The args prop must be an array!";y=Si(new m(...A),{type:c,root:b,attach:u,memoizedProps:{args:A}})}return v!=="inject"&&Wu(y,h),y}function n(c,A){let u=!1;if(A){var h,b;(h=A.__r3f)!=null&&h.attach?vu(c,A,A.__r3f.attach):A.isObject3D&&c.isObject3D&&(c.add(A),u=!0),u||(b=c.__r3f)==null||b.objects.push(A),A.__r3f||Si(A,{}),A.__r3f.parent=c,eh(A),Hi(A)}}function I(c,A,u){let h=!1;if(A){var b,p;if((b=A.__r3f)!=null&&b.attach)vu(c,A,A.__r3f.attach);else if(A.isObject3D&&c.isObject3D){A.parent=c,A.dispatchEvent({type:"added"});const Z=c.children.filter(y=>y!==A),v=Z.indexOf(u);c.children=[...Z.slice(0,v),A,...Z.slice(v)],h=!0}h||(p=c.__r3f)==null||p.objects.push(A),A.__r3f||Si(A,{}),A.__r3f.parent=c,eh(A),Hi(A)}}function o(c,A,u=!1){c&&[...c].forEach(h=>i(A,h,u))}function i(c,A,u){if(A){var h,b,p;if(A.__r3f&&(A.__r3f.parent=null),(h=c.__r3f)!=null&&h.objects&&(c.__r3f.objects=c.__r3f.objects.filter(B=>B!==A)),(b=A.__r3f)!=null&&b.attach)dB(c,A,A.__r3f.attach);else if(A.isObject3D&&c.isObject3D){var Z;c.remove(A),(Z=A.__r3f)!=null&&Z.root&&AY(A.__r3f.root,A)}const y=(p=A.__r3f)==null?void 0:p.primitive,m=u===void 0?A.dispose!==null&&!y:u;if(!y){var v;o((v=A.__r3f)==null?void 0:v.objects,A,m),o(A.children,A,m)}A.__r3f&&(delete A.__r3f.root,delete A.__r3f.objects,delete A.__r3f.handlers,delete A.__r3f.memoizedProps,y||delete A.__r3f),m&&A.dispose&&A.type!=="Scene"&&Fl.exports.unstable_scheduleCallback(Fl.exports.unstable_IdlePriority,()=>{try{A.dispose()}catch{}}),Hi(c)}}function l(c,A,u,h){var b,p;const Z=(b=c.__r3f)==null?void 0:b.parent;if(!Z)return;const v=g(A,u,(p=c.__r3f)==null?void 0:p.root);A!=="primitive"&&c.children&&(c.children.forEach(y=>n(v,y)),c.children=[]),c.__r3f.objects.forEach(y=>n(v,y)),c.__r3f.objects=[],i(Z,c),n(Z,v),v.raycast&&v.__r3f.eventCount&&v.__r3f.root.getState().internal.interaction.push(v),[h,h.alternate].forEach(y=>{y!==null&&(y.stateNode=v,y.ref&&(typeof y.ref=="function"?y.ref(v):y.ref.current=v))})}return{reconciler:gY({createInstance:g,removeChild:i,appendChild:n,appendInitialChild:n,insertBefore:I,supportsMicrotask:!0,warnsIfNotActing:!0,supportsMutation:!0,isPrimaryRenderer:!1,noTimeout:-1,appendChildToContainer:(c,A)=>{const u=c.getState().scene;u.__r3f.root=c,n(u,A)},removeChildFromContainer:(c,A)=>i(c.getState().scene,A),insertInContainerBefore:(c,A,u)=>I(c.getState().scene,A,u),getRootHostContext:()=>null,getChildHostContext:c=>c,finalizeInitialChildren(c){var A;return!!((A=c==null?void 0:c.__r3f)!=null?A:{}).handlers},prepareUpdate(c,A,u,h){if(c.__r3f.primitive&&h.object&&h.object!==c)return[!0];{const b=h,{args:Z=[],children:v}=b,y=ye(b,["args","children"]),p=u,{args:m=[],children:B}=p,w=ye(p,["args","children"]);if(!Array.isArray(Z))throw"The args prop must be an array!";if(Z.some((R,S)=>R!==m[S]))return[!0];const X=Uf(c,y,w,!0);return X.changes.length?[!1,X]:null}},commitUpdate(c,[A,u],h,b,p,Z){A?l(c,h,p,Z):Wu(c,u)},commitMount(c,A,u,h){var b;const p=(b=c==null?void 0:c.__r3f)!=null?b:{};c.raycast&&p.handlers&&p.eventCount&&c.__r3f.root.getState().internal.interaction.push(c)},getPublicInstance:c=>c,shouldDeprioritizeSubtree:()=>!1,prepareForCommit:()=>null,preparePortalMount:c=>Si(c.getState().scene),resetAfterCommit:()=>{},shouldSetTextContent:()=>!1,clearContainer:()=>!1,detachDeletedInstance:()=>{},createTextInstance:()=>{},hideInstance(c){var A;const{attach:u,parent:h}=(A=c==null?void 0:c.__r3f)!=null?A:{};u&&h&&dB(h,c,u),c.isObject3D&&(c.visible=!1),Hi(c)},unhideInstance(c,A){var u;const{attach:h,parent:b}=(u=c==null?void 0:c.__r3f)!=null?u:{};h&&b&&vu(b,c,h),(c.isObject3D&&A.visible==null||A.visible)&&(c.visible=!0),Hi(c)},hideTextInstance:()=>{throw new Error("Text is not allowed in the R3F tree.")},getCurrentEventPriority:()=>e?e():gC.exports.DefaultEventPriority,now:typeof performance!="undefined"&&nt.fun(performance.now)?performance.now:nt.fun(Date.now)?Date.now:void 0,scheduleTimeout:nt.fun(setTimeout)?setTimeout:void 0,cancelTimeout:nt.fun(clearTimeout)?clearTimeout:void 0,setTimeout:nt.fun(setTimeout)?setTimeout:void 0,clearTimeout:nt.fun(clearTimeout)?clearTimeout:void 0}),applyProps:Wu}}const hY=["set","get","setSize","setFrameloop","setDpr","events","invalidate","advance","size","viewport"],Of=t=>!!(t!=null&&t.render),Yb=W.exports.createContext(null),bY=(t,e)=>{const g=vA((i,l)=>{const r=new He.Vector3,c=new He.Vector3,A=new He.Vector3;function u(Z=l().camera,v=c,y=l().size){const{width:m,height:B}=y,w=m/B;v instanceof He.Vector3?A.copy(v):A.set(...v);const X=Z.getWorldPosition(r).distanceTo(A);if(Jf(Z))return{width:m/Z.zoom,height:B/Z.zoom,factor:1,distance:X,aspect:w};{const R=Z.fov*Math.PI/180,S=2*Math.tan(R/2)*X,Y=S*(m/B);return{width:Y,height:S,factor:m/Y,distance:X,aspect:w}}}let h;const b=Z=>i(v=>({performance:Ze(_({},v.performance),{current:Z})})),p=new He.Vector2;return{set:i,get:l,gl:null,camera:null,raycaster:null,events:{priority:1,enabled:!0,connected:!1},xr:null,invalidate:()=>t(l()),advance:(Z,v)=>e(Z,v,l()),legacy:!1,linear:!1,flat:!1,scene:Si(new He.Scene),controls:null,clock:new He.Clock,pointer:p,mouse:p,frameloop:"always",onPointerMissed:void 0,performance:{current:1,min:.5,max:1,debounce:200,regress:()=>{const Z=l();h&&clearTimeout(h),Z.performance.current!==Z.performance.min&&b(Z.performance.min),h=setTimeout(()=>b(l().performance.max),Z.performance.debounce)}},size:{width:0,height:0},viewport:{initialDpr:0,dpr:0,width:0,height:0,aspect:0,distance:0,factor:0,getCurrentViewport:u},setEvents:Z=>i(v=>Ze(_({},v),{events:_(_({},v.events),Z)})),setSize:(Z,v)=>{const y=l().camera,m={width:Z,height:v};i(B=>({size:m,viewport:_(_({},B.viewport),u(y,c,m))}))},setDpr:Z=>i(v=>{const y=Tf(Z);return{viewport:Ze(_({},v.viewport),{dpr:y,initialDpr:v.viewport.initialDpr||y})}}),setFrameloop:(Z="always")=>{const v=l().clock;v.stop(),v.elapsedTime=0,Z!=="never"&&(v.start(),v.elapsedTime=0),i(()=>({frameloop:Z}))},previousRoot:void 0,internal:{active:!1,priority:0,frames:0,lastEvent:W.exports.createRef(),interaction:[],hovered:new Map,subscribers:[],initialClick:[0,0],initialHits:[],capturedMap:new Map,subscribe:(Z,v,y)=>(i(({internal:m})=>({internal:Ze(_({},m),{priority:m.priority+(v>0?1:0),subscribers:[...m.subscribers,{ref:Z,priority:v,store:y}].sort((B,w)=>B.priority-w.priority)})})),()=>{i(({internal:m})=>({internal:Ze(_({},m),{priority:m.priority-(v>0?1:0),subscribers:m.subscribers.filter(B=>B.ref!==Z)})}))})}}}),n=g.getState();let I=n.size,o=n.viewport.dpr;return g.subscribe(()=>{const{camera:i,size:l,viewport:r,gl:c}=g.getState();(l!==I||r.dpr!==o)&&(Df(i,l),c.setPixelRatio(r.dpr),c.setSize(l.width,l.height),I=l,o=r.dpr)}),g.subscribe(i=>t(i)),g};function Pf(t,e){const g=e.length;return e.push(t),()=>void e.splice(g,1)}let to,Gc=[],mc=[],hB=[];const GY=t=>Pf(t,Gc),mY=t=>Pf(t,mc);function gl(t,e){for(to=0;to<t.length;to++)t[to](e)}let Vu,Ru;function Xu(t,e,g){let n=e.clock.getDelta();for(e.frameloop==="never"&&typeof t=="number"&&(n=t-e.clock.elapsedTime,e.clock.oldTime=e.clock.elapsedTime,e.clock.elapsedTime=t),Vu=e.internal.subscribers,to=0;to<Vu.length;to++)Ru=Vu[to],Ru.ref.current(Ru.store.getState(),n,g);return!e.internal.priority&&e.gl.render&&e.gl.render(e.scene,e.camera),e.internal.frames=Math.max(0,e.internal.frames-1),e.frameloop==="always"?1:e.internal.frames}function pY(t){let e=!1,g,n,I;function o(r){if(n=requestAnimationFrame(o),e=!0,g=0,Gc.length&&gl(Gc,r),t.forEach(c=>{var A;I=c.store.getState(),I.internal.active&&(I.frameloop==="always"||I.internal.frames>0)&&!((A=I.gl.xr)!=null&&A.isPresenting)&&(g+=Xu(r,I))}),mc.length&&gl(mc,r),g===0)return hB.length&&gl(hB,r),e=!1,cancelAnimationFrame(n)}function i(r){var c;if(!r)return t.forEach(A=>i(A.store.getState()));(c=r.gl.xr)!=null&&c.isPresenting||!r.internal.active||r.frameloop==="never"||(r.internal.frames=Math.min(60,r.internal.frames+1),e||(e=!0,requestAnimationFrame(o)))}function l(r,c=!0,A,u){c&&gl(Gc,r),A?Xu(r,A,u):t.forEach(h=>Xu(r,h.store.getState())),c&&gl(mc,r)}return{loop:o,invalidate:i,advance:l}}function Kb(){const t=W.exports.useContext(Yb);if(!t)throw"R3F hooks can only be used within the Canvas component!";return t}function pt(t=g=>g,e){return Kb()(t,e)}function pC(t,e=0){const g=Kb(),n=g.getState().internal.subscribe,I=Mf(t);return us(()=>n(I,e,g),[e,n,g]),null}function _f(t,e){return function(g,...n){const I=new g;return t&&t(I),Promise.all(n.map(o=>new Promise((i,l)=>I.load(o,r=>{r.scene&&Object.assign(r,sY(r.scene)),i(r)},e,r=>l(`Could not load ${o}: ${r.message}`)))))}}function qn(t,e,g,n){const I=Array.isArray(e)?e:[e],o=nY(_f(g,n),[t,...I],{equal:nt.equ});return Array.isArray(e)?o:o[0]}qn.preload=function(t,e,g){const n=Array.isArray(e)?e:[e];return IY(_f(g),[t,...n])};qn.clear=function(t,e){const g=Array.isArray(e)?e:[e];return oY([t,...g])};const uC=new Map,{invalidate:BY,advance:bB}=pY(uC),{reconciler:ts,applyProps:Mr}=dY(uC,cY),Wi={objects:"shallow",strict:!1},ZY=(t,e)=>{const g=typeof t=="function"?t(e):t;return Of(g)?g:new He.WebGLRenderer(_({powerPreference:"high-performance",canvas:e,antialias:!0,alpha:!0},t))};function yY(t){let e=uC.get(t),g=e==null?void 0:e.fiber,n=e==null?void 0:e.store;e&&console.warn("R3F.createRoot should only be called once!");const I=n||bY(BY,bB),o=g||ts.createContainer(I,gC.exports.ConcurrentRoot,!1,null);e||uC.set(t,{fiber:o,store:I});let i,l=!1;return{configure(r={}){var c,A,u,h;let{gl:b,size:p,events:Z,onCreated:v,shadows:y=!1,linear:m=!1,flat:B=!1,legacy:w=!1,orthographic:X=!1,frameloop:R="always",dpr:S=[1,2],performance:Y,raycaster:k,camera:N,onPointerMissed:z}=r,M=I.getState(),j=M.gl;M.gl||M.set({gl:j=ZY(b,t)});let F=M.raycaster;F||M.set({raycaster:F=new He.Raycaster});const q=k||{},{params:L}=q,P=ye(q,["params"]);if(nt.equ(P,F,Wi)||Mr(F,_({},P)),nt.equ(L,F.params,Wi)||Mr(F,{params:_(_({},F.params),L)}),!M.camera){const ge=N instanceof He.Camera,se=ge?N:X?new He.OrthographicCamera(0,0,0,0,.1,1e3):new He.PerspectiveCamera(75,0,.1,1e3);ge||(se.position.z=5,N&&Mr(se,N),N!=null&&N.rotation||se.lookAt(0,0,0)),M.set({camera:se})}if(!M.xr){const ge=(Ye,Te)=>{const et=I.getState();et.frameloop!=="never"&&bB(Ye,!0,et,Te)},se=()=>{const Ye=I.getState().gl;Ye.xr.enabled=Ye.xr.isPresenting,Ye.xr.setAnimationLoop(Ye.xr.isPresenting?ge:null)},ue={connect(){const Ye=I.getState().gl;Ye.xr.addEventListener("sessionstart",se),Ye.xr.addEventListener("sessionend",se)},disconnect(){const Ye=I.getState().gl;Ye.xr.removeEventListener("sessionstart",se),Ye.xr.removeEventListener("sessionend",se)}};j.xr&&ue.connect(),M.set({xr:ue})}if(j.shadowMap){const ge=nt.boo(y);if(ge&&j.shadowMap.enabled!==y||!nt.equ(y,j.shadowMap,Wi)){const se=j.shadowMap.enabled;j.shadowMap.enabled=!!y,ge?j.shadowMap.type=He.PCFSoftShadowMap:Object.assign(j.shadowMap,y),se!==j.shadowMap.enabled&&(j.shadowMap.needsUpdate=!0)}}He.ColorManagement&&(He.ColorManagement.legacyMode=w);const $=m?He.LinearEncoding:He.sRGBEncoding,T=B?He.NoToneMapping:He.ACESFilmicToneMapping;return j.outputEncoding!==$&&(j.outputEncoding=$),j.toneMapping!==T&&(j.toneMapping=T),M.legacy!==w&&M.set(()=>({legacy:w})),M.linear!==m&&M.set(()=>({linear:m})),M.flat!==B&&M.set(()=>({flat:B})),b&&!nt.fun(b)&&!Of(b)&&!nt.equ(b,j,Wi)&&Mr(j,b),Z&&!M.events.handlers&&M.set({events:Z(I)}),S&&M.viewport.dpr!==Tf(S)&&M.setDpr(S),p=p||{width:(c=(A=t.parentElement)==null?void 0:A.clientWidth)!=null?c:0,height:(u=(h=t.parentElement)==null?void 0:h.clientHeight)!=null?u:0},nt.equ(p,M.size,Wi)||M.setSize(p.width,p.height),M.frameloop!==R&&M.setFrameloop(R),M.onPointerMissed||M.set({onPointerMissed:z}),Y&&!nt.equ(Y,M.performance,Wi)&&M.set(ge=>({performance:_(_({},ge.performance),Y)})),i=v,l=!0,this},render(r){return l||this.configure(),ts.updateContainer(W.exports.createElement(fY,{store:I,children:r,onCreated:i,rootElement:t}),o,null,()=>{}),I},unmount(){qf(t)}}}function fY({store:t,children:e,onCreated:g,rootElement:n}){return us(()=>{const I=t.getState();I.set(o=>({internal:Ze(_({},o.internal),{active:!0})})),g&&g(I),t.getState().events.connected||I.events.connect==null||I.events.connect(n)},[]),W.exports.createElement(Yb.Provider,{value:t},e)}function qf(t,e){const g=uC.get(t),n=g==null?void 0:g.fiber;if(n){const I=g==null?void 0:g.store.getState();I&&(I.internal.active=!1),ts.updateContainer(null,n,null,()=>{I&&setTimeout(()=>{try{var o,i,l,r;I.events.disconnect==null||I.events.disconnect(),(o=I.gl)==null||(i=o.renderLists)==null||i.dispose==null||i.dispose(),(l=I.gl)==null||l.forceContextLoss==null||l.forceContextLoss(),(r=I.gl)!=null&&r.xr&&I.xr.disconnect(),rY(I),uC.delete(t),e&&e(t)}catch{}},500)})}}function vY(t,e,g){return W.exports.createElement(WY,{key:e.uuid,children:t,container:e,state:g})}function WY({state:t={},children:e,container:g}){const u=t,{events:n,size:I}=u,o=ye(u,["events","size"]),i=Kb(),[l]=W.exports.useState(()=>new He.Raycaster),[r]=W.exports.useState(()=>new He.Vector2),c=W.exports.useCallback((h,b)=>{const p=_({},h);Object.keys(h).forEach(v=>{(hY.includes(v)||h[v]!==b[v])&&delete p[v]});let Z;if(b&&I){const v=b.camera;Z=h.viewport.getCurrentViewport(v,new He.Vector3,I),v!==h.camera&&Df(v,I)}return _(Ze(_({},p),{scene:g,raycaster:l,pointer:r,mouse:r,previousRoot:i,events:_(_(_({},h.events),b==null?void 0:b.events),n),size:_(_({},h.size),I),viewport:_(_({},h.viewport),Z)}),o)},[t]),[A]=W.exports.useState(()=>{const h=i.getState();return vA((p,Z)=>Ze(_(Ze(_({},h),{scene:g,raycaster:l,pointer:r,mouse:r,previousRoot:i,events:_(_({},h.events),n),size:_(_({},h.size),I)}),o),{set:p,get:Z,setEvents:v=>p(y=>Ze(_({},y),{events:_(_({},y.events),v)}))}))});return W.exports.useEffect(()=>{const h=i.subscribe(b=>A.setState(p=>c(b,p)));return()=>{h(),A.destroy()}},[]),W.exports.useEffect(()=>{A.setState(h=>c(i.getState(),h))},[c]),W.exports.createElement(W.exports.Fragment,null,ts.createPortal(W.exports.createElement(Yb.Provider,{value:A},e),A,null))}ts.injectIntoDevTools({bundleType:0,rendererPackageName:"@react-three/fiber",version:"18.0.0"});function gs(t){return function(e){t.forEach(function(g){typeof g=="function"?g(e):g!=null&&(g.current=e)})}}function gh(t,e,g){var n,I,o,i,l;e==null&&(e=100);function r(){var A=Date.now()-i;A<e&&A>=0?n=setTimeout(r,e-A):(n=null,g||(l=t.apply(o,I),o=I=null))}var c=function(){o=this,I=arguments,i=Date.now();var A=g&&!n;return n||(n=setTimeout(r,e)),A&&(l=t.apply(o,I),o=I=null),l};return c.clear=function(){n&&(clearTimeout(n),n=null)},c.flush=function(){n&&(l=t.apply(o,I),o=I=null,clearTimeout(n),n=null)},c}gh.debounce=gh;var GB=gh;function wY(t){let{debounce:e,scroll:g,polyfill:n,offsetSize:I}=t===void 0?{debounce:0,scroll:!1,offsetSize:!1}:t;const o=n||(typeof window=="undefined"?class{}:window.ResizeObserver);if(!o)throw new Error("This browser does not support ResizeObserver out of the box. See: https://github.com/react-spring/react-use-measure/#resize-observer-polyfills");const[i,l]=W.exports.useState({left:0,top:0,width:0,height:0,bottom:0,right:0,x:0,y:0}),r=W.exports.useRef({element:null,scrollContainers:null,resizeObserver:null,lastBounds:i}),c=e?typeof e=="number"?e:e.scroll:null,A=e?typeof e=="number"?e:e.resize:null,u=W.exports.useRef(!1);W.exports.useEffect(()=>(u.current=!0,()=>void(u.current=!1)));const[h,b,p]=W.exports.useMemo(()=>{const m=()=>{if(!r.current.element)return;const{left:B,top:w,width:X,height:R,bottom:S,right:Y,x:k,y:N}=r.current.element.getBoundingClientRect(),z={left:B,top:w,width:X,height:R,bottom:S,right:Y,x:k,y:N};r.current.element instanceof HTMLElement&&I&&(z.height=r.current.element.offsetHeight,z.width=r.current.element.offsetWidth),Object.freeze(z),u.current&&!YY(r.current.lastBounds,z)&&l(r.current.lastBounds=z)};return[m,A?GB(m,A):m,c?GB(m,c):m]},[l,I,c,A]);function Z(){r.current.scrollContainers&&(r.current.scrollContainers.forEach(m=>m.removeEventListener("scroll",p,!0)),r.current.scrollContainers=null),r.current.resizeObserver&&(r.current.resizeObserver.disconnect(),r.current.resizeObserver=null)}function v(){!r.current.element||(r.current.resizeObserver=new o(p),r.current.resizeObserver.observe(r.current.element),g&&r.current.scrollContainers&&r.current.scrollContainers.forEach(m=>m.addEventListener("scroll",p,{capture:!0,passive:!0})))}const y=m=>{!m||m===r.current.element||(Z(),r.current.element=m,r.current.scrollContainers=$f(m),v())};return RY(p,Boolean(g)),VY(b),W.exports.useEffect(()=>{Z(),v()},[g,p,b]),W.exports.useEffect(()=>Z,[]),[y,i,h]}function VY(t){W.exports.useEffect(()=>{const e=t;return window.addEventListener("resize",e),()=>void window.removeEventListener("resize",e)},[t])}function RY(t,e){W.exports.useEffect(()=>{if(e){const g=t;return window.addEventListener("scroll",g,{capture:!0,passive:!0}),()=>void window.removeEventListener("scroll",g,!0)}},[t,e])}function $f(t){const e=[];if(!t||t===document.body)return e;const{overflow:g,overflowX:n,overflowY:I}=window.getComputedStyle(t);return[g,n,I].some(o=>o==="auto"||o==="scroll")&&e.push(t),[...e,...$f(t.parentElement)]}const XY=["x","y","top","bottom","left","right","width","height"],YY=(t,e)=>XY.every(g=>t[g]===e[g]),Yu={onClick:["click",!1],onContextMenu:["contextmenu",!1],onDoubleClick:["dblclick",!1],onWheel:["wheel",!0],onPointerDown:["pointerdown",!0],onPointerUp:["pointerup",!0],onPointerLeave:["pointerleave",!0],onPointerMove:["pointermove",!0],onPointerCancel:["pointercancel",!0],onLostPointerCapture:["lostpointercapture",!0]};function KY(t){const{handlePointer:e}=aY(t);return{priority:1,enabled:!0,compute(g,n,I){n.pointer.set(g.offsetX/n.size.width*2-1,-(g.offsetY/n.size.height)*2+1),n.raycaster.setFromCamera(n.pointer,n.camera)},connected:void 0,handlers:Object.keys(Yu).reduce((g,n)=>Ze(_({},g),{[n]:e(n)}),{}),connect:g=>{var n;const{set:I,events:o}=t.getState();o.disconnect==null||o.disconnect(),I(i=>({events:Ze(_({},i.events),{connected:g})})),Object.entries((n=o==null?void 0:o.handlers)!=null?n:[]).forEach(([i,l])=>{const[r,c]=Yu[i];g.addEventListener(r,l,{passive:c})})},disconnect:()=>{const{set:g,events:n}=t.getState();if(n.connected){var I;Object.entries((I=n.handlers)!=null?I:[]).forEach(([o,i])=>{if(n&&n.connected instanceof HTMLElement){const[l]=Yu[o];n.connected.removeEventListener(l,i)}}),g(o=>({events:Ze(_({},o.events),{connected:void 0})}))}}}}const sL=W.exports.forwardRef(function(X,w){var R=X,{children:e,fallback:g,resize:n,style:I,gl:o,events:i=KY,shadows:l,linear:r,flat:c,legacy:A,orthographic:u,frameloop:h,dpr:b,performance:p,raycaster:Z,camera:v,onPointerMissed:y,onCreated:m}=R,B=ye(R,["children","fallback","resize","style","gl","events","shadows","linear","flat","legacy","orthographic","frameloop","dpr","performance","raycaster","camera","onPointerMissed","onCreated"]);W.exports.useMemo(()=>uY(He),[]);const[S,{width:Y,height:k}]=wY(_({scroll:!0,debounce:{scroll:50,resize:0}},n)),N=W.exports.useRef(null),z=W.exports.useRef(null),[M,j]=W.exports.useState(null),F=Mf(y),[L,P]=W.exports.useState(!1),[$,T]=W.exports.useState(!1);if(L)throw L;if($)throw $;const q=W.exports.useRef(null);return Y>0&&k>0&&M&&(q.current||(q.current=yY(M)),q.current.configure({gl:o,events:i,shadows:l,linear:r,flat:c,legacy:A,orthographic:u,frameloop:h,dpr:b,performance:p,raycaster:Z,camera:v,size:{width:Y,height:k},onPointerMissed:(...ge)=>F.current==null?void 0:F.current(...ge),onCreated:ge=>{ge.events.connect==null||ge.events.connect(z.current),m==null||m(ge)}}),q.current.render(W.exports.createElement(Ef,{set:T},W.exports.createElement(W.exports.Suspense,{fallback:W.exports.createElement(CY,{set:P})},e)))),us(()=>{j(N.current)},[]),W.exports.useEffect(()=>{if(M)return()=>qf(M)},[M]),W.exports.createElement("div",Le({ref:gs([z,S]),style:_({position:"relative",width:"100%",height:"100%",overflow:"hidden"},I)},B),W.exports.createElement("canvas",{ref:gs([N,w]),style:{display:"block"}},g))});let nl=0;const rL=vA(t=>(mr.onStart=(e,g,n)=>{t({active:!0,item:e,loaded:g,total:n,progress:(g-nl)/(n-nl)*100})},mr.onLoad=()=>{t({active:!1})},mr.onError=e=>t(g=>({errors:[...g.errors,e]})),mr.onProgress=(e,g,n)=>{g===n&&(nl=n),t({active:!0,item:e,loaded:g,total:n,progress:(g-nl)/(n-nl)*100||100})},{errors:[],active:!1,progress:0,item:"",loaded:0,total:0}));function SY(t,e,g){return Math.max(e,Math.min(t,g))}const rg={toVector(t,e){return t===void 0&&(t=e),Array.isArray(t)?t:[t,t]},add(t,e){return[t[0]+e[0],t[1]+e[1]]},sub(t,e){return[t[0]-e[0],t[1]-e[1]]},addTo(t,e){t[0]+=e[0],t[1]+=e[1]},subTo(t,e){t[0]-=e[0],t[1]-=e[1]}};function mB(t,e,g){return e===0||Math.abs(e)===1/0?Math.pow(t,g*5):t*e*g/(e+g*t)}function pB(t,e,g,n=.15){return n===0?SY(t,e,g):t<e?-mB(e-t,g-e,n)+e:t>g?+mB(t-g,g-e,n)+g:t}function HY(t,[e,g],[n,I]){const[[o,i],[l,r]]=t;return[pB(e,o,i,n),pB(g,l,r,I)]}function fg(t,e,g){return e in t?Object.defineProperty(t,e,{value:g,enumerable:!0,configurable:!0,writable:!0}):t[e]=g,t}function BB(t,e){var g=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(I){return Object.getOwnPropertyDescriptor(t,I).enumerable})),g.push.apply(g,n)}return g}function Xt(t){for(var e=1;e<arguments.length;e++){var g=arguments[e]!=null?arguments[e]:{};e%2?BB(Object(g),!0).forEach(function(n){fg(t,n,g[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(g)):BB(Object(g)).forEach(function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(g,n))})}return t}const ev={pointer:{start:"down",change:"move",end:"up"},mouse:{start:"down",change:"move",end:"up"},touch:{start:"start",change:"move",end:"end"},gesture:{start:"start",change:"change",end:"end"}};function ZB(t){return t?t[0].toUpperCase()+t.slice(1):""}function NY(t,e="",g=!1){const n=ev[t],I=n&&n[e]||e;return"on"+ZB(t)+ZB(I)+(g?"Capture":"")}const FY=["gotpointercapture","lostpointercapture"];function kY(t){let e=t.substring(2).toLowerCase();const g=!!~e.indexOf("passive");g&&(e=e.replace("passive",""));const n=FY.includes(e)?"capturecapture":"capture",I=!!~e.indexOf(n);return I&&(e=e.replace("capture","")),{device:e,capture:I,passive:g}}function zY(t,e=""){const g=ev[t],n=g&&g[e]||e;return t+n}function Sb(t){return"touches"in t}function xY(t){return Array.from(t.touches).filter(e=>{var g,n;return e.target===t.currentTarget||((g=t.currentTarget)===null||g===void 0||(n=g.contains)===null||n===void 0?void 0:n.call(g,e.target))})}function LY(t){return t.type==="touchend"||t.type==="touchcancel"?t.changedTouches:t.targetTouches}function tv(t){return Sb(t)?LY(t)[0]:t}function JY(t){return xY(t).map(e=>e.identifier)}function Ku(t){const e=tv(t);return Sb(t)?e.identifier:e.pointerId}function yB(t){const e=tv(t);return[e.clientX,e.clientY]}function MY(t){const e={};if("buttons"in t&&(e.buttons=t.buttons),"shiftKey"in t){const{shiftKey:g,altKey:n,metaKey:I,ctrlKey:o}=t;Object.assign(e,{shiftKey:g,altKey:n,metaKey:I,ctrlKey:o})}return e}function Pc(t,...e){return typeof t=="function"?t(...e):t}function EY(){}function QY(...t){return t.length===0?EY:t.length===1?t[0]:function(){let e;for(const g of t)e=g.apply(this,arguments)||e;return e}}function fB(t,e){return Object.assign({},e,t||{})}const TY=32;class UY{constructor(e,g,n){this.ctrl=e,this.args=g,this.key=n,this.state||(this.state={},this.computeValues([0,0]),this.computeInitial(),this.init&&this.init(),this.reset())}get state(){return this.ctrl.state[this.key]}set state(e){this.ctrl.state[this.key]=e}get shared(){return this.ctrl.state.shared}get eventStore(){return this.ctrl.gestureEventStores[this.key]}get timeoutStore(){return this.ctrl.gestureTimeoutStores[this.key]}get config(){return this.ctrl.config[this.key]}get sharedConfig(){return this.ctrl.config.shared}get handler(){return this.ctrl.handlers[this.key]}reset(){const{state:e,shared:g,ingKey:n,args:I}=this;g[n]=e._active=e.active=e._blocked=e._force=!1,e._step=[!1,!1],e.intentional=!1,e._movement=[0,0],e._distance=[0,0],e._direction=[0,0],e._delta=[0,0],e._bounds=[[-1/0,1/0],[-1/0,1/0]],e.args=I,e.axis=void 0,e.memo=void 0,e.elapsedTime=0,e.direction=[0,0],e.distance=[0,0],e.overflow=[0,0],e._movementBound=[!1,!1],e.velocity=[0,0],e.movement=[0,0],e.delta=[0,0],e.timeStamp=0}start(e){const g=this.state,n=this.config;g._active||(this.reset(),this.computeInitial(),g._active=!0,g.target=e.target,g.currentTarget=e.currentTarget,g.lastOffset=n.from?Pc(n.from,g):g.offset,g.offset=g.lastOffset),g.startTime=g.timeStamp=e.timeStamp}computeValues(e){const g=this.state;g._values=e,g.values=this.config.transform(e)}computeInitial(){const e=this.state;e._initial=e._values,e.initial=e.values}compute(e){const{state:g,config:n,shared:I}=this;g.args=this.args;let o=0;if(e&&(g.event=e,n.preventDefault&&e.cancelable&&g.event.preventDefault(),g.type=e.type,I.touches=this.ctrl.pointerIds.size||this.ctrl.touchIds.size,I.locked=!!document.pointerLockElement,Object.assign(I,MY(e)),I.down=I.pressed=I.buttons%2===1||I.touches>0,o=e.timeStamp-g.timeStamp,g.timeStamp=e.timeStamp,g.elapsedTime=g.timeStamp-g.startTime),g._active){const w=g._delta.map(Math.abs);rg.addTo(g._distance,w)}const[i,l]=g._movement,[r,c]=n.threshold,{_step:A,values:u}=g;if(n.hasCustomTransform?(A[0]===!1&&(A[0]=Math.abs(i)>=r&&u[0]),A[1]===!1&&(A[1]=Math.abs(l)>=c&&u[1])):(A[0]===!1&&(A[0]=Math.abs(i)>=r&&Math.sign(i)*r),A[1]===!1&&(A[1]=Math.abs(l)>=c&&Math.sign(l)*c)),g.intentional=A[0]!==!1||A[1]!==!1,!g.intentional)return;const h=[0,0];if(n.hasCustomTransform){const[w,X]=u;h[0]=A[0]!==!1?w-A[0]:0,h[1]=A[1]!==!1?X-A[1]:0}else h[0]=A[0]!==!1?i-A[0]:0,h[1]=A[1]!==!1?l-A[1]:0;if(this.intent&&this.intent(h),(g._active&&!g._blocked||g.active)&&(g.first=g._active&&!g.active,g.last=!g._active&&g.active,g.active=I[this.ingKey]=g._active,e)){g.first&&("bounds"in n&&(g._bounds=Pc(n.bounds,g)),this.setup&&this.setup()),g.movement=h;const w=g.offset;if(this.computeOffset(),!g.last||o>TY){g.delta=rg.sub(g.offset,w);const X=g.delta.map(Math.abs);rg.addTo(g.distance,X),g.direction=g.delta.map(Math.sign),g._direction=g._delta.map(Math.sign),!g.first&&o>0&&(g.velocity=[X[0]/o,X[1]/o])}}const[b,p]=g.offset,[[Z,v],[y,m]]=g._bounds;g.overflow=[b<Z?-1:b>v?1:0,p<y?-1:p>m?1:0],g._movementBound[0]=g.overflow[0]?g._movementBound[0]===!1?g._movement[0]:g._movementBound[0]:!1,g._movementBound[1]=g.overflow[1]?g._movementBound[1]===!1?g._movement[1]:g._movementBound[1]:!1;const B=g._active?n.rubberband||[0,0]:[0,0];g.offset=HY(g._bounds,g.offset,B),this.computeMovement()}emit(){const e=this.state,g=this.shared,n=this.config;if(e._active||this.clean(),(e._blocked||!e.intentional)&&!e._force&&!n.triggerAllEvents)return;const I=this.handler(Xt(Xt(Xt({},g),e),{},{[this.aliasKey]:e.values}));I!==void 0&&(e.memo=I)}clean(){this.eventStore.clean(),this.timeoutStore.clean()}}function DY([t,e]){const g=Math.abs(t)-Math.abs(e);if(g>0)return"x";if(g<0)return"y"}function jY(t,e){switch(e){case"x":t[1]=0;break;case"y":t[0]=0;break}}class OY extends UY{constructor(...e){super(...e);fg(this,"aliasKey","xy")}reset(){super.reset(),this.state.axis=void 0}init(){this.state.offset=[0,0],this.state.lastOffset=[0,0]}computeOffset(){this.state.offset=rg.add(this.state.lastOffset,this.state.movement)}computeMovement(){this.state.movement=rg.sub(this.state.offset,this.state.lastOffset)}intent(e){this.state.axis=this.state.axis||DY(e),this.state._blocked=(this.config.lockDirection||!!this.config.axis)&&!this.state.axis||!!this.config.axis&&this.config.axis!==this.state.axis,!this.state._blocked&&(this.config.axis||this.config.lockDirection)&&jY(e,this.state.axis)}}const PY=t=>t,vB=.15,gv={enabled(t=!0){return t},preventDefault(t=!1){return t},triggerAllEvents(t=!1){return t},rubberband(t=0){switch(t){case!0:return[vB,vB];case!1:return[0,0];default:return rg.toVector(t)}},from(t){if(typeof t=="function")return t;if(t!=null)return rg.toVector(t)},transform(t,e,g){const n=t||g.shared.transform;return this.hasCustomTransform=!!n,n||PY},threshold(t){return rg.toVector(t,0)}},ds=Xt(Xt({},gv),{},{axis(t,e,{axis:g}){if(this.lockDirection=g==="lock",!this.lockDirection)return g},bounds(t={}){if(typeof t=="function")return o=>ds.bounds(t(o));if("current"in t)return()=>t.current;if(typeof HTMLElement=="function"&&t instanceof HTMLElement)return t;const{left:e=-1/0,right:g=1/0,top:n=-1/0,bottom:I=1/0}=t;return[[e,g],[n,I]]}}),Er=10,WB={ArrowRight:(t=1)=>[Er*t,0],ArrowLeft:(t=1)=>[-Er*t,0],ArrowUp:(t=1)=>[0,-Er*t],ArrowDown:(t=1)=>[0,Er*t]};class _Y extends OY{constructor(...e){super(...e);fg(this,"ingKey","dragging")}reset(){super.reset();const e=this.state;e._pointerId=void 0,e._pointerActive=!1,e._keyboardActive=!1,e._preventScroll=!1,e._delayed=!1,e.swipe=[0,0],e.tap=!1,e.canceled=!1,e.cancel=this.cancel.bind(this)}setup(){const e=this.state;if(e._bounds instanceof HTMLElement){const g=e._bounds.getBoundingClientRect(),n=e.currentTarget.getBoundingClientRect(),I={left:g.left-n.left+e.offset[0],right:g.right-n.right+e.offset[0],top:g.top-n.top+e.offset[1],bottom:g.bottom-n.bottom+e.offset[1]};e._bounds=ds.bounds(I)}}cancel(){const e=this.state;e.canceled||(e.canceled=!0,e._active=!1,setTimeout(()=>{this.compute(),this.emit()},0))}setActive(){this.state._active=this.state._pointerActive||this.state._keyboardActive}clean(){this.pointerClean(),this.state._pointerActive=!1,this.state._keyboardActive=!1,super.clean()}pointerDown(e){const g=this.config,n=this.state;e.buttons!=null&&(Array.isArray(g.pointerButtons)?!g.pointerButtons.includes(e.buttons):g.pointerButtons!==-1&&g.pointerButtons!==e.buttons)||(this.ctrl.setEventIds(e),g.pointerCapture&&e.target.setPointerCapture(e.pointerId),!n._pointerActive&&(this.start(e),this.setupPointer(e),n._pointerId=Ku(e),n._pointerActive=!0,this.computeValues(yB(e)),this.computeInitial(),g.preventScroll?this.setupScrollPrevention(e):g.delay>0?this.setupDelayTrigger(e):this.startPointerDrag(e)))}startPointerDrag(e){const g=this.state;g._active=!0,g._preventScroll=!0,g._delayed=!1,this.compute(e),this.emit()}pointerMove(e){const g=this.state,n=this.config;if(!g._pointerActive||g.type===e.type&&e.timeStamp===g.timeStamp)return;const I=Ku(e);if(g._pointerId!==void 0&&I!==g._pointerId)return;const o=yB(e);if(document.pointerLockElement===e.target?g._delta=[e.movementX,e.movementY]:(g._delta=rg.sub(o,g._values),this.computeValues(o)),rg.addTo(g._movement,g._delta),this.compute(e),g._delayed){this.timeoutStore.remove("dragDelay"),g.active=!1,this.startPointerDrag(e);return}if(n.preventScroll&&!g._preventScroll)if(g.axis)if(g.axis===n.preventScrollAxis||n.preventScrollAxis==="xy"){g._active=!1,this.clean();return}else{this.timeoutStore.remove("startPointerDrag"),this.startPointerDrag(e);return}else return;this.emit()}pointerUp(e){this.ctrl.setEventIds(e);try{this.config.pointerCapture&&e.target.hasPointerCapture(e.pointerId)&&e.target.releasePointerCapture(e.pointerId)}catch{}const g=this.state,n=this.config;if(!g._pointerActive)return;const I=Ku(e);if(g._pointerId!==void 0&&I!==g._pointerId)return;this.state._pointerActive=!1,this.setActive(),this.compute(e);const[o,i]=g._distance;if(g.tap=o<=n.tapsThreshold&&i<=n.tapsThreshold,g.tap&&n.filterTaps)g._force=!0;else{const[l,r]=g.direction,[c,A]=g.velocity,[u,h]=g.movement,[b,p]=n.swipe.velocity,[Z,v]=n.swipe.distance,y=n.swipe.duration;g.elapsedTime<y&&(Math.abs(c)>b&&Math.abs(u)>Z&&(g.swipe[0]=l),Math.abs(A)>p&&Math.abs(h)>v&&(g.swipe[1]=r))}this.emit()}pointerClick(e){this.state.tap||(e.preventDefault(),e.stopPropagation())}setupPointer(e){const g=this.config;let n=g.device;g.pointerLock&&e.currentTarget.requestPointerLock(),g.pointerCapture||(this.eventStore.add(this.sharedConfig.window,n,"change",this.pointerMove.bind(this)),this.eventStore.add(this.sharedConfig.window,n,"end",this.pointerUp.bind(this)),this.eventStore.add(this.sharedConfig.window,n,"cancel",this.pointerUp.bind(this)))}pointerClean(){this.config.pointerLock&&document.pointerLockElement===this.state.currentTarget&&document.exitPointerLock()}preventScroll(e){this.state._preventScroll&&e.cancelable&&e.preventDefault()}setupScrollPrevention(e){qY(e),this.eventStore.add(this.sharedConfig.window,"touch","change",this.preventScroll.bind(this),{passive:!1}),this.eventStore.add(this.sharedConfig.window,"touch","end",this.clean.bind(this),{passive:!1}),this.eventStore.add(this.sharedConfig.window,"touch","cancel",this.clean.bind(this),{passive:!1}),this.timeoutStore.add("startPointerDrag",this.startPointerDrag.bind(this),this.config.preventScroll,e)}setupDelayTrigger(e){this.state._delayed=!0,this.timeoutStore.add("dragDelay",this.startPointerDrag.bind(this),this.config.delay,e)}keyDown(e){const g=WB[e.key];if(g){const n=this.state,I=e.shiftKey?10:e.altKey?.1:1;n._delta=g(I),this.start(e),n._keyboardActive=!0,rg.addTo(n._movement,n._delta),this.compute(e),this.emit()}}keyUp(e){e.key in WB&&(this.state._keyboardActive=!1,this.setActive(),this.compute(e),this.emit())}bind(e){const g=this.config.device;e(g,"start",this.pointerDown.bind(this)),this.config.pointerCapture&&(e(g,"change",this.pointerMove.bind(this)),e(g,"end",this.pointerUp.bind(this)),e(g,"cancel",this.pointerUp.bind(this)),e("lostPointerCapture","",this.pointerUp.bind(this))),e("key","down",this.keyDown.bind(this)),e("key","up",this.keyUp.bind(this)),this.config.filterTaps&&e("click","",this.pointerClick.bind(this),{capture:!0,passive:!1})}}function qY(t){"persist"in t&&typeof t.persist=="function"&&t.persist()}const hs=typeof window!="undefined"&&window.document&&window.document.createElement;function $Y(){return hs&&"ontouchstart"in window}function wB(){return $Y()||hs&&window.navigator.maxTouchPoints>1}function eK(){return hs&&"onpointerdown"in window}function tK(){return hs&&"exitPointerLock"in window.document}function gK(){try{return"constructor"in GestureEvent}catch{return!1}}const en={isBrowser:hs,gesture:gK(),touch:wB(),touchscreen:wB(),pointer:eK(),pointerLock:tK()},nK=250,IK=180,oK=.5,iK=50,CK=250,lK=Xt(Xt({},ds),{},{pointerLock(t,e,{pointer:{lock:g=!1,touch:n=!1}={}}){return this.useTouch=n&&en.touch,g&&en.pointerLock},device(t,e){return this.useTouch?"touch":this.pointerLock?"mouse":en.pointer?"pointer":en.touch?"touch":"mouse"},preventScroll(t=!1,e,{preventScrollAxis:g="y"}){return g&&(this.preventScrollAxis=g),en.touchscreen?typeof t=="number"?t:t?nK:!1:!1},pointerCapture(t,e,{pointer:{capture:g=!0,buttons:n=1}={}}){return this.pointerButtons=n,!this.pointerLock&&this.device==="pointer"&&g},threshold(t,e,{filterTaps:g=!1,tapsThreshold:n=3,axis:I=void 0}){const o=rg.toVector(t,g?n:I?1:0);return this.filterTaps=g,this.tapsThreshold=n,o},swipe({velocity:t=oK,distance:e=iK,duration:g=CK}={}){return{velocity:this.transform(rg.toVector(t)),distance:this.transform(rg.toVector(e)),duration:g}},delay(t=0){switch(t){case!0:return IK;case!1:return 0;default:return t}}});Xt(Xt({},gv),{},{useTouch(t,e,{pointer:{touch:g=!1}={}}){return g&&en.touch},device(t,e,g){if(g.shared.target&&!en.touch&&en.gesture)return"gesture";if(this.useTouch)return"touch";if(en.touchscreen){if(en.pointer)return"pointer";if(en.touch)return"touch"}},bounds(t,e,{scaleBounds:g={},angleBounds:n={}}){const I=i=>{const l=fB(Pc(g,i),{min:-1/0,max:1/0});return[l.min,l.max]},o=i=>{const l=fB(Pc(n,i),{min:-1/0,max:1/0});return[l.min,l.max]};return typeof g!="function"&&typeof n!="function"?[I(),o()]:i=>[I(i),o(i)]},threshold(t,e,g){return this.lockDirection=g.axis==="lock",rg.toVector(t,this.lockDirection?[.1,3]:0)}});Xt(Xt({},ds),{},{mouseOnly:(t=!0)=>t});Xt(Xt({},ds),{},{mouseOnly:(t=!0)=>t});const nv=new Map,nh=new Map;function sK(t){nv.set(t.key,t.engine),nh.set(t.key,t.resolver)}const rK={key:"drag",engine:_Y,resolver:lK};function cK(t,e){if(t==null)return{};var g={},n=Object.keys(t),I,o;for(o=0;o<n.length;o++)I=n[o],!(e.indexOf(I)>=0)&&(g[I]=t[I]);return g}function AK(t,e){if(t==null)return{};var g=cK(t,e),n,I;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(I=0;I<o.length;I++)n=o[I],!(e.indexOf(n)>=0)&&(!Object.prototype.propertyIsEnumerable.call(t,n)||(g[n]=t[n]))}return g}const aK={target(t){if(t)return()=>"current"in t?t.current:t},enabled(t=!0){return t},window(t=en.isBrowser?window:void 0){return t},eventOptions({passive:t=!0,capture:e=!1}={}){return{passive:t,capture:e}},transform(t){return t}},uK=["target","eventOptions","window","enabled","transform"];function pc(t={},e){const g={};for(const[n,I]of Object.entries(e))switch(typeof I){case"function":g[n]=I.call(g,t[n],n,t);break;case"object":g[n]=pc(t[n],I);break;case"boolean":I&&(g[n]=t[n]);break}return g}function dK(t,e){const g=t,{target:n,eventOptions:I,window:o,enabled:i,transform:l}=g,r=AK(g,uK),c={shared:pc({target:n,eventOptions:I,window:o,enabled:i,transform:l},aK)};if(e){const A=nh.get(e);c[e]=pc(Xt({shared:c.shared},r),A)}else for(const A in r){const u=nh.get(A);u&&(c[A]=pc(Xt({shared:c.shared},r[A]),u))}return c}class Iv{constructor(e){fg(this,"_listeners",[]),this._ctrl=e}add(e,g,n,I,o){const i=zY(g,n),l=Xt(Xt({},this._ctrl.config.shared.eventOptions),o);e.addEventListener(i,I,l),this._listeners.push(()=>e.removeEventListener(i,I,l))}clean(){this._listeners.forEach(e=>e()),this._listeners=[]}}class hK{constructor(){fg(this,"_timeouts",new Map)}add(e,g,n=140,...I){this.remove(e),this._timeouts.set(e,window.setTimeout(g,n,...I))}remove(e){const g=this._timeouts.get(e);g&&window.clearTimeout(g)}clean(){this._timeouts.forEach(e=>void window.clearTimeout(e)),this._timeouts.clear()}}class bK{constructor(e){fg(this,"gestures",new Set),fg(this,"_targetEventStore",new Iv(this)),fg(this,"gestureEventStores",{}),fg(this,"gestureTimeoutStores",{}),fg(this,"handlers",{}),fg(this,"config",{}),fg(this,"pointerIds",new Set),fg(this,"touchIds",new Set),fg(this,"state",{shared:{shiftKey:!1,metaKey:!1,ctrlKey:!1,altKey:!1}}),GK(this,e)}setEventIds(e){Sb(e)?this.touchIds=new Set(JY(e)):"pointerId"in e&&(e.type==="pointerup"||e.type==="pointercancel"?this.pointerIds.delete(e.pointerId):e.type==="pointerdown"&&this.pointerIds.add(e.pointerId))}applyHandlers(e,g){this.handlers=e,this.nativeHandlers=g}applyConfig(e,g){this.config=dK(e,g)}clean(){this._targetEventStore.clean();for(const e of this.gestures)this.gestureEventStores[e].clean(),this.gestureTimeoutStores[e].clean()}effect(){return this.config.shared.target&&this.bind(),()=>this._targetEventStore.clean()}bind(...e){const g=this.config.shared,n=g.eventOptions,I={};let o;if(g.target&&(o=g.target(),!o))return;const i=mK(I,n,!!o);if(g.enabled){for(const l of this.gestures)if(this.config[l].enabled){const r=nv.get(l);new r(this,e,l).bind(i)}for(const l in this.nativeHandlers)i(l,"",r=>this.nativeHandlers[l](Xt(Xt({},this.state.shared),{},{event:r,args:e})),void 0,!0)}for(const l in I)I[l]=QY(...I[l]);if(!o)return I;for(const l in I){const{device:r,capture:c,passive:A}=kY(l);this._targetEventStore.add(o,r,"",I[l],{capture:c,passive:A})}}}function wi(t,e){t.gestures.add(e),t.gestureEventStores[e]=new Iv(t),t.gestureTimeoutStores[e]=new hK}function GK(t,e){e.drag&&wi(t,"drag"),e.wheel&&wi(t,"wheel"),e.scroll&&wi(t,"scroll"),e.move&&wi(t,"move"),e.pinch&&wi(t,"pinch"),e.hover&&wi(t,"hover")}const mK=(t,e,g)=>(n,I,o,i={},l=!1)=>{var r,c;const A=(r=i.capture)!==null&&r!==void 0?r:e.capture,u=(c=i.passive)!==null&&c!==void 0?c:e.passive;let h=l?n:NY(n,I,A);g&&u&&(h+="Passive"),t[h]=t[h]||[],t[h].push(o)};function pK(t,e={},g,n){const I=ae.useMemo(()=>new bK(t),[]);if(I.applyHandlers(t,n),I.applyConfig(e,g),ae.useEffect(I.effect.bind(I)),ae.useEffect(()=>I.clean.bind(I),[]),e.target===void 0)return I.bind.bind(I)}function BK(t,e={}){return sK(rK),pK({drag:t},e,"drag")}function fe(t,e,g){return e in t?Object.defineProperty(t,e,{value:g,enumerable:!0,configurable:!0,writable:!0}):t[e]=g,t}class go extends En{constructor(){super(new id(1,1,1),go.material)}}fe(go,"SkyShader",{uniforms:{turbidity:{value:2},rayleigh:{value:1},mieCoefficient:{value:.005},mieDirectionalG:{value:.8},sunPosition:{value:new mt},up:{value:new mt(0,1,0)}},vertexShader:["uniform vec3 sunPosition;","uniform float rayleigh;","uniform float turbidity;","uniform float mieCoefficient;","uniform vec3 up;","varying vec3 vWorldPosition;","varying vec3 vSunDirection;","varying float vSunfade;","varying vec3 vBetaR;","varying vec3 vBetaM;","varying float vSunE;","const float e = 2.71828182845904523536028747135266249775724709369995957;","const float pi = 3.141592653589793238462643383279502884197169;","const vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );","const vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );","const float v = 4.0;","const vec3 K = vec3( 0.686, 0.678, 0.666 );","const vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );","const float cutoffAngle = 1.6110731556870734;","const float steepness = 1.5;","const float EE = 1000.0;","float sunIntensity( float zenithAngleCos ) {"," zenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );"," return EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );","}","vec3 totalMie( float T ) {"," float c = ( 0.2 * T ) * 10E-18;"," return 0.434 * c * MieConst;","}","void main() {"," vec4 worldPosition = modelMatrix * vec4( position, 1.0 );"," vWorldPosition = worldPosition.xyz;"," gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );"," gl_Position.z = gl_Position.w;"," vSunDirection = normalize( sunPosition );"," vSunE = sunIntensity( dot( vSunDirection, up ) );"," vSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );"," float rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );"," vBetaR = totalRayleigh * rayleighCoefficient;"," vBetaM = totalMie( turbidity ) * mieCoefficient;","}"].join(`
|
|
59
|
+
`),fragmentShader:["varying vec3 vWorldPosition;","varying vec3 vSunDirection;","varying float vSunfade;","varying vec3 vBetaR;","varying vec3 vBetaM;","varying float vSunE;","uniform float mieDirectionalG;","uniform vec3 up;","const vec3 cameraPos = vec3( 0.0, 0.0, 0.0 );","const float pi = 3.141592653589793238462643383279502884197169;","const float n = 1.0003;","const float N = 2.545E25;","const float rayleighZenithLength = 8.4E3;","const float mieZenithLength = 1.25E3;","const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;","const float THREE_OVER_SIXTEENPI = 0.05968310365946075;","const float ONE_OVER_FOURPI = 0.07957747154594767;","float rayleighPhase( float cosTheta ) {"," return THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );","}","float hgPhase( float cosTheta, float g ) {"," float g2 = pow( g, 2.0 );"," float inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );"," return ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );","}","void main() {"," vec3 direction = normalize( vWorldPosition - cameraPos );"," float zenithAngle = acos( max( 0.0, dot( up, direction ) ) );"," float inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );"," float sR = rayleighZenithLength * inverse;"," float sM = mieZenithLength * inverse;"," vec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );"," float cosTheta = dot( direction, vSunDirection );"," float rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );"," vec3 betaRTheta = vBetaR * rPhase;"," float mPhase = hgPhase( cosTheta, mieDirectionalG );"," vec3 betaMTheta = vBetaM * mPhase;"," vec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );"," Lin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );"," float theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2]"," float phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2]"," vec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );"," vec3 L0 = vec3( 0.1 ) * Fex;"," float sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );"," L0 += ( vSunE * 19000.0 * Fex ) * sundisk;"," vec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );"," vec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );"," gl_FragColor = vec4( retColor, 1.0 );","#include <tonemapping_fragment>","#include <encodings_fragment>","}"].join(`
|
|
60
|
+
`)});fe(go,"material",new kw({name:"SkyShader",fragmentShader:go.SkyShader.fragmentShader,vertexShader:go.SkyShader.vertexShader,uniforms:zw.clone(go.SkyShader.uniforms),side:wZ,depthWrite:!1}));const VB=(t,e)=>(t%e+e)%e;class ZK extends xw{constructor(e,g){super();fe(this,"object",void 0),fe(this,"domElement",void 0),fe(this,"enabled",!0),fe(this,"target",new mt),fe(this,"minDistance",0),fe(this,"maxDistance",1/0),fe(this,"minZoom",0),fe(this,"maxZoom",1/0),fe(this,"minPolarAngle",0),fe(this,"maxPolarAngle",Math.PI),fe(this,"minAzimuthAngle",-1/0),fe(this,"maxAzimuthAngle",1/0),fe(this,"enableDamping",!1),fe(this,"dampingFactor",.05),fe(this,"enableZoom",!0),fe(this,"zoomSpeed",1),fe(this,"enableRotate",!0),fe(this,"rotateSpeed",1),fe(this,"enablePan",!0),fe(this,"panSpeed",1),fe(this,"screenSpacePanning",!0),fe(this,"keyPanSpeed",7),fe(this,"autoRotate",!1),fe(this,"autoRotateSpeed",2),fe(this,"reverseOrbit",!1),fe(this,"keys",{LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"}),fe(this,"mouseButtons",{LEFT:yi.ROTATE,MIDDLE:yi.DOLLY,RIGHT:yi.PAN}),fe(this,"touches",{ONE:fi.ROTATE,TWO:fi.DOLLY_PAN}),fe(this,"target0",void 0),fe(this,"position0",void 0),fe(this,"zoom0",void 0),fe(this,"_domElementKeyEvents",null),fe(this,"getPolarAngle",void 0),fe(this,"getAzimuthalAngle",void 0),fe(this,"setPolarAngle",void 0),fe(this,"setAzimuthalAngle",void 0),fe(this,"getDistance",void 0),fe(this,"listenToKeyEvents",void 0),fe(this,"saveState",void 0),fe(this,"reset",void 0),fe(this,"update",void 0),fe(this,"connect",void 0),fe(this,"dispose",void 0),this.object=e,this.domElement=g,this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object instanceof Yo?this.object.zoom:1,this.getPolarAngle=()=>A.phi,this.getAzimuthalAngle=()=>A.theta,this.setPolarAngle=E=>{let ne=VB(E,2*Math.PI),Be=A.phi;Be<0&&(Be+=2*Math.PI),ne<0&&(ne+=2*Math.PI);let Ke=Math.abs(ne-Be);2*Math.PI-Ke<Ke&&(ne<Be?ne+=2*Math.PI:Be+=2*Math.PI),u.phi=ne-Be,n.update()},this.setAzimuthalAngle=E=>{let ne=VB(E,2*Math.PI),Be=A.theta;Be<0&&(Be+=2*Math.PI),ne<0&&(ne+=2*Math.PI);let Ke=Math.abs(ne-Be);2*Math.PI-Ke<Ke&&(ne<Be?ne+=2*Math.PI:Be+=2*Math.PI),u.theta=ne-Be,n.update()},this.getDistance=()=>n.object.position.distanceTo(n.target),this.listenToKeyEvents=E=>{E.addEventListener("keydown",me),this._domElementKeyEvents=E},this.saveState=()=>{n.target0.copy(n.target),n.position0.copy(n.object.position),n.zoom0=n.object instanceof Yo?n.object.zoom:1},this.reset=()=>{n.target.copy(n.target0),n.object.position.copy(n.position0),n.object instanceof Yo&&(n.object.zoom=n.zoom0,n.object.updateProjectionMatrix()),n.dispatchEvent(I),n.update(),r=l.NONE},this.update=(()=>{const E=new mt,ne=new oC().setFromUnitVectors(e.up,new mt(0,1,0)),Be=ne.clone().invert(),Ke=new mt,it=new oC,kt=2*Math.PI;return function(){const ys=n.object.position;E.copy(ys).sub(n.target),E.applyQuaternion(ne),A.setFromVector3(E),n.autoRotate&&r===l.NONE&&M(N()),n.enableDamping?(A.theta+=u.theta*n.dampingFactor,A.phi+=u.phi*n.dampingFactor):(A.theta+=u.theta,A.phi+=u.phi);let an=n.minAzimuthAngle,un=n.maxAzimuthAngle;return isFinite(an)&&isFinite(un)&&(an<-Math.PI?an+=kt:an>Math.PI&&(an-=kt),un<-Math.PI?un+=kt:un>Math.PI&&(un-=kt),an<=un?A.theta=Math.max(an,Math.min(un,A.theta)):A.theta=A.theta>(an+un)/2?Math.max(an,A.theta):Math.min(un,A.theta)),A.phi=Math.max(n.minPolarAngle,Math.min(n.maxPolarAngle,A.phi)),A.makeSafe(),A.radius*=h,A.radius=Math.max(n.minDistance,Math.min(n.maxDistance,A.radius)),n.enableDamping===!0?n.target.addScaledVector(b,n.dampingFactor):n.target.add(b),E.setFromSpherical(A),E.applyQuaternion(Be),ys.copy(n.target).add(E),n.object.lookAt(n.target),n.enableDamping===!0?(u.theta*=1-n.dampingFactor,u.phi*=1-n.dampingFactor,b.multiplyScalar(1-n.dampingFactor)):(u.set(0,0,0),b.set(0,0,0)),h=1,p||Ke.distanceToSquared(n.object.position)>c||8*(1-it.dot(n.object.quaternion))>c?(n.dispatchEvent(I),Ke.copy(n.object.position),it.copy(n.object.quaternion),p=!1,!0):!1}})(),this.connect=E=>{E===document&&console.error('THREE.OrbitControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.'),n.domElement=E,n.domElement.style.touchAction="none",n.domElement.addEventListener("contextmenu",Et),n.domElement.addEventListener("pointerdown",Ci),n.domElement.addEventListener("pointercancel",cn),n.domElement.addEventListener("wheel",le)},this.dispose=()=>{var E,ne,Be,Ke,it,kt;(E=n.domElement)===null||E===void 0||E.removeEventListener("contextmenu",Et),(ne=n.domElement)===null||ne===void 0||ne.removeEventListener("pointerdown",Ci),(Be=n.domElement)===null||Be===void 0||Be.removeEventListener("pointercancel",cn),(Ke=n.domElement)===null||Ke===void 0||Ke.removeEventListener("wheel",le),(it=n.domElement)===null||it===void 0||it.ownerDocument.removeEventListener("pointermove",bo),(kt=n.domElement)===null||kt===void 0||kt.ownerDocument.removeEventListener("pointerup",Go),n._domElementKeyEvents!==null&&n._domElementKeyEvents.removeEventListener("keydown",me)};const n=this,I={type:"change"},o={type:"start"},i={type:"end"},l={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6};let r=l.NONE;const c=1e-6,A=new _m,u=new _m;let h=1;const b=new mt;let p=!1;const Z=new _g,v=new _g,y=new _g,m=new _g,B=new _g,w=new _g,X=new _g,R=new _g,S=new _g,Y=[],k={};function N(){return 2*Math.PI/60/60*n.autoRotateSpeed}function z(){return Math.pow(.95,n.zoomSpeed)}function M(E){n.reverseOrbit?u.theta+=E:u.theta-=E}function j(E){n.reverseOrbit?u.phi+=E:u.phi-=E}const F=(()=>{const E=new mt;return function(Be,Ke){E.setFromMatrixColumn(Ke,0),E.multiplyScalar(-Be),b.add(E)}})(),L=(()=>{const E=new mt;return function(Be,Ke){n.screenSpacePanning===!0?E.setFromMatrixColumn(Ke,1):(E.setFromMatrixColumn(Ke,0),E.crossVectors(n.object.up,E)),E.multiplyScalar(Be),b.add(E)}})(),P=(()=>{const E=new mt;return function(Be,Ke){const it=n.domElement;if(it&&n.object instanceof Yo&&n.object.isPerspectiveCamera){const kt=n.object.position;E.copy(kt).sub(n.target);let SI=E.length();SI*=Math.tan(n.object.fov/2*Math.PI/180),F(2*Be*SI/it.clientHeight,n.object.matrix),L(2*Ke*SI/it.clientHeight,n.object.matrix)}else it&&n.object instanceof ic&&n.object.isOrthographicCamera?(F(Be*(n.object.right-n.object.left)/n.object.zoom/it.clientWidth,n.object.matrix),L(Ke*(n.object.top-n.object.bottom)/n.object.zoom/it.clientHeight,n.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),n.enablePan=!1)}})();function $(E){n.object instanceof Yo&&n.object.isPerspectiveCamera?h/=E:n.object instanceof ic&&n.object.isOrthographicCamera?(n.object.zoom=Math.max(n.minZoom,Math.min(n.maxZoom,n.object.zoom*E)),n.object.updateProjectionMatrix(),p=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),n.enableZoom=!1)}function T(E){n.object instanceof Yo&&n.object.isPerspectiveCamera?h*=E:n.object instanceof ic&&n.object.isOrthographicCamera?(n.object.zoom=Math.max(n.minZoom,Math.min(n.maxZoom,n.object.zoom/E)),n.object.updateProjectionMatrix(),p=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),n.enableZoom=!1)}function q(E){Z.set(E.clientX,E.clientY)}function ge(E){X.set(E.clientX,E.clientY)}function se(E){m.set(E.clientX,E.clientY)}function ue(E){v.set(E.clientX,E.clientY),y.subVectors(v,Z).multiplyScalar(n.rotateSpeed);const ne=n.domElement;ne&&(M(2*Math.PI*y.x/ne.clientHeight),j(2*Math.PI*y.y/ne.clientHeight)),Z.copy(v),n.update()}function Ye(E){R.set(E.clientX,E.clientY),S.subVectors(R,X),S.y>0?$(z()):S.y<0&&T(z()),X.copy(R),n.update()}function Te(E){B.set(E.clientX,E.clientY),w.subVectors(B,m).multiplyScalar(n.panSpeed),P(w.x,w.y),m.copy(B),n.update()}function et(E){E.deltaY<0?T(z()):E.deltaY>0&&$(z()),n.update()}function yt(E){let ne=!1;switch(E.code){case n.keys.UP:P(0,n.keyPanSpeed),ne=!0;break;case n.keys.BOTTOM:P(0,-n.keyPanSpeed),ne=!0;break;case n.keys.LEFT:P(n.keyPanSpeed,0),ne=!0;break;case n.keys.RIGHT:P(-n.keyPanSpeed,0),ne=!0;break}ne&&(E.preventDefault(),n.update())}function dt(){if(Y.length==1)Z.set(Y[0].pageX,Y[0].pageY);else{const E=.5*(Y[0].pageX+Y[1].pageX),ne=.5*(Y[0].pageY+Y[1].pageY);Z.set(E,ne)}}function ag(){if(Y.length==1)m.set(Y[0].pageX,Y[0].pageY);else{const E=.5*(Y[0].pageX+Y[1].pageX),ne=.5*(Y[0].pageY+Y[1].pageY);m.set(E,ne)}}function $n(){const E=Y[0].pageX-Y[1].pageX,ne=Y[0].pageY-Y[1].pageY,Be=Math.sqrt(E*E+ne*ne);X.set(0,Be)}function eI(){n.enableZoom&&$n(),n.enablePan&&ag()}function Mt(){n.enableZoom&&$n(),n.enableRotate&&dt()}function Vn(E){if(Y.length==1)v.set(E.pageX,E.pageY);else{const Be=gI(E),Ke=.5*(E.pageX+Be.x),it=.5*(E.pageY+Be.y);v.set(Ke,it)}y.subVectors(v,Z).multiplyScalar(n.rotateSpeed);const ne=n.domElement;ne&&(M(2*Math.PI*y.x/ne.clientHeight),j(2*Math.PI*y.y/ne.clientHeight)),Z.copy(v)}function ot(E){if(Y.length==1)B.set(E.pageX,E.pageY);else{const ne=gI(E),Be=.5*(E.pageX+ne.x),Ke=.5*(E.pageY+ne.y);B.set(Be,Ke)}w.subVectors(B,m).multiplyScalar(n.panSpeed),P(w.x,w.y),m.copy(B)}function RI(E){const ne=gI(E),Be=E.pageX-ne.x,Ke=E.pageY-ne.y,it=Math.sqrt(Be*Be+Ke*Ke);R.set(0,it),S.set(0,Math.pow(R.y/X.y,n.zoomSpeed)),$(S.y),X.copy(R)}function XI(E){n.enableZoom&&RI(E),n.enablePan&&ot(E)}function YI(E){n.enableZoom&&RI(E),n.enableRotate&&Vn(E)}function Ci(E){if(n.enabled!==!1){if(Y.length===0){var ne,Be;(ne=n.domElement)===null||ne===void 0||ne.ownerDocument.addEventListener("pointermove",bo),(Be=n.domElement)===null||Be===void 0||Be.ownerDocument.addEventListener("pointerup",Go)}tI(E),E.pointerType==="touch"?ht(E):li(E)}}function bo(E){n.enabled!==!1&&(E.pointerType==="touch"?Yt(E):vC(E))}function Go(E){if(An(E),Y.length===0){var ne,Be,Ke;(ne=n.domElement)===null||ne===void 0||ne.releasePointerCapture(E.pointerId),(Be=n.domElement)===null||Be===void 0||Be.ownerDocument.removeEventListener("pointermove",bo),(Ke=n.domElement)===null||Ke===void 0||Ke.ownerDocument.removeEventListener("pointerup",Go)}n.dispatchEvent(i),r=l.NONE}function cn(E){An(E)}function li(E){let ne;switch(E.button){case 0:ne=n.mouseButtons.LEFT;break;case 1:ne=n.mouseButtons.MIDDLE;break;case 2:ne=n.mouseButtons.RIGHT;break;default:ne=-1}switch(ne){case yi.DOLLY:if(n.enableZoom===!1)return;ge(E),r=l.DOLLY;break;case yi.ROTATE:if(E.ctrlKey||E.metaKey||E.shiftKey){if(n.enablePan===!1)return;se(E),r=l.PAN}else{if(n.enableRotate===!1)return;q(E),r=l.ROTATE}break;case yi.PAN:if(E.ctrlKey||E.metaKey||E.shiftKey){if(n.enableRotate===!1)return;q(E),r=l.ROTATE}else{if(n.enablePan===!1)return;se(E),r=l.PAN}break;default:r=l.NONE}r!==l.NONE&&n.dispatchEvent(o)}function vC(E){if(n.enabled!==!1)switch(r){case l.ROTATE:if(n.enableRotate===!1)return;ue(E);break;case l.DOLLY:if(n.enableZoom===!1)return;Ye(E);break;case l.PAN:if(n.enablePan===!1)return;Te(E);break}}function le(E){n.enabled===!1||n.enableZoom===!1||r!==l.NONE&&r!==l.ROTATE||(E.preventDefault(),n.dispatchEvent(o),et(E),n.dispatchEvent(i))}function me(E){n.enabled===!1||n.enablePan===!1||yt(E)}function ht(E){switch(KI(E),Y.length){case 1:switch(n.touches.ONE){case fi.ROTATE:if(n.enableRotate===!1)return;dt(),r=l.TOUCH_ROTATE;break;case fi.PAN:if(n.enablePan===!1)return;ag(),r=l.TOUCH_PAN;break;default:r=l.NONE}break;case 2:switch(n.touches.TWO){case fi.DOLLY_PAN:if(n.enableZoom===!1&&n.enablePan===!1)return;eI(),r=l.TOUCH_DOLLY_PAN;break;case fi.DOLLY_ROTATE:if(n.enableZoom===!1&&n.enableRotate===!1)return;Mt(),r=l.TOUCH_DOLLY_ROTATE;break;default:r=l.NONE}break;default:r=l.NONE}r!==l.NONE&&n.dispatchEvent(o)}function Yt(E){switch(KI(E),r){case l.TOUCH_ROTATE:if(n.enableRotate===!1)return;Vn(E),n.update();break;case l.TOUCH_PAN:if(n.enablePan===!1)return;ot(E),n.update();break;case l.TOUCH_DOLLY_PAN:if(n.enableZoom===!1&&n.enablePan===!1)return;XI(E),n.update();break;case l.TOUCH_DOLLY_ROTATE:if(n.enableZoom===!1&&n.enableRotate===!1)return;YI(E),n.update();break;default:r=l.NONE}}function Et(E){n.enabled!==!1&&E.preventDefault()}function tI(E){Y.push(E)}function An(E){delete k[E.pointerId];for(let ne=0;ne<Y.length;ne++)if(Y[ne].pointerId==E.pointerId){Y.splice(ne,1);return}}function KI(E){let ne=k[E.pointerId];ne===void 0&&(ne=new _g,k[E.pointerId]=ne),ne.set(E.pageX,E.pageY)}function gI(E){const ne=E.pointerId===Y[0].pointerId?Y[1]:Y[0];return k[ne.pointerId]}g!==void 0&&this.connect(g),this.update()}}class Hb extends VZ{constructor(e){super(e);this.dracoLoader=null,this.ktx2Loader=null,this.meshoptDecoder=null,this.pluginCallbacks=[],this.register(function(g){return new WK(g)}),this.register(function(g){return new KK(g)}),this.register(function(g){return new SK(g)}),this.register(function(g){return new wK(g)}),this.register(function(g){return new VK(g)}),this.register(function(g){return new RK(g)}),this.register(function(g){return new XK(g)}),this.register(function(g){return new YK(g)}),this.register(function(g){return new fK(g)}),this.register(function(g){return new HK(g)})}load(e,g,n,I){const o=this;let i;this.resourcePath!==""?i=this.resourcePath:this.path!==""?i=this.path:i=Qo.extractUrlBase(e),this.manager.itemStart(e);const l=function(c){I?I(c):console.error(c),o.manager.itemError(e),o.manager.itemEnd(e)},r=new yc(this.manager);r.setPath(this.path),r.setResponseType("arraybuffer"),r.setRequestHeader(this.requestHeader),r.setWithCredentials(this.withCredentials),r.load(e,function(c){try{o.parse(c,i,function(A){g(A),o.manager.itemEnd(e)},l)}catch(A){l(A)}},n,l)}setDRACOLoader(e){return this.dracoLoader=e,this}setDDSLoader(){throw new Error('THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".')}setKTX2Loader(e){return this.ktx2Loader=e,this}setMeshoptDecoder(e){return this.meshoptDecoder=e,this}register(e){return this.pluginCallbacks.indexOf(e)===-1&&this.pluginCallbacks.push(e),this}unregister(e){return this.pluginCallbacks.indexOf(e)!==-1&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,g,n,I){let o;const i={},l={};if(typeof e=="string")o=e;else if(Qo.decodeText(new Uint8Array(e,0,4))===ov){try{i[Ne.KHR_BINARY_GLTF]=new NK(e)}catch(u){I&&I(u);return}o=i[Ne.KHR_BINARY_GLTF].content}else o=Qo.decodeText(new Uint8Array(e));const r=JSON.parse(o);if(r.asset===void 0||r.asset.version[0]<2){I&&I(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported."));return}const c=new DK(r,{path:g||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let A=0;A<this.pluginCallbacks.length;A++){const u=this.pluginCallbacks[A](c);l[u.name]=u,i[u.name]=!0}if(r.extensionsUsed)for(let A=0;A<r.extensionsUsed.length;++A){const u=r.extensionsUsed[A],h=r.extensionsRequired||[];switch(u){case Ne.KHR_MATERIALS_UNLIT:i[u]=new vK;break;case Ne.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:i[u]=new zK;break;case Ne.KHR_DRACO_MESH_COMPRESSION:i[u]=new FK(r,this.dracoLoader);break;case Ne.KHR_TEXTURE_TRANSFORM:i[u]=new kK;break;case Ne.KHR_MESH_QUANTIZATION:i[u]=new xK;break;default:h.indexOf(u)>=0&&l[u]===void 0&&console.warn('THREE.GLTFLoader: Unknown extension "'+u+'".')}}c.setExtensions(i),c.setPlugins(l),c.parse(n,I)}parseAsync(e,g){const n=this;return new Promise(function(I,o){n.parse(e,g,I,o)})}}function yK(){let t={};return{get:function(e){return t[e]},add:function(e,g){t[e]=g},remove:function(e){delete t[e]},removeAll:function(){t={}}}}const Ne={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:"KHR_materials_pbrSpecularGlossiness",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression"};class fK{constructor(e){this.parser=e,this.name=Ne.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,g=this.parser.json.nodes||[];for(let n=0,I=g.length;n<I;n++){const o=g[n];o.extensions&&o.extensions[this.name]&&o.extensions[this.name].light!==void 0&&e._addNodeRef(this.cache,o.extensions[this.name].light)}}_loadLight(e){const g=this.parser,n="light:"+e;let I=g.cache.get(n);if(I)return I;const o=g.json,r=((o.extensions&&o.extensions[this.name]||{}).lights||[])[e];let c;const A=new fn(16777215);r.color!==void 0&&A.fromArray(r.color);const u=r.range!==void 0?r.range:0;switch(r.type){case"directional":c=new Mw(A),c.target.position.set(0,0,-1),c.add(c.target);break;case"point":c=new Jw(A),c.distance=u;break;case"spot":c=new Lw(A),c.distance=u,r.spot=r.spot||{},r.spot.innerConeAngle=r.spot.innerConeAngle!==void 0?r.spot.innerConeAngle:0,r.spot.outerConeAngle=r.spot.outerConeAngle!==void 0?r.spot.outerConeAngle:Math.PI/4,c.angle=r.spot.outerConeAngle,c.penumbra=1-r.spot.innerConeAngle/r.spot.outerConeAngle,c.target.position.set(0,0,-1),c.add(c.target);break;default:throw new Error("THREE.GLTFLoader: Unexpected light type: "+r.type)}return c.position.set(0,0,0),c.decay=2,r.intensity!==void 0&&(c.intensity=r.intensity),c.name=g.createUniqueName(r.name||"light_"+e),I=Promise.resolve(c),g.cache.add(n,I),I}createNodeAttachment(e){const g=this,n=this.parser,o=n.json.nodes[e],l=(o.extensions&&o.extensions[this.name]||{}).light;return l===void 0?null:this._loadLight(l).then(function(r){return n._getNodeRef(g.cache,l,r)})}}class vK{constructor(){this.name=Ne.KHR_MATERIALS_UNLIT}getMaterialType(){return Fi}extendParams(e,g,n){const I=[];e.color=new fn(1,1,1),e.opacity=1;const o=g.pbrMetallicRoughness;if(o){if(Array.isArray(o.baseColorFactor)){const i=o.baseColorFactor;e.color.fromArray(i),e.opacity=i[3]}o.baseColorTexture!==void 0&&I.push(n.assignTexture(e,"map",o.baseColorTexture))}return Promise.all(I)}}class WK{constructor(e){this.parser=e,this.name=Ne.KHR_MATERIALS_CLEARCOAT}getMaterialType(e){const n=this.parser.json.materials[e];return!n.extensions||!n.extensions[this.name]?null:ti}extendMaterialParams(e,g){const n=this.parser,I=n.json.materials[e];if(!I.extensions||!I.extensions[this.name])return Promise.resolve();const o=[],i=I.extensions[this.name];if(i.clearcoatFactor!==void 0&&(g.clearcoat=i.clearcoatFactor),i.clearcoatTexture!==void 0&&o.push(n.assignTexture(g,"clearcoatMap",i.clearcoatTexture)),i.clearcoatRoughnessFactor!==void 0&&(g.clearcoatRoughness=i.clearcoatRoughnessFactor),i.clearcoatRoughnessTexture!==void 0&&o.push(n.assignTexture(g,"clearcoatRoughnessMap",i.clearcoatRoughnessTexture)),i.clearcoatNormalTexture!==void 0&&(o.push(n.assignTexture(g,"clearcoatNormalMap",i.clearcoatNormalTexture)),i.clearcoatNormalTexture.scale!==void 0)){const l=i.clearcoatNormalTexture.scale;g.clearcoatNormalScale=new _g(l,l)}return Promise.all(o)}}class wK{constructor(e){this.parser=e,this.name=Ne.KHR_MATERIALS_SHEEN}getMaterialType(e){const n=this.parser.json.materials[e];return!n.extensions||!n.extensions[this.name]?null:ti}extendMaterialParams(e,g){const n=this.parser,I=n.json.materials[e];if(!I.extensions||!I.extensions[this.name])return Promise.resolve();const o=[];g.sheenColor=new fn(0,0,0),g.sheenRoughness=0,g.sheen=1;const i=I.extensions[this.name];return i.sheenColorFactor!==void 0&&g.sheenColor.fromArray(i.sheenColorFactor),i.sheenRoughnessFactor!==void 0&&(g.sheenRoughness=i.sheenRoughnessFactor),i.sheenColorTexture!==void 0&&o.push(n.assignTexture(g,"sheenColorMap",i.sheenColorTexture)),i.sheenRoughnessTexture!==void 0&&o.push(n.assignTexture(g,"sheenRoughnessMap",i.sheenRoughnessTexture)),Promise.all(o)}}class VK{constructor(e){this.parser=e,this.name=Ne.KHR_MATERIALS_TRANSMISSION}getMaterialType(e){const n=this.parser.json.materials[e];return!n.extensions||!n.extensions[this.name]?null:ti}extendMaterialParams(e,g){const n=this.parser,I=n.json.materials[e];if(!I.extensions||!I.extensions[this.name])return Promise.resolve();const o=[],i=I.extensions[this.name];return i.transmissionFactor!==void 0&&(g.transmission=i.transmissionFactor),i.transmissionTexture!==void 0&&o.push(n.assignTexture(g,"transmissionMap",i.transmissionTexture)),Promise.all(o)}}class RK{constructor(e){this.parser=e,this.name=Ne.KHR_MATERIALS_VOLUME}getMaterialType(e){const n=this.parser.json.materials[e];return!n.extensions||!n.extensions[this.name]?null:ti}extendMaterialParams(e,g){const n=this.parser,I=n.json.materials[e];if(!I.extensions||!I.extensions[this.name])return Promise.resolve();const o=[],i=I.extensions[this.name];g.thickness=i.thicknessFactor!==void 0?i.thicknessFactor:0,i.thicknessTexture!==void 0&&o.push(n.assignTexture(g,"thicknessMap",i.thicknessTexture)),g.attenuationDistance=i.attenuationDistance||0;const l=i.attenuationColor||[1,1,1];return g.attenuationColor=new fn(l[0],l[1],l[2]),Promise.all(o)}}class XK{constructor(e){this.parser=e,this.name=Ne.KHR_MATERIALS_IOR}getMaterialType(e){const n=this.parser.json.materials[e];return!n.extensions||!n.extensions[this.name]?null:ti}extendMaterialParams(e,g){const I=this.parser.json.materials[e];if(!I.extensions||!I.extensions[this.name])return Promise.resolve();const o=I.extensions[this.name];return g.ior=o.ior!==void 0?o.ior:1.5,Promise.resolve()}}class YK{constructor(e){this.parser=e,this.name=Ne.KHR_MATERIALS_SPECULAR}getMaterialType(e){const n=this.parser.json.materials[e];return!n.extensions||!n.extensions[this.name]?null:ti}extendMaterialParams(e,g){const n=this.parser,I=n.json.materials[e];if(!I.extensions||!I.extensions[this.name])return Promise.resolve();const o=[],i=I.extensions[this.name];g.specularIntensity=i.specularFactor!==void 0?i.specularFactor:1,i.specularTexture!==void 0&&o.push(n.assignTexture(g,"specularIntensityMap",i.specularTexture));const l=i.specularColorFactor||[1,1,1];return g.specularColor=new fn(l[0],l[1],l[2]),i.specularColorTexture!==void 0&&o.push(n.assignTexture(g,"specularColorMap",i.specularColorTexture).then(function(r){r.encoding=Cd})),Promise.all(o)}}class KK{constructor(e){this.parser=e,this.name=Ne.KHR_TEXTURE_BASISU}loadTexture(e){const g=this.parser,n=g.json,I=n.textures[e];if(!I.extensions||!I.extensions[this.name])return null;const o=I.extensions[this.name],i=n.images[o.source],l=g.options.ktx2Loader;if(!l){if(n.extensionsRequired&&n.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return g.loadTextureImage(e,i,l)}}class SK{constructor(e){this.parser=e,this.name=Ne.EXT_TEXTURE_WEBP,this.isSupported=null}loadTexture(e){const g=this.name,n=this.parser,I=n.json,o=I.textures[e];if(!o.extensions||!o.extensions[g])return null;const i=o.extensions[g],l=I.images[i.source];let r=n.textureLoader;if(l.uri){const c=n.options.manager.getHandler(l.uri);c!==null&&(r=c)}return this.detectSupport().then(function(c){if(c)return n.loadTextureImage(e,l,r);if(I.extensionsRequired&&I.extensionsRequired.indexOf(g)>=0)throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return n.loadTexture(e)})}detectSupport(){return this.isSupported||(this.isSupported=new Promise(function(e){const g=new Image;g.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",g.onload=g.onerror=function(){e(g.height===1)}})),this.isSupported}}class HK{constructor(e){this.name=Ne.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const g=this.parser.json,n=g.bufferViews[e];if(n.extensions&&n.extensions[this.name]){const I=n.extensions[this.name],o=this.parser.getDependency("buffer",I.buffer),i=this.parser.options.meshoptDecoder;if(!i||!i.supported){if(g.extensionsRequired&&g.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return Promise.all([o,i.ready]).then(function(l){const r=I.byteOffset||0,c=I.byteLength||0,A=I.count,u=I.byteStride,h=new ArrayBuffer(A*u),b=new Uint8Array(l[0],r,c);return i.decodeGltfBuffer(new Uint8Array(h),A,u,b,I.mode,I.filter),h})}else return null}}const ov="glTF",Il=12,RB={JSON:1313821514,BIN:5130562};class NK{constructor(e){this.name=Ne.KHR_BINARY_GLTF,this.content=null,this.body=null;const g=new DataView(e,0,Il);if(this.header={magic:Qo.decodeText(new Uint8Array(e.slice(0,4))),version:g.getUint32(4,!0),length:g.getUint32(8,!0)},this.header.magic!==ov)throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header.");if(this.header.version<2)throw new Error("THREE.GLTFLoader: Legacy binary file detected.");const n=this.header.length-Il,I=new DataView(e,Il);let o=0;for(;o<n;){const i=I.getUint32(o,!0);o+=4;const l=I.getUint32(o,!0);if(o+=4,l===RB.JSON){const r=new Uint8Array(e,Il+o,i);this.content=Qo.decodeText(r)}else if(l===RB.BIN){const r=Il+o;this.body=e.slice(r,r+i)}o+=i}if(this.content===null)throw new Error("THREE.GLTFLoader: JSON content not found.")}}class FK{constructor(e,g){if(!g)throw new Error("THREE.GLTFLoader: No DRACOLoader instance provided.");this.name=Ne.KHR_DRACO_MESH_COMPRESSION,this.json=e,this.dracoLoader=g,this.dracoLoader.preload()}decodePrimitive(e,g){const n=this.json,I=this.dracoLoader,o=e.extensions[this.name].bufferView,i=e.extensions[this.name].attributes,l={},r={},c={};for(const A in i){const u=oh[A]||A.toLowerCase();l[u]=i[A]}for(const A in e.attributes){const u=oh[A]||A.toLowerCase();if(i[A]!==void 0){const h=n.accessors[e.attributes[A]],b=ns[h.componentType];c[u]=b,r[u]=h.normalized===!0}}return g.getDependency("bufferView",o).then(function(A){return new Promise(function(u){I.decodeDracoFile(A,function(h){for(const b in h.attributes){const p=h.attributes[b],Z=r[b];Z!==void 0&&(p.normalized=Z)}u(h)},l,c)})})}}class kK{constructor(){this.name=Ne.KHR_TEXTURE_TRANSFORM}extendTexture(e,g){return g.texCoord!==void 0&&console.warn('THREE.GLTFLoader: Custom UV sets in "'+this.name+'" extension not yet supported.'),g.offset===void 0&&g.rotation===void 0&&g.scale===void 0||(e=e.clone(),g.offset!==void 0&&e.offset.fromArray(g.offset),g.rotation!==void 0&&(e.rotation=g.rotation),g.scale!==void 0&&e.repeat.fromArray(g.scale),e.needsUpdate=!0),e}}class Ih extends Fh{constructor(e){super();this.isGLTFSpecularGlossinessMaterial=!0;const g=["#ifdef USE_SPECULARMAP"," uniform sampler2D specularMap;","#endif"].join(`
|
|
61
|
+
`),n=["#ifdef USE_GLOSSINESSMAP"," uniform sampler2D glossinessMap;","#endif"].join(`
|
|
62
|
+
`),I=["vec3 specularFactor = specular;","#ifdef USE_SPECULARMAP"," vec4 texelSpecular = texture2D( specularMap, vUv );"," // reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture"," specularFactor *= texelSpecular.rgb;","#endif"].join(`
|
|
63
|
+
`),o=["float glossinessFactor = glossiness;","#ifdef USE_GLOSSINESSMAP"," vec4 texelGlossiness = texture2D( glossinessMap, vUv );"," // reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture"," glossinessFactor *= texelGlossiness.a;","#endif"].join(`
|
|
64
|
+
`),i=["PhysicalMaterial material;","material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );","vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );","float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );","material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.","material.roughness += geometryRoughness;","material.roughness = min( material.roughness, 1.0 );","material.specularColor = specularFactor;"].join(`
|
|
65
|
+
`),l={specular:{value:new fn().setHex(16777215)},glossiness:{value:1},specularMap:{value:null},glossinessMap:{value:null}};this._extraUniforms=l,this.onBeforeCompile=function(r){for(const c in l)r.uniforms[c]=l[c];r.fragmentShader=r.fragmentShader.replace("uniform float roughness;","uniform vec3 specular;").replace("uniform float metalness;","uniform float glossiness;").replace("#include <roughnessmap_pars_fragment>",g).replace("#include <metalnessmap_pars_fragment>",n).replace("#include <roughnessmap_fragment>",I).replace("#include <metalnessmap_fragment>",o).replace("#include <lights_physical_fragment>",i)},Object.defineProperties(this,{specular:{get:function(){return l.specular.value},set:function(r){l.specular.value=r}},specularMap:{get:function(){return l.specularMap.value},set:function(r){l.specularMap.value=r,r?this.defines.USE_SPECULARMAP="":delete this.defines.USE_SPECULARMAP}},glossiness:{get:function(){return l.glossiness.value},set:function(r){l.glossiness.value=r}},glossinessMap:{get:function(){return l.glossinessMap.value},set:function(r){l.glossinessMap.value=r,r?(this.defines.USE_GLOSSINESSMAP="",this.defines.USE_UV=""):(delete this.defines.USE_GLOSSINESSMAP,delete this.defines.USE_UV)}}}),delete this.metalness,delete this.roughness,delete this.metalnessMap,delete this.roughnessMap,this.setValues(e)}copy(e){return super.copy(e),this.specularMap=e.specularMap,this.specular.copy(e.specular),this.glossinessMap=e.glossinessMap,this.glossiness=e.glossiness,delete this.metalness,delete this.roughness,delete this.metalnessMap,delete this.roughnessMap,this}}class zK{constructor(){this.name=Ne.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,this.specularGlossinessParams=["color","map","lightMap","lightMapIntensity","aoMap","aoMapIntensity","emissive","emissiveIntensity","emissiveMap","bumpMap","bumpScale","normalMap","normalMapType","displacementMap","displacementScale","displacementBias","specularMap","specular","glossinessMap","glossiness","alphaMap","envMap","envMapIntensity","refractionRatio"]}getMaterialType(){return Ih}extendParams(e,g,n){const I=g.extensions[this.name];e.color=new fn(1,1,1),e.opacity=1;const o=[];if(Array.isArray(I.diffuseFactor)){const i=I.diffuseFactor;e.color.fromArray(i),e.opacity=i[3]}if(I.diffuseTexture!==void 0&&o.push(n.assignTexture(e,"map",I.diffuseTexture)),e.emissive=new fn(0,0,0),e.glossiness=I.glossinessFactor!==void 0?I.glossinessFactor:1,e.specular=new fn(1,1,1),Array.isArray(I.specularFactor)&&e.specular.fromArray(I.specularFactor),I.specularGlossinessTexture!==void 0){const i=I.specularGlossinessTexture;o.push(n.assignTexture(e,"glossinessMap",i)),o.push(n.assignTexture(e,"specularMap",i))}return Promise.all(o)}createMaterial(e){const g=new Ih(e);return g.fog=!0,g.color=e.color,g.map=e.map===void 0?null:e.map,g.lightMap=null,g.lightMapIntensity=1,g.aoMap=e.aoMap===void 0?null:e.aoMap,g.aoMapIntensity=1,g.emissive=e.emissive,g.emissiveIntensity=1,g.emissiveMap=e.emissiveMap===void 0?null:e.emissiveMap,g.bumpMap=e.bumpMap===void 0?null:e.bumpMap,g.bumpScale=1,g.normalMap=e.normalMap===void 0?null:e.normalMap,g.normalMapType=Ew,e.normalScale&&(g.normalScale=e.normalScale),g.displacementMap=null,g.displacementScale=1,g.displacementBias=0,g.specularMap=e.specularMap===void 0?null:e.specularMap,g.specular=e.specular,g.glossinessMap=e.glossinessMap===void 0?null:e.glossinessMap,g.glossiness=e.glossiness,g.alphaMap=null,g.envMap=e.envMap===void 0?null:e.envMap,g.envMapIntensity=1,g.refractionRatio=.98,g}}class xK{constructor(){this.name=Ne.KHR_MESH_QUANTIZATION}}class $o extends iV{constructor(e,g,n,I){super(e,g,n,I)}copySampleValue_(e){const g=this.resultBuffer,n=this.sampleValues,I=this.valueSize,o=e*I*3+I;for(let i=0;i!==I;i++)g[i]=n[o+i];return g}}$o.prototype.beforeStart_=$o.prototype.copySampleValue_;$o.prototype.afterEnd_=$o.prototype.copySampleValue_;$o.prototype.interpolate_=function(t,e,g,n){const I=this.resultBuffer,o=this.sampleValues,i=this.valueSize,l=i*2,r=i*3,c=n-e,A=(g-e)/c,u=A*A,h=u*A,b=t*r,p=b-r,Z=-2*h+3*u,v=h-u,y=1-Z,m=v-u+A;for(let B=0;B!==i;B++){const w=o[p+B+i],X=o[p+B+l]*c,R=o[b+B+i],S=o[b+B]*c;I[B]=y*w+m*X+Z*R+v*S}return I};const LK=new oC;class JK extends $o{interpolate_(e,g,n,I){const o=super.interpolate_(e,g,n,I);return LK.fromArray(o).normalize().toArray(o),o}}const sI={FLOAT:5126,FLOAT_MAT3:35675,FLOAT_MAT4:35676,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,LINEAR:9729,REPEAT:10497,SAMPLER_2D:35678,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,UNSIGNED_BYTE:5121,UNSIGNED_SHORT:5123},ns={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},XB={9728:CV,9729:ki,9984:lV,9985:sV,9986:rV,9987:RZ},YB={33071:cV,33648:AV,10497:ld},KB={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},oh={POSITION:"position",NORMAL:"normal",TANGENT:"tangent",TEXCOORD_0:"uv",TEXCOORD_1:"uv2",COLOR_0:"color",WEIGHTS_0:"skinWeight",JOINTS_0:"skinIndex"},QI={scale:"scale",translation:"position",rotation:"quaternion",weights:"morphTargetInfluences"},MK={CUBICSPLINE:void 0,LINEAR:XZ,STEP:aV},Su={OPAQUE:"OPAQUE",MASK:"MASK",BLEND:"BLEND"};function EK(t){return t.DefaultMaterial===void 0&&(t.DefaultMaterial=new Fh({color:16777215,emissive:0,metalness:1,roughness:1,transparent:!1,depthTest:!0,side:uV})),t.DefaultMaterial}function ol(t,e,g){for(const n in g.extensions)t[n]===void 0&&(e.userData.gltfExtensions=e.userData.gltfExtensions||{},e.userData.gltfExtensions[n]=g.extensions[n])}function Ho(t,e){e.extras!==void 0&&(typeof e.extras=="object"?Object.assign(t.userData,e.extras):console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, "+e.extras))}function QK(t,e,g){let n=!1,I=!1;for(let l=0,r=e.length;l<r;l++){const c=e[l];if(c.POSITION!==void 0&&(n=!0),c.NORMAL!==void 0&&(I=!0),n&&I)break}if(!n&&!I)return Promise.resolve(t);const o=[],i=[];for(let l=0,r=e.length;l<r;l++){const c=e[l];if(n){const A=c.POSITION!==void 0?g.getDependency("accessor",c.POSITION):t.attributes.position;o.push(A)}if(I){const A=c.NORMAL!==void 0?g.getDependency("accessor",c.NORMAL):t.attributes.normal;i.push(A)}}return Promise.all([Promise.all(o),Promise.all(i)]).then(function(l){const r=l[0],c=l[1];return n&&(t.morphAttributes.position=r),I&&(t.morphAttributes.normal=c),t.morphTargetsRelative=!0,t})}function TK(t,e){if(t.updateMorphTargets(),e.weights!==void 0)for(let g=0,n=e.weights.length;g<n;g++)t.morphTargetInfluences[g]=e.weights[g];if(e.extras&&Array.isArray(e.extras.targetNames)){const g=e.extras.targetNames;if(t.morphTargetInfluences.length===g.length){t.morphTargetDictionary={};for(let n=0,I=g.length;n<I;n++)t.morphTargetDictionary[g[n]]=n}else console.warn("THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.")}}function UK(t){const e=t.extensions&&t.extensions[Ne.KHR_DRACO_MESH_COMPRESSION];let g;return e?g="draco:"+e.bufferView+":"+e.indices+":"+SB(e.attributes):g=t.indices+":"+SB(t.attributes)+":"+t.mode,g}function SB(t){let e="";const g=Object.keys(t).sort();for(let n=0,I=g.length;n<I;n++)e+=g[n]+":"+t[g[n]]+";";return e}function ih(t){switch(t){case Int8Array:return 1/127;case Uint8Array:return 1/255;case Int16Array:return 1/32767;case Uint16Array:return 1/65535;default:throw new Error("THREE.GLTFLoader: Unsupported normalized accessor component type.")}}class DK{constructor(e={},g={}){this.json=e,this.extensions={},this.plugins={},this.options=g,this.cache=new yK,this.associations=new Map,this.primitiveCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.textureCache={},this.nodeNamesUsed={},typeof createImageBitmap!="undefined"&&/Firefox|^((?!chrome|android).)*safari/i.test(navigator.userAgent)===!1?this.textureLoader=new Qw(this.options.manager):this.textureLoader=new lA(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new yc(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),this.options.crossOrigin==="use-credentials"&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,g){const n=this,I=this.json,o=this.extensions;this.cache.removeAll(),this._invokeAll(function(i){return i._markDefs&&i._markDefs()}),Promise.all(this._invokeAll(function(i){return i.beforeRoot&&i.beforeRoot()})).then(function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])}).then(function(i){const l={scene:i[0][I.scene||0],scenes:i[0],animations:i[1],cameras:i[2],asset:I.asset,parser:n,userData:{}};ol(o,l,I),Ho(l,I),Promise.all(n._invokeAll(function(r){return r.afterRoot&&r.afterRoot(l)})).then(function(){e(l)})}).catch(g)}_markDefs(){const e=this.json.nodes||[],g=this.json.skins||[],n=this.json.meshes||[];for(let I=0,o=g.length;I<o;I++){const i=g[I].joints;for(let l=0,r=i.length;l<r;l++)e[i[l]].isBone=!0}for(let I=0,o=e.length;I<o;I++){const i=e[I];i.mesh!==void 0&&(this._addNodeRef(this.meshCache,i.mesh),i.skin!==void 0&&(n[i.mesh].isSkinnedMesh=!0)),i.camera!==void 0&&this._addNodeRef(this.cameraCache,i.camera)}}_addNodeRef(e,g){g!==void 0&&(e.refs[g]===void 0&&(e.refs[g]=e.uses[g]=0),e.refs[g]++)}_getNodeRef(e,g,n){if(e.refs[g]<=1)return n;const I=n.clone(),o=(i,l)=>{const r=this.associations.get(i);r!=null&&this.associations.set(l,r);for(const[c,A]of i.children.entries())o(A,l.children[c])};return o(n,I),I.name+="_instance_"+e.uses[g]++,I}_invokeOne(e){const g=Object.values(this.plugins);g.push(this);for(let n=0;n<g.length;n++){const I=e(g[n]);if(I)return I}return null}_invokeAll(e){const g=Object.values(this.plugins);g.unshift(this);const n=[];for(let I=0;I<g.length;I++){const o=e(g[I]);o&&n.push(o)}return n}getDependency(e,g){const n=e+":"+g;let I=this.cache.get(n);if(!I){switch(e){case"scene":I=this.loadScene(g);break;case"node":I=this.loadNode(g);break;case"mesh":I=this._invokeOne(function(o){return o.loadMesh&&o.loadMesh(g)});break;case"accessor":I=this.loadAccessor(g);break;case"bufferView":I=this._invokeOne(function(o){return o.loadBufferView&&o.loadBufferView(g)});break;case"buffer":I=this.loadBuffer(g);break;case"material":I=this._invokeOne(function(o){return o.loadMaterial&&o.loadMaterial(g)});break;case"texture":I=this._invokeOne(function(o){return o.loadTexture&&o.loadTexture(g)});break;case"skin":I=this.loadSkin(g);break;case"animation":I=this.loadAnimation(g);break;case"camera":I=this.loadCamera(g);break;default:throw new Error("Unknown type: "+e)}this.cache.add(n,I)}return I}getDependencies(e){let g=this.cache.get(e);if(!g){const n=this,I=this.json[e+(e==="mesh"?"es":"s")]||[];g=Promise.all(I.map(function(o,i){return n.getDependency(e,i)})),this.cache.add(e,g)}return g}loadBuffer(e){const g=this.json.buffers[e],n=this.fileLoader;if(g.type&&g.type!=="arraybuffer")throw new Error("THREE.GLTFLoader: "+g.type+" buffer type is not supported.");if(g.uri===void 0&&e===0)return Promise.resolve(this.extensions[Ne.KHR_BINARY_GLTF].body);const I=this.options;return new Promise(function(o,i){n.load(Qo.resolveURL(g.uri,I.path),o,void 0,function(){i(new Error('THREE.GLTFLoader: Failed to load buffer "'+g.uri+'".'))})})}loadBufferView(e){const g=this.json.bufferViews[e];return this.getDependency("buffer",g.buffer).then(function(n){const I=g.byteLength||0,o=g.byteOffset||0;return n.slice(o,o+I)})}loadAccessor(e){const g=this,n=this.json,I=this.json.accessors[e];if(I.bufferView===void 0&&I.sparse===void 0)return Promise.resolve(null);const o=[];return I.bufferView!==void 0?o.push(this.getDependency("bufferView",I.bufferView)):o.push(null),I.sparse!==void 0&&(o.push(this.getDependency("bufferView",I.sparse.indices.bufferView)),o.push(this.getDependency("bufferView",I.sparse.values.bufferView))),Promise.all(o).then(function(i){const l=i[0],r=KB[I.type],c=ns[I.componentType],A=c.BYTES_PER_ELEMENT,u=A*r,h=I.byteOffset||0,b=I.bufferView!==void 0?n.bufferViews[I.bufferView].byteStride:void 0,p=I.normalized===!0;let Z,v;if(b&&b!==u){const y=Math.floor(h/b),m="InterleavedBuffer:"+I.bufferView+":"+I.componentType+":"+y+":"+I.count;let B=g.cache.get(m);B||(Z=new c(l,y*b,I.count*b/A),B=new Tw(Z,b/A),g.cache.add(m,B)),v=new Uw(B,r,h%b/A,p)}else l===null?Z=new c(I.count*r):Z=new c(l,h,I.count*r),v=new fc(Z,r,p);if(I.sparse!==void 0){const y=KB.SCALAR,m=ns[I.sparse.indices.componentType],B=I.sparse.indices.byteOffset||0,w=I.sparse.values.byteOffset||0,X=new m(i[1],B,I.sparse.count*y),R=new c(i[2],w,I.sparse.count*r);l!==null&&(v=new fc(v.array.slice(),v.itemSize,v.normalized));for(let S=0,Y=X.length;S<Y;S++){const k=X[S];if(v.setX(k,R[S*r]),r>=2&&v.setY(k,R[S*r+1]),r>=3&&v.setZ(k,R[S*r+2]),r>=4&&v.setW(k,R[S*r+3]),r>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}}return v})}loadTexture(e){const g=this.json,n=this.options,I=g.textures[e],o=g.images[I.source];let i=this.textureLoader;if(o.uri){const l=n.manager.getHandler(o.uri);l!==null&&(i=l)}return this.loadTextureImage(e,o,i)}loadTextureImage(e,g,n){const I=this,o=this.json,i=this.options,l=o.textures[e],r=(g.uri||g.bufferView)+":"+l.sampler;if(this.textureCache[r])return this.textureCache[r];const c=self.URL||self.webkitURL;let A=g.uri||"",u=!1;if(g.bufferView!==void 0)A=I.getDependency("bufferView",g.bufferView).then(function(b){u=!0;const p=new Blob([b],{type:g.mimeType});return A=c.createObjectURL(p),A});else if(g.uri===void 0)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const h=Promise.resolve(A).then(function(b){return new Promise(function(p,Z){let v=p;n.isImageBitmapLoader===!0&&(v=function(y){const m=new qm(y);m.needsUpdate=!0,p(m)}),n.load(Qo.resolveURL(b,i.path),v,void 0,Z)})}).then(function(b){u===!0&&c.revokeObjectURL(A),b.flipY=!1,l.name&&(b.name=l.name);const Z=(o.samplers||{})[l.sampler]||{};return b.magFilter=XB[Z.magFilter]||ki,b.minFilter=XB[Z.minFilter]||RZ,b.wrapS=YB[Z.wrapS]||ld,b.wrapT=YB[Z.wrapT]||ld,I.associations.set(b,{textures:e}),b}).catch(function(){return console.error("THREE.GLTFLoader: Couldn't load texture",A),null});return this.textureCache[r]=h,h}assignTexture(e,g,n){const I=this;return this.getDependency("texture",n.index).then(function(o){if(n.texCoord!==void 0&&n.texCoord!=0&&!(g==="aoMap"&&n.texCoord==1)&&console.warn("THREE.GLTFLoader: Custom UV set "+n.texCoord+" for texture "+g+" not yet supported."),I.extensions[Ne.KHR_TEXTURE_TRANSFORM]){const i=n.extensions!==void 0?n.extensions[Ne.KHR_TEXTURE_TRANSFORM]:void 0;if(i){const l=I.associations.get(o);o=I.extensions[Ne.KHR_TEXTURE_TRANSFORM].extendTexture(o,i),I.associations.set(o,l)}}return e[g]=o,o})}assignFinalMaterial(e){const g=e.geometry;let n=e.material;const I=g.attributes.tangent===void 0,o=g.attributes.color!==void 0,i=g.attributes.normal===void 0;if(e.isPoints){const l="PointsMaterial:"+n.uuid;let r=this.cache.get(l);r||(r=new Dw,Pa.prototype.copy.call(r,n),r.color.copy(n.color),r.map=n.map,r.sizeAttenuation=!1,this.cache.add(l,r)),n=r}else if(e.isLine){const l="LineBasicMaterial:"+n.uuid;let r=this.cache.get(l);r||(r=new jw,Pa.prototype.copy.call(r,n),r.color.copy(n.color),this.cache.add(l,r)),n=r}if(I||o||i){let l="ClonedMaterial:"+n.uuid+":";n.isGLTFSpecularGlossinessMaterial&&(l+="specular-glossiness:"),I&&(l+="derivative-tangents:"),o&&(l+="vertex-colors:"),i&&(l+="flat-shading:");let r=this.cache.get(l);r||(r=n.clone(),o&&(r.vertexColors=!0),i&&(r.flatShading=!0),I&&(r.normalScale&&(r.normalScale.y*=-1),r.clearcoatNormalScale&&(r.clearcoatNormalScale.y*=-1)),this.cache.add(l,r),this.associations.set(r,this.associations.get(n))),n=r}n.aoMap&&g.attributes.uv2===void 0&&g.attributes.uv!==void 0&&g.setAttribute("uv2",g.attributes.uv),e.material=n}getMaterialType(){return Fh}loadMaterial(e){const g=this,n=this.json,I=this.extensions,o=n.materials[e];let i;const l={},r=o.extensions||{},c=[];if(r[Ne.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]){const u=I[Ne.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS];i=u.getMaterialType(),c.push(u.extendParams(l,o,g))}else if(r[Ne.KHR_MATERIALS_UNLIT]){const u=I[Ne.KHR_MATERIALS_UNLIT];i=u.getMaterialType(),c.push(u.extendParams(l,o,g))}else{const u=o.pbrMetallicRoughness||{};if(l.color=new fn(1,1,1),l.opacity=1,Array.isArray(u.baseColorFactor)){const h=u.baseColorFactor;l.color.fromArray(h),l.opacity=h[3]}u.baseColorTexture!==void 0&&c.push(g.assignTexture(l,"map",u.baseColorTexture)),l.metalness=u.metallicFactor!==void 0?u.metallicFactor:1,l.roughness=u.roughnessFactor!==void 0?u.roughnessFactor:1,u.metallicRoughnessTexture!==void 0&&(c.push(g.assignTexture(l,"metalnessMap",u.metallicRoughnessTexture)),c.push(g.assignTexture(l,"roughnessMap",u.metallicRoughnessTexture))),i=this._invokeOne(function(h){return h.getMaterialType&&h.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(h){return h.extendMaterialParams&&h.extendMaterialParams(e,l)})))}o.doubleSided===!0&&(l.side=Ow);const A=o.alphaMode||Su.OPAQUE;if(A===Su.BLEND?(l.transparent=!0,l.depthWrite=!1):(l.transparent=!1,A===Su.MASK&&(l.alphaTest=o.alphaCutoff!==void 0?o.alphaCutoff:.5)),o.normalTexture!==void 0&&i!==Fi&&(c.push(g.assignTexture(l,"normalMap",o.normalTexture)),l.normalScale=new _g(1,1),o.normalTexture.scale!==void 0)){const u=o.normalTexture.scale;l.normalScale.set(u,u)}return o.occlusionTexture!==void 0&&i!==Fi&&(c.push(g.assignTexture(l,"aoMap",o.occlusionTexture)),o.occlusionTexture.strength!==void 0&&(l.aoMapIntensity=o.occlusionTexture.strength)),o.emissiveFactor!==void 0&&i!==Fi&&(l.emissive=new fn().fromArray(o.emissiveFactor)),o.emissiveTexture!==void 0&&i!==Fi&&c.push(g.assignTexture(l,"emissiveMap",o.emissiveTexture)),Promise.all(c).then(function(){let u;return i===Ih?u=I[Ne.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(l):u=new i(l),o.name&&(u.name=o.name),u.map&&(u.map.encoding=Cd),u.emissiveMap&&(u.emissiveMap.encoding=Cd),Ho(u,o),g.associations.set(u,{materials:e}),o.extensions&&ol(I,u,o),u})}createUniqueName(e){const g=Pw.sanitizeNodeName(e||"");let n=g;for(let I=1;this.nodeNamesUsed[n];++I)n=g+"_"+I;return this.nodeNamesUsed[n]=!0,n}loadGeometries(e){const g=this,n=this.extensions,I=this.primitiveCache;function o(l){return n[Ne.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(l,g).then(function(r){return HB(r,l,g)})}const i=[];for(let l=0,r=e.length;l<r;l++){const c=e[l],A=UK(c),u=I[A];if(u)i.push(u.promise);else{let h;c.extensions&&c.extensions[Ne.KHR_DRACO_MESH_COMPRESSION]?h=o(c):h=HB(new Bl,c,g),I[A]={primitive:c,promise:h},i.push(h)}}return Promise.all(i)}loadMesh(e){const g=this,n=this.json,I=this.extensions,o=n.meshes[e],i=o.primitives,l=[];for(let r=0,c=i.length;r<c;r++){const A=i[r].material===void 0?EK(this.cache):this.getDependency("material",i[r].material);l.push(A)}return l.push(g.loadGeometries(i)),Promise.all(l).then(function(r){const c=r.slice(0,r.length-1),A=r[r.length-1],u=[];for(let b=0,p=A.length;b<p;b++){const Z=A[b],v=i[b];let y;const m=c[b];if(v.mode===sI.TRIANGLES||v.mode===sI.TRIANGLE_STRIP||v.mode===sI.TRIANGLE_FAN||v.mode===void 0)y=o.isSkinnedMesh===!0?new _w(Z,m):new En(Z,m),y.isSkinnedMesh===!0&&!y.geometry.attributes.skinWeight.normalized&&y.normalizeSkinWeights(),v.mode===sI.TRIANGLE_STRIP?y.geometry=NB(y.geometry,dV):v.mode===sI.TRIANGLE_FAN&&(y.geometry=NB(y.geometry,YZ));else if(v.mode===sI.LINES)y=new qw(Z,m);else if(v.mode===sI.LINE_STRIP)y=new $w(Z,m);else if(v.mode===sI.LINE_LOOP)y=new eV(Z,m);else if(v.mode===sI.POINTS)y=new tV(Z,m);else throw new Error("THREE.GLTFLoader: Primitive mode unsupported: "+v.mode);Object.keys(y.geometry.morphAttributes).length>0&&TK(y,o),y.name=g.createUniqueName(o.name||"mesh_"+e),Ho(y,o),v.extensions&&ol(I,y,v),g.assignFinalMaterial(y),u.push(y)}for(let b=0,p=u.length;b<p;b++)g.associations.set(u[b],{meshes:e,primitives:b});if(u.length===1)return u[0];const h=new _a;g.associations.set(h,{meshes:e});for(let b=0,p=u.length;b<p;b++)h.add(u[b]);return h})}loadCamera(e){let g;const n=this.json.cameras[e],I=n[n.type];if(!I){console.warn("THREE.GLTFLoader: Missing camera parameters.");return}return n.type==="perspective"?g=new Yo(gV.radToDeg(I.yfov),I.aspectRatio||1,I.znear||1,I.zfar||2e6):n.type==="orthographic"&&(g=new ic(-I.xmag,I.xmag,I.ymag,-I.ymag,I.znear,I.zfar)),n.name&&(g.name=this.createUniqueName(n.name)),Ho(g,n),Promise.resolve(g)}loadSkin(e){const g=this.json.skins[e],n={joints:g.joints};return g.inverseBindMatrices===void 0?Promise.resolve(n):this.getDependency("accessor",g.inverseBindMatrices).then(function(I){return n.inverseBindMatrices=I,n})}loadAnimation(e){const n=this.json.animations[e],I=[],o=[],i=[],l=[],r=[];for(let c=0,A=n.channels.length;c<A;c++){const u=n.channels[c],h=n.samplers[u.sampler],b=u.target,p=b.node!==void 0?b.node:b.id,Z=n.parameters!==void 0?n.parameters[h.input]:h.input,v=n.parameters!==void 0?n.parameters[h.output]:h.output;I.push(this.getDependency("node",p)),o.push(this.getDependency("accessor",Z)),i.push(this.getDependency("accessor",v)),l.push(h),r.push(b)}return Promise.all([Promise.all(I),Promise.all(o),Promise.all(i),Promise.all(l),Promise.all(r)]).then(function(c){const A=c[0],u=c[1],h=c[2],b=c[3],p=c[4],Z=[];for(let y=0,m=A.length;y<m;y++){const B=A[y],w=u[y],X=h[y],R=b[y],S=p[y];if(B===void 0)continue;B.updateMatrix(),B.matrixAutoUpdate=!0;let Y;switch(QI[S.path]){case QI.weights:Y=bV;break;case QI.rotation:Y=$m;break;case QI.position:case QI.scale:default:Y=hV;break}const k=B.name?B.name:B.uuid,N=R.interpolation!==void 0?MK[R.interpolation]:XZ,z=[];QI[S.path]===QI.weights?B.traverse(function(j){j.morphTargetInfluences&&z.push(j.name?j.name:j.uuid)}):z.push(k);let M=X.array;if(X.normalized){const j=ih(M.constructor),F=new Float32Array(M.length);for(let L=0,P=M.length;L<P;L++)F[L]=M[L]*j;M=F}for(let j=0,F=z.length;j<F;j++){const L=new Y(z[j]+"."+QI[S.path],w.array,M,N);R.interpolation==="CUBICSPLINE"&&(L.createInterpolant=function($){const T=this instanceof $m?JK:$o;return new T(this.times,this.values,this.getValueSize()/3,$)},L.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline=!0),Z.push(L)}}const v=n.name?n.name:"animation_"+e;return new nV(v,void 0,Z)})}createNodeMesh(e){const g=this.json,n=this,I=g.nodes[e];return I.mesh===void 0?null:n.getDependency("mesh",I.mesh).then(function(o){const i=n._getNodeRef(n.meshCache,I.mesh,o);return I.weights!==void 0&&i.traverse(function(l){if(!!l.isMesh)for(let r=0,c=I.weights.length;r<c;r++)l.morphTargetInfluences[r]=I.weights[r]}),i})}loadNode(e){const g=this.json,n=this.extensions,I=this,o=g.nodes[e],i=o.name?I.createUniqueName(o.name):"";return function(){const l=[],r=I._invokeOne(function(c){return c.createNodeMesh&&c.createNodeMesh(e)});return r&&l.push(r),o.camera!==void 0&&l.push(I.getDependency("camera",o.camera).then(function(c){return I._getNodeRef(I.cameraCache,o.camera,c)})),I._invokeAll(function(c){return c.createNodeAttachment&&c.createNodeAttachment(e)}).forEach(function(c){l.push(c)}),Promise.all(l)}().then(function(l){let r;if(o.isBone===!0?r=new IV:l.length>1?r=new _a:l.length===1?r=l[0]:r=new ls,r!==l[0])for(let c=0,A=l.length;c<A;c++)r.add(l[c]);if(o.name&&(r.userData.name=o.name,r.name=i),Ho(r,o),o.extensions&&ol(n,r,o),o.matrix!==void 0){const c=new sA;c.fromArray(o.matrix),r.applyMatrix4(c)}else o.translation!==void 0&&r.position.fromArray(o.translation),o.rotation!==void 0&&r.quaternion.fromArray(o.rotation),o.scale!==void 0&&r.scale.fromArray(o.scale);return I.associations.has(r)||I.associations.set(r,{}),I.associations.get(r).nodes=e,r})}loadScene(e){const g=this.json,n=this.extensions,I=this.json.scenes[e],o=this,i=new _a;I.name&&(i.name=o.createUniqueName(I.name)),Ho(i,I),I.extensions&&ol(n,i,I);const l=I.nodes||[],r=[];for(let c=0,A=l.length;c<A;c++)r.push(iv(l[c],i,g,o));return Promise.all(r).then(function(){const c=A=>{const u=new Map;for(const[h,b]of o.associations)(h instanceof Pa||h instanceof qm)&&u.set(h,b);return A.traverse(h=>{const b=o.associations.get(h);b!=null&&u.set(h,b)}),u};return o.associations=c(i),i})}}function iv(t,e,g,n){const I=g.nodes[t];return n.getDependency("node",t).then(function(o){if(I.skin===void 0)return o;let i;return n.getDependency("skin",I.skin).then(function(l){i=l;const r=[];for(let c=0,A=i.joints.length;c<A;c++)r.push(n.getDependency("node",i.joints[c]));return Promise.all(r)}).then(function(l){return o.traverse(function(r){if(!r.isMesh)return;const c=[],A=[];for(let u=0,h=l.length;u<h;u++){const b=l[u];if(b){c.push(b);const p=new sA;i.inverseBindMatrices!==void 0&&p.fromArray(i.inverseBindMatrices.array,u*16),A.push(p)}else console.warn('THREE.GLTFLoader: Joint "%s" could not be found.',i.joints[u])}r.bind(new oV(c,A),r.matrixWorld)}),o})}).then(function(o){e.add(o);const i=[];if(I.children){const l=I.children;for(let r=0,c=l.length;r<c;r++){const A=l[r];i.push(iv(A,o,g,n))}}return Promise.all(i)})}function jK(t,e,g){const n=e.attributes,I=new GV;if(n.POSITION!==void 0){const l=g.json.accessors[n.POSITION],r=l.min,c=l.max;if(r!==void 0&&c!==void 0){if(I.set(new mt(r[0],r[1],r[2]),new mt(c[0],c[1],c[2])),l.normalized){const A=ih(ns[l.componentType]);I.min.multiplyScalar(A),I.max.multiplyScalar(A)}}else{console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION.");return}}else return;const o=e.targets;if(o!==void 0){const l=new mt,r=new mt;for(let c=0,A=o.length;c<A;c++){const u=o[c];if(u.POSITION!==void 0){const h=g.json.accessors[u.POSITION],b=h.min,p=h.max;if(b!==void 0&&p!==void 0){if(r.setX(Math.max(Math.abs(b[0]),Math.abs(p[0]))),r.setY(Math.max(Math.abs(b[1]),Math.abs(p[1]))),r.setZ(Math.max(Math.abs(b[2]),Math.abs(p[2]))),h.normalized){const Z=ih(ns[h.componentType]);r.multiplyScalar(Z)}l.max(r)}else console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION.")}}I.expandByVector(l)}t.boundingBox=I;const i=new mV;I.getCenter(i.center),i.radius=I.min.distanceTo(I.max)/2,t.boundingSphere=i}function HB(t,e,g){const n=e.attributes,I=[];function o(i,l){return g.getDependency("accessor",i).then(function(r){t.setAttribute(l,r)})}for(const i in n){const l=oh[i]||i.toLowerCase();l in t.attributes||I.push(o(n[i],l))}if(e.indices!==void 0&&!t.index){const i=g.getDependency("accessor",e.indices).then(function(l){t.setIndex(l)});I.push(i)}return Ho(t,e),jK(t,e,g),Promise.all(I).then(function(){return e.targets!==void 0?QK(t,e.targets,g):t})}function NB(t,e){let g=t.getIndex();if(g===null){const i=[],l=t.getAttribute("position");if(l!==void 0){for(let r=0;r<l.count;r++)i.push(r);t.setIndex(i),g=t.getIndex()}else return console.error("THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."),t}const n=g.count-2,I=[];if(e===YZ)for(let i=1;i<=n;i++)I.push(g.getX(0)),I.push(g.getX(i)),I.push(g.getX(i+1));else for(let i=0;i<n;i++)i%2===0?(I.push(g.getX(i)),I.push(g.getX(i+1)),I.push(g.getX(i+2))):(I.push(g.getX(i+2)),I.push(g.getX(i+1)),I.push(g.getX(i)));I.length/3!==n&&console.error("THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.");const o=t.clone();return o.setIndex(I),o}class OK extends pV{constructor(e){super(e);this.type=dl}parse(e){const l=function(B,w){switch(B){case 1:console.error("THREE.RGBELoader Read Error: "+(w||""));break;case 2:console.error("THREE.RGBELoader Write Error: "+(w||""));break;case 3:console.error("THREE.RGBELoader Bad File Format: "+(w||""));break;default:case 4:console.error("THREE.RGBELoader: Error: "+(w||""))}return-1},u=`
|
|
66
|
+
`,h=function(B,w,X){w=w||1024;let S=B.pos,Y=-1,k=0,N="",z=String.fromCharCode.apply(null,new Uint16Array(B.subarray(S,S+128)));for(;0>(Y=z.indexOf(u))&&k<w&&S<B.byteLength;)N+=z,k+=z.length,S+=128,z+=String.fromCharCode.apply(null,new Uint16Array(B.subarray(S,S+128)));return-1<Y?(X!==!1&&(B.pos+=k+Y+1),N+z.slice(0,Y)):!1},b=function(B){const w=/^#\?(\S+)/,X=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,R=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,S=/^\s*FORMAT=(\S+)\s*$/,Y=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,k={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let N,z;if(B.pos>=B.byteLength||!(N=h(B)))return l(1,"no header found");if(!(z=N.match(w)))return l(3,"bad initial token");for(k.valid|=1,k.programtype=z[1],k.string+=N+`
|
|
67
|
+
`;N=h(B),N!==!1;){if(k.string+=N+`
|
|
68
|
+
`,N.charAt(0)==="#"){k.comments+=N+`
|
|
69
|
+
`;continue}if((z=N.match(X))&&(k.gamma=parseFloat(z[1])),(z=N.match(R))&&(k.exposure=parseFloat(z[1])),(z=N.match(S))&&(k.valid|=2,k.format=z[1]),(z=N.match(Y))&&(k.valid|=4,k.height=parseInt(z[1],10),k.width=parseInt(z[2],10)),k.valid&2&&k.valid&4)break}return k.valid&2?k.valid&4?k:l(3,"missing image size specifier"):l(3,"missing format specifier")},p=function(B,w,X){const R=w;if(R<8||R>32767||B[0]!==2||B[1]!==2||B[2]&128)return new Uint8Array(B);if(R!==(B[2]<<8|B[3]))return l(3,"wrong scanline width");const S=new Uint8Array(4*w*X);if(!S.length)return l(4,"unable to allocate buffer space");let Y=0,k=0;const N=4*R,z=new Uint8Array(4),M=new Uint8Array(N);let j=X;for(;j>0&&k<B.byteLength;){if(k+4>B.byteLength)return l(1);if(z[0]=B[k++],z[1]=B[k++],z[2]=B[k++],z[3]=B[k++],z[0]!=2||z[1]!=2||(z[2]<<8|z[3])!=R)return l(3,"bad rgbe scanline format");let F=0,L;for(;F<N&&k<B.byteLength;){L=B[k++];const $=L>128;if($&&(L-=128),L===0||F+L>N)return l(3,"bad scanline data");if($){const T=B[k++];for(let q=0;q<L;q++)M[F++]=T}else M.set(B.subarray(k,k+L),F),F+=L,k+=L}const P=R;for(let $=0;$<P;$++){let T=0;S[Y]=M[$+T],T+=R,S[Y+1]=M[$+T],T+=R,S[Y+2]=M[$+T],T+=R,S[Y+3]=M[$+T],Y+=4}j--}return S},Z=function(B,w,X,R){const S=B[w+3],Y=Math.pow(2,S-128)/255;X[R+0]=B[w+0]*Y,X[R+1]=B[w+1]*Y,X[R+2]=B[w+2]*Y,X[R+3]=1},v=function(B,w,X,R){const S=B[w+3],Y=Math.pow(2,S-128)/255;X[R+0]=pr.toHalfFloat(Math.min(B[w+0]*Y,65504)),X[R+1]=pr.toHalfFloat(Math.min(B[w+1]*Y,65504)),X[R+2]=pr.toHalfFloat(Math.min(B[w+2]*Y,65504)),X[R+3]=pr.toHalfFloat(1)},y=new Uint8Array(e);y.pos=0;const m=b(y);if(m!==-1){const B=m.width,w=m.height,X=p(y.subarray(y.pos),B,w);if(X!==-1){let R,S,Y,k;switch(this.type){case qa:k=X.length/4;const N=new Float32Array(k*4);for(let M=0;M<k;M++)Z(X,M*4,N,M*4);R=N,Y=qa;break;case dl:k=X.length/4;const z=new Uint16Array(k*4);for(let M=0;M<k;M++)v(X,M*4,z,M*4);R=z,Y=dl;break;default:console.error("THREE.RGBELoader: unsupported type: ",this.type);break}return{width:B,height:w,data:R,header:m.string,gamma:m.gamma,exposure:m.exposure,format:S,type:Y}}}return null}setDataType(e){return this.type=e,this}load(e,g,n,I){function o(i,l){switch(i.type){case qa:i.encoding=ep,i.minFilter=ki,i.magFilter=ki,i.generateMipmaps=!1,i.flipY=!0;break;case dl:i.encoding=ep,i.minFilter=ki,i.magFilter=ki,i.generateMipmaps=!1,i.flipY=!0;break}g&&g(i,l)}return super.load(e,o,n,I)}}const Hu=new WeakMap;class PK extends VZ{constructor(e){super(e);this.decoderPath="",this.decoderConfig={},this.decoderBinary=null,this.decoderPending=null,this.workerLimit=4,this.workerPool=[],this.workerNextTaskID=1,this.workerSourceURL="",this.defaultAttributeIDs={position:"POSITION",normal:"NORMAL",color:"COLOR",uv:"TEX_COORD"},this.defaultAttributeTypes={position:"Float32Array",normal:"Float32Array",color:"Float32Array",uv:"Float32Array"}}setDecoderPath(e){return this.decoderPath=e,this}setDecoderConfig(e){return this.decoderConfig=e,this}setWorkerLimit(e){return this.workerLimit=e,this}load(e,g,n,I){const o=new yc(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(this.withCredentials),o.load(e,i=>{const l={attributeIDs:this.defaultAttributeIDs,attributeTypes:this.defaultAttributeTypes,useUniqueIDs:!1};this.decodeGeometry(i,l).then(g).catch(I)},n,I)}decodeDracoFile(e,g,n,I){const o={attributeIDs:n||this.defaultAttributeIDs,attributeTypes:I||this.defaultAttributeTypes,useUniqueIDs:!!n};this.decodeGeometry(e,o).then(g)}decodeGeometry(e,g){for(const r in g.attributeTypes){const c=g.attributeTypes[r];c.BYTES_PER_ELEMENT!==void 0&&(g.attributeTypes[r]=c.name)}const n=JSON.stringify(g);if(Hu.has(e)){const r=Hu.get(e);if(r.key===n)return r.promise;if(e.byteLength===0)throw new Error("THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.")}let I;const o=this.workerNextTaskID++,i=e.byteLength,l=this._getWorker(o,i).then(r=>(I=r,new Promise((c,A)=>{I._callbacks[o]={resolve:c,reject:A},I.postMessage({type:"decode",id:o,taskConfig:g,buffer:e},[e])}))).then(r=>this._createGeometry(r.geometry));return l.catch(()=>!0).then(()=>{I&&o&&this._releaseTask(I,o)}),Hu.set(e,{key:n,promise:l}),l}_createGeometry(e){const g=new Bl;e.index&&g.setIndex(new fc(e.index.array,1));for(let n=0;n<e.attributes.length;n++){const I=e.attributes[n],o=I.name,i=I.array,l=I.itemSize;g.setAttribute(o,new fc(i,l))}return g}_loadLibrary(e,g){const n=new yc(this.manager);return n.setPath(this.decoderPath),n.setResponseType(g),n.setWithCredentials(this.withCredentials),new Promise((I,o)=>{n.load(e,I,void 0,o)})}preload(){return this._initDecoder(),this}_initDecoder(){if(this.decoderPending)return this.decoderPending;const e=typeof WebAssembly!="object"||this.decoderConfig.type==="js",g=[];return e?g.push(this._loadLibrary("draco_decoder.js","text")):(g.push(this._loadLibrary("draco_wasm_wrapper.js","text")),g.push(this._loadLibrary("draco_decoder.wasm","arraybuffer"))),this.decoderPending=Promise.all(g).then(n=>{const I=n[0];e||(this.decoderConfig.wasmBinary=n[1]);const o=_K.toString(),i=["/* draco decoder */",I,"","/* worker */",o.substring(o.indexOf("{")+1,o.lastIndexOf("}"))].join(`
|
|
70
|
+
`);this.workerSourceURL=URL.createObjectURL(new Blob([i]))}),this.decoderPending}_getWorker(e,g){return this._initDecoder().then(()=>{if(this.workerPool.length<this.workerLimit){const I=new Worker(this.workerSourceURL);I._callbacks={},I._taskCosts={},I._taskLoad=0,I.postMessage({type:"init",decoderConfig:this.decoderConfig}),I.onmessage=function(o){const i=o.data;switch(i.type){case"decode":I._callbacks[i.id].resolve(i);break;case"error":I._callbacks[i.id].reject(i);break;default:console.error('THREE.DRACOLoader: Unexpected message, "'+i.type+'"')}},this.workerPool.push(I)}else this.workerPool.sort(function(I,o){return I._taskLoad>o._taskLoad?-1:1});const n=this.workerPool[this.workerPool.length-1];return n._taskCosts[e]=g,n._taskLoad+=g,n})}_releaseTask(e,g){e._taskLoad-=e._taskCosts[g],delete e._callbacks[g],delete e._taskCosts[g]}debug(){console.log("Task load: ",this.workerPool.map(e=>e._taskLoad))}dispose(){for(let e=0;e<this.workerPool.length;++e)this.workerPool[e].terminate();return this.workerPool.length=0,this}}function _K(){let t,e;onmessage=function(i){const l=i.data;switch(l.type){case"init":t=l.decoderConfig,e=new Promise(function(A){t.onModuleLoaded=function(u){A({draco:u})},DracoDecoderModule(t)});break;case"decode":const r=l.buffer,c=l.taskConfig;e.then(A=>{const u=A.draco,h=new u.Decoder,b=new u.DecoderBuffer;b.Init(new Int8Array(r),r.byteLength);try{const p=g(u,h,b,c),Z=p.attributes.map(v=>v.array.buffer);p.index&&Z.push(p.index.array.buffer),self.postMessage({type:"decode",id:l.id,geometry:p},Z)}catch(p){console.error(p),self.postMessage({type:"error",id:l.id,error:p.message})}finally{u.destroy(b),u.destroy(h)}});break}};function g(i,l,r,c){const A=c.attributeIDs,u=c.attributeTypes;let h,b;const p=l.GetEncodedGeometryType(r);if(p===i.TRIANGULAR_MESH)h=new i.Mesh,b=l.DecodeBufferToMesh(r,h);else if(p===i.POINT_CLOUD)h=new i.PointCloud,b=l.DecodeBufferToPointCloud(r,h);else throw new Error("THREE.DRACOLoader: Unexpected geometry type.");if(!b.ok()||h.ptr===0)throw new Error("THREE.DRACOLoader: Decoding failed: "+b.error_msg());const Z={index:null,attributes:[]};for(const v in A){const y=self[u[v]];let m,B;if(c.useUniqueIDs)B=A[v],m=l.GetAttributeByUniqueId(h,B);else{if(B=l.GetAttributeId(h,i[A[v]]),B===-1)continue;m=l.GetAttribute(h,B)}Z.attributes.push(I(i,l,h,v,y,m))}return p===i.TRIANGULAR_MESH&&(Z.index=n(i,l,h)),i.destroy(h),Z}function n(i,l,r){const A=r.num_faces()*3,u=A*4,h=i._malloc(u);l.GetTrianglesUInt32Array(r,u,h);const b=new Uint32Array(i.HEAPF32.buffer,h,A).slice();return i._free(h),{array:b,itemSize:1}}function I(i,l,r,c,A,u){const h=u.num_components(),p=r.num_points()*h,Z=p*A.BYTES_PER_ELEMENT,v=o(i,A),y=i._malloc(Z);l.GetAttributeDataArrayForAllPoints(r,u,v,Z,y);const m=new A(i.HEAPF32.buffer,y,p).slice();return i._free(y),{name:c,array:m,itemSize:h}}function o(i,l){switch(l){case Float32Array:return i.DT_FLOAT32;case Int8Array:return i.DT_INT8;case Int16Array:return i.DT_INT16;case Int32Array:return i.DT_INT32;case Uint8Array:return i.DT_UINT8;case Uint16Array:return i.DT_UINT16;case Uint32Array:return i.DT_UINT32}}}let Qr;const Nu=()=>{if(Qr)return Qr;const t="B9h9z9tFBBBF8fL9gBB9gLaaaaaFa9gEaaaB9gFaFa9gEaaaFaEMcBFFFGGGEIIILF9wFFFLEFBFKNFaFCx/IFMO/LFVK9tv9t9vq95GBt9f9f939h9z9t9f9j9h9s9s9f9jW9vq9zBBp9tv9z9o9v9wW9f9kv9j9v9kv9WvqWv94h919m9mvqBF8Z9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv94h919m9mvqBGy9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv949TvZ91v9u9jvBEn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9P9jWBIi9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9R919hWBLn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9F949wBKI9z9iqlBOc+x8ycGBM/qQFTa8jUUUUBCU/EBlHL8kUUUUBC9+RKGXAGCFJAI9LQBCaRKAE2BBC+gF9HQBALAEAIJHOAGlAGTkUUUBRNCUoBAG9uC/wgBZHKCUGAKCUG9JyRVAECFJRICBRcGXEXAcAF9PQFAVAFAclAcAVJAF9JyRMGXGXAG9FQBAMCbJHKC9wZRSAKCIrCEJCGrRQANCUGJRfCBRbAIRTEXGXAOATlAQ9PQBCBRISEMATAQJRIGXAS9FQBCBRtCBREEXGXAOAIlCi9PQBCBRISLMANCU/CBJAEJRKGXGXGXGXGXATAECKrJ2BBAtCKZrCEZfIBFGEBMAKhB83EBAKCNJhB83EBSEMAKAI2BIAI2BBHmCKrHYAYCE6HYy86BBAKCFJAICIJAYJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCGJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCEJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCIJAYAmJHY2BBAI2BFHmCKrHPAPCE6HPy86BBAKCLJAYAPJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCKJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCOJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCNJAYAmJHY2BBAI2BGHmCKrHPAPCE6HPy86BBAKCVJAYAPJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCcJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCMJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCSJAYAmJHm2BBAI2BEHICKrHYAYCE6HYy86BBAKCQJAmAYJHm2BBAICIrCEZHYAYCE6HYy86BBAKCfJAmAYJHm2BBAICGrCEZHYAYCE6HYy86BBAKCbJAmAYJHK2BBAICEZHIAICE6HIy86BBAKAIJRISGMAKAI2BNAI2BBHmCIrHYAYCb6HYy86BBAKCFJAICNJAYJHY2BBAmCbZHmAmCb6Hmy86BBAKCGJAYAmJHm2BBAI2BFHYCIrHPAPCb6HPy86BBAKCEJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCIJAmAYJHm2BBAI2BGHYCIrHPAPCb6HPy86BBAKCLJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCKJAmAYJHm2BBAI2BEHYCIrHPAPCb6HPy86BBAKCOJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCNJAmAYJHm2BBAI2BIHYCIrHPAPCb6HPy86BBAKCVJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCcJAmAYJHm2BBAI2BLHYCIrHPAPCb6HPy86BBAKCMJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCSJAmAYJHm2BBAI2BKHYCIrHPAPCb6HPy86BBAKCQJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCfJAmAYJHm2BBAI2BOHICIrHYAYCb6HYy86BBAKCbJAmAYJHK2BBAICbZHIAICb6HIy86BBAKAIJRISFMAKAI8pBB83BBAKCNJAICNJ8pBB83BBAICTJRIMAtCGJRtAECTJHEAS9JQBMMGXAIQBCBRISEMGXAM9FQBANAbJ2BBRtCBRKAfREEXAEANCU/CBJAKJ2BBHTCFrCBATCFZl9zAtJHt86BBAEAGJREAKCFJHKAM9HQBMMAfCFJRfAIRTAbCFJHbAG9HQBMMABAcAG9sJANCUGJAMAG9sTkUUUBpANANCUGJAMCaJAG9sJAGTkUUUBpMAMCBAIyAcJRcAIQBMC9+RKSFMCBC99AOAIlAGCAAGCA9Ly6yRKMALCU/EBJ8kUUUUBAKM+OmFTa8jUUUUBCoFlHL8kUUUUBC9+RKGXAFCE9uHOCtJAI9LQBCaRKAE2BBHNC/wFZC/gF9HQBANCbZHVCF9LQBALCoBJCgFCUFT+JUUUBpALC84Jha83EBALC8wJha83EBALC8oJha83EBALCAJha83EBALCiJha83EBALCTJha83EBALha83ENALha83EBAEAIJC9wJRcAECFJHNAOJRMGXAF9FQBCQCbAVCF6yRSABRECBRVCBRQCBRfCBRICBRKEXGXAMAcuQBC9+RKSEMGXGXAN2BBHOC/vF9LQBALCoBJAOCIrCa9zAKJCbZCEWJHb8oGIRTAb8oGBRtGXAOCbZHbAS9PQBALAOCa9zAIJCbZCGWJ8oGBAVAbyROAb9FRbGXGXAGCG9HQBABAt87FBABCIJAO87FBABCGJAT87FBSFMAEAtjGBAECNJAOjGBAECIJATjGBMAVAbJRVALCoBJAKCEWJHmAOjGBAmATjGIALAICGWJAOjGBALCoBJAKCFJCbZHKCEWJHTAtjGBATAOjGIAIAbJRIAKCFJRKSGMGXGXAbCb6QBAQAbJAbC989zJCFJRQSFMAM1BBHbCgFZROGXGXAbCa9MQBAMCFJRMSFMAM1BFHbCgBZCOWAOCgBZqROGXAbCa9MQBAMCGJRMSFMAM1BGHbCgBZCfWAOqROGXAbCa9MQBAMCEJRMSFMAM1BEHbCgBZCdWAOqROGXAbCa9MQBAMCIJRMSFMAM2BIC8cWAOqROAMCLJRMMAOCFrCBAOCFZl9zAQJRQMGXGXAGCG9HQBABAt87FBABCIJAQ87FBABCGJAT87FBSFMAEAtjGBAECNJAQjGBAECIJATjGBMALCoBJAKCEWJHOAQjGBAOATjGIALAICGWJAQjGBALCoBJAKCFJCbZHKCEWJHOAtjGBAOAQjGIAICFJRIAKCFJRKSFMGXAOCDF9LQBALAIAcAOCbZJ2BBHbCIrHTlCbZCGWJ8oGBAVCFJHtATyROALAIAblCbZCGWJ8oGBAtAT9FHmJHtAbCbZHTyRbAT9FRTGXGXAGCG9HQBABAV87FBABCIJAb87FBABCGJAO87FBSFMAEAVjGBAECNJAbjGBAECIJAOjGBMALAICGWJAVjGBALCoBJAKCEWJHYAOjGBAYAVjGIALAICFJHICbZCGWJAOjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAIAmJCbZHICGWJAbjGBALCoBJAKCGJCbZHKCEWJHOAVjGBAOAbjGIAKCFJRKAIATJRIAtATJRVSFMAVCBAM2BBHYyHTAOC/+F6HPJROAYCbZRtGXGXAYCIrHmQBAOCFJRbSFMAORbALAIAmlCbZCGWJ8oGBROMGXGXAtQBAbCFJRVSFMAbRVALAIAYlCbZCGWJ8oGBRbMGXGXAP9FQBAMCFJRYSFMAM1BFHYCgFZRTGXGXAYCa9MQBAMCGJRYSFMAM1BGHYCgBZCOWATCgBZqRTGXAYCa9MQBAMCEJRYSFMAM1BEHYCgBZCfWATqRTGXAYCa9MQBAMCIJRYSFMAM1BIHYCgBZCdWATqRTGXAYCa9MQBAMCLJRYSFMAMCKJRYAM2BLC8cWATqRTMATCFrCBATCFZl9zAQJHQRTMGXGXAmCb6QBAYRPSFMAY1BBHMCgFZROGXGXAMCa9MQBAYCFJRPSFMAY1BFHMCgBZCOWAOCgBZqROGXAMCa9MQBAYCGJRPSFMAY1BGHMCgBZCfWAOqROGXAMCa9MQBAYCEJRPSFMAY1BEHMCgBZCdWAOqROGXAMCa9MQBAYCIJRPSFMAYCLJRPAY2BIC8cWAOqROMAOCFrCBAOCFZl9zAQJHQROMGXGXAtCb6QBAPRMSFMAP1BBHMCgFZRbGXGXAMCa9MQBAPCFJRMSFMAP1BFHMCgBZCOWAbCgBZqRbGXAMCa9MQBAPCGJRMSFMAP1BGHMCgBZCfWAbqRbGXAMCa9MQBAPCEJRMSFMAP1BEHMCgBZCdWAbqRbGXAMCa9MQBAPCIJRMSFMAPCLJRMAP2BIC8cWAbqRbMAbCFrCBAbCFZl9zAQJHQRbMGXGXAGCG9HQBABAT87FBABCIJAb87FBABCGJAO87FBSFMAEATjGBAECNJAbjGBAECIJAOjGBMALCoBJAKCEWJHYAOjGBAYATjGIALAICGWJATjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAICFJHICbZCGWJAOjGBALCoBJAKCGJCbZCEWJHOATjGBAOAbjGIALAIAm9FAmCb6qJHICbZCGWJAbjGBAIAt9FAtCb6qJRIAKCEJRKMANCFJRNABCKJRBAECSJREAKCbZRKAICbZRIAfCEJHfAF9JQBMMCBC99AMAc6yRKMALCoFJ8kUUUUBAKM/tIFGa8jUUUUBCTlRLC9+RKGXAFCLJAI9LQBCaRKAE2BBC/+FZC/QF9HQBALhB83ENAECFJRKAEAIJC98JREGXAF9FQBGXAGCG6QBEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMALCNJAICFZCGWqHGAICGrCBAICFrCFZl9zAG8oGBJHIjGBABAIjGBABCIJRBAFCaJHFQBSGMMEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMABAICGrCBAICFrCFZl9zALCNJAICFZCGWqHI8oGBJHG87FBAIAGjGBABCGJRBAFCaJHFQBMMCBC99AKAE6yRKMAKM+lLKFaF99GaG99FaG99GXGXAGCI9HQBAF9FQFEXGXGX9DBBB8/9DBBB+/ABCGJHG1BB+yAB1BBHE+yHI+L+TABCFJHL1BBHK+yHO+L+THN9DBBBB9gHVyAN9DBB/+hANAN+U9DBBBBANAVyHcAc+MHMAECa3yAI+SHIAI+UAcAMAKCa3yAO+SHcAc+U+S+S+R+VHO+U+SHN+L9DBBB9P9d9FQBAN+oRESFMCUUUU94REMAGAE86BBGXGX9DBBB8/9DBBB+/Ac9DBBBB9gyAcAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMALAG86BBGXGX9DBBB8/9DBBB+/AI9DBBBB9gyAIAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMABAG86BBABCIJRBAFCaJHFQBSGMMAF9FQBEXGXGX9DBBB8/9DBBB+/ABCIJHG8uFB+yAB8uFBHE+yHI+L+TABCGJHL8uFBHK+yHO+L+THN9DBBBB9gHVyAN9DB/+g6ANAN+U9DBBBBANAVyHcAc+MHMAECa3yAI+SHIAI+UAcAMAKCa3yAO+SHcAc+U+S+S+R+VHO+U+SHN+L9DBBB9P9d9FQBAN+oRESFMCUUUU94REMAGAE87FBGXGX9DBBB8/9DBBB+/Ac9DBBBB9gyAcAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMALAG87FBGXGX9DBBB8/9DBBB+/AI9DBBBB9gyAIAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMABAG87FBABCNJRBAFCaJHFQBMMM/SEIEaE99EaF99GXAF9FQBCBREABRIEXGXGX9D/zI818/AICKJ8uFBHLCEq+y+VHKAI8uFB+y+UHO9DB/+g6+U9DBBB8/9DBBB+/AO9DBBBB9gy+SHN+L9DBBB9P9d9FQBAN+oRVSFMCUUUU94RVMAICIJ8uFBRcAICGJ8uFBRMABALCFJCEZAEqCFWJAV87FBGXGXAKAM+y+UHN9DB/+g6+U9DBBB8/9DBBB+/AN9DBBBB9gy+SHS+L9DBBB9P9d9FQBAS+oRMSFMCUUUU94RMMABALCGJCEZAEqCFWJAM87FBGXGXAKAc+y+UHK9DB/+g6+U9DBBB8/9DBBB+/AK9DBBBB9gy+SHS+L9DBBB9P9d9FQBAS+oRcSFMCUUUU94RcMABALCaJCEZAEqCFWJAc87FBGXGX9DBBU8/AOAO+U+TANAN+U+TAKAK+U+THO9DBBBBAO9DBBBB9gy+R9DB/+g6+U9DBBB8/+SHO+L9DBBB9P9d9FQBAO+oRcSFMCUUUU94RcMABALCEZAEqCFWJAc87FBAICNJRIAECIJREAFCaJHFQBMMM9JBGXAGCGrAF9sHF9FQBEXABAB8oGBHGCNWCN91+yAGCi91CnWCUUU/8EJ+++U84GBABCIJRBAFCaJHFQBMMM9TFEaCBCB8oGUkUUBHFABCEJC98ZJHBjGUkUUBGXGXAB8/BCTWHGuQBCaREABAGlCggEJCTrXBCa6QFMAFREMAEM/lFFFaGXGXAFABqCEZ9FQBABRESFMGXGXAGCT9PQBABRESFMABREEXAEAF8oGBjGBAECIJAFCIJ8oGBjGBAECNJAFCNJ8oGBjGBAECSJAFCSJ8oGBjGBAECTJREAFCTJRFAGC9wJHGCb9LQBMMAGCI9JQBEXAEAF8oGBjGBAFCIJRFAECIJREAGC98JHGCE9LQBMMGXAG9FQBEXAEAF2BB86BBAECFJREAFCFJRFAGCaJHGQBMMABMoFFGaGXGXABCEZ9FQBABRESFMAFCgFZC+BwsN9sRIGXGXAGCT9PQBABRESFMABREEXAEAIjGBAECSJAIjGBAECNJAIjGBAECIJAIjGBAECTJREAGC9wJHGCb9LQBMMAGCI9JQBEXAEAIjGBAECIJREAGC98JHGCE9LQBMMGXAG9FQBEXAEAF86BBAECFJREAGCaJHGQBMMABMMMFBCUNMIT9kBB",e="B9h9z9tFBBBFiI9gBB9gLaaaaaFa9gEaaaB9gFaFaEMcBBFBFFGGGEILF9wFFFLEFBFKNFaFCx/aFMO/LFVK9tv9t9vq95GBt9f9f939h9z9t9f9j9h9s9s9f9jW9vq9zBBp9tv9z9o9v9wW9f9kv9j9v9kv9WvqWv94h919m9mvqBG8Z9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv94h919m9mvqBIy9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv949TvZ91v9u9jvBLn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9P9jWBKi9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9R919hWBOn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9F949wBNI9z9iqlBVc+N9IcIBTEM9+FLa8jUUUUBCTlRBCBRFEXCBRGCBREEXABCNJAGJAECUaAFAGrCFZHIy86BBAEAIJREAGCFJHGCN9HQBMAFCx+YUUBJAE86BBAFCEWCxkUUBJAB8pEN83EBAFCFJHFCUG9HQBMMk8lLbaE97F9+FaL978jUUUUBCU/KBlHL8kUUUUBC9+RKGXAGCFJAI9LQBCaRKAE2BBC+gF9HQBALAEAIJHOAGlAG/8cBBCUoBAG9uC/wgBZHKCUGAKCUG9JyRNAECFJRKCBRVGXEXAVAF9PQFANAFAVlAVANJAF9JyRcGXGXAG9FQBAcCbJHIC9wZHMCE9sRSAMCFWRQAICIrCEJCGrRfCBRbEXAKRTCBRtGXEXGXAOATlAf9PQBCBRKSLMALCU/CBJAtAM9sJRmATAfJRKCBREGXAMCoB9JQBAOAKlC/gB9JQBCBRIEXAmAIJREGXGXGXGXGXATAICKrJ2BBHYCEZfIBFGEBMAECBDtDMIBSEMAEAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHiCEWCxkUUBJDBEBAiCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHiCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIBAKCIJAeDeBJAiCx+YUUBJ2BBJRKSGMAEAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHiCEWCxkUUBJDBEBAiCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHiCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIBAKCNJAeDeBJAiCx+YUUBJ2BBJRKSFMAEAKDBBBDMIBAKCTJRKMGXGXGXGXGXAYCGrCEZfIBFGEBMAECBDtDMITSEMAEAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHiCEWCxkUUBJDBEBAiCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHiCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMITAKCIJAeDeBJAiCx+YUUBJ2BBJRKSGMAEAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHiCEWCxkUUBJDBEBAiCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHiCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMITAKCNJAeDeBJAiCx+YUUBJ2BBJRKSFMAEAKDBBBDMITAKCTJRKMGXGXGXGXGXAYCIrCEZfIBFGEBMAECBDtDMIASEMAEAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHiCEWCxkUUBJDBEBAiCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHiCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIAAKCIJAeDeBJAiCx+YUUBJ2BBJRKSGMAEAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHiCEWCxkUUBJDBEBAiCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHiCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIAAKCNJAeDeBJAiCx+YUUBJ2BBJRKSFMAEAKDBBBDMIAAKCTJRKMGXGXGXGXGXAYCKrfIBFGEBMAECBDtDMI8wSEMAEAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHYCEWCxkUUBJDBEBAYCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHYCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMI8wAKCIJAeDeBJAYCx+YUUBJ2BBJRKSGMAEAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHYCEWCxkUUBJDBEBAYCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHYCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMI8wAKCNJAeDeBJAYCx+YUUBJ2BBJRKSFMAEAKDBBBDMI8wAKCTJRKMAICoBJREAICUFJAM9LQFAERIAOAKlC/fB9LQBMMGXAEAM9PQBAECErRIEXGXAOAKlCi9PQBCBRKSOMAmAEJRYGXGXGXGXGXATAECKrJ2BBAICKZrCEZfIBFGEBMAYCBDtDMIBSEMAYAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHiCEWCxkUUBJDBEBAiCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHiCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIBAKCIJAeDeBJAiCx+YUUBJ2BBJRKSGMAYAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPAPDQBFGENVcMILKOSQfbHeD8dBh+BsxoxoUwN0AeD8dFhxoUwkwk+gUa0sHnhTkAnsHnhNkAnsHn7CgFZHiCEWCxkUUBJDBEBAiCx+YUUBJDBBBHeAeDQBBBBBBBBBBBBBBBBAnhAk7CgFZHiCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIBAKCNJAeDeBJAiCx+YUUBJ2BBJRKSFMAYAKDBBBDMIBAKCTJRKMAICGJRIAECTJHEAM9JQBMMGXAK9FQBAKRTAtCFJHtCI6QGSFMMCBRKSEMGXAM9FQBALCUGJAbJREALAbJDBGBReCBRYEXAEALCU/CBJAYJHIDBIBHdCFD9tAdCFDbHPD9OD9hD9RHdAIAMJDBIBH8ZCFD9tA8ZAPD9OD9hD9RH8ZDQBTFtGmEYIPLdKeOnHpAIAQJDBIBHyCFD9tAyAPD9OD9hD9RHyAIASJDBIBH8cCFD9tA8cAPD9OD9hD9RH8cDQBTFtGmEYIPLdKeOnH8dDQBFTtGEmYILPdKOenHPAPDQBFGEBFGEBFGEBFGEAeD9uHeDyBjGBAEAGJHIAeAPAPDQILKOILKOILKOILKOD9uHeDyBjGBAIAGJHIAeAPAPDQNVcMNVcMNVcMNVcMD9uHeDyBjGBAIAGJHIAeAPAPDQSQfbSQfbSQfbSQfbD9uHeDyBjGBAIAGJHIAeApA8dDQNVi8ZcMpySQ8c8dfb8e8fHPAPDQBFGEBFGEBFGEBFGED9uHeDyBjGBAIAGJHIAeAPAPDQILKOILKOILKOILKOD9uHeDyBjGBAIAGJHIAeAPAPDQNVcMNVcMNVcMNVcMD9uHeDyBjGBAIAGJHIAeAPAPDQSQfbSQfbSQfbSQfbD9uHeDyBjGBAIAGJHIAeAdA8ZDQNiV8ZcpMyS8cQ8df8eb8fHdAyA8cDQNiV8ZcpMyS8cQ8df8eb8fH8ZDQBFTtGEmYILPdKOenHPAPDQBFGEBFGEBFGEBFGED9uHeDyBjGBAIAGJHIAeAPAPDQILKOILKOILKOILKOD9uHeDyBjGBAIAGJHIAeAPAPDQNVcMNVcMNVcMNVcMD9uHeDyBjGBAIAGJHIAeAPAPDQSQfbSQfbSQfbSQfbD9uHeDyBjGBAIAGJHIAeAdA8ZDQNVi8ZcMpySQ8c8dfb8e8fHPAPDQBFGEBFGEBFGEBFGED9uHeDyBjGBAIAGJHIAeAPAPDQILKOILKOILKOILKOD9uHeDyBjGBAIAGJHIAeAPAPDQNVcMNVcMNVcMNVcMD9uHeDyBjGBAIAGJHIAeAPAPDQSQfbSQfbSQfbSQfbD9uHeDyBjGBAIAGJREAYCTJHYAM9JQBMMAbCIJHbAG9JQBMMABAVAG9sJALCUGJAcAG9s/8cBBALALCUGJAcCaJAG9sJAG/8cBBMAcCBAKyAVJRVAKQBMC9+RKSFMCBC99AOAKlAGCAAGCA9Ly6yRKMALCU/KBJ8kUUUUBAKMNBT+BUUUBM+KmFTa8jUUUUBCoFlHL8kUUUUBC9+RKGXAFCE9uHOCtJAI9LQBCaRKAE2BBHNC/wFZC/gF9HQBANCbZHVCF9LQBALCoBJCgFCUF/8MBALC84Jha83EBALC8wJha83EBALC8oJha83EBALCAJha83EBALCiJha83EBALCTJha83EBALha83ENALha83EBAEAIJC9wJRcAECFJHNAOJRMGXAF9FQBCQCbAVCF6yRSABRECBRVCBRQCBRfCBRICBRKEXGXAMAcuQBC9+RKSEMGXGXAN2BBHOC/vF9LQBALCoBJAOCIrCa9zAKJCbZCEWJHb8oGIRTAb8oGBRtGXAOCbZHbAS9PQBALAOCa9zAIJCbZCGWJ8oGBAVAbyROAb9FRbGXGXAGCG9HQBABAt87FBABCIJAO87FBABCGJAT87FBSFMAEAtjGBAECNJAOjGBAECIJATjGBMAVAbJRVALCoBJAKCEWJHmAOjGBAmATjGIALAICGWJAOjGBALCoBJAKCFJCbZHKCEWJHTAtjGBATAOjGIAIAbJRIAKCFJRKSGMGXGXAbCb6QBAQAbJAbC989zJCFJRQSFMAM1BBHbCgFZROGXGXAbCa9MQBAMCFJRMSFMAM1BFHbCgBZCOWAOCgBZqROGXAbCa9MQBAMCGJRMSFMAM1BGHbCgBZCfWAOqROGXAbCa9MQBAMCEJRMSFMAM1BEHbCgBZCdWAOqROGXAbCa9MQBAMCIJRMSFMAM2BIC8cWAOqROAMCLJRMMAOCFrCBAOCFZl9zAQJRQMGXGXAGCG9HQBABAt87FBABCIJAQ87FBABCGJAT87FBSFMAEAtjGBAECNJAQjGBAECIJATjGBMALCoBJAKCEWJHOAQjGBAOATjGIALAICGWJAQjGBALCoBJAKCFJCbZHKCEWJHOAtjGBAOAQjGIAICFJRIAKCFJRKSFMGXAOCDF9LQBALAIAcAOCbZJ2BBHbCIrHTlCbZCGWJ8oGBAVCFJHtATyROALAIAblCbZCGWJ8oGBAtAT9FHmJHtAbCbZHTyRbAT9FRTGXGXAGCG9HQBABAV87FBABCIJAb87FBABCGJAO87FBSFMAEAVjGBAECNJAbjGBAECIJAOjGBMALAICGWJAVjGBALCoBJAKCEWJHYAOjGBAYAVjGIALAICFJHICbZCGWJAOjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAIAmJCbZHICGWJAbjGBALCoBJAKCGJCbZHKCEWJHOAVjGBAOAbjGIAKCFJRKAIATJRIAtATJRVSFMAVCBAM2BBHYyHTAOC/+F6HPJROAYCbZRtGXGXAYCIrHmQBAOCFJRbSFMAORbALAIAmlCbZCGWJ8oGBROMGXGXAtQBAbCFJRVSFMAbRVALAIAYlCbZCGWJ8oGBRbMGXGXAP9FQBAMCFJRYSFMAM1BFHYCgFZRTGXGXAYCa9MQBAMCGJRYSFMAM1BGHYCgBZCOWATCgBZqRTGXAYCa9MQBAMCEJRYSFMAM1BEHYCgBZCfWATqRTGXAYCa9MQBAMCIJRYSFMAM1BIHYCgBZCdWATqRTGXAYCa9MQBAMCLJRYSFMAMCKJRYAM2BLC8cWATqRTMATCFrCBATCFZl9zAQJHQRTMGXGXAmCb6QBAYRPSFMAY1BBHMCgFZROGXGXAMCa9MQBAYCFJRPSFMAY1BFHMCgBZCOWAOCgBZqROGXAMCa9MQBAYCGJRPSFMAY1BGHMCgBZCfWAOqROGXAMCa9MQBAYCEJRPSFMAY1BEHMCgBZCdWAOqROGXAMCa9MQBAYCIJRPSFMAYCLJRPAY2BIC8cWAOqROMAOCFrCBAOCFZl9zAQJHQROMGXGXAtCb6QBAPRMSFMAP1BBHMCgFZRbGXGXAMCa9MQBAPCFJRMSFMAP1BFHMCgBZCOWAbCgBZqRbGXAMCa9MQBAPCGJRMSFMAP1BGHMCgBZCfWAbqRbGXAMCa9MQBAPCEJRMSFMAP1BEHMCgBZCdWAbqRbGXAMCa9MQBAPCIJRMSFMAPCLJRMAP2BIC8cWAbqRbMAbCFrCBAbCFZl9zAQJHQRbMGXGXAGCG9HQBABAT87FBABCIJAb87FBABCGJAO87FBSFMAEATjGBAECNJAbjGBAECIJAOjGBMALCoBJAKCEWJHYAOjGBAYATjGIALAICGWJATjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAICFJHICbZCGWJAOjGBALCoBJAKCGJCbZCEWJHOATjGBAOAbjGIALAIAm9FAmCb6qJHICbZCGWJAbjGBAIAt9FAtCb6qJRIAKCEJRKMANCFJRNABCKJRBAECSJREAKCbZRKAICbZRIAfCEJHfAF9JQBMMCBC99AMAc6yRKMALCoFJ8kUUUUBAKM/tIFGa8jUUUUBCTlRLC9+RKGXAFCLJAI9LQBCaRKAE2BBC/+FZC/QF9HQBALhB83ENAECFJRKAEAIJC98JREGXAF9FQBGXAGCG6QBEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMALCNJAICFZCGWqHGAICGrCBAICFrCFZl9zAG8oGBJHIjGBABAIjGBABCIJRBAFCaJHFQBSGMMEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMABAICGrCBAICFrCFZl9zALCNJAICFZCGWqHI8oGBJHG87FBAIAGjGBABCGJRBAFCaJHFQBMMCBC99AKAE6yRKMAKM/dLEK97FaF97GXGXAGCI9HQBAF9FQFCBRGEXABABDBBBHECiD+rFCiD+sFD/6FHIAECND+rFCiD+sFD/6FAID/gFAECTD+rFCiD+sFD/6FHLD/gFD/kFD/lFHKCBDtD+2FHOAICUUUU94DtHND9OD9RD/kFHI9DBB/+hDYAIAID/mFAKAKD/mFALAOALAND9OD9RD/kFHIAID/mFD/kFD/kFD/jFD/nFHLD/mF9DBBX9LDYHOD/kFCgFDtD9OAECUUU94DtD9OD9QAIALD/mFAOD/kFCND+rFCU/+EDtD9OD9QAKALD/mFAOD/kFCTD+rFCUU/8ODtD9OD9QDMBBABCTJRBAGCIJHGAF9JQBSGMMAF9FQBCBRGEXABCTJHVAVDBBBHECBDtHOCUU98D8cFCUU98D8cEHND9OABDBBBHKAEDQILKOSQfbPden8c8d8e8fCggFDtD9OD/6FAKAEDQBFGENVcMTtmYi8ZpyHECTD+sFD/6FHID/gFAECTD+rFCTD+sFD/6FHLD/gFD/kFD/lFHE9DB/+g6DYALAEAOD+2FHOALCUUUU94DtHcD9OD9RD/kFHLALD/mFAEAED/mFAIAOAIAcD9OD9RD/kFHEAED/mFD/kFD/kFD/jFD/nFHID/mF9DBBX9LDYHOD/kFCTD+rFALAID/mFAOD/kFCggEDtD9OD9QHLAEAID/mFAOD/kFCaDbCBDnGCBDnECBDnKCBDnOCBDncCBDnMCBDnfCBDnbD9OHEDQNVi8ZcMpySQ8c8dfb8e8fD9QDMBBABAKAND9OALAEDQBFTtGEmYILPdKOenD9QDMBBABCAJRBAGCIJHGAF9JQBMMM/hEIGaF97FaL978jUUUUBCTlREGXAF9FQBCBRIEXAEABDBBBHLABCTJHKDBBBHODQILKOSQfbPden8c8d8e8fHNCTD+sFHVCID+rFDMIBAB9DBBU8/DY9D/zI818/DYAVCEDtD9QD/6FD/nFHVALAODQBFGENVcMTtmYi8ZpyHLCTD+rFCTD+sFD/6FD/mFHOAOD/mFAVALCTD+sFD/6FD/mFHcAcD/mFAVANCTD+rFCTD+sFD/6FD/mFHNAND/mFD/kFD/kFD/lFCBDtD+4FD/jF9DB/+g6DYHVD/mF9DBBX9LDYHLD/kFCggEDtHMD9OAcAVD/mFALD/kFCTD+rFD9QHcANAVD/mFALD/kFCTD+rFAOAVD/mFALD/kFAMD9OD9QHVDQBFTtGEmYILPdKOenHLD8dBAEDBIBDyB+t+J83EBABCNJALD8dFAEDBIBDyF+t+J83EBAKAcAVDQNVi8ZcMpySQ8c8dfb8e8fHVD8dBAEDBIBDyG+t+J83EBABCiJAVD8dFAEDBIBDyE+t+J83EBABCAJRBAICIJHIAF9JQBMMM9jFF97GXAGCGrAF9sHG9FQBCBRFEXABABDBBBHECND+rFCND+sFD/6FAECiD+sFCnD+rFCUUU/8EDtD+uFD/mFDMBBABCTJRBAFCIJHFAG9JQBMMM9TFEaCBCB8oGUkUUBHFABCEJC98ZJHBjGUkUUBGXGXAB8/BCTWHGuQBCaREABAGlCggEJCTrXBCa6QFMAFREMAEMMMFBCUNMIT9tBB",g=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]),n=new Uint8Array([32,0,65,253,3,1,2,34,4,106,6,5,11,8,7,20,13,33,12,16,128,9,116,64,19,113,127,15,10,21,22,14,255,66,24,54,136,107,18,23,192,26,114,118,132,17,77,101,130,144,27,87,131,44,45,74,156,154,70,167]);if(typeof WebAssembly!="object")return{supported:!1};let I=t;WebAssembly.validate(g)&&(I=e);let o;const i=WebAssembly.instantiate(l(I),{}).then(u=>{o=u.instance,o.exports.__wasm_call_ctors()});function l(u){const h=new Uint8Array(u.length);for(let p=0;p<u.length;++p){const Z=u.charCodeAt(p);h[p]=Z>96?Z-71:Z>64?Z-65:Z>47?Z+4:Z>46?63:62}let b=0;for(let p=0;p<u.length;++p)h[b++]=h[p]<60?n[h[p]]:(h[p]-60)*64+h[++p];return h.buffer.slice(0,b)}function r(u,h,b,p,Z,v){const y=o.exports.sbrk,m=b+3&-4,B=y(m*p),w=y(Z.length),X=new Uint8Array(o.exports.memory.buffer);X.set(Z,w);const R=u(B,b,p,w,Z.length);if(R===0&&v&&v(B,m,p),h.set(X.subarray(B,B+b*p)),y(B-y(0)),R!==0)throw new Error(`Malformed buffer data: ${R}`)}const c={0:"",1:"meshopt_decodeFilterOct",2:"meshopt_decodeFilterQuat",3:"meshopt_decodeFilterExp",NONE:"",OCTAHEDRAL:"meshopt_decodeFilterOct",QUATERNION:"meshopt_decodeFilterQuat",EXPONENTIAL:"meshopt_decodeFilterExp"},A={0:"meshopt_decodeVertexBuffer",1:"meshopt_decodeIndexBuffer",2:"meshopt_decodeIndexSequence",ATTRIBUTES:"meshopt_decodeVertexBuffer",TRIANGLES:"meshopt_decodeIndexBuffer",INDICES:"meshopt_decodeIndexSequence"};return Qr={ready:i,supported:!0,decodeVertexBuffer(u,h,b,p,Z){r(o.exports.meshopt_decodeVertexBuffer,u,h,b,p,o.exports[c[Z]])},decodeIndexBuffer(u,h,b,p){r(o.exports.meshopt_decodeIndexBuffer,u,h,b,p)},decodeIndexSequence(u,h,b,p){r(o.exports.meshopt_decodeIndexSequence,u,h,b,p)},decodeGltfBuffer(u,h,b,p,Z,v){r(o.exports[A[Z]],u,h,b,p,o.exports[c[v]])}},Qr};function bs(t,e){if(Object.is(t,e))return!0;if(typeof t!="object"||t===null||typeof e!="object"||e===null)return!1;const g=Object.keys(t);if(g.length!==Object.keys(e).length)return!1;for(let n=0;n<g.length;n++)if(!Object.prototype.hasOwnProperty.call(e,g[n])||!Object.is(t[g[n]],e[g[n]]))return!1;return!0}const cL=W.exports.forwardRef((i,o)=>{var l=i,{url:t,distance:e=1,loop:g=!0,autoplay:n}=l,I=ye(l,["url","distance","loop","autoplay"]);const r=W.exports.useRef(),c=pt(({camera:h})=>h),[A]=W.exports.useState(()=>new BV),u=qn(ZV,t);return W.exports.useEffect(()=>{const h=r.current;h&&(h.setBuffer(u),h.setRefDistance(e),h.setLoop(g),n&&!h.isPlaying&&h.play())},[u,c,e,g]),W.exports.useEffect(()=>{const h=r.current;return c.add(A),()=>{c.remove(A),h&&(h.isPlaying&&h.stop(),h.source&&h.source._connected&&h.disconnect())}},[]),W.exports.createElement("positionalAudio",Le({ref:gs([r,o]),args:[A]},I))}),FB=t=>t===Object(t)&&!Array.isArray(t)&&typeof t!="function";function Cv(t){const e=pt(n=>n.gl),g=qn(lA,FB(t)?Object.values(t):t);if(W.exports.useEffect(()=>{(Array.isArray(g)?g:[g]).forEach(e.initTexture)},[e,g]),FB(t)){const n=Object.keys(t),I={};return n.forEach(o=>Object.assign(I,{[o]:g[n.indexOf(o)]})),I}else return g}Cv.preload=t=>qn.preload(lA,t);Cv.clear=t=>qn.clear(lA,t);const AL=W.exports.forwardRef((n,g)=>{var I=n,{makeDefault:t}=I,e=ye(I,["makeDefault"]);const o=pt(({set:c})=>c),i=pt(({camera:c})=>c),l=pt(({size:c})=>c),r=W.exports.useRef();return W.exports.useLayoutEffect(()=>{r.current&&!e.manual&&r.current.updateProjectionMatrix()},[l,e]),W.exports.useLayoutEffect(()=>{if(t&&r.current){const c=i;return o(()=>({camera:r.current})),()=>o(()=>({camera:c}))}},[r,t,o]),W.exports.createElement("orthographicCamera",Le({left:l.width/-2,right:l.width/2,top:l.height/2,bottom:l.height/-2,ref:gs([r,g])},e))}),aL=W.exports.forwardRef((n,g)=>{var I=n,{makeDefault:t}=I,e=ye(I,["makeDefault"]);const o=pt(({set:c})=>c),i=pt(({camera:c})=>c),l=pt(({size:c})=>c),r=W.exports.useRef();return W.exports.useLayoutEffect(()=>{const{current:c}=r;c&&!e.manual&&(c.aspect=l.width/l.height,c.updateProjectionMatrix())},[l,e]),W.exports.useLayoutEffect(()=>{if(t&&r.current){const c=i;return o(()=>({camera:r.current})),()=>o(()=>({camera:c}))}},[r,t,o]),W.exports.createElement("perspectiveCamera",Le({ref:gs([r,g])},e))}),uL=W.exports.forwardRef((A,c)=>{var u=A,{makeDefault:t,camera:e,regress:g,domElement:n,enableDamping:I=!0,onChange:o,onStart:i,onEnd:l}=u,r=ye(u,["makeDefault","camera","regress","domElement","enableDamping","onChange","onStart","onEnd"]);const h=pt(R=>R.invalidate),b=pt(R=>R.camera),p=pt(R=>R.gl),Z=pt(R=>R.events),v=pt(R=>R.set),y=pt(R=>R.get),m=pt(R=>R.performance),B=e||b,w=n||Z.connected||p.domElement,X=W.exports.useMemo(()=>new ZK(B),[B]);return pC(()=>{X.enabled&&X.update()},-1),W.exports.useEffect(()=>(X.connect(w),()=>void X.dispose()),[w,g,X,h]),W.exports.useEffect(()=>{const R=S=>{h(),g&&m.regress(),o&&o(S)};return X.addEventListener("change",R),i&&X.addEventListener("start",i),l&&X.addEventListener("end",l),()=>{i&&X.removeEventListener("start",i),l&&X.removeEventListener("end",l),X.removeEventListener("change",R)}},[o,i,l]),W.exports.useEffect(()=>{if(t){const R=y().controls;return v({controls:X}),()=>v({controls:R})}},[t,X]),W.exports.createElement("primitive",Le({ref:c,object:X,enableDamping:I},r))});let Tr=null;function lv(t,e,g){return n=>{g&&g(n),t&&(Tr||(Tr=new PK),Tr.setDecoderPath(typeof t=="string"?t:"https://www.gstatic.com/draco/versioned/decoders/1.4.3/"),n.setDRACOLoader(Tr)),e&&n.setMeshoptDecoder(typeof Nu=="function"?Nu():Nu)}}function sv(t,e=!0,g=!0,n){return qn(Hb,t,lv(e,g,n))}sv.preload=(t,e=!0,g=!0,n)=>qn.preload(Hb,t,lv(e,g,n));sv.clear=t=>qn.clear(Hb,t);var rv={exports:{}};(function(t,e){(function(g,n){t.exports=n()})(SZ,function(){var g=function(){function n(b){return i.appendChild(b.dom),b}function I(b){for(var p=0;p<i.children.length;p++)i.children[p].style.display=p===b?"block":"none";o=b}var o=0,i=document.createElement("div");i.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000",i.addEventListener("click",function(b){b.preventDefault(),I(++o%i.children.length)},!1);var l=(performance||Date).now(),r=l,c=0,A=n(new g.Panel("FPS","#0ff","#002")),u=n(new g.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var h=n(new g.Panel("MB","#f08","#201"));return I(0),{REVISION:16,dom:i,addPanel:n,showPanel:I,begin:function(){l=(performance||Date).now()},end:function(){c++;var b=(performance||Date).now();if(u.update(b-l,200),b>r+1e3&&(A.update(1e3*c/(b-r),100),r=b,c=0,h)){var p=performance.memory;h.update(p.usedJSHeapSize/1048576,p.jsHeapSizeLimit/1048576)}return b},update:function(){l=this.end()},domElement:i,setMode:I}};return g.Panel=function(n,I,o){var i=1/0,l=0,r=Math.round,c=r(window.devicePixelRatio||1),A=80*c,u=48*c,h=3*c,b=2*c,p=3*c,Z=15*c,v=74*c,y=30*c,m=document.createElement("canvas");m.width=A,m.height=u,m.style.cssText="width:80px;height:48px";var B=m.getContext("2d");return B.font="bold "+9*c+"px Helvetica,Arial,sans-serif",B.textBaseline="top",B.fillStyle=o,B.fillRect(0,0,A,u),B.fillStyle=I,B.fillText(n,h,b),B.fillRect(p,Z,v,y),B.fillStyle=o,B.globalAlpha=.9,B.fillRect(p,Z,v,y),{dom:m,update:function(w,X){i=Math.min(i,w),l=Math.max(l,w),B.fillStyle=o,B.globalAlpha=1,B.fillRect(0,0,A,Z),B.fillStyle=I,B.fillText(r(w)+" "+n+" ("+r(i)+"-"+r(l)+")",h,b),B.drawImage(m,p+c,Z,v-c,y,p,Z,v-c,y),B.fillRect(p+v-c,Z,c,y),B.fillStyle=o,B.globalAlpha=.9,B.fillRect(p+v-c,Z,c,r((1-w/X)*y))}}},g})})(rv);var qK=rv.exports;function kB(t,e){typeof t=="function"?t(e):t!=null&&(t.current=e)}function $K(t,e=[],g){const[n,I]=W.exports.useState();return W.exports.useLayoutEffect(()=>{const o=t();return I(o),kB(g,o),()=>kB(g,null)},e),n}function dL({showPanel:t=0,className:e,parent:g}){const n=$K(()=>new qK,[]);return W.exports.useEffect(()=>{if(n){const I=g&&g.current||document.body;n.showPanel(t),I==null||I.appendChild(n.dom),e&&n.dom.classList.add(...e.split(" ").filter(l=>l));const o=GY(()=>n.begin()),i=mY(()=>n.end());return()=>{I==null||I.removeChild(n.dom),o(),i()}}},[g,n,e,t]),null}function hL(t,e,g){const{gl:n,size:I,viewport:o}=pt(),i=typeof t=="number"?t:I.width*o.dpr,l=typeof e=="number"?e:I.height*o.dpr,h=(typeof t=="number"?g:t)||{},{samples:c}=h,A=ye(h,["samples"]),u=W.exports.useMemo(()=>{let b;return b=new He.WebGLRenderTarget(i,l,_({minFilter:He.LinearFilter,magFilter:He.LinearFilter,encoding:n.outputEncoding,type:He.HalfFloatType},A)),b.samples=c,b},[]);return W.exports.useLayoutEffect(()=>{u.setSize(i,l),c&&(u.samples=c)},[c,u,i,l]),W.exports.useEffect(()=>()=>u.dispose(),[]),u}function bL(t,e){const g=W.exports.useRef(),[n]=W.exports.useState(()=>e?e instanceof ls?{current:e}:e:g),[I]=W.exports.useState(()=>new yV(void 0)),o=W.exports.useRef({}),[i]=W.exports.useState(()=>{const l={};return t.forEach(r=>Object.defineProperty(l,r.name,{enumerable:!0,get(){if(n.current)return o.current[r.name]||(o.current[r.name]=I.clipAction(r,n.current))}})),{ref:n,clips:t,actions:l,names:t.map(r=>r.name),mixer:I}});return pC((l,r)=>I.update(r)),W.exports.useEffect(()=>{const l=n.current;return()=>{o.current={},Object.values(i.actions).forEach(r=>{l&&I.uncacheAction(r,l)})}},[t]),i}var e9=`#define GLSLIFY 1
|
|
71
|
+
vec3 mod289(vec3 x){return x-floor(x*(1.0/289.0))*289.0;}vec4 mod289(vec4 x){return x-floor(x*(1.0/289.0))*289.0;}vec4 permute(vec4 x){return mod289(((x*34.0)+1.0)*x);}vec4 taylorInvSqrt(vec4 r){return 1.79284291400159-0.85373472095314*r;}float snoise(vec3 v){const vec2 C=vec2(1.0/6.0,1.0/3.0);const vec4 D=vec4(0.0,0.5,1.0,2.0);vec3 i=floor(v+dot(v,C.yyy));vec3 x0=v-i+dot(i,C.xxx);vec3 g=step(x0.yzx,x0.xyz);vec3 l=1.0-g;vec3 i1=min(g.xyz,l.zxy);vec3 i2=max(g.xyz,l.zxy);vec3 x1=x0-i1+C.xxx;vec3 x2=x0-i2+C.yyy;vec3 x3=x0-D.yyy;i=mod289(i);vec4 p=permute(permute(permute(i.z+vec4(0.0,i1.z,i2.z,1.0))+i.y+vec4(0.0,i1.y,i2.y,1.0))+i.x+vec4(0.0,i1.x,i2.x,1.0));float n_=0.142857142857;vec3 ns=n_*D.wyz-D.xzx;vec4 j=p-49.0*floor(p*ns.z*ns.z);vec4 x_=floor(j*ns.z);vec4 y_=floor(j-7.0*x_);vec4 x=x_*ns.x+ns.yyyy;vec4 y=y_*ns.x+ns.yyyy;vec4 h=1.0-abs(x)-abs(y);vec4 b0=vec4(x.xy,y.xy);vec4 b1=vec4(x.zw,y.zw);vec4 s0=floor(b0)*2.0+1.0;vec4 s1=floor(b1)*2.0+1.0;vec4 sh=-step(h,vec4(0.0));vec4 a0=b0.xzyw+s0.xzyw*sh.xxyy;vec4 a1=b1.xzyw+s1.xzyw*sh.zzww;vec3 p0=vec3(a0.xy,h.x);vec3 p1=vec3(a0.zw,h.y);vec3 p2=vec3(a1.xy,h.z);vec3 p3=vec3(a1.zw,h.w);vec4 norm=taylorInvSqrt(vec4(dot(p0,p0),dot(p1,p1),dot(p2,p2),dot(p3,p3)));p0*=norm.x;p1*=norm.y;p2*=norm.z;p3*=norm.w;vec4 m=max(0.6-vec4(dot(x0,x0),dot(x1,x1),dot(x2,x2),dot(x3,x3)),0.0);m=m*m;return 42.0*dot(m*m,vec4(dot(p0,x0),dot(p1,x1),dot(p2,x2),dot(p3,x3)));}`;class t9 extends ti{constructor(e={}){super(e);this.setValues(e),this._time={value:0},this._distort={value:.4},this._radius={value:1}}onBeforeCompile(e){e.uniforms.time=this._time,e.uniforms.radius=this._radius,e.uniforms.distort=this._distort,e.vertexShader=`
|
|
72
|
+
uniform float time;
|
|
73
|
+
uniform float radius;
|
|
74
|
+
uniform float distort;
|
|
75
|
+
${e9}
|
|
76
|
+
${e.vertexShader}
|
|
77
|
+
`,e.vertexShader=e.vertexShader.replace("#include <begin_vertex>",`
|
|
78
|
+
float updateTime = time / 50.0;
|
|
79
|
+
float noise = snoise(vec3(position / 2.0 + updateTime * 5.0));
|
|
80
|
+
vec3 transformed = vec3(position * (noise * pow(distort, 2.0) + radius));
|
|
81
|
+
`)}get time(){return this._time.value}set time(e){this._time.value=e}get distort(){return this._distort.value}set distort(e){this._distort.value=e}get radius(){return this._radius.value}set radius(e){this._radius.value=e}}const GL=W.exports.forwardRef((n,g)=>{var I=n,{speed:t=1}=I,e=ye(I,["speed"]);const[o]=W.exports.useState(()=>new t9);return pC(i=>o&&(o.time=i.clock.getElapsedTime()*t)),W.exports.createElement("primitive",Le({object:o,ref:g,attach:"material"},e))});function g9(t){const e=t+"BufferGeometry";return W.exports.forwardRef((i,o)=>{var l=i,{args:g,children:n}=l,I=ye(l,["args","children"]);return W.exports.createElement("mesh",Le({ref:o},I),W.exports.createElement(e,{attach:"geometry",args:g}),n)})}const n9=g9("icosahedron"),Fu={sunset:"venice/venice_sunset_1k.hdr",dawn:"kiara/kiara_1_dawn_1k.hdr",night:"dikhololo/dikhololo_night_1k.hdr",warehouse:"empty-wharehouse/empty_warehouse_01_1k.hdr",forest:"forrest-slope/forest_slope_1k.hdr",apartment:"lebombo/lebombo_1k.hdr",studio:"studio-small-3/studio_small_03_1k.hdr",city:"potsdamer-platz/potsdamer_platz_1k.hdr",park:"rooitou/rooitou_park_1k.hdr",lobby:"st-fagans/st_fagans_interior_1k.hdr"};var I9=`#define GLSLIFY 1
|
|
82
|
+
varying vec3 vWorldPosition;void main(){vec4 worldPosition=modelMatrix*vec4(position,1.0);vWorldPosition=worldPosition.xyz;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}`,o9=`#define GLSLIFY 1
|
|
83
|
+
#define ENVMAP_TYPE_CUBE_UV
|
|
84
|
+
varying vec3 vWorldPosition;uniform float radius;uniform float height;
|
|
85
|
+
#ifdef ENVMAP_TYPE_CUBE
|
|
86
|
+
uniform samplerCube cubemap;
|
|
87
|
+
#else
|
|
88
|
+
uniform sampler2D cubemap;
|
|
89
|
+
#endif
|
|
90
|
+
float diskIntersect(in vec3 ro,in vec3 rd,vec3 c,vec3 n,float r){vec3 o=ro-c;float t=-dot(n,o)/dot(rd,n);vec3 q=o+rd*t;return(dot(q,q)<r*r)? t : 1e6;}float sphereIntersect(in vec3 ro,in vec3 rd,in vec3 ce,float ra){vec3 oc=ro-ce;float b=dot(oc,rd);float c=dot(oc,oc)-ra*ra;float h=b*b-c;if(h<0.0)-1.0;h=sqrt(h);return-b+h;}vec3 project(){vec3 p=normalize(vWorldPosition);vec3 camPos=cameraPosition;camPos.y-=height;float intersection=sphereIntersect(camPos,p,vec3(0.),radius);if(intersection>0.){vec3 h=vec3(0.0,-height,0.0);float intersection2=diskIntersect(camPos,p,h,vec3(0.0,-1.0,0.0),radius);p=(camPos+min(intersection,intersection2)*p)/radius;}else{p=vec3(0.0,1.0,0.0);}return p;}
|
|
91
|
+
#include <common>
|
|
92
|
+
#include <cube_uv_reflection_fragment>
|
|
93
|
+
void main(){vec3 projectedWorldPosition=project();
|
|
94
|
+
#ifdef ENVMAP_TYPE_CUBE
|
|
95
|
+
vec3 outcolor=textureCube(cubemap,projectedWorldPosition).rgb;
|
|
96
|
+
#else
|
|
97
|
+
vec3 direction=normalize(projectedWorldPosition);vec2 uv=equirectUv(direction);vec3 outcolor=texture2D(cubemap,uv).rgb;
|
|
98
|
+
#endif
|
|
99
|
+
gl_FragColor=vec4(outcolor,1.0);
|
|
100
|
+
#include <tonemapping_fragment>
|
|
101
|
+
#include <encodings_fragment>
|
|
102
|
+
}`;const i9="https://market-assets.fra1.cdn.digitaloceanspaces.com/market-assets/hdris/",C9=t=>t&&t.isCubeTexture,l9=t=>t.current&&t.current.isScene,Nb=t=>l9(t)?t.current:t;function Fb({scene:t,background:e=!1,map:g}){const n=pt(I=>I.scene);return W.exports.useLayoutEffect(()=>{if(g){const I=Nb(t||n),o=I.background,i=I.environment;return e!=="only"&&(I.environment=g),e&&(I.background=g),()=>{e!=="only"&&(I.environment=i),e&&(I.background=o)}}},[n,t,g,e]),null}function cv({files:t=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"],path:e="",preset:g=void 0,extensions:n}){if(g){if(!(g in Fu))throw new Error("Preset must be one of: "+Object.keys(Fu).join(", "));t=Fu[g],e=i9}const I=Array.isArray(t),i=qn(I?vV:OK,I?[t]:t,r=>{r.setPath(e),n&&n(r)}),l=I?i[0]:i;return l.mapping=I?WV:wV,l}function Av(n){var I=n,{background:t=!1,scene:e}=I,g=ye(I,["background","scene"]);const o=cv(g),i=pt(l=>l.scene);return W.exports.useLayoutEffect(()=>{const l=Nb(e||i),r=l.background,c=l.environment;return t!=="only"&&(l.environment=o),t&&(l.background=o),()=>{t!=="only"&&(l.environment=c),t&&(l.background=r)}},[o,t,e,i]),null}function s9({children:t,near:e=1,far:g=1e3,resolution:n=256,frames:I=1,map:o,background:i=!1,scene:l,files:r,path:c,preset:A=void 0,extensions:u}){const h=pt(m=>m.gl),b=pt(m=>m.scene),p=W.exports.useRef(null),[Z]=W.exports.useState(()=>new KZ),v=W.exports.useMemo(()=>{const m=new fV(n);return m.texture.type=dl,m},[n]);W.exports.useLayoutEffect(()=>{I===1&&p.current.update(h,Z);const m=Nb(l||b),B=m.background,w=m.environment;return i!=="only"&&(m.environment=v.texture),i&&(m.background=v.texture),()=>{i!=="only"&&(m.environment=w),i&&(m.background=B)}},[t,Z,v.texture,l,b,i,I,h]);let y=1;return pC(()=>{(I===1/0||y<I)&&(p.current.update(h,Z),y++)}),W.exports.createElement(W.exports.Fragment,null,vY(W.exports.createElement(W.exports.Fragment,null,t,W.exports.createElement("cubeCamera",{ref:p,args:[e,g,v]}),r||A?W.exports.createElement(Av,{background:!0,files:r,preset:A,path:c,extensions:u}):o?W.exports.createElement(Fb,{background:!0,map:o,extensions:u}):null),Z))}function r9(t){var e,g,n,I;const o=cv(t),i=t.map||o,l=C9(i),r=W.exports.useMemo(()=>{var Z,v;const m=((Z=l?(v=i.image[0])==null?void 0:v.width:i.image.width)!==null&&Z!==void 0?Z:1024)/4,B=Math.floor(Math.log2(m)),w=Math.pow(2,B),X=3*Math.max(w,16*7),R=4*w;return[l?"#define ENVMAP_TYPE_CUBE":"",`#define CUBEUV_TEXEL_WIDTH ${1/X}`,`#define CUBEUV_TEXEL_HEIGHT ${1/R}`,`#define CUBEUV_MAX_MIP ${B}.0`,""]},[]),c=W.exports.useMemo(()=>r.join(`
|
|
103
|
+
`)+o9,[r]),A=W.exports.useMemo(()=>({cubemap:{value:null},height:{value:15},radius:{value:60}}),[]),u=W.exports.useRef(null),h=(e=t.ground)==null?void 0:e.height,b=(g=t.ground)==null?void 0:g.radius,p=(n=(I=t.ground)==null?void 0:I.scale)!==null&&n!==void 0?n:1e3;return W.exports.useEffect(()=>void(h&&(u.current.uniforms.height.value=h)),[h]),W.exports.useEffect(()=>void(b&&(u.current.uniforms.radius.value=b)),[b]),W.exports.useEffect(()=>void(u.current.uniforms.cubemap.value=i),[i]),W.exports.createElement(W.exports.Fragment,null,W.exports.createElement(Fb,Le({},t,{map:i})),W.exports.createElement(n9,{scale:p,args:[1,16]},W.exports.createElement("shaderMaterial",{ref:u,side:wZ,vertexShader:I9,fragmentShader:c,uniforms:A,depthTest:!1})))}function mL(t){return t.ground?W.exports.createElement(r9,t):t.map?W.exports.createElement(Fb,t):t.children?W.exports.createElement(s9,t):W.exports.createElement(Av,t)}function c9(t,e,g=new mt){const n=Math.PI*(t-.5),I=2*Math.PI*(e-.5);return g.x=Math.cos(I),g.y=Math.sin(n),g.z=Math.sin(I),g}const pL=W.exports.forwardRef((A,c)=>{var u=A,{inclination:t=.6,azimuth:e=.1,distance:g=1e3,mieCoefficient:n=.005,mieDirectionalG:I=.8,rayleigh:o=.5,turbidity:i=10,sunPosition:l=c9(t,e)}=u,r=ye(u,["inclination","azimuth","distance","mieCoefficient","mieDirectionalG","rayleigh","turbidity","sunPosition"]);const h=W.exports.useMemo(()=>new mt().setScalar(g),[g]),[b]=W.exports.useState(()=>new go);return W.exports.createElement("primitive",Le({object:b,ref:c,"material-uniforms-mieCoefficient-value":n,"material-uniforms-mieDirectionalG-value":I,"material-uniforms-rayleigh-value":o,"material-uniforms-sunPosition-value":l,"material-uniforms-turbidity-value":i,scale:h},r))});var av={exports:{}},A9="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED",a9=A9,u9=a9;function uv(){}function dv(){}dv.resetWarningCache=uv;var d9=function(){function t(n,I,o,i,l,r){if(r!==u9){var c=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw c.name="Invariant Violation",c}}t.isRequired=t;function e(){return t}var g={array:t,bigint:t,bool:t,func:t,number:t,object:t,string:t,symbol:t,any:t,arrayOf:e,element:t,elementType:t,instanceOf:e,node:t,objectOf:e,oneOf:e,oneOfType:e,shape:e,exact:e,checkPropTypes:dv,resetWarningCache:uv};return g.PropTypes=g,g};av.exports=d9();var je=av.exports,WA={exports:{}},wA={};/**
|
|
104
|
+
* @license React
|
|
105
|
+
* react-jsx-runtime.production.min.js
|
|
106
|
+
*
|
|
107
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
108
|
+
*
|
|
109
|
+
* This source code is licensed under the MIT license found in the
|
|
110
|
+
* LICENSE file in the root directory of this source tree.
|
|
111
|
+
*/var h9=W.exports,b9=Symbol.for("react.element"),G9=Symbol.for("react.fragment"),m9=Object.prototype.hasOwnProperty,p9=h9.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,B9={key:!0,ref:!0,__self:!0,__source:!0};function hv(t,e,g){var n,I={},o=null,i=null;g!==void 0&&(o=""+g),e.key!==void 0&&(o=""+e.key),e.ref!==void 0&&(i=e.ref);for(n in e)m9.call(e,n)&&!B9.hasOwnProperty(n)&&(I[n]=e[n]);if(t&&t.defaultProps)for(n in e=t.defaultProps,e)I[n]===void 0&&(I[n]=e[n]);return{$$typeof:b9,type:t,key:o,ref:i,props:I,_owner:p9.current}}wA.Fragment=G9;wA.jsx=hv;wA.jsxs=hv;WA.exports=wA;const D=WA.exports.jsx,we=WA.exports.jsxs,oi=WA.exports.Fragment;var kb={exports:{}},nC=typeof Reflect=="object"?Reflect:null,zB=nC&&typeof nC.apply=="function"?nC.apply:function(e,g,n){return Function.prototype.apply.call(e,g,n)},Bc;nC&&typeof nC.ownKeys=="function"?Bc=nC.ownKeys:Object.getOwnPropertySymbols?Bc=function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Bc=function(e){return Object.getOwnPropertyNames(e)};function Z9(t){console&&console.warn&&console.warn(t)}var bv=Number.isNaN||function(e){return e!==e};function Qe(){Qe.init.call(this)}kb.exports=Qe;kb.exports.once=W9;Qe.EventEmitter=Qe;Qe.prototype._events=void 0;Qe.prototype._eventsCount=0;Qe.prototype._maxListeners=void 0;var xB=10;function VA(t){if(typeof t!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof t)}Object.defineProperty(Qe,"defaultMaxListeners",{enumerable:!0,get:function(){return xB},set:function(t){if(typeof t!="number"||t<0||bv(t))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+t+".");xB=t}});Qe.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};Qe.prototype.setMaxListeners=function(e){if(typeof e!="number"||e<0||bv(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this};function Gv(t){return t._maxListeners===void 0?Qe.defaultMaxListeners:t._maxListeners}Qe.prototype.getMaxListeners=function(){return Gv(this)};Qe.prototype.emit=function(e){for(var g=[],n=1;n<arguments.length;n++)g.push(arguments[n]);var I=e==="error",o=this._events;if(o!==void 0)I=I&&o.error===void 0;else if(!I)return!1;if(I){var i;if(g.length>0&&(i=g[0]),i instanceof Error)throw i;var l=new Error("Unhandled error."+(i?" ("+i.message+")":""));throw l.context=i,l}var r=o[e];if(r===void 0)return!1;if(typeof r=="function")zB(r,this,g);else for(var c=r.length,A=yv(r,c),n=0;n<c;++n)zB(A[n],this,g);return!0};function mv(t,e,g,n){var I,o,i;if(VA(g),o=t._events,o===void 0?(o=t._events=Object.create(null),t._eventsCount=0):(o.newListener!==void 0&&(t.emit("newListener",e,g.listener?g.listener:g),o=t._events),i=o[e]),i===void 0)i=o[e]=g,++t._eventsCount;else if(typeof i=="function"?i=o[e]=n?[g,i]:[i,g]:n?i.unshift(g):i.push(g),I=Gv(t),I>0&&i.length>I&&!i.warned){i.warned=!0;var l=new Error("Possible EventEmitter memory leak detected. "+i.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");l.name="MaxListenersExceededWarning",l.emitter=t,l.type=e,l.count=i.length,Z9(l)}return t}Qe.prototype.addListener=function(e,g){return mv(this,e,g,!1)};Qe.prototype.on=Qe.prototype.addListener;Qe.prototype.prependListener=function(e,g){return mv(this,e,g,!0)};function y9(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function pv(t,e,g){var n={fired:!1,wrapFn:void 0,target:t,type:e,listener:g},I=y9.bind(n);return I.listener=g,n.wrapFn=I,I}Qe.prototype.once=function(e,g){return VA(g),this.on(e,pv(this,e,g)),this};Qe.prototype.prependOnceListener=function(e,g){return VA(g),this.prependListener(e,pv(this,e,g)),this};Qe.prototype.removeListener=function(e,g){var n,I,o,i,l;if(VA(g),I=this._events,I===void 0)return this;if(n=I[e],n===void 0)return this;if(n===g||n.listener===g)--this._eventsCount===0?this._events=Object.create(null):(delete I[e],I.removeListener&&this.emit("removeListener",e,n.listener||g));else if(typeof n!="function"){for(o=-1,i=n.length-1;i>=0;i--)if(n[i]===g||n[i].listener===g){l=n[i].listener,o=i;break}if(o<0)return this;o===0?n.shift():f9(n,o),n.length===1&&(I[e]=n[0]),I.removeListener!==void 0&&this.emit("removeListener",e,l||g)}return this};Qe.prototype.off=Qe.prototype.removeListener;Qe.prototype.removeAllListeners=function(e){var g,n,I;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[e]),this;if(arguments.length===0){var o=Object.keys(n),i;for(I=0;I<o.length;++I)i=o[I],i!=="removeListener"&&this.removeAllListeners(i);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(g=n[e],typeof g=="function")this.removeListener(e,g);else if(g!==void 0)for(I=g.length-1;I>=0;I--)this.removeListener(e,g[I]);return this};function Bv(t,e,g){var n=t._events;if(n===void 0)return[];var I=n[e];return I===void 0?[]:typeof I=="function"?g?[I.listener||I]:[I]:g?v9(I):yv(I,I.length)}Qe.prototype.listeners=function(e){return Bv(this,e,!0)};Qe.prototype.rawListeners=function(e){return Bv(this,e,!1)};Qe.listenerCount=function(t,e){return typeof t.listenerCount=="function"?t.listenerCount(e):Zv.call(t,e)};Qe.prototype.listenerCount=Zv;function Zv(t){var e=this._events;if(e!==void 0){var g=e[t];if(typeof g=="function")return 1;if(g!==void 0)return g.length}return 0}Qe.prototype.eventNames=function(){return this._eventsCount>0?Bc(this._events):[]};function yv(t,e){for(var g=new Array(e),n=0;n<e;++n)g[n]=t[n];return g}function f9(t,e){for(;e+1<t.length;e++)t[e]=t[e+1];t.pop()}function v9(t){for(var e=new Array(t.length),g=0;g<e.length;++g)e[g]=t[g].listener||t[g];return e}function W9(t,e){return new Promise(function(g,n){function I(i){t.removeListener(e,o),n(i)}function o(){typeof t.removeListener=="function"&&t.removeListener("error",I),g([].slice.call(arguments))}fv(t,e,o,{once:!0}),e!=="error"&&w9(t,I,{once:!0})})}function w9(t,e,g){typeof t.on=="function"&&fv(t,"error",e,g)}function fv(t,e,g,n){if(typeof t.on=="function")n.once?t.once(e,g):t.on(e,g);else if(typeof t.addEventListener=="function")t.addEventListener(e,function I(o){n.once&&t.removeEventListener(e,I),g(o)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof t)}var V9=kb.exports;function R9(t,e){var g=atob(t);if(e){for(var n=new Uint8Array(g.length),I=0,o=g.length;I<o;++I)n[I]=g.charCodeAt(I);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return g}function X9(t,e,g){var n=e===void 0?null:e,I=g===void 0?!1:g,o=R9(t,I),i=o.indexOf(`
|
|
112
|
+
`,10)+1,l=o.substring(i)+(n?"//# sourceMappingURL="+n:""),r=new Blob([l],{type:"application/javascript"});return URL.createObjectURL(r)}function Y9(t,e,g){var n;return function(o){return n=n||X9(t,e,g),new Worker(n,o)}}var K9=Y9("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmVjb3JkcyB3aGF0IG9iamVjdHMgYXJlIGNvbGxpZGluZyB3aXRoIGVhY2ggb3RoZXIKICAgKi8KCiAgLyoqCiAgICogQSAzeDMgbWF0cml4LgogICAqIEF1dGhvcmVkIGJ5IHtAbGluayBodHRwOi8vZ2l0aHViLmNvbS9zY2h0ZXBwZS8gc2NodGVwcGV9CiAgICovCiAgY2xhc3MgTWF0MyB7CiAgICAvKioKICAgICAqIEEgdmVjdG9yIG9mIGxlbmd0aCA5LCBjb250YWluaW5nIGFsbCBtYXRyaXggZWxlbWVudHMuCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBwYXJhbSBlbGVtZW50cyBBIHZlY3RvciBvZiBsZW5ndGggOSwgY29udGFpbmluZyBhbGwgbWF0cml4IGVsZW1lbnRzLgogICAgICovCiAgICBjb25zdHJ1Y3RvcihlbGVtZW50cykgewogICAgICBpZiAoZWxlbWVudHMgPT09IHZvaWQgMCkgewogICAgICAgIGVsZW1lbnRzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdOwogICAgICB9CgogICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgdGhlIG1hdHJpeCB0byBpZGVudGl0eQogICAgICogQHRvZG8gU2hvdWxkIHBlcmhhcHMgYmUgcmVuYW1lZCB0byBgc2V0SWRlbnRpdHkoKWAgdG8gYmUgbW9yZSBjbGVhci4KICAgICAqIEB0b2RvIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgaW1tZWRpYXRlbHkgY3JlYXRlcyBhbiBpZGVudGl0eSBtYXRyaXggZWcuIGBleWUoKWAKICAgICAqLwoKCiAgICBpZGVudGl0eSgpIHsKICAgICAgY29uc3QgZSA9IHRoaXMuZWxlbWVudHM7CiAgICAgIGVbMF0gPSAxOwogICAgICBlWzFdID0gMDsKICAgICAgZVsyXSA9IDA7CiAgICAgIGVbM10gPSAwOwogICAgICBlWzRdID0gMTsKICAgICAgZVs1XSA9IDA7CiAgICAgIGVbNl0gPSAwOwogICAgICBlWzddID0gMDsKICAgICAgZVs4XSA9IDE7CiAgICB9CiAgICAvKioKICAgICAqIFNldCBhbGwgZWxlbWVudHMgdG8gemVybwogICAgICovCgoKICAgIHNldFplcm8oKSB7CiAgICAgIGNvbnN0IGUgPSB0aGlzLmVsZW1lbnRzOwogICAgICBlWzBdID0gMDsKICAgICAgZVsxXSA9IDA7CiAgICAgIGVbMl0gPSAwOwogICAgICBlWzNdID0gMDsKICAgICAgZVs0XSA9IDA7CiAgICAgIGVbNV0gPSAwOwogICAgICBlWzZdID0gMDsKICAgICAgZVs3XSA9IDA7CiAgICAgIGVbOF0gPSAwOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBtYXRyaXggZGlhZ29uYWwgZWxlbWVudHMgZnJvbSBhIFZlYzMKICAgICAqLwoKCiAgICBzZXRUcmFjZSh2ZWN0b3IpIHsKICAgICAgY29uc3QgZSA9IHRoaXMuZWxlbWVudHM7CiAgICAgIGVbMF0gPSB2ZWN0b3IueDsKICAgICAgZVs0XSA9IHZlY3Rvci55OwogICAgICBlWzhdID0gdmVjdG9yLno7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgdGhlIG1hdHJpeCBkaWFnb25hbCBlbGVtZW50cwogICAgICovCgoKICAgIGdldFRyYWNlKHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICBjb25zdCBlID0gdGhpcy5lbGVtZW50czsKICAgICAgdGFyZ2V0LnggPSBlWzBdOwogICAgICB0YXJnZXQueSA9IGVbNF07CiAgICAgIHRhcmdldC56ID0gZVs4XTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIC8qKgogICAgICogTWF0cml4LVZlY3RvciBtdWx0aXBsaWNhdGlvbgogICAgICogQHBhcmFtIHYgVGhlIHZlY3RvciB0byBtdWx0aXBseSB3aXRoCiAgICAgKiBAcGFyYW0gdGFyZ2V0IE9wdGlvbmFsLCB0YXJnZXQgdG8gc2F2ZSB0aGUgcmVzdWx0IGluLgogICAgICovCgoKICAgIHZtdWx0KHYsIHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICBjb25zdCBlID0gdGhpcy5lbGVtZW50czsKICAgICAgY29uc3QgeCA9IHYueDsKICAgICAgY29uc3QgeSA9IHYueTsKICAgICAgY29uc3QgeiA9IHYuejsKICAgICAgdGFyZ2V0LnggPSBlWzBdICogeCArIGVbMV0gKiB5ICsgZVsyXSAqIHo7CiAgICAgIHRhcmdldC55ID0gZVszXSAqIHggKyBlWzRdICogeSArIGVbNV0gKiB6OwogICAgICB0YXJnZXQueiA9IGVbNl0gKiB4ICsgZVs3XSAqIHkgKyBlWzhdICogejsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIC8qKgogICAgICogTWF0cml4LXNjYWxhciBtdWx0aXBsaWNhdGlvbgogICAgICovCgoKICAgIHNtdWx0KHMpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5lbGVtZW50c1tpXSAqPSBzOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE1hdHJpeCBtdWx0aXBsaWNhdGlvbgogICAgICogQHBhcmFtIG1hdHJpeCBNYXRyaXggdG8gbXVsdGlwbHkgd2l0aCBmcm9tIGxlZnQgc2lkZS4KICAgICAqLwoKCiAgICBtbXVsdChtYXRyaXgsIHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgTWF0MygpOwogICAgICB9CgogICAgICBjb25zdCBBID0gdGhpcy5lbGVtZW50czsKICAgICAgY29uc3QgQiA9IG1hdHJpeC5lbGVtZW50czsKICAgICAgY29uc3QgVCA9IHRhcmdldC5lbGVtZW50czsKICAgICAgY29uc3QgYTExID0gQVswXSwKICAgICAgICAgICAgYTEyID0gQVsxXSwKICAgICAgICAgICAgYTEzID0gQVsyXSwKICAgICAgICAgICAgYTIxID0gQVszXSwKICAgICAgICAgICAgYTIyID0gQVs0XSwKICAgICAgICAgICAgYTIzID0gQVs1XSwKICAgICAgICAgICAgYTMxID0gQVs2XSwKICAgICAgICAgICAgYTMyID0gQVs3XSwKICAgICAgICAgICAgYTMzID0gQVs4XTsKICAgICAgY29uc3QgYjExID0gQlswXSwKICAgICAgICAgICAgYjEyID0gQlsxXSwKICAgICAgICAgICAgYjEzID0gQlsyXSwKICAgICAgICAgICAgYjIxID0gQlszXSwKICAgICAgICAgICAgYjIyID0gQls0XSwKICAgICAgICAgICAgYjIzID0gQls1XSwKICAgICAgICAgICAgYjMxID0gQls2XSwKICAgICAgICAgICAgYjMyID0gQls3XSwKICAgICAgICAgICAgYjMzID0gQls4XTsKICAgICAgVFswXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMTsKICAgICAgVFsxXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjsKICAgICAgVFsyXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMzsKICAgICAgVFszXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMTsKICAgICAgVFs0XSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjsKICAgICAgVFs1XSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMzsKICAgICAgVFs2XSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMTsKICAgICAgVFs3XSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMjsKICAgICAgVFs4XSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMzsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIC8qKgogICAgICogU2NhbGUgZWFjaCBjb2x1bW4gb2YgdGhlIG1hdHJpeAogICAgICovCgoKICAgIHNjYWxlKHZlY3RvciwgdGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRhcmdldCA9IG5ldyBNYXQzKCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IGUgPSB0aGlzLmVsZW1lbnRzOwogICAgICBjb25zdCB0ID0gdGFyZ2V0LmVsZW1lbnRzOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IDM7IGkrKykgewogICAgICAgIHRbMyAqIGkgKyAwXSA9IHZlY3Rvci54ICogZVszICogaSArIDBdOwogICAgICAgIHRbMyAqIGkgKyAxXSA9IHZlY3Rvci55ICogZVszICogaSArIDFdOwogICAgICAgIHRbMyAqIGkgKyAyXSA9IHZlY3Rvci56ICogZVszICogaSArIDJdOwogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBTb2x2ZSBBeD1iCiAgICAgKiBAcGFyYW0gYiBUaGUgcmlnaHQgaGFuZCBzaWRlCiAgICAgKiBAcGFyYW0gdGFyZ2V0IE9wdGlvbmFsLiBUYXJnZXQgdmVjdG9yIHRvIHNhdmUgaW4uCiAgICAgKiBAcmV0dXJuIFRoZSBzb2x1dGlvbiB4CiAgICAgKiBAdG9kbyBzaG91bGQgcmV1c2UgYXJyYXlzCiAgICAgKi8KCgogICAgc29sdmUoYiwgdGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRhcmdldCA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIC8vIENvbnN0cnVjdCBlcXVhdGlvbnMKICAgICAgY29uc3QgbnIgPSAzOyAvLyBudW0gcm93cwoKICAgICAgY29uc3QgbmMgPSA0OyAvLyBudW0gY29scwoKICAgICAgY29uc3QgZXFucyA9IFtdOwogICAgICBsZXQgaTsKICAgICAgbGV0IGo7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbnIgKiBuYzsgaSsrKSB7CiAgICAgICAgZXFucy5wdXNoKDApOwogICAgICB9CgogICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykgewogICAgICAgICAgZXFuc1tpICsgbmMgKiBqXSA9IHRoaXMuZWxlbWVudHNbaSArIDMgKiBqXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVxbnNbMyArIDQgKiAwXSA9IGIueDsKICAgICAgZXFuc1szICsgNCAqIDFdID0gYi55OwogICAgICBlcW5zWzMgKyA0ICogMl0gPSBiLno7IC8vIENvbXB1dGUgcmlnaHQgdXBwZXIgdHJpYW5ndWxhciB2ZXJzaW9uIG9mIHRoZSBtYXRyaXggLSBHYXVzcyBlbGltaW5hdGlvbgoKICAgICAgbGV0IG4gPSAzOwogICAgICBjb25zdCBrID0gbjsKICAgICAgbGV0IG5wOwogICAgICBjb25zdCBrcCA9IDQ7IC8vIG51bSByb3dzCgogICAgICBsZXQgcDsKCiAgICAgIGRvIHsKICAgICAgICBpID0gayAtIG47CgogICAgICAgIGlmIChlcW5zW2kgKyBuYyAqIGldID09PSAwKSB7CiAgICAgICAgICAvLyB0aGUgcGl2b3QgaXMgbnVsbCwgc3dhcCBsaW5lcwogICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBrOyBqKyspIHsKICAgICAgICAgICAgaWYgKGVxbnNbaSArIG5jICogal0gIT09IDApIHsKICAgICAgICAgICAgICBucCA9IGtwOwoKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAvLyBkbyBsaWduZSggaSApID0gbGlnbmUoIGkgKSArIGxpZ25lKCBrICkKICAgICAgICAgICAgICAgIHAgPSBrcCAtIG5wOwogICAgICAgICAgICAgICAgZXFuc1twICsgbmMgKiBpXSArPSBlcW5zW3AgKyBuYyAqIGpdOwogICAgICAgICAgICAgIH0gd2hpbGUgKC0tbnApOwoKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGVxbnNbaSArIG5jICogaV0gIT09IDApIHsKICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgazsgaisrKSB7CiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxpZXIgPSBlcW5zW2kgKyBuYyAqIGpdIC8gZXFuc1tpICsgbmMgKiBpXTsKICAgICAgICAgICAgbnAgPSBrcDsKCiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAvLyBkbyBsaWduZSggayApID0gbGlnbmUoIGsgKSAtIG11bHRpcGxpZXIgKiBsaWduZSggaSApCiAgICAgICAgICAgICAgcCA9IGtwIC0gbnA7CiAgICAgICAgICAgICAgZXFuc1twICsgbmMgKiBqXSA9IHAgPD0gaSA/IDAgOiBlcW5zW3AgKyBuYyAqIGpdIC0gZXFuc1twICsgbmMgKiBpXSAqIG11bHRpcGxpZXI7CiAgICAgICAgICAgIH0gd2hpbGUgKC0tbnApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSB3aGlsZSAoLS1uKTsgLy8gR2V0IHRoZSBzb2x1dGlvbgoKCiAgICAgIHRhcmdldC56ID0gZXFuc1syICogbmMgKyAzXSAvIGVxbnNbMiAqIG5jICsgMl07CiAgICAgIHRhcmdldC55ID0gKGVxbnNbMSAqIG5jICsgM10gLSBlcW5zWzEgKiBuYyArIDJdICogdGFyZ2V0LnopIC8gZXFuc1sxICogbmMgKyAxXTsKICAgICAgdGFyZ2V0LnggPSAoZXFuc1swICogbmMgKyAzXSAtIGVxbnNbMCAqIG5jICsgMl0gKiB0YXJnZXQueiAtIGVxbnNbMCAqIG5jICsgMV0gKiB0YXJnZXQueSkgLyBlcW5zWzAgKiBuYyArIDBdOwoKICAgICAgaWYgKGlzTmFOKHRhcmdldC54KSB8fCBpc05hTih0YXJnZXQueSkgfHwgaXNOYU4odGFyZ2V0LnopIHx8IHRhcmdldC54ID09PSBJbmZpbml0eSB8fCB0YXJnZXQueSA9PT0gSW5maW5pdHkgfHwgdGFyZ2V0LnogPT09IEluZmluaXR5KSB7CiAgICAgICAgdGhyb3cgYENvdWxkIG5vdCBzb2x2ZSBlcXVhdGlvbiEgR290IHg9WyR7dGFyZ2V0LnRvU3RyaW5nKCl9XSwgYj1bJHtiLnRvU3RyaW5nKCl9XSwgQT1bJHt0aGlzLnRvU3RyaW5nKCl9XWA7CiAgICAgIH0KCiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhbiBlbGVtZW50IGluIHRoZSBtYXRyaXggYnkgaW5kZXguIEluZGV4IHN0YXJ0cyBhdCAwLCBub3QgMSEhIQogICAgICogQHBhcmFtIHZhbHVlIElmIHByb3ZpZGVkLCB0aGUgbWF0cml4IGVsZW1lbnQgd2lsbCBiZSBzZXQgdG8gdGhpcyB2YWx1ZS4KICAgICAqLwoKCiAgICBlKHJvdywgY29sdW1uLCB2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzW2NvbHVtbiArIDMgKiByb3ddOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNldCB2YWx1ZQogICAgICAgIHRoaXMuZWxlbWVudHNbY29sdW1uICsgMyAqIHJvd10gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb3B5IGFub3RoZXIgbWF0cml4IGludG8gdGhpcyBtYXRyaXggb2JqZWN0LgogICAgICovCgoKICAgIGNvcHkobWF0cml4KSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4LmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5lbGVtZW50c1tpXSA9IG1hdHJpeC5lbGVtZW50c1tpXTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeC4KICAgICAqLwoKCiAgICB0b1N0cmluZygpIHsKICAgICAgbGV0IHIgPSAnJzsKICAgICAgY29uc3Qgc2VwID0gJywnOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA5OyBpKyspIHsKICAgICAgICByICs9IHRoaXMuZWxlbWVudHNbaV0gKyBzZXA7CiAgICAgIH0KCiAgICAgIHJldHVybiByOwogICAgfQogICAgLyoqCiAgICAgKiByZXZlcnNlIHRoZSBtYXRyaXgKICAgICAqIEBwYXJhbSB0YXJnZXQgVGFyZ2V0IG1hdHJpeCB0byBzYXZlIGluLgogICAgICogQHJldHVybiBUaGUgc29sdXRpb24geAogICAgICovCgoKICAgIHJldmVyc2UodGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRhcmdldCA9IG5ldyBNYXQzKCk7CiAgICAgIH0KCiAgICAgIC8vIENvbnN0cnVjdCBlcXVhdGlvbnMKICAgICAgY29uc3QgbnIgPSAzOyAvLyBudW0gcm93cwoKICAgICAgY29uc3QgbmMgPSA2OyAvLyBudW0gY29scwoKICAgICAgY29uc3QgZXFucyA9IHJldmVyc2VfZXFuczsKICAgICAgbGV0IGk7CiAgICAgIGxldCBqOwoKICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKICAgICAgICAgIGVxbnNbaSArIG5jICogal0gPSB0aGlzLmVsZW1lbnRzW2kgKyAzICogal07CiAgICAgICAgfQogICAgICB9CgogICAgICBlcW5zWzMgKyA2ICogMF0gPSAxOwogICAgICBlcW5zWzMgKyA2ICogMV0gPSAwOwogICAgICBlcW5zWzMgKyA2ICogMl0gPSAwOwogICAgICBlcW5zWzQgKyA2ICogMF0gPSAwOwogICAgICBlcW5zWzQgKyA2ICogMV0gPSAxOwogICAgICBlcW5zWzQgKyA2ICogMl0gPSAwOwogICAgICBlcW5zWzUgKyA2ICogMF0gPSAwOwogICAgICBlcW5zWzUgKyA2ICogMV0gPSAwOwogICAgICBlcW5zWzUgKyA2ICogMl0gPSAxOyAvLyBDb21wdXRlIHJpZ2h0IHVwcGVyIHRyaWFuZ3VsYXIgdmVyc2lvbiBvZiB0aGUgbWF0cml4IC0gR2F1c3MgZWxpbWluYXRpb24KCiAgICAgIGxldCBuID0gMzsKICAgICAgY29uc3QgayA9IG47CiAgICAgIGxldCBucDsKICAgICAgY29uc3Qga3AgPSBuYzsgLy8gbnVtIHJvd3MKCiAgICAgIGxldCBwOwoKICAgICAgZG8gewogICAgICAgIGkgPSBrIC0gbjsKCiAgICAgICAgaWYgKGVxbnNbaSArIG5jICogaV0gPT09IDApIHsKICAgICAgICAgIC8vIHRoZSBwaXZvdCBpcyBudWxsLCBzd2FwIGxpbmVzCiAgICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IGs7IGorKykgewogICAgICAgICAgICBpZiAoZXFuc1tpICsgbmMgKiBqXSAhPT0gMCkgewogICAgICAgICAgICAgIG5wID0ga3A7CgogICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIC8vIGRvIGxpbmUoIGkgKSA9IGxpbmUoIGkgKSArIGxpbmUoIGsgKQogICAgICAgICAgICAgICAgcCA9IGtwIC0gbnA7CiAgICAgICAgICAgICAgICBlcW5zW3AgKyBuYyAqIGldICs9IGVxbnNbcCArIG5jICogal07CiAgICAgICAgICAgICAgfSB3aGlsZSAoLS1ucCk7CgogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoZXFuc1tpICsgbmMgKiBpXSAhPT0gMCkgewogICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBrOyBqKyspIHsKICAgICAgICAgICAgY29uc3QgbXVsdGlwbGllciA9IGVxbnNbaSArIG5jICogal0gLyBlcW5zW2kgKyBuYyAqIGldOwogICAgICAgICAgICBucCA9IGtwOwoKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIC8vIGRvIGxpbmUoIGsgKSA9IGxpbmUoIGsgKSAtIG11bHRpcGxpZXIgKiBsaW5lKCBpICkKICAgICAgICAgICAgICBwID0ga3AgLSBucDsKICAgICAgICAgICAgICBlcW5zW3AgKyBuYyAqIGpdID0gcCA8PSBpID8gMCA6IGVxbnNbcCArIG5jICogal0gLSBlcW5zW3AgKyBuYyAqIGldICogbXVsdGlwbGllcjsKICAgICAgICAgICAgfSB3aGlsZSAoLS1ucCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IHdoaWxlICgtLW4pOyAvLyBlbGltaW5hdGUgdGhlIHVwcGVyIGxlZnQgdHJpYW5nbGUgb2YgdGhlIG1hdHJpeAoKCiAgICAgIGkgPSAyOwoKICAgICAgZG8gewogICAgICAgIGogPSBpIC0gMTsKCiAgICAgICAgZG8gewogICAgICAgICAgY29uc3QgbXVsdGlwbGllciA9IGVxbnNbaSArIG5jICogal0gLyBlcW5zW2kgKyBuYyAqIGldOwogICAgICAgICAgbnAgPSBuYzsKCiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIHAgPSBuYyAtIG5wOwogICAgICAgICAgICBlcW5zW3AgKyBuYyAqIGpdID0gZXFuc1twICsgbmMgKiBqXSAtIGVxbnNbcCArIG5jICogaV0gKiBtdWx0aXBsaWVyOwogICAgICAgICAgfSB3aGlsZSAoLS1ucCk7CiAgICAgICAgfSB3aGlsZSAoai0tKTsKICAgICAgfSB3aGlsZSAoLS1pKTsgLy8gb3BlcmF0aW9ucyBvbiB0aGUgZGlhZ29uYWwKCgogICAgICBpID0gMjsKCiAgICAgIGRvIHsKICAgICAgICBjb25zdCBtdWx0aXBsaWVyID0gMSAvIGVxbnNbaSArIG5jICogaV07CiAgICAgICAgbnAgPSBuYzsKCiAgICAgICAgZG8gewogICAgICAgICAgcCA9IG5jIC0gbnA7CiAgICAgICAgICBlcW5zW3AgKyBuYyAqIGldID0gZXFuc1twICsgbmMgKiBpXSAqIG11bHRpcGxpZXI7CiAgICAgICAgfSB3aGlsZSAoLS1ucCk7CiAgICAgIH0gd2hpbGUgKGktLSk7CgogICAgICBpID0gMjsKCiAgICAgIGRvIHsKICAgICAgICBqID0gMjsKCiAgICAgICAgZG8gewogICAgICAgICAgcCA9IGVxbnNbbnIgKyBqICsgbmMgKiBpXTsKCiAgICAgICAgICBpZiAoaXNOYU4ocCkgfHwgcCA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgdGhyb3cgYENvdWxkIG5vdCByZXZlcnNlISBBPVske3RoaXMudG9TdHJpbmcoKX1dYDsKICAgICAgICAgIH0KCiAgICAgICAgICB0YXJnZXQuZShpLCBqLCBwKTsKICAgICAgICB9IHdoaWxlIChqLS0pOwogICAgICB9IHdoaWxlIChpLS0pOwoKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBtYXRyaXggZnJvbSBhIHF1YXRlcmlvbgogICAgICovCgoKICAgIHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24ocSkgewogICAgICBjb25zdCB4ID0gcS54OwogICAgICBjb25zdCB5ID0gcS55OwogICAgICBjb25zdCB6ID0gcS56OwogICAgICBjb25zdCB3ID0gcS53OwogICAgICBjb25zdCB4MiA9IHggKyB4OwogICAgICBjb25zdCB5MiA9IHkgKyB5OwogICAgICBjb25zdCB6MiA9IHogKyB6OwogICAgICBjb25zdCB4eCA9IHggKiB4MjsKICAgICAgY29uc3QgeHkgPSB4ICogeTI7CiAgICAgIGNvbnN0IHh6ID0geCAqIHoyOwogICAgICBjb25zdCB5eSA9IHkgKiB5MjsKICAgICAgY29uc3QgeXogPSB5ICogejI7CiAgICAgIGNvbnN0IHp6ID0geiAqIHoyOwogICAgICBjb25zdCB3eCA9IHcgKiB4MjsKICAgICAgY29uc3Qgd3kgPSB3ICogeTI7CiAgICAgIGNvbnN0IHd6ID0gdyAqIHoyOwogICAgICBjb25zdCBlID0gdGhpcy5lbGVtZW50czsKICAgICAgZVszICogMCArIDBdID0gMSAtICh5eSArIHp6KTsKICAgICAgZVszICogMCArIDFdID0geHkgLSB3ejsKICAgICAgZVszICogMCArIDJdID0geHogKyB3eTsKICAgICAgZVszICogMSArIDBdID0geHkgKyB3ejsKICAgICAgZVszICogMSArIDFdID0gMSAtICh4eCArIHp6KTsKICAgICAgZVszICogMSArIDJdID0geXogLSB3eDsKICAgICAgZVszICogMiArIDBdID0geHogLSB3eTsKICAgICAgZVszICogMiArIDFdID0geXogKyB3eDsKICAgICAgZVszICogMiArIDJdID0gMSAtICh4eCArIHl5KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIFRyYW5zcG9zZSB0aGUgbWF0cml4CiAgICAgKiBAcGFyYW0gdGFyZ2V0IE9wdGlvbmFsLiBXaGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0LgogICAgICogQHJldHVybiBUaGUgdGFyZ2V0IE1hdDMsIG9yIGEgbmV3IE1hdDMgaWYgdGFyZ2V0IHdhcyBvbWl0dGVkLgogICAgICovCgoKICAgIHRyYW5zcG9zZSh0YXJnZXQpIHsKICAgICAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0ID0gbmV3IE1hdDMoKTsKICAgICAgfQoKICAgICAgY29uc3QgTSA9IHRoaXMuZWxlbWVudHM7CiAgICAgIGNvbnN0IFQgPSB0YXJnZXQuZWxlbWVudHM7CiAgICAgIGxldCB0bXA7IC8vU2V0IGRpYWdvbmFscwoKICAgICAgVFswXSA9IE1bMF07CiAgICAgIFRbNF0gPSBNWzRdOwogICAgICBUWzhdID0gTVs4XTsKICAgICAgdG1wID0gTVsxXTsKICAgICAgVFsxXSA9IE1bM107CiAgICAgIFRbM10gPSB0bXA7CiAgICAgIHRtcCA9IE1bMl07CiAgICAgIFRbMl0gPSBNWzZdOwogICAgICBUWzZdID0gdG1wOwogICAgICB0bXAgPSBNWzVdOwogICAgICBUWzVdID0gTVs3XTsKICAgICAgVFs3XSA9IHRtcDsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgfQogIGNvbnN0IHJldmVyc2VfZXFucyA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKCiAgLyoqCiAgICogMy1kaW1lbnNpb25hbCB2ZWN0b3IKICAgKiBAZXhhbXBsZQogICAqICAgICBjb25zdCB2ID0gbmV3IFZlYzMoMSwgMiwgMykKICAgKiAgICAgY29uc29sZS5sb2coJ3g9JyArIHYueCkgLy8geD0xCiAgICovCgogIGNsYXNzIFZlYzMgewogICAgY29uc3RydWN0b3IoeCwgeSwgeikgewogICAgICBpZiAoeCA9PT0gdm9pZCAwKSB7CiAgICAgICAgeCA9IDAuMDsKICAgICAgfQoKICAgICAgaWYgKHkgPT09IHZvaWQgMCkgewogICAgICAgIHkgPSAwLjA7CiAgICAgIH0KCiAgICAgIGlmICh6ID09PSB2b2lkIDApIHsKICAgICAgICB6ID0gMC4wOwogICAgICB9CgogICAgICB0aGlzLnggPSB4OwogICAgICB0aGlzLnkgPSB5OwogICAgICB0aGlzLnogPSB6OwogICAgfQogICAgLyoqCiAgICAgKiBWZWN0b3IgY3Jvc3MgcHJvZHVjdAogICAgICogQHBhcmFtIHRhcmdldCBPcHRpb25hbCB0YXJnZXQgdG8gc2F2ZSBpbi4KICAgICAqLwoKCiAgICBjcm9zcyh2ZWN0b3IsIHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICBjb25zdCB2eCA9IHZlY3Rvci54OwogICAgICBjb25zdCB2eSA9IHZlY3Rvci55OwogICAgICBjb25zdCB2eiA9IHZlY3Rvci56OwogICAgICBjb25zdCB4ID0gdGhpcy54OwogICAgICBjb25zdCB5ID0gdGhpcy55OwogICAgICBjb25zdCB6ID0gdGhpcy56OwogICAgICB0YXJnZXQueCA9IHkgKiB2eiAtIHogKiB2eTsKICAgICAgdGFyZ2V0LnkgPSB6ICogdnggLSB4ICogdno7CiAgICAgIHRhcmdldC56ID0geCAqIHZ5IC0geSAqIHZ4OwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHZlY3RvcnMnIDMgZWxlbWVudHMKICAgICAqLwoKCiAgICBzZXQoeCwgeSwgeikgewogICAgICB0aGlzLnggPSB4OwogICAgICB0aGlzLnkgPSB5OwogICAgICB0aGlzLnogPSB6OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8qKgogICAgICogU2V0IGFsbCBjb21wb25lbnRzIG9mIHRoZSB2ZWN0b3IgdG8gemVyby4KICAgICAqLwoKCiAgICBzZXRaZXJvKCkgewogICAgICB0aGlzLnggPSB0aGlzLnkgPSB0aGlzLnogPSAwOwogICAgfQogICAgLyoqCiAgICAgKiBWZWN0b3IgYWRkaXRpb24KICAgICAqLwoKCiAgICB2YWRkKHZlY3RvciwgdGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQpIHsKICAgICAgICB0YXJnZXQueCA9IHZlY3Rvci54ICsgdGhpcy54OwogICAgICAgIHRhcmdldC55ID0gdmVjdG9yLnkgKyB0aGlzLnk7CiAgICAgICAgdGFyZ2V0LnogPSB2ZWN0b3IueiArIHRoaXMuejsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IFZlYzModGhpcy54ICsgdmVjdG9yLngsIHRoaXMueSArIHZlY3Rvci55LCB0aGlzLnogKyB2ZWN0b3Iueik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVmVjdG9yIHN1YnRyYWN0aW9uCiAgICAgKiBAcGFyYW0gdGFyZ2V0IE9wdGlvbmFsIHRhcmdldCB0byBzYXZlIGluLgogICAgICovCgoKICAgIHZzdWIodmVjdG9yLCB0YXJnZXQpIHsKICAgICAgaWYgKHRhcmdldCkgewogICAgICAgIHRhcmdldC54ID0gdGhpcy54IC0gdmVjdG9yLng7CiAgICAgICAgdGFyZ2V0LnkgPSB0aGlzLnkgLSB2ZWN0b3IueTsKICAgICAgICB0YXJnZXQueiA9IHRoaXMueiAtIHZlY3Rvci56OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBuZXcgVmVjMyh0aGlzLnggLSB2ZWN0b3IueCwgdGhpcy55IC0gdmVjdG9yLnksIHRoaXMueiAtIHZlY3Rvci56KTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGNyb3NzIHByb2R1Y3QgbWF0cml4IGFfY3Jvc3MgZnJvbSBhIHZlY3Rvciwgc3VjaCB0aGF0IGEgeCBiID0gYV9jcm9zcyAqIGIgPSBjCiAgICAgKgogICAgICogU2VlIHtAbGluayBodHRwczovL3d3dzguY3MudW11LnNlL2t1cnNlci9UREJEMjQvVlQwNi9sZWN0dXJlcy9MZWN0dXJlNi5wZGYgVW1lw6UgVW5pdmVyc2l0eSBMZWN0dXJlfQogICAgICovCgoKICAgIGNyb3NzbWF0KCkgewogICAgICByZXR1cm4gbmV3IE1hdDMoWzAsIC10aGlzLnosIHRoaXMueSwgdGhpcy56LCAwLCAtdGhpcy54LCAtdGhpcy55LCB0aGlzLngsIDBdKTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplIHRoZSB2ZWN0b3IuIE5vdGUgdGhhdCB0aGlzIGNoYW5nZXMgdGhlIHZhbHVlcyBpbiB0aGUgdmVjdG9yLgogICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbm9ybSBvZiB0aGUgdmVjdG9yCiAgICAgKi8KCgogICAgbm9ybWFsaXplKCkgewogICAgICBjb25zdCB4ID0gdGhpcy54OwogICAgICBjb25zdCB5ID0gdGhpcy55OwogICAgICBjb25zdCB6ID0gdGhpcy56OwogICAgICBjb25zdCBuID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeik7CgogICAgICBpZiAobiA+IDAuMCkgewogICAgICAgIGNvbnN0IGludk4gPSAxIC8gbjsKICAgICAgICB0aGlzLnggKj0gaW52TjsKICAgICAgICB0aGlzLnkgKj0gaW52TjsKICAgICAgICB0aGlzLnogKj0gaW52TjsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBNYWtlIHNvbWV0aGluZyB1cAogICAgICAgIHRoaXMueCA9IDA7CiAgICAgICAgdGhpcy55ID0gMDsKICAgICAgICB0aGlzLnogPSAwOwogICAgICB9CgogICAgICByZXR1cm4gbjsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSB2ZXJzaW9uIG9mIHRoaXMgdmVjdG9yIHRoYXQgaXMgb2YgbGVuZ3RoIDEuCiAgICAgKiBAcGFyYW0gdGFyZ2V0IE9wdGlvbmFsIHRhcmdldCB0byBzYXZlIGluCiAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVuaXQgdmVjdG9yCiAgICAgKi8KCgogICAgdW5pdCh0YXJnZXQpIHsKICAgICAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgY29uc3QgeCA9IHRoaXMueDsKICAgICAgY29uc3QgeSA9IHRoaXMueTsKICAgICAgY29uc3QgeiA9IHRoaXMuejsKICAgICAgbGV0IG5pbnYgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTsKCiAgICAgIGlmIChuaW52ID4gMC4wKSB7CiAgICAgICAgbmludiA9IDEuMCAvIG5pbnY7CiAgICAgICAgdGFyZ2V0LnggPSB4ICogbmludjsKICAgICAgICB0YXJnZXQueSA9IHkgKiBuaW52OwogICAgICAgIHRhcmdldC56ID0geiAqIG5pbnY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGFyZ2V0LnggPSAxOwogICAgICAgIHRhcmdldC55ID0gMDsKICAgICAgICB0YXJnZXQueiA9IDA7CiAgICAgIH0KCiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IKICAgICAqLwoKCiAgICBsZW5ndGgoKSB7CiAgICAgIGNvbnN0IHggPSB0aGlzLng7CiAgICAgIGNvbnN0IHkgPSB0aGlzLnk7CiAgICAgIGNvbnN0IHogPSB0aGlzLno7CiAgICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBzcXVhcmVkIGxlbmd0aCBvZiB0aGUgdmVjdG9yLgogICAgICovCgoKICAgIGxlbmd0aFNxdWFyZWQoKSB7CiAgICAgIHJldHVybiB0aGlzLmRvdCh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGRpc3RhbmNlIGZyb20gdGhpcyBwb2ludCB0byBhbm90aGVyIHBvaW50CiAgICAgKi8KCgogICAgZGlzdGFuY2VUbyhwKSB7CiAgICAgIGNvbnN0IHggPSB0aGlzLng7CiAgICAgIGNvbnN0IHkgPSB0aGlzLnk7CiAgICAgIGNvbnN0IHogPSB0aGlzLno7CiAgICAgIGNvbnN0IHB4ID0gcC54OwogICAgICBjb25zdCBweSA9IHAueTsKICAgICAgY29uc3QgcHogPSBwLno7CiAgICAgIHJldHVybiBNYXRoLnNxcnQoKHB4IC0geCkgKiAocHggLSB4KSArIChweSAtIHkpICogKHB5IC0geSkgKyAocHogLSB6KSAqIChweiAtIHopKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHNxdWFyZWQgZGlzdGFuY2UgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnQKICAgICAqLwoKCiAgICBkaXN0YW5jZVNxdWFyZWQocCkgewogICAgICBjb25zdCB4ID0gdGhpcy54OwogICAgICBjb25zdCB5ID0gdGhpcy55OwogICAgICBjb25zdCB6ID0gdGhpcy56OwogICAgICBjb25zdCBweCA9IHAueDsKICAgICAgY29uc3QgcHkgPSBwLnk7CiAgICAgIGNvbnN0IHB6ID0gcC56OwogICAgICByZXR1cm4gKHB4IC0geCkgKiAocHggLSB4KSArIChweSAtIHkpICogKHB5IC0geSkgKyAocHogLSB6KSAqIChweiAtIHopOwogICAgfQogICAgLyoqCiAgICAgKiBNdWx0aXBseSBhbGwgdGhlIGNvbXBvbmVudHMgb2YgdGhlIHZlY3RvciB3aXRoIGEgc2NhbGFyLgogICAgICogQHBhcmFtIHRhcmdldCBUaGUgdmVjdG9yIHRvIHNhdmUgdGhlIHJlc3VsdCBpbi4KICAgICAqLwoKCiAgICBzY2FsZShzY2FsYXIsIHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICBjb25zdCB4ID0gdGhpcy54OwogICAgICBjb25zdCB5ID0gdGhpcy55OwogICAgICBjb25zdCB6ID0gdGhpcy56OwogICAgICB0YXJnZXQueCA9IHNjYWxhciAqIHg7CiAgICAgIHRhcmdldC55ID0gc2NhbGFyICogeTsKICAgICAgdGFyZ2V0LnogPSBzY2FsYXIgKiB6OwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBNdWx0aXBseSB0aGUgdmVjdG9yIHdpdGggYW4gb3RoZXIgdmVjdG9yLCBjb21wb25lbnQtd2lzZS4KICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHZlY3RvciB0byBzYXZlIHRoZSByZXN1bHQgaW4uCiAgICAgKi8KCgogICAgdm11bCh2ZWN0b3IsIHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICB0YXJnZXQueCA9IHZlY3Rvci54ICogdGhpcy54OwogICAgICB0YXJnZXQueSA9IHZlY3Rvci55ICogdGhpcy55OwogICAgICB0YXJnZXQueiA9IHZlY3Rvci56ICogdGhpcy56OwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBTY2FsZSBhIHZlY3RvciBhbmQgYWRkIGl0IHRvIHRoaXMgdmVjdG9yLiBTYXZlIHRoZSByZXN1bHQgaW4gInRhcmdldCIuICh0YXJnZXQgPSB0aGlzICsgdmVjdG9yICogc2NhbGFyKQogICAgICogQHBhcmFtIHRhcmdldCBUaGUgdmVjdG9yIHRvIHNhdmUgdGhlIHJlc3VsdCBpbi4KICAgICAqLwoKCiAgICBhZGRTY2FsZWRWZWN0b3Ioc2NhbGFyLCB2ZWN0b3IsIHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICB0YXJnZXQueCA9IHRoaXMueCArIHNjYWxhciAqIHZlY3Rvci54OwogICAgICB0YXJnZXQueSA9IHRoaXMueSArIHNjYWxhciAqIHZlY3Rvci55OwogICAgICB0YXJnZXQueiA9IHRoaXMueiArIHNjYWxhciAqIHZlY3Rvci56OwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBDYWxjdWxhdGUgZG90IHByb2R1Y3QKICAgICAqIEBwYXJhbSB2ZWN0b3IKICAgICAqLwoKCiAgICBkb3QodmVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLnggKiB2ZWN0b3IueCArIHRoaXMueSAqIHZlY3Rvci55ICsgdGhpcy56ICogdmVjdG9yLno7CiAgICB9CgogICAgaXNaZXJvKCkgewogICAgICByZXR1cm4gdGhpcy54ID09PSAwICYmIHRoaXMueSA9PT0gMCAmJiB0aGlzLnogPT09IDA7CiAgICB9CiAgICAvKioKICAgICAqIE1ha2UgdGhlIHZlY3RvciBwb2ludCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgogICAgICogQHBhcmFtIHRhcmdldCBPcHRpb25hbCB0YXJnZXQgdG8gc2F2ZSBpbgogICAgICovCgoKICAgIG5lZ2F0ZSh0YXJnZXQpIHsKICAgICAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgdGFyZ2V0LnggPSAtdGhpcy54OwogICAgICB0YXJnZXQueSA9IC10aGlzLnk7CiAgICAgIHRhcmdldC56ID0gLXRoaXMuejsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZSB0d28gYXJ0aWZpY2lhbCB0YW5nZW50cyB0byB0aGUgdmVjdG9yCiAgICAgKiBAcGFyYW0gdDEgVmVjdG9yIG9iamVjdCB0byBzYXZlIHRoZSBmaXJzdCB0YW5nZW50IGluCiAgICAgKiBAcGFyYW0gdDIgVmVjdG9yIG9iamVjdCB0byBzYXZlIHRoZSBzZWNvbmQgdGFuZ2VudCBpbgogICAgICovCgoKICAgIHRhbmdlbnRzKHQxLCB0MikgewogICAgICBjb25zdCBub3JtID0gdGhpcy5sZW5ndGgoKTsKCiAgICAgIGlmIChub3JtID4gMC4wKSB7CiAgICAgICAgY29uc3QgbiA9IFZlYzNfdGFuZ2VudHNfbjsKICAgICAgICBjb25zdCBpbm9ybSA9IDEgLyBub3JtOwogICAgICAgIG4uc2V0KHRoaXMueCAqIGlub3JtLCB0aGlzLnkgKiBpbm9ybSwgdGhpcy56ICogaW5vcm0pOwogICAgICAgIGNvbnN0IHJhbmRWZWMgPSBWZWMzX3RhbmdlbnRzX3JhbmRWZWM7CgogICAgICAgIGlmIChNYXRoLmFicyhuLngpIDwgMC45KSB7CiAgICAgICAgICByYW5kVmVjLnNldCgxLCAwLCAwKTsKICAgICAgICAgIG4uY3Jvc3MocmFuZFZlYywgdDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByYW5kVmVjLnNldCgwLCAxLCAwKTsKICAgICAgICAgIG4uY3Jvc3MocmFuZFZlYywgdDEpOwogICAgICAgIH0KCiAgICAgICAgbi5jcm9zcyh0MSwgdDIpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZSBub3JtYWwgbGVuZ3RoIGlzIHplcm8sIG1ha2Ugc29tZXRoaW5nIHVwCiAgICAgICAgdDEuc2V0KDEsIDAsIDApOwogICAgICAgIHQyLnNldCgwLCAxLCAwKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0byBhIG1vcmUgcmVhZGFibGUgZm9ybWF0CiAgICAgKi8KCgogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiBgJHt0aGlzLnh9LCR7dGhpcy55fSwke3RoaXMuen1gOwogICAgfQogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0byBhbiBhcnJheQogICAgICovCgoKICAgIHRvQXJyYXkoKSB7CiAgICAgIHJldHVybiBbdGhpcy54LCB0aGlzLnksIHRoaXMuel07CiAgICB9CiAgICAvKioKICAgICAqIENvcGllcyB2YWx1ZSBvZiBzb3VyY2UgdG8gdGhpcyB2ZWN0b3IuCiAgICAgKi8KCgogICAgY29weSh2ZWN0b3IpIHsKICAgICAgdGhpcy54ID0gdmVjdG9yLng7CiAgICAgIHRoaXMueSA9IHZlY3Rvci55OwogICAgICB0aGlzLnogPSB2ZWN0b3IuejsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIERvIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjdG9ycwogICAgICogQHBhcmFtIHQgQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLiAwIHdpbGwgbWFrZSB0aGlzIGZ1bmN0aW9uIHJldHVybiB1LCBhbmQgMSB3aWxsIG1ha2UgaXQgcmV0dXJuIHYuIE51bWJlcnMgaW4gYmV0d2VlbiB3aWxsIGdlbmVyYXRlIGEgdmVjdG9yIGluIGJldHdlZW4gdGhlbS4KICAgICAqLwoKCiAgICBsZXJwKHZlY3RvciwgdCwgdGFyZ2V0KSB7CiAgICAgIGNvbnN0IHggPSB0aGlzLng7CiAgICAgIGNvbnN0IHkgPSB0aGlzLnk7CiAgICAgIGNvbnN0IHogPSB0aGlzLno7CiAgICAgIHRhcmdldC54ID0geCArICh2ZWN0b3IueCAtIHgpICogdDsKICAgICAgdGFyZ2V0LnkgPSB5ICsgKHZlY3Rvci55IC0geSkgKiB0OwogICAgICB0YXJnZXQueiA9IHogKyAodmVjdG9yLnogLSB6KSAqIHQ7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGEgdmVjdG9yIGVxdWFscyBpcyBhbG1vc3QgZXF1YWwgdG8gYW5vdGhlciBvbmUuCiAgICAgKi8KCgogICAgYWxtb3N0RXF1YWxzKHZlY3RvciwgcHJlY2lzaW9uKSB7CiAgICAgIGlmIChwcmVjaXNpb24gPT09IHZvaWQgMCkgewogICAgICAgIHByZWNpc2lvbiA9IDFlLTY7CiAgICAgIH0KCiAgICAgIGlmIChNYXRoLmFicyh0aGlzLnggLSB2ZWN0b3IueCkgPiBwcmVjaXNpb24gfHwgTWF0aC5hYnModGhpcy55IC0gdmVjdG9yLnkpID4gcHJlY2lzaW9uIHx8IE1hdGguYWJzKHRoaXMueiAtIHZlY3Rvci56KSA+IHByZWNpc2lvbikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGEgdmVjdG9yIGlzIGFsbW9zdCB6ZXJvCiAgICAgKi8KCgogICAgYWxtb3N0WmVybyhwcmVjaXNpb24pIHsKICAgICAgaWYgKHByZWNpc2lvbiA9PT0gdm9pZCAwKSB7CiAgICAgICAgcHJlY2lzaW9uID0gMWUtNjsKICAgICAgfQoKICAgICAgaWYgKE1hdGguYWJzKHRoaXMueCkgPiBwcmVjaXNpb24gfHwgTWF0aC5hYnModGhpcy55KSA+IHByZWNpc2lvbiB8fCBNYXRoLmFicyh0aGlzLnopID4gcHJlY2lzaW9uKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2sgaWYgdGhlIHZlY3RvciBpcyBhbnRpLXBhcmFsbGVsIHRvIGFub3RoZXIgdmVjdG9yLgogICAgICogQHBhcmFtIHByZWNpc2lvbiBTZXQgdG8gemVybyBmb3IgZXhhY3QgY29tcGFyaXNvbnMKICAgICAqLwoKCiAgICBpc0FudGlwYXJhbGxlbFRvKHZlY3RvciwgcHJlY2lzaW9uKSB7CiAgICAgIHRoaXMubmVnYXRlKGFudGlwX25lZyk7CiAgICAgIHJldHVybiBhbnRpcF9uZWcuYWxtb3N0RXF1YWxzKHZlY3RvciwgcHJlY2lzaW9uKTsKICAgIH0KICAgIC8qKgogICAgICogQ2xvbmUgdGhlIHZlY3RvcgogICAgICovCgoKICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IFZlYzModGhpcy54LCB0aGlzLnksIHRoaXMueik7CiAgICB9CgogIH0KICBWZWMzLlpFUk8gPSBuZXcgVmVjMygwLCAwLCAwKTsKICBWZWMzLlVOSVRfWCA9IG5ldyBWZWMzKDEsIDAsIDApOwogIFZlYzMuVU5JVF9ZID0gbmV3IFZlYzMoMCwgMSwgMCk7CiAgVmVjMy5VTklUX1ogPSBuZXcgVmVjMygwLCAwLCAxKTsKICBjb25zdCBWZWMzX3RhbmdlbnRzX24gPSBuZXcgVmVjMygpOwogIGNvbnN0IFZlYzNfdGFuZ2VudHNfcmFuZFZlYyA9IG5ldyBWZWMzKCk7CiAgY29uc3QgYW50aXBfbmVnID0gbmV3IFZlYzMoKTsKCiAgLyoqCiAgICogQXhpcyBhbGlnbmVkIGJvdW5kaW5nIGJveCBjbGFzcy4KICAgKi8KICBjbGFzcyBBQUJCIHsKICAgIC8qKgogICAgICogVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBib3VuZGluZyBib3gKICAgICAqLwoKICAgIC8qKgogICAgICogVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBib3VuZGluZyBib3gKICAgICAqLwogICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7CiAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICB9CgogICAgICB0aGlzLmxvd2VyQm91bmQgPSBuZXcgVmVjMygpOwogICAgICB0aGlzLnVwcGVyQm91bmQgPSBuZXcgVmVjMygpOwoKICAgICAgaWYgKG9wdGlvbnMubG93ZXJCb3VuZCkgewogICAgICAgIHRoaXMubG93ZXJCb3VuZC5jb3B5KG9wdGlvbnMubG93ZXJCb3VuZCk7CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLnVwcGVyQm91bmQpIHsKICAgICAgICB0aGlzLnVwcGVyQm91bmQuY29weShvcHRpb25zLnVwcGVyQm91bmQpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgQUFCQiBib3VuZHMgZnJvbSBhIHNldCBvZiBwb2ludHMuCiAgICAgKiBAcGFyYW0gcG9pbnRzIEFuIGFycmF5IG9mIFZlYzMncy4KICAgICAqIEByZXR1cm4gVGhlIHNlbGYgb2JqZWN0CiAgICAgKi8KCgogICAgc2V0RnJvbVBvaW50cyhwb2ludHMsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBza2luU2l6ZSkgewogICAgICBjb25zdCBsID0gdGhpcy5sb3dlckJvdW5kOwogICAgICBjb25zdCB1ID0gdGhpcy51cHBlckJvdW5kOwogICAgICBjb25zdCBxID0gcXVhdGVybmlvbjsgLy8gU2V0IHRvIHRoZSBmaXJzdCBwb2ludAoKICAgICAgbC5jb3B5KHBvaW50c1swXSk7CgogICAgICBpZiAocSkgewogICAgICAgIHEudm11bHQobCwgbCk7CiAgICAgIH0KCiAgICAgIHUuY29weShsKTsKCiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IHAgPSBwb2ludHNbaV07CgogICAgICAgIGlmIChxKSB7CiAgICAgICAgICBxLnZtdWx0KHAsIHRtcCQxKTsKICAgICAgICAgIHAgPSB0bXAkMTsKICAgICAgICB9CgogICAgICAgIGlmIChwLnggPiB1LngpIHsKICAgICAgICAgIHUueCA9IHAueDsKICAgICAgICB9CgogICAgICAgIGlmIChwLnggPCBsLngpIHsKICAgICAgICAgIGwueCA9IHAueDsKICAgICAgICB9CgogICAgICAgIGlmIChwLnkgPiB1LnkpIHsKICAgICAgICAgIHUueSA9IHAueTsKICAgICAgICB9CgogICAgICAgIGlmIChwLnkgPCBsLnkpIHsKICAgICAgICAgIGwueSA9IHAueTsKICAgICAgICB9CgogICAgICAgIGlmIChwLnogPiB1LnopIHsKICAgICAgICAgIHUueiA9IHAuejsKICAgICAgICB9CgogICAgICAgIGlmIChwLnogPCBsLnopIHsKICAgICAgICAgIGwueiA9IHAuejsKICAgICAgICB9CiAgICAgIH0gLy8gQWRkIG9mZnNldAoKCiAgICAgIGlmIChwb3NpdGlvbikgewogICAgICAgIHBvc2l0aW9uLnZhZGQobCwgbCk7CiAgICAgICAgcG9zaXRpb24udmFkZCh1LCB1KTsKICAgICAgfQoKICAgICAgaWYgKHNraW5TaXplKSB7CiAgICAgICAgbC54IC09IHNraW5TaXplOwogICAgICAgIGwueSAtPSBza2luU2l6ZTsKICAgICAgICBsLnogLT0gc2tpblNpemU7CiAgICAgICAgdS54ICs9IHNraW5TaXplOwogICAgICAgIHUueSArPSBza2luU2l6ZTsKICAgICAgICB1LnogKz0gc2tpblNpemU7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgLyoqCiAgICAgKiBDb3B5IGJvdW5kcyBmcm9tIGFuIEFBQkIgdG8gdGhpcyBBQUJCCiAgICAgKiBAcGFyYW0gYWFiYiBTb3VyY2UgdG8gY29weSBmcm9tCiAgICAgKiBAcmV0dXJuIFRoZSB0aGlzIG9iamVjdCwgZm9yIGNoYWluYWJpbGl0eQogICAgICovCgoKICAgIGNvcHkoYWFiYikgewogICAgICB0aGlzLmxvd2VyQm91bmQuY29weShhYWJiLmxvd2VyQm91bmQpOwogICAgICB0aGlzLnVwcGVyQm91bmQuY29weShhYWJiLnVwcGVyQm91bmQpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8qKgogICAgICogQ2xvbmUgYW4gQUFCQgogICAgICovCgoKICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IEFBQkIoKS5jb3B5KHRoaXMpOwogICAgfQogICAgLyoqCiAgICAgKiBFeHRlbmQgdGhpcyBBQUJCIHNvIHRoYXQgaXQgY292ZXJzIHRoZSBnaXZlbiBBQUJCIHRvby4KICAgICAqLwoKCiAgICBleHRlbmQoYWFiYikgewogICAgICB0aGlzLmxvd2VyQm91bmQueCA9IE1hdGgubWluKHRoaXMubG93ZXJCb3VuZC54LCBhYWJiLmxvd2VyQm91bmQueCk7CiAgICAgIHRoaXMudXBwZXJCb3VuZC54ID0gTWF0aC5tYXgodGhpcy51cHBlckJvdW5kLngsIGFhYmIudXBwZXJCb3VuZC54KTsKICAgICAgdGhpcy5sb3dlckJvdW5kLnkgPSBNYXRoLm1pbih0aGlzLmxvd2VyQm91bmQueSwgYWFiYi5sb3dlckJvdW5kLnkpOwogICAgICB0aGlzLnVwcGVyQm91bmQueSA9IE1hdGgubWF4KHRoaXMudXBwZXJCb3VuZC55LCBhYWJiLnVwcGVyQm91bmQueSk7CiAgICAgIHRoaXMubG93ZXJCb3VuZC56ID0gTWF0aC5taW4odGhpcy5sb3dlckJvdW5kLnosIGFhYmIubG93ZXJCb3VuZC56KTsKICAgICAgdGhpcy51cHBlckJvdW5kLnogPSBNYXRoLm1heCh0aGlzLnVwcGVyQm91bmQueiwgYWFiYi51cHBlckJvdW5kLnopOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIEFBQkIgb3ZlcmxhcHMgdGhpcyBBQUJCLgogICAgICovCgoKICAgIG92ZXJsYXBzKGFhYmIpIHsKICAgICAgY29uc3QgbDEgPSB0aGlzLmxvd2VyQm91bmQ7CiAgICAgIGNvbnN0IHUxID0gdGhpcy51cHBlckJvdW5kOwogICAgICBjb25zdCBsMiA9IGFhYmIubG93ZXJCb3VuZDsKICAgICAgY29uc3QgdTIgPSBhYWJiLnVwcGVyQm91bmQ7IC8vICAgICAgbDIgICAgICAgIHUyCiAgICAgIC8vICAgICAgfC0tLS0tLS0tLXwKICAgICAgLy8gfC0tLS0tLS0tfAogICAgICAvLyBsMSAgICAgICB1MQoKICAgICAgY29uc3Qgb3ZlcmxhcHNYID0gbDIueCA8PSB1MS54ICYmIHUxLnggPD0gdTIueCB8fCBsMS54IDw9IHUyLnggJiYgdTIueCA8PSB1MS54OwogICAgICBjb25zdCBvdmVybGFwc1kgPSBsMi55IDw9IHUxLnkgJiYgdTEueSA8PSB1Mi55IHx8IGwxLnkgPD0gdTIueSAmJiB1Mi55IDw9IHUxLnk7CiAgICAgIGNvbnN0IG92ZXJsYXBzWiA9IGwyLnogPD0gdTEueiAmJiB1MS56IDw9IHUyLnogfHwgbDEueiA8PSB1Mi56ICYmIHUyLnogPD0gdTEuejsKICAgICAgcmV0dXJuIG92ZXJsYXBzWCAmJiBvdmVybGFwc1kgJiYgb3ZlcmxhcHNaOwogICAgfSAvLyBNb3N0bHkgZm9yIGRlYnVnZ2luZwoKCiAgICB2b2x1bWUoKSB7CiAgICAgIGNvbnN0IGwgPSB0aGlzLmxvd2VyQm91bmQ7CiAgICAgIGNvbnN0IHUgPSB0aGlzLnVwcGVyQm91bmQ7CiAgICAgIHJldHVybiAodS54IC0gbC54KSAqICh1LnkgLSBsLnkpICogKHUueiAtIGwueik7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gQUFCQiBpcyBmdWxseSBjb250YWluZWQgaW4gdGhpcyBBQUJCLgogICAgICovCgoKICAgIGNvbnRhaW5zKGFhYmIpIHsKICAgICAgY29uc3QgbDEgPSB0aGlzLmxvd2VyQm91bmQ7CiAgICAgIGNvbnN0IHUxID0gdGhpcy51cHBlckJvdW5kOwogICAgICBjb25zdCBsMiA9IGFhYmIubG93ZXJCb3VuZDsKICAgICAgY29uc3QgdTIgPSBhYWJiLnVwcGVyQm91bmQ7IC8vICAgICAgbDIgICAgICAgIHUyCiAgICAgIC8vICAgICAgfC0tLS0tLS0tLXwKICAgICAgLy8gfC0tLS0tLS0tLS0tLS0tLXwKICAgICAgLy8gbDEgICAgICAgICAgICAgIHUxCgogICAgICByZXR1cm4gbDEueCA8PSBsMi54ICYmIHUxLnggPj0gdTIueCAmJiBsMS55IDw9IGwyLnkgJiYgdTEueSA+PSB1Mi55ICYmIGwxLnogPD0gbDIueiAmJiB1MS56ID49IHUyLno7CiAgICB9CgogICAgZ2V0Q29ybmVycyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSB7CiAgICAgIGNvbnN0IGwgPSB0aGlzLmxvd2VyQm91bmQ7CiAgICAgIGNvbnN0IHUgPSB0aGlzLnVwcGVyQm91bmQ7CiAgICAgIGEuY29weShsKTsKICAgICAgYi5zZXQodS54LCBsLnksIGwueik7CiAgICAgIGMuc2V0KHUueCwgdS55LCBsLnopOwogICAgICBkLnNldChsLngsIHUueSwgdS56KTsKICAgICAgZS5zZXQodS54LCBsLnksIHUueik7CiAgICAgIGYuc2V0KGwueCwgdS55LCBsLnopOwogICAgICBnLnNldChsLngsIGwueSwgdS56KTsKICAgICAgaC5jb3B5KHUpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIEFBQkIgaW4gYW5vdGhlciBmcmFtZS4KICAgICAqIEByZXR1cm4gVGhlICJ0YXJnZXQiIEFBQkIgb2JqZWN0LgogICAgICovCgoKICAgIHRvTG9jYWxGcmFtZShmcmFtZSwgdGFyZ2V0KSB7CiAgICAgIGNvbnN0IGNvcm5lcnMgPSB0cmFuc2Zvcm1JbnRvRnJhbWVfY29ybmVyczsKICAgICAgY29uc3QgYSA9IGNvcm5lcnNbMF07CiAgICAgIGNvbnN0IGIgPSBjb3JuZXJzWzFdOwogICAgICBjb25zdCBjID0gY29ybmVyc1syXTsKICAgICAgY29uc3QgZCA9IGNvcm5lcnNbM107CiAgICAgIGNvbnN0IGUgPSBjb3JuZXJzWzRdOwogICAgICBjb25zdCBmID0gY29ybmVyc1s1XTsKICAgICAgY29uc3QgZyA9IGNvcm5lcnNbNl07CiAgICAgIGNvbnN0IGggPSBjb3JuZXJzWzddOyAvLyBHZXQgY29ybmVycyBpbiBjdXJyZW50IGZyYW1lCgogICAgICB0aGlzLmdldENvcm5lcnMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCk7IC8vIFRyYW5zZm9ybSB0aGVtIHRvIG5ldyBsb2NhbCBmcmFtZQoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IDg7IGkrKykgewogICAgICAgIGNvbnN0IGNvcm5lciA9IGNvcm5lcnNbaV07CiAgICAgICAgZnJhbWUucG9pbnRUb0xvY2FsKGNvcm5lciwgY29ybmVyKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRhcmdldC5zZXRGcm9tUG9pbnRzKGNvcm5lcnMpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIEFBQkIgaW4gdGhlIGdsb2JhbCBmcmFtZS4KICAgICAqIEByZXR1cm4gVGhlICJ0YXJnZXQiIEFBQkIgb2JqZWN0LgogICAgICovCgoKICAgIHRvV29ybGRGcmFtZShmcmFtZSwgdGFyZ2V0KSB7CiAgICAgIGNvbnN0IGNvcm5lcnMgPSB0cmFuc2Zvcm1JbnRvRnJhbWVfY29ybmVyczsKICAgICAgY29uc3QgYSA9IGNvcm5lcnNbMF07CiAgICAgIGNvbnN0IGIgPSBjb3JuZXJzWzFdOwogICAgICBjb25zdCBjID0gY29ybmVyc1syXTsKICAgICAgY29uc3QgZCA9IGNvcm5lcnNbM107CiAgICAgIGNvbnN0IGUgPSBjb3JuZXJzWzRdOwogICAgICBjb25zdCBmID0gY29ybmVyc1s1XTsKICAgICAgY29uc3QgZyA9IGNvcm5lcnNbNl07CiAgICAgIGNvbnN0IGggPSBjb3JuZXJzWzddOyAvLyBHZXQgY29ybmVycyBpbiBjdXJyZW50IGZyYW1lCgogICAgICB0aGlzLmdldENvcm5lcnMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCk7IC8vIFRyYW5zZm9ybSB0aGVtIHRvIG5ldyBsb2NhbCBmcmFtZQoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IDg7IGkrKykgewogICAgICAgIGNvbnN0IGNvcm5lciA9IGNvcm5lcnNbaV07CiAgICAgICAgZnJhbWUucG9pbnRUb1dvcmxkKGNvcm5lciwgY29ybmVyKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRhcmdldC5zZXRGcm9tUG9pbnRzKGNvcm5lcnMpOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGUgQUFCQiBpcyBoaXQgYnkgYSByYXkuCiAgICAgKi8KCgogICAgb3ZlcmxhcHNSYXkocmF5KSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBkaXJlY3Rpb24sCiAgICAgICAgZnJvbQogICAgICB9ID0gcmF5OyAvLyBjb25zdCB0ID0gMAogICAgICAvLyByYXkuZGlyZWN0aW9uIGlzIHVuaXQgZGlyZWN0aW9uIHZlY3RvciBvZiByYXkKCiAgICAgIGNvbnN0IGRpckZyYWNYID0gMSAvIGRpcmVjdGlvbi54OwogICAgICBjb25zdCBkaXJGcmFjWSA9IDEgLyBkaXJlY3Rpb24ueTsKICAgICAgY29uc3QgZGlyRnJhY1ogPSAxIC8gZGlyZWN0aW9uLno7IC8vIHRoaXMubG93ZXJCb3VuZCBpcyB0aGUgY29ybmVyIG9mIEFBQkIgd2l0aCBtaW5pbWFsIGNvb3JkaW5hdGVzIC0gbGVmdCBib3R0b20sIHJ0IGlzIG1heGltYWwgY29ybmVyCgogICAgICBjb25zdCB0MSA9ICh0aGlzLmxvd2VyQm91bmQueCAtIGZyb20ueCkgKiBkaXJGcmFjWDsKICAgICAgY29uc3QgdDIgPSAodGhpcy51cHBlckJvdW5kLnggLSBmcm9tLngpICogZGlyRnJhY1g7CiAgICAgIGNvbnN0IHQzID0gKHRoaXMubG93ZXJCb3VuZC55IC0gZnJvbS55KSAqIGRpckZyYWNZOwogICAgICBjb25zdCB0NCA9ICh0aGlzLnVwcGVyQm91bmQueSAtIGZyb20ueSkgKiBkaXJGcmFjWTsKICAgICAgY29uc3QgdDUgPSAodGhpcy5sb3dlckJvdW5kLnogLSBmcm9tLnopICogZGlyRnJhY1o7CiAgICAgIGNvbnN0IHQ2ID0gKHRoaXMudXBwZXJCb3VuZC56IC0gZnJvbS56KSAqIGRpckZyYWNaOyAvLyBjb25zdCB0bWluID0gTWF0aC5tYXgoTWF0aC5tYXgoTWF0aC5taW4odDEsIHQyKSwgTWF0aC5taW4odDMsIHQ0KSkpOwogICAgICAvLyBjb25zdCB0bWF4ID0gTWF0aC5taW4oTWF0aC5taW4oTWF0aC5tYXgodDEsIHQyKSwgTWF0aC5tYXgodDMsIHQ0KSkpOwoKICAgICAgY29uc3QgdG1pbiA9IE1hdGgubWF4KE1hdGgubWF4KE1hdGgubWluKHQxLCB0MiksIE1hdGgubWluKHQzLCB0NCkpLCBNYXRoLm1pbih0NSwgdDYpKTsKICAgICAgY29uc3QgdG1heCA9IE1hdGgubWluKE1hdGgubWluKE1hdGgubWF4KHQxLCB0MiksIE1hdGgubWF4KHQzLCB0NCkpLCBNYXRoLm1heCh0NSwgdDYpKTsgLy8gaWYgdG1heCA8IDAsIHJheSAobGluZSkgaXMgaW50ZXJzZWN0aW5nIEFBQkIsIGJ1dCB3aG9sZSBBQUJCIGlzIGJlaGluZyB1cwoKICAgICAgaWYgKHRtYXggPCAwKSB7CiAgICAgICAgLy90ID0gdG1heDsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gLy8gaWYgdG1pbiA+IHRtYXgsIHJheSBkb2Vzbid0IGludGVyc2VjdCBBQUJCCgoKICAgICAgaWYgKHRtaW4gPiB0bWF4KSB7CiAgICAgICAgLy90ID0gdG1heDsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICB9CiAgY29uc3QgdG1wJDEgPSBuZXcgVmVjMygpOwogIGNvbnN0IHRyYW5zZm9ybUludG9GcmFtZV9jb3JuZXJzID0gW25ldyBWZWMzKCksIG5ldyBWZWMzKCksIG5ldyBWZWMzKCksIG5ldyBWZWMzKCksIG5ldyBWZWMzKCksIG5ldyBWZWMzKCksIG5ldyBWZWMzKCksIG5ldyBWZWMzKCldOwoKICAvKioKICAgKiBDb2xsaXNpb24gIm1hdHJpeCIuCiAgICogSXQncyBhY3R1YWxseSBhIHRyaWFuZ3VsYXItc2hhcGVkIGFycmF5IG9mIHdoZXRoZXIgdHdvIGJvZGllcyBhcmUgdG91Y2hpbmcgdGhpcyBzdGVwLCBmb3IgcmVmZXJlbmNlIG5leHQgc3RlcAogICAqLwogIGNsYXNzIEFycmF5Q29sbGlzaW9uTWF0cml4IHsKICAgIC8qKgogICAgICogVGhlIG1hdHJpeCBzdG9yYWdlLgogICAgICovCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy5tYXRyaXggPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGFuIGVsZW1lbnQKICAgICAqLwoKCiAgICBnZXQoYmksIGJqKSB7CiAgICAgIGxldCB7CiAgICAgICAgaW5kZXg6IGkKICAgICAgfSA9IGJpOwogICAgICBsZXQgewogICAgICAgIGluZGV4OiBqCiAgICAgIH0gPSBiajsKCiAgICAgIGlmIChqID4gaSkgewogICAgICAgIGNvbnN0IHRlbXAgPSBqOwogICAgICAgIGogPSBpOwogICAgICAgIGkgPSB0ZW1wOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5tYXRyaXhbKGkgKiAoaSArIDEpID4+IDEpICsgaiAtIDFdOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgYW4gZWxlbWVudAogICAgICovCgoKICAgIHNldChiaSwgYmosIHZhbHVlKSB7CiAgICAgIGxldCB7CiAgICAgICAgaW5kZXg6IGkKICAgICAgfSA9IGJpOwogICAgICBsZXQgewogICAgICAgIGluZGV4OiBqCiAgICAgIH0gPSBiajsKCiAgICAgIGlmIChqID4gaSkgewogICAgICAgIGNvbnN0IHRlbXAgPSBqOwogICAgICAgIGogPSBpOwogICAgICAgIGkgPSB0ZW1wOwogICAgICB9CgogICAgICB0aGlzLm1hdHJpeFsoaSAqIChpICsgMSkgPj4gMSkgKyBqIC0gMV0gPSB2YWx1ZSA/IDEgOiAwOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIGFsbCBlbGVtZW50cyB0byB6ZXJvCiAgICAgKi8KCgogICAgcmVzZXQoKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5tYXRyaXgubGVuZ3RoOyBpICE9PSBsOyBpKyspIHsKICAgICAgICB0aGlzLm1hdHJpeFtpXSA9IDA7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbWF4IG51bWJlciBvZiBvYmplY3RzCiAgICAgKi8KCgogICAgc2V0TnVtT2JqZWN0cyhuKSB7CiAgICAgIHRoaXMubWF0cml4Lmxlbmd0aCA9IG4gKiAobiAtIDEpID4+IDE7CiAgICB9CgogIH0KCiAgLyoqCiAgICogQmFzZSBjbGFzcyBmb3Igb2JqZWN0cyB0aGF0IGRpc3BhdGNoZXMgZXZlbnRzLgogICAqLwogIGNsYXNzIEV2ZW50VGFyZ2V0IHsKICAgIC8qKgogICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyCiAgICAgKiBAcmV0dXJuIFRoZSBzZWxmIG9iamVjdCwgZm9yIGNoYWluYWJpbGl0eS4KICAgICAqLwogICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICBpZiAodGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTsKICAgICAgfQoKICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOwoKICAgICAgaWYgKGxpc3RlbmVyc1t0eXBlXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbGlzdGVuZXJzW3R5cGVdID0gW107CiAgICAgIH0KCiAgICAgIGlmICghbGlzdGVuZXJzW3R5cGVdLmluY2x1ZGVzKGxpc3RlbmVyKSkgewogICAgICAgIGxpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIGFuIGV2ZW50IGxpc3RlbmVyIGlzIGFkZGVkCiAgICAgKi8KCgogICAgaGFzRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICBpZiAodGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyczsKCiAgICAgIGlmIChsaXN0ZW5lcnNbdHlwZV0gIT09IHVuZGVmaW5lZCAmJiBsaXN0ZW5lcnNbdHlwZV0uaW5jbHVkZXMobGlzdGVuZXIpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2sgaWYgYW55IGV2ZW50IGxpc3RlbmVyIG9mIHRoZSBnaXZlbiB0eXBlIGlzIGFkZGVkCiAgICAgKi8KCgogICAgaGFzQW55RXZlbnRMaXN0ZW5lcih0eXBlKSB7CiAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOwogICAgICByZXR1cm4gbGlzdGVuZXJzW3R5cGVdICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lcgogICAgICogQHJldHVybiBUaGUgc2VsZiBvYmplY3QsIGZvciBjaGFpbmFiaWxpdHkuCiAgICAgKi8KCgogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICBpZiAodGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQoKICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOwoKICAgICAgaWYgKGxpc3RlbmVyc1t0eXBlXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KCiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzW3R5cGVdLmluZGV4T2YobGlzdGVuZXIpOwoKICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgIGxpc3RlbmVyc1t0eXBlXS5zcGxpY2UoaW5kZXgsIDEpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8qKgogICAgICogRW1pdCBhbiBldmVudC4KICAgICAqIEByZXR1cm4gVGhlIHNlbGYgb2JqZWN0LCBmb3IgY2hhaW5hYmlsaXR5LgogICAgICovCgoKICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHsKICAgICAgaWYgKHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KCiAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyczsKICAgICAgY29uc3QgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1tldmVudC50eXBlXTsKCiAgICAgIGlmIChsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBldmVudC50YXJnZXQgPSB0aGlzOwoKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGxpc3RlbmVyQXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICBsaXN0ZW5lckFycmF5W2ldLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogIH0KCiAgLyoqCiAgICogQSBRdWF0ZXJuaW9uIGRlc2NyaWJlcyBhIHJvdGF0aW9uIGluIDNEIHNwYWNlLiBUaGUgUXVhdGVybmlvbiBpcyBtYXRoZW1hdGljYWxseSBkZWZpbmVkIGFzIFEgPSB4KmkgKyB5KmogKyB6KmsgKyB3LCB3aGVyZSAoaSxqLGspIGFyZSBpbWFnaW5hcnkgYmFzaXMgdmVjdG9ycy4gKHgseSx6KSBjYW4gYmUgc2VlbiBhcyBhIHZlY3RvciByZWxhdGVkIHRvIHRoZSBheGlzIG9mIHJvdGF0aW9uLCB3aGlsZSB0aGUgcmVhbCBtdWx0aXBsaWVyLCB3LCBpcyByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2Ygcm90YXRpb24uCiAgICogQHBhcmFtIHggTXVsdGlwbGllciBvZiB0aGUgaW1hZ2luYXJ5IGJhc2lzIHZlY3RvciBpLgogICAqIEBwYXJhbSB5IE11bHRpcGxpZXIgb2YgdGhlIGltYWdpbmFyeSBiYXNpcyB2ZWN0b3Igai4KICAgKiBAcGFyYW0geiBNdWx0aXBsaWVyIG9mIHRoZSBpbWFnaW5hcnkgYmFzaXMgdmVjdG9yIGsuCiAgICogQHBhcmFtIHcgTXVsdGlwbGllciBvZiB0aGUgcmVhbCBwYXJ0LgogICAqIEBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9RdWF0ZXJuaW9uCiAgICovCgogIGNsYXNzIFF1YXRlcm5pb24gewogICAgY29uc3RydWN0b3IoeCwgeSwgeiwgdykgewogICAgICBpZiAoeCA9PT0gdm9pZCAwKSB7CiAgICAgICAgeCA9IDA7CiAgICAgIH0KCiAgICAgIGlmICh5ID09PSB2b2lkIDApIHsKICAgICAgICB5ID0gMDsKICAgICAgfQoKICAgICAgaWYgKHogPT09IHZvaWQgMCkgewogICAgICAgIHogPSAwOwogICAgICB9CgogICAgICBpZiAodyA9PT0gdm9pZCAwKSB7CiAgICAgICAgdyA9IDE7CiAgICAgIH0KCiAgICAgIHRoaXMueCA9IHg7CiAgICAgIHRoaXMueSA9IHk7CiAgICAgIHRoaXMueiA9IHo7CiAgICAgIHRoaXMudyA9IHc7CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHF1YXRlcm5pb24uCiAgICAgKi8KCgogICAgc2V0KHgsIHksIHosIHcpIHsKICAgICAgdGhpcy54ID0geDsKICAgICAgdGhpcy55ID0geTsKICAgICAgdGhpcy56ID0gejsKICAgICAgdGhpcy53ID0gdzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnQgdG8gYSByZWFkYWJsZSBmb3JtYXQKICAgICAqIEByZXR1cm4gIngseSx6LHciCiAgICAgKi8KCgogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiBgJHt0aGlzLnh9LCR7dGhpcy55fSwke3RoaXMuen0sJHt0aGlzLnd9YDsKICAgIH0KICAgIC8qKgogICAgICogQ29udmVydCB0byBhbiBBcnJheQogICAgICogQHJldHVybiBbeCwgeSwgeiwgd10KICAgICAqLwoKCiAgICB0b0FycmF5KCkgewogICAgICByZXR1cm4gW3RoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMud107CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgcXVhdGVybmlvbiBjb21wb25lbnRzIGdpdmVuIGFuIGF4aXMgYW5kIGFuIGFuZ2xlIGluIHJhZGlhbnMuCiAgICAgKi8KCgogICAgc2V0RnJvbUF4aXNBbmdsZSh2ZWN0b3IsIGFuZ2xlKSB7CiAgICAgIGNvbnN0IHMgPSBNYXRoLnNpbihhbmdsZSAqIDAuNSk7CiAgICAgIHRoaXMueCA9IHZlY3Rvci54ICogczsKICAgICAgdGhpcy55ID0gdmVjdG9yLnkgKiBzOwogICAgICB0aGlzLnogPSB2ZWN0b3IueiAqIHM7CiAgICAgIHRoaXMudyA9IE1hdGguY29zKGFuZ2xlICogMC41KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnRzIHRoZSBxdWF0ZXJuaW9uIHRvIFsgYXhpcywgYW5nbGUgXSByZXByZXNlbnRhdGlvbi4KICAgICAqIEBwYXJhbSB0YXJnZXRBeGlzIEEgdmVjdG9yIG9iamVjdCB0byByZXVzZSBmb3Igc3RvcmluZyB0aGUgYXhpcy4KICAgICAqIEByZXR1cm4gQW4gYXJyYXksIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGF4aXMgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMuCiAgICAgKi8KCgogICAgdG9BeGlzQW5nbGUodGFyZ2V0QXhpcykgewogICAgICBpZiAodGFyZ2V0QXhpcyA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0QXhpcyA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIHRoaXMubm9ybWFsaXplKCk7IC8vIGlmIHc+MSBhY29zIGFuZCBzcXJ0IHdpbGwgcHJvZHVjZSBlcnJvcnMsIHRoaXMgY2FudCBoYXBwZW4gaWYgcXVhdGVybmlvbiBpcyBub3JtYWxpc2VkCgogICAgICBjb25zdCBhbmdsZSA9IDIgKiBNYXRoLmFjb3ModGhpcy53KTsKICAgICAgY29uc3QgcyA9IE1hdGguc3FydCgxIC0gdGhpcy53ICogdGhpcy53KTsgLy8gYXNzdW1pbmcgcXVhdGVybmlvbiBub3JtYWxpc2VkIHRoZW4gdyBpcyBsZXNzIHRoYW4gMSwgc28gdGVybSBhbHdheXMgcG9zaXRpdmUuCgogICAgICBpZiAocyA8IDAuMDAxKSB7CiAgICAgICAgLy8gdGVzdCB0byBhdm9pZCBkaXZpZGUgYnkgemVybywgcyBpcyBhbHdheXMgcG9zaXRpdmUgZHVlIHRvIHNxcnQKICAgICAgICAvLyBpZiBzIGNsb3NlIHRvIHplcm8gdGhlbiBkaXJlY3Rpb24gb2YgYXhpcyBub3QgaW1wb3J0YW50CiAgICAgICAgdGFyZ2V0QXhpcy54ID0gdGhpcy54OyAvLyBpZiBpdCBpcyBpbXBvcnRhbnQgdGhhdCBheGlzIGlzIG5vcm1hbGlzZWQgdGhlbiByZXBsYWNlIHdpdGggeD0xOyB5PXo9MDsKCiAgICAgICAgdGFyZ2V0QXhpcy55ID0gdGhpcy55OwogICAgICAgIHRhcmdldEF4aXMueiA9IHRoaXMuejsKICAgICAgfSBlbHNlIHsKICAgICAgICB0YXJnZXRBeGlzLnggPSB0aGlzLnggLyBzOyAvLyBub3JtYWxpc2UgYXhpcwoKICAgICAgICB0YXJnZXRBeGlzLnkgPSB0aGlzLnkgLyBzOwogICAgICAgIHRhcmdldEF4aXMueiA9IHRoaXMueiAvIHM7CiAgICAgIH0KCiAgICAgIHJldHVybiBbdGFyZ2V0QXhpcywgYW5nbGVdOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHF1YXRlcm5pb24gdmFsdWUgZ2l2ZW4gdHdvIHZlY3RvcnMuIFRoZSByZXN1bHRpbmcgcm90YXRpb24gd2lsbCBiZSB0aGUgbmVlZGVkIHJvdGF0aW9uIHRvIHJvdGF0ZSB1IHRvIHYuCiAgICAgKi8KCgogICAgc2V0RnJvbVZlY3RvcnModSwgdikgewogICAgICBpZiAodS5pc0FudGlwYXJhbGxlbFRvKHYpKSB7CiAgICAgICAgY29uc3QgdDEgPSBzZnZfdDE7CiAgICAgICAgY29uc3QgdDIgPSBzZnZfdDI7CiAgICAgICAgdS50YW5nZW50cyh0MSwgdDIpOwogICAgICAgIHRoaXMuc2V0RnJvbUF4aXNBbmdsZSh0MSwgTWF0aC5QSSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYSA9IHUuY3Jvc3Modik7CiAgICAgICAgdGhpcy54ID0gYS54OwogICAgICAgIHRoaXMueSA9IGEueTsKICAgICAgICB0aGlzLnogPSBhLno7CiAgICAgICAgdGhpcy53ID0gTWF0aC5zcXJ0KHUubGVuZ3RoKCkgKiogMiAqIHYubGVuZ3RoKCkgKiogMikgKyB1LmRvdCh2KTsKICAgICAgICB0aGlzLm5vcm1hbGl6ZSgpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8qKgogICAgICogTXVsdGlwbHkgdGhlIHF1YXRlcm5pb24gd2l0aCBhbiBvdGhlciBxdWF0ZXJuaW9uLgogICAgICovCgoKICAgIG11bHQocXVhdCwgdGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRhcmdldCA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IGF4ID0gdGhpcy54OwogICAgICBjb25zdCBheSA9IHRoaXMueTsKICAgICAgY29uc3QgYXogPSB0aGlzLno7CiAgICAgIGNvbnN0IGF3ID0gdGhpcy53OwogICAgICBjb25zdCBieCA9IHF1YXQueDsKICAgICAgY29uc3QgYnkgPSBxdWF0Lnk7CiAgICAgIGNvbnN0IGJ6ID0gcXVhdC56OwogICAgICBjb25zdCBidyA9IHF1YXQudzsKICAgICAgdGFyZ2V0LnggPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5OwogICAgICB0YXJnZXQueSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7CiAgICAgIHRhcmdldC56ID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDsKICAgICAgdGFyZ2V0LncgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6OwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGludmVyc2UgcXVhdGVybmlvbiByb3RhdGlvbi4KICAgICAqLwoKCiAgICBpbnZlcnNlKHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpOwogICAgICB9CgogICAgICBjb25zdCB4ID0gdGhpcy54OwogICAgICBjb25zdCB5ID0gdGhpcy55OwogICAgICBjb25zdCB6ID0gdGhpcy56OwogICAgICBjb25zdCB3ID0gdGhpcy53OwogICAgICB0aGlzLmNvbmp1Z2F0ZSh0YXJnZXQpOwogICAgICBjb25zdCBpbm9ybTIgPSAxIC8gKHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3KTsKICAgICAgdGFyZ2V0LnggKj0gaW5vcm0yOwogICAgICB0YXJnZXQueSAqPSBpbm9ybTI7CiAgICAgIHRhcmdldC56ICo9IGlub3JtMjsKICAgICAgdGFyZ2V0LncgKj0gaW5vcm0yOwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHF1YXRlcm5pb24gY29uanVnYXRlCiAgICAgKi8KCgogICAgY29uanVnYXRlKHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpOwogICAgICB9CgogICAgICB0YXJnZXQueCA9IC10aGlzLng7CiAgICAgIHRhcmdldC55ID0gLXRoaXMueTsKICAgICAgdGFyZ2V0LnogPSAtdGhpcy56OwogICAgICB0YXJnZXQudyA9IHRoaXMudzsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplIHRoZSBxdWF0ZXJuaW9uLiBOb3RlIHRoYXQgdGhpcyBjaGFuZ2VzIHRoZSB2YWx1ZXMgb2YgdGhlIHF1YXRlcm5pb24uCiAgICAgKi8KCgogICAgbm9ybWFsaXplKCkgewogICAgICBsZXQgbCA9IE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncpOwoKICAgICAgaWYgKGwgPT09IDApIHsKICAgICAgICB0aGlzLnggPSAwOwogICAgICAgIHRoaXMueSA9IDA7CiAgICAgICAgdGhpcy56ID0gMDsKICAgICAgICB0aGlzLncgPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIGwgPSAxIC8gbDsKICAgICAgICB0aGlzLnggKj0gbDsKICAgICAgICB0aGlzLnkgKj0gbDsKICAgICAgICB0aGlzLnogKj0gbDsKICAgICAgICB0aGlzLncgKj0gbDsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIEFwcHJveGltYXRpb24gb2YgcXVhdGVybmlvbiBub3JtYWxpemF0aW9uLiBXb3JrcyBiZXN0IHdoZW4gcXVhdCBpcyBhbHJlYWR5IGFsbW9zdC1ub3JtYWxpemVkLgogICAgICogQGF1dGhvciB1bnBoYXNlZCwgaHR0cHM6Ly9naXRodWIuY29tL3VucGhhc2VkCiAgICAgKi8KCgogICAgbm9ybWFsaXplRmFzdCgpIHsKICAgICAgY29uc3QgZiA9ICgzLjAgLSAodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53KSkgLyAyLjA7CgogICAgICBpZiAoZiA9PT0gMCkgewogICAgICAgIHRoaXMueCA9IDA7CiAgICAgICAgdGhpcy55ID0gMDsKICAgICAgICB0aGlzLnogPSAwOwogICAgICAgIHRoaXMudyA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy54ICo9IGY7CiAgICAgICAgdGhpcy55ICo9IGY7CiAgICAgICAgdGhpcy56ICo9IGY7CiAgICAgICAgdGhpcy53ICo9IGY7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgLyoqCiAgICAgKiBNdWx0aXBseSB0aGUgcXVhdGVybmlvbiBieSBhIHZlY3RvcgogICAgICovCgoKICAgIHZtdWx0KHYsIHRhcmdldCkgewogICAgICBpZiAodGFyZ2V0ID09PSB2b2lkIDApIHsKICAgICAgICB0YXJnZXQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICBjb25zdCB4ID0gdi54OwogICAgICBjb25zdCB5ID0gdi55OwogICAgICBjb25zdCB6ID0gdi56OwogICAgICBjb25zdCBxeCA9IHRoaXMueDsKICAgICAgY29uc3QgcXkgPSB0aGlzLnk7CiAgICAgIGNvbnN0IHF6ID0gdGhpcy56OwogICAgICBjb25zdCBxdyA9IHRoaXMudzsgLy8gcSp2CgogICAgICBjb25zdCBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTsKICAgICAgY29uc3QgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7CiAgICAgIGNvbnN0IGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4OwogICAgICBjb25zdCBpdyA9IC1xeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7CiAgICAgIHRhcmdldC54ID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTsKICAgICAgdGFyZ2V0LnkgPSBpeSAqIHF3ICsgaXcgKiAtcXkgKyBpeiAqIC1xeCAtIGl4ICogLXF6OwogICAgICB0YXJnZXQueiA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICAvKioKICAgICAqIENvcGllcyB2YWx1ZSBvZiBzb3VyY2UgdG8gdGhpcyBxdWF0ZXJuaW9uLgogICAgICogQHJldHVybiB0aGlzCiAgICAgKi8KCgogICAgY29weShxdWF0KSB7CiAgICAgIHRoaXMueCA9IHF1YXQueDsKICAgICAgdGhpcy55ID0gcXVhdC55OwogICAgICB0aGlzLnogPSBxdWF0Lno7CiAgICAgIHRoaXMudyA9IHF1YXQudzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnQgdGhlIHF1YXRlcm5pb24gdG8gZXVsZXIgYW5nbGUgcmVwcmVzZW50YXRpb24uIE9yZGVyOiBZWlgsIGFzIHRoaXMgcGFnZSBkZXNjcmliZXM6IGh0dHBzOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9zdGFuZGFyZHMvaW5kZXguaHRtCiAgICAgKiBAcGFyYW0gb3JkZXIgVGhyZWUtY2hhcmFjdGVyIHN0cmluZywgZGVmYXVsdHMgdG8gIllaWCIKICAgICAqLwoKCiAgICB0b0V1bGVyKHRhcmdldCwgb3JkZXIpIHsKICAgICAgaWYgKG9yZGVyID09PSB2b2lkIDApIHsKICAgICAgICBvcmRlciA9ICdZWlgnOwogICAgICB9CgogICAgICBsZXQgaGVhZGluZzsKICAgICAgbGV0IGF0dGl0dWRlOwogICAgICBsZXQgYmFuazsKICAgICAgY29uc3QgeCA9IHRoaXMueDsKICAgICAgY29uc3QgeSA9IHRoaXMueTsKICAgICAgY29uc3QgeiA9IHRoaXMuejsKICAgICAgY29uc3QgdyA9IHRoaXMudzsKCiAgICAgIHN3aXRjaCAob3JkZXIpIHsKICAgICAgICBjYXNlICdZWlgnOgogICAgICAgICAgY29uc3QgdGVzdCA9IHggKiB5ICsgeiAqIHc7CgogICAgICAgICAgaWYgKHRlc3QgPiAwLjQ5OSkgewogICAgICAgICAgICAvLyBzaW5ndWxhcml0eSBhdCBub3J0aCBwb2xlCiAgICAgICAgICAgIGhlYWRpbmcgPSAyICogTWF0aC5hdGFuMih4LCB3KTsKICAgICAgICAgICAgYXR0aXR1ZGUgPSBNYXRoLlBJIC8gMjsKICAgICAgICAgICAgYmFuayA9IDA7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRlc3QgPCAtMC40OTkpIHsKICAgICAgICAgICAgLy8gc2luZ3VsYXJpdHkgYXQgc291dGggcG9sZQogICAgICAgICAgICBoZWFkaW5nID0gLTIgKiBNYXRoLmF0YW4yKHgsIHcpOwogICAgICAgICAgICBhdHRpdHVkZSA9IC1NYXRoLlBJIC8gMjsKICAgICAgICAgICAgYmFuayA9IDA7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGhlYWRpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb25zdCBzcXggPSB4ICogeDsKICAgICAgICAgICAgY29uc3Qgc3F5ID0geSAqIHk7CiAgICAgICAgICAgIGNvbnN0IHNxeiA9IHogKiB6OwogICAgICAgICAgICBoZWFkaW5nID0gTWF0aC5hdGFuMigyICogeSAqIHcgLSAyICogeCAqIHosIDEgLSAyICogc3F5IC0gMiAqIHNxeik7IC8vIEhlYWRpbmcKCiAgICAgICAgICAgIGF0dGl0dWRlID0gTWF0aC5hc2luKDIgKiB0ZXN0KTsgLy8gYXR0aXR1ZGUKCiAgICAgICAgICAgIGJhbmsgPSBNYXRoLmF0YW4yKDIgKiB4ICogdyAtIDIgKiB5ICogeiwgMSAtIDIgKiBzcXggLSAyICogc3F6KTsgLy8gYmFuawogICAgICAgICAgfQoKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdWxlciBvcmRlciAke29yZGVyfSBub3Qgc3VwcG9ydGVkIHlldC5gKTsKICAgICAgfQoKICAgICAgdGFyZ2V0LnkgPSBoZWFkaW5nOwogICAgICB0YXJnZXQueiA9IGF0dGl0dWRlOwogICAgICB0YXJnZXQueCA9IGJhbms7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSBvcmRlciBUaGUgb3JkZXIgdG8gYXBwbHkgYW5nbGVzOiAnWFlaJyBvciAnWVhaJyBvciBhbnkgb3RoZXIgY29tYmluYXRpb24uCiAgICAgKgogICAgICogU2VlIHtAbGluayBodHRwczovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlLzIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5nbGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzIE1hdGhXb3Jrc30gcmVmZXJlbmNlCiAgICAgKi8KCgogICAgc2V0RnJvbUV1bGVyKHgsIHksIHosIG9yZGVyKSB7CiAgICAgIGlmIChvcmRlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgb3JkZXIgPSAnWFlaJzsKICAgICAgfQoKICAgICAgY29uc3QgYzEgPSBNYXRoLmNvcyh4IC8gMik7CiAgICAgIGNvbnN0IGMyID0gTWF0aC5jb3MoeSAvIDIpOwogICAgICBjb25zdCBjMyA9IE1hdGguY29zKHogLyAyKTsKICAgICAgY29uc3QgczEgPSBNYXRoLnNpbih4IC8gMik7CiAgICAgIGNvbnN0IHMyID0gTWF0aC5zaW4oeSAvIDIpOwogICAgICBjb25zdCBzMyA9IE1hdGguc2luKHogLyAyKTsKCiAgICAgIGlmIChvcmRlciA9PT0gJ1hZWicpIHsKICAgICAgICB0aGlzLnggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7CiAgICAgICAgdGhpcy55ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOwogICAgICAgIHRoaXMueiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMzsKICAgICAgICB0aGlzLncgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7CiAgICAgIH0gZWxzZSBpZiAob3JkZXIgPT09ICdZWFonKSB7CiAgICAgICAgdGhpcy54ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzOwogICAgICAgIHRoaXMueSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMzsKICAgICAgICB0aGlzLnogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CiAgICAgICAgdGhpcy53ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzOwogICAgICB9IGVsc2UgaWYgKG9yZGVyID09PSAnWlhZJykgewogICAgICAgIHRoaXMueCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMzsKICAgICAgICB0aGlzLnkgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7CiAgICAgICAgdGhpcy56ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzOwogICAgICAgIHRoaXMudyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMzsKICAgICAgfSBlbHNlIGlmIChvcmRlciA9PT0gJ1pZWCcpIHsKICAgICAgICB0aGlzLnggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7CiAgICAgICAgdGhpcy55ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzOwogICAgICAgIHRoaXMueiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMzsKICAgICAgICB0aGlzLncgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7CiAgICAgIH0gZWxzZSBpZiAob3JkZXIgPT09ICdZWlgnKSB7CiAgICAgICAgdGhpcy54ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzOwogICAgICAgIHRoaXMueSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMzsKICAgICAgICB0aGlzLnogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CiAgICAgICAgdGhpcy53ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzOwogICAgICB9IGVsc2UgaWYgKG9yZGVyID09PSAnWFpZJykgewogICAgICAgIHRoaXMueCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMzsKICAgICAgICB0aGlzLnkgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7CiAgICAgICAgdGhpcy56ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzOwogICAgICAgIHRoaXMudyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMzsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgY2xvbmUoKSB7CiAgICAgIHJldHVybiBuZXcgUXVhdGVybmlvbih0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLncpOwogICAgfQogICAgLyoqCiAgICAgKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0CiAgICAgKgogICAgICogQHBhcmFtIHRvUXVhdCBzZWNvbmQgb3BlcmFuZAogICAgICogQHBhcmFtIHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgc2VsZiBxdWF0ZXJuaW9uIGFuZCB0b1F1YXQKICAgICAqIEBwYXJhbSB0YXJnZXQgQSBxdWF0ZXJuaW9uIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uIElmIG5vdCBwcm92aWRlZCwgYSBuZXcgb25lIHdpbGwgYmUgY3JlYXRlZC4KICAgICAqIEByZXR1cm5zIHtRdWF0ZXJuaW9ufSBUaGUgInRhcmdldCIgb2JqZWN0CiAgICAgKi8KCgogICAgc2xlcnAodG9RdWF0LCB0LCB0YXJnZXQpIHsKICAgICAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKTsKICAgICAgfQoKICAgICAgY29uc3QgYXggPSB0aGlzLng7CiAgICAgIGNvbnN0IGF5ID0gdGhpcy55OwogICAgICBjb25zdCBheiA9IHRoaXMuejsKICAgICAgY29uc3QgYXcgPSB0aGlzLnc7CiAgICAgIGxldCBieCA9IHRvUXVhdC54OwogICAgICBsZXQgYnkgPSB0b1F1YXQueTsKICAgICAgbGV0IGJ6ID0gdG9RdWF0Lno7CiAgICAgIGxldCBidyA9IHRvUXVhdC53OwogICAgICBsZXQgb21lZ2E7CiAgICAgIGxldCBjb3NvbTsKICAgICAgbGV0IHNpbm9tOwogICAgICBsZXQgc2NhbGUwOwogICAgICBsZXQgc2NhbGUxOyAvLyBjYWxjIGNvc2luZQoKICAgICAgY29zb20gPSBheCAqIGJ4ICsgYXkgKiBieSArIGF6ICogYnogKyBhdyAqIGJ3OyAvLyBhZGp1c3Qgc2lnbnMgKGlmIG5lY2Vzc2FyeSkKCiAgICAgIGlmIChjb3NvbSA8IDAuMCkgewogICAgICAgIGNvc29tID0gLWNvc29tOwogICAgICAgIGJ4ID0gLWJ4OwogICAgICAgIGJ5ID0gLWJ5OwogICAgICAgIGJ6ID0gLWJ6OwogICAgICAgIGJ3ID0gLWJ3OwogICAgICB9IC8vIGNhbGN1bGF0ZSBjb2VmZmljaWVudHMKCgogICAgICBpZiAoMS4wIC0gY29zb20gPiAwLjAwMDAwMSkgewogICAgICAgIC8vIHN0YW5kYXJkIGNhc2UgKHNsZXJwKQogICAgICAgIG9tZWdhID0gTWF0aC5hY29zKGNvc29tKTsKICAgICAgICBzaW5vbSA9IE1hdGguc2luKG9tZWdhKTsKICAgICAgICBzY2FsZTAgPSBNYXRoLnNpbigoMS4wIC0gdCkgKiBvbWVnYSkgLyBzaW5vbTsKICAgICAgICBzY2FsZTEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gImZyb20iIGFuZCAidG8iIHF1YXRlcm5pb25zIGFyZSB2ZXJ5IGNsb3NlCiAgICAgICAgLy8gIC4uLiBzbyB3ZSBjYW4gZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbgogICAgICAgIHNjYWxlMCA9IDEuMCAtIHQ7CiAgICAgICAgc2NhbGUxID0gdDsKICAgICAgfSAvLyBjYWxjdWxhdGUgZmluYWwgdmFsdWVzCgoKICAgICAgdGFyZ2V0LnggPSBzY2FsZTAgKiBheCArIHNjYWxlMSAqIGJ4OwogICAgICB0YXJnZXQueSA9IHNjYWxlMCAqIGF5ICsgc2NhbGUxICogYnk7CiAgICAgIHRhcmdldC56ID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejsKICAgICAgdGFyZ2V0LncgPSBzY2FsZTAgKiBhdyArIHNjYWxlMSAqIGJ3OwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBSb3RhdGUgYW4gYWJzb2x1dGUgb3JpZW50YXRpb24gcXVhdGVybmlvbiBnaXZlbiBhbiBhbmd1bGFyIHZlbG9jaXR5IGFuZCBhIHRpbWUgc3RlcC4KICAgICAqLwoKCiAgICBpbnRlZ3JhdGUoYW5ndWxhclZlbG9jaXR5LCBkdCwgYW5ndWxhckZhY3RvciwgdGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRhcmdldCA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IGF4ID0gYW5ndWxhclZlbG9jaXR5LnggKiBhbmd1bGFyRmFjdG9yLngsCiAgICAgICAgICAgIGF5ID0gYW5ndWxhclZlbG9jaXR5LnkgKiBhbmd1bGFyRmFjdG9yLnksCiAgICAgICAgICAgIGF6ID0gYW5ndWxhclZlbG9jaXR5LnogKiBhbmd1bGFyRmFjdG9yLnosCiAgICAgICAgICAgIGJ4ID0gdGhpcy54LAogICAgICAgICAgICBieSA9IHRoaXMueSwKICAgICAgICAgICAgYnogPSB0aGlzLnosCiAgICAgICAgICAgIGJ3ID0gdGhpcy53OwogICAgICBjb25zdCBoYWxmX2R0ID0gZHQgKiAwLjU7CiAgICAgIHRhcmdldC54ICs9IGhhbGZfZHQgKiAoYXggKiBidyArIGF5ICogYnogLSBheiAqIGJ5KTsKICAgICAgdGFyZ2V0LnkgKz0gaGFsZl9kdCAqIChheSAqIGJ3ICsgYXogKiBieCAtIGF4ICogYnopOwogICAgICB0YXJnZXQueiArPSBoYWxmX2R0ICogKGF6ICogYncgKyBheCAqIGJ5IC0gYXkgKiBieCk7CiAgICAgIHRhcmdldC53ICs9IGhhbGZfZHQgKiAoLWF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBieik7CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogIH0KICBjb25zdCBzZnZfdDEgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNmdl90MiA9IG5ldyBWZWMzKCk7CgogIC8qKgogICAqIFRoZSBhdmFpbGFibGUgc2hhcGUgdHlwZXMuCiAgICovCiAgY29uc3QgU0hBUEVfVFlQRVMgPSB7CiAgICAvKiogU1BIRVJFICovCiAgICBTUEhFUkU6IDEsCgogICAgLyoqIFBMQU5FICovCiAgICBQTEFORTogMiwKCiAgICAvKiogQk9YICovCiAgICBCT1g6IDQsCgogICAgLyoqIENPTVBPVU5EICovCiAgICBDT01QT1VORDogOCwKCiAgICAvKiogQ09OVkVYUE9MWUhFRFJPTiAqLwogICAgQ09OVkVYUE9MWUhFRFJPTjogMTYsCgogICAgLyoqIEhFSUdIVEZJRUxEICovCiAgICBIRUlHSFRGSUVMRDogMzIsCgogICAgLyoqIFBBUlRJQ0xFICovCiAgICBQQVJUSUNMRTogNjQsCgogICAgLyoqIENZTElOREVSICovCiAgICBDWUxJTkRFUjogMTI4LAoKICAgIC8qKiBUUklNRVNIICovCiAgICBUUklNRVNIOiAyNTYKICB9OwogIC8qKgogICAqIFNoYXBlVHlwZQogICAqLwoKICAvKioKICAgKiBCYXNlIGNsYXNzIGZvciBzaGFwZXMKICAgKi8KICBjbGFzcyBTaGFwZSB7CiAgICAvKioKICAgICAqIElkZW50aWZpZXIgb2YgdGhlIFNoYXBlLgogICAgICovCgogICAgLyoqCiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIHNoYXBlLiBNdXN0IGJlIHNldCB0byBhbiBpbnQgPiAwIGJ5IHN1YmNsYXNzZXMuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSBsb2NhbCBib3VuZGluZyBzcGhlcmUgcmFkaXVzIG9mIHRoaXMgc2hhcGUuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gcHJvZHVjZSBjb250YWN0IGZvcmNlcyB3aGVuIGluIGNvbnRhY3Qgd2l0aCBvdGhlciBib2RpZXMuIE5vdGUgdGhhdCBjb250YWN0cyB3aWxsIGJlIGdlbmVyYXRlZCwgYnV0IHRoZXkgd2lsbCBiZSBkaXNhYmxlZC4KICAgICAqIEBkZWZhdWx0IHRydWUKICAgICAqLwoKICAgIC8qKgogICAgICogQGRlZmF1bHQgMQogICAgICovCgogICAgLyoqCiAgICAgKiBAZGVmYXVsdCAtMQogICAgICovCgogICAgLyoqCiAgICAgKiBPcHRpb25hbCBtYXRlcmlhbCBvZiB0aGUgc2hhcGUgdGhhdCByZWd1bGF0ZXMgY29udGFjdCBwcm9wZXJ0aWVzLgogICAgICovCgogICAgLyoqCiAgICAgKiBUaGUgYm9keSB0byB3aGljaCB0aGUgc2hhcGUgaXMgYWRkZWQgdG8uCiAgICAgKi8KCiAgICAvKioKICAgICAqIEFsbCB0aGUgU2hhcGUgdHlwZXMuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgdGhpcy5pZCA9IFNoYXBlLmlkQ291bnRlcisrOwogICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgMDsKICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZVJhZGl1cyA9IDA7CiAgICAgIHRoaXMuY29sbGlzaW9uUmVzcG9uc2UgPSBvcHRpb25zLmNvbGxpc2lvblJlc3BvbnNlID8gb3B0aW9ucy5jb2xsaXNpb25SZXNwb25zZSA6IHRydWU7CiAgICAgIHRoaXMuY29sbGlzaW9uRmlsdGVyR3JvdXAgPSBvcHRpb25zLmNvbGxpc2lvbkZpbHRlckdyb3VwICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNvbGxpc2lvbkZpbHRlckdyb3VwIDogMTsKICAgICAgdGhpcy5jb2xsaXNpb25GaWx0ZXJNYXNrID0gb3B0aW9ucy5jb2xsaXNpb25GaWx0ZXJNYXNrICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNvbGxpc2lvbkZpbHRlck1hc2sgOiAtMTsKICAgICAgdGhpcy5tYXRlcmlhbCA9IG9wdGlvbnMubWF0ZXJpYWwgPyBvcHRpb25zLm1hdGVyaWFsIDogbnVsbDsKICAgICAgdGhpcy5ib2R5ID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIHNwaGVyZSByYWRpdXMuCiAgICAgKiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgcHJvcGVydHkgYC5ib3VuZGluZ1NwaGVyZVJhZGl1c2AKICAgICAqLwoKCiAgICB1cGRhdGVCb3VuZGluZ1NwaGVyZVJhZGl1cygpIHsKICAgICAgdGhyb3cgYGNvbXB1dGVCb3VuZGluZ1NwaGVyZVJhZGl1cygpIG5vdCBpbXBsZW1lbnRlZCBmb3Igc2hhcGUgdHlwZSAke3RoaXMudHlwZX1gOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHZvbHVtZSBvZiB0aGlzIHNoYXBlCiAgICAgKi8KCgogICAgdm9sdW1lKCkgewogICAgICB0aHJvdyBgdm9sdW1lKCkgbm90IGltcGxlbWVudGVkIGZvciBzaGFwZSB0eXBlICR7dGhpcy50eXBlfWA7CiAgICB9CiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIGluZXJ0aWEgaW4gdGhlIGxvY2FsIGZyYW1lIGZvciB0aGlzIHNoYXBlLgogICAgICogQHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfbW9tZW50c19vZl9pbmVydGlhCiAgICAgKi8KCgogICAgY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIHRhcmdldCkgewogICAgICB0aHJvdyBgY2FsY3VsYXRlTG9jYWxJbmVydGlhKCkgbm90IGltcGxlbWVudGVkIGZvciBzaGFwZSB0eXBlICR7dGhpcy50eXBlfWA7CiAgICB9CiAgICAvKioKICAgICAqIEB0b2RvIHVzZSBhYnN0cmFjdCBmb3IgdGhlc2Uga2luZCBvZiBtZXRob2RzCiAgICAgKi8KCgogICAgY2FsY3VsYXRlV29ybGRBQUJCKHBvcywgcXVhdCwgbWluLCBtYXgpIHsKICAgICAgdGhyb3cgYGNhbGN1bGF0ZVdvcmxkQUFCQigpIG5vdCBpbXBsZW1lbnRlZCBmb3Igc2hhcGUgdHlwZSAke3RoaXMudHlwZX1gOwogICAgfQoKICB9CiAgU2hhcGUuaWRDb3VudGVyID0gMDsKICBTaGFwZS50eXBlcyA9IFNIQVBFX1RZUEVTOwoKICAvKioKICAgKiBUcmFuc2Zvcm1hdGlvbiB1dGlsaXRpZXMuCiAgICovCiAgY2xhc3MgVHJhbnNmb3JtIHsKICAgIC8qKgogICAgICogcG9zaXRpb24KICAgICAqLwoKICAgIC8qKgogICAgICogcXVhdGVybmlvbgogICAgICovCiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KCiAgICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVmVjMygpOwogICAgICB0aGlzLnF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOwoKICAgICAgaWYgKG9wdGlvbnMucG9zaXRpb24pIHsKICAgICAgICB0aGlzLnBvc2l0aW9uLmNvcHkob3B0aW9ucy5wb3NpdGlvbik7CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLnF1YXRlcm5pb24pIHsKICAgICAgICB0aGlzLnF1YXRlcm5pb24uY29weShvcHRpb25zLnF1YXRlcm5pb24pOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhIGdsb2JhbCBwb2ludCBpbiBsb2NhbCB0cmFuc2Zvcm0gY29vcmRpbmF0ZXMuCiAgICAgKi8KCgogICAgcG9pbnRUb0xvY2FsKHdvcmxkUG9pbnQsIHJlc3VsdCkgewogICAgICByZXR1cm4gVHJhbnNmb3JtLnBvaW50VG9Mb2NhbEZyYW1lKHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgd29ybGRQb2ludCwgcmVzdWx0KTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGEgbG9jYWwgcG9pbnQgaW4gZ2xvYmFsIHRyYW5zZm9ybSBjb29yZGluYXRlcy4KICAgICAqLwoKCiAgICBwb2ludFRvV29ybGQobG9jYWxQb2ludCwgcmVzdWx0KSB7CiAgICAgIHJldHVybiBUcmFuc2Zvcm0ucG9pbnRUb1dvcmxkRnJhbWUodGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCBsb2NhbFBvaW50LCByZXN1bHQpOwogICAgfQogICAgLyoqCiAgICAgKiB2ZWN0b3JUb1dvcmxkRnJhbWUKICAgICAqLwoKCiAgICB2ZWN0b3JUb1dvcmxkRnJhbWUobG9jYWxWZWN0b3IsIHJlc3VsdCkgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHsKICAgICAgICByZXN1bHQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICB0aGlzLnF1YXRlcm5pb24udm11bHQobG9jYWxWZWN0b3IsIHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIHBvaW50VG9Mb2NhbEZyYW1lCiAgICAgKi8KCgogICAgc3RhdGljIHBvaW50VG9Mb2NhbEZyYW1lKHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCB3b3JsZFBvaW50LCByZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmVzdWx0ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgd29ybGRQb2ludC52c3ViKHBvc2l0aW9uLCByZXN1bHQpOwogICAgICBxdWF0ZXJuaW9uLmNvbmp1Z2F0ZSh0bXBRdWF0JDEpOwogICAgICB0bXBRdWF0JDEudm11bHQocmVzdWx0LCByZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBwb2ludFRvV29ybGRGcmFtZQogICAgICovCgoKICAgIHN0YXRpYyBwb2ludFRvV29ybGRGcmFtZShwb3NpdGlvbiwgcXVhdGVybmlvbiwgbG9jYWxQb2ludCwgcmVzdWx0KSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgewogICAgICAgIHJlc3VsdCA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIHF1YXRlcm5pb24udm11bHQobG9jYWxQb2ludCwgcmVzdWx0KTsKICAgICAgcmVzdWx0LnZhZGQocG9zaXRpb24sIHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIHZlY3RvclRvV29ybGRGcmFtZQogICAgICovCgoKICAgIHN0YXRpYyB2ZWN0b3JUb1dvcmxkRnJhbWUocXVhdGVybmlvbiwgbG9jYWxWZWN0b3IsIHJlc3VsdCkgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHsKICAgICAgICByZXN1bHQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICBxdWF0ZXJuaW9uLnZtdWx0KGxvY2FsVmVjdG9yLCByZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiB2ZWN0b3JUb0xvY2FsRnJhbWUKICAgICAqLwoKCiAgICBzdGF0aWMgdmVjdG9yVG9Mb2NhbEZyYW1lKHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCB3b3JsZFZlY3RvciwgcmVzdWx0KSB7CiAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgewogICAgICAgIHJlc3VsdCA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIHF1YXRlcm5pb24udyAqPSAtMTsKICAgICAgcXVhdGVybmlvbi52bXVsdCh3b3JsZFZlY3RvciwgcmVzdWx0KTsKICAgICAgcXVhdGVybmlvbi53ICo9IC0xOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICB9CiAgY29uc3QgdG1wUXVhdCQxID0gbmV3IFF1YXRlcm5pb24oKTsKCiAgLyoqCiAgICogQSBzZXQgb2YgcG9seWdvbnMgZGVzY3JpYmluZyBhIGNvbnZleCBzaGFwZS4KICAgKgogICAqIFRoZSBzaGFwZSBNVVNUIGJlIGNvbnZleCBmb3IgdGhlIGNvZGUgdG8gd29yayBwcm9wZXJseS4gTm8gcG9seWdvbnMgbWF5IGJlIGNvcGxhbmFyIChjb250YWluZWQKICAgKiBpbiB0aGUgc2FtZSAzRCBwbGFuZSksIGluc3RlYWQgdGhlc2Ugc2hvdWxkIGJlIG1lcmdlZCBpbnRvIG9uZSBwb2x5Z29uLgogICAqCiAgICogQGF1dGhvciBxaWFvIC8gaHR0cHM6Ly9naXRodWIuY29tL3FpYW8gKG9yaWdpbmFsIGF1dGhvciwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9xaWFvL3RocmVlLmpzL2NvbW1pdC84NTAyNmYwYzc2OWU0MDAwMTQ4YTY3ZDQ1YTllOWI5YzUxMDg4MzZmKQogICAqIEBhdXRob3Igc2NodGVwcGUgLyBodHRwczovL2dpdGh1Yi5jb20vc2NodGVwcGUKICAgKiBAc2VlIGh0dHBzOi8vd3d3LmFsdGRldmJsb2dhZGF5LmNvbS8yMDExLzA1LzEzL2NvbnRhY3QtZ2VuZXJhdGlvbi1iZXR3ZWVuLTNkLWNvbnZleC1tZXNoZXMvCiAgICoKICAgKiBAdG9kbyBNb3ZlIHRoZSBjbGlwcGluZyBmdW5jdGlvbnMgdG8gQ29udGFjdEdlbmVyYXRvcj8KICAgKiBAdG9kbyBBdXRvbWF0aWNhbGx5IG1lcmdlIGNvcGxhbmFyIHBvbHlnb25zIGluIGNvbnN0cnVjdG9yLgogICAqIEBleGFtcGxlCiAgICogICAgIGNvbnN0IGNvbnZleFNoYXBlID0gbmV3IENBTk5PTi5Db252ZXhQb2x5aGVkcm9uKHsgdmVydGljZXMsIGZhY2VzIH0pCiAgICogICAgIGNvbnN0IGNvbnZleEJvZHkgPSBuZXcgQ0FOTk9OLkJvZHkoeyBtYXNzOiAxLCBzaGFwZTogY29udmV4U2hhcGUgfSkKICAgKiAgICAgd29ybGQuYWRkQm9keShjb252ZXhCb2R5KQogICAqLwogIGNsYXNzIENvbnZleFBvbHloZWRyb24gZXh0ZW5kcyBTaGFwZSB7CiAgICAvKiogdmVydGljZXMgKi8KCiAgICAvKioKICAgICAqIEFycmF5IG9mIGludGVnZXIgYXJyYXlzLCBpbmRpY2F0aW5nIHdoaWNoIHZlcnRpY2VzIGVhY2ggZmFjZSBjb25zaXN0cyBvZgogICAgICovCgogICAgLyoqIGZhY2VOb3JtYWxzICovCgogICAgLyoqIHdvcmxkVmVydGljZXMgKi8KCiAgICAvKiogd29ybGRWZXJ0aWNlc05lZWRzVXBkYXRlICovCgogICAgLyoqIHdvcmxkRmFjZU5vcm1hbHMgKi8KCiAgICAvKiogd29ybGRGYWNlTm9ybWFsc05lZWRzVXBkYXRlICovCgogICAgLyoqCiAgICAgKiBJZiBnaXZlbiwgdGhlc2UgbG9jYWxseSBkZWZpbmVkLCBub3JtYWxpemVkIGF4ZXMgYXJlIHRoZSBvbmx5IG9uZXMgYmVpbmcgY2hlY2tlZCB3aGVuIGRvaW5nIHNlcGFyYXRpbmcgYXhpcyBjaGVjay4KICAgICAqLwoKICAgIC8qKiB1bmlxdWVFZGdlcyAqLwoKICAgIC8qKgogICAgICogQHBhcmFtIHZlcnRpY2VzIEFuIGFycmF5IG9mIFZlYzMncwogICAgICogQHBhcmFtIGZhY2VzIEFycmF5IG9mIGludGVnZXIgYXJyYXlzLCBkZXNjcmliaW5nIHdoaWNoIHZlcnRpY2VzIHRoYXQgaXMgaW5jbHVkZWQgaW4gZWFjaCBmYWNlLgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihwcm9wcykgewogICAgICBpZiAocHJvcHMgPT09IHZvaWQgMCkgewogICAgICAgIHByb3BzID0ge307CiAgICAgIH0KCiAgICAgIGNvbnN0IHsKICAgICAgICB2ZXJ0aWNlcyA9IFtdLAogICAgICAgIGZhY2VzID0gW10sCiAgICAgICAgbm9ybWFscyA9IFtdLAogICAgICAgIGF4ZXMsCiAgICAgICAgYm91bmRpbmdTcGhlcmVSYWRpdXMKICAgICAgfSA9IHByb3BzOwogICAgICBzdXBlcih7CiAgICAgICAgdHlwZTogU2hhcGUudHlwZXMuQ09OVkVYUE9MWUhFRFJPTgogICAgICB9KTsKICAgICAgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzOwogICAgICB0aGlzLmZhY2VzID0gZmFjZXM7CiAgICAgIHRoaXMuZmFjZU5vcm1hbHMgPSBub3JtYWxzOwoKICAgICAgaWYgKHRoaXMuZmFjZU5vcm1hbHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhpcy5jb21wdXRlTm9ybWFscygpOwogICAgICB9CgogICAgICBpZiAoIWJvdW5kaW5nU3BoZXJlUmFkaXVzKSB7CiAgICAgICAgdGhpcy51cGRhdGVCb3VuZGluZ1NwaGVyZVJhZGl1cygpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmVSYWRpdXMgPSBib3VuZGluZ1NwaGVyZVJhZGl1czsKICAgICAgfQoKICAgICAgdGhpcy53b3JsZFZlcnRpY2VzID0gW107IC8vIFdvcmxkIHRyYW5zZm9ybWVkIHZlcnNpb24gb2YgLnZlcnRpY2VzCgogICAgICB0aGlzLndvcmxkVmVydGljZXNOZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIHRoaXMud29ybGRGYWNlTm9ybWFscyA9IFtdOyAvLyBXb3JsZCB0cmFuc2Zvcm1lZCB2ZXJzaW9uIG9mIC5mYWNlTm9ybWFscwoKICAgICAgdGhpcy53b3JsZEZhY2VOb3JtYWxzTmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICB0aGlzLnVuaXF1ZUF4ZXMgPSBheGVzID8gYXhlcy5zbGljZSgpIDogbnVsbDsKICAgICAgdGhpcy51bmlxdWVFZGdlcyA9IFtdOwogICAgICB0aGlzLmNvbXB1dGVFZGdlcygpOwogICAgfQogICAgLyoqCiAgICAgKiBDb21wdXRlcyB1bmlxdWVFZGdlcwogICAgICovCgoKICAgIGNvbXB1dGVFZGdlcygpIHsKICAgICAgY29uc3QgZmFjZXMgPSB0aGlzLmZhY2VzOwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7CiAgICAgIGNvbnN0IGVkZ2VzID0gdGhpcy51bmlxdWVFZGdlczsKICAgICAgZWRnZXMubGVuZ3RoID0gMDsKICAgICAgY29uc3QgZWRnZSA9IG5ldyBWZWMzKCk7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gZmFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBmYWNlID0gZmFjZXNbaV07CiAgICAgICAgY29uc3QgbnVtVmVydGljZXMgPSBmYWNlLmxlbmd0aDsKCiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogIT09IG51bVZlcnRpY2VzOyBqKyspIHsKICAgICAgICAgIGNvbnN0IGsgPSAoaiArIDEpICUgbnVtVmVydGljZXM7CiAgICAgICAgICB2ZXJ0aWNlc1tmYWNlW2pdXS52c3ViKHZlcnRpY2VzW2ZhY2Vba11dLCBlZGdlKTsKICAgICAgICAgIGVkZ2Uubm9ybWFsaXplKCk7CiAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKCiAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCAhPT0gZWRnZXMubGVuZ3RoOyBwKyspIHsKICAgICAgICAgICAgaWYgKGVkZ2VzW3BdLmFsbW9zdEVxdWFscyhlZGdlKSB8fCBlZGdlc1twXS5hbG1vc3RFcXVhbHMoZWRnZSkpIHsKICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgIGVkZ2VzLnB1c2goZWRnZS5jbG9uZSgpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZSB0aGUgbm9ybWFscyBvZiB0aGUgZmFjZXMuCiAgICAgKiBXaWxsIHJldXNlIGV4aXN0aW5nIFZlYzMgb2JqZWN0cyBpbiB0aGUgYGZhY2VOb3JtYWxzYCBhcnJheSBpZiB0aGV5IGV4aXN0LgogICAgICovCgoKICAgIGNvbXB1dGVOb3JtYWxzKCkgewogICAgICB0aGlzLmZhY2VOb3JtYWxzLmxlbmd0aCA9IHRoaXMuZmFjZXMubGVuZ3RoOyAvLyBHZW5lcmF0ZSBub3JtYWxzCgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmFjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvLyBDaGVjayBzbyBhbGwgdmVydGljZXMgZXhpc3RzIGZvciB0aGlzIGZhY2UKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZmFjZXNbaV0ubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGlmICghdGhpcy52ZXJ0aWNlc1t0aGlzLmZhY2VzW2ldW2pdXSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZlcnRleCAke3RoaXMuZmFjZXNbaV1bal19IG5vdCBmb3VuZCFgKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvbnN0IG4gPSB0aGlzLmZhY2VOb3JtYWxzW2ldIHx8IG5ldyBWZWMzKCk7CiAgICAgICAgdGhpcy5nZXRGYWNlTm9ybWFsKGksIG4pOwogICAgICAgIG4ubmVnYXRlKG4pOwogICAgICAgIHRoaXMuZmFjZU5vcm1hbHNbaV0gPSBuOwogICAgICAgIGNvbnN0IHZlcnRleCA9IHRoaXMudmVydGljZXNbdGhpcy5mYWNlc1tpXVswXV07CgogICAgICAgIGlmIChuLmRvdCh2ZXJ0ZXgpIDwgMCkgewogICAgICAgICAgY29uc29sZS5lcnJvcihgLmZhY2VOb3JtYWxzWyR7aX1dID0gVmVjMygke24udG9TdHJpbmcoKX0pIGxvb2tzIGxpa2UgaXQgcG9pbnRzIGludG8gdGhlIHNoYXBlPyBUaGUgdmVydGljZXMgZm9sbG93LiBNYWtlIHN1cmUgdGhleSBhcmUgb3JkZXJlZCBDQ1cgYXJvdW5kIHRoZSBub3JtYWwsIHVzaW5nIHRoZSByaWdodCBoYW5kIHJ1bGUuYCk7CgogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmZhY2VzW2ldLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybihgLnZlcnRpY2VzWyR7dGhpcy5mYWNlc1tpXVtqXX1dID0gVmVjMygke3RoaXMudmVydGljZXNbdGhpcy5mYWNlc1tpXVtqXV0udG9TdHJpbmcoKX0pYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENvbXB1dGUgdGhlIG5vcm1hbCBvZiBhIGZhY2UgZnJvbSBpdHMgdmVydGljZXMKICAgICAqLwoKCiAgICBnZXRGYWNlTm9ybWFsKGksIHRhcmdldCkgewogICAgICBjb25zdCBmID0gdGhpcy5mYWNlc1tpXTsKICAgICAgY29uc3QgdmEgPSB0aGlzLnZlcnRpY2VzW2ZbMF1dOwogICAgICBjb25zdCB2YiA9IHRoaXMudmVydGljZXNbZlsxXV07CiAgICAgIGNvbnN0IHZjID0gdGhpcy52ZXJ0aWNlc1tmWzJdXTsKICAgICAgQ29udmV4UG9seWhlZHJvbi5jb21wdXRlTm9ybWFsKHZhLCB2YiwgdmMsIHRhcmdldCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBmYWNlIG5vcm1hbCBnaXZlbiAzIHZlcnRpY2VzCiAgICAgKi8KCgogICAgc3RhdGljIGNvbXB1dGVOb3JtYWwodmEsIHZiLCB2YywgdGFyZ2V0KSB7CiAgICAgIGNvbnN0IGNiID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgYWIgPSBuZXcgVmVjMygpOwogICAgICB2Yi52c3ViKHZhLCBhYik7CiAgICAgIHZjLnZzdWIodmIsIGNiKTsKICAgICAgY2IuY3Jvc3MoYWIsIHRhcmdldCk7CgogICAgICBpZiAoIXRhcmdldC5pc1plcm8oKSkgewogICAgICAgIHRhcmdldC5ub3JtYWxpemUoKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gbWluRGlzdCBDbGFtcCBkaXN0YW5jZQogICAgICogQHBhcmFtIHJlc3VsdCBUaGUgYW4gYXJyYXkgb2YgY29udGFjdCBwb2ludCBvYmplY3RzLCBzZWUgY2xpcEZhY2VBZ2FpbnN0SHVsbAogICAgICovCgoKICAgIGNsaXBBZ2FpbnN0SHVsbChwb3NBLCBxdWF0QSwgaHVsbEIsIHBvc0IsIHF1YXRCLCBzZXBhcmF0aW5nTm9ybWFsLCBtaW5EaXN0LCBtYXhEaXN0LCByZXN1bHQpIHsKICAgICAgY29uc3QgV29ybGROb3JtYWwgPSBuZXcgVmVjMygpOwogICAgICBsZXQgY2xvc2VzdEZhY2VCID0gLTE7CiAgICAgIGxldCBkbWF4ID0gLU51bWJlci5NQVhfVkFMVUU7CgogICAgICBmb3IgKGxldCBmYWNlID0gMDsgZmFjZSA8IGh1bGxCLmZhY2VzLmxlbmd0aDsgZmFjZSsrKSB7CiAgICAgICAgV29ybGROb3JtYWwuY29weShodWxsQi5mYWNlTm9ybWFsc1tmYWNlXSk7CiAgICAgICAgcXVhdEIudm11bHQoV29ybGROb3JtYWwsIFdvcmxkTm9ybWFsKTsKICAgICAgICBjb25zdCBkID0gV29ybGROb3JtYWwuZG90KHNlcGFyYXRpbmdOb3JtYWwpOwoKICAgICAgICBpZiAoZCA+IGRtYXgpIHsKICAgICAgICAgIGRtYXggPSBkOwogICAgICAgICAgY2xvc2VzdEZhY2VCID0gZmFjZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNvbnN0IHdvcmxkVmVydHNCMSA9IFtdOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodWxsQi5mYWNlc1tjbG9zZXN0RmFjZUJdLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgYiA9IGh1bGxCLnZlcnRpY2VzW2h1bGxCLmZhY2VzW2Nsb3Nlc3RGYWNlQl1baV1dOwogICAgICAgIGNvbnN0IHdvcmxkYiA9IG5ldyBWZWMzKCk7CiAgICAgICAgd29ybGRiLmNvcHkoYik7CiAgICAgICAgcXVhdEIudm11bHQod29ybGRiLCB3b3JsZGIpOwogICAgICAgIHBvc0IudmFkZCh3b3JsZGIsIHdvcmxkYik7CiAgICAgICAgd29ybGRWZXJ0c0IxLnB1c2god29ybGRiKTsKICAgICAgfQoKICAgICAgaWYgKGNsb3Nlc3RGYWNlQiA+PSAwKSB7CiAgICAgICAgdGhpcy5jbGlwRmFjZUFnYWluc3RIdWxsKHNlcGFyYXRpbmdOb3JtYWwsIHBvc0EsIHF1YXRBLCB3b3JsZFZlcnRzQjEsIG1pbkRpc3QsIG1heERpc3QsIHJlc3VsdCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRmluZCB0aGUgc2VwYXJhdGluZyBheGlzIGJldHdlZW4gdGhpcyBodWxsIGFuZCBhbm90aGVyCiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdmVjdG9yIHRvIHNhdmUgdGhlIGF4aXMgaW4KICAgICAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBpZiBhIHNlcGFyYXRpb24gaXMgZm91bmQsIGVsc2UgdHJ1ZQogICAgICovCgoKICAgIGZpbmRTZXBhcmF0aW5nQXhpcyhodWxsQiwgcG9zQSwgcXVhdEEsIHBvc0IsIHF1YXRCLCB0YXJnZXQsIGZhY2VMaXN0QSwgZmFjZUxpc3RCKSB7CiAgICAgIGNvbnN0IGZhY2VBTm9ybWFsV1MzID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgV29ybGRub3JtYWwxID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgZGVsdGFDID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3Qgd29ybGRFZGdlMCA9IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IHdvcmxkRWRnZTEgPSBuZXcgVmVjMygpOwogICAgICBjb25zdCBDcm9zcyA9IG5ldyBWZWMzKCk7CiAgICAgIGxldCBkbWluID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgY29uc3QgaHVsbEEgPSB0aGlzOwoKICAgICAgaWYgKCFodWxsQS51bmlxdWVBeGVzKSB7CiAgICAgICAgY29uc3QgbnVtRmFjZXNBID0gZmFjZUxpc3RBID8gZmFjZUxpc3RBLmxlbmd0aCA6IGh1bGxBLmZhY2VzLmxlbmd0aDsgLy8gVGVzdCBmYWNlIG5vcm1hbHMgZnJvbSBodWxsQQoKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZhY2VzQTsgaSsrKSB7CiAgICAgICAgICBjb25zdCBmaSA9IGZhY2VMaXN0QSA/IGZhY2VMaXN0QVtpXSA6IGk7IC8vIEdldCB3b3JsZCBmYWNlIG5vcm1hbAoKICAgICAgICAgIGZhY2VBTm9ybWFsV1MzLmNvcHkoaHVsbEEuZmFjZU5vcm1hbHNbZmldKTsKICAgICAgICAgIHF1YXRBLnZtdWx0KGZhY2VBTm9ybWFsV1MzLCBmYWNlQU5vcm1hbFdTMyk7CiAgICAgICAgICBjb25zdCBkID0gaHVsbEEudGVzdFNlcEF4aXMoZmFjZUFOb3JtYWxXUzMsIGh1bGxCLCBwb3NBLCBxdWF0QSwgcG9zQiwgcXVhdEIpOwoKICAgICAgICAgIGlmIChkID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGQgPCBkbWluKSB7CiAgICAgICAgICAgIGRtaW4gPSBkOwogICAgICAgICAgICB0YXJnZXQuY29weShmYWNlQU5vcm1hbFdTMyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRlc3QgdW5pcXVlIGF4ZXMKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gaHVsbEEudW5pcXVlQXhlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgLy8gR2V0IHdvcmxkIGF4aXMKICAgICAgICAgIHF1YXRBLnZtdWx0KGh1bGxBLnVuaXF1ZUF4ZXNbaV0sIGZhY2VBTm9ybWFsV1MzKTsKICAgICAgICAgIGNvbnN0IGQgPSBodWxsQS50ZXN0U2VwQXhpcyhmYWNlQU5vcm1hbFdTMywgaHVsbEIsIHBvc0EsIHF1YXRBLCBwb3NCLCBxdWF0Qik7CgogICAgICAgICAgaWYgKGQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZCA8IGRtaW4pIHsKICAgICAgICAgICAgZG1pbiA9IGQ7CiAgICAgICAgICAgIHRhcmdldC5jb3B5KGZhY2VBTm9ybWFsV1MzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICghaHVsbEIudW5pcXVlQXhlcykgewogICAgICAgIC8vIFRlc3QgZmFjZSBub3JtYWxzIGZyb20gaHVsbEIKICAgICAgICBjb25zdCBudW1GYWNlc0IgPSBmYWNlTGlzdEIgPyBmYWNlTGlzdEIubGVuZ3RoIDogaHVsbEIuZmFjZXMubGVuZ3RoOwoKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZhY2VzQjsgaSsrKSB7CiAgICAgICAgICBjb25zdCBmaSA9IGZhY2VMaXN0QiA/IGZhY2VMaXN0QltpXSA6IGk7CiAgICAgICAgICBXb3JsZG5vcm1hbDEuY29weShodWxsQi5mYWNlTm9ybWFsc1tmaV0pOwogICAgICAgICAgcXVhdEIudm11bHQoV29ybGRub3JtYWwxLCBXb3JsZG5vcm1hbDEpOwogICAgICAgICAgY29uc3QgZCA9IGh1bGxBLnRlc3RTZXBBeGlzKFdvcmxkbm9ybWFsMSwgaHVsbEIsIHBvc0EsIHF1YXRBLCBwb3NCLCBxdWF0Qik7CgogICAgICAgICAgaWYgKGQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZCA8IGRtaW4pIHsKICAgICAgICAgICAgZG1pbiA9IGQ7CiAgICAgICAgICAgIHRhcmdldC5jb3B5KFdvcmxkbm9ybWFsMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRlc3QgdW5pcXVlIGF4ZXMgaW4gQgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBodWxsQi51bmlxdWVBeGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBxdWF0Qi52bXVsdChodWxsQi51bmlxdWVBeGVzW2ldLCBXb3JsZG5vcm1hbDEpOwogICAgICAgICAgY29uc3QgZCA9IGh1bGxBLnRlc3RTZXBBeGlzKFdvcmxkbm9ybWFsMSwgaHVsbEIsIHBvc0EsIHF1YXRBLCBwb3NCLCBxdWF0Qik7CgogICAgICAgICAgaWYgKGQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZCA8IGRtaW4pIHsKICAgICAgICAgICAgZG1pbiA9IGQ7CiAgICAgICAgICAgIHRhcmdldC5jb3B5KFdvcmxkbm9ybWFsMSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IC8vIFRlc3QgZWRnZXMKCgogICAgICBmb3IgKGxldCBlMCA9IDA7IGUwICE9PSBodWxsQS51bmlxdWVFZGdlcy5sZW5ndGg7IGUwKyspIHsKICAgICAgICAvLyBHZXQgd29ybGQgZWRnZQogICAgICAgIHF1YXRBLnZtdWx0KGh1bGxBLnVuaXF1ZUVkZ2VzW2UwXSwgd29ybGRFZGdlMCk7CgogICAgICAgIGZvciAobGV0IGUxID0gMDsgZTEgIT09IGh1bGxCLnVuaXF1ZUVkZ2VzLmxlbmd0aDsgZTErKykgewogICAgICAgICAgLy8gR2V0IHdvcmxkIGVkZ2UgMgogICAgICAgICAgcXVhdEIudm11bHQoaHVsbEIudW5pcXVlRWRnZXNbZTFdLCB3b3JsZEVkZ2UxKTsKICAgICAgICAgIHdvcmxkRWRnZTAuY3Jvc3Mod29ybGRFZGdlMSwgQ3Jvc3MpOwoKICAgICAgICAgIGlmICghQ3Jvc3MuYWxtb3N0WmVybygpKSB7CiAgICAgICAgICAgIENyb3NzLm5vcm1hbGl6ZSgpOwogICAgICAgICAgICBjb25zdCBkaXN0ID0gaHVsbEEudGVzdFNlcEF4aXMoQ3Jvc3MsIGh1bGxCLCBwb3NBLCBxdWF0QSwgcG9zQiwgcXVhdEIpOwoKICAgICAgICAgICAgaWYgKGRpc3QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGlzdCA8IGRtaW4pIHsKICAgICAgICAgICAgICBkbWluID0gZGlzdDsKICAgICAgICAgICAgICB0YXJnZXQuY29weShDcm9zcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBvc0IudnN1Yihwb3NBLCBkZWx0YUMpOwoKICAgICAgaWYgKGRlbHRhQy5kb3QodGFyZ2V0KSA+IDAuMCkgewogICAgICAgIHRhcmdldC5uZWdhdGUodGFyZ2V0KTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIFRlc3Qgc2VwYXJhdGluZyBheGlzIGFnYWluc3QgdHdvIGh1bGxzLiBCb3RoIGh1bGxzIGFyZSBwcm9qZWN0ZWQgb250byB0aGUgYXhpcyBhbmQgdGhlIG92ZXJsYXAgc2l6ZSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBvbmUuCiAgICAgKiBAcmV0dXJuIFRoZSBvdmVybGFwIGRlcHRoLCBvciBGQUxTRSBpZiBubyBwZW5ldHJhdGlvbi4KICAgICAqLwoKCiAgICB0ZXN0U2VwQXhpcyhheGlzLCBodWxsQiwgcG9zQSwgcXVhdEEsIHBvc0IsIHF1YXRCKSB7CiAgICAgIGNvbnN0IGh1bGxBID0gdGhpczsKICAgICAgQ29udmV4UG9seWhlZHJvbi5wcm9qZWN0KGh1bGxBLCBheGlzLCBwb3NBLCBxdWF0QSwgbWF4bWluQSk7CiAgICAgIENvbnZleFBvbHloZWRyb24ucHJvamVjdChodWxsQiwgYXhpcywgcG9zQiwgcXVhdEIsIG1heG1pbkIpOwogICAgICBjb25zdCBtYXhBID0gbWF4bWluQVswXTsKICAgICAgY29uc3QgbWluQSA9IG1heG1pbkFbMV07CiAgICAgIGNvbnN0IG1heEIgPSBtYXhtaW5CWzBdOwogICAgICBjb25zdCBtaW5CID0gbWF4bWluQlsxXTsKCiAgICAgIGlmIChtYXhBIDwgbWluQiB8fCBtYXhCIDwgbWluQSkgewogICAgICAgIHJldHVybiBmYWxzZTsgLy8gU2VwYXJhdGVkCiAgICAgIH0KCiAgICAgIGNvbnN0IGQwID0gbWF4QSAtIG1pbkI7CiAgICAgIGNvbnN0IGQxID0gbWF4QiAtIG1pbkE7CiAgICAgIGNvbnN0IGRlcHRoID0gZDAgPCBkMSA/IGQwIDogZDE7CiAgICAgIHJldHVybiBkZXB0aDsKICAgIH0KICAgIC8qKgogICAgICogY2FsY3VsYXRlTG9jYWxJbmVydGlhCiAgICAgKi8KCgogICAgY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIHRhcmdldCkgewogICAgICAvLyBBcHByb3hpbWF0ZSB3aXRoIGJveCBpbmVydGlhCiAgICAgIC8vIEV4YWN0IGluZXJ0aWEgY2FsY3VsYXRpb24gaXMgb3ZlcmtpbGwsIGJ1dCBzZWUgaHR0cDovL2dlb21ldHJpY3Rvb2xzLmNvbS9Eb2N1bWVudGF0aW9uL1BvbHloZWRyYWxNYXNzUHJvcGVydGllcy5wZGYgZm9yIHRoZSBjb3JyZWN0IHdheSB0byBkbyBpdAogICAgICBjb25zdCBhYWJibWF4ID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgYWFiYm1pbiA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMuY29tcHV0ZUxvY2FsQUFCQihhYWJibWluLCBhYWJibWF4KTsKICAgICAgY29uc3QgeCA9IGFhYmJtYXgueCAtIGFhYmJtaW4ueDsKICAgICAgY29uc3QgeSA9IGFhYmJtYXgueSAtIGFhYmJtaW4ueTsKICAgICAgY29uc3QgeiA9IGFhYmJtYXgueiAtIGFhYmJtaW4uejsKICAgICAgdGFyZ2V0LnggPSAxLjAgLyAxMi4wICogbWFzcyAqICgyICogeSAqIDIgKiB5ICsgMiAqIHogKiAyICogeik7CiAgICAgIHRhcmdldC55ID0gMS4wIC8gMTIuMCAqIG1hc3MgKiAoMiAqIHggKiAyICogeCArIDIgKiB6ICogMiAqIHopOwogICAgICB0YXJnZXQueiA9IDEuMCAvIDEyLjAgKiBtYXNzICogKDIgKiB5ICogMiAqIHkgKyAyICogeCAqIDIgKiB4KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIGZhY2VfaSBJbmRleCBvZiB0aGUgZmFjZQogICAgICovCgoKICAgIGdldFBsYW5lQ29uc3RhbnRPZkZhY2UoZmFjZV9pKSB7CiAgICAgIGNvbnN0IGYgPSB0aGlzLmZhY2VzW2ZhY2VfaV07CiAgICAgIGNvbnN0IG4gPSB0aGlzLmZhY2VOb3JtYWxzW2ZhY2VfaV07CiAgICAgIGNvbnN0IHYgPSB0aGlzLnZlcnRpY2VzW2ZbMF1dOwogICAgICBjb25zdCBjID0gLW4uZG90KHYpOwogICAgICByZXR1cm4gYzsKICAgIH0KICAgIC8qKgogICAgICogQ2xpcCBhIGZhY2UgYWdhaW5zdCBhIGh1bGwuCiAgICAgKiBAcGFyYW0gd29ybGRWZXJ0c0IxIEFuIGFycmF5IG9mIFZlYzMgd2l0aCB2ZXJ0aWNlcyBpbiB0aGUgd29ybGQgZnJhbWUuCiAgICAgKiBAcGFyYW0gbWluRGlzdCBEaXN0YW5jZSBjbGFtcGluZwogICAgICogQHBhcmFtIEFycmF5IHJlc3VsdCBBcnJheSB0byBzdG9yZSByZXN1bHRpbmcgY29udGFjdCBwb2ludHMgaW4uIFdpbGwgYmUgb2JqZWN0cyB3aXRoIHByb3BlcnRpZXM6IHBvaW50LCBkZXB0aCwgbm9ybWFsLiBUaGVzZSBhcmUgcmVwcmVzZW50ZWQgaW4gd29ybGQgY29vcmRpbmF0ZXMuCiAgICAgKi8KCgogICAgY2xpcEZhY2VBZ2FpbnN0SHVsbChzZXBhcmF0aW5nTm9ybWFsLCBwb3NBLCBxdWF0QSwgd29ybGRWZXJ0c0IxLCBtaW5EaXN0LCBtYXhEaXN0LCByZXN1bHQpIHsKICAgICAgY29uc3QgZmFjZUFOb3JtYWxXUyA9IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IGVkZ2UwID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgV29ybGRFZGdlMCA9IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IHdvcmxkUGxhbmVBbm9ybWFsMSA9IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IHBsYW5lTm9ybWFsV1MxID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3Qgd29ybGRBMSA9IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IGxvY2FsUGxhbmVOb3JtYWwgPSBuZXcgVmVjMygpOwogICAgICBjb25zdCBwbGFuZU5vcm1hbFdTID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgaHVsbEEgPSB0aGlzOwogICAgICBjb25zdCB3b3JsZFZlcnRzQjIgPSBbXTsKICAgICAgY29uc3QgcFZ0eEluID0gd29ybGRWZXJ0c0IxOwogICAgICBjb25zdCBwVnR4T3V0ID0gd29ybGRWZXJ0c0IyOwogICAgICBsZXQgY2xvc2VzdEZhY2VBID0gLTE7CiAgICAgIGxldCBkbWluID0gTnVtYmVyLk1BWF9WQUxVRTsgLy8gRmluZCB0aGUgZmFjZSB3aXRoIG5vcm1hbCBjbG9zZXN0IHRvIHRoZSBzZXBhcmF0aW5nIGF4aXMKCiAgICAgIGZvciAobGV0IGZhY2UgPSAwOyBmYWNlIDwgaHVsbEEuZmFjZXMubGVuZ3RoOyBmYWNlKyspIHsKICAgICAgICBmYWNlQU5vcm1hbFdTLmNvcHkoaHVsbEEuZmFjZU5vcm1hbHNbZmFjZV0pOwogICAgICAgIHF1YXRBLnZtdWx0KGZhY2VBTm9ybWFsV1MsIGZhY2VBTm9ybWFsV1MpOwogICAgICAgIGNvbnN0IGQgPSBmYWNlQU5vcm1hbFdTLmRvdChzZXBhcmF0aW5nTm9ybWFsKTsKCiAgICAgICAgaWYgKGQgPCBkbWluKSB7CiAgICAgICAgICBkbWluID0gZDsKICAgICAgICAgIGNsb3Nlc3RGYWNlQSA9IGZhY2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoY2xvc2VzdEZhY2VBIDwgMCkgewogICAgICAgIHJldHVybjsKICAgICAgfSAvLyBHZXQgdGhlIGZhY2UgYW5kIGNvbnN0cnVjdCBjb25uZWN0ZWQgZmFjZXMKCgogICAgICBjb25zdCBwb2x5QSA9IGh1bGxBLmZhY2VzW2Nsb3Nlc3RGYWNlQV07CiAgICAgIHBvbHlBLmNvbm5lY3RlZEZhY2VzID0gW107CgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bGxBLmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBodWxsQS5mYWNlc1tpXS5sZW5ndGg7IGorKykgewogICAgICAgICAgaWYgKAogICAgICAgICAgLyogU2hhcmluZyBhIHZlcnRleCovCiAgICAgICAgICBwb2x5QS5pbmRleE9mKGh1bGxBLmZhY2VzW2ldW2pdKSAhPT0gLTEgJiYKICAgICAgICAgIC8qIE5vdCB0aGUgb25lIHdlIGFyZSBsb29raW5nIGZvciBjb25uZWN0aW9ucyBmcm9tICovCiAgICAgICAgICBpICE9PSBjbG9zZXN0RmFjZUEgJiYKICAgICAgICAgIC8qIE5vdCBhbHJlYWR5IGFkZGVkICovCiAgICAgICAgICBwb2x5QS5jb25uZWN0ZWRGYWNlcy5pbmRleE9mKGkpID09PSAtMSkgewogICAgICAgICAgICBwb2x5QS5jb25uZWN0ZWRGYWNlcy5wdXNoKGkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSAvLyBDbGlwIHRoZSBwb2x5Z29uIHRvIHRoZSBiYWNrIG9mIHRoZSBwbGFuZXMgb2YgYWxsIGZhY2VzIG9mIGh1bGwgQSwKICAgICAgLy8gdGhhdCBhcmUgYWRqYWNlbnQgdG8gdGhlIHdpdG5lc3MgZmFjZQoKCiAgICAgIGNvbnN0IG51bVZlcnRpY2VzQSA9IHBvbHlBLmxlbmd0aDsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmVydGljZXNBOyBpKyspIHsKICAgICAgICBjb25zdCBhID0gaHVsbEEudmVydGljZXNbcG9seUFbaV1dOwogICAgICAgIGNvbnN0IGIgPSBodWxsQS52ZXJ0aWNlc1twb2x5QVsoaSArIDEpICUgbnVtVmVydGljZXNBXV07CiAgICAgICAgYS52c3ViKGIsIGVkZ2UwKTsKICAgICAgICBXb3JsZEVkZ2UwLmNvcHkoZWRnZTApOwogICAgICAgIHF1YXRBLnZtdWx0KFdvcmxkRWRnZTAsIFdvcmxkRWRnZTApOwogICAgICAgIHBvc0EudmFkZChXb3JsZEVkZ2UwLCBXb3JsZEVkZ2UwKTsKICAgICAgICB3b3JsZFBsYW5lQW5vcm1hbDEuY29weSh0aGlzLmZhY2VOb3JtYWxzW2Nsb3Nlc3RGYWNlQV0pOwogICAgICAgIHF1YXRBLnZtdWx0KHdvcmxkUGxhbmVBbm9ybWFsMSwgd29ybGRQbGFuZUFub3JtYWwxKTsKICAgICAgICBwb3NBLnZhZGQod29ybGRQbGFuZUFub3JtYWwxLCB3b3JsZFBsYW5lQW5vcm1hbDEpOwogICAgICAgIFdvcmxkRWRnZTAuY3Jvc3Mod29ybGRQbGFuZUFub3JtYWwxLCBwbGFuZU5vcm1hbFdTMSk7CiAgICAgICAgcGxhbmVOb3JtYWxXUzEubmVnYXRlKHBsYW5lTm9ybWFsV1MxKTsKICAgICAgICB3b3JsZEExLmNvcHkoYSk7CiAgICAgICAgcXVhdEEudm11bHQod29ybGRBMSwgd29ybGRBMSk7CiAgICAgICAgcG9zQS52YWRkKHdvcmxkQTEsIHdvcmxkQTEpOwogICAgICAgIGNvbnN0IG90aGVyRmFjZSA9IHBvbHlBLmNvbm5lY3RlZEZhY2VzW2ldOwogICAgICAgIGxvY2FsUGxhbmVOb3JtYWwuY29weSh0aGlzLmZhY2VOb3JtYWxzW290aGVyRmFjZV0pOwogICAgICAgIGNvbnN0IGxvY2FsUGxhbmVFcSA9IHRoaXMuZ2V0UGxhbmVDb25zdGFudE9mRmFjZShvdGhlckZhY2UpOwogICAgICAgIHBsYW5lTm9ybWFsV1MuY29weShsb2NhbFBsYW5lTm9ybWFsKTsKICAgICAgICBxdWF0QS52bXVsdChwbGFuZU5vcm1hbFdTLCBwbGFuZU5vcm1hbFdTKTsKICAgICAgICBjb25zdCBwbGFuZUVxV1MgPSBsb2NhbFBsYW5lRXEgLSBwbGFuZU5vcm1hbFdTLmRvdChwb3NBKTsgLy8gQ2xpcCBmYWNlIGFnYWluc3Qgb3VyIGNvbnN0cnVjdGVkIHBsYW5lCgogICAgICAgIHRoaXMuY2xpcEZhY2VBZ2FpbnN0UGxhbmUocFZ0eEluLCBwVnR4T3V0LCBwbGFuZU5vcm1hbFdTLCBwbGFuZUVxV1MpOyAvLyBUaHJvdyBhd2F5IGFsbCBjbGlwcGVkIHBvaW50cywgYnV0IHNhdmUgdGhlIHJlbWFpbmluZyB1bnRpbCBuZXh0IGNsaXAKCiAgICAgICAgd2hpbGUgKHBWdHhJbi5sZW5ndGgpIHsKICAgICAgICAgIHBWdHhJbi5zaGlmdCgpOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKHBWdHhPdXQubGVuZ3RoKSB7CiAgICAgICAgICBwVnR4SW4ucHVzaChwVnR4T3V0LnNoaWZ0KCkpOwogICAgICAgIH0KICAgICAgfSAvLyBvbmx5IGtlZXAgY29udGFjdCBwb2ludHMgdGhhdCBhcmUgYmVoaW5kIHRoZSB3aXRuZXNzIGZhY2UKCgogICAgICBsb2NhbFBsYW5lTm9ybWFsLmNvcHkodGhpcy5mYWNlTm9ybWFsc1tjbG9zZXN0RmFjZUFdKTsKICAgICAgY29uc3QgbG9jYWxQbGFuZUVxID0gdGhpcy5nZXRQbGFuZUNvbnN0YW50T2ZGYWNlKGNsb3Nlc3RGYWNlQSk7CiAgICAgIHBsYW5lTm9ybWFsV1MuY29weShsb2NhbFBsYW5lTm9ybWFsKTsKICAgICAgcXVhdEEudm11bHQocGxhbmVOb3JtYWxXUywgcGxhbmVOb3JtYWxXUyk7CiAgICAgIGNvbnN0IHBsYW5lRXFXUyA9IGxvY2FsUGxhbmVFcSAtIHBsYW5lTm9ybWFsV1MuZG90KHBvc0EpOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwVnR4SW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZGVwdGggPSBwbGFuZU5vcm1hbFdTLmRvdChwVnR4SW5baV0pICsgcGxhbmVFcVdTOyAvLyA/Pz8KCiAgICAgICAgaWYgKGRlcHRoIDw9IG1pbkRpc3QpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKGBjbGFtcGVkOiBkZXB0aD0ke2RlcHRofSB0byBtaW5EaXN0PSR7bWluRGlzdH1gKTsKICAgICAgICAgIGRlcHRoID0gbWluRGlzdDsKICAgICAgICB9CgogICAgICAgIGlmIChkZXB0aCA8PSBtYXhEaXN0KSB7CiAgICAgICAgICBjb25zdCBwb2ludCA9IHBWdHhJbltpXTsKCiAgICAgICAgICBpZiAoZGVwdGggPD0gMWUtNikgewogICAgICAgICAgICBjb25zdCBwID0gewogICAgICAgICAgICAgIHBvaW50LAogICAgICAgICAgICAgIG5vcm1hbDogcGxhbmVOb3JtYWxXUywKICAgICAgICAgICAgICBkZXB0aAogICAgICAgICAgICB9OwogICAgICAgICAgICByZXN1bHQucHVzaChwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2xpcCBhIGZhY2UgaW4gYSBodWxsIGFnYWluc3QgdGhlIGJhY2sgb2YgYSBwbGFuZS4KICAgICAqIEBwYXJhbSBwbGFuZUNvbnN0YW50IFRoZSBjb25zdGFudCBpbiB0aGUgbWF0aGVtYXRpY2FsIHBsYW5lIGVxdWF0aW9uCiAgICAgKi8KCgogICAgY2xpcEZhY2VBZ2FpbnN0UGxhbmUoaW5WZXJ0aWNlcywgb3V0VmVydGljZXMsIHBsYW5lTm9ybWFsLCBwbGFuZUNvbnN0YW50KSB7CiAgICAgIGxldCBuX2RvdF9maXJzdDsKICAgICAgbGV0IG5fZG90X2xhc3Q7CiAgICAgIGNvbnN0IG51bVZlcnRzID0gaW5WZXJ0aWNlcy5sZW5ndGg7CgogICAgICBpZiAobnVtVmVydHMgPCAyKSB7CiAgICAgICAgcmV0dXJuIG91dFZlcnRpY2VzOwogICAgICB9CgogICAgICBsZXQgZmlyc3RWZXJ0ZXggPSBpblZlcnRpY2VzW2luVmVydGljZXMubGVuZ3RoIC0gMV07CiAgICAgIGxldCBsYXN0VmVydGV4ID0gaW5WZXJ0aWNlc1swXTsKICAgICAgbl9kb3RfZmlyc3QgPSBwbGFuZU5vcm1hbC5kb3QoZmlyc3RWZXJ0ZXgpICsgcGxhbmVDb25zdGFudDsKCiAgICAgIGZvciAobGV0IHZpID0gMDsgdmkgPCBudW1WZXJ0czsgdmkrKykgewogICAgICAgIGxhc3RWZXJ0ZXggPSBpblZlcnRpY2VzW3ZpXTsKICAgICAgICBuX2RvdF9sYXN0ID0gcGxhbmVOb3JtYWwuZG90KGxhc3RWZXJ0ZXgpICsgcGxhbmVDb25zdGFudDsKCiAgICAgICAgaWYgKG5fZG90X2ZpcnN0IDwgMCkgewogICAgICAgICAgaWYgKG5fZG90X2xhc3QgPCAwKSB7CiAgICAgICAgICAgIC8vIFN0YXJ0IDwgMCwgZW5kIDwgMCwgc28gb3V0cHV0IGxhc3RWZXJ0ZXgKICAgICAgICAgICAgY29uc3QgbmV3diA9IG5ldyBWZWMzKCk7CiAgICAgICAgICAgIG5ld3YuY29weShsYXN0VmVydGV4KTsKICAgICAgICAgICAgb3V0VmVydGljZXMucHVzaChuZXd2KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFN0YXJ0IDwgMCwgZW5kID49IDAsIHNvIG91dHB1dCBpbnRlcnNlY3Rpb24KICAgICAgICAgICAgY29uc3QgbmV3diA9IG5ldyBWZWMzKCk7CiAgICAgICAgICAgIGZpcnN0VmVydGV4LmxlcnAobGFzdFZlcnRleCwgbl9kb3RfZmlyc3QgLyAobl9kb3RfZmlyc3QgLSBuX2RvdF9sYXN0KSwgbmV3dik7CiAgICAgICAgICAgIG91dFZlcnRpY2VzLnB1c2gobmV3dik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChuX2RvdF9sYXN0IDwgMCkgewogICAgICAgICAgICAvLyBTdGFydCA+PSAwLCBlbmQgPCAwIHNvIG91dHB1dCBpbnRlcnNlY3Rpb24gYW5kIGVuZAogICAgICAgICAgICBjb25zdCBuZXd2ID0gbmV3IFZlYzMoKTsKICAgICAgICAgICAgZmlyc3RWZXJ0ZXgubGVycChsYXN0VmVydGV4LCBuX2RvdF9maXJzdCAvIChuX2RvdF9maXJzdCAtIG5fZG90X2xhc3QpLCBuZXd2KTsKICAgICAgICAgICAgb3V0VmVydGljZXMucHVzaChuZXd2KTsKICAgICAgICAgICAgb3V0VmVydGljZXMucHVzaChsYXN0VmVydGV4KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZpcnN0VmVydGV4ID0gbGFzdFZlcnRleDsKICAgICAgICBuX2RvdF9maXJzdCA9IG5fZG90X2xhc3Q7CiAgICAgIH0KCiAgICAgIHJldHVybiBvdXRWZXJ0aWNlczsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyBgLndvcmxkVmVydGljZXNgIGFuZCBzZXRzIGAud29ybGRWZXJ0aWNlc05lZWRzVXBkYXRlYCB0byBmYWxzZS4KICAgICAqLwoKCiAgICBjb21wdXRlV29ybGRWZXJ0aWNlcyhwb3NpdGlvbiwgcXVhdCkgewogICAgICB3aGlsZSAodGhpcy53b3JsZFZlcnRpY2VzLmxlbmd0aCA8IHRoaXMudmVydGljZXMubGVuZ3RoKSB7CiAgICAgICAgdGhpcy53b3JsZFZlcnRpY2VzLnB1c2gobmV3IFZlYzMoKSk7CiAgICAgIH0KCiAgICAgIGNvbnN0IHZlcnRzID0gdGhpcy52ZXJ0aWNlczsKICAgICAgY29uc3Qgd29ybGRWZXJ0cyA9IHRoaXMud29ybGRWZXJ0aWNlczsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcXVhdC52bXVsdCh2ZXJ0c1tpXSwgd29ybGRWZXJ0c1tpXSk7CiAgICAgICAgcG9zaXRpb24udmFkZCh3b3JsZFZlcnRzW2ldLCB3b3JsZFZlcnRzW2ldKTsKICAgICAgfQoKICAgICAgdGhpcy53b3JsZFZlcnRpY2VzTmVlZHNVcGRhdGUgPSBmYWxzZTsKICAgIH0KCiAgICBjb21wdXRlTG9jYWxBQUJCKGFhYmJtaW4sIGFhYmJtYXgpIHsKICAgICAgY29uc3QgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzOwogICAgICBhYWJibWluLnNldChOdW1iZXIuTUFYX1ZBTFVFLCBOdW1iZXIuTUFYX1ZBTFVFLCBOdW1iZXIuTUFYX1ZBTFVFKTsKICAgICAgYWFiYm1heC5zZXQoLU51bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFLCAtTnVtYmVyLk1BWF9WQUxVRSk7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCB2ID0gdmVydGljZXNbaV07CgogICAgICAgIGlmICh2LnggPCBhYWJibWluLngpIHsKICAgICAgICAgIGFhYmJtaW4ueCA9IHYueDsKICAgICAgICB9IGVsc2UgaWYgKHYueCA+IGFhYmJtYXgueCkgewogICAgICAgICAgYWFiYm1heC54ID0gdi54OwogICAgICAgIH0KCiAgICAgICAgaWYgKHYueSA8IGFhYmJtaW4ueSkgewogICAgICAgICAgYWFiYm1pbi55ID0gdi55OwogICAgICAgIH0gZWxzZSBpZiAodi55ID4gYWFiYm1heC55KSB7CiAgICAgICAgICBhYWJibWF4LnkgPSB2Lnk7CiAgICAgICAgfQoKICAgICAgICBpZiAodi56IDwgYWFiYm1pbi56KSB7CiAgICAgICAgICBhYWJibWluLnogPSB2Lno7CiAgICAgICAgfSBlbHNlIGlmICh2LnogPiBhYWJibWF4LnopIHsKICAgICAgICAgIGFhYmJtYXgueiA9IHYuejsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyBgd29ybGRWZXJ0aWNlc2AgYW5kIHNldHMgYHdvcmxkVmVydGljZXNOZWVkc1VwZGF0ZWAgdG8gZmFsc2UuCiAgICAgKi8KCgogICAgY29tcHV0ZVdvcmxkRmFjZU5vcm1hbHMocXVhdCkgewogICAgICBjb25zdCBOID0gdGhpcy5mYWNlTm9ybWFscy5sZW5ndGg7CgogICAgICB3aGlsZSAodGhpcy53b3JsZEZhY2VOb3JtYWxzLmxlbmd0aCA8IE4pIHsKICAgICAgICB0aGlzLndvcmxkRmFjZU5vcm1hbHMucHVzaChuZXcgVmVjMygpKTsKICAgICAgfQoKICAgICAgY29uc3Qgbm9ybWFscyA9IHRoaXMuZmFjZU5vcm1hbHM7CiAgICAgIGNvbnN0IHdvcmxkTm9ybWFscyA9IHRoaXMud29ybGRGYWNlTm9ybWFsczsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBOOyBpKyspIHsKICAgICAgICBxdWF0LnZtdWx0KG5vcm1hbHNbaV0sIHdvcmxkTm9ybWFsc1tpXSk7CiAgICAgIH0KCiAgICAgIHRoaXMud29ybGRGYWNlTm9ybWFsc05lZWRzVXBkYXRlID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIHVwZGF0ZUJvdW5kaW5nU3BoZXJlUmFkaXVzCiAgICAgKi8KCgogICAgdXBkYXRlQm91bmRpbmdTcGhlcmVSYWRpdXMoKSB7CiAgICAgIC8vIEFzc3VtZSBwb2ludHMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggbG9jYWwgKDAsMCwwKSBhcyBjZW50ZXIKICAgICAgbGV0IG1heDIgPSAwOwogICAgICBjb25zdCB2ZXJ0cyA9IHRoaXMudmVydGljZXM7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gdmVydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBub3JtMiA9IHZlcnRzW2ldLmxlbmd0aFNxdWFyZWQoKTsKCiAgICAgICAgaWYgKG5vcm0yID4gbWF4MikgewogICAgICAgICAgbWF4MiA9IG5vcm0yOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZVJhZGl1cyA9IE1hdGguc3FydChtYXgyKTsKICAgIH0KICAgIC8qKgogICAgICogY2FsY3VsYXRlV29ybGRBQUJCCiAgICAgKi8KCgogICAgY2FsY3VsYXRlV29ybGRBQUJCKHBvcywgcXVhdCwgbWluLCBtYXgpIHsKICAgICAgY29uc3QgdmVydHMgPSB0aGlzLnZlcnRpY2VzOwogICAgICBsZXQgbWlueDsKICAgICAgbGV0IG1pbnk7CiAgICAgIGxldCBtaW56OwogICAgICBsZXQgbWF4eDsKICAgICAgbGV0IG1heHk7CiAgICAgIGxldCBtYXh6OwogICAgICBsZXQgdGVtcFdvcmxkVmVydGV4ID0gbmV3IFZlYzMoKTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0ZW1wV29ybGRWZXJ0ZXguY29weSh2ZXJ0c1tpXSk7CiAgICAgICAgcXVhdC52bXVsdCh0ZW1wV29ybGRWZXJ0ZXgsIHRlbXBXb3JsZFZlcnRleCk7CiAgICAgICAgcG9zLnZhZGQodGVtcFdvcmxkVmVydGV4LCB0ZW1wV29ybGRWZXJ0ZXgpOwogICAgICAgIGNvbnN0IHYgPSB0ZW1wV29ybGRWZXJ0ZXg7CgogICAgICAgIGlmIChtaW54ID09PSB1bmRlZmluZWQgfHwgdi54IDwgbWlueCkgewogICAgICAgICAgbWlueCA9IHYueDsKICAgICAgICB9CgogICAgICAgIGlmIChtYXh4ID09PSB1bmRlZmluZWQgfHwgdi54ID4gbWF4eCkgewogICAgICAgICAgbWF4eCA9IHYueDsKICAgICAgICB9CgogICAgICAgIGlmIChtaW55ID09PSB1bmRlZmluZWQgfHwgdi55IDwgbWlueSkgewogICAgICAgICAgbWlueSA9IHYueTsKICAgICAgICB9CgogICAgICAgIGlmIChtYXh5ID09PSB1bmRlZmluZWQgfHwgdi55ID4gbWF4eSkgewogICAgICAgICAgbWF4eSA9IHYueTsKICAgICAgICB9CgogICAgICAgIGlmIChtaW56ID09PSB1bmRlZmluZWQgfHwgdi56IDwgbWlueikgewogICAgICAgICAgbWlueiA9IHYuejsKICAgICAgICB9CgogICAgICAgIGlmIChtYXh6ID09PSB1bmRlZmluZWQgfHwgdi56ID4gbWF4eikgewogICAgICAgICAgbWF4eiA9IHYuejsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIG1pbi5zZXQobWlueCwgbWlueSwgbWlueik7CiAgICAgIG1heC5zZXQobWF4eCwgbWF4eSwgbWF4eik7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhcHByb3hpbWF0ZSBjb252ZXggdm9sdW1lCiAgICAgKi8KCgogICAgdm9sdW1lKCkgewogICAgICByZXR1cm4gNC4wICogTWF0aC5QSSAqIHRoaXMuYm91bmRpbmdTcGhlcmVSYWRpdXMgLyAzLjA7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhbiBhdmVyYWdlIG9mIGFsbCB0aGUgdmVydGljZXMgcG9zaXRpb25zCiAgICAgKi8KCgogICAgZ2V0QXZlcmFnZVBvaW50TG9jYWwodGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRhcmdldCA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IHZlcnRzID0gdGhpcy52ZXJ0aWNlczsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0YXJnZXQudmFkZCh2ZXJ0c1tpXSwgdGFyZ2V0KTsKICAgICAgfQoKICAgICAgdGFyZ2V0LnNjYWxlKDEgLyB2ZXJ0cy5sZW5ndGgsIHRhcmdldCk7CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICAvKioKICAgICAqIFRyYW5zZm9ybSBhbGwgbG9jYWwgcG9pbnRzLiBXaWxsIGNoYW5nZSB0aGUgLnZlcnRpY2VzCiAgICAgKi8KCgogICAgdHJhbnNmb3JtQWxsUG9pbnRzKG9mZnNldCwgcXVhdCkgewogICAgICBjb25zdCBuID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7CiAgICAgIGNvbnN0IHZlcnRzID0gdGhpcy52ZXJ0aWNlczsgLy8gQXBwbHkgcm90YXRpb24KCiAgICAgIGlmIChxdWF0KSB7CiAgICAgICAgLy8gUm90YXRlIHZlcnRpY2VzCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHYgPSB2ZXJ0c1tpXTsKICAgICAgICAgIHF1YXQudm11bHQodiwgdik7CiAgICAgICAgfSAvLyBSb3RhdGUgZmFjZSBub3JtYWxzCgoKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmFjZU5vcm1hbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLmZhY2VOb3JtYWxzW2ldOwogICAgICAgICAgcXVhdC52bXVsdCh2LCB2KTsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgICAgICAvLyBSb3RhdGUgZWRnZXMKICAgICAgICAgICAgICBmb3IobGV0IGk9MDsgaTx0aGlzLnVuaXF1ZUVkZ2VzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMudW5pcXVlRWRnZXNbaV07CiAgICAgICAgICAgICAgICAgIHF1YXQudm11bHQodix2KTsKICAgICAgICAgICAgICB9Ki8KCiAgICAgIH0gLy8gQXBwbHkgb2Zmc2V0CgoKICAgICAgaWYgKG9mZnNldCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICBjb25zdCB2ID0gdmVydHNbaV07CiAgICAgICAgICB2LnZhZGQob2Zmc2V0LCB2KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgcCBpcyBpbnNpZGUgdGhlIHBvbHloZWRyYS4gTXVzdCBiZSBpbiBsb2NhbCBjb29yZHMuCiAgICAgKiBUaGUgcG9pbnQgbGllcyBvdXRzaWRlIG9mIHRoZSBjb252ZXggaHVsbCBvZiB0aGUgb3RoZXIgcG9pbnRzIGlmIGFuZCBvbmx5IGlmIHRoZSBkaXJlY3Rpb24KICAgICAqIG9mIGFsbCB0aGUgdmVjdG9ycyBmcm9tIGl0IHRvIHRob3NlIG90aGVyIHBvaW50cyBhcmUgb24gbGVzcyB0aGFuIG9uZSBoYWxmIG9mIGEgc3BoZXJlIGFyb3VuZCBpdC4KICAgICAqIEBwYXJhbSBwIEEgcG9pbnQgZ2l2ZW4gaW4gbG9jYWwgY29vcmRpbmF0ZXMKICAgICAqLwoKCiAgICBwb2ludElzSW5zaWRlKHApIHsKICAgICAgY29uc3QgdmVydHMgPSB0aGlzLnZlcnRpY2VzOwogICAgICBjb25zdCBmYWNlcyA9IHRoaXMuZmFjZXM7CiAgICAgIGNvbnN0IG5vcm1hbHMgPSB0aGlzLmZhY2VOb3JtYWxzOwogICAgICBjb25zdCBwb2ludEluc2lkZSA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMuZ2V0QXZlcmFnZVBvaW50TG9jYWwocG9pbnRJbnNpZGUpOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IG4gPSBub3JtYWxzW2ldOwogICAgICAgIGNvbnN0IHYgPSB2ZXJ0c1tmYWNlc1tpXVswXV07IC8vIFdlIG9ubHkgbmVlZCBvbmUgcG9pbnQgaW4gdGhlIGZhY2UKICAgICAgICAvLyBUaGlzIGRvdCBwcm9kdWN0IGRldGVybWluZXMgd2hpY2ggc2lkZSBvZiB0aGUgZWRnZSB0aGUgcG9pbnQgaXMKCiAgICAgICAgY29uc3QgdlRvUCA9IG5ldyBWZWMzKCk7CiAgICAgICAgcC52c3ViKHYsIHZUb1ApOwogICAgICAgIGNvbnN0IHIxID0gbi5kb3QodlRvUCk7CiAgICAgICAgY29uc3QgdlRvUG9pbnRJbnNpZGUgPSBuZXcgVmVjMygpOwogICAgICAgIHBvaW50SW5zaWRlLnZzdWIodiwgdlRvUG9pbnRJbnNpZGUpOwogICAgICAgIGNvbnN0IHIyID0gbi5kb3QodlRvUG9pbnRJbnNpZGUpOwoKICAgICAgICBpZiAocjEgPCAwICYmIHIyID4gMCB8fCByMSA+IDAgJiYgcjIgPCAwKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEVuY291bnRlcmVkIHNvbWUgb3RoZXIgc2lnbi4gRXhpdC4KICAgICAgICB9CiAgICAgIH0gLy8gSWYgd2UgZ290IGhlcmUsIGFsbCBkb3QgcHJvZHVjdHMgd2VyZSBvZiB0aGUgc2FtZSBzaWduLgoKCiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IG1heCBhbmQgbWluIGRvdCBwcm9kdWN0IG9mIGEgY29udmV4IGh1bGwgYXQgcG9zaXRpb24gKHBvcyxxdWF0KSBwcm9qZWN0ZWQgb250byBhbiBheGlzLgogICAgICogUmVzdWx0cyBhcmUgc2F2ZWQgaW4gdGhlIGFycmF5IG1heG1pbi4KICAgICAqIEBwYXJhbSByZXN1bHQgcmVzdWx0WzBdIGFuZCByZXN1bHRbMV0gd2lsbCBiZSBzZXQgdG8gbWF4aW11bSBhbmQgbWluaW11bSwgcmVzcGVjdGl2ZWx5LgogICAgICovCgoKICAgIHN0YXRpYyBwcm9qZWN0KHNoYXBlLCBheGlzLCBwb3MsIHF1YXQsIHJlc3VsdCkgewogICAgICBjb25zdCBuID0gc2hhcGUudmVydGljZXMubGVuZ3RoOwogICAgICBjb25zdCBsb2NhbEF4aXMgPSBwcm9qZWN0X2xvY2FsQXhpczsKICAgICAgbGV0IG1heCA9IDA7CiAgICAgIGxldCBtaW4gPSAwOwogICAgICBjb25zdCBsb2NhbE9yaWdpbiA9IHByb2plY3RfbG9jYWxPcmlnaW47CiAgICAgIGNvbnN0IHZzID0gc2hhcGUudmVydGljZXM7CiAgICAgIGxvY2FsT3JpZ2luLnNldFplcm8oKTsgLy8gVHJhbnNmb3JtIHRoZSBheGlzIHRvIGxvY2FsCgogICAgICBUcmFuc2Zvcm0udmVjdG9yVG9Mb2NhbEZyYW1lKHBvcywgcXVhdCwgYXhpcywgbG9jYWxBeGlzKTsKICAgICAgVHJhbnNmb3JtLnBvaW50VG9Mb2NhbEZyYW1lKHBvcywgcXVhdCwgbG9jYWxPcmlnaW4sIGxvY2FsT3JpZ2luKTsKICAgICAgY29uc3QgYWRkID0gbG9jYWxPcmlnaW4uZG90KGxvY2FsQXhpcyk7CiAgICAgIG1pbiA9IG1heCA9IHZzWzBdLmRvdChsb2NhbEF4aXMpOwoKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuOyBpKyspIHsKICAgICAgICBjb25zdCB2YWwgPSB2c1tpXS5kb3QobG9jYWxBeGlzKTsKCiAgICAgICAgaWYgKHZhbCA+IG1heCkgewogICAgICAgICAgbWF4ID0gdmFsOwogICAgICAgIH0KCiAgICAgICAgaWYgKHZhbCA8IG1pbikgewogICAgICAgICAgbWluID0gdmFsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgbWluIC09IGFkZDsKICAgICAgbWF4IC09IGFkZDsKCiAgICAgIGlmIChtaW4gPiBtYXgpIHsKICAgICAgICAvLyBJbmNvbnNpc3RlbnQgLSBzd2FwCiAgICAgICAgY29uc3QgdGVtcCA9IG1pbjsKICAgICAgICBtaW4gPSBtYXg7CiAgICAgICAgbWF4ID0gdGVtcDsKICAgICAgfSAvLyBPdXRwdXQKCgogICAgICByZXN1bHRbMF0gPSBtYXg7CiAgICAgIHJlc3VsdFsxXSA9IG1pbjsKICAgIH0KCiAgfQogIGNvbnN0IG1heG1pbkEgPSBbXTsKICBjb25zdCBtYXhtaW5CID0gW107CiAgbmV3IFZlYzMoKTsKICBjb25zdCBwcm9qZWN0X2xvY2FsQXhpcyA9IG5ldyBWZWMzKCk7CiAgY29uc3QgcHJvamVjdF9sb2NhbE9yaWdpbiA9IG5ldyBWZWMzKCk7CgogIC8qKgogICAqIEEgM2QgYm94IHNoYXBlLgogICAqIEBleGFtcGxlCiAgICogICAgIGNvbnN0IHNpemUgPSAxCiAgICogICAgIGNvbnN0IGhhbGZFeHRlbnRzID0gbmV3IENBTk5PTi5WZWMzKHNpemUsIHNpemUsIHNpemUpCiAgICogICAgIGNvbnN0IGJveFNoYXBlID0gbmV3IENBTk5PTi5Cb3goaGFsZkV4dGVudHMpCiAgICogICAgIGNvbnN0IGJveEJvZHkgPSBuZXcgQ0FOTk9OLkJvZHkoeyBtYXNzOiAxLCBzaGFwZTogYm94U2hhcGUgfSkKICAgKiAgICAgd29ybGQuYWRkQm9keShib3hCb2R5KQogICAqLwogIGNsYXNzIEJveCBleHRlbmRzIFNoYXBlIHsKICAgIC8qKgogICAgICogVGhlIGhhbGYgZXh0ZW50cyBvZiB0aGUgYm94LgogICAgICovCgogICAgLyoqCiAgICAgKiBVc2VkIGJ5IHRoZSBjb250YWN0IGdlbmVyYXRvciB0byBtYWtlIGNvbnRhY3RzIHdpdGggb3RoZXIgY29udmV4IHBvbHloZWRyYSBmb3IgZXhhbXBsZS4KICAgICAqLwogICAgY29uc3RydWN0b3IoaGFsZkV4dGVudHMpIHsKICAgICAgc3VwZXIoewogICAgICAgIHR5cGU6IFNoYXBlLnR5cGVzLkJPWAogICAgICB9KTsKICAgICAgdGhpcy5oYWxmRXh0ZW50cyA9IGhhbGZFeHRlbnRzOwogICAgICB0aGlzLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbiA9IG51bGw7CiAgICAgIHRoaXMudXBkYXRlQ29udmV4UG9seWhlZHJvblJlcHJlc2VudGF0aW9uKCk7CiAgICAgIHRoaXMudXBkYXRlQm91bmRpbmdTcGhlcmVSYWRpdXMoKTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyB0aGUgbG9jYWwgY29udmV4IHBvbHloZWRyb24gcmVwcmVzZW50YXRpb24gdXNlZCBmb3Igc29tZSBjb2xsaXNpb25zLgogICAgICovCgoKICAgIHVwZGF0ZUNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbigpIHsKICAgICAgY29uc3Qgc3ggPSB0aGlzLmhhbGZFeHRlbnRzLng7CiAgICAgIGNvbnN0IHN5ID0gdGhpcy5oYWxmRXh0ZW50cy55OwogICAgICBjb25zdCBzeiA9IHRoaXMuaGFsZkV4dGVudHMuejsKICAgICAgY29uc3QgViA9IFZlYzM7CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gW25ldyBWKC1zeCwgLXN5LCAtc3opLCBuZXcgVihzeCwgLXN5LCAtc3opLCBuZXcgVihzeCwgc3ksIC1zeiksIG5ldyBWKC1zeCwgc3ksIC1zeiksIG5ldyBWKC1zeCwgLXN5LCBzeiksIG5ldyBWKHN4LCAtc3ksIHN6KSwgbmV3IFYoc3gsIHN5LCBzeiksIG5ldyBWKC1zeCwgc3ksIHN6KV07CiAgICAgIGNvbnN0IGZhY2VzID0gW1szLCAyLCAxLCAwXSwgLy8gLXoKICAgICAgWzQsIDUsIDYsIDddLCAvLyAregogICAgICBbNSwgNCwgMCwgMV0sIC8vIC15CiAgICAgIFsyLCAzLCA3LCA2XSwgLy8gK3kKICAgICAgWzAsIDQsIDcsIDNdLCAvLyAteAogICAgICBbMSwgMiwgNiwgNV0gLy8gK3gKICAgICAgXTsKICAgICAgY29uc3QgYXhlcyA9IFtuZXcgVigwLCAwLCAxKSwgbmV3IFYoMCwgMSwgMCksIG5ldyBWKDEsIDAsIDApXTsKICAgICAgY29uc3QgaCA9IG5ldyBDb252ZXhQb2x5aGVkcm9uKHsKICAgICAgICB2ZXJ0aWNlcywKICAgICAgICBmYWNlcywKICAgICAgICBheGVzCiAgICAgIH0pOwogICAgICB0aGlzLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbiA9IGg7CiAgICAgIGgubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsOwogICAgfQogICAgLyoqCiAgICAgKiBDYWxjdWxhdGUgdGhlIGluZXJ0aWEgb2YgdGhlIGJveC4KICAgICAqLwoKCiAgICBjYWxjdWxhdGVMb2NhbEluZXJ0aWEobWFzcywgdGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRhcmdldCA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIEJveC5jYWxjdWxhdGVJbmVydGlhKHRoaXMuaGFsZkV4dGVudHMsIG1hc3MsIHRhcmdldCk7CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgc3RhdGljIGNhbGN1bGF0ZUluZXJ0aWEoaGFsZkV4dGVudHMsIG1hc3MsIHRhcmdldCkgewogICAgICBjb25zdCBlID0gaGFsZkV4dGVudHM7CiAgICAgIHRhcmdldC54ID0gMS4wIC8gMTIuMCAqIG1hc3MgKiAoMiAqIGUueSAqIDIgKiBlLnkgKyAyICogZS56ICogMiAqIGUueik7CiAgICAgIHRhcmdldC55ID0gMS4wIC8gMTIuMCAqIG1hc3MgKiAoMiAqIGUueCAqIDIgKiBlLnggKyAyICogZS56ICogMiAqIGUueik7CiAgICAgIHRhcmdldC56ID0gMS4wIC8gMTIuMCAqIG1hc3MgKiAoMiAqIGUueSAqIDIgKiBlLnkgKyAyICogZS54ICogMiAqIGUueCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgYm94IDYgc2lkZSBub3JtYWxzCiAgICAgKiBAcGFyYW0gc2l4VGFyZ2V0VmVjdG9ycyBBbiBhcnJheSBvZiA2IHZlY3RvcnMsIHRvIHN0b3JlIHRoZSByZXN1bHRpbmcgc2lkZSBub3JtYWxzIGluLgogICAgICogQHBhcmFtIHF1YXQgT3JpZW50YXRpb24gdG8gYXBwbHkgdG8gdGhlIG5vcm1hbCB2ZWN0b3JzLiBJZiBub3QgcHJvdmlkZWQsIHRoZSB2ZWN0b3JzIHdpbGwgYmUgaW4gcmVzcGVjdCB0byB0aGUgbG9jYWwgZnJhbWUuCiAgICAgKi8KCgogICAgZ2V0U2lkZU5vcm1hbHMoc2l4VGFyZ2V0VmVjdG9ycywgcXVhdCkgewogICAgICBjb25zdCBzaWRlcyA9IHNpeFRhcmdldFZlY3RvcnM7CiAgICAgIGNvbnN0IGV4ID0gdGhpcy5oYWxmRXh0ZW50czsKICAgICAgc2lkZXNbMF0uc2V0KGV4LngsIDAsIDApOwogICAgICBzaWRlc1sxXS5zZXQoMCwgZXgueSwgMCk7CiAgICAgIHNpZGVzWzJdLnNldCgwLCAwLCBleC56KTsKICAgICAgc2lkZXNbM10uc2V0KC1leC54LCAwLCAwKTsKICAgICAgc2lkZXNbNF0uc2V0KDAsIC1leC55LCAwKTsKICAgICAgc2lkZXNbNV0uc2V0KDAsIDAsIC1leC56KTsKCiAgICAgIGlmIChxdWF0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gc2lkZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHF1YXQudm11bHQoc2lkZXNbaV0sIHNpZGVzW2ldKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzaWRlczsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdm9sdW1lIG9mIHRoZSBib3guCiAgICAgKi8KCgogICAgdm9sdW1lKCkgewogICAgICByZXR1cm4gOC4wICogdGhpcy5oYWxmRXh0ZW50cy54ICogdGhpcy5oYWxmRXh0ZW50cy55ICogdGhpcy5oYWxmRXh0ZW50cy56OwogICAgfQogICAgLyoqCiAgICAgKiB1cGRhdGVCb3VuZGluZ1NwaGVyZVJhZGl1cwogICAgICovCgoKICAgIHVwZGF0ZUJvdW5kaW5nU3BoZXJlUmFkaXVzKCkgewogICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlUmFkaXVzID0gdGhpcy5oYWxmRXh0ZW50cy5sZW5ndGgoKTsKICAgIH0KICAgIC8qKgogICAgICogZm9yRWFjaFdvcmxkQ29ybmVyCiAgICAgKi8KCgogICAgZm9yRWFjaFdvcmxkQ29ybmVyKHBvcywgcXVhdCwgY2FsbGJhY2spIHsKICAgICAgY29uc3QgZSA9IHRoaXMuaGFsZkV4dGVudHM7CiAgICAgIGNvbnN0IGNvcm5lcnMgPSBbW2UueCwgZS55LCBlLnpdLCBbLWUueCwgZS55LCBlLnpdLCBbLWUueCwgLWUueSwgZS56XSwgWy1lLngsIC1lLnksIC1lLnpdLCBbZS54LCAtZS55LCAtZS56XSwgW2UueCwgZS55LCAtZS56XSwgWy1lLngsIGUueSwgLWUuel0sIFtlLngsIC1lLnksIGUuel1dOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgd29ybGRDb3JuZXJUZW1wUG9zLnNldChjb3JuZXJzW2ldWzBdLCBjb3JuZXJzW2ldWzFdLCBjb3JuZXJzW2ldWzJdKTsKICAgICAgICBxdWF0LnZtdWx0KHdvcmxkQ29ybmVyVGVtcFBvcywgd29ybGRDb3JuZXJUZW1wUG9zKTsKICAgICAgICBwb3MudmFkZCh3b3JsZENvcm5lclRlbXBQb3MsIHdvcmxkQ29ybmVyVGVtcFBvcyk7CiAgICAgICAgY2FsbGJhY2sod29ybGRDb3JuZXJUZW1wUG9zLngsIHdvcmxkQ29ybmVyVGVtcFBvcy55LCB3b3JsZENvcm5lclRlbXBQb3Mueik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogY2FsY3VsYXRlV29ybGRBQUJCCiAgICAgKi8KCgogICAgY2FsY3VsYXRlV29ybGRBQUJCKHBvcywgcXVhdCwgbWluLCBtYXgpIHsKICAgICAgY29uc3QgZSA9IHRoaXMuaGFsZkV4dGVudHM7CiAgICAgIHdvcmxkQ29ybmVyc1RlbXBbMF0uc2V0KGUueCwgZS55LCBlLnopOwogICAgICB3b3JsZENvcm5lcnNUZW1wWzFdLnNldCgtZS54LCBlLnksIGUueik7CiAgICAgIHdvcmxkQ29ybmVyc1RlbXBbMl0uc2V0KC1lLngsIC1lLnksIGUueik7CiAgICAgIHdvcmxkQ29ybmVyc1RlbXBbM10uc2V0KC1lLngsIC1lLnksIC1lLnopOwogICAgICB3b3JsZENvcm5lcnNUZW1wWzRdLnNldChlLngsIC1lLnksIC1lLnopOwogICAgICB3b3JsZENvcm5lcnNUZW1wWzVdLnNldChlLngsIGUueSwgLWUueik7CiAgICAgIHdvcmxkQ29ybmVyc1RlbXBbNl0uc2V0KC1lLngsIGUueSwgLWUueik7CiAgICAgIHdvcmxkQ29ybmVyc1RlbXBbN10uc2V0KGUueCwgLWUueSwgZS56KTsKICAgICAgY29uc3Qgd2MgPSB3b3JsZENvcm5lcnNUZW1wWzBdOwogICAgICBxdWF0LnZtdWx0KHdjLCB3Yyk7CiAgICAgIHBvcy52YWRkKHdjLCB3Yyk7CiAgICAgIG1heC5jb3B5KHdjKTsKICAgICAgbWluLmNvcHkod2MpOwoKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCA4OyBpKyspIHsKICAgICAgICBjb25zdCB3YyA9IHdvcmxkQ29ybmVyc1RlbXBbaV07CiAgICAgICAgcXVhdC52bXVsdCh3Yywgd2MpOwogICAgICAgIHBvcy52YWRkKHdjLCB3Yyk7CiAgICAgICAgY29uc3QgeCA9IHdjLng7CiAgICAgICAgY29uc3QgeSA9IHdjLnk7CiAgICAgICAgY29uc3QgeiA9IHdjLno7CgogICAgICAgIGlmICh4ID4gbWF4LngpIHsKICAgICAgICAgIG1heC54ID0geDsKICAgICAgICB9CgogICAgICAgIGlmICh5ID4gbWF4LnkpIHsKICAgICAgICAgIG1heC55ID0geTsKICAgICAgICB9CgogICAgICAgIGlmICh6ID4gbWF4LnopIHsKICAgICAgICAgIG1heC56ID0gejsKICAgICAgICB9CgogICAgICAgIGlmICh4IDwgbWluLngpIHsKICAgICAgICAgIG1pbi54ID0geDsKICAgICAgICB9CgogICAgICAgIGlmICh5IDwgbWluLnkpIHsKICAgICAgICAgIG1pbi55ID0geTsKICAgICAgICB9CgogICAgICAgIGlmICh6IDwgbWluLnopIHsKICAgICAgICAgIG1pbi56ID0gejsKICAgICAgICB9CiAgICAgIH0gLy8gR2V0IGVhY2ggYXhpcyBtYXgKICAgICAgLy8gbWluLnNldChJbmZpbml0eSxJbmZpbml0eSxJbmZpbml0eSk7CiAgICAgIC8vIG1heC5zZXQoLUluZmluaXR5LC1JbmZpbml0eSwtSW5maW5pdHkpOwogICAgICAvLyB0aGlzLmZvckVhY2hXb3JsZENvcm5lcihwb3MscXVhdCxmdW5jdGlvbih4LHkseil7CiAgICAgIC8vICAgICBpZih4ID4gbWF4LngpewogICAgICAvLyAgICAgICAgIG1heC54ID0geDsKICAgICAgLy8gICAgIH0KICAgICAgLy8gICAgIGlmKHkgPiBtYXgueSl7CiAgICAgIC8vICAgICAgICAgbWF4LnkgPSB5OwogICAgICAvLyAgICAgfQogICAgICAvLyAgICAgaWYoeiA+IG1heC56KXsKICAgICAgLy8gICAgICAgICBtYXgueiA9IHo7CiAgICAgIC8vICAgICB9CiAgICAgIC8vICAgICBpZih4IDwgbWluLngpewogICAgICAvLyAgICAgICAgIG1pbi54ID0geDsKICAgICAgLy8gICAgIH0KICAgICAgLy8gICAgIGlmKHkgPCBtaW4ueSl7CiAgICAgIC8vICAgICAgICAgbWluLnkgPSB5OwogICAgICAvLyAgICAgfQogICAgICAvLyAgICAgaWYoeiA8IG1pbi56KXsKICAgICAgLy8gICAgICAgICBtaW4ueiA9IHo7CiAgICAgIC8vICAgICB9CiAgICAgIC8vIH0pOwoKICAgIH0KCiAgfQogIGNvbnN0IHdvcmxkQ29ybmVyVGVtcFBvcyA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgd29ybGRDb3JuZXJzVGVtcCA9IFtuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpXTsKCiAgLyoqCiAgICogQk9EWV9UWVBFUwogICAqLwogIGNvbnN0IEJPRFlfVFlQRVMgPSB7CiAgICAvKiogRFlOQU1JQyAqLwogICAgRFlOQU1JQzogMSwKCiAgICAvKiogU1RBVElDICovCiAgICBTVEFUSUM6IDIsCgogICAgLyoqIEtJTkVNQVRJQyAqLwogICAgS0lORU1BVElDOiA0CiAgfTsKICAvKioKICAgKiBCb2R5VHlwZQogICAqLwoKICAvKioKICAgKiBCT0RZX1NMRUVQX1NUQVRFUwogICAqLwogIGNvbnN0IEJPRFlfU0xFRVBfU1RBVEVTID0gewogICAgLyoqIEFXQUtFICovCiAgICBBV0FLRTogMCwKCiAgICAvKiogU0xFRVBZICovCiAgICBTTEVFUFk6IDEsCgogICAgLyoqIFNMRUVQSU5HICovCiAgICBTTEVFUElORzogMgogIH07CiAgLyoqCiAgICogQm9keVNsZWVwU3RhdGUKICAgKi8KCiAgLyoqCiAgICogQmFzZSBjbGFzcyBmb3IgYWxsIGJvZHkgdHlwZXMuCiAgICogQGV4YW1wbGUKICAgKiAgICAgY29uc3Qgc2hhcGUgPSBuZXcgQ0FOTk9OLlNwaGVyZSgxKQogICAqICAgICBjb25zdCBib2R5ID0gbmV3IENBTk5PTi5Cb2R5KHsKICAgKiAgICAgICBtYXNzOiAxLAogICAqICAgICAgIHNoYXBlLAogICAqICAgICB9KQogICAqICAgICB3b3JsZC5hZGRCb2R5KGJvZHkpCiAgICovCiAgY2xhc3MgQm9keSBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgIC8qKgogICAgICogRGlzcGF0Y2hlZCBhZnRlciB0d28gYm9kaWVzIGNvbGxpZGUuIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBvbiBlYWNoCiAgICAgKiBvZiB0aGUgdHdvIGJvZGllcyBpbnZvbHZlZCBpbiB0aGUgY29sbGlzaW9uLgogICAgICogQGV2ZW50IGNvbGxpZGUKICAgICAqIEBwYXJhbSBib2R5IFRoZSBib2R5IHRoYXQgd2FzIGludm9sdmVkIGluIHRoZSBjb2xsaXNpb24uCiAgICAgKiBAcGFyYW0gY29udGFjdCBUaGUgZGV0YWlscyBvZiB0aGUgY29sbGlzaW9uLgogICAgICovCgogICAgLyoqCiAgICAgKiBBIGR5bmFtaWMgYm9keSBpcyBmdWxseSBzaW11bGF0ZWQuIENhbiBiZSBtb3ZlZCBtYW51YWxseSBieSB0aGUgdXNlciwgYnV0IG5vcm1hbGx5IHRoZXkgbW92ZSBhY2NvcmRpbmcgdG8gZm9yY2VzLiBBIGR5bmFtaWMgYm9keSBjYW4gY29sbGlkZSB3aXRoIGFsbCBib2R5IHR5cGVzLiBBIGR5bmFtaWMgYm9keSBhbHdheXMgaGFzIGZpbml0ZSwgbm9uLXplcm8gbWFzcy4KICAgICAqLwoKICAgIC8qKgogICAgICogQSBzdGF0aWMgYm9keSBkb2VzIG5vdCBtb3ZlIGR1cmluZyBzaW11bGF0aW9uIGFuZCBiZWhhdmVzIGFzIGlmIGl0IGhhcyBpbmZpbml0ZSBtYXNzLiBTdGF0aWMgYm9kaWVzIGNhbiBiZSBtb3ZlZCBtYW51YWxseSBieSBzZXR0aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgYm9keS4gVGhlIHZlbG9jaXR5IG9mIGEgc3RhdGljIGJvZHkgaXMgYWx3YXlzIHplcm8uIFN0YXRpYyBib2RpZXMgZG8gbm90IGNvbGxpZGUgd2l0aCBvdGhlciBzdGF0aWMgb3Iga2luZW1hdGljIGJvZGllcy4KICAgICAqLwoKICAgIC8qKgogICAgICogQSBraW5lbWF0aWMgYm9keSBtb3ZlcyB1bmRlciBzaW11bGF0aW9uIGFjY29yZGluZyB0byBpdHMgdmVsb2NpdHkuIFRoZXkgZG8gbm90IHJlc3BvbmQgdG8gZm9yY2VzLiBUaGV5IGNhbiBiZSBtb3ZlZCBtYW51YWxseSwgYnV0IG5vcm1hbGx5IGEga2luZW1hdGljIGJvZHkgaXMgbW92ZWQgYnkgc2V0dGluZyBpdHMgdmVsb2NpdHkuIEEga2luZW1hdGljIGJvZHkgYmVoYXZlcyBhcyBpZiBpdCBoYXMgaW5maW5pdGUgbWFzcy4gS2luZW1hdGljIGJvZGllcyBkbyBub3QgY29sbGlkZSB3aXRoIG90aGVyIHN0YXRpYyBvciBraW5lbWF0aWMgYm9kaWVzLgogICAgICovCgogICAgLyoqCiAgICAgKiBBV0FLRQogICAgICovCgogICAgLyoqCiAgICAgKiBTTEVFUFkKICAgICAqLwoKICAgIC8qKgogICAgICogU0xFRVBJTkcKICAgICAqLwoKICAgIC8qKgogICAgICogRGlzcGF0Y2hlZCBhZnRlciBhIHNsZWVwaW5nIGJvZHkgaGFzIHdva2VuIHVwLgogICAgICogQGV2ZW50IHdha2V1cAogICAgICovCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVkIGFmdGVyIGEgYm9keSBoYXMgZ29uZSBpbiB0byB0aGUgc2xlZXB5IHN0YXRlLgogICAgICogQGV2ZW50IHNsZWVweQogICAgICovCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVkIGFmdGVyIGEgYm9keSBoYXMgZmFsbGVuIGFzbGVlcC4KICAgICAqIEBldmVudCBzbGVlcAogICAgICovCiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KCiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaWQgPSBCb2R5LmlkQ291bnRlcisrOwogICAgICB0aGlzLmluZGV4ID0gLTE7CiAgICAgIHRoaXMud29ybGQgPSBudWxsOwogICAgICB0aGlzLnZsYW1iZGEgPSBuZXcgVmVjMygpOwogICAgICB0aGlzLmNvbGxpc2lvbkZpbHRlckdyb3VwID0gdHlwZW9mIG9wdGlvbnMuY29sbGlzaW9uRmlsdGVyR3JvdXAgPT09ICdudW1iZXInID8gb3B0aW9ucy5jb2xsaXNpb25GaWx0ZXJHcm91cCA6IDE7CiAgICAgIHRoaXMuY29sbGlzaW9uRmlsdGVyTWFzayA9IHR5cGVvZiBvcHRpb25zLmNvbGxpc2lvbkZpbHRlck1hc2sgPT09ICdudW1iZXInID8gb3B0aW9ucy5jb2xsaXNpb25GaWx0ZXJNYXNrIDogLTE7CiAgICAgIHRoaXMuY29sbGlzaW9uUmVzcG9uc2UgPSB0eXBlb2Ygb3B0aW9ucy5jb2xsaXNpb25SZXNwb25zZSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5jb2xsaXNpb25SZXNwb25zZSA6IHRydWU7CiAgICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVmVjMygpOwogICAgICB0aGlzLnByZXZpb3VzUG9zaXRpb24gPSBuZXcgVmVjMygpOwogICAgICB0aGlzLmludGVycG9sYXRlZFBvc2l0aW9uID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5pbml0UG9zaXRpb24gPSBuZXcgVmVjMygpOwoKICAgICAgaWYgKG9wdGlvbnMucG9zaXRpb24pIHsKICAgICAgICB0aGlzLnBvc2l0aW9uLmNvcHkob3B0aW9ucy5wb3NpdGlvbik7CiAgICAgICAgdGhpcy5wcmV2aW91c1Bvc2l0aW9uLmNvcHkob3B0aW9ucy5wb3NpdGlvbik7CiAgICAgICAgdGhpcy5pbnRlcnBvbGF0ZWRQb3NpdGlvbi5jb3B5KG9wdGlvbnMucG9zaXRpb24pOwogICAgICAgIHRoaXMuaW5pdFBvc2l0aW9uLmNvcHkob3B0aW9ucy5wb3NpdGlvbik7CiAgICAgIH0KCiAgICAgIHRoaXMudmVsb2NpdHkgPSBuZXcgVmVjMygpOwoKICAgICAgaWYgKG9wdGlvbnMudmVsb2NpdHkpIHsKICAgICAgICB0aGlzLnZlbG9jaXR5LmNvcHkob3B0aW9ucy52ZWxvY2l0eSk7CiAgICAgIH0KCiAgICAgIHRoaXMuaW5pdFZlbG9jaXR5ID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5mb3JjZSA9IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IG1hc3MgPSB0eXBlb2Ygb3B0aW9ucy5tYXNzID09PSAnbnVtYmVyJyA/IG9wdGlvbnMubWFzcyA6IDA7CiAgICAgIHRoaXMubWFzcyA9IG1hc3M7CiAgICAgIHRoaXMuaW52TWFzcyA9IG1hc3MgPiAwID8gMS4wIC8gbWFzcyA6IDA7CiAgICAgIHRoaXMubWF0ZXJpYWwgPSBvcHRpb25zLm1hdGVyaWFsIHx8IG51bGw7CiAgICAgIHRoaXMubGluZWFyRGFtcGluZyA9IHR5cGVvZiBvcHRpb25zLmxpbmVhckRhbXBpbmcgPT09ICdudW1iZXInID8gb3B0aW9ucy5saW5lYXJEYW1waW5nIDogMC4wMTsKICAgICAgdGhpcy50eXBlID0gbWFzcyA8PSAwLjAgPyBCb2R5LlNUQVRJQyA6IEJvZHkuRFlOQU1JQzsKCiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50eXBlID09PSB0eXBlb2YgQm9keS5TVEFUSUMpIHsKICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7CiAgICAgIH0KCiAgICAgIHRoaXMuYWxsb3dTbGVlcCA9IHR5cGVvZiBvcHRpb25zLmFsbG93U2xlZXAgIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucy5hbGxvd1NsZWVwIDogdHJ1ZTsKICAgICAgdGhpcy5zbGVlcFN0YXRlID0gQm9keS5BV0FLRTsKICAgICAgdGhpcy5zbGVlcFNwZWVkTGltaXQgPSB0eXBlb2Ygb3B0aW9ucy5zbGVlcFNwZWVkTGltaXQgIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucy5zbGVlcFNwZWVkTGltaXQgOiAwLjE7CiAgICAgIHRoaXMuc2xlZXBUaW1lTGltaXQgPSB0eXBlb2Ygb3B0aW9ucy5zbGVlcFRpbWVMaW1pdCAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLnNsZWVwVGltZUxpbWl0IDogMTsKICAgICAgdGhpcy50aW1lTGFzdFNsZWVweSA9IDA7CiAgICAgIHRoaXMud2FrZVVwQWZ0ZXJOYXJyb3dwaGFzZSA9IGZhbHNlOwogICAgICB0aGlzLnRvcnF1ZSA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMucXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIHRoaXMuaW5pdFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOwogICAgICB0aGlzLnByZXZpb3VzUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIHRoaXMuaW50ZXJwb2xhdGVkUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CgogICAgICBpZiAob3B0aW9ucy5xdWF0ZXJuaW9uKSB7CiAgICAgICAgdGhpcy5xdWF0ZXJuaW9uLmNvcHkob3B0aW9ucy5xdWF0ZXJuaW9uKTsKICAgICAgICB0aGlzLmluaXRRdWF0ZXJuaW9uLmNvcHkob3B0aW9ucy5xdWF0ZXJuaW9uKTsKICAgICAgICB0aGlzLnByZXZpb3VzUXVhdGVybmlvbi5jb3B5KG9wdGlvbnMucXVhdGVybmlvbik7CiAgICAgICAgdGhpcy5pbnRlcnBvbGF0ZWRRdWF0ZXJuaW9uLmNvcHkob3B0aW9ucy5xdWF0ZXJuaW9uKTsKICAgICAgfQoKICAgICAgdGhpcy5hbmd1bGFyVmVsb2NpdHkgPSBuZXcgVmVjMygpOwoKICAgICAgaWYgKG9wdGlvbnMuYW5ndWxhclZlbG9jaXR5KSB7CiAgICAgICAgdGhpcy5hbmd1bGFyVmVsb2NpdHkuY29weShvcHRpb25zLmFuZ3VsYXJWZWxvY2l0eSk7CiAgICAgIH0KCiAgICAgIHRoaXMuaW5pdEFuZ3VsYXJWZWxvY2l0eSA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMuc2hhcGVzID0gW107CiAgICAgIHRoaXMuc2hhcGVPZmZzZXRzID0gW107CiAgICAgIHRoaXMuc2hhcGVPcmllbnRhdGlvbnMgPSBbXTsKICAgICAgdGhpcy5pbmVydGlhID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5pbnZJbmVydGlhID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5pbnZJbmVydGlhV29ybGQgPSBuZXcgTWF0MygpOwogICAgICB0aGlzLmludk1hc3NTb2x2ZSA9IDA7CiAgICAgIHRoaXMuaW52SW5lcnRpYVNvbHZlID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5pbnZJbmVydGlhV29ybGRTb2x2ZSA9IG5ldyBNYXQzKCk7CiAgICAgIHRoaXMuZml4ZWRSb3RhdGlvbiA9IHR5cGVvZiBvcHRpb25zLmZpeGVkUm90YXRpb24gIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucy5maXhlZFJvdGF0aW9uIDogZmFsc2U7CiAgICAgIHRoaXMuYW5ndWxhckRhbXBpbmcgPSB0eXBlb2Ygb3B0aW9ucy5hbmd1bGFyRGFtcGluZyAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLmFuZ3VsYXJEYW1waW5nIDogMC4wMTsKICAgICAgdGhpcy5saW5lYXJGYWN0b3IgPSBuZXcgVmVjMygxLCAxLCAxKTsKCiAgICAgIGlmIChvcHRpb25zLmxpbmVhckZhY3RvcikgewogICAgICAgIHRoaXMubGluZWFyRmFjdG9yLmNvcHkob3B0aW9ucy5saW5lYXJGYWN0b3IpOwogICAgICB9CgogICAgICB0aGlzLmFuZ3VsYXJGYWN0b3IgPSBuZXcgVmVjMygxLCAxLCAxKTsKCiAgICAgIGlmIChvcHRpb25zLmFuZ3VsYXJGYWN0b3IpIHsKICAgICAgICB0aGlzLmFuZ3VsYXJGYWN0b3IuY29weShvcHRpb25zLmFuZ3VsYXJGYWN0b3IpOwogICAgICB9CgogICAgICB0aGlzLmFhYmIgPSBuZXcgQUFCQigpOwogICAgICB0aGlzLmFhYmJOZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIHRoaXMuYm91bmRpbmdSYWRpdXMgPSAwOwogICAgICB0aGlzLndsYW1iZGEgPSBuZXcgVmVjMygpOwogICAgICB0aGlzLmlzVHJpZ2dlciA9IEJvb2xlYW4ob3B0aW9ucy5pc1RyaWdnZXIpOwoKICAgICAgaWYgKG9wdGlvbnMuc2hhcGUpIHsKICAgICAgICB0aGlzLmFkZFNoYXBlKG9wdGlvbnMuc2hhcGUpOwogICAgICB9CgogICAgICB0aGlzLnVwZGF0ZU1hc3NQcm9wZXJ0aWVzKCk7CiAgICB9CiAgICAvKioKICAgICAqIFdha2UgdGhlIGJvZHkgdXAuCiAgICAgKi8KCgogICAgd2FrZVVwKCkgewogICAgICBjb25zdCBwcmV2U3RhdGUgPSB0aGlzLnNsZWVwU3RhdGU7CiAgICAgIHRoaXMuc2xlZXBTdGF0ZSA9IEJvZHkuQVdBS0U7CiAgICAgIHRoaXMud2FrZVVwQWZ0ZXJOYXJyb3dwaGFzZSA9IGZhbHNlOwoKICAgICAgaWYgKHByZXZTdGF0ZSA9PT0gQm9keS5TTEVFUElORykgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChCb2R5Lndha2V1cEV2ZW50KTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGb3JjZSBib2R5IHNsZWVwCiAgICAgKi8KCgogICAgc2xlZXAoKSB7CiAgICAgIHRoaXMuc2xlZXBTdGF0ZSA9IEJvZHkuU0xFRVBJTkc7CiAgICAgIHRoaXMudmVsb2NpdHkuc2V0KDAsIDAsIDApOwogICAgICB0aGlzLmFuZ3VsYXJWZWxvY2l0eS5zZXQoMCwgMCwgMCk7CiAgICAgIHRoaXMud2FrZVVwQWZ0ZXJOYXJyb3dwaGFzZSA9IGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBDYWxsZWQgZXZlcnkgdGltZXN0ZXAgdG8gdXBkYXRlIGludGVybmFsIHNsZWVwIHRpbWVyIGFuZCBjaGFuZ2Ugc2xlZXAgc3RhdGUgaWYgbmVlZGVkLgogICAgICogQHBhcmFtIHRpbWUgVGhlIHdvcmxkIHRpbWUgaW4gc2Vjb25kcwogICAgICovCgoKICAgIHNsZWVwVGljayh0aW1lKSB7CiAgICAgIGlmICh0aGlzLmFsbG93U2xlZXApIHsKICAgICAgICBjb25zdCBzbGVlcFN0YXRlID0gdGhpcy5zbGVlcFN0YXRlOwogICAgICAgIGNvbnN0IHNwZWVkU3F1YXJlZCA9IHRoaXMudmVsb2NpdHkubGVuZ3RoU3F1YXJlZCgpICsgdGhpcy5hbmd1bGFyVmVsb2NpdHkubGVuZ3RoU3F1YXJlZCgpOwogICAgICAgIGNvbnN0IHNwZWVkTGltaXRTcXVhcmVkID0gdGhpcy5zbGVlcFNwZWVkTGltaXQgKiogMjsKCiAgICAgICAgaWYgKHNsZWVwU3RhdGUgPT09IEJvZHkuQVdBS0UgJiYgc3BlZWRTcXVhcmVkIDwgc3BlZWRMaW1pdFNxdWFyZWQpIHsKICAgICAgICAgIHRoaXMuc2xlZXBTdGF0ZSA9IEJvZHkuU0xFRVBZOyAvLyBTbGVlcHkKCiAgICAgICAgICB0aGlzLnRpbWVMYXN0U2xlZXB5ID0gdGltZTsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChCb2R5LnNsZWVweUV2ZW50KTsKICAgICAgICB9IGVsc2UgaWYgKHNsZWVwU3RhdGUgPT09IEJvZHkuU0xFRVBZICYmIHNwZWVkU3F1YXJlZCA+IHNwZWVkTGltaXRTcXVhcmVkKSB7CiAgICAgICAgICB0aGlzLndha2VVcCgpOyAvLyBXYWtlIHVwCiAgICAgICAgfSBlbHNlIGlmIChzbGVlcFN0YXRlID09PSBCb2R5LlNMRUVQWSAmJiB0aW1lIC0gdGhpcy50aW1lTGFzdFNsZWVweSA+IHRoaXMuc2xlZXBUaW1lTGltaXQpIHsKICAgICAgICAgIHRoaXMuc2xlZXAoKTsgLy8gU2xlZXBpbmcKCiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoQm9keS5zbGVlcEV2ZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogSWYgdGhlIGJvZHkgaXMgc2xlZXBpbmcsIGl0IHNob3VsZCBiZSBpbW1vdmFibGUgLyBoYXZlIGluZmluaXRlIG1hc3MgZHVyaW5nIHNvbHZlLiBXZSBzb2x2ZSBpdCBieSBoYXZpbmcgYSBzZXBhcmF0ZSAic29sdmUgbWFzcyIuCiAgICAgKi8KCgogICAgdXBkYXRlU29sdmVNYXNzUHJvcGVydGllcygpIHsKICAgICAgaWYgKHRoaXMuc2xlZXBTdGF0ZSA9PT0gQm9keS5TTEVFUElORyB8fCB0aGlzLnR5cGUgPT09IEJvZHkuS0lORU1BVElDKSB7CiAgICAgICAgdGhpcy5pbnZNYXNzU29sdmUgPSAwOwogICAgICAgIHRoaXMuaW52SW5lcnRpYVNvbHZlLnNldFplcm8oKTsKICAgICAgICB0aGlzLmludkluZXJ0aWFXb3JsZFNvbHZlLnNldFplcm8oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmludk1hc3NTb2x2ZSA9IHRoaXMuaW52TWFzczsKICAgICAgICB0aGlzLmludkluZXJ0aWFTb2x2ZS5jb3B5KHRoaXMuaW52SW5lcnRpYSk7CiAgICAgICAgdGhpcy5pbnZJbmVydGlhV29ybGRTb2x2ZS5jb3B5KHRoaXMuaW52SW5lcnRpYVdvcmxkKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb252ZXJ0IGEgd29ybGQgcG9pbnQgdG8gbG9jYWwgYm9keSBmcmFtZS4KICAgICAqLwoKCiAgICBwb2ludFRvTG9jYWxGcmFtZSh3b3JsZFBvaW50LCByZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmVzdWx0ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgd29ybGRQb2ludC52c3ViKHRoaXMucG9zaXRpb24sIHJlc3VsdCk7CiAgICAgIHRoaXMucXVhdGVybmlvbi5jb25qdWdhdGUoKS52bXVsdChyZXN1bHQsIHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnQgYSB3b3JsZCB2ZWN0b3IgdG8gbG9jYWwgYm9keSBmcmFtZS4KICAgICAqLwoKCiAgICB2ZWN0b3JUb0xvY2FsRnJhbWUod29ybGRWZWN0b3IsIHJlc3VsdCkgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHsKICAgICAgICByZXN1bHQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICB0aGlzLnF1YXRlcm5pb24uY29uanVnYXRlKCkudm11bHQod29ybGRWZWN0b3IsIHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnQgYSBsb2NhbCBib2R5IHBvaW50IHRvIHdvcmxkIGZyYW1lLgogICAgICovCgoKICAgIHBvaW50VG9Xb3JsZEZyYW1lKGxvY2FsUG9pbnQsIHJlc3VsdCkgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHsKICAgICAgICByZXN1bHQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICB0aGlzLnF1YXRlcm5pb24udm11bHQobG9jYWxQb2ludCwgcmVzdWx0KTsKICAgICAgcmVzdWx0LnZhZGQodGhpcy5wb3NpdGlvbiwgcmVzdWx0KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogQ29udmVydCBhIGxvY2FsIGJvZHkgcG9pbnQgdG8gd29ybGQgZnJhbWUuCiAgICAgKi8KCgogICAgdmVjdG9yVG9Xb3JsZEZyYW1lKGxvY2FsVmVjdG9yLCByZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmVzdWx0ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgdGhpcy5xdWF0ZXJuaW9uLnZtdWx0KGxvY2FsVmVjdG9yLCByZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSBzaGFwZSB0byB0aGUgYm9keSB3aXRoIGEgbG9jYWwgb2Zmc2V0IGFuZCBvcmllbnRhdGlvbi4KICAgICAqIEByZXR1cm4gVGhlIGJvZHkgb2JqZWN0LCBmb3IgY2hhaW5hYmlsaXR5LgogICAgICovCgoKICAgIGFkZFNoYXBlKHNoYXBlLCBfb2Zmc2V0LCBfb3JpZW50YXRpb24pIHsKICAgICAgY29uc3Qgb2Zmc2V0ID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSBuZXcgUXVhdGVybmlvbigpOwoKICAgICAgaWYgKF9vZmZzZXQpIHsKICAgICAgICBvZmZzZXQuY29weShfb2Zmc2V0KTsKICAgICAgfQoKICAgICAgaWYgKF9vcmllbnRhdGlvbikgewogICAgICAgIG9yaWVudGF0aW9uLmNvcHkoX29yaWVudGF0aW9uKTsKICAgICAgfQoKICAgICAgdGhpcy5zaGFwZXMucHVzaChzaGFwZSk7CiAgICAgIHRoaXMuc2hhcGVPZmZzZXRzLnB1c2gob2Zmc2V0KTsKICAgICAgdGhpcy5zaGFwZU9yaWVudGF0aW9ucy5wdXNoKG9yaWVudGF0aW9uKTsKICAgICAgdGhpcy51cGRhdGVNYXNzUHJvcGVydGllcygpOwogICAgICB0aGlzLnVwZGF0ZUJvdW5kaW5nUmFkaXVzKCk7CiAgICAgIHRoaXMuYWFiYk5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgc2hhcGUuYm9keSA9IHRoaXM7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgYSBzaGFwZSBmcm9tIHRoZSBib2R5LgogICAgICogQHJldHVybiBUaGUgYm9keSBvYmplY3QsIGZvciBjaGFpbmFiaWxpdHkuCiAgICAgKi8KCgogICAgcmVtb3ZlU2hhcGUoc2hhcGUpIHsKICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNoYXBlcy5pbmRleE9mKHNoYXBlKTsKCiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ1NoYXBlIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgYm9keScpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CgogICAgICB0aGlzLnNoYXBlcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICB0aGlzLnNoYXBlT2Zmc2V0cy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICB0aGlzLnNoYXBlT3JpZW50YXRpb25zLnNwbGljZShpbmRleCwgMSk7CiAgICAgIHRoaXMudXBkYXRlTWFzc1Byb3BlcnRpZXMoKTsKICAgICAgdGhpcy51cGRhdGVCb3VuZGluZ1JhZGl1cygpOwogICAgICB0aGlzLmFhYmJOZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIHNoYXBlLmJvZHkgPSBudWxsOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIHRoZSBib3VuZGluZyByYWRpdXMgb2YgdGhlIGJvZHkuIFNob3VsZCBiZSBkb25lIGlmIGFueSBvZiB0aGUgc2hhcGVzIGFyZSBjaGFuZ2VkLgogICAgICovCgoKICAgIHVwZGF0ZUJvdW5kaW5nUmFkaXVzKCkgewogICAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnNoYXBlczsKICAgICAgY29uc3Qgc2hhcGVPZmZzZXRzID0gdGhpcy5zaGFwZU9mZnNldHM7CiAgICAgIGNvbnN0IE4gPSBzaGFwZXMubGVuZ3RoOwogICAgICBsZXQgcmFkaXVzID0gMDsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBOOyBpKyspIHsKICAgICAgICBjb25zdCBzaGFwZSA9IHNoYXBlc1tpXTsKICAgICAgICBzaGFwZS51cGRhdGVCb3VuZGluZ1NwaGVyZVJhZGl1cygpOwogICAgICAgIGNvbnN0IG9mZnNldCA9IHNoYXBlT2Zmc2V0c1tpXS5sZW5ndGgoKTsKICAgICAgICBjb25zdCByID0gc2hhcGUuYm91bmRpbmdTcGhlcmVSYWRpdXM7CgogICAgICAgIGlmIChvZmZzZXQgKyByID4gcmFkaXVzKSB7CiAgICAgICAgICByYWRpdXMgPSBvZmZzZXQgKyByOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGhpcy5ib3VuZGluZ1JhZGl1cyA9IHJhZGl1czsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyB0aGUgLmFhYmIKICAgICAqLwoKCiAgICB1cGRhdGVBQUJCKCkgewogICAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnNoYXBlczsKICAgICAgY29uc3Qgc2hhcGVPZmZzZXRzID0gdGhpcy5zaGFwZU9mZnNldHM7CiAgICAgIGNvbnN0IHNoYXBlT3JpZW50YXRpb25zID0gdGhpcy5zaGFwZU9yaWVudGF0aW9uczsKICAgICAgY29uc3QgTiA9IHNoYXBlcy5sZW5ndGg7CiAgICAgIGNvbnN0IG9mZnNldCA9IHRtcFZlYzsKICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB0bXBRdWF0OwogICAgICBjb25zdCBib2R5UXVhdCA9IHRoaXMucXVhdGVybmlvbjsKICAgICAgY29uc3QgYWFiYiA9IHRoaXMuYWFiYjsKICAgICAgY29uc3Qgc2hhcGVBQUJCID0gdXBkYXRlQUFCQl9zaGFwZUFBQkI7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gTjsgaSsrKSB7CiAgICAgICAgY29uc3Qgc2hhcGUgPSBzaGFwZXNbaV07IC8vIEdldCBzaGFwZSB3b3JsZCBwb3NpdGlvbgoKICAgICAgICBib2R5UXVhdC52bXVsdChzaGFwZU9mZnNldHNbaV0sIG9mZnNldCk7CiAgICAgICAgb2Zmc2V0LnZhZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTsgLy8gR2V0IHNoYXBlIHdvcmxkIHF1YXRlcm5pb24KCiAgICAgICAgYm9keVF1YXQubXVsdChzaGFwZU9yaWVudGF0aW9uc1tpXSwgb3JpZW50YXRpb24pOyAvLyBHZXQgc2hhcGUgQUFCQgoKICAgICAgICBzaGFwZS5jYWxjdWxhdGVXb3JsZEFBQkIob2Zmc2V0LCBvcmllbnRhdGlvbiwgc2hhcGVBQUJCLmxvd2VyQm91bmQsIHNoYXBlQUFCQi51cHBlckJvdW5kKTsKCiAgICAgICAgaWYgKGkgPT09IDApIHsKICAgICAgICAgIGFhYmIuY29weShzaGFwZUFBQkIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhYWJiLmV4dGVuZChzaGFwZUFBQkIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGhpcy5hYWJiTmVlZHNVcGRhdGUgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGAuaW5lcnRpYVdvcmxkYCBhbmQgYC5pbnZJbmVydGlhV29ybGRgCiAgICAgKi8KCgogICAgdXBkYXRlSW5lcnRpYVdvcmxkKGZvcmNlKSB7CiAgICAgIGNvbnN0IEkgPSB0aGlzLmludkluZXJ0aWE7CgogICAgICBpZiAoSS54ID09PSBJLnkgJiYgSS55ID09PSBJLnogJiYgIWZvcmNlKSA7IGVsc2UgewogICAgICAgIGNvbnN0IG0xID0gdWl3X20xOwogICAgICAgIGNvbnN0IG0yID0gdWl3X20yOwogICAgICAgIG0xLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKTsKICAgICAgICBtMS50cmFuc3Bvc2UobTIpOwogICAgICAgIG0xLnNjYWxlKEksIG0xKTsKICAgICAgICBtMS5tbXVsdChtMiwgdGhpcy5pbnZJbmVydGlhV29ybGQpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFwcGx5IGZvcmNlIHRvIGEgcG9pbnQgb2YgdGhlIGJvZHkuIFRoaXMgY291bGQgZm9yIGV4YW1wbGUgYmUgYSBwb2ludCBvbiB0aGUgQm9keSBzdXJmYWNlLgogICAgICogQXBwbHlpbmcgZm9yY2UgdGhpcyB3YXkgd2lsbCBhZGQgdG8gQm9keS5mb3JjZSBhbmQgQm9keS50b3JxdWUuCiAgICAgKiBAcGFyYW0gZm9yY2UgVGhlIGFtb3VudCBvZiBmb3JjZSB0byBhZGQuCiAgICAgKiBAcGFyYW0gcmVsYXRpdmVQb2ludCBBIHBvaW50IHJlbGF0aXZlIHRvIHRoZSBjZW50ZXIgb2YgbWFzcyB0byBhcHBseSB0aGUgZm9yY2Ugb24uCiAgICAgKi8KCgogICAgYXBwbHlGb3JjZShmb3JjZSwgcmVsYXRpdmVQb2ludCkgewogICAgICBpZiAocmVsYXRpdmVQb2ludCA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmVsYXRpdmVQb2ludCA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIC8vIE5lZWRlZD8KICAgICAgaWYgKHRoaXMudHlwZSAhPT0gQm9keS5EWU5BTUlDKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAodGhpcy5zbGVlcFN0YXRlID09PSBCb2R5LlNMRUVQSU5HKSB7CiAgICAgICAgdGhpcy53YWtlVXAoKTsKICAgICAgfSAvLyBDb21wdXRlIHByb2R1Y2VkIHJvdGF0aW9uYWwgZm9yY2UKCgogICAgICBjb25zdCByb3RGb3JjZSA9IEJvZHlfYXBwbHlGb3JjZV9yb3RGb3JjZTsKICAgICAgcmVsYXRpdmVQb2ludC5jcm9zcyhmb3JjZSwgcm90Rm9yY2UpOyAvLyBBZGQgbGluZWFyIGZvcmNlCgogICAgICB0aGlzLmZvcmNlLnZhZGQoZm9yY2UsIHRoaXMuZm9yY2UpOyAvLyBBZGQgcm90YXRpb25hbCBmb3JjZQoKICAgICAgdGhpcy50b3JxdWUudmFkZChyb3RGb3JjZSwgdGhpcy50b3JxdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBBcHBseSBmb3JjZSB0byBhIGxvY2FsIHBvaW50IGluIHRoZSBib2R5LgogICAgICogQHBhcmFtIGZvcmNlIFRoZSBmb3JjZSB2ZWN0b3IgdG8gYXBwbHksIGRlZmluZWQgbG9jYWxseSBpbiB0aGUgYm9keSBmcmFtZS4KICAgICAqIEBwYXJhbSBsb2NhbFBvaW50IEEgbG9jYWwgcG9pbnQgaW4gdGhlIGJvZHkgdG8gYXBwbHkgdGhlIGZvcmNlIG9uLgogICAgICovCgoKICAgIGFwcGx5TG9jYWxGb3JjZShsb2NhbEZvcmNlLCBsb2NhbFBvaW50KSB7CiAgICAgIGlmIChsb2NhbFBvaW50ID09PSB2b2lkIDApIHsKICAgICAgICBsb2NhbFBvaW50ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgaWYgKHRoaXMudHlwZSAhPT0gQm9keS5EWU5BTUlDKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCB3b3JsZEZvcmNlID0gQm9keV9hcHBseUxvY2FsRm9yY2Vfd29ybGRGb3JjZTsKICAgICAgY29uc3QgcmVsYXRpdmVQb2ludFdvcmxkID0gQm9keV9hcHBseUxvY2FsRm9yY2VfcmVsYXRpdmVQb2ludFdvcmxkOyAvLyBUcmFuc2Zvcm0gdGhlIGZvcmNlIHZlY3RvciB0byB3b3JsZCBzcGFjZQoKICAgICAgdGhpcy52ZWN0b3JUb1dvcmxkRnJhbWUobG9jYWxGb3JjZSwgd29ybGRGb3JjZSk7CiAgICAgIHRoaXMudmVjdG9yVG9Xb3JsZEZyYW1lKGxvY2FsUG9pbnQsIHJlbGF0aXZlUG9pbnRXb3JsZCk7CiAgICAgIHRoaXMuYXBwbHlGb3JjZSh3b3JsZEZvcmNlLCByZWxhdGl2ZVBvaW50V29ybGQpOwogICAgfQogICAgLyoqCiAgICAgKiBBcHBseSB0b3JxdWUgdG8gdGhlIGJvZHkuCiAgICAgKiBAcGFyYW0gdG9ycXVlIFRoZSBhbW91bnQgb2YgdG9ycXVlIHRvIGFkZC4KICAgICAqLwoKCiAgICBhcHBseVRvcnF1ZSh0b3JxdWUpIHsKICAgICAgaWYgKHRoaXMudHlwZSAhPT0gQm9keS5EWU5BTUlDKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAodGhpcy5zbGVlcFN0YXRlID09PSBCb2R5LlNMRUVQSU5HKSB7CiAgICAgICAgdGhpcy53YWtlVXAoKTsKICAgICAgfSAvLyBBZGQgcm90YXRpb25hbCBmb3JjZQoKCiAgICAgIHRoaXMudG9ycXVlLnZhZGQodG9ycXVlLCB0aGlzLnRvcnF1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGx5IGltcHVsc2UgdG8gYSBwb2ludCBvZiB0aGUgYm9keS4gVGhpcyBjb3VsZCBmb3IgZXhhbXBsZSBiZSBhIHBvaW50IG9uIHRoZSBCb2R5IHN1cmZhY2UuCiAgICAgKiBBbiBpbXB1bHNlIGlzIGEgZm9yY2UgYWRkZWQgdG8gYSBib2R5IGR1cmluZyBhIHNob3J0IHBlcmlvZCBvZiB0aW1lIChpbXB1bHNlID0gZm9yY2UgKiB0aW1lKS4KICAgICAqIEltcHVsc2VzIHdpbGwgYmUgYWRkZWQgdG8gQm9keS52ZWxvY2l0eSBhbmQgQm9keS5hbmd1bGFyVmVsb2NpdHkuCiAgICAgKiBAcGFyYW0gaW1wdWxzZSBUaGUgYW1vdW50IG9mIGltcHVsc2UgdG8gYWRkLgogICAgICogQHBhcmFtIHJlbGF0aXZlUG9pbnQgQSBwb2ludCByZWxhdGl2ZSB0byB0aGUgY2VudGVyIG9mIG1hc3MgdG8gYXBwbHkgdGhlIGZvcmNlIG9uLgogICAgICovCgoKICAgIGFwcGx5SW1wdWxzZShpbXB1bHNlLCByZWxhdGl2ZVBvaW50KSB7CiAgICAgIGlmIChyZWxhdGl2ZVBvaW50ID09PSB2b2lkIDApIHsKICAgICAgICByZWxhdGl2ZVBvaW50ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgaWYgKHRoaXMudHlwZSAhPT0gQm9keS5EWU5BTUlDKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAodGhpcy5zbGVlcFN0YXRlID09PSBCb2R5LlNMRUVQSU5HKSB7CiAgICAgICAgdGhpcy53YWtlVXAoKTsKICAgICAgfSAvLyBDb21wdXRlIHBvaW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBib2R5IGNlbnRlcgoKCiAgICAgIGNvbnN0IHIgPSByZWxhdGl2ZVBvaW50OyAvLyBDb21wdXRlIHByb2R1Y2VkIGNlbnRyYWwgaW1wdWxzZSB2ZWxvY2l0eQoKICAgICAgY29uc3QgdmVsbyA9IEJvZHlfYXBwbHlJbXB1bHNlX3ZlbG87CiAgICAgIHZlbG8uY29weShpbXB1bHNlKTsKICAgICAgdmVsby5zY2FsZSh0aGlzLmludk1hc3MsIHZlbG8pOyAvLyBBZGQgbGluZWFyIGltcHVsc2UKCiAgICAgIHRoaXMudmVsb2NpdHkudmFkZCh2ZWxvLCB0aGlzLnZlbG9jaXR5KTsgLy8gQ29tcHV0ZSBwcm9kdWNlZCByb3RhdGlvbmFsIGltcHVsc2UgdmVsb2NpdHkKCiAgICAgIGNvbnN0IHJvdFZlbG8gPSBCb2R5X2FwcGx5SW1wdWxzZV9yb3RWZWxvOwogICAgICByLmNyb3NzKGltcHVsc2UsIHJvdFZlbG8pOwogICAgICAvKgogICAgICAgcm90VmVsby54ICo9IHRoaXMuaW52SW5lcnRpYS54OwogICAgICAgcm90VmVsby55ICo9IHRoaXMuaW52SW5lcnRpYS55OwogICAgICAgcm90VmVsby56ICo9IHRoaXMuaW52SW5lcnRpYS56OwogICAgICAgKi8KCiAgICAgIHRoaXMuaW52SW5lcnRpYVdvcmxkLnZtdWx0KHJvdFZlbG8sIHJvdFZlbG8pOyAvLyBBZGQgcm90YXRpb25hbCBJbXB1bHNlCgogICAgICB0aGlzLmFuZ3VsYXJWZWxvY2l0eS52YWRkKHJvdFZlbG8sIHRoaXMuYW5ndWxhclZlbG9jaXR5KTsKICAgIH0KICAgIC8qKgogICAgICogQXBwbHkgbG9jYWxseS1kZWZpbmVkIGltcHVsc2UgdG8gYSBsb2NhbCBwb2ludCBpbiB0aGUgYm9keS4KICAgICAqIEBwYXJhbSBmb3JjZSBUaGUgZm9yY2UgdmVjdG9yIHRvIGFwcGx5LCBkZWZpbmVkIGxvY2FsbHkgaW4gdGhlIGJvZHkgZnJhbWUuCiAgICAgKiBAcGFyYW0gbG9jYWxQb2ludCBBIGxvY2FsIHBvaW50IGluIHRoZSBib2R5IHRvIGFwcGx5IHRoZSBmb3JjZSBvbi4KICAgICAqLwoKCiAgICBhcHBseUxvY2FsSW1wdWxzZShsb2NhbEltcHVsc2UsIGxvY2FsUG9pbnQpIHsKICAgICAgaWYgKGxvY2FsUG9pbnQgPT09IHZvaWQgMCkgewogICAgICAgIGxvY2FsUG9pbnQgPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICBpZiAodGhpcy50eXBlICE9PSBCb2R5LkRZTkFNSUMpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IHdvcmxkSW1wdWxzZSA9IEJvZHlfYXBwbHlMb2NhbEltcHVsc2Vfd29ybGRJbXB1bHNlOwogICAgICBjb25zdCByZWxhdGl2ZVBvaW50V29ybGQgPSBCb2R5X2FwcGx5TG9jYWxJbXB1bHNlX3JlbGF0aXZlUG9pbnQ7IC8vIFRyYW5zZm9ybSB0aGUgZm9yY2UgdmVjdG9yIHRvIHdvcmxkIHNwYWNlCgogICAgICB0aGlzLnZlY3RvclRvV29ybGRGcmFtZShsb2NhbEltcHVsc2UsIHdvcmxkSW1wdWxzZSk7CiAgICAgIHRoaXMudmVjdG9yVG9Xb3JsZEZyYW1lKGxvY2FsUG9pbnQsIHJlbGF0aXZlUG9pbnRXb3JsZCk7CiAgICAgIHRoaXMuYXBwbHlJbXB1bHNlKHdvcmxkSW1wdWxzZSwgcmVsYXRpdmVQb2ludFdvcmxkKTsKICAgIH0KICAgIC8qKgogICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB5b3UgY2hhbmdlIHRoZSBib2R5IHNoYXBlIG9yIG1hc3MuCiAgICAgKi8KCgogICAgdXBkYXRlTWFzc1Byb3BlcnRpZXMoKSB7CiAgICAgIGNvbnN0IGhhbGZFeHRlbnRzID0gQm9keV91cGRhdGVNYXNzUHJvcGVydGllc19oYWxmRXh0ZW50czsKICAgICAgdGhpcy5pbnZNYXNzID0gdGhpcy5tYXNzID4gMCA/IDEuMCAvIHRoaXMubWFzcyA6IDA7CiAgICAgIGNvbnN0IEkgPSB0aGlzLmluZXJ0aWE7CiAgICAgIGNvbnN0IGZpeGVkID0gdGhpcy5maXhlZFJvdGF0aW9uOyAvLyBBcHByb3hpbWF0ZSB3aXRoIEFBQkIgYm94CgogICAgICB0aGlzLnVwZGF0ZUFBQkIoKTsKICAgICAgaGFsZkV4dGVudHMuc2V0KCh0aGlzLmFhYmIudXBwZXJCb3VuZC54IC0gdGhpcy5hYWJiLmxvd2VyQm91bmQueCkgLyAyLCAodGhpcy5hYWJiLnVwcGVyQm91bmQueSAtIHRoaXMuYWFiYi5sb3dlckJvdW5kLnkpIC8gMiwgKHRoaXMuYWFiYi51cHBlckJvdW5kLnogLSB0aGlzLmFhYmIubG93ZXJCb3VuZC56KSAvIDIpOwogICAgICBCb3guY2FsY3VsYXRlSW5lcnRpYShoYWxmRXh0ZW50cywgdGhpcy5tYXNzLCBJKTsKICAgICAgdGhpcy5pbnZJbmVydGlhLnNldChJLnggPiAwICYmICFmaXhlZCA/IDEuMCAvIEkueCA6IDAsIEkueSA+IDAgJiYgIWZpeGVkID8gMS4wIC8gSS55IDogMCwgSS56ID4gMCAmJiAhZml4ZWQgPyAxLjAgLyBJLnogOiAwKTsKICAgICAgdGhpcy51cGRhdGVJbmVydGlhV29ybGQodHJ1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB3b3JsZCB2ZWxvY2l0eSBvZiBhIHBvaW50IGluIHRoZSBib2R5LgogICAgICogQHBhcmFtIHdvcmxkUG9pbnQKICAgICAqIEBwYXJhbSByZXN1bHQKICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCB2ZWN0b3IuCiAgICAgKi8KCgogICAgZ2V0VmVsb2NpdHlBdFdvcmxkUG9pbnQod29ybGRQb2ludCwgcmVzdWx0KSB7CiAgICAgIGNvbnN0IHIgPSBuZXcgVmVjMygpOwogICAgICB3b3JsZFBvaW50LnZzdWIodGhpcy5wb3NpdGlvbiwgcik7CiAgICAgIHRoaXMuYW5ndWxhclZlbG9jaXR5LmNyb3NzKHIsIHJlc3VsdCk7CiAgICAgIHRoaXMudmVsb2NpdHkudmFkZChyZXN1bHQsIHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIE1vdmUgdGhlIGJvZHkgZm9yd2FyZCBpbiB0aW1lLgogICAgICogQHBhcmFtIGR0IFRpbWUgc3RlcAogICAgICogQHBhcmFtIHF1YXROb3JtYWxpemUgU2V0IHRvIHRydWUgdG8gbm9ybWFsaXplIHRoZSBib2R5IHF1YXRlcm5pb24KICAgICAqIEBwYXJhbSBxdWF0Tm9ybWFsaXplRmFzdCBJZiB0aGUgcXVhdGVybmlvbiBzaG91bGQgYmUgbm9ybWFsaXplZCB1c2luZyAiZmFzdCIgcXVhdGVybmlvbiBub3JtYWxpemF0aW9uCiAgICAgKi8KCgogICAgaW50ZWdyYXRlKGR0LCBxdWF0Tm9ybWFsaXplLCBxdWF0Tm9ybWFsaXplRmFzdCkgewogICAgICAvLyBTYXZlIHByZXZpb3VzIHBvc2l0aW9uCiAgICAgIHRoaXMucHJldmlvdXNQb3NpdGlvbi5jb3B5KHRoaXMucG9zaXRpb24pOwogICAgICB0aGlzLnByZXZpb3VzUXVhdGVybmlvbi5jb3B5KHRoaXMucXVhdGVybmlvbik7CgogICAgICBpZiAoISh0aGlzLnR5cGUgPT09IEJvZHkuRFlOQU1JQyB8fCB0aGlzLnR5cGUgPT09IEJvZHkuS0lORU1BVElDKSB8fCB0aGlzLnNsZWVwU3RhdGUgPT09IEJvZHkuU0xFRVBJTkcpIHsKICAgICAgICAvLyBPbmx5IGZvciBkeW5hbWljCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCB2ZWxvID0gdGhpcy52ZWxvY2l0eTsKICAgICAgY29uc3QgYW5ndWxhclZlbG8gPSB0aGlzLmFuZ3VsYXJWZWxvY2l0eTsKICAgICAgY29uc3QgcG9zID0gdGhpcy5wb3NpdGlvbjsKICAgICAgY29uc3QgZm9yY2UgPSB0aGlzLmZvcmNlOwogICAgICBjb25zdCB0b3JxdWUgPSB0aGlzLnRvcnF1ZTsKICAgICAgY29uc3QgcXVhdCA9IHRoaXMucXVhdGVybmlvbjsKICAgICAgY29uc3QgaW52TWFzcyA9IHRoaXMuaW52TWFzczsKICAgICAgY29uc3QgaW52SW5lcnRpYSA9IHRoaXMuaW52SW5lcnRpYVdvcmxkOwogICAgICBjb25zdCBsaW5lYXJGYWN0b3IgPSB0aGlzLmxpbmVhckZhY3RvcjsKICAgICAgY29uc3QgaU1kdCA9IGludk1hc3MgKiBkdDsKICAgICAgdmVsby54ICs9IGZvcmNlLnggKiBpTWR0ICogbGluZWFyRmFjdG9yLng7CiAgICAgIHZlbG8ueSArPSBmb3JjZS55ICogaU1kdCAqIGxpbmVhckZhY3Rvci55OwogICAgICB2ZWxvLnogKz0gZm9yY2UueiAqIGlNZHQgKiBsaW5lYXJGYWN0b3IuejsKICAgICAgY29uc3QgZSA9IGludkluZXJ0aWEuZWxlbWVudHM7CiAgICAgIGNvbnN0IGFuZ3VsYXJGYWN0b3IgPSB0aGlzLmFuZ3VsYXJGYWN0b3I7CiAgICAgIGNvbnN0IHR4ID0gdG9ycXVlLnggKiBhbmd1bGFyRmFjdG9yLng7CiAgICAgIGNvbnN0IHR5ID0gdG9ycXVlLnkgKiBhbmd1bGFyRmFjdG9yLnk7CiAgICAgIGNvbnN0IHR6ID0gdG9ycXVlLnogKiBhbmd1bGFyRmFjdG9yLno7CiAgICAgIGFuZ3VsYXJWZWxvLnggKz0gZHQgKiAoZVswXSAqIHR4ICsgZVsxXSAqIHR5ICsgZVsyXSAqIHR6KTsKICAgICAgYW5ndWxhclZlbG8ueSArPSBkdCAqIChlWzNdICogdHggKyBlWzRdICogdHkgKyBlWzVdICogdHopOwogICAgICBhbmd1bGFyVmVsby56ICs9IGR0ICogKGVbNl0gKiB0eCArIGVbN10gKiB0eSArIGVbOF0gKiB0eik7IC8vIFVzZSBuZXcgdmVsb2NpdHkgIC0gbGVhcCBmcm9nCgogICAgICBwb3MueCArPSB2ZWxvLnggKiBkdDsKICAgICAgcG9zLnkgKz0gdmVsby55ICogZHQ7CiAgICAgIHBvcy56ICs9IHZlbG8ueiAqIGR0OwogICAgICBxdWF0LmludGVncmF0ZSh0aGlzLmFuZ3VsYXJWZWxvY2l0eSwgZHQsIHRoaXMuYW5ndWxhckZhY3RvciwgcXVhdCk7CgogICAgICBpZiAocXVhdE5vcm1hbGl6ZSkgewogICAgICAgIGlmIChxdWF0Tm9ybWFsaXplRmFzdCkgewogICAgICAgICAgcXVhdC5ub3JtYWxpemVGYXN0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHF1YXQubm9ybWFsaXplKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICB0aGlzLmFhYmJOZWVkc1VwZGF0ZSA9IHRydWU7IC8vIFVwZGF0ZSB3b3JsZCBpbmVydGlhCgogICAgICB0aGlzLnVwZGF0ZUluZXJ0aWFXb3JsZCgpOwogICAgfQoKICB9CiAgQm9keS5pZENvdW50ZXIgPSAwOwogIEJvZHkuQ09MTElERV9FVkVOVF9OQU1FID0gJ2NvbGxpZGUnOwogIEJvZHkuRFlOQU1JQyA9IEJPRFlfVFlQRVMuRFlOQU1JQzsKICBCb2R5LlNUQVRJQyA9IEJPRFlfVFlQRVMuU1RBVElDOwogIEJvZHkuS0lORU1BVElDID0gQk9EWV9UWVBFUy5LSU5FTUFUSUM7CiAgQm9keS5BV0FLRSA9IEJPRFlfU0xFRVBfU1RBVEVTLkFXQUtFOwogIEJvZHkuU0xFRVBZID0gQk9EWV9TTEVFUF9TVEFURVMuU0xFRVBZOwogIEJvZHkuU0xFRVBJTkcgPSBCT0RZX1NMRUVQX1NUQVRFUy5TTEVFUElORzsKICBCb2R5Lndha2V1cEV2ZW50ID0gewogICAgdHlwZTogJ3dha2V1cCcKICB9OwogIEJvZHkuc2xlZXB5RXZlbnQgPSB7CiAgICB0eXBlOiAnc2xlZXB5JwogIH07CiAgQm9keS5zbGVlcEV2ZW50ID0gewogICAgdHlwZTogJ3NsZWVwJwogIH07CiAgY29uc3QgdG1wVmVjID0gbmV3IFZlYzMoKTsKICBjb25zdCB0bXBRdWF0ID0gbmV3IFF1YXRlcm5pb24oKTsKICBjb25zdCB1cGRhdGVBQUJCX3NoYXBlQUFCQiA9IG5ldyBBQUJCKCk7CiAgY29uc3QgdWl3X20xID0gbmV3IE1hdDMoKTsKICBjb25zdCB1aXdfbTIgPSBuZXcgTWF0MygpOwogIG5ldyBNYXQzKCk7CiAgY29uc3QgQm9keV9hcHBseUZvcmNlX3JvdEZvcmNlID0gbmV3IFZlYzMoKTsKICBjb25zdCBCb2R5X2FwcGx5TG9jYWxGb3JjZV93b3JsZEZvcmNlID0gbmV3IFZlYzMoKTsKICBjb25zdCBCb2R5X2FwcGx5TG9jYWxGb3JjZV9yZWxhdGl2ZVBvaW50V29ybGQgPSBuZXcgVmVjMygpOwogIGNvbnN0IEJvZHlfYXBwbHlJbXB1bHNlX3ZlbG8gPSBuZXcgVmVjMygpOwogIGNvbnN0IEJvZHlfYXBwbHlJbXB1bHNlX3JvdFZlbG8gPSBuZXcgVmVjMygpOwogIGNvbnN0IEJvZHlfYXBwbHlMb2NhbEltcHVsc2Vfd29ybGRJbXB1bHNlID0gbmV3IFZlYzMoKTsKICBjb25zdCBCb2R5X2FwcGx5TG9jYWxJbXB1bHNlX3JlbGF0aXZlUG9pbnQgPSBuZXcgVmVjMygpOwogIGNvbnN0IEJvZHlfdXBkYXRlTWFzc1Byb3BlcnRpZXNfaGFsZkV4dGVudHMgPSBuZXcgVmVjMygpOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIGZvciBicm9hZHBoYXNlIGltcGxlbWVudGF0aW9ucwogICAqIEBhdXRob3Igc2NodGVwcGUKICAgKi8KICBjbGFzcyBCcm9hZHBoYXNlIHsKICAgIC8qKgogICAgICogVGhlIHdvcmxkIHRvIHNlYXJjaCBmb3IgY29sbGlzaW9ucyBpbi4KICAgICAqLwoKICAgIC8qKgogICAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBicm9hZHBoYXNlIHVzZXMgYm91bmRpbmcgYm94ZXMgZm9yIGludGVyc2VjdGlvbiB0ZXN0cywgZWxzZSBpdCB1c2VzIGJvdW5kaW5nIHNwaGVyZXMuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFNldCB0byB0cnVlIGlmIHRoZSBvYmplY3RzIGluIHRoZSB3b3JsZCBtb3ZlZC4KICAgICAqLwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHRoaXMud29ybGQgPSBudWxsOwogICAgICB0aGlzLnVzZUJvdW5kaW5nQm94ZXMgPSBmYWxzZTsKICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgY29sbGlzaW9uIHBhaXJzIGZyb20gdGhlIHdvcmxkCiAgICAgKiBAcGFyYW0gd29ybGQgVGhlIHdvcmxkIHRvIHNlYXJjaCBpbgogICAgICogQHBhcmFtIHAxIEVtcHR5IGFycmF5IHRvIGJlIGZpbGxlZCB3aXRoIGJvZHkgb2JqZWN0cwogICAgICogQHBhcmFtIHAyIEVtcHR5IGFycmF5IHRvIGJlIGZpbGxlZCB3aXRoIGJvZHkgb2JqZWN0cwogICAgICovCgoKICAgIGNvbGxpc2lvblBhaXJzKHdvcmxkLCBwMSwgcDIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb2xsaXNpb25QYWlycyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgQnJvYWRQaGFzZSBjbGFzcyEnKTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2sgaWYgYSBib2R5IHBhaXIgbmVlZHMgdG8gYmUgaW50ZXJzZWN0aW9uIHRlc3RlZCBhdCBhbGwuCiAgICAgKi8KCgogICAgbmVlZEJyb2FkcGhhc2VDb2xsaXNpb24oYm9keUEsIGJvZHlCKSB7CiAgICAgIC8vIENoZWNrIGNvbGxpc2lvbiBmaWx0ZXIgbWFza3MKICAgICAgaWYgKChib2R5QS5jb2xsaXNpb25GaWx0ZXJHcm91cCAmIGJvZHlCLmNvbGxpc2lvbkZpbHRlck1hc2spID09PSAwIHx8IChib2R5Qi5jb2xsaXNpb25GaWx0ZXJHcm91cCAmIGJvZHlBLmNvbGxpc2lvbkZpbHRlck1hc2spID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IC8vIENoZWNrIHR5cGVzCgoKICAgICAgaWYgKCgoYm9keUEudHlwZSAmIEJvZHkuU1RBVElDKSAhPT0gMCB8fCBib2R5QS5zbGVlcFN0YXRlID09PSBCb2R5LlNMRUVQSU5HKSAmJiAoKGJvZHlCLnR5cGUgJiBCb2R5LlNUQVRJQykgIT09IDAgfHwgYm9keUIuc2xlZXBTdGF0ZSA9PT0gQm9keS5TTEVFUElORykpIHsKICAgICAgICAvLyBCb3RoIGJvZGllcyBhcmUgc3RhdGljIG9yIHNsZWVwaW5nLiBTa2lwLgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIHRoZSBib3VuZGluZyB2b2x1bWVzIG9mIHR3byBib2RpZXMgaW50ZXJzZWN0LgogICAgICovCgoKICAgIGludGVyc2VjdGlvblRlc3QoYm9keUEsIGJvZHlCLCBwYWlyczEsIHBhaXJzMikgewogICAgICBpZiAodGhpcy51c2VCb3VuZGluZ0JveGVzKSB7CiAgICAgICAgdGhpcy5kb0JvdW5kaW5nQm94QnJvYWRwaGFzZShib2R5QSwgYm9keUIsIHBhaXJzMSwgcGFpcnMyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmRvQm91bmRpbmdTcGhlcmVCcm9hZHBoYXNlKGJvZHlBLCBib2R5QiwgcGFpcnMxLCBwYWlyczIpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIHRoZSBib3VuZGluZyBzcGhlcmVzIG9mIHR3byBib2RpZXMgYXJlIGludGVyc2VjdGluZy4KICAgICAqIEBwYXJhbSBwYWlyczEgYm9keUEgaXMgYXBwZW5kZWQgdG8gdGhpcyBhcnJheSBpZiBpbnRlcnNlY3Rpb24KICAgICAqIEBwYXJhbSBwYWlyczIgYm9keUIgaXMgYXBwZW5kZWQgdG8gdGhpcyBhcnJheSBpZiBpbnRlcnNlY3Rpb24KICAgICAqLwoKCiAgICBkb0JvdW5kaW5nU3BoZXJlQnJvYWRwaGFzZShib2R5QSwgYm9keUIsIHBhaXJzMSwgcGFpcnMyKSB7CiAgICAgIGNvbnN0IHIgPSBCcm9hZHBoYXNlX2NvbGxpc2lvblBhaXJzX3I7CiAgICAgIGJvZHlCLnBvc2l0aW9uLnZzdWIoYm9keUEucG9zaXRpb24sIHIpOwogICAgICBjb25zdCBib3VuZGluZ1JhZGl1c1N1bTIgPSAoYm9keUEuYm91bmRpbmdSYWRpdXMgKyBib2R5Qi5ib3VuZGluZ1JhZGl1cykgKiogMjsKICAgICAgY29uc3Qgbm9ybTIgPSByLmxlbmd0aFNxdWFyZWQoKTsKCiAgICAgIGlmIChub3JtMiA8IGJvdW5kaW5nUmFkaXVzU3VtMikgewogICAgICAgIHBhaXJzMS5wdXNoKGJvZHlBKTsKICAgICAgICBwYWlyczIucHVzaChib2R5Qik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2hlY2sgaWYgdGhlIGJvdW5kaW5nIGJveGVzIG9mIHR3byBib2RpZXMgYXJlIGludGVyc2VjdGluZy4KICAgICAqLwoKCiAgICBkb0JvdW5kaW5nQm94QnJvYWRwaGFzZShib2R5QSwgYm9keUIsIHBhaXJzMSwgcGFpcnMyKSB7CiAgICAgIGlmIChib2R5QS5hYWJiTmVlZHNVcGRhdGUpIHsKICAgICAgICBib2R5QS51cGRhdGVBQUJCKCk7CiAgICAgIH0KCiAgICAgIGlmIChib2R5Qi5hYWJiTmVlZHNVcGRhdGUpIHsKICAgICAgICBib2R5Qi51cGRhdGVBQUJCKCk7CiAgICAgIH0gLy8gQ2hlY2sgQUFCQiAvIEFBQkIKCgogICAgICBpZiAoYm9keUEuYWFiYi5vdmVybGFwcyhib2R5Qi5hYWJiKSkgewogICAgICAgIHBhaXJzMS5wdXNoKGJvZHlBKTsKICAgICAgICBwYWlyczIucHVzaChib2R5Qik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlcyBkdXBsaWNhdGUgcGFpcnMgZnJvbSB0aGUgcGFpciBhcnJheXMuCiAgICAgKi8KCgogICAgbWFrZVBhaXJzVW5pcXVlKHBhaXJzMSwgcGFpcnMyKSB7CiAgICAgIGNvbnN0IHQgPSBCcm9hZHBoYXNlX21ha2VQYWlyc1VuaXF1ZV90ZW1wOwogICAgICBjb25zdCBwMSA9IEJyb2FkcGhhc2VfbWFrZVBhaXJzVW5pcXVlX3AxOwogICAgICBjb25zdCBwMiA9IEJyb2FkcGhhc2VfbWFrZVBhaXJzVW5pcXVlX3AyOwogICAgICBjb25zdCBOID0gcGFpcnMxLmxlbmd0aDsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBOOyBpKyspIHsKICAgICAgICBwMVtpXSA9IHBhaXJzMVtpXTsKICAgICAgICBwMltpXSA9IHBhaXJzMltpXTsKICAgICAgfQoKICAgICAgcGFpcnMxLmxlbmd0aCA9IDA7CiAgICAgIHBhaXJzMi5sZW5ndGggPSAwOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IE47IGkrKykgewogICAgICAgIGNvbnN0IGlkMSA9IHAxW2ldLmlkOwogICAgICAgIGNvbnN0IGlkMiA9IHAyW2ldLmlkOwogICAgICAgIGNvbnN0IGtleSA9IGlkMSA8IGlkMiA/IGAke2lkMX0sJHtpZDJ9YCA6IGAke2lkMn0sJHtpZDF9YDsKICAgICAgICB0W2tleV0gPSBpOwogICAgICAgIHQua2V5cy5wdXNoKGtleSk7CiAgICAgIH0KCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSB0LmtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBrZXkgPSB0LmtleXMucG9wKCk7CiAgICAgICAgY29uc3QgcGFpckluZGV4ID0gdFtrZXldOwogICAgICAgIHBhaXJzMS5wdXNoKHAxW3BhaXJJbmRleF0pOwogICAgICAgIHBhaXJzMi5wdXNoKHAyW3BhaXJJbmRleF0pOwogICAgICAgIGRlbGV0ZSB0W2tleV07CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2Fzc2VzCiAgICAgKi8KCgogICAgc2V0V29ybGQod29ybGQpIHt9CiAgICAvKioKICAgICAqIENoZWNrIGlmIHRoZSBib3VuZGluZyBzcGhlcmVzIG9mIHR3byBib2RpZXMgb3ZlcmxhcC4KICAgICAqLwoKCiAgICBzdGF0aWMgYm91bmRpbmdTcGhlcmVDaGVjayhib2R5QSwgYm9keUIpIHsKICAgICAgY29uc3QgZGlzdCA9IG5ldyBWZWMzKCk7IC8vIGJzY19kaXN0OwoKICAgICAgYm9keUEucG9zaXRpb24udnN1Yihib2R5Qi5wb3NpdGlvbiwgZGlzdCk7CiAgICAgIGNvbnN0IHNhID0gYm9keUEuc2hhcGVzWzBdOwogICAgICBjb25zdCBzYiA9IGJvZHlCLnNoYXBlc1swXTsKICAgICAgcmV0dXJuIE1hdGgucG93KHNhLmJvdW5kaW5nU3BoZXJlUmFkaXVzICsgc2IuYm91bmRpbmdTcGhlcmVSYWRpdXMsIDIpID4gZGlzdC5sZW5ndGhTcXVhcmVkKCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYWxsIHRoZSBib2RpZXMgd2l0aGluIHRoZSBBQUJCLgogICAgICovCgoKICAgIGFhYmJRdWVyeSh3b3JsZCwgYWFiYiwgcmVzdWx0KSB7CiAgICAgIGNvbnNvbGUud2FybignLmFhYmJRdWVyeSBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyBCcm9hZHBoYXNlIHN1YmNsYXNzLicpOwogICAgICByZXR1cm4gW107CiAgICB9CgogIH0gLy8gVGVtcCBvYmplY3RzCgogIGNvbnN0IEJyb2FkcGhhc2VfY29sbGlzaW9uUGFpcnNfciA9IG5ldyBWZWMzKCk7CiAgbmV3IFZlYzMoKTsKICBuZXcgUXVhdGVybmlvbigpOwogIG5ldyBWZWMzKCk7CiAgY29uc3QgQnJvYWRwaGFzZV9tYWtlUGFpcnNVbmlxdWVfdGVtcCA9IHsKICAgIGtleXM6IFtdCiAgfTsKICBjb25zdCBCcm9hZHBoYXNlX21ha2VQYWlyc1VuaXF1ZV9wMSA9IFtdOwogIGNvbnN0IEJyb2FkcGhhc2VfbWFrZVBhaXJzVW5pcXVlX3AyID0gW107CiAgbmV3IFZlYzMoKTsKICBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CgogIC8qKgogICAqIE5haXZlIGJyb2FkcGhhc2UgaW1wbGVtZW50YXRpb24sIHVzZWQgaW4gbGFjayBvZiBiZXR0ZXIgb25lcy4KICAgKgogICAqIFRoZSBuYWl2ZSBicm9hZHBoYXNlIGxvb2tzIGF0IGFsbCBwb3NzaWJsZSBwYWlycyB3aXRob3V0IHJlc3RyaWN0aW9uLCB0aGVyZWZvcmUgaXQgaGFzIGNvbXBsZXhpdHkgTl4yIF8od2hpY2ggaXMgYmFkKV8KICAgKi8KICBjbGFzcyBOYWl2ZUJyb2FkcGhhc2UgZXh0ZW5kcyBCcm9hZHBoYXNlIHsKICAgIC8qKgogICAgICogQHRvZG8gUmVtb3ZlIHVzZWxlc3MgY29uc3RydWN0b3IKICAgICAqLwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhbGwgdGhlIGNvbGxpc2lvbiBwYWlycyBpbiB0aGUgcGh5c2ljcyB3b3JsZAogICAgICovCgoKICAgIGNvbGxpc2lvblBhaXJzKHdvcmxkLCBwYWlyczEsIHBhaXJzMikgewogICAgICBjb25zdCBib2RpZXMgPSB3b3JsZC5ib2RpZXM7CiAgICAgIGNvbnN0IG4gPSBib2RpZXMubGVuZ3RoOwogICAgICBsZXQgYmk7CiAgICAgIGxldCBiajsgLy8gTmFpdmUgTl4yIGZ0dyEKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBuOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiAhPT0gaTsgaisrKSB7CiAgICAgICAgICBiaSA9IGJvZGllc1tpXTsKICAgICAgICAgIGJqID0gYm9kaWVzW2pdOwoKICAgICAgICAgIGlmICghdGhpcy5uZWVkQnJvYWRwaGFzZUNvbGxpc2lvbihiaSwgYmopKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uVGVzdChiaSwgYmosIHBhaXJzMSwgcGFpcnMyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIGJvZGllcyB3aXRoaW4gYW4gQUFCQi4KICAgICAqIEBwYXJhbSByZXN1bHQgQW4gYXJyYXkgdG8gc3RvcmUgcmVzdWx0aW5nIGJvZGllcyBpbi4KICAgICAqLwoKCiAgICBhYWJiUXVlcnkod29ybGQsIGFhYmIsIHJlc3VsdCkgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHsKICAgICAgICByZXN1bHQgPSBbXTsKICAgICAgfQoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JsZC5ib2RpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBiID0gd29ybGQuYm9kaWVzW2ldOwoKICAgICAgICBpZiAoYi5hYWJiTmVlZHNVcGRhdGUpIHsKICAgICAgICAgIGIudXBkYXRlQUFCQigpOwogICAgICAgIH0gLy8gVWdseSBoYWNrIHVudGlsIEJvZHkgZ2V0cyBhYWJiCgoKICAgICAgICBpZiAoYi5hYWJiLm92ZXJsYXBzKGFhYmIpKSB7CiAgICAgICAgICByZXN1bHQucHVzaChiKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogIH0KCiAgLyoqCiAgICogU3RvcmFnZSBmb3IgUmF5IGNhc3RpbmcgZGF0YQogICAqLwogIGNsYXNzIFJheWNhc3RSZXN1bHQgewogICAgLyoqCiAgICAgKiByYXlGcm9tV29ybGQKICAgICAqLwoKICAgIC8qKgogICAgICogcmF5VG9Xb3JsZAogICAgICovCgogICAgLyoqCiAgICAgKiBoaXROb3JtYWxXb3JsZAogICAgICovCgogICAgLyoqCiAgICAgKiBoaXRQb2ludFdvcmxkCiAgICAgKi8KCiAgICAvKioKICAgICAqIGhhc0hpdAogICAgICovCgogICAgLyoqCiAgICAgKiBzaGFwZQogICAgICovCgogICAgLyoqCiAgICAgKiBib2R5CiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSBpbmRleCBvZiB0aGUgaGl0IHRyaWFuZ2xlLCBpZiB0aGUgaGl0IHNoYXBlIHdhcyBhIHRyaW1lc2gKICAgICAqLwoKICAgIC8qKgogICAgICogRGlzdGFuY2UgdG8gdGhlIGhpdC4gV2lsbCBiZSBzZXQgdG8gLTEgaWYgdGhlcmUgd2FzIG5vIGhpdAogICAgICovCgogICAgLyoqCiAgICAgKiBJZiB0aGUgcmF5IHNob3VsZCBzdG9wIHRyYXZlcnNpbmcgdGhlIGJvZGllcwogICAgICovCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy5yYXlGcm9tV29ybGQgPSBuZXcgVmVjMygpOwogICAgICB0aGlzLnJheVRvV29ybGQgPSBuZXcgVmVjMygpOwogICAgICB0aGlzLmhpdE5vcm1hbFdvcmxkID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5oaXRQb2ludFdvcmxkID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5oYXNIaXQgPSBmYWxzZTsKICAgICAgdGhpcy5zaGFwZSA9IG51bGw7CiAgICAgIHRoaXMuYm9keSA9IG51bGw7CiAgICAgIHRoaXMuaGl0RmFjZUluZGV4ID0gLTE7CiAgICAgIHRoaXMuZGlzdGFuY2UgPSAtMTsKICAgICAgdGhpcy5zaG91bGRTdG9wID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIFJlc2V0IGFsbCByZXN1bHQgZGF0YS4KICAgICAqLwoKCiAgICByZXNldCgpIHsKICAgICAgdGhpcy5yYXlGcm9tV29ybGQuc2V0WmVybygpOwogICAgICB0aGlzLnJheVRvV29ybGQuc2V0WmVybygpOwogICAgICB0aGlzLmhpdE5vcm1hbFdvcmxkLnNldFplcm8oKTsKICAgICAgdGhpcy5oaXRQb2ludFdvcmxkLnNldFplcm8oKTsKICAgICAgdGhpcy5oYXNIaXQgPSBmYWxzZTsKICAgICAgdGhpcy5zaGFwZSA9IG51bGw7CiAgICAgIHRoaXMuYm9keSA9IG51bGw7CiAgICAgIHRoaXMuaGl0RmFjZUluZGV4ID0gLTE7CiAgICAgIHRoaXMuZGlzdGFuY2UgPSAtMTsKICAgICAgdGhpcy5zaG91bGRTdG9wID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIGFib3J0CiAgICAgKi8KCgogICAgYWJvcnQoKSB7CiAgICAgIHRoaXMuc2hvdWxkU3RvcCA9IHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIFNldCByZXN1bHQgZGF0YS4KICAgICAqLwoKCiAgICBzZXQocmF5RnJvbVdvcmxkLCByYXlUb1dvcmxkLCBoaXROb3JtYWxXb3JsZCwgaGl0UG9pbnRXb3JsZCwgc2hhcGUsIGJvZHksIGRpc3RhbmNlKSB7CiAgICAgIHRoaXMucmF5RnJvbVdvcmxkLmNvcHkocmF5RnJvbVdvcmxkKTsKICAgICAgdGhpcy5yYXlUb1dvcmxkLmNvcHkocmF5VG9Xb3JsZCk7CiAgICAgIHRoaXMuaGl0Tm9ybWFsV29ybGQuY29weShoaXROb3JtYWxXb3JsZCk7CiAgICAgIHRoaXMuaGl0UG9pbnRXb3JsZC5jb3B5KGhpdFBvaW50V29ybGQpOwogICAgICB0aGlzLnNoYXBlID0gc2hhcGU7CiAgICAgIHRoaXMuYm9keSA9IGJvZHk7CiAgICAgIHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTsKICAgIH0KCiAgfQoKICBsZXQgX1NoYXBlJHR5cGVzJFNQSEVSRSwgX1NoYXBlJHR5cGVzJFBMQU5FLCBfU2hhcGUkdHlwZXMkQk9YLCBfU2hhcGUkdHlwZXMkQ1lMSU5ERVIsIF9TaGFwZSR0eXBlcyRDT05WRVhQTywgX1NoYXBlJHR5cGVzJEhFSUdIVEZJLCBfU2hhcGUkdHlwZXMkVFJJTUVTSDsKCiAgLyoqCiAgICogUkFZX01PREVTCiAgICovCiAgY29uc3QgUkFZX01PREVTID0gewogICAgLyoqIENMT1NFU1QgKi8KICAgIENMT1NFU1Q6IDEsCgogICAgLyoqIEFOWSAqLwogICAgQU5ZOiAyLAoKICAgIC8qKiBBTEwgKi8KICAgIEFMTDogNAogIH07CiAgLyoqCiAgICogUmF5TW9kZQogICAqLwoKICBfU2hhcGUkdHlwZXMkU1BIRVJFID0gU2hhcGUudHlwZXMuU1BIRVJFOwogIF9TaGFwZSR0eXBlcyRQTEFORSA9IFNoYXBlLnR5cGVzLlBMQU5FOwogIF9TaGFwZSR0eXBlcyRCT1ggPSBTaGFwZS50eXBlcy5CT1g7CiAgX1NoYXBlJHR5cGVzJENZTElOREVSID0gU2hhcGUudHlwZXMuQ1lMSU5ERVI7CiAgX1NoYXBlJHR5cGVzJENPTlZFWFBPID0gU2hhcGUudHlwZXMuQ09OVkVYUE9MWUhFRFJPTjsKICBfU2hhcGUkdHlwZXMkSEVJR0hURkkgPSBTaGFwZS50eXBlcy5IRUlHSFRGSUVMRDsKICBfU2hhcGUkdHlwZXMkVFJJTUVTSCA9IFNoYXBlLnR5cGVzLlRSSU1FU0g7CgogIC8qKgogICAqIEEgbGluZSBpbiAzRCBzcGFjZSB0aGF0IGludGVyc2VjdHMgYm9kaWVzIGFuZCByZXR1cm4gcG9pbnRzLgogICAqLwogIGNsYXNzIFJheSB7CiAgICAvKioKICAgICAqIGZyb20KICAgICAqLwoKICAgIC8qKgogICAgICogdG8KICAgICAqLwoKICAgIC8qKgogICAgICogZGlyZWN0aW9uCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSBwcmVjaXNpb24gb2YgdGhlIHJheS4gVXNlZCB3aGVuIGNoZWNraW5nIHBhcmFsbGVsaXR5IGV0Yy4KICAgICAqIEBkZWZhdWx0IDAuMDAwMQogICAgICovCgogICAgLyoqCiAgICAgKiBTZXQgdG8gYGZhbHNlYCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgUmF5IHRvIHRha2UgYGNvbGxpc2lvblJlc3BvbnNlYCBmbGFncyBpbnRvIGFjY291bnQgb24gYm9kaWVzIGFuZCBzaGFwZXMuCiAgICAgKiBAZGVmYXVsdCB0cnVlCiAgICAgKi8KCiAgICAvKioKICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSByYXkgc2tpcHMgYW55IGhpdHMgd2l0aCBub3JtYWwuZG90KHJheURpcmVjdGlvbikgPCAwLgogICAgICogQGRlZmF1bHQgZmFsc2UKICAgICAqLwoKICAgIC8qKgogICAgICogY29sbGlzaW9uRmlsdGVyTWFzawogICAgICogQGRlZmF1bHQgLTEKICAgICAqLwoKICAgIC8qKgogICAgICogY29sbGlzaW9uRmlsdGVyR3JvdXAKICAgICAqIEBkZWZhdWx0IC0xCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSBpbnRlcnNlY3Rpb24gbW9kZS4gU2hvdWxkIGJlIFJheS5BTlksIFJheS5BTEwgb3IgUmF5LkNMT1NFU1QuCiAgICAgKiBAZGVmYXVsdCBSQVkuQU5ZCiAgICAgKi8KCiAgICAvKioKICAgICAqIEN1cnJlbnQgcmVzdWx0IG9iamVjdC4KICAgICAqLwoKICAgIC8qKgogICAgICogV2lsbCBiZSBzZXQgdG8gYHRydWVgIGR1cmluZyBpbnRlcnNlY3RXb3JsZCgpIGlmIHRoZSByYXkgaGl0IGFueXRoaW5nLgogICAgICovCgogICAgLyoqCiAgICAgKiBVc2VyLXByb3ZpZGVkIHJlc3VsdCBjYWxsYmFjay4gV2lsbCBiZSB1c2VkIGlmIG1vZGUgaXMgUmF5LkFMTC4KICAgICAqLwoKICAgIC8qKgogICAgICogQ0xPU0VTVAogICAgICovCgogICAgLyoqCiAgICAgKiBBTlkKICAgICAqLwoKICAgIC8qKgogICAgICogQUxMCiAgICAgKi8KICAgIGdldCBbX1NoYXBlJHR5cGVzJFNQSEVSRV0oKSB7CiAgICAgIHJldHVybiB0aGlzLl9pbnRlcnNlY3RTcGhlcmU7CiAgICB9CgogICAgZ2V0IFtfU2hhcGUkdHlwZXMkUExBTkVdKCkgewogICAgICByZXR1cm4gdGhpcy5faW50ZXJzZWN0UGxhbmU7CiAgICB9CgogICAgZ2V0IFtfU2hhcGUkdHlwZXMkQk9YXSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2ludGVyc2VjdEJveDsKICAgIH0KCiAgICBnZXQgW19TaGFwZSR0eXBlcyRDWUxJTkRFUl0oKSB7CiAgICAgIHJldHVybiB0aGlzLl9pbnRlcnNlY3RDb252ZXg7CiAgICB9CgogICAgZ2V0IFtfU2hhcGUkdHlwZXMkQ09OVkVYUE9dKCkgewogICAgICByZXR1cm4gdGhpcy5faW50ZXJzZWN0Q29udmV4OwogICAgfQoKICAgIGdldCBbX1NoYXBlJHR5cGVzJEhFSUdIVEZJXSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2ludGVyc2VjdEhlaWdodGZpZWxkOwogICAgfQoKICAgIGdldCBbX1NoYXBlJHR5cGVzJFRSSU1FU0hdKCkgewogICAgICByZXR1cm4gdGhpcy5faW50ZXJzZWN0VHJpbWVzaDsKICAgIH0KCiAgICBjb25zdHJ1Y3Rvcihmcm9tLCB0bykgewogICAgICBpZiAoZnJvbSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZnJvbSA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIGlmICh0byA9PT0gdm9pZCAwKSB7CiAgICAgICAgdG8gPSBuZXcgVmVjMygpOwogICAgICB9CgogICAgICB0aGlzLmZyb20gPSBmcm9tLmNsb25lKCk7CiAgICAgIHRoaXMudG8gPSB0by5jbG9uZSgpOwogICAgICB0aGlzLmRpcmVjdGlvbiA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMucHJlY2lzaW9uID0gMC4wMDAxOwogICAgICB0aGlzLmNoZWNrQ29sbGlzaW9uUmVzcG9uc2UgPSB0cnVlOwogICAgICB0aGlzLnNraXBCYWNrZmFjZXMgPSBmYWxzZTsKICAgICAgdGhpcy5jb2xsaXNpb25GaWx0ZXJNYXNrID0gLTE7CiAgICAgIHRoaXMuY29sbGlzaW9uRmlsdGVyR3JvdXAgPSAtMTsKICAgICAgdGhpcy5tb2RlID0gUmF5LkFOWTsKICAgICAgdGhpcy5yZXN1bHQgPSBuZXcgUmF5Y2FzdFJlc3VsdCgpOwogICAgICB0aGlzLmhhc0hpdCA9IGZhbHNlOwoKICAgICAgdGhpcy5jYWxsYmFjayA9IHJlc3VsdCA9PiB7fTsKICAgIH0KICAgIC8qKgogICAgICogRG8gaXRlcnNlY3Rpb24gYWdhaW5zdCBhbGwgYm9kaWVzIGluIHRoZSBnaXZlbiBXb3JsZC4KICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmF5IGhpdCBhbnl0aGluZywgb3RoZXJ3aXNlIGZhbHNlLgogICAgICovCgoKICAgIGludGVyc2VjdFdvcmxkKHdvcmxkLCBvcHRpb25zKSB7CiAgICAgIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCBSYXkuQU5ZOwogICAgICB0aGlzLnJlc3VsdCA9IG9wdGlvbnMucmVzdWx0IHx8IG5ldyBSYXljYXN0UmVzdWx0KCk7CiAgICAgIHRoaXMuc2tpcEJhY2tmYWNlcyA9ICEhb3B0aW9ucy5za2lwQmFja2ZhY2VzOwogICAgICB0aGlzLmNvbGxpc2lvbkZpbHRlck1hc2sgPSB0eXBlb2Ygb3B0aW9ucy5jb2xsaXNpb25GaWx0ZXJNYXNrICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMuY29sbGlzaW9uRmlsdGVyTWFzayA6IC0xOwogICAgICB0aGlzLmNvbGxpc2lvbkZpbHRlckdyb3VwID0gdHlwZW9mIG9wdGlvbnMuY29sbGlzaW9uRmlsdGVyR3JvdXAgIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucy5jb2xsaXNpb25GaWx0ZXJHcm91cCA6IC0xOwogICAgICB0aGlzLmNoZWNrQ29sbGlzaW9uUmVzcG9uc2UgPSB0eXBlb2Ygb3B0aW9ucy5jaGVja0NvbGxpc2lvblJlc3BvbnNlICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMuY2hlY2tDb2xsaXNpb25SZXNwb25zZSA6IHRydWU7CgogICAgICBpZiAob3B0aW9ucy5mcm9tKSB7CiAgICAgICAgdGhpcy5mcm9tLmNvcHkob3B0aW9ucy5mcm9tKTsKICAgICAgfQoKICAgICAgaWYgKG9wdGlvbnMudG8pIHsKICAgICAgICB0aGlzLnRvLmNvcHkob3B0aW9ucy50byk7CiAgICAgIH0KCiAgICAgIHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8ICgoKSA9PiB7fSk7CgogICAgICB0aGlzLmhhc0hpdCA9IGZhbHNlOwogICAgICB0aGlzLnJlc3VsdC5yZXNldCgpOwogICAgICB0aGlzLnVwZGF0ZURpcmVjdGlvbigpOwogICAgICB0aGlzLmdldEFBQkIodG1wQUFCQiQxKTsKICAgICAgdG1wQXJyYXkubGVuZ3RoID0gMDsKICAgICAgd29ybGQuYnJvYWRwaGFzZS5hYWJiUXVlcnkod29ybGQsIHRtcEFBQkIkMSwgdG1wQXJyYXkpOwogICAgICB0aGlzLmludGVyc2VjdEJvZGllcyh0bXBBcnJheSk7CiAgICAgIHJldHVybiB0aGlzLmhhc0hpdDsKICAgIH0KICAgIC8qKgogICAgICogU2hvb3QgYSByYXkgYXQgYSBib2R5LCBnZXQgYmFjayBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaGl0LgogICAgICogQGRlcHJlY2F0ZWQgQHBhcmFtIHJlc3VsdCBzZXQgdGhlIHJlc3VsdCBwcm9wZXJ0eSBvZiB0aGUgUmF5IGluc3RlYWQuCiAgICAgKi8KCgogICAgaW50ZXJzZWN0Qm9keShib2R5LCByZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OwogICAgICAgIHRoaXMudXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IGNoZWNrQ29sbGlzaW9uUmVzcG9uc2UgPSB0aGlzLmNoZWNrQ29sbGlzaW9uUmVzcG9uc2U7CgogICAgICBpZiAoY2hlY2tDb2xsaXNpb25SZXNwb25zZSAmJiAhYm9keS5jb2xsaXNpb25SZXNwb25zZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKCh0aGlzLmNvbGxpc2lvbkZpbHRlckdyb3VwICYgYm9keS5jb2xsaXNpb25GaWx0ZXJNYXNrKSA9PT0gMCB8fCAoYm9keS5jb2xsaXNpb25GaWx0ZXJHcm91cCAmIHRoaXMuY29sbGlzaW9uRmlsdGVyTWFzaykgPT09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IHhpID0gaW50ZXJzZWN0Qm9keV94aTsKICAgICAgY29uc3QgcWkgPSBpbnRlcnNlY3RCb2R5X3FpOwoKICAgICAgZm9yIChsZXQgaSA9IDAsIE4gPSBib2R5LnNoYXBlcy5sZW5ndGg7IGkgPCBOOyBpKyspIHsKICAgICAgICBjb25zdCBzaGFwZSA9IGJvZHkuc2hhcGVzW2ldOwoKICAgICAgICBpZiAoY2hlY2tDb2xsaXNpb25SZXNwb25zZSAmJiAhc2hhcGUuY29sbGlzaW9uUmVzcG9uc2UpIHsKICAgICAgICAgIGNvbnRpbnVlOyAvLyBTa2lwCiAgICAgICAgfQoKICAgICAgICBib2R5LnF1YXRlcm5pb24ubXVsdChib2R5LnNoYXBlT3JpZW50YXRpb25zW2ldLCBxaSk7CiAgICAgICAgYm9keS5xdWF0ZXJuaW9uLnZtdWx0KGJvZHkuc2hhcGVPZmZzZXRzW2ldLCB4aSk7CiAgICAgICAgeGkudmFkZChib2R5LnBvc2l0aW9uLCB4aSk7CiAgICAgICAgdGhpcy5pbnRlcnNlY3RTaGFwZShzaGFwZSwgcWksIHhpLCBib2R5KTsKCiAgICAgICAgaWYgKHRoaXMucmVzdWx0LnNob3VsZFN0b3ApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTaG9vdCBhIHJheSBhdCBhbiBhcnJheSBib2RpZXMsIGdldCBiYWNrIGluZm9ybWF0aW9uIGFib3V0IHRoZSBoaXQuCiAgICAgKiBAcGFyYW0gYm9kaWVzIEFuIGFycmF5IG9mIEJvZHkgb2JqZWN0cy4KICAgICAqIEBkZXByZWNhdGVkIEBwYXJhbSByZXN1bHQgc2V0IHRoZSByZXN1bHQgcHJvcGVydHkgb2YgdGhlIFJheSBpbnN0ZWFkLgogICAgICoKICAgICAqLwoKCiAgICBpbnRlcnNlY3RCb2RpZXMoYm9kaWVzLCByZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OwogICAgICAgIHRoaXMudXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KCiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gYm9kaWVzLmxlbmd0aDsgIXRoaXMucmVzdWx0LnNob3VsZFN0b3AgJiYgaSA8IGw7IGkrKykgewogICAgICAgIHRoaXMuaW50ZXJzZWN0Qm9keShib2RpZXNbaV0pOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIGRpcmVjdGlvbiB2ZWN0b3IuCiAgICAgKi8KCgogICAgdXBkYXRlRGlyZWN0aW9uKCkgewogICAgICB0aGlzLnRvLnZzdWIodGhpcy5mcm9tLCB0aGlzLmRpcmVjdGlvbik7CiAgICAgIHRoaXMuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpOwogICAgfQoKICAgIGludGVyc2VjdFNoYXBlKHNoYXBlLCBxdWF0LCBwb3NpdGlvbiwgYm9keSkgewogICAgICBjb25zdCBmcm9tID0gdGhpcy5mcm9tOyAvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZQoKICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUZyb21JbnRlcnNlY3Rpb24oZnJvbSwgdGhpcy5kaXJlY3Rpb24sIHBvc2l0aW9uKTsKCiAgICAgIGlmIChkaXN0YW5jZSA+IHNoYXBlLmJvdW5kaW5nU3BoZXJlUmFkaXVzKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBpbnRlcnNlY3RNZXRob2QgPSB0aGlzW3NoYXBlLnR5cGVdOwoKICAgICAgaWYgKGludGVyc2VjdE1ldGhvZCkgewogICAgICAgIGludGVyc2VjdE1ldGhvZC5jYWxsKHRoaXMsIHNoYXBlLCBxdWF0LCBwb3NpdGlvbiwgYm9keSwgc2hhcGUpOwogICAgICB9CiAgICB9CgogICAgX2ludGVyc2VjdEJveChib3gsIHF1YXQsIHBvc2l0aW9uLCBib2R5LCByZXBvcnRlZFNoYXBlKSB7CiAgICAgIHJldHVybiB0aGlzLl9pbnRlcnNlY3RDb252ZXgoYm94LmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbiwgcXVhdCwgcG9zaXRpb24sIGJvZHksIHJlcG9ydGVkU2hhcGUpOwogICAgfQoKICAgIF9pbnRlcnNlY3RQbGFuZShzaGFwZSwgcXVhdCwgcG9zaXRpb24sIGJvZHksIHJlcG9ydGVkU2hhcGUpIHsKICAgICAgY29uc3QgZnJvbSA9IHRoaXMuZnJvbTsKICAgICAgY29uc3QgdG8gPSB0aGlzLnRvOwogICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmRpcmVjdGlvbjsgLy8gR2V0IHBsYW5lIG5vcm1hbAoKICAgICAgY29uc3Qgd29ybGROb3JtYWwgPSBuZXcgVmVjMygwLCAwLCAxKTsKICAgICAgcXVhdC52bXVsdCh3b3JsZE5vcm1hbCwgd29ybGROb3JtYWwpOwogICAgICBjb25zdCBsZW4gPSBuZXcgVmVjMygpOwogICAgICBmcm9tLnZzdWIocG9zaXRpb24sIGxlbik7CiAgICAgIGNvbnN0IHBsYW5lVG9Gcm9tID0gbGVuLmRvdCh3b3JsZE5vcm1hbCk7CiAgICAgIHRvLnZzdWIocG9zaXRpb24sIGxlbik7CiAgICAgIGNvbnN0IHBsYW5lVG9UbyA9IGxlbi5kb3Qod29ybGROb3JtYWwpOwoKICAgICAgaWYgKHBsYW5lVG9Gcm9tICogcGxhbmVUb1RvID4gMCkgewogICAgICAgIC8vICJmcm9tIiBhbmQgInRvIiBhcmUgb24gdGhlIHNhbWUgc2lkZSBvZiB0aGUgcGxhbmUuLi4gYmFpbCBvdXQKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChmcm9tLmRpc3RhbmNlVG8odG8pIDwgcGxhbmVUb0Zyb20pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnN0IG5fZG90X2RpciA9IHdvcmxkTm9ybWFsLmRvdChkaXJlY3Rpb24pOwoKICAgICAgaWYgKE1hdGguYWJzKG5fZG90X2RpcikgPCB0aGlzLnByZWNpc2lvbikgewogICAgICAgIC8vIE5vIGludGVyc2VjdGlvbgogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgcGxhbmVQb2ludFRvRnJvbSA9IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IGRpcl9zY2FsZWRfd2l0aF90ID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgaGl0UG9pbnRXb3JsZCA9IG5ldyBWZWMzKCk7CiAgICAgIGZyb20udnN1Yihwb3NpdGlvbiwgcGxhbmVQb2ludFRvRnJvbSk7CiAgICAgIGNvbnN0IHQgPSAtd29ybGROb3JtYWwuZG90KHBsYW5lUG9pbnRUb0Zyb20pIC8gbl9kb3RfZGlyOwogICAgICBkaXJlY3Rpb24uc2NhbGUodCwgZGlyX3NjYWxlZF93aXRoX3QpOwogICAgICBmcm9tLnZhZGQoZGlyX3NjYWxlZF93aXRoX3QsIGhpdFBvaW50V29ybGQpOwogICAgICB0aGlzLnJlcG9ydEludGVyc2VjdGlvbih3b3JsZE5vcm1hbCwgaGl0UG9pbnRXb3JsZCwgcmVwb3J0ZWRTaGFwZSwgYm9keSwgLTEpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHdvcmxkIEFBQkIgb2YgdGhlIHJheS4KICAgICAqLwoKCiAgICBnZXRBQUJCKGFhYmIpIHsKICAgICAgY29uc3QgewogICAgICAgIGxvd2VyQm91bmQsCiAgICAgICAgdXBwZXJCb3VuZAogICAgICB9ID0gYWFiYjsKICAgICAgY29uc3QgdG8gPSB0aGlzLnRvOwogICAgICBjb25zdCBmcm9tID0gdGhpcy5mcm9tOwogICAgICBsb3dlckJvdW5kLnggPSBNYXRoLm1pbih0by54LCBmcm9tLngpOwogICAgICBsb3dlckJvdW5kLnkgPSBNYXRoLm1pbih0by55LCBmcm9tLnkpOwogICAgICBsb3dlckJvdW5kLnogPSBNYXRoLm1pbih0by56LCBmcm9tLnopOwogICAgICB1cHBlckJvdW5kLnggPSBNYXRoLm1heCh0by54LCBmcm9tLngpOwogICAgICB1cHBlckJvdW5kLnkgPSBNYXRoLm1heCh0by55LCBmcm9tLnkpOwogICAgICB1cHBlckJvdW5kLnogPSBNYXRoLm1heCh0by56LCBmcm9tLnopOwogICAgfQoKICAgIF9pbnRlcnNlY3RIZWlnaHRmaWVsZChzaGFwZSwgcXVhdCwgcG9zaXRpb24sIGJvZHksIHJlcG9ydGVkU2hhcGUpIHsKICAgICAgc2hhcGUuZGF0YTsKICAgICAgc2hhcGUuZWxlbWVudFNpemU7IC8vIENvbnZlcnQgdGhlIHJheSB0byBsb2NhbCBoZWlnaHRmaWVsZCBjb29yZGluYXRlcwoKICAgICAgY29uc3QgbG9jYWxSYXkgPSBpbnRlcnNlY3RIZWlnaHRmaWVsZF9sb2NhbFJheTsgLy9uZXcgUmF5KHRoaXMuZnJvbSwgdGhpcy50byk7CgogICAgICBsb2NhbFJheS5mcm9tLmNvcHkodGhpcy5mcm9tKTsKICAgICAgbG9jYWxSYXkudG8uY29weSh0aGlzLnRvKTsKICAgICAgVHJhbnNmb3JtLnBvaW50VG9Mb2NhbEZyYW1lKHBvc2l0aW9uLCBxdWF0LCBsb2NhbFJheS5mcm9tLCBsb2NhbFJheS5mcm9tKTsKICAgICAgVHJhbnNmb3JtLnBvaW50VG9Mb2NhbEZyYW1lKHBvc2l0aW9uLCBxdWF0LCBsb2NhbFJheS50bywgbG9jYWxSYXkudG8pOwogICAgICBsb2NhbFJheS51cGRhdGVEaXJlY3Rpb24oKTsgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZGF0YSBwb2ludHMgdG8gdGVzdCBhZ2FpbnN0CgogICAgICBjb25zdCBpbmRleCA9IGludGVyc2VjdEhlaWdodGZpZWxkX2luZGV4OwogICAgICBsZXQgaU1pblg7CiAgICAgIGxldCBpTWluWTsKICAgICAgbGV0IGlNYXhYOwogICAgICBsZXQgaU1heFk7IC8vIFNldCB0byBtYXgKCiAgICAgIGlNaW5YID0gaU1pblkgPSAwOwogICAgICBpTWF4WCA9IGlNYXhZID0gc2hhcGUuZGF0YS5sZW5ndGggLSAxOwogICAgICBjb25zdCBhYWJiID0gbmV3IEFBQkIoKTsKICAgICAgbG9jYWxSYXkuZ2V0QUFCQihhYWJiKTsKICAgICAgc2hhcGUuZ2V0SW5kZXhPZlBvc2l0aW9uKGFhYmIubG93ZXJCb3VuZC54LCBhYWJiLmxvd2VyQm91bmQueSwgaW5kZXgsIHRydWUpOwogICAgICBpTWluWCA9IE1hdGgubWF4KGlNaW5YLCBpbmRleFswXSk7CiAgICAgIGlNaW5ZID0gTWF0aC5tYXgoaU1pblksIGluZGV4WzFdKTsKICAgICAgc2hhcGUuZ2V0SW5kZXhPZlBvc2l0aW9uKGFhYmIudXBwZXJCb3VuZC54LCBhYWJiLnVwcGVyQm91bmQueSwgaW5kZXgsIHRydWUpOwogICAgICBpTWF4WCA9IE1hdGgubWluKGlNYXhYLCBpbmRleFswXSArIDEpOwogICAgICBpTWF4WSA9IE1hdGgubWluKGlNYXhZLCBpbmRleFsxXSArIDEpOwoKICAgICAgZm9yIChsZXQgaSA9IGlNaW5YOyBpIDwgaU1heFg7IGkrKykgewogICAgICAgIGZvciAobGV0IGogPSBpTWluWTsgaiA8IGlNYXhZOyBqKyspIHsKICAgICAgICAgIGlmICh0aGlzLnJlc3VsdC5zaG91bGRTdG9wKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBzaGFwZS5nZXRBYWJiQXRJbmRleChpLCBqLCBhYWJiKTsKCiAgICAgICAgICBpZiAoIWFhYmIub3ZlcmxhcHNSYXkobG9jYWxSYXkpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfSAvLyBMb3dlciB0cmlhbmdsZQoKCiAgICAgICAgICBzaGFwZS5nZXRDb252ZXhUcmlhbmdsZVBpbGxhcihpLCBqLCBmYWxzZSk7CiAgICAgICAgICBUcmFuc2Zvcm0ucG9pbnRUb1dvcmxkRnJhbWUocG9zaXRpb24sIHF1YXQsIHNoYXBlLnBpbGxhck9mZnNldCwgd29ybGRQaWxsYXJPZmZzZXQpOwoKICAgICAgICAgIHRoaXMuX2ludGVyc2VjdENvbnZleChzaGFwZS5waWxsYXJDb252ZXgsIHF1YXQsIHdvcmxkUGlsbGFyT2Zmc2V0LCBib2R5LCByZXBvcnRlZFNoYXBlLCBpbnRlcnNlY3RDb252ZXhPcHRpb25zKTsKCiAgICAgICAgICBpZiAodGhpcy5yZXN1bHQuc2hvdWxkU3RvcCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9IC8vIFVwcGVyIHRyaWFuZ2xlCgoKICAgICAgICAgIHNoYXBlLmdldENvbnZleFRyaWFuZ2xlUGlsbGFyKGksIGosIHRydWUpOwogICAgICAgICAgVHJhbnNmb3JtLnBvaW50VG9Xb3JsZEZyYW1lKHBvc2l0aW9uLCBxdWF0LCBzaGFwZS5waWxsYXJPZmZzZXQsIHdvcmxkUGlsbGFyT2Zmc2V0KTsKCiAgICAgICAgICB0aGlzLl9pbnRlcnNlY3RDb252ZXgoc2hhcGUucGlsbGFyQ29udmV4LCBxdWF0LCB3b3JsZFBpbGxhck9mZnNldCwgYm9keSwgcmVwb3J0ZWRTaGFwZSwgaW50ZXJzZWN0Q29udmV4T3B0aW9ucyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgX2ludGVyc2VjdFNwaGVyZShzcGhlcmUsIHF1YXQsIHBvc2l0aW9uLCBib2R5LCByZXBvcnRlZFNoYXBlKSB7CiAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmZyb207CiAgICAgIGNvbnN0IHRvID0gdGhpcy50bzsKICAgICAgY29uc3QgciA9IHNwaGVyZS5yYWRpdXM7CiAgICAgIGNvbnN0IGEgPSAodG8ueCAtIGZyb20ueCkgKiogMiArICh0by55IC0gZnJvbS55KSAqKiAyICsgKHRvLnogLSBmcm9tLnopICoqIDI7CiAgICAgIGNvbnN0IGIgPSAyICogKCh0by54IC0gZnJvbS54KSAqIChmcm9tLnggLSBwb3NpdGlvbi54KSArICh0by55IC0gZnJvbS55KSAqIChmcm9tLnkgLSBwb3NpdGlvbi55KSArICh0by56IC0gZnJvbS56KSAqIChmcm9tLnogLSBwb3NpdGlvbi56KSk7CiAgICAgIGNvbnN0IGMgPSAoZnJvbS54IC0gcG9zaXRpb24ueCkgKiogMiArIChmcm9tLnkgLSBwb3NpdGlvbi55KSAqKiAyICsgKGZyb20ueiAtIHBvc2l0aW9uLnopICoqIDIgLSByICoqIDI7CiAgICAgIGNvbnN0IGRlbHRhID0gYiAqKiAyIC0gNCAqIGEgKiBjOwogICAgICBjb25zdCBpbnRlcnNlY3Rpb25Qb2ludCA9IFJheV9pbnRlcnNlY3RTcGhlcmVfaW50ZXJzZWN0aW9uUG9pbnQ7CiAgICAgIGNvbnN0IG5vcm1hbCA9IFJheV9pbnRlcnNlY3RTcGhlcmVfbm9ybWFsOwoKICAgICAgaWYgKGRlbHRhIDwgMCkgewogICAgICAgIC8vIE5vIGludGVyc2VjdGlvbgogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmIChkZWx0YSA9PT0gMCkgewogICAgICAgIC8vIHNpbmdsZSBpbnRlcnNlY3Rpb24gcG9pbnQKICAgICAgICBmcm9tLmxlcnAodG8sIGRlbHRhLCBpbnRlcnNlY3Rpb25Qb2ludCk7CiAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnQudnN1Yihwb3NpdGlvbiwgbm9ybWFsKTsKICAgICAgICBub3JtYWwubm9ybWFsaXplKCk7CiAgICAgICAgdGhpcy5yZXBvcnRJbnRlcnNlY3Rpb24obm9ybWFsLCBpbnRlcnNlY3Rpb25Qb2ludCwgcmVwb3J0ZWRTaGFwZSwgYm9keSwgLTEpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGQxID0gKC1iIC0gTWF0aC5zcXJ0KGRlbHRhKSkgLyAoMiAqIGEpOwogICAgICAgIGNvbnN0IGQyID0gKC1iICsgTWF0aC5zcXJ0KGRlbHRhKSkgLyAoMiAqIGEpOwoKICAgICAgICBpZiAoZDEgPj0gMCAmJiBkMSA8PSAxKSB7CiAgICAgICAgICBmcm9tLmxlcnAodG8sIGQxLCBpbnRlcnNlY3Rpb25Qb2ludCk7CiAgICAgICAgICBpbnRlcnNlY3Rpb25Qb2ludC52c3ViKHBvc2l0aW9uLCBub3JtYWwpOwogICAgICAgICAgbm9ybWFsLm5vcm1hbGl6ZSgpOwogICAgICAgICAgdGhpcy5yZXBvcnRJbnRlcnNlY3Rpb24obm9ybWFsLCBpbnRlcnNlY3Rpb25Qb2ludCwgcmVwb3J0ZWRTaGFwZSwgYm9keSwgLTEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMucmVzdWx0LnNob3VsZFN0b3ApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChkMiA+PSAwICYmIGQyIDw9IDEpIHsKICAgICAgICAgIGZyb20ubGVycCh0bywgZDIsIGludGVyc2VjdGlvblBvaW50KTsKICAgICAgICAgIGludGVyc2VjdGlvblBvaW50LnZzdWIocG9zaXRpb24sIG5vcm1hbCk7CiAgICAgICAgICBub3JtYWwubm9ybWFsaXplKCk7CiAgICAgICAgICB0aGlzLnJlcG9ydEludGVyc2VjdGlvbihub3JtYWwsIGludGVyc2VjdGlvblBvaW50LCByZXBvcnRlZFNoYXBlLCBib2R5LCAtMSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgX2ludGVyc2VjdENvbnZleChzaGFwZSwgcXVhdCwgcG9zaXRpb24sIGJvZHksIHJlcG9ydGVkU2hhcGUsIG9wdGlvbnMpIHsKICAgICAgY29uc3Qgbm9ybWFsID0gaW50ZXJzZWN0Q29udmV4X25vcm1hbDsKICAgICAgY29uc3QgdmVjdG9yID0gaW50ZXJzZWN0Q29udmV4X3ZlY3RvcjsKICAgICAgY29uc3QgZmFjZUxpc3QgPSBvcHRpb25zICYmIG9wdGlvbnMuZmFjZUxpc3QgfHwgbnVsbDsgLy8gQ2hlY2tpbmcgZmFjZXMKCiAgICAgIGNvbnN0IGZhY2VzID0gc2hhcGUuZmFjZXM7CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gc2hhcGUudmVydGljZXM7CiAgICAgIGNvbnN0IG5vcm1hbHMgPSBzaGFwZS5mYWNlTm9ybWFsczsKICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb247CiAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmZyb207CiAgICAgIGNvbnN0IHRvID0gdGhpcy50bzsKICAgICAgY29uc3QgZnJvbVRvRGlzdGFuY2UgPSBmcm9tLmRpc3RhbmNlVG8odG8pOwogICAgICBjb25zdCBOZmFjZXMgPSBmYWNlTGlzdCA/IGZhY2VMaXN0Lmxlbmd0aCA6IGZhY2VzLmxlbmd0aDsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHQ7CgogICAgICBmb3IgKGxldCBqID0gMDsgIXJlc3VsdC5zaG91bGRTdG9wICYmIGogPCBOZmFjZXM7IGorKykgewogICAgICAgIGNvbnN0IGZpID0gZmFjZUxpc3QgPyBmYWNlTGlzdFtqXSA6IGo7CiAgICAgICAgY29uc3QgZmFjZSA9IGZhY2VzW2ZpXTsKICAgICAgICBjb25zdCBmYWNlTm9ybWFsID0gbm9ybWFsc1tmaV07CiAgICAgICAgY29uc3QgcSA9IHF1YXQ7CiAgICAgICAgY29uc3QgeCA9IHBvc2l0aW9uOyAvLyBkZXRlcm1pbmUgaWYgcmF5IGludGVyc2VjdHMgdGhlIHBsYW5lIG9mIHRoZSBmYWNlCiAgICAgICAgLy8gbm90ZTogdGhpcyB3b3JrcyByZWdhcmRsZXNzIG9mIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGZhY2Ugbm9ybWFsCiAgICAgICAgLy8gR2V0IHBsYW5lIHBvaW50IGluIHdvcmxkIGNvb3JkaW5hdGVzLi4uCgogICAgICAgIHZlY3Rvci5jb3B5KHZlcnRpY2VzW2ZhY2VbMF1dKTsKICAgICAgICBxLnZtdWx0KHZlY3RvciwgdmVjdG9yKTsKICAgICAgICB2ZWN0b3IudmFkZCh4LCB2ZWN0b3IpOyAvLyAuLi5idXQgbWFrZSBpdCByZWxhdGl2ZSB0byB0aGUgcmF5IGZyb20uIFdlJ2xsIGZpeCB0aGlzIGxhdGVyLgoKICAgICAgICB2ZWN0b3IudnN1Yihmcm9tLCB2ZWN0b3IpOyAvLyBHZXQgcGxhbmUgbm9ybWFsCgogICAgICAgIHEudm11bHQoZmFjZU5vcm1hbCwgbm9ybWFsKTsgLy8gSWYgdGhpcyBkb3QgcHJvZHVjdCBpcyBuZWdhdGl2ZSwgd2UgaGF2ZSBzb21ldGhpbmcgaW50ZXJlc3RpbmcKCiAgICAgICAgY29uc3QgZG90ID0gZGlyZWN0aW9uLmRvdChub3JtYWwpOyAvLyBCYWlsIG91dCBpZiByYXkgYW5kIHBsYW5lIGFyZSBwYXJhbGxlbAoKICAgICAgICBpZiAoTWF0aC5hYnMoZG90KSA8IHRoaXMucHJlY2lzaW9uKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IC8vIGNhbGMgZGlzdGFuY2UgdG8gcGxhbmUKCgogICAgICAgIGNvbnN0IHNjYWxhciA9IG5vcm1hbC5kb3QodmVjdG9yKSAvIGRvdDsgLy8gaWYgbmVnYXRpdmUgZGlzdGFuY2UsIHRoZW4gcGxhbmUgaXMgYmVoaW5kIHJheQoKICAgICAgICBpZiAoc2NhbGFyIDwgMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSAvLyBpZiAoZG90IDwgMCkgewogICAgICAgIC8vIEludGVyc2VjdGlvbiBwb2ludCBpcyBmcm9tICsgZGlyZWN0aW9uICogc2NhbGFyCgoKICAgICAgICBkaXJlY3Rpb24uc2NhbGUoc2NhbGFyLCBpbnRlcnNlY3RQb2ludCk7CiAgICAgICAgaW50ZXJzZWN0UG9pbnQudmFkZChmcm9tLCBpbnRlcnNlY3RQb2ludCk7IC8vIGEgaXMgdGhlIHBvaW50IHdlIGNvbXBhcmUgcG9pbnRzIGIgYW5kIGMgd2l0aC4KCiAgICAgICAgYS5jb3B5KHZlcnRpY2VzW2ZhY2VbMF1dKTsKICAgICAgICBxLnZtdWx0KGEsIGEpOwogICAgICAgIHgudmFkZChhLCBhKTsKCiAgICAgICAgZm9yIChsZXQgaSA9IDE7ICFyZXN1bHQuc2hvdWxkU3RvcCAmJiBpIDwgZmFjZS5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIC8vIFRyYW5zZm9ybSAzIHZlcnRpY2VzIHRvIHdvcmxkIGNvb3JkcwogICAgICAgICAgYi5jb3B5KHZlcnRpY2VzW2ZhY2VbaV1dKTsKICAgICAgICAgIGMuY29weSh2ZXJ0aWNlc1tmYWNlW2kgKyAxXV0pOwogICAgICAgICAgcS52bXVsdChiLCBiKTsKICAgICAgICAgIHEudm11bHQoYywgYyk7CiAgICAgICAgICB4LnZhZGQoYiwgYik7CiAgICAgICAgICB4LnZhZGQoYywgYyk7CiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGludGVyc2VjdFBvaW50LmRpc3RhbmNlVG8oZnJvbSk7CgogICAgICAgICAgaWYgKCEoUmF5LnBvaW50SW5UcmlhbmdsZShpbnRlcnNlY3RQb2ludCwgYSwgYiwgYykgfHwgUmF5LnBvaW50SW5UcmlhbmdsZShpbnRlcnNlY3RQb2ludCwgYiwgYSwgYykpIHx8IGRpc3RhbmNlID4gZnJvbVRvRGlzdGFuY2UpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy5yZXBvcnRJbnRlcnNlY3Rpb24obm9ybWFsLCBpbnRlcnNlY3RQb2ludCwgcmVwb3J0ZWRTaGFwZSwgYm9keSwgZmkpOwogICAgICAgIH0gLy8gfQoKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAdG9kbyBPcHRpbWl6ZSBieSB0cmFuc2Zvcm1pbmcgdGhlIHdvcmxkIHRvIGxvY2FsIHNwYWNlIGZpcnN0LgogICAgICogQHRvZG8gVXNlIE9jdHJlZSBsb29rdXAKICAgICAqLwoKCiAgICBfaW50ZXJzZWN0VHJpbWVzaChtZXNoLCBxdWF0LCBwb3NpdGlvbiwgYm9keSwgcmVwb3J0ZWRTaGFwZSwgb3B0aW9ucykgewogICAgICBjb25zdCBub3JtYWwgPSBpbnRlcnNlY3RUcmltZXNoX25vcm1hbDsKICAgICAgY29uc3QgdHJpYW5nbGVzID0gaW50ZXJzZWN0VHJpbWVzaF90cmlhbmdsZXM7CiAgICAgIGNvbnN0IHRyZWVUcmFuc2Zvcm0gPSBpbnRlcnNlY3RUcmltZXNoX3RyZWVUcmFuc2Zvcm07CiAgICAgIGNvbnN0IHZlY3RvciA9IGludGVyc2VjdENvbnZleF92ZWN0b3I7CiAgICAgIGNvbnN0IGxvY2FsRGlyZWN0aW9uID0gaW50ZXJzZWN0VHJpbWVzaF9sb2NhbERpcmVjdGlvbjsKICAgICAgY29uc3QgbG9jYWxGcm9tID0gaW50ZXJzZWN0VHJpbWVzaF9sb2NhbEZyb207CiAgICAgIGNvbnN0IGxvY2FsVG8gPSBpbnRlcnNlY3RUcmltZXNoX2xvY2FsVG87CiAgICAgIGNvbnN0IHdvcmxkSW50ZXJzZWN0UG9pbnQgPSBpbnRlcnNlY3RUcmltZXNoX3dvcmxkSW50ZXJzZWN0UG9pbnQ7CiAgICAgIGNvbnN0IHdvcmxkTm9ybWFsID0gaW50ZXJzZWN0VHJpbWVzaF93b3JsZE5vcm1hbDsgLy8gQ2hlY2tpbmcgZmFjZXMKCiAgICAgIGNvbnN0IGluZGljZXMgPSBtZXNoLmluZGljZXM7CiAgICAgIG1lc2gudmVydGljZXM7IC8vIGNvbnN0IG5vcm1hbHMgPSBtZXNoLmZhY2VOb3JtYWxzCgogICAgICBjb25zdCBmcm9tID0gdGhpcy5mcm9tOwogICAgICBjb25zdCB0byA9IHRoaXMudG87CiAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuZGlyZWN0aW9uOwogICAgICB0cmVlVHJhbnNmb3JtLnBvc2l0aW9uLmNvcHkocG9zaXRpb24pOwogICAgICB0cmVlVHJhbnNmb3JtLnF1YXRlcm5pb24uY29weShxdWF0KTsgLy8gVHJhbnNmb3JtIHJheSB0byBsb2NhbCBzcGFjZSEKCiAgICAgIFRyYW5zZm9ybS52ZWN0b3JUb0xvY2FsRnJhbWUocG9zaXRpb24sIHF1YXQsIGRpcmVjdGlvbiwgbG9jYWxEaXJlY3Rpb24pOwogICAgICBUcmFuc2Zvcm0ucG9pbnRUb0xvY2FsRnJhbWUocG9zaXRpb24sIHF1YXQsIGZyb20sIGxvY2FsRnJvbSk7CiAgICAgIFRyYW5zZm9ybS5wb2ludFRvTG9jYWxGcmFtZShwb3NpdGlvbiwgcXVhdCwgdG8sIGxvY2FsVG8pOwogICAgICBsb2NhbFRvLnggKj0gbWVzaC5zY2FsZS54OwogICAgICBsb2NhbFRvLnkgKj0gbWVzaC5zY2FsZS55OwogICAgICBsb2NhbFRvLnogKj0gbWVzaC5zY2FsZS56OwogICAgICBsb2NhbEZyb20ueCAqPSBtZXNoLnNjYWxlLng7CiAgICAgIGxvY2FsRnJvbS55ICo9IG1lc2guc2NhbGUueTsKICAgICAgbG9jYWxGcm9tLnogKj0gbWVzaC5zY2FsZS56OwogICAgICBsb2NhbFRvLnZzdWIobG9jYWxGcm9tLCBsb2NhbERpcmVjdGlvbik7CiAgICAgIGxvY2FsRGlyZWN0aW9uLm5vcm1hbGl6ZSgpOwogICAgICBjb25zdCBmcm9tVG9EaXN0YW5jZVNxdWFyZWQgPSBsb2NhbEZyb20uZGlzdGFuY2VTcXVhcmVkKGxvY2FsVG8pOwogICAgICBtZXNoLnRyZWUucmF5UXVlcnkodGhpcywgdHJlZVRyYW5zZm9ybSwgdHJpYW5nbGVzKTsKCiAgICAgIGZvciAobGV0IGkgPSAwLCBOID0gdHJpYW5nbGVzLmxlbmd0aDsgIXRoaXMucmVzdWx0LnNob3VsZFN0b3AgJiYgaSAhPT0gTjsgaSsrKSB7CiAgICAgICAgY29uc3QgdHJpYW5nbGVzSW5kZXggPSB0cmlhbmdsZXNbaV07CiAgICAgICAgbWVzaC5nZXROb3JtYWwodHJpYW5nbGVzSW5kZXgsIG5vcm1hbCk7IC8vIGRldGVybWluZSBpZiByYXkgaW50ZXJzZWN0cyB0aGUgcGxhbmUgb2YgdGhlIGZhY2UKICAgICAgICAvLyBub3RlOiB0aGlzIHdvcmtzIHJlZ2FyZGxlc3Mgb2YgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZmFjZSBub3JtYWwKICAgICAgICAvLyBHZXQgcGxhbmUgcG9pbnQgaW4gd29ybGQgY29vcmRpbmF0ZXMuLi4KCiAgICAgICAgbWVzaC5nZXRWZXJ0ZXgoaW5kaWNlc1t0cmlhbmdsZXNJbmRleCAqIDNdLCBhKTsgLy8gLi4uYnV0IG1ha2UgaXQgcmVsYXRpdmUgdG8gdGhlIHJheSBmcm9tLiBXZSdsbCBmaXggdGhpcyBsYXRlci4KCiAgICAgICAgYS52c3ViKGxvY2FsRnJvbSwgdmVjdG9yKTsgLy8gSWYgdGhpcyBkb3QgcHJvZHVjdCBpcyBuZWdhdGl2ZSwgd2UgaGF2ZSBzb21ldGhpbmcgaW50ZXJlc3RpbmcKCiAgICAgICAgY29uc3QgZG90ID0gbG9jYWxEaXJlY3Rpb24uZG90KG5vcm1hbCk7IC8vIEJhaWwgb3V0IGlmIHJheSBhbmQgcGxhbmUgYXJlIHBhcmFsbGVsCiAgICAgICAgLy8gaWYgKE1hdGguYWJzKCBkb3QgKSA8IHRoaXMucHJlY2lzaW9uKXsKICAgICAgICAvLyAgICAgY29udGludWU7CiAgICAgICAgLy8gfQogICAgICAgIC8vIGNhbGMgZGlzdGFuY2UgdG8gcGxhbmUKCiAgICAgICAgY29uc3Qgc2NhbGFyID0gbm9ybWFsLmRvdCh2ZWN0b3IpIC8gZG90OyAvLyBpZiBuZWdhdGl2ZSBkaXN0YW5jZSwgdGhlbiBwbGFuZSBpcyBiZWhpbmQgcmF5CgogICAgICAgIGlmIChzY2FsYXIgPCAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IC8vIEludGVyc2VjdGlvbiBwb2ludCBpcyBmcm9tICsgZGlyZWN0aW9uICogc2NhbGFyCgoKICAgICAgICBsb2NhbERpcmVjdGlvbi5zY2FsZShzY2FsYXIsIGludGVyc2VjdFBvaW50KTsKICAgICAgICBpbnRlcnNlY3RQb2ludC52YWRkKGxvY2FsRnJvbSwgaW50ZXJzZWN0UG9pbnQpOyAvLyBHZXQgdHJpYW5nbGUgdmVydGljZXMKCiAgICAgICAgbWVzaC5nZXRWZXJ0ZXgoaW5kaWNlc1t0cmlhbmdsZXNJbmRleCAqIDMgKyAxXSwgYik7CiAgICAgICAgbWVzaC5nZXRWZXJ0ZXgoaW5kaWNlc1t0cmlhbmdsZXNJbmRleCAqIDMgKyAyXSwgYyk7CiAgICAgICAgY29uc3Qgc3F1YXJlZERpc3RhbmNlID0gaW50ZXJzZWN0UG9pbnQuZGlzdGFuY2VTcXVhcmVkKGxvY2FsRnJvbSk7CgogICAgICAgIGlmICghKFJheS5wb2ludEluVHJpYW5nbGUoaW50ZXJzZWN0UG9pbnQsIGIsIGEsIGMpIHx8IFJheS5wb2ludEluVHJpYW5nbGUoaW50ZXJzZWN0UG9pbnQsIGEsIGIsIGMpKSB8fCBzcXVhcmVkRGlzdGFuY2UgPiBmcm9tVG9EaXN0YW5jZVNxdWFyZWQpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gLy8gdHJhbnNmb3JtIGludGVyc2VjdHBvaW50IGFuZCBub3JtYWwgdG8gd29ybGQKCgogICAgICAgIFRyYW5zZm9ybS52ZWN0b3JUb1dvcmxkRnJhbWUocXVhdCwgbm9ybWFsLCB3b3JsZE5vcm1hbCk7CiAgICAgICAgVHJhbnNmb3JtLnBvaW50VG9Xb3JsZEZyYW1lKHBvc2l0aW9uLCBxdWF0LCBpbnRlcnNlY3RQb2ludCwgd29ybGRJbnRlcnNlY3RQb2ludCk7CiAgICAgICAgdGhpcy5yZXBvcnRJbnRlcnNlY3Rpb24od29ybGROb3JtYWwsIHdvcmxkSW50ZXJzZWN0UG9pbnQsIHJlcG9ydGVkU2hhcGUsIGJvZHksIHRyaWFuZ2xlc0luZGV4KTsKICAgICAgfQoKICAgICAgdHJpYW5nbGVzLmxlbmd0aCA9IDA7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgaW50ZXJzZWN0aW9ucyBzaG91bGQgY29udGludWUKICAgICAqLwoKCiAgICByZXBvcnRJbnRlcnNlY3Rpb24obm9ybWFsLCBoaXRQb2ludFdvcmxkLCBzaGFwZSwgYm9keSwgaGl0RmFjZUluZGV4KSB7CiAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmZyb207CiAgICAgIGNvbnN0IHRvID0gdGhpcy50bzsKICAgICAgY29uc3QgZGlzdGFuY2UgPSBmcm9tLmRpc3RhbmNlVG8oaGl0UG9pbnRXb3JsZCk7CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0OyAvLyBTa2lwIGJhY2sgZmFjZXM/CgogICAgICBpZiAodGhpcy5za2lwQmFja2ZhY2VzICYmIG5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pID4gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgcmVzdWx0LmhpdEZhY2VJbmRleCA9IHR5cGVvZiBoaXRGYWNlSW5kZXggIT09ICd1bmRlZmluZWQnID8gaGl0RmFjZUluZGV4IDogLTE7CgogICAgICBzd2l0Y2ggKHRoaXMubW9kZSkgewogICAgICAgIGNhc2UgUmF5LkFMTDoKICAgICAgICAgIHRoaXMuaGFzSGl0ID0gdHJ1ZTsKICAgICAgICAgIHJlc3VsdC5zZXQoZnJvbSwgdG8sIG5vcm1hbCwgaGl0UG9pbnRXb3JsZCwgc2hhcGUsIGJvZHksIGRpc3RhbmNlKTsKICAgICAgICAgIHJlc3VsdC5oYXNIaXQgPSB0cnVlOwogICAgICAgICAgdGhpcy5jYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUmF5LkNMT1NFU1Q6CiAgICAgICAgICAvLyBTdG9yZSBpZiBjbG9zZXIgdGhhbiBjdXJyZW50IGNsb3Nlc3QKICAgICAgICAgIGlmIChkaXN0YW5jZSA8IHJlc3VsdC5kaXN0YW5jZSB8fCAhcmVzdWx0Lmhhc0hpdCkgewogICAgICAgICAgICB0aGlzLmhhc0hpdCA9IHRydWU7CiAgICAgICAgICAgIHJlc3VsdC5oYXNIaXQgPSB0cnVlOwogICAgICAgICAgICByZXN1bHQuc2V0KGZyb20sIHRvLCBub3JtYWwsIGhpdFBvaW50V29ybGQsIHNoYXBlLCBib2R5LCBkaXN0YW5jZSk7CiAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUmF5LkFOWToKICAgICAgICAgIC8vIFJlcG9ydCBhbmQgc3RvcC4KICAgICAgICAgIHRoaXMuaGFzSGl0ID0gdHJ1ZTsKICAgICAgICAgIHJlc3VsdC5oYXNIaXQgPSB0cnVlOwogICAgICAgICAgcmVzdWx0LnNldChmcm9tLCB0bywgbm9ybWFsLCBoaXRQb2ludFdvcmxkLCBzaGFwZSwgYm9keSwgZGlzdGFuY2UpOwogICAgICAgICAgcmVzdWx0LnNob3VsZFN0b3AgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQXMgcGVyICJCYXJ5Y2VudHJpYyBUZWNobmlxdWUiIGFzIG5hbWVkCiAgICAgKiB7QGxpbmsgaHR0cHM6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9kZWZhdWx0Lmh0bWwgaGVyZX0gYnV0IHdpdGhvdXQgdGhlIGRpdmlzaW9uCiAgICAgKi8KCgogICAgc3RhdGljIHBvaW50SW5UcmlhbmdsZShwLCBhLCBiLCBjKSB7CiAgICAgIGMudnN1YihhLCB2MCk7CiAgICAgIGIudnN1YihhLCB2MSk7CiAgICAgIHAudnN1YihhLCB2Mik7CiAgICAgIGNvbnN0IGRvdDAwID0gdjAuZG90KHYwKTsKICAgICAgY29uc3QgZG90MDEgPSB2MC5kb3QodjEpOwogICAgICBjb25zdCBkb3QwMiA9IHYwLmRvdCh2Mik7CiAgICAgIGNvbnN0IGRvdDExID0gdjEuZG90KHYxKTsKICAgICAgY29uc3QgZG90MTIgPSB2MS5kb3QodjIpOwogICAgICBsZXQgdTsKICAgICAgbGV0IHY7CiAgICAgIHJldHVybiAodSA9IGRvdDExICogZG90MDIgLSBkb3QwMSAqIGRvdDEyKSA+PSAwICYmICh2ID0gZG90MDAgKiBkb3QxMiAtIGRvdDAxICogZG90MDIpID49IDAgJiYgdSArIHYgPCBkb3QwMCAqIGRvdDExIC0gZG90MDEgKiBkb3QwMTsKICAgIH0KCiAgfQogIFJheS5DTE9TRVNUID0gUkFZX01PREVTLkNMT1NFU1Q7CiAgUmF5LkFOWSA9IFJBWV9NT0RFUy5BTlk7CiAgUmF5LkFMTCA9IFJBWV9NT0RFUy5BTEw7CiAgY29uc3QgdG1wQUFCQiQxID0gbmV3IEFBQkIoKTsKICBjb25zdCB0bXBBcnJheSA9IFtdOwogIGNvbnN0IHYxID0gbmV3IFZlYzMoKTsKICBjb25zdCB2MiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgaW50ZXJzZWN0Qm9keV94aSA9IG5ldyBWZWMzKCk7CiAgY29uc3QgaW50ZXJzZWN0Qm9keV9xaSA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgY29uc3QgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjMygpOwogIGNvbnN0IGEgPSBuZXcgVmVjMygpOwogIGNvbnN0IGIgPSBuZXcgVmVjMygpOwogIGNvbnN0IGMgPSBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CiAgbmV3IFJheWNhc3RSZXN1bHQoKTsKICBjb25zdCBpbnRlcnNlY3RDb252ZXhPcHRpb25zID0gewogICAgZmFjZUxpc3Q6IFswXQogIH07CiAgY29uc3Qgd29ybGRQaWxsYXJPZmZzZXQgPSBuZXcgVmVjMygpOwogIGNvbnN0IGludGVyc2VjdEhlaWdodGZpZWxkX2xvY2FsUmF5ID0gbmV3IFJheSgpOwogIGNvbnN0IGludGVyc2VjdEhlaWdodGZpZWxkX2luZGV4ID0gW107CiAgY29uc3QgUmF5X2ludGVyc2VjdFNwaGVyZV9pbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgUmF5X2ludGVyc2VjdFNwaGVyZV9ub3JtYWwgPSBuZXcgVmVjMygpOwogIGNvbnN0IGludGVyc2VjdENvbnZleF9ub3JtYWwgPSBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CiAgbmV3IFZlYzMoKTsKICBjb25zdCBpbnRlcnNlY3RDb252ZXhfdmVjdG9yID0gbmV3IFZlYzMoKTsKICBjb25zdCBpbnRlcnNlY3RUcmltZXNoX25vcm1hbCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgaW50ZXJzZWN0VHJpbWVzaF9sb2NhbERpcmVjdGlvbiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgaW50ZXJzZWN0VHJpbWVzaF9sb2NhbEZyb20gPSBuZXcgVmVjMygpOwogIGNvbnN0IGludGVyc2VjdFRyaW1lc2hfbG9jYWxUbyA9IG5ldyBWZWMzKCk7CiAgY29uc3QgaW50ZXJzZWN0VHJpbWVzaF93b3JsZE5vcm1hbCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgaW50ZXJzZWN0VHJpbWVzaF93b3JsZEludGVyc2VjdFBvaW50ID0gbmV3IFZlYzMoKTsKICBuZXcgQUFCQigpOwogIGNvbnN0IGludGVyc2VjdFRyaW1lc2hfdHJpYW5nbGVzID0gW107CiAgY29uc3QgaW50ZXJzZWN0VHJpbWVzaF90cmVlVHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybSgpOwogIGNvbnN0IHYwID0gbmV3IFZlYzMoKTsKICBjb25zdCBpbnRlcnNlY3QgPSBuZXcgVmVjMygpOwoKICBmdW5jdGlvbiBkaXN0YW5jZUZyb21JbnRlcnNlY3Rpb24oZnJvbSwgZGlyZWN0aW9uLCBwb3NpdGlvbikgewogICAgLy8gdjAgaXMgdmVjdG9yIGZyb20gZnJvbSB0byBwb3NpdGlvbgogICAgcG9zaXRpb24udnN1Yihmcm9tLCB2MCk7CiAgICBjb25zdCBkb3QgPSB2MC5kb3QoZGlyZWN0aW9uKTsgLy8gaW50ZXJzZWN0ID0gZGlyZWN0aW9uKmRvdCArIGZyb20KCiAgICBkaXJlY3Rpb24uc2NhbGUoZG90LCBpbnRlcnNlY3QpOwogICAgaW50ZXJzZWN0LnZhZGQoZnJvbSwgaW50ZXJzZWN0KTsKICAgIGNvbnN0IGRpc3RhbmNlID0gcG9zaXRpb24uZGlzdGFuY2VUbyhpbnRlcnNlY3QpOwogICAgcmV0dXJuIGRpc3RhbmNlOwogIH0KCiAgLyoqCiAgICogU3dlZXAgYW5kIHBydW5lIGJyb2FkcGhhc2UgYWxvbmcgb25lIGF4aXMuCiAgICovCiAgY2xhc3MgU0FQQnJvYWRwaGFzZSBleHRlbmRzIEJyb2FkcGhhc2UgewogICAgLyoqCiAgICAgKiBMaXN0IG9mIGJvZGllcyBjdXJyZW50bHkgaW4gdGhlIGJyb2FkcGhhc2UuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSB3b3JsZCB0byBzZWFyY2ggaW4uCiAgICAgKi8KCiAgICAvKioKICAgICAqIEF4aXMgdG8gc29ydCB0aGUgYm9kaWVzIGFsb25nLgogICAgICogU2V0IHRvIDAgZm9yIHggYXhpcywgYW5kIDEgZm9yIHkgYXhpcy4KICAgICAqIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBwaWNrIHRoZSBheGlzIHdoZXJlIGJvZGllcyBhcmUgbW9zdCBkaXN0cmlidXRlZC4KICAgICAqLwoKICAgIC8qKgogICAgICogQ2hlY2sgaWYgdGhlIGJvdW5kcyBvZiB0d28gYm9kaWVzIG92ZXJsYXAsIGFsb25nIHRoZSBnaXZlbiBTQVAgYXhpcy4KICAgICAqLwogICAgc3RhdGljIGNoZWNrQm91bmRzKGJpLCBiaiwgYXhpc0luZGV4KSB7CiAgICAgIGxldCBiaVBvczsKICAgICAgbGV0IGJqUG9zOwoKICAgICAgaWYgKGF4aXNJbmRleCA9PT0gMCkgewogICAgICAgIGJpUG9zID0gYmkucG9zaXRpb24ueDsKICAgICAgICBialBvcyA9IGJqLnBvc2l0aW9uLng7CiAgICAgIH0gZWxzZSBpZiAoYXhpc0luZGV4ID09PSAxKSB7CiAgICAgICAgYmlQb3MgPSBiaS5wb3NpdGlvbi55OwogICAgICAgIGJqUG9zID0gYmoucG9zaXRpb24ueTsKICAgICAgfSBlbHNlIGlmIChheGlzSW5kZXggPT09IDIpIHsKICAgICAgICBiaVBvcyA9IGJpLnBvc2l0aW9uLno7CiAgICAgICAgYmpQb3MgPSBiai5wb3NpdGlvbi56OwogICAgICB9CgogICAgICBjb25zdCByaSA9IGJpLmJvdW5kaW5nUmFkaXVzLAogICAgICAgICAgICByaiA9IGJqLmJvdW5kaW5nUmFkaXVzLAogICAgICAgICAgICBib3VuZEEyID0gYmlQb3MgKyByaSwKICAgICAgICAgICAgYm91bmRCMSA9IGJqUG9zIC0gcmo7CiAgICAgIHJldHVybiBib3VuZEIxIDwgYm91bmRBMjsKICAgIH0gLy8gTm90ZTogdGhlc2UgYXJlIGlkZW50aWNhbCwgc2F2ZSBmb3IgeC95L3ogbG93ZXJib3VuZAoKICAgIC8qKgogICAgICogaW5zZXJ0aW9uU29ydFgKICAgICAqLwoKCiAgICBzdGF0aWMgaW5zZXJ0aW9uU29ydFgoYSkgewogICAgICBmb3IgKGxldCBpID0gMSwgbCA9IGEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgY29uc3QgdiA9IGFbaV07CiAgICAgICAgbGV0IGo7CgogICAgICAgIGZvciAoaiA9IGkgLSAxOyBqID49IDA7IGotLSkgewogICAgICAgICAgaWYgKGFbal0uYWFiYi5sb3dlckJvdW5kLnggPD0gdi5hYWJiLmxvd2VyQm91bmQueCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgICBhW2ogKyAxXSA9IGFbal07CiAgICAgICAgfQoKICAgICAgICBhW2ogKyAxXSA9IHY7CiAgICAgIH0KCiAgICAgIHJldHVybiBhOwogICAgfQogICAgLyoqCiAgICAgKiBpbnNlcnRpb25Tb3J0WQogICAgICovCgoKICAgIHN0YXRpYyBpbnNlcnRpb25Tb3J0WShhKSB7CiAgICAgIGZvciAobGV0IGkgPSAxLCBsID0gYS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCB2ID0gYVtpXTsKICAgICAgICBsZXQgajsKCiAgICAgICAgZm9yIChqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICBpZiAoYVtqXS5hYWJiLmxvd2VyQm91bmQueSA8PSB2LmFhYmIubG93ZXJCb3VuZC55KSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICAgIGFbaiArIDFdID0gYVtqXTsKICAgICAgICB9CgogICAgICAgIGFbaiArIDFdID0gdjsKICAgICAgfQoKICAgICAgcmV0dXJuIGE7CiAgICB9CiAgICAvKioKICAgICAqIGluc2VydGlvblNvcnRaCiAgICAgKi8KCgogICAgc3RhdGljIGluc2VydGlvblNvcnRaKGEpIHsKICAgICAgZm9yIChsZXQgaSA9IDEsIGwgPSBhLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIGNvbnN0IHYgPSBhW2ldOwogICAgICAgIGxldCBqOwoKICAgICAgICBmb3IgKGogPSBpIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICAgIGlmIChhW2pdLmFhYmIubG93ZXJCb3VuZC56IDw9IHYuYWFiYi5sb3dlckJvdW5kLnopIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgYVtqICsgMV0gPSBhW2pdOwogICAgICAgIH0KCiAgICAgICAgYVtqICsgMV0gPSB2OwogICAgICB9CgogICAgICByZXR1cm4gYTsKICAgIH0KCiAgICBjb25zdHJ1Y3Rvcih3b3JsZCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmF4aXNMaXN0ID0gW107CiAgICAgIHRoaXMud29ybGQgPSBudWxsOwogICAgICB0aGlzLmF4aXNJbmRleCA9IDA7CiAgICAgIGNvbnN0IGF4aXNMaXN0ID0gdGhpcy5heGlzTGlzdDsKCiAgICAgIHRoaXMuX2FkZEJvZHlIYW5kbGVyID0gZXZlbnQgPT4gewogICAgICAgIGF4aXNMaXN0LnB1c2goZXZlbnQuYm9keSk7CiAgICAgIH07CgogICAgICB0aGlzLl9yZW1vdmVCb2R5SGFuZGxlciA9IGV2ZW50ID0+IHsKICAgICAgICBjb25zdCBpZHggPSBheGlzTGlzdC5pbmRleE9mKGV2ZW50LmJvZHkpOwoKICAgICAgICBpZiAoaWR4ICE9PSAtMSkgewogICAgICAgICAgYXhpc0xpc3Quc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgaWYgKHdvcmxkKSB7CiAgICAgICAgdGhpcy5zZXRXb3JsZCh3b3JsZCk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2hhbmdlIHRoZSB3b3JsZAogICAgICovCgoKICAgIHNldFdvcmxkKHdvcmxkKSB7CiAgICAgIC8vIENsZWFyIHRoZSBvbGQgYXhpcyBhcnJheQogICAgICB0aGlzLmF4aXNMaXN0Lmxlbmd0aCA9IDA7IC8vIEFkZCBhbGwgYm9kaWVzIGZyb20gdGhlIG5ldyB3b3JsZAoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JsZC5ib2RpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLmF4aXNMaXN0LnB1c2god29ybGQuYm9kaWVzW2ldKTsKICAgICAgfSAvLyBSZW1vdmUgb2xkIGhhbmRsZXJzLCBpZiBhbnkKCgogICAgICB3b3JsZC5yZW1vdmVFdmVudExpc3RlbmVyKCdhZGRCb2R5JywgdGhpcy5fYWRkQm9keUhhbmRsZXIpOwogICAgICB3b3JsZC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW1vdmVCb2R5JywgdGhpcy5fcmVtb3ZlQm9keUhhbmRsZXIpOyAvLyBBZGQgaGFuZGxlcnMgdG8gdXBkYXRlIHRoZSBsaXN0IG9mIGJvZGllcy4KCiAgICAgIHdvcmxkLmFkZEV2ZW50TGlzdGVuZXIoJ2FkZEJvZHknLCB0aGlzLl9hZGRCb2R5SGFuZGxlcik7CiAgICAgIHdvcmxkLmFkZEV2ZW50TGlzdGVuZXIoJ3JlbW92ZUJvZHknLCB0aGlzLl9yZW1vdmVCb2R5SGFuZGxlcik7CiAgICAgIHRoaXMud29ybGQgPSB3b3JsZDsKICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIENvbGxlY3QgYWxsIGNvbGxpc2lvbiBwYWlycwogICAgICovCgoKICAgIGNvbGxpc2lvblBhaXJzKHdvcmxkLCBwMSwgcDIpIHsKICAgICAgY29uc3QgYm9kaWVzID0gdGhpcy5heGlzTGlzdDsKICAgICAgY29uc3QgTiA9IGJvZGllcy5sZW5ndGg7CiAgICAgIGNvbnN0IGF4aXNJbmRleCA9IHRoaXMuYXhpc0luZGV4OwogICAgICBsZXQgaTsKICAgICAgbGV0IGo7CgogICAgICBpZiAodGhpcy5kaXJ0eSkgewogICAgICAgIHRoaXMuc29ydExpc3QoKTsKICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7CiAgICAgIH0gLy8gTG9vayB0aHJvdWdoIHRoZSBsaXN0CgoKICAgICAgZm9yIChpID0gMDsgaSAhPT0gTjsgaSsrKSB7CiAgICAgICAgY29uc3QgYmkgPSBib2RpZXNbaV07CgogICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgTjsgaisrKSB7CiAgICAgICAgICBjb25zdCBiaiA9IGJvZGllc1tqXTsKCiAgICAgICAgICBpZiAoIXRoaXMubmVlZEJyb2FkcGhhc2VDb2xsaXNpb24oYmksIGJqKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIVNBUEJyb2FkcGhhc2UuY2hlY2tCb3VuZHMoYmksIGJqLCBheGlzSW5kZXgpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uVGVzdChiaSwgYmosIHAxLCBwMik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc29ydExpc3QoKSB7CiAgICAgIGNvbnN0IGF4aXNMaXN0ID0gdGhpcy5heGlzTGlzdDsKICAgICAgY29uc3QgYXhpc0luZGV4ID0gdGhpcy5heGlzSW5kZXg7CiAgICAgIGNvbnN0IE4gPSBheGlzTGlzdC5sZW5ndGg7IC8vIFVwZGF0ZSBBQUJCcwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IE47IGkrKykgewogICAgICAgIGNvbnN0IGJpID0gYXhpc0xpc3RbaV07CgogICAgICAgIGlmIChiaS5hYWJiTmVlZHNVcGRhdGUpIHsKICAgICAgICAgIGJpLnVwZGF0ZUFBQkIoKTsKICAgICAgICB9CiAgICAgIH0gLy8gU29ydCB0aGUgbGlzdAoKCiAgICAgIGlmIChheGlzSW5kZXggPT09IDApIHsKICAgICAgICBTQVBCcm9hZHBoYXNlLmluc2VydGlvblNvcnRYKGF4aXNMaXN0KTsKICAgICAgfSBlbHNlIGlmIChheGlzSW5kZXggPT09IDEpIHsKICAgICAgICBTQVBCcm9hZHBoYXNlLmluc2VydGlvblNvcnRZKGF4aXNMaXN0KTsKICAgICAgfSBlbHNlIGlmIChheGlzSW5kZXggPT09IDIpIHsKICAgICAgICBTQVBCcm9hZHBoYXNlLmluc2VydGlvblNvcnRaKGF4aXNMaXN0KTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb21wdXRlcyB0aGUgdmFyaWFuY2Ugb2YgdGhlIGJvZHkgcG9zaXRpb25zIGFuZCBlc3RpbWF0ZXMgdGhlIGJlc3QgYXhpcyB0byB1c2UuCiAgICAgKiBXaWxsIGF1dG9tYXRpY2FsbHkgc2V0IHByb3BlcnR5IGBheGlzSW5kZXhgLgogICAgICovCgoKICAgIGF1dG9EZXRlY3RBeGlzKCkgewogICAgICBsZXQgc3VtWCA9IDA7CiAgICAgIGxldCBzdW1YMiA9IDA7CiAgICAgIGxldCBzdW1ZID0gMDsKICAgICAgbGV0IHN1bVkyID0gMDsKICAgICAgbGV0IHN1bVogPSAwOwogICAgICBsZXQgc3VtWjIgPSAwOwogICAgICBjb25zdCBib2RpZXMgPSB0aGlzLmF4aXNMaXN0OwogICAgICBjb25zdCBOID0gYm9kaWVzLmxlbmd0aDsKICAgICAgY29uc3QgaW52TiA9IDEgLyBOOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IE47IGkrKykgewogICAgICAgIGNvbnN0IGIgPSBib2RpZXNbaV07CiAgICAgICAgY29uc3QgY2VudGVyWCA9IGIucG9zaXRpb24ueDsKICAgICAgICBzdW1YICs9IGNlbnRlclg7CiAgICAgICAgc3VtWDIgKz0gY2VudGVyWCAqIGNlbnRlclg7CiAgICAgICAgY29uc3QgY2VudGVyWSA9IGIucG9zaXRpb24ueTsKICAgICAgICBzdW1ZICs9IGNlbnRlclk7CiAgICAgICAgc3VtWTIgKz0gY2VudGVyWSAqIGNlbnRlclk7CiAgICAgICAgY29uc3QgY2VudGVyWiA9IGIucG9zaXRpb24uejsKICAgICAgICBzdW1aICs9IGNlbnRlclo7CiAgICAgICAgc3VtWjIgKz0gY2VudGVyWiAqIGNlbnRlclo7CiAgICAgIH0KCiAgICAgIGNvbnN0IHZhcmlhbmNlWCA9IHN1bVgyIC0gc3VtWCAqIHN1bVggKiBpbnZOOwogICAgICBjb25zdCB2YXJpYW5jZVkgPSBzdW1ZMiAtIHN1bVkgKiBzdW1ZICogaW52TjsKICAgICAgY29uc3QgdmFyaWFuY2VaID0gc3VtWjIgLSBzdW1aICogc3VtWiAqIGludk47CgogICAgICBpZiAodmFyaWFuY2VYID4gdmFyaWFuY2VZKSB7CiAgICAgICAgaWYgKHZhcmlhbmNlWCA+IHZhcmlhbmNlWikgewogICAgICAgICAgdGhpcy5heGlzSW5kZXggPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmF4aXNJbmRleCA9IDI7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHZhcmlhbmNlWSA+IHZhcmlhbmNlWikgewogICAgICAgIHRoaXMuYXhpc0luZGV4ID0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmF4aXNJbmRleCA9IDI7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgdGhlIGJvZGllcyB3aXRoaW4gYW4gQUFCQi4KICAgICAqIEBwYXJhbSByZXN1bHQgQW4gYXJyYXkgdG8gc3RvcmUgcmVzdWx0aW5nIGJvZGllcyBpbi4KICAgICAqLwoKCiAgICBhYWJiUXVlcnkod29ybGQsIGFhYmIsIHJlc3VsdCkgewogICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIHsKICAgICAgICByZXN1bHQgPSBbXTsKICAgICAgfQoKICAgICAgaWYgKHRoaXMuZGlydHkpIHsKICAgICAgICB0aGlzLnNvcnRMaXN0KCk7CiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlOwogICAgICB9CgogICAgICBjb25zdCBheGlzSW5kZXggPSB0aGlzLmF4aXNJbmRleDsKICAgICAgbGV0IGF4aXMgPSAneCc7CgogICAgICBpZiAoYXhpc0luZGV4ID09PSAxKSB7CiAgICAgICAgYXhpcyA9ICd5JzsKICAgICAgfQoKICAgICAgaWYgKGF4aXNJbmRleCA9PT0gMikgewogICAgICAgIGF4aXMgPSAneic7CiAgICAgIH0KCiAgICAgIGNvbnN0IGF4aXNMaXN0ID0gdGhpcy5heGlzTGlzdDsKICAgICAgYWFiYi5sb3dlckJvdW5kW2F4aXNdOwogICAgICBhYWJiLnVwcGVyQm91bmRbYXhpc107CgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF4aXNMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgYiA9IGF4aXNMaXN0W2ldOwoKICAgICAgICBpZiAoYi5hYWJiTmVlZHNVcGRhdGUpIHsKICAgICAgICAgIGIudXBkYXRlQUFCQigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGIuYWFiYi5vdmVybGFwcyhhYWJiKSkgewogICAgICAgICAgcmVzdWx0LnB1c2goYik7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICB9CgogIGNsYXNzIFV0aWxzIHsKICAgIC8qKgogICAgICogRXh0ZW5kIGFuIG9wdGlvbnMgb2JqZWN0IHdpdGggZGVmYXVsdCB2YWx1ZXMuCiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvYmplY3QuIE1heSBiZSBmYWxzeTogaW4gdGhpcyBjYXNlLCBhIG5ldyBvYmplY3QgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuCiAgICAgKiBAcGFyYW0gZGVmYXVsdHMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCB2YWx1ZXMuCiAgICAgKiBAcmV0dXJuIFRoZSBtb2RpZmllZCBvcHRpb25zIG9iamVjdC4KICAgICAqLwogICAgc3RhdGljIGRlZmF1bHRzKG9wdGlvbnMsIGRlZmF1bHRzKSB7CiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KCiAgICAgIGZvciAobGV0IGtleSBpbiBkZWZhdWx0cykgewogICAgICAgIGlmICghKGtleSBpbiBvcHRpb25zKSkgewogICAgICAgICAgb3B0aW9uc1trZXldID0gZGVmYXVsdHNba2V5XTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBvcHRpb25zOwogICAgfQoKICB9CgogIC8qKgogICAqIENvbnN0cmFpbnQgYmFzZSBjbGFzcwogICAqLwogIGNsYXNzIENvbnN0cmFpbnQgewogICAgLyoqCiAgICAgKiBFcXVhdGlvbnMgdG8gYmUgc29sdmVkIGluIHRoaXMgY29uc3RyYWludC4KICAgICAqLwoKICAgIC8qKgogICAgICogQm9keSBBLgogICAgICovCgogICAgLyoqCiAgICAgKiBCb2R5IEIuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgYm9kaWVzIHRvIGNvbGxpZGUgd2hlbiB0aGV5IGFyZSBjb25uZWN0ZWQuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGJvZHlBLCBib2R5Qiwgb3B0aW9ucykgewogICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7CiAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICB9CgogICAgICBvcHRpb25zID0gVXRpbHMuZGVmYXVsdHMob3B0aW9ucywgewogICAgICAgIGNvbGxpZGVDb25uZWN0ZWQ6IHRydWUsCiAgICAgICAgd2FrZVVwQm9kaWVzOiB0cnVlCiAgICAgIH0pOwogICAgICB0aGlzLmVxdWF0aW9ucyA9IFtdOwogICAgICB0aGlzLmJvZHlBID0gYm9keUE7CiAgICAgIHRoaXMuYm9keUIgPSBib2R5QjsKICAgICAgdGhpcy5pZCA9IENvbnN0cmFpbnQuaWRDb3VudGVyKys7CiAgICAgIHRoaXMuY29sbGlkZUNvbm5lY3RlZCA9IG9wdGlvbnMuY29sbGlkZUNvbm5lY3RlZDsKCiAgICAgIGlmIChvcHRpb25zLndha2VVcEJvZGllcykgewogICAgICAgIGlmIChib2R5QSkgewogICAgICAgICAgYm9keUEud2FrZVVwKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYm9keUIpIHsKICAgICAgICAgIGJvZHlCLndha2VVcCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgYWxsIHRoZSBlcXVhdGlvbnMgd2l0aCBkYXRhLgogICAgICovCgoKICAgIHVwZGF0ZSgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXRob2QgdXBkYXRlKCkgbm90IGltcGxtZW1lbnRlZCBpbiB0aGlzIENvbnN0cmFpbnQgc3ViY2xhc3MhJyk7CiAgICB9CiAgICAvKioKICAgICAqIEVuYWJsZXMgYWxsIGVxdWF0aW9ucyBpbiB0aGUgY29uc3RyYWludC4KICAgICAqLwoKCiAgICBlbmFibGUoKSB7CiAgICAgIGNvbnN0IGVxcyA9IHRoaXMuZXF1YXRpb25zOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlcXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBlcXNbaV0uZW5hYmxlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGlzYWJsZXMgYWxsIGVxdWF0aW9ucyBpbiB0aGUgY29uc3RyYWludC4KICAgICAqLwoKCiAgICBkaXNhYmxlKCkgewogICAgICBjb25zdCBlcXMgPSB0aGlzLmVxdWF0aW9uczsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXFzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZXFzW2ldLmVuYWJsZWQgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICB9CiAgQ29uc3RyYWludC5pZENvdW50ZXIgPSAwOwoKICAvKioKICAgKiBBbiBlbGVtZW50IGNvbnRhaW5pbmcgNiBlbnRyaWVzLCAzIHNwYXRpYWwgYW5kIDMgcm90YXRpb25hbCBkZWdyZWVzIG9mIGZyZWVkb20uCiAgICovCgogIGNsYXNzIEphY29iaWFuRWxlbWVudCB7CiAgICAvKioKICAgICAqIHNwYXRpYWwKICAgICAqLwoKICAgIC8qKgogICAgICogcm90YXRpb25hbAogICAgICovCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy5zcGF0aWFsID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5yb3RhdGlvbmFsID0gbmV3IFZlYzMoKTsKICAgIH0KICAgIC8qKgogICAgICogTXVsdGlwbHkgd2l0aCBvdGhlciBKYWNvYmlhbkVsZW1lbnQKICAgICAqLwoKCiAgICBtdWx0aXBseUVsZW1lbnQoZWxlbWVudCkgewogICAgICByZXR1cm4gZWxlbWVudC5zcGF0aWFsLmRvdCh0aGlzLnNwYXRpYWwpICsgZWxlbWVudC5yb3RhdGlvbmFsLmRvdCh0aGlzLnJvdGF0aW9uYWwpOwogICAgfQogICAgLyoqCiAgICAgKiBNdWx0aXBseSB3aXRoIHR3byB2ZWN0b3JzCiAgICAgKi8KCgogICAgbXVsdGlwbHlWZWN0b3JzKHNwYXRpYWwsIHJvdGF0aW9uYWwpIHsKICAgICAgcmV0dXJuIHNwYXRpYWwuZG90KHRoaXMuc3BhdGlhbCkgKyByb3RhdGlvbmFsLmRvdCh0aGlzLnJvdGF0aW9uYWwpOwogICAgfQoKICB9CgogIC8qKgogICAqIEVxdWF0aW9uIGJhc2UgY2xhc3MuCiAgICoKICAgKiBgYWAsIGBiYCBhbmQgYGVwc2AgYXJlIHtAbGluayBodHRwczovL3d3dzguY3MudW11LnNlL2t1cnNlci81RFYwNTgvVlQxNS9sZWN0dXJlcy9TUE9PS2xhYm5vdGVzLnBkZiBTUE9PS30gcGFyYW1ldGVycyB0aGF0IGRlZmF1bHQgdG8gYDAuMGAuIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3NjaHRlcHBlL2Nhbm5vbi5qcy9pc3N1ZXMvMjM4I2lzc3VlY29tbWVudC0xNDcxNzIzMjcgdGhpcyBleGNoYW5nZX0gZm9yIG1vcmUgZGV0YWlscyBvbiBDYW5ub24ncyBwaHlzaWNzIGltcGxlbWVudGF0aW9uLgogICAqLwogIGNsYXNzIEVxdWF0aW9uIHsKICAgIC8qKgogICAgICogTWluaW11bSAocmVhZDogbmVnYXRpdmUgbWF4KSBmb3JjZSB0byBiZSBhcHBsaWVkIGJ5IHRoZSBjb25zdHJhaW50LgogICAgICovCgogICAgLyoqCiAgICAgKiBNYXhpbXVtIChyZWFkOiBwb3NpdGl2ZSBtYXgpIGZvcmNlIHRvIGJlIGFwcGxpZWQgYnkgdGhlIGNvbnN0cmFpbnQuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFNQT09LIHBhcmFtZXRlcgogICAgICovCgogICAgLyoqCiAgICAgKiBTUE9PSyBwYXJhbWV0ZXIKICAgICAqLwoKICAgIC8qKgogICAgICogU1BPT0sgcGFyYW1ldGVyCiAgICAgKi8KCiAgICAvKioKICAgICAqIEEgbnVtYmVyLCBwcm9wb3J0aW9uYWwgdG8gdGhlIGZvcmNlIGFkZGVkIHRvIHRoZSBib2RpZXMuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGJpLCBiaiwgbWluRm9yY2UsIG1heEZvcmNlKSB7CiAgICAgIGlmIChtaW5Gb3JjZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgbWluRm9yY2UgPSAtMWU2OwogICAgICB9CgogICAgICBpZiAobWF4Rm9yY2UgPT09IHZvaWQgMCkgewogICAgICAgIG1heEZvcmNlID0gMWU2OwogICAgICB9CgogICAgICB0aGlzLmlkID0gRXF1YXRpb24uaWRDb3VudGVyKys7CiAgICAgIHRoaXMubWluRm9yY2UgPSBtaW5Gb3JjZTsKICAgICAgdGhpcy5tYXhGb3JjZSA9IG1heEZvcmNlOwogICAgICB0aGlzLmJpID0gYmk7CiAgICAgIHRoaXMuYmogPSBiajsKICAgICAgdGhpcy5hID0gMC4wOyAvLyBTUE9PSyBwYXJhbWV0ZXIKCiAgICAgIHRoaXMuYiA9IDAuMDsgLy8gU1BPT0sgcGFyYW1ldGVyCgogICAgICB0aGlzLmVwcyA9IDAuMDsgLy8gU1BPT0sgcGFyYW1ldGVyCgogICAgICB0aGlzLmphY29iaWFuRWxlbWVudEEgPSBuZXcgSmFjb2JpYW5FbGVtZW50KCk7CiAgICAgIHRoaXMuamFjb2JpYW5FbGVtZW50QiA9IG5ldyBKYWNvYmlhbkVsZW1lbnQoKTsKICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKICAgICAgdGhpcy5tdWx0aXBsaWVyID0gMDsKICAgICAgdGhpcy5zZXRTcG9va1BhcmFtcygxZTcsIDQsIDEgLyA2MCk7IC8vIFNldCB0eXBpY2FsIHNwb29rIHBhcmFtcwogICAgfQogICAgLyoqCiAgICAgKiBSZWNhbGN1bGF0ZXMgYSwgYiwgYW5kIGVwcy4KICAgICAqCiAgICAgKiBUaGUgRXF1YXRpb24gY29uc3RydWN0b3Igc2V0cyB0eXBpY2FsIFNQT09LIHBhcmFtZXRlcnMgYXMgc3VjaDoKICAgICAqICogYHN0aWZmbmVzc2AgPSAxZTcKICAgICAqICogYHJlbGF4YXRpb25gID0gNAogICAgICogKiBgdGltZVN0ZXBgPSAxIC8gNjAsIF9ub3RlIHRoZSBoYXJkY29kZWQgcmVmcmVzaCByYXRlLl8KICAgICAqLwoKCiAgICBzZXRTcG9va1BhcmFtcyhzdGlmZm5lc3MsIHJlbGF4YXRpb24sIHRpbWVTdGVwKSB7CiAgICAgIGNvbnN0IGQgPSByZWxheGF0aW9uOwogICAgICBjb25zdCBrID0gc3RpZmZuZXNzOwogICAgICBjb25zdCBoID0gdGltZVN0ZXA7CiAgICAgIHRoaXMuYSA9IDQuMCAvIChoICogKDEgKyA0ICogZCkpOwogICAgICB0aGlzLmIgPSA0LjAgKiBkIC8gKDEgKyA0ICogZCk7CiAgICAgIHRoaXMuZXBzID0gNC4wIC8gKGggKiBoICogayAqICgxICsgNCAqIGQpKTsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZXMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgU1BPT0sgZXF1YXRpb24KICAgICAqLwoKCiAgICBjb21wdXRlQihhLCBiLCBoKSB7CiAgICAgIGNvbnN0IEdXID0gdGhpcy5jb21wdXRlR1coKTsKICAgICAgY29uc3QgR3EgPSB0aGlzLmNvbXB1dGVHcSgpOwogICAgICBjb25zdCBHaU1mID0gdGhpcy5jb21wdXRlR2lNZigpOwogICAgICByZXR1cm4gLUdxICogYSAtIEdXICogYiAtIEdpTWYgKiBoOwogICAgfQogICAgLyoqCiAgICAgKiBDb21wdXRlcyBHKnEsIHdoZXJlIHEgYXJlIHRoZSBnZW5lcmFsaXplZCBib2R5IGNvb3JkaW5hdGVzCiAgICAgKi8KCgogICAgY29tcHV0ZUdxKCkgewogICAgICBjb25zdCBHQSA9IHRoaXMuamFjb2JpYW5FbGVtZW50QTsKICAgICAgY29uc3QgR0IgPSB0aGlzLmphY29iaWFuRWxlbWVudEI7CiAgICAgIGNvbnN0IGJpID0gdGhpcy5iaTsKICAgICAgY29uc3QgYmogPSB0aGlzLmJqOwogICAgICBjb25zdCB4aSA9IGJpLnBvc2l0aW9uOwogICAgICBjb25zdCB4aiA9IGJqLnBvc2l0aW9uOwogICAgICByZXR1cm4gR0Euc3BhdGlhbC5kb3QoeGkpICsgR0Iuc3BhdGlhbC5kb3QoeGopOwogICAgfQogICAgLyoqCiAgICAgKiBDb21wdXRlcyBHKlcsIHdoZXJlIFcgYXJlIHRoZSBib2R5IHZlbG9jaXRpZXMKICAgICAqLwoKCiAgICBjb21wdXRlR1coKSB7CiAgICAgIGNvbnN0IEdBID0gdGhpcy5qYWNvYmlhbkVsZW1lbnRBOwogICAgICBjb25zdCBHQiA9IHRoaXMuamFjb2JpYW5FbGVtZW50QjsKICAgICAgY29uc3QgYmkgPSB0aGlzLmJpOwogICAgICBjb25zdCBiaiA9IHRoaXMuYmo7CiAgICAgIGNvbnN0IHZpID0gYmkudmVsb2NpdHk7CiAgICAgIGNvbnN0IHZqID0gYmoudmVsb2NpdHk7CiAgICAgIGNvbnN0IHdpID0gYmkuYW5ndWxhclZlbG9jaXR5OwogICAgICBjb25zdCB3aiA9IGJqLmFuZ3VsYXJWZWxvY2l0eTsKICAgICAgcmV0dXJuIEdBLm11bHRpcGx5VmVjdG9ycyh2aSwgd2kpICsgR0IubXVsdGlwbHlWZWN0b3JzKHZqLCB3aik7CiAgICB9CiAgICAvKioKICAgICAqIENvbXB1dGVzIEcqV2xhbWJkYSwgd2hlcmUgVyBhcmUgdGhlIGJvZHkgdmVsb2NpdGllcwogICAgICovCgoKICAgIGNvbXB1dGVHV2xhbWJkYSgpIHsKICAgICAgY29uc3QgR0EgPSB0aGlzLmphY29iaWFuRWxlbWVudEE7CiAgICAgIGNvbnN0IEdCID0gdGhpcy5qYWNvYmlhbkVsZW1lbnRCOwogICAgICBjb25zdCBiaSA9IHRoaXMuYmk7CiAgICAgIGNvbnN0IGJqID0gdGhpcy5iajsKICAgICAgY29uc3QgdmkgPSBiaS52bGFtYmRhOwogICAgICBjb25zdCB2aiA9IGJqLnZsYW1iZGE7CiAgICAgIGNvbnN0IHdpID0gYmkud2xhbWJkYTsKICAgICAgY29uc3Qgd2ogPSBiai53bGFtYmRhOwogICAgICByZXR1cm4gR0EubXVsdGlwbHlWZWN0b3JzKHZpLCB3aSkgKyBHQi5tdWx0aXBseVZlY3RvcnModmosIHdqKTsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZXMgRyppbnYoTSkqZiwgd2hlcmUgTSBpcyB0aGUgbWFzcyBtYXRyaXggd2l0aCBkaWFnb25hbCBibG9ja3MgZm9yIGVhY2ggYm9keSwgYW5kIGYgYXJlIHRoZSBmb3JjZXMgb24gdGhlIGJvZGllcy4KICAgICAqLwoKCiAgICBjb21wdXRlR2lNZigpIHsKICAgICAgY29uc3QgR0EgPSB0aGlzLmphY29iaWFuRWxlbWVudEE7CiAgICAgIGNvbnN0IEdCID0gdGhpcy5qYWNvYmlhbkVsZW1lbnRCOwogICAgICBjb25zdCBiaSA9IHRoaXMuYmk7CiAgICAgIGNvbnN0IGJqID0gdGhpcy5iajsKICAgICAgY29uc3QgZmkgPSBiaS5mb3JjZTsKICAgICAgY29uc3QgdGkgPSBiaS50b3JxdWU7CiAgICAgIGNvbnN0IGZqID0gYmouZm9yY2U7CiAgICAgIGNvbnN0IHRqID0gYmoudG9ycXVlOwogICAgICBjb25zdCBpbnZNYXNzaSA9IGJpLmludk1hc3NTb2x2ZTsKICAgICAgY29uc3QgaW52TWFzc2ogPSBiai5pbnZNYXNzU29sdmU7CiAgICAgIGZpLnNjYWxlKGludk1hc3NpLCBpTWZpKTsKICAgICAgZmouc2NhbGUoaW52TWFzc2osIGlNZmopOwogICAgICBiaS5pbnZJbmVydGlhV29ybGRTb2x2ZS52bXVsdCh0aSwgaW52SWlfdm11bHRfdGF1aSk7CiAgICAgIGJqLmludkluZXJ0aWFXb3JsZFNvbHZlLnZtdWx0KHRqLCBpbnZJal92bXVsdF90YXVqKTsKICAgICAgcmV0dXJuIEdBLm11bHRpcGx5VmVjdG9ycyhpTWZpLCBpbnZJaV92bXVsdF90YXVpKSArIEdCLm11bHRpcGx5VmVjdG9ycyhpTWZqLCBpbnZJal92bXVsdF90YXVqKTsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZXMgRyppbnYoTSkqRycKICAgICAqLwoKCiAgICBjb21wdXRlR2lNR3QoKSB7CiAgICAgIGNvbnN0IEdBID0gdGhpcy5qYWNvYmlhbkVsZW1lbnRBOwogICAgICBjb25zdCBHQiA9IHRoaXMuamFjb2JpYW5FbGVtZW50QjsKICAgICAgY29uc3QgYmkgPSB0aGlzLmJpOwogICAgICBjb25zdCBiaiA9IHRoaXMuYmo7CiAgICAgIGNvbnN0IGludk1hc3NpID0gYmkuaW52TWFzc1NvbHZlOwogICAgICBjb25zdCBpbnZNYXNzaiA9IGJqLmludk1hc3NTb2x2ZTsKICAgICAgY29uc3QgaW52SWkgPSBiaS5pbnZJbmVydGlhV29ybGRTb2x2ZTsKICAgICAgY29uc3QgaW52SWogPSBiai5pbnZJbmVydGlhV29ybGRTb2x2ZTsKICAgICAgbGV0IHJlc3VsdCA9IGludk1hc3NpICsgaW52TWFzc2o7CiAgICAgIGludklpLnZtdWx0KEdBLnJvdGF0aW9uYWwsIHRtcCk7CiAgICAgIHJlc3VsdCArPSB0bXAuZG90KEdBLnJvdGF0aW9uYWwpOwogICAgICBpbnZJai52bXVsdChHQi5yb3RhdGlvbmFsLCB0bXApOwogICAgICByZXN1bHQgKz0gdG1wLmRvdChHQi5yb3RhdGlvbmFsKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGNvbnN0cmFpbnQgdmVsb2NpdHkgdG8gdGhlIGJvZGllcy4KICAgICAqLwoKCiAgICBhZGRUb1dsYW1iZGEoZGVsdGFsYW1iZGEpIHsKICAgICAgY29uc3QgR0EgPSB0aGlzLmphY29iaWFuRWxlbWVudEE7CiAgICAgIGNvbnN0IEdCID0gdGhpcy5qYWNvYmlhbkVsZW1lbnRCOwogICAgICBjb25zdCBiaSA9IHRoaXMuYmk7CiAgICAgIGNvbnN0IGJqID0gdGhpcy5iajsKICAgICAgY29uc3QgdGVtcCA9IGFkZFRvV2xhbWJkYV90ZW1wOyAvLyBBZGQgdG8gbGluZWFyIHZlbG9jaXR5CiAgICAgIC8vIHZfbGFtYmRhICs9IGludihNKSAqIGRlbHRhX2xhbWJhICogRwoKICAgICAgYmkudmxhbWJkYS5hZGRTY2FsZWRWZWN0b3IoYmkuaW52TWFzc1NvbHZlICogZGVsdGFsYW1iZGEsIEdBLnNwYXRpYWwsIGJpLnZsYW1iZGEpOwogICAgICBiai52bGFtYmRhLmFkZFNjYWxlZFZlY3Rvcihiai5pbnZNYXNzU29sdmUgKiBkZWx0YWxhbWJkYSwgR0Iuc3BhdGlhbCwgYmoudmxhbWJkYSk7IC8vIEFkZCB0byBhbmd1bGFyIHZlbG9jaXR5CgogICAgICBiaS5pbnZJbmVydGlhV29ybGRTb2x2ZS52bXVsdChHQS5yb3RhdGlvbmFsLCB0ZW1wKTsKICAgICAgYmkud2xhbWJkYS5hZGRTY2FsZWRWZWN0b3IoZGVsdGFsYW1iZGEsIHRlbXAsIGJpLndsYW1iZGEpOwogICAgICBiai5pbnZJbmVydGlhV29ybGRTb2x2ZS52bXVsdChHQi5yb3RhdGlvbmFsLCB0ZW1wKTsKICAgICAgYmoud2xhbWJkYS5hZGRTY2FsZWRWZWN0b3IoZGVsdGFsYW1iZGEsIHRlbXAsIGJqLndsYW1iZGEpOwogICAgfQogICAgLyoqCiAgICAgKiBDb21wdXRlIHRoZSBkZW5vbWluYXRvciBwYXJ0IG9mIHRoZSBTUE9PSyBlcXVhdGlvbjogQyA9IEcqaW52KE0pKkcnICsgZXBzCiAgICAgKi8KCgogICAgY29tcHV0ZUMoKSB7CiAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVHaU1HdCgpICsgdGhpcy5lcHM7CiAgICB9CgogIH0KICBFcXVhdGlvbi5pZENvdW50ZXIgPSAwOwogIGNvbnN0IGlNZmkgPSBuZXcgVmVjMygpOwogIGNvbnN0IGlNZmogPSBuZXcgVmVjMygpOwogIGNvbnN0IGludklpX3ZtdWx0X3RhdWkgPSBuZXcgVmVjMygpOwogIGNvbnN0IGludklqX3ZtdWx0X3RhdWogPSBuZXcgVmVjMygpOwogIGNvbnN0IHRtcCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgYWRkVG9XbGFtYmRhX3RlbXAgPSBuZXcgVmVjMygpOwoKICAvKioKICAgKiBDb250YWN0L25vbi1wZW5ldHJhdGlvbiBjb25zdHJhaW50IGVxdWF0aW9uCiAgICovCiAgY2xhc3MgQ29udGFjdEVxdWF0aW9uIGV4dGVuZHMgRXF1YXRpb24gewogICAgLyoqCiAgICAgKiAiYm91bmNpbmVzcyI6IHUxID0gLWUqdTAKICAgICAqLwoKICAgIC8qKgogICAgICogV29ybGQtb3JpZW50ZWQgdmVjdG9yIHRoYXQgZ29lcyBmcm9tIHRoZSBjZW50ZXIgb2YgYmkgdG8gdGhlIGNvbnRhY3QgcG9pbnQuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFdvcmxkLW9yaWVudGVkIHZlY3RvciB0aGF0IHN0YXJ0cyBpbiBib2R5IGogcG9zaXRpb24gYW5kIGdvZXMgdG8gdGhlIGNvbnRhY3QgcG9pbnQuCiAgICAgKi8KCiAgICAvKioKICAgICAqIENvbnRhY3Qgbm9ybWFsLCBwb2ludGluZyBvdXQgb2YgYm9keSBpLgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihib2R5QSwgYm9keUIsIG1heEZvcmNlKSB7CiAgICAgIGlmIChtYXhGb3JjZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgbWF4Rm9yY2UgPSAxZTY7CiAgICAgIH0KCiAgICAgIHN1cGVyKGJvZHlBLCBib2R5QiwgMCwgbWF4Rm9yY2UpOwogICAgICB0aGlzLnJlc3RpdHV0aW9uID0gMC4wOwogICAgICB0aGlzLnJpID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5yaiA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMubmkgPSBuZXcgVmVjMygpOwogICAgfQoKICAgIGNvbXB1dGVCKGgpIHsKICAgICAgY29uc3QgYSA9IHRoaXMuYTsKICAgICAgY29uc3QgYiA9IHRoaXMuYjsKICAgICAgY29uc3QgYmkgPSB0aGlzLmJpOwogICAgICBjb25zdCBiaiA9IHRoaXMuYmo7CiAgICAgIGNvbnN0IHJpID0gdGhpcy5yaTsKICAgICAgY29uc3QgcmogPSB0aGlzLnJqOwogICAgICBjb25zdCByaXhuID0gQ29udGFjdEVxdWF0aW9uX2NvbXB1dGVCX3RlbXAxOwogICAgICBjb25zdCByanhuID0gQ29udGFjdEVxdWF0aW9uX2NvbXB1dGVCX3RlbXAyOwogICAgICBjb25zdCB2aSA9IGJpLnZlbG9jaXR5OwogICAgICBjb25zdCB3aSA9IGJpLmFuZ3VsYXJWZWxvY2l0eTsKICAgICAgYmkuZm9yY2U7CiAgICAgIGJpLnRvcnF1ZTsKICAgICAgY29uc3QgdmogPSBiai52ZWxvY2l0eTsKICAgICAgY29uc3Qgd2ogPSBiai5hbmd1bGFyVmVsb2NpdHk7CiAgICAgIGJqLmZvcmNlOwogICAgICBiai50b3JxdWU7CiAgICAgIGNvbnN0IHBlbmV0cmF0aW9uVmVjID0gQ29udGFjdEVxdWF0aW9uX2NvbXB1dGVCX3RlbXAzOwogICAgICBjb25zdCBHQSA9IHRoaXMuamFjb2JpYW5FbGVtZW50QTsKICAgICAgY29uc3QgR0IgPSB0aGlzLmphY29iaWFuRWxlbWVudEI7CiAgICAgIGNvbnN0IG4gPSB0aGlzLm5pOyAvLyBDYWx1Y2xhdGUgY3Jvc3MgcHJvZHVjdHMKCiAgICAgIHJpLmNyb3NzKG4sIHJpeG4pOwogICAgICByai5jcm9zcyhuLCByanhuKTsgLy8gZyA9IHhqK3JqIC0oeGkrcmkpCiAgICAgIC8vIEcgPSBbIC1uaSAgLXJpeG4gIG5pICByanhuIF0KCiAgICAgIG4ubmVnYXRlKEdBLnNwYXRpYWwpOwogICAgICByaXhuLm5lZ2F0ZShHQS5yb3RhdGlvbmFsKTsKICAgICAgR0Iuc3BhdGlhbC5jb3B5KG4pOwogICAgICBHQi5yb3RhdGlvbmFsLmNvcHkocmp4bik7IC8vIENhbGN1bGF0ZSB0aGUgcGVuZXRyYXRpb24gdmVjdG9yCgogICAgICBwZW5ldHJhdGlvblZlYy5jb3B5KGJqLnBvc2l0aW9uKTsKICAgICAgcGVuZXRyYXRpb25WZWMudmFkZChyaiwgcGVuZXRyYXRpb25WZWMpOwogICAgICBwZW5ldHJhdGlvblZlYy52c3ViKGJpLnBvc2l0aW9uLCBwZW5ldHJhdGlvblZlYyk7CiAgICAgIHBlbmV0cmF0aW9uVmVjLnZzdWIocmksIHBlbmV0cmF0aW9uVmVjKTsKICAgICAgY29uc3QgZyA9IG4uZG90KHBlbmV0cmF0aW9uVmVjKTsgLy8gQ29tcHV0ZSBpdGVyYXRpb24KCiAgICAgIGNvbnN0IGVQbHVzT25lID0gdGhpcy5yZXN0aXR1dGlvbiArIDE7CiAgICAgIGNvbnN0IEdXID0gZVBsdXNPbmUgKiB2ai5kb3QobikgLSBlUGx1c09uZSAqIHZpLmRvdChuKSArIHdqLmRvdChyanhuKSAtIHdpLmRvdChyaXhuKTsKICAgICAgY29uc3QgR2lNZiA9IHRoaXMuY29tcHV0ZUdpTWYoKTsKICAgICAgY29uc3QgQiA9IC1nICogYSAtIEdXICogYiAtIGggKiBHaU1mOwogICAgICByZXR1cm4gQjsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBjdXJyZW50IHJlbGF0aXZlIHZlbG9jaXR5IGluIHRoZSBjb250YWN0IHBvaW50LgogICAgICovCgoKICAgIGdldEltcGFjdFZlbG9jaXR5QWxvbmdOb3JtYWwoKSB7CiAgICAgIGNvbnN0IHZpID0gQ29udGFjdEVxdWF0aW9uX2dldEltcGFjdFZlbG9jaXR5QWxvbmdOb3JtYWxfdmk7CiAgICAgIGNvbnN0IHZqID0gQ29udGFjdEVxdWF0aW9uX2dldEltcGFjdFZlbG9jaXR5QWxvbmdOb3JtYWxfdmo7CiAgICAgIGNvbnN0IHhpID0gQ29udGFjdEVxdWF0aW9uX2dldEltcGFjdFZlbG9jaXR5QWxvbmdOb3JtYWxfeGk7CiAgICAgIGNvbnN0IHhqID0gQ29udGFjdEVxdWF0aW9uX2dldEltcGFjdFZlbG9jaXR5QWxvbmdOb3JtYWxfeGo7CiAgICAgIGNvbnN0IHJlbFZlbCA9IENvbnRhY3RFcXVhdGlvbl9nZXRJbXBhY3RWZWxvY2l0eUFsb25nTm9ybWFsX3JlbFZlbDsKICAgICAgdGhpcy5iaS5wb3NpdGlvbi52YWRkKHRoaXMucmksIHhpKTsKICAgICAgdGhpcy5iai5wb3NpdGlvbi52YWRkKHRoaXMucmosIHhqKTsKICAgICAgdGhpcy5iaS5nZXRWZWxvY2l0eUF0V29ybGRQb2ludCh4aSwgdmkpOwogICAgICB0aGlzLmJqLmdldFZlbG9jaXR5QXRXb3JsZFBvaW50KHhqLCB2aik7CiAgICAgIHZpLnZzdWIodmosIHJlbFZlbCk7CiAgICAgIHJldHVybiB0aGlzLm5pLmRvdChyZWxWZWwpOwogICAgfQoKICB9CiAgY29uc3QgQ29udGFjdEVxdWF0aW9uX2NvbXB1dGVCX3RlbXAxID0gbmV3IFZlYzMoKTsgLy8gVGVtcCB2ZWN0b3JzCgogIGNvbnN0IENvbnRhY3RFcXVhdGlvbl9jb21wdXRlQl90ZW1wMiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgQ29udGFjdEVxdWF0aW9uX2NvbXB1dGVCX3RlbXAzID0gbmV3IFZlYzMoKTsKICBjb25zdCBDb250YWN0RXF1YXRpb25fZ2V0SW1wYWN0VmVsb2NpdHlBbG9uZ05vcm1hbF92aSA9IG5ldyBWZWMzKCk7CiAgY29uc3QgQ29udGFjdEVxdWF0aW9uX2dldEltcGFjdFZlbG9jaXR5QWxvbmdOb3JtYWxfdmogPSBuZXcgVmVjMygpOwogIGNvbnN0IENvbnRhY3RFcXVhdGlvbl9nZXRJbXBhY3RWZWxvY2l0eUFsb25nTm9ybWFsX3hpID0gbmV3IFZlYzMoKTsKICBjb25zdCBDb250YWN0RXF1YXRpb25fZ2V0SW1wYWN0VmVsb2NpdHlBbG9uZ05vcm1hbF94aiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgQ29udGFjdEVxdWF0aW9uX2dldEltcGFjdFZlbG9jaXR5QWxvbmdOb3JtYWxfcmVsVmVsID0gbmV3IFZlYzMoKTsKCiAgLyoqCiAgICogQ29ubmVjdHMgdHdvIGJvZGllcyBhdCBnaXZlbiBvZmZzZXQgcG9pbnRzLgogICAqIEBleGFtcGxlCiAgICogICAgIGNvbnN0IGJvZHlBID0gbmV3IEJvZHkoeyBtYXNzOiAxIH0pCiAgICogICAgIGNvbnN0IGJvZHlCID0gbmV3IEJvZHkoeyBtYXNzOiAxIH0pCiAgICogICAgIGJvZHlBLnBvc2l0aW9uLnNldCgtMSwgMCwgMCkKICAgKiAgICAgYm9keUIucG9zaXRpb24uc2V0KDEsIDAsIDApCiAgICogICAgIGJvZHlBLmFkZFNoYXBlKHNoYXBlQSkKICAgKiAgICAgYm9keUIuYWRkU2hhcGUoc2hhcGVCKQogICAqICAgICB3b3JsZC5hZGRCb2R5KGJvZHlBKQogICAqICAgICB3b3JsZC5hZGRCb2R5KGJvZHlCKQogICAqICAgICBjb25zdCBsb2NhbFBpdm90QSA9IG5ldyBWZWMzKDEsIDAsIDApCiAgICogICAgIGNvbnN0IGxvY2FsUGl2b3RCID0gbmV3IFZlYzMoLTEsIDAsIDApCiAgICogICAgIGNvbnN0IGNvbnN0cmFpbnQgPSBuZXcgUG9pbnRUb1BvaW50Q29uc3RyYWludChib2R5QSwgbG9jYWxQaXZvdEEsIGJvZHlCLCBsb2NhbFBpdm90QikKICAgKiAgICAgd29ybGQuYWRkQ29uc3RyYWludChjb25zdHJhaW50KQogICAqLwogIGNsYXNzIFBvaW50VG9Qb2ludENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50IHsKICAgIC8qKgogICAgICogUGl2b3QsIGRlZmluZWQgbG9jYWxseSBpbiBib2R5QS4KICAgICAqLwoKICAgIC8qKgogICAgICogUGl2b3QsIGRlZmluZWQgbG9jYWxseSBpbiBib2R5Qi4KICAgICAqLwoKICAgIC8qKgogICAgICogQHBhcmFtIHBpdm90QSBUaGUgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIGNlbnRlciBvZiBtYXNzIG9mIGJvZHlBIHdoaWNoIGJvZHlBIGlzIGNvbnN0cmFpbmVkIHRvLgogICAgICogQHBhcmFtIGJvZHlCIEJvZHkgdGhhdCB3aWxsIGJlIGNvbnN0cmFpbmVkIGluIGEgc2ltaWxhciB3YXkgdG8gdGhlIHNhbWUgcG9pbnQgYXMgYm9keUEuIFdlIHdpbGwgdGhlcmVmb3JlIGdldCBhIGxpbmsgYmV0d2VlbiBib2R5QSBhbmQgYm9keUIuIElmIG5vdCBzcGVjaWZpZWQsIGJvZHlBIHdpbGwgYmUgY29uc3RyYWluZWQgdG8gYSBzdGF0aWMgcG9pbnQuCiAgICAgKiBAcGFyYW0gcGl2b3RCIFRoZSBwb2ludCByZWxhdGl2ZSB0byB0aGUgY2VudGVyIG9mIG1hc3Mgb2YgYm9keUIgd2hpY2ggYm9keUIgaXMgY29uc3RyYWluZWQgdG8uCiAgICAgKiBAcGFyYW0gbWF4Rm9yY2UgVGhlIG1heGltdW0gZm9yY2UgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byBjb25zdHJhaW4gdGhlIGJvZGllcy4KICAgICAqLwogICAgY29uc3RydWN0b3IoYm9keUEsIHBpdm90QSwgYm9keUIsIHBpdm90QiwgbWF4Rm9yY2UpIHsKICAgICAgaWYgKHBpdm90QSA9PT0gdm9pZCAwKSB7CiAgICAgICAgcGl2b3RBID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgaWYgKHBpdm90QiA9PT0gdm9pZCAwKSB7CiAgICAgICAgcGl2b3RCID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgaWYgKG1heEZvcmNlID09PSB2b2lkIDApIHsKICAgICAgICBtYXhGb3JjZSA9IDFlNjsKICAgICAgfQoKICAgICAgc3VwZXIoYm9keUEsIGJvZHlCKTsKICAgICAgdGhpcy5waXZvdEEgPSBwaXZvdEEuY2xvbmUoKTsKICAgICAgdGhpcy5waXZvdEIgPSBwaXZvdEIuY2xvbmUoKTsKICAgICAgY29uc3QgeCA9IHRoaXMuZXF1YXRpb25YID0gbmV3IENvbnRhY3RFcXVhdGlvbihib2R5QSwgYm9keUIpOwogICAgICBjb25zdCB5ID0gdGhpcy5lcXVhdGlvblkgPSBuZXcgQ29udGFjdEVxdWF0aW9uKGJvZHlBLCBib2R5Qik7CiAgICAgIGNvbnN0IHogPSB0aGlzLmVxdWF0aW9uWiA9IG5ldyBDb250YWN0RXF1YXRpb24oYm9keUEsIGJvZHlCKTsgLy8gRXF1YXRpb25zIHRvIGJlIGZlZCB0byB0aGUgc29sdmVyCgogICAgICB0aGlzLmVxdWF0aW9ucy5wdXNoKHgsIHksIHopOyAvLyBNYWtlIHRoZSBlcXVhdGlvbnMgYmlkaXJlY3Rpb25hbAoKICAgICAgeC5taW5Gb3JjZSA9IHkubWluRm9yY2UgPSB6Lm1pbkZvcmNlID0gLW1heEZvcmNlOwogICAgICB4Lm1heEZvcmNlID0geS5tYXhGb3JjZSA9IHoubWF4Rm9yY2UgPSBtYXhGb3JjZTsKICAgICAgeC5uaS5zZXQoMSwgMCwgMCk7CiAgICAgIHkubmkuc2V0KDAsIDEsIDApOwogICAgICB6Lm5pLnNldCgwLCAwLCAxKTsKICAgIH0KCiAgICB1cGRhdGUoKSB7CiAgICAgIGNvbnN0IGJvZHlBID0gdGhpcy5ib2R5QTsKICAgICAgY29uc3QgYm9keUIgPSB0aGlzLmJvZHlCOwogICAgICBjb25zdCB4ID0gdGhpcy5lcXVhdGlvblg7CiAgICAgIGNvbnN0IHkgPSB0aGlzLmVxdWF0aW9uWTsKICAgICAgY29uc3QgeiA9IHRoaXMuZXF1YXRpb25aOyAvLyBSb3RhdGUgdGhlIHBpdm90cyB0byB3b3JsZCBzcGFjZQoKICAgICAgYm9keUEucXVhdGVybmlvbi52bXVsdCh0aGlzLnBpdm90QSwgeC5yaSk7CiAgICAgIGJvZHlCLnF1YXRlcm5pb24udm11bHQodGhpcy5waXZvdEIsIHgucmopOwogICAgICB5LnJpLmNvcHkoeC5yaSk7CiAgICAgIHkucmouY29weSh4LnJqKTsKICAgICAgei5yaS5jb3B5KHgucmkpOwogICAgICB6LnJqLmNvcHkoeC5yaik7CiAgICB9CgogIH0KCiAgLyoqCiAgICogQ29uZSBlcXVhdGlvbi4gV29ya3MgdG8ga2VlcCB0aGUgZ2l2ZW4gYm9keSB3b3JsZCB2ZWN0b3JzIGFsaWduZWQsIG9yIHRpbHRlZCB3aXRoaW4gYSBnaXZlbiBhbmdsZSBmcm9tIGVhY2ggb3RoZXIuCiAgICovCiAgY2xhc3MgQ29uZUVxdWF0aW9uIGV4dGVuZHMgRXF1YXRpb24gewogICAgLyoqCiAgICAgKiBMb2NhbCBheGlzIGluIEEKICAgICAqLwoKICAgIC8qKgogICAgICogTG9jYWwgYXhpcyBpbiBCCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSAiY29uZSBhbmdsZSIgdG8ga2VlcAogICAgICovCiAgICBjb25zdHJ1Y3Rvcihib2R5QSwgYm9keUIsIG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgY29uc3QgbWF4Rm9yY2UgPSB0eXBlb2Ygb3B0aW9ucy5tYXhGb3JjZSAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLm1heEZvcmNlIDogMWU2OwogICAgICBzdXBlcihib2R5QSwgYm9keUIsIC1tYXhGb3JjZSwgbWF4Rm9yY2UpOwogICAgICB0aGlzLmF4aXNBID0gb3B0aW9ucy5heGlzQSA/IG9wdGlvbnMuYXhpc0EuY2xvbmUoKSA6IG5ldyBWZWMzKDEsIDAsIDApOwogICAgICB0aGlzLmF4aXNCID0gb3B0aW9ucy5heGlzQiA/IG9wdGlvbnMuYXhpc0IuY2xvbmUoKSA6IG5ldyBWZWMzKDAsIDEsIDApOwogICAgICB0aGlzLmFuZ2xlID0gdHlwZW9mIG9wdGlvbnMuYW5nbGUgIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucy5hbmdsZSA6IDA7CiAgICB9CgogICAgY29tcHV0ZUIoaCkgewogICAgICBjb25zdCBhID0gdGhpcy5hOwogICAgICBjb25zdCBiID0gdGhpcy5iOwogICAgICBjb25zdCBuaSA9IHRoaXMuYXhpc0E7CiAgICAgIGNvbnN0IG5qID0gdGhpcy5heGlzQjsKICAgICAgY29uc3Qgbml4bmogPSB0bXBWZWMxJDI7CiAgICAgIGNvbnN0IG5qeG5pID0gdG1wVmVjMiQyOwogICAgICBjb25zdCBHQSA9IHRoaXMuamFjb2JpYW5FbGVtZW50QTsKICAgICAgY29uc3QgR0IgPSB0aGlzLmphY29iaWFuRWxlbWVudEI7IC8vIENhbHVjbGF0ZSBjcm9zcyBwcm9kdWN0cwoKICAgICAgbmkuY3Jvc3MobmosIG5peG5qKTsKICAgICAgbmouY3Jvc3MobmksIG5qeG5pKTsgLy8gVGhlIGFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvciBpczoKICAgICAgLy8gY29zKHRoZXRhKSA9IGEgKiBiIC8gKGxlbmd0aChhKSAqIGxlbmd0aChiKSA9IHsgbGVuKGEpID0gbGVuKGIpID0gMSB9ID0gYSAqIGIKICAgICAgLy8gZyA9IGEgKiBiCiAgICAgIC8vIGdkb3QgPSAoYiB4IGEpICogd2kgKyAoYSB4IGIpICogd2oKICAgICAgLy8gRyA9IFswIGJ4YSAwIGF4Yl0KICAgICAgLy8gVyA9IFt2aSB3aSB2aiB3al0KCiAgICAgIEdBLnJvdGF0aW9uYWwuY29weShuanhuaSk7CiAgICAgIEdCLnJvdGF0aW9uYWwuY29weShuaXhuaik7CiAgICAgIGNvbnN0IGcgPSBNYXRoLmNvcyh0aGlzLmFuZ2xlKSAtIG5pLmRvdChuaik7CiAgICAgIGNvbnN0IEdXID0gdGhpcy5jb21wdXRlR1coKTsKICAgICAgY29uc3QgR2lNZiA9IHRoaXMuY29tcHV0ZUdpTWYoKTsKICAgICAgY29uc3QgQiA9IC1nICogYSAtIEdXICogYiAtIGggKiBHaU1mOwogICAgICByZXR1cm4gQjsKICAgIH0KCiAgfQogIGNvbnN0IHRtcFZlYzEkMiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgdG1wVmVjMiQyID0gbmV3IFZlYzMoKTsKCiAgLyoqCiAgICogUm90YXRpb25hbCBjb25zdHJhaW50LiBXb3JrcyB0byBrZWVwIHRoZSBsb2NhbCB2ZWN0b3JzIG9ydGhvZ29uYWwgdG8gZWFjaCBvdGhlciBpbiB3b3JsZCBzcGFjZS4KICAgKi8KICBjbGFzcyBSb3RhdGlvbmFsRXF1YXRpb24gZXh0ZW5kcyBFcXVhdGlvbiB7CiAgICAvKioKICAgICAqIFdvcmxkIG9yaWVudGVkIHJvdGF0aW9uYWwgYXhpcy4KICAgICAqLwoKICAgIC8qKgogICAgICogV29ybGQgb3JpZW50ZWQgcm90YXRpb25hbCBheGlzLgogICAgICovCgogICAgLyoqCiAgICAgKiBtYXhBbmdsZQogICAgICovCiAgICBjb25zdHJ1Y3Rvcihib2R5QSwgYm9keUIsIG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgY29uc3QgbWF4Rm9yY2UgPSB0eXBlb2Ygb3B0aW9ucy5tYXhGb3JjZSAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLm1heEZvcmNlIDogMWU2OwogICAgICBzdXBlcihib2R5QSwgYm9keUIsIC1tYXhGb3JjZSwgbWF4Rm9yY2UpOwogICAgICB0aGlzLmF4aXNBID0gb3B0aW9ucy5heGlzQSA/IG9wdGlvbnMuYXhpc0EuY2xvbmUoKSA6IG5ldyBWZWMzKDEsIDAsIDApOwogICAgICB0aGlzLmF4aXNCID0gb3B0aW9ucy5heGlzQiA/IG9wdGlvbnMuYXhpc0IuY2xvbmUoKSA6IG5ldyBWZWMzKDAsIDEsIDApOwogICAgICB0aGlzLm1heEFuZ2xlID0gTWF0aC5QSSAvIDI7CiAgICB9CgogICAgY29tcHV0ZUIoaCkgewogICAgICBjb25zdCBhID0gdGhpcy5hOwogICAgICBjb25zdCBiID0gdGhpcy5iOwogICAgICBjb25zdCBuaSA9IHRoaXMuYXhpc0E7CiAgICAgIGNvbnN0IG5qID0gdGhpcy5heGlzQjsKICAgICAgY29uc3Qgbml4bmogPSB0bXBWZWMxJDE7CiAgICAgIGNvbnN0IG5qeG5pID0gdG1wVmVjMiQxOwogICAgICBjb25zdCBHQSA9IHRoaXMuamFjb2JpYW5FbGVtZW50QTsKICAgICAgY29uc3QgR0IgPSB0aGlzLmphY29iaWFuRWxlbWVudEI7IC8vIENhbHVjbGF0ZSBjcm9zcyBwcm9kdWN0cwoKICAgICAgbmkuY3Jvc3MobmosIG5peG5qKTsKICAgICAgbmouY3Jvc3MobmksIG5qeG5pKTsgLy8gZyA9IG5pICogbmoKICAgICAgLy8gZ2RvdCA9IChuaiB4IG5pKSAqIHdpICsgKG5pIHggbmopICogd2oKICAgICAgLy8gRyA9IFswIG5qeG5pIDAgbml4bmpdCiAgICAgIC8vIFcgPSBbdmkgd2kgdmogd2pdCgogICAgICBHQS5yb3RhdGlvbmFsLmNvcHkobmp4bmkpOwogICAgICBHQi5yb3RhdGlvbmFsLmNvcHkobml4bmopOwogICAgICBjb25zdCBnID0gTWF0aC5jb3ModGhpcy5tYXhBbmdsZSkgLSBuaS5kb3QobmopOwogICAgICBjb25zdCBHVyA9IHRoaXMuY29tcHV0ZUdXKCk7CiAgICAgIGNvbnN0IEdpTWYgPSB0aGlzLmNvbXB1dGVHaU1mKCk7CiAgICAgIGNvbnN0IEIgPSAtZyAqIGEgLSBHVyAqIGIgLSBoICogR2lNZjsKICAgICAgcmV0dXJuIEI7CiAgICB9CgogIH0KICBjb25zdCB0bXBWZWMxJDEgPSBuZXcgVmVjMygpOwogIGNvbnN0IHRtcFZlYzIkMSA9IG5ldyBWZWMzKCk7CgogIC8qKgogICAqIEEgQ29uZSBUd2lzdCBjb25zdHJhaW50LCB1c2VmdWwgZm9yIHJhZ2RvbGxzLgogICAqLwogIGNsYXNzIENvbmVUd2lzdENvbnN0cmFpbnQgZXh0ZW5kcyBQb2ludFRvUG9pbnRDb25zdHJhaW50IHsKICAgIC8qKgogICAgICogVGhlIGF4aXMgZGlyZWN0aW9uIGZvciB0aGUgY29uc3RyYWludCBvZiB0aGUgYm9keSBBLgogICAgICovCgogICAgLyoqCiAgICAgKiBUaGUgYXhpcyBkaXJlY3Rpb24gZm9yIHRoZSBjb25zdHJhaW50IG9mIHRoZSBib2R5IEIuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSBhcGVydHVyZSBhbmdsZSBvZiB0aGUgY29uZS4KICAgICAqLwoKICAgIC8qKgogICAgICogVGhlIHR3aXN0IGFuZ2xlIG9mIHRoZSBqb2ludC4KICAgICAqLwogICAgY29uc3RydWN0b3IoYm9keUEsIGJvZHlCLCBvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KCiAgICAgIGNvbnN0IG1heEZvcmNlID0gdHlwZW9mIG9wdGlvbnMubWF4Rm9yY2UgIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucy5tYXhGb3JjZSA6IDFlNjsgLy8gU2V0IHBpdm90IHBvaW50IGluIGJldHdlZW4KCiAgICAgIGNvbnN0IHBpdm90QSA9IG9wdGlvbnMucGl2b3RBID8gb3B0aW9ucy5waXZvdEEuY2xvbmUoKSA6IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IHBpdm90QiA9IG9wdGlvbnMucGl2b3RCID8gb3B0aW9ucy5waXZvdEIuY2xvbmUoKSA6IG5ldyBWZWMzKCk7CiAgICAgIHN1cGVyKGJvZHlBLCBwaXZvdEEsIGJvZHlCLCBwaXZvdEIsIG1heEZvcmNlKTsKICAgICAgdGhpcy5heGlzQSA9IG9wdGlvbnMuYXhpc0EgPyBvcHRpb25zLmF4aXNBLmNsb25lKCkgOiBuZXcgVmVjMygpOwogICAgICB0aGlzLmF4aXNCID0gb3B0aW9ucy5heGlzQiA/IG9wdGlvbnMuYXhpc0IuY2xvbmUoKSA6IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMuY29sbGlkZUNvbm5lY3RlZCA9ICEhb3B0aW9ucy5jb2xsaWRlQ29ubmVjdGVkOwogICAgICB0aGlzLmFuZ2xlID0gdHlwZW9mIG9wdGlvbnMuYW5nbGUgIT09ICd1bmRlZmluZWQnID8gb3B0aW9ucy5hbmdsZSA6IDA7CiAgICAgIGNvbnN0IGMgPSB0aGlzLmNvbmVFcXVhdGlvbiA9IG5ldyBDb25lRXF1YXRpb24oYm9keUEsIGJvZHlCLCBvcHRpb25zKTsKICAgICAgY29uc3QgdCA9IHRoaXMudHdpc3RFcXVhdGlvbiA9IG5ldyBSb3RhdGlvbmFsRXF1YXRpb24oYm9keUEsIGJvZHlCLCBvcHRpb25zKTsKICAgICAgdGhpcy50d2lzdEFuZ2xlID0gdHlwZW9mIG9wdGlvbnMudHdpc3RBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLnR3aXN0QW5nbGUgOiAwOyAvLyBNYWtlIHRoZSBjb25lIGVxdWF0aW9uIHB1c2ggdGhlIGJvZGllcyB0b3dhcmQgdGhlIGNvbmUgYXhpcywgbm90IG91dHdhcmQKCiAgICAgIGMubWF4Rm9yY2UgPSAwOwogICAgICBjLm1pbkZvcmNlID0gLW1heEZvcmNlOyAvLyBNYWtlIHRoZSB0d2lzdCBlcXVhdGlvbiBhZGQgdG9ycXVlIHRvd2FyZCB0aGUgaW5pdGlhbCBwb3NpdGlvbgoKICAgICAgdC5tYXhGb3JjZSA9IDA7CiAgICAgIHQubWluRm9yY2UgPSAtbWF4Rm9yY2U7CiAgICAgIHRoaXMuZXF1YXRpb25zLnB1c2goYywgdCk7CiAgICB9CgogICAgdXBkYXRlKCkgewogICAgICBjb25zdCBib2R5QSA9IHRoaXMuYm9keUE7CiAgICAgIGNvbnN0IGJvZHlCID0gdGhpcy5ib2R5QjsKICAgICAgY29uc3QgY29uZSA9IHRoaXMuY29uZUVxdWF0aW9uOwogICAgICBjb25zdCB0d2lzdCA9IHRoaXMudHdpc3RFcXVhdGlvbjsKICAgICAgc3VwZXIudXBkYXRlKCk7IC8vIFVwZGF0ZSB0aGUgYXhlcyB0byB0aGUgY29uZSBjb25zdHJhaW50CgogICAgICBib2R5QS52ZWN0b3JUb1dvcmxkRnJhbWUodGhpcy5heGlzQSwgY29uZS5heGlzQSk7CiAgICAgIGJvZHlCLnZlY3RvclRvV29ybGRGcmFtZSh0aGlzLmF4aXNCLCBjb25lLmF4aXNCKTsgLy8gVXBkYXRlIHRoZSB3b3JsZCBheGVzIGluIHRoZSB0d2lzdCBjb25zdHJhaW50CgogICAgICB0aGlzLmF4aXNBLnRhbmdlbnRzKHR3aXN0LmF4aXNBLCB0d2lzdC5heGlzQSk7CiAgICAgIGJvZHlBLnZlY3RvclRvV29ybGRGcmFtZSh0d2lzdC5heGlzQSwgdHdpc3QuYXhpc0EpOwogICAgICB0aGlzLmF4aXNCLnRhbmdlbnRzKHR3aXN0LmF4aXNCLCB0d2lzdC5heGlzQik7CiAgICAgIGJvZHlCLnZlY3RvclRvV29ybGRGcmFtZSh0d2lzdC5heGlzQiwgdHdpc3QuYXhpc0IpOwogICAgICBjb25lLmFuZ2xlID0gdGhpcy5hbmdsZTsKICAgICAgdHdpc3QubWF4QW5nbGUgPSB0aGlzLnR3aXN0QW5nbGU7CiAgICB9CgogIH0KICBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CgogIC8qKgogICAqIENvbnN0cmFpbnMgdHdvIGJvZGllcyB0byBiZSBhdCBhIGNvbnN0YW50IGRpc3RhbmNlIGZyb20gZWFjaCBvdGhlcnMgY2VudGVyIG9mIG1hc3MuCiAgICovCiAgY2xhc3MgRGlzdGFuY2VDb25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludCB7CiAgICAvKioKICAgICAqIFRoZSBkaXN0YW5jZSB0byBrZWVwLiBJZiB1bmRlZmluZWQsIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBjdXJyZW50IGRpc3RhbmNlIGJldHdlZW4gYm9keUEgYW5kIGJvZHlCCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBwYXJhbSBkaXN0YW5jZSBUaGUgZGlzdGFuY2UgdG8ga2VlcC4gSWYgdW5kZWZpbmVkLCBpdCB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudCBkaXN0YW5jZSBiZXR3ZWVuIGJvZHlBIGFuZCBib2R5Qi4KICAgICAqIEBwYXJhbSBtYXhGb3JjZSBUaGUgbWF4aW11bSBmb3JjZSB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIGNvbnN0cmFpbiB0aGUgYm9kaWVzLgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihib2R5QSwgYm9keUIsIGRpc3RhbmNlLCBtYXhGb3JjZSkgewogICAgICBpZiAobWF4Rm9yY2UgPT09IHZvaWQgMCkgewogICAgICAgIG1heEZvcmNlID0gMWU2OwogICAgICB9CgogICAgICBzdXBlcihib2R5QSwgYm9keUIpOwoKICAgICAgaWYgKHR5cGVvZiBkaXN0YW5jZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBkaXN0YW5jZSA9IGJvZHlBLnBvc2l0aW9uLmRpc3RhbmNlVG8oYm9keUIucG9zaXRpb24pOwogICAgICB9CgogICAgICB0aGlzLmRpc3RhbmNlID0gZGlzdGFuY2U7CiAgICAgIGNvbnN0IGVxID0gdGhpcy5kaXN0YW5jZUVxdWF0aW9uID0gbmV3IENvbnRhY3RFcXVhdGlvbihib2R5QSwgYm9keUIpOwogICAgICB0aGlzLmVxdWF0aW9ucy5wdXNoKGVxKTsgLy8gTWFrZSBpdCBiaWRpcmVjdGlvbmFsCgogICAgICBlcS5taW5Gb3JjZSA9IC1tYXhGb3JjZTsKICAgICAgZXEubWF4Rm9yY2UgPSBtYXhGb3JjZTsKICAgIH0KICAgIC8qKgogICAgICogdXBkYXRlCiAgICAgKi8KCgogICAgdXBkYXRlKCkgewogICAgICBjb25zdCBib2R5QSA9IHRoaXMuYm9keUE7CiAgICAgIGNvbnN0IGJvZHlCID0gdGhpcy5ib2R5QjsKICAgICAgY29uc3QgZXEgPSB0aGlzLmRpc3RhbmNlRXF1YXRpb247CiAgICAgIGNvbnN0IGhhbGZEaXN0ID0gdGhpcy5kaXN0YW5jZSAqIDAuNTsKICAgICAgY29uc3Qgbm9ybWFsID0gZXEubmk7CiAgICAgIGJvZHlCLnBvc2l0aW9uLnZzdWIoYm9keUEucG9zaXRpb24sIG5vcm1hbCk7CiAgICAgIG5vcm1hbC5ub3JtYWxpemUoKTsKICAgICAgbm9ybWFsLnNjYWxlKGhhbGZEaXN0LCBlcS5yaSk7CiAgICAgIG5vcm1hbC5zY2FsZSgtaGFsZkRpc3QsIGVxLnJqKTsKICAgIH0KCiAgfQoKICAvKioKICAgKiBMb2NrIGNvbnN0cmFpbnQuIFdpbGwgcmVtb3ZlIGFsbCBkZWdyZWVzIG9mIGZyZWVkb20gYmV0d2VlbiB0aGUgYm9kaWVzLgogICAqLwogIGNsYXNzIExvY2tDb25zdHJhaW50IGV4dGVuZHMgUG9pbnRUb1BvaW50Q29uc3RyYWludCB7CiAgICBjb25zdHJ1Y3Rvcihib2R5QSwgYm9keUIsIG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgY29uc3QgbWF4Rm9yY2UgPSB0eXBlb2Ygb3B0aW9ucy5tYXhGb3JjZSAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLm1heEZvcmNlIDogMWU2OyAvLyBTZXQgcGl2b3QgcG9pbnQgaW4gYmV0d2VlbgoKICAgICAgY29uc3QgcGl2b3RBID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgcGl2b3RCID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgaGFsZldheSA9IG5ldyBWZWMzKCk7CiAgICAgIGJvZHlBLnBvc2l0aW9uLnZhZGQoYm9keUIucG9zaXRpb24sIGhhbGZXYXkpOwogICAgICBoYWxmV2F5LnNjYWxlKDAuNSwgaGFsZldheSk7CiAgICAgIGJvZHlCLnBvaW50VG9Mb2NhbEZyYW1lKGhhbGZXYXksIHBpdm90Qik7CiAgICAgIGJvZHlBLnBvaW50VG9Mb2NhbEZyYW1lKGhhbGZXYXksIHBpdm90QSk7IC8vIFRoZSBwb2ludC10by1wb2ludCBjb25zdHJhaW50IHdpbGwga2VlcCBhIHBvaW50IHNoYXJlZCBiZXR3ZWVuIHRoZSBib2RpZXMKCiAgICAgIHN1cGVyKGJvZHlBLCBwaXZvdEEsIGJvZHlCLCBwaXZvdEIsIG1heEZvcmNlKTsgLy8gU3RvcmUgaW5pdGlhbCByb3RhdGlvbiBvZiB0aGUgYm9kaWVzIGFzIHVuaXQgdmVjdG9ycyBpbiB0aGUgbG9jYWwgYm9keSBzcGFjZXMKCiAgICAgIHRoaXMueEEgPSBib2R5QS52ZWN0b3JUb0xvY2FsRnJhbWUoVmVjMy5VTklUX1gpOwogICAgICB0aGlzLnhCID0gYm9keUIudmVjdG9yVG9Mb2NhbEZyYW1lKFZlYzMuVU5JVF9YKTsKICAgICAgdGhpcy55QSA9IGJvZHlBLnZlY3RvclRvTG9jYWxGcmFtZShWZWMzLlVOSVRfWSk7CiAgICAgIHRoaXMueUIgPSBib2R5Qi52ZWN0b3JUb0xvY2FsRnJhbWUoVmVjMy5VTklUX1kpOwogICAgICB0aGlzLnpBID0gYm9keUEudmVjdG9yVG9Mb2NhbEZyYW1lKFZlYzMuVU5JVF9aKTsKICAgICAgdGhpcy56QiA9IGJvZHlCLnZlY3RvclRvTG9jYWxGcmFtZShWZWMzLlVOSVRfWik7IC8vIC4uLmFuZCB0aGUgZm9sbG93aW5nIHJvdGF0aW9uYWwgZXF1YXRpb25zIHdpbGwga2VlcCBhbGwgcm90YXRpb25hbCBET0YncyBpbiBwbGFjZQoKICAgICAgY29uc3QgcjEgPSB0aGlzLnJvdGF0aW9uYWxFcXVhdGlvbjEgPSBuZXcgUm90YXRpb25hbEVxdWF0aW9uKGJvZHlBLCBib2R5Qiwgb3B0aW9ucyk7CiAgICAgIGNvbnN0IHIyID0gdGhpcy5yb3RhdGlvbmFsRXF1YXRpb24yID0gbmV3IFJvdGF0aW9uYWxFcXVhdGlvbihib2R5QSwgYm9keUIsIG9wdGlvbnMpOwogICAgICBjb25zdCByMyA9IHRoaXMucm90YXRpb25hbEVxdWF0aW9uMyA9IG5ldyBSb3RhdGlvbmFsRXF1YXRpb24oYm9keUEsIGJvZHlCLCBvcHRpb25zKTsKICAgICAgdGhpcy5lcXVhdGlvbnMucHVzaChyMSwgcjIsIHIzKTsKICAgIH0KICAgIC8qKgogICAgICogdXBkYXRlCiAgICAgKi8KCgogICAgdXBkYXRlKCkgewogICAgICBjb25zdCBib2R5QSA9IHRoaXMuYm9keUE7CiAgICAgIGNvbnN0IGJvZHlCID0gdGhpcy5ib2R5QjsKICAgICAgdGhpcy5tb3RvckVxdWF0aW9uOwogICAgICBjb25zdCByMSA9IHRoaXMucm90YXRpb25hbEVxdWF0aW9uMTsKICAgICAgY29uc3QgcjIgPSB0aGlzLnJvdGF0aW9uYWxFcXVhdGlvbjI7CiAgICAgIGNvbnN0IHIzID0gdGhpcy5yb3RhdGlvbmFsRXF1YXRpb24zOwogICAgICBzdXBlci51cGRhdGUoKTsgLy8gVGhlc2UgdmVjdG9yIHBhaXJzIG11c3QgYmUgb3J0aG9nb25hbAoKICAgICAgYm9keUEudmVjdG9yVG9Xb3JsZEZyYW1lKHRoaXMueEEsIHIxLmF4aXNBKTsKICAgICAgYm9keUIudmVjdG9yVG9Xb3JsZEZyYW1lKHRoaXMueUIsIHIxLmF4aXNCKTsKICAgICAgYm9keUEudmVjdG9yVG9Xb3JsZEZyYW1lKHRoaXMueUEsIHIyLmF4aXNBKTsKICAgICAgYm9keUIudmVjdG9yVG9Xb3JsZEZyYW1lKHRoaXMuekIsIHIyLmF4aXNCKTsKICAgICAgYm9keUEudmVjdG9yVG9Xb3JsZEZyYW1lKHRoaXMuekEsIHIzLmF4aXNBKTsKICAgICAgYm9keUIudmVjdG9yVG9Xb3JsZEZyYW1lKHRoaXMueEIsIHIzLmF4aXNCKTsKICAgIH0KCiAgfQogIG5ldyBWZWMzKCk7CiAgbmV3IFZlYzMoKTsKCiAgLyoqCiAgICogUm90YXRpb25hbCBtb3RvciBjb25zdHJhaW50LiBUcmllcyB0byBrZWVwIHRoZSByZWxhdGl2ZSBhbmd1bGFyIHZlbG9jaXR5IG9mIHRoZSBib2RpZXMgdG8gYSBnaXZlbiB2YWx1ZS4KICAgKi8KICBjbGFzcyBSb3RhdGlvbmFsTW90b3JFcXVhdGlvbiBleHRlbmRzIEVxdWF0aW9uIHsKICAgIC8qKgogICAgICogV29ybGQgb3JpZW50ZWQgcm90YXRpb25hbCBheGlzLgogICAgICovCgogICAgLyoqCiAgICAgKiBXb3JsZCBvcmllbnRlZCByb3RhdGlvbmFsIGF4aXMuCiAgICAgKi8KCiAgICAvKioKICAgICAqIE1vdG9yIHZlbG9jaXR5LgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihib2R5QSwgYm9keUIsIG1heEZvcmNlKSB7CiAgICAgIGlmIChtYXhGb3JjZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgbWF4Rm9yY2UgPSAxZTY7CiAgICAgIH0KCiAgICAgIHN1cGVyKGJvZHlBLCBib2R5QiwgLW1heEZvcmNlLCBtYXhGb3JjZSk7CiAgICAgIHRoaXMuYXhpc0EgPSBuZXcgVmVjMygpOwogICAgICB0aGlzLmF4aXNCID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy50YXJnZXRWZWxvY2l0eSA9IDA7CiAgICB9CgogICAgY29tcHV0ZUIoaCkgewogICAgICB0aGlzLmE7CiAgICAgIGNvbnN0IGIgPSB0aGlzLmI7CiAgICAgIHRoaXMuYmk7CiAgICAgIHRoaXMuYmo7CiAgICAgIGNvbnN0IGF4aXNBID0gdGhpcy5heGlzQTsKICAgICAgY29uc3QgYXhpc0IgPSB0aGlzLmF4aXNCOwogICAgICBjb25zdCBHQSA9IHRoaXMuamFjb2JpYW5FbGVtZW50QTsKICAgICAgY29uc3QgR0IgPSB0aGlzLmphY29iaWFuRWxlbWVudEI7IC8vIGcgPSAwCiAgICAgIC8vIGdkb3QgPSBheGlzQSAqIHdpIC0gYXhpc0IgKiB3agogICAgICAvLyBnZG90ID0gRyAqIFcgPSBHICogW3ZpIHdpIHZqIHdqXQogICAgICAvLyA9PgogICAgICAvLyBHID0gWzAgYXhpc0EgMCAtYXhpc0JdCgogICAgICBHQS5yb3RhdGlvbmFsLmNvcHkoYXhpc0EpOwogICAgICBheGlzQi5uZWdhdGUoR0Iucm90YXRpb25hbCk7CiAgICAgIGNvbnN0IEdXID0gdGhpcy5jb21wdXRlR1coKSAtIHRoaXMudGFyZ2V0VmVsb2NpdHk7CiAgICAgIGNvbnN0IEdpTWYgPSB0aGlzLmNvbXB1dGVHaU1mKCk7CiAgICAgIGNvbnN0IEIgPSAtR1cgKiBiIC0gaCAqIEdpTWY7CiAgICAgIHJldHVybiBCOwogICAgfQoKICB9CgogIC8qKgogICAqIEhpbmdlIGNvbnN0cmFpbnQuIFRoaW5rIG9mIGl0IGFzIGEgZG9vciBoaW5nZS4gSXQgdHJpZXMgdG8ga2VlcCB0aGUgZG9vciBpbiB0aGUgY29ycmVjdCBwbGFjZSBhbmQgd2l0aCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi4KICAgKi8KICBjbGFzcyBIaW5nZUNvbnN0cmFpbnQgZXh0ZW5kcyBQb2ludFRvUG9pbnRDb25zdHJhaW50IHsKICAgIC8qKgogICAgICogUm90YXRpb24gYXhpcywgZGVmaW5lZCBsb2NhbGx5IGluIGJvZHlBLgogICAgICovCgogICAgLyoqCiAgICAgKiBSb3RhdGlvbiBheGlzLCBkZWZpbmVkIGxvY2FsbHkgaW4gYm9keUIuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGJvZHlBLCBib2R5Qiwgb3B0aW9ucykgewogICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7CiAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICB9CgogICAgICBjb25zdCBtYXhGb3JjZSA9IHR5cGVvZiBvcHRpb25zLm1heEZvcmNlICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMubWF4Rm9yY2UgOiAxZTY7CiAgICAgIGNvbnN0IHBpdm90QSA9IG9wdGlvbnMucGl2b3RBID8gb3B0aW9ucy5waXZvdEEuY2xvbmUoKSA6IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IHBpdm90QiA9IG9wdGlvbnMucGl2b3RCID8gb3B0aW9ucy5waXZvdEIuY2xvbmUoKSA6IG5ldyBWZWMzKCk7CiAgICAgIHN1cGVyKGJvZHlBLCBwaXZvdEEsIGJvZHlCLCBwaXZvdEIsIG1heEZvcmNlKTsKICAgICAgY29uc3QgYXhpc0EgPSB0aGlzLmF4aXNBID0gb3B0aW9ucy5heGlzQSA/IG9wdGlvbnMuYXhpc0EuY2xvbmUoKSA6IG5ldyBWZWMzKDEsIDAsIDApOwogICAgICBheGlzQS5ub3JtYWxpemUoKTsKICAgICAgY29uc3QgYXhpc0IgPSB0aGlzLmF4aXNCID0gb3B0aW9ucy5heGlzQiA/IG9wdGlvbnMuYXhpc0IuY2xvbmUoKSA6IG5ldyBWZWMzKDEsIDAsIDApOwogICAgICBheGlzQi5ub3JtYWxpemUoKTsKICAgICAgdGhpcy5jb2xsaWRlQ29ubmVjdGVkID0gISFvcHRpb25zLmNvbGxpZGVDb25uZWN0ZWQ7CiAgICAgIGNvbnN0IHJvdGF0aW9uYWwxID0gdGhpcy5yb3RhdGlvbmFsRXF1YXRpb24xID0gbmV3IFJvdGF0aW9uYWxFcXVhdGlvbihib2R5QSwgYm9keUIsIG9wdGlvbnMpOwogICAgICBjb25zdCByb3RhdGlvbmFsMiA9IHRoaXMucm90YXRpb25hbEVxdWF0aW9uMiA9IG5ldyBSb3RhdGlvbmFsRXF1YXRpb24oYm9keUEsIGJvZHlCLCBvcHRpb25zKTsKICAgICAgY29uc3QgbW90b3IgPSB0aGlzLm1vdG9yRXF1YXRpb24gPSBuZXcgUm90YXRpb25hbE1vdG9yRXF1YXRpb24oYm9keUEsIGJvZHlCLCBtYXhGb3JjZSk7CiAgICAgIG1vdG9yLmVuYWJsZWQgPSBmYWxzZTsgLy8gTm90IGVuYWJsZWQgYnkgZGVmYXVsdAogICAgICAvLyBFcXVhdGlvbnMgdG8gYmUgZmVkIHRvIHRoZSBzb2x2ZXIKCiAgICAgIHRoaXMuZXF1YXRpb25zLnB1c2gocm90YXRpb25hbDEsIHJvdGF0aW9uYWwyLCBtb3Rvcik7CiAgICB9CiAgICAvKioKICAgICAqIGVuYWJsZU1vdG9yCiAgICAgKi8KCgogICAgZW5hYmxlTW90b3IoKSB7CiAgICAgIHRoaXMubW90b3JFcXVhdGlvbi5lbmFibGVkID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogZGlzYWJsZU1vdG9yCiAgICAgKi8KCgogICAgZGlzYWJsZU1vdG9yKCkgewogICAgICB0aGlzLm1vdG9yRXF1YXRpb24uZW5hYmxlZCA9IGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBzZXRNb3RvclNwZWVkCiAgICAgKi8KCgogICAgc2V0TW90b3JTcGVlZChzcGVlZCkgewogICAgICB0aGlzLm1vdG9yRXF1YXRpb24udGFyZ2V0VmVsb2NpdHkgPSBzcGVlZDsKICAgIH0KICAgIC8qKgogICAgICogc2V0TW90b3JNYXhGb3JjZQogICAgICovCgoKICAgIHNldE1vdG9yTWF4Rm9yY2UobWF4Rm9yY2UpIHsKICAgICAgdGhpcy5tb3RvckVxdWF0aW9uLm1heEZvcmNlID0gbWF4Rm9yY2U7CiAgICAgIHRoaXMubW90b3JFcXVhdGlvbi5taW5Gb3JjZSA9IC1tYXhGb3JjZTsKICAgIH0KICAgIC8qKgogICAgICogdXBkYXRlCiAgICAgKi8KCgogICAgdXBkYXRlKCkgewogICAgICBjb25zdCBib2R5QSA9IHRoaXMuYm9keUE7CiAgICAgIGNvbnN0IGJvZHlCID0gdGhpcy5ib2R5QjsKICAgICAgY29uc3QgbW90b3IgPSB0aGlzLm1vdG9yRXF1YXRpb247CiAgICAgIGNvbnN0IHIxID0gdGhpcy5yb3RhdGlvbmFsRXF1YXRpb24xOwogICAgICBjb25zdCByMiA9IHRoaXMucm90YXRpb25hbEVxdWF0aW9uMjsKICAgICAgY29uc3Qgd29ybGRBeGlzQSA9IEhpbmdlQ29uc3RyYWludF91cGRhdGVfdG1wVmVjMTsKICAgICAgY29uc3Qgd29ybGRBeGlzQiA9IEhpbmdlQ29uc3RyYWludF91cGRhdGVfdG1wVmVjMjsKICAgICAgY29uc3QgYXhpc0EgPSB0aGlzLmF4aXNBOwogICAgICBjb25zdCBheGlzQiA9IHRoaXMuYXhpc0I7CiAgICAgIHN1cGVyLnVwZGF0ZSgpOyAvLyBHZXQgd29ybGQgYXhlcwoKICAgICAgYm9keUEucXVhdGVybmlvbi52bXVsdChheGlzQSwgd29ybGRBeGlzQSk7CiAgICAgIGJvZHlCLnF1YXRlcm5pb24udm11bHQoYXhpc0IsIHdvcmxkQXhpc0IpOwogICAgICB3b3JsZEF4aXNBLnRhbmdlbnRzKHIxLmF4aXNBLCByMi5heGlzQSk7CiAgICAgIHIxLmF4aXNCLmNvcHkod29ybGRBeGlzQik7CiAgICAgIHIyLmF4aXNCLmNvcHkod29ybGRBeGlzQik7CgogICAgICBpZiAodGhpcy5tb3RvckVxdWF0aW9uLmVuYWJsZWQpIHsKICAgICAgICBib2R5QS5xdWF0ZXJuaW9uLnZtdWx0KHRoaXMuYXhpc0EsIG1vdG9yLmF4aXNBKTsKICAgICAgICBib2R5Qi5xdWF0ZXJuaW9uLnZtdWx0KHRoaXMuYXhpc0IsIG1vdG9yLmF4aXNCKTsKICAgICAgfQogICAgfQoKICB9CiAgY29uc3QgSGluZ2VDb25zdHJhaW50X3VwZGF0ZV90bXBWZWMxID0gbmV3IFZlYzMoKTsKICBjb25zdCBIaW5nZUNvbnN0cmFpbnRfdXBkYXRlX3RtcFZlYzIgPSBuZXcgVmVjMygpOwoKICAvKioKICAgKiBDb25zdHJhaW5zIHRoZSBzbGlwcGluZyBpbiBhIGNvbnRhY3QgYWxvbmcgYSB0YW5nZW50CiAgICovCiAgY2xhc3MgRnJpY3Rpb25FcXVhdGlvbiBleHRlbmRzIEVxdWF0aW9uIHsKICAgIC8vIFRhbmdlbnQKCiAgICAvKioKICAgICAqIEBwYXJhbSBzbGlwRm9yY2Ugc2hvdWxkIGJlICstRl9mcmljdGlvbiA9ICstbXUgKiBGX25vcm1hbCA9ICstbXUgKiBtICogZwogICAgICovCiAgICBjb25zdHJ1Y3Rvcihib2R5QSwgYm9keUIsIHNsaXBGb3JjZSkgewogICAgICBzdXBlcihib2R5QSwgYm9keUIsIC1zbGlwRm9yY2UsIHNsaXBGb3JjZSk7CiAgICAgIHRoaXMucmkgPSBuZXcgVmVjMygpOwogICAgICB0aGlzLnJqID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy50ID0gbmV3IFZlYzMoKTsKICAgIH0KCiAgICBjb21wdXRlQihoKSB7CiAgICAgIHRoaXMuYTsKICAgICAgY29uc3QgYiA9IHRoaXMuYjsKICAgICAgdGhpcy5iaTsKICAgICAgdGhpcy5iajsKICAgICAgY29uc3QgcmkgPSB0aGlzLnJpOwogICAgICBjb25zdCByaiA9IHRoaXMucmo7CiAgICAgIGNvbnN0IHJpeHQgPSBGcmljdGlvbkVxdWF0aW9uX2NvbXB1dGVCX3RlbXAxOwogICAgICBjb25zdCByanh0ID0gRnJpY3Rpb25FcXVhdGlvbl9jb21wdXRlQl90ZW1wMjsKICAgICAgY29uc3QgdCA9IHRoaXMudDsgLy8gQ2FsdWNsYXRlIGNyb3NzIHByb2R1Y3RzCgogICAgICByaS5jcm9zcyh0LCByaXh0KTsKICAgICAgcmouY3Jvc3ModCwgcmp4dCk7IC8vIEcgPSBbLXQgLXJpeHQgdCByanh0XQogICAgICAvLyBBbmQgcmVtZW1iZXIsIHRoaXMgaXMgYSBwdXJlIHZlbG9jaXR5IGNvbnN0cmFpbnQsIGcgaXMgYWx3YXlzIHplcm8hCgogICAgICBjb25zdCBHQSA9IHRoaXMuamFjb2JpYW5FbGVtZW50QTsKICAgICAgY29uc3QgR0IgPSB0aGlzLmphY29iaWFuRWxlbWVudEI7CiAgICAgIHQubmVnYXRlKEdBLnNwYXRpYWwpOwogICAgICByaXh0Lm5lZ2F0ZShHQS5yb3RhdGlvbmFsKTsKICAgICAgR0Iuc3BhdGlhbC5jb3B5KHQpOwogICAgICBHQi5yb3RhdGlvbmFsLmNvcHkocmp4dCk7CiAgICAgIGNvbnN0IEdXID0gdGhpcy5jb21wdXRlR1coKTsKICAgICAgY29uc3QgR2lNZiA9IHRoaXMuY29tcHV0ZUdpTWYoKTsKICAgICAgY29uc3QgQiA9IC1HVyAqIGIgLSBoICogR2lNZjsKICAgICAgcmV0dXJuIEI7CiAgICB9CgogIH0KICBjb25zdCBGcmljdGlvbkVxdWF0aW9uX2NvbXB1dGVCX3RlbXAxID0gbmV3IFZlYzMoKTsKICBjb25zdCBGcmljdGlvbkVxdWF0aW9uX2NvbXB1dGVCX3RlbXAyID0gbmV3IFZlYzMoKTsKCiAgLyoqCiAgICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiB0d28gbWF0ZXJpYWxzIG1lZXQuCiAgICogQHRvZG8gUmVmYWN0b3IgbWF0ZXJpYWxzIHRvIG1hdGVyaWFsQSBhbmQgbWF0ZXJpYWxCCiAgICovCiAgY2xhc3MgQ29udGFjdE1hdGVyaWFsIHsKICAgIC8qKgogICAgICogSWRlbnRpZmllciBvZiB0aGlzIG1hdGVyaWFsLgogICAgICovCgogICAgLyoqCiAgICAgKiBQYXJ0aWNpcGF0aW5nIG1hdGVyaWFscy4KICAgICAqLwoKICAgIC8qKgogICAgICogRnJpY3Rpb24gY29lZmZpY2llbnQuCiAgICAgKiBAZGVmYXVsdCAwLjMKICAgICAqLwoKICAgIC8qKgogICAgICogUmVzdGl0dXRpb24gY29lZmZpY2llbnQuCiAgICAgKiBAZGVmYXVsdCAwLjMKICAgICAqLwoKICAgIC8qKgogICAgICogU3RpZmZuZXNzIG9mIHRoZSBwcm9kdWNlZCBjb250YWN0IGVxdWF0aW9ucy4KICAgICAqIEBkZWZhdWx0IDFlNwogICAgICovCgogICAgLyoqCiAgICAgKiBSZWxheGF0aW9uIHRpbWUgb2YgdGhlIHByb2R1Y2VkIGNvbnRhY3QgZXF1YXRpb25zLgogICAgICogQGRlZmF1bHQgMwogICAgICovCgogICAgLyoqCiAgICAgKiBTdGlmZm5lc3Mgb2YgdGhlIHByb2R1Y2VkIGZyaWN0aW9uIGVxdWF0aW9ucy4KICAgICAqIEBkZWZhdWx0IDFlNwogICAgICovCgogICAgLyoqCiAgICAgKiBSZWxheGF0aW9uIHRpbWUgb2YgdGhlIHByb2R1Y2VkIGZyaWN0aW9uIGVxdWF0aW9ucwogICAgICogQGRlZmF1bHQgMwogICAgICovCiAgICBjb25zdHJ1Y3RvcihtMSwgbTIsIG9wdGlvbnMpIHsKICAgICAgb3B0aW9ucyA9IFV0aWxzLmRlZmF1bHRzKG9wdGlvbnMsIHsKICAgICAgICBmcmljdGlvbjogMC4zLAogICAgICAgIHJlc3RpdHV0aW9uOiAwLjMsCiAgICAgICAgY29udGFjdEVxdWF0aW9uU3RpZmZuZXNzOiAxZTcsCiAgICAgICAgY29udGFjdEVxdWF0aW9uUmVsYXhhdGlvbjogMywKICAgICAgICBmcmljdGlvbkVxdWF0aW9uU3RpZmZuZXNzOiAxZTcsCiAgICAgICAgZnJpY3Rpb25FcXVhdGlvblJlbGF4YXRpb246IDMKICAgICAgfSk7CiAgICAgIHRoaXMuaWQgPSBDb250YWN0TWF0ZXJpYWwuaWRDb3VudGVyKys7CiAgICAgIHRoaXMubWF0ZXJpYWxzID0gW20xLCBtMl07CiAgICAgIHRoaXMuZnJpY3Rpb24gPSBvcHRpb25zLmZyaWN0aW9uOwogICAgICB0aGlzLnJlc3RpdHV0aW9uID0gb3B0aW9ucy5yZXN0aXR1dGlvbjsKICAgICAgdGhpcy5jb250YWN0RXF1YXRpb25TdGlmZm5lc3MgPSBvcHRpb25zLmNvbnRhY3RFcXVhdGlvblN0aWZmbmVzczsKICAgICAgdGhpcy5jb250YWN0RXF1YXRpb25SZWxheGF0aW9uID0gb3B0aW9ucy5jb250YWN0RXF1YXRpb25SZWxheGF0aW9uOwogICAgICB0aGlzLmZyaWN0aW9uRXF1YXRpb25TdGlmZm5lc3MgPSBvcHRpb25zLmZyaWN0aW9uRXF1YXRpb25TdGlmZm5lc3M7CiAgICAgIHRoaXMuZnJpY3Rpb25FcXVhdGlvblJlbGF4YXRpb24gPSBvcHRpb25zLmZyaWN0aW9uRXF1YXRpb25SZWxheGF0aW9uOwogICAgfQoKICB9CiAgQ29udGFjdE1hdGVyaWFsLmlkQ291bnRlciA9IDA7CgogIC8qKgogICAqIERlZmluZXMgYSBwaHlzaWNzIG1hdGVyaWFsLgogICAqLwogIGNsYXNzIE1hdGVyaWFsIHsKICAgIC8qKgogICAgICogTWF0ZXJpYWwgbmFtZS4KICAgICAqIElmIG9wdGlvbnMgaXMgYSBzdHJpbmcsIG5hbWUgd2lsbCBiZSBzZXQgdG8gdGhhdCBzdHJpbmcuCiAgICAgKiBAdG9kbyBEZXByZWNhdGUgdGhpcwogICAgICovCgogICAgLyoqIE1hdGVyaWFsIGlkLiAqLwoKICAgIC8qKgogICAgICogRnJpY3Rpb24gZm9yIHRoaXMgbWF0ZXJpYWwuCiAgICAgKiBJZiBub24tbmVnYXRpdmUsIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBmcmljdGlvbiBnaXZlbiBieSBDb250YWN0TWF0ZXJpYWxzLiBJZiB0aGVyZSdzIG5vIG1hdGNoaW5nIENvbnRhY3RNYXRlcmlhbCwgdGhlIHZhbHVlIGZyb20gYGRlZmF1bHRDb250YWN0TWF0ZXJpYWxgIGluIHRoZSBXb3JsZCB3aWxsIGJlIHVzZWQuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFJlc3RpdHV0aW9uIGZvciB0aGlzIG1hdGVyaWFsLgogICAgICogSWYgbm9uLW5lZ2F0aXZlLCBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcmVzdGl0dXRpb24gZ2l2ZW4gYnkgQ29udGFjdE1hdGVyaWFscy4gSWYgdGhlcmUncyBubyBtYXRjaGluZyBDb250YWN0TWF0ZXJpYWwsIHRoZSB2YWx1ZSBmcm9tIGBkZWZhdWx0Q29udGFjdE1hdGVyaWFsYCBpbiB0aGUgV29ybGQgd2lsbCBiZSB1c2VkLgogICAgICovCiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KCiAgICAgIGxldCBuYW1lID0gJyc7IC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZpeAoKICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykgewogICAgICAgIC8vY29uc29sZS53YXJuKGBQYXNzaW5nIGEgc3RyaW5nIHRvIE1hdGVyaWFsT3B0aW9ucyBpcyBkZXByZWNhdGVkLCBhbmQgaGFzIG5vIGVmZmVjdGApCiAgICAgICAgbmFtZSA9IG9wdGlvbnM7CiAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICB9CgogICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICB0aGlzLmlkID0gTWF0ZXJpYWwuaWRDb3VudGVyKys7CiAgICAgIHRoaXMuZnJpY3Rpb24gPSB0eXBlb2Ygb3B0aW9ucy5mcmljdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLmZyaWN0aW9uIDogLTE7CiAgICAgIHRoaXMucmVzdGl0dXRpb24gPSB0eXBlb2Ygb3B0aW9ucy5yZXN0aXR1dGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLnJlc3RpdHV0aW9uIDogLTE7CiAgICB9CgogIH0KICBNYXRlcmlhbC5pZENvdW50ZXIgPSAwOwoKICAvKioKICAgKiBBIHNwcmluZywgY29ubmVjdGluZyB0d28gYm9kaWVzLgogICAqIEBleGFtcGxlCiAgICogICAgIGNvbnN0IHNwcmluZyA9IG5ldyBTcHJpbmcoYm94Qm9keSwgc3BoZXJlQm9keSwgewogICAqICAgICAgIHJlc3RMZW5ndGg6IDAsCiAgICogICAgICAgc3RpZmZuZXNzOiA1MCwKICAgKiAgICAgICBkYW1waW5nOiAxLAogICAqICAgICB9KQogICAqCiAgICogICAgIC8vIENvbXB1dGUgdGhlIGZvcmNlIGFmdGVyIGVhY2ggc3RlcAogICAqICAgICB3b3JsZC5hZGRFdmVudExpc3RlbmVyKCdwb3N0U3RlcCcsIChldmVudCkgPT4gewogICAqICAgICAgIHNwcmluZy5hcHBseUZvcmNlKCkKICAgKiAgICAgfSkKICAgKi8KICBjbGFzcyBTcHJpbmcgewogICAgLyoqCiAgICAgKiBSZXN0IGxlbmd0aCBvZiB0aGUgc3ByaW5nLiBBIG51bWJlciA+IDAuCiAgICAgKiBAZGVmYXVsdCAxCiAgICAgKi8KCiAgICAvKioKICAgICAqIFN0aWZmbmVzcyBvZiB0aGUgc3ByaW5nLiBBIG51bWJlciA+PSAwLgogICAgICogQGRlZmF1bHQgMTAwCiAgICAgKi8KCiAgICAvKioKICAgICAqIERhbXBpbmcgb2YgdGhlIHNwcmluZy4gQSBudW1iZXIgPj0gMC4KICAgICAqIEBkZWZhdWx0IDEKICAgICAqLwoKICAgIC8qKgogICAgICogRmlyc3QgY29ubmVjdGVkIGJvZHkuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFNlY29uZCBjb25uZWN0ZWQgYm9keS4KICAgICAqLwoKICAgIC8qKgogICAgICogQW5jaG9yIGZvciBib2R5QSBpbiBsb2NhbCBib2R5QSBjb29yZGluYXRlcy4KICAgICAqIFdoZXJlIHRvIGhvb2sgdGhlIHNwcmluZyB0byBib2R5IEEsIGluIGxvY2FsIGJvZHkgY29vcmRpbmF0ZXMuCiAgICAgKiBAZGVmYXVsdCBuZXcgVmVjMygpCiAgICAgKi8KCiAgICAvKioKICAgICAqIEFuY2hvciBmb3IgYm9keUIgaW4gbG9jYWwgYm9keUIgY29vcmRpbmF0ZXMuCiAgICAgKiBXaGVyZSB0byBob29rIHRoZSBzcHJpbmcgdG8gYm9keSBCLCBpbiBsb2NhbCBib2R5IGNvb3JkaW5hdGVzLgogICAgICogQGRlZmF1bHQgbmV3IFZlYzMoKQogICAgICovCiAgICBjb25zdHJ1Y3Rvcihib2R5QSwgYm9keUIsIG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgdGhpcy5yZXN0TGVuZ3RoID0gdHlwZW9mIG9wdGlvbnMucmVzdExlbmd0aCA9PT0gJ251bWJlcicgPyBvcHRpb25zLnJlc3RMZW5ndGggOiAxOwogICAgICB0aGlzLnN0aWZmbmVzcyA9IG9wdGlvbnMuc3RpZmZuZXNzIHx8IDEwMDsKICAgICAgdGhpcy5kYW1waW5nID0gb3B0aW9ucy5kYW1waW5nIHx8IDE7CiAgICAgIHRoaXMuYm9keUEgPSBib2R5QTsKICAgICAgdGhpcy5ib2R5QiA9IGJvZHlCOwogICAgICB0aGlzLmxvY2FsQW5jaG9yQSA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMubG9jYWxBbmNob3JCID0gbmV3IFZlYzMoKTsKCiAgICAgIGlmIChvcHRpb25zLmxvY2FsQW5jaG9yQSkgewogICAgICAgIHRoaXMubG9jYWxBbmNob3JBLmNvcHkob3B0aW9ucy5sb2NhbEFuY2hvckEpOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy5sb2NhbEFuY2hvckIpIHsKICAgICAgICB0aGlzLmxvY2FsQW5jaG9yQi5jb3B5KG9wdGlvbnMubG9jYWxBbmNob3JCKTsKICAgICAgfQoKICAgICAgaWYgKG9wdGlvbnMud29ybGRBbmNob3JBKSB7CiAgICAgICAgdGhpcy5zZXRXb3JsZEFuY2hvckEob3B0aW9ucy53b3JsZEFuY2hvckEpOwogICAgICB9CgogICAgICBpZiAob3B0aW9ucy53b3JsZEFuY2hvckIpIHsKICAgICAgICB0aGlzLnNldFdvcmxkQW5jaG9yQihvcHRpb25zLndvcmxkQW5jaG9yQik7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSBhbmNob3IgcG9pbnQgb24gYm9keSBBLCB1c2luZyB3b3JsZCBjb29yZGluYXRlcy4KICAgICAqLwoKCiAgICBzZXRXb3JsZEFuY2hvckEod29ybGRBbmNob3JBKSB7CiAgICAgIHRoaXMuYm9keUEucG9pbnRUb0xvY2FsRnJhbWUod29ybGRBbmNob3JBLCB0aGlzLmxvY2FsQW5jaG9yQSk7CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgYW5jaG9yIHBvaW50IG9uIGJvZHkgQiwgdXNpbmcgd29ybGQgY29vcmRpbmF0ZXMuCiAgICAgKi8KCgogICAgc2V0V29ybGRBbmNob3JCKHdvcmxkQW5jaG9yQikgewogICAgICB0aGlzLmJvZHlCLnBvaW50VG9Mb2NhbEZyYW1lKHdvcmxkQW5jaG9yQiwgdGhpcy5sb2NhbEFuY2hvckIpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFuY2hvciBwb2ludCBvbiBib2R5IEEsIGluIHdvcmxkIGNvb3JkaW5hdGVzLgogICAgICogQHBhcmFtIHJlc3VsdCBUaGUgdmVjdG9yIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uCiAgICAgKi8KCgogICAgZ2V0V29ybGRBbmNob3JBKHJlc3VsdCkgewogICAgICB0aGlzLmJvZHlBLnBvaW50VG9Xb3JsZEZyYW1lKHRoaXMubG9jYWxBbmNob3JBLCByZXN1bHQpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFuY2hvciBwb2ludCBvbiBib2R5IEIsIGluIHdvcmxkIGNvb3JkaW5hdGVzLgogICAgICogQHBhcmFtIHJlc3VsdCBUaGUgdmVjdG9yIHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uCiAgICAgKi8KCgogICAgZ2V0V29ybGRBbmNob3JCKHJlc3VsdCkgewogICAgICB0aGlzLmJvZHlCLnBvaW50VG9Xb3JsZEZyYW1lKHRoaXMubG9jYWxBbmNob3JCLCByZXN1bHQpOwogICAgfQogICAgLyoqCiAgICAgKiBBcHBseSB0aGUgc3ByaW5nIGZvcmNlIHRvIHRoZSBjb25uZWN0ZWQgYm9kaWVzLgogICAgICovCgoKICAgIGFwcGx5Rm9yY2UoKSB7CiAgICAgIGNvbnN0IGsgPSB0aGlzLnN0aWZmbmVzczsKICAgICAgY29uc3QgZCA9IHRoaXMuZGFtcGluZzsKICAgICAgY29uc3QgbCA9IHRoaXMucmVzdExlbmd0aDsKICAgICAgY29uc3QgYm9keUEgPSB0aGlzLmJvZHlBOwogICAgICBjb25zdCBib2R5QiA9IHRoaXMuYm9keUI7CiAgICAgIGNvbnN0IHIgPSBhcHBseUZvcmNlX3I7CiAgICAgIGNvbnN0IHJfdW5pdCA9IGFwcGx5Rm9yY2Vfcl91bml0OwogICAgICBjb25zdCB1ID0gYXBwbHlGb3JjZV91OwogICAgICBjb25zdCBmID0gYXBwbHlGb3JjZV9mOwogICAgICBjb25zdCB0bXAgPSBhcHBseUZvcmNlX3RtcDsKICAgICAgY29uc3Qgd29ybGRBbmNob3JBID0gYXBwbHlGb3JjZV93b3JsZEFuY2hvckE7CiAgICAgIGNvbnN0IHdvcmxkQW5jaG9yQiA9IGFwcGx5Rm9yY2Vfd29ybGRBbmNob3JCOwogICAgICBjb25zdCByaSA9IGFwcGx5Rm9yY2Vfcmk7CiAgICAgIGNvbnN0IHJqID0gYXBwbHlGb3JjZV9yajsKICAgICAgY29uc3QgcmlfeF9mID0gYXBwbHlGb3JjZV9yaV94X2Y7CiAgICAgIGNvbnN0IHJqX3hfZiA9IGFwcGx5Rm9yY2VfcmpfeF9mOyAvLyBHZXQgd29ybGQgYW5jaG9ycwoKICAgICAgdGhpcy5nZXRXb3JsZEFuY2hvckEod29ybGRBbmNob3JBKTsKICAgICAgdGhpcy5nZXRXb3JsZEFuY2hvckIod29ybGRBbmNob3JCKTsgLy8gR2V0IG9mZnNldCBwb2ludHMKCiAgICAgIHdvcmxkQW5jaG9yQS52c3ViKGJvZHlBLnBvc2l0aW9uLCByaSk7CiAgICAgIHdvcmxkQW5jaG9yQi52c3ViKGJvZHlCLnBvc2l0aW9uLCByaik7IC8vIENvbXB1dGUgZGlzdGFuY2UgdmVjdG9yIGJldHdlZW4gd29ybGQgYW5jaG9yIHBvaW50cwoKICAgICAgd29ybGRBbmNob3JCLnZzdWIod29ybGRBbmNob3JBLCByKTsKICAgICAgY29uc3QgcmxlbiA9IHIubGVuZ3RoKCk7CiAgICAgIHJfdW5pdC5jb3B5KHIpOwogICAgICByX3VuaXQubm9ybWFsaXplKCk7IC8vIENvbXB1dGUgcmVsYXRpdmUgdmVsb2NpdHkgb2YgdGhlIGFuY2hvciBwb2ludHMsIHUKCiAgICAgIGJvZHlCLnZlbG9jaXR5LnZzdWIoYm9keUEudmVsb2NpdHksIHUpOyAvLyBBZGQgcm90YXRpb25hbCB2ZWxvY2l0eQoKICAgICAgYm9keUIuYW5ndWxhclZlbG9jaXR5LmNyb3NzKHJqLCB0bXApOwogICAgICB1LnZhZGQodG1wLCB1KTsKICAgICAgYm9keUEuYW5ndWxhclZlbG9jaXR5LmNyb3NzKHJpLCB0bXApOwogICAgICB1LnZzdWIodG1wLCB1KTsgLy8gRiA9IC0gayAqICggeCAtIEwgKSAtIEQgKiAoIHUgKQoKICAgICAgcl91bml0LnNjYWxlKC1rICogKHJsZW4gLSBsKSAtIGQgKiB1LmRvdChyX3VuaXQpLCBmKTsgLy8gQWRkIGZvcmNlcyB0byBib2RpZXMKCiAgICAgIGJvZHlBLmZvcmNlLnZzdWIoZiwgYm9keUEuZm9yY2UpOwogICAgICBib2R5Qi5mb3JjZS52YWRkKGYsIGJvZHlCLmZvcmNlKTsgLy8gQW5ndWxhciBmb3JjZQoKICAgICAgcmkuY3Jvc3MoZiwgcmlfeF9mKTsKICAgICAgcmouY3Jvc3MoZiwgcmpfeF9mKTsKICAgICAgYm9keUEudG9ycXVlLnZzdWIocmlfeF9mLCBib2R5QS50b3JxdWUpOwogICAgICBib2R5Qi50b3JxdWUudmFkZChyal94X2YsIGJvZHlCLnRvcnF1ZSk7CiAgICB9CgogIH0KICBjb25zdCBhcHBseUZvcmNlX3IgPSBuZXcgVmVjMygpOwogIGNvbnN0IGFwcGx5Rm9yY2Vfcl91bml0ID0gbmV3IFZlYzMoKTsKICBjb25zdCBhcHBseUZvcmNlX3UgPSBuZXcgVmVjMygpOwogIGNvbnN0IGFwcGx5Rm9yY2VfZiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgYXBwbHlGb3JjZV93b3JsZEFuY2hvckEgPSBuZXcgVmVjMygpOwogIGNvbnN0IGFwcGx5Rm9yY2Vfd29ybGRBbmNob3JCID0gbmV3IFZlYzMoKTsKICBjb25zdCBhcHBseUZvcmNlX3JpID0gbmV3IFZlYzMoKTsKICBjb25zdCBhcHBseUZvcmNlX3JqID0gbmV3IFZlYzMoKTsKICBjb25zdCBhcHBseUZvcmNlX3JpX3hfZiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgYXBwbHlGb3JjZV9yal94X2YgPSBuZXcgVmVjMygpOwogIGNvbnN0IGFwcGx5Rm9yY2VfdG1wID0gbmV3IFZlYzMoKTsKCiAgLyoqCiAgICogV2hlZWxJbmZvCiAgICovCiAgY2xhc3MgV2hlZWxJbmZvIHsKICAgIC8qKgogICAgICogTWF4IHRyYXZlbCBkaXN0YW5jZSBvZiB0aGUgc3VzcGVuc2lvbiwgaW4gbWV0ZXJzLgogICAgICogQGRlZmF1bHQgMQogICAgICovCgogICAgLyoqCiAgICAgKiBTcGVlZCB0byBhcHBseSB0byB0aGUgd2hlZWwgcm90YXRpb24gd2hlbiB0aGUgd2hlZWwgaXMgc2xpZGluZy4KICAgICAqIEBkZWZhdWx0IC0wLjEKICAgICAqLwoKICAgIC8qKgogICAgICogSWYgdGhlIGN1c3RvbVNsaWRpbmdSb3RhdGlvbmFsU3BlZWQgc2hvdWxkIGJlIHVzZWQuCiAgICAgKiBAZGVmYXVsdCBmYWxzZQogICAgICovCgogICAgLyoqCiAgICAgKiBzbGlkaW5nCiAgICAgKi8KCiAgICAvKioKICAgICAqIENvbm5lY3Rpb24gcG9pbnQsIGRlZmluZWQgbG9jYWxseSBpbiB0aGUgY2hhc3NpcyBib2R5IGZyYW1lLgogICAgICovCgogICAgLyoqCiAgICAgKiBjaGFzc2lzQ29ubmVjdGlvblBvaW50V29ybGQKICAgICAqLwoKICAgIC8qKgogICAgICogZGlyZWN0aW9uTG9jYWwKICAgICAqLwoKICAgIC8qKgogICAgICogZGlyZWN0aW9uV29ybGQKICAgICAqLwoKICAgIC8qKgogICAgICogYXhsZUxvY2FsCiAgICAgKi8KCiAgICAvKioKICAgICAqIGF4bGVXb3JsZAogICAgICovCgogICAgLyoqCiAgICAgKiBzdXNwZW5zaW9uUmVzdExlbmd0aAogICAgICogQGRlZmF1bHQgMQogICAgICovCgogICAgLyoqCiAgICAgKiBzdXNwZW5zaW9uTWF4TGVuZ3RoCiAgICAgKiBAZGVmYXVsdCAyCiAgICAgKi8KCiAgICAvKioKICAgICAqIHJhZGl1cwogICAgICogQGRlZmF1bHQgMQogICAgICovCgogICAgLyoqCiAgICAgKiBzdXNwZW5zaW9uU3RpZmZuZXNzCiAgICAgKiBAZGVmYXVsdCAxMDAKICAgICAqLwoKICAgIC8qKgogICAgICogZGFtcGluZ0NvbXByZXNzaW9uCiAgICAgKiBAZGVmYXVsdCAxMAogICAgICovCgogICAgLyoqCiAgICAgKiBkYW1waW5nUmVsYXhhdGlvbgogICAgICogQGRlZmF1bHQgMTAKICAgICAqLwoKICAgIC8qKgogICAgICogZnJpY3Rpb25TbGlwCiAgICAgKiBAZGVmYXVsdCAxMC41CiAgICAgKi8KCiAgICAvKiogZm9yd2FyZEFjY2VsZXJhdGlvbiAqLwoKICAgIC8qKiBzaWRlQWNjZWxlcmF0aW9uICovCgogICAgLyoqCiAgICAgKiBzdGVlcmluZwogICAgICogQGRlZmF1bHQgMAogICAgICovCgogICAgLyoqCiAgICAgKiBSb3RhdGlvbiB2YWx1ZSwgaW4gcmFkaWFucy4KICAgICAqIEBkZWZhdWx0IDAKICAgICAqLwoKICAgIC8qKgogICAgICogZGVsdGFSb3RhdGlvbgogICAgICogQGRlZmF1bHQgMAogICAgICovCgogICAgLyoqCiAgICAgKiByb2xsSW5mbHVlbmNlCiAgICAgKiBAZGVmYXVsdCAwLjAxCiAgICAgKi8KCiAgICAvKioKICAgICAqIG1heFN1c3BlbnNpb25Gb3JjZQogICAgICovCgogICAgLyoqCiAgICAgKiBlbmdpbmVGb3JjZQogICAgICovCgogICAgLyoqCiAgICAgKiBicmFrZQogICAgICovCgogICAgLyoqCiAgICAgKiBpc0Zyb250V2hlZWwKICAgICAqIEBkZWZhdWx0IHRydWUKICAgICAqLwoKICAgIC8qKgogICAgICogY2xpcHBlZEludkNvbnRhY3REb3RTdXNwZW5zaW9uCiAgICAgKiBAZGVmYXVsdCAxCiAgICAgKi8KCiAgICAvKioKICAgICAqIHN1c3BlbnNpb25SZWxhdGl2ZVZlbG9jaXR5CiAgICAgKiBAZGVmYXVsdCAwCiAgICAgKi8KCiAgICAvKioKICAgICAqIHN1c3BlbnNpb25Gb3JjZQogICAgICogQGRlZmF1bHQgMAogICAgICovCgogICAgLyoqCiAgICAgKiBzbGlwSW5mbwogICAgICovCgogICAgLyoqCiAgICAgKiBza2lkSW5mbwogICAgICogQGRlZmF1bHQgMAogICAgICovCgogICAgLyoqCiAgICAgKiBzdXNwZW5zaW9uTGVuZ3RoCiAgICAgKiBAZGVmYXVsdCAwCiAgICAgKi8KCiAgICAvKioKICAgICAqIHNpZGVJbXB1bHNlCiAgICAgKi8KCiAgICAvKioKICAgICAqIGZvcndhcmRJbXB1bHNlCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSByZXN1bHQgZnJvbSByYXljYXN0aW5nLgogICAgICovCgogICAgLyoqCiAgICAgKiBXaGVlbCB3b3JsZCB0cmFuc2Zvcm0uCiAgICAgKi8KCiAgICAvKioKICAgICAqIGlzSW5Db250YWN0CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgb3B0aW9ucyA9IFV0aWxzLmRlZmF1bHRzKG9wdGlvbnMsIHsKICAgICAgICBjaGFzc2lzQ29ubmVjdGlvblBvaW50TG9jYWw6IG5ldyBWZWMzKCksCiAgICAgICAgY2hhc3Npc0Nvbm5lY3Rpb25Qb2ludFdvcmxkOiBuZXcgVmVjMygpLAogICAgICAgIGRpcmVjdGlvbkxvY2FsOiBuZXcgVmVjMygpLAogICAgICAgIGRpcmVjdGlvbldvcmxkOiBuZXcgVmVjMygpLAogICAgICAgIGF4bGVMb2NhbDogbmV3IFZlYzMoKSwKICAgICAgICBheGxlV29ybGQ6IG5ldyBWZWMzKCksCiAgICAgICAgc3VzcGVuc2lvblJlc3RMZW5ndGg6IDEsCiAgICAgICAgc3VzcGVuc2lvbk1heExlbmd0aDogMiwKICAgICAgICByYWRpdXM6IDEsCiAgICAgICAgc3VzcGVuc2lvblN0aWZmbmVzczogMTAwLAogICAgICAgIGRhbXBpbmdDb21wcmVzc2lvbjogMTAsCiAgICAgICAgZGFtcGluZ1JlbGF4YXRpb246IDEwLAogICAgICAgIGZyaWN0aW9uU2xpcDogMTAuNSwKICAgICAgICBmb3J3YXJkQWNjZWxlcmF0aW9uOiAxLAogICAgICAgIHNpZGVBY2NlbGVyYXRpb246IDEsCiAgICAgICAgc3RlZXJpbmc6IDAsCiAgICAgICAgcm90YXRpb246IDAsCiAgICAgICAgZGVsdGFSb3RhdGlvbjogMCwKICAgICAgICByb2xsSW5mbHVlbmNlOiAwLjAxLAogICAgICAgIG1heFN1c3BlbnNpb25Gb3JjZTogTnVtYmVyLk1BWF9WQUxVRSwKICAgICAgICBpc0Zyb250V2hlZWw6IHRydWUsCiAgICAgICAgY2xpcHBlZEludkNvbnRhY3REb3RTdXNwZW5zaW9uOiAxLAogICAgICAgIHN1c3BlbnNpb25SZWxhdGl2ZVZlbG9jaXR5OiAwLAogICAgICAgIHN1c3BlbnNpb25Gb3JjZTogMCwKICAgICAgICBzbGlwSW5mbzogMCwKICAgICAgICBza2lkSW5mbzogMCwKICAgICAgICBzdXNwZW5zaW9uTGVuZ3RoOiAwLAogICAgICAgIG1heFN1c3BlbnNpb25UcmF2ZWw6IDEsCiAgICAgICAgdXNlQ3VzdG9tU2xpZGluZ1JvdGF0aW9uYWxTcGVlZDogZmFsc2UsCiAgICAgICAgY3VzdG9tU2xpZGluZ1JvdGF0aW9uYWxTcGVlZDogLTAuMQogICAgICB9KTsKICAgICAgdGhpcy5tYXhTdXNwZW5zaW9uVHJhdmVsID0gb3B0aW9ucy5tYXhTdXNwZW5zaW9uVHJhdmVsOwogICAgICB0aGlzLmN1c3RvbVNsaWRpbmdSb3RhdGlvbmFsU3BlZWQgPSBvcHRpb25zLmN1c3RvbVNsaWRpbmdSb3RhdGlvbmFsU3BlZWQ7CiAgICAgIHRoaXMudXNlQ3VzdG9tU2xpZGluZ1JvdGF0aW9uYWxTcGVlZCA9IG9wdGlvbnMudXNlQ3VzdG9tU2xpZGluZ1JvdGF0aW9uYWxTcGVlZDsKICAgICAgdGhpcy5zbGlkaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuY2hhc3Npc0Nvbm5lY3Rpb25Qb2ludExvY2FsID0gb3B0aW9ucy5jaGFzc2lzQ29ubmVjdGlvblBvaW50TG9jYWwuY2xvbmUoKTsKICAgICAgdGhpcy5jaGFzc2lzQ29ubmVjdGlvblBvaW50V29ybGQgPSBvcHRpb25zLmNoYXNzaXNDb25uZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpOwogICAgICB0aGlzLmRpcmVjdGlvbkxvY2FsID0gb3B0aW9ucy5kaXJlY3Rpb25Mb2NhbC5jbG9uZSgpOwogICAgICB0aGlzLmRpcmVjdGlvbldvcmxkID0gb3B0aW9ucy5kaXJlY3Rpb25Xb3JsZC5jbG9uZSgpOwogICAgICB0aGlzLmF4bGVMb2NhbCA9IG9wdGlvbnMuYXhsZUxvY2FsLmNsb25lKCk7CiAgICAgIHRoaXMuYXhsZVdvcmxkID0gb3B0aW9ucy5heGxlV29ybGQuY2xvbmUoKTsKICAgICAgdGhpcy5zdXNwZW5zaW9uUmVzdExlbmd0aCA9IG9wdGlvbnMuc3VzcGVuc2lvblJlc3RMZW5ndGg7CiAgICAgIHRoaXMuc3VzcGVuc2lvbk1heExlbmd0aCA9IG9wdGlvbnMuc3VzcGVuc2lvbk1heExlbmd0aDsKICAgICAgdGhpcy5yYWRpdXMgPSBvcHRpb25zLnJhZGl1czsKICAgICAgdGhpcy5zdXNwZW5zaW9uU3RpZmZuZXNzID0gb3B0aW9ucy5zdXNwZW5zaW9uU3RpZmZuZXNzOwogICAgICB0aGlzLmRhbXBpbmdDb21wcmVzc2lvbiA9IG9wdGlvbnMuZGFtcGluZ0NvbXByZXNzaW9uOwogICAgICB0aGlzLmRhbXBpbmdSZWxheGF0aW9uID0gb3B0aW9ucy5kYW1waW5nUmVsYXhhdGlvbjsKICAgICAgdGhpcy5mcmljdGlvblNsaXAgPSBvcHRpb25zLmZyaWN0aW9uU2xpcDsKICAgICAgdGhpcy5mb3J3YXJkQWNjZWxlcmF0aW9uID0gb3B0aW9ucy5mb3J3YXJkQWNjZWxlcmF0aW9uOwogICAgICB0aGlzLnNpZGVBY2NlbGVyYXRpb24gPSBvcHRpb25zLnNpZGVBY2NlbGVyYXRpb247CiAgICAgIHRoaXMuc3RlZXJpbmcgPSAwOwogICAgICB0aGlzLnJvdGF0aW9uID0gMDsKICAgICAgdGhpcy5kZWx0YVJvdGF0aW9uID0gMDsKICAgICAgdGhpcy5yb2xsSW5mbHVlbmNlID0gb3B0aW9ucy5yb2xsSW5mbHVlbmNlOwogICAgICB0aGlzLm1heFN1c3BlbnNpb25Gb3JjZSA9IG9wdGlvbnMubWF4U3VzcGVuc2lvbkZvcmNlOwogICAgICB0aGlzLmVuZ2luZUZvcmNlID0gMDsKICAgICAgdGhpcy5icmFrZSA9IDA7CiAgICAgIHRoaXMuaXNGcm9udFdoZWVsID0gb3B0aW9ucy5pc0Zyb250V2hlZWw7CiAgICAgIHRoaXMuY2xpcHBlZEludkNvbnRhY3REb3RTdXNwZW5zaW9uID0gMTsKICAgICAgdGhpcy5zdXNwZW5zaW9uUmVsYXRpdmVWZWxvY2l0eSA9IDA7CiAgICAgIHRoaXMuc3VzcGVuc2lvbkZvcmNlID0gMDsKICAgICAgdGhpcy5zbGlwSW5mbyA9IDA7CiAgICAgIHRoaXMuc2tpZEluZm8gPSAwOwogICAgICB0aGlzLnN1c3BlbnNpb25MZW5ndGggPSAwOwogICAgICB0aGlzLnNpZGVJbXB1bHNlID0gMDsKICAgICAgdGhpcy5mb3J3YXJkSW1wdWxzZSA9IDA7CiAgICAgIHRoaXMucmF5Y2FzdFJlc3VsdCA9IG5ldyBSYXljYXN0UmVzdWx0KCk7CiAgICAgIHRoaXMud29ybGRUcmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKCk7CiAgICAgIHRoaXMuaXNJbkNvbnRhY3QgPSBmYWxzZTsKICAgIH0KCiAgICB1cGRhdGVXaGVlbChjaGFzc2lzKSB7CiAgICAgIGNvbnN0IHJheWNhc3RSZXN1bHQgPSB0aGlzLnJheWNhc3RSZXN1bHQ7CgogICAgICBpZiAodGhpcy5pc0luQ29udGFjdCkgewogICAgICAgIGNvbnN0IHByb2plY3QgPSByYXljYXN0UmVzdWx0LmhpdE5vcm1hbFdvcmxkLmRvdChyYXljYXN0UmVzdWx0LmRpcmVjdGlvbldvcmxkKTsKICAgICAgICByYXljYXN0UmVzdWx0LmhpdFBvaW50V29ybGQudnN1YihjaGFzc2lzLnBvc2l0aW9uLCByZWxwb3MpOwogICAgICAgIGNoYXNzaXMuZ2V0VmVsb2NpdHlBdFdvcmxkUG9pbnQocmVscG9zLCBjaGFzc2lzX3ZlbG9jaXR5X2F0X2NvbnRhY3RQb2ludCk7CiAgICAgICAgY29uc3QgcHJvalZlbCA9IHJheWNhc3RSZXN1bHQuaGl0Tm9ybWFsV29ybGQuZG90KGNoYXNzaXNfdmVsb2NpdHlfYXRfY29udGFjdFBvaW50KTsKCiAgICAgICAgaWYgKHByb2plY3QgPj0gLTAuMSkgewogICAgICAgICAgdGhpcy5zdXNwZW5zaW9uUmVsYXRpdmVWZWxvY2l0eSA9IDAuMDsKICAgICAgICAgIHRoaXMuY2xpcHBlZEludkNvbnRhY3REb3RTdXNwZW5zaW9uID0gMS4wIC8gMC4xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBpbnYgPSAtMSAvIHByb2plY3Q7CiAgICAgICAgICB0aGlzLnN1c3BlbnNpb25SZWxhdGl2ZVZlbG9jaXR5ID0gcHJvalZlbCAqIGludjsKICAgICAgICAgIHRoaXMuY2xpcHBlZEludkNvbnRhY3REb3RTdXNwZW5zaW9uID0gaW52OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOb3QgaW4gY29udGFjdCA6IHBvc2l0aW9uIHdoZWVsIGluIGEgbmljZSAocmVzdCBsZW5ndGgpIHBvc2l0aW9uCiAgICAgICAgcmF5Y2FzdFJlc3VsdC5zdXNwZW5zaW9uTGVuZ3RoID0gdGhpcy5zdXNwZW5zaW9uUmVzdExlbmd0aDsKICAgICAgICB0aGlzLnN1c3BlbnNpb25SZWxhdGl2ZVZlbG9jaXR5ID0gMC4wOwogICAgICAgIHJheWNhc3RSZXN1bHQuZGlyZWN0aW9uV29ybGQuc2NhbGUoLTEsIHJheWNhc3RSZXN1bHQuaGl0Tm9ybWFsV29ybGQpOwogICAgICAgIHRoaXMuY2xpcHBlZEludkNvbnRhY3REb3RTdXNwZW5zaW9uID0gMS4wOwogICAgICB9CiAgICB9CgogIH0KICBjb25zdCBjaGFzc2lzX3ZlbG9jaXR5X2F0X2NvbnRhY3RQb2ludCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgcmVscG9zID0gbmV3IFZlYzMoKTsKCiAgLyoqCiAgICogVmVoaWNsZSBoZWxwZXIgY2xhc3MgdGhhdCBjYXN0cyByYXlzIGZyb20gdGhlIHdoZWVsIHBvc2l0aW9ucyB0b3dhcmRzIHRoZSBncm91bmQgYW5kIGFwcGxpZXMgZm9yY2VzLgogICAqLwogIGNsYXNzIFJheWNhc3RWZWhpY2xlIHsKICAgIC8qKiBUaGUgY2FyIGNoYXNzaXMgYm9keS4gKi8KCiAgICAvKiogVGhlIHdoZWVscy4gKi8KCiAgICAvKiogV2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGUgY2FyIGlzIHNsaWRpbmcuICovCgogICAgLyoqIEluZGV4IG9mIHRoZSByaWdodCBheGlzLiB4PTAsIHk9MSwgej0yICovCgogICAgLyoqIEluZGV4IG9mIHRoZSBmb3J3YXJkIGF4aXMuIHg9MCwgeT0xLCB6PTIgKi8KCiAgICAvKiogSW5kZXggb2YgdGhlIHVwIGF4aXMuIHg9MCwgeT0xLCB6PTIgKi8KCiAgICAvKiogVGhlIGNvbnN0cmFpbnRzLiAqLwoKICAgIC8qKiBPcHRpb25hbCBwcmUtc3RlcCBjYWxsYmFjay4gKi8KCiAgICAvKiogTnVtYmVyIG9mIHdoZWVscyBvbiB0aGUgZ3JvdW5kLiAqLwogICAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgICB0aGlzLmNoYXNzaXNCb2R5ID0gb3B0aW9ucy5jaGFzc2lzQm9keTsKICAgICAgdGhpcy53aGVlbEluZm9zID0gW107CiAgICAgIHRoaXMuc2xpZGluZyA9IGZhbHNlOwogICAgICB0aGlzLndvcmxkID0gbnVsbDsKICAgICAgdGhpcy5pbmRleFJpZ2h0QXhpcyA9IHR5cGVvZiBvcHRpb25zLmluZGV4UmlnaHRBeGlzICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMuaW5kZXhSaWdodEF4aXMgOiAyOwogICAgICB0aGlzLmluZGV4Rm9yd2FyZEF4aXMgPSB0eXBlb2Ygb3B0aW9ucy5pbmRleEZvcndhcmRBeGlzICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMuaW5kZXhGb3J3YXJkQXhpcyA6IDA7CiAgICAgIHRoaXMuaW5kZXhVcEF4aXMgPSB0eXBlb2Ygb3B0aW9ucy5pbmRleFVwQXhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLmluZGV4VXBBeGlzIDogMTsKICAgICAgdGhpcy5jb25zdHJhaW50cyA9IFtdOwoKICAgICAgdGhpcy5wcmVTdGVwQ2FsbGJhY2sgPSAoKSA9PiB7fTsKCiAgICAgIHRoaXMuY3VycmVudFZlaGljbGVTcGVlZEttSG91ciA9IDA7CiAgICAgIHRoaXMubnVtV2hlZWxzT25Hcm91bmQgPSAwOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYSB3aGVlbC4gRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcHRpb25zLCBzZWUgYFdoZWVsSW5mb2AuCiAgICAgKi8KCgogICAgYWRkV2hlZWwob3B0aW9ucykgewogICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7CiAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICB9CgogICAgICBjb25zdCBpbmZvID0gbmV3IFdoZWVsSW5mbyhvcHRpb25zKTsKICAgICAgY29uc3QgaW5kZXggPSB0aGlzLndoZWVsSW5mb3MubGVuZ3RoOwogICAgICB0aGlzLndoZWVsSW5mb3MucHVzaChpbmZvKTsKICAgICAgcmV0dXJuIGluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHN0ZWVyaW5nIHZhbHVlIG9mIGEgd2hlZWwuCiAgICAgKi8KCgogICAgc2V0U3RlZXJpbmdWYWx1ZSh2YWx1ZSwgd2hlZWxJbmRleCkgewogICAgICBjb25zdCB3aGVlbCA9IHRoaXMud2hlZWxJbmZvc1t3aGVlbEluZGV4XTsKICAgICAgd2hlZWwuc3RlZXJpbmcgPSB2YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogU2V0IHRoZSB3aGVlbCBmb3JjZSB0byBhcHBseSBvbiBvbmUgb2YgdGhlIHdoZWVscyBlYWNoIHRpbWUgc3RlcAogICAgICovCgoKICAgIGFwcGx5RW5naW5lRm9yY2UodmFsdWUsIHdoZWVsSW5kZXgpIHsKICAgICAgdGhpcy53aGVlbEluZm9zW3doZWVsSW5kZXhdLmVuZ2luZUZvcmNlID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgYnJha2luZyBmb3JjZSBvZiBhIHdoZWVsCiAgICAgKi8KCgogICAgc2V0QnJha2UoYnJha2UsIHdoZWVsSW5kZXgpIHsKICAgICAgdGhpcy53aGVlbEluZm9zW3doZWVsSW5kZXhdLmJyYWtlID0gYnJha2U7CiAgICB9CiAgICAvKioKICAgICAqIEFkZCB0aGUgdmVoaWNsZSBpbmNsdWRpbmcgaXRzIGNvbnN0cmFpbnRzIHRvIHRoZSB3b3JsZC4KICAgICAqLwoKCiAgICBhZGRUb1dvcmxkKHdvcmxkKSB7CiAgICAgIHdvcmxkLmFkZEJvZHkodGhpcy5jaGFzc2lzQm9keSk7CiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzOwoKICAgICAgdGhpcy5wcmVTdGVwQ2FsbGJhY2sgPSAoKSA9PiB7CiAgICAgICAgdGhhdC51cGRhdGVWZWhpY2xlKHdvcmxkLmR0KTsKICAgICAgfTsKCiAgICAgIHdvcmxkLmFkZEV2ZW50TGlzdGVuZXIoJ3ByZVN0ZXAnLCB0aGlzLnByZVN0ZXBDYWxsYmFjayk7CiAgICAgIHRoaXMud29ybGQgPSB3b3JsZDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IG9uZSBvZiB0aGUgd2hlZWwgYXhsZXMsIHdvcmxkLW9yaWVudGVkLgogICAgICovCgoKICAgIGdldFZlaGljbGVBeGlzV29ybGQoYXhpc0luZGV4LCByZXN1bHQpIHsKICAgICAgcmVzdWx0LnNldChheGlzSW5kZXggPT09IDAgPyAxIDogMCwgYXhpc0luZGV4ID09PSAxID8gMSA6IDAsIGF4aXNJbmRleCA9PT0gMiA/IDEgOiAwKTsKICAgICAgdGhpcy5jaGFzc2lzQm9keS52ZWN0b3JUb1dvcmxkRnJhbWUocmVzdWx0LCByZXN1bHQpOwogICAgfQoKICAgIHVwZGF0ZVZlaGljbGUodGltZVN0ZXApIHsKICAgICAgY29uc3Qgd2hlZWxJbmZvcyA9IHRoaXMud2hlZWxJbmZvczsKICAgICAgY29uc3QgbnVtV2hlZWxzID0gd2hlZWxJbmZvcy5sZW5ndGg7CiAgICAgIGNvbnN0IGNoYXNzaXNCb2R5ID0gdGhpcy5jaGFzc2lzQm9keTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtV2hlZWxzOyBpKyspIHsKICAgICAgICB0aGlzLnVwZGF0ZVdoZWVsVHJhbnNmb3JtKGkpOwogICAgICB9CgogICAgICB0aGlzLmN1cnJlbnRWZWhpY2xlU3BlZWRLbUhvdXIgPSAzLjYgKiBjaGFzc2lzQm9keS52ZWxvY2l0eS5sZW5ndGgoKTsKICAgICAgY29uc3QgZm9yd2FyZFdvcmxkID0gbmV3IFZlYzMoKTsKICAgICAgdGhpcy5nZXRWZWhpY2xlQXhpc1dvcmxkKHRoaXMuaW5kZXhGb3J3YXJkQXhpcywgZm9yd2FyZFdvcmxkKTsKCiAgICAgIGlmIChmb3J3YXJkV29ybGQuZG90KGNoYXNzaXNCb2R5LnZlbG9jaXR5KSA8IDApIHsKICAgICAgICB0aGlzLmN1cnJlbnRWZWhpY2xlU3BlZWRLbUhvdXIgKj0gLTE7CiAgICAgIH0gLy8gc2ltdWxhdGUgc3VzcGVuc2lvbgoKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtV2hlZWxzOyBpKyspIHsKICAgICAgICB0aGlzLmNhc3RSYXkod2hlZWxJbmZvc1tpXSk7CiAgICAgIH0KCiAgICAgIHRoaXMudXBkYXRlU3VzcGVuc2lvbih0aW1lU3RlcCk7CiAgICAgIGNvbnN0IGltcHVsc2UgPSBuZXcgVmVjMygpOwogICAgICBjb25zdCByZWxwb3MgPSBuZXcgVmVjMygpOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1XaGVlbHM7IGkrKykgewogICAgICAgIC8vYXBwbHkgc3VzcGVuc2lvbiBmb3JjZQogICAgICAgIGNvbnN0IHdoZWVsID0gd2hlZWxJbmZvc1tpXTsKICAgICAgICBsZXQgc3VzcGVuc2lvbkZvcmNlID0gd2hlZWwuc3VzcGVuc2lvbkZvcmNlOwoKICAgICAgICBpZiAoc3VzcGVuc2lvbkZvcmNlID4gd2hlZWwubWF4U3VzcGVuc2lvbkZvcmNlKSB7CiAgICAgICAgICBzdXNwZW5zaW9uRm9yY2UgPSB3aGVlbC5tYXhTdXNwZW5zaW9uRm9yY2U7CiAgICAgICAgfQoKICAgICAgICB3aGVlbC5yYXljYXN0UmVzdWx0LmhpdE5vcm1hbFdvcmxkLnNjYWxlKHN1c3BlbnNpb25Gb3JjZSAqIHRpbWVTdGVwLCBpbXB1bHNlKTsKICAgICAgICB3aGVlbC5yYXljYXN0UmVzdWx0LmhpdFBvaW50V29ybGQudnN1YihjaGFzc2lzQm9keS5wb3NpdGlvbiwgcmVscG9zKTsKICAgICAgICBjaGFzc2lzQm9keS5hcHBseUltcHVsc2UoaW1wdWxzZSwgcmVscG9zKTsKICAgICAgfQoKICAgICAgdGhpcy51cGRhdGVGcmljdGlvbih0aW1lU3RlcCk7CiAgICAgIGNvbnN0IGhpdE5vcm1hbFdvcmxkU2NhbGVkV2l0aFByb2ogPSBuZXcgVmVjMygpOwogICAgICBjb25zdCBmd2QgPSBuZXcgVmVjMygpOwogICAgICBjb25zdCB2ZWwgPSBuZXcgVmVjMygpOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1XaGVlbHM7IGkrKykgewogICAgICAgIGNvbnN0IHdoZWVsID0gd2hlZWxJbmZvc1tpXTsgLy9jb25zdCByZWxwb3MgPSBuZXcgVmVjMygpOwogICAgICAgIC8vd2hlZWwuY2hhc3Npc0Nvbm5lY3Rpb25Qb2ludFdvcmxkLnZzdWIoY2hhc3Npc0JvZHkucG9zaXRpb24sIHJlbHBvcyk7CgogICAgICAgIGNoYXNzaXNCb2R5LmdldFZlbG9jaXR5QXRXb3JsZFBvaW50KHdoZWVsLmNoYXNzaXNDb25uZWN0aW9uUG9pbnRXb3JsZCwgdmVsKTsgLy8gSGFjayB0byBnZXQgdGhlIHJvdGF0aW9uIGluIHRoZSBjb3JyZWN0IGRpcmVjdGlvbgoKICAgICAgICBsZXQgbSA9IDE7CgogICAgICAgIHN3aXRjaCAodGhpcy5pbmRleFVwQXhpcykgewogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBtID0gLTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKHdoZWVsLmlzSW5Db250YWN0KSB7CiAgICAgICAgICB0aGlzLmdldFZlaGljbGVBeGlzV29ybGQodGhpcy5pbmRleEZvcndhcmRBeGlzLCBmd2QpOwogICAgICAgICAgY29uc3QgcHJvaiA9IGZ3ZC5kb3Qod2hlZWwucmF5Y2FzdFJlc3VsdC5oaXROb3JtYWxXb3JsZCk7CiAgICAgICAgICB3aGVlbC5yYXljYXN0UmVzdWx0LmhpdE5vcm1hbFdvcmxkLnNjYWxlKHByb2osIGhpdE5vcm1hbFdvcmxkU2NhbGVkV2l0aFByb2opOwogICAgICAgICAgZndkLnZzdWIoaGl0Tm9ybWFsV29ybGRTY2FsZWRXaXRoUHJvaiwgZndkKTsKICAgICAgICAgIGNvbnN0IHByb2oyID0gZndkLmRvdCh2ZWwpOwogICAgICAgICAgd2hlZWwuZGVsdGFSb3RhdGlvbiA9IG0gKiBwcm9qMiAqIHRpbWVTdGVwIC8gd2hlZWwucmFkaXVzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCh3aGVlbC5zbGlkaW5nIHx8ICF3aGVlbC5pc0luQ29udGFjdCkgJiYgd2hlZWwuZW5naW5lRm9yY2UgIT09IDAgJiYgd2hlZWwudXNlQ3VzdG9tU2xpZGluZ1JvdGF0aW9uYWxTcGVlZCkgewogICAgICAgICAgLy8gQXBwbHkgY3VzdG9tIHJvdGF0aW9uIHdoZW4gYWNjZWxlcmF0aW5nIGFuZCBzbGlkaW5nCiAgICAgICAgICB3aGVlbC5kZWx0YVJvdGF0aW9uID0gKHdoZWVsLmVuZ2luZUZvcmNlID4gMCA/IDEgOiAtMSkgKiB3aGVlbC5jdXN0b21TbGlkaW5nUm90YXRpb25hbFNwZWVkICogdGltZVN0ZXA7CiAgICAgICAgfSAvLyBMb2NrIHdoZWVscwoKCiAgICAgICAgaWYgKE1hdGguYWJzKHdoZWVsLmJyYWtlKSA+IE1hdGguYWJzKHdoZWVsLmVuZ2luZUZvcmNlKSkgewogICAgICAgICAgd2hlZWwuZGVsdGFSb3RhdGlvbiA9IDA7CiAgICAgICAgfQoKICAgICAgICB3aGVlbC5yb3RhdGlvbiArPSB3aGVlbC5kZWx0YVJvdGF0aW9uOyAvLyBVc2UgdGhlIG9sZCB2YWx1ZQoKICAgICAgICB3aGVlbC5kZWx0YVJvdGF0aW9uICo9IDAuOTk7IC8vIGRhbXBpbmcgb2Ygcm90YXRpb24gd2hlbiBub3QgaW4gY29udGFjdAogICAgICB9CiAgICB9CgogICAgdXBkYXRlU3VzcGVuc2lvbihkZWx0YVRpbWUpIHsKICAgICAgY29uc3QgY2hhc3Npc0JvZHkgPSB0aGlzLmNoYXNzaXNCb2R5OwogICAgICBjb25zdCBjaGFzc2lzTWFzcyA9IGNoYXNzaXNCb2R5Lm1hc3M7CiAgICAgIGNvbnN0IHdoZWVsSW5mb3MgPSB0aGlzLndoZWVsSW5mb3M7CiAgICAgIGNvbnN0IG51bVdoZWVscyA9IHdoZWVsSW5mb3MubGVuZ3RoOwoKICAgICAgZm9yIChsZXQgd19pdCA9IDA7IHdfaXQgPCBudW1XaGVlbHM7IHdfaXQrKykgewogICAgICAgIGNvbnN0IHdoZWVsID0gd2hlZWxJbmZvc1t3X2l0XTsKCiAgICAgICAgaWYgKHdoZWVsLmlzSW5Db250YWN0KSB7CiAgICAgICAgICBsZXQgZm9yY2U7IC8vIFNwcmluZwoKICAgICAgICAgIGNvbnN0IHN1c3BfbGVuZ3RoID0gd2hlZWwuc3VzcGVuc2lvblJlc3RMZW5ndGg7CiAgICAgICAgICBjb25zdCBjdXJyZW50X2xlbmd0aCA9IHdoZWVsLnN1c3BlbnNpb25MZW5ndGg7CiAgICAgICAgICBjb25zdCBsZW5ndGhfZGlmZiA9IHN1c3BfbGVuZ3RoIC0gY3VycmVudF9sZW5ndGg7CiAgICAgICAgICBmb3JjZSA9IHdoZWVsLnN1c3BlbnNpb25TdGlmZm5lc3MgKiBsZW5ndGhfZGlmZiAqIHdoZWVsLmNsaXBwZWRJbnZDb250YWN0RG90U3VzcGVuc2lvbjsgLy8gRGFtcGVyCgogICAgICAgICAgY29uc3QgcHJvamVjdGVkX3JlbF92ZWwgPSB3aGVlbC5zdXNwZW5zaW9uUmVsYXRpdmVWZWxvY2l0eTsKICAgICAgICAgIGxldCBzdXNwX2RhbXBpbmc7CgogICAgICAgICAgaWYgKHByb2plY3RlZF9yZWxfdmVsIDwgMCkgewogICAgICAgICAgICBzdXNwX2RhbXBpbmcgPSB3aGVlbC5kYW1waW5nQ29tcHJlc3Npb247CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdXNwX2RhbXBpbmcgPSB3aGVlbC5kYW1waW5nUmVsYXhhdGlvbjsKICAgICAgICAgIH0KCiAgICAgICAgICBmb3JjZSAtPSBzdXNwX2RhbXBpbmcgKiBwcm9qZWN0ZWRfcmVsX3ZlbDsKICAgICAgICAgIHdoZWVsLnN1c3BlbnNpb25Gb3JjZSA9IGZvcmNlICogY2hhc3Npc01hc3M7CgogICAgICAgICAgaWYgKHdoZWVsLnN1c3BlbnNpb25Gb3JjZSA8IDApIHsKICAgICAgICAgICAgd2hlZWwuc3VzcGVuc2lvbkZvcmNlID0gMDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgd2hlZWwuc3VzcGVuc2lvbkZvcmNlID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIHRoZSB2ZWhpY2xlIGluY2x1ZGluZyBpdHMgY29uc3RyYWludHMgZnJvbSB0aGUgd29ybGQuCiAgICAgKi8KCgogICAgcmVtb3ZlRnJvbVdvcmxkKHdvcmxkKSB7CiAgICAgIHRoaXMuY29uc3RyYWludHM7CiAgICAgIHdvcmxkLnJlbW92ZUJvZHkodGhpcy5jaGFzc2lzQm9keSk7CiAgICAgIHdvcmxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3ByZVN0ZXAnLCB0aGlzLnByZVN0ZXBDYWxsYmFjayk7CiAgICAgIHRoaXMud29ybGQgPSBudWxsOwogICAgfQoKICAgIGNhc3RSYXkod2hlZWwpIHsKICAgICAgY29uc3QgcmF5dmVjdG9yID0gY2FzdFJheV9yYXl2ZWN0b3I7CiAgICAgIGNvbnN0IHRhcmdldCA9IGNhc3RSYXlfdGFyZ2V0OwogICAgICB0aGlzLnVwZGF0ZVdoZWVsVHJhbnNmb3JtV29ybGQod2hlZWwpOwogICAgICBjb25zdCBjaGFzc2lzQm9keSA9IHRoaXMuY2hhc3Npc0JvZHk7CiAgICAgIGxldCBkZXB0aCA9IC0xOwogICAgICBjb25zdCByYXlsZW4gPSB3aGVlbC5zdXNwZW5zaW9uUmVzdExlbmd0aCArIHdoZWVsLnJhZGl1czsKICAgICAgd2hlZWwuZGlyZWN0aW9uV29ybGQuc2NhbGUocmF5bGVuLCByYXl2ZWN0b3IpOwogICAgICBjb25zdCBzb3VyY2UgPSB3aGVlbC5jaGFzc2lzQ29ubmVjdGlvblBvaW50V29ybGQ7CiAgICAgIHNvdXJjZS52YWRkKHJheXZlY3RvciwgdGFyZ2V0KTsKICAgICAgY29uc3QgcmF5Y2FzdFJlc3VsdCA9IHdoZWVsLnJheWNhc3RSZXN1bHQ7CiAgICAgIHJheWNhc3RSZXN1bHQucmVzZXQoKTsgLy8gVHVybiBvZmYgcmF5IGNvbGxpc2lvbiB3aXRoIHRoZSBjaGFzc2lzIHRlbXBvcmFyaWx5CgogICAgICBjb25zdCBvbGRTdGF0ZSA9IGNoYXNzaXNCb2R5LmNvbGxpc2lvblJlc3BvbnNlOwogICAgICBjaGFzc2lzQm9keS5jb2xsaXNpb25SZXNwb25zZSA9IGZhbHNlOyAvLyBDYXN0IHJheSBhZ2FpbnN0IHdvcmxkCgogICAgICB0aGlzLndvcmxkLnJheVRlc3Qoc291cmNlLCB0YXJnZXQsIHJheWNhc3RSZXN1bHQpOwogICAgICBjaGFzc2lzQm9keS5jb2xsaXNpb25SZXNwb25zZSA9IG9sZFN0YXRlOwogICAgICBjb25zdCBvYmplY3QgPSByYXljYXN0UmVzdWx0LmJvZHk7CiAgICAgIHdoZWVsLnJheWNhc3RSZXN1bHQuZ3JvdW5kT2JqZWN0ID0gMDsKCiAgICAgIGlmIChvYmplY3QpIHsKICAgICAgICBkZXB0aCA9IHJheWNhc3RSZXN1bHQuZGlzdGFuY2U7CiAgICAgICAgd2hlZWwucmF5Y2FzdFJlc3VsdC5oaXROb3JtYWxXb3JsZCA9IHJheWNhc3RSZXN1bHQuaGl0Tm9ybWFsV29ybGQ7CiAgICAgICAgd2hlZWwuaXNJbkNvbnRhY3QgPSB0cnVlOwogICAgICAgIGNvbnN0IGhpdERpc3RhbmNlID0gcmF5Y2FzdFJlc3VsdC5kaXN0YW5jZTsKICAgICAgICB3aGVlbC5zdXNwZW5zaW9uTGVuZ3RoID0gaGl0RGlzdGFuY2UgLSB3aGVlbC5yYWRpdXM7IC8vIGNsYW1wIG9uIG1heCBzdXNwZW5zaW9uIHRyYXZlbAoKICAgICAgICBjb25zdCBtaW5TdXNwZW5zaW9uTGVuZ3RoID0gd2hlZWwuc3VzcGVuc2lvblJlc3RMZW5ndGggLSB3aGVlbC5tYXhTdXNwZW5zaW9uVHJhdmVsOwogICAgICAgIGNvbnN0IG1heFN1c3BlbnNpb25MZW5ndGggPSB3aGVlbC5zdXNwZW5zaW9uUmVzdExlbmd0aCArIHdoZWVsLm1heFN1c3BlbnNpb25UcmF2ZWw7CgogICAgICAgIGlmICh3aGVlbC5zdXNwZW5zaW9uTGVuZ3RoIDwgbWluU3VzcGVuc2lvbkxlbmd0aCkgewogICAgICAgICAgd2hlZWwuc3VzcGVuc2lvbkxlbmd0aCA9IG1pblN1c3BlbnNpb25MZW5ndGg7CiAgICAgICAgfQoKICAgICAgICBpZiAod2hlZWwuc3VzcGVuc2lvbkxlbmd0aCA+IG1heFN1c3BlbnNpb25MZW5ndGgpIHsKICAgICAgICAgIHdoZWVsLnN1c3BlbnNpb25MZW5ndGggPSBtYXhTdXNwZW5zaW9uTGVuZ3RoOwogICAgICAgICAgd2hlZWwucmF5Y2FzdFJlc3VsdC5yZXNldCgpOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgZGVub21pbmF0b3IgPSB3aGVlbC5yYXljYXN0UmVzdWx0LmhpdE5vcm1hbFdvcmxkLmRvdCh3aGVlbC5kaXJlY3Rpb25Xb3JsZCk7CiAgICAgICAgY29uc3QgY2hhc3Npc192ZWxvY2l0eV9hdF9jb250YWN0UG9pbnQgPSBuZXcgVmVjMygpOwogICAgICAgIGNoYXNzaXNCb2R5LmdldFZlbG9jaXR5QXRXb3JsZFBvaW50KHdoZWVsLnJheWNhc3RSZXN1bHQuaGl0UG9pbnRXb3JsZCwgY2hhc3Npc192ZWxvY2l0eV9hdF9jb250YWN0UG9pbnQpOwogICAgICAgIGNvbnN0IHByb2pWZWwgPSB3aGVlbC5yYXljYXN0UmVzdWx0LmhpdE5vcm1hbFdvcmxkLmRvdChjaGFzc2lzX3ZlbG9jaXR5X2F0X2NvbnRhY3RQb2ludCk7CgogICAgICAgIGlmIChkZW5vbWluYXRvciA+PSAtMC4xKSB7CiAgICAgICAgICB3aGVlbC5zdXNwZW5zaW9uUmVsYXRpdmVWZWxvY2l0eSA9IDA7CiAgICAgICAgICB3aGVlbC5jbGlwcGVkSW52Q29udGFjdERvdFN1c3BlbnNpb24gPSAxIC8gMC4xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBpbnYgPSAtMSAvIGRlbm9taW5hdG9yOwogICAgICAgICAgd2hlZWwuc3VzcGVuc2lvblJlbGF0aXZlVmVsb2NpdHkgPSBwcm9qVmVsICogaW52OwogICAgICAgICAgd2hlZWwuY2xpcHBlZEludkNvbnRhY3REb3RTdXNwZW5zaW9uID0gaW52OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvL3B1dCB3aGVlbCBpbmZvIGFzIGluIHJlc3QgcG9zaXRpb24KICAgICAgICB3aGVlbC5zdXNwZW5zaW9uTGVuZ3RoID0gd2hlZWwuc3VzcGVuc2lvblJlc3RMZW5ndGggKyAwICogd2hlZWwubWF4U3VzcGVuc2lvblRyYXZlbDsKICAgICAgICB3aGVlbC5zdXNwZW5zaW9uUmVsYXRpdmVWZWxvY2l0eSA9IDAuMDsKICAgICAgICB3aGVlbC5kaXJlY3Rpb25Xb3JsZC5zY2FsZSgtMSwgd2hlZWwucmF5Y2FzdFJlc3VsdC5oaXROb3JtYWxXb3JsZCk7CiAgICAgICAgd2hlZWwuY2xpcHBlZEludkNvbnRhY3REb3RTdXNwZW5zaW9uID0gMS4wOwogICAgICB9CgogICAgICByZXR1cm4gZGVwdGg7CiAgICB9CgogICAgdXBkYXRlV2hlZWxUcmFuc2Zvcm1Xb3JsZCh3aGVlbCkgewogICAgICB3aGVlbC5pc0luQ29udGFjdCA9IGZhbHNlOwogICAgICBjb25zdCBjaGFzc2lzQm9keSA9IHRoaXMuY2hhc3Npc0JvZHk7CiAgICAgIGNoYXNzaXNCb2R5LnBvaW50VG9Xb3JsZEZyYW1lKHdoZWVsLmNoYXNzaXNDb25uZWN0aW9uUG9pbnRMb2NhbCwgd2hlZWwuY2hhc3Npc0Nvbm5lY3Rpb25Qb2ludFdvcmxkKTsKICAgICAgY2hhc3Npc0JvZHkudmVjdG9yVG9Xb3JsZEZyYW1lKHdoZWVsLmRpcmVjdGlvbkxvY2FsLCB3aGVlbC5kaXJlY3Rpb25Xb3JsZCk7CiAgICAgIGNoYXNzaXNCb2R5LnZlY3RvclRvV29ybGRGcmFtZSh3aGVlbC5heGxlTG9jYWwsIHdoZWVsLmF4bGVXb3JsZCk7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBvbmUgb2YgdGhlIHdoZWVsIHRyYW5zZm9ybS4KICAgICAqIE5vdGUgd2hlbiByZW5kZXJpbmcgd2hlZWxzOiBkdXJpbmcgZWFjaCBzdGVwLCB3aGVlbCB0cmFuc2Zvcm1zIGFyZSB1cGRhdGVkIEJFRk9SRSB0aGUgY2hhc3NpczsgaWUuIHRoZWlyIHBvc2l0aW9uIGJlY29tZXMgaW52YWxpZCBhZnRlciB0aGUgc3RlcC4gVGh1cyB3aGVuIHlvdSByZW5kZXIgd2hlZWxzLCB5b3UgbXVzdCB1cGRhdGUgd2hlZWwgdHJhbnNmb3JtcyBiZWZvcmUgcmVuZGVyaW5nIHRoZW0uIFNlZSByYXljYXN0VmVoaWNsZSBkZW1vIGZvciBhbiBleGFtcGxlLgogICAgICogQHBhcmFtIHdoZWVsSW5kZXggVGhlIHdoZWVsIGluZGV4IHRvIHVwZGF0ZS4KICAgICAqLwoKCiAgICB1cGRhdGVXaGVlbFRyYW5zZm9ybSh3aGVlbEluZGV4KSB7CiAgICAgIGNvbnN0IHVwID0gdG1wVmVjNDsKICAgICAgY29uc3QgcmlnaHQgPSB0bXBWZWM1OwogICAgICBjb25zdCBmd2QgPSB0bXBWZWM2OwogICAgICBjb25zdCB3aGVlbCA9IHRoaXMud2hlZWxJbmZvc1t3aGVlbEluZGV4XTsKICAgICAgdGhpcy51cGRhdGVXaGVlbFRyYW5zZm9ybVdvcmxkKHdoZWVsKTsKICAgICAgd2hlZWwuZGlyZWN0aW9uTG9jYWwuc2NhbGUoLTEsIHVwKTsKICAgICAgcmlnaHQuY29weSh3aGVlbC5heGxlTG9jYWwpOwogICAgICB1cC5jcm9zcyhyaWdodCwgZndkKTsKICAgICAgZndkLm5vcm1hbGl6ZSgpOwogICAgICByaWdodC5ub3JtYWxpemUoKTsgLy8gUm90YXRlIGFyb3VuZCBzdGVlcmluZyBvdmVyIHRoZSB3aGVlbEF4bGUKCiAgICAgIGNvbnN0IHN0ZWVyaW5nID0gd2hlZWwuc3RlZXJpbmc7CiAgICAgIGNvbnN0IHN0ZWVyaW5nT3JuID0gbmV3IFF1YXRlcm5pb24oKTsKICAgICAgc3RlZXJpbmdPcm4uc2V0RnJvbUF4aXNBbmdsZSh1cCwgc3RlZXJpbmcpOwogICAgICBjb25zdCByb3RhdGluZ09ybiA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAgIHJvdGF0aW5nT3JuLnNldEZyb21BeGlzQW5nbGUocmlnaHQsIHdoZWVsLnJvdGF0aW9uKTsgLy8gV29ybGQgcm90YXRpb24gb2YgdGhlIHdoZWVsCgogICAgICBjb25zdCBxID0gd2hlZWwud29ybGRUcmFuc2Zvcm0ucXVhdGVybmlvbjsKICAgICAgdGhpcy5jaGFzc2lzQm9keS5xdWF0ZXJuaW9uLm11bHQoc3RlZXJpbmdPcm4sIHEpOwogICAgICBxLm11bHQocm90YXRpbmdPcm4sIHEpOwogICAgICBxLm5vcm1hbGl6ZSgpOyAvLyB3b3JsZCBwb3NpdGlvbiBvZiB0aGUgd2hlZWwKCiAgICAgIGNvbnN0IHAgPSB3aGVlbC53b3JsZFRyYW5zZm9ybS5wb3NpdGlvbjsKICAgICAgcC5jb3B5KHdoZWVsLmRpcmVjdGlvbldvcmxkKTsKICAgICAgcC5zY2FsZSh3aGVlbC5zdXNwZW5zaW9uTGVuZ3RoLCBwKTsKICAgICAgcC52YWRkKHdoZWVsLmNoYXNzaXNDb25uZWN0aW9uUG9pbnRXb3JsZCwgcCk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0aGUgd29ybGQgdHJhbnNmb3JtIG9mIG9uZSBvZiB0aGUgd2hlZWxzCiAgICAgKi8KCgogICAgZ2V0V2hlZWxUcmFuc2Zvcm1Xb3JsZCh3aGVlbEluZGV4KSB7CiAgICAgIHJldHVybiB0aGlzLndoZWVsSW5mb3Nbd2hlZWxJbmRleF0ud29ybGRUcmFuc2Zvcm07CiAgICB9CgogICAgdXBkYXRlRnJpY3Rpb24odGltZVN0ZXApIHsKICAgICAgY29uc3Qgc3VyZk5vcm1hbFdTX3NjYWxlZF9wcm9qID0gdXBkYXRlRnJpY3Rpb25fc3VyZk5vcm1hbFdTX3NjYWxlZF9wcm9qOyAvL2NhbGN1bGF0ZSB0aGUgaW1wdWxzZSwgc28gdGhhdCB0aGUgd2hlZWxzIGRvbid0IG1vdmUgc2lkZXdhcmRzCgogICAgICBjb25zdCB3aGVlbEluZm9zID0gdGhpcy53aGVlbEluZm9zOwogICAgICBjb25zdCBudW1XaGVlbHMgPSB3aGVlbEluZm9zLmxlbmd0aDsKICAgICAgY29uc3QgY2hhc3Npc0JvZHkgPSB0aGlzLmNoYXNzaXNCb2R5OwogICAgICBjb25zdCBmb3J3YXJkV1MgPSB1cGRhdGVGcmljdGlvbl9mb3J3YXJkV1M7CiAgICAgIGNvbnN0IGF4bGUgPSB1cGRhdGVGcmljdGlvbl9heGxlOwogICAgICB0aGlzLm51bVdoZWVsc09uR3JvdW5kID0gMDsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtV2hlZWxzOyBpKyspIHsKICAgICAgICBjb25zdCB3aGVlbCA9IHdoZWVsSW5mb3NbaV07CiAgICAgICAgY29uc3QgZ3JvdW5kT2JqZWN0ID0gd2hlZWwucmF5Y2FzdFJlc3VsdC5ib2R5OwoKICAgICAgICBpZiAoZ3JvdW5kT2JqZWN0KSB7CiAgICAgICAgICB0aGlzLm51bVdoZWVsc09uR3JvdW5kKys7CiAgICAgICAgfQoKICAgICAgICB3aGVlbC5zaWRlSW1wdWxzZSA9IDA7CiAgICAgICAgd2hlZWwuZm9yd2FyZEltcHVsc2UgPSAwOwoKICAgICAgICBpZiAoIWZvcndhcmRXU1tpXSkgewogICAgICAgICAgZm9yd2FyZFdTW2ldID0gbmV3IFZlYzMoKTsKICAgICAgICB9CgogICAgICAgIGlmICghYXhsZVtpXSkgewogICAgICAgICAgYXhsZVtpXSA9IG5ldyBWZWMzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVdoZWVsczsgaSsrKSB7CiAgICAgICAgY29uc3Qgd2hlZWwgPSB3aGVlbEluZm9zW2ldOwogICAgICAgIGNvbnN0IGdyb3VuZE9iamVjdCA9IHdoZWVsLnJheWNhc3RSZXN1bHQuYm9keTsKCiAgICAgICAgaWYgKGdyb3VuZE9iamVjdCkgewogICAgICAgICAgY29uc3QgYXhsZWkgPSBheGxlW2ldOwogICAgICAgICAgY29uc3Qgd2hlZWxUcmFucyA9IHRoaXMuZ2V0V2hlZWxUcmFuc2Zvcm1Xb3JsZChpKTsgLy8gR2V0IHdvcmxkIGF4bGUKCiAgICAgICAgICB3aGVlbFRyYW5zLnZlY3RvclRvV29ybGRGcmFtZShkaXJlY3Rpb25zW3RoaXMuaW5kZXhSaWdodEF4aXNdLCBheGxlaSk7CiAgICAgICAgICBjb25zdCBzdXJmTm9ybWFsV1MgPSB3aGVlbC5yYXljYXN0UmVzdWx0LmhpdE5vcm1hbFdvcmxkOwogICAgICAgICAgY29uc3QgcHJvaiA9IGF4bGVpLmRvdChzdXJmTm9ybWFsV1MpOwogICAgICAgICAgc3VyZk5vcm1hbFdTLnNjYWxlKHByb2osIHN1cmZOb3JtYWxXU19zY2FsZWRfcHJvaik7CiAgICAgICAgICBheGxlaS52c3ViKHN1cmZOb3JtYWxXU19zY2FsZWRfcHJvaiwgYXhsZWkpOwogICAgICAgICAgYXhsZWkubm9ybWFsaXplKCk7CiAgICAgICAgICBzdXJmTm9ybWFsV1MuY3Jvc3MoYXhsZWksIGZvcndhcmRXU1tpXSk7CiAgICAgICAgICBmb3J3YXJkV1NbaV0ubm9ybWFsaXplKCk7CiAgICAgICAgICB3aGVlbC5zaWRlSW1wdWxzZSA9IHJlc29sdmVTaW5nbGVCaWxhdGVyYWwoY2hhc3Npc0JvZHksIHdoZWVsLnJheWNhc3RSZXN1bHQuaGl0UG9pbnRXb3JsZCwgZ3JvdW5kT2JqZWN0LCB3aGVlbC5yYXljYXN0UmVzdWx0LmhpdFBvaW50V29ybGQsIGF4bGVpKTsKICAgICAgICAgIHdoZWVsLnNpZGVJbXB1bHNlICo9IHNpZGVGcmljdGlvblN0aWZmbmVzczI7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdCBzaWRlRmFjdG9yID0gMTsKICAgICAgY29uc3QgZndkRmFjdG9yID0gMC41OwogICAgICB0aGlzLnNsaWRpbmcgPSBmYWxzZTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtV2hlZWxzOyBpKyspIHsKICAgICAgICBjb25zdCB3aGVlbCA9IHdoZWVsSW5mb3NbaV07CiAgICAgICAgY29uc3QgZ3JvdW5kT2JqZWN0ID0gd2hlZWwucmF5Y2FzdFJlc3VsdC5ib2R5OwogICAgICAgIGxldCByb2xsaW5nRnJpY3Rpb24gPSAwOwogICAgICAgIHdoZWVsLnNsaXBJbmZvID0gMTsKCiAgICAgICAgaWYgKGdyb3VuZE9iamVjdCkgewogICAgICAgICAgY29uc3QgZGVmYXVsdFJvbGxpbmdGcmljdGlvbkltcHVsc2UgPSAwOwogICAgICAgICAgY29uc3QgbWF4SW1wdWxzZSA9IHdoZWVsLmJyYWtlID8gd2hlZWwuYnJha2UgOiBkZWZhdWx0Um9sbGluZ0ZyaWN0aW9uSW1wdWxzZTsgLy8gYnRXaGVlbENvbnRhY3RQb2ludCBjb250YWN0UHQoY2hhc3Npc0JvZHksZ3JvdW5kT2JqZWN0LHdoZWVsSW5mcmF5Y2FzdEluZm8uaGl0UG9pbnRXb3JsZCxmb3J3YXJkV1Nbd2hlZWxdLG1heEltcHVsc2UpOwogICAgICAgICAgLy8gcm9sbGluZ0ZyaWN0aW9uID0gY2FsY1JvbGxpbmdGcmljdGlvbihjb250YWN0UHQpOwoKICAgICAgICAgIHJvbGxpbmdGcmljdGlvbiA9IGNhbGNSb2xsaW5nRnJpY3Rpb24oY2hhc3Npc0JvZHksIGdyb3VuZE9iamVjdCwgd2hlZWwucmF5Y2FzdFJlc3VsdC5oaXRQb2ludFdvcmxkLCBmb3J3YXJkV1NbaV0sIG1heEltcHVsc2UpOwogICAgICAgICAgcm9sbGluZ0ZyaWN0aW9uICs9IHdoZWVsLmVuZ2luZUZvcmNlICogdGltZVN0ZXA7IC8vIHJvbGxpbmdGcmljdGlvbiA9IDA7CgogICAgICAgICAgY29uc3QgZmFjdG9yID0gbWF4SW1wdWxzZSAvIHJvbGxpbmdGcmljdGlvbjsKICAgICAgICAgIHdoZWVsLnNsaXBJbmZvICo9IGZhY3RvcjsKICAgICAgICB9IC8vc3dpdGNoIGJldHdlZW4gYWN0aXZlIHJvbGxpbmcgKHRocm90dGxlKSwgYnJha2luZyBhbmQgbm9uLWFjdGl2ZSByb2xsaW5nIGZyaWN0aW9uIChudGhyb3R0bGUvYnJlYWspCgoKICAgICAgICB3aGVlbC5mb3J3YXJkSW1wdWxzZSA9IDA7CiAgICAgICAgd2hlZWwuc2tpZEluZm8gPSAxOwoKICAgICAgICBpZiAoZ3JvdW5kT2JqZWN0KSB7CiAgICAgICAgICB3aGVlbC5za2lkSW5mbyA9IDE7CiAgICAgICAgICBjb25zdCBtYXhpbXAgPSB3aGVlbC5zdXNwZW5zaW9uRm9yY2UgKiB0aW1lU3RlcCAqIHdoZWVsLmZyaWN0aW9uU2xpcDsKICAgICAgICAgIGNvbnN0IG1heGltcFNpZGUgPSBtYXhpbXA7CiAgICAgICAgICBjb25zdCBtYXhpbXBTcXVhcmVkID0gbWF4aW1wICogbWF4aW1wU2lkZTsKICAgICAgICAgIHdoZWVsLmZvcndhcmRJbXB1bHNlID0gcm9sbGluZ0ZyaWN0aW9uOyAvL3doZWVsSW5mby5lbmdpbmVGb3JjZSogdGltZVN0ZXA7CgogICAgICAgICAgY29uc3QgeCA9IHdoZWVsLmZvcndhcmRJbXB1bHNlICogZndkRmFjdG9yIC8gd2hlZWwuZm9yd2FyZEFjY2VsZXJhdGlvbjsKICAgICAgICAgIGNvbnN0IHkgPSB3aGVlbC5zaWRlSW1wdWxzZSAqIHNpZGVGYWN0b3IgLyB3aGVlbC5zaWRlQWNjZWxlcmF0aW9uOwogICAgICAgICAgY29uc3QgaW1wdWxzZVNxdWFyZWQgPSB4ICogeCArIHkgKiB5OwogICAgICAgICAgd2hlZWwuc2xpZGluZyA9IGZhbHNlOwoKICAgICAgICAgIGlmIChpbXB1bHNlU3F1YXJlZCA+IG1heGltcFNxdWFyZWQpIHsKICAgICAgICAgICAgdGhpcy5zbGlkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgd2hlZWwuc2xpZGluZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IGZhY3RvciA9IG1heGltcCAvIE1hdGguc3FydChpbXB1bHNlU3F1YXJlZCk7CiAgICAgICAgICAgIHdoZWVsLnNraWRJbmZvICo9IGZhY3RvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh0aGlzLnNsaWRpbmcpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVdoZWVsczsgaSsrKSB7CiAgICAgICAgICBjb25zdCB3aGVlbCA9IHdoZWVsSW5mb3NbaV07CgogICAgICAgICAgaWYgKHdoZWVsLnNpZGVJbXB1bHNlICE9PSAwKSB7CiAgICAgICAgICAgIGlmICh3aGVlbC5za2lkSW5mbyA8IDEpIHsKICAgICAgICAgICAgICB3aGVlbC5mb3J3YXJkSW1wdWxzZSAqPSB3aGVlbC5za2lkSW5mbzsKICAgICAgICAgICAgICB3aGVlbC5zaWRlSW1wdWxzZSAqPSB3aGVlbC5za2lkSW5mbzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSAvLyBhcHBseSB0aGUgaW1wdWxzZXMKCgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVdoZWVsczsgaSsrKSB7CiAgICAgICAgY29uc3Qgd2hlZWwgPSB3aGVlbEluZm9zW2ldOwogICAgICAgIGNvbnN0IHJlbF9wb3MgPSBuZXcgVmVjMygpOwogICAgICAgIHdoZWVsLnJheWNhc3RSZXN1bHQuaGl0UG9pbnRXb3JsZC52c3ViKGNoYXNzaXNCb2R5LnBvc2l0aW9uLCByZWxfcG9zKTsgLy8gY2Fubm9ucyBhcHBseWltcHVsc2UgaXMgdXNpbmcgd29ybGQgY29vcmQgZm9yIHRoZSBwb3NpdGlvbgogICAgICAgIC8vcmVsX3Bvcy5jb3B5KHdoZWVsLnJheWNhc3RSZXN1bHQuaGl0UG9pbnRXb3JsZCk7CgogICAgICAgIGlmICh3aGVlbC5mb3J3YXJkSW1wdWxzZSAhPT0gMCkgewogICAgICAgICAgY29uc3QgaW1wdWxzZSA9IG5ldyBWZWMzKCk7CiAgICAgICAgICBmb3J3YXJkV1NbaV0uc2NhbGUod2hlZWwuZm9yd2FyZEltcHVsc2UsIGltcHVsc2UpOwogICAgICAgICAgY2hhc3Npc0JvZHkuYXBwbHlJbXB1bHNlKGltcHVsc2UsIHJlbF9wb3MpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHdoZWVsLnNpZGVJbXB1bHNlICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBncm91bmRPYmplY3QgPSB3aGVlbC5yYXljYXN0UmVzdWx0LmJvZHk7CiAgICAgICAgICBjb25zdCByZWxfcG9zMiA9IG5ldyBWZWMzKCk7CiAgICAgICAgICB3aGVlbC5yYXljYXN0UmVzdWx0LmhpdFBvaW50V29ybGQudnN1Yihncm91bmRPYmplY3QucG9zaXRpb24sIHJlbF9wb3MyKTsgLy9yZWxfcG9zMi5jb3B5KHdoZWVsLnJheWNhc3RSZXN1bHQuaGl0UG9pbnRXb3JsZCk7CgogICAgICAgICAgY29uc3Qgc2lkZUltcCA9IG5ldyBWZWMzKCk7CiAgICAgICAgICBheGxlW2ldLnNjYWxlKHdoZWVsLnNpZGVJbXB1bHNlLCBzaWRlSW1wKTsgLy8gU2NhbGUgdGhlIHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZSB1cCBkaXJlY3Rpb24gd2l0aCByb2xsSW5mbHVlbmNlLgogICAgICAgICAgLy8gSWYgcm9sbEluZmx1ZW5jZSBpcyAxLCB0aGUgaW1wdWxzZSB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIGhpdFBvaW50IChlYXN5IHRvIHJvbGwgb3ZlciksIGlmIGl0IGlzIHplcm8gaXQgd2lsbCBiZSBhcHBsaWVkIGluIHRoZSBzYW1lIHBsYW5lIGFzIHRoZSBjZW50ZXIgb2YgbWFzcyAobm90IGVhc3kgdG8gcm9sbCBvdmVyKS4KCiAgICAgICAgICBjaGFzc2lzQm9keS52ZWN0b3JUb0xvY2FsRnJhbWUocmVsX3BvcywgcmVsX3Bvcyk7CiAgICAgICAgICByZWxfcG9zWyd4eXonW3RoaXMuaW5kZXhVcEF4aXNdXSAqPSB3aGVlbC5yb2xsSW5mbHVlbmNlOwogICAgICAgICAgY2hhc3Npc0JvZHkudmVjdG9yVG9Xb3JsZEZyYW1lKHJlbF9wb3MsIHJlbF9wb3MpOwogICAgICAgICAgY2hhc3Npc0JvZHkuYXBwbHlJbXB1bHNlKHNpZGVJbXAsIHJlbF9wb3MpOyAvL2FwcGx5IGZyaWN0aW9uIGltcHVsc2Ugb24gdGhlIGdyb3VuZAoKICAgICAgICAgIHNpZGVJbXAuc2NhbGUoLTEsIHNpZGVJbXApOwogICAgICAgICAgZ3JvdW5kT2JqZWN0LmFwcGx5SW1wdWxzZShzaWRlSW1wLCByZWxfcG9zMik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogIH0KICBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CiAgbmV3IFZlYzMoKTsKICBjb25zdCB0bXBWZWM0ID0gbmV3IFZlYzMoKTsKICBjb25zdCB0bXBWZWM1ID0gbmV3IFZlYzMoKTsKICBjb25zdCB0bXBWZWM2ID0gbmV3IFZlYzMoKTsKICBuZXcgUmF5KCk7CiAgbmV3IFZlYzMoKTsKICBjb25zdCBjYXN0UmF5X3JheXZlY3RvciA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY2FzdFJheV90YXJnZXQgPSBuZXcgVmVjMygpOwogIGNvbnN0IGRpcmVjdGlvbnMgPSBbbmV3IFZlYzMoMSwgMCwgMCksIG5ldyBWZWMzKDAsIDEsIDApLCBuZXcgVmVjMygwLCAwLCAxKV07CiAgY29uc3QgdXBkYXRlRnJpY3Rpb25fc3VyZk5vcm1hbFdTX3NjYWxlZF9wcm9qID0gbmV3IFZlYzMoKTsKICBjb25zdCB1cGRhdGVGcmljdGlvbl9heGxlID0gW107CiAgY29uc3QgdXBkYXRlRnJpY3Rpb25fZm9yd2FyZFdTID0gW107CiAgY29uc3Qgc2lkZUZyaWN0aW9uU3RpZmZuZXNzMiA9IDE7CiAgY29uc3QgY2FsY1JvbGxpbmdGcmljdGlvbl92ZWwxID0gbmV3IFZlYzMoKTsKICBjb25zdCBjYWxjUm9sbGluZ0ZyaWN0aW9uX3ZlbDIgPSBuZXcgVmVjMygpOwogIGNvbnN0IGNhbGNSb2xsaW5nRnJpY3Rpb25fdmVsID0gbmV3IFZlYzMoKTsKCiAgZnVuY3Rpb24gY2FsY1JvbGxpbmdGcmljdGlvbihib2R5MCwgYm9keTEsIGZyaWN0aW9uUG9zV29ybGQsIGZyaWN0aW9uRGlyZWN0aW9uV29ybGQsIG1heEltcHVsc2UpIHsKICAgIGxldCBqMSA9IDA7CiAgICBjb25zdCBjb250YWN0UG9zV29ybGQgPSBmcmljdGlvblBvc1dvcmxkOyAvLyBjb25zdCByZWxfcG9zMSA9IG5ldyBWZWMzKCk7CiAgICAvLyBjb25zdCByZWxfcG9zMiA9IG5ldyBWZWMzKCk7CgogICAgY29uc3QgdmVsMSA9IGNhbGNSb2xsaW5nRnJpY3Rpb25fdmVsMTsKICAgIGNvbnN0IHZlbDIgPSBjYWxjUm9sbGluZ0ZyaWN0aW9uX3ZlbDI7CiAgICBjb25zdCB2ZWwgPSBjYWxjUm9sbGluZ0ZyaWN0aW9uX3ZlbDsgLy8gY29udGFjdFBvc1dvcmxkLnZzdWIoYm9keTAucG9zaXRpb24sIHJlbF9wb3MxKTsKICAgIC8vIGNvbnRhY3RQb3NXb3JsZC52c3ViKGJvZHkxLnBvc2l0aW9uLCByZWxfcG9zMik7CgogICAgYm9keTAuZ2V0VmVsb2NpdHlBdFdvcmxkUG9pbnQoY29udGFjdFBvc1dvcmxkLCB2ZWwxKTsKICAgIGJvZHkxLmdldFZlbG9jaXR5QXRXb3JsZFBvaW50KGNvbnRhY3RQb3NXb3JsZCwgdmVsMik7CiAgICB2ZWwxLnZzdWIodmVsMiwgdmVsKTsKICAgIGNvbnN0IHZyZWwgPSBmcmljdGlvbkRpcmVjdGlvbldvcmxkLmRvdCh2ZWwpOwogICAgY29uc3QgZGVub20wID0gY29tcHV0ZUltcHVsc2VEZW5vbWluYXRvcihib2R5MCwgZnJpY3Rpb25Qb3NXb3JsZCwgZnJpY3Rpb25EaXJlY3Rpb25Xb3JsZCk7CiAgICBjb25zdCBkZW5vbTEgPSBjb21wdXRlSW1wdWxzZURlbm9taW5hdG9yKGJvZHkxLCBmcmljdGlvblBvc1dvcmxkLCBmcmljdGlvbkRpcmVjdGlvbldvcmxkKTsKICAgIGNvbnN0IHJlbGF4YXRpb24gPSAxOwogICAgY29uc3QgamFjRGlhZ0FCSW52ID0gcmVsYXhhdGlvbiAvIChkZW5vbTAgKyBkZW5vbTEpOyAvLyBjYWxjdWxhdGUgaiB0aGF0IG1vdmVzIHVzIHRvIHplcm8gcmVsYXRpdmUgdmVsb2NpdHkKCiAgICBqMSA9IC12cmVsICogamFjRGlhZ0FCSW52OwoKICAgIGlmIChtYXhJbXB1bHNlIDwgajEpIHsKICAgICAgajEgPSBtYXhJbXB1bHNlOwogICAgfQoKICAgIGlmIChqMSA8IC1tYXhJbXB1bHNlKSB7CiAgICAgIGoxID0gLW1heEltcHVsc2U7CiAgICB9CgogICAgcmV0dXJuIGoxOwogIH0KCiAgY29uc3QgY29tcHV0ZUltcHVsc2VEZW5vbWluYXRvcl9yMCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY29tcHV0ZUltcHVsc2VEZW5vbWluYXRvcl9jMCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY29tcHV0ZUltcHVsc2VEZW5vbWluYXRvcl92ZWMgPSBuZXcgVmVjMygpOwogIGNvbnN0IGNvbXB1dGVJbXB1bHNlRGVub21pbmF0b3JfbSA9IG5ldyBWZWMzKCk7CgogIGZ1bmN0aW9uIGNvbXB1dGVJbXB1bHNlRGVub21pbmF0b3IoYm9keSwgcG9zLCBub3JtYWwpIHsKICAgIGNvbnN0IHIwID0gY29tcHV0ZUltcHVsc2VEZW5vbWluYXRvcl9yMDsKICAgIGNvbnN0IGMwID0gY29tcHV0ZUltcHVsc2VEZW5vbWluYXRvcl9jMDsKICAgIGNvbnN0IHZlYyA9IGNvbXB1dGVJbXB1bHNlRGVub21pbmF0b3JfdmVjOwogICAgY29uc3QgbSA9IGNvbXB1dGVJbXB1bHNlRGVub21pbmF0b3JfbTsKICAgIHBvcy52c3ViKGJvZHkucG9zaXRpb24sIHIwKTsKICAgIHIwLmNyb3NzKG5vcm1hbCwgYzApOwogICAgYm9keS5pbnZJbmVydGlhV29ybGQudm11bHQoYzAsIG0pOwogICAgbS5jcm9zcyhyMCwgdmVjKTsKICAgIHJldHVybiBib2R5Lmludk1hc3MgKyBub3JtYWwuZG90KHZlYyk7CiAgfQoKICBjb25zdCByZXNvbHZlU2luZ2xlQmlsYXRlcmFsX3ZlbDEgPSBuZXcgVmVjMygpOwogIGNvbnN0IHJlc29sdmVTaW5nbGVCaWxhdGVyYWxfdmVsMiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgcmVzb2x2ZVNpbmdsZUJpbGF0ZXJhbF92ZWwgPSBuZXcgVmVjMygpOyAvLyBiaWxhdGVyYWwgY29uc3RyYWludCBiZXR3ZWVuIHR3byBkeW5hbWljIG9iamVjdHMKCiAgZnVuY3Rpb24gcmVzb2x2ZVNpbmdsZUJpbGF0ZXJhbChib2R5MSwgcG9zMSwgYm9keTIsIHBvczIsIG5vcm1hbCkgewogICAgY29uc3Qgbm9ybWFsTGVuU3FyID0gbm9ybWFsLmxlbmd0aFNxdWFyZWQoKTsKCiAgICBpZiAobm9ybWFsTGVuU3FyID4gMS4xKSB7CiAgICAgIHJldHVybiAwOyAvLyBubyBpbXB1bHNlCiAgICB9IC8vIGNvbnN0IHJlbF9wb3MxID0gbmV3IFZlYzMoKTsKICAgIC8vIGNvbnN0IHJlbF9wb3MyID0gbmV3IFZlYzMoKTsKICAgIC8vIHBvczEudnN1Yihib2R5MS5wb3NpdGlvbiwgcmVsX3BvczEpOwogICAgLy8gcG9zMi52c3ViKGJvZHkyLnBvc2l0aW9uLCByZWxfcG9zMik7CgoKICAgIGNvbnN0IHZlbDEgPSByZXNvbHZlU2luZ2xlQmlsYXRlcmFsX3ZlbDE7CiAgICBjb25zdCB2ZWwyID0gcmVzb2x2ZVNpbmdsZUJpbGF0ZXJhbF92ZWwyOwogICAgY29uc3QgdmVsID0gcmVzb2x2ZVNpbmdsZUJpbGF0ZXJhbF92ZWw7CiAgICBib2R5MS5nZXRWZWxvY2l0eUF0V29ybGRQb2ludChwb3MxLCB2ZWwxKTsKICAgIGJvZHkyLmdldFZlbG9jaXR5QXRXb3JsZFBvaW50KHBvczIsIHZlbDIpOwogICAgdmVsMS52c3ViKHZlbDIsIHZlbCk7CiAgICBjb25zdCByZWxfdmVsID0gbm9ybWFsLmRvdCh2ZWwpOwogICAgY29uc3QgY29udGFjdERhbXBpbmcgPSAwLjI7CiAgICBjb25zdCBtYXNzVGVybSA9IDEgLyAoYm9keTEuaW52TWFzcyArIGJvZHkyLmludk1hc3MpOwogICAgY29uc3QgaW1wdWxzZSA9IC1jb250YWN0RGFtcGluZyAqIHJlbF92ZWwgKiBtYXNzVGVybTsKICAgIHJldHVybiBpbXB1bHNlOwogIH0KCiAgLyoqCiAgICogU3BoZXJpY2FsIHNoYXBlCiAgICogQGV4YW1wbGUKICAgKiAgICAgY29uc3QgcmFkaXVzID0gMQogICAqICAgICBjb25zdCBzcGhlcmVTaGFwZSA9IG5ldyBDQU5OT04uU3BoZXJlKHJhZGl1cykKICAgKiAgICAgY29uc3Qgc3BoZXJlQm9keSA9IG5ldyBDQU5OT04uQm9keSh7IG1hc3M6IDEsIHNoYXBlOiBzcGhlcmVTaGFwZSB9KQogICAqICAgICB3b3JsZC5hZGRCb2R5KHNwaGVyZUJvZHkpCiAgICovCiAgY2xhc3MgU3BoZXJlIGV4dGVuZHMgU2hhcGUgewogICAgLyoqCiAgICAgKiBUaGUgcmFkaXVzIG9mIHRoZSBzcGhlcmUuCiAgICAgKi8KCiAgICAvKioKICAgICAqCiAgICAgKiBAcGFyYW0gcmFkaXVzIFRoZSByYWRpdXMgb2YgdGhlIHNwaGVyZSwgYSBub24tbmVnYXRpdmUgbnVtYmVyLgogICAgICovCiAgICBjb25zdHJ1Y3RvcihyYWRpdXMpIHsKICAgICAgc3VwZXIoewogICAgICAgIHR5cGU6IFNoYXBlLnR5cGVzLlNQSEVSRQogICAgICB9KTsKICAgICAgdGhpcy5yYWRpdXMgPSByYWRpdXMgIT09IHVuZGVmaW5lZCA/IHJhZGl1cyA6IDEuMDsKCiAgICAgIGlmICh0aGlzLnJhZGl1cyA8IDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzcGhlcmUgcmFkaXVzIGNhbm5vdCBiZSBuZWdhdGl2ZS4nKTsKICAgICAgfQoKICAgICAgdGhpcy51cGRhdGVCb3VuZGluZ1NwaGVyZVJhZGl1cygpOwogICAgfQogICAgLyoqIGNhbGN1bGF0ZUxvY2FsSW5lcnRpYSAqLwoKCiAgICBjYWxjdWxhdGVMb2NhbEluZXJ0aWEobWFzcywgdGFyZ2V0KSB7CiAgICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRhcmdldCA9IG5ldyBWZWMzKCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IEkgPSAyLjAgKiBtYXNzICogdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyAvIDUuMDsKICAgICAgdGFyZ2V0LnggPSBJOwogICAgICB0YXJnZXQueSA9IEk7CiAgICAgIHRhcmdldC56ID0gSTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIC8qKiB2b2x1bWUgKi8KCgogICAgdm9sdW1lKCkgewogICAgICByZXR1cm4gNC4wICogTWF0aC5QSSAqIE1hdGgucG93KHRoaXMucmFkaXVzLCAzKSAvIDMuMDsKICAgIH0KCiAgICB1cGRhdGVCb3VuZGluZ1NwaGVyZVJhZGl1cygpIHsKICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZVJhZGl1cyA9IHRoaXMucmFkaXVzOwogICAgfQoKICAgIGNhbGN1bGF0ZVdvcmxkQUFCQihwb3MsIHF1YXQsIG1pbiwgbWF4KSB7CiAgICAgIGNvbnN0IHIgPSB0aGlzLnJhZGl1czsKICAgICAgY29uc3QgYXhlcyA9IFsneCcsICd5JywgJ3onXTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IGF4ID0gYXhlc1tpXTsKICAgICAgICBtaW5bYXhdID0gcG9zW2F4XSAtIHI7CiAgICAgICAgbWF4W2F4XSA9IHBvc1theF0gKyByOwogICAgICB9CiAgICB9CgogIH0KICBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CiAgbmV3IFZlYzMoKTsgLy8gVGVtcCB2ZWN0b3JzIGZvciBjYWxjdWxhdGlvbgoKICBuZXcgVmVjMygpOyAvLyBSZWxhdGl2ZSB2ZWxvY2l0eQoKICBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CiAgbmV3IFZlYzMoKTsKICBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CgogIC8qKgogICAqIEN5bGluZGVyIGNsYXNzLgogICAqIEBleGFtcGxlCiAgICogICAgIGNvbnN0IHJhZGl1c1RvcCA9IDAuNQogICAqICAgICBjb25zdCByYWRpdXNCb3R0b20gPSAwLjUKICAgKiAgICAgY29uc3QgaGVpZ2h0ID0gMgogICAqICAgICBjb25zdCBudW1TZWdtZW50cyA9IDEyCiAgICogICAgIGNvbnN0IGN5bGluZGVyU2hhcGUgPSBuZXcgQ0FOTk9OLkN5bGluZGVyKHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIG51bVNlZ21lbnRzKQogICAqICAgICBjb25zdCBjeWxpbmRlckJvZHkgPSBuZXcgQ0FOTk9OLkJvZHkoeyBtYXNzOiAxLCBzaGFwZTogY3lsaW5kZXJTaGFwZSB9KQogICAqICAgICB3b3JsZC5hZGRCb2R5KGN5bGluZGVyQm9keSkKICAgKi8KCiAgY2xhc3MgQ3lsaW5kZXIgZXh0ZW5kcyBDb252ZXhQb2x5aGVkcm9uIHsKICAgIC8qKiBUaGUgcmFkaXVzIG9mIHRoZSB0b3Agb2YgdGhlIEN5bGluZGVyLiAqLwoKICAgIC8qKiBUaGUgcmFkaXVzIG9mIHRoZSBib3R0b20gb2YgdGhlIEN5bGluZGVyLiAqLwoKICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBDeWxpbmRlci4gKi8KCiAgICAvKiogVGhlIG51bWJlciBvZiBzZWdtZW50cyB0byBidWlsZCB0aGUgY3lsaW5kZXIgb3V0IG9mLiAqLwoKICAgIC8qKgogICAgICogQHBhcmFtIHJhZGl1c1RvcCBUaGUgcmFkaXVzIG9mIHRoZSB0b3Agb2YgdGhlIEN5bGluZGVyLgogICAgICogQHBhcmFtIHJhZGl1c0JvdHRvbSBUaGUgcmFkaXVzIG9mIHRoZSBib3R0b20gb2YgdGhlIEN5bGluZGVyLgogICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBDeWxpbmRlci4KICAgICAqIEBwYXJhbSBudW1TZWdtZW50cyBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRvIGJ1aWxkIHRoZSBjeWxpbmRlciBvdXQgb2YuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIG51bVNlZ21lbnRzKSB7CiAgICAgIGlmIChyYWRpdXNUb3AgPT09IHZvaWQgMCkgewogICAgICAgIHJhZGl1c1RvcCA9IDE7CiAgICAgIH0KCiAgICAgIGlmIChyYWRpdXNCb3R0b20gPT09IHZvaWQgMCkgewogICAgICAgIHJhZGl1c0JvdHRvbSA9IDE7CiAgICAgIH0KCiAgICAgIGlmIChoZWlnaHQgPT09IHZvaWQgMCkgewogICAgICAgIGhlaWdodCA9IDE7CiAgICAgIH0KCiAgICAgIGlmIChudW1TZWdtZW50cyA9PT0gdm9pZCAwKSB7CiAgICAgICAgbnVtU2VnbWVudHMgPSA4OwogICAgICB9CgogICAgICBpZiAocmFkaXVzVG9wIDwgMCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGN5bGluZGVyIHJhZGl1c1RvcCBjYW5ub3QgYmUgbmVnYXRpdmUuJyk7CiAgICAgIH0KCiAgICAgIGlmIChyYWRpdXNCb3R0b20gPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY3lsaW5kZXIgcmFkaXVzQm90dG9tIGNhbm5vdCBiZSBuZWdhdGl2ZS4nKTsKICAgICAgfQoKICAgICAgY29uc3QgTiA9IG51bVNlZ21lbnRzOwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICBjb25zdCBheGVzID0gW107CiAgICAgIGNvbnN0IGZhY2VzID0gW107CiAgICAgIGNvbnN0IGJvdHRvbWZhY2UgPSBbXTsKICAgICAgY29uc3QgdG9wZmFjZSA9IFtdOwogICAgICBjb25zdCBjb3MgPSBNYXRoLmNvczsKICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW47IC8vIEZpcnN0IGJvdHRvbSBwb2ludAoKICAgICAgdmVydGljZXMucHVzaChuZXcgVmVjMygtcmFkaXVzQm90dG9tICogc2luKDApLCAtaGVpZ2h0ICogMC41LCByYWRpdXNCb3R0b20gKiBjb3MoMCkpKTsKICAgICAgYm90dG9tZmFjZS5wdXNoKDApOyAvLyBGaXJzdCB0b3AgcG9pbnQKCiAgICAgIHZlcnRpY2VzLnB1c2gobmV3IFZlYzMoLXJhZGl1c1RvcCAqIHNpbigwKSwgaGVpZ2h0ICogMC41LCByYWRpdXNUb3AgKiBjb3MoMCkpKTsKICAgICAgdG9wZmFjZS5wdXNoKDEpOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBjb25zdCB0aGV0YSA9IDIgKiBNYXRoLlBJIC8gTiAqIChpICsgMSk7CiAgICAgICAgY29uc3QgdGhldGFOID0gMiAqIE1hdGguUEkgLyBOICogKGkgKyAwLjUpOwoKICAgICAgICBpZiAoaSA8IE4gLSAxKSB7CiAgICAgICAgICAvLyBCb3R0b20KICAgICAgICAgIHZlcnRpY2VzLnB1c2gobmV3IFZlYzMoLXJhZGl1c0JvdHRvbSAqIHNpbih0aGV0YSksIC1oZWlnaHQgKiAwLjUsIHJhZGl1c0JvdHRvbSAqIGNvcyh0aGV0YSkpKTsKICAgICAgICAgIGJvdHRvbWZhY2UucHVzaCgyICogaSArIDIpOyAvLyBUb3AKCiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKG5ldyBWZWMzKC1yYWRpdXNUb3AgKiBzaW4odGhldGEpLCBoZWlnaHQgKiAwLjUsIHJhZGl1c1RvcCAqIGNvcyh0aGV0YSkpKTsKICAgICAgICAgIHRvcGZhY2UucHVzaCgyICogaSArIDMpOyAvLyBGYWNlCgogICAgICAgICAgZmFjZXMucHVzaChbMiAqIGksIDIgKiBpICsgMSwgMiAqIGkgKyAzLCAyICogaSArIDJdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmFjZXMucHVzaChbMiAqIGksIDIgKiBpICsgMSwgMSwgMF0pOyAvLyBDb25uZWN0CiAgICAgICAgfSAvLyBBeGlzOiB3ZSBjYW4gY3V0IG9mZiBoYWxmIG9mIHRoZW0gaWYgd2UgaGF2ZSBldmVuIG51bWJlciBvZiBzZWdtZW50cwoKCiAgICAgICAgaWYgKE4gJSAyID09PSAxIHx8IGkgPCBOIC8gMikgewogICAgICAgICAgYXhlcy5wdXNoKG5ldyBWZWMzKC1zaW4odGhldGFOKSwgMCwgY29zKHRoZXRhTikpKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZhY2VzLnB1c2goYm90dG9tZmFjZSk7CiAgICAgIGF4ZXMucHVzaChuZXcgVmVjMygwLCAxLCAwKSk7IC8vIFJlb3JkZXIgdG9wIGZhY2UKCiAgICAgIGNvbnN0IHRlbXAgPSBbXTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9wZmFjZS5sZW5ndGg7IGkrKykgewogICAgICAgIHRlbXAucHVzaCh0b3BmYWNlW3RvcGZhY2UubGVuZ3RoIC0gaSAtIDFdKTsKICAgICAgfQoKICAgICAgZmFjZXMucHVzaCh0ZW1wKTsKICAgICAgc3VwZXIoewogICAgICAgIHZlcnRpY2VzLAogICAgICAgIGZhY2VzLAogICAgICAgIGF4ZXMKICAgICAgfSk7CiAgICAgIHRoaXMudHlwZSA9IFNoYXBlLnR5cGVzLkNZTElOREVSOwogICAgICB0aGlzLnJhZGl1c1RvcCA9IHJhZGl1c1RvcDsKICAgICAgdGhpcy5yYWRpdXNCb3R0b20gPSByYWRpdXNCb3R0b207CiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICB0aGlzLm51bVNlZ21lbnRzID0gbnVtU2VnbWVudHM7CiAgICB9CgogIH0KCiAgLyoqCiAgICogUGFydGljbGUgc2hhcGUuCiAgICogQGV4YW1wbGUKICAgKiAgICAgY29uc3QgcGFydGljbGVTaGFwZSA9IG5ldyBDQU5OT04uUGFydGljbGUoKQogICAqICAgICBjb25zdCBwYXJ0aWNsZUJvZHkgPSBuZXcgQ0FOTk9OLkJvZHkoeyBtYXNzOiAxLCBzaGFwZTogcGFydGljbGVTaGFwZSB9KQogICAqICAgICB3b3JsZC5hZGRCb2R5KHBhcnRpY2xlQm9keSkKICAgKi8KICBjbGFzcyBQYXJ0aWNsZSBleHRlbmRzIFNoYXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcih7CiAgICAgICAgdHlwZTogU2hhcGUudHlwZXMuUEFSVElDTEUKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIGNhbGN1bGF0ZUxvY2FsSW5lcnRpYQogICAgICovCgoKICAgIGNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCB0YXJnZXQpIHsKICAgICAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgdGFyZ2V0LnNldCgwLCAwLCAwKTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgICB2b2x1bWUoKSB7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHVwZGF0ZUJvdW5kaW5nU3BoZXJlUmFkaXVzKCkgewogICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlUmFkaXVzID0gMDsKICAgIH0KCiAgICBjYWxjdWxhdGVXb3JsZEFBQkIocG9zLCBxdWF0LCBtaW4sIG1heCkgewogICAgICAvLyBHZXQgZWFjaCBheGlzIG1heAogICAgICBtaW4uY29weShwb3MpOwogICAgICBtYXguY29weShwb3MpOwogICAgfQoKICB9CgogIC8qKgogICAqIEEgcGxhbmUsIGZhY2luZyBpbiB0aGUgWiBkaXJlY3Rpb24uIFRoZSBwbGFuZSBoYXMgaXRzIHN1cmZhY2UgYXQgej0wIGFuZCBldmVyeXRoaW5nIGJlbG93IHo9MCBpcyBhc3N1bWVkIHRvIGJlIHNvbGlkIHBsYW5lLiBUbyBtYWtlIHRoZSBwbGFuZSBmYWNlIGluIHNvbWUgb3RoZXIgZGlyZWN0aW9uIHRoYW4geiwgeW91IG11c3QgcHV0IGl0IGluc2lkZSBhIEJvZHkgYW5kIHJvdGF0ZSB0aGF0IGJvZHkuIFNlZSB0aGUgZGVtb3MuCiAgICogQGV4YW1wbGUKICAgKiAgICAgY29uc3QgcGxhbmVTaGFwZSA9IG5ldyBDQU5OT04uUGxhbmUoKQogICAqICAgICBjb25zdCBwbGFuZUJvZHkgPSBuZXcgQ0FOTk9OLkJvZHkoeyBtYXNzOiAwLCBzaGFwZTogIHBsYW5lU2hhcGUgfSkKICAgKiAgICAgcGxhbmVCb2R5LnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKC1NYXRoLlBJIC8gMiwgMCwgMCkgLy8gbWFrZSBpdCBmYWNlIHVwCiAgICogICAgIHdvcmxkLmFkZEJvZHkocGxhbmVCb2R5KQogICAqLwogIGNsYXNzIFBsYW5lIGV4dGVuZHMgU2hhcGUgewogICAgLyoqIHdvcmxkTm9ybWFsICovCgogICAgLyoqIHdvcmxkTm9ybWFsTmVlZHNVcGRhdGUgKi8KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcih7CiAgICAgICAgdHlwZTogU2hhcGUudHlwZXMuUExBTkUKICAgICAgfSk7IC8vIFdvcmxkIG9yaWVudGVkIG5vcm1hbAoKICAgICAgdGhpcy53b3JsZE5vcm1hbCA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMud29ybGROb3JtYWxOZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmVSYWRpdXMgPSBOdW1iZXIuTUFYX1ZBTFVFOwogICAgfQogICAgLyoqIGNvbXB1dGVXb3JsZE5vcm1hbCAqLwoKCiAgICBjb21wdXRlV29ybGROb3JtYWwocXVhdCkgewogICAgICBjb25zdCBuID0gdGhpcy53b3JsZE5vcm1hbDsKICAgICAgbi5zZXQoMCwgMCwgMSk7CiAgICAgIHF1YXQudm11bHQobiwgbik7CiAgICAgIHRoaXMud29ybGROb3JtYWxOZWVkc1VwZGF0ZSA9IGZhbHNlOwogICAgfQoKICAgIGNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCB0YXJnZXQpIHsKICAgICAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgICB2b2x1bWUoKSB7CiAgICAgIHJldHVybiAoLy8gVGhlIHBsYW5lIGlzIGluZmluaXRlLi4uCiAgICAgICAgTnVtYmVyLk1BWF9WQUxVRQogICAgICApOwogICAgfQoKICAgIGNhbGN1bGF0ZVdvcmxkQUFCQihwb3MsIHF1YXQsIG1pbiwgbWF4KSB7CiAgICAgIC8vIFRoZSBwbGFuZSBBQUJCIGlzIGluZmluaXRlLCBleGNlcHQgaWYgdGhlIG5vcm1hbCBpcyBwb2ludGluZyBhbG9uZyBhbnkgYXhpcwogICAgICB0ZW1wTm9ybWFsLnNldCgwLCAwLCAxKTsgLy8gRGVmYXVsdCBwbGFuZSBub3JtYWwgaXMgegoKICAgICAgcXVhdC52bXVsdCh0ZW1wTm9ybWFsLCB0ZW1wTm9ybWFsKTsKICAgICAgY29uc3QgbWF4VmFsID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgbWluLnNldCgtbWF4VmFsLCAtbWF4VmFsLCAtbWF4VmFsKTsKICAgICAgbWF4LnNldChtYXhWYWwsIG1heFZhbCwgbWF4VmFsKTsKCiAgICAgIGlmICh0ZW1wTm9ybWFsLnggPT09IDEpIHsKICAgICAgICBtYXgueCA9IHBvcy54OwogICAgICB9IGVsc2UgaWYgKHRlbXBOb3JtYWwueCA9PT0gLTEpIHsKICAgICAgICBtaW4ueCA9IHBvcy54OwogICAgICB9CgogICAgICBpZiAodGVtcE5vcm1hbC55ID09PSAxKSB7CiAgICAgICAgbWF4LnkgPSBwb3MueTsKICAgICAgfSBlbHNlIGlmICh0ZW1wTm9ybWFsLnkgPT09IC0xKSB7CiAgICAgICAgbWluLnkgPSBwb3MueTsKICAgICAgfQoKICAgICAgaWYgKHRlbXBOb3JtYWwueiA9PT0gMSkgewogICAgICAgIG1heC56ID0gcG9zLno7CiAgICAgIH0gZWxzZSBpZiAodGVtcE5vcm1hbC56ID09PSAtMSkgewogICAgICAgIG1pbi56ID0gcG9zLno7CiAgICAgIH0KICAgIH0KCiAgICB1cGRhdGVCb3VuZGluZ1NwaGVyZVJhZGl1cygpIHsKICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZVJhZGl1cyA9IE51bWJlci5NQVhfVkFMVUU7CiAgICB9CgogIH0KICBjb25zdCB0ZW1wTm9ybWFsID0gbmV3IFZlYzMoKTsKCiAgLyoqCiAgICogSGVpZ2h0ZmllbGQgc2hhcGUgY2xhc3MuIEhlaWdodCBkYXRhIGlzIGdpdmVuIGFzIGFuIGFycmF5LiBUaGVzZSBkYXRhIHBvaW50cyBhcmUgc3ByZWFkIG91dCBldmVubHkgd2l0aCBhIGdpdmVuIGRpc3RhbmNlLgogICAqIEB0b2RvIFNob3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgYWxvbmcgYWxsIGF4ZXMsIG5vdCBqdXN0IHkKICAgKiBAdG9kbyBzaG91bGQgYmUgcG9zc2libGUgdG8gc2NhbGUgYWxvbmcgYWxsIGF4ZXMKICAgKiBAdG9kbyBSZWZhY3RvciBlbGVtZW50U2l6ZSB0byBlbGVtZW50U2l6ZVggYW5kIGVsZW1lbnRTaXplWQogICAqCiAgICogQGV4YW1wbGUKICAgKiAgICAgLy8gR2VuZXJhdGUgc29tZSBoZWlnaHQgZGF0YSAoeS12YWx1ZXMpLgogICAqICAgICBjb25zdCBkYXRhID0gW10KICAgKiAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKICAgKiAgICAgICAgIGNvbnN0IHkgPSAwLjUgKiBNYXRoLmNvcygwLjIgKiBpKQogICAqICAgICAgICAgZGF0YS5wdXNoKHkpCiAgICogICAgIH0KICAgKgogICAqICAgICAvLyBDcmVhdGUgdGhlIGhlaWdodGZpZWxkIHNoYXBlCiAgICogICAgIGNvbnN0IGhlaWdodGZpZWxkU2hhcGUgPSBuZXcgQ0FOTk9OLkhlaWdodGZpZWxkKGRhdGEsIHsKICAgKiAgICAgICAgIGVsZW1lbnRTaXplOiAxIC8vIERpc3RhbmNlIGJldHdlZW4gdGhlIGRhdGEgcG9pbnRzIGluIFggYW5kIFkgZGlyZWN0aW9ucwogICAqICAgICB9KQogICAqICAgICBjb25zdCBoZWlnaHRmaWVsZEJvZHkgPSBuZXcgQ0FOTk9OLkJvZHkoeyBzaGFwZTogaGVpZ2h0ZmllbGRTaGFwZSB9KQogICAqICAgICB3b3JsZC5hZGRCb2R5KGhlaWdodGZpZWxkQm9keSkKICAgKi8KICBjbGFzcyBIZWlnaHRmaWVsZCBleHRlbmRzIFNoYXBlIHsKICAgIC8qKgogICAgICogQW4gYXJyYXkgb2YgbnVtYmVycywgb3IgaGVpZ2h0IHZhbHVlcywgdGhhdCBhcmUgc3ByZWFkIG91dCBhbG9uZyB0aGUgeCBheGlzLgogICAgICovCgogICAgLyoqCiAgICAgKiBNYXggdmFsdWUgb2YgdGhlIGRhdGEgcG9pbnRzIGluIHRoZSBkYXRhIGFycmF5LgogICAgICovCgogICAgLyoqCiAgICAgKiBNaW5pbXVtIHZhbHVlIG9mIHRoZSBkYXRhIHBvaW50cyBpbiB0aGUgZGF0YSBhcnJheS4KICAgICAqLwoKICAgIC8qKgogICAgICogV29ybGQgc3BhY2luZyBiZXR3ZWVuIHRoZSBkYXRhIHBvaW50cyBpbiBYIGFuZCBZIGRpcmVjdGlvbi4KICAgICAqIEB0b2RvIGVsZW1lbnRTaXplWCBhbmQgWQogICAgICogQGRlZmF1bHQgMQogICAgICovCgogICAgLyoqCiAgICAgKiBAZGVmYXVsdCB0cnVlCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBwYXJhbSBkYXRhIEFuIGFycmF5IG9mIG51bWJlcnMsIG9yIGhlaWdodCB2YWx1ZXMsIHRoYXQgYXJlIHNwcmVhZCBvdXQgYWxvbmcgdGhlIHggYXhpcy4KICAgICAqLwogICAgY29uc3RydWN0b3IoZGF0YSwgb3B0aW9ucykgewogICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7CiAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICB9CgogICAgICBvcHRpb25zID0gVXRpbHMuZGVmYXVsdHMob3B0aW9ucywgewogICAgICAgIG1heFZhbHVlOiBudWxsLAogICAgICAgIG1pblZhbHVlOiBudWxsLAogICAgICAgIGVsZW1lbnRTaXplOiAxCiAgICAgIH0pOwogICAgICBzdXBlcih7CiAgICAgICAgdHlwZTogU2hhcGUudHlwZXMuSEVJR0hURklFTEQKICAgICAgfSk7CiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgIHRoaXMubWF4VmFsdWUgPSBvcHRpb25zLm1heFZhbHVlOwogICAgICB0aGlzLm1pblZhbHVlID0gb3B0aW9ucy5taW5WYWx1ZTsKICAgICAgdGhpcy5lbGVtZW50U2l6ZSA9IG9wdGlvbnMuZWxlbWVudFNpemU7CgogICAgICBpZiAob3B0aW9ucy5taW5WYWx1ZSA9PT0gbnVsbCkgewogICAgICAgIHRoaXMudXBkYXRlTWluVmFsdWUoKTsKICAgICAgfQoKICAgICAgaWYgKG9wdGlvbnMubWF4VmFsdWUgPT09IG51bGwpIHsKICAgICAgICB0aGlzLnVwZGF0ZU1heFZhbHVlKCk7CiAgICAgIH0KCiAgICAgIHRoaXMuY2FjaGVFbmFibGVkID0gdHJ1ZTsKICAgICAgdGhpcy5waWxsYXJDb252ZXggPSBuZXcgQ29udmV4UG9seWhlZHJvbigpOwogICAgICB0aGlzLnBpbGxhck9mZnNldCA9IG5ldyBWZWMzKCk7CiAgICAgIHRoaXMudXBkYXRlQm91bmRpbmdTcGhlcmVSYWRpdXMoKTsgLy8gImlfal9pc1VwcGVyIiA9PiB7IGNvbnZleDogLi4uLCBvZmZzZXQ6IC4uLiB9CiAgICAgIC8vIGZvciBleGFtcGxlOgogICAgICAvLyBfY2FjaGVkUGlsbGFyc1siMF8yXzEiXQoKICAgICAgdGhpcy5fY2FjaGVkUGlsbGFycyA9IHt9OwogICAgfQogICAgLyoqCiAgICAgKiBDYWxsIHdoZW5ldmVyIHlvdSBjaGFuZ2UgdGhlIGRhdGEgYXJyYXkuCiAgICAgKi8KCgogICAgdXBkYXRlKCkgewogICAgICB0aGlzLl9jYWNoZWRQaWxsYXJzID0ge307CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSB0aGUgYG1pblZhbHVlYCBwcm9wZXJ0eQogICAgICovCgoKICAgIHVwZGF0ZU1pblZhbHVlKCkgewogICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOwogICAgICBsZXQgbWluVmFsdWUgPSBkYXRhWzBdWzBdOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiAhPT0gZGF0YVtpXS5sZW5ndGg7IGorKykgewogICAgICAgICAgY29uc3QgdiA9IGRhdGFbaV1bal07CgogICAgICAgICAgaWYgKHYgPCBtaW5WYWx1ZSkgewogICAgICAgICAgICBtaW5WYWx1ZSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSB0aGUgYG1heFZhbHVlYCBwcm9wZXJ0eQogICAgICovCgoKICAgIHVwZGF0ZU1heFZhbHVlKCkgewogICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOwogICAgICBsZXQgbWF4VmFsdWUgPSBkYXRhWzBdWzBdOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiAhPT0gZGF0YVtpXS5sZW5ndGg7IGorKykgewogICAgICAgICAgY29uc3QgdiA9IGRhdGFbaV1bal07CgogICAgICAgICAgaWYgKHYgPiBtYXhWYWx1ZSkgewogICAgICAgICAgICBtYXhWYWx1ZSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB0aGlzLm1heFZhbHVlID0gbWF4VmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgaGVpZ2h0IHZhbHVlIGF0IGFuIGluZGV4LiBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIG1heFZhbHVlIGFuZCBtaW5WYWx1ZSBhZnRlciB5b3UncmUgZG9uZS4KICAgICAqLwoKCiAgICBzZXRIZWlnaHRWYWx1ZUF0SW5kZXgoeGksIHlpLCB2YWx1ZSkgewogICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOwogICAgICBkYXRhW3hpXVt5aV0gPSB2YWx1ZTsgLy8gSW52YWxpZGF0ZSBjYWNoZQoKICAgICAgdGhpcy5jbGVhckNhY2hlZENvbnZleFRyaWFuZ2xlUGlsbGFyKHhpLCB5aSwgZmFsc2UpOwoKICAgICAgaWYgKHhpID4gMCkgewogICAgICAgIHRoaXMuY2xlYXJDYWNoZWRDb252ZXhUcmlhbmdsZVBpbGxhcih4aSAtIDEsIHlpLCB0cnVlKTsKICAgICAgICB0aGlzLmNsZWFyQ2FjaGVkQ29udmV4VHJpYW5nbGVQaWxsYXIoeGkgLSAxLCB5aSwgZmFsc2UpOwogICAgICB9CgogICAgICBpZiAoeWkgPiAwKSB7CiAgICAgICAgdGhpcy5jbGVhckNhY2hlZENvbnZleFRyaWFuZ2xlUGlsbGFyKHhpLCB5aSAtIDEsIHRydWUpOwogICAgICAgIHRoaXMuY2xlYXJDYWNoZWRDb252ZXhUcmlhbmdsZVBpbGxhcih4aSwgeWkgLSAxLCBmYWxzZSk7CiAgICAgIH0KCiAgICAgIGlmICh5aSA+IDAgJiYgeGkgPiAwKSB7CiAgICAgICAgdGhpcy5jbGVhckNhY2hlZENvbnZleFRyaWFuZ2xlUGlsbGFyKHhpIC0gMSwgeWkgLSAxLCB0cnVlKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgbWF4L21pbiBpbiBhIHJlY3RhbmdsZSBpbiB0aGUgbWF0cml4IGRhdGEKICAgICAqIEBwYXJhbSByZXN1bHQgQW4gYXJyYXkgdG8gc3RvcmUgdGhlIHJlc3VsdHMgaW4uCiAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgYXJyYXksIGlmIGl0IHdhcyBwYXNzZWQgaW4uIE1pbmltdW0gd2lsbCBiZSBhdCBwb3NpdGlvbiAwIGFuZCBtYXggYXQgMS4KICAgICAqLwoKCiAgICBnZXRSZWN0TWluTWF4KGlNaW5YLCBpTWluWSwgaU1heFgsIGlNYXhZLCByZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSB7CiAgICAgICAgcmVzdWx0ID0gW107CiAgICAgIH0KCiAgICAgIC8vIEdldCBtYXggYW5kIG1pbiBvZiB0aGUgZGF0YQogICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOyAvLyBTZXQgZmlyc3QgdmFsdWUKCiAgICAgIGxldCBtYXggPSB0aGlzLm1pblZhbHVlOwoKICAgICAgZm9yIChsZXQgaSA9IGlNaW5YOyBpIDw9IGlNYXhYOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqID0gaU1pblk7IGogPD0gaU1heFk7IGorKykgewogICAgICAgICAgY29uc3QgaGVpZ2h0ID0gZGF0YVtpXVtqXTsKCiAgICAgICAgICBpZiAoaGVpZ2h0ID4gbWF4KSB7CiAgICAgICAgICAgIG1heCA9IGhlaWdodDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJlc3VsdFswXSA9IHRoaXMubWluVmFsdWU7CiAgICAgIHJlc3VsdFsxXSA9IG1heDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBpbmRleCBvZiBhIGxvY2FsIHBvc2l0aW9uIG9uIHRoZSBoZWlnaHRmaWVsZC4gVGhlIGluZGV4ZXMgaW5kaWNhdGUgdGhlIHJlY3RhbmdsZXMsIHNvIGlmIHlvdXIgdGVycmFpbiBpcyBtYWRlIG9mIE4geCBOIGhlaWdodCBkYXRhIHBvaW50cywgeW91IHdpbGwgaGF2ZSByZWN0YW5nbGUgaW5kZXhlcyByYW5naW5nIGZyb20gMCB0byBOLTEuCiAgICAgKiBAcGFyYW0gcmVzdWx0IFR3by1lbGVtZW50IGFycmF5CiAgICAgKiBAcGFyYW0gY2xhbXAgSWYgdGhlIHBvc2l0aW9uIHNob3VsZCBiZSBjbGFtcGVkIHRvIHRoZSBoZWlnaHRmaWVsZCBlZGdlLgogICAgICovCgoKICAgIGdldEluZGV4T2ZQb3NpdGlvbih4LCB5LCByZXN1bHQsIGNsYW1wKSB7CiAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRhdGEgcG9pbnRzIHRvIHRlc3QgYWdhaW5zdAogICAgICBjb25zdCB3ID0gdGhpcy5lbGVtZW50U2l6ZTsKICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKICAgICAgbGV0IHhpID0gTWF0aC5mbG9vcih4IC8gdyk7CiAgICAgIGxldCB5aSA9IE1hdGguZmxvb3IoeSAvIHcpOwogICAgICByZXN1bHRbMF0gPSB4aTsKICAgICAgcmVzdWx0WzFdID0geWk7CgogICAgICBpZiAoY2xhbXApIHsKICAgICAgICAvLyBDbGFtcCBpbmRleCB0byBlZGdlcwogICAgICAgIGlmICh4aSA8IDApIHsKICAgICAgICAgIHhpID0gMDsKICAgICAgICB9CgogICAgICAgIGlmICh5aSA8IDApIHsKICAgICAgICAgIHlpID0gMDsKICAgICAgICB9CgogICAgICAgIGlmICh4aSA+PSBkYXRhLmxlbmd0aCAtIDEpIHsKICAgICAgICAgIHhpID0gZGF0YS5sZW5ndGggLSAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKHlpID49IGRhdGFbMF0ubGVuZ3RoIC0gMSkgewogICAgICAgICAgeWkgPSBkYXRhWzBdLmxlbmd0aCAtIDE7CiAgICAgICAgfQogICAgICB9IC8vIEJhaWwgb3V0IGlmIHdlIGFyZSBvdXQgb2YgdGhlIHRlcnJhaW4KCgogICAgICBpZiAoeGkgPCAwIHx8IHlpIDwgMCB8fCB4aSA+PSBkYXRhLmxlbmd0aCAtIDEgfHwgeWkgPj0gZGF0YVswXS5sZW5ndGggLSAxKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBnZXRUcmlhbmdsZUF0KHgsIHksIGVkZ2VDbGFtcCwgYSwgYiwgYykgewogICAgICBjb25zdCBpZHggPSBnZXRIZWlnaHRBdF9pZHg7CiAgICAgIHRoaXMuZ2V0SW5kZXhPZlBvc2l0aW9uKHgsIHksIGlkeCwgZWRnZUNsYW1wKTsKICAgICAgbGV0IHhpID0gaWR4WzBdOwogICAgICBsZXQgeWkgPSBpZHhbMV07CiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CgogICAgICBpZiAoZWRnZUNsYW1wKSB7CiAgICAgICAgeGkgPSBNYXRoLm1pbihkYXRhLmxlbmd0aCAtIDIsIE1hdGgubWF4KDAsIHhpKSk7CiAgICAgICAgeWkgPSBNYXRoLm1pbihkYXRhWzBdLmxlbmd0aCAtIDIsIE1hdGgubWF4KDAsIHlpKSk7CiAgICAgIH0KCiAgICAgIGNvbnN0IGVsZW1lbnRTaXplID0gdGhpcy5lbGVtZW50U2l6ZTsKICAgICAgY29uc3QgbG93ZXJEaXN0MiA9ICh4IC8gZWxlbWVudFNpemUgLSB4aSkgKiogMiArICh5IC8gZWxlbWVudFNpemUgLSB5aSkgKiogMjsKICAgICAgY29uc3QgdXBwZXJEaXN0MiA9ICh4IC8gZWxlbWVudFNpemUgLSAoeGkgKyAxKSkgKiogMiArICh5IC8gZWxlbWVudFNpemUgLSAoeWkgKyAxKSkgKiogMjsKICAgICAgY29uc3QgdXBwZXIgPSBsb3dlckRpc3QyID4gdXBwZXJEaXN0MjsKICAgICAgdGhpcy5nZXRUcmlhbmdsZSh4aSwgeWksIHVwcGVyLCBhLCBiLCBjKTsKICAgICAgcmV0dXJuIHVwcGVyOwogICAgfQoKICAgIGdldE5vcm1hbEF0KHgsIHksIGVkZ2VDbGFtcCwgcmVzdWx0KSB7CiAgICAgIGNvbnN0IGEgPSBnZXROb3JtYWxBdF9hOwogICAgICBjb25zdCBiID0gZ2V0Tm9ybWFsQXRfYjsKICAgICAgY29uc3QgYyA9IGdldE5vcm1hbEF0X2M7CiAgICAgIGNvbnN0IGUwID0gZ2V0Tm9ybWFsQXRfZTA7CiAgICAgIGNvbnN0IGUxID0gZ2V0Tm9ybWFsQXRfZTE7CiAgICAgIHRoaXMuZ2V0VHJpYW5nbGVBdCh4LCB5LCBlZGdlQ2xhbXAsIGEsIGIsIGMpOwogICAgICBiLnZzdWIoYSwgZTApOwogICAgICBjLnZzdWIoYSwgZTEpOwogICAgICBlMC5jcm9zcyhlMSwgcmVzdWx0KTsKICAgICAgcmVzdWx0Lm5vcm1hbGl6ZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYW4gQUFCQiBvZiBhIHNxdWFyZSBpbiB0aGUgaGVpZ2h0ZmllbGQKICAgICAqIEBwYXJhbSB4aQogICAgICogQHBhcmFtIHlpCiAgICAgKiBAcGFyYW0gcmVzdWx0CiAgICAgKi8KCgogICAgZ2V0QWFiYkF0SW5kZXgoeGksIHlpLCBfcmVmKSB7CiAgICAgIGxldCB7CiAgICAgICAgbG93ZXJCb3VuZCwKICAgICAgICB1cHBlckJvdW5kCiAgICAgIH0gPSBfcmVmOwogICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOwogICAgICBjb25zdCBlbGVtZW50U2l6ZSA9IHRoaXMuZWxlbWVudFNpemU7CiAgICAgIGxvd2VyQm91bmQuc2V0KHhpICogZWxlbWVudFNpemUsIHlpICogZWxlbWVudFNpemUsIGRhdGFbeGldW3lpXSk7CiAgICAgIHVwcGVyQm91bmQuc2V0KCh4aSArIDEpICogZWxlbWVudFNpemUsICh5aSArIDEpICogZWxlbWVudFNpemUsIGRhdGFbeGkgKyAxXVt5aSArIDFdKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRoZSBoZWlnaHQgaW4gdGhlIGhlaWdodGZpZWxkIGF0IGEgZ2l2ZW4gcG9zaXRpb24KICAgICAqLwoKCiAgICBnZXRIZWlnaHRBdCh4LCB5LCBlZGdlQ2xhbXApIHsKICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKICAgICAgY29uc3QgYSA9IGdldEhlaWdodEF0X2E7CiAgICAgIGNvbnN0IGIgPSBnZXRIZWlnaHRBdF9iOwogICAgICBjb25zdCBjID0gZ2V0SGVpZ2h0QXRfYzsKICAgICAgY29uc3QgaWR4ID0gZ2V0SGVpZ2h0QXRfaWR4OwogICAgICB0aGlzLmdldEluZGV4T2ZQb3NpdGlvbih4LCB5LCBpZHgsIGVkZ2VDbGFtcCk7CiAgICAgIGxldCB4aSA9IGlkeFswXTsKICAgICAgbGV0IHlpID0gaWR4WzFdOwoKICAgICAgaWYgKGVkZ2VDbGFtcCkgewogICAgICAgIHhpID0gTWF0aC5taW4oZGF0YS5sZW5ndGggLSAyLCBNYXRoLm1heCgwLCB4aSkpOwogICAgICAgIHlpID0gTWF0aC5taW4oZGF0YVswXS5sZW5ndGggLSAyLCBNYXRoLm1heCgwLCB5aSkpOwogICAgICB9CgogICAgICBjb25zdCB1cHBlciA9IHRoaXMuZ2V0VHJpYW5nbGVBdCh4LCB5LCBlZGdlQ2xhbXAsIGEsIGIsIGMpOwogICAgICBiYXJ5Y2VudHJpY1dlaWdodHMoeCwgeSwgYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgZ2V0SGVpZ2h0QXRfd2VpZ2h0cyk7CiAgICAgIGNvbnN0IHcgPSBnZXRIZWlnaHRBdF93ZWlnaHRzOwoKICAgICAgaWYgKHVwcGVyKSB7CiAgICAgICAgLy8gVG9wIHRyaWFuZ2xlIHZlcnRzCiAgICAgICAgcmV0dXJuIGRhdGFbeGkgKyAxXVt5aSArIDFdICogdy54ICsgZGF0YVt4aV1beWkgKyAxXSAqIHcueSArIGRhdGFbeGkgKyAxXVt5aV0gKiB3Lno7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVG9wIHRyaWFuZ2xlIHZlcnRzCiAgICAgICAgcmV0dXJuIGRhdGFbeGldW3lpXSAqIHcueCArIGRhdGFbeGkgKyAxXVt5aV0gKiB3LnkgKyBkYXRhW3hpXVt5aSArIDFdICogdy56OwogICAgICB9CiAgICB9CgogICAgZ2V0Q2FjaGVDb252ZXhUcmlhbmdsZVBpbGxhcktleSh4aSwgeWksIGdldFVwcGVyVHJpYW5nbGUpIHsKICAgICAgcmV0dXJuIGAke3hpfV8ke3lpfV8ke2dldFVwcGVyVHJpYW5nbGUgPyAxIDogMH1gOwogICAgfQoKICAgIGdldENhY2hlZENvbnZleFRyaWFuZ2xlUGlsbGFyKHhpLCB5aSwgZ2V0VXBwZXJUcmlhbmdsZSkgewogICAgICByZXR1cm4gdGhpcy5fY2FjaGVkUGlsbGFyc1t0aGlzLmdldENhY2hlQ29udmV4VHJpYW5nbGVQaWxsYXJLZXkoeGksIHlpLCBnZXRVcHBlclRyaWFuZ2xlKV07CiAgICB9CgogICAgc2V0Q2FjaGVkQ29udmV4VHJpYW5nbGVQaWxsYXIoeGksIHlpLCBnZXRVcHBlclRyaWFuZ2xlLCBjb252ZXgsIG9mZnNldCkgewogICAgICB0aGlzLl9jYWNoZWRQaWxsYXJzW3RoaXMuZ2V0Q2FjaGVDb252ZXhUcmlhbmdsZVBpbGxhcktleSh4aSwgeWksIGdldFVwcGVyVHJpYW5nbGUpXSA9IHsKICAgICAgICBjb252ZXgsCiAgICAgICAgb2Zmc2V0CiAgICAgIH07CiAgICB9CgogICAgY2xlYXJDYWNoZWRDb252ZXhUcmlhbmdsZVBpbGxhcih4aSwgeWksIGdldFVwcGVyVHJpYW5nbGUpIHsKICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlZFBpbGxhcnNbdGhpcy5nZXRDYWNoZUNvbnZleFRyaWFuZ2xlUGlsbGFyS2V5KHhpLCB5aSwgZ2V0VXBwZXJUcmlhbmdsZSldOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYSB0cmlhbmdsZSBmcm9tIHRoZSBoZWlnaHRmaWVsZAogICAgICovCgoKICAgIGdldFRyaWFuZ2xlKHhpLCB5aSwgdXBwZXIsIGEsIGIsIGMpIHsKICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKICAgICAgY29uc3QgZWxlbWVudFNpemUgPSB0aGlzLmVsZW1lbnRTaXplOwoKICAgICAgaWYgKHVwcGVyKSB7CiAgICAgICAgLy8gVG9wIHRyaWFuZ2xlIHZlcnRzCiAgICAgICAgYS5zZXQoKHhpICsgMSkgKiBlbGVtZW50U2l6ZSwgKHlpICsgMSkgKiBlbGVtZW50U2l6ZSwgZGF0YVt4aSArIDFdW3lpICsgMV0pOwogICAgICAgIGIuc2V0KHhpICogZWxlbWVudFNpemUsICh5aSArIDEpICogZWxlbWVudFNpemUsIGRhdGFbeGldW3lpICsgMV0pOwogICAgICAgIGMuc2V0KCh4aSArIDEpICogZWxlbWVudFNpemUsIHlpICogZWxlbWVudFNpemUsIGRhdGFbeGkgKyAxXVt5aV0pOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRvcCB0cmlhbmdsZSB2ZXJ0cwogICAgICAgIGEuc2V0KHhpICogZWxlbWVudFNpemUsIHlpICogZWxlbWVudFNpemUsIGRhdGFbeGldW3lpXSk7CiAgICAgICAgYi5zZXQoKHhpICsgMSkgKiBlbGVtZW50U2l6ZSwgeWkgKiBlbGVtZW50U2l6ZSwgZGF0YVt4aSArIDFdW3lpXSk7CiAgICAgICAgYy5zZXQoeGkgKiBlbGVtZW50U2l6ZSwgKHlpICsgMSkgKiBlbGVtZW50U2l6ZSwgZGF0YVt4aV1beWkgKyAxXSk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR2V0IGEgdHJpYW5nbGUgaW4gdGhlIHRlcnJhaW4gaW4gdGhlIGZvcm0gb2YgYSB0cmlhbmd1bGFyIGNvbnZleCBzaGFwZS4KICAgICAqLwoKCiAgICBnZXRDb252ZXhUcmlhbmdsZVBpbGxhcih4aSwgeWksIGdldFVwcGVyVHJpYW5nbGUpIHsKICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucGlsbGFyQ29udmV4OwogICAgICBsZXQgb2Zmc2V0UmVzdWx0ID0gdGhpcy5waWxsYXJPZmZzZXQ7CgogICAgICBpZiAodGhpcy5jYWNoZUVuYWJsZWQpIHsKICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRDYWNoZWRDb252ZXhUcmlhbmdsZVBpbGxhcih4aSwgeWksIGdldFVwcGVyVHJpYW5nbGUpOwoKICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgdGhpcy5waWxsYXJDb252ZXggPSBkYXRhLmNvbnZleDsKICAgICAgICAgIHRoaXMucGlsbGFyT2Zmc2V0ID0gZGF0YS5vZmZzZXQ7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXN1bHQgPSBuZXcgQ29udmV4UG9seWhlZHJvbigpOwogICAgICAgIG9mZnNldFJlc3VsdCA9IG5ldyBWZWMzKCk7CiAgICAgICAgdGhpcy5waWxsYXJDb252ZXggPSByZXN1bHQ7CiAgICAgICAgdGhpcy5waWxsYXJPZmZzZXQgPSBvZmZzZXRSZXN1bHQ7CiAgICAgIH0KCiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICAgIGNvbnN0IGVsZW1lbnRTaXplID0gdGhpcy5lbGVtZW50U2l6ZTsKICAgICAgY29uc3QgZmFjZXMgPSByZXN1bHQuZmFjZXM7IC8vIFJldXNlIHZlcnRzIGlmIHBvc3NpYmxlCgogICAgICByZXN1bHQudmVydGljZXMubGVuZ3RoID0gNjsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAgICAgICAgaWYgKCFyZXN1bHQudmVydGljZXNbaV0pIHsKICAgICAgICAgIHJlc3VsdC52ZXJ0aWNlc1tpXSA9IG5ldyBWZWMzKCk7CiAgICAgICAgfQogICAgICB9IC8vIFJldXNlIGZhY2VzIGlmIHBvc3NpYmxlCgoKICAgICAgZmFjZXMubGVuZ3RoID0gNTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgaWYgKCFmYWNlc1tpXSkgewogICAgICAgICAgZmFjZXNbaV0gPSBbXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNvbnN0IHZlcnRzID0gcmVzdWx0LnZlcnRpY2VzOwogICAgICBjb25zdCBoID0gKE1hdGgubWluKGRhdGFbeGldW3lpXSwgZGF0YVt4aSArIDFdW3lpXSwgZGF0YVt4aV1beWkgKyAxXSwgZGF0YVt4aSArIDFdW3lpICsgMV0pIC0gdGhpcy5taW5WYWx1ZSkgLyAyICsgdGhpcy5taW5WYWx1ZTsKCiAgICAgIGlmICghZ2V0VXBwZXJUcmlhbmdsZSkgewogICAgICAgIC8vIENlbnRlciBvZiB0aGUgdHJpYW5nbGUgcGlsbGFyIC0gYWxsIHBvbHlnb25zIGFyZSBnaXZlbiByZWxhdGl2ZSB0byB0aGlzIG9uZQogICAgICAgIG9mZnNldFJlc3VsdC5zZXQoKHhpICsgMC4yNSkgKiBlbGVtZW50U2l6ZSwgLy8gc29ydCBvZiBjZW50ZXIgb2YgYSB0cmlhbmdsZQogICAgICAgICh5aSArIDAuMjUpICogZWxlbWVudFNpemUsIGggLy8gdmVydGljYWwgY2VudGVyCiAgICAgICAgKTsgLy8gVG9wIHRyaWFuZ2xlIHZlcnRzCgogICAgICAgIHZlcnRzWzBdLnNldCgtMC4yNSAqIGVsZW1lbnRTaXplLCAtMC4yNSAqIGVsZW1lbnRTaXplLCBkYXRhW3hpXVt5aV0gLSBoKTsKICAgICAgICB2ZXJ0c1sxXS5zZXQoMC43NSAqIGVsZW1lbnRTaXplLCAtMC4yNSAqIGVsZW1lbnRTaXplLCBkYXRhW3hpICsgMV1beWldIC0gaCk7CiAgICAgICAgdmVydHNbMl0uc2V0KC0wLjI1ICogZWxlbWVudFNpemUsIDAuNzUgKiBlbGVtZW50U2l6ZSwgZGF0YVt4aV1beWkgKyAxXSAtIGgpOyAvLyBib3R0b20gdHJpYW5nbGUgdmVydHMKCiAgICAgICAgdmVydHNbM10uc2V0KC0wLjI1ICogZWxlbWVudFNpemUsIC0wLjI1ICogZWxlbWVudFNpemUsIC1NYXRoLmFicyhoKSAtIDEpOwogICAgICAgIHZlcnRzWzRdLnNldCgwLjc1ICogZWxlbWVudFNpemUsIC0wLjI1ICogZWxlbWVudFNpemUsIC1NYXRoLmFicyhoKSAtIDEpOwogICAgICAgIHZlcnRzWzVdLnNldCgtMC4yNSAqIGVsZW1lbnRTaXplLCAwLjc1ICogZWxlbWVudFNpemUsIC1NYXRoLmFicyhoKSAtIDEpOyAvLyB0b3AgdHJpYW5nbGUKCiAgICAgICAgZmFjZXNbMF1bMF0gPSAwOwogICAgICAgIGZhY2VzWzBdWzFdID0gMTsKICAgICAgICBmYWNlc1swXVsyXSA9IDI7IC8vIGJvdHRvbSB0cmlhbmdsZQoKICAgICAgICBmYWNlc1sxXVswXSA9IDU7CiAgICAgICAgZmFjZXNbMV1bMV0gPSA0OwogICAgICAgIGZhY2VzWzFdWzJdID0gMzsgLy8gLXggZmFjaW5nIHF1YWQKCiAgICAgICAgZmFjZXNbMl1bMF0gPSAwOwogICAgICAgIGZhY2VzWzJdWzFdID0gMjsKICAgICAgICBmYWNlc1syXVsyXSA9IDU7CiAgICAgICAgZmFjZXNbMl1bM10gPSAzOyAvLyAteSBmYWNpbmcgcXVhZAoKICAgICAgICBmYWNlc1szXVswXSA9IDE7CiAgICAgICAgZmFjZXNbM11bMV0gPSAwOwogICAgICAgIGZhY2VzWzNdWzJdID0gMzsKICAgICAgICBmYWNlc1szXVszXSA9IDQ7IC8vICt4eSBmYWNpbmcgcXVhZAoKICAgICAgICBmYWNlc1s0XVswXSA9IDQ7CiAgICAgICAgZmFjZXNbNF1bMV0gPSA1OwogICAgICAgIGZhY2VzWzRdWzJdID0gMjsKICAgICAgICBmYWNlc1s0XVszXSA9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQ2VudGVyIG9mIHRoZSB0cmlhbmdsZSBwaWxsYXIgLSBhbGwgcG9seWdvbnMgYXJlIGdpdmVuIHJlbGF0aXZlIHRvIHRoaXMgb25lCiAgICAgICAgb2Zmc2V0UmVzdWx0LnNldCgoeGkgKyAwLjc1KSAqIGVsZW1lbnRTaXplLCAvLyBzb3J0IG9mIGNlbnRlciBvZiBhIHRyaWFuZ2xlCiAgICAgICAgKHlpICsgMC43NSkgKiBlbGVtZW50U2l6ZSwgaCAvLyB2ZXJ0aWNhbCBjZW50ZXIKICAgICAgICApOyAvLyBUb3AgdHJpYW5nbGUgdmVydHMKCiAgICAgICAgdmVydHNbMF0uc2V0KDAuMjUgKiBlbGVtZW50U2l6ZSwgMC4yNSAqIGVsZW1lbnRTaXplLCBkYXRhW3hpICsgMV1beWkgKyAxXSAtIGgpOwogICAgICAgIHZlcnRzWzFdLnNldCgtMC43NSAqIGVsZW1lbnRTaXplLCAwLjI1ICogZWxlbWVudFNpemUsIGRhdGFbeGldW3lpICsgMV0gLSBoKTsKICAgICAgICB2ZXJ0c1syXS5zZXQoMC4yNSAqIGVsZW1lbnRTaXplLCAtMC43NSAqIGVsZW1lbnRTaXplLCBkYXRhW3hpICsgMV1beWldIC0gaCk7IC8vIGJvdHRvbSB0cmlhbmdsZSB2ZXJ0cwoKICAgICAgICB2ZXJ0c1szXS5zZXQoMC4yNSAqIGVsZW1lbnRTaXplLCAwLjI1ICogZWxlbWVudFNpemUsIC1NYXRoLmFicyhoKSAtIDEpOwogICAgICAgIHZlcnRzWzRdLnNldCgtMC43NSAqIGVsZW1lbnRTaXplLCAwLjI1ICogZWxlbWVudFNpemUsIC1NYXRoLmFicyhoKSAtIDEpOwogICAgICAgIHZlcnRzWzVdLnNldCgwLjI1ICogZWxlbWVudFNpemUsIC0wLjc1ICogZWxlbWVudFNpemUsIC1NYXRoLmFicyhoKSAtIDEpOyAvLyBUb3AgdHJpYW5nbGUKCiAgICAgICAgZmFjZXNbMF1bMF0gPSAwOwogICAgICAgIGZhY2VzWzBdWzFdID0gMTsKICAgICAgICBmYWNlc1swXVsyXSA9IDI7IC8vIGJvdHRvbSB0cmlhbmdsZQoKICAgICAgICBmYWNlc1sxXVswXSA9IDU7CiAgICAgICAgZmFjZXNbMV1bMV0gPSA0OwogICAgICAgIGZhY2VzWzFdWzJdID0gMzsgLy8gK3ggZmFjaW5nIHF1YWQKCiAgICAgICAgZmFjZXNbMl1bMF0gPSAyOwogICAgICAgIGZhY2VzWzJdWzFdID0gNTsKICAgICAgICBmYWNlc1syXVsyXSA9IDM7CiAgICAgICAgZmFjZXNbMl1bM10gPSAwOyAvLyAreSBmYWNpbmcgcXVhZAoKICAgICAgICBmYWNlc1szXVswXSA9IDM7CiAgICAgICAgZmFjZXNbM11bMV0gPSA0OwogICAgICAgIGZhY2VzWzNdWzJdID0gMTsKICAgICAgICBmYWNlc1szXVszXSA9IDA7IC8vIC14eSBmYWNpbmcgcXVhZAoKICAgICAgICBmYWNlc1s0XVswXSA9IDE7CiAgICAgICAgZmFjZXNbNF1bMV0gPSA0OwogICAgICAgIGZhY2VzWzRdWzJdID0gNTsKICAgICAgICBmYWNlc1s0XVszXSA9IDI7CiAgICAgIH0KCiAgICAgIHJlc3VsdC5jb21wdXRlTm9ybWFscygpOwogICAgICByZXN1bHQuY29tcHV0ZUVkZ2VzKCk7CiAgICAgIHJlc3VsdC51cGRhdGVCb3VuZGluZ1NwaGVyZVJhZGl1cygpOwogICAgICB0aGlzLnNldENhY2hlZENvbnZleFRyaWFuZ2xlUGlsbGFyKHhpLCB5aSwgZ2V0VXBwZXJUcmlhbmdsZSwgcmVzdWx0LCBvZmZzZXRSZXN1bHQpOwogICAgfQoKICAgIGNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCB0YXJnZXQpIHsKICAgICAgaWYgKHRhcmdldCA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGFyZ2V0ID0gbmV3IFZlYzMoKTsKICAgICAgfQoKICAgICAgdGFyZ2V0LnNldCgwLCAwLCAwKTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KCiAgICB2b2x1bWUoKSB7CiAgICAgIHJldHVybiAoLy8gVGhlIHRlcnJhaW4gaXMgaW5maW5pdGUKICAgICAgICBOdW1iZXIuTUFYX1ZBTFVFCiAgICAgICk7CiAgICB9CgogICAgY2FsY3VsYXRlV29ybGRBQUJCKHBvcywgcXVhdCwgbWluLCBtYXgpIHsKICAgICAgLyoqIEBUT0RPIGRvIGl0IHByb3Blcmx5ICovCiAgICAgIG1pbi5zZXQoLU51bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFLCAtTnVtYmVyLk1BWF9WQUxVRSk7CiAgICAgIG1heC5zZXQoTnVtYmVyLk1BWF9WQUxVRSwgTnVtYmVyLk1BWF9WQUxVRSwgTnVtYmVyLk1BWF9WQUxVRSk7CiAgICB9CgogICAgdXBkYXRlQm91bmRpbmdTcGhlcmVSYWRpdXMoKSB7CiAgICAgIC8vIFVzZSB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBtaW4vbWF4IHZhbHVlcwogICAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOwogICAgICBjb25zdCBzID0gdGhpcy5lbGVtZW50U2l6ZTsKICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZVJhZGl1cyA9IG5ldyBWZWMzKGRhdGEubGVuZ3RoICogcywgZGF0YVswXS5sZW5ndGggKiBzLCBNYXRoLm1heChNYXRoLmFicyh0aGlzLm1heFZhbHVlKSwgTWF0aC5hYnModGhpcy5taW5WYWx1ZSkpKS5sZW5ndGgoKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgaGVpZ2h0IHZhbHVlcyBmcm9tIGFuIGltYWdlLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgaW4gYnJvd3Nlci4KICAgICAqLwoKCiAgICBzZXRIZWlnaHRzRnJvbUltYWdlKGltYWdlLCBzY2FsZSkgewogICAgICBjb25zdCB7CiAgICAgICAgeCwKICAgICAgICB6LAogICAgICAgIHkKICAgICAgfSA9IHNjYWxlOwogICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CiAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApOwogICAgICBjb25zdCBpbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KTsKICAgICAgY29uc3QgbWF0cml4ID0gdGhpcy5kYXRhOwogICAgICBtYXRyaXgubGVuZ3RoID0gMDsKICAgICAgdGhpcy5lbGVtZW50U2l6ZSA9IE1hdGguYWJzKHgpIC8gaW1hZ2VEYXRhLndpZHRoOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZURhdGEuaGVpZ2h0OyBpKyspIHsKICAgICAgICBjb25zdCByb3cgPSBbXTsKCiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbWFnZURhdGEud2lkdGg7IGorKykgewogICAgICAgICAgY29uc3QgYSA9IGltYWdlRGF0YS5kYXRhWyhpICogaW1hZ2VEYXRhLmhlaWdodCArIGopICogNF07CiAgICAgICAgICBjb25zdCBiID0gaW1hZ2VEYXRhLmRhdGFbKGkgKiBpbWFnZURhdGEuaGVpZ2h0ICsgaikgKiA0ICsgMV07CiAgICAgICAgICBjb25zdCBjID0gaW1hZ2VEYXRhLmRhdGFbKGkgKiBpbWFnZURhdGEuaGVpZ2h0ICsgaikgKiA0ICsgMl07CiAgICAgICAgICBjb25zdCBoZWlnaHQgPSAoYSArIGIgKyBjKSAvIDQgLyAyNTUgKiB6OwoKICAgICAgICAgIGlmICh4IDwgMCkgewogICAgICAgICAgICByb3cucHVzaChoZWlnaHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcm93LnVuc2hpZnQoaGVpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh5IDwgMCkgewogICAgICAgICAgbWF0cml4LnVuc2hpZnQocm93KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWF0cml4LnB1c2gocm93KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRoaXMudXBkYXRlTWF4VmFsdWUoKTsKICAgICAgdGhpcy51cGRhdGVNaW5WYWx1ZSgpOwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgfQoKICB9CiAgY29uc3QgZ2V0SGVpZ2h0QXRfaWR4ID0gW107CiAgY29uc3QgZ2V0SGVpZ2h0QXRfd2VpZ2h0cyA9IG5ldyBWZWMzKCk7CiAgY29uc3QgZ2V0SGVpZ2h0QXRfYSA9IG5ldyBWZWMzKCk7CiAgY29uc3QgZ2V0SGVpZ2h0QXRfYiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgZ2V0SGVpZ2h0QXRfYyA9IG5ldyBWZWMzKCk7CiAgY29uc3QgZ2V0Tm9ybWFsQXRfYSA9IG5ldyBWZWMzKCk7CiAgY29uc3QgZ2V0Tm9ybWFsQXRfYiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgZ2V0Tm9ybWFsQXRfYyA9IG5ldyBWZWMzKCk7CiAgY29uc3QgZ2V0Tm9ybWFsQXRfZTAgPSBuZXcgVmVjMygpOwogIGNvbnN0IGdldE5vcm1hbEF0X2UxID0gbmV3IFZlYzMoKTsgLy8gZnJvbSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXJ5Y2VudHJpY19jb29yZGluYXRlX3N5c3RlbQoKICBmdW5jdGlvbiBiYXJ5Y2VudHJpY1dlaWdodHMoeCwgeSwgYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcmVzdWx0KSB7CiAgICByZXN1bHQueCA9ICgoYnkgLSBjeSkgKiAoeCAtIGN4KSArIChjeCAtIGJ4KSAqICh5IC0gY3kpKSAvICgoYnkgLSBjeSkgKiAoYXggLSBjeCkgKyAoY3ggLSBieCkgKiAoYXkgLSBjeSkpOwogICAgcmVzdWx0LnkgPSAoKGN5IC0gYXkpICogKHggLSBjeCkgKyAoYXggLSBjeCkgKiAoeSAtIGN5KSkgLyAoKGJ5IC0gY3kpICogKGF4IC0gY3gpICsgKGN4IC0gYngpICogKGF5IC0gY3kpKTsKICAgIHJlc3VsdC56ID0gMSAtIHJlc3VsdC54IC0gcmVzdWx0Lnk7CiAgfQoKICAvKioKICAgKiBPY3RyZWVOb2RlCiAgICovCiAgY2xhc3MgT2N0cmVlTm9kZSB7CiAgICAvKiogVGhlIHJvb3Qgbm9kZSAqLwoKICAgIC8qKiBCb3VuZGFyeSBvZiB0aGlzIG5vZGUgKi8KCiAgICAvKiogQ29udGFpbmVkIGRhdGEgYXQgdGhlIGN1cnJlbnQgbm9kZSBsZXZlbCAqLwoKICAgIC8qKiBDaGlsZHJlbiB0byB0aGlzIG5vZGUgKi8KICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgdGhpcy5yb290ID0gb3B0aW9ucy5yb290IHx8IG51bGw7CiAgICAgIHRoaXMuYWFiYiA9IG9wdGlvbnMuYWFiYiA/IG9wdGlvbnMuYWFiYi5jbG9uZSgpIDogbmV3IEFBQkIoKTsKICAgICAgdGhpcy5kYXRhID0gW107CiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogcmVzZXQKICAgICAqLwoKCiAgICByZXNldCgpIHsKICAgICAgdGhpcy5jaGlsZHJlbi5sZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoID0gMDsKICAgIH0KICAgIC8qKgogICAgICogSW5zZXJ0IGRhdGEgaW50byB0aGlzIG5vZGUKICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UKICAgICAqLwoKCiAgICBpbnNlcnQoYWFiYiwgZWxlbWVudERhdGEsIGxldmVsKSB7CiAgICAgIGlmIChsZXZlbCA9PT0gdm9pZCAwKSB7CiAgICAgICAgbGV2ZWwgPSAwOwogICAgICB9CgogICAgICBjb25zdCBub2RlRGF0YSA9IHRoaXMuZGF0YTsgLy8gSWdub3JlIG9iamVjdHMgdGhhdCBkbyBub3QgYmVsb25nIGluIHRoaXMgbm9kZQoKICAgICAgaWYgKCF0aGlzLmFhYmIuY29udGFpbnMoYWFiYikpIHsKICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG9iamVjdCBjYW5ub3QgYmUgYWRkZWQKICAgICAgfQoKICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuOwogICAgICBjb25zdCBtYXhEZXB0aCA9IHRoaXMubWF4RGVwdGggfHwgdGhpcy5yb290Lm1heERlcHRoOwoKICAgICAgaWYgKGxldmVsIDwgbWF4RGVwdGgpIHsKICAgICAgICAvLyBTdWJkaXZpZGUgaWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuIHlldAogICAgICAgIGxldCBzdWJkaXZpZGVkID0gZmFsc2U7CgogICAgICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICB0aGlzLnN1YmRpdmlkZSgpOwogICAgICAgICAgc3ViZGl2aWRlZCA9IHRydWU7CiAgICAgICAgfSAvLyBhZGQgdG8gd2hpY2hldmVyIG5vZGUgd2lsbCBhY2NlcHQgaXQKCgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSA4OyBpKyspIHsKICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5pbnNlcnQoYWFiYiwgZWxlbWVudERhdGEsIGxldmVsICsgMSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoc3ViZGl2aWRlZCkgewogICAgICAgICAgLy8gTm8gY2hpbGRyZW4gYWNjZXB0ZWQhIE1pZ2h0IGFzIHdlbGwganVzdCByZW1vdmUgZW0gc2luY2UgdGhleSBjb250YWluIG5vbmUKICAgICAgICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICB9IC8vIFRvbyBkZWVwLCBvciBjaGlsZHJlbiBkaWRudCB3YW50IGl0LiBhZGQgaXQgaW4gY3VycmVudCBub2RlCgoKICAgICAgbm9kZURhdGEucHVzaChlbGVtZW50RGF0YSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGUgOCBlcXVhbGx5IHNpemVkIGNoaWxkcmVuIG5vZGVzIGFuZCBwdXQgdGhlbSBpbiB0aGUgYGNoaWxkcmVuYCBhcnJheS4KICAgICAqLwoKCiAgICBzdWJkaXZpZGUoKSB7CiAgICAgIGNvbnN0IGFhYmIgPSB0aGlzLmFhYmI7CiAgICAgIGNvbnN0IGwgPSBhYWJiLmxvd2VyQm91bmQ7CiAgICAgIGNvbnN0IHUgPSBhYWJiLnVwcGVyQm91bmQ7CiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgICAgY2hpbGRyZW4ucHVzaChuZXcgT2N0cmVlTm9kZSh7CiAgICAgICAgYWFiYjogbmV3IEFBQkIoewogICAgICAgICAgbG93ZXJCb3VuZDogbmV3IFZlYzMoMCwgMCwgMCkKICAgICAgICB9KQogICAgICB9KSwgbmV3IE9jdHJlZU5vZGUoewogICAgICAgIGFhYmI6IG5ldyBBQUJCKHsKICAgICAgICAgIGxvd2VyQm91bmQ6IG5ldyBWZWMzKDEsIDAsIDApCiAgICAgICAgfSkKICAgICAgfSksIG5ldyBPY3RyZWVOb2RlKHsKICAgICAgICBhYWJiOiBuZXcgQUFCQih7CiAgICAgICAgICBsb3dlckJvdW5kOiBuZXcgVmVjMygxLCAxLCAwKQogICAgICAgIH0pCiAgICAgIH0pLCBuZXcgT2N0cmVlTm9kZSh7CiAgICAgICAgYWFiYjogbmV3IEFBQkIoewogICAgICAgICAgbG93ZXJCb3VuZDogbmV3IFZlYzMoMSwgMSwgMSkKICAgICAgICB9KQogICAgICB9KSwgbmV3IE9jdHJlZU5vZGUoewogICAgICAgIGFhYmI6IG5ldyBBQUJCKHsKICAgICAgICAgIGxvd2VyQm91bmQ6IG5ldyBWZWMzKDAsIDEsIDEpCiAgICAgICAgfSkKICAgICAgfSksIG5ldyBPY3RyZWVOb2RlKHsKICAgICAgICBhYWJiOiBuZXcgQUFCQih7CiAgICAgICAgICBsb3dlckJvdW5kOiBuZXcgVmVjMygwLCAwLCAxKQogICAgICAgIH0pCiAgICAgIH0pLCBuZXcgT2N0cmVlTm9kZSh7CiAgICAgICAgYWFiYjogbmV3IEFBQkIoewogICAgICAgICAgbG93ZXJCb3VuZDogbmV3IFZlYzMoMSwgMCwgMSkKICAgICAgICB9KQogICAgICB9KSwgbmV3IE9jdHJlZU5vZGUoewogICAgICAgIGFhYmI6IG5ldyBBQUJCKHsKICAgICAgICAgIGxvd2VyQm91bmQ6IG5ldyBWZWMzKDAsIDEsIDApCiAgICAgICAgfSkKICAgICAgfSkpOwogICAgICB1LnZzdWIobCwgaGFsZkRpYWdvbmFsKTsKICAgICAgaGFsZkRpYWdvbmFsLnNjYWxlKDAuNSwgaGFsZkRpYWdvbmFsKTsKICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdCB8fCB0aGlzOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IDg7IGkrKykgewogICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07IC8vIFNldCBjdXJyZW50IG5vZGUgYXMgcm9vdAoKICAgICAgICBjaGlsZC5yb290ID0gcm9vdDsgLy8gQ29tcHV0ZSBib3VuZHMKCiAgICAgICAgY29uc3QgbG93ZXJCb3VuZCA9IGNoaWxkLmFhYmIubG93ZXJCb3VuZDsKICAgICAgICBsb3dlckJvdW5kLnggKj0gaGFsZkRpYWdvbmFsLng7CiAgICAgICAgbG93ZXJCb3VuZC55ICo9IGhhbGZEaWFnb25hbC55OwogICAgICAgIGxvd2VyQm91bmQueiAqPSBoYWxmRGlhZ29uYWwuejsKICAgICAgICBsb3dlckJvdW5kLnZhZGQobCwgbG93ZXJCb3VuZCk7IC8vIFVwcGVyIGJvdW5kIGlzIGFsd2F5cyBsb3dlciBib3VuZCArIGhhbGZEaWFnb25hbAoKICAgICAgICBsb3dlckJvdW5kLnZhZGQoaGFsZkRpYWdvbmFsLCBjaGlsZC5hYWJiLnVwcGVyQm91bmQpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhbGwgZGF0YSwgcG90ZW50aWFsbHkgd2l0aGluIGFuIEFBQkIKICAgICAqIEByZXR1cm4gVGhlICJyZXN1bHQiIG9iamVjdAogICAgICovCgoKICAgIGFhYmJRdWVyeShhYWJiLCByZXN1bHQpIHsKICAgICAgdGhpcy5kYXRhOyAvLyBhYm9ydCBpZiB0aGUgcmFuZ2UgZG9lcyBub3QgaW50ZXJzZWN0IHRoaXMgbm9kZQogICAgICAvLyBpZiAoIXRoaXMuYWFiYi5vdmVybGFwcyhhYWJiKSl7CiAgICAgIC8vICAgICByZXR1cm4gcmVzdWx0OwogICAgICAvLyB9CiAgICAgIC8vIEFkZCBvYmplY3RzIGF0IHRoaXMgbGV2ZWwKICAgICAgLy8gQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVzdWx0LCBub2RlRGF0YSk7CiAgICAgIC8vIEFkZCBjaGlsZCBkYXRhCiAgICAgIC8vIEB0b2RvIHVud3JhcCByZWN1cnNpb24gaW50byBhIHF1ZXVlIC8gbG9vcCwgdGhhdCdzIGZhc3RlciBpbiBKUwoKICAgICAgdGhpcy5jaGlsZHJlbjsgLy8gZm9yIChsZXQgaSA9IDAsIE4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSAhPT0gTjsgaSsrKSB7CiAgICAgIC8vICAgICBjaGlsZHJlbltpXS5hYWJiUXVlcnkoYWFiYiwgcmVzdWx0KTsKICAgICAgLy8gfQoKICAgICAgY29uc3QgcXVldWUgPSBbdGhpc107CgogICAgICB3aGlsZSAocXVldWUubGVuZ3RoKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnBvcCgpOwoKICAgICAgICBpZiAobm9kZS5hYWJiLm92ZXJsYXBzKGFhYmIpKSB7CiAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXN1bHQsIG5vZGUuZGF0YSk7CiAgICAgICAgfQoKICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShxdWV1ZSwgbm9kZS5jaGlsZHJlbik7CiAgICAgIH0KCiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhbGwgZGF0YSwgcG90ZW50aWFsbHkgaW50ZXJzZWN0ZWQgYnkgYSByYXkuCiAgICAgKiBAcmV0dXJuIFRoZSAicmVzdWx0IiBvYmplY3QKICAgICAqLwoKCiAgICByYXlRdWVyeShyYXksIHRyZWVUcmFuc2Zvcm0sIHJlc3VsdCkgewogICAgICAvLyBVc2UgYWFiYiBxdWVyeSBmb3Igbm93LgoKICAgICAgLyoqIEB0b2RvIGltcGxlbWVudCByZWFsIHJheSBxdWVyeSB3aGljaCBuZWVkcyBsZXNzIGxvb2t1cHMgKi8KICAgICAgcmF5LmdldEFBQkIodG1wQUFCQik7CiAgICAgIHRtcEFBQkIudG9Mb2NhbEZyYW1lKHRyZWVUcmFuc2Zvcm0sIHRtcEFBQkIpOwogICAgICB0aGlzLmFhYmJRdWVyeSh0bXBBQUJCLCByZXN1bHQpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiByZW1vdmVFbXB0eU5vZGVzCiAgICAgKi8KCgogICAgcmVtb3ZlRW1wdHlOb2RlcygpIHsKICAgICAgZm9yIChsZXQgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLnJlbW92ZUVtcHR5Tm9kZXMoKTsKCiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuW2ldLmNoaWxkcmVuLmxlbmd0aCAmJiAhdGhpcy5jaGlsZHJlbltpXS5kYXRhLmxlbmd0aCkgewogICAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaSwgMSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogIH0KICAvKioKICAgKiBPY3RyZWUKICAgKi8KCgogIGNsYXNzIE9jdHJlZSBleHRlbmRzIE9jdHJlZU5vZGUgewogICAgLyoqCiAgICAgKiBNYXhpbXVtIHN1YmRpdmlzaW9uIGRlcHRoCiAgICAgKiBAZGVmYXVsdCA4CiAgICAgKi8KCiAgICAvKioKICAgICAqIEBwYXJhbSBhYWJiIFRoZSB0b3RhbCBBQUJCIG9mIHRoZSB0cmVlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGFhYmIsIG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgc3VwZXIoewogICAgICAgIHJvb3Q6IG51bGwsCiAgICAgICAgYWFiYgogICAgICB9KTsKICAgICAgdGhpcy5tYXhEZXB0aCA9IHR5cGVvZiBvcHRpb25zLm1heERlcHRoICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMubWF4RGVwdGggOiA4OwogICAgfQoKICB9CiAgY29uc3QgaGFsZkRpYWdvbmFsID0gbmV3IFZlYzMoKTsKICBjb25zdCB0bXBBQUJCID0gbmV3IEFBQkIoKTsKCiAgLyoqCiAgICogVHJpbWVzaC4KICAgKiBAZXhhbXBsZQogICAqICAgICAvLyBIb3cgdG8gbWFrZSBhIG1lc2ggd2l0aCBhIHNpbmdsZSB0cmlhbmdsZQogICAqICAgICBjb25zdCB2ZXJ0aWNlcyA9IFsKICAgKiAgICAgICAgIDAsIDAsIDAsIC8vIHZlcnRleCAwCiAgICogICAgICAgICAxLCAwLCAwLCAvLyB2ZXJ0ZXggMQogICAqICAgICAgICAgMCwgMSwgMCAgLy8gdmVydGV4IDIKICAgKiAgICAgXQogICAqICAgICBjb25zdCBpbmRpY2VzID0gWwogICAqICAgICAgICAgMCwgMSwgMiAgLy8gdHJpYW5nbGUgMAogICAqICAgICBdCiAgICogICAgIGNvbnN0IHRyaW1lc2hTaGFwZSA9IG5ldyBDQU5OT04uVHJpbWVzaCh2ZXJ0aWNlcywgaW5kaWNlcykKICAgKi8KICBjbGFzcyBUcmltZXNoIGV4dGVuZHMgU2hhcGUgewogICAgLyoqCiAgICAgKiB2ZXJ0aWNlcwogICAgICovCgogICAgLyoqCiAgICAgKiBBcnJheSBvZiBpbnRlZ2VycywgaW5kaWNhdGluZyB3aGljaCB2ZXJ0aWNlcyBlYWNoIHRyaWFuZ2xlIGNvbnNpc3RzIG9mLiBUaGUgbGVuZ3RoIG9mIHRoaXMgYXJyYXkgaXMgdGh1cyAzIHRpbWVzIHRoZSBudW1iZXIgb2YgdHJpYW5nbGVzLgogICAgICovCgogICAgLyoqCiAgICAgKiBUaGUgbm9ybWFscyBkYXRhLgogICAgICovCgogICAgLyoqCiAgICAgKiBUaGUgbG9jYWwgQUFCQiBvZiB0aGUgbWVzaC4KICAgICAqLwoKICAgIC8qKgogICAgICogUmVmZXJlbmNlcyB0byB2ZXJ0ZXggcGFpcnMsIG1ha2luZyB1cCBhbGwgdW5pcXVlIGVkZ2VzIGluIHRoZSB0cmltZXNoLgogICAgICovCgogICAgLyoqCiAgICAgKiBMb2NhbCBzY2FsaW5nIG9mIHRoZSBtZXNoLiBVc2UgLnNldFNjYWxlKCkgdG8gc2V0IGl0LgogICAgICovCgogICAgLyoqCiAgICAgKiBUaGUgaW5kZXhlZCB0cmlhbmdsZXMuIFVzZSAudXBkYXRlVHJlZSgpIHRvIHVwZGF0ZSBpdC4KICAgICAqLwogICAgY29uc3RydWN0b3IodmVydGljZXMsIGluZGljZXMpIHsKICAgICAgc3VwZXIoewogICAgICAgIHR5cGU6IFNoYXBlLnR5cGVzLlRSSU1FU0gKICAgICAgfSk7CiAgICAgIHRoaXMudmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzKTsKICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IEludDE2QXJyYXkoaW5kaWNlcyk7CiAgICAgIHRoaXMubm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoaW5kaWNlcy5sZW5ndGgpOwogICAgICB0aGlzLmFhYmIgPSBuZXcgQUFCQigpOwogICAgICB0aGlzLmVkZ2VzID0gbnVsbDsKICAgICAgdGhpcy5zY2FsZSA9IG5ldyBWZWMzKDEsIDEsIDEpOwogICAgICB0aGlzLnRyZWUgPSBuZXcgT2N0cmVlKCk7CiAgICAgIHRoaXMudXBkYXRlRWRnZXMoKTsKICAgICAgdGhpcy51cGRhdGVOb3JtYWxzKCk7CiAgICAgIHRoaXMudXBkYXRlQUFCQigpOwogICAgICB0aGlzLnVwZGF0ZUJvdW5kaW5nU3BoZXJlUmFkaXVzKCk7CiAgICAgIHRoaXMudXBkYXRlVHJlZSgpOwogICAgfQogICAgLyoqCiAgICAgKiB1cGRhdGVUcmVlCiAgICAgKi8KCgogICAgdXBkYXRlVHJlZSgpIHsKICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZTsKICAgICAgdHJlZS5yZXNldCgpOwogICAgICB0cmVlLmFhYmIuY29weSh0aGlzLmFhYmIpOwogICAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7IC8vIFRoZSBsb2NhbCBtZXNoIEFBQkIgaXMgc2NhbGVkLCBidXQgdGhlIG9jdHJlZSBBQUJCIHNob3VsZCBiZSB1bnNjYWxlZAoKICAgICAgdHJlZS5hYWJiLmxvd2VyQm91bmQueCAqPSAxIC8gc2NhbGUueDsKICAgICAgdHJlZS5hYWJiLmxvd2VyQm91bmQueSAqPSAxIC8gc2NhbGUueTsKICAgICAgdHJlZS5hYWJiLmxvd2VyQm91bmQueiAqPSAxIC8gc2NhbGUuejsKICAgICAgdHJlZS5hYWJiLnVwcGVyQm91bmQueCAqPSAxIC8gc2NhbGUueDsKICAgICAgdHJlZS5hYWJiLnVwcGVyQm91bmQueSAqPSAxIC8gc2NhbGUueTsKICAgICAgdHJlZS5hYWJiLnVwcGVyQm91bmQueiAqPSAxIC8gc2NhbGUuejsgLy8gSW5zZXJ0IGFsbCB0cmlhbmdsZXMKCiAgICAgIGNvbnN0IHRyaWFuZ2xlQUFCQiA9IG5ldyBBQUJCKCk7CiAgICAgIGNvbnN0IGEgPSBuZXcgVmVjMygpOwogICAgICBjb25zdCBiID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3QgYyA9IG5ldyBWZWMzKCk7CiAgICAgIGNvbnN0IHBvaW50cyA9IFthLCBiLCBjXTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmRpY2VzLmxlbmd0aCAvIDM7IGkrKykgewogICAgICAgIC8vdGhpcy5nZXRUcmlhbmdsZVZlcnRpY2VzKGksIGEsIGIsIGMpOwogICAgICAgIC8vIEdldCB1bnNjYWxlZCB0cmlhbmdsZSB2ZXJ0cwogICAgICAgIGNvbnN0IGkzID0gaSAqIDM7CgogICAgICAgIHRoaXMuX2dldFVuc2NhbGVkVmVydGV4KHRoaXMuaW5kaWNlc1tpM10sIGEpOwoKICAgICAgICB0aGlzLl9nZXRVbnNjYWxlZFZlcnRleCh0aGlzLmluZGljZXNbaTMgKyAxXSwgYik7CgogICAgICAgIHRoaXMuX2dldFVuc2NhbGVkVmVydGV4KHRoaXMuaW5kaWNlc1tpMyArIDJdLCBjKTsKCiAgICAgICAgdHJpYW5nbGVBQUJCLnNldEZyb21Qb2ludHMocG9pbnRzKTsKICAgICAgICB0cmVlLmluc2VydCh0cmlhbmdsZUFBQkIsIGkpOwogICAgICB9CgogICAgICB0cmVlLnJlbW92ZUVtcHR5Tm9kZXMoKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHRyaWFuZ2xlcyBpbiBhIGxvY2FsIEFBQkIgZnJvbSB0aGUgdHJpbWVzaC4KICAgICAqIEBwYXJhbSByZXN1bHQgQW4gYXJyYXkgb2YgaW50ZWdlcnMsIHJlZmVyZW5jaW5nIHRoZSBxdWVyaWVkIHRyaWFuZ2xlcy4KICAgICAqLwoKCiAgICBnZXRUcmlhbmdsZXNJbkFBQkIoYWFiYiwgcmVzdWx0KSB7CiAgICAgIHVuc2NhbGVkQUFCQi5jb3B5KGFhYmIpOyAvLyBTY2FsZSBpdCB0byBsb2NhbAoKICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLnNjYWxlOwogICAgICBjb25zdCBpc3ggPSBzY2FsZS54OwogICAgICBjb25zdCBpc3kgPSBzY2FsZS55OwogICAgICBjb25zdCBpc3ogPSBzY2FsZS56OwogICAgICBjb25zdCBsID0gdW5zY2FsZWRBQUJCLmxvd2VyQm91bmQ7CiAgICAgIGNvbnN0IHUgPSB1bnNjYWxlZEFBQkIudXBwZXJCb3VuZDsKICAgICAgbC54IC89IGlzeDsKICAgICAgbC55IC89IGlzeTsKICAgICAgbC56IC89IGlzejsKICAgICAgdS54IC89IGlzeDsKICAgICAgdS55IC89IGlzeTsKICAgICAgdS56IC89IGlzejsKICAgICAgcmV0dXJuIHRoaXMudHJlZS5hYWJiUXVlcnkodW5zY2FsZWRBQUJCLCByZXN1bHQpOwogICAgfQogICAgLyoqCiAgICAgKiBzZXRTY2FsZQogICAgICovCgoKICAgIHNldFNjYWxlKHNjYWxlKSB7CiAgICAgIGNvbnN0IHdhc1VuaWZvcm0gPSB0aGlzLnNjYWxlLnggPT09IHRoaXMuc2NhbGUueSAmJiB0aGlzLnNjYWxlLnkgPT09IHRoaXMuc2NhbGUuejsKICAgICAgY29uc3QgaXNVbmlmb3JtID0gc2NhbGUueCA9PT0gc2NhbGUueSAmJiBzY2FsZS55ID09PSBzY2FsZS56OwoKICAgICAgaWYgKCEod2FzVW5pZm9ybSAmJiBpc1VuaWZvcm0pKSB7CiAgICAgICAgLy8gTm9uLXVuaWZvcm0gc2NhbGluZy4gTmVlZCB0byB1cGRhdGUgbm9ybWFscy4KICAgICAgICB0aGlzLnVwZGF0ZU5vcm1hbHMoKTsKICAgICAgfQoKICAgICAgdGhpcy5zY2FsZS5jb3B5KHNjYWxlKTsKICAgICAgdGhpcy51cGRhdGVBQUJCKCk7CiAgICAgIHRoaXMudXBkYXRlQm91bmRpbmdTcGhlcmVSYWRpdXMoKTsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZSB0aGUgbm9ybWFscyBvZiB0aGUgZmFjZXMuIFdpbGwgc2F2ZSBpbiB0aGUgYC5ub3JtYWxzYCBhcnJheS4KICAgICAqLwoKCiAgICB1cGRhdGVOb3JtYWxzKCkgewogICAgICBjb25zdCBuID0gY29tcHV0ZU5vcm1hbHNfbjsgLy8gR2VuZXJhdGUgbm9ybWFscwoKICAgICAgY29uc3Qgbm9ybWFscyA9IHRoaXMubm9ybWFsczsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmRpY2VzLmxlbmd0aCAvIDM7IGkrKykgewogICAgICAgIGNvbnN0IGkzID0gaSAqIDM7CiAgICAgICAgY29uc3QgYSA9IHRoaXMuaW5kaWNlc1tpM107CiAgICAgICAgY29uc3QgYiA9IHRoaXMuaW5kaWNlc1tpMyArIDFdOwogICAgICAgIGNvbnN0IGMgPSB0aGlzLmluZGljZXNbaTMgKyAyXTsKICAgICAgICB0aGlzLmdldFZlcnRleChhLCB2YSk7CiAgICAgICAgdGhpcy5nZXRWZXJ0ZXgoYiwgdmIpOwogICAgICAgIHRoaXMuZ2V0VmVydGV4KGMsIHZjKTsKICAgICAgICBUcmltZXNoLmNvbXB1dGVOb3JtYWwodmIsIHZhLCB2Yywgbik7CiAgICAgICAgbm9ybWFsc1tpM10gPSBuLng7CiAgICAgICAgbm9ybWFsc1tpMyArIDFdID0gbi55OwogICAgICAgIG5vcm1hbHNbaTMgKyAyXSA9IG4uejsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgdGhlIGAuZWRnZXNgIHByb3BlcnR5CiAgICAgKi8KCgogICAgdXBkYXRlRWRnZXMoKSB7CiAgICAgIGNvbnN0IGVkZ2VzID0ge307CgogICAgICBjb25zdCBhZGQgPSAoYSwgYikgPT4gewogICAgICAgIGNvbnN0IGtleSA9IGEgPCBiID8gYCR7YX1fJHtifWAgOiBgJHtifV8ke2F9YDsKICAgICAgICBlZGdlc1trZXldID0gdHJ1ZTsKICAgICAgfTsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmRpY2VzLmxlbmd0aCAvIDM7IGkrKykgewogICAgICAgIGNvbnN0IGkzID0gaSAqIDM7CiAgICAgICAgY29uc3QgYSA9IHRoaXMuaW5kaWNlc1tpM107CiAgICAgICAgY29uc3QgYiA9IHRoaXMuaW5kaWNlc1tpMyArIDFdOwogICAgICAgIGNvbnN0IGMgPSB0aGlzLmluZGljZXNbaTMgKyAyXTsKICAgICAgICBhZGQoYSwgYik7CiAgICAgICAgYWRkKGIsIGMpOwogICAgICAgIGFkZChjLCBhKTsKICAgICAgfQoKICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGVkZ2VzKTsKICAgICAgdGhpcy5lZGdlcyA9IG5ldyBJbnQxNkFycmF5KGtleXMubGVuZ3RoICogMik7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBpbmRpY2VzID0ga2V5c1tpXS5zcGxpdCgnXycpOwogICAgICAgIHRoaXMuZWRnZXNbMiAqIGldID0gcGFyc2VJbnQoaW5kaWNlc1swXSwgMTApOwogICAgICAgIHRoaXMuZWRnZXNbMiAqIGkgKyAxXSA9IHBhcnNlSW50KGluZGljZXNbMV0sIDEwKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYW4gZWRnZSB2ZXJ0ZXgKICAgICAqIEBwYXJhbSBmaXJzdE9yU2Vjb25kIDAgb3IgMSwgZGVwZW5kaW5nIG9uIHdoaWNoIG9uZSBvZiB0aGUgdmVydGljZXMgeW91IG5lZWQuCiAgICAgKiBAcGFyYW0gdmVydGV4U3RvcmUgV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdAogICAgICovCgoKICAgIGdldEVkZ2VWZXJ0ZXgoZWRnZUluZGV4LCBmaXJzdE9yU2Vjb25kLCB2ZXJ0ZXhTdG9yZSkgewogICAgICBjb25zdCB2ZXJ0ZXhJbmRleCA9IHRoaXMuZWRnZXNbZWRnZUluZGV4ICogMiArIChmaXJzdE9yU2Vjb25kID8gMSA6IDApXTsKICAgICAgdGhpcy5nZXRWZXJ0ZXgodmVydGV4SW5kZXgsIHZlcnRleFN0b3JlKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGEgdmVjdG9yIGFsb25nIGFuIGVkZ2UuCiAgICAgKi8KCgogICAgZ2V0RWRnZVZlY3RvcihlZGdlSW5kZXgsIHZlY3RvclN0b3JlKSB7CiAgICAgIGNvbnN0IHZhID0gZ2V0RWRnZVZlY3Rvcl92YTsKICAgICAgY29uc3QgdmIgPSBnZXRFZGdlVmVjdG9yX3ZiOwogICAgICB0aGlzLmdldEVkZ2VWZXJ0ZXgoZWRnZUluZGV4LCAwLCB2YSk7CiAgICAgIHRoaXMuZ2V0RWRnZVZlcnRleChlZGdlSW5kZXgsIDEsIHZiKTsKICAgICAgdmIudnN1Yih2YSwgdmVjdG9yU3RvcmUpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgZmFjZSBub3JtYWwgZ2l2ZW4gMyB2ZXJ0aWNlcwogICAgICovCgoKICAgIHN0YXRpYyBjb21wdXRlTm9ybWFsKHZhLCB2YiwgdmMsIHRhcmdldCkgewogICAgICB2Yi52c3ViKHZhLCBhYik7CiAgICAgIHZjLnZzdWIodmIsIGNiKTsKICAgICAgY2IuY3Jvc3MoYWIsIHRhcmdldCk7CgogICAgICBpZiAoIXRhcmdldC5pc1plcm8oKSkgewogICAgICAgIHRhcmdldC5ub3JtYWxpemUoKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdmVydGV4IGkuCiAgICAgKiBAcmV0dXJuIFRoZSAib3V0IiB2ZWN0b3Igb2JqZWN0CiAgICAgKi8KCgogICAgZ2V0VmVydGV4KGksIG91dCkgewogICAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7CgogICAgICB0aGlzLl9nZXRVbnNjYWxlZFZlcnRleChpLCBvdXQpOwoKICAgICAgb3V0LnggKj0gc2NhbGUueDsKICAgICAgb3V0LnkgKj0gc2NhbGUueTsKICAgICAgb3V0LnogKj0gc2NhbGUuejsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHJhdyB2ZXJ0ZXggaQogICAgICogQHJldHVybiBUaGUgIm91dCIgdmVjdG9yIG9iamVjdAogICAgICovCgoKICAgIF9nZXRVbnNjYWxlZFZlcnRleChpLCBvdXQpIHsKICAgICAgY29uc3QgaTMgPSBpICogMzsKICAgICAgY29uc3QgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzOwogICAgICByZXR1cm4gb3V0LnNldCh2ZXJ0aWNlc1tpM10sIHZlcnRpY2VzW2kzICsgMV0sIHZlcnRpY2VzW2kzICsgMl0pOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYSB2ZXJ0ZXggZnJvbSB0aGUgdHJpbWVzaCx0cmFuc2Zvcm1lZCBieSB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHF1YXRlcm5pb24uCiAgICAgKiBAcmV0dXJuIFRoZSAib3V0IiB2ZWN0b3Igb2JqZWN0CiAgICAgKi8KCgogICAgZ2V0V29ybGRWZXJ0ZXgoaSwgcG9zLCBxdWF0LCBvdXQpIHsKICAgICAgdGhpcy5nZXRWZXJ0ZXgoaSwgb3V0KTsKICAgICAgVHJhbnNmb3JtLnBvaW50VG9Xb3JsZEZyYW1lKHBvcywgcXVhdCwgb3V0LCBvdXQpOwogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHRocmVlIHZlcnRpY2VzIGZvciB0cmlhbmdsZSBpLgogICAgICovCgoKICAgIGdldFRyaWFuZ2xlVmVydGljZXMoaSwgYSwgYiwgYykgewogICAgICBjb25zdCBpMyA9IGkgKiAzOwogICAgICB0aGlzLmdldFZlcnRleCh0aGlzLmluZGljZXNbaTNdLCBhKTsKICAgICAgdGhpcy5nZXRWZXJ0ZXgodGhpcy5pbmRpY2VzW2kzICsgMV0sIGIpOwogICAgICB0aGlzLmdldFZlcnRleCh0aGlzLmluZGljZXNbaTMgKyAyXSwgYyk7CiAgICB9CiAgICAvKioKICAgICAqIENvbXB1dGUgdGhlIG5vcm1hbCBvZiB0cmlhbmdsZSBpLgogICAgICogQHJldHVybiBUaGUgInRhcmdldCIgdmVjdG9yIG9iamVjdAogICAgICovCgoKICAgIGdldE5vcm1hbChpLCB0YXJnZXQpIHsKICAgICAgY29uc3QgaTMgPSBpICogMzsKICAgICAgcmV0dXJuIHRhcmdldC5zZXQodGhpcy5ub3JtYWxzW2kzXSwgdGhpcy5ub3JtYWxzW2kzICsgMV0sIHRoaXMubm9ybWFsc1tpMyArIDJdKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiBUaGUgInRhcmdldCIgdmVjdG9yIG9iamVjdAogICAgICovCgoKICAgIGNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCB0YXJnZXQpIHsKICAgICAgLy8gQXBwcm94aW1hdGUgd2l0aCBib3ggaW5lcnRpYQogICAgICAvLyBFeGFjdCBpbmVydGlhIGNhbGN1bGF0aW9uIGlzIG92ZXJraWxsLCBidXQgc2VlIGh0dHA6Ly9nZW9tZXRyaWN0b29scy5jb20vRG9jdW1lbnRhdGlvbi9Qb2x5aGVkcmFsTWFzc1Byb3BlcnRpZXMucGRmIGZvciB0aGUgY29ycmVjdCB3YXkgdG8gZG8gaXQKICAgICAgdGhpcy5jb21wdXRlTG9jYWxBQUJCKGNsaV9hYWJiKTsKICAgICAgY29uc3QgeCA9IGNsaV9hYWJiLnVwcGVyQm91bmQueCAtIGNsaV9hYWJiLmxvd2VyQm91bmQueDsKICAgICAgY29uc3QgeSA9IGNsaV9hYWJiLnVwcGVyQm91bmQueSAtIGNsaV9hYWJiLmxvd2VyQm91bmQueTsKICAgICAgY29uc3QgeiA9IGNsaV9hYWJiLnVwcGVyQm91bmQueiAtIGNsaV9hYWJiLmxvd2VyQm91bmQuejsKICAgICAgcmV0dXJuIHRhcmdldC5zZXQoMS4wIC8gMTIuMCAqIG1hc3MgKiAoMiAqIHkgKiAyICogeSArIDIgKiB6ICogMiAqIHopLCAxLjAgLyAxMi4wICogbWFzcyAqICgyICogeCAqIDIgKiB4ICsgMiAqIHogKiAyICogeiksIDEuMCAvIDEyLjAgKiBtYXNzICogKDIgKiB5ICogMiAqIHkgKyAyICogeCAqIDIgKiB4KSk7CiAgICB9CiAgICAvKioKICAgICAqIENvbXB1dGUgdGhlIGxvY2FsIEFBQkIgZm9yIHRoZSB0cmltZXNoCiAgICAgKi8KCgogICAgY29tcHV0ZUxvY2FsQUFCQihhYWJiKSB7CiAgICAgIGNvbnN0IGwgPSBhYWJiLmxvd2VyQm91bmQ7CiAgICAgIGNvbnN0IHUgPSBhYWJiLnVwcGVyQm91bmQ7CiAgICAgIGNvbnN0IG4gPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsKICAgICAgdGhpcy52ZXJ0aWNlczsKICAgICAgY29uc3QgdiA9IGNvbXB1dGVMb2NhbEFBQkJfd29ybGRWZXJ0OwogICAgICB0aGlzLmdldFZlcnRleCgwLCB2KTsKICAgICAgbC5jb3B5KHYpOwogICAgICB1LmNvcHkodik7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gbjsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXRWZXJ0ZXgoaSwgdik7CgogICAgICAgIGlmICh2LnggPCBsLngpIHsKICAgICAgICAgIGwueCA9IHYueDsKICAgICAgICB9IGVsc2UgaWYgKHYueCA+IHUueCkgewogICAgICAgICAgdS54ID0gdi54OwogICAgICAgIH0KCiAgICAgICAgaWYgKHYueSA8IGwueSkgewogICAgICAgICAgbC55ID0gdi55OwogICAgICAgIH0gZWxzZSBpZiAodi55ID4gdS55KSB7CiAgICAgICAgICB1LnkgPSB2Lnk7CiAgICAgICAgfQoKICAgICAgICBpZiAodi56IDwgbC56KSB7CiAgICAgICAgICBsLnogPSB2Lno7CiAgICAgICAgfSBlbHNlIGlmICh2LnogPiB1LnopIHsKICAgICAgICAgIHUueiA9IHYuejsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIHRoZSBgLmFhYmJgIHByb3BlcnR5CiAgICAgKi8KCgogICAgdXBkYXRlQUFCQigpIHsKICAgICAgdGhpcy5jb21wdXRlTG9jYWxBQUJCKHRoaXMuYWFiYik7CiAgICB9CiAgICAvKioKICAgICAqIFdpbGwgdXBkYXRlIHRoZSBgLmJvdW5kaW5nU3BoZXJlUmFkaXVzYCBwcm9wZXJ0eQogICAgICovCgoKICAgIHVwZGF0ZUJvdW5kaW5nU3BoZXJlUmFkaXVzKCkgewogICAgICAvLyBBc3N1bWUgcG9pbnRzIGFyZSBkaXN0cmlidXRlZCB3aXRoIGxvY2FsICgwLDAsMCkgYXMgY2VudGVyCiAgICAgIGxldCBtYXgyID0gMDsKICAgICAgY29uc3QgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzOwogICAgICBjb25zdCB2ID0gbmV3IFZlYzMoKTsKCiAgICAgIGZvciAobGV0IGkgPSAwLCBOID0gdmVydGljZXMubGVuZ3RoIC8gMzsgaSAhPT0gTjsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXRWZXJ0ZXgoaSwgdik7CiAgICAgICAgY29uc3Qgbm9ybTIgPSB2Lmxlbmd0aFNxdWFyZWQoKTsKCiAgICAgICAgaWYgKG5vcm0yID4gbWF4MikgewogICAgICAgICAgbWF4MiA9IG5vcm0yOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZVJhZGl1cyA9IE1hdGguc3FydChtYXgyKTsKICAgIH0KICAgIC8qKgogICAgICogY2FsY3VsYXRlV29ybGRBQUJCCiAgICAgKi8KCgogICAgY2FsY3VsYXRlV29ybGRBQUJCKHBvcywgcXVhdCwgbWluLCBtYXgpIHsKICAgICAgLyoKICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCAvIDMsCiAgICAgICAgICAgICAgdmVydHMgPSB0aGlzLnZlcnRpY2VzOwogICAgICAgICAgY29uc3QgbWlueCxtaW55LG1pbnosbWF4eCxtYXh5LG1heHo7CiAgICAgICAgICAgY29uc3QgdiA9IHRlbXBXb3JsZFZlcnRleDsKICAgICAgICAgIGZvcihsZXQgaT0wOyBpPG47IGkrKyl7CiAgICAgICAgICAgICAgdGhpcy5nZXRWZXJ0ZXgoaSwgdik7CiAgICAgICAgICAgICAgcXVhdC52bXVsdCh2LCB2KTsKICAgICAgICAgICAgICBwb3MudmFkZCh2LCB2KTsKICAgICAgICAgICAgICBpZiAodi54IDwgbWlueCB8fCBtaW54PT09dW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgbWlueCA9IHYueDsKICAgICAgICAgICAgICB9IGVsc2UgaWYodi54ID4gbWF4eCB8fCBtYXh4PT09dW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgbWF4eCA9IHYueDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGlmICh2LnkgPCBtaW55IHx8IG1pbnk9PT11bmRlZmluZWQpewogICAgICAgICAgICAgICAgICBtaW55ID0gdi55OwogICAgICAgICAgICAgIH0gZWxzZSBpZih2LnkgPiBtYXh5IHx8IG1heHk9PT11bmRlZmluZWQpewogICAgICAgICAgICAgICAgICBtYXh5ID0gdi55OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgKHYueiA8IG1pbnogfHwgbWluej09PXVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICAgIG1pbnogPSB2Lno7CiAgICAgICAgICAgICAgfSBlbHNlIGlmKHYueiA+IG1heHogfHwgbWF4ej09PXVuZGVmaW5lZCl7CiAgICAgICAgICAgICAgICAgIG1heHogPSB2Lno7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbWluLnNldChtaW54LG1pbnksbWlueik7CiAgICAgICAgICBtYXguc2V0KG1heHgsbWF4eSxtYXh6KTsKICAgICAgICAgICovCiAgICAgIC8vIEZhc3RlciBhcHByb3hpbWF0aW9uIHVzaW5nIGxvY2FsIEFBQkIKICAgICAgY29uc3QgZnJhbWUgPSBjYWxjdWxhdGVXb3JsZEFBQkJfZnJhbWU7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGN1bGF0ZVdvcmxkQUFCQl9hYWJiOwogICAgICBmcmFtZS5wb3NpdGlvbiA9IHBvczsKICAgICAgZnJhbWUucXVhdGVybmlvbiA9IHF1YXQ7CiAgICAgIHRoaXMuYWFiYi50b1dvcmxkRnJhbWUoZnJhbWUsIHJlc3VsdCk7CiAgICAgIG1pbi5jb3B5KHJlc3VsdC5sb3dlckJvdW5kKTsKICAgICAgbWF4LmNvcHkocmVzdWx0LnVwcGVyQm91bmQpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYXBwcm94aW1hdGUgdm9sdW1lCiAgICAgKi8KCgogICAgdm9sdW1lKCkgewogICAgICByZXR1cm4gNC4wICogTWF0aC5QSSAqIHRoaXMuYm91bmRpbmdTcGhlcmVSYWRpdXMgLyAzLjA7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZSBhIFRyaW1lc2ggaW5zdGFuY2UsIHNoYXBlZCBhcyBhIHRvcnVzLgogICAgICovCgoKICAgIHN0YXRpYyBjcmVhdGVUb3J1cyhyYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYykgewogICAgICBpZiAocmFkaXVzID09PSB2b2lkIDApIHsKICAgICAgICByYWRpdXMgPSAxOwogICAgICB9CgogICAgICBpZiAodHViZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgdHViZSA9IDAuNTsKICAgICAgfQoKICAgICAgaWYgKHJhZGlhbFNlZ21lbnRzID09PSB2b2lkIDApIHsKICAgICAgICByYWRpYWxTZWdtZW50cyA9IDg7CiAgICAgIH0KCiAgICAgIGlmICh0dWJ1bGFyU2VnbWVudHMgPT09IHZvaWQgMCkgewogICAgICAgIHR1YnVsYXJTZWdtZW50cyA9IDY7CiAgICAgIH0KCiAgICAgIGlmIChhcmMgPT09IHZvaWQgMCkgewogICAgICAgIGFyYyA9IE1hdGguUEkgKiAyOwogICAgICB9CgogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICBjb25zdCBpbmRpY2VzID0gW107CgogICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaisrKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogYXJjOwogICAgICAgICAgY29uc3QgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyOwogICAgICAgICAgY29uc3QgeCA9IChyYWRpdXMgKyB0dWJlICogTWF0aC5jb3ModikpICogTWF0aC5jb3ModSk7CiAgICAgICAgICBjb25zdCB5ID0gKHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyh2KSkgKiBNYXRoLnNpbih1KTsKICAgICAgICAgIGNvbnN0IHogPSB0dWJlICogTWF0aC5zaW4odik7CiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHgsIHksIHopOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yIChsZXQgaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGorKykgewogICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSsrKSB7CiAgICAgICAgICBjb25zdCBhID0gKHR1YnVsYXJTZWdtZW50cyArIDEpICogaiArIGkgLSAxOwogICAgICAgICAgY29uc3QgYiA9ICh0dWJ1bGFyU2VnbWVudHMgKyAxKSAqIChqIC0gMSkgKyBpIC0gMTsKICAgICAgICAgIGNvbnN0IGMgPSAodHVidWxhclNlZ21lbnRzICsgMSkgKiAoaiAtIDEpICsgaTsKICAgICAgICAgIGNvbnN0IGQgPSAodHVidWxhclNlZ21lbnRzICsgMSkgKiBqICsgaTsKICAgICAgICAgIGluZGljZXMucHVzaChhLCBiLCBkKTsKICAgICAgICAgIGluZGljZXMucHVzaChiLCBjLCBkKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJpbWVzaCh2ZXJ0aWNlcywgaW5kaWNlcyk7CiAgICB9CgogIH0KICBjb25zdCBjb21wdXRlTm9ybWFsc19uID0gbmV3IFZlYzMoKTsKICBjb25zdCB1bnNjYWxlZEFBQkIgPSBuZXcgQUFCQigpOwogIGNvbnN0IGdldEVkZ2VWZWN0b3JfdmEgPSBuZXcgVmVjMygpOwogIGNvbnN0IGdldEVkZ2VWZWN0b3JfdmIgPSBuZXcgVmVjMygpOwogIGNvbnN0IGNiID0gbmV3IFZlYzMoKTsKICBjb25zdCBhYiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgdmEgPSBuZXcgVmVjMygpOwogIGNvbnN0IHZiID0gbmV3IFZlYzMoKTsKICBjb25zdCB2YyA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY2xpX2FhYmIgPSBuZXcgQUFCQigpOwogIGNvbnN0IGNvbXB1dGVMb2NhbEFBQkJfd29ybGRWZXJ0ID0gbmV3IFZlYzMoKTsKICBjb25zdCBjYWxjdWxhdGVXb3JsZEFBQkJfZnJhbWUgPSBuZXcgVHJhbnNmb3JtKCk7CiAgY29uc3QgY2FsY3VsYXRlV29ybGRBQUJCX2FhYmIgPSBuZXcgQUFCQigpOwoKICAvKioKICAgKiBDb25zdHJhaW50IGVxdWF0aW9uIHNvbHZlciBiYXNlIGNsYXNzLgogICAqLwogIGNsYXNzIFNvbHZlciB7CiAgICAvKioKICAgICAqIEFsbCBlcXVhdGlvbnMgdG8gYmUgc29sdmVkCiAgICAgKi8KCiAgICAvKioKICAgICAqIEB0b2RvIHJlbW92ZSB1c2VsZXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLmVxdWF0aW9ucyA9IFtdOwogICAgfQogICAgLyoqCiAgICAgKiBTaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3NlcyEKICAgICAqIEB0b2RvIHVzZSBhYnN0cmFjdAogICAgICogQHJldHVybiBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXJmb3JtZWQKICAgICAqLwoKCiAgICBzb2x2ZShkdCwgd29ybGQpIHsKICAgICAgcmV0dXJuICgvLyBTaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBkb25lIQogICAgICAgIDAKICAgICAgKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGFuIGVxdWF0aW9uCiAgICAgKi8KCgogICAgYWRkRXF1YXRpb24oZXEpIHsKICAgICAgaWYgKGVxLmVuYWJsZWQgJiYgIWVxLmJpLmlzVHJpZ2dlciAmJiAhZXEuYmouaXNUcmlnZ2VyKSB7CiAgICAgICAgdGhpcy5lcXVhdGlvbnMucHVzaChlcSk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIGFuIGVxdWF0aW9uCiAgICAgKi8KCgogICAgcmVtb3ZlRXF1YXRpb24oZXEpIHsKICAgICAgY29uc3QgZXFzID0gdGhpcy5lcXVhdGlvbnM7CiAgICAgIGNvbnN0IGkgPSBlcXMuaW5kZXhPZihlcSk7CgogICAgICBpZiAoaSAhPT0gLTEpIHsKICAgICAgICBlcXMuc3BsaWNlKGksIDEpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhbGwgZXF1YXRpb25zCiAgICAgKi8KCgogICAgcmVtb3ZlQWxsRXF1YXRpb25zKCkgewogICAgICB0aGlzLmVxdWF0aW9ucy5sZW5ndGggPSAwOwogICAgfQoKICB9CgogIC8qKgogICAqIENvbnN0cmFpbnQgZXF1YXRpb24gR2F1c3MtU2VpZGVsIHNvbHZlci4KICAgKiBAdG9kbyBUaGUgc3Bvb2sgcGFyYW1ldGVycyBzaG91bGQgYmUgc3BlY2lmaWVkIGZvciBlYWNoIGNvbnN0cmFpbnQsIG5vdCBnbG9iYWxseS4KICAgKiBAc2VlIGh0dHBzOi8vd3d3OC5jcy51bXUuc2Uva3Vyc2VyLzVEVjA1OC9WVDA5L2xlY3R1cmVzL3Nwb29rbm90ZXMucGRmCiAgICovCiAgY2xhc3MgR1NTb2x2ZXIgZXh0ZW5kcyBTb2x2ZXIgewogICAgLyoqCiAgICAgKiBUaGUgbnVtYmVyIG9mIHNvbHZlciBpdGVyYXRpb25zIGRldGVybWluZXMgcXVhbGl0eSBvZiB0aGUgY29uc3RyYWludHMgaW4gdGhlIHdvcmxkLgogICAgICogVGhlIG1vcmUgaXRlcmF0aW9ucywgdGhlIG1vcmUgY29ycmVjdCBzaW11bGF0aW9uLiBNb3JlIGl0ZXJhdGlvbnMgbmVlZCBtb3JlIGNvbXB1dGF0aW9ucyB0aG91Z2guIElmIHlvdSBoYXZlIGEgbGFyZ2UgZ3Jhdml0eSBmb3JjZSBpbiB5b3VyIHdvcmxkLCB5b3Ugd2lsbCBuZWVkIG1vcmUgaXRlcmF0aW9ucy4KICAgICAqLwoKICAgIC8qKgogICAgICogV2hlbiB0b2xlcmFuY2UgaXMgcmVhY2hlZCwgdGhlIHN5c3RlbSBpcyBhc3N1bWVkIHRvIGJlIGNvbnZlcmdlZC4KICAgICAqLwoKICAgIC8qKgogICAgICogQHRvZG8gcmVtb3ZlIHVzZWxlc3MgY29uc3RydWN0b3IKICAgICAqLwogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXRlcmF0aW9ucyA9IDEwOwogICAgICB0aGlzLnRvbGVyYW5jZSA9IDFlLTc7CiAgICB9CiAgICAvKioKICAgICAqIFNvbHZlCiAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBpdGVyYXRpb25zIHBlcmZvcm1lZAogICAgICovCgoKICAgIHNvbHZlKGR0LCB3b3JsZCkgewogICAgICBsZXQgaXRlciA9IDA7CiAgICAgIGNvbnN0IG1heEl0ZXIgPSB0aGlzLml0ZXJhdGlvbnM7CiAgICAgIGNvbnN0IHRvbFNxdWFyZWQgPSB0aGlzLnRvbGVyYW5jZSAqIHRoaXMudG9sZXJhbmNlOwogICAgICBjb25zdCBlcXVhdGlvbnMgPSB0aGlzLmVxdWF0aW9uczsKICAgICAgY29uc3QgTmVxID0gZXF1YXRpb25zLmxlbmd0aDsKICAgICAgY29uc3QgYm9kaWVzID0gd29ybGQuYm9kaWVzOwogICAgICBjb25zdCBOYm9kaWVzID0gYm9kaWVzLmxlbmd0aDsKICAgICAgY29uc3QgaCA9IGR0OwogICAgICBsZXQgQjsKICAgICAgbGV0IGludkM7CiAgICAgIGxldCBkZWx0YWxhbWJkYTsKICAgICAgbGV0IGRlbHRhbGFtYmRhVG90OwogICAgICBsZXQgR1dsYW1iZGE7CiAgICAgIGxldCBsYW1iZGFqOyAvLyBVcGRhdGUgc29sdmUgbWFzcwoKICAgICAgaWYgKE5lcSAhPT0gMCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBOYm9kaWVzOyBpKyspIHsKICAgICAgICAgIGJvZGllc1tpXS51cGRhdGVTb2x2ZU1hc3NQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICB9IC8vIFRoaW5ncyB0aGF0IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIGl0ZXJhdGlvbiBjYW4gYmUgY29tcHV0ZWQgb25jZQoKCiAgICAgIGNvbnN0IGludkNzID0gR1NTb2x2ZXJfc29sdmVfaW52Q3M7CiAgICAgIGNvbnN0IEJzID0gR1NTb2x2ZXJfc29sdmVfQnM7CiAgICAgIGNvbnN0IGxhbWJkYSA9IEdTU29sdmVyX3NvbHZlX2xhbWJkYTsKICAgICAgaW52Q3MubGVuZ3RoID0gTmVxOwogICAgICBCcy5sZW5ndGggPSBOZXE7CiAgICAgIGxhbWJkYS5sZW5ndGggPSBOZXE7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gTmVxOyBpKyspIHsKICAgICAgICBjb25zdCBjID0gZXF1YXRpb25zW2ldOwogICAgICAgIGxhbWJkYVtpXSA9IDAuMDsKICAgICAgICBCc1tpXSA9IGMuY29tcHV0ZUIoaCk7CiAgICAgICAgaW52Q3NbaV0gPSAxLjAgLyBjLmNvbXB1dGVDKCk7CiAgICAgIH0KCiAgICAgIGlmIChOZXEgIT09IDApIHsKICAgICAgICAvLyBSZXNldCB2bGFtYmRhCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IE5ib2RpZXM7IGkrKykgewogICAgICAgICAgY29uc3QgYiA9IGJvZGllc1tpXTsKICAgICAgICAgIGNvbnN0IHZsYW1iZGEgPSBiLnZsYW1iZGE7CiAgICAgICAgICBjb25zdCB3bGFtYmRhID0gYi53bGFtYmRhOwogICAgICAgICAgdmxhbWJkYS5zZXQoMCwgMCwgMCk7CiAgICAgICAgICB3bGFtYmRhLnNldCgwLCAwLCAwKTsKICAgICAgICB9IC8vIEl0ZXJhdGUgb3ZlciBlcXVhdGlvbnMKCgogICAgICAgIGZvciAoaXRlciA9IDA7IGl0ZXIgIT09IG1heEl0ZXI7IGl0ZXIrKykgewogICAgICAgICAgLy8gQWNjdW11bGF0ZSB0aGUgdG90YWwgZXJyb3IgZm9yIGVhY2ggaXRlcmF0aW9uLgogICAgICAgICAgZGVsdGFsYW1iZGFUb3QgPSAwLjA7CgogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogIT09IE5lcTsgaisrKSB7CiAgICAgICAgICAgIGNvbnN0IGMgPSBlcXVhdGlvbnNbal07IC8vIENvbXB1dGUgaXRlcmF0aW9uCgogICAgICAgICAgICBCID0gQnNbal07CiAgICAgICAgICAgIGludkMgPSBpbnZDc1tqXTsKICAgICAgICAgICAgbGFtYmRhaiA9IGxhbWJkYVtqXTsKICAgICAgICAgICAgR1dsYW1iZGEgPSBjLmNvbXB1dGVHV2xhbWJkYSgpOwogICAgICAgICAgICBkZWx0YWxhbWJkYSA9IGludkMgKiAoQiAtIEdXbGFtYmRhIC0gYy5lcHMgKiBsYW1iZGFqKTsgLy8gQ2xhbXAgaWYgd2UgYXJlIG5vdCB3aXRoaW4gdGhlIG1pbi9tYXggaW50ZXJ2YWwKCiAgICAgICAgICAgIGlmIChsYW1iZGFqICsgZGVsdGFsYW1iZGEgPCBjLm1pbkZvcmNlKSB7CiAgICAgICAgICAgICAgZGVsdGFsYW1iZGEgPSBjLm1pbkZvcmNlIC0gbGFtYmRhajsKICAgICAgICAgICAgfSBlbHNlIGlmIChsYW1iZGFqICsgZGVsdGFsYW1iZGEgPiBjLm1heEZvcmNlKSB7CiAgICAgICAgICAgICAgZGVsdGFsYW1iZGEgPSBjLm1heEZvcmNlIC0gbGFtYmRhajsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGFtYmRhW2pdICs9IGRlbHRhbGFtYmRhOwogICAgICAgICAgICBkZWx0YWxhbWJkYVRvdCArPSBkZWx0YWxhbWJkYSA+IDAuMCA/IGRlbHRhbGFtYmRhIDogLWRlbHRhbGFtYmRhOyAvLyBhYnMoZGVsdGFsYW1iZGEpCgogICAgICAgICAgICBjLmFkZFRvV2xhbWJkYShkZWx0YWxhbWJkYSk7CiAgICAgICAgICB9IC8vIElmIHRoZSB0b3RhbCBlcnJvciBpcyBzbWFsbCBlbm91Z2ggLSBzdG9wIGl0ZXJhdGUKCgogICAgICAgICAgaWYgKGRlbHRhbGFtYmRhVG90ICogZGVsdGFsYW1iZGFUb3QgPCB0b2xTcXVhcmVkKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gLy8gQWRkIHJlc3VsdCB0byB2ZWxvY2l0eQoKCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IE5ib2RpZXM7IGkrKykgewogICAgICAgICAgY29uc3QgYiA9IGJvZGllc1tpXTsKICAgICAgICAgIGNvbnN0IHYgPSBiLnZlbG9jaXR5OwogICAgICAgICAgY29uc3QgdyA9IGIuYW5ndWxhclZlbG9jaXR5OwogICAgICAgICAgYi52bGFtYmRhLnZtdWwoYi5saW5lYXJGYWN0b3IsIGIudmxhbWJkYSk7CiAgICAgICAgICB2LnZhZGQoYi52bGFtYmRhLCB2KTsKICAgICAgICAgIGIud2xhbWJkYS52bXVsKGIuYW5ndWxhckZhY3RvciwgYi53bGFtYmRhKTsKICAgICAgICAgIHcudmFkZChiLndsYW1iZGEsIHcpOwogICAgICAgIH0gLy8gU2V0IHRoZSBgLm11bHRpcGxpZXJgIHByb3BlcnR5IG9mIGVhY2ggZXF1YXRpb24KCgogICAgICAgIGxldCBsID0gZXF1YXRpb25zLmxlbmd0aDsKICAgICAgICBjb25zdCBpbnZEdCA9IDEgLyBoOwoKICAgICAgICB3aGlsZSAobC0tKSB7CiAgICAgICAgICBlcXVhdGlvbnNbbF0ubXVsdGlwbGllciA9IGxhbWJkYVtsXSAqIGludkR0OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGl0ZXI7CiAgICB9CgogIH0gLy8gSnVzdCB0ZW1wb3JhcnkgbnVtYmVyIGhvbGRlcnMgdGhhdCB3ZSB3YW50IHRvIHJldXNlIGVhY2ggaXRlcmF0aW9uLgoKICBjb25zdCBHU1NvbHZlcl9zb2x2ZV9sYW1iZGEgPSBbXTsKICBjb25zdCBHU1NvbHZlcl9zb2x2ZV9pbnZDcyA9IFtdOwogIGNvbnN0IEdTU29sdmVyX3NvbHZlX0JzID0gW107CgogIC8qKgogICAqIFNwbGl0cyB0aGUgZXF1YXRpb25zIGludG8gaXNsYW5kcyBhbmQgc29sdmVzIHRoZW0gaW5kZXBlbmRlbnRseS4gQ2FuIGltcHJvdmUgcGVyZm9ybWFuY2UuCiAgICovCiAgY2xhc3MgU3BsaXRTb2x2ZXIgZXh0ZW5kcyBTb2x2ZXIgewogICAgLyoqCiAgICAgKiBUaGUgbnVtYmVyIG9mIHNvbHZlciBpdGVyYXRpb25zIGRldGVybWluZXMgcXVhbGl0eSBvZiB0aGUgY29uc3RyYWludHMgaW4gdGhlIHdvcmxkLiBUaGUgbW9yZSBpdGVyYXRpb25zLCB0aGUgbW9yZSBjb3JyZWN0IHNpbXVsYXRpb24uIE1vcmUgaXRlcmF0aW9ucyBuZWVkIG1vcmUgY29tcHV0YXRpb25zIHRob3VnaC4gSWYgeW91IGhhdmUgYSBsYXJnZSBncmF2aXR5IGZvcmNlIGluIHlvdXIgd29ybGQsIHlvdSB3aWxsIG5lZWQgbW9yZSBpdGVyYXRpb25zLgogICAgICovCgogICAgLyoqCiAgICAgKiBXaGVuIHRvbGVyYW5jZSBpcyByZWFjaGVkLCB0aGUgc3lzdGVtIGlzIGFzc3VtZWQgdG8gYmUgY29udmVyZ2VkLgogICAgICovCgogICAgLyoqIHN1YnNvbHZlciAqLwogICAgY29uc3RydWN0b3Ioc3Vic29sdmVyKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXRlcmF0aW9ucyA9IDEwOwogICAgICB0aGlzLnRvbGVyYW5jZSA9IDFlLTc7CiAgICAgIHRoaXMuc3Vic29sdmVyID0gc3Vic29sdmVyOwogICAgICB0aGlzLm5vZGVzID0gW107CiAgICAgIHRoaXMubm9kZVBvb2wgPSBbXTsgLy8gQ3JlYXRlIG5lZWRlZCBub2RlcywgcmV1c2UgaWYgcG9zc2libGUKCiAgICAgIHdoaWxlICh0aGlzLm5vZGVQb29sLmxlbmd0aCA8IDEyOCkgewogICAgICAgIHRoaXMubm9kZVBvb2wucHVzaCh0aGlzLmNyZWF0ZU5vZGUoKSk7CiAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogY3JlYXRlTm9kZQogICAgICovCgoKICAgIGNyZWF0ZU5vZGUoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYm9keTogbnVsbCwKICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgZXFzOiBbXSwKICAgICAgICB2aXNpdGVkOiBmYWxzZQogICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBTb2x2ZSB0aGUgc3Vic3lzdGVtcwogICAgICogQHJldHVybiBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXJmb3JtZWQKICAgICAqLwoKCiAgICBzb2x2ZShkdCwgd29ybGQpIHsKICAgICAgY29uc3Qgbm9kZXMgPSBTcGxpdFNvbHZlcl9zb2x2ZV9ub2RlczsKICAgICAgY29uc3Qgbm9kZVBvb2wgPSB0aGlzLm5vZGVQb29sOwogICAgICBjb25zdCBib2RpZXMgPSB3b3JsZC5ib2RpZXM7CiAgICAgIGNvbnN0IGVxdWF0aW9ucyA9IHRoaXMuZXF1YXRpb25zOwogICAgICBjb25zdCBOZXEgPSBlcXVhdGlvbnMubGVuZ3RoOwogICAgICBjb25zdCBOYm9kaWVzID0gYm9kaWVzLmxlbmd0aDsKICAgICAgY29uc3Qgc3Vic29sdmVyID0gdGhpcy5zdWJzb2x2ZXI7IC8vIENyZWF0ZSBuZWVkZWQgbm9kZXMsIHJldXNlIGlmIHBvc3NpYmxlCgogICAgICB3aGlsZSAobm9kZVBvb2wubGVuZ3RoIDwgTmJvZGllcykgewogICAgICAgIG5vZGVQb29sLnB1c2godGhpcy5jcmVhdGVOb2RlKCkpOwogICAgICB9CgogICAgICBub2Rlcy5sZW5ndGggPSBOYm9kaWVzOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOYm9kaWVzOyBpKyspIHsKICAgICAgICBub2Rlc1tpXSA9IG5vZGVQb29sW2ldOwogICAgICB9IC8vIFJlc2V0IG5vZGUgdmFsdWVzCgoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IE5ib2RpZXM7IGkrKykgewogICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTsKICAgICAgICBub2RlLmJvZHkgPSBib2RpZXNbaV07CiAgICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPSAwOwogICAgICAgIG5vZGUuZXFzLmxlbmd0aCA9IDA7CiAgICAgICAgbm9kZS52aXNpdGVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIGZvciAobGV0IGsgPSAwOyBrICE9PSBOZXE7IGsrKykgewogICAgICAgIGNvbnN0IGVxID0gZXF1YXRpb25zW2tdOwogICAgICAgIGNvbnN0IGkgPSBib2RpZXMuaW5kZXhPZihlcS5iaSk7CiAgICAgICAgY29uc3QgaiA9IGJvZGllcy5pbmRleE9mKGVxLmJqKTsKICAgICAgICBjb25zdCBuaSA9IG5vZGVzW2ldOwogICAgICAgIGNvbnN0IG5qID0gbm9kZXNbal07CiAgICAgICAgbmkuY2hpbGRyZW4ucHVzaChuaik7CiAgICAgICAgbmkuZXFzLnB1c2goZXEpOwogICAgICAgIG5qLmNoaWxkcmVuLnB1c2gobmkpOwogICAgICAgIG5qLmVxcy5wdXNoKGVxKTsKICAgICAgfQoKICAgICAgbGV0IGNoaWxkOwogICAgICBsZXQgbiA9IDA7CiAgICAgIGxldCBlcXMgPSBTcGxpdFNvbHZlcl9zb2x2ZV9lcXM7CiAgICAgIHN1YnNvbHZlci50b2xlcmFuY2UgPSB0aGlzLnRvbGVyYW5jZTsKICAgICAgc3Vic29sdmVyLml0ZXJhdGlvbnMgPSB0aGlzLml0ZXJhdGlvbnM7CiAgICAgIGNvbnN0IGR1bW15V29ybGQgPSBTcGxpdFNvbHZlcl9zb2x2ZV9kdW1teVdvcmxkOwoKICAgICAgd2hpbGUgKGNoaWxkID0gZ2V0VW52aXNpdGVkTm9kZShub2RlcykpIHsKICAgICAgICBlcXMubGVuZ3RoID0gMDsKICAgICAgICBkdW1teVdvcmxkLmJvZGllcy5sZW5ndGggPSAwOwogICAgICAgIGJmcyhjaGlsZCwgdmlzaXRGdW5jLCBkdW1teVdvcmxkLmJvZGllcywgZXFzKTsKICAgICAgICBjb25zdCBOZXFzID0gZXFzLmxlbmd0aDsKICAgICAgICBlcXMgPSBlcXMuc29ydChzb3J0QnlJZCk7CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBOZXFzOyBpKyspIHsKICAgICAgICAgIHN1YnNvbHZlci5hZGRFcXVhdGlvbihlcXNbaV0pOwogICAgICAgIH0KCiAgICAgICAgc3Vic29sdmVyLnNvbHZlKGR0LCBkdW1teVdvcmxkKTsKICAgICAgICBzdWJzb2x2ZXIucmVtb3ZlQWxsRXF1YXRpb25zKCk7CiAgICAgICAgbisrOwogICAgICB9CgogICAgICByZXR1cm4gbjsKICAgIH0KCiAgfSAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3Vic3lzdGVtcwoKICBjb25zdCBTcGxpdFNvbHZlcl9zb2x2ZV9ub2RlcyA9IFtdOyAvLyBBbGwgYWxsb2NhdGVkIG5vZGUgb2JqZWN0cwoKICBjb25zdCBTcGxpdFNvbHZlcl9zb2x2ZV9lcXMgPSBbXTsgLy8gVGVtcCBhcnJheQoKICBjb25zdCBTcGxpdFNvbHZlcl9zb2x2ZV9kdW1teVdvcmxkID0gewogICAgYm9kaWVzOiBbXQogIH07IC8vIFRlbXAgb2JqZWN0CgogIGNvbnN0IFNUQVRJQyA9IEJvZHkuU1RBVElDOwoKICBmdW5jdGlvbiBnZXRVbnZpc2l0ZWROb2RlKG5vZGVzKSB7CiAgICBjb25zdCBObm9kZXMgPSBub2Rlcy5sZW5ndGg7CgogICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IE5ub2RlczsgaSsrKSB7CiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tpXTsKCiAgICAgIGlmICghbm9kZS52aXNpdGVkICYmICEobm9kZS5ib2R5LnR5cGUgJiBTVEFUSUMpKSB7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBjb25zdCBxdWV1ZSA9IFtdOwoKICBmdW5jdGlvbiBiZnMocm9vdCwgdmlzaXRGdW5jLCBiZHMsIGVxcykgewogICAgcXVldWUucHVzaChyb290KTsKICAgIHJvb3QudmlzaXRlZCA9IHRydWU7CiAgICB2aXNpdEZ1bmMocm9vdCwgYmRzLCBlcXMpOwoKICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHsKICAgICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnBvcCgpOyAvLyBMb29wIG92ZXIgdW52aXNpdGVkIGNoaWxkIG5vZGVzCgogICAgICBsZXQgY2hpbGQ7CgogICAgICB3aGlsZSAoY2hpbGQgPSBnZXRVbnZpc2l0ZWROb2RlKG5vZGUuY2hpbGRyZW4pKSB7CiAgICAgICAgY2hpbGQudmlzaXRlZCA9IHRydWU7CiAgICAgICAgdmlzaXRGdW5jKGNoaWxkLCBiZHMsIGVxcyk7CiAgICAgICAgcXVldWUucHVzaChjaGlsZCk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHZpc2l0RnVuYyhub2RlLCBiZHMsIGVxcykgewogICAgYmRzLnB1c2gobm9kZS5ib2R5KTsKICAgIGNvbnN0IE5lcXMgPSBub2RlLmVxcy5sZW5ndGg7CgogICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IE5lcXM7IGkrKykgewogICAgICBjb25zdCBlcSA9IG5vZGUuZXFzW2ldOwoKICAgICAgaWYgKCFlcXMuaW5jbHVkZXMoZXEpKSB7CiAgICAgICAgZXFzLnB1c2goZXEpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzb3J0QnlJZChhLCBiKSB7CiAgICByZXR1cm4gYi5pZCAtIGEuaWQ7CiAgfQoKICAvKioKICAgKiBGb3IgcG9vbGluZyBvYmplY3RzIHRoYXQgY2FuIGJlIHJldXNlZC4KICAgKi8KICBjbGFzcyBQb29sIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLm9iamVjdHMgPSBbXTsKICAgICAgdGhpcy50eXBlID0gT2JqZWN0OwogICAgfQoKICAgIC8qKgogICAgICogUmVsZWFzZSBhbiBvYmplY3QgYWZ0ZXIgdXNlCiAgICAgKi8KICAgIHJlbGVhc2UoKSB7CiAgICAgIGNvbnN0IE5hcmdzID0gYXJndW1lbnRzLmxlbmd0aDsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBOYXJnczsgaSsrKSB7CiAgICAgICAgdGhpcy5vYmplY3RzLnB1c2goaSA8IDAgfHwgYXJndW1lbnRzLmxlbmd0aCA8PSBpID8gdW5kZWZpbmVkIDogYXJndW1lbnRzW2ldKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBhbiBvYmplY3QKICAgICAqLwoKCiAgICBnZXQoKSB7CiAgICAgIGlmICh0aGlzLm9iamVjdHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0T2JqZWN0KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0cy5wb3AoKTsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3QgYW4gb2JqZWN0LiBTaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gZWFjaCBzdWJjbGFzcy4KICAgICAqLwoKCiAgICBjb25zdHJ1Y3RPYmplY3QoKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignY29uc3RydWN0T2JqZWN0KCkgbm90IGltcGxlbWVudGVkIGluIHRoaXMgUG9vbCBzdWJjbGFzcyB5ZXQhJyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gU2VsZiwgZm9yIGNoYWluaW5nCiAgICAgKi8KCgogICAgcmVzaXplKHNpemUpIHsKICAgICAgY29uc3Qgb2JqZWN0cyA9IHRoaXMub2JqZWN0czsKCiAgICAgIHdoaWxlIChvYmplY3RzLmxlbmd0aCA+IHNpemUpIHsKICAgICAgICBvYmplY3RzLnBvcCgpOwogICAgICB9CgogICAgICB3aGlsZSAob2JqZWN0cy5sZW5ndGggPCBzaXplKSB7CiAgICAgICAgb2JqZWN0cy5wdXNoKHRoaXMuY29uc3RydWN0T2JqZWN0KCkpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgfQoKICAvKioKICAgKiBWZWMzUG9vbAogICAqLwoKICBjbGFzcyBWZWMzUG9vbCBleHRlbmRzIFBvb2wgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIHRoaXMudHlwZSA9IFZlYzM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3QgYSB2ZWN0b3IKICAgICAqLwogICAgY29uc3RydWN0T2JqZWN0KCkgewogICAgICByZXR1cm4gbmV3IFZlYzMoKTsKICAgIH0KCiAgfQoKICAvLyBOYW1pbmcgcnVsZTogYmFzZWQgb2YgdGhlIG9yZGVyIGluIFNIQVBFX1RZUEVTLAogIC8vIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBtZXRob2QgaXMgZm9ybWVkIGJ5IHRoZQogIC8vIHNoYXBlIHR5cGUgdGhhdCBjb21lcyBiZWZvcmUsIGluIHRoZSBzZWNvbmQgcGFydAogIC8vIHRoZXJlIGlzIHRoZSBzaGFwZSB0eXBlIHRoYXQgY29tZXMgYWZ0ZXIgaW4gdGhlIFNIQVBFX1RZUEVTIGxpc3QKICBjb25zdCBDT0xMSVNJT05fVFlQRVMgPSB7CiAgICBzcGhlcmVTcGhlcmU6IFNoYXBlLnR5cGVzLlNQSEVSRSwKICAgIHNwaGVyZVBsYW5lOiBTaGFwZS50eXBlcy5TUEhFUkUgfCBTaGFwZS50eXBlcy5QTEFORSwKICAgIGJveEJveDogU2hhcGUudHlwZXMuQk9YIHwgU2hhcGUudHlwZXMuQk9YLAogICAgc3BoZXJlQm94OiBTaGFwZS50eXBlcy5TUEhFUkUgfCBTaGFwZS50eXBlcy5CT1gsCiAgICBwbGFuZUJveDogU2hhcGUudHlwZXMuUExBTkUgfCBTaGFwZS50eXBlcy5CT1gsCiAgICBjb252ZXhDb252ZXg6IFNoYXBlLnR5cGVzLkNPTlZFWFBPTFlIRURST04sCiAgICBzcGhlcmVDb252ZXg6IFNoYXBlLnR5cGVzLlNQSEVSRSB8IFNoYXBlLnR5cGVzLkNPTlZFWFBPTFlIRURST04sCiAgICBwbGFuZUNvbnZleDogU2hhcGUudHlwZXMuUExBTkUgfCBTaGFwZS50eXBlcy5DT05WRVhQT0xZSEVEUk9OLAogICAgYm94Q29udmV4OiBTaGFwZS50eXBlcy5CT1ggfCBTaGFwZS50eXBlcy5DT05WRVhQT0xZSEVEUk9OLAogICAgc3BoZXJlSGVpZ2h0ZmllbGQ6IFNoYXBlLnR5cGVzLlNQSEVSRSB8IFNoYXBlLnR5cGVzLkhFSUdIVEZJRUxELAogICAgYm94SGVpZ2h0ZmllbGQ6IFNoYXBlLnR5cGVzLkJPWCB8IFNoYXBlLnR5cGVzLkhFSUdIVEZJRUxELAogICAgY29udmV4SGVpZ2h0ZmllbGQ6IFNoYXBlLnR5cGVzLkNPTlZFWFBPTFlIRURST04gfCBTaGFwZS50eXBlcy5IRUlHSFRGSUVMRCwKICAgIHNwaGVyZVBhcnRpY2xlOiBTaGFwZS50eXBlcy5QQVJUSUNMRSB8IFNoYXBlLnR5cGVzLlNQSEVSRSwKICAgIHBsYW5lUGFydGljbGU6IFNoYXBlLnR5cGVzLlBMQU5FIHwgU2hhcGUudHlwZXMuUEFSVElDTEUsCiAgICBib3hQYXJ0aWNsZTogU2hhcGUudHlwZXMuQk9YIHwgU2hhcGUudHlwZXMuUEFSVElDTEUsCiAgICBjb252ZXhQYXJ0aWNsZTogU2hhcGUudHlwZXMuUEFSVElDTEUgfCBTaGFwZS50eXBlcy5DT05WRVhQT0xZSEVEUk9OLAogICAgY3lsaW5kZXJDeWxpbmRlcjogU2hhcGUudHlwZXMuQ1lMSU5ERVIsCiAgICBzcGhlcmVDeWxpbmRlcjogU2hhcGUudHlwZXMuU1BIRVJFIHwgU2hhcGUudHlwZXMuQ1lMSU5ERVIsCiAgICBwbGFuZUN5bGluZGVyOiBTaGFwZS50eXBlcy5QTEFORSB8IFNoYXBlLnR5cGVzLkNZTElOREVSLAogICAgYm94Q3lsaW5kZXI6IFNoYXBlLnR5cGVzLkJPWCB8IFNoYXBlLnR5cGVzLkNZTElOREVSLAogICAgY29udmV4Q3lsaW5kZXI6IFNoYXBlLnR5cGVzLkNPTlZFWFBPTFlIRURST04gfCBTaGFwZS50eXBlcy5DWUxJTkRFUiwKICAgIGhlaWdodGZpZWxkQ3lsaW5kZXI6IFNoYXBlLnR5cGVzLkhFSUdIVEZJRUxEIHwgU2hhcGUudHlwZXMuQ1lMSU5ERVIsCiAgICBwYXJ0aWNsZUN5bGluZGVyOiBTaGFwZS50eXBlcy5QQVJUSUNMRSB8IFNoYXBlLnR5cGVzLkNZTElOREVSLAogICAgc3BoZXJlVHJpbWVzaDogU2hhcGUudHlwZXMuU1BIRVJFIHwgU2hhcGUudHlwZXMuVFJJTUVTSCwKICAgIHBsYW5lVHJpbWVzaDogU2hhcGUudHlwZXMuUExBTkUgfCBTaGFwZS50eXBlcy5UUklNRVNICiAgfTsKCiAgLyoqCiAgICogSGVscGVyIGNsYXNzIGZvciB0aGUgV29ybGQuIEdlbmVyYXRlcyBDb250YWN0RXF1YXRpb25zLgogICAqIEB0b2RvIFNwaGVyZS1Db252ZXhQb2x5aGVkcm9uIGNvbnRhY3RzCiAgICogQHRvZG8gQ29udGFjdCByZWR1Y3Rpb24KICAgKiBAdG9kbyBzaG91bGQgbW92ZSBtZXRob2RzIHRvIHByb3RvdHlwZQogICAqLwogIGNsYXNzIE5hcnJvd3BoYXNlIHsKICAgIC8qKgogICAgICogSW50ZXJuYWwgc3RvcmFnZSBvZiBwb29sZWQgY29udGFjdCBwb2ludHMuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFBvb2xlZCB2ZWN0b3JzLgogICAgICovCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5zcGhlcmVTcGhlcmVdKCkgewogICAgICByZXR1cm4gdGhpcy5zcGhlcmVTcGhlcmU7CiAgICB9CgogICAgZ2V0IFtDT0xMSVNJT05fVFlQRVMuc3BoZXJlUGxhbmVdKCkgewogICAgICByZXR1cm4gdGhpcy5zcGhlcmVQbGFuZTsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5ib3hCb3hdKCkgewogICAgICByZXR1cm4gdGhpcy5ib3hCb3g7CiAgICB9CgogICAgZ2V0IFtDT0xMSVNJT05fVFlQRVMuc3BoZXJlQm94XSgpIHsKICAgICAgcmV0dXJuIHRoaXMuc3BoZXJlQm94OwogICAgfQoKICAgIGdldCBbQ09MTElTSU9OX1RZUEVTLnBsYW5lQm94XSgpIHsKICAgICAgcmV0dXJuIHRoaXMucGxhbmVCb3g7CiAgICB9CgogICAgZ2V0IFtDT0xMSVNJT05fVFlQRVMuY29udmV4Q29udmV4XSgpIHsKICAgICAgcmV0dXJuIHRoaXMuY29udmV4Q29udmV4OwogICAgfQoKICAgIGdldCBbQ09MTElTSU9OX1RZUEVTLnNwaGVyZUNvbnZleF0oKSB7CiAgICAgIHJldHVybiB0aGlzLnNwaGVyZUNvbnZleDsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5wbGFuZUNvbnZleF0oKSB7CiAgICAgIHJldHVybiB0aGlzLnBsYW5lQ29udmV4OwogICAgfQoKICAgIGdldCBbQ09MTElTSU9OX1RZUEVTLmJveENvbnZleF0oKSB7CiAgICAgIHJldHVybiB0aGlzLmJveENvbnZleDsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5zcGhlcmVIZWlnaHRmaWVsZF0oKSB7CiAgICAgIHJldHVybiB0aGlzLnNwaGVyZUhlaWdodGZpZWxkOwogICAgfQoKICAgIGdldCBbQ09MTElTSU9OX1RZUEVTLmJveEhlaWdodGZpZWxkXSgpIHsKICAgICAgcmV0dXJuIHRoaXMuYm94SGVpZ2h0ZmllbGQ7CiAgICB9CgogICAgZ2V0IFtDT0xMSVNJT05fVFlQRVMuY29udmV4SGVpZ2h0ZmllbGRdKCkgewogICAgICByZXR1cm4gdGhpcy5jb252ZXhIZWlnaHRmaWVsZDsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5zcGhlcmVQYXJ0aWNsZV0oKSB7CiAgICAgIHJldHVybiB0aGlzLnNwaGVyZVBhcnRpY2xlOwogICAgfQoKICAgIGdldCBbQ09MTElTSU9OX1RZUEVTLnBsYW5lUGFydGljbGVdKCkgewogICAgICByZXR1cm4gdGhpcy5wbGFuZVBhcnRpY2xlOwogICAgfQoKICAgIGdldCBbQ09MTElTSU9OX1RZUEVTLmJveFBhcnRpY2xlXSgpIHsKICAgICAgcmV0dXJuIHRoaXMuYm94UGFydGljbGU7CiAgICB9CgogICAgZ2V0IFtDT0xMSVNJT05fVFlQRVMuY29udmV4UGFydGljbGVdKCkgewogICAgICByZXR1cm4gdGhpcy5jb252ZXhQYXJ0aWNsZTsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5jeWxpbmRlckN5bGluZGVyXSgpIHsKICAgICAgcmV0dXJuIHRoaXMuY29udmV4Q29udmV4OwogICAgfQoKICAgIGdldCBbQ09MTElTSU9OX1RZUEVTLnNwaGVyZUN5bGluZGVyXSgpIHsKICAgICAgcmV0dXJuIHRoaXMuc3BoZXJlQ29udmV4OwogICAgfQoKICAgIGdldCBbQ09MTElTSU9OX1RZUEVTLnBsYW5lQ3lsaW5kZXJdKCkgewogICAgICByZXR1cm4gdGhpcy5wbGFuZUNvbnZleDsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5ib3hDeWxpbmRlcl0oKSB7CiAgICAgIHJldHVybiB0aGlzLmJveENvbnZleDsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5jb252ZXhDeWxpbmRlcl0oKSB7CiAgICAgIHJldHVybiB0aGlzLmNvbnZleENvbnZleDsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5oZWlnaHRmaWVsZEN5bGluZGVyXSgpIHsKICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0ZmllbGRDeWxpbmRlcjsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5wYXJ0aWNsZUN5bGluZGVyXSgpIHsKICAgICAgcmV0dXJuIHRoaXMucGFydGljbGVDeWxpbmRlcjsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5zcGhlcmVUcmltZXNoXSgpIHsKICAgICAgcmV0dXJuIHRoaXMuc3BoZXJlVHJpbWVzaDsKICAgIH0KCiAgICBnZXQgW0NPTExJU0lPTl9UWVBFUy5wbGFuZVRyaW1lc2hdKCkgewogICAgICByZXR1cm4gdGhpcy5wbGFuZVRyaW1lc2g7CiAgICB9IC8vIGdldCBbQ09MTElTSU9OX1RZUEVTLmNvbnZleFRyaW1lc2hdKCkgewogICAgLy8gICByZXR1cm4gdGhpcy5jb252ZXhUcmltZXNoCiAgICAvLyB9CgoKICAgIGNvbnN0cnVjdG9yKHdvcmxkKSB7CiAgICAgIHRoaXMuY29udGFjdFBvaW50UG9vbCA9IFtdOwogICAgICB0aGlzLmZyaWN0aW9uRXF1YXRpb25Qb29sID0gW107CiAgICAgIHRoaXMucmVzdWx0ID0gW107CiAgICAgIHRoaXMuZnJpY3Rpb25SZXN1bHQgPSBbXTsKICAgICAgdGhpcy52M3Bvb2wgPSBuZXcgVmVjM1Bvb2woKTsKICAgICAgdGhpcy53b3JsZCA9IHdvcmxkOwogICAgICB0aGlzLmN1cnJlbnRDb250YWN0TWF0ZXJpYWwgPSB3b3JsZC5kZWZhdWx0Q29udGFjdE1hdGVyaWFsOwogICAgICB0aGlzLmVuYWJsZUZyaWN0aW9uUmVkdWN0aW9uID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIE1ha2UgYSBjb250YWN0IG9iamVjdCwgYnkgdXNpbmcgdGhlIGludGVybmFsIHBvb2wgb3IgY3JlYXRpbmcgYSBuZXcgb25lLgogICAgICovCgoKICAgIGNyZWF0ZUNvbnRhY3RFcXVhdGlvbihiaSwgYmosIHNpLCBzaiwgb3ZlcnJpZGVTaGFwZUEsIG92ZXJyaWRlU2hhcGVCKSB7CiAgICAgIGxldCBjOwoKICAgICAgaWYgKHRoaXMuY29udGFjdFBvaW50UG9vbC5sZW5ndGgpIHsKICAgICAgICBjID0gdGhpcy5jb250YWN0UG9pbnRQb29sLnBvcCgpOwogICAgICAgIGMuYmkgPSBiaTsKICAgICAgICBjLmJqID0gYmo7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYyA9IG5ldyBDb250YWN0RXF1YXRpb24oYmksIGJqKTsKICAgICAgfQoKICAgICAgYy5lbmFibGVkID0gYmkuY29sbGlzaW9uUmVzcG9uc2UgJiYgYmouY29sbGlzaW9uUmVzcG9uc2UgJiYgc2kuY29sbGlzaW9uUmVzcG9uc2UgJiYgc2ouY29sbGlzaW9uUmVzcG9uc2U7CiAgICAgIGNvbnN0IGNtID0gdGhpcy5jdXJyZW50Q29udGFjdE1hdGVyaWFsOwogICAgICBjLnJlc3RpdHV0aW9uID0gY20ucmVzdGl0dXRpb247CiAgICAgIGMuc2V0U3Bvb2tQYXJhbXMoY20uY29udGFjdEVxdWF0aW9uU3RpZmZuZXNzLCBjbS5jb250YWN0RXF1YXRpb25SZWxheGF0aW9uLCB0aGlzLndvcmxkLmR0KTsKICAgICAgY29uc3QgbWF0QSA9IHNpLm1hdGVyaWFsIHx8IGJpLm1hdGVyaWFsOwogICAgICBjb25zdCBtYXRCID0gc2oubWF0ZXJpYWwgfHwgYmoubWF0ZXJpYWw7CgogICAgICBpZiAobWF0QSAmJiBtYXRCICYmIG1hdEEucmVzdGl0dXRpb24gPj0gMCAmJiBtYXRCLnJlc3RpdHV0aW9uID49IDApIHsKICAgICAgICBjLnJlc3RpdHV0aW9uID0gbWF0QS5yZXN0aXR1dGlvbiAqIG1hdEIucmVzdGl0dXRpb247CiAgICAgIH0KCiAgICAgIGMuc2kgPSBvdmVycmlkZVNoYXBlQSB8fCBzaTsKICAgICAgYy5zaiA9IG92ZXJyaWRlU2hhcGVCIHx8IHNqOwogICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBjcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KGNvbnRhY3RFcXVhdGlvbiwgb3V0QXJyYXkpIHsKICAgICAgY29uc3QgYm9keUEgPSBjb250YWN0RXF1YXRpb24uYmk7CiAgICAgIGNvbnN0IGJvZHlCID0gY29udGFjdEVxdWF0aW9uLmJqOwogICAgICBjb25zdCBzaGFwZUEgPSBjb250YWN0RXF1YXRpb24uc2k7CiAgICAgIGNvbnN0IHNoYXBlQiA9IGNvbnRhY3RFcXVhdGlvbi5zajsKICAgICAgY29uc3Qgd29ybGQgPSB0aGlzLndvcmxkOwogICAgICBjb25zdCBjbSA9IHRoaXMuY3VycmVudENvbnRhY3RNYXRlcmlhbDsgLy8gSWYgZnJpY3Rpb24gb3IgcmVzdGl0dXRpb24gd2VyZSBzcGVjaWZpZWQgaW4gdGhlIG1hdGVyaWFsLCB1c2UgdGhlbQoKICAgICAgbGV0IGZyaWN0aW9uID0gY20uZnJpY3Rpb247CiAgICAgIGNvbnN0IG1hdEEgPSBzaGFwZUEubWF0ZXJpYWwgfHwgYm9keUEubWF0ZXJpYWw7CiAgICAgIGNvbnN0IG1hdEIgPSBzaGFwZUIubWF0ZXJpYWwgfHwgYm9keUIubWF0ZXJpYWw7CgogICAgICBpZiAobWF0QSAmJiBtYXRCICYmIG1hdEEuZnJpY3Rpb24gPj0gMCAmJiBtYXRCLmZyaWN0aW9uID49IDApIHsKICAgICAgICBmcmljdGlvbiA9IG1hdEEuZnJpY3Rpb24gKiBtYXRCLmZyaWN0aW9uOwogICAgICB9CgogICAgICBpZiAoZnJpY3Rpb24gPiAwKSB7CiAgICAgICAgLy8gQ3JlYXRlIDIgdGFuZ2VudCBlcXVhdGlvbnMKICAgICAgICBjb25zdCBtdWcgPSBmcmljdGlvbiAqIHdvcmxkLmdyYXZpdHkubGVuZ3RoKCk7CiAgICAgICAgbGV0IHJlZHVjZWRNYXNzID0gYm9keUEuaW52TWFzcyArIGJvZHlCLmludk1hc3M7CgogICAgICAgIGlmIChyZWR1Y2VkTWFzcyA+IDApIHsKICAgICAgICAgIHJlZHVjZWRNYXNzID0gMSAvIHJlZHVjZWRNYXNzOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgcG9vbCA9IHRoaXMuZnJpY3Rpb25FcXVhdGlvblBvb2w7CiAgICAgICAgY29uc3QgYzEgPSBwb29sLmxlbmd0aCA/IHBvb2wucG9wKCkgOiBuZXcgRnJpY3Rpb25FcXVhdGlvbihib2R5QSwgYm9keUIsIG11ZyAqIHJlZHVjZWRNYXNzKTsKICAgICAgICBjb25zdCBjMiA9IHBvb2wubGVuZ3RoID8gcG9vbC5wb3AoKSA6IG5ldyBGcmljdGlvbkVxdWF0aW9uKGJvZHlBLCBib2R5QiwgbXVnICogcmVkdWNlZE1hc3MpOwogICAgICAgIGMxLmJpID0gYzIuYmkgPSBib2R5QTsKICAgICAgICBjMS5iaiA9IGMyLmJqID0gYm9keUI7CiAgICAgICAgYzEubWluRm9yY2UgPSBjMi5taW5Gb3JjZSA9IC1tdWcgKiByZWR1Y2VkTWFzczsKICAgICAgICBjMS5tYXhGb3JjZSA9IGMyLm1heEZvcmNlID0gbXVnICogcmVkdWNlZE1hc3M7IC8vIENvcHkgb3ZlciB0aGUgcmVsYXRpdmUgdmVjdG9ycwoKICAgICAgICBjMS5yaS5jb3B5KGNvbnRhY3RFcXVhdGlvbi5yaSk7CiAgICAgICAgYzEucmouY29weShjb250YWN0RXF1YXRpb24ucmopOwogICAgICAgIGMyLnJpLmNvcHkoY29udGFjdEVxdWF0aW9uLnJpKTsKICAgICAgICBjMi5yai5jb3B5KGNvbnRhY3RFcXVhdGlvbi5yaik7IC8vIENvbnN0cnVjdCB0YW5nZW50cwoKICAgICAgICBjb250YWN0RXF1YXRpb24ubmkudGFuZ2VudHMoYzEudCwgYzIudCk7IC8vIFNldCBzcG9vayBwYXJhbXMKCiAgICAgICAgYzEuc2V0U3Bvb2tQYXJhbXMoY20uZnJpY3Rpb25FcXVhdGlvblN0aWZmbmVzcywgY20uZnJpY3Rpb25FcXVhdGlvblJlbGF4YXRpb24sIHdvcmxkLmR0KTsKICAgICAgICBjMi5zZXRTcG9va1BhcmFtcyhjbS5mcmljdGlvbkVxdWF0aW9uU3RpZmZuZXNzLCBjbS5mcmljdGlvbkVxdWF0aW9uUmVsYXhhdGlvbiwgd29ybGQuZHQpOwogICAgICAgIGMxLmVuYWJsZWQgPSBjMi5lbmFibGVkID0gY29udGFjdEVxdWF0aW9uLmVuYWJsZWQ7CiAgICAgICAgb3V0QXJyYXkucHVzaChjMSwgYzIpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIFRha2UgdGhlIGF2ZXJhZ2UgTiBsYXRlc3QgY29udGFjdCBwb2ludCBvbiB0aGUgcGxhbmUuCiAgICAgKi8KCgogICAgY3JlYXRlRnJpY3Rpb25Gcm9tQXZlcmFnZShudW1Db250YWN0cykgewogICAgICAvLyBUaGUgbGFzdCBjb250YWN0RXF1YXRpb24KICAgICAgbGV0IGMgPSB0aGlzLnJlc3VsdFt0aGlzLnJlc3VsdC5sZW5ndGggLSAxXTsgLy8gQ3JlYXRlIHRoZSByZXN1bHQ6IHR3byAiYXZlcmFnZSIgZnJpY3Rpb24gZXF1YXRpb25zCgogICAgICBpZiAoIXRoaXMuY3JlYXRlRnJpY3Rpb25FcXVhdGlvbnNGcm9tQ29udGFjdChjLCB0aGlzLmZyaWN0aW9uUmVzdWx0KSB8fCBudW1Db250YWN0cyA9PT0gMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgZjEgPSB0aGlzLmZyaWN0aW9uUmVzdWx0W3RoaXMuZnJpY3Rpb25SZXN1bHQubGVuZ3RoIC0gMl07CiAgICAgIGNvbnN0IGYyID0gdGhpcy5mcmljdGlvblJlc3VsdFt0aGlzLmZyaWN0aW9uUmVzdWx0Lmxlbmd0aCAtIDFdOwogICAgICBhdmVyYWdlTm9ybWFsLnNldFplcm8oKTsKICAgICAgYXZlcmFnZUNvbnRhY3RQb2ludEEuc2V0WmVybygpOwogICAgICBhdmVyYWdlQ29udGFjdFBvaW50Qi5zZXRaZXJvKCk7CiAgICAgIGNvbnN0IGJvZHlBID0gYy5iaTsKICAgICAgYy5iajsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBudW1Db250YWN0czsgaSsrKSB7CiAgICAgICAgYyA9IHRoaXMucmVzdWx0W3RoaXMucmVzdWx0Lmxlbmd0aCAtIDEgLSBpXTsKCiAgICAgICAgaWYgKGMuYmkgIT09IGJvZHlBKSB7CiAgICAgICAgICBhdmVyYWdlTm9ybWFsLnZhZGQoYy5uaSwgYXZlcmFnZU5vcm1hbCk7CiAgICAgICAgICBhdmVyYWdlQ29udGFjdFBvaW50QS52YWRkKGMucmksIGF2ZXJhZ2VDb250YWN0UG9pbnRBKTsKICAgICAgICAgIGF2ZXJhZ2VDb250YWN0UG9pbnRCLnZhZGQoYy5yaiwgYXZlcmFnZUNvbnRhY3RQb2ludEIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhdmVyYWdlTm9ybWFsLnZzdWIoYy5uaSwgYXZlcmFnZU5vcm1hbCk7CiAgICAgICAgICBhdmVyYWdlQ29udGFjdFBvaW50QS52YWRkKGMucmosIGF2ZXJhZ2VDb250YWN0UG9pbnRBKTsKICAgICAgICAgIGF2ZXJhZ2VDb250YWN0UG9pbnRCLnZhZGQoYy5yaSwgYXZlcmFnZUNvbnRhY3RQb2ludEIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgY29uc3QgaW52TnVtQ29udGFjdHMgPSAxIC8gbnVtQ29udGFjdHM7CiAgICAgIGF2ZXJhZ2VDb250YWN0UG9pbnRBLnNjYWxlKGludk51bUNvbnRhY3RzLCBmMS5yaSk7CiAgICAgIGF2ZXJhZ2VDb250YWN0UG9pbnRCLnNjYWxlKGludk51bUNvbnRhY3RzLCBmMS5yaik7CiAgICAgIGYyLnJpLmNvcHkoZjEucmkpOyAvLyBTaG91bGQgYmUgdGhlIHNhbWUKCiAgICAgIGYyLnJqLmNvcHkoZjEucmopOwogICAgICBhdmVyYWdlTm9ybWFsLm5vcm1hbGl6ZSgpOwogICAgICBhdmVyYWdlTm9ybWFsLnRhbmdlbnRzKGYxLnQsIGYyLnQpOyAvLyByZXR1cm4gZXE7CiAgICB9CiAgICAvKioKICAgICAqIEdlbmVyYXRlIGFsbCBjb250YWN0cyBiZXR3ZWVuIGEgbGlzdCBvZiBib2R5IHBhaXJzCiAgICAgKiBAcGFyYW0gcDEgQXJyYXkgb2YgYm9keSBpbmRpY2VzCiAgICAgKiBAcGFyYW0gcDIgQXJyYXkgb2YgYm9keSBpbmRpY2VzCiAgICAgKiBAcGFyYW0gcmVzdWx0IEFycmF5IHRvIHN0b3JlIGdlbmVyYXRlZCBjb250YWN0cwogICAgICogQHBhcmFtIG9sZGNvbnRhY3RzIE9wdGlvbmFsLiBBcnJheSBvZiByZXVzYWJsZSBjb250YWN0IG9iamVjdHMKICAgICAqLwoKCiAgICBnZXRDb250YWN0cyhwMSwgcDIsIHdvcmxkLCByZXN1bHQsIG9sZGNvbnRhY3RzLCBmcmljdGlvblJlc3VsdCwgZnJpY3Rpb25Qb29sKSB7CiAgICAgIC8vIFNhdmUgb2xkIGNvbnRhY3Qgb2JqZWN0cwogICAgICB0aGlzLmNvbnRhY3RQb2ludFBvb2wgPSBvbGRjb250YWN0czsKICAgICAgdGhpcy5mcmljdGlvbkVxdWF0aW9uUG9vbCA9IGZyaWN0aW9uUG9vbDsKICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgIHRoaXMuZnJpY3Rpb25SZXN1bHQgPSBmcmljdGlvblJlc3VsdDsKICAgICAgY29uc3QgcWkgPSB0bXBRdWF0MTsKICAgICAgY29uc3QgcWogPSB0bXBRdWF0MjsKICAgICAgY29uc3QgeGkgPSB0bXBWZWMxOwogICAgICBjb25zdCB4aiA9IHRtcFZlYzI7CgogICAgICBmb3IgKGxldCBrID0gMCwgTiA9IHAxLmxlbmd0aDsgayAhPT0gTjsgaysrKSB7CiAgICAgICAgLy8gR2V0IGN1cnJlbnQgY29sbGlzaW9uIGJvZGllcwogICAgICAgIGNvbnN0IGJpID0gcDFba107CiAgICAgICAgY29uc3QgYmogPSBwMltrXTsgLy8gR2V0IGNvbnRhY3QgbWF0ZXJpYWwKCiAgICAgICAgbGV0IGJvZHlDb250YWN0TWF0ZXJpYWwgPSBudWxsOwoKICAgICAgICBpZiAoYmkubWF0ZXJpYWwgJiYgYmoubWF0ZXJpYWwpIHsKICAgICAgICAgIGJvZHlDb250YWN0TWF0ZXJpYWwgPSB3b3JsZC5nZXRDb250YWN0TWF0ZXJpYWwoYmkubWF0ZXJpYWwsIGJqLm1hdGVyaWFsKSB8fCBudWxsOwogICAgICAgIH0KCiAgICAgICAgY29uc3QganVzdFRlc3QgPSBiaS50eXBlICYgQm9keS5LSU5FTUFUSUMgJiYgYmoudHlwZSAmIEJvZHkuU1RBVElDIHx8IGJpLnR5cGUgJiBCb2R5LlNUQVRJQyAmJiBiai50eXBlICYgQm9keS5LSU5FTUFUSUMgfHwgYmkudHlwZSAmIEJvZHkuS0lORU1BVElDICYmIGJqLnR5cGUgJiBCb2R5LktJTkVNQVRJQzsKCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaS5zaGFwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJpLnF1YXRlcm5pb24ubXVsdChiaS5zaGFwZU9yaWVudGF0aW9uc1tpXSwgcWkpOwogICAgICAgICAgYmkucXVhdGVybmlvbi52bXVsdChiaS5zaGFwZU9mZnNldHNbaV0sIHhpKTsKICAgICAgICAgIHhpLnZhZGQoYmkucG9zaXRpb24sIHhpKTsKICAgICAgICAgIGNvbnN0IHNpID0gYmkuc2hhcGVzW2ldOwoKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYmouc2hhcGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIC8vIENvbXB1dGUgd29ybGQgdHJhbnNmb3JtIG9mIHNoYXBlcwogICAgICAgICAgICBiai5xdWF0ZXJuaW9uLm11bHQoYmouc2hhcGVPcmllbnRhdGlvbnNbal0sIHFqKTsKICAgICAgICAgICAgYmoucXVhdGVybmlvbi52bXVsdChiai5zaGFwZU9mZnNldHNbal0sIHhqKTsKICAgICAgICAgICAgeGoudmFkZChiai5wb3NpdGlvbiwgeGopOwogICAgICAgICAgICBjb25zdCBzaiA9IGJqLnNoYXBlc1tqXTsKCiAgICAgICAgICAgIGlmICghKHNpLmNvbGxpc2lvbkZpbHRlck1hc2sgJiBzai5jb2xsaXNpb25GaWx0ZXJHcm91cCAmJiBzai5jb2xsaXNpb25GaWx0ZXJNYXNrICYgc2kuY29sbGlzaW9uRmlsdGVyR3JvdXApKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh4aS5kaXN0YW5jZVRvKHhqKSA+IHNpLmJvdW5kaW5nU3BoZXJlUmFkaXVzICsgc2ouYm91bmRpbmdTcGhlcmVSYWRpdXMpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSAvLyBHZXQgY29sbGlzaW9uIG1hdGVyaWFsCgoKICAgICAgICAgICAgbGV0IHNoYXBlQ29udGFjdE1hdGVyaWFsID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChzaS5tYXRlcmlhbCAmJiBzai5tYXRlcmlhbCkgewogICAgICAgICAgICAgIHNoYXBlQ29udGFjdE1hdGVyaWFsID0gd29ybGQuZ2V0Q29udGFjdE1hdGVyaWFsKHNpLm1hdGVyaWFsLCBzai5tYXRlcmlhbCkgfHwgbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29udGFjdE1hdGVyaWFsID0gc2hhcGVDb250YWN0TWF0ZXJpYWwgfHwgYm9keUNvbnRhY3RNYXRlcmlhbCB8fCB3b3JsZC5kZWZhdWx0Q29udGFjdE1hdGVyaWFsOyAvLyBHZXQgY29udGFjdHMKCiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVySW5kZXggPSBzaS50eXBlIHwgc2oudHlwZTsKICAgICAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzW3Jlc29sdmVySW5kZXhdOwoKICAgICAgICAgICAgaWYgKHJlc29sdmVyKSB7CiAgICAgICAgICAgICAgbGV0IHJldHZhbCA9IGZhbHNlOyAvLyBUTyBETzogaW52ZXN0aWdhdGUgd2h5IHNwaGVyZVBhcnRpY2xlIGFuZCBjb252ZXhQYXJ0aWNsZQogICAgICAgICAgICAgIC8vIHJlc29sdmVycyBleHBlY3Qgc2kgYW5kIHNqIHNoYXBlcyB0byBiZSBpbiByZXZlcnNlIG9yZGVyCiAgICAgICAgICAgICAgLy8gKGkuZS4gbGFyZ2VyIGludGVnZXIgdmFsdWUgdHlwZSBmaXJzdCBpbnN0ZWFkIG9mIHNtYWxsZXIgZmlyc3QpCgogICAgICAgICAgICAgIGlmIChzaS50eXBlIDwgc2oudHlwZSkgewogICAgICAgICAgICAgICAgcmV0dmFsID0gcmVzb2x2ZXIuY2FsbCh0aGlzLCBzaSwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHNpLCBzaiwganVzdFRlc3QpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR2YWwgPSByZXNvbHZlci5jYWxsKHRoaXMsIHNqLCBzaSwgeGosIHhpLCBxaiwgcWksIGJqLCBiaSwgc2ksIHNqLCBqdXN0VGVzdCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAocmV0dmFsICYmIGp1c3RUZXN0KSB7CiAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBvdmVybGFwCiAgICAgICAgICAgICAgICB3b3JsZC5zaGFwZU92ZXJsYXBLZWVwZXIuc2V0KHNpLmlkLCBzai5pZCk7CiAgICAgICAgICAgICAgICB3b3JsZC5ib2R5T3ZlcmxhcEtlZXBlci5zZXQoYmkuaWQsIGJqLmlkKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBzcGhlcmVTcGhlcmUoc2ksIHNqLCB4aSwgeGosIHFpLCBxaiwgYmksIGJqLCByc2ksIHJzaiwganVzdFRlc3QpIHsKICAgICAgaWYgKGp1c3RUZXN0KSB7CiAgICAgICAgcmV0dXJuIHhpLmRpc3RhbmNlU3F1YXJlZCh4aikgPCAoc2kucmFkaXVzICsgc2oucmFkaXVzKSAqKiAyOwogICAgICB9IC8vIFdlIHdpbGwgaGF2ZSBvbmx5IG9uZSBjb250YWN0IGluIHRoaXMgY2FzZQoKCiAgICAgIGNvbnN0IGNvbnRhY3RFcSA9IHRoaXMuY3JlYXRlQ29udGFjdEVxdWF0aW9uKGJpLCBiaiwgc2ksIHNqLCByc2ksIHJzaik7IC8vIENvbnRhY3Qgbm9ybWFsCgogICAgICB4ai52c3ViKHhpLCBjb250YWN0RXEubmkpOwogICAgICBjb250YWN0RXEubmkubm9ybWFsaXplKCk7IC8vIENvbnRhY3QgcG9pbnQgbG9jYXRpb25zCgogICAgICBjb250YWN0RXEucmkuY29weShjb250YWN0RXEubmkpOwogICAgICBjb250YWN0RXEucmouY29weShjb250YWN0RXEubmkpOwogICAgICBjb250YWN0RXEucmkuc2NhbGUoc2kucmFkaXVzLCBjb250YWN0RXEucmkpOwogICAgICBjb250YWN0RXEucmouc2NhbGUoLXNqLnJhZGl1cywgY29udGFjdEVxLnJqKTsKICAgICAgY29udGFjdEVxLnJpLnZhZGQoeGksIGNvbnRhY3RFcS5yaSk7CiAgICAgIGNvbnRhY3RFcS5yaS52c3ViKGJpLnBvc2l0aW9uLCBjb250YWN0RXEucmkpOwogICAgICBjb250YWN0RXEucmoudmFkZCh4aiwgY29udGFjdEVxLnJqKTsKICAgICAgY29udGFjdEVxLnJqLnZzdWIoYmoucG9zaXRpb24sIGNvbnRhY3RFcS5yaik7CiAgICAgIHRoaXMucmVzdWx0LnB1c2goY29udGFjdEVxKTsKICAgICAgdGhpcy5jcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KGNvbnRhY3RFcSwgdGhpcy5mcmljdGlvblJlc3VsdCk7CiAgICB9CgogICAgc3BoZXJlUGxhbmUoc2ksIHNqLCB4aSwgeGosIHFpLCBxaiwgYmksIGJqLCByc2ksIHJzaiwganVzdFRlc3QpIHsKICAgICAgLy8gV2Ugd2lsbCBoYXZlIG9uZSBjb250YWN0IGluIHRoaXMgY2FzZQogICAgICBjb25zdCByID0gdGhpcy5jcmVhdGVDb250YWN0RXF1YXRpb24oYmksIGJqLCBzaSwgc2osIHJzaSwgcnNqKTsgLy8gQ29udGFjdCBub3JtYWwKCiAgICAgIHIubmkuc2V0KDAsIDAsIDEpOwogICAgICBxai52bXVsdChyLm5pLCByLm5pKTsKICAgICAgci5uaS5uZWdhdGUoci5uaSk7IC8vIGJvZHkgaSBpcyB0aGUgc3BoZXJlLCBmbGlwIG5vcm1hbAoKICAgICAgci5uaS5ub3JtYWxpemUoKTsgLy8gTmVlZGVkPwogICAgICAvLyBWZWN0b3IgZnJvbSBzcGhlcmUgY2VudGVyIHRvIGNvbnRhY3QgcG9pbnQKCiAgICAgIHIubmkuc2NhbGUoc2kucmFkaXVzLCByLnJpKTsgLy8gUHJvamVjdCBkb3duIHNwaGVyZSBvbiBwbGFuZQoKICAgICAgeGkudnN1Yih4aiwgcG9pbnRfb25fcGxhbmVfdG9fc3BoZXJlKTsKICAgICAgci5uaS5zY2FsZShyLm5pLmRvdChwb2ludF9vbl9wbGFuZV90b19zcGhlcmUpLCBwbGFuZV90b19zcGhlcmVfb3J0aG8pOwogICAgICBwb2ludF9vbl9wbGFuZV90b19zcGhlcmUudnN1YihwbGFuZV90b19zcGhlcmVfb3J0aG8sIHIucmopOyAvLyBUaGUgc3BoZXJlIHBvc2l0aW9uIHByb2plY3RlZCB0byBwbGFuZQoKICAgICAgaWYgKC1wb2ludF9vbl9wbGFuZV90b19zcGhlcmUuZG90KHIubmkpIDw9IHNpLnJhZGl1cykgewogICAgICAgIGlmIChqdXN0VGVzdCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSAvLyBNYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBib2R5CgoKICAgICAgICBjb25zdCByaSA9IHIucmk7CiAgICAgICAgY29uc3QgcmogPSByLnJqOwogICAgICAgIHJpLnZhZGQoeGksIHJpKTsKICAgICAgICByaS52c3ViKGJpLnBvc2l0aW9uLCByaSk7CiAgICAgICAgcmoudmFkZCh4aiwgcmopOwogICAgICAgIHJqLnZzdWIoYmoucG9zaXRpb24sIHJqKTsKICAgICAgICB0aGlzLnJlc3VsdC5wdXNoKHIpOwogICAgICAgIHRoaXMuY3JlYXRlRnJpY3Rpb25FcXVhdGlvbnNGcm9tQ29udGFjdChyLCB0aGlzLmZyaWN0aW9uUmVzdWx0KTsKICAgICAgfQogICAgfQoKICAgIGJveEJveChzaSwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHJzaSwgcnNqLCBqdXN0VGVzdCkgewogICAgICBzaS5jb252ZXhQb2x5aGVkcm9uUmVwcmVzZW50YXRpb24ubWF0ZXJpYWwgPSBzaS5tYXRlcmlhbDsKICAgICAgc2ouY29udmV4UG9seWhlZHJvblJlcHJlc2VudGF0aW9uLm1hdGVyaWFsID0gc2oubWF0ZXJpYWw7CiAgICAgIHNpLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbi5jb2xsaXNpb25SZXNwb25zZSA9IHNpLmNvbGxpc2lvblJlc3BvbnNlOwogICAgICBzai5jb252ZXhQb2x5aGVkcm9uUmVwcmVzZW50YXRpb24uY29sbGlzaW9uUmVzcG9uc2UgPSBzai5jb2xsaXNpb25SZXNwb25zZTsKICAgICAgcmV0dXJuIHRoaXMuY29udmV4Q29udmV4KHNpLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbiwgc2ouY29udmV4UG9seWhlZHJvblJlcHJlc2VudGF0aW9uLCB4aSwgeGosIHFpLCBxaiwgYmksIGJqLCBzaSwgc2osIGp1c3RUZXN0KTsKICAgIH0KCiAgICBzcGhlcmVCb3goc2ksIHNqLCB4aSwgeGosIHFpLCBxaiwgYmksIGJqLCByc2ksIHJzaiwganVzdFRlc3QpIHsKICAgICAgY29uc3QgdjNwb29sID0gdGhpcy52M3Bvb2w7IC8vIHdlIHJlZmVyIHRvIHRoZSBib3ggYXMgYm9keSBqCgogICAgICBjb25zdCBzaWRlcyA9IHNwaGVyZUJveF9zaWRlczsKICAgICAgeGkudnN1Yih4aiwgYm94X3RvX3NwaGVyZSk7CiAgICAgIHNqLmdldFNpZGVOb3JtYWxzKHNpZGVzLCBxaik7CiAgICAgIGNvbnN0IFIgPSBzaS5yYWRpdXM7CgogICAgICBsZXQgZm91bmQgPSBmYWxzZTsgLy8gU3RvcmUgdGhlIHJlc3VsdGluZyBzaWRlIHBlbmV0cmF0aW9uIGluZm8KCiAgICAgIGNvbnN0IHNpZGVfbnMgPSBzcGhlcmVCb3hfc2lkZV9uczsKICAgICAgY29uc3Qgc2lkZV9uczEgPSBzcGhlcmVCb3hfc2lkZV9uczE7CiAgICAgIGNvbnN0IHNpZGVfbnMyID0gc3BoZXJlQm94X3NpZGVfbnMyOwogICAgICBsZXQgc2lkZV9oID0gbnVsbDsKICAgICAgbGV0IHNpZGVfcGVuZXRyYXRpb25zID0gMDsKICAgICAgbGV0IHNpZGVfZG90MSA9IDA7CiAgICAgIGxldCBzaWRlX2RvdDIgPSAwOwogICAgICBsZXQgc2lkZV9kaXN0YW5jZSA9IG51bGw7CgogICAgICBmb3IgKGxldCBpZHggPSAwLCBuc2lkZXMgPSBzaWRlcy5sZW5ndGg7IGlkeCAhPT0gbnNpZGVzICYmIGZvdW5kID09PSBmYWxzZTsgaWR4KyspIHsKICAgICAgICAvLyBHZXQgdGhlIHBsYW5lIHNpZGUgbm9ybWFsIChucykKICAgICAgICBjb25zdCBucyA9IHNwaGVyZUJveF9uczsKICAgICAgICBucy5jb3B5KHNpZGVzW2lkeF0pOwogICAgICAgIGNvbnN0IGggPSBucy5sZW5ndGgoKTsKICAgICAgICBucy5ub3JtYWxpemUoKTsgLy8gVGhlIG5vcm1hbC9kaXN0YW5jZSBkb3QgcHJvZHVjdCB0ZWxscyB3aGljaCBzaWRlIG9mIHRoZSBwbGFuZSB3ZSBhcmUKCiAgICAgICAgY29uc3QgZG90ID0gYm94X3RvX3NwaGVyZS5kb3QobnMpOwoKICAgICAgICBpZiAoZG90IDwgaCArIFIgJiYgZG90ID4gMCkgewogICAgICAgICAgLy8gSW50ZXJzZWN0cyBwbGFuZS4gTm93IGNoZWNrIHRoZSBvdGhlciB0d28gZGltZW5zaW9ucwogICAgICAgICAgY29uc3QgbnMxID0gc3BoZXJlQm94X25zMTsKICAgICAgICAgIGNvbnN0IG5zMiA9IHNwaGVyZUJveF9uczI7CiAgICAgICAgICBuczEuY29weShzaWRlc1soaWR4ICsgMSkgJSAzXSk7CiAgICAgICAgICBuczIuY29weShzaWRlc1soaWR4ICsgMikgJSAzXSk7CiAgICAgICAgICBjb25zdCBoMSA9IG5zMS5sZW5ndGgoKTsKICAgICAgICAgIGNvbnN0IGgyID0gbnMyLmxlbmd0aCgpOwogICAgICAgICAgbnMxLm5vcm1hbGl6ZSgpOwogICAgICAgICAgbnMyLm5vcm1hbGl6ZSgpOwogICAgICAgICAgY29uc3QgZG90MSA9IGJveF90b19zcGhlcmUuZG90KG5zMSk7CiAgICAgICAgICBjb25zdCBkb3QyID0gYm94X3RvX3NwaGVyZS5kb3QobnMyKTsKCiAgICAgICAgICBpZiAoZG90MSA8IGgxICYmIGRvdDEgPiAtaDEgJiYgZG90MiA8IGgyICYmIGRvdDIgPiAtaDIpIHsKICAgICAgICAgICAgY29uc3QgZGlzdCA9IE1hdGguYWJzKGRvdCAtIGggLSBSKTsKCiAgICAgICAgICAgIGlmIChzaWRlX2Rpc3RhbmNlID09PSBudWxsIHx8IGRpc3QgPCBzaWRlX2Rpc3RhbmNlKSB7CiAgICAgICAgICAgICAgc2lkZV9kaXN0YW5jZSA9IGRpc3Q7CiAgICAgICAgICAgICAgc2lkZV9kb3QxID0gZG90MTsKICAgICAgICAgICAgICBzaWRlX2RvdDIgPSBkb3QyOwogICAgICAgICAgICAgIHNpZGVfaCA9IGg7CiAgICAgICAgICAgICAgc2lkZV9ucy5jb3B5KG5zKTsKICAgICAgICAgICAgICBzaWRlX25zMS5jb3B5KG5zMSk7CiAgICAgICAgICAgICAgc2lkZV9uczIuY29weShuczIpOwogICAgICAgICAgICAgIHNpZGVfcGVuZXRyYXRpb25zKys7CgogICAgICAgICAgICAgIGlmIChqdXN0VGVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoc2lkZV9wZW5ldHJhdGlvbnMpIHsKICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgY29uc3QgciA9IHRoaXMuY3JlYXRlQ29udGFjdEVxdWF0aW9uKGJpLCBiaiwgc2ksIHNqLCByc2ksIHJzaik7CiAgICAgICAgc2lkZV9ucy5zY2FsZSgtUiwgci5yaSk7IC8vIFNwaGVyZSByCgogICAgICAgIHIubmkuY29weShzaWRlX25zKTsKICAgICAgICByLm5pLm5lZ2F0ZShyLm5pKTsgLy8gTm9ybWFsIHNob3VsZCBiZSBvdXQgb2Ygc3BoZXJlCgogICAgICAgIHNpZGVfbnMuc2NhbGUoc2lkZV9oLCBzaWRlX25zKTsKICAgICAgICBzaWRlX25zMS5zY2FsZShzaWRlX2RvdDEsIHNpZGVfbnMxKTsKICAgICAgICBzaWRlX25zLnZhZGQoc2lkZV9uczEsIHNpZGVfbnMpOwogICAgICAgIHNpZGVfbnMyLnNjYWxlKHNpZGVfZG90Miwgc2lkZV9uczIpOwogICAgICAgIHNpZGVfbnMudmFkZChzaWRlX25zMiwgci5yaik7IC8vIE1ha2UgcmVsYXRpdmUgdG8gYm9kaWVzCgogICAgICAgIHIucmkudmFkZCh4aSwgci5yaSk7CiAgICAgICAgci5yaS52c3ViKGJpLnBvc2l0aW9uLCByLnJpKTsKICAgICAgICByLnJqLnZhZGQoeGosIHIucmopOwogICAgICAgIHIucmoudnN1Yihiai5wb3NpdGlvbiwgci5yaik7CiAgICAgICAgdGhpcy5yZXN1bHQucHVzaChyKTsKICAgICAgICB0aGlzLmNyZWF0ZUZyaWN0aW9uRXF1YXRpb25zRnJvbUNvbnRhY3QociwgdGhpcy5mcmljdGlvblJlc3VsdCk7CiAgICAgIH0gLy8gQ2hlY2sgY29ybmVycwoKCiAgICAgIGxldCByaiA9IHYzcG9vbC5nZXQoKTsKICAgICAgY29uc3Qgc3BoZXJlX3RvX2Nvcm5lciA9IHNwaGVyZUJveF9zcGhlcmVfdG9fY29ybmVyOwoKICAgICAgZm9yIChsZXQgaiA9IDA7IGogIT09IDIgJiYgIWZvdW5kOyBqKyspIHsKICAgICAgICBmb3IgKGxldCBrID0gMDsgayAhPT0gMiAmJiAhZm91bmQ7IGsrKykgewogICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgIT09IDIgJiYgIWZvdW5kOyBsKyspIHsKICAgICAgICAgICAgcmouc2V0KDAsIDAsIDApOwoKICAgICAgICAgICAgaWYgKGopIHsKICAgICAgICAgICAgICByai52YWRkKHNpZGVzWzBdLCByaik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmoudnN1YihzaWRlc1swXSwgcmopOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaykgewogICAgICAgICAgICAgIHJqLnZhZGQoc2lkZXNbMV0sIHJqKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByai52c3ViKHNpZGVzWzFdLCByaik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsKSB7CiAgICAgICAgICAgICAgcmoudmFkZChzaWRlc1syXSwgcmopOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJqLnZzdWIoc2lkZXNbMl0sIHJqKTsKICAgICAgICAgICAgfSAvLyBXb3JsZCBwb3NpdGlvbiBvZiBjb3JuZXIKCgogICAgICAgICAgICB4ai52YWRkKHJqLCBzcGhlcmVfdG9fY29ybmVyKTsKICAgICAgICAgICAgc3BoZXJlX3RvX2Nvcm5lci52c3ViKHhpLCBzcGhlcmVfdG9fY29ybmVyKTsKCiAgICAgICAgICAgIGlmIChzcGhlcmVfdG9fY29ybmVyLmxlbmd0aFNxdWFyZWQoKSA8IFIgKiBSKSB7CiAgICAgICAgICAgICAgaWYgKGp1c3RUZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5jcmVhdGVDb250YWN0RXF1YXRpb24oYmksIGJqLCBzaSwgc2osIHJzaSwgcnNqKTsKICAgICAgICAgICAgICByLnJpLmNvcHkoc3BoZXJlX3RvX2Nvcm5lcik7CiAgICAgICAgICAgICAgci5yaS5ub3JtYWxpemUoKTsKICAgICAgICAgICAgICByLm5pLmNvcHkoci5yaSk7CiAgICAgICAgICAgICAgci5yaS5zY2FsZShSLCByLnJpKTsKICAgICAgICAgICAgICByLnJqLmNvcHkocmopOyAvLyBNYWtlIHJlbGF0aXZlIHRvIGJvZGllcwoKICAgICAgICAgICAgICByLnJpLnZhZGQoeGksIHIucmkpOwogICAgICAgICAgICAgIHIucmkudnN1YihiaS5wb3NpdGlvbiwgci5yaSk7CiAgICAgICAgICAgICAgci5yai52YWRkKHhqLCByLnJqKTsKICAgICAgICAgICAgICByLnJqLnZzdWIoYmoucG9zaXRpb24sIHIucmopOwogICAgICAgICAgICAgIHRoaXMucmVzdWx0LnB1c2gocik7CiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KHIsIHRoaXMuZnJpY3Rpb25SZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB2M3Bvb2wucmVsZWFzZShyaik7CiAgICAgIHJqID0gbnVsbDsgLy8gQ2hlY2sgZWRnZXMKCiAgICAgIGNvbnN0IGVkZ2VUYW5nZW50ID0gdjNwb29sLmdldCgpOwogICAgICBjb25zdCBlZGdlQ2VudGVyID0gdjNwb29sLmdldCgpOwogICAgICBjb25zdCByID0gdjNwb29sLmdldCgpOyAvLyByID0gZWRnZSBjZW50ZXIgdG8gc3BoZXJlIGNlbnRlcgoKICAgICAgY29uc3Qgb3J0aG9nb25hbCA9IHYzcG9vbC5nZXQoKTsKICAgICAgY29uc3QgZGlzdCA9IHYzcG9vbC5nZXQoKTsKICAgICAgY29uc3QgTnNpZGVzID0gc2lkZXMubGVuZ3RoOwoKICAgICAgZm9yIChsZXQgaiA9IDA7IGogIT09IE5zaWRlcyAmJiAhZm91bmQ7IGorKykgewogICAgICAgIGZvciAobGV0IGsgPSAwOyBrICE9PSBOc2lkZXMgJiYgIWZvdW5kOyBrKyspIHsKICAgICAgICAgIGlmIChqICUgMyAhPT0gayAlIDMpIHsKICAgICAgICAgICAgLy8gR2V0IGVkZ2UgdGFuZ2VudAogICAgICAgICAgICBzaWRlc1trXS5jcm9zcyhzaWRlc1tqXSwgZWRnZVRhbmdlbnQpOwogICAgICAgICAgICBlZGdlVGFuZ2VudC5ub3JtYWxpemUoKTsKICAgICAgICAgICAgc2lkZXNbal0udmFkZChzaWRlc1trXSwgZWRnZUNlbnRlcik7CiAgICAgICAgICAgIHIuY29weSh4aSk7CiAgICAgICAgICAgIHIudnN1YihlZGdlQ2VudGVyLCByKTsKICAgICAgICAgICAgci52c3ViKHhqLCByKTsKICAgICAgICAgICAgY29uc3Qgb3J0aG9ub3JtID0gci5kb3QoZWRnZVRhbmdlbnQpOyAvLyBkaXN0YW5jZSBmcm9tIGVkZ2UgY2VudGVyIHRvIHNwaGVyZSBjZW50ZXIgaW4gdGhlIHRhbmdlbnQgZGlyZWN0aW9uCgogICAgICAgICAgICBlZGdlVGFuZ2VudC5zY2FsZShvcnRob25vcm0sIG9ydGhvZ29uYWwpOyAvLyBWZWN0b3IgZnJvbSBlZGdlIGNlbnRlciB0byBzcGhlcmUgY2VudGVyIGluIHRoZSB0YW5nZW50IGRpcmVjdGlvbgogICAgICAgICAgICAvLyBGaW5kIHRoZSB0aGlyZCBzaWRlIG9ydGhvZ29uYWwgdG8gdGhpcyBvbmUKCiAgICAgICAgICAgIGxldCBsID0gMDsKCiAgICAgICAgICAgIHdoaWxlIChsID09PSBqICUgMyB8fCBsID09PSBrICUgMykgewogICAgICAgICAgICAgIGwrKzsKICAgICAgICAgICAgfSAvLyB2ZWMgZnJvbSBlZGdlIGNlbnRlciB0byBzcGhlcmUgcHJvamVjdGVkIHRvIHRoZSBwbGFuZSBvcnRob2dvbmFsIHRvIHRoZSBlZGdlIHRhbmdlbnQKCgogICAgICAgICAgICBkaXN0LmNvcHkoeGkpOwogICAgICAgICAgICBkaXN0LnZzdWIob3J0aG9nb25hbCwgZGlzdCk7CiAgICAgICAgICAgIGRpc3QudnN1YihlZGdlQ2VudGVyLCBkaXN0KTsKICAgICAgICAgICAgZGlzdC52c3ViKHhqLCBkaXN0KTsgLy8gRGlzdGFuY2VzIGluIHRhbmdlbnQgZGlyZWN0aW9uIGFuZCBkaXN0YW5jZSBpbiB0aGUgcGxhbmUgb3J0aG9nb25hbCB0byBpdAoKICAgICAgICAgICAgY29uc3QgdGRpc3QgPSBNYXRoLmFicyhvcnRob25vcm0pOwogICAgICAgICAgICBjb25zdCBuZGlzdCA9IGRpc3QubGVuZ3RoKCk7CgogICAgICAgICAgICBpZiAodGRpc3QgPCBzaWRlc1tsXS5sZW5ndGgoKSAmJiBuZGlzdCA8IFIpIHsKICAgICAgICAgICAgICBpZiAoanVzdFRlc3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuY3JlYXRlQ29udGFjdEVxdWF0aW9uKGJpLCBiaiwgc2ksIHNqLCByc2ksIHJzaik7CiAgICAgICAgICAgICAgZWRnZUNlbnRlci52YWRkKG9ydGhvZ29uYWwsIHJlcy5yaik7IC8vIGJveCByagoKICAgICAgICAgICAgICByZXMucmouY29weShyZXMucmopOwogICAgICAgICAgICAgIGRpc3QubmVnYXRlKHJlcy5uaSk7CiAgICAgICAgICAgICAgcmVzLm5pLm5vcm1hbGl6ZSgpOwogICAgICAgICAgICAgIHJlcy5yaS5jb3B5KHJlcy5yaik7CiAgICAgICAgICAgICAgcmVzLnJpLnZhZGQoeGosIHJlcy5yaSk7CiAgICAgICAgICAgICAgcmVzLnJpLnZzdWIoeGksIHJlcy5yaSk7CiAgICAgICAgICAgICAgcmVzLnJpLm5vcm1hbGl6ZSgpOwogICAgICAgICAgICAgIHJlcy5yaS5zY2FsZShSLCByZXMucmkpOyAvLyBNYWtlIHJlbGF0aXZlIHRvIGJvZGllcwoKICAgICAgICAgICAgICByZXMucmkudmFkZCh4aSwgcmVzLnJpKTsKICAgICAgICAgICAgICByZXMucmkudnN1YihiaS5wb3NpdGlvbiwgcmVzLnJpKTsKICAgICAgICAgICAgICByZXMucmoudmFkZCh4aiwgcmVzLnJqKTsKICAgICAgICAgICAgICByZXMucmoudnN1Yihiai5wb3NpdGlvbiwgcmVzLnJqKTsKICAgICAgICAgICAgICB0aGlzLnJlc3VsdC5wdXNoKHJlcyk7CiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KHJlcywgdGhpcy5mcmljdGlvblJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHYzcG9vbC5yZWxlYXNlKGVkZ2VUYW5nZW50LCBlZGdlQ2VudGVyLCByLCBvcnRob2dvbmFsLCBkaXN0KTsKICAgIH0KCiAgICBwbGFuZUJveChzaSwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHJzaSwgcnNqLCBqdXN0VGVzdCkgewogICAgICBzai5jb252ZXhQb2x5aGVkcm9uUmVwcmVzZW50YXRpb24ubWF0ZXJpYWwgPSBzai5tYXRlcmlhbDsKICAgICAgc2ouY29udmV4UG9seWhlZHJvblJlcHJlc2VudGF0aW9uLmNvbGxpc2lvblJlc3BvbnNlID0gc2ouY29sbGlzaW9uUmVzcG9uc2U7CiAgICAgIHNqLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbi5pZCA9IHNqLmlkOwogICAgICByZXR1cm4gdGhpcy5wbGFuZUNvbnZleChzaSwgc2ouY29udmV4UG9seWhlZHJvblJlcHJlc2VudGF0aW9uLCB4aSwgeGosIHFpLCBxaiwgYmksIGJqLCBzaSwgc2osIGp1c3RUZXN0KTsKICAgIH0KCiAgICBjb252ZXhDb252ZXgoc2ksIHNqLCB4aSwgeGosIHFpLCBxaiwgYmksIGJqLCByc2ksIHJzaiwganVzdFRlc3QsIGZhY2VMaXN0QSwgZmFjZUxpc3RCKSB7CiAgICAgIGNvbnN0IHNlcEF4aXMgPSBjb252ZXhDb252ZXhfc2VwQXhpczsKCiAgICAgIGlmICh4aS5kaXN0YW5jZVRvKHhqKSA+IHNpLmJvdW5kaW5nU3BoZXJlUmFkaXVzICsgc2ouYm91bmRpbmdTcGhlcmVSYWRpdXMpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChzaS5maW5kU2VwYXJhdGluZ0F4aXMoc2osIHhpLCBxaSwgeGosIHFqLCBzZXBBeGlzLCBmYWNlTGlzdEEsIGZhY2VMaXN0QikpIHsKICAgICAgICBjb25zdCByZXMgPSBbXTsKICAgICAgICBjb25zdCBxID0gY29udmV4Q29udmV4X3E7CiAgICAgICAgc2kuY2xpcEFnYWluc3RIdWxsKHhpLCBxaSwgc2osIHhqLCBxaiwgc2VwQXhpcywgLTEwMCwgMTAwLCByZXMpOwogICAgICAgIGxldCBudW1Db250YWN0cyA9IDA7CgogICAgICAgIGZvciAobGV0IGogPSAwOyBqICE9PSByZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGlmIChqdXN0VGVzdCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCByID0gdGhpcy5jcmVhdGVDb250YWN0RXF1YXRpb24oYmksIGJqLCBzaSwgc2osIHJzaSwgcnNqKTsKICAgICAgICAgIGNvbnN0IHJpID0gci5yaTsKICAgICAgICAgIGNvbnN0IHJqID0gci5yajsKICAgICAgICAgIHNlcEF4aXMubmVnYXRlKHIubmkpOwogICAgICAgICAgcmVzW2pdLm5vcm1hbC5uZWdhdGUocSk7CiAgICAgICAgICBxLnNjYWxlKHJlc1tqXS5kZXB0aCwgcSk7CiAgICAgICAgICByZXNbal0ucG9pbnQudmFkZChxLCByaSk7CiAgICAgICAgICByai5jb3B5KHJlc1tqXS5wb2ludCk7IC8vIENvbnRhY3QgcG9pbnRzIGFyZSBpbiB3b3JsZCBjb29yZGluYXRlcy4gVHJhbnNmb3JtIGJhY2sgdG8gcmVsYXRpdmUKCiAgICAgICAgICByaS52c3ViKHhpLCByaSk7CiAgICAgICAgICByai52c3ViKHhqLCByaik7IC8vIE1ha2UgcmVsYXRpdmUgdG8gYm9kaWVzCgogICAgICAgICAgcmkudmFkZCh4aSwgcmkpOwogICAgICAgICAgcmkudnN1YihiaS5wb3NpdGlvbiwgcmkpOwogICAgICAgICAgcmoudmFkZCh4aiwgcmopOwogICAgICAgICAgcmoudnN1Yihiai5wb3NpdGlvbiwgcmopOwogICAgICAgICAgdGhpcy5yZXN1bHQucHVzaChyKTsKICAgICAgICAgIG51bUNvbnRhY3RzKys7CgogICAgICAgICAgaWYgKCF0aGlzLmVuYWJsZUZyaWN0aW9uUmVkdWN0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlRnJpY3Rpb25FcXVhdGlvbnNGcm9tQ29udGFjdChyLCB0aGlzLmZyaWN0aW9uUmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLmVuYWJsZUZyaWN0aW9uUmVkdWN0aW9uICYmIG51bUNvbnRhY3RzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZUZyaWN0aW9uRnJvbUF2ZXJhZ2UobnVtQ29udGFjdHMpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHNwaGVyZUNvbnZleChzaSwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHJzaSwgcnNqLCBqdXN0VGVzdCkgewogICAgICBjb25zdCB2M3Bvb2wgPSB0aGlzLnYzcG9vbDsKICAgICAgeGkudnN1Yih4aiwgY29udmV4X3RvX3NwaGVyZSk7CiAgICAgIGNvbnN0IG5vcm1hbHMgPSBzai5mYWNlTm9ybWFsczsKICAgICAgY29uc3QgZmFjZXMgPSBzai5mYWNlczsKICAgICAgY29uc3QgdmVydHMgPSBzai52ZXJ0aWNlczsKICAgICAgY29uc3QgUiA9IHNpLnJhZGl1czsKICAgICAgLy8gICAgIHJldHVybjsKICAgICAgLy8gfQoKICAgICAgbGV0IGZvdW5kID0gZmFsc2U7IC8vIENoZWNrIGNvcm5lcnMKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSB2ZXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IHYgPSB2ZXJ0c1tpXTsgLy8gV29ybGQgcG9zaXRpb24gb2YgY29ybmVyCgogICAgICAgIGNvbnN0IHdvcmxkQ29ybmVyID0gc3BoZXJlQ29udmV4X3dvcmxkQ29ybmVyOwogICAgICAgIHFqLnZtdWx0KHYsIHdvcmxkQ29ybmVyKTsKICAgICAgICB4ai52YWRkKHdvcmxkQ29ybmVyLCB3b3JsZENvcm5lcik7CiAgICAgICAgY29uc3Qgc3BoZXJlX3RvX2Nvcm5lciA9IHNwaGVyZUNvbnZleF9zcGhlcmVUb0Nvcm5lcjsKICAgICAgICB3b3JsZENvcm5lci52c3ViKHhpLCBzcGhlcmVfdG9fY29ybmVyKTsKCiAgICAgICAgaWYgKHNwaGVyZV90b19jb3JuZXIubGVuZ3RoU3F1YXJlZCgpIDwgUiAqIFIpIHsKICAgICAgICAgIGlmIChqdXN0VGVzdCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICBjb25zdCByID0gdGhpcy5jcmVhdGVDb250YWN0RXF1YXRpb24oYmksIGJqLCBzaSwgc2osIHJzaSwgcnNqKTsKICAgICAgICAgIHIucmkuY29weShzcGhlcmVfdG9fY29ybmVyKTsKICAgICAgICAgIHIucmkubm9ybWFsaXplKCk7CiAgICAgICAgICByLm5pLmNvcHkoci5yaSk7CiAgICAgICAgICByLnJpLnNjYWxlKFIsIHIucmkpOwogICAgICAgICAgd29ybGRDb3JuZXIudnN1Yih4aiwgci5yaik7IC8vIFNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgYm9keS4KCiAgICAgICAgICByLnJpLnZhZGQoeGksIHIucmkpOwogICAgICAgICAgci5yaS52c3ViKGJpLnBvc2l0aW9uLCByLnJpKTsgLy8gU2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBib2R5LgoKICAgICAgICAgIHIucmoudmFkZCh4aiwgci5yaik7CiAgICAgICAgICByLnJqLnZzdWIoYmoucG9zaXRpb24sIHIucmopOwogICAgICAgICAgdGhpcy5yZXN1bHQucHVzaChyKTsKICAgICAgICAgIHRoaXMuY3JlYXRlRnJpY3Rpb25FcXVhdGlvbnNGcm9tQ29udGFjdChyLCB0aGlzLmZyaWN0aW9uUmVzdWx0KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gLy8gQ2hlY2sgc2lkZSAocGxhbmUpIGludGVyc2VjdGlvbnMKCgogICAgICBmb3IgKGxldCBpID0gMCwgbmZhY2VzID0gZmFjZXMubGVuZ3RoOyBpICE9PSBuZmFjZXMgJiYgZm91bmQgPT09IGZhbHNlOyBpKyspIHsKICAgICAgICBjb25zdCBub3JtYWwgPSBub3JtYWxzW2ldOwogICAgICAgIGNvbnN0IGZhY2UgPSBmYWNlc1tpXTsgLy8gR2V0IHdvcmxkLXRyYW5zZm9ybWVkIG5vcm1hbCBvZiB0aGUgZmFjZQoKICAgICAgICBjb25zdCB3b3JsZE5vcm1hbCA9IHNwaGVyZUNvbnZleF93b3JsZE5vcm1hbDsKICAgICAgICBxai52bXVsdChub3JtYWwsIHdvcmxkTm9ybWFsKTsgLy8gR2V0IGEgd29ybGQgdmVydGV4IGZyb20gdGhlIGZhY2UKCiAgICAgICAgY29uc3Qgd29ybGRQb2ludCA9IHNwaGVyZUNvbnZleF93b3JsZFBvaW50OwogICAgICAgIHFqLnZtdWx0KHZlcnRzW2ZhY2VbMF1dLCB3b3JsZFBvaW50KTsKICAgICAgICB3b3JsZFBvaW50LnZhZGQoeGosIHdvcmxkUG9pbnQpOyAvLyBHZXQgYSBwb2ludCBvbiB0aGUgc3BoZXJlLCBjbG9zZXN0IHRvIHRoZSBmYWNlIG5vcm1hbAoKICAgICAgICBjb25zdCB3b3JsZFNwaGVyZVBvaW50Q2xvc2VzdFRvUGxhbmUgPSBzcGhlcmVDb252ZXhfd29ybGRTcGhlcmVQb2ludENsb3Nlc3RUb1BsYW5lOwogICAgICAgIHdvcmxkTm9ybWFsLnNjYWxlKC1SLCB3b3JsZFNwaGVyZVBvaW50Q2xvc2VzdFRvUGxhbmUpOwogICAgICAgIHhpLnZhZGQod29ybGRTcGhlcmVQb2ludENsb3Nlc3RUb1BsYW5lLCB3b3JsZFNwaGVyZVBvaW50Q2xvc2VzdFRvUGxhbmUpOyAvLyBWZWN0b3IgZnJvbSBhIGZhY2UgcG9pbnQgdG8gdGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHNwaGVyZQoKICAgICAgICBjb25zdCBwZW5ldHJhdGlvblZlYyA9IHNwaGVyZUNvbnZleF9wZW5ldHJhdGlvblZlYzsKICAgICAgICB3b3JsZFNwaGVyZVBvaW50Q2xvc2VzdFRvUGxhbmUudnN1Yih3b3JsZFBvaW50LCBwZW5ldHJhdGlvblZlYyk7IC8vIFRoZSBwZW5ldHJhdGlvbi4gTmVnYXRpdmUgdmFsdWUgbWVhbnMgb3ZlcmxhcC4KCiAgICAgICAgY29uc3QgcGVuZXRyYXRpb24gPSBwZW5ldHJhdGlvblZlYy5kb3Qod29ybGROb3JtYWwpOwogICAgICAgIGNvbnN0IHdvcmxkUG9pbnRUb1NwaGVyZSA9IHNwaGVyZUNvbnZleF9zcGhlcmVUb1dvcmxkUG9pbnQ7CiAgICAgICAgeGkudnN1Yih3b3JsZFBvaW50LCB3b3JsZFBvaW50VG9TcGhlcmUpOwoKICAgICAgICBpZiAocGVuZXRyYXRpb24gPCAwICYmIHdvcmxkUG9pbnRUb1NwaGVyZS5kb3Qod29ybGROb3JtYWwpID4gMCkgewogICAgICAgICAgLy8gSW50ZXJzZWN0cyBwbGFuZS4gTm93IGNoZWNrIGlmIHRoZSBzcGhlcmUgaXMgaW5zaWRlIHRoZSBmYWNlIHBvbHlnb24KICAgICAgICAgIGNvbnN0IGZhY2VWZXJ0cyA9IFtdOyAvLyBGYWNlIHZlcnRpY2VzLCBpbiB3b3JsZCBjb29yZHMKCiAgICAgICAgICBmb3IgKGxldCBqID0gMCwgTnZlcnRzID0gZmFjZS5sZW5ndGg7IGogIT09IE52ZXJ0czsgaisrKSB7CiAgICAgICAgICAgIGNvbnN0IHdvcmxkVmVydGV4ID0gdjNwb29sLmdldCgpOwogICAgICAgICAgICBxai52bXVsdCh2ZXJ0c1tmYWNlW2pdXSwgd29ybGRWZXJ0ZXgpOwogICAgICAgICAgICB4ai52YWRkKHdvcmxkVmVydGV4LCB3b3JsZFZlcnRleCk7CiAgICAgICAgICAgIGZhY2VWZXJ0cy5wdXNoKHdvcmxkVmVydGV4KTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAocG9pbnRJblBvbHlnb24oZmFjZVZlcnRzLCB3b3JsZE5vcm1hbCwgeGkpKSB7CiAgICAgICAgICAgIC8vIElzIHRoZSBzcGhlcmUgY2VudGVyIGluIHRoZSBmYWNlIHBvbHlnb24/CiAgICAgICAgICAgIGlmIChqdXN0VGVzdCkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNyZWF0ZUNvbnRhY3RFcXVhdGlvbihiaSwgYmosIHNpLCBzaiwgcnNpLCByc2opOwogICAgICAgICAgICB3b3JsZE5vcm1hbC5zY2FsZSgtUiwgci5yaSk7IC8vIENvbnRhY3Qgb2Zmc2V0LCBmcm9tIHNwaGVyZSBjZW50ZXIgdG8gY29udGFjdAoKICAgICAgICAgICAgd29ybGROb3JtYWwubmVnYXRlKHIubmkpOyAvLyBOb3JtYWwgcG9pbnRpbmcgb3V0IG9mIHNwaGVyZQoKICAgICAgICAgICAgY29uc3QgcGVuZXRyYXRpb25WZWMyID0gdjNwb29sLmdldCgpOwogICAgICAgICAgICB3b3JsZE5vcm1hbC5zY2FsZSgtcGVuZXRyYXRpb24sIHBlbmV0cmF0aW9uVmVjMik7CiAgICAgICAgICAgIGNvbnN0IHBlbmV0cmF0aW9uU3BoZXJlUG9pbnQgPSB2M3Bvb2wuZ2V0KCk7CiAgICAgICAgICAgIHdvcmxkTm9ybWFsLnNjYWxlKC1SLCBwZW5ldHJhdGlvblNwaGVyZVBvaW50KTsgLy94aS52c3ViKHhqKS52YWRkKHBlbmV0cmF0aW9uU3BoZXJlUG9pbnQpLnZhZGQocGVuZXRyYXRpb25WZWMyICwgci5yaik7CgogICAgICAgICAgICB4aS52c3ViKHhqLCByLnJqKTsKICAgICAgICAgICAgci5yai52YWRkKHBlbmV0cmF0aW9uU3BoZXJlUG9pbnQsIHIucmopOwogICAgICAgICAgICByLnJqLnZhZGQocGVuZXRyYXRpb25WZWMyLCByLnJqKTsgLy8gU2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBib2R5LgoKICAgICAgICAgICAgci5yai52YWRkKHhqLCByLnJqKTsKICAgICAgICAgICAgci5yai52c3ViKGJqLnBvc2l0aW9uLCByLnJqKTsgLy8gU2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBib2R5LgoKICAgICAgICAgICAgci5yaS52YWRkKHhpLCByLnJpKTsKICAgICAgICAgICAgci5yaS52c3ViKGJpLnBvc2l0aW9uLCByLnJpKTsKICAgICAgICAgICAgdjNwb29sLnJlbGVhc2UocGVuZXRyYXRpb25WZWMyKTsKICAgICAgICAgICAgdjNwb29sLnJlbGVhc2UocGVuZXRyYXRpb25TcGhlcmVQb2ludCk7CiAgICAgICAgICAgIHRoaXMucmVzdWx0LnB1c2gocik7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlRnJpY3Rpb25FcXVhdGlvbnNGcm9tQ29udGFjdChyLCB0aGlzLmZyaWN0aW9uUmVzdWx0KTsgLy8gUmVsZWFzZSB3b3JsZCB2ZXJ0aWNlcwoKICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIE5mYWNldmVydHMgPSBmYWNlVmVydHMubGVuZ3RoOyBqICE9PSBOZmFjZXZlcnRzOyBqKyspIHsKICAgICAgICAgICAgICB2M3Bvb2wucmVsZWFzZShmYWNlVmVydHNbal0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm47IC8vIFdlIG9ubHkgZXhwZWN0ICpvbmUqIGZhY2UgY29udGFjdAogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gRWRnZT8KICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogIT09IGZhY2UubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAvLyBHZXQgdHdvIHdvcmxkIHRyYW5zZm9ybWVkIHZlcnRpY2VzCiAgICAgICAgICAgICAgY29uc3QgdjEgPSB2M3Bvb2wuZ2V0KCk7CiAgICAgICAgICAgICAgY29uc3QgdjIgPSB2M3Bvb2wuZ2V0KCk7CiAgICAgICAgICAgICAgcWoudm11bHQodmVydHNbZmFjZVsoaiArIDEpICUgZmFjZS5sZW5ndGhdXSwgdjEpOwogICAgICAgICAgICAgIHFqLnZtdWx0KHZlcnRzW2ZhY2VbKGogKyAyKSAlIGZhY2UubGVuZ3RoXV0sIHYyKTsKICAgICAgICAgICAgICB4ai52YWRkKHYxLCB2MSk7CiAgICAgICAgICAgICAgeGoudmFkZCh2MiwgdjIpOyAvLyBDb25zdHJ1Y3QgZWRnZSB2ZWN0b3IKCiAgICAgICAgICAgICAgY29uc3QgZWRnZSA9IHNwaGVyZUNvbnZleF9lZGdlOwogICAgICAgICAgICAgIHYyLnZzdWIodjEsIGVkZ2UpOyAvLyBDb25zdHJ1Y3QgdGhlIHNhbWUgdmVjdG9yLCBidXQgbm9ybWFsaXplZAoKICAgICAgICAgICAgICBjb25zdCBlZGdlVW5pdCA9IHNwaGVyZUNvbnZleF9lZGdlVW5pdDsKICAgICAgICAgICAgICBlZGdlLnVuaXQoZWRnZVVuaXQpOyAvLyBwIGlzIHhpIHByb2plY3RlZCBvbnRvIHRoZSBlZGdlCgogICAgICAgICAgICAgIGNvbnN0IHAgPSB2M3Bvb2wuZ2V0KCk7CiAgICAgICAgICAgICAgY29uc3QgdjFfdG9feGkgPSB2M3Bvb2wuZ2V0KCk7CiAgICAgICAgICAgICAgeGkudnN1Yih2MSwgdjFfdG9feGkpOwogICAgICAgICAgICAgIGNvbnN0IGRvdCA9IHYxX3RvX3hpLmRvdChlZGdlVW5pdCk7CiAgICAgICAgICAgICAgZWRnZVVuaXQuc2NhbGUoZG90LCBwKTsKICAgICAgICAgICAgICBwLnZhZGQodjEsIHApOyAvLyBDb21wdXRlIGEgdmVjdG9yIGZyb20gcCB0byB0aGUgY2VudGVyIG9mIHRoZSBzcGhlcmUKCiAgICAgICAgICAgICAgY29uc3QgeGlfdG9fcCA9IHYzcG9vbC5nZXQoKTsKICAgICAgICAgICAgICBwLnZzdWIoeGksIHhpX3RvX3ApOyAvLyBDb2xsaXNpb24gaWYgdGhlIGVkZ2Utc3BoZXJlIGRpc3RhbmNlIGlzIGxlc3MgdGhhbiB0aGUgcmFkaXVzCiAgICAgICAgICAgICAgLy8gQU5EIGlmIHAgaXMgaW4gYmV0d2VlbiB2MSBhbmQgdjIKCiAgICAgICAgICAgICAgaWYgKGRvdCA+IDAgJiYgZG90ICogZG90IDwgZWRnZS5sZW5ndGhTcXVhcmVkKCkgJiYgeGlfdG9fcC5sZW5ndGhTcXVhcmVkKCkgPCBSICogUikgewogICAgICAgICAgICAgICAgLy8gQ29sbGlzaW9uIGlmIHRoZSBlZGdlLXNwaGVyZSBkaXN0YW5jZSBpcyBsZXNzIHRoYW4gdGhlIHJhZGl1cwogICAgICAgICAgICAgICAgLy8gRWRnZSBjb250YWN0IQogICAgICAgICAgICAgICAgaWYgKGp1c3RUZXN0KSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNyZWF0ZUNvbnRhY3RFcXVhdGlvbihiaSwgYmosIHNpLCBzaiwgcnNpLCByc2opOwogICAgICAgICAgICAgICAgcC52c3ViKHhqLCByLnJqKTsKICAgICAgICAgICAgICAgIHAudnN1Yih4aSwgci5uaSk7CiAgICAgICAgICAgICAgICByLm5pLm5vcm1hbGl6ZSgpOwogICAgICAgICAgICAgICAgci5uaS5zY2FsZShSLCByLnJpKTsgLy8gU2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBib2R5LgoKICAgICAgICAgICAgICAgIHIucmoudmFkZCh4aiwgci5yaik7CiAgICAgICAgICAgICAgICByLnJqLnZzdWIoYmoucG9zaXRpb24sIHIucmopOyAvLyBTaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGJvZHkuCgogICAgICAgICAgICAgICAgci5yaS52YWRkKHhpLCByLnJpKTsKICAgICAgICAgICAgICAgIHIucmkudnN1YihiaS5wb3NpdGlvbiwgci5yaSk7CiAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdC5wdXNoKHIpOwogICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KHIsIHRoaXMuZnJpY3Rpb25SZXN1bHQpOyAvLyBSZWxlYXNlIHdvcmxkIHZlcnRpY2VzCgogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIE5mYWNldmVydHMgPSBmYWNlVmVydHMubGVuZ3RoOyBqICE9PSBOZmFjZXZlcnRzOyBqKyspIHsKICAgICAgICAgICAgICAgICAgdjNwb29sLnJlbGVhc2UoZmFjZVZlcnRzW2pdKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2M3Bvb2wucmVsZWFzZSh2MSk7CiAgICAgICAgICAgICAgICB2M3Bvb2wucmVsZWFzZSh2Mik7CiAgICAgICAgICAgICAgICB2M3Bvb2wucmVsZWFzZShwKTsKICAgICAgICAgICAgICAgIHYzcG9vbC5yZWxlYXNlKHhpX3RvX3ApOwogICAgICAgICAgICAgICAgdjNwb29sLnJlbGVhc2UodjFfdG9feGkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdjNwb29sLnJlbGVhc2UodjEpOwogICAgICAgICAgICAgIHYzcG9vbC5yZWxlYXNlKHYyKTsKICAgICAgICAgICAgICB2M3Bvb2wucmVsZWFzZShwKTsKICAgICAgICAgICAgICB2M3Bvb2wucmVsZWFzZSh4aV90b19wKTsKICAgICAgICAgICAgICB2M3Bvb2wucmVsZWFzZSh2MV90b194aSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gLy8gUmVsZWFzZSB3b3JsZCB2ZXJ0aWNlcwoKCiAgICAgICAgICBmb3IgKGxldCBqID0gMCwgTmZhY2V2ZXJ0cyA9IGZhY2VWZXJ0cy5sZW5ndGg7IGogIT09IE5mYWNldmVydHM7IGorKykgewogICAgICAgICAgICB2M3Bvb2wucmVsZWFzZShmYWNlVmVydHNbal0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHBsYW5lQ29udmV4KHBsYW5lU2hhcGUsIGNvbnZleFNoYXBlLCBwbGFuZVBvc2l0aW9uLCBjb252ZXhQb3NpdGlvbiwgcGxhbmVRdWF0LCBjb252ZXhRdWF0LCBwbGFuZUJvZHksIGNvbnZleEJvZHksIHNpLCBzaiwganVzdFRlc3QpIHsKICAgICAgLy8gU2ltcGx5IHJldHVybiB0aGUgcG9pbnRzIGJlaGluZCB0aGUgcGxhbmUuCiAgICAgIGNvbnN0IHdvcmxkVmVydGV4ID0gcGxhbmVDb252ZXhfdjsKICAgICAgY29uc3Qgd29ybGROb3JtYWwgPSBwbGFuZUNvbnZleF9ub3JtYWw7CiAgICAgIHdvcmxkTm9ybWFsLnNldCgwLCAwLCAxKTsKICAgICAgcGxhbmVRdWF0LnZtdWx0KHdvcmxkTm9ybWFsLCB3b3JsZE5vcm1hbCk7IC8vIFR1cm4gbm9ybWFsIGFjY29yZGluZyB0byBwbGFuZSBvcmllbnRhdGlvbgoKICAgICAgbGV0IG51bUNvbnRhY3RzID0gMDsKICAgICAgY29uc3QgcmVscG9zID0gcGxhbmVDb252ZXhfcmVscG9zOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgIT09IGNvbnZleFNoYXBlLnZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gR2V0IHdvcmxkIGNvbnZleCB2ZXJ0ZXgKICAgICAgICB3b3JsZFZlcnRleC5jb3B5KGNvbnZleFNoYXBlLnZlcnRpY2VzW2ldKTsKICAgICAgICBjb252ZXhRdWF0LnZtdWx0KHdvcmxkVmVydGV4LCB3b3JsZFZlcnRleCk7CiAgICAgICAgY29udmV4UG9zaXRpb24udmFkZCh3b3JsZFZlcnRleCwgd29ybGRWZXJ0ZXgpOwogICAgICAgIHdvcmxkVmVydGV4LnZzdWIocGxhbmVQb3NpdGlvbiwgcmVscG9zKTsKICAgICAgICBjb25zdCBkb3QgPSB3b3JsZE5vcm1hbC5kb3QocmVscG9zKTsKCiAgICAgICAgaWYgKGRvdCA8PSAwLjApIHsKICAgICAgICAgIGlmIChqdXN0VGVzdCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCByID0gdGhpcy5jcmVhdGVDb250YWN0RXF1YXRpb24ocGxhbmVCb2R5LCBjb252ZXhCb2R5LCBwbGFuZVNoYXBlLCBjb252ZXhTaGFwZSwgc2ksIHNqKTsgLy8gR2V0IHZlcnRleCBwb3NpdGlvbiBwcm9qZWN0ZWQgb24gcGxhbmUKCiAgICAgICAgICBjb25zdCBwcm9qZWN0ZWQgPSBwbGFuZUNvbnZleF9wcm9qZWN0ZWQ7CiAgICAgICAgICB3b3JsZE5vcm1hbC5zY2FsZSh3b3JsZE5vcm1hbC5kb3QocmVscG9zKSwgcHJvamVjdGVkKTsKICAgICAgICAgIHdvcmxkVmVydGV4LnZzdWIocHJvamVjdGVkLCBwcm9qZWN0ZWQpOwogICAgICAgICAgcHJvamVjdGVkLnZzdWIocGxhbmVQb3NpdGlvbiwgci5yaSk7IC8vIEZyb20gcGxhbmUgdG8gdmVydGV4IHByb2plY3RlZCBvbiBwbGFuZQoKICAgICAgICAgIHIubmkuY29weSh3b3JsZE5vcm1hbCk7IC8vIENvbnRhY3Qgbm9ybWFsIGlzIHRoZSBwbGFuZSBub3JtYWwgb3V0IGZyb20gcGxhbmUKICAgICAgICAgIC8vIHJqIGlzIG5vdyBqdXN0IHRoZSB2ZWN0b3IgZnJvbSB0aGUgY29udmV4IGNlbnRlciB0byB0aGUgdmVydGV4CgogICAgICAgICAgd29ybGRWZXJ0ZXgudnN1Yihjb252ZXhQb3NpdGlvbiwgci5yaik7IC8vIE1ha2UgaXQgcmVsYXRpdmUgdG8gdGhlIGJvZHkKCiAgICAgICAgICByLnJpLnZhZGQocGxhbmVQb3NpdGlvbiwgci5yaSk7CiAgICAgICAgICByLnJpLnZzdWIocGxhbmVCb2R5LnBvc2l0aW9uLCByLnJpKTsKICAgICAgICAgIHIucmoudmFkZChjb252ZXhQb3NpdGlvbiwgci5yaik7CiAgICAgICAgICByLnJqLnZzdWIoY29udmV4Qm9keS5wb3NpdGlvbiwgci5yaik7CiAgICAgICAgICB0aGlzLnJlc3VsdC5wdXNoKHIpOwogICAgICAgICAgbnVtQ29udGFjdHMrKzsKCiAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlRnJpY3Rpb25SZWR1Y3Rpb24pIHsKICAgICAgICAgICAgdGhpcy5jcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KHIsIHRoaXMuZnJpY3Rpb25SZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHRoaXMuZW5hYmxlRnJpY3Rpb25SZWR1Y3Rpb24gJiYgbnVtQ29udGFjdHMpIHsKICAgICAgICB0aGlzLmNyZWF0ZUZyaWN0aW9uRnJvbUF2ZXJhZ2UobnVtQ29udGFjdHMpOwogICAgICB9CiAgICB9CgogICAgYm94Q29udmV4KHNpLCBzaiwgeGksIHhqLCBxaSwgcWosIGJpLCBiaiwgcnNpLCByc2osIGp1c3RUZXN0KSB7CiAgICAgIHNpLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbi5tYXRlcmlhbCA9IHNpLm1hdGVyaWFsOwogICAgICBzaS5jb252ZXhQb2x5aGVkcm9uUmVwcmVzZW50YXRpb24uY29sbGlzaW9uUmVzcG9uc2UgPSBzaS5jb2xsaXNpb25SZXNwb25zZTsKICAgICAgcmV0dXJuIHRoaXMuY29udmV4Q29udmV4KHNpLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbiwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHNpLCBzaiwganVzdFRlc3QpOwogICAgfQoKICAgIHNwaGVyZUhlaWdodGZpZWxkKHNwaGVyZVNoYXBlLCBoZlNoYXBlLCBzcGhlcmVQb3MsIGhmUG9zLCBzcGhlcmVRdWF0LCBoZlF1YXQsIHNwaGVyZUJvZHksIGhmQm9keSwgcnNpLCByc2osIGp1c3RUZXN0KSB7CiAgICAgIGNvbnN0IGRhdGEgPSBoZlNoYXBlLmRhdGE7CiAgICAgIGNvbnN0IHJhZGl1cyA9IHNwaGVyZVNoYXBlLnJhZGl1czsKICAgICAgY29uc3QgdyA9IGhmU2hhcGUuZWxlbWVudFNpemU7CiAgICAgIGNvbnN0IHdvcmxkUGlsbGFyT2Zmc2V0ID0gc3BoZXJlSGVpZ2h0ZmllbGRfdG1wMjsgLy8gR2V0IHNwaGVyZSBwb3NpdGlvbiB0byBoZWlnaHRmaWVsZCBsb2NhbCEKCiAgICAgIGNvbnN0IGxvY2FsU3BoZXJlUG9zID0gc3BoZXJlSGVpZ2h0ZmllbGRfdG1wMTsKICAgICAgVHJhbnNmb3JtLnBvaW50VG9Mb2NhbEZyYW1lKGhmUG9zLCBoZlF1YXQsIHNwaGVyZVBvcywgbG9jYWxTcGhlcmVQb3MpOyAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBkYXRhIHBvaW50cyB0byB0ZXN0IGFnYWluc3QKCiAgICAgIGxldCBpTWluWCA9IE1hdGguZmxvb3IoKGxvY2FsU3BoZXJlUG9zLnggLSByYWRpdXMpIC8gdykgLSAxOwogICAgICBsZXQgaU1heFggPSBNYXRoLmNlaWwoKGxvY2FsU3BoZXJlUG9zLnggKyByYWRpdXMpIC8gdykgKyAxOwogICAgICBsZXQgaU1pblkgPSBNYXRoLmZsb29yKChsb2NhbFNwaGVyZVBvcy55IC0gcmFkaXVzKSAvIHcpIC0gMTsKICAgICAgbGV0IGlNYXhZID0gTWF0aC5jZWlsKChsb2NhbFNwaGVyZVBvcy55ICsgcmFkaXVzKSAvIHcpICsgMTsgLy8gQmFpbCBvdXQgaWYgd2UgYXJlIG91dCBvZiB0aGUgdGVycmFpbgoKICAgICAgaWYgKGlNYXhYIDwgMCB8fCBpTWF4WSA8IDAgfHwgaU1pblggPiBkYXRhLmxlbmd0aCB8fCBpTWluWSA+IGRhdGFbMF0ubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9IC8vIENsYW1wIGluZGV4IHRvIGVkZ2VzCgoKICAgICAgaWYgKGlNaW5YIDwgMCkgewogICAgICAgIGlNaW5YID0gMDsKICAgICAgfQoKICAgICAgaWYgKGlNYXhYIDwgMCkgewogICAgICAgIGlNYXhYID0gMDsKICAgICAgfQoKICAgICAgaWYgKGlNaW5ZIDwgMCkgewogICAgICAgIGlNaW5ZID0gMDsKICAgICAgfQoKICAgICAgaWYgKGlNYXhZIDwgMCkgewogICAgICAgIGlNYXhZID0gMDsKICAgICAgfQoKICAgICAgaWYgKGlNaW5YID49IGRhdGEubGVuZ3RoKSB7CiAgICAgICAgaU1pblggPSBkYXRhLmxlbmd0aCAtIDE7CiAgICAgIH0KCiAgICAgIGlmIChpTWF4WCA+PSBkYXRhLmxlbmd0aCkgewogICAgICAgIGlNYXhYID0gZGF0YS5sZW5ndGggLSAxOwogICAgICB9CgogICAgICBpZiAoaU1heFkgPj0gZGF0YVswXS5sZW5ndGgpIHsKICAgICAgICBpTWF4WSA9IGRhdGFbMF0ubGVuZ3RoIC0gMTsKICAgICAgfQoKICAgICAgaWYgKGlNaW5ZID49IGRhdGFbMF0ubGVuZ3RoKSB7CiAgICAgICAgaU1pblkgPSBkYXRhWzBdLmxlbmd0aCAtIDE7CiAgICAgIH0KCiAgICAgIGNvbnN0IG1pbk1heCA9IFtdOwogICAgICBoZlNoYXBlLmdldFJlY3RNaW5NYXgoaU1pblgsIGlNaW5ZLCBpTWF4WCwgaU1heFksIG1pbk1heCk7CiAgICAgIGNvbnN0IG1pbiA9IG1pbk1heFswXTsKICAgICAgY29uc3QgbWF4ID0gbWluTWF4WzFdOyAvLyBCYWlsIG91dCBpZiB3ZSBjYW4ndCB0b3VjaCB0aGUgYm91bmRpbmcgaGVpZ2h0IGJveAoKICAgICAgaWYgKGxvY2FsU3BoZXJlUG9zLnogLSByYWRpdXMgPiBtYXggfHwgbG9jYWxTcGhlcmVQb3MueiArIHJhZGl1cyA8IG1pbikgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHQ7CgogICAgICBmb3IgKGxldCBpID0gaU1pblg7IGkgPCBpTWF4WDsgaSsrKSB7CiAgICAgICAgZm9yIChsZXQgaiA9IGlNaW5ZOyBqIDwgaU1heFk7IGorKykgewogICAgICAgICAgY29uc3QgbnVtQ29udGFjdHNCZWZvcmUgPSByZXN1bHQubGVuZ3RoOwogICAgICAgICAgbGV0IGludGVyc2VjdGluZyA9IGZhbHNlOyAvLyBMb3dlciB0cmlhbmdsZQoKICAgICAgICAgIGhmU2hhcGUuZ2V0Q29udmV4VHJpYW5nbGVQaWxsYXIoaSwgaiwgZmFsc2UpOwogICAgICAgICAgVHJhbnNmb3JtLnBvaW50VG9Xb3JsZEZyYW1lKGhmUG9zLCBoZlF1YXQsIGhmU2hhcGUucGlsbGFyT2Zmc2V0LCB3b3JsZFBpbGxhck9mZnNldCk7CgogICAgICAgICAgaWYgKHNwaGVyZVBvcy5kaXN0YW5jZVRvKHdvcmxkUGlsbGFyT2Zmc2V0KSA8IGhmU2hhcGUucGlsbGFyQ29udmV4LmJvdW5kaW5nU3BoZXJlUmFkaXVzICsgc3BoZXJlU2hhcGUuYm91bmRpbmdTcGhlcmVSYWRpdXMpIHsKICAgICAgICAgICAgaW50ZXJzZWN0aW5nID0gdGhpcy5zcGhlcmVDb252ZXgoc3BoZXJlU2hhcGUsIGhmU2hhcGUucGlsbGFyQ29udmV4LCBzcGhlcmVQb3MsIHdvcmxkUGlsbGFyT2Zmc2V0LCBzcGhlcmVRdWF0LCBoZlF1YXQsIHNwaGVyZUJvZHksIGhmQm9keSwgc3BoZXJlU2hhcGUsIGhmU2hhcGUsIGp1c3RUZXN0KTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoanVzdFRlc3QgJiYgaW50ZXJzZWN0aW5nKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfSAvLyBVcHBlciB0cmlhbmdsZQoKCiAgICAgICAgICBoZlNoYXBlLmdldENvbnZleFRyaWFuZ2xlUGlsbGFyKGksIGosIHRydWUpOwogICAgICAgICAgVHJhbnNmb3JtLnBvaW50VG9Xb3JsZEZyYW1lKGhmUG9zLCBoZlF1YXQsIGhmU2hhcGUucGlsbGFyT2Zmc2V0LCB3b3JsZFBpbGxhck9mZnNldCk7CgogICAgICAgICAgaWYgKHNwaGVyZVBvcy5kaXN0YW5jZVRvKHdvcmxkUGlsbGFyT2Zmc2V0KSA8IGhmU2hhcGUucGlsbGFyQ29udmV4LmJvdW5kaW5nU3BoZXJlUmFkaXVzICsgc3BoZXJlU2hhcGUuYm91bmRpbmdTcGhlcmVSYWRpdXMpIHsKICAgICAgICAgICAgaW50ZXJzZWN0aW5nID0gdGhpcy5zcGhlcmVDb252ZXgoc3BoZXJlU2hhcGUsIGhmU2hhcGUucGlsbGFyQ29udmV4LCBzcGhlcmVQb3MsIHdvcmxkUGlsbGFyT2Zmc2V0LCBzcGhlcmVRdWF0LCBoZlF1YXQsIHNwaGVyZUJvZHksIGhmQm9keSwgc3BoZXJlU2hhcGUsIGhmU2hhcGUsIGp1c3RUZXN0KTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoanVzdFRlc3QgJiYgaW50ZXJzZWN0aW5nKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQoKICAgICAgICAgIGNvbnN0IG51bUNvbnRhY3RzID0gcmVzdWx0Lmxlbmd0aCAtIG51bUNvbnRhY3RzQmVmb3JlOwoKICAgICAgICAgIGlmIChudW1Db250YWN0cyA+IDIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgLyoKICAgICAgICAgICAgLy8gU2tpcCBhbGwgYnV0IDEKICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBudW1Db250YWN0cyAtIDE7IGsrKykgewogICAgICAgICAgICAgICAgcmVzdWx0LnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAqLwoKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBib3hIZWlnaHRmaWVsZChzaSwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHJzaSwgcnNqLCBqdXN0VGVzdCkgewogICAgICBzaS5jb252ZXhQb2x5aGVkcm9uUmVwcmVzZW50YXRpb24ubWF0ZXJpYWwgPSBzaS5tYXRlcmlhbDsKICAgICAgc2kuY29udmV4UG9seWhlZHJvblJlcHJlc2VudGF0aW9uLmNvbGxpc2lvblJlc3BvbnNlID0gc2kuY29sbGlzaW9uUmVzcG9uc2U7CiAgICAgIHJldHVybiB0aGlzLmNvbnZleEhlaWdodGZpZWxkKHNpLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbiwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHNpLCBzaiwganVzdFRlc3QpOwogICAgfQoKICAgIGNvbnZleEhlaWdodGZpZWxkKGNvbnZleFNoYXBlLCBoZlNoYXBlLCBjb252ZXhQb3MsIGhmUG9zLCBjb252ZXhRdWF0LCBoZlF1YXQsIGNvbnZleEJvZHksIGhmQm9keSwgcnNpLCByc2osIGp1c3RUZXN0KSB7CiAgICAgIGNvbnN0IGRhdGEgPSBoZlNoYXBlLmRhdGE7CiAgICAgIGNvbnN0IHcgPSBoZlNoYXBlLmVsZW1lbnRTaXplOwogICAgICBjb25zdCByYWRpdXMgPSBjb252ZXhTaGFwZS5ib3VuZGluZ1NwaGVyZVJhZGl1czsKICAgICAgY29uc3Qgd29ybGRQaWxsYXJPZmZzZXQgPSBjb252ZXhIZWlnaHRmaWVsZF90bXAyOwogICAgICBjb25zdCBmYWNlTGlzdCA9IGNvbnZleEhlaWdodGZpZWxkX2ZhY2VMaXN0OyAvLyBHZXQgc3BoZXJlIHBvc2l0aW9uIHRvIGhlaWdodGZpZWxkIGxvY2FsIQoKICAgICAgY29uc3QgbG9jYWxDb252ZXhQb3MgPSBjb252ZXhIZWlnaHRmaWVsZF90bXAxOwogICAgICBUcmFuc2Zvcm0ucG9pbnRUb0xvY2FsRnJhbWUoaGZQb3MsIGhmUXVhdCwgY29udmV4UG9zLCBsb2NhbENvbnZleFBvcyk7IC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRhdGEgcG9pbnRzIHRvIHRlc3QgYWdhaW5zdAoKICAgICAgbGV0IGlNaW5YID0gTWF0aC5mbG9vcigobG9jYWxDb252ZXhQb3MueCAtIHJhZGl1cykgLyB3KSAtIDE7CiAgICAgIGxldCBpTWF4WCA9IE1hdGguY2VpbCgobG9jYWxDb252ZXhQb3MueCArIHJhZGl1cykgLyB3KSArIDE7CiAgICAgIGxldCBpTWluWSA9IE1hdGguZmxvb3IoKGxvY2FsQ29udmV4UG9zLnkgLSByYWRpdXMpIC8gdykgLSAxOwogICAgICBsZXQgaU1heFkgPSBNYXRoLmNlaWwoKGxvY2FsQ29udmV4UG9zLnkgKyByYWRpdXMpIC8gdykgKyAxOyAvLyBCYWlsIG91dCBpZiB3ZSBhcmUgb3V0IG9mIHRoZSB0ZXJyYWluCgogICAgICBpZiAoaU1heFggPCAwIHx8IGlNYXhZIDwgMCB8fCBpTWluWCA+IGRhdGEubGVuZ3RoIHx8IGlNaW5ZID4gZGF0YVswXS5sZW5ndGgpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0gLy8gQ2xhbXAgaW5kZXggdG8gZWRnZXMKCgogICAgICBpZiAoaU1pblggPCAwKSB7CiAgICAgICAgaU1pblggPSAwOwogICAgICB9CgogICAgICBpZiAoaU1heFggPCAwKSB7CiAgICAgICAgaU1heFggPSAwOwogICAgICB9CgogICAgICBpZiAoaU1pblkgPCAwKSB7CiAgICAgICAgaU1pblkgPSAwOwogICAgICB9CgogICAgICBpZiAoaU1heFkgPCAwKSB7CiAgICAgICAgaU1heFkgPSAwOwogICAgICB9CgogICAgICBpZiAoaU1pblggPj0gZGF0YS5sZW5ndGgpIHsKICAgICAgICBpTWluWCA9IGRhdGEubGVuZ3RoIC0gMTsKICAgICAgfQoKICAgICAgaWYgKGlNYXhYID49IGRhdGEubGVuZ3RoKSB7CiAgICAgICAgaU1heFggPSBkYXRhLmxlbmd0aCAtIDE7CiAgICAgIH0KCiAgICAgIGlmIChpTWF4WSA+PSBkYXRhWzBdLmxlbmd0aCkgewogICAgICAgIGlNYXhZID0gZGF0YVswXS5sZW5ndGggLSAxOwogICAgICB9CgogICAgICBpZiAoaU1pblkgPj0gZGF0YVswXS5sZW5ndGgpIHsKICAgICAgICBpTWluWSA9IGRhdGFbMF0ubGVuZ3RoIC0gMTsKICAgICAgfQoKICAgICAgY29uc3QgbWluTWF4ID0gW107CiAgICAgIGhmU2hhcGUuZ2V0UmVjdE1pbk1heChpTWluWCwgaU1pblksIGlNYXhYLCBpTWF4WSwgbWluTWF4KTsKICAgICAgY29uc3QgbWluID0gbWluTWF4WzBdOwogICAgICBjb25zdCBtYXggPSBtaW5NYXhbMV07IC8vIEJhaWwgb3V0IGlmIHdlJ3JlIGNhbnQgdG91Y2ggdGhlIGJvdW5kaW5nIGhlaWdodCBib3gKCiAgICAgIGlmIChsb2NhbENvbnZleFBvcy56IC0gcmFkaXVzID4gbWF4IHx8IGxvY2FsQ29udmV4UG9zLnogKyByYWRpdXMgPCBtaW4pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGZvciAobGV0IGkgPSBpTWluWDsgaSA8IGlNYXhYOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqID0gaU1pblk7IGogPCBpTWF4WTsgaisrKSB7CiAgICAgICAgICBsZXQgaW50ZXJzZWN0aW5nID0gZmFsc2U7IC8vIExvd2VyIHRyaWFuZ2xlCgogICAgICAgICAgaGZTaGFwZS5nZXRDb252ZXhUcmlhbmdsZVBpbGxhcihpLCBqLCBmYWxzZSk7CiAgICAgICAgICBUcmFuc2Zvcm0ucG9pbnRUb1dvcmxkRnJhbWUoaGZQb3MsIGhmUXVhdCwgaGZTaGFwZS5waWxsYXJPZmZzZXQsIHdvcmxkUGlsbGFyT2Zmc2V0KTsKCiAgICAgICAgICBpZiAoY29udmV4UG9zLmRpc3RhbmNlVG8od29ybGRQaWxsYXJPZmZzZXQpIDwgaGZTaGFwZS5waWxsYXJDb252ZXguYm91bmRpbmdTcGhlcmVSYWRpdXMgKyBjb252ZXhTaGFwZS5ib3VuZGluZ1NwaGVyZVJhZGl1cykgewogICAgICAgICAgICBpbnRlcnNlY3RpbmcgPSB0aGlzLmNvbnZleENvbnZleChjb252ZXhTaGFwZSwgaGZTaGFwZS5waWxsYXJDb252ZXgsIGNvbnZleFBvcywgd29ybGRQaWxsYXJPZmZzZXQsIGNvbnZleFF1YXQsIGhmUXVhdCwgY29udmV4Qm9keSwgaGZCb2R5LCBudWxsLCBudWxsLCBqdXN0VGVzdCwgZmFjZUxpc3QsIG51bGwpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChqdXN0VGVzdCAmJiBpbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9IC8vIFVwcGVyIHRyaWFuZ2xlCgoKICAgICAgICAgIGhmU2hhcGUuZ2V0Q29udmV4VHJpYW5nbGVQaWxsYXIoaSwgaiwgdHJ1ZSk7CiAgICAgICAgICBUcmFuc2Zvcm0ucG9pbnRUb1dvcmxkRnJhbWUoaGZQb3MsIGhmUXVhdCwgaGZTaGFwZS5waWxsYXJPZmZzZXQsIHdvcmxkUGlsbGFyT2Zmc2V0KTsKCiAgICAgICAgICBpZiAoY29udmV4UG9zLmRpc3RhbmNlVG8od29ybGRQaWxsYXJPZmZzZXQpIDwgaGZTaGFwZS5waWxsYXJDb252ZXguYm91bmRpbmdTcGhlcmVSYWRpdXMgKyBjb252ZXhTaGFwZS5ib3VuZGluZ1NwaGVyZVJhZGl1cykgewogICAgICAgICAgICBpbnRlcnNlY3RpbmcgPSB0aGlzLmNvbnZleENvbnZleChjb252ZXhTaGFwZSwgaGZTaGFwZS5waWxsYXJDb252ZXgsIGNvbnZleFBvcywgd29ybGRQaWxsYXJPZmZzZXQsIGNvbnZleFF1YXQsIGhmUXVhdCwgY29udmV4Qm9keSwgaGZCb2R5LCBudWxsLCBudWxsLCBqdXN0VGVzdCwgZmFjZUxpc3QsIG51bGwpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChqdXN0VGVzdCAmJiBpbnRlcnNlY3RpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc3BoZXJlUGFydGljbGUoc2osIHNpLCB4aiwgeGksIHFqLCBxaSwgYmosIGJpLCByc2ksIHJzaiwganVzdFRlc3QpIHsKICAgICAgLy8gVGhlIG5vcm1hbCBpcyB0aGUgdW5pdCB2ZWN0b3IgZnJvbSBzcGhlcmUgY2VudGVyIHRvIHBhcnRpY2xlIGNlbnRlcgogICAgICBjb25zdCBub3JtYWwgPSBwYXJ0aWNsZVNwaGVyZV9ub3JtYWw7CiAgICAgIG5vcm1hbC5zZXQoMCwgMCwgMSk7CiAgICAgIHhpLnZzdWIoeGosIG5vcm1hbCk7CiAgICAgIGNvbnN0IGxlbmd0aFNxdWFyZWQgPSBub3JtYWwubGVuZ3RoU3F1YXJlZCgpOwoKICAgICAgaWYgKGxlbmd0aFNxdWFyZWQgPD0gc2oucmFkaXVzICogc2oucmFkaXVzKSB7CiAgICAgICAgaWYgKGp1c3RUZXN0KSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IHIgPSB0aGlzLmNyZWF0ZUNvbnRhY3RFcXVhdGlvbihiaSwgYmosIHNpLCBzaiwgcnNpLCByc2opOwogICAgICAgIG5vcm1hbC5ub3JtYWxpemUoKTsKICAgICAgICByLnJqLmNvcHkobm9ybWFsKTsKICAgICAgICByLnJqLnNjYWxlKHNqLnJhZGl1cywgci5yaik7CiAgICAgICAgci5uaS5jb3B5KG5vcm1hbCk7IC8vIENvbnRhY3Qgbm9ybWFsCgogICAgICAgIHIubmkubmVnYXRlKHIubmkpOwogICAgICAgIHIucmkuc2V0KDAsIDAsIDApOyAvLyBDZW50ZXIgb2YgcGFydGljbGUKCiAgICAgICAgdGhpcy5yZXN1bHQucHVzaChyKTsKICAgICAgICB0aGlzLmNyZWF0ZUZyaWN0aW9uRXF1YXRpb25zRnJvbUNvbnRhY3QociwgdGhpcy5mcmljdGlvblJlc3VsdCk7CiAgICAgIH0KICAgIH0KCiAgICBwbGFuZVBhcnRpY2xlKHNqLCBzaSwgeGosIHhpLCBxaiwgcWksIGJqLCBiaSwgcnNpLCByc2osIGp1c3RUZXN0KSB7CiAgICAgIGNvbnN0IG5vcm1hbCA9IHBhcnRpY2xlUGxhbmVfbm9ybWFsOwogICAgICBub3JtYWwuc2V0KDAsIDAsIDEpOwogICAgICBiai5xdWF0ZXJuaW9uLnZtdWx0KG5vcm1hbCwgbm9ybWFsKTsgLy8gVHVybiBub3JtYWwgYWNjb3JkaW5nIHRvIHBsYW5lIG9yaWVudGF0aW9uCgogICAgICBjb25zdCByZWxwb3MgPSBwYXJ0aWNsZVBsYW5lX3JlbHBvczsKICAgICAgeGkudnN1Yihiai5wb3NpdGlvbiwgcmVscG9zKTsKICAgICAgY29uc3QgZG90ID0gbm9ybWFsLmRvdChyZWxwb3MpOwoKICAgICAgaWYgKGRvdCA8PSAwLjApIHsKICAgICAgICBpZiAoanVzdFRlc3QpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgciA9IHRoaXMuY3JlYXRlQ29udGFjdEVxdWF0aW9uKGJpLCBiaiwgc2ksIHNqLCByc2ksIHJzaik7CiAgICAgICAgci5uaS5jb3B5KG5vcm1hbCk7IC8vIENvbnRhY3Qgbm9ybWFsIGlzIHRoZSBwbGFuZSBub3JtYWwKCiAgICAgICAgci5uaS5uZWdhdGUoci5uaSk7CiAgICAgICAgci5yaS5zZXQoMCwgMCwgMCk7IC8vIENlbnRlciBvZiBwYXJ0aWNsZQogICAgICAgIC8vIEdldCBwYXJ0aWNsZSBwb3NpdGlvbiBwcm9qZWN0ZWQgb24gcGxhbmUKCiAgICAgICAgY29uc3QgcHJvamVjdGVkID0gcGFydGljbGVQbGFuZV9wcm9qZWN0ZWQ7CiAgICAgICAgbm9ybWFsLnNjYWxlKG5vcm1hbC5kb3QoeGkpLCBwcm9qZWN0ZWQpOwogICAgICAgIHhpLnZzdWIocHJvamVjdGVkLCBwcm9qZWN0ZWQpOyAvL3Byb2plY3RlZC52YWRkKGJqLnBvc2l0aW9uLHByb2plY3RlZCk7CiAgICAgICAgLy8gcmogaXMgbm93IHRoZSBwcm9qZWN0ZWQgd29ybGQgcG9zaXRpb24gbWludXMgcGxhbmUgcG9zaXRpb24KCiAgICAgICAgci5yai5jb3B5KHByb2plY3RlZCk7CiAgICAgICAgdGhpcy5yZXN1bHQucHVzaChyKTsKICAgICAgICB0aGlzLmNyZWF0ZUZyaWN0aW9uRXF1YXRpb25zRnJvbUNvbnRhY3QociwgdGhpcy5mcmljdGlvblJlc3VsdCk7CiAgICAgIH0KICAgIH0KCiAgICBib3hQYXJ0aWNsZShzaSwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHJzaSwgcnNqLCBqdXN0VGVzdCkgewogICAgICBzaS5jb252ZXhQb2x5aGVkcm9uUmVwcmVzZW50YXRpb24ubWF0ZXJpYWwgPSBzaS5tYXRlcmlhbDsKICAgICAgc2kuY29udmV4UG9seWhlZHJvblJlcHJlc2VudGF0aW9uLmNvbGxpc2lvblJlc3BvbnNlID0gc2kuY29sbGlzaW9uUmVzcG9uc2U7CiAgICAgIHJldHVybiB0aGlzLmNvbnZleFBhcnRpY2xlKHNpLmNvbnZleFBvbHloZWRyb25SZXByZXNlbnRhdGlvbiwgc2osIHhpLCB4aiwgcWksIHFqLCBiaSwgYmosIHNpLCBzaiwganVzdFRlc3QpOwogICAgfQoKICAgIGNvbnZleFBhcnRpY2xlKHNqLCBzaSwgeGosIHhpLCBxaiwgcWksIGJqLCBiaSwgcnNpLCByc2osIGp1c3RUZXN0KSB7CiAgICAgIGxldCBwZW5ldHJhdGVkRmFjZUluZGV4ID0gLTE7CiAgICAgIGNvbnN0IHBlbmV0cmF0ZWRGYWNlTm9ybWFsID0gY29udmV4UGFydGljbGVfcGVuZXRyYXRlZEZhY2VOb3JtYWw7CiAgICAgIGNvbnN0IHdvcmxkUGVuZXRyYXRpb25WZWMgPSBjb252ZXhQYXJ0aWNsZV93b3JsZFBlbmV0cmF0aW9uVmVjOwogICAgICBsZXQgbWluUGVuZXRyYXRpb24gPSBudWxsOwoKICAgICAgY29uc3QgbG9jYWwgPSBjb252ZXhQYXJ0aWNsZV9sb2NhbDsKICAgICAgbG9jYWwuY29weSh4aSk7CiAgICAgIGxvY2FsLnZzdWIoeGosIGxvY2FsKTsgLy8gQ29udmVydCBwb3NpdGlvbiB0byByZWxhdGl2ZSB0aGUgY29udmV4IG9yaWdpbgoKICAgICAgcWouY29uanVnYXRlKGNxaik7CiAgICAgIGNxai52bXVsdChsb2NhbCwgbG9jYWwpOwoKICAgICAgaWYgKHNqLnBvaW50SXNJbnNpZGUobG9jYWwpKSB7CiAgICAgICAgaWYgKHNqLndvcmxkVmVydGljZXNOZWVkc1VwZGF0ZSkgewogICAgICAgICAgc2ouY29tcHV0ZVdvcmxkVmVydGljZXMoeGosIHFqKTsKICAgICAgICB9CgogICAgICAgIGlmIChzai53b3JsZEZhY2VOb3JtYWxzTmVlZHNVcGRhdGUpIHsKICAgICAgICAgIHNqLmNvbXB1dGVXb3JsZEZhY2VOb3JtYWxzKHFqKTsKICAgICAgICB9IC8vIEZvciBlYWNoIHdvcmxkIHBvbHlnb24gaW4gdGhlIHBvbHloZWRyYQoKCiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG5mYWNlcyA9IHNqLmZhY2VzLmxlbmd0aDsgaSAhPT0gbmZhY2VzOyBpKyspIHsKICAgICAgICAgIC8vIENvbnN0cnVjdCB3b3JsZCBmYWNlIHZlcnRpY2VzCiAgICAgICAgICBjb25zdCB2ZXJ0cyA9IFtzai53b3JsZFZlcnRpY2VzW3NqLmZhY2VzW2ldWzBdXV07CiAgICAgICAgICBjb25zdCBub3JtYWwgPSBzai53b3JsZEZhY2VOb3JtYWxzW2ldOyAvLyBDaGVjayBob3cgbXVjaCB0aGUgcGFydGljbGUgcGVuZXRyYXRlcyB0aGUgcG9seWdvbiBwbGFuZS4KCiAgICAgICAgICB4aS52c3ViKHZlcnRzWzBdLCBjb252ZXhQYXJ0aWNsZV92ZXJ0ZXhUb1BhcnRpY2xlKTsKICAgICAgICAgIGNvbnN0IHBlbmV0cmF0aW9uID0gLW5vcm1hbC5kb3QoY29udmV4UGFydGljbGVfdmVydGV4VG9QYXJ0aWNsZSk7CgogICAgICAgICAgaWYgKG1pblBlbmV0cmF0aW9uID09PSBudWxsIHx8IE1hdGguYWJzKHBlbmV0cmF0aW9uKSA8IE1hdGguYWJzKG1pblBlbmV0cmF0aW9uKSkgewogICAgICAgICAgICBpZiAoanVzdFRlc3QpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWluUGVuZXRyYXRpb24gPSBwZW5ldHJhdGlvbjsKICAgICAgICAgICAgcGVuZXRyYXRlZEZhY2VJbmRleCA9IGk7CiAgICAgICAgICAgIHBlbmV0cmF0ZWRGYWNlTm9ybWFsLmNvcHkobm9ybWFsKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChwZW5ldHJhdGVkRmFjZUluZGV4ICE9PSAtMSkgewogICAgICAgICAgLy8gU2V0dXAgY29udGFjdAogICAgICAgICAgY29uc3QgciA9IHRoaXMuY3JlYXRlQ29udGFjdEVxdWF0aW9uKGJpLCBiaiwgc2ksIHNqLCByc2ksIHJzaik7CiAgICAgICAgICBwZW5ldHJhdGVkRmFjZU5vcm1hbC5zY2FsZShtaW5QZW5ldHJhdGlvbiwgd29ybGRQZW5ldHJhdGlvblZlYyk7IC8vIHJqIGlzIHRoZSBwYXJ0aWNsZSBwb3NpdGlvbiBwcm9qZWN0ZWQgdG8gdGhlIGZhY2UKCiAgICAgICAgICB3b3JsZFBlbmV0cmF0aW9uVmVjLnZhZGQoeGksIHdvcmxkUGVuZXRyYXRpb25WZWMpOwogICAgICAgICAgd29ybGRQZW5ldHJhdGlvblZlYy52c3ViKHhqLCB3b3JsZFBlbmV0cmF0aW9uVmVjKTsKICAgICAgICAgIHIucmouY29weSh3b3JsZFBlbmV0cmF0aW9uVmVjKTsgLy9jb25zdCBwcm9qZWN0ZWRUb0ZhY2UgPSB4aS52c3ViKHhqKS52YWRkKHdvcmxkUGVuZXRyYXRpb25WZWMpOwogICAgICAgICAgLy9wcm9qZWN0ZWRUb0ZhY2UuY29weShyLnJqKTsKICAgICAgICAgIC8vcWoudm11bHQoci5yaixyLnJqKTsKCiAgICAgICAgICBwZW5ldHJhdGVkRmFjZU5vcm1hbC5uZWdhdGUoci5uaSk7IC8vIENvbnRhY3Qgbm9ybWFsCgogICAgICAgICAgci5yaS5zZXQoMCwgMCwgMCk7IC8vIENlbnRlciBvZiBwYXJ0aWNsZQoKICAgICAgICAgIGNvbnN0IHJpID0gci5yaTsKICAgICAgICAgIGNvbnN0IHJqID0gci5yajsgLy8gTWFrZSByZWxhdGl2ZSB0byBib2RpZXMKCiAgICAgICAgICByaS52YWRkKHhpLCByaSk7CiAgICAgICAgICByaS52c3ViKGJpLnBvc2l0aW9uLCByaSk7CiAgICAgICAgICByai52YWRkKHhqLCByaik7CiAgICAgICAgICByai52c3ViKGJqLnBvc2l0aW9uLCByaik7CiAgICAgICAgICB0aGlzLnJlc3VsdC5wdXNoKHIpOwogICAgICAgICAgdGhpcy5jcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KHIsIHRoaXMuZnJpY3Rpb25SZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oJ1BvaW50IGZvdW5kIGluc2lkZSBjb252ZXgsIGJ1dCBkaWQgbm90IGZpbmQgcGVuZXRyYXRpbmcgZmFjZSEnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBoZWlnaHRmaWVsZEN5bGluZGVyKGhmU2hhcGUsIGNvbnZleFNoYXBlLCBoZlBvcywgY29udmV4UG9zLCBoZlF1YXQsIGNvbnZleFF1YXQsIGhmQm9keSwgY29udmV4Qm9keSwgcnNpLCByc2osIGp1c3RUZXN0KSB7CiAgICAgIHJldHVybiB0aGlzLmNvbnZleEhlaWdodGZpZWxkKGNvbnZleFNoYXBlLCBoZlNoYXBlLCBjb252ZXhQb3MsIGhmUG9zLCBjb252ZXhRdWF0LCBoZlF1YXQsIGNvbnZleEJvZHksIGhmQm9keSwgcnNpLCByc2osIGp1c3RUZXN0KTsKICAgIH0KCiAgICBwYXJ0aWNsZUN5bGluZGVyKHNpLCBzaiwgeGksIHhqLCBxaSwgcWosIGJpLCBiaiwgcnNpLCByc2osIGp1c3RUZXN0KSB7CiAgICAgIHJldHVybiB0aGlzLmNvbnZleFBhcnRpY2xlKHNqLCBzaSwgeGosIHhpLCBxaiwgcWksIGJqLCBiaSwgcnNpLCByc2osIGp1c3RUZXN0KTsKICAgIH0KCiAgICBzcGhlcmVUcmltZXNoKHNwaGVyZVNoYXBlLCB0cmltZXNoU2hhcGUsIHNwaGVyZVBvcywgdHJpbWVzaFBvcywgc3BoZXJlUXVhdCwgdHJpbWVzaFF1YXQsIHNwaGVyZUJvZHksIHRyaW1lc2hCb2R5LCByc2ksIHJzaiwganVzdFRlc3QpIHsKICAgICAgY29uc3QgZWRnZVZlcnRleEEgPSBzcGhlcmVUcmltZXNoX2VkZ2VWZXJ0ZXhBOwogICAgICBjb25zdCBlZGdlVmVydGV4QiA9IHNwaGVyZVRyaW1lc2hfZWRnZVZlcnRleEI7CiAgICAgIGNvbnN0IGVkZ2VWZWN0b3IgPSBzcGhlcmVUcmltZXNoX2VkZ2VWZWN0b3I7CiAgICAgIGNvbnN0IGVkZ2VWZWN0b3JVbml0ID0gc3BoZXJlVHJpbWVzaF9lZGdlVmVjdG9yVW5pdDsKICAgICAgY29uc3QgbG9jYWxTcGhlcmVQb3MgPSBzcGhlcmVUcmltZXNoX2xvY2FsU3BoZXJlUG9zOwogICAgICBjb25zdCB0bXAgPSBzcGhlcmVUcmltZXNoX3RtcDsKICAgICAgY29uc3QgbG9jYWxTcGhlcmVBQUJCID0gc3BoZXJlVHJpbWVzaF9sb2NhbFNwaGVyZUFBQkI7CiAgICAgIGNvbnN0IHYyID0gc3BoZXJlVHJpbWVzaF92MjsKICAgICAgY29uc3QgcmVscG9zID0gc3BoZXJlVHJpbWVzaF9yZWxwb3M7CiAgICAgIGNvbnN0IHRyaWFuZ2xlcyA9IHNwaGVyZVRyaW1lc2hfdHJpYW5nbGVzOyAvLyBDb252ZXJ0IHNwaGVyZSBwb3NpdGlvbiB0byBsb2NhbCBpbiB0aGUgdHJpbWVzaAoKICAgICAgVHJhbnNmb3JtLnBvaW50VG9Mb2NhbEZyYW1lKHRyaW1lc2hQb3MsIHRyaW1lc2hRdWF0LCBzcGhlcmVQb3MsIGxvY2FsU3BoZXJlUG9zKTsgLy8gR2V0IHRoZSBhYWJiIG9mIHRoZSBzcGhlcmUgbG9jYWxseSBpbiB0aGUgdHJpbWVzaAoKICAgICAgY29uc3Qgc3BoZXJlUmFkaXVzID0gc3BoZXJlU2hhcGUucmFkaXVzOwogICAgICBsb2NhbFNwaGVyZUFBQkIubG93ZXJCb3VuZC5zZXQobG9jYWxTcGhlcmVQb3MueCAtIHNwaGVyZVJhZGl1cywgbG9jYWxTcGhlcmVQb3MueSAtIHNwaGVyZVJhZGl1cywgbG9jYWxTcGhlcmVQb3MueiAtIHNwaGVyZVJhZGl1cyk7CiAgICAgIGxvY2FsU3BoZXJlQUFCQi51cHBlckJvdW5kLnNldChsb2NhbFNwaGVyZVBvcy54ICsgc3BoZXJlUmFkaXVzLCBsb2NhbFNwaGVyZVBvcy55ICsgc3BoZXJlUmFkaXVzLCBsb2NhbFNwaGVyZVBvcy56ICsgc3BoZXJlUmFkaXVzKTsKICAgICAgdHJpbWVzaFNoYXBlLmdldFRyaWFuZ2xlc0luQUFCQihsb2NhbFNwaGVyZUFBQkIsIHRyaWFuZ2xlcyk7IC8vZm9yIChsZXQgaSA9IDA7IGkgPCB0cmltZXNoU2hhcGUuaW5kaWNlcy5sZW5ndGggLyAzOyBpKyspIHRyaWFuZ2xlcy5wdXNoKGkpOyAvLyBBbGwKICAgICAgLy8gVmVydGljZXMKCiAgICAgIGNvbnN0IHYgPSBzcGhlcmVUcmltZXNoX3Y7CiAgICAgIGNvbnN0IHJhZGl1c1NxdWFyZWQgPSBzcGhlcmVTaGFwZS5yYWRpdXMgKiBzcGhlcmVTaGFwZS5yYWRpdXM7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7CiAgICAgICAgICB0cmltZXNoU2hhcGUuZ2V0VmVydGV4KHRyaW1lc2hTaGFwZS5pbmRpY2VzW3RyaWFuZ2xlc1tpXSAqIDMgKyBqXSwgdik7IC8vIENoZWNrIHZlcnRleCBvdmVybGFwIGluIHNwaGVyZQoKICAgICAgICAgIHYudnN1Yihsb2NhbFNwaGVyZVBvcywgcmVscG9zKTsKCiAgICAgICAgICBpZiAocmVscG9zLmxlbmd0aFNxdWFyZWQoKSA8PSByYWRpdXNTcXVhcmVkKSB7CiAgICAgICAgICAgIC8vIFNhZmUgdXAKICAgICAgICAgICAgdjIuY29weSh2KTsKICAgICAgICAgICAgVHJhbnNmb3JtLnBvaW50VG9Xb3JsZEZyYW1lKHRyaW1lc2hQb3MsIHRyaW1lc2hRdWF0LCB2Miwgdik7CiAgICAgICAgICAgIHYudnN1YihzcGhlcmVQb3MsIHJlbHBvcyk7CgogICAgICAgICAgICBpZiAoanVzdFRlc3QpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IHIgPSB0aGlzLmNyZWF0ZUNvbnRhY3RFcXVhdGlvbihzcGhlcmVCb2R5LCB0cmltZXNoQm9keSwgc3BoZXJlU2hhcGUsIHRyaW1lc2hTaGFwZSwgcnNpLCByc2opOwogICAgICAgICAgICByLm5pLmNvcHkocmVscG9zKTsKICAgICAgICAgICAgci5uaS5ub3JtYWxpemUoKTsgLy8gcmkgaXMgdGhlIHZlY3RvciBmcm9tIHNwaGVyZSBjZW50ZXIgdG8gdGhlIHNwaGVyZSBzdXJmYWNlCgogICAgICAgICAgICByLnJpLmNvcHkoci5uaSk7CiAgICAgICAgICAgIHIucmkuc2NhbGUoc3BoZXJlU2hhcGUucmFkaXVzLCByLnJpKTsKICAgICAgICAgICAgci5yaS52YWRkKHNwaGVyZVBvcywgci5yaSk7CiAgICAgICAgICAgIHIucmkudnN1YihzcGhlcmVCb2R5LnBvc2l0aW9uLCByLnJpKTsKICAgICAgICAgICAgci5yai5jb3B5KHYpOwogICAgICAgICAgICByLnJqLnZzdWIodHJpbWVzaEJvZHkucG9zaXRpb24sIHIucmopOyAvLyBTdG9yZSByZXN1bHQKCiAgICAgICAgICAgIHRoaXMucmVzdWx0LnB1c2gocik7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlRnJpY3Rpb25FcXVhdGlvbnNGcm9tQ29udGFjdChyLCB0aGlzLmZyaWN0aW9uUmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gLy8gQ2hlY2sgYWxsIGVkZ2VzCgoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykgewogICAgICAgICAgdHJpbWVzaFNoYXBlLmdldFZlcnRleCh0cmltZXNoU2hhcGUuaW5kaWNlc1t0cmlhbmdsZXNbaV0gKiAzICsgal0sIGVkZ2VWZXJ0ZXhBKTsKICAgICAgICAgIHRyaW1lc2hTaGFwZS5nZXRWZXJ0ZXgodHJpbWVzaFNoYXBlLmluZGljZXNbdHJpYW5nbGVzW2ldICogMyArIChqICsgMSkgJSAzXSwgZWRnZVZlcnRleEIpOwogICAgICAgICAgZWRnZVZlcnRleEIudnN1YihlZGdlVmVydGV4QSwgZWRnZVZlY3Rvcik7IC8vIFByb2plY3Qgc3BoZXJlIHBvc2l0aW9uIHRvIHRoZSBlZGdlCgogICAgICAgICAgbG9jYWxTcGhlcmVQb3MudnN1YihlZGdlVmVydGV4QiwgdG1wKTsKICAgICAgICAgIGNvbnN0IHBvc2l0aW9uQWxvbmdFZGdlQiA9IHRtcC5kb3QoZWRnZVZlY3Rvcik7CiAgICAgICAgICBsb2NhbFNwaGVyZVBvcy52c3ViKGVkZ2VWZXJ0ZXhBLCB0bXApOwogICAgICAgICAgbGV0IHBvc2l0aW9uQWxvbmdFZGdlQSA9IHRtcC5kb3QoZWRnZVZlY3Rvcik7CgogICAgICAgICAgaWYgKHBvc2l0aW9uQWxvbmdFZGdlQSA+IDAgJiYgcG9zaXRpb25BbG9uZ0VkZ2VCIDwgMCkgewogICAgICAgICAgICAvLyBOb3cgY2hlY2sgdGhlIG9ydGhvZ29uYWwgZGlzdGFuY2UgZnJvbSBlZGdlIHRvIHNwaGVyZSBjZW50ZXIKICAgICAgICAgICAgbG9jYWxTcGhlcmVQb3MudnN1YihlZGdlVmVydGV4QSwgdG1wKTsKICAgICAgICAgICAgZWRnZVZlY3RvclVuaXQuY29weShlZGdlVmVjdG9yKTsKICAgICAgICAgICAgZWRnZVZlY3RvclVuaXQubm9ybWFsaXplKCk7CiAgICAgICAgICAgIHBvc2l0aW9uQWxvbmdFZGdlQSA9IHRtcC5kb3QoZWRnZVZlY3RvclVuaXQpOwogICAgICAgICAgICBlZGdlVmVjdG9yVW5pdC5zY2FsZShwb3NpdGlvbkFsb25nRWRnZUEsIHRtcCk7CiAgICAgICAgICAgIHRtcC52YWRkKGVkZ2VWZXJ0ZXhBLCB0bXApOyAvLyB0bXAgaXMgbm93IHRoZSBzcGhlcmUgY2VudGVyIHBvc2l0aW9uIHByb2plY3RlZCB0byB0aGUgZWRnZSwgZGVmaW5lZCBsb2NhbGx5IGluIHRoZSB0cmltZXNoIGZyYW1lCgogICAgICAgICAgICBjb25zdCBkaXN0ID0gdG1wLmRpc3RhbmNlVG8obG9jYWxTcGhlcmVQb3MpOwoKICAgICAgICAgICAgaWYgKGRpc3QgPCBzcGhlcmVTaGFwZS5yYWRpdXMpIHsKICAgICAgICAgICAgICBpZiAoanVzdFRlc3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuY3JlYXRlQ29udGFjdEVxdWF0aW9uKHNwaGVyZUJvZHksIHRyaW1lc2hCb2R5LCBzcGhlcmVTaGFwZSwgdHJpbWVzaFNoYXBlLCByc2ksIHJzaik7CiAgICAgICAgICAgICAgdG1wLnZzdWIobG9jYWxTcGhlcmVQb3MsIHIubmkpOwogICAgICAgICAgICAgIHIubmkubm9ybWFsaXplKCk7CiAgICAgICAgICAgICAgci5uaS5zY2FsZShzcGhlcmVTaGFwZS5yYWRpdXMsIHIucmkpOwogICAgICAgICAgICAgIHIucmkudmFkZChzcGhlcmVQb3MsIHIucmkpOwogICAgICAgICAgICAgIHIucmkudnN1YihzcGhlcmVCb2R5LnBvc2l0aW9uLCByLnJpKTsKICAgICAgICAgICAgICBUcmFuc2Zvcm0ucG9pbnRUb1dvcmxkRnJhbWUodHJpbWVzaFBvcywgdHJpbWVzaFF1YXQsIHRtcCwgdG1wKTsKICAgICAgICAgICAgICB0bXAudnN1Yih0cmltZXNoQm9keS5wb3NpdGlvbiwgci5yaik7CiAgICAgICAgICAgICAgVHJhbnNmb3JtLnZlY3RvclRvV29ybGRGcmFtZSh0cmltZXNoUXVhdCwgci5uaSwgci5uaSk7CiAgICAgICAgICAgICAgVHJhbnNmb3JtLnZlY3RvclRvV29ybGRGcmFtZSh0cmltZXNoUXVhdCwgci5yaSwgci5yaSk7CiAgICAgICAgICAgICAgdGhpcy5yZXN1bHQucHVzaChyKTsKICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZyaWN0aW9uRXF1YXRpb25zRnJvbUNvbnRhY3QociwgdGhpcy5mcmljdGlvblJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gLy8gVHJpYW5nbGUgZmFjZXMKCgogICAgICBjb25zdCB2YSA9IHNwaGVyZVRyaW1lc2hfdmE7CiAgICAgIGNvbnN0IHZiID0gc3BoZXJlVHJpbWVzaF92YjsKICAgICAgY29uc3QgdmMgPSBzcGhlcmVUcmltZXNoX3ZjOwogICAgICBjb25zdCBub3JtYWwgPSBzcGhlcmVUcmltZXNoX25vcm1hbDsKCiAgICAgIGZvciAobGV0IGkgPSAwLCBOID0gdHJpYW5nbGVzLmxlbmd0aDsgaSAhPT0gTjsgaSsrKSB7CiAgICAgICAgdHJpbWVzaFNoYXBlLmdldFRyaWFuZ2xlVmVydGljZXModHJpYW5nbGVzW2ldLCB2YSwgdmIsIHZjKTsKICAgICAgICB0cmltZXNoU2hhcGUuZ2V0Tm9ybWFsKHRyaWFuZ2xlc1tpXSwgbm9ybWFsKTsKICAgICAgICBsb2NhbFNwaGVyZVBvcy52c3ViKHZhLCB0bXApOwogICAgICAgIGxldCBkaXN0ID0gdG1wLmRvdChub3JtYWwpOwogICAgICAgIG5vcm1hbC5zY2FsZShkaXN0LCB0bXApOwogICAgICAgIGxvY2FsU3BoZXJlUG9zLnZzdWIodG1wLCB0bXApOyAvLyB0bXAgaXMgbm93IHRoZSBzcGhlcmUgcG9zaXRpb24gcHJvamVjdGVkIHRvIHRoZSB0cmlhbmdsZSBwbGFuZQoKICAgICAgICBkaXN0ID0gdG1wLmRpc3RhbmNlVG8obG9jYWxTcGhlcmVQb3MpOwoKICAgICAgICBpZiAoUmF5LnBvaW50SW5UcmlhbmdsZSh0bXAsIHZhLCB2YiwgdmMpICYmIGRpc3QgPCBzcGhlcmVTaGFwZS5yYWRpdXMpIHsKICAgICAgICAgIGlmIChqdXN0VGVzdCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBsZXQgciA9IHRoaXMuY3JlYXRlQ29udGFjdEVxdWF0aW9uKHNwaGVyZUJvZHksIHRyaW1lc2hCb2R5LCBzcGhlcmVTaGFwZSwgdHJpbWVzaFNoYXBlLCByc2ksIHJzaik7CiAgICAgICAgICB0bXAudnN1Yihsb2NhbFNwaGVyZVBvcywgci5uaSk7CiAgICAgICAgICByLm5pLm5vcm1hbGl6ZSgpOwogICAgICAgICAgci5uaS5zY2FsZShzcGhlcmVTaGFwZS5yYWRpdXMsIHIucmkpOwogICAgICAgICAgci5yaS52YWRkKHNwaGVyZVBvcywgci5yaSk7CiAgICAgICAgICByLnJpLnZzdWIoc3BoZXJlQm9keS5wb3NpdGlvbiwgci5yaSk7CiAgICAgICAgICBUcmFuc2Zvcm0ucG9pbnRUb1dvcmxkRnJhbWUodHJpbWVzaFBvcywgdHJpbWVzaFF1YXQsIHRtcCwgdG1wKTsKICAgICAgICAgIHRtcC52c3ViKHRyaW1lc2hCb2R5LnBvc2l0aW9uLCByLnJqKTsKICAgICAgICAgIFRyYW5zZm9ybS52ZWN0b3JUb1dvcmxkRnJhbWUodHJpbWVzaFF1YXQsIHIubmksIHIubmkpOwogICAgICAgICAgVHJhbnNmb3JtLnZlY3RvclRvV29ybGRGcmFtZSh0cmltZXNoUXVhdCwgci5yaSwgci5yaSk7CiAgICAgICAgICB0aGlzLnJlc3VsdC5wdXNoKHIpOwogICAgICAgICAgdGhpcy5jcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KHIsIHRoaXMuZnJpY3Rpb25SZXN1bHQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdHJpYW5nbGVzLmxlbmd0aCA9IDA7CiAgICB9CgogICAgcGxhbmVUcmltZXNoKHBsYW5lU2hhcGUsIHRyaW1lc2hTaGFwZSwgcGxhbmVQb3MsIHRyaW1lc2hQb3MsIHBsYW5lUXVhdCwgdHJpbWVzaFF1YXQsIHBsYW5lQm9keSwgdHJpbWVzaEJvZHksIHJzaSwgcnNqLCBqdXN0VGVzdCkgewogICAgICAvLyBNYWtlIGNvbnRhY3RzIQogICAgICBjb25zdCB2ID0gbmV3IFZlYzMoKTsKICAgICAgY29uc3Qgbm9ybWFsID0gcGxhbmVUcmltZXNoX25vcm1hbDsKICAgICAgbm9ybWFsLnNldCgwLCAwLCAxKTsKICAgICAgcGxhbmVRdWF0LnZtdWx0KG5vcm1hbCwgbm9ybWFsKTsgLy8gVHVybiBub3JtYWwgYWNjb3JkaW5nIHRvIHBsYW5lCgogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyaW1lc2hTaGFwZS52ZXJ0aWNlcy5sZW5ndGggLyAzOyBpKyspIHsKICAgICAgICAvLyBHZXQgd29ybGQgdmVydGV4IGZyb20gdHJpbWVzaAogICAgICAgIHRyaW1lc2hTaGFwZS5nZXRWZXJ0ZXgoaSwgdik7IC8vIFNhZmUgdXAKCiAgICAgICAgY29uc3QgdjIgPSBuZXcgVmVjMygpOwogICAgICAgIHYyLmNvcHkodik7CiAgICAgICAgVHJhbnNmb3JtLnBvaW50VG9Xb3JsZEZyYW1lKHRyaW1lc2hQb3MsIHRyaW1lc2hRdWF0LCB2Miwgdik7IC8vIENoZWNrIHBsYW5lIHNpZGUKCiAgICAgICAgY29uc3QgcmVscG9zID0gcGxhbmVUcmltZXNoX3JlbHBvczsKICAgICAgICB2LnZzdWIocGxhbmVQb3MsIHJlbHBvcyk7CiAgICAgICAgY29uc3QgZG90ID0gbm9ybWFsLmRvdChyZWxwb3MpOwoKICAgICAgICBpZiAoZG90IDw9IDAuMCkgewogICAgICAgICAgaWYgKGp1c3RUZXN0KSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQoKICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmNyZWF0ZUNvbnRhY3RFcXVhdGlvbihwbGFuZUJvZHksIHRyaW1lc2hCb2R5LCBwbGFuZVNoYXBlLCB0cmltZXNoU2hhcGUsIHJzaSwgcnNqKTsKICAgICAgICAgIHIubmkuY29weShub3JtYWwpOyAvLyBDb250YWN0IG5vcm1hbCBpcyB0aGUgcGxhbmUgbm9ybWFsCiAgICAgICAgICAvLyBHZXQgdmVydGV4IHBvc2l0aW9uIHByb2plY3RlZCBvbiBwbGFuZQoKICAgICAgICAgIGNvbnN0IHByb2plY3RlZCA9IHBsYW5lVHJpbWVzaF9wcm9qZWN0ZWQ7CiAgICAgICAgICBub3JtYWwuc2NhbGUocmVscG9zLmRvdChub3JtYWwpLCBwcm9qZWN0ZWQpOwogICAgICAgICAgdi52c3ViKHByb2plY3RlZCwgcHJvamVjdGVkKTsgLy8gcmkgaXMgdGhlIHByb2plY3RlZCB3b3JsZCBwb3NpdGlvbiBtaW51cyBwbGFuZSBwb3NpdGlvbgoKICAgICAgICAgIHIucmkuY29weShwcm9qZWN0ZWQpOwogICAgICAgICAgci5yaS52c3ViKHBsYW5lQm9keS5wb3NpdGlvbiwgci5yaSk7CiAgICAgICAgICByLnJqLmNvcHkodik7CiAgICAgICAgICByLnJqLnZzdWIodHJpbWVzaEJvZHkucG9zaXRpb24sIHIucmopOyAvLyBTdG9yZSByZXN1bHQKCiAgICAgICAgICB0aGlzLnJlc3VsdC5wdXNoKHIpOwogICAgICAgICAgdGhpcy5jcmVhdGVGcmljdGlvbkVxdWF0aW9uc0Zyb21Db250YWN0KHIsIHRoaXMuZnJpY3Rpb25SZXN1bHQpOwogICAgICAgIH0KICAgICAgfQogICAgfSAvLyBjb252ZXhUcmltZXNoKAogICAgLy8gICBzaTogQ29udmV4UG9seWhlZHJvbiwgc2o6IFRyaW1lc2gsIHhpOiBWZWMzLCB4ajogVmVjMywgcWk6IFF1YXRlcm5pb24sIHFqOiBRdWF0ZXJuaW9uLAogICAgLy8gICBiaTogQm9keSwgYmo6IEJvZHksIHJzaT86IFNoYXBlIHwgbnVsbCwgcnNqPzogU2hhcGUgfCBudWxsLAogICAgLy8gICBmYWNlTGlzdEE/OiBudW1iZXJbXSB8IG51bGwsIGZhY2VMaXN0Qj86IG51bWJlcltdIHwgbnVsbCwKICAgIC8vICkgewogICAgLy8gICBjb25zdCBzZXBBeGlzID0gY29udmV4Q29udmV4X3NlcEF4aXM7CiAgICAvLyAgIGlmKHhpLmRpc3RhbmNlVG8oeGopID4gc2kuYm91bmRpbmdTcGhlcmVSYWRpdXMgKyBzai5ib3VuZGluZ1NwaGVyZVJhZGl1cyl7CiAgICAvLyAgICAgICByZXR1cm47CiAgICAvLyAgIH0KICAgIC8vICAgLy8gQ29uc3RydWN0IGEgdGVtcCBodWxsIGZvciBlYWNoIHRyaWFuZ2xlCiAgICAvLyAgIGNvbnN0IGh1bGxCID0gbmV3IENvbnZleFBvbHloZWRyb24oKTsKICAgIC8vICAgaHVsbEIuZmFjZXMgPSBbWzAsMSwyXV07CiAgICAvLyAgIGNvbnN0IHZhID0gbmV3IFZlYzMoKTsKICAgIC8vICAgY29uc3QgdmIgPSBuZXcgVmVjMygpOwogICAgLy8gICBjb25zdCB2YyA9IG5ldyBWZWMzKCk7CiAgICAvLyAgIGh1bGxCLnZlcnRpY2VzID0gWwogICAgLy8gICAgICAgdmEsCiAgICAvLyAgICAgICB2YiwKICAgIC8vICAgICAgIHZjCiAgICAvLyAgIF07CiAgICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2ouaW5kaWNlcy5sZW5ndGggLyAzOyBpKyspIHsKICAgIC8vICAgICAgIGNvbnN0IHRyaWFuZ2xlTm9ybWFsID0gbmV3IFZlYzMoKTsKICAgIC8vICAgICAgIHNqLmdldE5vcm1hbChpLCB0cmlhbmdsZU5vcm1hbCk7CiAgICAvLyAgICAgICBodWxsQi5mYWNlTm9ybWFscyA9IFt0cmlhbmdsZU5vcm1hbF07CiAgICAvLyAgICAgICBzai5nZXRUcmlhbmdsZVZlcnRpY2VzKGksIHZhLCB2YiwgdmMpOwogICAgLy8gICAgICAgbGV0IGQgPSBzaS50ZXN0U2VwQXhpcyh0cmlhbmdsZU5vcm1hbCwgaHVsbEIsIHhpLCBxaSwgeGosIHFqKTsKICAgIC8vICAgICAgIGlmKCFkKXsKICAgIC8vICAgICAgICAgICB0cmlhbmdsZU5vcm1hbC5zY2FsZSgtMSwgdHJpYW5nbGVOb3JtYWwpOwogICAgLy8gICAgICAgICAgIGQgPSBzaS50ZXN0U2VwQXhpcyh0cmlhbmdsZU5vcm1hbCwgaHVsbEIsIHhpLCBxaSwgeGosIHFqKTsKICAgIC8vICAgICAgICAgICBpZighZCl7CiAgICAvLyAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgLy8gICAgICAgICAgIH0KICAgIC8vICAgICAgIH0KICAgIC8vICAgICAgIGNvbnN0IHJlczogQ29udmV4UG9seWhlZHJvbkNvbnRhY3RQb2ludFtdID0gW107CiAgICAvLyAgICAgICBjb25zdCBxID0gY29udmV4Q29udmV4X3E7CiAgICAvLyAgICAgICBzaS5jbGlwQWdhaW5zdEh1bGwoeGkscWksaHVsbEIseGoscWosdHJpYW5nbGVOb3JtYWwsLTEwMCwxMDAscmVzKTsKICAgIC8vICAgICAgIGZvcihsZXQgaiA9IDA7IGogIT09IHJlcy5sZW5ndGg7IGorKyl7CiAgICAvLyAgICAgICAgICAgY29uc3QgciA9IHRoaXMuY3JlYXRlQ29udGFjdEVxdWF0aW9uKGJpLGJqLHNpLHNqLHJzaSxyc2opLAogICAgLy8gICAgICAgICAgICAgICByaSA9IHIucmksCiAgICAvLyAgICAgICAgICAgICAgIHJqID0gci5yajsKICAgIC8vICAgICAgICAgICByLm5pLmNvcHkodHJpYW5nbGVOb3JtYWwpOwogICAgLy8gICAgICAgICAgIHIubmkubmVnYXRlKHIubmkpOwogICAgLy8gICAgICAgICAgIHJlc1tqXS5ub3JtYWwubmVnYXRlKHEpOwogICAgLy8gICAgICAgICAgIHEubXVsdChyZXNbal0uZGVwdGgsIHEpOwogICAgLy8gICAgICAgICAgIHJlc1tqXS5wb2ludC52YWRkKHEsIHJpKTsKICAgIC8vICAgICAgICAgICByai5jb3B5KHJlc1tqXS5wb2ludCk7CiAgICAvLyAgICAgICAgICAgLy8gQ29udGFjdCBwb2ludHMgYXJlIGluIHdvcmxkIGNvb3JkaW5hdGVzLiBUcmFuc2Zvcm0gYmFjayB0byByZWxhdGl2ZQogICAgLy8gICAgICAgICAgIHJpLnZzdWIoeGkscmkpOwogICAgLy8gICAgICAgICAgIHJqLnZzdWIoeGoscmopOwogICAgLy8gICAgICAgICAgIC8vIE1ha2UgcmVsYXRpdmUgdG8gYm9kaWVzCiAgICAvLyAgICAgICAgICAgcmkudmFkZCh4aSwgcmkpOwogICAgLy8gICAgICAgICAgIHJpLnZzdWIoYmkucG9zaXRpb24sIHJpKTsKICAgIC8vICAgICAgICAgICByai52YWRkKHhqLCByaik7CiAgICAvLyAgICAgICAgICAgcmoudnN1Yihiai5wb3NpdGlvbiwgcmopOwogICAgLy8gICAgICAgICAgIHJlc3VsdC5wdXNoKHIpOwogICAgLy8gICAgICAgfQogICAgLy8gICB9CiAgICAvLyB9CgoKICB9CiAgY29uc3QgYXZlcmFnZU5vcm1hbCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgYXZlcmFnZUNvbnRhY3RQb2ludEEgPSBuZXcgVmVjMygpOwogIGNvbnN0IGF2ZXJhZ2VDb250YWN0UG9pbnRCID0gbmV3IFZlYzMoKTsKICBjb25zdCB0bXBWZWMxID0gbmV3IFZlYzMoKTsKICBjb25zdCB0bXBWZWMyID0gbmV3IFZlYzMoKTsKICBjb25zdCB0bXBRdWF0MSA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgY29uc3QgdG1wUXVhdDIgPSBuZXcgUXVhdGVybmlvbigpOwoKICBjb25zdCBwbGFuZVRyaW1lc2hfbm9ybWFsID0gbmV3IFZlYzMoKTsKICBjb25zdCBwbGFuZVRyaW1lc2hfcmVscG9zID0gbmV3IFZlYzMoKTsKICBjb25zdCBwbGFuZVRyaW1lc2hfcHJvamVjdGVkID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX25vcm1hbCA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlVHJpbWVzaF9yZWxwb3MgPSBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlVHJpbWVzaF92ID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX3YyID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX2VkZ2VWZXJ0ZXhBID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX2VkZ2VWZXJ0ZXhCID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX2VkZ2VWZWN0b3IgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNwaGVyZVRyaW1lc2hfZWRnZVZlY3RvclVuaXQgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNwaGVyZVRyaW1lc2hfbG9jYWxTcGhlcmVQb3MgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNwaGVyZVRyaW1lc2hfdG1wID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX3ZhID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX3ZiID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX3ZjID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVUcmltZXNoX2xvY2FsU3BoZXJlQUFCQiA9IG5ldyBBQUJCKCk7CiAgY29uc3Qgc3BoZXJlVHJpbWVzaF90cmlhbmdsZXMgPSBbXTsKICBjb25zdCBwb2ludF9vbl9wbGFuZV90b19zcGhlcmUgPSBuZXcgVmVjMygpOwogIGNvbnN0IHBsYW5lX3RvX3NwaGVyZV9vcnRobyA9IG5ldyBWZWMzKCk7IC8vIFNlZSBodHRwOi8vYnVsbGV0cGh5c2ljcy5jb20vQnVsbGV0L0J1bGxldEZ1bGwvU3BoZXJlVHJpYW5nbGVEZXRlY3Rvcl84Y3BwX3NvdXJjZS5odG1sCgogIGNvbnN0IHBvaW50SW5Qb2x5Z29uX2VkZ2UgPSBuZXcgVmVjMygpOwogIGNvbnN0IHBvaW50SW5Qb2x5Z29uX2VkZ2VfeF9ub3JtYWwgPSBuZXcgVmVjMygpOwogIGNvbnN0IHBvaW50SW5Qb2x5Z29uX3Z0cCA9IG5ldyBWZWMzKCk7CgogIGZ1bmN0aW9uIHBvaW50SW5Qb2x5Z29uKHZlcnRzLCBub3JtYWwsIHApIHsKICAgIGxldCBwb3NpdGl2ZVJlc3VsdCA9IG51bGw7CiAgICBjb25zdCBOID0gdmVydHMubGVuZ3RoOwoKICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBOOyBpKyspIHsKICAgICAgY29uc3QgdiA9IHZlcnRzW2ldOyAvLyBHZXQgZWRnZSB0byB0aGUgbmV4dCB2ZXJ0ZXgKCiAgICAgIGNvbnN0IGVkZ2UgPSBwb2ludEluUG9seWdvbl9lZGdlOwogICAgICB2ZXJ0c1soaSArIDEpICUgTl0udnN1Yih2LCBlZGdlKTsgLy8gR2V0IGNyb3NzIHByb2R1Y3QgYmV0d2VlbiBwb2x5Z29uIG5vcm1hbCBhbmQgdGhlIGVkZ2UKCiAgICAgIGNvbnN0IGVkZ2VfeF9ub3JtYWwgPSBwb2ludEluUG9seWdvbl9lZGdlX3hfbm9ybWFsOyAvL2NvbnN0IGVkZ2VfeF9ub3JtYWwgPSBuZXcgVmVjMygpOwoKICAgICAgZWRnZS5jcm9zcyhub3JtYWwsIGVkZ2VfeF9ub3JtYWwpOyAvLyBHZXQgdmVjdG9yIGJldHdlZW4gcG9pbnQgYW5kIGN1cnJlbnQgdmVydGV4CgogICAgICBjb25zdCB2ZXJ0ZXhfdG9fcCA9IHBvaW50SW5Qb2x5Z29uX3Z0cDsKICAgICAgcC52c3ViKHYsIHZlcnRleF90b19wKTsgLy8gVGhpcyBkb3QgcHJvZHVjdCBkZXRlcm1pbmVzIHdoaWNoIHNpZGUgb2YgdGhlIGVkZ2UgdGhlIHBvaW50IGlzCgogICAgICBjb25zdCByID0gZWRnZV94X25vcm1hbC5kb3QodmVydGV4X3RvX3ApOyAvLyBJZiBhbGwgc3VjaCBkb3QgcHJvZHVjdHMgaGF2ZSBzYW1lIHNpZ24sIHdlIGFyZSBpbnNpZGUgdGhlIHBvbHlnb24uCgogICAgICBpZiAocG9zaXRpdmVSZXN1bHQgPT09IG51bGwgfHwgciA+IDAgJiYgcG9zaXRpdmVSZXN1bHQgPT09IHRydWUgfHwgciA8PSAwICYmIHBvc2l0aXZlUmVzdWx0ID09PSBmYWxzZSkgewogICAgICAgIGlmIChwb3NpdGl2ZVJlc3VsdCA9PT0gbnVsbCkgewogICAgICAgICAgcG9zaXRpdmVSZXN1bHQgPSByID4gMDsKICAgICAgICB9CgogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsgLy8gRW5jb3VudGVyZWQgc29tZSBvdGhlciBzaWduLiBFeGl0LgogICAgICB9CiAgICB9IC8vIElmIHdlIGdvdCBoZXJlLCBhbGwgZG90IHByb2R1Y3RzIHdlcmUgb2YgdGhlIHNhbWUgc2lnbi4KCgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBjb25zdCBib3hfdG9fc3BoZXJlID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVCb3hfbnMgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNwaGVyZUJveF9uczEgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNwaGVyZUJveF9uczIgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNwaGVyZUJveF9zaWRlcyA9IFtuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpLCBuZXcgVmVjMygpXTsKICBjb25zdCBzcGhlcmVCb3hfc3BoZXJlX3RvX2Nvcm5lciA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlQm94X3NpZGVfbnMgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNwaGVyZUJveF9zaWRlX25zMSA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlQm94X3NpZGVfbnMyID0gbmV3IFZlYzMoKTsKICBjb25zdCBjb252ZXhfdG9fc3BoZXJlID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVDb252ZXhfZWRnZSA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlQ29udmV4X2VkZ2VVbml0ID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVDb252ZXhfc3BoZXJlVG9Db3JuZXIgPSBuZXcgVmVjMygpOwogIGNvbnN0IHNwaGVyZUNvbnZleF93b3JsZENvcm5lciA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlQ29udmV4X3dvcmxkTm9ybWFsID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVDb252ZXhfd29ybGRQb2ludCA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlQ29udmV4X3dvcmxkU3BoZXJlUG9pbnRDbG9zZXN0VG9QbGFuZSA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlQ29udmV4X3BlbmV0cmF0aW9uVmVjID0gbmV3IFZlYzMoKTsKICBjb25zdCBzcGhlcmVDb252ZXhfc3BoZXJlVG9Xb3JsZFBvaW50ID0gbmV3IFZlYzMoKTsKICBuZXcgVmVjMygpOwogIG5ldyBWZWMzKCk7CiAgY29uc3QgcGxhbmVDb252ZXhfdiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgcGxhbmVDb252ZXhfbm9ybWFsID0gbmV3IFZlYzMoKTsKICBjb25zdCBwbGFuZUNvbnZleF9yZWxwb3MgPSBuZXcgVmVjMygpOwogIGNvbnN0IHBsYW5lQ29udmV4X3Byb2plY3RlZCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY29udmV4Q29udmV4X3NlcEF4aXMgPSBuZXcgVmVjMygpOwogIGNvbnN0IGNvbnZleENvbnZleF9xID0gbmV3IFZlYzMoKTsKICBjb25zdCBwYXJ0aWNsZVBsYW5lX25vcm1hbCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgcGFydGljbGVQbGFuZV9yZWxwb3MgPSBuZXcgVmVjMygpOwogIGNvbnN0IHBhcnRpY2xlUGxhbmVfcHJvamVjdGVkID0gbmV3IFZlYzMoKTsKICBjb25zdCBwYXJ0aWNsZVNwaGVyZV9ub3JtYWwgPSBuZXcgVmVjMygpOyAvLyBXSVAKCiAgY29uc3QgY3FqID0gbmV3IFF1YXRlcm5pb24oKTsKICBjb25zdCBjb252ZXhQYXJ0aWNsZV9sb2NhbCA9IG5ldyBWZWMzKCk7CiAgbmV3IFZlYzMoKTsKICBjb25zdCBjb252ZXhQYXJ0aWNsZV9wZW5ldHJhdGVkRmFjZU5vcm1hbCA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY29udmV4UGFydGljbGVfdmVydGV4VG9QYXJ0aWNsZSA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY29udmV4UGFydGljbGVfd29ybGRQZW5ldHJhdGlvblZlYyA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY29udmV4SGVpZ2h0ZmllbGRfdG1wMSA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY29udmV4SGVpZ2h0ZmllbGRfdG1wMiA9IG5ldyBWZWMzKCk7CiAgY29uc3QgY29udmV4SGVpZ2h0ZmllbGRfZmFjZUxpc3QgPSBbMF07CiAgY29uc3Qgc3BoZXJlSGVpZ2h0ZmllbGRfdG1wMSA9IG5ldyBWZWMzKCk7CiAgY29uc3Qgc3BoZXJlSGVpZ2h0ZmllbGRfdG1wMiA9IG5ldyBWZWMzKCk7CgogIGNsYXNzIE92ZXJsYXBLZWVwZXIgewogICAgLyoqCiAgICAgKiBAdG9kbyBSZW1vdmUgdXNlbGVzcyBjb25zdHJ1Y3RvcgogICAgICovCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy5jdXJyZW50ID0gW107CiAgICAgIHRoaXMucHJldmlvdXMgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogZ2V0S2V5CiAgICAgKi8KCgogICAgZ2V0S2V5KGksIGopIHsKICAgICAgaWYgKGogPCBpKSB7CiAgICAgICAgY29uc3QgdGVtcCA9IGo7CiAgICAgICAgaiA9IGk7CiAgICAgICAgaSA9IHRlbXA7CiAgICAgIH0KCiAgICAgIHJldHVybiBpIDw8IDE2IHwgajsKICAgIH0KICAgIC8qKgogICAgICogc2V0CiAgICAgKi8KCgogICAgc2V0KGksIGopIHsKICAgICAgLy8gSW5zZXJ0aW9uIHNvcnQuIFRoaXMgd2F5IHRoZSBkaWZmIHdpbGwgaGF2ZSBsaW5lYXIgY29tcGxleGl0eS4KICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoaSwgaik7CiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CiAgICAgIGxldCBpbmRleCA9IDA7CgogICAgICB3aGlsZSAoa2V5ID4gY3VycmVudFtpbmRleF0pIHsKICAgICAgICBpbmRleCsrOwogICAgICB9CgogICAgICBpZiAoa2V5ID09PSBjdXJyZW50W2luZGV4XSkgewogICAgICAgIHJldHVybjsgLy8gUGFpciB3YXMgYWxyZWFkeSBhZGRlZAogICAgICB9CgogICAgICBmb3IgKGxldCBqID0gY3VycmVudC5sZW5ndGggLSAxOyBqID49IGluZGV4OyBqLS0pIHsKICAgICAgICBjdXJyZW50W2ogKyAxXSA9IGN1cnJlbnRbal07CiAgICAgIH0KCiAgICAgIGN1cnJlbnRbaW5kZXhdID0ga2V5OwogICAgfQogICAgLyoqCiAgICAgKiB0aWNrCiAgICAgKi8KCgogICAgdGljaygpIHsKICAgICAgY29uc3QgdG1wID0gdGhpcy5jdXJyZW50OwogICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnByZXZpb3VzOwogICAgICB0aGlzLnByZXZpb3VzID0gdG1wOwogICAgICB0aGlzLmN1cnJlbnQubGVuZ3RoID0gMDsKICAgIH0KICAgIC8qKgogICAgICogZ2V0RGlmZgogICAgICovCgoKICAgIGdldERpZmYoYWRkaXRpb25zLCByZW1vdmFscykgewogICAgICBjb25zdCBhID0gdGhpcy5jdXJyZW50OwogICAgICBjb25zdCBiID0gdGhpcy5wcmV2aW91czsKICAgICAgY29uc3QgYWwgPSBhLmxlbmd0aDsKICAgICAgY29uc3QgYmwgPSBiLmxlbmd0aDsKICAgICAgbGV0IGogPSAwOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbDsgaSsrKSB7CiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICAgICAgY29uc3Qga2V5QSA9IGFbaV07CgogICAgICAgIHdoaWxlIChrZXlBID4gYltqXSkgewogICAgICAgICAgaisrOwogICAgICAgIH0KCiAgICAgICAgZm91bmQgPSBrZXlBID09PSBiW2pdOwoKICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICB1bnBhY2tBbmRQdXNoKGFkZGl0aW9ucywga2V5QSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBqID0gMDsKCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmw7IGkrKykgewogICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGNvbnN0IGtleUIgPSBiW2ldOwoKICAgICAgICB3aGlsZSAoa2V5QiA+IGFbal0pIHsKICAgICAgICAgIGorKzsKICAgICAgICB9CgogICAgICAgIGZvdW5kID0gYVtqXSA9PT0ga2V5QjsKCiAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgdW5wYWNrQW5kUHVzaChyZW1vdmFscywga2V5Qik7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogIH0KCiAgZnVuY3Rpb24gdW5wYWNrQW5kUHVzaChhcnJheSwga2V5KSB7CiAgICBhcnJheS5wdXNoKChrZXkgJiAweGZmZmYwMDAwKSA+PiAxNiwga2V5ICYgMHgwMDAwZmZmZik7CiAgfQoKICBjb25zdCBnZXRLZXkgPSAoaSwgaikgPT4gaSA8IGogPyBgJHtpfS0ke2p9YCA6IGAke2p9LSR7aX1gOwogIC8qKgogICAqIFR1cGxlRGljdGlvbmFyeQogICAqLwoKCiAgY2xhc3MgVHVwbGVEaWN0aW9uYXJ5IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLmRhdGEgPSB7CiAgICAgICAga2V5czogW10KICAgICAgfTsKICAgIH0KCiAgICAvKiogZ2V0ICovCiAgICBnZXQoaSwgaikgewogICAgICBjb25zdCBrZXkgPSBnZXRLZXkoaSwgaik7CiAgICAgIHJldHVybiB0aGlzLmRhdGFba2V5XTsKICAgIH0KICAgIC8qKiBzZXQgKi8KCgogICAgc2V0KGksIGosIHZhbHVlKSB7CiAgICAgIGNvbnN0IGtleSA9IGdldEtleShpLCBqKTsgLy8gQ2hlY2sgaWYga2V5IGFscmVhZHkgZXhpc3RzCgogICAgICBpZiAoIXRoaXMuZ2V0KGksIGopKSB7CiAgICAgICAgdGhpcy5kYXRhLmtleXMucHVzaChrZXkpOwogICAgICB9CgogICAgICB0aGlzLmRhdGFba2V5XSA9IHZhbHVlOwogICAgfQogICAgLyoqIGRlbGV0ZSAqLwoKCiAgICBkZWxldGUoaSwgaikgewogICAgICBjb25zdCBrZXkgPSBnZXRLZXkoaSwgaik7CiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhLmtleXMuaW5kZXhPZihrZXkpOwoKICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgIHRoaXMuZGF0YS5rZXlzLnNwbGljZShpbmRleCwgMSk7CiAgICAgIH0KCiAgICAgIGRlbGV0ZSB0aGlzLmRhdGFba2V5XTsKICAgIH0KICAgIC8qKiByZXNldCAqLwoKCiAgICByZXNldCgpIHsKICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKICAgICAgY29uc3Qga2V5cyA9IGRhdGEua2V5czsKCiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCBrZXkgPSBrZXlzLnBvcCgpOwogICAgICAgIGRlbGV0ZSBkYXRhW2tleV07CiAgICAgIH0KICAgIH0KCiAgfQoKICAvKioKICAgKiBUaGUgcGh5c2ljcyB3b3JsZAogICAqLwogIGNsYXNzIFdvcmxkIGV4dGVuZHMgRXZlbnRUYXJnZXQgewogICAgLyoqCiAgICAgKiBDdXJyZW50bHkgLyBsYXN0IHVzZWQgdGltZXN0ZXAuIElzIHNldCB0byAtMSBpZiBub3QgYXZhaWxhYmxlLiBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgYmVmb3JlIGVhY2ggaW50ZXJuYWwgc3RlcCwgd2hpY2ggbWVhbnMgdGhhdCBpdCBpcyAiZnJlc2giIGluc2lkZSBldmVudCBjYWxsYmFja3MuCiAgICAgKi8KCiAgICAvKioKICAgICAqIE1ha2VzIGJvZGllcyBnbyB0byBzbGVlcCB3aGVuIHRoZXkndmUgYmVlbiBpbmFjdGl2ZS4KICAgICAqIEBkZWZhdWx0IGZhbHNlCiAgICAgKi8KCiAgICAvKioKICAgICAqIEFsbCB0aGUgY3VycmVudCBjb250YWN0cyAoaW5zdGFuY2VzIG9mIENvbnRhY3RFcXVhdGlvbikgaW4gdGhlIHdvcmxkLgogICAgICovCgogICAgLyoqCiAgICAgKiBIb3cgb2Z0ZW4gdG8gbm9ybWFsaXplIHF1YXRlcm5pb25zLiBTZXQgdG8gMCBmb3IgZXZlcnkgc3RlcCwgMSBmb3IgZXZlcnkgc2Vjb25kIGV0Yy4uIEEgbGFyZ2VyIHZhbHVlIGluY3JlYXNlcyBwZXJmb3JtYW5jZS4gSWYgYm9kaWVzIHRlbmQgdG8gZXhwbG9kZSwgc2V0IHRvIGEgc21hbGxlciB2YWx1ZSAoemVybyB0byBiZSBzdXJlIG5vdGhpbmcgY2FuIGdvIHdyb25nKS4KICAgICAqIEBkZWZhdWx0IDAKICAgICAqLwoKICAgIC8qKgogICAgICogU2V0IHRvIHRydWUgdG8gdXNlIGZhc3QgcXVhdGVybmlvbiBub3JtYWxpemF0aW9uLiBJdCBpcyBvZnRlbiBlbm91Z2ggYWNjdXJhdGUgdG8gdXNlLgogICAgICogSWYgYm9kaWVzIHRlbmQgdG8gZXhwbG9kZSwgc2V0IHRvIGZhbHNlLgogICAgICogQGRlZmF1bHQgZmFsc2UKICAgICAqLwoKICAgIC8qKgogICAgICogVGhlIHdhbGwtY2xvY2sgdGltZSBzaW5jZSBzaW11bGF0aW9uIHN0YXJ0LgogICAgICovCgogICAgLyoqCiAgICAgKiBOdW1iZXIgb2YgdGltZXN0ZXBzIHRha2VuIHNpbmNlIHN0YXJ0LgogICAgICovCgogICAgLyoqCiAgICAgKiBEZWZhdWx0IGFuZCBsYXN0IHRpbWVzdGVwIHNpemVzLgogICAgICovCgogICAgLyoqCiAgICAgKiBUaGUgZ3Jhdml0eSBvZiB0aGUgd29ybGQuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRoZSBicm9hZHBoYXNlIGFsZ29yaXRobSB0byB1c2UuCiAgICAgKiBAZGVmYXVsdCBOYWl2ZUJyb2FkcGhhc2UKICAgICAqLwoKICAgIC8qKgogICAgICogQWxsIGJvZGllcyBpbiB0aGlzIHdvcmxkCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRydWUgaWYgYW55IGJvZGllcyBhcmUgbm90IHNsZWVwaW5nLCBmYWxzZSBpZiBldmVyeSBib2R5IGlzIHNsZWVwaW5nLgogICAgICovCgogICAgLyoqCiAgICAgKiBUaGUgc29sdmVyIGFsZ29yaXRobSB0byB1c2UuCiAgICAgKiBAZGVmYXVsdCBHU1NvbHZlcgogICAgICovCgogICAgLyoqCiAgICAgKiBjb2xsaXNpb25NYXRyaXgKICAgICAqLwoKICAgIC8qKgogICAgICogQ29sbGlzaW9uTWF0cml4IGZyb20gdGhlIHByZXZpb3VzIHN0ZXAuCiAgICAgKi8KCiAgICAvKioKICAgICAqIEFsbCBhZGRlZCBjb250YWN0bWF0ZXJpYWxzLgogICAgICovCgogICAgLyoqCiAgICAgKiBVc2VkIHRvIGxvb2sgdXAgYSBDb250YWN0TWF0ZXJpYWwgZ2l2ZW4gdHdvIGluc3RhbmNlcyBvZiBNYXRlcmlhbC4KICAgICAqLwoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgbWF0ZXJpYWwgb2YgdGhlIGJvZGllcy4KICAgICAqLwoKICAgIC8qKgogICAgICogVGhpcyBjb250YWN0IG1hdGVyaWFsIGlzIHVzZWQgaWYgbm8gc3VpdGFibGUgY29udGFjdG1hdGVyaWFsIGlzIGZvdW5kIGZvciBhIGNvbnRhY3QuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFRpbWUgYWNjdW11bGF0b3IgZm9yIGludGVycG9sYXRpb24uCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2FmZmVyb25nYW1lcy5jb20vZ2FtZS1waHlzaWNzL2ZpeC15b3VyLXRpbWVzdGVwLwogICAgICovCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVkIGFmdGVyIGEgYm9keSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgd29ybGQuCiAgICAgKi8KCiAgICAvKioKICAgICAqIERpc3BhdGNoZWQgYWZ0ZXIgYSBib2R5IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ybGQuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5kdCA9IC0xOwogICAgICB0aGlzLmFsbG93U2xlZXAgPSAhIW9wdGlvbnMuYWxsb3dTbGVlcDsKICAgICAgdGhpcy5jb250YWN0cyA9IFtdOwogICAgICB0aGlzLmZyaWN0aW9uRXF1YXRpb25zID0gW107CiAgICAgIHRoaXMucXVhdE5vcm1hbGl6ZVNraXAgPSBvcHRpb25zLnF1YXROb3JtYWxpemVTa2lwICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnF1YXROb3JtYWxpemVTa2lwIDogMDsKICAgICAgdGhpcy5xdWF0Tm9ybWFsaXplRmFzdCA9IG9wdGlvbnMucXVhdE5vcm1hbGl6ZUZhc3QgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucXVhdE5vcm1hbGl6ZUZhc3QgOiBmYWxzZTsKICAgICAgdGhpcy50aW1lID0gMC4wOwogICAgICB0aGlzLnN0ZXBudW1iZXIgPSAwOwogICAgICB0aGlzLmRlZmF1bHRfZHQgPSAxIC8gNjA7CiAgICAgIHRoaXMubmV4dElkID0gMDsKICAgICAgdGhpcy5ncmF2aXR5ID0gbmV3IFZlYzMoKTsKCiAgICAgIGlmIChvcHRpb25zLmdyYXZpdHkpIHsKICAgICAgICB0aGlzLmdyYXZpdHkuY29weShvcHRpb25zLmdyYXZpdHkpOwogICAgICB9CgogICAgICB0aGlzLmJyb2FkcGhhc2UgPSBvcHRpb25zLmJyb2FkcGhhc2UgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYnJvYWRwaGFzZSA6IG5ldyBOYWl2ZUJyb2FkcGhhc2UoKTsKICAgICAgdGhpcy5ib2RpZXMgPSBbXTsKICAgICAgdGhpcy5oYXNBY3RpdmVCb2RpZXMgPSBmYWxzZTsKICAgICAgdGhpcy5zb2x2ZXIgPSBvcHRpb25zLnNvbHZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zb2x2ZXIgOiBuZXcgR1NTb2x2ZXIoKTsKICAgICAgdGhpcy5jb25zdHJhaW50cyA9IFtdOwogICAgICB0aGlzLm5hcnJvd3BoYXNlID0gbmV3IE5hcnJvd3BoYXNlKHRoaXMpOwogICAgICB0aGlzLmNvbGxpc2lvbk1hdHJpeCA9IG5ldyBBcnJheUNvbGxpc2lvbk1hdHJpeCgpOwogICAgICB0aGlzLmNvbGxpc2lvbk1hdHJpeFByZXZpb3VzID0gbmV3IEFycmF5Q29sbGlzaW9uTWF0cml4KCk7CiAgICAgIHRoaXMuYm9keU92ZXJsYXBLZWVwZXIgPSBuZXcgT3ZlcmxhcEtlZXBlcigpOwogICAgICB0aGlzLnNoYXBlT3ZlcmxhcEtlZXBlciA9IG5ldyBPdmVybGFwS2VlcGVyKCk7CiAgICAgIHRoaXMuY29udGFjdG1hdGVyaWFscyA9IFtdOwogICAgICB0aGlzLmNvbnRhY3RNYXRlcmlhbFRhYmxlID0gbmV3IFR1cGxlRGljdGlvbmFyeSgpOwogICAgICB0aGlzLmRlZmF1bHRNYXRlcmlhbCA9IG5ldyBNYXRlcmlhbCgnZGVmYXVsdCcpOwogICAgICB0aGlzLmRlZmF1bHRDb250YWN0TWF0ZXJpYWwgPSBuZXcgQ29udGFjdE1hdGVyaWFsKHRoaXMuZGVmYXVsdE1hdGVyaWFsLCB0aGlzLmRlZmF1bHRNYXRlcmlhbCwgewogICAgICAgIGZyaWN0aW9uOiAwLjMsCiAgICAgICAgcmVzdGl0dXRpb246IDAuMAogICAgICB9KTsKICAgICAgdGhpcy5kb1Byb2ZpbGluZyA9IGZhbHNlOwogICAgICB0aGlzLnByb2ZpbGUgPSB7CiAgICAgICAgc29sdmU6IDAsCiAgICAgICAgbWFrZUNvbnRhY3RDb25zdHJhaW50czogMCwKICAgICAgICBicm9hZHBoYXNlOiAwLAogICAgICAgIGludGVncmF0ZTogMCwKICAgICAgICBuYXJyb3dwaGFzZTogMAogICAgICB9OwogICAgICB0aGlzLmFjY3VtdWxhdG9yID0gMDsKICAgICAgdGhpcy5zdWJzeXN0ZW1zID0gW107CiAgICAgIHRoaXMuYWRkQm9keUV2ZW50ID0gewogICAgICAgIHR5cGU6ICdhZGRCb2R5JywKICAgICAgICBib2R5OiBudWxsCiAgICAgIH07CiAgICAgIHRoaXMucmVtb3ZlQm9keUV2ZW50ID0gewogICAgICAgIHR5cGU6ICdyZW1vdmVCb2R5JywKICAgICAgICBib2R5OiBudWxsCiAgICAgIH07CiAgICAgIHRoaXMuaWRUb0JvZHlNYXAgPSB7fTsKICAgICAgdGhpcy5icm9hZHBoYXNlLnNldFdvcmxkKHRoaXMpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIGNvbnRhY3QgbWF0ZXJpYWwgYmV0d2VlbiBtYXRlcmlhbHMgbTEgYW5kIG0yCiAgICAgKiBAcmV0dXJuIFRoZSBjb250YWN0IG1hdGVyaWFsIGlmIGl0IHdhcyBmb3VuZC4KICAgICAqLwoKCiAgICBnZXRDb250YWN0TWF0ZXJpYWwobTEsIG0yKSB7CiAgICAgIHJldHVybiB0aGlzLmNvbnRhY3RNYXRlcmlhbFRhYmxlLmdldChtMS5pZCwgbTIuaWQpOwogICAgfQogICAgLyoqCiAgICAgKiBTdG9yZSBvbGQgY29sbGlzaW9uIHN0YXRlIGluZm8KICAgICAqLwoKCiAgICBjb2xsaXNpb25NYXRyaXhUaWNrKCkgewogICAgICBjb25zdCB0ZW1wID0gdGhpcy5jb2xsaXNpb25NYXRyaXhQcmV2aW91czsKICAgICAgdGhpcy5jb2xsaXNpb25NYXRyaXhQcmV2aW91cyA9IHRoaXMuY29sbGlzaW9uTWF0cml4OwogICAgICB0aGlzLmNvbGxpc2lvbk1hdHJpeCA9IHRlbXA7CiAgICAgIHRoaXMuY29sbGlzaW9uTWF0cml4LnJlc2V0KCk7CiAgICAgIHRoaXMuYm9keU92ZXJsYXBLZWVwZXIudGljaygpOwogICAgICB0aGlzLnNoYXBlT3ZlcmxhcEtlZXBlci50aWNrKCk7CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhIGNvbnN0cmFpbnQgdG8gdGhlIHNpbXVsYXRpb24uCiAgICAgKi8KCgogICAgYWRkQ29uc3RyYWludChjKSB7CiAgICAgIHRoaXMuY29uc3RyYWludHMucHVzaChjKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlcyBhIGNvbnN0cmFpbnQKICAgICAqLwoKCiAgICByZW1vdmVDb25zdHJhaW50KGMpIHsKICAgICAgY29uc3QgaWR4ID0gdGhpcy5jb25zdHJhaW50cy5pbmRleE9mKGMpOwoKICAgICAgaWYgKGlkeCAhPT0gLTEpIHsKICAgICAgICB0aGlzLmNvbnN0cmFpbnRzLnNwbGljZShpZHgsIDEpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJheWNhc3QgdGVzdAogICAgICogQGRlcHJlY2F0ZWQgVXNlIC5yYXljYXN0QWxsLCAucmF5Y2FzdENsb3Nlc3Qgb3IgLnJheWNhc3RBbnkgaW5zdGVhZC4KICAgICAqLwoKCiAgICByYXlUZXN0KGZyb20sIHRvLCByZXN1bHQpIHsKICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJheWNhc3RSZXN1bHQpIHsKICAgICAgICAvLyBEbyByYXljYXN0Q2xvc2VzdAogICAgICAgIHRoaXMucmF5Y2FzdENsb3Nlc3QoZnJvbSwgdG8sIHsKICAgICAgICAgIHNraXBCYWNrZmFjZXM6IHRydWUKICAgICAgICB9LCByZXN1bHQpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIERvIHJheWNhc3RBbGwKICAgICAgICB0aGlzLnJheWNhc3RBbGwoZnJvbSwgdG8sIHsKICAgICAgICAgIHNraXBCYWNrZmFjZXM6IHRydWUKICAgICAgICB9LCByZXN1bHQpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJheSBjYXN0IGFnYWluc3QgYWxsIGJvZGllcy4gVGhlIHByb3ZpZGVkIGNhbGxiYWNrIHdpbGwgYmUgZXhlY3V0ZWQgZm9yIGVhY2ggaGl0IHdpdGggYSBSYXljYXN0UmVzdWx0IGFzIHNpbmdsZSBhcmd1bWVudC4KICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhbnkgYm9keSB3YXMgaGl0LgogICAgICovCgoKICAgIHJheWNhc3RBbGwoZnJvbSwgdG8sIG9wdGlvbnMsIGNhbGxiYWNrKSB7CiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KCiAgICAgIG9wdGlvbnMubW9kZSA9IFJheS5BTEw7CiAgICAgIG9wdGlvbnMuZnJvbSA9IGZyb207CiAgICAgIG9wdGlvbnMudG8gPSB0bzsKICAgICAgb3B0aW9ucy5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICByZXR1cm4gdG1wUmF5LmludGVyc2VjdFdvcmxkKHRoaXMsIG9wdGlvbnMpOwogICAgfQogICAgLyoqCiAgICAgKiBSYXkgY2FzdCwgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IHJlc3VsdC4gTm90ZSB0aGF0IHRoZSBvcmRlciBpcyByYW5kb20gLSBidXQgdGhlIG1ldGhvZCBpcyBmYXN0LgogICAgICogQHJldHVybiBUcnVlIGlmIGFueSBib2R5IHdhcyBoaXQuCiAgICAgKi8KCgogICAgcmF5Y2FzdEFueShmcm9tLCB0bywgb3B0aW9ucywgcmVzdWx0KSB7CiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsKICAgICAgICBvcHRpb25zID0ge307CiAgICAgIH0KCiAgICAgIG9wdGlvbnMubW9kZSA9IFJheS5BTlk7CiAgICAgIG9wdGlvbnMuZnJvbSA9IGZyb207CiAgICAgIG9wdGlvbnMudG8gPSB0bzsKICAgICAgb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgIHJldHVybiB0bXBSYXkuaW50ZXJzZWN0V29ybGQodGhpcywgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIFJheSBjYXN0LCBhbmQgcmV0dXJuIGluZm9ybWF0aW9uIG9mIHRoZSBjbG9zZXN0IGhpdC4KICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhbnkgYm9keSB3YXMgaGl0LgogICAgICovCgoKICAgIHJheWNhc3RDbG9zZXN0KGZyb20sIHRvLCBvcHRpb25zLCByZXN1bHQpIHsKICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgfQoKICAgICAgb3B0aW9ucy5tb2RlID0gUmF5LkNMT1NFU1Q7CiAgICAgIG9wdGlvbnMuZnJvbSA9IGZyb207CiAgICAgIG9wdGlvbnMudG8gPSB0bzsKICAgICAgb3B0aW9ucy5yZXN1bHQgPSByZXN1bHQ7CiAgICAgIHJldHVybiB0bXBSYXkuaW50ZXJzZWN0V29ybGQodGhpcywgb3B0aW9ucyk7CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBhIHJpZ2lkIGJvZHkgdG8gdGhlIHNpbXVsYXRpb24uCiAgICAgKiBAdG9kbyBJZiB0aGUgc2ltdWxhdGlvbiBoYXMgbm90IHlldCBzdGFydGVkLCB3aHkgcmVjcmV0ZSBhbmQgY29weSBhcnJheXMgZm9yIGVhY2ggYm9keT8gQWNjdW11bGF0ZSBpbiBkeW5hbWljIGFycmF5cyBpbiB0aGlzIGNhc2UuCiAgICAgKiBAdG9kbyBBZGRpbmcgYW4gYXJyYXkgb2YgYm9kaWVzIHNob3VsZCBiZSBwb3NzaWJsZS4gVGhpcyB3b3VsZCBzYXZlIHNvbWUgbG9vcHMgdG9vCiAgICAgKi8KCgogICAgYWRkQm9keShib2R5KSB7CiAgICAgIGlmICh0aGlzLmJvZGllcy5pbmNsdWRlcyhib2R5KSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgYm9keS5pbmRleCA9IHRoaXMuYm9kaWVzLmxlbmd0aDsKICAgICAgdGhpcy5ib2RpZXMucHVzaChib2R5KTsKICAgICAgYm9keS53b3JsZCA9IHRoaXM7CiAgICAgIGJvZHkuaW5pdFBvc2l0aW9uLmNvcHkoYm9keS5wb3NpdGlvbik7CiAgICAgIGJvZHkuaW5pdFZlbG9jaXR5LmNvcHkoYm9keS52ZWxvY2l0eSk7CiAgICAgIGJvZHkudGltZUxhc3RTbGVlcHkgPSB0aGlzLnRpbWU7CgogICAgICBpZiAoYm9keSBpbnN0YW5jZW9mIEJvZHkpIHsKICAgICAgICBib2R5LmluaXRBbmd1bGFyVmVsb2NpdHkuY29weShib2R5LmFuZ3VsYXJWZWxvY2l0eSk7CiAgICAgICAgYm9keS5pbml0UXVhdGVybmlvbi5jb3B5KGJvZHkucXVhdGVybmlvbik7CiAgICAgIH0KCiAgICAgIHRoaXMuY29sbGlzaW9uTWF0cml4LnNldE51bU9iamVjdHModGhpcy5ib2RpZXMubGVuZ3RoKTsKICAgICAgdGhpcy5hZGRCb2R5RXZlbnQuYm9keSA9IGJvZHk7CiAgICAgIHRoaXMuaWRUb0JvZHlNYXBbYm9keS5pZF0gPSBib2R5OwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQodGhpcy5hZGRCb2R5RXZlbnQpOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgYSByaWdpZCBib2R5IGZyb20gdGhlIHNpbXVsYXRpb24uCiAgICAgKi8KCgogICAgcmVtb3ZlQm9keShib2R5KSB7CiAgICAgIGJvZHkud29ybGQgPSBudWxsOwogICAgICBjb25zdCBuID0gdGhpcy5ib2RpZXMubGVuZ3RoIC0gMTsKICAgICAgY29uc3QgYm9kaWVzID0gdGhpcy5ib2RpZXM7CiAgICAgIGNvbnN0IGlkeCA9IGJvZGllcy5pbmRleE9mKGJvZHkpOwoKICAgICAgaWYgKGlkeCAhPT0gLTEpIHsKICAgICAgICBib2RpZXMuc3BsaWNlKGlkeCwgMSk7IC8vIFRvZG86IHNob3VsZCB1c2UgYSBnYXJiYWdlIGZyZWUgbWV0aG9kCiAgICAgICAgLy8gUmVjb21wdXRlIGluZGV4CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpICE9PSBib2RpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGJvZGllc1tpXS5pbmRleCA9IGk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmNvbGxpc2lvbk1hdHJpeC5zZXROdW1PYmplY3RzKG4pOwogICAgICAgIHRoaXMucmVtb3ZlQm9keUV2ZW50LmJvZHkgPSBib2R5OwogICAgICAgIGRlbGV0ZSB0aGlzLmlkVG9Cb2R5TWFwW2JvZHkuaWRdOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLnJlbW92ZUJvZHlFdmVudCk7CiAgICAgIH0KICAgIH0KCiAgICBnZXRCb2R5QnlJZChpZCkgewogICAgICByZXR1cm4gdGhpcy5pZFRvQm9keU1hcFtpZF07CiAgICB9CiAgICAvKioKICAgICAqIEB0b2RvIE1ha2UgYSBmYXN0ZXIgbWFwCiAgICAgKi8KCgogICAgZ2V0U2hhcGVCeUlkKGlkKSB7CiAgICAgIGNvbnN0IGJvZGllcyA9IHRoaXMuYm9kaWVzOwoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib2RpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBzaGFwZXMgPSBib2RpZXNbaV0uc2hhcGVzOwoKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNoYXBlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgY29uc3Qgc2hhcGUgPSBzaGFwZXNbal07CgogICAgICAgICAgaWYgKHNoYXBlLmlkID09PSBpZCkgewogICAgICAgICAgICByZXR1cm4gc2hhcGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQWRkcyBhIGNvbnRhY3QgbWF0ZXJpYWwgdG8gdGhlIFdvcmxkCiAgICAgKi8KCgogICAgYWRkQ29udGFjdE1hdGVyaWFsKGNtYXQpIHsKICAgICAgLy8gQWRkIGNvbnRhY3QgbWF0ZXJpYWwKICAgICAgdGhpcy5jb250YWN0bWF0ZXJpYWxzLnB1c2goY21hdCk7IC8vIEFkZCBjdXJyZW50IGNvbnRhY3QgbWF0ZXJpYWwgdG8gdGhlIG1hdGVyaWFsIHRhYmxlCgogICAgICB0aGlzLmNvbnRhY3RNYXRlcmlhbFRhYmxlLnNldChjbWF0Lm1hdGVyaWFsc1swXS5pZCwgY21hdC5tYXRlcmlhbHNbMV0uaWQsIGNtYXQpOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmVzIGEgY29udGFjdCBtYXRlcmlhbCBmcm9tIHRoZSBXb3JsZC4KICAgICAqLwoKCiAgICByZW1vdmVDb250YWN0TWF0ZXJpYWwoY21hdCkgewogICAgICBjb25zdCBpZHggPSB0aGlzLmNvbnRhY3RtYXRlcmlhbHMuaW5kZXhPZihjbWF0KTsKCiAgICAgIGlmIChpZHggPT09IC0xKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB0aGlzLmNvbnRhY3RtYXRlcmlhbHMuc3BsaWNlKGlkeCwgMSk7CiAgICAgIHRoaXMuY29udGFjdE1hdGVyaWFsVGFibGUuZGVsZXRlKGNtYXQubWF0ZXJpYWxzWzBdLmlkLCBjbWF0Lm1hdGVyaWFsc1sxXS5pZCk7CiAgICB9CiAgICAvKioKICAgICAqIFN0ZXAgdGhlIHNpbXVsYXRpb24gZm9yd2FyZCBrZWVwaW5nIHRyYWNrIG9mIGxhc3QgY2FsbGVkIHRpbWUKICAgICAqIHRvIGJlIGFibGUgdG8gc3RlcCB0aGUgd29ybGQgYXQgYSBmaXhlZCByYXRlLCBpbmRlcGVuZGVudGx5IG9mIGZyYW1lcmF0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gZHQgVGhlIGZpeGVkIHRpbWUgc3RlcCBzaXplIHRvIHVzZSAoZGVmYXVsdDogMSAvIDYwKS4KICAgICAqIEBwYXJhbSBtYXhTdWJTdGVwcyBNYXhpbXVtIG51bWJlciBvZiBmaXhlZCBzdGVwcyB0byB0YWtlIHBlciBmdW5jdGlvbiBjYWxsIChkZWZhdWx0OiAxMCkuCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2FmZmVyb25nYW1lcy5jb20vcG9zdC9maXhfeW91cl90aW1lc3RlcC8KICAgICAqIEBleGFtcGxlCiAgICAgKiAgICAgLy8gUnVuIHRoZSBzaW11bGF0aW9uIGluZGVwZW5kZW50bHkgb2YgZnJhbWVyYXRlIGV2ZXJ5IDEgLyA2MCBtcwogICAgICogICAgIHdvcmxkLmZpeGVkU3RlcCgpCiAgICAgKi8KCgogICAgZml4ZWRTdGVwKGR0LCBtYXhTdWJTdGVwcykgewogICAgICBpZiAoZHQgPT09IHZvaWQgMCkgewogICAgICAgIGR0ID0gMSAvIDYwOwogICAgICB9CgogICAgICBpZiAobWF4U3ViU3RlcHMgPT09IHZvaWQgMCkgewogICAgICAgIG1heFN1YlN0ZXBzID0gMTA7CiAgICAgIH0KCiAgICAgIGNvbnN0IHRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAvIDEwMDA7IC8vIHNlY29uZHMKCiAgICAgIGlmICghdGhpcy5sYXN0Q2FsbFRpbWUpIHsKICAgICAgICB0aGlzLnN0ZXAoZHQsIHVuZGVmaW5lZCwgbWF4U3ViU3RlcHMpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHRpbWVTaW5jZUxhc3RDYWxsZWQgPSB0aW1lIC0gdGhpcy5sYXN0Q2FsbFRpbWU7CiAgICAgICAgdGhpcy5zdGVwKGR0LCB0aW1lU2luY2VMYXN0Q2FsbGVkLCBtYXhTdWJTdGVwcyk7CiAgICAgIH0KCiAgICAgIHRoaXMubGFzdENhbGxUaW1lID0gdGltZTsKICAgIH0KICAgIC8qKgogICAgICogU3RlcCB0aGUgcGh5c2ljcyB3b3JsZCBmb3J3YXJkIGluIHRpbWUuCiAgICAgKgogICAgICogVGhlcmUgYXJlIHR3byBtb2Rlcy4gVGhlIHNpbXBsZSBtb2RlIGlzIGZpeGVkIHRpbWVzdGVwcGluZyB3aXRob3V0IGludGVycG9sYXRpb24uIEluIHRoaXMgY2FzZSB5b3Ugb25seSB1c2UgdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGUgc2Vjb25kIGNhc2UgdXNlcyBpbnRlcnBvbGF0aW9uLiBJbiB0aGF0IHlvdSBhbHNvIHByb3ZpZGUgdGhlIHRpbWUgc2luY2UgdGhlIGZ1bmN0aW9uIHdhcyBsYXN0IHVzZWQsIGFzIHdlbGwgYXMgdGhlIG1heGltdW0gZml4ZWQgdGltZXN0ZXBzIHRvIHRha2UuCiAgICAgKgogICAgICogQHBhcmFtIGR0IFRoZSBmaXhlZCB0aW1lIHN0ZXAgc2l6ZSB0byB1c2UuCiAgICAgKiBAcGFyYW0gdGltZVNpbmNlTGFzdENhbGxlZCBUaGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBmdW5jdGlvbiB3YXMgbGFzdCBjYWxsZWQuCiAgICAgKiBAcGFyYW0gbWF4U3ViU3RlcHMgTWF4aW11bSBudW1iZXIgb2YgZml4ZWQgc3RlcHMgdG8gdGFrZSBwZXIgZnVuY3Rpb24gY2FsbCAoZGVmYXVsdDogMTApLgogICAgICogQHNlZSBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxODA0MjYxNTQ1MzEvaHR0cDovL2J1bGxldHBoeXNpY3Mub3JnL21lZGlhd2lraS0xLjUuOC9pbmRleC5waHAvU3RlcHBpbmdfVGhlX1dvcmxkI1doYXRfZG9fdGhlX3BhcmFtZXRlcnNfdG9fYnREeW5hbWljc1dvcmxkOjpzdGVwU2ltdWxhdGlvbl9tZWFuLjNGCiAgICAgKiBAZXhhbXBsZQogICAgICogICAgIC8vIGZpeGVkIHRpbWVzdGVwcGluZyB3aXRob3V0IGludGVycG9sYXRpb24KICAgICAqICAgICB3b3JsZC5zdGVwKDEgLyA2MCkKICAgICAqLwoKCiAgICBzdGVwKGR0LCB0aW1lU2luY2VMYXN0Q2FsbGVkLCBtYXhTdWJTdGVwcykgewogICAgICBpZiAobWF4U3ViU3RlcHMgPT09IHZvaWQgMCkgewogICAgICAgIG1heFN1YlN0ZXBzID0gMTA7CiAgICAgIH0KCiAgICAgIGlmICh0aW1lU2luY2VMYXN0Q2FsbGVkID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBGaXhlZCwgc2ltcGxlIHN0ZXBwaW5nCiAgICAgICAgdGhpcy5pbnRlcm5hbFN0ZXAoZHQpOyAvLyBJbmNyZW1lbnQgdGltZQoKICAgICAgICB0aGlzLnRpbWUgKz0gZHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRvciArPSB0aW1lU2luY2VMYXN0Q2FsbGVkOwogICAgICAgIGNvbnN0IHQwID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgbGV0IHN1YnN0ZXBzID0gMDsKCiAgICAgICAgd2hpbGUgKHRoaXMuYWNjdW11bGF0b3IgPj0gZHQgJiYgc3Vic3RlcHMgPCBtYXhTdWJTdGVwcykgewogICAgICAgICAgLy8gRG8gZml4ZWQgc3RlcHMgdG8gY2F0Y2ggdXAKICAgICAgICAgIHRoaXMuaW50ZXJuYWxTdGVwKGR0KTsKICAgICAgICAgIHRoaXMuYWNjdW11bGF0b3IgLT0gZHQ7CiAgICAgICAgICBzdWJzdGVwcysrOwoKICAgICAgICAgIGlmIChwZXJmb3JtYW5jZS5ub3coKSAtIHQwID4gZHQgKiAxMDAwKSB7CiAgICAgICAgICAgIC8vIFRoZSBmcmFtZXJhdGUgaXMgbm90IGludGVyYWN0aXZlIGFueW1vcmUuCiAgICAgICAgICAgIC8vIFdlIGFyZSBiZWxvdyB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgICAgLy8gQmV0dGVyIGJhaWwgb3V0LgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IC8vIFJlbW92ZSB0aGUgZXhjZXNzIGFjY3VtdWxhdG9yLCBzaW5jZSB3ZSBtYXkgbm90CiAgICAgICAgLy8gaGF2ZSBoYWQgZW5vdWdoIHN1YnN0ZXBzIGF2YWlsYWJsZSB0byBjYXRjaCB1cAoKCiAgICAgICAgdGhpcy5hY2N1bXVsYXRvciA9IHRoaXMuYWNjdW11bGF0b3IgJSBkdDsKICAgICAgICBjb25zdCB0ID0gdGhpcy5hY2N1bXVsYXRvciAvIGR0OwoKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiAhPT0gdGhpcy5ib2RpZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGNvbnN0IGIgPSB0aGlzLmJvZGllc1tqXTsKICAgICAgICAgIGIucHJldmlvdXNQb3NpdGlvbi5sZXJwKGIucG9zaXRpb24sIHQsIGIuaW50ZXJwb2xhdGVkUG9zaXRpb24pOwogICAgICAgICAgYi5wcmV2aW91c1F1YXRlcm5pb24uc2xlcnAoYi5xdWF0ZXJuaW9uLCB0LCBiLmludGVycG9sYXRlZFF1YXRlcm5pb24pOwogICAgICAgICAgYi5wcmV2aW91c1F1YXRlcm5pb24ubm9ybWFsaXplKCk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnRpbWUgKz0gdGltZVNpbmNlTGFzdENhbGxlZDsKICAgICAgfQogICAgfQoKICAgIGludGVybmFsU3RlcChkdCkgewogICAgICB0aGlzLmR0ID0gZHQ7CiAgICAgIGNvbnN0IGNvbnRhY3RzID0gdGhpcy5jb250YWN0czsKICAgICAgY29uc3QgcDEgPSBXb3JsZF9zdGVwX3AxOwogICAgICBjb25zdCBwMiA9IFdvcmxkX3N0ZXBfcDI7CiAgICAgIGNvbnN0IE4gPSB0aGlzLmJvZGllcy5sZW5ndGg7CiAgICAgIGNvbnN0IGJvZGllcyA9IHRoaXMuYm9kaWVzOwogICAgICBjb25zdCBzb2x2ZXIgPSB0aGlzLnNvbHZlcjsKICAgICAgY29uc3QgZ3Jhdml0eSA9IHRoaXMuZ3Jhdml0eTsKICAgICAgY29uc3QgZG9Qcm9maWxpbmcgPSB0aGlzLmRvUHJvZmlsaW5nOwogICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5wcm9maWxlOwogICAgICBjb25zdCBEWU5BTUlDID0gQm9keS5EWU5BTUlDOwogICAgICBsZXQgcHJvZmlsaW5nU3RhcnQgPSAtSW5maW5pdHk7CiAgICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdGhpcy5jb25zdHJhaW50czsKICAgICAgY29uc3QgZnJpY3Rpb25FcXVhdGlvblBvb2wgPSBXb3JsZF9zdGVwX2ZyaWN0aW9uRXF1YXRpb25Qb29sOwogICAgICBncmF2aXR5Lmxlbmd0aCgpOwogICAgICBjb25zdCBneCA9IGdyYXZpdHkueDsKICAgICAgY29uc3QgZ3kgPSBncmF2aXR5Lnk7CiAgICAgIGNvbnN0IGd6ID0gZ3Jhdml0eS56OwogICAgICBsZXQgaSA9IDA7CgogICAgICBpZiAoZG9Qcm9maWxpbmcpIHsKICAgICAgICBwcm9maWxpbmdTdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9IC8vIEFkZCBncmF2aXR5IHRvIGFsbCBvYmplY3RzCgoKICAgICAgZm9yIChpID0gMDsgaSAhPT0gTjsgaSsrKSB7CiAgICAgICAgY29uc3QgYmkgPSBib2RpZXNbaV07CgogICAgICAgIGlmIChiaS50eXBlID09PSBEWU5BTUlDKSB7CiAgICAgICAgICAvLyBPbmx5IGZvciBkeW5hbWljIGJvZGllcwogICAgICAgICAgY29uc3QgZiA9IGJpLmZvcmNlOwogICAgICAgICAgY29uc3QgbSA9IGJpLm1hc3M7CiAgICAgICAgICBmLnggKz0gbSAqIGd4OwogICAgICAgICAgZi55ICs9IG0gKiBneTsKICAgICAgICAgIGYueiArPSBtICogZ3o7CiAgICAgICAgfQogICAgICB9IC8vIFVwZGF0ZSBzdWJzeXN0ZW1zCgoKICAgICAgZm9yIChsZXQgaSA9IDAsIE5zdWJzeXN0ZW1zID0gdGhpcy5zdWJzeXN0ZW1zLmxlbmd0aDsgaSAhPT0gTnN1YnN5c3RlbXM7IGkrKykgewogICAgICAgIHRoaXMuc3Vic3lzdGVtc1tpXS51cGRhdGUoKTsKICAgICAgfSAvLyBDb2xsaXNpb24gZGV0ZWN0aW9uCgoKICAgICAgaWYgKGRvUHJvZmlsaW5nKSB7CiAgICAgICAgcHJvZmlsaW5nU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgfQoKICAgICAgcDEubGVuZ3RoID0gMDsgLy8gQ2xlYW4gdXAgcGFpciBhcnJheXMgZnJvbSBsYXN0IHN0ZXAKCiAgICAgIHAyLmxlbmd0aCA9IDA7CiAgICAgIHRoaXMuYnJvYWRwaGFzZS5jb2xsaXNpb25QYWlycyh0aGlzLCBwMSwgcDIpOwoKICAgICAgaWYgKGRvUHJvZmlsaW5nKSB7CiAgICAgICAgcHJvZmlsZS5icm9hZHBoYXNlID0gcGVyZm9ybWFuY2Uubm93KCkgLSBwcm9maWxpbmdTdGFydDsKICAgICAgfSAvLyBSZW1vdmUgY29uc3RyYWluZWQgcGFpcnMgd2l0aCBjb2xsaWRlQ29ubmVjdGVkID09IGZhbHNlCgoKICAgICAgbGV0IE5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzLmxlbmd0aDsKCiAgICAgIGZvciAoaSA9IDA7IGkgIT09IE5jb25zdHJhaW50czsgaSsrKSB7CiAgICAgICAgY29uc3QgYyA9IGNvbnN0cmFpbnRzW2ldOwoKICAgICAgICBpZiAoIWMuY29sbGlkZUNvbm5lY3RlZCkgewogICAgICAgICAgZm9yIChsZXQgaiA9IHAxLmxlbmd0aCAtIDE7IGogPj0gMDsgaiAtPSAxKSB7CiAgICAgICAgICAgIGlmIChjLmJvZHlBID09PSBwMVtqXSAmJiBjLmJvZHlCID09PSBwMltqXSB8fCBjLmJvZHlCID09PSBwMVtqXSAmJiBjLmJvZHlBID09PSBwMltqXSkgewogICAgICAgICAgICAgIHAxLnNwbGljZShqLCAxKTsKICAgICAgICAgICAgICBwMi5zcGxpY2UoaiwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRoaXMuY29sbGlzaW9uTWF0cml4VGljaygpOyAvLyBHZW5lcmF0ZSBjb250YWN0cwoKICAgICAgaWYgKGRvUHJvZmlsaW5nKSB7CiAgICAgICAgcHJvZmlsaW5nU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgfQoKICAgICAgY29uc3Qgb2xkY29udGFjdHMgPSBXb3JsZF9zdGVwX29sZENvbnRhY3RzOwogICAgICBjb25zdCBOb2xkQ29udGFjdHMgPSBjb250YWN0cy5sZW5ndGg7CgogICAgICBmb3IgKGkgPSAwOyBpICE9PSBOb2xkQ29udGFjdHM7IGkrKykgewogICAgICAgIG9sZGNvbnRhY3RzLnB1c2goY29udGFjdHNbaV0pOwogICAgICB9CgogICAgICBjb250YWN0cy5sZW5ndGggPSAwOyAvLyBUcmFuc2ZlciBGcmljdGlvbkVxdWF0aW9uIGZyb20gY3VycmVudCBsaXN0IHRvIHRoZSBwb29sIGZvciByZXVzZQoKICAgICAgY29uc3QgTm9sZEZyaWN0aW9uRXF1YXRpb25zID0gdGhpcy5mcmljdGlvbkVxdWF0aW9ucy5sZW5ndGg7CgogICAgICBmb3IgKGkgPSAwOyBpICE9PSBOb2xkRnJpY3Rpb25FcXVhdGlvbnM7IGkrKykgewogICAgICAgIGZyaWN0aW9uRXF1YXRpb25Qb29sLnB1c2godGhpcy5mcmljdGlvbkVxdWF0aW9uc1tpXSk7CiAgICAgIH0KCiAgICAgIHRoaXMuZnJpY3Rpb25FcXVhdGlvbnMubGVuZ3RoID0gMDsKICAgICAgdGhpcy5uYXJyb3dwaGFzZS5nZXRDb250YWN0cyhwMSwgcDIsIHRoaXMsIGNvbnRhY3RzLCBvbGRjb250YWN0cywgLy8gVG8gYmUgcmV1c2VkCiAgICAgIHRoaXMuZnJpY3Rpb25FcXVhdGlvbnMsIGZyaWN0aW9uRXF1YXRpb25Qb29sKTsKCiAgICAgIGlmIChkb1Byb2ZpbGluZykgewogICAgICAgIHByb2ZpbGUubmFycm93cGhhc2UgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHByb2ZpbGluZ1N0YXJ0OwogICAgICB9IC8vIExvb3Agb3ZlciBhbGwgY29sbGlzaW9ucwoKCiAgICAgIGlmIChkb1Byb2ZpbGluZykgewogICAgICAgIHByb2ZpbGluZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgIH0gLy8gQWRkIGFsbCBmcmljdGlvbiBlcXMKCgogICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5mcmljdGlvbkVxdWF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIHNvbHZlci5hZGRFcXVhdGlvbih0aGlzLmZyaWN0aW9uRXF1YXRpb25zW2ldKTsKICAgICAgfQoKICAgICAgY29uc3QgbmNvbnRhY3RzID0gY29udGFjdHMubGVuZ3RoOwoKICAgICAgZm9yIChsZXQgayA9IDA7IGsgIT09IG5jb250YWN0czsgaysrKSB7CiAgICAgICAgLy8gQ3VycmVudCBjb250YWN0CiAgICAgICAgY29uc3QgYyA9IGNvbnRhY3RzW2tdOyAvLyBHZXQgY3VycmVudCBjb2xsaXNpb24gaW5kZWNlcwoKICAgICAgICBjb25zdCBiaSA9IGMuYmk7CiAgICAgICAgY29uc3QgYmogPSBjLmJqOwogICAgICAgIGNvbnN0IHNpID0gYy5zaTsKICAgICAgICBjb25zdCBzaiA9IGMuc2o7IC8vIEdldCBjb2xsaXNpb24gcHJvcGVydGllcwoKICAgICAgICBsZXQgY207CgogICAgICAgIGlmIChiaS5tYXRlcmlhbCAmJiBiai5tYXRlcmlhbCkgewogICAgICAgICAgY20gPSB0aGlzLmdldENvbnRhY3RNYXRlcmlhbChiaS5tYXRlcmlhbCwgYmoubWF0ZXJpYWwpIHx8IHRoaXMuZGVmYXVsdENvbnRhY3RNYXRlcmlhbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY20gPSB0aGlzLmRlZmF1bHRDb250YWN0TWF0ZXJpYWw7CiAgICAgICAgfSAvLyBjLmVuYWJsZWQgPSBiaS5jb2xsaXNpb25SZXNwb25zZSAmJiBiai5jb2xsaXNpb25SZXNwb25zZSAmJiBzaS5jb2xsaXNpb25SZXNwb25zZSAmJiBzai5jb2xsaXNpb25SZXNwb25zZTsKCgogICAgICAgIGNtLmZyaWN0aW9uOyAvLyBjLnJlc3RpdHV0aW9uID0gY20ucmVzdGl0dXRpb247CiAgICAgICAgLy8gSWYgZnJpY3Rpb24gb3IgcmVzdGl0dXRpb24gd2VyZSBzcGVjaWZpZWQgaW4gdGhlIG1hdGVyaWFsLCB1c2UgdGhlbQoKICAgICAgICBpZiAoYmkubWF0ZXJpYWwgJiYgYmoubWF0ZXJpYWwpIHsKICAgICAgICAgIGlmIChiaS5tYXRlcmlhbC5mcmljdGlvbiA+PSAwICYmIGJqLm1hdGVyaWFsLmZyaWN0aW9uID49IDApIHsKICAgICAgICAgICAgYmkubWF0ZXJpYWwuZnJpY3Rpb24gKiBiai5tYXRlcmlhbC5mcmljdGlvbjsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoYmkubWF0ZXJpYWwucmVzdGl0dXRpb24gPj0gMCAmJiBiai5tYXRlcmlhbC5yZXN0aXR1dGlvbiA+PSAwKSB7CiAgICAgICAgICAgIGMucmVzdGl0dXRpb24gPSBiaS5tYXRlcmlhbC5yZXN0aXR1dGlvbiAqIGJqLm1hdGVyaWFsLnJlc3RpdHV0aW9uOwogICAgICAgICAgfQogICAgICAgIH0gLy8gYy5zZXRTcG9va1BhcmFtcygKICAgICAgICAvLyAgICAgICAgICAgY20uY29udGFjdEVxdWF0aW9uU3RpZmZuZXNzLAogICAgICAgIC8vICAgICAgICAgICBjbS5jb250YWN0RXF1YXRpb25SZWxheGF0aW9uLAogICAgICAgIC8vICAgICAgICAgICBkdAogICAgICAgIC8vICAgICAgICk7CgoKICAgICAgICBzb2x2ZXIuYWRkRXF1YXRpb24oYyk7IC8vIC8vIEFkZCBmcmljdGlvbiBjb25zdHJhaW50IGVxdWF0aW9uCiAgICAgICAgLy8gaWYobXUgPiAwKXsKICAgICAgICAvLyAJLy8gQ3JlYXRlIDIgdGFuZ2VudCBlcXVhdGlvbnMKICAgICAgICAvLyAJY29uc3QgbXVnID0gbXUgKiBnbm9ybTsKICAgICAgICAvLyAJY29uc3QgcmVkdWNlZE1hc3MgPSAoYmkuaW52TWFzcyArIGJqLmludk1hc3MpOwogICAgICAgIC8vIAlpZihyZWR1Y2VkTWFzcyA+IDApewogICAgICAgIC8vIAkJcmVkdWNlZE1hc3MgPSAxL3JlZHVjZWRNYXNzOwogICAgICAgIC8vIAl9CiAgICAgICAgLy8gCWNvbnN0IHBvb2wgPSBmcmljdGlvbkVxdWF0aW9uUG9vbDsKICAgICAgICAvLyAJY29uc3QgYzEgPSBwb29sLmxlbmd0aCA/IHBvb2wucG9wKCkgOiBuZXcgRnJpY3Rpb25FcXVhdGlvbihiaSxiaixtdWcqcmVkdWNlZE1hc3MpOwogICAgICAgIC8vIAljb25zdCBjMiA9IHBvb2wubGVuZ3RoID8gcG9vbC5wb3AoKSA6IG5ldyBGcmljdGlvbkVxdWF0aW9uKGJpLGJqLG11ZypyZWR1Y2VkTWFzcyk7CiAgICAgICAgLy8gCXRoaXMuZnJpY3Rpb25FcXVhdGlvbnMucHVzaChjMSwgYzIpOwogICAgICAgIC8vIAljMS5iaSA9IGMyLmJpID0gYmk7CiAgICAgICAgLy8gCWMxLmJqID0gYzIuYmogPSBiajsKICAgICAgICAvLyAJYzEubWluRm9yY2UgPSBjMi5taW5Gb3JjZSA9IC1tdWcqcmVkdWNlZE1hc3M7CiAgICAgICAgLy8gCWMxLm1heEZvcmNlID0gYzIubWF4Rm9yY2UgPSBtdWcqcmVkdWNlZE1hc3M7CiAgICAgICAgLy8gCS8vIENvcHkgb3ZlciB0aGUgcmVsYXRpdmUgdmVjdG9ycwogICAgICAgIC8vIAljMS5yaS5jb3B5KGMucmkpOwogICAgICAgIC8vIAljMS5yai5jb3B5KGMucmopOwogICAgICAgIC8vIAljMi5yaS5jb3B5KGMucmkpOwogICAgICAgIC8vIAljMi5yai5jb3B5KGMucmopOwogICAgICAgIC8vIAkvLyBDb25zdHJ1Y3QgdGFuZ2VudHMKICAgICAgICAvLyAJYy5uaS50YW5nZW50cyhjMS50LCBjMi50KTsKICAgICAgICAvLyAgICAgICAgICAgLy8gU2V0IHNwb29rIHBhcmFtcwogICAgICAgIC8vICAgICAgICAgICBjMS5zZXRTcG9va1BhcmFtcyhjbS5mcmljdGlvbkVxdWF0aW9uU3RpZmZuZXNzLCBjbS5mcmljdGlvbkVxdWF0aW9uUmVsYXhhdGlvbiwgZHQpOwogICAgICAgIC8vICAgICAgICAgICBjMi5zZXRTcG9va1BhcmFtcyhjbS5mcmljdGlvbkVxdWF0aW9uU3RpZmZuZXNzLCBjbS5mcmljdGlvbkVxdWF0aW9uUmVsYXhhdGlvbiwgZHQpOwogICAgICAgIC8vICAgICAgICAgICBjMS5lbmFibGVkID0gYzIuZW5hYmxlZCA9IGMuZW5hYmxlZDsKICAgICAgICAvLyAJLy8gQWRkIGVxdWF0aW9ucyB0byBzb2x2ZXIKICAgICAgICAvLyAJc29sdmVyLmFkZEVxdWF0aW9uKGMxKTsKICAgICAgICAvLyAJc29sdmVyLmFkZEVxdWF0aW9uKGMyKTsKICAgICAgICAvLyB9CgogICAgICAgIGlmIChiaS5hbGxvd1NsZWVwICYmIGJpLnR5cGUgPT09IEJvZHkuRFlOQU1JQyAmJiBiaS5zbGVlcFN0YXRlID09PSBCb2R5LlNMRUVQSU5HICYmIGJqLnNsZWVwU3RhdGUgPT09IEJvZHkuQVdBS0UgJiYgYmoudHlwZSAhPT0gQm9keS5TVEFUSUMpIHsKICAgICAgICAgIGNvbnN0IHNwZWVkU3F1YXJlZEIgPSBiai52ZWxvY2l0eS5sZW5ndGhTcXVhcmVkKCkgKyBiai5hbmd1bGFyVmVsb2NpdHkubGVuZ3RoU3F1YXJlZCgpOwogICAgICAgICAgY29uc3Qgc3BlZWRMaW1pdFNxdWFyZWRCID0gYmouc2xlZXBTcGVlZExpbWl0ICoqIDI7CgogICAgICAgICAgaWYgKHNwZWVkU3F1YXJlZEIgPj0gc3BlZWRMaW1pdFNxdWFyZWRCICogMikgewogICAgICAgICAgICBiaS53YWtlVXBBZnRlck5hcnJvd3BoYXNlID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChiai5hbGxvd1NsZWVwICYmIGJqLnR5cGUgPT09IEJvZHkuRFlOQU1JQyAmJiBiai5zbGVlcFN0YXRlID09PSBCb2R5LlNMRUVQSU5HICYmIGJpLnNsZWVwU3RhdGUgPT09IEJvZHkuQVdBS0UgJiYgYmkudHlwZSAhPT0gQm9keS5TVEFUSUMpIHsKICAgICAgICAgIGNvbnN0IHNwZWVkU3F1YXJlZEEgPSBiaS52ZWxvY2l0eS5sZW5ndGhTcXVhcmVkKCkgKyBiaS5hbmd1bGFyVmVsb2NpdHkubGVuZ3RoU3F1YXJlZCgpOwogICAgICAgICAgY29uc3Qgc3BlZWRMaW1pdFNxdWFyZWRBID0gYmkuc2xlZXBTcGVlZExpbWl0ICoqIDI7CgogICAgICAgICAgaWYgKHNwZWVkU3F1YXJlZEEgPj0gc3BlZWRMaW1pdFNxdWFyZWRBICogMikgewogICAgICAgICAgICBiai53YWtlVXBBZnRlck5hcnJvd3BoYXNlID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IC8vIE5vdyB3ZSBrbm93IHRoYXQgaSBhbmQgaiBhcmUgaW4gY29udGFjdC4gU2V0IGNvbGxpc2lvbiBtYXRyaXggc3RhdGUKCgogICAgICAgIHRoaXMuY29sbGlzaW9uTWF0cml4LnNldChiaSwgYmosIHRydWUpOwoKICAgICAgICBpZiAoIXRoaXMuY29sbGlzaW9uTWF0cml4UHJldmlvdXMuZ2V0KGJpLCBiaikpIHsKICAgICAgICAgIC8vIEZpcnN0IGNvbnRhY3QhCiAgICAgICAgICAvLyBXZSByZXVzZSB0aGUgY29sbGlkZUV2ZW50IG9iamVjdCwgb3RoZXJ3aXNlIHdlIHdpbGwgZW5kIHVwIGNyZWF0aW5nIG5ldyBvYmplY3RzIGZvciBlYWNoIG5ldyBjb250YWN0LCBldmVuIGlmIHRoZXJlJ3Mgbm8gZXZlbnQgbGlzdGVuZXIgYXR0YWNoZWQuCiAgICAgICAgICBXb3JsZF9zdGVwX2NvbGxpZGVFdmVudC5ib2R5ID0gYmo7CiAgICAgICAgICBXb3JsZF9zdGVwX2NvbGxpZGVFdmVudC5jb250YWN0ID0gYzsKICAgICAgICAgIGJpLmRpc3BhdGNoRXZlbnQoV29ybGRfc3RlcF9jb2xsaWRlRXZlbnQpOwogICAgICAgICAgV29ybGRfc3RlcF9jb2xsaWRlRXZlbnQuYm9keSA9IGJpOwogICAgICAgICAgYmouZGlzcGF0Y2hFdmVudChXb3JsZF9zdGVwX2NvbGxpZGVFdmVudCk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmJvZHlPdmVybGFwS2VlcGVyLnNldChiaS5pZCwgYmouaWQpOwogICAgICAgIHRoaXMuc2hhcGVPdmVybGFwS2VlcGVyLnNldChzaS5pZCwgc2ouaWQpOwogICAgICB9CgogICAgICB0aGlzLmVtaXRDb250YWN0RXZlbnRzKCk7CgogICAgICBpZiAoZG9Qcm9maWxpbmcpIHsKICAgICAgICBwcm9maWxlLm1ha2VDb250YWN0Q29uc3RyYWludHMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHByb2ZpbGluZ1N0YXJ0OwogICAgICAgIHByb2ZpbGluZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgIH0gLy8gV2FrZSB1cCBib2RpZXMKCgogICAgICBmb3IgKGkgPSAwOyBpICE9PSBOOyBpKyspIHsKICAgICAgICBjb25zdCBiaSA9IGJvZGllc1tpXTsKCiAgICAgICAgaWYgKGJpLndha2VVcEFmdGVyTmFycm93cGhhc2UpIHsKICAgICAgICAgIGJpLndha2VVcCgpOwogICAgICAgICAgYmkud2FrZVVwQWZ0ZXJOYXJyb3dwaGFzZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSAvLyBBZGQgdXNlci1hZGRlZCBjb25zdHJhaW50cwoKCiAgICAgIE5jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzLmxlbmd0aDsKCiAgICAgIGZvciAoaSA9IDA7IGkgIT09IE5jb25zdHJhaW50czsgaSsrKSB7CiAgICAgICAgY29uc3QgYyA9IGNvbnN0cmFpbnRzW2ldOwogICAgICAgIGMudXBkYXRlKCk7CgogICAgICAgIGZvciAobGV0IGogPSAwLCBOZXEgPSBjLmVxdWF0aW9ucy5sZW5ndGg7IGogIT09IE5lcTsgaisrKSB7CiAgICAgICAgICBjb25zdCBlcSA9IGMuZXF1YXRpb25zW2pdOwogICAgICAgICAgc29sdmVyLmFkZEVxdWF0aW9uKGVxKTsKICAgICAgICB9CiAgICAgIH0gLy8gU29sdmUgdGhlIGNvbnN0cmFpbmVkIHN5c3RlbQoKCiAgICAgIHNvbHZlci5zb2x2ZShkdCwgdGhpcyk7CgogICAgICBpZiAoZG9Qcm9maWxpbmcpIHsKICAgICAgICBwcm9maWxlLnNvbHZlID0gcGVyZm9ybWFuY2Uubm93KCkgLSBwcm9maWxpbmdTdGFydDsKICAgICAgfSAvLyBSZW1vdmUgYWxsIGNvbnRhY3RzIGZyb20gc29sdmVyCgoKICAgICAgc29sdmVyLnJlbW92ZUFsbEVxdWF0aW9ucygpOyAvLyBBcHBseSBkYW1waW5nLCBzZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2J1bGxldC9pc3N1ZXMvZGV0YWlsP2lkPTc0IGZvciBkZXRhaWxzCgogICAgICBjb25zdCBwb3cgPSBNYXRoLnBvdzsKCiAgICAgIGZvciAoaSA9IDA7IGkgIT09IE47IGkrKykgewogICAgICAgIGNvbnN0IGJpID0gYm9kaWVzW2ldOwoKICAgICAgICBpZiAoYmkudHlwZSAmIERZTkFNSUMpIHsKICAgICAgICAgIC8vIE9ubHkgZm9yIGR5bmFtaWMgYm9kaWVzCiAgICAgICAgICBjb25zdCBsZCA9IHBvdygxLjAgLSBiaS5saW5lYXJEYW1waW5nLCBkdCk7CiAgICAgICAgICBjb25zdCB2ID0gYmkudmVsb2NpdHk7CiAgICAgICAgICB2LnNjYWxlKGxkLCB2KTsKICAgICAgICAgIGNvbnN0IGF2ID0gYmkuYW5ndWxhclZlbG9jaXR5OwoKICAgICAgICAgIGlmIChhdikgewogICAgICAgICAgICBjb25zdCBhZCA9IHBvdygxLjAgLSBiaS5hbmd1bGFyRGFtcGluZywgZHQpOwogICAgICAgICAgICBhdi5zY2FsZShhZCwgYXYpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFdvcmxkX3N0ZXBfcHJlU3RlcEV2ZW50KTsgLy8gTGVhcCBmcm9nCiAgICAgIC8vIHZuZXcgPSB2ICsgaCpmL20KICAgICAgLy8geG5ldyA9IHggKyBoKnZuZXcKCiAgICAgIGlmIChkb1Byb2ZpbGluZykgewogICAgICAgIHByb2ZpbGluZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IHN0ZXBudW1iZXIgPSB0aGlzLnN0ZXBudW1iZXI7CiAgICAgIGNvbnN0IHF1YXROb3JtYWxpemUgPSBzdGVwbnVtYmVyICUgKHRoaXMucXVhdE5vcm1hbGl6ZVNraXAgKyAxKSA9PT0gMDsKICAgICAgY29uc3QgcXVhdE5vcm1hbGl6ZUZhc3QgPSB0aGlzLnF1YXROb3JtYWxpemVGYXN0OwoKICAgICAgZm9yIChpID0gMDsgaSAhPT0gTjsgaSsrKSB7CiAgICAgICAgYm9kaWVzW2ldLmludGVncmF0ZShkdCwgcXVhdE5vcm1hbGl6ZSwgcXVhdE5vcm1hbGl6ZUZhc3QpOwogICAgICB9CgogICAgICB0aGlzLmNsZWFyRm9yY2VzKCk7CiAgICAgIHRoaXMuYnJvYWRwaGFzZS5kaXJ0eSA9IHRydWU7CgogICAgICBpZiAoZG9Qcm9maWxpbmcpIHsKICAgICAgICBwcm9maWxlLmludGVncmF0ZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gcHJvZmlsaW5nU3RhcnQ7CiAgICAgIH0gLy8gVXBkYXRlIHN0ZXAgbnVtYmVyCgoKICAgICAgdGhpcy5zdGVwbnVtYmVyICs9IDE7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChXb3JsZF9zdGVwX3Bvc3RTdGVwRXZlbnQpOyAvLyBTbGVlcGluZyB1cGRhdGUKCiAgICAgIGxldCBoYXNBY3RpdmVCb2RpZXMgPSB0cnVlOwoKICAgICAgaWYgKHRoaXMuYWxsb3dTbGVlcCkgewogICAgICAgIGhhc0FjdGl2ZUJvZGllcyA9IGZhbHNlOwoKICAgICAgICBmb3IgKGkgPSAwOyBpICE9PSBOOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGJpID0gYm9kaWVzW2ldOwogICAgICAgICAgYmkuc2xlZXBUaWNrKHRoaXMudGltZSk7CgogICAgICAgICAgaWYgKGJpLnNsZWVwU3RhdGUgIT09IEJvZHkuU0xFRVBJTkcpIHsKICAgICAgICAgICAgaGFzQWN0aXZlQm9kaWVzID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRoaXMuaGFzQWN0aXZlQm9kaWVzID0gaGFzQWN0aXZlQm9kaWVzOwogICAgfQoKICAgIGVtaXRDb250YWN0RXZlbnRzKCkgewogICAgICBjb25zdCBoYXNCZWdpbkNvbnRhY3QgPSB0aGlzLmhhc0FueUV2ZW50TGlzdGVuZXIoJ2JlZ2luQ29udGFjdCcpOwogICAgICBjb25zdCBoYXNFbmRDb250YWN0ID0gdGhpcy5oYXNBbnlFdmVudExpc3RlbmVyKCdlbmRDb250YWN0Jyk7CgogICAgICBpZiAoaGFzQmVnaW5Db250YWN0IHx8IGhhc0VuZENvbnRhY3QpIHsKICAgICAgICB0aGlzLmJvZHlPdmVybGFwS2VlcGVyLmdldERpZmYoYWRkaXRpb25zLCByZW1vdmFscyk7CiAgICAgIH0KCiAgICAgIGlmIChoYXNCZWdpbkNvbnRhY3QpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGFkZGl0aW9ucy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKICAgICAgICAgIGJlZ2luQ29udGFjdEV2ZW50LmJvZHlBID0gdGhpcy5nZXRCb2R5QnlJZChhZGRpdGlvbnNbaV0pOwogICAgICAgICAgYmVnaW5Db250YWN0RXZlbnQuYm9keUIgPSB0aGlzLmdldEJvZHlCeUlkKGFkZGl0aW9uc1tpICsgMV0pOwogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGJlZ2luQ29udGFjdEV2ZW50KTsKICAgICAgICB9CgogICAgICAgIGJlZ2luQ29udGFjdEV2ZW50LmJvZHlBID0gYmVnaW5Db250YWN0RXZlbnQuYm9keUIgPSBudWxsOwogICAgICB9CgogICAgICBpZiAoaGFzRW5kQ29udGFjdCkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gcmVtb3ZhbHMubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7CiAgICAgICAgICBlbmRDb250YWN0RXZlbnQuYm9keUEgPSB0aGlzLmdldEJvZHlCeUlkKHJlbW92YWxzW2ldKTsKICAgICAgICAgIGVuZENvbnRhY3RFdmVudC5ib2R5QiA9IHRoaXMuZ2V0Qm9keUJ5SWQocmVtb3ZhbHNbaSArIDFdKTsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChlbmRDb250YWN0RXZlbnQpOwogICAgICAgIH0KCiAgICAgICAgZW5kQ29udGFjdEV2ZW50LmJvZHlBID0gZW5kQ29udGFjdEV2ZW50LmJvZHlCID0gbnVsbDsKICAgICAgfQoKICAgICAgYWRkaXRpb25zLmxlbmd0aCA9IHJlbW92YWxzLmxlbmd0aCA9IDA7CiAgICAgIGNvbnN0IGhhc0JlZ2luU2hhcGVDb250YWN0ID0gdGhpcy5oYXNBbnlFdmVudExpc3RlbmVyKCdiZWdpblNoYXBlQ29udGFjdCcpOwogICAgICBjb25zdCBoYXNFbmRTaGFwZUNvbnRhY3QgPSB0aGlzLmhhc0FueUV2ZW50TGlzdGVuZXIoJ2VuZFNoYXBlQ29udGFjdCcpOwoKICAgICAgaWYgKGhhc0JlZ2luU2hhcGVDb250YWN0IHx8IGhhc0VuZFNoYXBlQ29udGFjdCkgewogICAgICAgIHRoaXMuc2hhcGVPdmVybGFwS2VlcGVyLmdldERpZmYoYWRkaXRpb25zLCByZW1vdmFscyk7CiAgICAgIH0KCiAgICAgIGlmIChoYXNCZWdpblNoYXBlQ29udGFjdCkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gYWRkaXRpb25zLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgewogICAgICAgICAgY29uc3Qgc2hhcGVBID0gdGhpcy5nZXRTaGFwZUJ5SWQoYWRkaXRpb25zW2ldKTsKICAgICAgICAgIGNvbnN0IHNoYXBlQiA9IHRoaXMuZ2V0U2hhcGVCeUlkKGFkZGl0aW9uc1tpICsgMV0pOwogICAgICAgICAgYmVnaW5TaGFwZUNvbnRhY3RFdmVudC5zaGFwZUEgPSBzaGFwZUE7CiAgICAgICAgICBiZWdpblNoYXBlQ29udGFjdEV2ZW50LnNoYXBlQiA9IHNoYXBlQjsKICAgICAgICAgIGlmIChzaGFwZUEpIGJlZ2luU2hhcGVDb250YWN0RXZlbnQuYm9keUEgPSBzaGFwZUEuYm9keTsKICAgICAgICAgIGlmIChzaGFwZUIpIGJlZ2luU2hhcGVDb250YWN0RXZlbnQuYm9keUIgPSBzaGFwZUIuYm9keTsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChiZWdpblNoYXBlQ29udGFjdEV2ZW50KTsKICAgICAgICB9CgogICAgICAgIGJlZ2luU2hhcGVDb250YWN0RXZlbnQuYm9keUEgPSBiZWdpblNoYXBlQ29udGFjdEV2ZW50LmJvZHlCID0gYmVnaW5TaGFwZUNvbnRhY3RFdmVudC5zaGFwZUEgPSBiZWdpblNoYXBlQ29udGFjdEV2ZW50LnNoYXBlQiA9IG51bGw7CiAgICAgIH0KCiAgICAgIGlmIChoYXNFbmRTaGFwZUNvbnRhY3QpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHJlbW92YWxzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMikgewogICAgICAgICAgY29uc3Qgc2hhcGVBID0gdGhpcy5nZXRTaGFwZUJ5SWQocmVtb3ZhbHNbaV0pOwogICAgICAgICAgY29uc3Qgc2hhcGVCID0gdGhpcy5nZXRTaGFwZUJ5SWQocmVtb3ZhbHNbaSArIDFdKTsKICAgICAgICAgIGVuZFNoYXBlQ29udGFjdEV2ZW50LnNoYXBlQSA9IHNoYXBlQTsKICAgICAgICAgIGVuZFNoYXBlQ29udGFjdEV2ZW50LnNoYXBlQiA9IHNoYXBlQjsKICAgICAgICAgIGlmIChzaGFwZUEpIGVuZFNoYXBlQ29udGFjdEV2ZW50LmJvZHlBID0gc2hhcGVBLmJvZHk7CiAgICAgICAgICBpZiAoc2hhcGVCKSBlbmRTaGFwZUNvbnRhY3RFdmVudC5ib2R5QiA9IHNoYXBlQi5ib2R5OwogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGVuZFNoYXBlQ29udGFjdEV2ZW50KTsKICAgICAgICB9CgogICAgICAgIGVuZFNoYXBlQ29udGFjdEV2ZW50LmJvZHlBID0gZW5kU2hhcGVDb250YWN0RXZlbnQuYm9keUIgPSBlbmRTaGFwZUNvbnRhY3RFdmVudC5zaGFwZUEgPSBlbmRTaGFwZUNvbnRhY3RFdmVudC5zaGFwZUIgPSBudWxsOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgYWxsIGJvZHkgZm9yY2VzIGluIHRoZSB3b3JsZCB0byB6ZXJvLgogICAgICovCgoKICAgIGNsZWFyRm9yY2VzKCkgewogICAgICBjb25zdCBib2RpZXMgPSB0aGlzLmJvZGllczsKICAgICAgY29uc3QgTiA9IGJvZGllcy5sZW5ndGg7CgogICAgICBmb3IgKGxldCBpID0gMDsgaSAhPT0gTjsgaSsrKSB7CiAgICAgICAgY29uc3QgYiA9IGJvZGllc1tpXTsKICAgICAgICBiLmZvcmNlOwogICAgICAgIGIudG9ycXVlOwogICAgICAgIGIuZm9yY2Uuc2V0KDAsIDAsIDApOwogICAgICAgIGIudG9ycXVlLnNldCgwLCAwLCAwKTsKICAgICAgfQogICAgfQoKICB9IC8vIFRlbXAgc3R1ZmYKCiAgbmV3IEFBQkIoKTsKICBjb25zdCB0bXBSYXkgPSBuZXcgUmF5KCk7IC8vIHBlcmZvcm1hbmNlLm5vdygpIGZhbGxiYWNrIG9uIERhdGUubm93KCkKCiAgY29uc3QgcGVyZm9ybWFuY2UgPSBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlIHx8IHt9OwoKICBpZiAoIXBlcmZvcm1hbmNlLm5vdykgewogICAgbGV0IG5vd09mZnNldCA9IERhdGUubm93KCk7CgogICAgaWYgKHBlcmZvcm1hbmNlLnRpbWluZyAmJiBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0KSB7CiAgICAgIG5vd09mZnNldCA9IHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQ7CiAgICB9CgogICAgcGVyZm9ybWFuY2Uubm93ID0gKCkgPT4gRGF0ZS5ub3coKSAtIG5vd09mZnNldDsKICB9CgogIG5ldyBWZWMzKCk7IC8vIERpc3BhdGNoZWQgYWZ0ZXIgdGhlIHdvcmxkIGhhcyBzdGVwcGVkIGZvcndhcmQgaW4gdGltZS4KICAvLyBSZXVzYWJsZSBldmVudCBvYmplY3RzIHRvIHNhdmUgbWVtb3J5LgoKICBjb25zdCBXb3JsZF9zdGVwX3Bvc3RTdGVwRXZlbnQgPSB7CiAgICB0eXBlOiAncG9zdFN0ZXAnCiAgfTsgLy8gRGlzcGF0Y2hlZCBiZWZvcmUgdGhlIHdvcmxkIHN0ZXBzIGZvcndhcmQgaW4gdGltZS4KCiAgY29uc3QgV29ybGRfc3RlcF9wcmVTdGVwRXZlbnQgPSB7CiAgICB0eXBlOiAncHJlU3RlcCcKICB9OwogIGNvbnN0IFdvcmxkX3N0ZXBfY29sbGlkZUV2ZW50ID0gewogICAgdHlwZTogQm9keS5DT0xMSURFX0VWRU5UX05BTUUsCiAgICBib2R5OiBudWxsLAogICAgY29udGFjdDogbnVsbAogIH07IC8vIFBvb2xzIGZvciB1bnVzZWQgb2JqZWN0cwoKICBjb25zdCBXb3JsZF9zdGVwX29sZENvbnRhY3RzID0gW107CiAgY29uc3QgV29ybGRfc3RlcF9mcmljdGlvbkVxdWF0aW9uUG9vbCA9IFtdOyAvLyBSZXVzYWJsZSBhcnJheXMgZm9yIGNvbGxpc2lvbiBwYWlycwoKICBjb25zdCBXb3JsZF9zdGVwX3AxID0gW107CiAgY29uc3QgV29ybGRfc3RlcF9wMiA9IFtdOyAvLyBTdHVmZiBmb3IgZW1pdENvbnRhY3RFdmVudHMKCiAgY29uc3QgYWRkaXRpb25zID0gW107CiAgY29uc3QgcmVtb3ZhbHMgPSBbXTsKICBjb25zdCBiZWdpbkNvbnRhY3RFdmVudCA9IHsKICAgIHR5cGU6ICdiZWdpbkNvbnRhY3QnLAogICAgYm9keUE6IG51bGwsCiAgICBib2R5QjogbnVsbAogIH07CiAgY29uc3QgZW5kQ29udGFjdEV2ZW50ID0gewogICAgdHlwZTogJ2VuZENvbnRhY3QnLAogICAgYm9keUE6IG51bGwsCiAgICBib2R5QjogbnVsbAogIH07CiAgY29uc3QgYmVnaW5TaGFwZUNvbnRhY3RFdmVudCA9IHsKICAgIHR5cGU6ICdiZWdpblNoYXBlQ29udGFjdCcsCiAgICBib2R5QTogbnVsbCwKICAgIGJvZHlCOiBudWxsLAogICAgc2hhcGVBOiBudWxsLAogICAgc2hhcGVCOiBudWxsCiAgfTsKICBjb25zdCBlbmRTaGFwZUNvbnRhY3RFdmVudCA9IHsKICAgIHR5cGU6ICdlbmRTaGFwZUNvbnRhY3QnLAogICAgYm9keUE6IG51bGwsCiAgICBib2R5QjogbnVsbCwKICAgIHNoYXBlQTogbnVsbCwKICAgIHNoYXBlQjogbnVsbAogIH07CgogIGNvbnN0IGFkZENvbnRhY3RNYXRlcmlhbCA9ICh3b3JsZCwgY3JlYXRlTWF0ZXJpYWwsIF9yZWYsIHV1aWQpID0+IHsKICAgIGxldCBbbWF0ZXJpYWxBLCBtYXRlcmlhbEIsIG9wdGlvbnNdID0gX3JlZjsKICAgIGNvbnN0IG1hdEEgPSBjcmVhdGVNYXRlcmlhbChtYXRlcmlhbEEpOwogICAgY29uc3QgbWF0QiA9IGNyZWF0ZU1hdGVyaWFsKG1hdGVyaWFsQik7CiAgICBjb25zdCBjb250YWN0TWF0ZXJpYWwgPSBuZXcgQ29udGFjdE1hdGVyaWFsKG1hdEEsIG1hdEIsIG9wdGlvbnMpOwogICAgY29udGFjdE1hdGVyaWFsLnV1aWQgPSB1dWlkOwogICAgd29ybGQuYWRkQ29udGFjdE1hdGVyaWFsKGNvbnRhY3RNYXRlcmlhbCk7CiAgfTsKICBjb25zdCByZW1vdmVDb250YWN0TWF0ZXJpYWwgPSAod29ybGQsIGNtVVVJRCkgPT4gewogICAgY29uc3QgaW5kZXggPSB3b3JsZC5jb250YWN0bWF0ZXJpYWxzLmZpbmRJbmRleChfcmVmMiA9PiB7CiAgICAgIGxldCB7CiAgICAgICAgdXVpZAogICAgICB9ID0gX3JlZjI7CiAgICAgIHJldHVybiB1dWlkID09PSBjbVVVSUQ7CiAgICB9KTsKICAgIGNvbnN0IFt7CiAgICAgIGlkOiBpCiAgICB9LCB7CiAgICAgIGlkOiBqCiAgICB9XSA9IHdvcmxkLmNvbnRhY3RtYXRlcmlhbHNbaW5kZXhdLm1hdGVyaWFsczsKICAgIHdvcmxkLmNvbnRhY3RtYXRlcmlhbHMuc3BsaWNlKGluZGV4LCAxKTsKICAgIGRlbGV0ZSB3b3JsZC5jb250YWN0TWF0ZXJpYWxUYWJsZS5kYXRhW2kgPCBqID8gYCR7aX0tJHtqfWAgOiBgJHtqfS0ke2l9YF07CiAgfTsKCiAgbGV0IG1hdGVyaWFsSWQgPSAwOwogIGNvbnN0IGNyZWF0ZU1hdGVyaWFsRmFjdG9yeSA9IG1hdGVyaWFscyA9PiBmdW5jdGlvbiAobmFtZU9yT3B0aW9ucykgewogICAgaWYgKG5hbWVPck9wdGlvbnMgPT09IHZvaWQgMCkgewogICAgICBuYW1lT3JPcHRpb25zID0ge307CiAgICB9CgogICAgY29uc3QgbWF0ZXJpYWxPcHRpb25zID0gdHlwZW9mIG5hbWVPck9wdGlvbnMgPT09ICdzdHJpbmcnID8gewogICAgICBuYW1lOiBuYW1lT3JPcHRpb25zCiAgICB9IDogewogICAgICBuYW1lOiBTeW1ib2wuZm9yKGBNYXRlcmlhbCR7bWF0ZXJpYWxJZCsrfWApLAogICAgICAuLi5uYW1lT3JPcHRpb25zCiAgICB9OwogICAgY29uc3QgewogICAgICBuYW1lCiAgICB9ID0gbWF0ZXJpYWxPcHRpb25zOwogICAgbWF0ZXJpYWxzW25hbWVdID0gbWF0ZXJpYWxzW25hbWVdIHx8IG5ldyBNYXRlcmlhbChtYXRlcmlhbE9wdGlvbnMpOwogICAgcmV0dXJuIG1hdGVyaWFsc1tuYW1lXTsKICB9OwoKICAvKioKICAgKiBAdHlwZWRlZiB7IGltcG9ydCgnY2Fubm9uLWVzJykuTWF0ZXJpYWxPcHRpb25zIH0gTWF0ZXJpYWxPcHRpb25zCiAgICovCgogIGNvbnN0IG1ha2VWZWMzID0gX3JlZiA9PiB7CiAgICBsZXQgW3gsIHksIHpdID0gX3JlZjsKICAgIHJldHVybiBuZXcgVmVjMyh4LCB5LCB6KTsKICB9OwoKICBjb25zdCBwcmVwYXJlU3BoZXJlID0gYXJncyA9PiBBcnJheS5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXTsKCiAgY29uc3QgcHJlcGFyZUNvbnZleFBvbHloZWRyb24gPSBfcmVmMiA9PiB7CiAgICBsZXQgW3YsIGZhY2VzLCBuLCBhLCBib3VuZGluZ1NwaGVyZVJhZGl1c10gPSBfcmVmMjsKICAgIHJldHVybiBbewogICAgICBheGVzOiBhID8gYS5tYXAobWFrZVZlYzMpIDogdW5kZWZpbmVkLAogICAgICBib3VuZGluZ1NwaGVyZVJhZGl1cywKICAgICAgZmFjZXMsCiAgICAgIG5vcm1hbHM6IG4gPyBuLm1hcChtYWtlVmVjMykgOiB1bmRlZmluZWQsCiAgICAgIHZlcnRpY2VzOiB2ID8gdi5tYXAobWFrZVZlYzMpIDogdW5kZWZpbmVkCiAgICB9XTsKICB9OwoKICBmdW5jdGlvbiBjcmVhdGVTaGFwZSh0eXBlLCBhcmdzKSB7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSAnQm94JzoKICAgICAgICByZXR1cm4gbmV3IEJveChuZXcgVmVjMyguLi5hcmdzLm1hcCh2ID0+IHYgLyAyKSkpOwogICAgICAvLyBleHRlbnRzID0+IGhhbGZFeHRlbnRzCgogICAgICBjYXNlICdDb252ZXhQb2x5aGVkcm9uJzoKICAgICAgICByZXR1cm4gbmV3IENvbnZleFBvbHloZWRyb24oLi4ucHJlcGFyZUNvbnZleFBvbHloZWRyb24oYXJncykpOwoKICAgICAgY2FzZSAnQ3lsaW5kZXInOgogICAgICAgIHJldHVybiBuZXcgQ3lsaW5kZXIoLi4uYXJncyk7CiAgICAgIC8vIFsgcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgbnVtU2VnbWVudHMgXSA9IGFyZ3MKCiAgICAgIGNhc2UgJ0hlaWdodGZpZWxkJzoKICAgICAgICByZXR1cm4gbmV3IEhlaWdodGZpZWxkKC4uLmFyZ3MpOwogICAgICAvLyBbIEFycmF5IGRhdGEsIG9wdGlvbnM6IHttaW5WYWx1ZSwgbWF4VmFsdWUsIGVsZW1lbnRTaXplfSAgXSA9IGFyZ3MKCiAgICAgIGNhc2UgJ1BhcnRpY2xlJzoKICAgICAgICByZXR1cm4gbmV3IFBhcnRpY2xlKCk7CiAgICAgIC8vIG5vIGFyZ3MKCiAgICAgIGNhc2UgJ1BsYW5lJzoKICAgICAgICByZXR1cm4gbmV3IFBsYW5lKCk7CiAgICAgIC8vIG5vIGFyZ3MsIGluZmluaXRlIHggYW5kIHkKCiAgICAgIGNhc2UgJ1NwaGVyZSc6CiAgICAgICAgcmV0dXJuIG5ldyBTcGhlcmUoLi4ucHJlcGFyZVNwaGVyZShhcmdzKSk7CiAgICAgIC8vIHJhZGl1cyA9IGFyZ3MKCiAgICAgIGNhc2UgJ1RyaW1lc2gnOgogICAgICAgIHJldHVybiBuZXcgVHJpbWVzaCguLi5hcmdzKTsKICAgICAgLy8gW3ZlcnRpY2VzLCBpbmRpY2VzXSA9IGFyZ3MKICAgIH0KICB9CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy51dWlkCiAgICogQHBhcmFtIHtCb2R5UHJvcHN9IG9wdGlvbnMucHJvcHMKICAgKiBAcGFyYW0ge0JvZHlTaGFwZVR5cGV9IG9wdGlvbnMudHlwZQogICAqIEBwYXJhbSB7KG1hdGVyaWFsT3B0aW9uczogTWF0ZXJpYWxPcHRpb25zKSA9PiBNYXRlcmlhbCA9fSBvcHRpb25zLmNyZWF0ZU1hdGVyaWFsCiAgICogQHJldHVybnMge0JvZHl9CiAgICovCgoKICBjb25zdCBwcm9wc1RvQm9keSA9IG9wdGlvbnMgPT4gewogICAgY29uc3QgewogICAgICB1dWlkLAogICAgICBwcm9wcywKICAgICAgdHlwZSwKICAgICAgY3JlYXRlTWF0ZXJpYWwgPSBtYXRlcmlhbE9wdGlvbnMgPT4gbmV3IE1hdGVyaWFsKG1hdGVyaWFsT3B0aW9ucykKICAgIH0gPSBvcHRpb25zOwogICAgY29uc3QgewogICAgICBhbmd1bGFyRmFjdG9yID0gWzEsIDEsIDFdLAogICAgICBhbmd1bGFyVmVsb2NpdHkgPSBbMCwgMCwgMF0sCiAgICAgIGFyZ3MgPSBbXSwKICAgICAgY29sbGlzaW9uUmVzcG9uc2UsCiAgICAgIGxpbmVhckZhY3RvciA9IFsxLCAxLCAxXSwKICAgICAgbWFzcywKICAgICAgbWF0ZXJpYWwsCiAgICAgIG9uQ29sbGlkZSwKICAgICAgcG9zaXRpb24gPSBbMCwgMCwgMF0sCiAgICAgIHJvdGF0aW9uID0gWzAsIDAsIDBdLAogICAgICBzaGFwZXMsCiAgICAgIHR5cGU6IGJvZHlUeXBlLAogICAgICB2ZWxvY2l0eSA9IFswLCAwLCAwXSwKICAgICAgLi4uZXh0cmEKICAgIH0gPSBwcm9wczsKICAgIGNvbnN0IGJvZHkgPSBuZXcgQm9keSh7IC4uLmV4dHJhLAogICAgICBtYXNzOiBib2R5VHlwZSA9PT0gJ1N0YXRpYycgPyAwIDogbWFzcywKICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsID8gY3JlYXRlTWF0ZXJpYWwobWF0ZXJpYWwpIDogdW5kZWZpbmVkLAogICAgICB0eXBlOiBib2R5VHlwZSA/IEJvZHlbYm9keVR5cGUudG9VcHBlckNhc2UoKV0gOiB1bmRlZmluZWQKICAgIH0pOwogICAgYm9keS51dWlkID0gdXVpZDsKCiAgICBpZiAoY29sbGlzaW9uUmVzcG9uc2UgIT09IHVuZGVmaW5lZCkgewogICAgICBib2R5LmNvbGxpc2lvblJlc3BvbnNlID0gY29sbGlzaW9uUmVzcG9uc2U7CiAgICB9CgogICAgaWYgKHR5cGUgPT09ICdDb21wb3VuZCcpIHsKICAgICAgc2hhcGVzLmZvckVhY2goX3JlZjMgPT4gewogICAgICAgIGxldCB7CiAgICAgICAgICB0eXBlLAogICAgICAgICAgYXJncywKICAgICAgICAgIHBvc2l0aW9uLAogICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICBtYXRlcmlhbCwKICAgICAgICAgIC4uLmV4dHJhCiAgICAgICAgfSA9IF9yZWYzOwogICAgICAgIGNvbnN0IHNoYXBlQm9keSA9IGJvZHkuYWRkU2hhcGUoY3JlYXRlU2hhcGUodHlwZSwgYXJncyksIHBvc2l0aW9uID8gbmV3IFZlYzMoLi4ucG9zaXRpb24pIDogdW5kZWZpbmVkLCByb3RhdGlvbiA/IG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbUV1bGVyKC4uLnJvdGF0aW9uKSA6IHVuZGVmaW5lZCk7CiAgICAgICAgaWYgKG1hdGVyaWFsKSBzaGFwZUJvZHkubWF0ZXJpYWwgPSBjcmVhdGVNYXRlcmlhbChtYXRlcmlhbCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihzaGFwZUJvZHksIGV4dHJhKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBib2R5LmFkZFNoYXBlKGNyZWF0ZVNoYXBlKHR5cGUsIGFyZ3MpKTsKICAgIH0KCiAgICBib2R5LnBvc2l0aW9uLnNldChwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIHBvc2l0aW9uWzJdKTsKICAgIGJvZHkucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIocm90YXRpb25bMF0sIHJvdGF0aW9uWzFdLCByb3RhdGlvblsyXSk7CiAgICBib2R5LnZlbG9jaXR5LnNldCh2ZWxvY2l0eVswXSwgdmVsb2NpdHlbMV0sIHZlbG9jaXR5WzJdKTsKICAgIGJvZHkuYW5ndWxhclZlbG9jaXR5LnNldChhbmd1bGFyVmVsb2NpdHlbMF0sIGFuZ3VsYXJWZWxvY2l0eVsxXSwgYW5ndWxhclZlbG9jaXR5WzJdKTsKICAgIGJvZHkubGluZWFyRmFjdG9yLnNldChsaW5lYXJGYWN0b3JbMF0sIGxpbmVhckZhY3RvclsxXSwgbGluZWFyRmFjdG9yWzJdKTsKICAgIGJvZHkuYW5ndWxhckZhY3Rvci5zZXQoYW5ndWxhckZhY3RvclswXSwgYW5ndWxhckZhY3RvclsxXSwgYW5ndWxhckZhY3RvclsyXSk7CiAgICByZXR1cm4gYm9keTsKICB9OwoKICBjb25zdCBhZGRCb2RpZXMgPSAoc3RhdGUsIGNyZWF0ZU1hdGVyaWFsLCBfcmVmKSA9PiB7CiAgICBsZXQgewogICAgICBwcm9wcywKICAgICAgdHlwZSwKICAgICAgdXVpZAogICAgfSA9IF9yZWY7CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1dWlkLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IGJvZHkgPSBwcm9wc1RvQm9keSh7CiAgICAgICAgY3JlYXRlTWF0ZXJpYWwsCiAgICAgICAgcHJvcHM6IHByb3BzW2ldLAogICAgICAgIHR5cGUsCiAgICAgICAgdXVpZDogdXVpZFtpXQogICAgICB9KTsKICAgICAgc3RhdGUud29ybGQuYWRkQm9keShib2R5KTsKICAgICAgaWYgKHByb3BzW2ldLm9uQ29sbGlkZSkgYm9keS5hZGRFdmVudExpc3RlbmVyKCdjb2xsaWRlJywgX3JlZjIgPT4gewogICAgICAgIGxldCB7CiAgICAgICAgICB0eXBlLAogICAgICAgICAgYm9keSwKICAgICAgICAgIHRhcmdldCwKICAgICAgICAgIGNvbnRhY3QKICAgICAgICB9ID0gX3JlZjI7CiAgICAgICAgaWYgKCFib2R5LnV1aWQgfHwgIXRhcmdldC51dWlkKSByZXR1cm47CiAgICAgICAgY29uc3QgewogICAgICAgICAgbmksCiAgICAgICAgICByaSwKICAgICAgICAgIHJqLAogICAgICAgICAgYmksCiAgICAgICAgICBiaiwKICAgICAgICAgIGlkCiAgICAgICAgfSA9IGNvbnRhY3Q7CiAgICAgICAgY29uc3QgY29udGFjdFBvaW50ID0gYmkucG9zaXRpb24udmFkZChyaSk7CiAgICAgICAgY29uc3QgY29udGFjdE5vcm1hbCA9IGJpID09PSBib2R5ID8gbmkgOiBuaS5zY2FsZSgtMSk7CiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICBib2R5OiBib2R5LnV1aWQsCiAgICAgICAgICBjb2xsaXNpb25GaWx0ZXJzOiB7CiAgICAgICAgICAgIGJvZHlGaWx0ZXJHcm91cDogYm9keS5jb2xsaXNpb25GaWx0ZXJHcm91cCwKICAgICAgICAgICAgYm9keUZpbHRlck1hc2s6IGJvZHkuY29sbGlzaW9uRmlsdGVyTWFzaywKICAgICAgICAgICAgdGFyZ2V0RmlsdGVyR3JvdXA6IHRhcmdldC5jb2xsaXNpb25GaWx0ZXJHcm91cCwKICAgICAgICAgICAgdGFyZ2V0RmlsdGVyTWFzazogdGFyZ2V0LmNvbGxpc2lvbkZpbHRlck1hc2sKICAgICAgICAgIH0sCiAgICAgICAgICBjb250YWN0OiB7CiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogdXNlIGlkIGluc3RlYWQgb2YgdXVpZAogICAgICAgICAgICBiaTogYmkudXVpZCwKICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiB1c2UgaWQgaW5zdGVhZCBvZiB1dWlkCiAgICAgICAgICAgIGJqOiBiai51dWlkLAogICAgICAgICAgICAvLyBOb3JtYWwgb2YgdGhlIGNvbnRhY3QsIHJlbGF0aXZlIHRvIHRoZSBjb2xsaWRpbmcgYm9keQogICAgICAgICAgICBjb250YWN0Tm9ybWFsOiBjb250YWN0Tm9ybWFsLnRvQXJyYXkoKSwKICAgICAgICAgICAgLy8gV29ybGQgcG9zaXRpb24gb2YgdGhlIGNvbnRhY3QKICAgICAgICAgICAgY29udGFjdFBvaW50OiBjb250YWN0UG9pbnQudG9BcnJheSgpLAogICAgICAgICAgICBpZCwKICAgICAgICAgICAgaW1wYWN0VmVsb2NpdHk6IGNvbnRhY3QuZ2V0SW1wYWN0VmVsb2NpdHlBbG9uZ05vcm1hbCgpLAogICAgICAgICAgICBuaTogbmkudG9BcnJheSgpLAogICAgICAgICAgICByaTogcmkudG9BcnJheSgpLAogICAgICAgICAgICByajogcmoudG9BcnJheSgpCiAgICAgICAgICB9LAogICAgICAgICAgb3A6ICdldmVudCcsCiAgICAgICAgICB0YXJnZXQ6IHRhcmdldC51dWlkLAogICAgICAgICAgdHlwZQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICB9OwoKICBjb25zdCB0cmlwbGV0VG9WZWMzID0gdCA9PiB0ID8gbmV3IFZlYzMoLi4udCkgOiB1bmRlZmluZWQ7CgogIGNvbnN0IGFkZENvbnN0cmFpbnQgPSAoc3RhdGUsIF9yZWYpID0+IHsKICAgIGxldCB7CiAgICAgIHByb3BzOiBbYm9keUEsIGJvZHlCLCB7CiAgICAgICAgYW5nbGUsCiAgICAgICAgYXhpc0EsCiAgICAgICAgYXhpc0IsCiAgICAgICAgY29sbGlkZUNvbm5lY3RlZCwKICAgICAgICBkaXN0YW5jZSwKICAgICAgICBtYXhGb3JjZSwKICAgICAgICBtYXhNdWx0aXBsaWVyLAogICAgICAgIHBpdm90QSwKICAgICAgICBwaXZvdEIsCiAgICAgICAgdHdpc3RBbmdsZSwKICAgICAgICB3YWtlVXBCb2RpZXMKICAgICAgfV0sCiAgICAgIHR5cGUsCiAgICAgIHV1aWQKICAgIH0gPSBfcmVmOwogICAgbGV0IGNvbnN0cmFpbnQ7CgogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgJ1BvaW50VG9Qb2ludCc6CiAgICAgICAgY29uc3RyYWludCA9IG5ldyBQb2ludFRvUG9pbnRDb25zdHJhaW50KHN0YXRlLmJvZGllc1tib2R5QV0sIHRyaXBsZXRUb1ZlYzMocGl2b3RBKSwgc3RhdGUuYm9kaWVzW2JvZHlCXSwgdHJpcGxldFRvVmVjMyhwaXZvdEIpLCBtYXhGb3JjZSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdDb25lVHdpc3QnOgogICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgQ29uZVR3aXN0Q29uc3RyYWludChzdGF0ZS5ib2RpZXNbYm9keUFdLCBzdGF0ZS5ib2RpZXNbYm9keUJdLCB7CiAgICAgICAgICBhbmdsZSwKICAgICAgICAgIGF4aXNBOiB0cmlwbGV0VG9WZWMzKGF4aXNBKSwKICAgICAgICAgIGF4aXNCOiB0cmlwbGV0VG9WZWMzKGF4aXNCKSwKICAgICAgICAgIGNvbGxpZGVDb25uZWN0ZWQsCiAgICAgICAgICBtYXhGb3JjZSwKICAgICAgICAgIHBpdm90QTogdHJpcGxldFRvVmVjMyhwaXZvdEEpLAogICAgICAgICAgcGl2b3RCOiB0cmlwbGV0VG9WZWMzKHBpdm90QiksCiAgICAgICAgICB0d2lzdEFuZ2xlCiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdIaW5nZSc6CiAgICAgICAgY29uc3RyYWludCA9IG5ldyBIaW5nZUNvbnN0cmFpbnQoc3RhdGUuYm9kaWVzW2JvZHlBXSwgc3RhdGUuYm9kaWVzW2JvZHlCXSwgewogICAgICAgICAgYXhpc0E6IHRyaXBsZXRUb1ZlYzMoYXhpc0EpLAogICAgICAgICAgYXhpc0I6IHRyaXBsZXRUb1ZlYzMoYXhpc0IpLAogICAgICAgICAgY29sbGlkZUNvbm5lY3RlZCwKICAgICAgICAgIG1heEZvcmNlLAogICAgICAgICAgcGl2b3RBOiB0cmlwbGV0VG9WZWMzKHBpdm90QSksCiAgICAgICAgICBwaXZvdEI6IHRyaXBsZXRUb1ZlYzMocGl2b3RCKQogICAgICAgIH0pOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnRGlzdGFuY2UnOgogICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgRGlzdGFuY2VDb25zdHJhaW50KHN0YXRlLmJvZGllc1tib2R5QV0sIHN0YXRlLmJvZGllc1tib2R5Ql0sIGRpc3RhbmNlLCBtYXhGb3JjZSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdMb2NrJzoKICAgICAgICBjb25zdHJhaW50ID0gbmV3IExvY2tDb25zdHJhaW50KHN0YXRlLmJvZGllc1tib2R5QV0sIHN0YXRlLmJvZGllc1tib2R5Ql0sIHsKICAgICAgICAgIG1heEZvcmNlCiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludChzdGF0ZS5ib2RpZXNbYm9keUFdLCBzdGF0ZS5ib2RpZXNbYm9keUJdLCB7CiAgICAgICAgICBjb2xsaWRlQ29ubmVjdGVkLAogICAgICAgICAgd2FrZVVwQm9kaWVzCiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgY29uc3RyYWludC51dWlkID0gdXVpZDsKICAgIHN0YXRlLndvcmxkLmFkZENvbnN0cmFpbnQoY29uc3RyYWludCk7CgogICAgaWYgKG1heE11bHRpcGxpZXIgIT09IHVuZGVmaW5lZCkgewogICAgICBjb25zdCBwb3N0U3RlcENvbnN0cmFpbnQgPSAoKSA9PiB7CiAgICAgICAgLy8gVGhlIG11bHRpcGxpZXIgaXMgcHJvcG9ydGlvbmFsIHRvIGhvdyBtdWNoIGZvcmNlIGlzIGFkZGVkIHRvIHRoZSBib2RpZXMgYnkgdGhlIGNvbnN0cmFpbnQuCiAgICAgICAgLy8gSWYgdGhpcyBleGNlZWRzIGEgbGltaXQgdGhlIGNvbnN0cmFpbnQgaXMgZGlzYWJsZWQuCiAgICAgICAgY29uc3QgbXVsdGlwbGllciA9IE1hdGguYWJzKGNvbnN0cmFpbnQuZXF1YXRpb25zWzBdLm11bHRpcGxpZXIpOwoKICAgICAgICBpZiAobXVsdGlwbGllciA+IG1heE11bHRpcGxpZXIpIHsKICAgICAgICAgIGNvbnN0cmFpbnQuZGlzYWJsZSgpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIHN0YXRlLmNvbnN0cmFpbnRzW3V1aWRdID0gcG9zdFN0ZXBDb25zdHJhaW50OwogICAgICBzdGF0ZS53b3JsZC5hZGRFdmVudExpc3RlbmVyKCdwb3N0U3RlcCcsIHN0YXRlLmNvbnN0cmFpbnRzW3V1aWRdKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiB0b1VwcGVyY2FzZShzdHIpIHsKICAgIHJldHVybiBzdHIudG9VcHBlckNhc2UoKTsKICB9CgogIGNvbnN0IGFkZFJheSA9IChzdGF0ZSwgX3JlZikgPT4gewogICAgbGV0IHsKICAgICAgcHJvcHM6IHsKICAgICAgICBmcm9tLAogICAgICAgIG1vZGUsCiAgICAgICAgdG8sCiAgICAgICAgLi4ucmF5T3B0aW9ucwogICAgICB9LAogICAgICB1dWlkCiAgICB9ID0gX3JlZjsKICAgIGNvbnN0IHJheSA9IG5ldyBSYXkodHJpcGxldFRvVmVjMyhmcm9tKSwgdHJpcGxldFRvVmVjMyh0bykpOwogICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgbW9kZTogUkFZX01PREVTW3RvVXBwZXJjYXNlKG1vZGUpXSwKICAgICAgcmVzdWx0OiBuZXcgUmF5Y2FzdFJlc3VsdCgpLAogICAgICAuLi5yYXlPcHRpb25zCiAgICB9OwoKICAgIHN0YXRlLnJheXNbdXVpZF0gPSAoKSA9PiB7CiAgICAgIHJheS5pbnRlcnNlY3RXb3JsZChzdGF0ZS53b3JsZCwgb3B0aW9ucyk7CiAgICAgIGlmICghb3B0aW9ucy5yZXN1bHQgfHwgIW9wdGlvbnMucmVzdWx0LmJvZHkpIHJldHVybjsKICAgICAgY29uc3QgewogICAgICAgIGJvZHksCiAgICAgICAgc2hhcGUsCiAgICAgICAgcmF5RnJvbVdvcmxkLAogICAgICAgIHJheVRvV29ybGQsCiAgICAgICAgaGl0Tm9ybWFsV29ybGQsCiAgICAgICAgaGl0UG9pbnRXb3JsZCwKICAgICAgICAuLi5yZXN0CiAgICAgIH0gPSBvcHRpb25zLnJlc3VsdDsKICAgICAgY29uc3QgYm9keVVVSUQgPSBib2R5LnV1aWQ7CiAgICAgIGlmICghYm9keVVVSUQpIHJldHVybjsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgYm9keTogYm9keVVVSUQsCiAgICAgICAgaGl0Tm9ybWFsV29ybGQ6IGhpdE5vcm1hbFdvcmxkLnRvQXJyYXkoKSwKICAgICAgICBoaXRQb2ludFdvcmxkOiBoaXRQb2ludFdvcmxkLnRvQXJyYXkoKSwKICAgICAgICBvcDogJ2V2ZW50JywKICAgICAgICByYXk6IHsKICAgICAgICAgIGNvbGxpc2lvbkZpbHRlckdyb3VwOiByYXkuY29sbGlzaW9uRmlsdGVyR3JvdXAsCiAgICAgICAgICBjb2xsaXNpb25GaWx0ZXJNYXNrOiByYXkuY29sbGlzaW9uRmlsdGVyTWFzaywKICAgICAgICAgIGRpcmVjdGlvbjogcmF5LmRpcmVjdGlvbi50b0FycmF5KCksCiAgICAgICAgICBmcm9tLAogICAgICAgICAgdG8sCiAgICAgICAgICB1dWlkCiAgICAgICAgfSwKICAgICAgICByYXlGcm9tV29ybGQ6IHJheUZyb21Xb3JsZC50b0FycmF5KCksCiAgICAgICAgcmF5VG9Xb3JsZDogcmF5VG9Xb3JsZC50b0FycmF5KCksCiAgICAgICAgc2hhcGU6IHNoYXBlID8geyAuLi5zaGFwZSwKICAgICAgICAgIGJvZHk6IGJvZHlVVUlECiAgICAgICAgfSA6IG51bGwsCiAgICAgICAgdHlwZTogJ3JheWhpdCcsCiAgICAgICAgLi4ucmVzdAogICAgICB9KTsKICAgIH07CgogICAgc3RhdGUud29ybGQuYWRkRXZlbnRMaXN0ZW5lcigncHJlU3RlcCcsIHN0YXRlLnJheXNbdXVpZF0pOwogIH07CgogIGNvbnN0IGFkZFJheWNhc3RWZWhpY2xlID0gKHN0YXRlLCBkYXRhKSA9PiB7CiAgICBjb25zdCBbY2hhc3Npc0JvZHksIHdoZWVscywgd2hlZWxJbmZvcywgaW5kZXhGb3J3YXJkQXhpcywgaW5kZXhSaWdodEF4aXMsIGluZGV4VXBBeGlzXSA9IGRhdGEucHJvcHM7CiAgICBjb25zdCB2ZWhpY2xlID0gbmV3IFJheWNhc3RWZWhpY2xlKHsKICAgICAgY2hhc3Npc0JvZHk6IHN0YXRlLmJvZGllc1tjaGFzc2lzQm9keV0sCiAgICAgIGluZGV4Rm9yd2FyZEF4aXMsCiAgICAgIGluZGV4UmlnaHRBeGlzLAogICAgICBpbmRleFVwQXhpcwogICAgfSk7CiAgICB2ZWhpY2xlLndvcmxkID0gc3RhdGUud29ybGQ7CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aGVlbEluZm9zLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBheGxlTG9jYWwsCiAgICAgICAgY2hhc3Npc0Nvbm5lY3Rpb25Qb2ludExvY2FsLAogICAgICAgIGRpcmVjdGlvbkxvY2FsLAogICAgICAgIC4uLnJlc3QKICAgICAgfSA9IHdoZWVsSW5mb3NbaV07CiAgICAgIHZlaGljbGUuYWRkV2hlZWwoewogICAgICAgIGF4bGVMb2NhbDogdHJpcGxldFRvVmVjMyhheGxlTG9jYWwpLAogICAgICAgIGNoYXNzaXNDb25uZWN0aW9uUG9pbnRMb2NhbDogdHJpcGxldFRvVmVjMyhjaGFzc2lzQ29ubmVjdGlvblBvaW50TG9jYWwpLAogICAgICAgIGRpcmVjdGlvbkxvY2FsOiB0cmlwbGV0VG9WZWMzKGRpcmVjdGlvbkxvY2FsKSwKICAgICAgICAuLi5yZXN0CiAgICAgIH0pOwogICAgfQoKICAgIGNvbnN0IHByZVN0ZXAgPSAoKSA9PiB7CiAgICAgIHZlaGljbGUudXBkYXRlVmVoaWNsZShzdGF0ZS53b3JsZC5kdCk7CiAgICB9OwoKICAgIGNvbnN0IHBvc3RTdGVwID0gKCkgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlaGljbGUud2hlZWxJbmZvcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZlaGljbGUudXBkYXRlV2hlZWxUcmFuc2Zvcm0oaSk7CiAgICAgICAgY29uc3QgdCA9IHZlaGljbGUud2hlZWxJbmZvc1tpXS53b3JsZFRyYW5zZm9ybTsKICAgICAgICBjb25zdCB3aGVlbEJvZHkgPSBzdGF0ZS5ib2RpZXNbd2hlZWxzW2ldXTsKICAgICAgICB3aGVlbEJvZHkucG9zaXRpb24uY29weSh0LnBvc2l0aW9uKTsKICAgICAgICB3aGVlbEJvZHkucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbik7CiAgICAgIH0KICAgIH07CgogICAgc3RhdGUudmVoaWNsZXNbZGF0YS51dWlkXSA9IHsKICAgICAgcG9zdFN0ZXAsCiAgICAgIHByZVN0ZXAsCiAgICAgIHZlaGljbGUKICAgIH07CiAgICBzdGF0ZS53b3JsZC5hZGRFdmVudExpc3RlbmVyKCdwcmVTdGVwJywgcHJlU3RlcCk7CiAgICBzdGF0ZS53b3JsZC5hZGRFdmVudExpc3RlbmVyKCdwb3N0U3RlcCcsIHBvc3RTdGVwKTsKICB9OwoKICBjb25zdCBhZGRTcHJpbmcgPSAoc3RhdGUsIF9yZWYpID0+IHsKICAgIGxldCB7CiAgICAgIHByb3BzOiBbYm9keUEsIGJvZHlCLCB7CiAgICAgICAgZGFtcGluZywKICAgICAgICBsb2NhbEFuY2hvckEsCiAgICAgICAgbG9jYWxBbmNob3JCLAogICAgICAgIHJlc3RMZW5ndGgsCiAgICAgICAgc3RpZmZuZXNzLAogICAgICAgIHdvcmxkQW5jaG9yQSwKICAgICAgICB3b3JsZEFuY2hvckIKICAgICAgfV0sCiAgICAgIHV1aWQKICAgIH0gPSBfcmVmOwogICAgY29uc3Qgc3ByaW5nID0gbmV3IFNwcmluZyhzdGF0ZS5ib2RpZXNbYm9keUFdLCBzdGF0ZS5ib2RpZXNbYm9keUJdLCB7CiAgICAgIGRhbXBpbmcsCiAgICAgIGxvY2FsQW5jaG9yQTogdHJpcGxldFRvVmVjMyhsb2NhbEFuY2hvckEpLAogICAgICBsb2NhbEFuY2hvckI6IHRyaXBsZXRUb1ZlYzMobG9jYWxBbmNob3JCKSwKICAgICAgcmVzdExlbmd0aCwKICAgICAgc3RpZmZuZXNzLAogICAgICB3b3JsZEFuY2hvckE6IHRyaXBsZXRUb1ZlYzMod29ybGRBbmNob3JBKSwKICAgICAgd29ybGRBbmNob3JCOiB0cmlwbGV0VG9WZWMzKHdvcmxkQW5jaG9yQikKICAgIH0pOwogICAgc3ByaW5nLnV1aWQgPSB1dWlkOwoKICAgIGNvbnN0IHBvc3RTdGVwU3ByaW5nID0gKCkgPT4gc3ByaW5nLmFwcGx5Rm9yY2UoKTsKCiAgICBzdGF0ZS5zcHJpbmdzW3V1aWRdID0gcG9zdFN0ZXBTcHJpbmc7CiAgICBzdGF0ZS5zcHJpbmdJbnN0YW5jZXNbdXVpZF0gPSBzcHJpbmc7IC8vIENvbXB1dGUgdGhlIGZvcmNlIGFmdGVyIGVhY2ggc3RlcAoKICAgIHN0YXRlLndvcmxkLmFkZEV2ZW50TGlzdGVuZXIoJ3Bvc3RTdGVwJywgc3RhdGUuc3ByaW5nc1t1dWlkXSk7CiAgfTsKCiAgZnVuY3Rpb24gZW1pdEJlZ2luQ29udGFjdChfcmVmKSB7CiAgICBsZXQgewogICAgICBib2R5QSwKICAgICAgYm9keUIKICAgIH0gPSBfcmVmOwogICAgaWYgKCEoYm9keUEgIT0gbnVsbCAmJiBib2R5QS51dWlkKSB8fCAhKGJvZHlCICE9IG51bGwgJiYgYm9keUIudXVpZCkpIHJldHVybjsKICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICBib2R5QTogYm9keUEudXVpZCwKICAgICAgYm9keUI6IGJvZHlCLnV1aWQsCiAgICAgIG9wOiAnZXZlbnQnLAogICAgICB0eXBlOiAnY29sbGlkZUJlZ2luJwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBlbWl0RW5kQ29udGFjdChfcmVmMikgewogICAgbGV0IHsKICAgICAgYm9keUEsCiAgICAgIGJvZHlCCiAgICB9ID0gX3JlZjI7CiAgICBpZiAoIShib2R5QSAhPSBudWxsICYmIGJvZHlBLnV1aWQpIHx8ICEoYm9keUIgIT0gbnVsbCAmJiBib2R5Qi51dWlkKSkgcmV0dXJuOwogICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgIGJvZHlBOiBib2R5QS51dWlkLAogICAgICBib2R5QjogYm9keUIudXVpZCwKICAgICAgb3A6ICdldmVudCcsCiAgICAgIHR5cGU6ICdjb2xsaWRlRW5kJwogICAgfSk7CiAgfQoKICBjb25zdCBpbml0ID0gKHdvcmxkLCBfcmVmMykgPT4gewogICAgbGV0IHsKICAgICAgYWxsb3dTbGVlcCwKICAgICAgYXhpc0luZGV4ID0gMCwKICAgICAgYnJvYWRwaGFzZSwKICAgICAgZGVmYXVsdENvbnRhY3RNYXRlcmlhbCwKICAgICAgZ3Jhdml0eSwKICAgICAgaXRlcmF0aW9ucywKICAgICAgcXVhdE5vcm1hbGl6ZUZhc3QsCiAgICAgIHF1YXROb3JtYWxpemVTa2lwLAogICAgICBzb2x2ZXIsCiAgICAgIHRvbGVyYW5jZQogICAgfSA9IF9yZWYzOwogICAgd29ybGQuYWxsb3dTbGVlcCA9IGFsbG93U2xlZXA7CiAgICB3b3JsZC5ncmF2aXR5LnNldCguLi5ncmF2aXR5KTsKICAgIHdvcmxkLnF1YXROb3JtYWxpemVGYXN0ID0gcXVhdE5vcm1hbGl6ZUZhc3Q7CiAgICB3b3JsZC5xdWF0Tm9ybWFsaXplU2tpcCA9IHF1YXROb3JtYWxpemVTa2lwOwoKICAgIGlmIChzb2x2ZXIgPT09ICdTcGxpdCcpIHsKICAgICAgd29ybGQuc29sdmVyID0gbmV3IFNwbGl0U29sdmVyKG5ldyBHU1NvbHZlcigpKTsKICAgIH0KCiAgICBpZiAod29ybGQuc29sdmVyIGluc3RhbmNlb2YgR1NTb2x2ZXIpIHsKICAgICAgd29ybGQuc29sdmVyLnRvbGVyYW5jZSA9IHRvbGVyYW5jZTsKICAgICAgd29ybGQuc29sdmVyLml0ZXJhdGlvbnMgPSBpdGVyYXRpb25zOwogICAgfQoKICAgIHdvcmxkLmJyb2FkcGhhc2UgPSBicm9hZHBoYXNlID09PSAnU0FQJyA/IG5ldyBTQVBCcm9hZHBoYXNlKHdvcmxkKSA6IG5ldyBOYWl2ZUJyb2FkcGhhc2UoKTsKCiAgICBpZiAod29ybGQuYnJvYWRwaGFzZSBpbnN0YW5jZW9mIFNBUEJyb2FkcGhhc2UpIHsKICAgICAgd29ybGQuYnJvYWRwaGFzZS5heGlzSW5kZXggPSBheGlzSW5kZXg7CiAgICB9CgogICAgd29ybGQuYWRkRXZlbnRMaXN0ZW5lcignYmVnaW5Db250YWN0JywgZW1pdEJlZ2luQ29udGFjdCk7CiAgICB3b3JsZC5hZGRFdmVudExpc3RlbmVyKCdlbmRDb250YWN0JywgZW1pdEVuZENvbnRhY3QpOwogICAgT2JqZWN0LmFzc2lnbih3b3JsZC5kZWZhdWx0Q29udGFjdE1hdGVyaWFsLCBkZWZhdWx0Q29udGFjdE1hdGVyaWFsKTsKICB9OwoKICBjb25zdCBpc1FvclYgPSB2ID0+IHYgaW5zdGFuY2VvZiBRdWF0ZXJuaW9uIHx8IHYgaW5zdGFuY2VvZiBWZWMzOwoKICBjb25zdCBzdGVwID0gKHN0YXRlLCBfcmVmKSA9PiB7CiAgICBsZXQgewogICAgICBwb3NpdGlvbnMsCiAgICAgIHByb3BzOiB7CiAgICAgICAgbWF4U3ViU3RlcHMsCiAgICAgICAgc3RlcFNpemUsCiAgICAgICAgdGltZVNpbmNlTGFzdENhbGxlZAogICAgICB9LAogICAgICBxdWF0ZXJuaW9ucwogICAgfSA9IF9yZWY7CiAgICBzdGF0ZS53b3JsZC5zdGVwKHN0ZXBTaXplLCB0aW1lU2luY2VMYXN0Q2FsbGVkLCBtYXhTdWJTdGVwcyk7CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZS53b3JsZC5ib2RpZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgcCA9IHN0YXRlLndvcmxkLmJvZGllc1tpXS5wb3NpdGlvbjsKICAgICAgY29uc3QgcSA9IHN0YXRlLndvcmxkLmJvZGllc1tpXS5xdWF0ZXJuaW9uOwogICAgICBwb3NpdGlvbnNbMyAqIGkgKyAwXSA9IHAueDsKICAgICAgcG9zaXRpb25zWzMgKiBpICsgMV0gPSBwLnk7CiAgICAgIHBvc2l0aW9uc1szICogaSArIDJdID0gcC56OwogICAgICBxdWF0ZXJuaW9uc1s0ICogaSArIDBdID0gcS54OwogICAgICBxdWF0ZXJuaW9uc1s0ICogaSArIDFdID0gcS55OwogICAgICBxdWF0ZXJuaW9uc1s0ICogaSArIDJdID0gcS56OwogICAgICBxdWF0ZXJuaW9uc1s0ICogaSArIDNdID0gcS53OwogICAgfQoKICAgIGNvbnN0IG9ic2VydmF0aW9ucyA9IFtdOwoKICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXMoc3RhdGUuc3Vic2NyaXB0aW9ucykpIHsKICAgICAgY29uc3QgW3V1aWQsIHR5cGUsIHRhcmdldCA9ICdib2RpZXMnXSA9IHN0YXRlLnN1YnNjcmlwdGlvbnNbaWRdOwogICAgICBjb25zdCB7CiAgICAgICAgYm9kaWVzLAogICAgICAgIHZlaGljbGVzCiAgICAgIH0gPSBzdGF0ZTsKICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXQgPT09ICd2ZWhpY2xlcycgPyAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE86IERpZmZlcmVudGlhdGUgdGhlc2UgInR5cGVzIgogICAgICB2ZWhpY2xlc1t1dWlkXS52ZWhpY2xlW3R5cGVdIDogLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBEaWZmZXJlbnRpYXRlIHRoZXNlICJ0eXBlcyIKICAgICAgYm9kaWVzW3V1aWRdW3R5cGVdOwogICAgICBjb25zdCBzZXJpYWxpemFibGVWYWx1ZSA9IGlzUW9yVih2YWx1ZSkgPyB2YWx1ZS50b0FycmF5KCkgOiB2YWx1ZTsKICAgICAgb2JzZXJ2YXRpb25zLnB1c2goW051bWJlcihpZCksIHNlcmlhbGl6YWJsZVZhbHVlLCAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE86IERpZmZlcmVudGlhdGUgdGhlc2UgInR5cGVzIgogICAgICB0eXBlXSk7CiAgICB9CgogICAgY29uc3QgbWVzc2FnZSA9IHsKICAgICAgYWN0aXZlOiBzdGF0ZS53b3JsZC5oYXNBY3RpdmVCb2RpZXMsCiAgICAgIG9ic2VydmF0aW9ucywKICAgICAgb3A6ICdmcmFtZScsCiAgICAgIHBvc2l0aW9ucywKICAgICAgcXVhdGVybmlvbnMKICAgIH07CgogICAgaWYgKHN0YXRlLmJvZGllc05lZWRTeW5jaW5nKSB7CiAgICAgIG1lc3NhZ2UuYm9kaWVzID0gc3RhdGUud29ybGQuYm9kaWVzLnJlZHVjZSgoYm9kaWVzLCBib2R5KSA9PiB7CiAgICAgICAgaWYgKGJvZHkudXVpZCkgYm9kaWVzLnB1c2goYm9keS51dWlkKTsKICAgICAgICByZXR1cm4gYm9kaWVzOwogICAgICB9LCBbXSk7CiAgICAgIHN0YXRlLmJvZGllc05lZWRTeW5jaW5nID0gZmFsc2U7CiAgICB9CgogICAgc2VsZi5wb3N0TWVzc2FnZShtZXNzYWdlLCBbcG9zaXRpb25zLmJ1ZmZlciwgcXVhdGVybmlvbnMuYnVmZmVyXSk7CiAgfTsKCiAgY29uc3Qgc3RhdGUgPSB7CiAgICBib2RpZXM6IHt9LAogICAgYm9kaWVzTmVlZFN5bmNpbmc6IGZhbHNlLAogICAgY29uc3RyYWludHM6IHt9LAogICAgbWF0ZXJpYWxzOiB7fSwKICAgIHJheXM6IHt9LAogICAgc3ByaW5nSW5zdGFuY2VzOiB7fSwKICAgIHNwcmluZ3M6IHt9LAogICAgc3Vic2NyaXB0aW9uczoge30sCiAgICB2ZWhpY2xlczoge30sCiAgICB3b3JsZDogbmV3IFdvcmxkKCkKICB9OwoKICAvLy8gPHJlZmVyZW5jZSBuby1kZWZhdWx0LWxpYj0idHJ1ZSIvPgoKICBjb25zdCBpc0hpbmdlQ29uc3RyYWludCA9IGMgPT4gYyBpbnN0YW5jZW9mIEhpbmdlQ29uc3RyYWludDsKCiAgZnVuY3Rpb24gc3luY0JvZGllcygpIHsKICAgIHN0YXRlLmJvZGllc05lZWRTeW5jaW5nID0gdHJ1ZTsKICAgIHN0YXRlLmJvZGllcyA9IHN0YXRlLndvcmxkLmJvZGllcy5yZWR1Y2UoKGJvZGllcywgYm9keSkgPT4gYm9keS51dWlkID8geyAuLi5ib2RpZXMsCiAgICAgIFtib2R5LnV1aWRdOiBib2R5CiAgICB9IDogYm9kaWVzLCB7fSk7CiAgfQoKICBjb25zdCBicm9hZHBoYXNlcyA9IHsKICAgIE5haXZlQnJvYWRwaGFzZSwKICAgIFNBUEJyb2FkcGhhc2UKICB9OwogIGNvbnN0IGNyZWF0ZU1hdGVyaWFsID0gY3JlYXRlTWF0ZXJpYWxGYWN0b3J5KHN0YXRlLm1hdGVyaWFscyk7CgogIHNlbGYub25tZXNzYWdlID0gX3JlZiA9PiB7CiAgICBsZXQgewogICAgICBkYXRhCiAgICB9ID0gX3JlZjsKCiAgICBzd2l0Y2ggKGRhdGEub3ApIHsKICAgICAgY2FzZSAnaW5pdCc6CiAgICAgICAgewogICAgICAgICAgaW5pdChzdGF0ZS53b3JsZCwgZGF0YS5wcm9wcyk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdzdGVwJzoKICAgICAgICB7CiAgICAgICAgICBzdGVwKHN0YXRlLCBkYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ2FkZEJvZGllcyc6CiAgICAgICAgewogICAgICAgICAgYWRkQm9kaWVzKHN0YXRlLCBjcmVhdGVNYXRlcmlhbCwgZGF0YSk7CiAgICAgICAgICBzeW5jQm9kaWVzKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdyZW1vdmVCb2RpZXMnOgogICAgICAgIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS51dWlkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHN0YXRlLndvcmxkLnJlbW92ZUJvZHkoc3RhdGUuYm9kaWVzW2RhdGEudXVpZFtpXV0pOwogICAgICAgICAgfQoKICAgICAgICAgIHN5bmNCb2RpZXMoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ3N1YnNjcmliZSc6CiAgICAgICAgewogICAgICAgICAgY29uc3QgewogICAgICAgICAgICBpZCwKICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICB0eXBlCiAgICAgICAgICB9ID0gZGF0YS5wcm9wczsKICAgICAgICAgIHN0YXRlLnN1YnNjcmlwdGlvbnNbaWRdID0gW2RhdGEudXVpZCwgdHlwZSwgdGFyZ2V0XTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ3Vuc3Vic2NyaWJlJzoKICAgICAgICB7CiAgICAgICAgICBkZWxldGUgc3RhdGUuc3Vic2NyaXB0aW9uc1tkYXRhLnByb3BzXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ3NldFBvc2l0aW9uJzoKICAgICAgICBzdGF0ZS5ib2RpZXNbZGF0YS51dWlkXS5wb3NpdGlvbi5zZXQoZGF0YS5wcm9wc1swXSwgZGF0YS5wcm9wc1sxXSwgZGF0YS5wcm9wc1syXSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRRdWF0ZXJuaW9uJzoKICAgICAgICBzdGF0ZS5ib2RpZXNbZGF0YS51dWlkXS5xdWF0ZXJuaW9uLnNldChkYXRhLnByb3BzWzBdLCBkYXRhLnByb3BzWzFdLCBkYXRhLnByb3BzWzJdLCBkYXRhLnByb3BzWzNdKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NldFJvdGF0aW9uJzoKICAgICAgICBzdGF0ZS5ib2RpZXNbZGF0YS51dWlkXS5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihkYXRhLnByb3BzWzBdLCBkYXRhLnByb3BzWzFdLCBkYXRhLnByb3BzWzJdKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NldFZlbG9jaXR5JzoKICAgICAgICBzdGF0ZS5ib2RpZXNbZGF0YS51dWlkXS52ZWxvY2l0eS5zZXQoZGF0YS5wcm9wc1swXSwgZGF0YS5wcm9wc1sxXSwgZGF0YS5wcm9wc1syXSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRBbmd1bGFyVmVsb2NpdHknOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmFuZ3VsYXJWZWxvY2l0eS5zZXQoZGF0YS5wcm9wc1swXSwgZGF0YS5wcm9wc1sxXSwgZGF0YS5wcm9wc1syXSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRMaW5lYXJGYWN0b3InOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmxpbmVhckZhY3Rvci5zZXQoZGF0YS5wcm9wc1swXSwgZGF0YS5wcm9wc1sxXSwgZGF0YS5wcm9wc1syXSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRBbmd1bGFyRmFjdG9yJzoKICAgICAgICBzdGF0ZS5ib2RpZXNbZGF0YS51dWlkXS5hbmd1bGFyRmFjdG9yLnNldChkYXRhLnByb3BzWzBdLCBkYXRhLnByb3BzWzFdLCBkYXRhLnByb3BzWzJdKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NldE1hc3MnOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLm1hc3MgPSBkYXRhLnByb3BzOwogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLnVwZGF0ZU1hc3NQcm9wZXJ0aWVzKCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRNYXRlcmlhbCc6CiAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0ubWF0ZXJpYWwgPSBkYXRhLnByb3BzID8gY3JlYXRlTWF0ZXJpYWwoZGF0YS5wcm9wcykgOiBudWxsOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2V0TGluZWFyRGFtcGluZyc6CiAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0ubGluZWFyRGFtcGluZyA9IGRhdGEucHJvcHM7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRBbmd1bGFyRGFtcGluZyc6CiAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0uYW5ndWxhckRhbXBpbmcgPSBkYXRhLnByb3BzOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2V0QWxsb3dTbGVlcCc6CiAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0uYWxsb3dTbGVlcCA9IGRhdGEucHJvcHM7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRTbGVlcFNwZWVkTGltaXQnOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLnNsZWVwU3BlZWRMaW1pdCA9IGRhdGEucHJvcHM7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRTbGVlcFRpbWVMaW1pdCc6CiAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0uc2xlZXBUaW1lTGltaXQgPSBkYXRhLnByb3BzOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2V0Q29sbGlzaW9uRmlsdGVyR3JvdXAnOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmNvbGxpc2lvbkZpbHRlckdyb3VwID0gZGF0YS5wcm9wczsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NldENvbGxpc2lvbkZpbHRlck1hc2snOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmNvbGxpc2lvbkZpbHRlck1hc2sgPSBkYXRhLnByb3BzOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2V0Q29sbGlzaW9uUmVzcG9uc2UnOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmNvbGxpc2lvblJlc3BvbnNlID0gZGF0YS5wcm9wczsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NldEZpeGVkUm90YXRpb24nOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmZpeGVkUm90YXRpb24gPSBkYXRhLnByb3BzOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2V0SXNUcmlnZ2VyJzoKICAgICAgICBzdGF0ZS5ib2RpZXNbZGF0YS51dWlkXS5pc1RyaWdnZXIgPSBkYXRhLnByb3BzOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2V0R3Jhdml0eSc6CiAgICAgICAgc3RhdGUud29ybGQuZ3Jhdml0eS5zZXQoZGF0YS5wcm9wc1swXSwgZGF0YS5wcm9wc1sxXSwgZGF0YS5wcm9wc1syXSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRUb2xlcmFuY2UnOgogICAgICAgIGlmIChzdGF0ZS53b3JsZC5zb2x2ZXIgaW5zdGFuY2VvZiBHU1NvbHZlcikgewogICAgICAgICAgc3RhdGUud29ybGQuc29sdmVyLnRvbGVyYW5jZSA9IGRhdGEucHJvcHM7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NldEl0ZXJhdGlvbnMnOgogICAgICAgIGlmIChzdGF0ZS53b3JsZC5zb2x2ZXIgaW5zdGFuY2VvZiBHU1NvbHZlcikgewogICAgICAgICAgc3RhdGUud29ybGQuc29sdmVyLml0ZXJhdGlvbnMgPSBkYXRhLnByb3BzOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzZXRCcm9hZHBoYXNlJzoKICAgICAgICBzdGF0ZS53b3JsZC5icm9hZHBoYXNlID0gbmV3IChicm9hZHBoYXNlc1tgJHtkYXRhLnByb3BzfUJyb2FkcGhhc2VgXSB8fCBOYWl2ZUJyb2FkcGhhc2UpKHN0YXRlLndvcmxkKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NldEF4aXNJbmRleCc6CiAgICAgICAgaWYgKHN0YXRlLndvcmxkLmJyb2FkcGhhc2UgaW5zdGFuY2VvZiBTQVBCcm9hZHBoYXNlKSB7CiAgICAgICAgICBzdGF0ZS53b3JsZC5icm9hZHBoYXNlLmF4aXNJbmRleCA9IGRhdGEucHJvcHMgPT09IHVuZGVmaW5lZCB8fCBkYXRhLnByb3BzID09PSBudWxsID8gMCA6IGRhdGEucHJvcHM7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2FwcGx5Rm9yY2UnOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmFwcGx5Rm9yY2UobmV3IFZlYzMoLi4uZGF0YS5wcm9wc1swXSksIG5ldyBWZWMzKC4uLmRhdGEucHJvcHNbMV0pKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2FwcGx5SW1wdWxzZSc6CiAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0uYXBwbHlJbXB1bHNlKG5ldyBWZWMzKC4uLmRhdGEucHJvcHNbMF0pLCBuZXcgVmVjMyguLi5kYXRhLnByb3BzWzFdKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdhcHBseUxvY2FsRm9yY2UnOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmFwcGx5TG9jYWxGb3JjZShuZXcgVmVjMyguLi5kYXRhLnByb3BzWzBdKSwgbmV3IFZlYzMoLi4uZGF0YS5wcm9wc1sxXSkpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnYXBwbHlMb2NhbEltcHVsc2UnOgogICAgICAgIHN0YXRlLmJvZGllc1tkYXRhLnV1aWRdLmFwcGx5TG9jYWxJbXB1bHNlKG5ldyBWZWMzKC4uLmRhdGEucHJvcHNbMF0pLCBuZXcgVmVjMyguLi5kYXRhLnByb3BzWzFdKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdhcHBseVRvcnF1ZSc6CiAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0uYXBwbHlUb3JxdWUobmV3IFZlYzMoLi4uZGF0YS5wcm9wc1swXSkpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnYWRkQ29uc3RyYWludCc6CiAgICAgICAgewogICAgICAgICAgYWRkQ29uc3RyYWludChzdGF0ZSwgZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdyZW1vdmVDb25zdHJhaW50JzoKICAgICAgICBzdGF0ZS53b3JsZC5jb25zdHJhaW50cy5maWx0ZXIoX3JlZjIgPT4gewogICAgICAgICAgbGV0IHsKICAgICAgICAgICAgdXVpZAogICAgICAgICAgfSA9IF9yZWYyOwogICAgICAgICAgcmV0dXJuIHV1aWQgPT09IGRhdGEudXVpZDsKICAgICAgICB9KS5tYXAoYyA9PiBzdGF0ZS53b3JsZC5yZW1vdmVDb25zdHJhaW50KGMpKTsKCiAgICAgICAgaWYgKHN0YXRlLmNvbnN0cmFpbnRzW2RhdGEudXVpZF0pIHsKICAgICAgICAgIHN0YXRlLndvcmxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Bvc3RTdGVwJywgc3RhdGUuY29uc3RyYWludHNbZGF0YS51dWlkXSk7CiAgICAgICAgICBkZWxldGUgc3RhdGUuY29uc3RyYWludHNbZGF0YS51dWlkXTsKICAgICAgICB9CgogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnZW5hYmxlQ29uc3RyYWludCc6CiAgICAgICAgc3RhdGUud29ybGQuY29uc3RyYWludHMuZmlsdGVyKGMgPT4gYy51dWlkID09PSBkYXRhLnV1aWQpLm1hcChjID0+IGMuZW5hYmxlKCkpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnZGlzYWJsZUNvbnN0cmFpbnQnOgogICAgICAgIHN0YXRlLndvcmxkLmNvbnN0cmFpbnRzLmZpbHRlcihjID0+IGMudXVpZCA9PT0gZGF0YS51dWlkKS5tYXAoYyA9PiBjLmRpc2FibGUoKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdlbmFibGVDb25zdHJhaW50TW90b3InOgogICAgICAgIHN0YXRlLndvcmxkLmNvbnN0cmFpbnRzLmZpbHRlcihjID0+IGMudXVpZCA9PT0gZGF0YS51dWlkKS5maWx0ZXIoaXNIaW5nZUNvbnN0cmFpbnQpLm1hcChjID0+IGMuZW5hYmxlTW90b3IoKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdkaXNhYmxlQ29uc3RyYWludE1vdG9yJzoKICAgICAgICBzdGF0ZS53b3JsZC5jb25zdHJhaW50cy5maWx0ZXIoYyA9PiBjLnV1aWQgPT09IGRhdGEudXVpZCkuZmlsdGVyKGlzSGluZ2VDb25zdHJhaW50KS5tYXAoYyA9PiBjLmRpc2FibGVNb3RvcigpKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NldENvbnN0cmFpbnRNb3RvclNwZWVkJzoKICAgICAgICBzdGF0ZS53b3JsZC5jb25zdHJhaW50cy5maWx0ZXIoYyA9PiBjLnV1aWQgPT09IGRhdGEudXVpZCkuZmlsdGVyKGlzSGluZ2VDb25zdHJhaW50KS5tYXAoYyA9PiBjLnNldE1vdG9yU3BlZWQoZGF0YS5wcm9wcykpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2V0Q29uc3RyYWludE1vdG9yTWF4Rm9yY2UnOgogICAgICAgIHN0YXRlLndvcmxkLmNvbnN0cmFpbnRzLmZpbHRlcihjID0+IGMudXVpZCA9PT0gZGF0YS51dWlkKS5maWx0ZXIoaXNIaW5nZUNvbnN0cmFpbnQpLm1hcChjID0+IGMuc2V0TW90b3JNYXhGb3JjZShkYXRhLnByb3BzKSk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdhZGRTcHJpbmcnOgogICAgICAgIHsKICAgICAgICAgIGFkZFNwcmluZyhzdGF0ZSwgZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdzZXRTcHJpbmdTdGlmZm5lc3MnOgogICAgICAgIHsKICAgICAgICAgIHN0YXRlLnNwcmluZ0luc3RhbmNlc1tkYXRhLnV1aWRdLnN0aWZmbmVzcyA9IGRhdGEucHJvcHM7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdzZXRTcHJpbmdSZXN0TGVuZ3RoJzoKICAgICAgICB7CiAgICAgICAgICBzdGF0ZS5zcHJpbmdJbnN0YW5jZXNbZGF0YS51dWlkXS5yZXN0TGVuZ3RoID0gZGF0YS5wcm9wczsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ3NldFNwcmluZ0RhbXBpbmcnOgogICAgICAgIHsKICAgICAgICAgIHN0YXRlLnNwcmluZ0luc3RhbmNlc1tkYXRhLnV1aWRdLmRhbXBpbmcgPSBkYXRhLnByb3BzOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgY2FzZSAncmVtb3ZlU3ByaW5nJzoKICAgICAgICB7CiAgICAgICAgICBzdGF0ZS53b3JsZC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb3N0U3RlcCcsIHN0YXRlLnNwcmluZ3NbZGF0YS51dWlkXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdhZGRSYXknOgogICAgICAgIHsKICAgICAgICAgIGFkZFJheShzdGF0ZSwgZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdyZW1vdmVSYXknOgogICAgICAgIHsKICAgICAgICAgIHN0YXRlLndvcmxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3ByZVN0ZXAnLCBzdGF0ZS5yYXlzW2RhdGEudXVpZF0pOwogICAgICAgICAgZGVsZXRlIHN0YXRlLnJheXNbZGF0YS51dWlkXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ2FkZFJheWNhc3RWZWhpY2xlJzoKICAgICAgICB7CiAgICAgICAgICBhZGRSYXljYXN0VmVoaWNsZShzdGF0ZSwgZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdyZW1vdmVSYXljYXN0VmVoaWNsZSc6CiAgICAgICAgewogICAgICAgICAgc3RhdGUud29ybGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJlU3RlcCcsIHN0YXRlLnZlaGljbGVzW2RhdGEudXVpZF0ucHJlU3RlcCk7CiAgICAgICAgICBzdGF0ZS53b3JsZC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb3N0U3RlcCcsIHN0YXRlLnZlaGljbGVzW2RhdGEudXVpZF0ucG9zdFN0ZXApOwogICAgICAgICAgc3RhdGUudmVoaWNsZXNbZGF0YS51dWlkXS52ZWhpY2xlLndvcmxkID0gbnVsbDsKICAgICAgICAgIGRlbGV0ZSBzdGF0ZS52ZWhpY2xlc1tkYXRhLnV1aWRdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgY2FzZSAnc2V0UmF5Y2FzdFZlaGljbGVTdGVlcmluZ1ZhbHVlJzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCBbdmFsdWUsIHdoZWVsSW5kZXhdID0gZGF0YS5wcm9wczsKICAgICAgICAgIHN0YXRlLnZlaGljbGVzW2RhdGEudXVpZF0udmVoaWNsZS5zZXRTdGVlcmluZ1ZhbHVlKHZhbHVlLCB3aGVlbEluZGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ2FwcGx5UmF5Y2FzdFZlaGljbGVFbmdpbmVGb3JjZSc6CiAgICAgICAgewogICAgICAgICAgY29uc3QgW3ZhbHVlLCB3aGVlbEluZGV4XSA9IGRhdGEucHJvcHM7CiAgICAgICAgICBzdGF0ZS52ZWhpY2xlc1tkYXRhLnV1aWRdLnZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZSh2YWx1ZSwgd2hlZWxJbmRleCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdzZXRSYXljYXN0VmVoaWNsZUJyYWtlJzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCBbYnJha2UsIHdoZWVsSW5kZXhdID0gZGF0YS5wcm9wczsKICAgICAgICAgIHN0YXRlLnZlaGljbGVzW2RhdGEudXVpZF0udmVoaWNsZS5zZXRCcmFrZShicmFrZSwgd2hlZWxJbmRleCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdhZGRDb250YWN0TWF0ZXJpYWwnOgogICAgICAgIHsKICAgICAgICAgIGFkZENvbnRhY3RNYXRlcmlhbChzdGF0ZS53b3JsZCwgY3JlYXRlTWF0ZXJpYWwsIGRhdGEucHJvcHMsIGRhdGEudXVpZCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdyZW1vdmVDb250YWN0TWF0ZXJpYWwnOgogICAgICAgIHsKICAgICAgICAgIHJlbW92ZUNvbnRhY3RNYXRlcmlhbChzdGF0ZS53b3JsZCwgZGF0YS51dWlkKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ3dha2VVcCc6CiAgICAgICAgewogICAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0ud2FrZVVwKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdzbGVlcCc6CiAgICAgICAgewogICAgICAgICAgc3RhdGUuYm9kaWVzW2RhdGEudXVpZF0uc2xlZXAoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICB9OwoKfSkoKTsKCg==",null,!1);class S9 extends V9{get axisIndex(){return this.config.axisIndex}set axisIndex(e){this.config.axisIndex=e,this.postMessage({op:"setAxisIndex",props:e})}get broadphase(){return this.config.broadphase}set broadphase(e){this.config.broadphase=e,this.postMessage({op:"setBroadphase",props:e})}get gravity(){return this.config.gravity}set gravity(e){this.config.gravity=e,this.postMessage({op:"setGravity",props:e})}get iterations(){return this.config.iterations}set iterations(e){this.config.iterations=e,this.postMessage({op:"setIterations",props:e})}get tolerance(){return this.config.tolerance}set tolerance(e){this.config.tolerance=e,this.postMessage({op:"setTolerance",props:e})}constructor(e){let{allowSleep:g=!1,axisIndex:n=0,broadphase:I="Naive",defaultContactMaterial:o={contactEquationStiffness:1e6},gravity:i=[0,-9.81,0],iterations:l=5,quatNormalizeFast:r=!1,quatNormalizeSkip:c=0,size:A=1e3,solver:u="GS",tolerance:h=.001}=e;super();this.messageQueue=[],this.worker=null,this.config={allowSleep:g,axisIndex:n,broadphase:I,defaultContactMaterial:o,gravity:i,iterations:l,quatNormalizeFast:r,quatNormalizeSkip:c,size:A,solver:u,tolerance:h},this.buffers={positions:new Float32Array(A*3),quaternions:new Float32Array(A*4)}}addBodies(e){let{props:g,type:n,uuid:I}=e;this.postMessage({op:"addBodies",props:g,type:n,uuid:I})}addConstraint(e){let{props:[g,n,I],type:o,uuid:i}=e;this.postMessage({op:"addConstraint",props:[g,n,I],type:o,uuid:i})}addContactMaterial(e){let{props:g,uuid:n}=e;this.postMessage({op:"addContactMaterial",props:g,uuid:n})}addRay(e){let{props:g,uuid:n}=e;this.postMessage({op:"addRay",props:g,uuid:n})}addRaycastVehicle(e){let{props:[g,n,I,o,i,l],uuid:r}=e;this.postMessage({op:"addRaycastVehicle",props:[g,n,I,o,i,l],uuid:r})}addSpring(e){let{props:[g,n,I],uuid:o}=e;this.postMessage({op:"addSpring",props:[g,n,I],uuid:o})}applyForce(e){let{props:g,uuid:n}=e;this.postMessage({op:"applyForce",props:g,uuid:n})}applyImpulse(e){let{props:g,uuid:n}=e;this.postMessage({op:"applyImpulse",props:g,uuid:n})}applyLocalForce(e){let{props:g,uuid:n}=e;this.postMessage({op:"applyLocalForce",props:g,uuid:n})}applyLocalImpulse(e){let{props:g,uuid:n}=e;this.postMessage({op:"applyLocalImpulse",props:g,uuid:n})}applyRaycastVehicleEngineForce(e){let{props:g,uuid:n}=e;this.postMessage({op:"applyRaycastVehicleEngineForce",props:g,uuid:n})}applyTorque(e){let{props:g,uuid:n}=e;this.postMessage({op:"applyTorque",props:g,uuid:n})}connect(){this.worker=new K9,this.worker.onmessage=e=>{if(e.data.op==="frame"){this.buffers.positions=e.data.positions,this.buffers.quaternions=e.data.quaternions,this.emit(e.data.op,e.data);return}this.emit(e.data.type,e.data)};for(const e of this.messageQueue)this.worker.postMessage(e);this.messageQueue.length=0}disableConstraint(e){let{uuid:g}=e;this.postMessage({op:"disableConstraint",uuid:g})}disableConstraintMotor(e){let{uuid:g}=e;this.postMessage({op:"disableConstraintMotor",uuid:g})}disconnect(){this.worker&&(this.worker.onmessage=null)}enableConstraint(e){let{uuid:g}=e;this.postMessage({op:"enableConstraint",uuid:g})}enableConstraintMotor(e){let{uuid:g}=e;this.postMessage({op:"enableConstraintMotor",uuid:g})}init(){const{allowSleep:e,axisIndex:g,broadphase:n,defaultContactMaterial:I,gravity:o,iterations:i,quatNormalizeFast:l,quatNormalizeSkip:r,solver:c,tolerance:A}=this.config;this.postMessage({op:"init",props:{allowSleep:e,axisIndex:g,broadphase:n,defaultContactMaterial:I,gravity:o,iterations:i,quatNormalizeFast:l,quatNormalizeSkip:r,solver:c,tolerance:A}})}removeBodies(e){let{uuid:g}=e;this.postMessage({op:"removeBodies",uuid:g})}removeConstraint(e){let{uuid:g}=e;this.postMessage({op:"removeConstraint",uuid:g})}removeContactMaterial(e){let{uuid:g}=e;this.postMessage({op:"removeContactMaterial",uuid:g})}removeRay(e){let{uuid:g}=e;this.postMessage({op:"removeRay",uuid:g})}removeRaycastVehicle(e){let{uuid:g}=e;this.postMessage({op:"removeRaycastVehicle",uuid:g})}removeSpring(e){let{uuid:g}=e;this.postMessage({op:"removeSpring",uuid:g})}setAllowSleep(e){let{props:g,uuid:n}=e;this.postMessage({op:"setAllowSleep",props:g,uuid:n})}setAngularDamping(e){let{props:g,uuid:n}=e;this.postMessage({op:"setAngularDamping",props:g,uuid:n})}setAngularFactor(e){let{props:g,uuid:n}=e;this.postMessage({op:"setAngularFactor",props:g,uuid:n})}setAngularVelocity(e){let{props:g,uuid:n}=e;this.postMessage({op:"setAngularVelocity",props:g,uuid:n})}setCollisionFilterGroup(e){let{props:g,uuid:n}=e;this.postMessage({op:"setCollisionFilterGroup",props:g,uuid:n})}setCollisionFilterMask(e){let{props:g,uuid:n}=e;this.postMessage({op:"setCollisionFilterMask",props:g,uuid:n})}setCollisionResponse(e){let{props:g,uuid:n}=e;this.postMessage({op:"setCollisionResponse",props:g,uuid:n})}setConstraintMotorMaxForce(e){let{props:g,uuid:n}=e;this.postMessage({op:"setConstraintMotorMaxForce",props:g,uuid:n})}setConstraintMotorSpeed(e){let{props:g,uuid:n}=e;this.postMessage({op:"setConstraintMotorSpeed",props:g,uuid:n})}setFixedRotation(e){let{props:g,uuid:n}=e;this.postMessage({op:"setFixedRotation",props:g,uuid:n})}setIsTrigger(e){let{props:g,uuid:n}=e;this.postMessage({op:"setIsTrigger",props:g,uuid:n})}setLinearDamping(e){let{props:g,uuid:n}=e;this.postMessage({op:"setLinearDamping",props:g,uuid:n})}setLinearFactor(e){let{props:g,uuid:n}=e;this.postMessage({op:"setLinearFactor",props:g,uuid:n})}setMass(e){let{props:g,uuid:n}=e;this.postMessage({op:"setMass",props:g,uuid:n})}setMaterial(e){let{props:g,uuid:n}=e;this.postMessage({op:"setMaterial",props:g,uuid:n})}setPosition(e){let{props:g,uuid:n}=e;this.postMessage({op:"setPosition",props:g,uuid:n})}setQuaternion(e){let{props:[g,n,I,o],uuid:i}=e;this.postMessage({op:"setQuaternion",props:[g,n,I,o],uuid:i})}setRaycastVehicleBrake(e){let{props:g,uuid:n}=e;this.postMessage({op:"setRaycastVehicleBrake",props:g,uuid:n})}setRaycastVehicleSteeringValue(e){let{props:g,uuid:n}=e;this.postMessage({op:"setRaycastVehicleSteeringValue",props:g,uuid:n})}setRotation(e){let{props:g,uuid:n}=e;this.postMessage({op:"setRotation",props:g,uuid:n})}setSleepSpeedLimit(e){let{props:g,uuid:n}=e;this.postMessage({op:"setSleepSpeedLimit",props:g,uuid:n})}setSleepTimeLimit(e){let{props:g,uuid:n}=e;this.postMessage({op:"setSleepTimeLimit",props:g,uuid:n})}setSpringDamping(e){let{props:g,uuid:n}=e;this.postMessage({op:"setSpringDamping",props:g,uuid:n})}setSpringRestLength(e){let{props:g,uuid:n}=e;this.postMessage({op:"setSpringRestLength",props:g,uuid:n})}setSpringStiffness(e){let{props:g,uuid:n}=e;this.postMessage({op:"setSpringStiffness",props:g,uuid:n})}setUserData(e){let{props:g,uuid:n}=e;this.postMessage({op:"setUserData",props:g,uuid:n})}setVelocity(e){let{props:g,uuid:n}=e;this.postMessage({op:"setVelocity",props:g,uuid:n})}sleep(e){let{uuid:g}=e;this.postMessage({op:"sleep",uuid:g})}step(e){var g;const{buffers:{positions:n,quaternions:I}}=this;!n.byteLength&&!I.byteLength||(g=this.worker)==null||g.postMessage({op:"step",positions:n,props:e,quaternions:I},[n.buffer,I.buffer])}subscribe(e){let{props:{id:g,target:n,type:I},uuid:o}=e;this.postMessage({op:"subscribe",props:{id:g,target:n,type:I},uuid:o})}terminate(){var e;(e=this.worker)==null||e.terminate(),this.worker=null}unsubscribe(e){let{props:g}=e;this.postMessage({op:"unsubscribe",props:g})}wakeUp(e){let{uuid:g}=e;this.postMessage({op:"wakeUp",uuid:g})}postMessage(e){if(this.worker)return this.worker.postMessage(e);this.messageQueue.push(e)}}class yn{constructor(e){e===void 0&&(e=[0,0,0,0,0,0,0,0,0]),this.elements=e}identity(){const e=this.elements;e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1}setZero(){const e=this.elements;e[0]=0,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=0,e[6]=0,e[7]=0,e[8]=0}setTrace(e){const g=this.elements;g[0]=e.x,g[4]=e.y,g[8]=e.z}getTrace(e){e===void 0&&(e=new V);const g=this.elements;return e.x=g[0],e.y=g[4],e.z=g[8],e}vmult(e,g){g===void 0&&(g=new V);const n=this.elements,I=e.x,o=e.y,i=e.z;return g.x=n[0]*I+n[1]*o+n[2]*i,g.y=n[3]*I+n[4]*o+n[5]*i,g.z=n[6]*I+n[7]*o+n[8]*i,g}smult(e){for(let g=0;g<this.elements.length;g++)this.elements[g]*=e}mmult(e,g){g===void 0&&(g=new yn);const n=this.elements,I=e.elements,o=g.elements,i=n[0],l=n[1],r=n[2],c=n[3],A=n[4],u=n[5],h=n[6],b=n[7],p=n[8],Z=I[0],v=I[1],y=I[2],m=I[3],B=I[4],w=I[5],X=I[6],R=I[7],S=I[8];return o[0]=i*Z+l*m+r*X,o[1]=i*v+l*B+r*R,o[2]=i*y+l*w+r*S,o[3]=c*Z+A*m+u*X,o[4]=c*v+A*B+u*R,o[5]=c*y+A*w+u*S,o[6]=h*Z+b*m+p*X,o[7]=h*v+b*B+p*R,o[8]=h*y+b*w+p*S,g}scale(e,g){g===void 0&&(g=new yn);const n=this.elements,I=g.elements;for(let o=0;o!==3;o++)I[3*o+0]=e.x*n[3*o+0],I[3*o+1]=e.y*n[3*o+1],I[3*o+2]=e.z*n[3*o+2];return g}solve(e,g){g===void 0&&(g=new V);const n=3,I=4,o=[];let i,l;for(i=0;i<n*I;i++)o.push(0);for(i=0;i<3;i++)for(l=0;l<3;l++)o[i+I*l]=this.elements[i+3*l];o[3+4*0]=e.x,o[3+4*1]=e.y,o[3+4*2]=e.z;let r=3;const c=r;let A;const u=4;let h;do{if(i=c-r,o[i+I*i]===0){for(l=i+1;l<c;l++)if(o[i+I*l]!==0){A=u;do h=u-A,o[h+I*i]+=o[h+I*l];while(--A);break}}if(o[i+I*i]!==0)for(l=i+1;l<c;l++){const b=o[i+I*l]/o[i+I*i];A=u;do h=u-A,o[h+I*l]=h<=i?0:o[h+I*l]-o[h+I*i]*b;while(--A)}}while(--r);if(g.z=o[2*I+3]/o[2*I+2],g.y=(o[1*I+3]-o[1*I+2]*g.z)/o[1*I+1],g.x=(o[0*I+3]-o[0*I+2]*g.z-o[0*I+1]*g.y)/o[0*I+0],isNaN(g.x)||isNaN(g.y)||isNaN(g.z)||g.x===1/0||g.y===1/0||g.z===1/0)throw`Could not solve equation! Got x=[${g.toString()}], b=[${e.toString()}], A=[${this.toString()}]`;return g}e(e,g,n){if(n===void 0)return this.elements[g+3*e];this.elements[g+3*e]=n}copy(e){for(let g=0;g<e.elements.length;g++)this.elements[g]=e.elements[g];return this}toString(){let e="";const g=",";for(let n=0;n<9;n++)e+=this.elements[n]+g;return e}reverse(e){e===void 0&&(e=new yn);const g=3,n=6,I=H9;let o,i;for(o=0;o<3;o++)for(i=0;i<3;i++)I[o+n*i]=this.elements[o+3*i];I[3+6*0]=1,I[3+6*1]=0,I[3+6*2]=0,I[4+6*0]=0,I[4+6*1]=1,I[4+6*2]=0,I[5+6*0]=0,I[5+6*1]=0,I[5+6*2]=1;let l=3;const r=l;let c;const A=n;let u;do{if(o=r-l,I[o+n*o]===0){for(i=o+1;i<r;i++)if(I[o+n*i]!==0){c=A;do u=A-c,I[u+n*o]+=I[u+n*i];while(--c);break}}if(I[o+n*o]!==0)for(i=o+1;i<r;i++){const h=I[o+n*i]/I[o+n*o];c=A;do u=A-c,I[u+n*i]=u<=o?0:I[u+n*i]-I[u+n*o]*h;while(--c)}}while(--l);o=2;do{i=o-1;do{const h=I[o+n*i]/I[o+n*o];c=n;do u=n-c,I[u+n*i]=I[u+n*i]-I[u+n*o]*h;while(--c)}while(i--)}while(--o);o=2;do{const h=1/I[o+n*o];c=n;do u=n-c,I[u+n*o]=I[u+n*o]*h;while(--c)}while(o--);o=2;do{i=2;do{if(u=I[g+i+n*o],isNaN(u)||u===1/0)throw`Could not reverse! A=[${this.toString()}]`;e.e(o,i,u)}while(i--)}while(o--);return e}setRotationFromQuaternion(e){const g=e.x,n=e.y,I=e.z,o=e.w,i=g+g,l=n+n,r=I+I,c=g*i,A=g*l,u=g*r,h=n*l,b=n*r,p=I*r,Z=o*i,v=o*l,y=o*r,m=this.elements;return m[3*0+0]=1-(h+p),m[3*0+1]=A-y,m[3*0+2]=u+v,m[3*1+0]=A+y,m[3*1+1]=1-(c+p),m[3*1+2]=b-Z,m[3*2+0]=u-v,m[3*2+1]=b+Z,m[3*2+2]=1-(c+h),this}transpose(e){e===void 0&&(e=new yn);const g=this.elements,n=e.elements;let I;return n[0]=g[0],n[4]=g[4],n[8]=g[8],I=g[1],n[1]=g[3],n[3]=I,I=g[2],n[2]=g[6],n[6]=I,I=g[5],n[5]=g[7],n[7]=I,e}}const H9=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];class V{constructor(e,g,n){e===void 0&&(e=0),g===void 0&&(g=0),n===void 0&&(n=0),this.x=e,this.y=g,this.z=n}cross(e,g){g===void 0&&(g=new V);const n=e.x,I=e.y,o=e.z,i=this.x,l=this.y,r=this.z;return g.x=l*o-r*I,g.y=r*n-i*o,g.z=i*I-l*n,g}set(e,g,n){return this.x=e,this.y=g,this.z=n,this}setZero(){this.x=this.y=this.z=0}vadd(e,g){if(g)g.x=e.x+this.x,g.y=e.y+this.y,g.z=e.z+this.z;else return new V(this.x+e.x,this.y+e.y,this.z+e.z)}vsub(e,g){if(g)g.x=this.x-e.x,g.y=this.y-e.y,g.z=this.z-e.z;else return new V(this.x-e.x,this.y-e.y,this.z-e.z)}crossmat(){return new yn([0,-this.z,this.y,this.z,0,-this.x,-this.y,this.x,0])}normalize(){const e=this.x,g=this.y,n=this.z,I=Math.sqrt(e*e+g*g+n*n);if(I>0){const o=1/I;this.x*=o,this.y*=o,this.z*=o}else this.x=0,this.y=0,this.z=0;return I}unit(e){e===void 0&&(e=new V);const g=this.x,n=this.y,I=this.z;let o=Math.sqrt(g*g+n*n+I*I);return o>0?(o=1/o,e.x=g*o,e.y=n*o,e.z=I*o):(e.x=1,e.y=0,e.z=0),e}length(){const e=this.x,g=this.y,n=this.z;return Math.sqrt(e*e+g*g+n*n)}lengthSquared(){return this.dot(this)}distanceTo(e){const g=this.x,n=this.y,I=this.z,o=e.x,i=e.y,l=e.z;return Math.sqrt((o-g)*(o-g)+(i-n)*(i-n)+(l-I)*(l-I))}distanceSquared(e){const g=this.x,n=this.y,I=this.z,o=e.x,i=e.y,l=e.z;return(o-g)*(o-g)+(i-n)*(i-n)+(l-I)*(l-I)}scale(e,g){g===void 0&&(g=new V);const n=this.x,I=this.y,o=this.z;return g.x=e*n,g.y=e*I,g.z=e*o,g}vmul(e,g){return g===void 0&&(g=new V),g.x=e.x*this.x,g.y=e.y*this.y,g.z=e.z*this.z,g}addScaledVector(e,g,n){return n===void 0&&(n=new V),n.x=this.x+e*g.x,n.y=this.y+e*g.y,n.z=this.z+e*g.z,n}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}isZero(){return this.x===0&&this.y===0&&this.z===0}negate(e){return e===void 0&&(e=new V),e.x=-this.x,e.y=-this.y,e.z=-this.z,e}tangents(e,g){const n=this.length();if(n>0){const I=N9,o=1/n;I.set(this.x*o,this.y*o,this.z*o);const i=F9;Math.abs(I.x)<.9?(i.set(1,0,0),I.cross(i,e)):(i.set(0,1,0),I.cross(i,e)),I.cross(e,g)}else e.set(1,0,0),g.set(0,1,0)}toString(){return`${this.x},${this.y},${this.z}`}toArray(){return[this.x,this.y,this.z]}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}lerp(e,g,n){const I=this.x,o=this.y,i=this.z;n.x=I+(e.x-I)*g,n.y=o+(e.y-o)*g,n.z=i+(e.z-i)*g}almostEquals(e,g){return g===void 0&&(g=1e-6),!(Math.abs(this.x-e.x)>g||Math.abs(this.y-e.y)>g||Math.abs(this.z-e.z)>g)}almostZero(e){return e===void 0&&(e=1e-6),!(Math.abs(this.x)>e||Math.abs(this.y)>e||Math.abs(this.z)>e)}isAntiparallelTo(e,g){return this.negate(LB),LB.almostEquals(e,g)}clone(){return new V(this.x,this.y,this.z)}}V.ZERO=new V(0,0,0);V.UNIT_X=new V(1,0,0);V.UNIT_Y=new V(0,1,0);V.UNIT_Z=new V(0,0,1);const N9=new V,F9=new V,LB=new V;class gt{constructor(e){e===void 0&&(e={}),this.lowerBound=new V,this.upperBound=new V,e.lowerBound&&this.lowerBound.copy(e.lowerBound),e.upperBound&&this.upperBound.copy(e.upperBound)}setFromPoints(e,g,n,I){const o=this.lowerBound,i=this.upperBound,l=n;o.copy(e[0]),l&&l.vmult(o,o),i.copy(o);for(let r=1;r<e.length;r++){let c=e[r];l&&(l.vmult(c,JB),c=JB),c.x>i.x&&(i.x=c.x),c.x<o.x&&(o.x=c.x),c.y>i.y&&(i.y=c.y),c.y<o.y&&(o.y=c.y),c.z>i.z&&(i.z=c.z),c.z<o.z&&(o.z=c.z)}return g&&(g.vadd(o,o),g.vadd(i,i)),I&&(o.x-=I,o.y-=I,o.z-=I,i.x+=I,i.y+=I,i.z+=I),this}copy(e){return this.lowerBound.copy(e.lowerBound),this.upperBound.copy(e.upperBound),this}clone(){return new gt().copy(this)}extend(e){this.lowerBound.x=Math.min(this.lowerBound.x,e.lowerBound.x),this.upperBound.x=Math.max(this.upperBound.x,e.upperBound.x),this.lowerBound.y=Math.min(this.lowerBound.y,e.lowerBound.y),this.upperBound.y=Math.max(this.upperBound.y,e.upperBound.y),this.lowerBound.z=Math.min(this.lowerBound.z,e.lowerBound.z),this.upperBound.z=Math.max(this.upperBound.z,e.upperBound.z)}overlaps(e){const g=this.lowerBound,n=this.upperBound,I=e.lowerBound,o=e.upperBound,i=I.x<=n.x&&n.x<=o.x||g.x<=o.x&&o.x<=n.x,l=I.y<=n.y&&n.y<=o.y||g.y<=o.y&&o.y<=n.y,r=I.z<=n.z&&n.z<=o.z||g.z<=o.z&&o.z<=n.z;return i&&l&&r}volume(){const e=this.lowerBound,g=this.upperBound;return(g.x-e.x)*(g.y-e.y)*(g.z-e.z)}contains(e){const g=this.lowerBound,n=this.upperBound,I=e.lowerBound,o=e.upperBound;return g.x<=I.x&&n.x>=o.x&&g.y<=I.y&&n.y>=o.y&&g.z<=I.z&&n.z>=o.z}getCorners(e,g,n,I,o,i,l,r){const c=this.lowerBound,A=this.upperBound;e.copy(c),g.set(A.x,c.y,c.z),n.set(A.x,A.y,c.z),I.set(c.x,A.y,A.z),o.set(A.x,c.y,A.z),i.set(c.x,A.y,c.z),l.set(c.x,c.y,A.z),r.copy(A)}toLocalFrame(e,g){const n=MB,I=n[0],o=n[1],i=n[2],l=n[3],r=n[4],c=n[5],A=n[6],u=n[7];this.getCorners(I,o,i,l,r,c,A,u);for(let h=0;h!==8;h++){const b=n[h];e.pointToLocal(b,b)}return g.setFromPoints(n)}toWorldFrame(e,g){const n=MB,I=n[0],o=n[1],i=n[2],l=n[3],r=n[4],c=n[5],A=n[6],u=n[7];this.getCorners(I,o,i,l,r,c,A,u);for(let h=0;h!==8;h++){const b=n[h];e.pointToWorld(b,b)}return g.setFromPoints(n)}overlapsRay(e){const{direction:g,from:n}=e,I=1/g.x,o=1/g.y,i=1/g.z,l=(this.lowerBound.x-n.x)*I,r=(this.upperBound.x-n.x)*I,c=(this.lowerBound.y-n.y)*o,A=(this.upperBound.y-n.y)*o,u=(this.lowerBound.z-n.z)*i,h=(this.upperBound.z-n.z)*i,b=Math.max(Math.max(Math.min(l,r),Math.min(c,A)),Math.min(u,h)),p=Math.min(Math.min(Math.max(l,r),Math.max(c,A)),Math.max(u,h));return!(p<0||b>p)}}const JB=new V,MB=[new V,new V,new V,new V,new V,new V,new V,new V];class k9{addEventListener(e,g){this._listeners===void 0&&(this._listeners={});const n=this._listeners;return n[e]===void 0&&(n[e]=[]),n[e].includes(g)||n[e].push(g),this}hasEventListener(e,g){if(this._listeners===void 0)return!1;const n=this._listeners;return!!(n[e]!==void 0&&n[e].includes(g))}hasAnyEventListener(e){return this._listeners===void 0?!1:this._listeners[e]!==void 0}removeEventListener(e,g){if(this._listeners===void 0)return this;const n=this._listeners;if(n[e]===void 0)return this;const I=n[e].indexOf(g);return I!==-1&&n[e].splice(I,1),this}dispatchEvent(e){if(this._listeners===void 0)return this;const n=this._listeners[e.type];if(n!==void 0){e.target=this;for(let I=0,o=n.length;I<o;I++)n[I].call(this,e)}return this}}class Zt{constructor(e,g,n,I){e===void 0&&(e=0),g===void 0&&(g=0),n===void 0&&(n=0),I===void 0&&(I=1),this.x=e,this.y=g,this.z=n,this.w=I}set(e,g,n,I){return this.x=e,this.y=g,this.z=n,this.w=I,this}toString(){return`${this.x},${this.y},${this.z},${this.w}`}toArray(){return[this.x,this.y,this.z,this.w]}setFromAxisAngle(e,g){const n=Math.sin(g*.5);return this.x=e.x*n,this.y=e.y*n,this.z=e.z*n,this.w=Math.cos(g*.5),this}toAxisAngle(e){e===void 0&&(e=new V),this.normalize();const g=2*Math.acos(this.w),n=Math.sqrt(1-this.w*this.w);return n<.001?(e.x=this.x,e.y=this.y,e.z=this.z):(e.x=this.x/n,e.y=this.y/n,e.z=this.z/n),[e,g]}setFromVectors(e,g){if(e.isAntiparallelTo(g)){const n=z9,I=x9;e.tangents(n,I),this.setFromAxisAngle(n,Math.PI)}else{const n=e.cross(g);this.x=n.x,this.y=n.y,this.z=n.z,this.w=Math.sqrt(e.length()**2*g.length()**2)+e.dot(g),this.normalize()}return this}mult(e,g){g===void 0&&(g=new Zt);const n=this.x,I=this.y,o=this.z,i=this.w,l=e.x,r=e.y,c=e.z,A=e.w;return g.x=n*A+i*l+I*c-o*r,g.y=I*A+i*r+o*l-n*c,g.z=o*A+i*c+n*r-I*l,g.w=i*A-n*l-I*r-o*c,g}inverse(e){e===void 0&&(e=new Zt);const g=this.x,n=this.y,I=this.z,o=this.w;this.conjugate(e);const i=1/(g*g+n*n+I*I+o*o);return e.x*=i,e.y*=i,e.z*=i,e.w*=i,e}conjugate(e){return e===void 0&&(e=new Zt),e.x=-this.x,e.y=-this.y,e.z=-this.z,e.w=this.w,e}normalize(){let e=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);return e===0?(this.x=0,this.y=0,this.z=0,this.w=0):(e=1/e,this.x*=e,this.y*=e,this.z*=e,this.w*=e),this}normalizeFast(){const e=(3-(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w))/2;return e===0?(this.x=0,this.y=0,this.z=0,this.w=0):(this.x*=e,this.y*=e,this.z*=e,this.w*=e),this}vmult(e,g){g===void 0&&(g=new V);const n=e.x,I=e.y,o=e.z,i=this.x,l=this.y,r=this.z,c=this.w,A=c*n+l*o-r*I,u=c*I+r*n-i*o,h=c*o+i*I-l*n,b=-i*n-l*I-r*o;return g.x=A*c+b*-i+u*-r-h*-l,g.y=u*c+b*-l+h*-i-A*-r,g.z=h*c+b*-r+A*-l-u*-i,g}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w,this}toEuler(e,g){g===void 0&&(g="YZX");let n,I,o;const i=this.x,l=this.y,r=this.z,c=this.w;switch(g){case"YZX":const A=i*l+r*c;if(A>.499&&(n=2*Math.atan2(i,c),I=Math.PI/2,o=0),A<-.499&&(n=-2*Math.atan2(i,c),I=-Math.PI/2,o=0),n===void 0){const u=i*i,h=l*l,b=r*r;n=Math.atan2(2*l*c-2*i*r,1-2*h-2*b),I=Math.asin(2*A),o=Math.atan2(2*i*c-2*l*r,1-2*u-2*b)}break;default:throw new Error(`Euler order ${g} not supported yet.`)}e.y=n,e.z=I,e.x=o}setFromEuler(e,g,n,I){I===void 0&&(I="XYZ");const o=Math.cos(e/2),i=Math.cos(g/2),l=Math.cos(n/2),r=Math.sin(e/2),c=Math.sin(g/2),A=Math.sin(n/2);return I==="XYZ"?(this.x=r*i*l+o*c*A,this.y=o*c*l-r*i*A,this.z=o*i*A+r*c*l,this.w=o*i*l-r*c*A):I==="YXZ"?(this.x=r*i*l+o*c*A,this.y=o*c*l-r*i*A,this.z=o*i*A-r*c*l,this.w=o*i*l+r*c*A):I==="ZXY"?(this.x=r*i*l-o*c*A,this.y=o*c*l+r*i*A,this.z=o*i*A+r*c*l,this.w=o*i*l-r*c*A):I==="ZYX"?(this.x=r*i*l-o*c*A,this.y=o*c*l+r*i*A,this.z=o*i*A-r*c*l,this.w=o*i*l+r*c*A):I==="YZX"?(this.x=r*i*l+o*c*A,this.y=o*c*l+r*i*A,this.z=o*i*A-r*c*l,this.w=o*i*l-r*c*A):I==="XZY"&&(this.x=r*i*l-o*c*A,this.y=o*c*l-r*i*A,this.z=o*i*A+r*c*l,this.w=o*i*l+r*c*A),this}clone(){return new Zt(this.x,this.y,this.z,this.w)}slerp(e,g,n){n===void 0&&(n=new Zt);const I=this.x,o=this.y,i=this.z,l=this.w;let r=e.x,c=e.y,A=e.z,u=e.w,h,b,p,Z,v;return b=I*r+o*c+i*A+l*u,b<0&&(b=-b,r=-r,c=-c,A=-A,u=-u),1-b>1e-6?(h=Math.acos(b),p=Math.sin(h),Z=Math.sin((1-g)*h)/p,v=Math.sin(g*h)/p):(Z=1-g,v=g),n.x=Z*I+v*r,n.y=Z*o+v*c,n.z=Z*i+v*A,n.w=Z*l+v*u,n}integrate(e,g,n,I){I===void 0&&(I=new Zt);const o=e.x*n.x,i=e.y*n.y,l=e.z*n.z,r=this.x,c=this.y,A=this.z,u=this.w,h=g*.5;return I.x+=h*(o*u+i*A-l*c),I.y+=h*(i*u+l*r-o*A),I.z+=h*(l*u+o*c-i*r),I.w+=h*(-o*r-i*c-l*A),I}}const z9=new V,x9=new V,L9={SPHERE:1,PLANE:2,BOX:4,COMPOUND:8,CONVEXPOLYHEDRON:16,HEIGHTFIELD:32,PARTICLE:64,CYLINDER:128,TRIMESH:256};class ie{constructor(e){e===void 0&&(e={}),this.id=ie.idCounter++,this.type=e.type||0,this.boundingSphereRadius=0,this.collisionResponse=e.collisionResponse?e.collisionResponse:!0,this.collisionFilterGroup=e.collisionFilterGroup!==void 0?e.collisionFilterGroup:1,this.collisionFilterMask=e.collisionFilterMask!==void 0?e.collisionFilterMask:-1,this.material=e.material?e.material:null,this.body=null}updateBoundingSphereRadius(){throw`computeBoundingSphereRadius() not implemented for shape type ${this.type}`}volume(){throw`volume() not implemented for shape type ${this.type}`}calculateLocalInertia(e,g){throw`calculateLocalInertia() not implemented for shape type ${this.type}`}calculateWorldAABB(e,g,n,I){throw`calculateWorldAABB() not implemented for shape type ${this.type}`}}ie.idCounter=0;ie.types=L9;class xt{constructor(e){e===void 0&&(e={}),this.position=new V,this.quaternion=new Zt,e.position&&this.position.copy(e.position),e.quaternion&&this.quaternion.copy(e.quaternion)}pointToLocal(e,g){return xt.pointToLocalFrame(this.position,this.quaternion,e,g)}pointToWorld(e,g){return xt.pointToWorldFrame(this.position,this.quaternion,e,g)}vectorToWorldFrame(e,g){return g===void 0&&(g=new V),this.quaternion.vmult(e,g),g}static pointToLocalFrame(e,g,n,I){return I===void 0&&(I=new V),n.vsub(e,I),g.conjugate(EB),EB.vmult(I,I),I}static pointToWorldFrame(e,g,n,I){return I===void 0&&(I=new V),g.vmult(n,I),I.vadd(e,I),I}static vectorToWorldFrame(e,g,n){return n===void 0&&(n=new V),e.vmult(g,n),n}static vectorToLocalFrame(e,g,n,I){return I===void 0&&(I=new V),g.w*=-1,g.vmult(n,I),g.w*=-1,I}}const EB=new Zt;class BI extends ie{constructor(e){e===void 0&&(e={});const{vertices:g=[],faces:n=[],normals:I=[],axes:o,boundingSphereRadius:i}=e;super({type:ie.types.CONVEXPOLYHEDRON});this.vertices=g,this.faces=n,this.faceNormals=I,this.faceNormals.length===0&&this.computeNormals(),i?this.boundingSphereRadius=i:this.updateBoundingSphereRadius(),this.worldVertices=[],this.worldVerticesNeedsUpdate=!0,this.worldFaceNormals=[],this.worldFaceNormalsNeedsUpdate=!0,this.uniqueAxes=o?o.slice():null,this.uniqueEdges=[],this.computeEdges()}computeEdges(){const e=this.faces,g=this.vertices,n=this.uniqueEdges;n.length=0;const I=new V;for(let o=0;o!==e.length;o++){const i=e[o],l=i.length;for(let r=0;r!==l;r++){const c=(r+1)%l;g[i[r]].vsub(g[i[c]],I),I.normalize();let A=!1;for(let u=0;u!==n.length;u++)if(n[u].almostEquals(I)||n[u].almostEquals(I)){A=!0;break}A||n.push(I.clone())}}}computeNormals(){this.faceNormals.length=this.faces.length;for(let e=0;e<this.faces.length;e++){for(let I=0;I<this.faces[e].length;I++)if(!this.vertices[this.faces[e][I]])throw new Error(`Vertex ${this.faces[e][I]} not found!`);const g=this.faceNormals[e]||new V;this.getFaceNormal(e,g),g.negate(g),this.faceNormals[e]=g;const n=this.vertices[this.faces[e][0]];if(g.dot(n)<0){console.error(`.faceNormals[${e}] = Vec3(${g.toString()}) looks like it points into the shape? The vertices follow. Make sure they are ordered CCW around the normal, using the right hand rule.`);for(let I=0;I<this.faces[e].length;I++)console.warn(`.vertices[${this.faces[e][I]}] = Vec3(${this.vertices[this.faces[e][I]].toString()})`)}}}getFaceNormal(e,g){const n=this.faces[e],I=this.vertices[n[0]],o=this.vertices[n[1]],i=this.vertices[n[2]];BI.computeNormal(I,o,i,g)}static computeNormal(e,g,n,I){const o=new V,i=new V;g.vsub(e,i),n.vsub(g,o),o.cross(i,I),I.isZero()||I.normalize()}clipAgainstHull(e,g,n,I,o,i,l,r,c){const A=new V;let u=-1,h=-Number.MAX_VALUE;for(let p=0;p<n.faces.length;p++){A.copy(n.faceNormals[p]),o.vmult(A,A);const Z=A.dot(i);Z>h&&(h=Z,u=p)}const b=[];for(let p=0;p<n.faces[u].length;p++){const Z=n.vertices[n.faces[u][p]],v=new V;v.copy(Z),o.vmult(v,v),I.vadd(v,v),b.push(v)}u>=0&&this.clipFaceAgainstHull(i,e,g,b,l,r,c)}findSeparatingAxis(e,g,n,I,o,i,l,r){const c=new V,A=new V,u=new V,h=new V,b=new V,p=new V;let Z=Number.MAX_VALUE;const v=this;if(v.uniqueAxes)for(let y=0;y!==v.uniqueAxes.length;y++){n.vmult(v.uniqueAxes[y],c);const m=v.testSepAxis(c,e,g,n,I,o);if(m===!1)return!1;m<Z&&(Z=m,i.copy(c))}else{const y=l?l.length:v.faces.length;for(let m=0;m<y;m++){const B=l?l[m]:m;c.copy(v.faceNormals[B]),n.vmult(c,c);const w=v.testSepAxis(c,e,g,n,I,o);if(w===!1)return!1;w<Z&&(Z=w,i.copy(c))}}if(e.uniqueAxes)for(let y=0;y!==e.uniqueAxes.length;y++){o.vmult(e.uniqueAxes[y],A);const m=v.testSepAxis(A,e,g,n,I,o);if(m===!1)return!1;m<Z&&(Z=m,i.copy(A))}else{const y=r?r.length:e.faces.length;for(let m=0;m<y;m++){const B=r?r[m]:m;A.copy(e.faceNormals[B]),o.vmult(A,A);const w=v.testSepAxis(A,e,g,n,I,o);if(w===!1)return!1;w<Z&&(Z=w,i.copy(A))}}for(let y=0;y!==v.uniqueEdges.length;y++){n.vmult(v.uniqueEdges[y],h);for(let m=0;m!==e.uniqueEdges.length;m++)if(o.vmult(e.uniqueEdges[m],b),h.cross(b,p),!p.almostZero()){p.normalize();const B=v.testSepAxis(p,e,g,n,I,o);if(B===!1)return!1;B<Z&&(Z=B,i.copy(p))}}return I.vsub(g,u),u.dot(i)>0&&i.negate(i),!0}testSepAxis(e,g,n,I,o,i){const l=this;BI.project(l,e,n,I,ku),BI.project(g,e,o,i,zu);const r=ku[0],c=ku[1],A=zu[0],u=zu[1];if(r<u||A<c)return!1;const h=r-u,b=A-c;return h<b?h:b}calculateLocalInertia(e,g){const n=new V,I=new V;this.computeLocalAABB(I,n);const o=n.x-I.x,i=n.y-I.y,l=n.z-I.z;g.x=1/12*e*(2*i*2*i+2*l*2*l),g.y=1/12*e*(2*o*2*o+2*l*2*l),g.z=1/12*e*(2*i*2*i+2*o*2*o)}getPlaneConstantOfFace(e){const g=this.faces[e],n=this.faceNormals[e],I=this.vertices[g[0]];return-n.dot(I)}clipFaceAgainstHull(e,g,n,I,o,i,l){const r=new V,c=new V,A=new V,u=new V,h=new V,b=new V,p=new V,Z=new V,v=this,y=[],m=I,B=y;let w=-1,X=Number.MAX_VALUE;for(let N=0;N<v.faces.length;N++){r.copy(v.faceNormals[N]),n.vmult(r,r);const z=r.dot(e);z<X&&(X=z,w=N)}if(w<0)return;const R=v.faces[w];R.connectedFaces=[];for(let N=0;N<v.faces.length;N++)for(let z=0;z<v.faces[N].length;z++)R.indexOf(v.faces[N][z])!==-1&&N!==w&&R.connectedFaces.indexOf(N)===-1&&R.connectedFaces.push(N);const S=R.length;for(let N=0;N<S;N++){const z=v.vertices[R[N]],M=v.vertices[R[(N+1)%S]];z.vsub(M,c),A.copy(c),n.vmult(A,A),g.vadd(A,A),u.copy(this.faceNormals[w]),n.vmult(u,u),g.vadd(u,u),A.cross(u,h),h.negate(h),b.copy(z),n.vmult(b,b),g.vadd(b,b);const j=R.connectedFaces[N];p.copy(this.faceNormals[j]);const F=this.getPlaneConstantOfFace(j);Z.copy(p),n.vmult(Z,Z);const L=F-Z.dot(g);for(this.clipFaceAgainstPlane(m,B,Z,L);m.length;)m.shift();for(;B.length;)m.push(B.shift())}p.copy(this.faceNormals[w]);const Y=this.getPlaneConstantOfFace(w);Z.copy(p),n.vmult(Z,Z);const k=Y-Z.dot(g);for(let N=0;N<m.length;N++){let z=Z.dot(m[N])+k;if(z<=o&&(console.log(`clamped: depth=${z} to minDist=${o}`),z=o),z<=i){const M=m[N];if(z<=1e-6){const j={point:M,normal:Z,depth:z};l.push(j)}}}}clipFaceAgainstPlane(e,g,n,I){let o,i;const l=e.length;if(l<2)return g;let r=e[e.length-1],c=e[0];o=n.dot(r)+I;for(let A=0;A<l;A++){if(c=e[A],i=n.dot(c)+I,o<0)if(i<0){const u=new V;u.copy(c),g.push(u)}else{const u=new V;r.lerp(c,o/(o-i),u),g.push(u)}else if(i<0){const u=new V;r.lerp(c,o/(o-i),u),g.push(u),g.push(c)}r=c,o=i}return g}computeWorldVertices(e,g){for(;this.worldVertices.length<this.vertices.length;)this.worldVertices.push(new V);const n=this.vertices,I=this.worldVertices;for(let o=0;o!==this.vertices.length;o++)g.vmult(n[o],I[o]),e.vadd(I[o],I[o]);this.worldVerticesNeedsUpdate=!1}computeLocalAABB(e,g){const n=this.vertices;e.set(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE),g.set(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE);for(let I=0;I<this.vertices.length;I++){const o=n[I];o.x<e.x?e.x=o.x:o.x>g.x&&(g.x=o.x),o.y<e.y?e.y=o.y:o.y>g.y&&(g.y=o.y),o.z<e.z?e.z=o.z:o.z>g.z&&(g.z=o.z)}}computeWorldFaceNormals(e){const g=this.faceNormals.length;for(;this.worldFaceNormals.length<g;)this.worldFaceNormals.push(new V);const n=this.faceNormals,I=this.worldFaceNormals;for(let o=0;o!==g;o++)e.vmult(n[o],I[o]);this.worldFaceNormalsNeedsUpdate=!1}updateBoundingSphereRadius(){let e=0;const g=this.vertices;for(let n=0;n!==g.length;n++){const I=g[n].lengthSquared();I>e&&(e=I)}this.boundingSphereRadius=Math.sqrt(e)}calculateWorldAABB(e,g,n,I){const o=this.vertices;let i,l,r,c,A,u,h=new V;for(let b=0;b<o.length;b++){h.copy(o[b]),g.vmult(h,h),e.vadd(h,h);const p=h;(i===void 0||p.x<i)&&(i=p.x),(c===void 0||p.x>c)&&(c=p.x),(l===void 0||p.y<l)&&(l=p.y),(A===void 0||p.y>A)&&(A=p.y),(r===void 0||p.z<r)&&(r=p.z),(u===void 0||p.z>u)&&(u=p.z)}n.set(i,l,r),I.set(c,A,u)}volume(){return 4*Math.PI*this.boundingSphereRadius/3}getAveragePointLocal(e){e===void 0&&(e=new V);const g=this.vertices;for(let n=0;n<g.length;n++)e.vadd(g[n],e);return e.scale(1/g.length,e),e}transformAllPoints(e,g){const n=this.vertices.length,I=this.vertices;if(g){for(let o=0;o<n;o++){const i=I[o];g.vmult(i,i)}for(let o=0;o<this.faceNormals.length;o++){const i=this.faceNormals[o];g.vmult(i,i)}}if(e)for(let o=0;o<n;o++){const i=I[o];i.vadd(e,i)}}pointIsInside(e){const g=this.vertices,n=this.faces,I=this.faceNormals,o=new V;this.getAveragePointLocal(o);for(let i=0;i<this.faces.length;i++){let l=I[i];const r=g[n[i][0]],c=new V;e.vsub(r,c);const A=l.dot(c),u=new V;o.vsub(r,u);const h=l.dot(u);if(A<0&&h>0||A>0&&h<0)return!1}return-1}static project(e,g,n,I,o){const i=e.vertices.length,l=J9;let r=0,c=0;const A=M9,u=e.vertices;A.setZero(),xt.vectorToLocalFrame(n,I,g,l),xt.pointToLocalFrame(n,I,A,A);const h=A.dot(l);c=r=u[0].dot(l);for(let b=1;b<i;b++){const p=u[b].dot(l);p>r&&(r=p),p<c&&(c=p)}if(c-=h,r-=h,c>r){const b=c;c=r,r=b}o[0]=r,o[1]=c}}const ku=[],zu=[];new V;const J9=new V,M9=new V;class RA extends ie{constructor(e){super({type:ie.types.BOX});this.halfExtents=e,this.convexPolyhedronRepresentation=null,this.updateConvexPolyhedronRepresentation(),this.updateBoundingSphereRadius()}updateConvexPolyhedronRepresentation(){const e=this.halfExtents.x,g=this.halfExtents.y,n=this.halfExtents.z,I=V,o=[new I(-e,-g,-n),new I(e,-g,-n),new I(e,g,-n),new I(-e,g,-n),new I(-e,-g,n),new I(e,-g,n),new I(e,g,n),new I(-e,g,n)],i=[[3,2,1,0],[4,5,6,7],[5,4,0,1],[2,3,7,6],[0,4,7,3],[1,2,6,5]],l=[new I(0,0,1),new I(0,1,0),new I(1,0,0)],r=new BI({vertices:o,faces:i,axes:l});this.convexPolyhedronRepresentation=r,r.material=this.material}calculateLocalInertia(e,g){return g===void 0&&(g=new V),RA.calculateInertia(this.halfExtents,e,g),g}static calculateInertia(e,g,n){const I=e;n.x=1/12*g*(2*I.y*2*I.y+2*I.z*2*I.z),n.y=1/12*g*(2*I.x*2*I.x+2*I.z*2*I.z),n.z=1/12*g*(2*I.y*2*I.y+2*I.x*2*I.x)}getSideNormals(e,g){const n=e,I=this.halfExtents;if(n[0].set(I.x,0,0),n[1].set(0,I.y,0),n[2].set(0,0,I.z),n[3].set(-I.x,0,0),n[4].set(0,-I.y,0),n[5].set(0,0,-I.z),g!==void 0)for(let o=0;o!==n.length;o++)g.vmult(n[o],n[o]);return n}volume(){return 8*this.halfExtents.x*this.halfExtents.y*this.halfExtents.z}updateBoundingSphereRadius(){this.boundingSphereRadius=this.halfExtents.length()}forEachWorldCorner(e,g,n){const I=this.halfExtents,o=[[I.x,I.y,I.z],[-I.x,I.y,I.z],[-I.x,-I.y,I.z],[-I.x,-I.y,-I.z],[I.x,-I.y,-I.z],[I.x,I.y,-I.z],[-I.x,I.y,-I.z],[I.x,-I.y,I.z]];for(let i=0;i<o.length;i++)TI.set(o[i][0],o[i][1],o[i][2]),g.vmult(TI,TI),e.vadd(TI,TI),n(TI.x,TI.y,TI.z)}calculateWorldAABB(e,g,n,I){const o=this.halfExtents;Fn[0].set(o.x,o.y,o.z),Fn[1].set(-o.x,o.y,o.z),Fn[2].set(-o.x,-o.y,o.z),Fn[3].set(-o.x,-o.y,-o.z),Fn[4].set(o.x,-o.y,-o.z),Fn[5].set(o.x,o.y,-o.z),Fn[6].set(-o.x,o.y,-o.z),Fn[7].set(o.x,-o.y,o.z);const i=Fn[0];g.vmult(i,i),e.vadd(i,i),I.copy(i),n.copy(i);for(let l=1;l<8;l++){const r=Fn[l];g.vmult(r,r),e.vadd(r,r);const c=r.x,A=r.y,u=r.z;c>I.x&&(I.x=c),A>I.y&&(I.y=A),u>I.z&&(I.z=u),c<n.x&&(n.x=c),A<n.y&&(n.y=A),u<n.z&&(n.z=u)}}}const TI=new V,Fn=[new V,new V,new V,new V,new V,new V,new V,new V],zb={DYNAMIC:1,STATIC:2,KINEMATIC:4},xb={AWAKE:0,SLEEPY:1,SLEEPING:2};class Ve extends k9{constructor(e){e===void 0&&(e={});super();this.id=Ve.idCounter++,this.index=-1,this.world=null,this.vlambda=new V,this.collisionFilterGroup=typeof e.collisionFilterGroup=="number"?e.collisionFilterGroup:1,this.collisionFilterMask=typeof e.collisionFilterMask=="number"?e.collisionFilterMask:-1,this.collisionResponse=typeof e.collisionResponse=="boolean"?e.collisionResponse:!0,this.position=new V,this.previousPosition=new V,this.interpolatedPosition=new V,this.initPosition=new V,e.position&&(this.position.copy(e.position),this.previousPosition.copy(e.position),this.interpolatedPosition.copy(e.position),this.initPosition.copy(e.position)),this.velocity=new V,e.velocity&&this.velocity.copy(e.velocity),this.initVelocity=new V,this.force=new V;const g=typeof e.mass=="number"?e.mass:0;this.mass=g,this.invMass=g>0?1/g:0,this.material=e.material||null,this.linearDamping=typeof e.linearDamping=="number"?e.linearDamping:.01,this.type=g<=0?Ve.STATIC:Ve.DYNAMIC,typeof e.type==typeof Ve.STATIC&&(this.type=e.type),this.allowSleep=typeof e.allowSleep!="undefined"?e.allowSleep:!0,this.sleepState=Ve.AWAKE,this.sleepSpeedLimit=typeof e.sleepSpeedLimit!="undefined"?e.sleepSpeedLimit:.1,this.sleepTimeLimit=typeof e.sleepTimeLimit!="undefined"?e.sleepTimeLimit:1,this.timeLastSleepy=0,this.wakeUpAfterNarrowphase=!1,this.torque=new V,this.quaternion=new Zt,this.initQuaternion=new Zt,this.previousQuaternion=new Zt,this.interpolatedQuaternion=new Zt,e.quaternion&&(this.quaternion.copy(e.quaternion),this.initQuaternion.copy(e.quaternion),this.previousQuaternion.copy(e.quaternion),this.interpolatedQuaternion.copy(e.quaternion)),this.angularVelocity=new V,e.angularVelocity&&this.angularVelocity.copy(e.angularVelocity),this.initAngularVelocity=new V,this.shapes=[],this.shapeOffsets=[],this.shapeOrientations=[],this.inertia=new V,this.invInertia=new V,this.invInertiaWorld=new yn,this.invMassSolve=0,this.invInertiaSolve=new V,this.invInertiaWorldSolve=new yn,this.fixedRotation=typeof e.fixedRotation!="undefined"?e.fixedRotation:!1,this.angularDamping=typeof e.angularDamping!="undefined"?e.angularDamping:.01,this.linearFactor=new V(1,1,1),e.linearFactor&&this.linearFactor.copy(e.linearFactor),this.angularFactor=new V(1,1,1),e.angularFactor&&this.angularFactor.copy(e.angularFactor),this.aabb=new gt,this.aabbNeedsUpdate=!0,this.boundingRadius=0,this.wlambda=new V,this.isTrigger=Boolean(e.isTrigger),e.shape&&this.addShape(e.shape),this.updateMassProperties()}wakeUp(){const e=this.sleepState;this.sleepState=Ve.AWAKE,this.wakeUpAfterNarrowphase=!1,e===Ve.SLEEPING&&this.dispatchEvent(Ve.wakeupEvent)}sleep(){this.sleepState=Ve.SLEEPING,this.velocity.set(0,0,0),this.angularVelocity.set(0,0,0),this.wakeUpAfterNarrowphase=!1}sleepTick(e){if(this.allowSleep){const g=this.sleepState,n=this.velocity.lengthSquared()+this.angularVelocity.lengthSquared(),I=this.sleepSpeedLimit**2;g===Ve.AWAKE&&n<I?(this.sleepState=Ve.SLEEPY,this.timeLastSleepy=e,this.dispatchEvent(Ve.sleepyEvent)):g===Ve.SLEEPY&&n>I?this.wakeUp():g===Ve.SLEEPY&&e-this.timeLastSleepy>this.sleepTimeLimit&&(this.sleep(),this.dispatchEvent(Ve.sleepEvent))}}updateSolveMassProperties(){this.sleepState===Ve.SLEEPING||this.type===Ve.KINEMATIC?(this.invMassSolve=0,this.invInertiaSolve.setZero(),this.invInertiaWorldSolve.setZero()):(this.invMassSolve=this.invMass,this.invInertiaSolve.copy(this.invInertia),this.invInertiaWorldSolve.copy(this.invInertiaWorld))}pointToLocalFrame(e,g){return g===void 0&&(g=new V),e.vsub(this.position,g),this.quaternion.conjugate().vmult(g,g),g}vectorToLocalFrame(e,g){return g===void 0&&(g=new V),this.quaternion.conjugate().vmult(e,g),g}pointToWorldFrame(e,g){return g===void 0&&(g=new V),this.quaternion.vmult(e,g),g.vadd(this.position,g),g}vectorToWorldFrame(e,g){return g===void 0&&(g=new V),this.quaternion.vmult(e,g),g}addShape(e,g,n){const I=new V,o=new Zt;return g&&I.copy(g),n&&o.copy(n),this.shapes.push(e),this.shapeOffsets.push(I),this.shapeOrientations.push(o),this.updateMassProperties(),this.updateBoundingRadius(),this.aabbNeedsUpdate=!0,e.body=this,this}removeShape(e){const g=this.shapes.indexOf(e);return g===-1?(console.warn("Shape does not belong to the body"),this):(this.shapes.splice(g,1),this.shapeOffsets.splice(g,1),this.shapeOrientations.splice(g,1),this.updateMassProperties(),this.updateBoundingRadius(),this.aabbNeedsUpdate=!0,e.body=null,this)}updateBoundingRadius(){const e=this.shapes,g=this.shapeOffsets,n=e.length;let I=0;for(let o=0;o!==n;o++){const i=e[o];i.updateBoundingSphereRadius();const l=g[o].length(),r=i.boundingSphereRadius;l+r>I&&(I=l+r)}this.boundingRadius=I}updateAABB(){const e=this.shapes,g=this.shapeOffsets,n=this.shapeOrientations,I=e.length,o=E9,i=Q9,l=this.quaternion,r=this.aabb,c=T9;for(let A=0;A!==I;A++){const u=e[A];l.vmult(g[A],o),o.vadd(this.position,o),l.mult(n[A],i),u.calculateWorldAABB(o,i,c.lowerBound,c.upperBound),A===0?r.copy(c):r.extend(c)}this.aabbNeedsUpdate=!1}updateInertiaWorld(e){const g=this.invInertia;if(!(g.x===g.y&&g.y===g.z&&!e)){const n=U9,I=D9;n.setRotationFromQuaternion(this.quaternion),n.transpose(I),n.scale(g,n),n.mmult(I,this.invInertiaWorld)}}applyForce(e,g){if(g===void 0&&(g=new V),this.type!==Ve.DYNAMIC)return;this.sleepState===Ve.SLEEPING&&this.wakeUp();const n=j9;g.cross(e,n),this.force.vadd(e,this.force),this.torque.vadd(n,this.torque)}applyLocalForce(e,g){if(g===void 0&&(g=new V),this.type!==Ve.DYNAMIC)return;const n=O9,I=P9;this.vectorToWorldFrame(e,n),this.vectorToWorldFrame(g,I),this.applyForce(n,I)}applyTorque(e){this.type===Ve.DYNAMIC&&(this.sleepState===Ve.SLEEPING&&this.wakeUp(),this.torque.vadd(e,this.torque))}applyImpulse(e,g){if(g===void 0&&(g=new V),this.type!==Ve.DYNAMIC)return;this.sleepState===Ve.SLEEPING&&this.wakeUp();const n=g,I=_9;I.copy(e),I.scale(this.invMass,I),this.velocity.vadd(I,this.velocity);const o=q9;n.cross(e,o),this.invInertiaWorld.vmult(o,o),this.angularVelocity.vadd(o,this.angularVelocity)}applyLocalImpulse(e,g){if(g===void 0&&(g=new V),this.type!==Ve.DYNAMIC)return;const n=$9,I=eS;this.vectorToWorldFrame(e,n),this.vectorToWorldFrame(g,I),this.applyImpulse(n,I)}updateMassProperties(){const e=tS;this.invMass=this.mass>0?1/this.mass:0;const g=this.inertia,n=this.fixedRotation;this.updateAABB(),e.set((this.aabb.upperBound.x-this.aabb.lowerBound.x)/2,(this.aabb.upperBound.y-this.aabb.lowerBound.y)/2,(this.aabb.upperBound.z-this.aabb.lowerBound.z)/2),RA.calculateInertia(e,this.mass,g),this.invInertia.set(g.x>0&&!n?1/g.x:0,g.y>0&&!n?1/g.y:0,g.z>0&&!n?1/g.z:0),this.updateInertiaWorld(!0)}getVelocityAtWorldPoint(e,g){const n=new V;return e.vsub(this.position,n),this.angularVelocity.cross(n,g),this.velocity.vadd(g,g),g}integrate(e,g,n){if(this.previousPosition.copy(this.position),this.previousQuaternion.copy(this.quaternion),!(this.type===Ve.DYNAMIC||this.type===Ve.KINEMATIC)||this.sleepState===Ve.SLEEPING)return;const I=this.velocity,o=this.angularVelocity,i=this.position,l=this.force,r=this.torque,c=this.quaternion,A=this.invMass,u=this.invInertiaWorld,h=this.linearFactor,b=A*e;I.x+=l.x*b*h.x,I.y+=l.y*b*h.y,I.z+=l.z*b*h.z;const p=u.elements,Z=this.angularFactor,v=r.x*Z.x,y=r.y*Z.y,m=r.z*Z.z;o.x+=e*(p[0]*v+p[1]*y+p[2]*m),o.y+=e*(p[3]*v+p[4]*y+p[5]*m),o.z+=e*(p[6]*v+p[7]*y+p[8]*m),i.x+=I.x*e,i.y+=I.y*e,i.z+=I.z*e,c.integrate(this.angularVelocity,e,this.angularFactor,c),g&&(n?c.normalizeFast():c.normalize()),this.aabbNeedsUpdate=!0,this.updateInertiaWorld()}}Ve.idCounter=0;Ve.COLLIDE_EVENT_NAME="collide";Ve.DYNAMIC=zb.DYNAMIC;Ve.STATIC=zb.STATIC;Ve.KINEMATIC=zb.KINEMATIC;Ve.AWAKE=xb.AWAKE;Ve.SLEEPY=xb.SLEEPY;Ve.SLEEPING=xb.SLEEPING;Ve.wakeupEvent={type:"wakeup"};Ve.sleepyEvent={type:"sleepy"};Ve.sleepEvent={type:"sleep"};const E9=new V,Q9=new Zt,T9=new gt,U9=new yn,D9=new yn;new yn;const j9=new V,O9=new V,P9=new V,_9=new V,q9=new V,$9=new V,eS=new V,tS=new V;new V;new V;new Zt;new V;new V;new V;new V;class Ch{constructor(){this.rayFromWorld=new V,this.rayToWorld=new V,this.hitNormalWorld=new V,this.hitPointWorld=new V,this.hasHit=!1,this.shape=null,this.body=null,this.hitFaceIndex=-1,this.distance=-1,this.shouldStop=!1}reset(){this.rayFromWorld.setZero(),this.rayToWorld.setZero(),this.hitNormalWorld.setZero(),this.hitPointWorld.setZero(),this.hasHit=!1,this.shape=null,this.body=null,this.hitFaceIndex=-1,this.distance=-1,this.shouldStop=!1}abort(){this.shouldStop=!0}set(e,g,n,I,o,i,l){this.rayFromWorld.copy(e),this.rayToWorld.copy(g),this.hitNormalWorld.copy(n),this.hitPointWorld.copy(I),this.shape=o,this.body=i,this.distance=l}}let vv,Wv,wv,Vv,Rv,Xv,Yv;const Lb={CLOSEST:1,ANY:2,ALL:4};vv=ie.types.SPHERE;Wv=ie.types.PLANE;wv=ie.types.BOX;Vv=ie.types.CYLINDER;Rv=ie.types.CONVEXPOLYHEDRON;Xv=ie.types.HEIGHTFIELD;Yv=ie.types.TRIMESH;class _t{get[vv](){return this._intersectSphere}get[Wv](){return this._intersectPlane}get[wv](){return this._intersectBox}get[Vv](){return this._intersectConvex}get[Rv](){return this._intersectConvex}get[Xv](){return this._intersectHeightfield}get[Yv](){return this._intersectTrimesh}constructor(e,g){e===void 0&&(e=new V),g===void 0&&(g=new V),this.from=e.clone(),this.to=g.clone(),this.direction=new V,this.precision=1e-4,this.checkCollisionResponse=!0,this.skipBackfaces=!1,this.collisionFilterMask=-1,this.collisionFilterGroup=-1,this.mode=_t.ANY,this.result=new Ch,this.hasHit=!1,this.callback=n=>{}}intersectWorld(e,g){return this.mode=g.mode||_t.ANY,this.result=g.result||new Ch,this.skipBackfaces=!!g.skipBackfaces,this.collisionFilterMask=typeof g.collisionFilterMask!="undefined"?g.collisionFilterMask:-1,this.collisionFilterGroup=typeof g.collisionFilterGroup!="undefined"?g.collisionFilterGroup:-1,this.checkCollisionResponse=typeof g.checkCollisionResponse!="undefined"?g.checkCollisionResponse:!0,g.from&&this.from.copy(g.from),g.to&&this.to.copy(g.to),this.callback=g.callback||(()=>{}),this.hasHit=!1,this.result.reset(),this.updateDirection(),this.getAABB(QB),xu.length=0,e.broadphase.aabbQuery(e,QB,xu),this.intersectBodies(xu),this.hasHit}intersectBody(e,g){g&&(this.result=g,this.updateDirection());const n=this.checkCollisionResponse;if(n&&!e.collisionResponse||(this.collisionFilterGroup&e.collisionFilterMask)===0||(e.collisionFilterGroup&this.collisionFilterMask)===0)return;const I=gS,o=nS;for(let i=0,l=e.shapes.length;i<l;i++){const r=e.shapes[i];if(!(n&&!r.collisionResponse)&&(e.quaternion.mult(e.shapeOrientations[i],o),e.quaternion.vmult(e.shapeOffsets[i],I),I.vadd(e.position,I),this.intersectShape(r,o,I,e),this.result.shouldStop))break}}intersectBodies(e,g){g&&(this.result=g,this.updateDirection());for(let n=0,I=e.length;!this.result.shouldStop&&n<I;n++)this.intersectBody(e[n])}updateDirection(){this.to.vsub(this.from,this.direction),this.direction.normalize()}intersectShape(e,g,n,I){const o=this.from;if(bS(o,this.direction,n)>e.boundingSphereRadius)return;const l=this[e.type];l&&l.call(this,e,g,n,I,e)}_intersectBox(e,g,n,I,o){return this._intersectConvex(e.convexPolyhedronRepresentation,g,n,I,o)}_intersectPlane(e,g,n,I,o){const i=this.from,l=this.to,r=this.direction,c=new V(0,0,1);g.vmult(c,c);const A=new V;i.vsub(n,A);const u=A.dot(c);l.vsub(n,A);const h=A.dot(c);if(u*h>0||i.distanceTo(l)<u)return;const b=c.dot(r);if(Math.abs(b)<this.precision)return;const p=new V,Z=new V,v=new V;i.vsub(n,p);const y=-c.dot(p)/b;r.scale(y,Z),i.vadd(Z,v),this.reportIntersection(c,v,o,I,-1)}getAABB(e){const{lowerBound:g,upperBound:n}=e,I=this.to,o=this.from;g.x=Math.min(I.x,o.x),g.y=Math.min(I.y,o.y),g.z=Math.min(I.z,o.z),n.x=Math.max(I.x,o.x),n.y=Math.max(I.y,o.y),n.z=Math.max(I.z,o.z)}_intersectHeightfield(e,g,n,I,o){e.data,e.elementSize;const i=IS;i.from.copy(this.from),i.to.copy(this.to),xt.pointToLocalFrame(n,g,i.from,i.from),xt.pointToLocalFrame(n,g,i.to,i.to),i.updateDirection();const l=oS;let r,c,A,u;r=c=0,A=u=e.data.length-1;const h=new gt;i.getAABB(h),e.getIndexOfPosition(h.lowerBound.x,h.lowerBound.y,l,!0),r=Math.max(r,l[0]),c=Math.max(c,l[1]),e.getIndexOfPosition(h.upperBound.x,h.upperBound.y,l,!0),A=Math.min(A,l[0]+1),u=Math.min(u,l[1]+1);for(let b=r;b<A;b++)for(let p=c;p<u;p++){if(this.result.shouldStop)return;if(e.getAabbAtIndex(b,p,h),!!h.overlapsRay(i)){if(e.getConvexTrianglePillar(b,p,!1),xt.pointToWorldFrame(n,g,e.pillarOffset,Ur),this._intersectConvex(e.pillarConvex,g,Ur,I,o,TB),this.result.shouldStop)return;e.getConvexTrianglePillar(b,p,!0),xt.pointToWorldFrame(n,g,e.pillarOffset,Ur),this._intersectConvex(e.pillarConvex,g,Ur,I,o,TB)}}}_intersectSphere(e,g,n,I,o){const i=this.from,l=this.to,r=e.radius,c=(l.x-i.x)**2+(l.y-i.y)**2+(l.z-i.z)**2,A=2*((l.x-i.x)*(i.x-n.x)+(l.y-i.y)*(i.y-n.y)+(l.z-i.z)*(i.z-n.z)),u=(i.x-n.x)**2+(i.y-n.y)**2+(i.z-n.z)**2-r**2,h=A**2-4*c*u,b=iS,p=CS;if(!(h<0))if(h===0)i.lerp(l,h,b),b.vsub(n,p),p.normalize(),this.reportIntersection(p,b,o,I,-1);else{const Z=(-A-Math.sqrt(h))/(2*c),v=(-A+Math.sqrt(h))/(2*c);if(Z>=0&&Z<=1&&(i.lerp(l,Z,b),b.vsub(n,p),p.normalize(),this.reportIntersection(p,b,o,I,-1)),this.result.shouldStop)return;v>=0&&v<=1&&(i.lerp(l,v,b),b.vsub(n,p),p.normalize(),this.reportIntersection(p,b,o,I,-1))}}_intersectConvex(e,g,n,I,o,i){const l=lS,r=UB,c=i&&i.faceList||null,A=e.faces,u=e.vertices,h=e.faceNormals,b=this.direction,p=this.from,Z=this.to,v=p.distanceTo(Z),y=c?c.length:A.length,m=this.result;for(let B=0;!m.shouldStop&&B<y;B++){const w=c?c[B]:B,X=A[w],R=h[w],S=g,Y=n;r.copy(u[X[0]]),S.vmult(r,r),r.vadd(Y,r),r.vsub(p,r),S.vmult(R,l);const k=b.dot(l);if(Math.abs(k)<this.precision)continue;const N=l.dot(r)/k;if(!(N<0)){b.scale(N,mg),mg.vadd(p,mg),Gn.copy(u[X[0]]),S.vmult(Gn,Gn),Y.vadd(Gn,Gn);for(let z=1;!m.shouldStop&&z<X.length-1;z++){kn.copy(u[X[z]]),zn.copy(u[X[z+1]]),S.vmult(kn,kn),S.vmult(zn,zn),Y.vadd(kn,kn),Y.vadd(zn,zn);const M=mg.distanceTo(p);!(_t.pointInTriangle(mg,Gn,kn,zn)||_t.pointInTriangle(mg,kn,Gn,zn))||M>v||this.reportIntersection(l,mg,o,I,w)}}}}_intersectTrimesh(e,g,n,I,o,i){const l=sS,r=dS,c=hS,A=UB,u=rS,h=cS,b=AS,p=uS,Z=aS,v=e.indices;e.vertices;const y=this.from,m=this.to,B=this.direction;c.position.copy(n),c.quaternion.copy(g),xt.vectorToLocalFrame(n,g,B,u),xt.pointToLocalFrame(n,g,y,h),xt.pointToLocalFrame(n,g,m,b),b.x*=e.scale.x,b.y*=e.scale.y,b.z*=e.scale.z,h.x*=e.scale.x,h.y*=e.scale.y,h.z*=e.scale.z,b.vsub(h,u),u.normalize();const w=h.distanceSquared(b);e.tree.rayQuery(this,c,r);for(let X=0,R=r.length;!this.result.shouldStop&&X!==R;X++){const S=r[X];e.getNormal(S,l),e.getVertex(v[S*3],Gn),Gn.vsub(h,A);const Y=u.dot(l),k=l.dot(A)/Y;if(k<0)continue;u.scale(k,mg),mg.vadd(h,mg),e.getVertex(v[S*3+1],kn),e.getVertex(v[S*3+2],zn);const N=mg.distanceSquared(h);!(_t.pointInTriangle(mg,kn,Gn,zn)||_t.pointInTriangle(mg,Gn,kn,zn))||N>w||(xt.vectorToWorldFrame(g,l,Z),xt.pointToWorldFrame(n,g,mg,p),this.reportIntersection(Z,p,o,I,S))}r.length=0}reportIntersection(e,g,n,I,o){const i=this.from,l=this.to,r=i.distanceTo(g),c=this.result;if(!(this.skipBackfaces&&e.dot(this.direction)>0))switch(c.hitFaceIndex=typeof o!="undefined"?o:-1,this.mode){case _t.ALL:this.hasHit=!0,c.set(i,l,e,g,n,I,r),c.hasHit=!0,this.callback(c);break;case _t.CLOSEST:(r<c.distance||!c.hasHit)&&(this.hasHit=!0,c.hasHit=!0,c.set(i,l,e,g,n,I,r));break;case _t.ANY:this.hasHit=!0,c.hasHit=!0,c.set(i,l,e,g,n,I,r),c.shouldStop=!0;break}}static pointInTriangle(e,g,n,I){I.vsub(g,Fo),n.vsub(g,il),e.vsub(g,Lu);const o=Fo.dot(Fo),i=Fo.dot(il),l=Fo.dot(Lu),r=il.dot(il),c=il.dot(Lu);let A,u;return(A=r*l-i*c)>=0&&(u=o*c-i*l)>=0&&A+u<o*r-i*i}}_t.CLOSEST=Lb.CLOSEST;_t.ANY=Lb.ANY;_t.ALL=Lb.ALL;const QB=new gt,xu=[],il=new V,Lu=new V,gS=new V,nS=new Zt,mg=new V,Gn=new V,kn=new V,zn=new V;new V;new Ch;const TB={faceList:[0]},Ur=new V,IS=new _t,oS=[],iS=new V,CS=new V,lS=new V;new V;new V;const UB=new V,sS=new V,rS=new V,cS=new V,AS=new V,aS=new V,uS=new V;new gt;const dS=[],hS=new xt,Fo=new V,Dr=new V;function bS(t,e,g){g.vsub(t,Fo);const n=Fo.dot(e);return e.scale(n,Dr),Dr.vadd(t,Dr),g.distanceTo(Dr)}class GS{static defaults(e,g){e===void 0&&(e={});for(let n in g)n in e||(e[n]=g[n]);return e}}new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;class XA{constructor(e){e===void 0&&(e={});let g="";typeof e=="string"&&(g=e,e={}),this.name=g,this.id=XA.idCounter++,this.friction=typeof e.friction!="undefined"?e.friction:-1,this.restitution=typeof e.restitution!="undefined"?e.restitution:-1}}XA.idCounter=0;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new _t;new V;new V;new V;new V(1,0,0),new V(0,1,0),new V(0,0,1);new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;class mS extends ie{constructor(e){super({type:ie.types.SPHERE});if(this.radius=e!==void 0?e:1,this.radius<0)throw new Error("The sphere radius cannot be negative.");this.updateBoundingSphereRadius()}calculateLocalInertia(e,g){g===void 0&&(g=new V);const n=2*e*this.radius*this.radius/5;return g.x=n,g.y=n,g.z=n,g}volume(){return 4*Math.PI*Math.pow(this.radius,3)/3}updateBoundingSphereRadius(){this.boundingSphereRadius=this.radius}calculateWorldAABB(e,g,n,I){const o=this.radius,i=["x","y","z"];for(let l=0;l<i.length;l++){const r=i[l];n[r]=e[r]-o,I[r]=e[r]+o}}}new V;new V;new V;new V;new V;new V;new V;new V;new V;class pS extends BI{constructor(e,g,n,I){if(e===void 0&&(e=1),g===void 0&&(g=1),n===void 0&&(n=1),I===void 0&&(I=8),e<0)throw new Error("The cylinder radiusTop cannot be negative.");if(g<0)throw new Error("The cylinder radiusBottom cannot be negative.");const o=I,i=[],l=[],r=[],c=[],A=[],u=Math.cos,h=Math.sin;i.push(new V(-g*h(0),-n*.5,g*u(0))),c.push(0),i.push(new V(-e*h(0),n*.5,e*u(0))),A.push(1);for(let p=0;p<o;p++){const Z=2*Math.PI/o*(p+1),v=2*Math.PI/o*(p+.5);p<o-1?(i.push(new V(-g*h(Z),-n*.5,g*u(Z))),c.push(2*p+2),i.push(new V(-e*h(Z),n*.5,e*u(Z))),A.push(2*p+3),r.push([2*p,2*p+1,2*p+3,2*p+2])):r.push([2*p,2*p+1,1,0]),(o%2===1||p<o/2)&&l.push(new V(-h(v),0,u(v)))}r.push(c),l.push(new V(0,1,0));const b=[];for(let p=0;p<A.length;p++)b.push(A[A.length-p-1]);r.push(b);super({vertices:i,faces:r,axes:l});this.type=ie.types.CYLINDER,this.radiusTop=e,this.radiusBottom=g,this.height=n,this.numSegments=I}}class BS extends ie{constructor(){super({type:ie.types.PARTICLE})}calculateLocalInertia(e,g){return g===void 0&&(g=new V),g.set(0,0,0),g}volume(){return 0}updateBoundingSphereRadius(){this.boundingSphereRadius=0}calculateWorldAABB(e,g,n,I){n.copy(e),I.copy(e)}}class ZS extends ie{constructor(){super({type:ie.types.PLANE});this.worldNormal=new V,this.worldNormalNeedsUpdate=!0,this.boundingSphereRadius=Number.MAX_VALUE}computeWorldNormal(e){const g=this.worldNormal;g.set(0,0,1),e.vmult(g,g),this.worldNormalNeedsUpdate=!1}calculateLocalInertia(e,g){return g===void 0&&(g=new V),g}volume(){return Number.MAX_VALUE}calculateWorldAABB(e,g,n,I){rI.set(0,0,1),g.vmult(rI,rI);const o=Number.MAX_VALUE;n.set(-o,-o,-o),I.set(o,o,o),rI.x===1?I.x=e.x:rI.x===-1&&(n.x=e.x),rI.y===1?I.y=e.y:rI.y===-1&&(n.y=e.y),rI.z===1?I.z=e.z:rI.z===-1&&(n.z=e.z)}updateBoundingSphereRadius(){this.boundingSphereRadius=Number.MAX_VALUE}}const rI=new V;class yS extends ie{constructor(e,g){g===void 0&&(g={}),g=GS.defaults(g,{maxValue:null,minValue:null,elementSize:1});super({type:ie.types.HEIGHTFIELD});this.data=e,this.maxValue=g.maxValue,this.minValue=g.minValue,this.elementSize=g.elementSize,g.minValue===null&&this.updateMinValue(),g.maxValue===null&&this.updateMaxValue(),this.cacheEnabled=!0,this.pillarConvex=new BI,this.pillarOffset=new V,this.updateBoundingSphereRadius(),this._cachedPillars={}}update(){this._cachedPillars={}}updateMinValue(){const e=this.data;let g=e[0][0];for(let n=0;n!==e.length;n++)for(let I=0;I!==e[n].length;I++){const o=e[n][I];o<g&&(g=o)}this.minValue=g}updateMaxValue(){const e=this.data;let g=e[0][0];for(let n=0;n!==e.length;n++)for(let I=0;I!==e[n].length;I++){const o=e[n][I];o>g&&(g=o)}this.maxValue=g}setHeightValueAtIndex(e,g,n){const I=this.data;I[e][g]=n,this.clearCachedConvexTrianglePillar(e,g,!1),e>0&&(this.clearCachedConvexTrianglePillar(e-1,g,!0),this.clearCachedConvexTrianglePillar(e-1,g,!1)),g>0&&(this.clearCachedConvexTrianglePillar(e,g-1,!0),this.clearCachedConvexTrianglePillar(e,g-1,!1)),g>0&&e>0&&this.clearCachedConvexTrianglePillar(e-1,g-1,!0)}getRectMinMax(e,g,n,I,o){o===void 0&&(o=[]);const i=this.data;let l=this.minValue;for(let r=e;r<=n;r++)for(let c=g;c<=I;c++){const A=i[r][c];A>l&&(l=A)}o[0]=this.minValue,o[1]=l}getIndexOfPosition(e,g,n,I){const o=this.elementSize,i=this.data;let l=Math.floor(e/o),r=Math.floor(g/o);return n[0]=l,n[1]=r,I&&(l<0&&(l=0),r<0&&(r=0),l>=i.length-1&&(l=i.length-1),r>=i[0].length-1&&(r=i[0].length-1)),!(l<0||r<0||l>=i.length-1||r>=i[0].length-1)}getTriangleAt(e,g,n,I,o,i){const l=DB;this.getIndexOfPosition(e,g,l,n);let r=l[0],c=l[1];const A=this.data;n&&(r=Math.min(A.length-2,Math.max(0,r)),c=Math.min(A[0].length-2,Math.max(0,c)));const u=this.elementSize,h=(e/u-r)**2+(g/u-c)**2,b=(e/u-(r+1))**2+(g/u-(c+1))**2,p=h>b;return this.getTriangle(r,c,p,I,o,i),p}getNormalAt(e,g,n,I){const o=wS,i=VS,l=RS,r=XS,c=YS;this.getTriangleAt(e,g,n,o,i,l),i.vsub(o,r),l.vsub(o,c),r.cross(c,I),I.normalize()}getAabbAtIndex(e,g,n){let{lowerBound:I,upperBound:o}=n;const i=this.data,l=this.elementSize;I.set(e*l,g*l,i[e][g]),o.set((e+1)*l,(g+1)*l,i[e+1][g+1])}getHeightAt(e,g,n){const I=this.data,o=fS,i=vS,l=WS,r=DB;this.getIndexOfPosition(e,g,r,n);let c=r[0],A=r[1];n&&(c=Math.min(I.length-2,Math.max(0,c)),A=Math.min(I[0].length-2,Math.max(0,A)));const u=this.getTriangleAt(e,g,n,o,i,l);KS(e,g,o.x,o.y,i.x,i.y,l.x,l.y,jB);const h=jB;return u?I[c+1][A+1]*h.x+I[c][A+1]*h.y+I[c+1][A]*h.z:I[c][A]*h.x+I[c+1][A]*h.y+I[c][A+1]*h.z}getCacheConvexTrianglePillarKey(e,g,n){return`${e}_${g}_${n?1:0}`}getCachedConvexTrianglePillar(e,g,n){return this._cachedPillars[this.getCacheConvexTrianglePillarKey(e,g,n)]}setCachedConvexTrianglePillar(e,g,n,I,o){this._cachedPillars[this.getCacheConvexTrianglePillarKey(e,g,n)]={convex:I,offset:o}}clearCachedConvexTrianglePillar(e,g,n){delete this._cachedPillars[this.getCacheConvexTrianglePillarKey(e,g,n)]}getTriangle(e,g,n,I,o,i){const l=this.data,r=this.elementSize;n?(I.set((e+1)*r,(g+1)*r,l[e+1][g+1]),o.set(e*r,(g+1)*r,l[e][g+1]),i.set((e+1)*r,g*r,l[e+1][g])):(I.set(e*r,g*r,l[e][g]),o.set((e+1)*r,g*r,l[e+1][g]),i.set(e*r,(g+1)*r,l[e][g+1]))}getConvexTrianglePillar(e,g,n){let I=this.pillarConvex,o=this.pillarOffset;if(this.cacheEnabled){const u=this.getCachedConvexTrianglePillar(e,g,n);if(u){this.pillarConvex=u.convex,this.pillarOffset=u.offset;return}I=new BI,o=new V,this.pillarConvex=I,this.pillarOffset=o}const i=this.data,l=this.elementSize,r=I.faces;I.vertices.length=6;for(let u=0;u<6;u++)I.vertices[u]||(I.vertices[u]=new V);r.length=5;for(let u=0;u<5;u++)r[u]||(r[u]=[]);const c=I.vertices,A=(Math.min(i[e][g],i[e+1][g],i[e][g+1],i[e+1][g+1])-this.minValue)/2+this.minValue;n?(o.set((e+.75)*l,(g+.75)*l,A),c[0].set(.25*l,.25*l,i[e+1][g+1]-A),c[1].set(-.75*l,.25*l,i[e][g+1]-A),c[2].set(.25*l,-.75*l,i[e+1][g]-A),c[3].set(.25*l,.25*l,-Math.abs(A)-1),c[4].set(-.75*l,.25*l,-Math.abs(A)-1),c[5].set(.25*l,-.75*l,-Math.abs(A)-1),r[0][0]=0,r[0][1]=1,r[0][2]=2,r[1][0]=5,r[1][1]=4,r[1][2]=3,r[2][0]=2,r[2][1]=5,r[2][2]=3,r[2][3]=0,r[3][0]=3,r[3][1]=4,r[3][2]=1,r[3][3]=0,r[4][0]=1,r[4][1]=4,r[4][2]=5,r[4][3]=2):(o.set((e+.25)*l,(g+.25)*l,A),c[0].set(-.25*l,-.25*l,i[e][g]-A),c[1].set(.75*l,-.25*l,i[e+1][g]-A),c[2].set(-.25*l,.75*l,i[e][g+1]-A),c[3].set(-.25*l,-.25*l,-Math.abs(A)-1),c[4].set(.75*l,-.25*l,-Math.abs(A)-1),c[5].set(-.25*l,.75*l,-Math.abs(A)-1),r[0][0]=0,r[0][1]=1,r[0][2]=2,r[1][0]=5,r[1][1]=4,r[1][2]=3,r[2][0]=0,r[2][1]=2,r[2][2]=5,r[2][3]=3,r[3][0]=1,r[3][1]=0,r[3][2]=3,r[3][3]=4,r[4][0]=4,r[4][1]=5,r[4][2]=2,r[4][3]=1),I.computeNormals(),I.computeEdges(),I.updateBoundingSphereRadius(),this.setCachedConvexTrianglePillar(e,g,n,I,o)}calculateLocalInertia(e,g){return g===void 0&&(g=new V),g.set(0,0,0),g}volume(){return Number.MAX_VALUE}calculateWorldAABB(e,g,n,I){n.set(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE),I.set(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE)}updateBoundingSphereRadius(){const e=this.data,g=this.elementSize;this.boundingSphereRadius=new V(e.length*g,e[0].length*g,Math.max(Math.abs(this.maxValue),Math.abs(this.minValue))).length()}setHeightsFromImage(e,g){const{x:n,z:I,y:o}=g,i=document.createElement("canvas");i.width=e.width,i.height=e.height;const l=i.getContext("2d");l.drawImage(e,0,0);const r=l.getImageData(0,0,e.width,e.height),c=this.data;c.length=0,this.elementSize=Math.abs(n)/r.width;for(let A=0;A<r.height;A++){const u=[];for(let h=0;h<r.width;h++){const b=r.data[(A*r.height+h)*4],p=r.data[(A*r.height+h)*4+1],Z=r.data[(A*r.height+h)*4+2],v=(b+p+Z)/4/255*I;n<0?u.push(v):u.unshift(v)}o<0?c.unshift(u):c.push(u)}this.updateMaxValue(),this.updateMinValue(),this.update()}}const DB=[],jB=new V,fS=new V,vS=new V,WS=new V,wS=new V,VS=new V,RS=new V,XS=new V,YS=new V;function KS(t,e,g,n,I,o,i,l,r){r.x=((o-l)*(t-i)+(i-I)*(e-l))/((o-l)*(g-i)+(i-I)*(n-l)),r.y=((l-n)*(t-i)+(g-i)*(e-l))/((o-l)*(g-i)+(i-I)*(n-l)),r.z=1-r.x-r.y}class Qn{constructor(e){e===void 0&&(e={}),this.root=e.root||null,this.aabb=e.aabb?e.aabb.clone():new gt,this.data=[],this.children=[]}reset(){this.children.length=this.data.length=0}insert(e,g,n){n===void 0&&(n=0);const I=this.data;if(!this.aabb.contains(e))return!1;const o=this.children,i=this.maxDepth||this.root.maxDepth;if(n<i){let l=!1;o.length||(this.subdivide(),l=!0);for(let r=0;r!==8;r++)if(o[r].insert(e,g,n+1))return!0;l&&(o.length=0)}return I.push(g),!0}subdivide(){const e=this.aabb,g=e.lowerBound,n=e.upperBound,I=this.children;I.push(new Qn({aabb:new gt({lowerBound:new V(0,0,0)})}),new Qn({aabb:new gt({lowerBound:new V(1,0,0)})}),new Qn({aabb:new gt({lowerBound:new V(1,1,0)})}),new Qn({aabb:new gt({lowerBound:new V(1,1,1)})}),new Qn({aabb:new gt({lowerBound:new V(0,1,1)})}),new Qn({aabb:new gt({lowerBound:new V(0,0,1)})}),new Qn({aabb:new gt({lowerBound:new V(1,0,1)})}),new Qn({aabb:new gt({lowerBound:new V(0,1,0)})})),n.vsub(g,Ro),Ro.scale(.5,Ro);const o=this.root||this;for(let i=0;i!==8;i++){const l=I[i];l.root=o;const r=l.aabb.lowerBound;r.x*=Ro.x,r.y*=Ro.y,r.z*=Ro.z,r.vadd(g,r),r.vadd(Ro,l.aabb.upperBound)}}aabbQuery(e,g){this.data,this.children;const n=[this];for(;n.length;){const I=n.pop();I.aabb.overlaps(e)&&Array.prototype.push.apply(g,I.data),Array.prototype.push.apply(n,I.children)}return g}rayQuery(e,g,n){return e.getAABB(jr),jr.toLocalFrame(g,jr),this.aabbQuery(jr,n),n}removeEmptyNodes(){for(let e=this.children.length-1;e>=0;e--)this.children[e].removeEmptyNodes(),!this.children[e].children.length&&!this.children[e].data.length&&this.children.splice(e,1)}}class SS extends Qn{constructor(e,g){g===void 0&&(g={});super({root:null,aabb:e});this.maxDepth=typeof g.maxDepth!="undefined"?g.maxDepth:8}}const Ro=new V,jr=new gt;class _c extends ie{constructor(e,g){super({type:ie.types.TRIMESH});this.vertices=new Float32Array(e),this.indices=new Int16Array(g),this.normals=new Float32Array(g.length),this.aabb=new gt,this.edges=null,this.scale=new V(1,1,1),this.tree=new SS,this.updateEdges(),this.updateNormals(),this.updateAABB(),this.updateBoundingSphereRadius(),this.updateTree()}updateTree(){const e=this.tree;e.reset(),e.aabb.copy(this.aabb);const g=this.scale;e.aabb.lowerBound.x*=1/g.x,e.aabb.lowerBound.y*=1/g.y,e.aabb.lowerBound.z*=1/g.z,e.aabb.upperBound.x*=1/g.x,e.aabb.upperBound.y*=1/g.y,e.aabb.upperBound.z*=1/g.z;const n=new gt,I=new V,o=new V,i=new V,l=[I,o,i];for(let r=0;r<this.indices.length/3;r++){const c=r*3;this._getUnscaledVertex(this.indices[c],I),this._getUnscaledVertex(this.indices[c+1],o),this._getUnscaledVertex(this.indices[c+2],i),n.setFromPoints(l),e.insert(n,r)}e.removeEmptyNodes()}getTrianglesInAABB(e,g){Or.copy(e);const n=this.scale,I=n.x,o=n.y,i=n.z,l=Or.lowerBound,r=Or.upperBound;return l.x/=I,l.y/=o,l.z/=i,r.x/=I,r.y/=o,r.z/=i,this.tree.aabbQuery(Or,g)}setScale(e){const g=this.scale.x===this.scale.y&&this.scale.y===this.scale.z,n=e.x===e.y&&e.y===e.z;g&&n||this.updateNormals(),this.scale.copy(e),this.updateAABB(),this.updateBoundingSphereRadius()}updateNormals(){const e=HS,g=this.normals;for(let n=0;n<this.indices.length/3;n++){const I=n*3,o=this.indices[I],i=this.indices[I+1],l=this.indices[I+2];this.getVertex(o,_B),this.getVertex(i,qB),this.getVertex(l,$B),_c.computeNormal(qB,_B,$B,e),g[I]=e.x,g[I+1]=e.y,g[I+2]=e.z}}updateEdges(){const e={},g=(I,o)=>{const i=I<o?`${I}_${o}`:`${o}_${I}`;e[i]=!0};for(let I=0;I<this.indices.length/3;I++){const o=I*3,i=this.indices[o],l=this.indices[o+1],r=this.indices[o+2];g(i,l),g(l,r),g(r,i)}const n=Object.keys(e);this.edges=new Int16Array(n.length*2);for(let I=0;I<n.length;I++){const o=n[I].split("_");this.edges[2*I]=parseInt(o[0],10),this.edges[2*I+1]=parseInt(o[1],10)}}getEdgeVertex(e,g,n){const I=this.edges[e*2+(g?1:0)];this.getVertex(I,n)}getEdgeVector(e,g){const n=NS,I=FS;this.getEdgeVertex(e,0,n),this.getEdgeVertex(e,1,I),I.vsub(n,g)}static computeNormal(e,g,n,I){g.vsub(e,PB),n.vsub(g,OB),OB.cross(PB,I),I.isZero()||I.normalize()}getVertex(e,g){const n=this.scale;return this._getUnscaledVertex(e,g),g.x*=n.x,g.y*=n.y,g.z*=n.z,g}_getUnscaledVertex(e,g){const n=e*3,I=this.vertices;return g.set(I[n],I[n+1],I[n+2])}getWorldVertex(e,g,n,I){return this.getVertex(e,I),xt.pointToWorldFrame(g,n,I,I),I}getTriangleVertices(e,g,n,I){const o=e*3;this.getVertex(this.indices[o],g),this.getVertex(this.indices[o+1],n),this.getVertex(this.indices[o+2],I)}getNormal(e,g){const n=e*3;return g.set(this.normals[n],this.normals[n+1],this.normals[n+2])}calculateLocalInertia(e,g){this.computeLocalAABB(Xo);const n=Xo.upperBound.x-Xo.lowerBound.x,I=Xo.upperBound.y-Xo.lowerBound.y,o=Xo.upperBound.z-Xo.lowerBound.z;return g.set(1/12*e*(2*I*2*I+2*o*2*o),1/12*e*(2*n*2*n+2*o*2*o),1/12*e*(2*I*2*I+2*n*2*n))}computeLocalAABB(e){const g=e.lowerBound,n=e.upperBound,I=this.vertices.length;this.vertices;const o=kS;this.getVertex(0,o),g.copy(o),n.copy(o);for(let i=0;i!==I;i++)this.getVertex(i,o),o.x<g.x?g.x=o.x:o.x>n.x&&(n.x=o.x),o.y<g.y?g.y=o.y:o.y>n.y&&(n.y=o.y),o.z<g.z?g.z=o.z:o.z>n.z&&(n.z=o.z)}updateAABB(){this.computeLocalAABB(this.aabb)}updateBoundingSphereRadius(){let e=0;const g=this.vertices,n=new V;for(let I=0,o=g.length/3;I!==o;I++){this.getVertex(I,n);const i=n.lengthSquared();i>e&&(e=i)}this.boundingSphereRadius=Math.sqrt(e)}calculateWorldAABB(e,g,n,I){const o=zS,i=xS;o.position=e,o.quaternion=g,this.aabb.toWorldFrame(o,i),n.copy(i.lowerBound),I.copy(i.upperBound)}volume(){return 4*Math.PI*this.boundingSphereRadius/3}static createTorus(e,g,n,I,o){e===void 0&&(e=1),g===void 0&&(g=.5),n===void 0&&(n=8),I===void 0&&(I=6),o===void 0&&(o=Math.PI*2);const i=[],l=[];for(let r=0;r<=n;r++)for(let c=0;c<=I;c++){const A=c/I*o,u=r/n*Math.PI*2,h=(e+g*Math.cos(u))*Math.cos(A),b=(e+g*Math.cos(u))*Math.sin(A),p=g*Math.sin(u);i.push(h,b,p)}for(let r=1;r<=n;r++)for(let c=1;c<=I;c++){const A=(I+1)*r+c-1,u=(I+1)*(r-1)+c-1,h=(I+1)*(r-1)+c,b=(I+1)*r+c;l.push(A,u,b),l.push(u,h,b)}return new _c(i,l)}}const HS=new V,Or=new gt,NS=new V,FS=new V,OB=new V,PB=new V,_B=new V,qB=new V,$B=new V,Xo=new gt,kS=new V,zS=new xt,xS=new gt;ie.types.SPHERE,ie.types.SPHERE|ie.types.PLANE,ie.types.BOX|ie.types.BOX,ie.types.SPHERE|ie.types.BOX,ie.types.PLANE|ie.types.BOX,ie.types.CONVEXPOLYHEDRON,ie.types.SPHERE|ie.types.CONVEXPOLYHEDRON,ie.types.PLANE|ie.types.CONVEXPOLYHEDRON,ie.types.BOX|ie.types.CONVEXPOLYHEDRON,ie.types.SPHERE|ie.types.HEIGHTFIELD,ie.types.BOX|ie.types.HEIGHTFIELD,ie.types.CONVEXPOLYHEDRON|ie.types.HEIGHTFIELD,ie.types.PARTICLE|ie.types.SPHERE,ie.types.PLANE|ie.types.PARTICLE,ie.types.BOX|ie.types.PARTICLE,ie.types.PARTICLE|ie.types.CONVEXPOLYHEDRON,ie.types.CYLINDER,ie.types.SPHERE|ie.types.CYLINDER,ie.types.PLANE|ie.types.CYLINDER,ie.types.BOX|ie.types.CYLINDER,ie.types.CONVEXPOLYHEDRON|ie.types.CYLINDER,ie.types.HEIGHTFIELD|ie.types.CYLINDER,ie.types.PARTICLE|ie.types.CYLINDER,ie.types.SPHERE|ie.types.TRIMESH,ie.types.PLANE|ie.types.TRIMESH;new V;new V;new V;new V;new V;new Zt;new Zt;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new gt;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V,new V,new V,new V,new V,new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new V;new Zt;new V;new V;new V;new V;new V;new V;new V;new V;new V;new gt;new _t;const Cl=globalThis.performance||{};if(!Cl.now){let t=Date.now();Cl.timing&&Cl.timing.navigationStart&&(t=Cl.timing.navigationStart),Cl.now=()=>Date.now()-t}new V;const Ju=t=>{let[e,g,n]=t;return new V(e,g,n)},LS=t=>Array.isArray(t)?t:[t],JS=t=>{let[e,g,n,I,o]=t;return[{axes:I?I.map(Ju):void 0,boundingSphereRadius:o,faces:g,normals:n?n.map(Ju):void 0,vertices:e?e.map(Ju):void 0}]};function e0(t,e){switch(t){case"Box":return new RA(new V(...e.map(g=>g/2)));case"ConvexPolyhedron":return new BI(...JS(e));case"Cylinder":return new pS(...e);case"Heightfield":return new yS(...e);case"Particle":return new BS;case"Plane":return new ZS;case"Sphere":return new mS(...LS(e));case"Trimesh":return new _c(...e)}}const MS=t=>{const{uuid:e,props:g,type:n,createMaterial:I=X=>new XA(X)}=t,w=g,{angularFactor:o=[1,1,1],angularVelocity:i=[0,0,0],args:l=[],collisionResponse:r,linearFactor:c=[1,1,1],mass:A,material:u,onCollide:h,position:b=[0,0,0],rotation:p=[0,0,0],shapes:Z,type:v,velocity:y=[0,0,0]}=w,m=ye(w,["angularFactor","angularVelocity","args","collisionResponse","linearFactor","mass","material","onCollide","position","rotation","shapes","type","velocity"]),B=new Ve(Ze(_({},m),{mass:v==="Static"?0:A,material:u?I(u):void 0,type:v?Ve[v.toUpperCase()]:void 0}));return B.uuid=e,r!==void 0&&(B.collisionResponse=r),n==="Compound"?Z.forEach(X=>{let j=X,{type:R,args:S,position:Y,rotation:k,material:N}=j,z=ye(j,["type","args","position","rotation","material"]);const M=B.addShape(e0(R,S),Y?new V(...Y):void 0,k?new Zt().setFromEuler(...k):void 0);N&&(M.material=I(N)),Object.assign(M,z)}):B.addShape(e0(n,l)),B.position.set(b[0],b[1],b[2]),B.quaternion.setFromEuler(p[0],p[1],p[2]),B.velocity.set(y[0],y[1],y[2]),B.angularVelocity.set(i[0],i[1],i[2]),B.linearFactor.set(c[0],c[1],c[2]),B.angularFactor.set(o[0],o[1],o[2]),B};class mI{constructor(e){e===void 0&&(e=[0,0,0,0,0,0,0,0,0]),this.elements=e}identity(){const e=this.elements;e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1}setZero(){const e=this.elements;e[0]=0,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=0,e[6]=0,e[7]=0,e[8]=0}setTrace(e){const g=this.elements;g[0]=e.x,g[4]=e.y,g[8]=e.z}getTrace(e){e===void 0&&(e=new K);const g=this.elements;return e.x=g[0],e.y=g[4],e.z=g[8],e}vmult(e,g){g===void 0&&(g=new K);const n=this.elements,I=e.x,o=e.y,i=e.z;return g.x=n[0]*I+n[1]*o+n[2]*i,g.y=n[3]*I+n[4]*o+n[5]*i,g.z=n[6]*I+n[7]*o+n[8]*i,g}smult(e){for(let g=0;g<this.elements.length;g++)this.elements[g]*=e}mmult(e,g){g===void 0&&(g=new mI);const n=this.elements,I=e.elements,o=g.elements,i=n[0],l=n[1],r=n[2],c=n[3],A=n[4],u=n[5],h=n[6],b=n[7],p=n[8],Z=I[0],v=I[1],y=I[2],m=I[3],B=I[4],w=I[5],X=I[6],R=I[7],S=I[8];return o[0]=i*Z+l*m+r*X,o[1]=i*v+l*B+r*R,o[2]=i*y+l*w+r*S,o[3]=c*Z+A*m+u*X,o[4]=c*v+A*B+u*R,o[5]=c*y+A*w+u*S,o[6]=h*Z+b*m+p*X,o[7]=h*v+b*B+p*R,o[8]=h*y+b*w+p*S,g}scale(e,g){g===void 0&&(g=new mI);const n=this.elements,I=g.elements;for(let o=0;o!==3;o++)I[3*o+0]=e.x*n[3*o+0],I[3*o+1]=e.y*n[3*o+1],I[3*o+2]=e.z*n[3*o+2];return g}solve(e,g){g===void 0&&(g=new K);const n=3,I=4,o=[];let i,l;for(i=0;i<n*I;i++)o.push(0);for(i=0;i<3;i++)for(l=0;l<3;l++)o[i+I*l]=this.elements[i+3*l];o[3+4*0]=e.x,o[3+4*1]=e.y,o[3+4*2]=e.z;let r=3;const c=r;let A;const u=4;let h;do{if(i=c-r,o[i+I*i]===0){for(l=i+1;l<c;l++)if(o[i+I*l]!==0){A=u;do h=u-A,o[h+I*i]+=o[h+I*l];while(--A);break}}if(o[i+I*i]!==0)for(l=i+1;l<c;l++){const b=o[i+I*l]/o[i+I*i];A=u;do h=u-A,o[h+I*l]=h<=i?0:o[h+I*l]-o[h+I*i]*b;while(--A)}}while(--r);if(g.z=o[2*I+3]/o[2*I+2],g.y=(o[1*I+3]-o[1*I+2]*g.z)/o[1*I+1],g.x=(o[0*I+3]-o[0*I+2]*g.z-o[0*I+1]*g.y)/o[0*I+0],isNaN(g.x)||isNaN(g.y)||isNaN(g.z)||g.x===1/0||g.y===1/0||g.z===1/0)throw`Could not solve equation! Got x=[${g.toString()}], b=[${e.toString()}], A=[${this.toString()}]`;return g}e(e,g,n){if(n===void 0)return this.elements[g+3*e];this.elements[g+3*e]=n}copy(e){for(let g=0;g<e.elements.length;g++)this.elements[g]=e.elements[g];return this}toString(){let e="";const g=",";for(let n=0;n<9;n++)e+=this.elements[n]+g;return e}reverse(e){e===void 0&&(e=new mI);const g=3,n=6,I=ES;let o,i;for(o=0;o<3;o++)for(i=0;i<3;i++)I[o+n*i]=this.elements[o+3*i];I[3+6*0]=1,I[3+6*1]=0,I[3+6*2]=0,I[4+6*0]=0,I[4+6*1]=1,I[4+6*2]=0,I[5+6*0]=0,I[5+6*1]=0,I[5+6*2]=1;let l=3;const r=l;let c;const A=n;let u;do{if(o=r-l,I[o+n*o]===0){for(i=o+1;i<r;i++)if(I[o+n*i]!==0){c=A;do u=A-c,I[u+n*o]+=I[u+n*i];while(--c);break}}if(I[o+n*o]!==0)for(i=o+1;i<r;i++){const h=I[o+n*i]/I[o+n*o];c=A;do u=A-c,I[u+n*i]=u<=o?0:I[u+n*i]-I[u+n*o]*h;while(--c)}}while(--l);o=2;do{i=o-1;do{const h=I[o+n*i]/I[o+n*o];c=n;do u=n-c,I[u+n*i]=I[u+n*i]-I[u+n*o]*h;while(--c)}while(i--)}while(--o);o=2;do{const h=1/I[o+n*o];c=n;do u=n-c,I[u+n*o]=I[u+n*o]*h;while(--c)}while(o--);o=2;do{i=2;do{if(u=I[g+i+n*o],isNaN(u)||u===1/0)throw`Could not reverse! A=[${this.toString()}]`;e.e(o,i,u)}while(i--)}while(o--);return e}setRotationFromQuaternion(e){const g=e.x,n=e.y,I=e.z,o=e.w,i=g+g,l=n+n,r=I+I,c=g*i,A=g*l,u=g*r,h=n*l,b=n*r,p=I*r,Z=o*i,v=o*l,y=o*r,m=this.elements;return m[3*0+0]=1-(h+p),m[3*0+1]=A-y,m[3*0+2]=u+v,m[3*1+0]=A+y,m[3*1+1]=1-(c+p),m[3*1+2]=b-Z,m[3*2+0]=u-v,m[3*2+1]=b+Z,m[3*2+2]=1-(c+h),this}transpose(e){e===void 0&&(e=new mI);const g=this.elements,n=e.elements;let I;return n[0]=g[0],n[4]=g[4],n[8]=g[8],I=g[1],n[1]=g[3],n[3]=I,I=g[2],n[2]=g[6],n[6]=I,I=g[5],n[5]=g[7],n[7]=I,e}}const ES=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];class K{constructor(e,g,n){e===void 0&&(e=0),g===void 0&&(g=0),n===void 0&&(n=0),this.x=e,this.y=g,this.z=n}cross(e,g){g===void 0&&(g=new K);const n=e.x,I=e.y,o=e.z,i=this.x,l=this.y,r=this.z;return g.x=l*o-r*I,g.y=r*n-i*o,g.z=i*I-l*n,g}set(e,g,n){return this.x=e,this.y=g,this.z=n,this}setZero(){this.x=this.y=this.z=0}vadd(e,g){if(g)g.x=e.x+this.x,g.y=e.y+this.y,g.z=e.z+this.z;else return new K(this.x+e.x,this.y+e.y,this.z+e.z)}vsub(e,g){if(g)g.x=this.x-e.x,g.y=this.y-e.y,g.z=this.z-e.z;else return new K(this.x-e.x,this.y-e.y,this.z-e.z)}crossmat(){return new mI([0,-this.z,this.y,this.z,0,-this.x,-this.y,this.x,0])}normalize(){const e=this.x,g=this.y,n=this.z,I=Math.sqrt(e*e+g*g+n*n);if(I>0){const o=1/I;this.x*=o,this.y*=o,this.z*=o}else this.x=0,this.y=0,this.z=0;return I}unit(e){e===void 0&&(e=new K);const g=this.x,n=this.y,I=this.z;let o=Math.sqrt(g*g+n*n+I*I);return o>0?(o=1/o,e.x=g*o,e.y=n*o,e.z=I*o):(e.x=1,e.y=0,e.z=0),e}length(){const e=this.x,g=this.y,n=this.z;return Math.sqrt(e*e+g*g+n*n)}lengthSquared(){return this.dot(this)}distanceTo(e){const g=this.x,n=this.y,I=this.z,o=e.x,i=e.y,l=e.z;return Math.sqrt((o-g)*(o-g)+(i-n)*(i-n)+(l-I)*(l-I))}distanceSquared(e){const g=this.x,n=this.y,I=this.z,o=e.x,i=e.y,l=e.z;return(o-g)*(o-g)+(i-n)*(i-n)+(l-I)*(l-I)}scale(e,g){g===void 0&&(g=new K);const n=this.x,I=this.y,o=this.z;return g.x=e*n,g.y=e*I,g.z=e*o,g}vmul(e,g){return g===void 0&&(g=new K),g.x=e.x*this.x,g.y=e.y*this.y,g.z=e.z*this.z,g}addScaledVector(e,g,n){return n===void 0&&(n=new K),n.x=this.x+e*g.x,n.y=this.y+e*g.y,n.z=this.z+e*g.z,n}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}isZero(){return this.x===0&&this.y===0&&this.z===0}negate(e){return e===void 0&&(e=new K),e.x=-this.x,e.y=-this.y,e.z=-this.z,e}tangents(e,g){const n=this.length();if(n>0){const I=QS,o=1/n;I.set(this.x*o,this.y*o,this.z*o);const i=TS;Math.abs(I.x)<.9?(i.set(1,0,0),I.cross(i,e)):(i.set(0,1,0),I.cross(i,e)),I.cross(e,g)}else e.set(1,0,0),g.set(0,1,0)}toString(){return`${this.x},${this.y},${this.z}`}toArray(){return[this.x,this.y,this.z]}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}lerp(e,g,n){const I=this.x,o=this.y,i=this.z;n.x=I+(e.x-I)*g,n.y=o+(e.y-o)*g,n.z=i+(e.z-i)*g}almostEquals(e,g){return g===void 0&&(g=1e-6),!(Math.abs(this.x-e.x)>g||Math.abs(this.y-e.y)>g||Math.abs(this.z-e.z)>g)}almostZero(e){return e===void 0&&(e=1e-6),!(Math.abs(this.x)>e||Math.abs(this.y)>e||Math.abs(this.z)>e)}isAntiparallelTo(e,g){return this.negate(t0),t0.almostEquals(e,g)}clone(){return new K(this.x,this.y,this.z)}}K.ZERO=new K(0,0,0);K.UNIT_X=new K(1,0,0);K.UNIT_Y=new K(0,1,0);K.UNIT_Z=new K(0,0,1);const QS=new K,TS=new K,t0=new K;class sn{constructor(e){e===void 0&&(e={}),this.lowerBound=new K,this.upperBound=new K,e.lowerBound&&this.lowerBound.copy(e.lowerBound),e.upperBound&&this.upperBound.copy(e.upperBound)}setFromPoints(e,g,n,I){const o=this.lowerBound,i=this.upperBound,l=n;o.copy(e[0]),l&&l.vmult(o,o),i.copy(o);for(let r=1;r<e.length;r++){let c=e[r];l&&(l.vmult(c,g0),c=g0),c.x>i.x&&(i.x=c.x),c.x<o.x&&(o.x=c.x),c.y>i.y&&(i.y=c.y),c.y<o.y&&(o.y=c.y),c.z>i.z&&(i.z=c.z),c.z<o.z&&(o.z=c.z)}return g&&(g.vadd(o,o),g.vadd(i,i)),I&&(o.x-=I,o.y-=I,o.z-=I,i.x+=I,i.y+=I,i.z+=I),this}copy(e){return this.lowerBound.copy(e.lowerBound),this.upperBound.copy(e.upperBound),this}clone(){return new sn().copy(this)}extend(e){this.lowerBound.x=Math.min(this.lowerBound.x,e.lowerBound.x),this.upperBound.x=Math.max(this.upperBound.x,e.upperBound.x),this.lowerBound.y=Math.min(this.lowerBound.y,e.lowerBound.y),this.upperBound.y=Math.max(this.upperBound.y,e.upperBound.y),this.lowerBound.z=Math.min(this.lowerBound.z,e.lowerBound.z),this.upperBound.z=Math.max(this.upperBound.z,e.upperBound.z)}overlaps(e){const g=this.lowerBound,n=this.upperBound,I=e.lowerBound,o=e.upperBound,i=I.x<=n.x&&n.x<=o.x||g.x<=o.x&&o.x<=n.x,l=I.y<=n.y&&n.y<=o.y||g.y<=o.y&&o.y<=n.y,r=I.z<=n.z&&n.z<=o.z||g.z<=o.z&&o.z<=n.z;return i&&l&&r}volume(){const e=this.lowerBound,g=this.upperBound;return(g.x-e.x)*(g.y-e.y)*(g.z-e.z)}contains(e){const g=this.lowerBound,n=this.upperBound,I=e.lowerBound,o=e.upperBound;return g.x<=I.x&&n.x>=o.x&&g.y<=I.y&&n.y>=o.y&&g.z<=I.z&&n.z>=o.z}getCorners(e,g,n,I,o,i,l,r){const c=this.lowerBound,A=this.upperBound;e.copy(c),g.set(A.x,c.y,c.z),n.set(A.x,A.y,c.z),I.set(c.x,A.y,A.z),o.set(A.x,c.y,A.z),i.set(c.x,A.y,c.z),l.set(c.x,c.y,A.z),r.copy(A)}toLocalFrame(e,g){const n=n0,I=n[0],o=n[1],i=n[2],l=n[3],r=n[4],c=n[5],A=n[6],u=n[7];this.getCorners(I,o,i,l,r,c,A,u);for(let h=0;h!==8;h++){const b=n[h];e.pointToLocal(b,b)}return g.setFromPoints(n)}toWorldFrame(e,g){const n=n0,I=n[0],o=n[1],i=n[2],l=n[3],r=n[4],c=n[5],A=n[6],u=n[7];this.getCorners(I,o,i,l,r,c,A,u);for(let h=0;h!==8;h++){const b=n[h];e.pointToWorld(b,b)}return g.setFromPoints(n)}overlapsRay(e){const{direction:g,from:n}=e,I=1/g.x,o=1/g.y,i=1/g.z,l=(this.lowerBound.x-n.x)*I,r=(this.upperBound.x-n.x)*I,c=(this.lowerBound.y-n.y)*o,A=(this.upperBound.y-n.y)*o,u=(this.lowerBound.z-n.z)*i,h=(this.upperBound.z-n.z)*i,b=Math.max(Math.max(Math.min(l,r),Math.min(c,A)),Math.min(u,h)),p=Math.min(Math.min(Math.max(l,r),Math.max(c,A)),Math.max(u,h));return!(p<0||b>p)}}const g0=new K,n0=[new K,new K,new K,new K,new K,new K,new K,new K];class eg{constructor(e,g,n,I){e===void 0&&(e=0),g===void 0&&(g=0),n===void 0&&(n=0),I===void 0&&(I=1),this.x=e,this.y=g,this.z=n,this.w=I}set(e,g,n,I){return this.x=e,this.y=g,this.z=n,this.w=I,this}toString(){return`${this.x},${this.y},${this.z},${this.w}`}toArray(){return[this.x,this.y,this.z,this.w]}setFromAxisAngle(e,g){const n=Math.sin(g*.5);return this.x=e.x*n,this.y=e.y*n,this.z=e.z*n,this.w=Math.cos(g*.5),this}toAxisAngle(e){e===void 0&&(e=new K),this.normalize();const g=2*Math.acos(this.w),n=Math.sqrt(1-this.w*this.w);return n<.001?(e.x=this.x,e.y=this.y,e.z=this.z):(e.x=this.x/n,e.y=this.y/n,e.z=this.z/n),[e,g]}setFromVectors(e,g){if(e.isAntiparallelTo(g)){const n=US,I=DS;e.tangents(n,I),this.setFromAxisAngle(n,Math.PI)}else{const n=e.cross(g);this.x=n.x,this.y=n.y,this.z=n.z,this.w=Math.sqrt(e.length()**2*g.length()**2)+e.dot(g),this.normalize()}return this}mult(e,g){g===void 0&&(g=new eg);const n=this.x,I=this.y,o=this.z,i=this.w,l=e.x,r=e.y,c=e.z,A=e.w;return g.x=n*A+i*l+I*c-o*r,g.y=I*A+i*r+o*l-n*c,g.z=o*A+i*c+n*r-I*l,g.w=i*A-n*l-I*r-o*c,g}inverse(e){e===void 0&&(e=new eg);const g=this.x,n=this.y,I=this.z,o=this.w;this.conjugate(e);const i=1/(g*g+n*n+I*I+o*o);return e.x*=i,e.y*=i,e.z*=i,e.w*=i,e}conjugate(e){return e===void 0&&(e=new eg),e.x=-this.x,e.y=-this.y,e.z=-this.z,e.w=this.w,e}normalize(){let e=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);return e===0?(this.x=0,this.y=0,this.z=0,this.w=0):(e=1/e,this.x*=e,this.y*=e,this.z*=e,this.w*=e),this}normalizeFast(){const e=(3-(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w))/2;return e===0?(this.x=0,this.y=0,this.z=0,this.w=0):(this.x*=e,this.y*=e,this.z*=e,this.w*=e),this}vmult(e,g){g===void 0&&(g=new K);const n=e.x,I=e.y,o=e.z,i=this.x,l=this.y,r=this.z,c=this.w,A=c*n+l*o-r*I,u=c*I+r*n-i*o,h=c*o+i*I-l*n,b=-i*n-l*I-r*o;return g.x=A*c+b*-i+u*-r-h*-l,g.y=u*c+b*-l+h*-i-A*-r,g.z=h*c+b*-r+A*-l-u*-i,g}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w,this}toEuler(e,g){g===void 0&&(g="YZX");let n,I,o;const i=this.x,l=this.y,r=this.z,c=this.w;switch(g){case"YZX":const A=i*l+r*c;if(A>.499&&(n=2*Math.atan2(i,c),I=Math.PI/2,o=0),A<-.499&&(n=-2*Math.atan2(i,c),I=-Math.PI/2,o=0),n===void 0){const u=i*i,h=l*l,b=r*r;n=Math.atan2(2*l*c-2*i*r,1-2*h-2*b),I=Math.asin(2*A),o=Math.atan2(2*i*c-2*l*r,1-2*u-2*b)}break;default:throw new Error(`Euler order ${g} not supported yet.`)}e.y=n,e.z=I,e.x=o}setFromEuler(e,g,n,I){I===void 0&&(I="XYZ");const o=Math.cos(e/2),i=Math.cos(g/2),l=Math.cos(n/2),r=Math.sin(e/2),c=Math.sin(g/2),A=Math.sin(n/2);return I==="XYZ"?(this.x=r*i*l+o*c*A,this.y=o*c*l-r*i*A,this.z=o*i*A+r*c*l,this.w=o*i*l-r*c*A):I==="YXZ"?(this.x=r*i*l+o*c*A,this.y=o*c*l-r*i*A,this.z=o*i*A-r*c*l,this.w=o*i*l+r*c*A):I==="ZXY"?(this.x=r*i*l-o*c*A,this.y=o*c*l+r*i*A,this.z=o*i*A+r*c*l,this.w=o*i*l-r*c*A):I==="ZYX"?(this.x=r*i*l-o*c*A,this.y=o*c*l+r*i*A,this.z=o*i*A-r*c*l,this.w=o*i*l+r*c*A):I==="YZX"?(this.x=r*i*l+o*c*A,this.y=o*c*l+r*i*A,this.z=o*i*A-r*c*l,this.w=o*i*l-r*c*A):I==="XZY"&&(this.x=r*i*l-o*c*A,this.y=o*c*l-r*i*A,this.z=o*i*A+r*c*l,this.w=o*i*l+r*c*A),this}clone(){return new eg(this.x,this.y,this.z,this.w)}slerp(e,g,n){n===void 0&&(n=new eg);const I=this.x,o=this.y,i=this.z,l=this.w;let r=e.x,c=e.y,A=e.z,u=e.w,h,b,p,Z,v;return b=I*r+o*c+i*A+l*u,b<0&&(b=-b,r=-r,c=-c,A=-A,u=-u),1-b>1e-6?(h=Math.acos(b),p=Math.sin(h),Z=Math.sin((1-g)*h)/p,v=Math.sin(g*h)/p):(Z=1-g,v=g),n.x=Z*I+v*r,n.y=Z*o+v*c,n.z=Z*i+v*A,n.w=Z*l+v*u,n}integrate(e,g,n,I){I===void 0&&(I=new eg);const o=e.x*n.x,i=e.y*n.y,l=e.z*n.z,r=this.x,c=this.y,A=this.z,u=this.w,h=g*.5;return I.x+=h*(o*u+i*A-l*c),I.y+=h*(i*u+l*r-o*A),I.z+=h*(l*u+o*c-i*r),I.w+=h*(-o*r-i*c-l*A),I}}const US=new K,DS=new K,jS={SPHERE:1,PLANE:2,BOX:4,COMPOUND:8,CONVEXPOLYHEDRON:16,HEIGHTFIELD:32,PARTICLE:64,CYLINDER:128,TRIMESH:256};class re{constructor(e){e===void 0&&(e={}),this.id=re.idCounter++,this.type=e.type||0,this.boundingSphereRadius=0,this.collisionResponse=e.collisionResponse?e.collisionResponse:!0,this.collisionFilterGroup=e.collisionFilterGroup!==void 0?e.collisionFilterGroup:1,this.collisionFilterMask=e.collisionFilterMask!==void 0?e.collisionFilterMask:-1,this.material=e.material?e.material:null,this.body=null}updateBoundingSphereRadius(){throw`computeBoundingSphereRadius() not implemented for shape type ${this.type}`}volume(){throw`volume() not implemented for shape type ${this.type}`}calculateLocalInertia(e,g){throw`calculateLocalInertia() not implemented for shape type ${this.type}`}calculateWorldAABB(e,g,n,I){throw`calculateWorldAABB() not implemented for shape type ${this.type}`}}re.idCounter=0;re.types=jS;class vg{constructor(e){e===void 0&&(e={}),this.position=new K,this.quaternion=new eg,e.position&&this.position.copy(e.position),e.quaternion&&this.quaternion.copy(e.quaternion)}pointToLocal(e,g){return vg.pointToLocalFrame(this.position,this.quaternion,e,g)}pointToWorld(e,g){return vg.pointToWorldFrame(this.position,this.quaternion,e,g)}vectorToWorldFrame(e,g){return g===void 0&&(g=new K),this.quaternion.vmult(e,g),g}static pointToLocalFrame(e,g,n,I){return I===void 0&&(I=new K),n.vsub(e,I),g.conjugate(I0),I0.vmult(I,I),I}static pointToWorldFrame(e,g,n,I){return I===void 0&&(I=new K),g.vmult(n,I),I.vadd(e,I),I}static vectorToWorldFrame(e,g,n){return n===void 0&&(n=new K),e.vmult(g,n),n}static vectorToLocalFrame(e,g,n,I){return I===void 0&&(I=new K),g.w*=-1,g.vmult(n,I),g.w*=-1,I}}const I0=new eg;new K;new K;new K;new K;new K,new K,new K,new K,new K,new K,new K,new K;new K;new eg;new sn;new mI;new mI;new mI;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new eg;new K;new K;new K;new K;class lh{constructor(){this.rayFromWorld=new K,this.rayToWorld=new K,this.hitNormalWorld=new K,this.hitPointWorld=new K,this.hasHit=!1,this.shape=null,this.body=null,this.hitFaceIndex=-1,this.distance=-1,this.shouldStop=!1}reset(){this.rayFromWorld.setZero(),this.rayToWorld.setZero(),this.hitNormalWorld.setZero(),this.hitPointWorld.setZero(),this.hasHit=!1,this.shape=null,this.body=null,this.hitFaceIndex=-1,this.distance=-1,this.shouldStop=!1}abort(){this.shouldStop=!0}set(e,g,n,I,o,i,l){this.rayFromWorld.copy(e),this.rayToWorld.copy(g),this.hitNormalWorld.copy(n),this.hitPointWorld.copy(I),this.shape=o,this.body=i,this.distance=l}}let Kv,Sv,Hv,Nv,Fv,kv,zv;const Jb={CLOSEST:1,ANY:2,ALL:4};Kv=re.types.SPHERE;Sv=re.types.PLANE;Hv=re.types.BOX;Nv=re.types.CYLINDER;Fv=re.types.CONVEXPOLYHEDRON;kv=re.types.HEIGHTFIELD;zv=re.types.TRIMESH;class qt{get[Kv](){return this._intersectSphere}get[Sv](){return this._intersectPlane}get[Hv](){return this._intersectBox}get[Nv](){return this._intersectConvex}get[Fv](){return this._intersectConvex}get[kv](){return this._intersectHeightfield}get[zv](){return this._intersectTrimesh}constructor(e,g){e===void 0&&(e=new K),g===void 0&&(g=new K),this.from=e.clone(),this.to=g.clone(),this.direction=new K,this.precision=1e-4,this.checkCollisionResponse=!0,this.skipBackfaces=!1,this.collisionFilterMask=-1,this.collisionFilterGroup=-1,this.mode=qt.ANY,this.result=new lh,this.hasHit=!1,this.callback=n=>{}}intersectWorld(e,g){return this.mode=g.mode||qt.ANY,this.result=g.result||new lh,this.skipBackfaces=!!g.skipBackfaces,this.collisionFilterMask=typeof g.collisionFilterMask!="undefined"?g.collisionFilterMask:-1,this.collisionFilterGroup=typeof g.collisionFilterGroup!="undefined"?g.collisionFilterGroup:-1,this.checkCollisionResponse=typeof g.checkCollisionResponse!="undefined"?g.checkCollisionResponse:!0,g.from&&this.from.copy(g.from),g.to&&this.to.copy(g.to),this.callback=g.callback||(()=>{}),this.hasHit=!1,this.result.reset(),this.updateDirection(),this.getAABB(o0),Mu.length=0,e.broadphase.aabbQuery(e,o0,Mu),this.intersectBodies(Mu),this.hasHit}intersectBody(e,g){g&&(this.result=g,this.updateDirection());const n=this.checkCollisionResponse;if(n&&!e.collisionResponse||(this.collisionFilterGroup&e.collisionFilterMask)===0||(e.collisionFilterGroup&this.collisionFilterMask)===0)return;const I=OS,o=PS;for(let i=0,l=e.shapes.length;i<l;i++){const r=e.shapes[i];if(!(n&&!r.collisionResponse)&&(e.quaternion.mult(e.shapeOrientations[i],o),e.quaternion.vmult(e.shapeOffsets[i],I),I.vadd(e.position,I),this.intersectShape(r,o,I,e),this.result.shouldStop))break}}intersectBodies(e,g){g&&(this.result=g,this.updateDirection());for(let n=0,I=e.length;!this.result.shouldStop&&n<I;n++)this.intersectBody(e[n])}updateDirection(){this.to.vsub(this.from,this.direction),this.direction.normalize()}intersectShape(e,g,n,I){const o=this.from;if(rH(o,this.direction,n)>e.boundingSphereRadius)return;const l=this[e.type];l&&l.call(this,e,g,n,I,e)}_intersectBox(e,g,n,I,o){return this._intersectConvex(e.convexPolyhedronRepresentation,g,n,I,o)}_intersectPlane(e,g,n,I,o){const i=this.from,l=this.to,r=this.direction,c=new K(0,0,1);g.vmult(c,c);const A=new K;i.vsub(n,A);const u=A.dot(c);l.vsub(n,A);const h=A.dot(c);if(u*h>0||i.distanceTo(l)<u)return;const b=c.dot(r);if(Math.abs(b)<this.precision)return;const p=new K,Z=new K,v=new K;i.vsub(n,p);const y=-c.dot(p)/b;r.scale(y,Z),i.vadd(Z,v),this.reportIntersection(c,v,o,I,-1)}getAABB(e){const{lowerBound:g,upperBound:n}=e,I=this.to,o=this.from;g.x=Math.min(I.x,o.x),g.y=Math.min(I.y,o.y),g.z=Math.min(I.z,o.z),n.x=Math.max(I.x,o.x),n.y=Math.max(I.y,o.y),n.z=Math.max(I.z,o.z)}_intersectHeightfield(e,g,n,I,o){e.data,e.elementSize;const i=_S;i.from.copy(this.from),i.to.copy(this.to),vg.pointToLocalFrame(n,g,i.from,i.from),vg.pointToLocalFrame(n,g,i.to,i.to),i.updateDirection();const l=qS;let r,c,A,u;r=c=0,A=u=e.data.length-1;const h=new sn;i.getAABB(h),e.getIndexOfPosition(h.lowerBound.x,h.lowerBound.y,l,!0),r=Math.max(r,l[0]),c=Math.max(c,l[1]),e.getIndexOfPosition(h.upperBound.x,h.upperBound.y,l,!0),A=Math.min(A,l[0]+1),u=Math.min(u,l[1]+1);for(let b=r;b<A;b++)for(let p=c;p<u;p++){if(this.result.shouldStop)return;if(e.getAabbAtIndex(b,p,h),!!h.overlapsRay(i)){if(e.getConvexTrianglePillar(b,p,!1),vg.pointToWorldFrame(n,g,e.pillarOffset,Pr),this._intersectConvex(e.pillarConvex,g,Pr,I,o,i0),this.result.shouldStop)return;e.getConvexTrianglePillar(b,p,!0),vg.pointToWorldFrame(n,g,e.pillarOffset,Pr),this._intersectConvex(e.pillarConvex,g,Pr,I,o,i0)}}}_intersectSphere(e,g,n,I,o){const i=this.from,l=this.to,r=e.radius,c=(l.x-i.x)**2+(l.y-i.y)**2+(l.z-i.z)**2,A=2*((l.x-i.x)*(i.x-n.x)+(l.y-i.y)*(i.y-n.y)+(l.z-i.z)*(i.z-n.z)),u=(i.x-n.x)**2+(i.y-n.y)**2+(i.z-n.z)**2-r**2,h=A**2-4*c*u,b=$S,p=eH;if(!(h<0))if(h===0)i.lerp(l,h,b),b.vsub(n,p),p.normalize(),this.reportIntersection(p,b,o,I,-1);else{const Z=(-A-Math.sqrt(h))/(2*c),v=(-A+Math.sqrt(h))/(2*c);if(Z>=0&&Z<=1&&(i.lerp(l,Z,b),b.vsub(n,p),p.normalize(),this.reportIntersection(p,b,o,I,-1)),this.result.shouldStop)return;v>=0&&v<=1&&(i.lerp(l,v,b),b.vsub(n,p),p.normalize(),this.reportIntersection(p,b,o,I,-1))}}_intersectConvex(e,g,n,I,o,i){const l=tH,r=C0,c=i&&i.faceList||null,A=e.faces,u=e.vertices,h=e.faceNormals,b=this.direction,p=this.from,Z=this.to,v=p.distanceTo(Z),y=c?c.length:A.length,m=this.result;for(let B=0;!m.shouldStop&&B<y;B++){const w=c?c[B]:B,X=A[w],R=h[w],S=g,Y=n;r.copy(u[X[0]]),S.vmult(r,r),r.vadd(Y,r),r.vsub(p,r),S.vmult(R,l);const k=b.dot(l);if(Math.abs(k)<this.precision)continue;const N=l.dot(r)/k;if(!(N<0)){b.scale(N,pg),pg.vadd(p,pg),mn.copy(u[X[0]]),S.vmult(mn,mn),Y.vadd(mn,mn);for(let z=1;!m.shouldStop&&z<X.length-1;z++){xn.copy(u[X[z]]),Ln.copy(u[X[z+1]]),S.vmult(xn,xn),S.vmult(Ln,Ln),Y.vadd(xn,xn),Y.vadd(Ln,Ln);const M=pg.distanceTo(p);!(qt.pointInTriangle(pg,mn,xn,Ln)||qt.pointInTriangle(pg,xn,mn,Ln))||M>v||this.reportIntersection(l,pg,o,I,w)}}}}_intersectTrimesh(e,g,n,I,o,i){const l=gH,r=lH,c=sH,A=C0,u=nH,h=IH,b=oH,p=CH,Z=iH,v=e.indices;e.vertices;const y=this.from,m=this.to,B=this.direction;c.position.copy(n),c.quaternion.copy(g),vg.vectorToLocalFrame(n,g,B,u),vg.pointToLocalFrame(n,g,y,h),vg.pointToLocalFrame(n,g,m,b),b.x*=e.scale.x,b.y*=e.scale.y,b.z*=e.scale.z,h.x*=e.scale.x,h.y*=e.scale.y,h.z*=e.scale.z,b.vsub(h,u),u.normalize();const w=h.distanceSquared(b);e.tree.rayQuery(this,c,r);for(let X=0,R=r.length;!this.result.shouldStop&&X!==R;X++){const S=r[X];e.getNormal(S,l),e.getVertex(v[S*3],mn),mn.vsub(h,A);const Y=u.dot(l),k=l.dot(A)/Y;if(k<0)continue;u.scale(k,pg),pg.vadd(h,pg),e.getVertex(v[S*3+1],xn),e.getVertex(v[S*3+2],Ln);const N=pg.distanceSquared(h);!(qt.pointInTriangle(pg,xn,mn,Ln)||qt.pointInTriangle(pg,mn,xn,Ln))||N>w||(vg.vectorToWorldFrame(g,l,Z),vg.pointToWorldFrame(n,g,pg,p),this.reportIntersection(Z,p,o,I,S))}r.length=0}reportIntersection(e,g,n,I,o){const i=this.from,l=this.to,r=i.distanceTo(g),c=this.result;if(!(this.skipBackfaces&&e.dot(this.direction)>0))switch(c.hitFaceIndex=typeof o!="undefined"?o:-1,this.mode){case qt.ALL:this.hasHit=!0,c.set(i,l,e,g,n,I,r),c.hasHit=!0,this.callback(c);break;case qt.CLOSEST:(r<c.distance||!c.hasHit)&&(this.hasHit=!0,c.hasHit=!0,c.set(i,l,e,g,n,I,r));break;case qt.ANY:this.hasHit=!0,c.hasHit=!0,c.set(i,l,e,g,n,I,r),c.shouldStop=!0;break}}static pointInTriangle(e,g,n,I){I.vsub(g,ko),n.vsub(g,ll),e.vsub(g,Eu);const o=ko.dot(ko),i=ko.dot(ll),l=ko.dot(Eu),r=ll.dot(ll),c=ll.dot(Eu);let A,u;return(A=r*l-i*c)>=0&&(u=o*c-i*l)>=0&&A+u<o*r-i*i}}qt.CLOSEST=Jb.CLOSEST;qt.ANY=Jb.ANY;qt.ALL=Jb.ALL;const o0=new sn,Mu=[],ll=new K,Eu=new K,OS=new K,PS=new eg,pg=new K,mn=new K,xn=new K,Ln=new K;new K;new lh;const i0={faceList:[0]},Pr=new K,_S=new qt,qS=[],$S=new K,eH=new K,tH=new K;new K;new K;const C0=new K,gH=new K,nH=new K,IH=new K,oH=new K,iH=new K,CH=new K;new sn;const lH=[],sH=new vg,ko=new K,_r=new K;function rH(t,e,g){g.vsub(t,ko);const n=ko.dot(e);return e.scale(n,_r),_r.vadd(t,_r),g.distanceTo(_r)}new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new qt;new K;new K;new K;new K(1,0,0),new K(0,1,0),new K(0,0,1);new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new sn;new K;new sn;new K;new K;new K;new K;new K;new K;new K;new sn;new K;new vg;new sn;re.types.SPHERE,re.types.SPHERE|re.types.PLANE,re.types.BOX|re.types.BOX,re.types.SPHERE|re.types.BOX,re.types.PLANE|re.types.BOX,re.types.CONVEXPOLYHEDRON,re.types.SPHERE|re.types.CONVEXPOLYHEDRON,re.types.PLANE|re.types.CONVEXPOLYHEDRON,re.types.BOX|re.types.CONVEXPOLYHEDRON,re.types.SPHERE|re.types.HEIGHTFIELD,re.types.BOX|re.types.HEIGHTFIELD,re.types.CONVEXPOLYHEDRON|re.types.HEIGHTFIELD,re.types.PARTICLE|re.types.SPHERE,re.types.PLANE|re.types.PARTICLE,re.types.BOX|re.types.PARTICLE,re.types.PARTICLE|re.types.CONVEXPOLYHEDRON,re.types.CYLINDER,re.types.SPHERE|re.types.CYLINDER,re.types.PLANE|re.types.CYLINDER,re.types.BOX|re.types.CYLINDER,re.types.CONVEXPOLYHEDRON|re.types.CYLINDER,re.types.HEIGHTFIELD|re.types.CYLINDER,re.types.PARTICLE|re.types.CYLINDER,re.types.SPHERE|re.types.TRIMESH,re.types.PLANE|re.types.TRIMESH;new K;new K;new K;new K;new K;new eg;new eg;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new sn;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K,new K,new K,new K,new K,new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new K;new eg;new K;new K;new K;new K;new K;new K;new K;new K;new K;new sn;new qt;const sl=globalThis.performance||{};if(!sl.now){let t=Date.now();sl.timing&&sl.timing.navigationStart&&(t=sl.timing.navigationStart),sl.now=()=>Date.now()-t}new K;function cH(t,e,g){let{color:n=65280,scale:I=1,onInit:o,onUpdate:i}=g===void 0?{}:g;const l=[],r=new Fi({color:n!=null?n:65280,wireframe:!0}),c=new K,A=new K,u=new K,h=new eg,b=new tp(1),p=new id(1,1,1),Z=new gp(10,10,10,10);Z.translate(0,0,1e-4);function v(Y){const k=new Bl,N=[];for(let M=0;M<Y.vertices.length;M++){const j=Y.vertices[M];N.push(j.x,j.y,j.z)}k.setAttribute("position",new $a(N,3));const z=[];for(let M=0;M<Y.faces.length;M++){const j=Y.faces[M],F=j[0];for(let L=1;L<j.length-1;L++){const P=j[L],$=j[L+1];z.push(F,P,$)}}return k.setIndex(z),k.computeBoundingSphere(),k.computeVertexNormals(),k}function y(Y){const k=new Bl,N=[],z=c,M=A,j=u;for(let F=0;F<Y.indices.length/3;F++)Y.getTriangleVertices(F,z,M,j),N.push(z.x,z.y,z.z),N.push(M.x,M.y,M.z),N.push(j.x,j.y,j.z);return k.setAttribute("position",new $a(N,3)),k.computeBoundingSphere(),k.computeVertexNormals(),k}function m(Y){const k=new Bl,N=Y.elementSize||1,z=Y.data.flatMap((j,F)=>j.flatMap((L,P)=>[F*N,P*N,L])),M=[];for(let j=0;j<Y.data.length-1;j++)for(let F=0;F<Y.data[j].length-1;F++){const L=Y.data[j].length,P=j*L+F;M.push(P+1,P+L,P+L+1),M.push(P+L,P+1,P)}return k.setIndex(M),k.setAttribute("position",new $a(z,3)),k.computeBoundingSphere(),k.computeVertexNormals(),k}function B(Y){let k=new En;const{SPHERE:N,BOX:z,PLANE:M,CYLINDER:j,CONVEXPOLYHEDRON:F,TRIMESH:L,HEIGHTFIELD:P}=re.types;switch(Y.type){case N:{k=new En(b,r);break}case z:{k=new En(p,r);break}case M:{k=new En(Z,r);break}case j:{const $=new XV(Y.radiusTop,Y.radiusBottom,Y.height,Y.numSegments);k=new En($,r),Y.geometryId=$.id;break}case F:{const $=v(Y);k=new En($,r),Y.geometryId=$.id;break}case L:{const $=y(Y);k=new En($,r),Y.geometryId=$.id;break}case P:{const $=m(Y);k=new En($,r),Y.geometryId=$.id;break}}return t.add(k),k}function w(Y,k){const{SPHERE:N,BOX:z,PLANE:M,CYLINDER:j,CONVEXPOLYHEDRON:F,TRIMESH:L,HEIGHTFIELD:P}=re.types;switch(k.type){case N:{const{radius:$}=k;Y.scale.set($*I,$*I,$*I);break}case z:{Y.scale.copy(k.halfExtents),Y.scale.multiplyScalar(2*I);break}case M:break;case j:{Y.scale.set(1*I,1*I,1*I);break}case F:{Y.scale.set(1*I,1*I,1*I);break}case L:{Y.scale.copy(k.scale).multiplyScalar(I);break}case P:{Y.scale.set(1*I,1*I,1*I);break}}}function X(Y,k){if(!Y)return!1;const{geometry:N}=Y;return N instanceof tp&&k.type===re.types.SPHERE||N instanceof id&&k.type===re.types.BOX||N instanceof gp&&k.type===re.types.PLANE||N.id===k.geometryId&&k.type===re.types.CYLINDER||N.id===k.geometryId&&k.type===re.types.CONVEXPOLYHEDRON||N.id===k.geometryId&&k.type===re.types.TRIMESH||N.id===k.geometryId&&k.type===re.types.HEIGHTFIELD}function R(Y,k){let N=l[Y],z=!1;return X(N,k)||(N&&t.remove(N),l[Y]=N=B(k),z=!0),w(N,k),z}function S(){const Y=l,k=c,N=h;let z=0;for(const M of e.bodies)for(let j=0;j!==M.shapes.length;j++){const F=M.shapes[j],L=R(z,F),P=Y[z];P&&(M.quaternion.vmult(M.shapeOffsets[j],k),M.position.vadd(k,k),M.quaternion.mult(M.shapeOrientations[j],N),P.position.copy(k),P.quaternion.copy(N),L&&o instanceof Function&&o(M,P,F),!L&&i instanceof Function&&i(M,P,F)),z++}for(let M=z;M<Y.length;M++){const j=Y[M];j&&t.remove(j)}Y.length=z}return{update:S}}const xv=W.exports.createContext(null),AH=()=>W.exports.useContext(xv),Lv=W.exports.createContext(null),Mb=()=>{const t=W.exports.useContext(Lv);if(!t)throw new Error("Physics context not found. @react-three/cannon & components can only be used within a Physics provider");return t},l0=new oC,aH=new mt(1,1,1),s0=new mt,r0=new sA,uH=t=>t instanceof Zl?(t.getMatrixAt(parseInt(t.uuid.split("/")[1]),r0),r0):t.matrix;function BL(t){let{children:e,color:g="black",impl:n=cH,scale:I=1}=t;const[{bodies:o,bodyMap:i}]=W.exports.useState({bodies:[],bodyMap:{}}),{refs:l}=Mb(),[r]=W.exports.useState(()=>new KZ),c=W.exports.useRef(n(r,{bodies:o},{color:g,scale:I}));pC(()=>{for(const u in i)uH(l[u]).decompose(s0,l0,aH),i[u].position.copy(s0),i[u].quaternion.copy(l0);c.current.update()});const A=W.exports.useMemo(()=>({add(u,h,b){const p=MS({props:h,type:b,uuid:u});o.push(p),i[u]=p},remove(u){const h=o.indexOf(i[u]);h!==-1&&o.splice(h,1),delete i[u]}}),[o,i]);return we(xv.Provider,{value:A,children:[D("primitive",{object:r}),e]})}const c0=new ls;function Jv(t){const e=W.exports.useRef(null);return t&&typeof t!="function"?t:e}function A0(t){return t.charAt(0).toUpperCase()+t.slice(1)}function at(t,e){const g=e===void 0?"":`/${e}`;return typeof t=="function"?null:t&&t.current&&`${t.current.uuid}${g}`}const dH=new VV,hH=new oC,bH=t=>e=>t(dH.setFromQuaternion(hH.fromArray(e)).toArray());let Mv=0;function Zc(t,e,g,n,I,o){return o===void 0&&(o="bodies"),i=>{const l=Mv++;g[l]={[n]:i};const r=at(t,I);return r&&e.subscribe({props:{id:l,target:o,type:n},uuid:r}),()=>{delete g[l],e.unsubscribe({props:l})}}}function a0(t,e){let{position:g=[0,0,0],rotation:n=[0,0,0],userData:I={}}=e;t.userData=I,t.position.set(...g),t.rotation.set(...n),t.updateMatrix()}function u0(t,e,g){let{onCollide:n,onCollideBegin:I,onCollideEnd:o}=e;t[g]={collide:n,collideBegin:I,collideEnd:o}}function YA(t,e,g,n,I){n===void 0&&(n=null),I===void 0&&(I=[]);const o=Jv(n),{events:i,refs:l,scaleOverrides:r,subscriptions:c,worker:A}=Mb(),u=AH();W.exports.useLayoutEffect(()=>{o.current||(o.current=new ls);const b=o.current,p=A,Z=b instanceof Zl?(b.instanceMatrix.setUsage(RV),b.count):1,v=b instanceof Zl?new Array(Z).fill(0).map((m,B)=>`${b.uuid}/${B}`):[b.uuid],y=b instanceof Zl?v.map((m,B)=>{const w=e(B);return a0(c0,w),b.setMatrixAt(B,c0.matrix),b.instanceMatrix.needsUpdate=!0,l[m]=b,u==null||u.add(m,w,t),u0(i,w,m),Ze(_({},w),{args:g(w.args)})}):v.map((m,B)=>{const w=e(B);return a0(b,w),l[m]=b,u==null||u.add(m,w,t),u0(i,w,m),Ze(_({},w),{args:g(w.args)})});return p.addBodies({props:y.map(m=>{let S=m,{onCollide:B,onCollideBegin:w,onCollideEnd:X}=S,R=ye(S,["onCollide","onCollideBegin","onCollideEnd"]);return _({onCollide:Boolean(B)},R)}),type:t,uuid:v}),()=>{v.forEach(m=>{delete l[m],u==null||u.remove(m),delete i[m]}),p.removeBodies({uuid:v})}},I);const h=W.exports.useMemo(()=>{const b=(B,w)=>{const X=`set${A0(B)}`;return{set:R=>{const S=at(o,w);S&&A[X]({props:R,uuid:S})},subscribe:Zc(o,A,c,B,w)}},p=B=>({copy:X=>{let{w:R,x:S,y:Y,z:k}=X;const N=at(o,B);N&&A.setQuaternion({props:[S,Y,k,R],uuid:N})},set:(X,R,S,Y)=>{const k=at(o,B);k&&A.setQuaternion({props:[X,R,S,Y],uuid:k})},subscribe:Zc(o,A,c,"quaternion",B)}),Z=B=>({copy:w=>{let{x:X,y:R,z:S}=w;const Y=at(o,B);Y&&A.setRotation({props:[X,R,S],uuid:Y})},set:(w,X,R)=>{const S=at(o,B);S&&A.setRotation({props:[w,X,R],uuid:S})},subscribe:w=>{const X=Mv++,R="bodies",S="quaternion",Y=at(o,B);return c[X]={[S]:bH(w)},Y&&A.subscribe({props:{id:X,target:R,type:S},uuid:Y}),()=>{delete c[X],A.unsubscribe({props:X})}}}),v=(B,w)=>{const X=`set${A0(B)}`;return{copy:R=>{let{x:S,y:Y,z:k}=R;const N=at(o,w);N&&A[X]({props:[S,Y,k],uuid:N})},set:(R,S,Y)=>{const k=at(o,w);k&&A[X]({props:[R,S,Y],uuid:k})},subscribe:Zc(o,A,c,B,w)}};function y(B){return{allowSleep:b("allowSleep",B),angularDamping:b("angularDamping",B),angularFactor:v("angularFactor",B),angularVelocity:v("angularVelocity",B),applyForce(w,X){const R=at(o,B);R&&A.applyForce({props:[w,X],uuid:R})},applyImpulse(w,X){const R=at(o,B);R&&A.applyImpulse({props:[w,X],uuid:R})},applyLocalForce(w,X){const R=at(o,B);R&&A.applyLocalForce({props:[w,X],uuid:R})},applyLocalImpulse(w,X){const R=at(o,B);R&&A.applyLocalImpulse({props:[w,X],uuid:R})},applyTorque(w){const X=at(o,B);X&&A.applyTorque({props:[w],uuid:X})},collisionFilterGroup:b("collisionFilterGroup",B),collisionFilterMask:b("collisionFilterMask",B),collisionResponse:b("collisionResponse",B),fixedRotation:b("fixedRotation",B),isTrigger:b("isTrigger",B),linearDamping:b("linearDamping",B),linearFactor:v("linearFactor",B),mass:b("mass",B),material:b("material",B),position:v("position",B),quaternion:p(B),rotation:Z(B),scaleOverride(w){const X=at(o,B);X&&(r[X]=new mt(...w))},sleep(){const w=at(o,B);w&&A.sleep({uuid:w})},sleepSpeedLimit:b("sleepSpeedLimit",B),sleepTimeLimit:b("sleepTimeLimit",B),userData:b("userData",B),velocity:v("velocity",B),wakeUp(){const w=at(o,B);w&&A.wakeUp({uuid:w})}}}const m={};return Ze(_({},y(void 0)),{at:B=>m[B]||(m[B]=y(B))})},[]);return[o,h]}function ZL(t,e,g){return YA("Plane",t,()=>[],e,g)}function yL(t,e,g){const n=[1,1,1];return YA("Box",t,function(I){return I===void 0&&(I=n),I},e,g)}function fL(t,e,g){return YA("Heightfield",t,n=>n,e,g)}function vL(t,e,g){return YA("Compound",t,n=>n,e,g)}function GH(t){return typeof t=="string"}function WL(t,e,g){e===void 0&&(e=null),g===void 0&&(g=[]);const n=Jv(e),{worker:I,subscriptions:o}=Mb();W.exports.useLayoutEffect(()=>{n.current||(n.current=new ls);const l=I,r=n.current.uuid,{chassisBody:c,indexForwardAxis:A=2,indexRightAxis:u=0,indexUpAxis:h=1,wheelInfos:b,wheels:p}=t(),Z=at(c),v=p.map(y=>at(y));if(!(!Z||!v.every(GH)))return l.addRaycastVehicle({props:[Z,v,b,A,u,h],uuid:r}),()=>{l.removeRaycastVehicle({uuid:r})}},g);const i=W.exports.useMemo(()=>({applyEngineForce(l,r){const c=at(n);c&&I.applyRaycastVehicleEngineForce({props:[l,r],uuid:c})},setBrake(l,r){const c=at(n);c&&I.setRaycastVehicleBrake({props:[l,r],uuid:c})},setSteeringValue(l,r){const c=at(n);c&&I.setRaycastVehicleSteeringValue({props:[l,r],uuid:c})},sliding:{subscribe:Zc(n,I,o,"sliding",void 0,"vehicles")}}),g);return[n,i]}const mH=new mt,pH=new mt(1,1,1),BH=new oC,qr=new sA;function d0(t,e,g,n,I){return n===void 0&&(n=pH),t!==void 0?(qr.compose(mH.fromArray(e,t*3),BH.fromArray(g,t*4),n),I&&(I.matrixAutoUpdate=!1,I.matrix.copy(qr)),qr):qr.identity()}function wL(t){let{allowSleep:e=!1,axisIndex:g=0,broadphase:n="Naive",children:I,defaultContactMaterial:o={contactEquationStiffness:1e6},gravity:i=[0,-9.81,0],isPaused:l=!1,iterations:r=5,maxSubSteps:c=10,quatNormalizeFast:A=!1,quatNormalizeSkip:u=0,shouldInvalidate:h=!0,size:b=1e3,solver:p="GS",stepSize:Z=1/60,tolerance:v=.001}=t;const{invalidate:y}=pt(),[{bodies:m,events:B,refs:w,scaleOverrides:X,subscriptions:R,worker:S}]=W.exports.useState(()=>({bodies:{},events:{},refs:{},scaleOverrides:{},subscriptions:{},worker:new S9({allowSleep:e,axisIndex:g,broadphase:n,defaultContactMaterial:o,gravity:i,iterations:r,quatNormalizeFast:A,quatNormalizeSkip:u,size:b,solver:p,tolerance:v})}));let Y=0;const k=W.exports.useCallback((P,$)=>{l||(Y+=$,S.step({maxSubSteps:c,stepSize:Z,timeSinceLastCalled:Y}),Y=0)},[l,c,Z]),N=P=>{var $;let et=P,{body:T,contact:yt}=et,dt=yt,{bi:q,bj:ge}=dt,se=ye(dt,["bi","bj"]),ag=et,{target:ue}=ag,Ye=ye(ag,["body","contact","target"]);const Te=($=B[ue])==null?void 0:$.collide;Te&&Te(_({body:w[T],contact:_({bi:w[q],bj:w[ge]},se),target:w[ue]},Ye))},z=P=>{var $,T;let{bodyA:q,bodyB:ge}=P;const se=($=B[q])==null?void 0:$.collideBegin;se&&se({body:w[ge],op:"event",target:w[q],type:"collideBegin"});const ue=(T=B[ge])==null?void 0:T.collideBegin;ue&&ue({body:w[q],op:"event",target:w[ge],type:"collideBegin"})},M=P=>{var $,T;let{bodyA:q,bodyB:ge}=P;const se=($=B[q])==null?void 0:$.collideEnd;se&&se({body:w[ge],op:"event",target:w[q],type:"collideEnd"});const ue=(T=B[ge])==null?void 0:T.collideEnd;ue&&ue({body:w[q],op:"event",target:w[ge],type:"collideEnd"})},j=P=>{let{active:$,bodies:T=[],observations:q,positions:ge,quaternions:se}=P;for(let ue=0;ue<T.length;ue++)m[T[ue]]=ue;if(q.forEach(ue=>{let[Ye,Te,et]=ue;const dt=(R[Ye]||{})[et];dt&&dt(Te)}),$){for(const ue of Object.values(w))if(ue instanceof Zl)for(let Ye=0;Ye<ue.count;Ye++){const Te=`${ue.uuid}/${Ye}`,et=m[Te];et!==void 0&&(ue.setMatrixAt(Ye,d0(et,ge,se,X[Te])),ue.instanceMatrix.needsUpdate=!0)}else{const Ye=X[ue.uuid]||ue.scale;d0(m[ue.uuid],ge,se,Ye,ue)}h&&y()}},F=P=>{var $;let Ye=P,{body:T,ray:Te}=Ye,et=Te,{uuid:q}=et,ge=ye(et,["uuid"]),se=ye(Ye,["body","ray"]);const ue=($=B[q])==null?void 0:$.rayhit;ue&&ue(_({body:T?w[T]:null,ray:_({uuid:q},ge)},se))};pC(k),W.exports.useEffect(()=>(S.connect(),S.init(),S.on("collide",N),S.on("collideBegin",z),S.on("collideEnd",M),S.on("frame",j),S.on("rayhit",F),()=>{S.terminate(),S.removeAllListeners()}),[]),W.exports.useEffect(()=>{S.axisIndex=g},[g]),W.exports.useEffect(()=>{S.broadphase=n},[n]),W.exports.useEffect(()=>{S.gravity=i},[i]),W.exports.useEffect(()=>{S.iterations=r},[r]),W.exports.useEffect(()=>{S.tolerance=v},[v]);const L=W.exports.useMemo(()=>({bodies:m,events:B,refs:w,scaleOverrides:X,subscriptions:R,worker:S}),[m,B,w,R,S]);return D(Lv.Provider,{value:L,children:I})}function sh(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var ZH=typeof global=="object"&&global&&global.Object===Object&&global,yH=ZH,fH=typeof self=="object"&&self&&self.Object===Object&&self,vH=yH||fH||Function("return this")(),Ev=vH,WH=function(){return Ev.Date.now()},Qu=WH,wH=/\s/;function VH(t){for(var e=t.length;e--&&wH.test(t.charAt(e)););return e}var RH=/^\s+/;function XH(t){return t&&t.slice(0,VH(t)+1).replace(RH,"")}var YH=Ev.Symbol,qc=YH,Qv=Object.prototype,KH=Qv.hasOwnProperty,SH=Qv.toString,rl=qc?qc.toStringTag:void 0;function HH(t){var e=KH.call(t,rl),g=t[rl];try{t[rl]=void 0;var n=!0}catch{}var I=SH.call(t);return n&&(e?t[rl]=g:delete t[rl]),I}var NH=Object.prototype,FH=NH.toString;function kH(t){return FH.call(t)}var zH="[object Null]",xH="[object Undefined]",h0=qc?qc.toStringTag:void 0;function LH(t){return t==null?t===void 0?xH:zH:h0&&h0 in Object(t)?HH(t):kH(t)}function JH(t){return t!=null&&typeof t=="object"}var MH="[object Symbol]";function EH(t){return typeof t=="symbol"||JH(t)&&LH(t)==MH}var b0=0/0,QH=/^[-+]0x[0-9a-f]+$/i,TH=/^0b[01]+$/i,UH=/^0o[0-7]+$/i,DH=parseInt;function Yl(t){if(typeof t=="number")return t;if(EH(t))return b0;if(sh(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=sh(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=XH(t);var g=TH.test(t);return g||UH.test(t)?DH(t.slice(2),g?2:8):QH.test(t)?b0:+t}var jH="Expected a function",OH=Math.max,PH=Math.min;function VL(t,e,g){var n,I,o,i,l,r,c=0,A=!1,u=!1,h=!0;if(typeof t!="function")throw new TypeError(jH);e=Yl(e)||0,sh(g)&&(A=!!g.leading,u="maxWait"in g,o=u?OH(Yl(g.maxWait)||0,e):o,h="trailing"in g?!!g.trailing:h);function b(R){var S=n,Y=I;return n=I=void 0,c=R,i=t.apply(Y,S),i}function p(R){return c=R,l=setTimeout(y,e),A?b(R):i}function Z(R){var S=R-r,Y=R-c,k=e-S;return u?PH(k,o-Y):k}function v(R){var S=R-r,Y=R-c;return r===void 0||S>=e||S<0||u&&Y>=o}function y(){var R=Qu();if(v(R))return m(R);l=setTimeout(y,Z(R))}function m(R){return l=void 0,h&&n?b(R):(n=I=void 0,i)}function B(){l!==void 0&&clearTimeout(l),c=0,n=r=I=l=void 0}function w(){return l===void 0?i:m(Qu())}function X(){var R=Qu(),S=v(R);if(n=arguments,I=this,r=R,S){if(l===void 0)return p(r);if(u)return clearTimeout(l),l=setTimeout(y,e),b(r)}return l===void 0&&(l=setTimeout(y,e)),i}return X.cancel=B,X.flush=w,X}var Eb=function t(e,g){if(e===g)return!0;if(e&&g&&typeof e=="object"&&typeof g=="object"){if(e.constructor!==g.constructor)return!1;var n,I,o;if(Array.isArray(e)){if(n=e.length,n!=g.length)return!1;for(I=n;I--!==0;)if(!t(e[I],g[I]))return!1;return!0}if(e.constructor===RegExp)return e.source===g.source&&e.flags===g.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===g.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===g.toString();if(o=Object.keys(e),n=o.length,n!==Object.keys(g).length)return!1;for(I=n;I--!==0;)if(!Object.prototype.hasOwnProperty.call(g,o[I]))return!1;for(I=n;I--!==0;){var i=o[I];if(!t(e[i],g[i]))return!1}return!0}return e!==e&&g!==g};const KA=[];function Tv(t,e,g,n=0,I=!1){for(const i of e)if(Eb(g,i.args)){if(I)return;if(i.error)throw i.error;if(i.response)return i.response;throw i.promise}const o={args:g,promise:t(...g).then(i=>o.response=i!=null?i:!0).catch(i=>o.error=i!=null?i:"unknown error").then(()=>{n>0&&setTimeout(()=>{const i=e.indexOf(o);i!==-1&&e.splice(i,1)},n)})};if(e.push(o),!I)throw o.promise}function _H(t,...e){if(e===void 0||e.length===0)t.splice(0,t.length);else{const g=t.find(n=>Eb(e,n.args));if(g){const n=t.indexOf(g);n!==-1&&t.splice(n,1)}}}function dC(t,...e){return Tv(t,KA,e,dC.lifespan)}dC.lifespan=0;dC.clear=(...t)=>_H(KA,...t);dC.preload=(t,...e)=>void Tv(t,KA,e,dC.lifespan,!0);dC.peek=(...t)=>{var e;return(e=KA.find(g=>Eb(t,g.args)))==null?void 0:e.response};function qH(t,e,g){return t===t&&(g!==void 0&&(t=t<=g?t:g),e!==void 0&&(t=t>=e?t:e)),t}function RL(t,e,g){return g===void 0&&(g=e,e=void 0),g!==void 0&&(g=Yl(g),g=g===g?g:0),e!==void 0&&(e=Yl(e),e=e===e?e:0),qH(Yl(t),e,g)}const $H="1.30.7",Uv={"X-Client-Info":`supabase-js/${$H}`},eN="supabase.auth.token";function tN(t){return t.replace(/\/$/,"")}const gN=()=>typeof window!="undefined";var Gs=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};const nN=t=>t.msg||t.message||t.error_description||t.error||JSON.stringify(t),IN=(t,e)=>{if(typeof t.json!="function")return e(t);t.json().then(g=>e({message:nN(g),status:(t==null?void 0:t.status)||500}))},oN=(t,e,g)=>{const n={method:t,headers:(e==null?void 0:e.headers)||{}};return t==="GET"||(n.headers=Object.assign({"Content-Type":"text/plain;charset=UTF-8"},e==null?void 0:e.headers),n.body=JSON.stringify(g)),n};function SA(t,e,g,n,I){return Gs(this,void 0,void 0,function*(){return new Promise((o,i)=>{t(g,oN(e,n,I)).then(l=>{if(!l.ok)throw l;return n!=null&&n.noResolveJson?o:l.json()}).then(l=>o(l)).catch(l=>IN(l,i))})})}function Tu(t,e,g){return Gs(this,void 0,void 0,function*(){return SA(t,"GET",e,g)})}function Bg(t,e,g,n){return Gs(this,void 0,void 0,function*(){return SA(t,"POST",e,n,g)})}function G0(t,e,g,n){return Gs(this,void 0,void 0,function*(){return SA(t,"PUT",e,n,g)})}function iN(t,e,g,n){return Gs(this,void 0,void 0,function*(){return SA(t,"DELETE",e,n,g)})}const CN="1.22.3",lN="http://localhost:9999",sN={"X-Client-Info":`gotrue-js/${CN}`},cl="supabase.auth.token",rN={name:"sb",lifetime:60*60*8,domain:"",path:"/",sameSite:"lax"};function cN(t,e,g){const n=g||{},I=encodeURIComponent,o=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/;if(typeof I!="function")throw new TypeError("option encode is invalid");if(!o.test(t))throw new TypeError("argument name is invalid");const i=I(e);if(i&&!o.test(i))throw new TypeError("argument val is invalid");let l=t+"="+i;if(n.maxAge!=null){const r=n.maxAge-0;if(isNaN(r)||!isFinite(r))throw new TypeError("option maxAge is invalid");l+="; Max-Age="+Math.floor(r)}if(n.domain){if(!o.test(n.domain))throw new TypeError("option domain is invalid");l+="; Domain="+n.domain}if(n.path){if(!o.test(n.path))throw new TypeError("option path is invalid");l+="; Path="+n.path}if(n.expires){if(typeof n.expires.toUTCString!="function")throw new TypeError("option expires is invalid");l+="; Expires="+n.expires.toUTCString()}if(n.httpOnly&&(l+="; HttpOnly"),n.secure&&(l+="; Secure"),n.sameSite)switch(typeof n.sameSite=="string"?n.sameSite.toLowerCase():n.sameSite){case"lax":l+="; SameSite=Lax";break;case"strict":l+="; SameSite=Strict";break;case"none":l+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return l}function AN(t){if(!t||!t.headers||!t.headers.host)throw new Error('The "host" request header is not available');const e=t.headers.host.indexOf(":")>-1&&t.headers.host.split(":")[0]||t.headers.host;return!(["localhost","127.0.0.1"].indexOf(e)>-1||e.endsWith(".local"))}function aN(t,e){var g,n,I;return cN(t.name,t.value,{maxAge:t.maxAge,expires:new Date(Date.now()+t.maxAge*1e3),httpOnly:!0,secure:e,path:(g=t.path)!==null&&g!==void 0?g:"/",domain:(n=t.domain)!==null&&n!==void 0?n:"",sameSite:(I=t.sameSite)!==null&&I!==void 0?I:"lax"})}function rh(t,e,g){const n=g.map(o=>aN(o,AN(t))),I=e.getHeader("Set-Cookie");return I&&(I instanceof Array?Array.prototype.push.apply(n,I):typeof I=="string"&&n.push(I)),n}function $r(t,e,g){e.setHeader("Set-Cookie",rh(t,e,g))}var ch={exports:{}};(function(t,e){var g=typeof self!="undefined"?self:SZ,n=function(){function o(){this.fetch=!1,this.DOMException=g.DOMException}return o.prototype=g,new o}();(function(o){(function(i){var l={searchParams:"URLSearchParams"in o,iterable:"Symbol"in o&&"iterator"in Symbol,blob:"FileReader"in o&&"Blob"in o&&function(){try{return new Blob,!0}catch{return!1}}(),formData:"FormData"in o,arrayBuffer:"ArrayBuffer"in o};function r(F){return F&&DataView.prototype.isPrototypeOf(F)}if(l.arrayBuffer)var c=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],A=ArrayBuffer.isView||function(F){return F&&c.indexOf(Object.prototype.toString.call(F))>-1};function u(F){if(typeof F!="string"&&(F=String(F)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(F))throw new TypeError("Invalid character in header field name");return F.toLowerCase()}function h(F){return typeof F!="string"&&(F=String(F)),F}function b(F){var L={next:function(){var P=F.shift();return{done:P===void 0,value:P}}};return l.iterable&&(L[Symbol.iterator]=function(){return L}),L}function p(F){this.map={},F instanceof p?F.forEach(function(L,P){this.append(P,L)},this):Array.isArray(F)?F.forEach(function(L){this.append(L[0],L[1])},this):F&&Object.getOwnPropertyNames(F).forEach(function(L){this.append(L,F[L])},this)}p.prototype.append=function(F,L){F=u(F),L=h(L);var P=this.map[F];this.map[F]=P?P+", "+L:L},p.prototype.delete=function(F){delete this.map[u(F)]},p.prototype.get=function(F){return F=u(F),this.has(F)?this.map[F]:null},p.prototype.has=function(F){return this.map.hasOwnProperty(u(F))},p.prototype.set=function(F,L){this.map[u(F)]=h(L)},p.prototype.forEach=function(F,L){for(var P in this.map)this.map.hasOwnProperty(P)&&F.call(L,this.map[P],P,this)},p.prototype.keys=function(){var F=[];return this.forEach(function(L,P){F.push(P)}),b(F)},p.prototype.values=function(){var F=[];return this.forEach(function(L){F.push(L)}),b(F)},p.prototype.entries=function(){var F=[];return this.forEach(function(L,P){F.push([P,L])}),b(F)},l.iterable&&(p.prototype[Symbol.iterator]=p.prototype.entries);function Z(F){if(F.bodyUsed)return Promise.reject(new TypeError("Already read"));F.bodyUsed=!0}function v(F){return new Promise(function(L,P){F.onload=function(){L(F.result)},F.onerror=function(){P(F.error)}})}function y(F){var L=new FileReader,P=v(L);return L.readAsArrayBuffer(F),P}function m(F){var L=new FileReader,P=v(L);return L.readAsText(F),P}function B(F){for(var L=new Uint8Array(F),P=new Array(L.length),$=0;$<L.length;$++)P[$]=String.fromCharCode(L[$]);return P.join("")}function w(F){if(F.slice)return F.slice(0);var L=new Uint8Array(F.byteLength);return L.set(new Uint8Array(F)),L.buffer}function X(){return this.bodyUsed=!1,this._initBody=function(F){this._bodyInit=F,F?typeof F=="string"?this._bodyText=F:l.blob&&Blob.prototype.isPrototypeOf(F)?this._bodyBlob=F:l.formData&&FormData.prototype.isPrototypeOf(F)?this._bodyFormData=F:l.searchParams&&URLSearchParams.prototype.isPrototypeOf(F)?this._bodyText=F.toString():l.arrayBuffer&&l.blob&&r(F)?(this._bodyArrayBuffer=w(F.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):l.arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(F)||A(F))?this._bodyArrayBuffer=w(F):this._bodyText=F=Object.prototype.toString.call(F):this._bodyText="",this.headers.get("content-type")||(typeof F=="string"?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):l.searchParams&&URLSearchParams.prototype.isPrototypeOf(F)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},l.blob&&(this.blob=function(){var F=Z(this);if(F)return F;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?Z(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(y)}),this.text=function(){var F=Z(this);if(F)return F;if(this._bodyBlob)return m(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(B(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},l.formData&&(this.formData=function(){return this.text().then(k)}),this.json=function(){return this.text().then(JSON.parse)},this}var R=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function S(F){var L=F.toUpperCase();return R.indexOf(L)>-1?L:F}function Y(F,L){L=L||{};var P=L.body;if(F instanceof Y){if(F.bodyUsed)throw new TypeError("Already read");this.url=F.url,this.credentials=F.credentials,L.headers||(this.headers=new p(F.headers)),this.method=F.method,this.mode=F.mode,this.signal=F.signal,!P&&F._bodyInit!=null&&(P=F._bodyInit,F.bodyUsed=!0)}else this.url=String(F);if(this.credentials=L.credentials||this.credentials||"same-origin",(L.headers||!this.headers)&&(this.headers=new p(L.headers)),this.method=S(L.method||this.method||"GET"),this.mode=L.mode||this.mode||null,this.signal=L.signal||this.signal,this.referrer=null,(this.method==="GET"||this.method==="HEAD")&&P)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(P)}Y.prototype.clone=function(){return new Y(this,{body:this._bodyInit})};function k(F){var L=new FormData;return F.trim().split("&").forEach(function(P){if(P){var $=P.split("="),T=$.shift().replace(/\+/g," "),q=$.join("=").replace(/\+/g," ");L.append(decodeURIComponent(T),decodeURIComponent(q))}}),L}function N(F){var L=new p,P=F.replace(/\r?\n[\t ]+/g," ");return P.split(/\r?\n/).forEach(function($){var T=$.split(":"),q=T.shift().trim();if(q){var ge=T.join(":").trim();L.append(q,ge)}}),L}X.call(Y.prototype);function z(F,L){L||(L={}),this.type="default",this.status=L.status===void 0?200:L.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in L?L.statusText:"OK",this.headers=new p(L.headers),this.url=L.url||"",this._initBody(F)}X.call(z.prototype),z.prototype.clone=function(){return new z(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},z.error=function(){var F=new z(null,{status:0,statusText:""});return F.type="error",F};var M=[301,302,303,307,308];z.redirect=function(F,L){if(M.indexOf(L)===-1)throw new RangeError("Invalid status code");return new z(null,{status:L,headers:{location:F}})},i.DOMException=o.DOMException;try{new i.DOMException}catch{i.DOMException=function(L,P){this.message=L,this.name=P;var $=Error(L);this.stack=$.stack},i.DOMException.prototype=Object.create(Error.prototype),i.DOMException.prototype.constructor=i.DOMException}function j(F,L){return new Promise(function(P,$){var T=new Y(F,L);if(T.signal&&T.signal.aborted)return $(new i.DOMException("Aborted","AbortError"));var q=new XMLHttpRequest;function ge(){q.abort()}q.onload=function(){var se={status:q.status,statusText:q.statusText,headers:N(q.getAllResponseHeaders()||"")};se.url="responseURL"in q?q.responseURL:se.headers.get("X-Request-URL");var ue="response"in q?q.response:q.responseText;P(new z(ue,se))},q.onerror=function(){$(new TypeError("Network request failed"))},q.ontimeout=function(){$(new TypeError("Network request failed"))},q.onabort=function(){$(new i.DOMException("Aborted","AbortError"))},q.open(T.method,T.url,!0),T.credentials==="include"?q.withCredentials=!0:T.credentials==="omit"&&(q.withCredentials=!1),"responseType"in q&&l.blob&&(q.responseType="blob"),T.headers.forEach(function(se,ue){q.setRequestHeader(ue,se)}),T.signal&&(T.signal.addEventListener("abort",ge),q.onreadystatechange=function(){q.readyState===4&&T.signal.removeEventListener("abort",ge)}),q.send(typeof T._bodyInit=="undefined"?null:T._bodyInit)})}return j.polyfill=!0,o.fetch||(o.fetch=j,o.Headers=p,o.Request=Y,o.Response=z),i.Headers=p,i.Request=Y,i.Response=z,i.fetch=j,Object.defineProperty(i,"__esModule",{value:!0}),i})({})})(n),n.fetch.ponyfill=!0,delete n.fetch.polyfill;var I=n;e=I.fetch,e.default=I.fetch,e.fetch=I.fetch,e.Headers=I.Headers,e.Request=I.Request,e.Response=I.Response,t.exports=e})(ch,ch.exports);var Qb=KV(ch.exports);function Vi(t){return Math.round(Date.now()/1e3)+t}function uN(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){const e=Math.random()*16|0;return(t=="x"?e:e&3|8).toString(16)})}const UI=()=>typeof window!="undefined";function DI(t,e){var g;e||(e=((g=window==null?void 0:window.location)===null||g===void 0?void 0:g.href)||""),t=t.replace(/[\[\]]/g,"\\$&");const n=new RegExp("[?&#]"+t+"(=([^&#]*)|&|#|$)"),I=n.exec(e);return I?I[2]?decodeURIComponent(I[2].replace(/\+/g," ")):"":null}const dN=t=>{let e;return t?e=t:typeof fetch=="undefined"?e=Qb:e=fetch,(...g)=>e(...g)};var Gt=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};class hN{constructor({url:e="",headers:g={},cookieOptions:n,fetch:I}){this.url=e,this.headers=g,this.cookieOptions=Object.assign(Object.assign({},rN),n),this.fetch=dN(I)}_createRequestHeaders(e){const g=Object.assign({},this.headers);return g.Authorization=`Bearer ${e}`,g}cookieName(){var e;return(e=this.cookieOptions.name)!==null&&e!==void 0?e:""}getUrlForProvider(e,g){const n=[`provider=${encodeURIComponent(e)}`];return g!=null&&g.redirectTo&&n.push(`redirect_to=${encodeURIComponent(g.redirectTo)}`),g!=null&&g.scopes&&n.push(`scopes=${encodeURIComponent(g.scopes)}`),`${this.url}/authorize?${n.join("&")}`}signUpWithEmail(e,g,n={}){return Gt(this,void 0,void 0,function*(){try{const I=Object.assign({},this.headers);let o="";n.redirectTo&&(o="?redirect_to="+encodeURIComponent(n.redirectTo));const i=yield Bg(this.fetch,`${this.url}/signup${o}`,{email:e,password:g,data:n.data,gotrue_meta_security:{hcaptcha_token:n.captchaToken}},{headers:I}),l=Object.assign({},i);return l.expires_in&&(l.expires_at=Vi(i.expires_in)),{data:l,error:null}}catch(I){return{data:null,error:I}}})}signInWithEmail(e,g,n={}){return Gt(this,void 0,void 0,function*(){try{const I=Object.assign({},this.headers);let o="?grant_type=password";n.redirectTo&&(o+="&redirect_to="+encodeURIComponent(n.redirectTo));const i=yield Bg(this.fetch,`${this.url}/token${o}`,{email:e,password:g},{headers:I}),l=Object.assign({},i);return l.expires_in&&(l.expires_at=Vi(i.expires_in)),{data:l,error:null}}catch(I){return{data:null,error:I}}})}signUpWithPhone(e,g,n={}){return Gt(this,void 0,void 0,function*(){try{const I=Object.assign({},this.headers),o=yield Bg(this.fetch,`${this.url}/signup`,{phone:e,password:g,data:n.data,gotrue_meta_security:{hcaptcha_token:n.captchaToken}},{headers:I}),i=Object.assign({},o);return i.expires_in&&(i.expires_at=Vi(o.expires_in)),{data:i,error:null}}catch(I){return{data:null,error:I}}})}signInWithPhone(e,g){return Gt(this,void 0,void 0,function*(){try{const n=Object.assign({},this.headers),I="?grant_type=password",o=yield Bg(this.fetch,`${this.url}/token${I}`,{phone:e,password:g},{headers:n}),i=Object.assign({},o);return i.expires_in&&(i.expires_at=Vi(o.expires_in)),{data:i,error:null}}catch(n){return{data:null,error:n}}})}signInWithOpenIDConnect({id_token:e,nonce:g,client_id:n,issuer:I,provider:o}){return Gt(this,void 0,void 0,function*(){try{const i=Object.assign({},this.headers),l="?grant_type=id_token",r=yield Bg(this.fetch,`${this.url}/token${l}`,{id_token:e,nonce:g,client_id:n,issuer:I,provider:o},{headers:i}),c=Object.assign({},r);return c.expires_in&&(c.expires_at=Vi(r.expires_in)),{data:c,error:null}}catch(i){return{data:null,error:i}}})}sendMagicLinkEmail(e,g={}){return Gt(this,void 0,void 0,function*(){try{const n=Object.assign({},this.headers);let I="";g.redirectTo&&(I+="?redirect_to="+encodeURIComponent(g.redirectTo));const o=g.shouldCreateUser?g.shouldCreateUser:!0;return{data:yield Bg(this.fetch,`${this.url}/otp${I}`,{email:e,create_user:o,gotrue_meta_security:{hcaptcha_token:g.captchaToken}},{headers:n}),error:null}}catch(n){return{data:null,error:n}}})}sendMobileOTP(e,g={}){return Gt(this,void 0,void 0,function*(){try{const n=g.shouldCreateUser?g.shouldCreateUser:!0,I=Object.assign({},this.headers);return{data:yield Bg(this.fetch,`${this.url}/otp`,{phone:e,create_user:n,gotrue_meta_security:{hcaptcha_token:g.captchaToken}},{headers:I}),error:null}}catch(n){return{data:null,error:n}}})}signOut(e){return Gt(this,void 0,void 0,function*(){try{return yield Bg(this.fetch,`${this.url}/logout`,{},{headers:this._createRequestHeaders(e),noResolveJson:!0}),{error:null}}catch(g){return{error:g}}})}verifyMobileOTP(e,g,n={}){return Gt(this,void 0,void 0,function*(){try{const I=Object.assign({},this.headers);return{data:yield Bg(this.fetch,`${this.url}/verify`,{phone:e,token:g,type:"sms",redirect_to:n.redirectTo},{headers:I}),error:null}}catch(I){return{data:null,error:I}}})}inviteUserByEmail(e,g={}){return Gt(this,void 0,void 0,function*(){try{const n=Object.assign({},this.headers);let I="";return g.redirectTo&&(I+="?redirect_to="+encodeURIComponent(g.redirectTo)),{data:yield Bg(this.fetch,`${this.url}/invite${I}`,{email:e,data:g.data},{headers:n}),error:null}}catch(n){return{data:null,error:n}}})}resetPasswordForEmail(e,g={}){return Gt(this,void 0,void 0,function*(){try{const n=Object.assign({},this.headers);let I="";return g.redirectTo&&(I+="?redirect_to="+encodeURIComponent(g.redirectTo)),{data:yield Bg(this.fetch,`${this.url}/recover${I}`,{email:e,gotrue_meta_security:{hcaptcha_token:g.captchaToken}},{headers:n}),error:null}}catch(n){return{data:null,error:n}}})}refreshAccessToken(e){return Gt(this,void 0,void 0,function*(){try{const g=yield Bg(this.fetch,`${this.url}/token?grant_type=refresh_token`,{refresh_token:e},{headers:this.headers}),n=Object.assign({},g);return n.expires_in&&(n.expires_at=Vi(g.expires_in)),{data:n,error:null}}catch(g){return{data:null,error:g}}})}setAuthCookie(e,g){e.method!=="POST"&&(g.setHeader("Allow","POST"),g.status(405).end("Method Not Allowed"));const{event:n,session:I}=e.body;if(!n)throw new Error("Auth event missing!");if(n==="SIGNED_IN"){if(!I)throw new Error("Auth session missing!");$r(e,g,[{key:"access-token",value:I.access_token},{key:"refresh-token",value:I.refresh_token}].map(o=>{var i;return{name:`${this.cookieName()}-${o.key}`,value:o.value,domain:this.cookieOptions.domain,maxAge:(i=this.cookieOptions.lifetime)!==null&&i!==void 0?i:0,path:this.cookieOptions.path,sameSite:this.cookieOptions.sameSite}}))}n==="SIGNED_OUT"&&$r(e,g,["access-token","refresh-token"].map(o=>({name:`${this.cookieName()}-${o}`,value:"",maxAge:-1}))),g.status(200).json({})}deleteAuthCookie(e,g,{redirectTo:n="/"}){return $r(e,g,["access-token","refresh-token"].map(I=>({name:`${this.cookieName()}-${I}`,value:"",maxAge:-1}))),g.redirect(307,n)}getAuthCookieString(e,g){e.method!=="POST"&&(g.setHeader("Allow","POST"),g.status(405).end("Method Not Allowed"));const{event:n,session:I}=e.body;if(!n)throw new Error("Auth event missing!");if(n==="SIGNED_IN"){if(!I)throw new Error("Auth session missing!");return rh(e,g,[{key:"access-token",value:I.access_token},{key:"refresh-token",value:I.refresh_token}].map(o=>{var i;return{name:`${this.cookieName()}-${o.key}`,value:o.value,domain:this.cookieOptions.domain,maxAge:(i=this.cookieOptions.lifetime)!==null&&i!==void 0?i:0,path:this.cookieOptions.path,sameSite:this.cookieOptions.sameSite}}))}return n==="SIGNED_OUT"?rh(e,g,["access-token","refresh-token"].map(o=>({name:`${this.cookieName()}-${o}`,value:"",maxAge:-1}))):g.getHeader("Set-Cookie")}generateLink(e,g,n={}){return Gt(this,void 0,void 0,function*(){try{return{data:yield Bg(this.fetch,`${this.url}/admin/generate_link`,{type:e,email:g,password:n.password,data:n.data,redirect_to:n.redirectTo},{headers:this.headers}),error:null}}catch(I){return{data:null,error:I}}})}createUser(e){return Gt(this,void 0,void 0,function*(){try{const g=yield Bg(this.fetch,`${this.url}/admin/users`,e,{headers:this.headers});return{user:g,data:g,error:null}}catch(g){return{user:null,data:null,error:g}}})}listUsers(){return Gt(this,void 0,void 0,function*(){try{return{data:(yield Tu(this.fetch,`${this.url}/admin/users`,{headers:this.headers})).users,error:null}}catch(e){return{data:null,error:e}}})}getUserById(e){return Gt(this,void 0,void 0,function*(){try{return{data:yield Tu(this.fetch,`${this.url}/admin/users/${e}`,{headers:this.headers}),error:null}}catch(g){return{data:null,error:g}}})}getUserByCookie(e,g){return Gt(this,void 0,void 0,function*(){try{if(!e.cookies)throw new Error("Not able to parse cookies! When using Express make sure the cookie-parser middleware is in use!");const n=e.cookies[`${this.cookieName()}-access-token`],I=e.cookies[`${this.cookieName()}-refresh-token`];if(!n)throw new Error("No cookie found!");const{user:o,error:i}=yield this.getUser(n);if(i){if(!I)throw new Error("No refresh_token cookie found!");if(!g)throw new Error("You need to pass the res object to automatically refresh the session!");const{data:l,error:r}=yield this.refreshAccessToken(I);if(r)throw r;if(l)return $r(e,g,[{key:"access-token",value:l.access_token},{key:"refresh-token",value:l.refresh_token}].map(c=>{var A;return{name:`${this.cookieName()}-${c.key}`,value:c.value,domain:this.cookieOptions.domain,maxAge:(A=this.cookieOptions.lifetime)!==null&&A!==void 0?A:0,path:this.cookieOptions.path,sameSite:this.cookieOptions.sameSite}})),{token:l.access_token,user:l.user,data:l.user,error:null}}return{token:n,user:o,data:o,error:null}}catch(n){return{token:null,user:null,data:null,error:n}}})}updateUserById(e,g){return Gt(this,void 0,void 0,function*(){try{const n=yield G0(this.fetch,`${this.url}/admin/users/${e}`,g,{headers:this.headers});return{user:n,data:n,error:null}}catch(n){return{user:null,data:null,error:n}}})}deleteUser(e){return Gt(this,void 0,void 0,function*(){try{const g=yield iN(this.fetch,`${this.url}/admin/users/${e}`,{},{headers:this.headers});return{user:g,data:g,error:null}}catch(g){return{user:null,data:null,error:g}}})}getUser(e){return Gt(this,void 0,void 0,function*(){try{const g=yield Tu(this.fetch,`${this.url}/user`,{headers:this._createRequestHeaders(e)});return{user:g,data:g,error:null}}catch(g){return{user:null,data:null,error:g}}})}updateUser(e,g){return Gt(this,void 0,void 0,function*(){try{const n=yield G0(this.fetch,`${this.url}/user`,g,{headers:this._createRequestHeaders(e)});return{user:n,data:n,error:null}}catch(n){return{user:null,data:null,error:n}}})}}function bN(){if(typeof globalThis!="object")try{Object.defineProperty(Object.prototype,"__magic__",{get:function(){return this},configurable:!0}),__magic__.globalThis=__magic__,delete Object.prototype.__magic__}catch{typeof self!="undefined"&&(self.globalThis=self)}}var Zg=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};bN();const GN={url:lN,autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,multiTab:!0,headers:sN};class mN{constructor(e){this.stateChangeEmitters=new Map;const g=Object.assign(Object.assign({},GN),e);this.currentUser=null,this.currentSession=null,this.autoRefreshToken=g.autoRefreshToken,this.persistSession=g.persistSession,this.multiTab=g.multiTab,this.localStorage=g.localStorage||globalThis.localStorage,this.api=new hN({url:g.url,headers:g.headers,cookieOptions:g.cookieOptions,fetch:g.fetch}),this._recoverSession(),this._recoverAndRefresh(),this._listenForMultiTabEvents(),g.detectSessionInUrl&&UI()&&!!DI("access_token")&&this.getSessionFromUrl({storeSession:!0}).then(({error:n})=>{n&&console.error("Error getting session from URL.",n)})}signUp({email:e,password:g,phone:n},I={}){return Zg(this,void 0,void 0,function*(){try{this._removeSession();const{data:o,error:i}=n&&g?yield this.api.signUpWithPhone(n,g,{data:I.data,captchaToken:I.captchaToken}):yield this.api.signUpWithEmail(e,g,{redirectTo:I.redirectTo,data:I.data,captchaToken:I.captchaToken});if(i)throw i;if(!o)throw"An error occurred on sign up.";let l=null,r=null;return o.access_token&&(l=o,r=l.user,this._saveSession(l),this._notifyAllSubscribers("SIGNED_IN")),o.id&&(r=o),{user:r,session:l,error:null}}catch(o){return{user:null,session:null,error:o}}})}signIn({email:e,phone:g,password:n,refreshToken:I,provider:o,oidc:i},l={}){return Zg(this,void 0,void 0,function*(){try{if(this._removeSession(),e&&!n){const{error:r}=yield this.api.sendMagicLinkEmail(e,{redirectTo:l.redirectTo,shouldCreateUser:l.shouldCreateUser,captchaToken:l.captchaToken});return{user:null,session:null,error:r}}if(e&&n)return this._handleEmailSignIn(e,n,{redirectTo:l.redirectTo});if(g&&!n){const{error:r}=yield this.api.sendMobileOTP(g,{shouldCreateUser:l.shouldCreateUser,captchaToken:l.captchaToken});return{user:null,session:null,error:r}}if(g&&n)return this._handlePhoneSignIn(g,n);if(I){const{error:r}=yield this._callRefreshToken(I);if(r)throw r;return{user:this.currentUser,session:this.currentSession,error:null}}if(o)return this._handleProviderSignIn(o,{redirectTo:l.redirectTo,scopes:l.scopes});if(i)return this._handleOpenIDConnectSignIn(i);throw new Error("You must provide either an email, phone number, a third-party provider or OpenID Connect.")}catch(r){return{user:null,session:null,error:r}}})}verifyOTP({phone:e,token:g},n={}){return Zg(this,void 0,void 0,function*(){try{this._removeSession();const{data:I,error:o}=yield this.api.verifyMobileOTP(e,g,n);if(o)throw o;if(!I)throw"An error occurred on token verification.";let i=null,l=null;return I.access_token&&(i=I,l=i.user,this._saveSession(i),this._notifyAllSubscribers("SIGNED_IN")),I.id&&(l=I),{user:l,session:i,error:null}}catch(I){return{user:null,session:null,error:I}}})}user(){return this.currentUser}session(){return this.currentSession}refreshSession(){var e;return Zg(this,void 0,void 0,function*(){try{if(!(!((e=this.currentSession)===null||e===void 0)&&e.access_token))throw new Error("Not logged in.");const{error:g}=yield this._callRefreshToken();if(g)throw g;return{data:this.currentSession,user:this.currentUser,error:null}}catch(g){return{data:null,user:null,error:g}}})}update(e){var g;return Zg(this,void 0,void 0,function*(){try{if(!(!((g=this.currentSession)===null||g===void 0)&&g.access_token))throw new Error("Not logged in.");const{user:n,error:I}=yield this.api.updateUser(this.currentSession.access_token,e);if(I)throw I;if(!n)throw Error("Invalid user data.");const o=Object.assign(Object.assign({},this.currentSession),{user:n});return this._saveSession(o),this._notifyAllSubscribers("USER_UPDATED"),{data:n,user:n,error:null}}catch(n){return{data:null,user:null,error:n}}})}setSession(e){return Zg(this,void 0,void 0,function*(){try{if(!e)throw new Error("No current session.");const{data:g,error:n}=yield this.api.refreshAccessToken(e);return n?{session:null,error:n}:(this._saveSession(g),this._notifyAllSubscribers("SIGNED_IN"),{session:g,error:null})}catch(g){return{error:g,session:null}}})}setAuth(e){return this.currentSession=Object.assign(Object.assign({},this.currentSession),{access_token:e,token_type:"bearer",user:null}),this.currentSession}getSessionFromUrl(e){return Zg(this,void 0,void 0,function*(){try{if(!UI())throw new Error("No browser detected.");const g=DI("error_description");if(g)throw new Error(g);const n=DI("provider_token"),I=DI("access_token");if(!I)throw new Error("No access_token detected.");const o=DI("expires_in");if(!o)throw new Error("No expires_in detected.");const i=DI("refresh_token");if(!i)throw new Error("No refresh_token detected.");const l=DI("token_type");if(!l)throw new Error("No token_type detected.");const c=Math.round(Date.now()/1e3)+parseInt(o),{user:A,error:u}=yield this.api.getUser(I);if(u)throw u;const h={provider_token:n,access_token:I,expires_in:parseInt(o),expires_at:c,refresh_token:i,token_type:l,user:A};if(e!=null&&e.storeSession){this._saveSession(h);const b=DI("type");this._notifyAllSubscribers("SIGNED_IN"),b==="recovery"&&this._notifyAllSubscribers("PASSWORD_RECOVERY")}return window.location.hash="",{data:h,error:null}}catch(g){return{data:null,error:g}}})}signOut(){var e;return Zg(this,void 0,void 0,function*(){const g=(e=this.currentSession)===null||e===void 0?void 0:e.access_token;if(this._removeSession(),this._notifyAllSubscribers("SIGNED_OUT"),g){const{error:n}=yield this.api.signOut(g);if(n)return{error:n}}return{error:null}})}onAuthStateChange(e){try{const g=uN(),n={id:g,callback:e,unsubscribe:()=>{this.stateChangeEmitters.delete(g)}};return this.stateChangeEmitters.set(g,n),{data:n,error:null}}catch(g){return{data:null,error:g}}}_handleEmailSignIn(e,g,n={}){var I,o;return Zg(this,void 0,void 0,function*(){try{const{data:i,error:l}=yield this.api.signInWithEmail(e,g,{redirectTo:n.redirectTo});return l||!i?{data:null,user:null,session:null,error:l}:((((I=i==null?void 0:i.user)===null||I===void 0?void 0:I.confirmed_at)||((o=i==null?void 0:i.user)===null||o===void 0?void 0:o.email_confirmed_at))&&(this._saveSession(i),this._notifyAllSubscribers("SIGNED_IN")),{data:i,user:i.user,session:i,error:null})}catch(i){return{data:null,user:null,session:null,error:i}}})}_handlePhoneSignIn(e,g){var n;return Zg(this,void 0,void 0,function*(){try{const{data:I,error:o}=yield this.api.signInWithPhone(e,g);return o||!I?{data:null,user:null,session:null,error:o}:(!((n=I==null?void 0:I.user)===null||n===void 0)&&n.phone_confirmed_at&&(this._saveSession(I),this._notifyAllSubscribers("SIGNED_IN")),{data:I,user:I.user,session:I,error:null})}catch(I){return{data:null,user:null,session:null,error:I}}})}_handleProviderSignIn(e,g={}){const n=this.api.getUrlForProvider(e,{redirectTo:g.redirectTo,scopes:g.scopes});try{return UI()&&(window.location.href=n),{provider:e,url:n,data:null,session:null,user:null,error:null}}catch(I){return n?{provider:e,url:n,data:null,session:null,user:null,error:null}:{data:null,user:null,session:null,error:I}}}_handleOpenIDConnectSignIn({id_token:e,nonce:g,client_id:n,issuer:I,provider:o}){return Zg(this,void 0,void 0,function*(){if(e&&g&&(n&&I||o))try{const{data:i,error:l}=yield this.api.signInWithOpenIDConnect({id_token:e,nonce:g,client_id:n,issuer:I,provider:o});return l||!i?{user:null,session:null,error:l}:(this._saveSession(i),this._notifyAllSubscribers("SIGNED_IN"),{user:i.user,session:i,error:null})}catch(i){return{user:null,session:null,error:i}}throw new Error("You must provide a OpenID Connect provider with your id token and nonce.")})}_recoverSession(){var e;try{const g=UI()&&((e=this.localStorage)===null||e===void 0?void 0:e.getItem(cl));if(!g||typeof g!="string")return null;const n=JSON.parse(g),{currentSession:I,expiresAt:o}=n,i=Math.round(Date.now()/1e3);o>=i&&(I==null?void 0:I.user)&&(this._saveSession(I),this._notifyAllSubscribers("SIGNED_IN"))}catch(g){console.log("error",g)}}_recoverAndRefresh(){return Zg(this,void 0,void 0,function*(){try{const e=UI()&&(yield this.localStorage.getItem(cl));if(!e)return null;const g=JSON.parse(e),{currentSession:n,expiresAt:I}=g,o=Math.round(Date.now()/1e3);if(I<o)if(this.autoRefreshToken&&n.refresh_token){const{error:i}=yield this._callRefreshToken(n.refresh_token);i&&(console.log(i.message),yield this._removeSession())}else this._removeSession();else!n||!n.user?(console.log("Current session is missing data."),this._removeSession()):(this._saveSession(n),this._notifyAllSubscribers("SIGNED_IN"))}catch(e){return console.error(e),null}})}_callRefreshToken(e){var g;return e===void 0&&(e=(g=this.currentSession)===null||g===void 0?void 0:g.refresh_token),Zg(this,void 0,void 0,function*(){try{if(!e)throw new Error("No current session.");const{data:n,error:I}=yield this.api.refreshAccessToken(e);if(I)throw I;if(!n)throw Error("Invalid session data.");return this._saveSession(n),this._notifyAllSubscribers("TOKEN_REFRESHED"),this._notifyAllSubscribers("SIGNED_IN"),{data:n,error:null}}catch(n){return{data:null,error:n}}})}_notifyAllSubscribers(e){this.stateChangeEmitters.forEach(g=>g.callback(e,this.currentSession))}_saveSession(e){this.currentSession=e,this.currentUser=e.user;const g=e.expires_at;if(g){const n=Math.round(Date.now()/1e3),I=g-n,o=I>60?60:.5;this._startAutoRefreshToken((I-o)*1e3)}this.persistSession&&e.expires_at&&this._persistSession(this.currentSession)}_persistSession(e){const g={currentSession:e,expiresAt:e.expires_at};UI()&&this.localStorage.setItem(cl,JSON.stringify(g))}_removeSession(){return Zg(this,void 0,void 0,function*(){this.currentSession=null,this.currentUser=null,this.refreshTokenTimer&&clearTimeout(this.refreshTokenTimer),UI()&&(yield this.localStorage.removeItem(cl))})}_startAutoRefreshToken(e){this.refreshTokenTimer&&clearTimeout(this.refreshTokenTimer),!(e<=0||!this.autoRefreshToken)&&(this.refreshTokenTimer=setTimeout(()=>this._callRefreshToken(),e),typeof this.refreshTokenTimer.unref=="function"&&this.refreshTokenTimer.unref())}_listenForMultiTabEvents(){if(!this.multiTab||!UI()||!(window!=null&&window.addEventListener))return!1;try{window==null||window.addEventListener("storage",e=>{var g;if(e.key===cl){const n=JSON.parse(String(e.newValue));!((g=n==null?void 0:n.currentSession)===null||g===void 0)&&g.access_token?(this._recoverAndRefresh(),this._notifyAllSubscribers("SIGNED_IN")):(this._removeSession(),this._notifyAllSubscribers("SIGNED_OUT"))}})}catch(e){console.error("_listenForMultiTabEvents",e)}}}class pN extends mN{constructor(e){super(e)}}var BN=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};class Tb{constructor(e){this.shouldThrowOnError=!1,Object.assign(this,e);let g;e.fetch?g=e.fetch:typeof fetch=="undefined"?g=Qb:g=fetch,this.fetch=(...n)=>g(...n)}throwOnError(){return this.shouldThrowOnError=!0,this}then(e,g){typeof this.schema=="undefined"||(["GET","HEAD"].includes(this.method)?this.headers["Accept-Profile"]=this.schema:this.headers["Content-Profile"]=this.schema),this.method!=="GET"&&this.method!=="HEAD"&&(this.headers["Content-Type"]="application/json");let n=this.fetch(this.url.toString(),{method:this.method,headers:this.headers,body:JSON.stringify(this.body),signal:this.signal}).then(I=>BN(this,void 0,void 0,function*(){var o,i,l;let r=null,c=null,A=null;if(I.ok){const h=(o=this.headers.Prefer)===null||o===void 0?void 0:o.split(",").includes("return=minimal");if(this.method!=="HEAD"&&!h){const Z=yield I.text();Z&&(this.headers.Accept==="text/csv"?c=Z:c=JSON.parse(Z))}const b=(i=this.headers.Prefer)===null||i===void 0?void 0:i.match(/count=(exact|planned|estimated)/),p=(l=I.headers.get("content-range"))===null||l===void 0?void 0:l.split("/");b&&p&&p.length>1&&(A=parseInt(p[1]))}else{const h=yield I.text();try{r=JSON.parse(h)}catch{r={message:h}}if(r&&this.shouldThrowOnError)throw r}return{error:r,data:c,count:A,status:I.status,statusText:I.statusText,body:c}}));return this.shouldThrowOnError||(n=n.catch(I=>({error:{message:`FetchError: ${I.message}`,details:"",hint:"",code:I.code||""},data:null,body:null,count:null,status:400,statusText:"Bad Request"}))),n.then(e,g)}}class Ub extends Tb{select(e="*"){let g=!1;const n=e.split("").map(I=>/\s/.test(I)&&!g?"":(I==='"'&&(g=!g),I)).join("");return this.url.searchParams.set("select",n),this}order(e,{ascending:g=!0,nullsFirst:n=!1,foreignTable:I}={}){const o=typeof I=="undefined"?"order":`${I}.order`,i=this.url.searchParams.get(o);return this.url.searchParams.set(o,`${i?`${i},`:""}${e}.${g?"asc":"desc"}.${n?"nullsfirst":"nullslast"}`),this}limit(e,{foreignTable:g}={}){const n=typeof g=="undefined"?"limit":`${g}.limit`;return this.url.searchParams.set(n,`${e}`),this}range(e,g,{foreignTable:n}={}){const I=typeof n=="undefined"?"offset":`${n}.offset`,o=typeof n=="undefined"?"limit":`${n}.limit`;return this.url.searchParams.set(I,`${e}`),this.url.searchParams.set(o,`${g-e+1}`),this}abortSignal(e){return this.signal=e,this}single(){return this.headers.Accept="application/vnd.pgrst.object+json",this}maybeSingle(){this.headers.Accept="application/vnd.pgrst.object+json";const e=new Ub(this);return e.then=(g,n)=>this.then(I=>{var o,i;return!((i=(o=I.error)===null||o===void 0?void 0:o.details)===null||i===void 0)&&i.includes("Results contain 0 rows")?g({error:null,data:null,count:I.count,status:200,statusText:"OK",body:null}):g(I)},n),e}csv(){return this.headers.Accept="text/csv",this}}class Ni extends Ub{constructor(){super(...arguments);this.cs=this.contains,this.cd=this.containedBy,this.sl=this.rangeLt,this.sr=this.rangeGt,this.nxl=this.rangeGte,this.nxr=this.rangeLte,this.adj=this.rangeAdjacent,this.ov=this.overlaps}not(e,g,n){return this.url.searchParams.append(`${e}`,`not.${g}.${n}`),this}or(e,{foreignTable:g}={}){const n=typeof g=="undefined"?"or":`${g}.or`;return this.url.searchParams.append(n,`(${e})`),this}eq(e,g){return this.url.searchParams.append(`${e}`,`eq.${g}`),this}neq(e,g){return this.url.searchParams.append(`${e}`,`neq.${g}`),this}gt(e,g){return this.url.searchParams.append(`${e}`,`gt.${g}`),this}gte(e,g){return this.url.searchParams.append(`${e}`,`gte.${g}`),this}lt(e,g){return this.url.searchParams.append(`${e}`,`lt.${g}`),this}lte(e,g){return this.url.searchParams.append(`${e}`,`lte.${g}`),this}like(e,g){return this.url.searchParams.append(`${e}`,`like.${g}`),this}ilike(e,g){return this.url.searchParams.append(`${e}`,`ilike.${g}`),this}is(e,g){return this.url.searchParams.append(`${e}`,`is.${g}`),this}in(e,g){const n=g.map(I=>typeof I=="string"&&new RegExp("[,()]").test(I)?`"${I}"`:`${I}`).join(",");return this.url.searchParams.append(`${e}`,`in.(${n})`),this}contains(e,g){return typeof g=="string"?this.url.searchParams.append(`${e}`,`cs.${g}`):Array.isArray(g)?this.url.searchParams.append(`${e}`,`cs.{${g.join(",")}}`):this.url.searchParams.append(`${e}`,`cs.${JSON.stringify(g)}`),this}containedBy(e,g){return typeof g=="string"?this.url.searchParams.append(`${e}`,`cd.${g}`):Array.isArray(g)?this.url.searchParams.append(`${e}`,`cd.{${g.join(",")}}`):this.url.searchParams.append(`${e}`,`cd.${JSON.stringify(g)}`),this}rangeLt(e,g){return this.url.searchParams.append(`${e}`,`sl.${g}`),this}rangeGt(e,g){return this.url.searchParams.append(`${e}`,`sr.${g}`),this}rangeGte(e,g){return this.url.searchParams.append(`${e}`,`nxl.${g}`),this}rangeLte(e,g){return this.url.searchParams.append(`${e}`,`nxr.${g}`),this}rangeAdjacent(e,g){return this.url.searchParams.append(`${e}`,`adj.${g}`),this}overlaps(e,g){return typeof g=="string"?this.url.searchParams.append(`${e}`,`ov.${g}`):this.url.searchParams.append(`${e}`,`ov.{${g.join(",")}}`),this}textSearch(e,g,{config:n,type:I=null}={}){let o="";I==="plain"?o="pl":I==="phrase"?o="ph":I==="websearch"&&(o="w");const i=n===void 0?"":`(${n})`;return this.url.searchParams.append(`${e}`,`${o}fts${i}.${g}`),this}fts(e,g,{config:n}={}){const I=typeof n=="undefined"?"":`(${n})`;return this.url.searchParams.append(`${e}`,`fts${I}.${g}`),this}plfts(e,g,{config:n}={}){const I=typeof n=="undefined"?"":`(${n})`;return this.url.searchParams.append(`${e}`,`plfts${I}.${g}`),this}phfts(e,g,{config:n}={}){const I=typeof n=="undefined"?"":`(${n})`;return this.url.searchParams.append(`${e}`,`phfts${I}.${g}`),this}wfts(e,g,{config:n}={}){const I=typeof n=="undefined"?"":`(${n})`;return this.url.searchParams.append(`${e}`,`wfts${I}.${g}`),this}filter(e,g,n){return this.url.searchParams.append(`${e}`,`${g}.${n}`),this}match(e){return Object.keys(e).forEach(g=>{this.url.searchParams.append(`${g}`,`eq.${e[g]}`)}),this}}class Dv extends Tb{constructor(e,{headers:g={},schema:n,fetch:I}={}){super({fetch:I});this.url=new URL(e),this.headers=Object.assign({},g),this.schema=n}select(e="*",{head:g=!1,count:n=null}={}){this.method="GET";let I=!1;const o=e.split("").map(i=>/\s/.test(i)&&!I?"":(i==='"'&&(I=!I),i)).join("");return this.url.searchParams.set("select",o),n&&(this.headers.Prefer=`count=${n}`),g&&(this.method="HEAD"),new Ni(this)}insert(e,{upsert:g=!1,onConflict:n,returning:I="representation",count:o=null}={}){this.method="POST";const i=[`return=${I}`];if(g&&i.push("resolution=merge-duplicates"),g&&n!==void 0&&this.url.searchParams.set("on_conflict",n),this.body=e,o&&i.push(`count=${o}`),this.headers.Prefer&&i.unshift(this.headers.Prefer),this.headers.Prefer=i.join(","),Array.isArray(e)){const l=e.reduce((r,c)=>r.concat(Object.keys(c)),[]);if(l.length>0){const r=[...new Set(l)].map(c=>`"${c}"`);this.url.searchParams.set("columns",r.join(","))}}return new Ni(this)}upsert(e,{onConflict:g,returning:n="representation",count:I=null,ignoreDuplicates:o=!1}={}){this.method="POST";const i=[`resolution=${o?"ignore":"merge"}-duplicates`,`return=${n}`];return g!==void 0&&this.url.searchParams.set("on_conflict",g),this.body=e,I&&i.push(`count=${I}`),this.headers.Prefer&&i.unshift(this.headers.Prefer),this.headers.Prefer=i.join(","),new Ni(this)}update(e,{returning:g="representation",count:n=null}={}){this.method="PATCH";const I=[`return=${g}`];return this.body=e,n&&I.push(`count=${n}`),this.headers.Prefer&&I.unshift(this.headers.Prefer),this.headers.Prefer=I.join(","),new Ni(this)}delete({returning:e="representation",count:g=null}={}){this.method="DELETE";const n=[`return=${e}`];return g&&n.push(`count=${g}`),this.headers.Prefer&&n.unshift(this.headers.Prefer),this.headers.Prefer=n.join(","),new Ni(this)}}class ZN extends Tb{constructor(e,{headers:g={},schema:n,fetch:I}={}){super({fetch:I});this.url=new URL(e),this.headers=Object.assign({},g),this.schema=n}rpc(e,{head:g=!1,count:n=null}={}){return g?(this.method="HEAD",e&&Object.entries(e).forEach(([I,o])=>{this.url.searchParams.append(I,o)})):(this.method="POST",this.body=e),n&&(this.headers.Prefer!==void 0?this.headers.Prefer+=`,count=${n}`:this.headers.Prefer=`count=${n}`),new Ni(this)}}const yN="0.36.2",fN={"X-Client-Info":`postgrest-js/${yN}`};class vN{constructor(e,{headers:g={},schema:n,fetch:I}={}){this.url=e,this.headers=Object.assign(Object.assign({},fN),g),this.schema=n,this.fetch=I}auth(e){return this.headers.Authorization=`Bearer ${e}`,this}from(e){const g=`${this.url}/${e}`;return new Dv(g,{headers:this.headers,schema:this.schema,fetch:this.fetch})}rpc(e,g,{head:n=!1,count:I=null}={}){const o=`${this.url}/rpc/${e}`;return new ZN(o,{headers:this.headers,schema:this.schema,fetch:this.fetch}).rpc(g,{head:n,count:I})}}var Oe;(function(t){t.abstime="abstime",t.bool="bool",t.date="date",t.daterange="daterange",t.float4="float4",t.float8="float8",t.int2="int2",t.int4="int4",t.int4range="int4range",t.int8="int8",t.int8range="int8range",t.json="json",t.jsonb="jsonb",t.money="money",t.numeric="numeric",t.oid="oid",t.reltime="reltime",t.text="text",t.time="time",t.timestamp="timestamp",t.timestamptz="timestamptz",t.timetz="timetz",t.tsrange="tsrange",t.tstzrange="tstzrange"})(Oe||(Oe={}));const m0=(t,e,g={})=>{var n;const I=(n=g.skipTypes)!==null&&n!==void 0?n:[];return Object.keys(e).reduce((o,i)=>(o[i]=WN(i,t,e,I),o),{})},WN=(t,e,g,n)=>{const I=e.find(l=>l.name===t),o=I==null?void 0:I.type,i=g[t];return o&&!n.includes(o)?jv(o,i):Ah(i)},jv=(t,e)=>{if(t.charAt(0)==="_"){const g=t.slice(1,t.length);return XN(e,g)}switch(t){case Oe.bool:return wN(e);case Oe.float4:case Oe.float8:case Oe.int2:case Oe.int4:case Oe.int8:case Oe.numeric:case Oe.oid:return VN(e);case Oe.json:case Oe.jsonb:return RN(e);case Oe.timestamp:return YN(e);case Oe.abstime:case Oe.date:case Oe.daterange:case Oe.int4range:case Oe.int8range:case Oe.money:case Oe.reltime:case Oe.text:case Oe.time:case Oe.timestamptz:case Oe.timetz:case Oe.tsrange:case Oe.tstzrange:return Ah(e);default:return Ah(e)}},Ah=t=>t,wN=t=>{switch(t){case"t":return!0;case"f":return!1;default:return t}},VN=t=>{if(typeof t=="string"){const e=parseFloat(t);if(!Number.isNaN(e))return e}return t},RN=t=>{if(typeof t=="string")try{return JSON.parse(t)}catch(e){return console.log(`JSON parse error: ${e}`),t}return t},XN=(t,e)=>{if(typeof t!="string")return t;const g=t.length-1,n=t[g];if(t[0]==="{"&&n==="}"){let o;const i=t.slice(1,g);try{o=JSON.parse("["+i+"]")}catch{o=i?i.split(","):[]}return o.map(l=>jv(e,l))}return t},YN=t=>typeof t=="string"?t.replace(" ","T"):t,KN="1.3.6",SN={"X-Client-Info":`realtime-js/${KN}`},HN="1.0.0",Ov=1e4,NN=1e3;var Kl;(function(t){t[t.connecting=0]="connecting",t[t.open=1]="open",t[t.closing=2]="closing",t[t.closed=3]="closed"})(Kl||(Kl={}));var yg;(function(t){t.closed="closed",t.errored="errored",t.joined="joined",t.joining="joining",t.leaving="leaving"})(yg||(yg={}));var Bn;(function(t){t.close="phx_close",t.error="phx_error",t.join="phx_join",t.reply="phx_reply",t.leave="phx_leave",t.access_token="access_token"})(Bn||(Bn={}));var ah;(function(t){t.websocket="websocket"})(ah||(ah={}));class Pv{constructor(e,g){this.callback=e,this.timerCalc=g,this.timer=void 0,this.tries=0,this.callback=e,this.timerCalc=g}reset(){this.tries=0,clearTimeout(this.timer)}scheduleTimeout(){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.tries=this.tries+1,this.callback()},this.timerCalc(this.tries+1))}}class Uu{constructor(e,g,n={},I=Ov){this.channel=e,this.event=g,this.payload=n,this.timeout=I,this.sent=!1,this.timeoutTimer=void 0,this.ref="",this.receivedResp=null,this.recHooks=[],this.refEvent=null}resend(e){this.timeout=e,this._cancelRefEvent(),this.ref="",this.refEvent=null,this.receivedResp=null,this.sent=!1,this.send()}send(){this._hasReceived("timeout")||(this.startTimeout(),this.sent=!0,this.channel.socket.push({topic:this.channel.topic,event:this.event,payload:this.payload,ref:this.ref}))}updatePayload(e){this.payload=Object.assign(Object.assign({},this.payload),e)}receive(e,g){var n;return this._hasReceived(e)&&g((n=this.receivedResp)===null||n===void 0?void 0:n.response),this.recHooks.push({status:e,callback:g}),this}startTimeout(){this.timeoutTimer||(this.ref=this.channel.socket.makeRef(),this.refEvent=this.channel.replyEventName(this.ref),this.channel.on(this.refEvent,e=>{this._cancelRefEvent(),this._cancelTimeout(),this.receivedResp=e,this._matchReceive(e)}),this.timeoutTimer=setTimeout(()=>{this.trigger("timeout",{})},this.timeout))}trigger(e,g){this.refEvent&&this.channel.trigger(this.refEvent,{status:e,response:g})}destroy(){this._cancelRefEvent(),this._cancelTimeout()}_cancelRefEvent(){!this.refEvent||this.channel.off(this.refEvent)}_cancelTimeout(){clearTimeout(this.timeoutTimer),this.timeoutTimer=void 0}_matchReceive({status:e,response:g}){this.recHooks.filter(n=>n.status===e).forEach(n=>n.callback(g))}_hasReceived(e){return this.receivedResp&&this.receivedResp.status===e}}class FN{constructor(e,g={},n){this.topic=e,this.params=g,this.socket=n,this.bindings=[],this.state=yg.closed,this.joinedOnce=!1,this.pushBuffer=[],this.timeout=this.socket.timeout,this.joinPush=new Uu(this,Bn.join,this.params,this.timeout),this.rejoinTimer=new Pv(()=>this.rejoinUntilConnected(),this.socket.reconnectAfterMs),this.joinPush.receive("ok",()=>{this.state=yg.joined,this.rejoinTimer.reset(),this.pushBuffer.forEach(I=>I.send()),this.pushBuffer=[]}),this.onClose(()=>{this.rejoinTimer.reset(),this.socket.log("channel",`close ${this.topic} ${this.joinRef()}`),this.state=yg.closed,this.socket.remove(this)}),this.onError(I=>{this.isLeaving()||this.isClosed()||(this.socket.log("channel",`error ${this.topic}`,I),this.state=yg.errored,this.rejoinTimer.scheduleTimeout())}),this.joinPush.receive("timeout",()=>{!this.isJoining()||(this.socket.log("channel",`timeout ${this.topic}`,this.joinPush.timeout),this.state=yg.errored,this.rejoinTimer.scheduleTimeout())}),this.on(Bn.reply,(I,o)=>{this.trigger(this.replyEventName(o),I)})}rejoinUntilConnected(){this.rejoinTimer.scheduleTimeout(),this.socket.isConnected()&&this.rejoin()}subscribe(e=this.timeout){if(this.joinedOnce)throw"tried to subscribe multiple times. 'subscribe' can only be called a single time per channel instance";return this.joinedOnce=!0,this.rejoin(e),this.joinPush}onClose(e){this.on(Bn.close,e)}onError(e){this.on(Bn.error,g=>e(g))}on(e,g){this.bindings.push({event:e,callback:g})}off(e){this.bindings=this.bindings.filter(g=>g.event!==e)}canPush(){return this.socket.isConnected()&&this.isJoined()}push(e,g,n=this.timeout){if(!this.joinedOnce)throw`tried to push '${e}' to '${this.topic}' before joining. Use channel.subscribe() before pushing events`;let I=new Uu(this,e,g,n);return this.canPush()?I.send():(I.startTimeout(),this.pushBuffer.push(I)),I}updateJoinPayload(e){this.joinPush.updatePayload(e)}unsubscribe(e=this.timeout){this.state=yg.leaving;let g=()=>{this.socket.log("channel",`leave ${this.topic}`),this.trigger(Bn.close,"leave",this.joinRef())};this.joinPush.destroy();let n=new Uu(this,Bn.leave,{},e);return n.receive("ok",()=>g()).receive("timeout",()=>g()),n.send(),this.canPush()||n.trigger("ok",{}),n}onMessage(e,g,n){return g}isMember(e){return this.topic===e}joinRef(){return this.joinPush.ref}rejoin(e=this.timeout){this.isLeaving()||(this.socket.leaveOpenTopic(this.topic),this.state=yg.joining,this.joinPush.resend(e))}trigger(e,g,n){let{close:I,error:o,leave:i,join:l}=Bn;if(n&&[I,o,i,l].indexOf(e)>=0&&n!==this.joinRef())return;let c=this.onMessage(e,g,n);if(g&&!c)throw"channel onMessage callbacks must return the payload, modified or unmodified";this.bindings.filter(A=>A.event==="*"?e===(g==null?void 0:g.type):A.event===e).map(A=>A.callback(c,n))}replyEventName(e){return`chan_reply_${e}`}isClosed(){return this.state===yg.closed}isErrored(){return this.state===yg.errored}isJoined(){return this.state===yg.joined}isJoining(){return this.state===yg.joining}isLeaving(){return this.state===yg.leaving}}const kN="websocket",zN="Websocket Client & Server Library implementing the WebSocket protocol as specified in RFC 6455.",xN=["websocket","websockets","socket","networking","comet","push","RFC-6455","realtime","server","client"],LN="Brian McKelvey <theturtle32@gmail.com> (https://github.com/theturtle32)",JN=["I\xF1aki Baz Castillo <ibc@aliax.net> (http://dev.sipdoc.net)"],MN="1.0.34",EN={type:"git",url:"https://github.com/theturtle32/WebSocket-Node.git"},QN="https://github.com/theturtle32/WebSocket-Node",TN={node:">=4.0.0"},UN={bufferutil:"^4.0.1",debug:"^2.2.0","es5-ext":"^0.10.50","typedarray-to-buffer":"^3.1.5","utf-8-validate":"^5.0.2",yaeti:"^0.0.6"},DN={"buffer-equal":"^1.0.0",gulp:"^4.0.2","gulp-jshint":"^2.0.4","jshint-stylish":"^2.2.1",jshint:"^2.0.0",tape:"^4.9.1"},jN={verbose:!1},ON={test:"tape test/unit/*.js",gulp:"gulp"},PN="index",_N={lib:"./lib"},qN="lib/browser.js",$N="Apache-2.0";var eF={name:kN,description:zN,keywords:xN,author:LN,contributors:JN,version:MN,repository:EN,homepage:QN,engines:TN,dependencies:UN,devDependencies:DN,config:jN,scripts:ON,main:PN,directories:_N,browser:qN,license:$N},tF=eF.version,zo;if(typeof globalThis=="object")zo=globalThis;else try{zo=require("es5-ext/global")}catch{}finally{if(!zo&&typeof window!="undefined"&&(zo=window),!zo)throw new Error("Could not determine global this")}var Is=zo.WebSocket||zo.MozWebSocket,gF=tF;function _v(t,e){var g;return e?g=new Is(t,e):g=new Is(t),g}Is&&["CONNECTING","OPEN","CLOSING","CLOSED"].forEach(function(t){Object.defineProperty(_v,t,{get:function(){return Is[t]}})});var nF={w3cwebsocket:Is?_v:null,version:gF};class IF{constructor(){this.HEADER_LENGTH=1}decode(e,g){return e.constructor===ArrayBuffer?g(this._binaryDecode(e)):g(typeof e=="string"?JSON.parse(e):{})}_binaryDecode(e){const g=new DataView(e),n=new TextDecoder;return this._decodeBroadcast(e,g,n)}_decodeBroadcast(e,g,n){const I=g.getUint8(1),o=g.getUint8(2);let i=this.HEADER_LENGTH+2;const l=n.decode(e.slice(i,i+I));i=i+I;const r=n.decode(e.slice(i,i+o));i=i+o;const c=JSON.parse(n.decode(e.slice(i,e.byteLength)));return{ref:null,topic:l,event:r,payload:c}}}var oF=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};const iF=()=>{};class CF{constructor(e,g){this.accessToken=null,this.channels=[],this.endPoint="",this.headers=SN,this.params={},this.timeout=Ov,this.transport=nF.w3cwebsocket,this.heartbeatIntervalMs=3e4,this.longpollerTimeout=2e4,this.heartbeatTimer=void 0,this.pendingHeartbeatRef=null,this.ref=0,this.logger=iF,this.conn=null,this.sendBuffer=[],this.serializer=new IF,this.stateChangeCallbacks={open:[],close:[],error:[],message:[]},this.endPoint=`${e}/${ah.websocket}`,g!=null&&g.params&&(this.params=g.params),g!=null&&g.headers&&(this.headers=Object.assign(Object.assign({},this.headers),g.headers)),g!=null&&g.timeout&&(this.timeout=g.timeout),g!=null&&g.logger&&(this.logger=g.logger),g!=null&&g.transport&&(this.transport=g.transport),g!=null&&g.heartbeatIntervalMs&&(this.heartbeatIntervalMs=g.heartbeatIntervalMs),g!=null&&g.longpollerTimeout&&(this.longpollerTimeout=g.longpollerTimeout),this.reconnectAfterMs=g!=null&&g.reconnectAfterMs?g.reconnectAfterMs:n=>[1e3,2e3,5e3,1e4][n-1]||1e4,this.encode=g!=null&&g.encode?g.encode:(n,I)=>I(JSON.stringify(n)),this.decode=g!=null&&g.decode?g.decode:this.serializer.decode.bind(this.serializer),this.reconnectTimer=new Pv(()=>oF(this,void 0,void 0,function*(){yield this.disconnect(),this.connect()}),this.reconnectAfterMs)}connect(){this.conn||(this.conn=new this.transport(this.endPointURL(),[],null,this.headers),this.conn&&(this.conn.binaryType="arraybuffer",this.conn.onopen=()=>this._onConnOpen(),this.conn.onerror=e=>this._onConnError(e),this.conn.onmessage=e=>this.onConnMessage(e),this.conn.onclose=e=>this._onConnClose(e)))}disconnect(e,g){return new Promise((n,I)=>{try{this.conn&&(this.conn.onclose=function(){},e?this.conn.close(e,g||""):this.conn.close(),this.conn=null,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.reconnectTimer.reset()),n({error:null,data:!0})}catch(o){n({error:o,data:!1})}})}log(e,g,n){this.logger(e,g,n)}onOpen(e){this.stateChangeCallbacks.open.push(e)}onClose(e){this.stateChangeCallbacks.close.push(e)}onError(e){this.stateChangeCallbacks.error.push(e)}onMessage(e){this.stateChangeCallbacks.message.push(e)}connectionState(){switch(this.conn&&this.conn.readyState){case Kl.connecting:return"connecting";case Kl.open:return"open";case Kl.closing:return"closing";default:return"closed"}}isConnected(){return this.connectionState()==="open"}remove(e){this.channels=this.channels.filter(g=>g.joinRef()!==e.joinRef())}channel(e,g={}){let n=new FN(e,g,this);return this.channels.push(n),n}push(e){let{topic:g,event:n,payload:I,ref:o}=e,i=()=>{this.encode(e,l=>{var r;(r=this.conn)===null||r===void 0||r.send(l)})};this.log("push",`${g} ${n} (${o})`,I),this.isConnected()?i():this.sendBuffer.push(i)}onConnMessage(e){this.decode(e.data,g=>{let{topic:n,event:I,payload:o,ref:i}=g;(i&&i===this.pendingHeartbeatRef||I===(o==null?void 0:o.type))&&(this.pendingHeartbeatRef=null),this.log("receive",`${o.status||""} ${n} ${I} ${i&&"("+i+")"||""}`,o),this.channels.filter(l=>l.isMember(n)).forEach(l=>l.trigger(I,o,i)),this.stateChangeCallbacks.message.forEach(l=>l(g))})}endPointURL(){return this._appendParams(this.endPoint,Object.assign({},this.params,{vsn:HN}))}makeRef(){let e=this.ref+1;return e===this.ref?this.ref=0:this.ref=e,this.ref.toString()}setAuth(e){this.accessToken=e;try{this.channels.forEach(g=>{e&&g.updateJoinPayload({user_token:e}),g.joinedOnce&&g.isJoined()&&g.push(Bn.access_token,{access_token:e})})}catch(g){console.log("setAuth error",g)}}leaveOpenTopic(e){let g=this.channels.find(n=>n.topic===e&&(n.isJoined()||n.isJoining()));g&&(this.log("transport",`leaving duplicate topic "${e}"`),g.unsubscribe())}_onConnOpen(){this.log("transport",`connected to ${this.endPointURL()}`),this._flushSendBuffer(),this.reconnectTimer.reset(),this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=setInterval(()=>this._sendHeartbeat(),this.heartbeatIntervalMs),this.stateChangeCallbacks.open.forEach(e=>e())}_onConnClose(e){this.log("transport","close",e),this._triggerChanError(),this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.reconnectTimer.scheduleTimeout(),this.stateChangeCallbacks.close.forEach(g=>g(e))}_onConnError(e){this.log("transport",e.message),this._triggerChanError(),this.stateChangeCallbacks.error.forEach(g=>g(e))}_triggerChanError(){this.channels.forEach(e=>e.trigger(Bn.error))}_appendParams(e,g){if(Object.keys(g).length===0)return e;const n=e.match(/\?/)?"&":"?",I=new URLSearchParams(g);return`${e}${n}${I}`}_flushSendBuffer(){this.isConnected()&&this.sendBuffer.length>0&&(this.sendBuffer.forEach(e=>e()),this.sendBuffer=[])}_sendHeartbeat(){var e;if(!!this.isConnected()){if(this.pendingHeartbeatRef){this.pendingHeartbeatRef=null,this.log("transport","heartbeat timeout. Attempting to re-establish connection"),(e=this.conn)===null||e===void 0||e.close(NN,"hearbeat timeout");return}this.pendingHeartbeatRef=this.makeRef(),this.push({topic:"phoenix",event:"heartbeat",payload:{},ref:this.pendingHeartbeatRef}),this.setAuth(this.accessToken)}}}class lF{constructor(e,g,n,I){const o={},i=I==="*"?`realtime:${n}`:`realtime:${n}:${I}`,l=g.Authorization.split(" ")[1];l&&(o.user_token=l),this.subscription=e.channel(i,o)}getPayloadRecords(e){const g={new:{},old:{}};return(e.type==="INSERT"||e.type==="UPDATE")&&(g.new=m0(e.columns,e.record)),(e.type==="UPDATE"||e.type==="DELETE")&&(g.old=m0(e.columns,e.old_record)),g}on(e,g){return this.subscription.on(e,n=>{let I={schema:n.schema,table:n.table,commit_timestamp:n.commit_timestamp,eventType:n.type,new:{},old:{},errors:n.errors};I=Object.assign(Object.assign({},I),this.getPayloadRecords(n)),g(I)}),this}subscribe(e=()=>{}){return this.subscription.onError(g=>e("SUBSCRIPTION_ERROR",g)),this.subscription.onClose(()=>e("CLOSED")),this.subscription.subscribe().receive("ok",()=>e("SUBSCRIBED")).receive("error",g=>e("SUBSCRIPTION_ERROR",g)).receive("timeout",()=>e("RETRYING_AFTER_TIMEOUT")),this.subscription}}class sF extends Dv{constructor(e,{headers:g={},schema:n,realtime:I,table:o,fetch:i}){super(e,{headers:g,schema:n,fetch:i});this._subscription=null,this._realtime=I,this._headers=g,this._schema=n,this._table=o}on(e,g){return this._realtime.isConnected()||this._realtime.connect(),this._subscription||(this._subscription=new lF(this._realtime,this._headers,this._schema,this._table)),this._subscription.on(e,g)}}const rF="0.0.0",cF={"X-Client-Info":`storage-js/${rF}`};var ms=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};const AF=t=>t.msg||t.message||t.error_description||t.error||JSON.stringify(t),aF=(t,e)=>{if(typeof t.json!="function")return e(t);t.json().then(g=>e({message:AF(g),status:(t==null?void 0:t.status)||500}))},uF=(t,e,g,n)=>{const I={method:t,headers:(e==null?void 0:e.headers)||{}};return t==="GET"?I:(I.headers=Object.assign({"Content-Type":"application/json"},e==null?void 0:e.headers),I.body=JSON.stringify(n),Object.assign(Object.assign({},I),g))};function HA(t,e,g,n,I,o){return ms(this,void 0,void 0,function*(){return new Promise((i,l)=>{t(g,uF(e,n,I,o)).then(r=>{if(!r.ok)throw r;return n!=null&&n.noResolveJson?i(r):r.json()}).then(r=>i(r)).catch(r=>aF(r,l))})})}function uh(t,e,g,n){return ms(this,void 0,void 0,function*(){return HA(t,"GET",e,g,n)})}function xo(t,e,g,n,I){return ms(this,void 0,void 0,function*(){return HA(t,"POST",e,n,I,g)})}function dF(t,e,g,n,I){return ms(this,void 0,void 0,function*(){return HA(t,"PUT",e,n,I,g)})}function qv(t,e,g,n,I){return ms(this,void 0,void 0,function*(){return HA(t,"DELETE",e,n,I,g)})}const $v=t=>{let e;return t?e=t:typeof fetch=="undefined"?e=Qb:e=fetch,(...g)=>e(...g)};var Ri=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};class hF{constructor(e,g={},n){this.url=e,this.headers=Object.assign(Object.assign({},cF),g),this.fetch=$v(n)}listBuckets(){return Ri(this,void 0,void 0,function*(){try{return{data:yield uh(this.fetch,`${this.url}/bucket`,{headers:this.headers}),error:null}}catch(e){return{data:null,error:e}}})}getBucket(e){return Ri(this,void 0,void 0,function*(){try{return{data:yield uh(this.fetch,`${this.url}/bucket/${e}`,{headers:this.headers}),error:null}}catch(g){return{data:null,error:g}}})}createBucket(e,g={public:!1}){return Ri(this,void 0,void 0,function*(){try{return{data:(yield xo(this.fetch,`${this.url}/bucket`,{id:e,name:e,public:g.public},{headers:this.headers})).name,error:null}}catch(n){return{data:null,error:n}}})}updateBucket(e,g){return Ri(this,void 0,void 0,function*(){try{return{data:yield dF(this.fetch,`${this.url}/bucket/${e}`,{id:e,name:e,public:g.public},{headers:this.headers}),error:null}}catch(n){return{data:null,error:n}}})}emptyBucket(e){return Ri(this,void 0,void 0,function*(){try{return{data:yield xo(this.fetch,`${this.url}/bucket/${e}/empty`,{},{headers:this.headers}),error:null}}catch(g){return{data:null,error:g}}})}deleteBucket(e){return Ri(this,void 0,void 0,function*(){try{return{data:yield qv(this.fetch,`${this.url}/bucket/${e}`,{},{headers:this.headers}),error:null}}catch(g){return{data:null,error:g}}})}}var Jn=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};const bF={limit:100,offset:0,sortBy:{column:"name",order:"asc"}},GF={cacheControl:"3600",contentType:"text/plain;charset=UTF-8",upsert:!1};class mF{constructor(e,g={},n,I){this.url=e,this.headers=g,this.bucketId=n,this.fetch=$v(I)}uploadOrUpdate(e,g,n,I){return Jn(this,void 0,void 0,function*(){try{let o;const i=Object.assign(Object.assign({},GF),I),l=Object.assign(Object.assign({},this.headers),e==="POST"&&{"x-upsert":String(i.upsert)});typeof Blob!="undefined"&&n instanceof Blob?(o=new FormData,o.append("cacheControl",i.cacheControl),o.append("",n)):typeof FormData!="undefined"&&n instanceof FormData?(o=n,o.append("cacheControl",i.cacheControl)):(o=n,l["cache-control"]=`max-age=${i.cacheControl}`,l["content-type"]=i.contentType);const r=this._removeEmptyFolders(g),c=this._getFinalPath(r),A=yield this.fetch(`${this.url}/object/${c}`,{method:e,body:o,headers:l});if(A.ok)return{data:{Key:c},error:null};{const u=yield A.json();return{data:null,error:u}}}catch(o){return{data:null,error:o}}})}upload(e,g,n){return Jn(this,void 0,void 0,function*(){return this.uploadOrUpdate("POST",e,g,n)})}update(e,g,n){return Jn(this,void 0,void 0,function*(){return this.uploadOrUpdate("PUT",e,g,n)})}move(e,g){return Jn(this,void 0,void 0,function*(){try{return{data:yield xo(this.fetch,`${this.url}/object/move`,{bucketId:this.bucketId,sourceKey:e,destinationKey:g},{headers:this.headers}),error:null}}catch(n){return{data:null,error:n}}})}copy(e,g){return Jn(this,void 0,void 0,function*(){try{return{data:yield xo(this.fetch,`${this.url}/object/copy`,{bucketId:this.bucketId,sourceKey:e,destinationKey:g},{headers:this.headers}),error:null}}catch(n){return{data:null,error:n}}})}createSignedUrl(e,g){return Jn(this,void 0,void 0,function*(){try{const n=this._getFinalPath(e);let I=yield xo(this.fetch,`${this.url}/object/sign/${n}`,{expiresIn:g},{headers:this.headers});const o=`${this.url}${I.signedURL}`;return I={signedURL:o},{data:I,error:null,signedURL:o}}catch(n){return{data:null,error:n,signedURL:null}}})}createSignedUrls(e,g){return Jn(this,void 0,void 0,function*(){try{return{data:(yield xo(this.fetch,`${this.url}/object/sign/${this.bucketId}`,{expiresIn:g,paths:e},{headers:this.headers})).map(I=>Object.assign(Object.assign({},I),{signedURL:I.signedURL?`${this.url}${I.signedURL}`:null})),error:null}}catch(n){return{data:null,error:n}}})}download(e){return Jn(this,void 0,void 0,function*(){try{const g=this._getFinalPath(e);return{data:yield(yield uh(this.fetch,`${this.url}/object/${g}`,{headers:this.headers,noResolveJson:!0})).blob(),error:null}}catch(g){return{data:null,error:g}}})}getPublicUrl(e){try{const g=this._getFinalPath(e),n=`${this.url}/object/public/${g}`;return{data:{publicURL:n},error:null,publicURL:n}}catch(g){return{data:null,error:g,publicURL:null}}}remove(e){return Jn(this,void 0,void 0,function*(){try{return{data:yield qv(this.fetch,`${this.url}/object/${this.bucketId}`,{prefixes:e},{headers:this.headers}),error:null}}catch(g){return{data:null,error:g}}})}list(e,g,n){return Jn(this,void 0,void 0,function*(){try{const I=Object.assign(Object.assign(Object.assign({},bF),g),{prefix:e||""});return{data:yield xo(this.fetch,`${this.url}/object/list/${this.bucketId}`,I,{headers:this.headers},n),error:null}}catch(I){return{data:null,error:I}}})}_getFinalPath(e){return`${this.bucketId}/${e}`}_removeEmptyFolders(e){return e.replace(/^\/|\/$/g,"").replace(/\/+/g,"/")}}class pF extends hF{constructor(e,g={},n){super(e,g,n)}from(e){return new mF(this.url,this.headers,e,this.fetch)}}var Du=globalThis&&globalThis.__awaiter||function(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})};const BF={schema:"public",autoRefreshToken:!0,persistSession:!0,detectSessionInUrl:!0,multiTab:!0,headers:Uv};class ZF{constructor(e,g,n){if(this.supabaseUrl=e,this.supabaseKey=g,!e)throw new Error("supabaseUrl is required.");if(!g)throw new Error("supabaseKey is required.");const I=tN(e),o=Object.assign(Object.assign({},BF),n);this.restUrl=`${I}/rest/v1`,this.realtimeUrl=`${I}/realtime/v1`.replace("http","ws"),this.authUrl=`${I}/auth/v1`,this.storageUrl=`${I}/storage/v1`,this.schema=o.schema,this.multiTab=o.multiTab,this.fetch=o.fetch,this.headers=Object.assign(Object.assign({},Uv),n==null?void 0:n.headers),this.auth=this._initSupabaseAuthClient(o),this.realtime=this._initRealtimeClient(Object.assign({headers:this.headers},o.realtime)),this._listenForAuthEvents(),this._listenForMultiTabEvents()}get storage(){return new pF(this.storageUrl,this._getAuthHeaders(),this.fetch)}from(e){const g=`${this.restUrl}/${e}`;return new sF(g,{headers:this._getAuthHeaders(),schema:this.schema,realtime:this.realtime,table:e,fetch:this.fetch})}rpc(e,g,{head:n=!1,count:I=null}={}){return this._initPostgRESTClient().rpc(e,g,{head:n,count:I})}removeAllSubscriptions(){return Du(this,void 0,void 0,function*(){const e=this.getSubscriptions().slice(),g=e.map(I=>this.removeSubscription(I));return(yield Promise.all(g)).map(({error:I},o)=>({data:{subscription:e[o]},error:I}))})}removeSubscription(e){return Du(this,void 0,void 0,function*(){const{error:g}=yield this._closeSubscription(e),n=this.getSubscriptions(),I=n.filter(o=>o.isJoined()).length;return n.length===0&&(yield this.realtime.disconnect()),{data:{openSubscriptions:I},error:g}})}_closeSubscription(e){return Du(this,void 0,void 0,function*(){let g=null;if(!e.isClosed()){const{error:n}=yield this._unsubscribeSubscription(e);g=n}return this.realtime.remove(e),{error:g}})}_unsubscribeSubscription(e){return new Promise(g=>{e.unsubscribe().receive("ok",()=>g({error:null})).receive("error",n=>g({error:n})).receive("timeout",()=>g({error:new Error("timed out")}))})}getSubscriptions(){return this.realtime.channels}_initSupabaseAuthClient({autoRefreshToken:e,persistSession:g,detectSessionInUrl:n,localStorage:I,headers:o,fetch:i}){const l={Authorization:`Bearer ${this.supabaseKey}`,apikey:`${this.supabaseKey}`};return new pN({url:this.authUrl,headers:Object.assign(Object.assign({},o),l),autoRefreshToken:e,persistSession:g,detectSessionInUrl:n,localStorage:I,fetch:i})}_initRealtimeClient(e){return new CF(this.realtimeUrl,Object.assign(Object.assign({},e),{params:Object.assign(Object.assign({},e==null?void 0:e.params),{apikey:this.supabaseKey})}))}_initPostgRESTClient(){return new vN(this.restUrl,{headers:this._getAuthHeaders(),schema:this.schema,fetch:this.fetch})}_getAuthHeaders(){var e,g;const n=this.headers,I=(g=(e=this.auth.session())===null||e===void 0?void 0:e.access_token)!==null&&g!==void 0?g:this.supabaseKey;return n.apikey=this.supabaseKey,n.Authorization=`Bearer ${I}`,n}_listenForMultiTabEvents(){if(!this.multiTab||!gN()||!(window!=null&&window.addEventListener))return null;try{return window==null?void 0:window.addEventListener("storage",e=>{var g,n,I;if(e.key===eN){const o=JSON.parse(String(e.newValue)),i=(n=(g=o==null?void 0:o.currentSession)===null||g===void 0?void 0:g.access_token)!==null&&n!==void 0?n:void 0,l=(I=this.auth.session())===null||I===void 0?void 0:I.access_token;i?!l&&i?this._handleTokenChanged("SIGNED_IN",i,"STORAGE"):l!==i&&this._handleTokenChanged("TOKEN_REFRESHED",i,"STORAGE"):this._handleTokenChanged("SIGNED_OUT",i,"STORAGE")}})}catch(e){return console.error("_listenForMultiTabEvents",e),null}}_listenForAuthEvents(){let{data:e}=this.auth.onAuthStateChange((g,n)=>{this._handleTokenChanged(g,n==null?void 0:n.access_token,"CLIENT")});return e}_handleTokenChanged(e,g,n){(e==="TOKEN_REFRESHED"||e==="SIGNED_IN")&&this.changedAccessToken!==g?(this.realtime.setAuth(g),n=="STORAGE"&&this.auth.setAuth(g),this.changedAccessToken=g):(e==="SIGNED_OUT"||e==="USER_DELETED")&&(this.realtime.setAuth(this.supabaseKey),n=="STORAGE"&&this.auth.signOut())}}const XL=(t,e,g)=>new ZF(t,e,g);function e2(...t){return e=>t.forEach(g=>function(n,I){typeof n=="function"?n(I):n!=null&&(n.current=I)}(g,e))}function NA(...t){return W.exports.useCallback(e2(...t),t)}const BC=W.exports.forwardRef((t,e)=>{const I=t,{children:g}=I,n=ye(I,["children"]);return W.exports.Children.toArray(g).some(p0)?W.exports.createElement(W.exports.Fragment,null,W.exports.Children.map(g,o=>p0(o)?W.exports.createElement(dh,Le({},n,{ref:e}),o.props.children):o)):W.exports.createElement(dh,Le({},n,{ref:e}),g)});BC.displayName="Slot";const dh=W.exports.forwardRef((t,e)=>{const I=t,{children:g}=I,n=ye(I,["children"]);return W.exports.isValidElement(g)?W.exports.cloneElement(g,Ze(_({},yF(n,g.props)),{ref:e2(e,g.ref)})):W.exports.Children.count(g)>1?W.exports.Children.only(null):null});dh.displayName="SlotClone";const t2=({children:t})=>W.exports.createElement(W.exports.Fragment,null,t);function p0(t){return W.exports.isValidElement(t)&&t.type===t2}function yF(t,e){const g=_({},e);for(const n in e){const I=t[n],o=e[n];/^on[A-Z]/.test(n)?g[n]=(...i)=>{o==null||o(...i),I==null||I(...i)}:n==="style"?g[n]=_(_({},I),o):n==="className"&&(g[n]=[I,o].filter(Boolean).join(" "))}return _(_({},t),g)}const fF=["a","button","div","h2","h3","img","li","nav","ol","p","span","svg","ul"].reduce((t,e)=>Ze(_({},t),{[e]:W.exports.forwardRef((g,n)=>{const l=g,{asChild:I}=l,o=ye(l,["asChild"]),i=I?BC:e;return W.exports.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),W.exports.createElement(i,Le({},o,{ref:n}))})}),{}),os=Boolean(globalThis==null?void 0:globalThis.document)?W.exports.useLayoutEffect:()=>{},vF=W.exports.forwardRef((t,e)=>{var g,n;const c=t,{containerRef:I,style:o}=c,i=ye(c,["containerRef","style"]),l=(g=I==null?void 0:I.current)!==null&&g!==void 0?g:globalThis==null||(n=globalThis.document)===null||n===void 0?void 0:n.body,[,r]=W.exports.useState({});return os(()=>{r({})},[]),l?Xb.createPortal(W.exports.createElement(fF.div,Le({"data-radix-portal":""},i,{ref:e,style:l===document.body?_({position:"absolute",top:0,left:0,zIndex:2147483647},o):void 0})),l):null}),WF=vF;var B0=Object.prototype.hasOwnProperty;function is(t,e){var g,n;if(t===e)return!0;if(t&&e&&(g=t.constructor)===e.constructor){if(g===Date)return t.getTime()===e.getTime();if(g===RegExp)return t.toString()===e.toString();if(g===Array){if((n=t.length)===e.length)for(;n--&&is(t[n],e[n]););return n===-1}if(!g||typeof t=="object"){n=0;for(g in t)if(B0.call(t,g)&&++n&&!B0.call(e,g)||!(g in e)||!is(t[g],e[g]))return!1;return Object.keys(e).length===n}}return t!==t&&e!==e}var FA=function(e,g,n,I){this.name=e,this.fn=g,this.args=n,this.modifiers=I};FA.prototype._test=function(e){var g=this.fn;try{IC(this.modifiers.slice(),g)(e)}catch{g=function(){return!1}}try{return IC(this.modifiers.slice(),g)(e)}catch{return!1}};FA.prototype._check=function(e){try{IC(this.modifiers.slice(),this.fn)(e)}catch{if(IC(this.modifiers.slice(),function(n){return n})(!1))return}if(!IC(this.modifiers.slice(),this.fn)(e))throw null};FA.prototype._testAsync=function(e){var g=this;return new Promise(function(n,I){n2(g.modifiers.slice(),g.fn)(e).then(function(o){o?n(e):I(null)}).catch(function(o){return I(o)})})};function g2(t,e){return e===void 0&&(e="simple"),typeof t=="object"?t[e]:t}function IC(t,e){if(t.length){var g=t.shift(),n=IC(t,e);return g.perform(n)}else return g2(e)}function n2(t,e){if(t.length){var g=t.shift(),n=n2(t,e);return g.performAsync(n)}else return function(I){return Promise.resolve(g2(e,"async")(I))}}var wF=function(e,g,n){this.name=e,this.perform=g,this.performAsync=n},Db=function(t){function e(g,n,I,o){for(var i=[],l=arguments.length-4;l-- >0;)i[l]=arguments[l+4];t.call(this,i),t.captureStackTrace&&t.captureStackTrace(this,e),this.rule=g,this.value=n,this.cause=I,this.target=o}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Error),Pn=function(e,g){e===void 0&&(e=[]),g===void 0&&(g=[]),this.chain=e,this.nextRuleModifiers=g};Pn.prototype._applyRule=function(e,g){var n=this;return function(){for(var I=[],o=arguments.length;o--;)I[o]=arguments[o];return n.chain.push(new FA(g,e.apply(n,I),I,n.nextRuleModifiers)),n.nextRuleModifiers=[],n}};Pn.prototype._applyModifier=function(e,g){return this.nextRuleModifiers.push(new wF(g,e.simple,e.async)),this};Pn.prototype._clone=function(){return new Pn(this.chain.slice(),this.nextRuleModifiers.slice())};Pn.prototype.test=function(e){return this.chain.every(function(g){return g._test(e)})};Pn.prototype.testAll=function(e){var g=[];return this.chain.forEach(function(n){try{n._check(e)}catch(I){g.push(new Db(n,e,I))}}),g};Pn.prototype.check=function(e){this.chain.forEach(function(g){try{g._check(e)}catch(n){throw new Db(g,e,n)}})};Pn.prototype.testAsync=function(e){var g=this;return new Promise(function(n,I){I2(e,g.chain.slice(),n,I)})};function I2(t,e,g,n){if(e.length){var I=e.shift();I._testAsync(t).then(function(){I2(t,e,g,n)},function(o){n(new Db(I,t,o))})}else g(t)}function Rg(){return typeof Proxy!==void 0?o2(new Pn):hh(new Pn)}var Cs={};Rg.extend=function(t){Object.assign(Cs,t)};Rg.clearCustomRules=function(){Cs={}};function o2(t){return new Proxy(t,{get:function(g,n){if(n in g)return g[n];var I=o2(t._clone());if(n in $c)return I._applyModifier($c[n],n);if(n in Cs)return I._applyRule(Cs[n],n);if(n in bh)return I._applyRule(bh[n],n)}})}function hh(t){var e=function(I,o){return Object.keys(I).forEach(function(i){o[i]=function(){for(var l=[],r=arguments.length;r--;)l[r]=arguments[r];var c=hh(o._clone()),A=c._applyRule(I[i],i).apply(void 0,l);return A}}),o},g=e(bh,t),n=e(Cs,g);return Object.keys($c).forEach(function(I){Object.defineProperty(n,I,{get:function(){var o=hh(n._clone());return o._applyModifier($c[I],I)}})}),n}var $c={not:{simple:function(t){return function(e){return!t(e)}},async:function(t){return function(e){return Promise.resolve(t(e)).then(function(g){return!g}).catch(function(){return!0})}}},some:{simple:function(t){return function(e){return ec(e).some(function(g){try{return t(g)}catch{return!1}})}},async:function(t){return function(e){return Promise.all(ec(e).map(function(g){try{return t(g).catch(function(){return!1})}catch{return!1}})).then(function(g){return g.some(Boolean)})}}},every:{simple:function(t){return function(e){return e!==!1&&ec(e).every(t)}},async:function(t){return function(e){return Promise.all(ec(e).map(t)).then(function(g){return g.every(Boolean)})}}}};function ec(t){return typeof t=="string"?t.split(""):t}var bh={equal:function(t){return function(e){return e==t}},exact:function(t){return function(e){return e===t}},number:function(t){return t===void 0&&(t=!0),function(e){return typeof e=="number"&&(t||isFinite(e))}},integer:function(){return function(t){var e=Number.isInteger||VF;return e(t)}},numeric:function(){return function(t){return!isNaN(parseFloat(t))&&isFinite(t)}},string:function(){return Xi("string")},boolean:function(){return Xi("boolean")},undefined:function(){return Xi("undefined")},null:function(){return Xi("null")},array:function(){return Xi("array")},object:function(){return Xi("object")},instanceOf:function(t){return function(e){return e instanceof t}},pattern:function(t){return function(e){return t.test(e)}},lowercase:function(){return function(t){return/^([a-z]+\s*)+$/.test(t)}},uppercase:function(){return function(t){return/^([A-Z]+\s*)+$/.test(t)}},vowel:function(){return function(t){return/^[aeiou]+$/i.test(t)}},consonant:function(){return function(t){return/^(?=[^aeiou])([a-z]+)$/i.test(t)}},first:function(t){return function(e){return e[0]==t}},last:function(t){return function(e){return e[e.length-1]==t}},empty:function(){return function(t){return t.length===0}},length:function(t,e){return function(g){return g.length>=t&&g.length<=(e||t)}},minLength:function(t){return function(e){return e.length>=t}},maxLength:function(t){return function(e){return e.length<=t}},negative:function(){return function(t){return t<0}},positive:function(){return function(t){return t>=0}},between:function(t,e){return function(g){return g>=t&&g<=e}},range:function(t,e){return function(g){return g>=t&&g<=e}},lessThan:function(t){return function(e){return e<t}},lessThanOrEqual:function(t){return function(e){return e<=t}},greaterThan:function(t){return function(e){return e>t}},greaterThanOrEqual:function(t){return function(e){return e>=t}},even:function(){return function(t){return t%2===0}},odd:function(){return function(t){return t%2!==0}},includes:function(t){return function(e){return~e.indexOf(t)}},schema:function(t){return RF(t)},passesAnyOf:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];return function(g){return t.some(function(n){return n.test(g)})}},optional:function(t,e){return e===void 0&&(e=!1),function(g){return e&&typeof g=="string"&&g.trim()===""||g!=null&&t.check(g),!0}}};function Xi(t){return function(e){return Array.isArray(e)&&t==="array"||e===null&&t==="null"||typeof e===t}}function VF(t){return typeof t=="number"&&isFinite(t)&&Math.floor(t)===t}function RF(t){return{simple:function(e){var g=[];if(Object.keys(t).forEach(function(n){var I=t[n];try{I.check((e||{})[n])}catch(o){o.target=n,g.push(o)}}),g.length>0)throw g;return!0},async:function(e){var g=[],n=Object.keys(t).map(function(I){var o=t[I];return o.testAsync((e||{})[I]).catch(function(i){i.target=I,g.push(i)})});return Promise.all(n).then(function(){if(g.length>0)throw g;return!0})}}}var Me="colors",og="sizes",Ae="space",XF={gap:Ae,gridGap:Ae,columnGap:Ae,gridColumnGap:Ae,rowGap:Ae,gridRowGap:Ae,inset:Ae,insetBlock:Ae,insetBlockEnd:Ae,insetBlockStart:Ae,insetInline:Ae,insetInlineEnd:Ae,insetInlineStart:Ae,margin:Ae,marginTop:Ae,marginRight:Ae,marginBottom:Ae,marginLeft:Ae,marginBlock:Ae,marginBlockEnd:Ae,marginBlockStart:Ae,marginInline:Ae,marginInlineEnd:Ae,marginInlineStart:Ae,padding:Ae,paddingTop:Ae,paddingRight:Ae,paddingBottom:Ae,paddingLeft:Ae,paddingBlock:Ae,paddingBlockEnd:Ae,paddingBlockStart:Ae,paddingInline:Ae,paddingInlineEnd:Ae,paddingInlineStart:Ae,top:Ae,right:Ae,bottom:Ae,left:Ae,scrollMargin:Ae,scrollMarginTop:Ae,scrollMarginRight:Ae,scrollMarginBottom:Ae,scrollMarginLeft:Ae,scrollMarginX:Ae,scrollMarginY:Ae,scrollMarginBlock:Ae,scrollMarginBlockEnd:Ae,scrollMarginBlockStart:Ae,scrollMarginInline:Ae,scrollMarginInlineEnd:Ae,scrollMarginInlineStart:Ae,scrollPadding:Ae,scrollPaddingTop:Ae,scrollPaddingRight:Ae,scrollPaddingBottom:Ae,scrollPaddingLeft:Ae,scrollPaddingX:Ae,scrollPaddingY:Ae,scrollPaddingBlock:Ae,scrollPaddingBlockEnd:Ae,scrollPaddingBlockStart:Ae,scrollPaddingInline:Ae,scrollPaddingInlineEnd:Ae,scrollPaddingInlineStart:Ae,fontSize:"fontSizes",background:Me,backgroundColor:Me,backgroundImage:Me,borderImage:Me,border:Me,borderBlock:Me,borderBlockEnd:Me,borderBlockStart:Me,borderBottom:Me,borderBottomColor:Me,borderColor:Me,borderInline:Me,borderInlineEnd:Me,borderInlineStart:Me,borderLeft:Me,borderLeftColor:Me,borderRight:Me,borderRightColor:Me,borderTop:Me,borderTopColor:Me,caretColor:Me,color:Me,columnRuleColor:Me,fill:Me,outline:Me,outlineColor:Me,stroke:Me,textDecorationColor:Me,fontFamily:"fonts",fontWeight:"fontWeights",lineHeight:"lineHeights",letterSpacing:"letterSpacings",blockSize:og,minBlockSize:og,maxBlockSize:og,inlineSize:og,minInlineSize:og,maxInlineSize:og,width:og,minWidth:og,maxWidth:og,height:og,minHeight:og,maxHeight:og,flexBasis:og,gridTemplateColumns:og,gridTemplateRows:og,borderWidth:"borderWidths",borderTopWidth:"borderWidths",borderRightWidth:"borderWidths",borderBottomWidth:"borderWidths",borderLeftWidth:"borderWidths",borderStyle:"borderStyles",borderTopStyle:"borderStyles",borderRightStyle:"borderStyles",borderBottomStyle:"borderStyles",borderLeftStyle:"borderStyles",borderRadius:"radii",borderTopLeftRadius:"radii",borderTopRightRadius:"radii",borderBottomRightRadius:"radii",borderBottomLeftRadius:"radii",boxShadow:"shadows",textShadow:"shadows",transition:"transitions",zIndex:"zIndices"},YF=(t,e)=>typeof e=="function"?{"()":Function.prototype.toString.call(e)}:e,ZC=()=>{const t=Object.create(null);return(e,g,...n)=>{const I=(o=>JSON.stringify(o,YF))(e);return I in t?t[I]:t[I]=g(e,...n)}},jo=Symbol.for("sxs.internal"),jb=(t,e)=>Object.defineProperties(t,Object.getOwnPropertyDescriptors(e)),Z0=t=>{for(const e in t)return!0;return!1},{hasOwnProperty:KF}=Object.prototype,Gh=t=>t.includes("-")?t:t.replace(/[A-Z]/g,e=>"-"+e.toLowerCase()),SF=/\s+(?![^()]*\))/,Yi=t=>e=>t(...typeof e=="string"?String(e).split(SF):[e]),y0={appearance:t=>({WebkitAppearance:t,appearance:t}),backfaceVisibility:t=>({WebkitBackfaceVisibility:t,backfaceVisibility:t}),backdropFilter:t=>({WebkitBackdropFilter:t,backdropFilter:t}),backgroundClip:t=>({WebkitBackgroundClip:t,backgroundClip:t}),boxDecorationBreak:t=>({WebkitBoxDecorationBreak:t,boxDecorationBreak:t}),clipPath:t=>({WebkitClipPath:t,clipPath:t}),content:t=>({content:t.includes('"')||t.includes("'")||/^([A-Za-z]+\([^]*|[^]*-quote|inherit|initial|none|normal|revert|unset)$/.test(t)?t:`"${t}"`}),hyphens:t=>({WebkitHyphens:t,hyphens:t}),maskImage:t=>({WebkitMaskImage:t,maskImage:t}),maskSize:t=>({WebkitMaskSize:t,maskSize:t}),tabSize:t=>({MozTabSize:t,tabSize:t}),textSizeAdjust:t=>({WebkitTextSizeAdjust:t,textSizeAdjust:t}),userSelect:t=>({WebkitUserSelect:t,userSelect:t}),marginBlock:Yi((t,e)=>({marginBlockStart:t,marginBlockEnd:e||t})),marginInline:Yi((t,e)=>({marginInlineStart:t,marginInlineEnd:e||t})),maxSize:Yi((t,e)=>({maxBlockSize:t,maxInlineSize:e||t})),minSize:Yi((t,e)=>({minBlockSize:t,minInlineSize:e||t})),paddingBlock:Yi((t,e)=>({paddingBlockStart:t,paddingBlockEnd:e||t})),paddingInline:Yi((t,e)=>({paddingInlineStart:t,paddingInlineEnd:e||t}))},ju=/([\d.]+)([^]*)/,HF=(t,e)=>t.length?t.reduce((g,n)=>(g.push(...e.map(I=>I.includes("&")?I.replace(/&/g,/[ +>|~]/.test(n)&&/&.*&/.test(I)?`:is(${n})`:n):n+" "+I)),g),[]):e,NF=(t,e)=>t in FF&&typeof e=="string"?e.replace(/^((?:[^]*[^\w-])?)(fit-content|stretch)((?:[^\w-][^]*)?)$/,(g,n,I,o)=>n+(I==="stretch"?`-moz-available${o};${Gh(t)}:${n}-webkit-fill-available`:`-moz-fit-content${o};${Gh(t)}:${n}fit-content`)+o):String(e),FF={blockSize:1,height:1,inlineSize:1,maxBlockSize:1,maxHeight:1,maxInlineSize:1,maxWidth:1,minBlockSize:1,minHeight:1,minInlineSize:1,minWidth:1,width:1},WI=t=>t?t+"-":"",i2=(t,e,g)=>t.replace(/([+-])?((?:\d+(?:\.\d*)?|\.\d+)(?:[Ee][+-]?\d+)?)?(\$|--)([$\w-]+)/g,(n,I,o,i,l)=>i=="$"==!!o?n:(I||i=="--"?"calc(":"")+"var(--"+(i==="$"?WI(e)+(l.includes("$")?"":WI(g))+l.replace(/\$/g,"-"):l)+")"+(I||i=="--"?"*"+(I||"")+(o||"1")+")":"")),kF=/\s*,\s*(?![^()]*\))/,zF=Object.prototype.toString,Oi=(t,e,g,n,I)=>{let o,i,l;const r=(c,A,u)=>{let h,b;const p=Z=>{for(h in Z){const m=h.charCodeAt(0)===64,B=m&&Array.isArray(Z[h])?Z[h]:[Z[h]];for(b of B){const w=/[A-Z]/.test(y=h)?y:y.replace(/-[^]/g,R=>R[1].toUpperCase()),X=typeof b=="object"&&b&&b.toString===zF&&(!n.utils[w]||!A.length);if(w in n.utils&&!X){const R=n.utils[w];if(R!==i){i=R,p(R(b)),i=null;continue}}else if(w in y0){const R=y0[w];if(R!==l){l=R,p(R(b)),l=null;continue}}if(m&&(v=h.slice(1)in n.media?"@media "+n.media[h.slice(1)]:h,h=v.replace(/\(\s*([\w-]+)\s*(=|<|<=|>|>=)\s*([\w-]+)\s*(?:(<|<=|>|>=)\s*([\w-]+)\s*)?\)/g,(R,S,Y,k,N,z)=>{const M=ju.test(S),j=.0625*(M?-1:1),[F,L]=M?[k,S]:[S,k];return"("+(Y[0]==="="?"":Y[0]===">"===M?"max-":"min-")+F+":"+(Y[0]!=="="&&Y.length===1?L.replace(ju,(P,$,T)=>Number($)+j*(Y===">"?1:-1)+T):L)+(N?") and ("+(N[0]===">"?"min-":"max-")+F+":"+(N.length===1?z.replace(ju,(P,$,T)=>Number($)+j*(N===">"?-1:1)+T):z):"")+")"})),X){const R=m?u.concat(h):[...u],S=m?[...A]:HF(A,h.split(kF));o!==void 0&&I(f0(...o)),o=void 0,r(b,S,R)}else o===void 0&&(o=[[],A,u]),h=m||h.charCodeAt(0)!==36?h:`--${WI(n.prefix)}${h.slice(1).replace(/\$/g,"-")}`,b=X?b:typeof b=="number"?b&&w in xF?String(b)+"px":String(b):i2(NF(w,b==null?"":b),n.prefix,n.themeMap[w]),o[0].push(`${m?`${h} `:`${Gh(h)}:`}${b}`)}}var v,y};p(c),o!==void 0&&I(f0(...o)),o=void 0};r(t,e,g)},f0=(t,e,g)=>`${g.map(n=>`${n}{`).join("")}${e.length?`${e.join(",")}{`:""}${t.join(";")}${e.length?"}":""}${Array(g.length?g.length+1:0).join("}")}`,xF={animationDelay:1,animationDuration:1,backgroundSize:1,blockSize:1,border:1,borderBlock:1,borderBlockEnd:1,borderBlockEndWidth:1,borderBlockStart:1,borderBlockStartWidth:1,borderBlockWidth:1,borderBottom:1,borderBottomLeftRadius:1,borderBottomRightRadius:1,borderBottomWidth:1,borderEndEndRadius:1,borderEndStartRadius:1,borderInlineEnd:1,borderInlineEndWidth:1,borderInlineStart:1,borderInlineStartWidth:1,borderInlineWidth:1,borderLeft:1,borderLeftWidth:1,borderRadius:1,borderRight:1,borderRightWidth:1,borderSpacing:1,borderStartEndRadius:1,borderStartStartRadius:1,borderTop:1,borderTopLeftRadius:1,borderTopRightRadius:1,borderTopWidth:1,borderWidth:1,bottom:1,columnGap:1,columnRule:1,columnRuleWidth:1,columnWidth:1,containIntrinsicSize:1,flexBasis:1,fontSize:1,gap:1,gridAutoColumns:1,gridAutoRows:1,gridTemplateColumns:1,gridTemplateRows:1,height:1,inlineSize:1,inset:1,insetBlock:1,insetBlockEnd:1,insetBlockStart:1,insetInline:1,insetInlineEnd:1,insetInlineStart:1,left:1,letterSpacing:1,margin:1,marginBlock:1,marginBlockEnd:1,marginBlockStart:1,marginBottom:1,marginInline:1,marginInlineEnd:1,marginInlineStart:1,marginLeft:1,marginRight:1,marginTop:1,maxBlockSize:1,maxHeight:1,maxInlineSize:1,maxWidth:1,minBlockSize:1,minHeight:1,minInlineSize:1,minWidth:1,offsetDistance:1,offsetRotate:1,outline:1,outlineOffset:1,outlineWidth:1,overflowClipMargin:1,padding:1,paddingBlock:1,paddingBlockEnd:1,paddingBlockStart:1,paddingBottom:1,paddingInline:1,paddingInlineEnd:1,paddingInlineStart:1,paddingLeft:1,paddingRight:1,paddingTop:1,perspective:1,right:1,rowGap:1,scrollMargin:1,scrollMarginBlock:1,scrollMarginBlockEnd:1,scrollMarginBlockStart:1,scrollMarginBottom:1,scrollMarginInline:1,scrollMarginInlineEnd:1,scrollMarginInlineStart:1,scrollMarginLeft:1,scrollMarginRight:1,scrollMarginTop:1,scrollPadding:1,scrollPaddingBlock:1,scrollPaddingBlockEnd:1,scrollPaddingBlockStart:1,scrollPaddingBottom:1,scrollPaddingInline:1,scrollPaddingInlineEnd:1,scrollPaddingInlineStart:1,scrollPaddingLeft:1,scrollPaddingRight:1,scrollPaddingTop:1,shapeMargin:1,textDecoration:1,textDecorationThickness:1,textIndent:1,textUnderlineOffset:1,top:1,transitionDelay:1,transitionDuration:1,verticalAlign:1,width:1,wordSpacing:1},v0=t=>String.fromCharCode(t+(t>25?39:97)),Oo=t=>(e=>{let g,n="";for(g=Math.abs(e);g>52;g=g/52|0)n=v0(g%52)+n;return v0(g%52)+n})(((e,g)=>{let n=g.length;for(;n;)e=33*e^g.charCodeAt(--n);return e})(5381,JSON.stringify(t))>>>0),pl=["themed","global","styled","onevar","resonevar","allvar","inline"],LF=t=>{if(t.href&&!t.href.startsWith(location.origin))return!1;try{return t.cssRules,!0}catch{return!1}},JF=t=>{let e;const g=()=>{if(e){const{rules:i,sheet:l}=e;if(!l.deleteRule){for(;Object(Object(l.cssRules)[0]).type===3;)l.cssRules.splice(0,1);l.cssRules=[]}for(const r in i)delete i[r]}const n=Object(t).styleSheets||[];for(const i of n)if(LF(i)){for(let l=0,r=i.cssRules;r[l];++l){const c=Object(r[l]);if(c.type!==1)continue;const A=Object(r[l+1]);if(A.type!==4)continue;++l;const{cssText:u}=c;if(!u.startsWith("--sxs"))continue;const h=u.slice(14,-3).trim().split(/\s+/),b=pl[h[0]];b&&(e||(e={sheet:i,reset:g,rules:{}}),e.rules[b]={group:A,index:l,cache:new Set(h)})}if(e)break}if(!e){const i=(l,r)=>({type:r,cssRules:[],insertRule(c,A){this.cssRules.splice(A,0,i(c,{import:3,undefined:1}[(c.toLowerCase().match(/^@([a-z]+)/)||[])[1]]||4))},get cssText(){return l==="@media{}"?`@media{${[].map.call(this.cssRules,c=>c.cssText).join("")}}`:l}});e={sheet:t?(t.head||t).appendChild(document.createElement("style")).sheet:i("","text/css"),rules:{},reset:g,toString(){const{cssRules:l}=e.sheet;return[].map.call(l,(r,c)=>{const{cssText:A}=r;let u="";if(A.startsWith("--sxs"))return"";if(l[c-1]&&(u=l[c-1].cssText).startsWith("--sxs")){if(!r.cssRules.length)return"";for(const h in e.rules)if(e.rules[h].group===r)return`--sxs{--sxs:${[...e.rules[h].cache].join(" ")}}${A}`;return r.cssRules.length?`${u}${A}`:""}return A}).join("")}}}const{sheet:I,rules:o}=e;for(let i=pl.length-1;i>=0;--i){const l=pl[i];if(!o[l]){const r=pl[i+1],c=o[r]?o[r].index:I.cssRules.length;I.insertRule("@media{}",c),I.insertRule(`--sxs{--sxs:${i}}`,c),o[l]={group:I.cssRules[c+1],index:c,cache:new Set([i])}}MF(o[l])}};return g(),e},MF=t=>{const e=t.group;let g=e.cssRules.length;t.apply=n=>{try{e.insertRule(n,g),++g}catch{}}},Al=Symbol(),EF=ZC(),W0=(t,e)=>EF(t,()=>(...g)=>{let n={type:null,composers:new Set};for(const I of g)if(I!=null)if(I[jo]){n.type==null&&(n.type=I[jo].type);for(const o of I[jo].composers)n.composers.add(o)}else I.constructor!==Object||I.$$typeof?n.type==null&&(n.type=I):n.composers.add(QF(I,t));return n.type==null&&(n.type="span"),n.composers.size||n.composers.add(["PJLV",{},[],[],{},[]]),TF(t,n,e)}),QF=(o,I)=>{var i=o,{variants:t,compoundVariants:e,defaultVariants:g}=i,n=ye(i,["variants","compoundVariants","defaultVariants"]);const l=`${WI(I.prefix)}c-${Oo(n)}`,r=[],c=[],A=Object.create(null),u=[];for(const Z in g)A[Z]=String(g[Z]);if(typeof t=="object"&&t)for(const Z in t){h=A,b=Z,KF.call(h,b)||(A[Z]="undefined");const v=t[Z];for(const y in v){const m={[Z]:String(y)};String(y)==="undefined"&&u.push(Z);const B=v[y],w=[m,B,!Z0(B)];r.push(w)}}var h,b;if(typeof e=="object"&&e)for(const Z of e){let p=Z,{css:v}=p,y=ye(p,["css"]);v=typeof v=="object"&&v||{};for(const B in y)y[B]=String(y[B]);const m=[y,v,!Z0(v)];c.push(m)}return[l,n,r,c,A,u]},TF=(t,e,g)=>{const[n,I,o,i]=UF(e.composers),l=typeof e.type=="function"||e.type.$$typeof?(u=>{function h(){for(let b=0;b<h[Al].length;b++){const[p,Z]=h[Al][b];u.rules[p].apply(Z)}return h[Al]=[],null}return h[Al]=[],h.rules={},pl.forEach(b=>h.rules[b]={apply:p=>h[Al].push([b,p])}),h})(g):null,r=(l||g).rules,c=`.${n}${I.length>1?`:where(.${I.slice(1).join(".")})`:""}`,A=u=>{u=typeof u=="object"&&u||DF;const y=u,{css:h}=y,b=ye(y,["css"]),p={};for(const m in o)if(delete b[m],m in u){let B=u[m];typeof B=="object"&&B?p[m]=_({"@initial":o[m]},B):(B=String(B),p[m]=B!=="undefined"||i.has(m)?B:o[m])}else p[m]=o[m];const Z=new Set([...I]);for(const[m,B,w,X]of e.composers){g.rules.styled.cache.has(m)||(g.rules.styled.cache.add(m),Oi(B,[`.${m}`],[],t,Y=>{r.styled.apply(Y)}));const R=w0(w,p,t.media),S=w0(X,p,t.media,!0);for(const Y of R)if(Y!==void 0)for(const[k,N,z]of Y){const M=`${m}-${Oo(N)}-${k}`;Z.add(M);const j=(z?g.rules.resonevar:g.rules.onevar).cache,F=z?r.resonevar:r.onevar;j.has(M)||(j.add(M),Oi(N,[`.${M}`],[],t,L=>{F.apply(L)}))}for(const Y of S)if(Y!==void 0)for(const[k,N]of Y){const z=`${m}-${Oo(N)}-${k}`;Z.add(z),g.rules.allvar.cache.has(z)||(g.rules.allvar.cache.add(z),Oi(N,[`.${z}`],[],t,M=>{r.allvar.apply(M)}))}}if(typeof h=="object"&&h){const m=`${n}-i${Oo(h)}-css`;Z.add(m),g.rules.inline.cache.has(m)||(g.rules.inline.cache.add(m),Oi(h,[`.${m}`],[],t,B=>{r.inline.apply(B)}))}for(const m of String(u.className||"").trim().split(/\s+/))m&&Z.add(m);const v=b.className=[...Z].join(" ");return{type:e.type,className:v,selector:c,props:b,toString:()=>v,deferredInjector:l}};return jb(A,{className:n,selector:c,[jo]:e,toString:()=>(g.rules.styled.cache.has(n)||A(),n)})},UF=t=>{let e="";const g=[],n={},I=[];for(const[o,,,,i,l]of t){e===""&&(e=o),g.push(o),I.push(...l);for(const r in i){const c=i[r];(n[r]===void 0||c!=="undefined"||l.includes(c))&&(n[r]=c)}}return[e,g,n,new Set(I)]},w0=(t,e,g,n)=>{const I=[];e:for(let[o,i,l]of t){if(l)continue;let r,c=0,A=!1;for(r in o){const u=o[r];let h=e[r];if(h!==u){if(typeof h!="object"||!h)continue e;{let b,p,Z=0;for(const v in h){if(u===String(h[v])){if(v!=="@initial"){const y=v.slice(1);(p=p||[]).push(y in g?g[y]:v.replace(/^@media ?/,"")),A=!0}c+=Z,b=!0}++Z}if(p&&p.length&&(i={["@media "+p.join(", ")]:i}),!b)continue e}}}(I[c]=I[c]||[]).push([n?"cv":`${r}-${o[r]}`,i,A])}return I},DF={},jF=ZC(),OF=(t,e)=>jF(t,()=>(...g)=>{const n=()=>{for(let I of g){I=typeof I=="object"&&I||{};let o=Oo(I);if(!e.rules.global.cache.has(o)){if(e.rules.global.cache.add(o),"@import"in I){let i=[].indexOf.call(e.sheet.cssRules,e.rules.themed.group)-1;for(let l of[].concat(I["@import"]))l=l.includes('"')||l.includes("'")?l:`"${l}"`,e.sheet.insertRule(`@import ${l};`,i++);delete I["@import"]}Oi(I,[],[],t,i=>{e.rules.global.apply(i)})}}return""};return jb(n,{toString:n})}),PF=ZC(),_F=(t,e)=>PF(t,()=>g=>{const n=`${WI(t.prefix)}k-${Oo(g)}`,I=()=>{if(!e.rules.global.cache.has(n)){e.rules.global.cache.add(n);const o=[];Oi(g,[],[],t,l=>o.push(l));const i=`@keyframes ${n}{${o.join("")}}`;e.rules.global.apply(i)}return n};return jb(I,{get name(){return I()},toString:I})}),qF=class{constructor(t,e,g,n){this.token=t==null?"":String(t),this.value=e==null?"":String(e),this.scale=g==null?"":String(g),this.prefix=n==null?"":String(n)}get computedValue(){return"var("+this.variable+")"}get variable(){return"--"+WI(this.prefix)+WI(this.scale)+this.token}toString(){return this.computedValue}},$F=ZC(),e5=(t,e)=>$F(t,()=>(g,n)=>{n=typeof g=="object"&&g||Object(n);const I=`.${g=(g=typeof g=="string"?g:"")||`${WI(t.prefix)}t-${Oo(n)}`}`,o={},i=[];for(const r in n){o[r]={};for(const c in n[r]){const A=`--${WI(t.prefix)}${r}-${c}`,u=i2(String(n[r][c]),t.prefix,r);o[r][c]=new qF(c,u,r,t.prefix),i.push(`${A}:${u}`)}}const l=()=>{if(i.length&&!e.rules.themed.cache.has(g)){e.rules.themed.cache.add(g);const r=`${n===t.theme?":root,":""}.${g}{${i.join(";")}}`;e.rules.themed.apply(r)}return g};return Ze(_({},o),{get className(){return l()},selector:I,toString:l})}),t5=ZC(),g5=ZC(),n5=t=>{const e=(g=>{let n=!1;const I=t5(g,o=>{n=!0;const i="prefix"in(o=typeof o=="object"&&o||{})?String(o.prefix):"",l=typeof o.media=="object"&&o.media||{},r=typeof o.root=="object"?o.root||null:globalThis.document||null,c=typeof o.theme=="object"&&o.theme||{},A={prefix:i,media:l,theme:c,themeMap:typeof o.themeMap=="object"&&o.themeMap||_({},XF),utils:typeof o.utils=="object"&&o.utils||{}},u=JF(r),h={css:W0(A,u),globalCss:OF(A,u),keyframes:_F(A,u),createTheme:e5(A,u),reset(){u.reset(),h.theme.toString()},theme:{},sheet:u,config:A,prefix:i,getCssText:u.toString,toString:u.toString};return String(h.theme=h.createTheme(c)),h});return n||I.reset(),I})(t);return e.styled=(({config:g,sheet:n})=>g5(g,()=>{const I=W0(g,n);return(...o)=>{const i=I(...o),l=i[jo].type,r=ae.forwardRef((c,A)=>{const u=c&&c.as||l,{props:h,deferredInjector:b}=i(c);return delete h.as,h.ref=A,b?ae.createElement(ae.Fragment,null,ae.createElement(u,h),ae.createElement(b,null)):ae.createElement(u,h)});return r.className=i.className,r.displayName=`Styled.${l.displayName||l.name||l}`,r.selector=i.selector,r.toString=()=>i.selector,r[jo]=i[jo],r}}))(e),e};const I5=jV["useId".toString()]||(()=>{});let o5=0;function i5(t){const[e,g]=W.exports.useState(I5());return os(()=>{t||g(n=>n!=null?n:String(o5++))},[t]),t||(e?`radix-${e}`:"")}const C5=["a","button","div","h2","h3","img","li","nav","p","span","svg","ul"].reduce((t,e)=>Ze(_({},t),{[e]:W.exports.forwardRef((g,n)=>{const l=g,{asChild:I}=l,o=ye(l,["asChild"]),i=I?BC:e;return W.exports.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),g.as&&console.error(l5),W.exports.createElement(i,Le({},o,{ref:n}))})}),{}),l5="Warning: The `as` prop has been removed in favour of `asChild`. For details, see https://radix-ui.com/docs/primitives/overview/styling#changing-the-rendered-element",s5=W.exports.forwardRef((t,e)=>W.exports.createElement(C5.span,Le({},t,{ref:e,style:Ze(_({},t.style),{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"})}))),r5=s5,C2=["a","button","div","h2","h3","img","li","nav","p","span","svg","ul"].reduce((t,e)=>Ze(_({},t),{[e]:W.exports.forwardRef((g,n)=>{const l=g,{asChild:I}=l,o=ye(l,["asChild"]),i=I?BC:e;return W.exports.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),g.as&&console.error(c5),W.exports.createElement(i,Le({},o,{ref:n}))})}),{}),c5="Warning: The `as` prop has been removed in favour of `asChild`. For details, see https://radix-ui.com/docs/primitives/overview/styling#changing-the-rendered-element",A5=W.exports.forwardRef((t,e)=>{var g,n;const c=t,{containerRef:I,style:o}=c,i=ye(c,["containerRef","style"]),l=(g=I==null?void 0:I.current)!==null&&g!==void 0?g:globalThis==null||(n=globalThis.document)===null||n===void 0?void 0:n.body,[,r]=W.exports.useState({});return os(()=>{r({})},[]),l?Xb.createPortal(W.exports.createElement(C2.div,Le({"data-radix-portal":""},i,{ref:e,style:l===document.body?_({position:"absolute",top:0,left:0,zIndex:2147483647},o):void 0})),l):null}),a5=["a","button","div","h2","h3","img","li","nav","p","span","svg","ul"].reduce((t,e)=>Ze(_({},t),{[e]:W.exports.forwardRef((g,n)=>{const l=g,{asChild:I}=l,o=ye(l,["asChild"]),i=I?BC:e;return W.exports.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),g.as&&console.error(u5),W.exports.createElement(i,Le({},o,{ref:n}))})}),{}),u5="Warning: The `as` prop has been removed in favour of `asChild`. For details, see https://radix-ui.com/docs/primitives/overview/styling#changing-the-rendered-element",d5=W.exports.forwardRef((t,e)=>{const i=t,{children:g,width:n=10,height:I=5}=i,o=ye(i,["children","width","height"]);return W.exports.createElement(a5.svg,Le({},o,{ref:e,width:n,height:I,viewBox:"0 0 30 10",preserveAspectRatio:"none"}),t.asChild?g:W.exports.createElement("polygon",{points:"0,0 30,0 15,10"}))}),h5=d5,l2=["a","button","div","h2","h3","img","li","nav","p","span","svg","ul"].reduce((t,e)=>Ze(_({},t),{[e]:W.exports.forwardRef((g,n)=>{const l=g,{asChild:I}=l,o=ye(l,["asChild"]),i=I?BC:e;return W.exports.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),g.as&&console.error(b5),W.exports.createElement(i,Le({},o,{ref:n}))})}),{}),b5="Warning: The `as` prop has been removed in favour of `asChild`. For details, see https://radix-ui.com/docs/primitives/overview/styling#changing-the-rendered-element";function V0(t){const[e,g]=W.exports.useState(void 0);return W.exports.useEffect(()=>{if(t){const n=new ResizeObserver(I=>{if(!Array.isArray(I)||!I.length)return;const o=I[0];let i,l;if("borderBoxSize"in o){const r=o.borderBoxSize,c=Array.isArray(r)?r[0]:r;i=c.inlineSize,l=c.blockSize}else{const r=t.getBoundingClientRect();i=r.width,l=r.height}g({width:i,height:l})});return n.observe(t,{box:"border-box"}),()=>{g(void 0),n.unobserve(t)}}},[t]),e}function G5(t,e){const g=No.get(t);return g===void 0?(No.set(t,{rect:{},callbacks:[e]}),No.size===1&&(mh=requestAnimationFrame(s2))):(g.callbacks.push(e),e(t.getBoundingClientRect())),()=>{const n=No.get(t);if(n===void 0)return;const I=n.callbacks.indexOf(e);I>-1&&n.callbacks.splice(I,1),n.callbacks.length===0&&(No.delete(t),No.size===0&&cancelAnimationFrame(mh))}}let mh;const No=new Map;function s2(){const t=[];No.forEach((e,g)=>{const n=g.getBoundingClientRect();var I,o;I=e.rect,o=n,(I.width!==o.width||I.height!==o.height||I.top!==o.top||I.right!==o.right||I.bottom!==o.bottom||I.left!==o.left)&&(e.rect=n,t.push(e))}),t.forEach(e=>{e.callbacks.forEach(g=>g(e.rect))}),mh=requestAnimationFrame(s2)}function r2(t){const[e,g]=W.exports.useState();return W.exports.useEffect(()=>{if(t){const n=G5(t,g);return()=>{g(void 0),n()}}},[t]),e}function c2(t,e=[]){let g=[];const n=()=>{const I=g.map(o=>W.exports.createContext(o));return function(o){const i=(o==null?void 0:o[t])||I;return W.exports.useMemo(()=>({[`__scope${t}`]:Ze(_({},o),{[t]:i})}),[o,i])}};return n.scopeName=t,[function(I,o){const i=W.exports.createContext(o),l=g.length;function r(c){const Z=c,{scope:A,children:u}=Z,h=ye(Z,["scope","children"]),b=(A==null?void 0:A[t][l])||i,p=W.exports.useMemo(()=>h,Object.values(h));return W.exports.createElement(b.Provider,{value:p},u)}return g=[...g,o],r.displayName=I+"Provider",[r,function(c,A){const u=(A==null?void 0:A[t][l])||i,h=W.exports.useContext(u);if(h)return h;if(o!==void 0)return o;throw new Error(`\`${c}\` must be used within \`${I}\``)}]},m5(n,...e)]}function m5(...t){const e=t[0];if(t.length===1)return e;const g=()=>{const n=t.map(I=>({useScope:I(),scopeName:I.scopeName}));return function(I){const o=n.reduce((i,{useScope:l,scopeName:r})=>_(_({},i),l(I)[`__scope${r}`]),{});return W.exports.useMemo(()=>({[`__scope${e.scopeName}`]:o}),[o])}};return g.scopeName=e.scopeName,g}function p5({anchorRect:t,popperSize:e,arrowSize:g,arrowOffset:n=0,side:I,sideOffset:o=0,align:i,alignOffset:l=0,shouldAvoidCollisions:r=!0,collisionBoundariesRect:c,collisionTolerance:A=0}){if(!t||!e||!c)return{popperStyles:B5,arrowStyles:Ou};const u=function(S,Y,k=0,N=0,z){const M=z?z.height:0,j=R0(Y,S,"x"),F=R0(Y,S,"y"),L=F.before-k-M,P=F.after+k+M,$=j.before-k-M,T=j.after+k+M;return{top:{start:{x:j.start+N,y:L},center:{x:j.center,y:L},end:{x:j.end-N,y:L}},right:{start:{x:T,y:F.start+N},center:{x:T,y:F.center},end:{x:T,y:F.end-N}},bottom:{start:{x:j.start+N,y:P},center:{x:j.center,y:P},end:{x:j.end-N,y:P}},left:{start:{x:$,y:F.start+N},center:{x:$,y:F.center},end:{x:$,y:F.end-N}}}}(e,t,o,l,g),h=u[I][i];if(r===!1){const S=X0(h);let Y=Ou;return g&&(Y=K0({popperSize:e,arrowSize:g,arrowOffset:n,side:I,align:i})),{popperStyles:Ze(_({},S),{"--radix-popper-transform-origin":Y0(e,I,i,n,g)}),arrowStyles:Y,placedSide:I,placedAlign:i}}const b=DOMRect.fromRect(_(_({},e),h)),p=(Z=c,v=A,DOMRect.fromRect({width:Z.width-2*v,height:Z.height-2*v,x:Z.left+v,y:Z.top+v}));var Z,v;const y=H0(b,p),m=u[S0(I)][i],B=function(S,Y,k){const N=S0(S);return Y[S]&&!k[N]?N:S}(I,y,H0(DOMRect.fromRect(_(_({},e),m)),p)),w=function(S,Y,k,N,z){const M=k==="top"||k==="bottom",j=M?"left":"top",F=M?"right":"bottom",L=M?"width":"height",P=Y[L]>S[L];return(N==="start"||N==="center")&&(z[j]&&P||z[F]&&!P)?"end":(N==="end"||N==="center")&&(z[F]&&P||z[j]&&!P)?"start":N}(e,t,I,i,y),X=X0(u[B][w]);let R=Ou;return g&&(R=K0({popperSize:e,arrowSize:g,arrowOffset:n,side:B,align:w})),{popperStyles:Ze(_({},X),{"--radix-popper-transform-origin":Y0(e,B,w,n,g)}),arrowStyles:R,placedSide:B,placedAlign:w}}function R0(t,e,g){const n=t[g==="x"?"left":"top"],I=g==="x"?"width":"height",o=t[I],i=e[I];return{before:n-i,start:n,center:n+(o-i)/2,end:n+o-i,after:n+o}}function X0(t){return{position:"absolute",top:0,left:0,minWidth:"max-content",willChange:"transform",transform:`translate3d(${Math.round(t.x+window.scrollX)}px, ${Math.round(t.y+window.scrollY)}px, 0)`}}function Y0(t,e,g,n,I){const o=e==="top"||e==="bottom",i=I?I.width:0,l=I?I.height:0,r=i/2+n;let c="",A="";return o?(c={start:`${r}px`,center:"center",end:t.width-r+"px"}[g],A=e==="top"?`${t.height+l}px`:-l+"px"):(c=e==="left"?`${t.width+l}px`:-l+"px",A={start:`${r}px`,center:"center",end:t.height-r+"px"}[g]),`${c} ${A}`}const B5={position:"fixed",top:0,left:0,opacity:0,transform:"translate3d(0, -200%, 0)"},Ou={position:"absolute",opacity:0};function K0({popperSize:t,arrowSize:e,arrowOffset:g,side:n,align:I}){const o=(t.width-e.width)/2,i=(t.height-e.width)/2,l={top:0,right:90,bottom:180,left:-90}[n],r=Math.max(e.width,e.height),c={width:`${r}px`,height:`${r}px`,transform:`rotate(${l}deg)`,willChange:"transform",position:"absolute",[n]:"100%",direction:Z5(n,I)};return n!=="top"&&n!=="bottom"||(I==="start"&&(c.left=`${g}px`),I==="center"&&(c.left=`${o}px`),I==="end"&&(c.right=`${g}px`)),n!=="left"&&n!=="right"||(I==="start"&&(c.top=`${g}px`),I==="center"&&(c.top=`${i}px`),I==="end"&&(c.bottom=`${g}px`)),c}function Z5(t,e){return(t!=="top"&&t!=="right"||e!=="end")&&(t!=="bottom"&&t!=="left"||e==="end")?"ltr":"rtl"}function S0(t){return{top:"bottom",right:"left",bottom:"top",left:"right"}[t]}function H0(t,e){return{top:t.top<e.top,right:t.right>e.right,bottom:t.bottom>e.bottom,left:t.left<e.left}}const[A2,a2]=c2("Popper"),[y5,u2]=A2("Popper"),f5=t=>{const{__scopePopper:e,children:g}=t,[n,I]=W.exports.useState(null);return W.exports.createElement(y5,{scope:e,anchor:n,onAnchorChange:I},g)},v5=W.exports.forwardRef((t,e)=>{const r=t,{__scopePopper:g,virtualRef:n}=r,I=ye(r,["__scopePopper","virtualRef"]),o=u2("PopperAnchor",g),i=W.exports.useRef(null),l=NA(e,i);return W.exports.useEffect(()=>{o.onAnchorChange((n==null?void 0:n.current)||i.current)}),n?null:W.exports.createElement(l2.div,Le({},I,{ref:l}))}),[W5,w5]=A2("PopperContent"),V5=W.exports.forwardRef((t,e)=>{const M=t,{__scopePopper:g,side:n="bottom",sideOffset:I,align:o="center",alignOffset:i,collisionTolerance:l,avoidCollisions:r=!0}=M,c=ye(M,["__scopePopper","side","sideOffset","align","alignOffset","collisionTolerance","avoidCollisions"]),A=u2("PopperContent",g),[u,h]=W.exports.useState(),b=r2(A.anchor),[p,Z]=W.exports.useState(null),v=V0(p),[y,m]=W.exports.useState(null),B=V0(y),w=NA(e,j=>Z(j)),X=function(){const[j,F]=W.exports.useState(void 0);return W.exports.useEffect(()=>{let L;function P(){F({width:window.innerWidth,height:window.innerHeight})}function $(){window.clearTimeout(L),L=window.setTimeout(P,100)}return P(),window.addEventListener("resize",$),()=>window.removeEventListener("resize",$)},[]),j}(),R=X?DOMRect.fromRect(Ze(_({},X),{x:0,y:0})):void 0,{popperStyles:S,arrowStyles:Y,placedSide:k,placedAlign:N}=p5({anchorRect:b,popperSize:v,arrowSize:B,arrowOffset:u,side:n,sideOffset:I,align:o,alignOffset:i,shouldAvoidCollisions:r,collisionBoundariesRect:R,collisionTolerance:l}),z=k!==void 0;return W.exports.createElement("div",{style:S,"data-radix-popper-content-wrapper":""},W.exports.createElement(W5,{scope:g,arrowStyles:Y,onArrowChange:m,onArrowOffsetChange:h},W.exports.createElement(l2.div,Le({"data-side":k,"data-align":N},c,{style:Ze(_({},c.style),{animation:z?void 0:"none"}),ref:w}))))}),R5=W.exports.forwardRef(function(t,e){const l=t,{__scopePopper:g,offset:n}=l,I=ye(l,["__scopePopper","offset"]),o=w5("PopperArrow",g),{onArrowOffsetChange:i}=o;return W.exports.useEffect(()=>i(n),[i,n]),W.exports.createElement("span",{style:Ze(_({},o.arrowStyles),{pointerEvents:"none"})},W.exports.createElement("span",{ref:o.onArrowChange,style:{display:"inline-block",verticalAlign:"top",pointerEvents:"auto"}},W.exports.createElement(h5,Le({},I,{ref:e,style:Ze(_({},I.style),{display:"block"})}))))}),X5=f5,Y5=v5,K5=V5,S5=R5,d2=t=>{const{present:e,children:g}=t,n=function(i){const[l,r]=W.exports.useState(),c=W.exports.useRef({}),A=W.exports.useRef(i),u=W.exports.useRef("none"),h=i?"mounted":"unmounted",[b,p]=function(Z,v){return W.exports.useReducer((y,m)=>{const B=v[y][m];return B!=null?B:y},Z)}(h,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return W.exports.useEffect(()=>{const Z=tc(c.current);u.current=b==="mounted"?Z:"none"},[b]),os(()=>{const Z=c.current,v=A.current;if(v!==i){const y=u.current,m=tc(Z);i?p("MOUNT"):m==="none"||(Z==null?void 0:Z.display)==="none"?p("UNMOUNT"):p(v&&y!==m?"ANIMATION_OUT":"UNMOUNT"),A.current=i}},[i,p]),os(()=>{if(l){const Z=y=>{const m=tc(c.current).includes(y.animationName);y.target===l&&m&&p("ANIMATION_END")},v=y=>{y.target===l&&(u.current=tc(c.current))};return l.addEventListener("animationstart",v),l.addEventListener("animationcancel",Z),l.addEventListener("animationend",Z),()=>{l.removeEventListener("animationstart",v),l.removeEventListener("animationcancel",Z),l.removeEventListener("animationend",Z)}}},[l,p]),{isPresent:["mounted","unmountSuspended"].includes(b),ref:W.exports.useCallback(Z=>{Z&&(c.current=getComputedStyle(Z)),r(Z)},[])}}(e),I=typeof g=="function"?g({present:n.isPresent}):W.exports.Children.only(g),o=NA(n.ref,I.ref);return typeof g=="function"||n.isPresent?W.exports.cloneElement(I,{ref:o}):null};function tc(t){return(t==null?void 0:t.animationName)||"none"}d2.displayName="Presence";function N0(t){const e=W.exports.useRef(t);return W.exports.useEffect(()=>{e.current=t},[t]),e.current}function ph(t){const e=W.exports.useRef(t);return W.exports.useEffect(()=>{e.current=t}),W.exports.useMemo(()=>(...g)=>{var n;return(n=e.current)===null||n===void 0?void 0:n.call(e,...g)},[])}function H5(t){const e=ph(t);W.exports.useEffect(()=>{const g=n=>{n.key==="Escape"&&e(n)};return document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)},[e])}function N5({prop:t,defaultProp:e,onChange:g=()=>{}}){const[n,I]=function({defaultProp:r,onChange:c}){const A=W.exports.useState(r),[u]=A,h=W.exports.useRef(u),b=ph(c);return W.exports.useEffect(()=>{h.current!==u&&(b(u),h.current=u)},[u,h,b]),A}({defaultProp:e,onChange:g}),o=t!==void 0,i=o?t:n,l=ph(g);return[i,W.exports.useCallback(r=>{if(o){const c=r,A=typeof r=="function"?c(t):r;A!==t&&l(A)}else I(r)},[o,t,I,l])]}function Ki(t,e,{checkForDefaultPrevented:g=!0}={}){return function(n){if(t==null||t(n),g===!1||!n.defaultPrevented)return e==null?void 0:e(n)}}const[h2,YL]=c2("Tooltip",[a2]),kA=a2(),F5=700,[KL,k5]=h2("TooltipProvider",{isOpenDelayed:!0,delayDuration:F5,onOpen:()=>{},onClose:()=>{}}),[z5,zA]=h2("Tooltip"),x5=t=>{const{__scopeTooltip:e,children:g,open:n,defaultOpen:I=!1,onOpenChange:o,delayDuration:i}=t,l=k5("Tooltip",e),r=kA(e),[c,A]=W.exports.useState(null),u=i5(),h=W.exports.useRef(0),b=i!=null?i:l.delayDuration,p=W.exports.useRef(!1),{onOpen:Z,onClose:v}=l,[y=!1,m]=N5({prop:n,defaultProp:I,onChange:R=>{R&&(document.dispatchEvent(new CustomEvent("tooltip.open")),Z()),o==null||o(R)}}),B=W.exports.useMemo(()=>y?p.current?"delayed-open":"instant-open":"closed",[y]),w=W.exports.useCallback(()=>{window.clearTimeout(h.current),p.current=!1,m(!0)},[m]),X=W.exports.useCallback(()=>{window.clearTimeout(h.current),h.current=window.setTimeout(()=>{p.current=!0,m(!0)},b)},[b,m]);return W.exports.useEffect(()=>()=>window.clearTimeout(h.current),[]),W.exports.createElement(X5,r,W.exports.createElement(z5,{scope:e,contentId:u,open:y,stateAttribute:B,trigger:c,onTriggerChange:A,onTriggerEnter:W.exports.useCallback(()=>{l.isOpenDelayed?X():w()},[l.isOpenDelayed,X,w]),onOpen:W.exports.useCallback(w,[w]),onClose:W.exports.useCallback(()=>{window.clearTimeout(h.current),m(!1),v()},[m,v])},g))},L5=W.exports.forwardRef((t,e)=>{const c=t,{__scopeTooltip:g}=c,n=ye(c,["__scopeTooltip"]),I=zA("TooltipTrigger",g),o=kA(g),i=NA(e,I.onTriggerChange),l=W.exports.useRef(!1),r=W.exports.useCallback(()=>l.current=!1,[]);return W.exports.useEffect(()=>()=>document.removeEventListener("mouseup",r),[r]),W.exports.createElement(Y5,Le({asChild:!0},o),W.exports.createElement(C2.button,Le({"aria-describedby":I.open?I.contentId:void 0,"data-state":I.stateAttribute},n,{ref:i,onMouseEnter:Ki(t.onMouseEnter,I.onTriggerEnter),onMouseLeave:Ki(t.onMouseLeave,I.onClose),onMouseDown:Ki(t.onMouseDown,()=>{I.onClose(),l.current=!0,document.addEventListener("mouseup",r,{once:!0})}),onFocus:Ki(t.onFocus,()=>{l.current||I.onOpen()}),onBlur:Ki(t.onBlur,I.onClose),onClick:Ki(t.onClick,I.onClose)})))}),J5=W.exports.forwardRef((t,e)=>{const o=t,{forceMount:g}=o,n=ye(o,["forceMount"]),I=zA("TooltipContent",t.__scopeTooltip);return W.exports.createElement(d2,{present:g||I.open},W.exports.createElement(M5,Le({ref:e},n)))}),M5=W.exports.forwardRef((t,e)=>{const u=t,{__scopeTooltip:g,children:n,"aria-label":I,portalled:o=!0}=u,i=ye(u,["__scopeTooltip","children","aria-label","portalled"]),l=zA("TooltipContent",g),r=kA(g),c=o?A5:W.exports.Fragment,{onClose:A}=l;return H5(()=>A()),W.exports.useEffect(()=>(document.addEventListener("tooltip.open",A),()=>document.removeEventListener("tooltip.open",A)),[A]),W.exports.createElement(c,null,W.exports.createElement(Q5,{__scopeTooltip:g}),W.exports.createElement(K5,Le({"data-state":l.stateAttribute},r,i,{ref:e,style:Ze(_({},i.style),{"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)"})}),W.exports.createElement(t2,null,n),W.exports.createElement(r5,{id:l.contentId,role:"tooltip"},I||n)))}),E5=W.exports.forwardRef((t,e)=>{const o=t,{__scopeTooltip:g}=o,n=ye(o,["__scopeTooltip"]),I=kA(g);return W.exports.createElement(S5,Le({},I,n,{ref:e}))});function Q5(t){const{__scopeTooltip:e}=t,g=zA("CheckTriggerMoved",e),n=r2(g.trigger),I=n==null?void 0:n.left,o=N0(I),i=n==null?void 0:n.top,l=N0(i),r=g.onClose;return W.exports.useEffect(()=>{(o!==void 0&&o!==I||l!==void 0&&l!==i)&&r()},[r,o,l,I,i]),null}const T5=x5,U5=L5,D5=J5,j5=E5;function O5(t,e){if(t==null)return{};var g={},n=Object.keys(t),I,o;for(o=0;o<n.length;o++)I=n[o],!(e.indexOf(I)>=0)&&(g[I]=t[I]);return g}function Ee(t,e){if(t==null)return{};var g=O5(t,e),n,I;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(I=0;I<o.length;I++)n=o[I],!(e.indexOf(n)>=0)&&(!Object.prototype.propertyIsEnumerable.call(t,n)||(g[n]=t[n]))}return g}let st;(function(t){t[t.UNSUPPORTED_INPUT=0]="UNSUPPORTED_INPUT",t[t.NO_COMPONENT_FOR_TYPE=1]="NO_COMPONENT_FOR_TYPE",t[t.UNKNOWN_INPUT=2]="UNKNOWN_INPUT",t[t.DUPLICATE_KEYS=3]="DUPLICATE_KEYS",t[t.ALREADY_REGISTERED_TYPE=4]="ALREADY_REGISTERED_TYPE",t[t.CLIPBOARD_ERROR=5]="CLIPBOARD_ERROR",t[t.THEME_ERROR=6]="THEME_ERROR",t[t.PATH_DOESNT_EXIST=7]="PATH_DOESNT_EXIST",t[t.INPUT_TYPE_OVERRIDE=8]="INPUT_TYPE_OVERRIDE",t[t.EMPTY_KEY=9]="EMPTY_KEY"})(st||(st={}));const P5={[st.UNSUPPORTED_INPUT]:(t,e)=>[`An input with type \`${t}\` input was found at path \`${e}\` but it's not supported yet.`],[st.NO_COMPONENT_FOR_TYPE]:(t,e)=>[`Type \`${t}\` found at path \`${e}\` can't be displayed in panel because no component supports it yet.`],[st.UNKNOWN_INPUT]:(t,e)=>[`input at path \`${t}\` is not recognized.`,e],[st.DUPLICATE_KEYS]:(t,e,g)=>[`Key \`${t}\` of path \`${e}\` already exists at path \`${g}\`. Even nested keys need to be unique. Rename one of the keys.`],[st.ALREADY_REGISTERED_TYPE]:t=>[`Type ${t} has already been registered. You can't register a component with the same type.`],[st.CLIPBOARD_ERROR]:t=>["Error copying the value",t],[st.THEME_ERROR]:(t,e)=>[`Error accessing the theme \`${t}.${e}\` value.`],[st.PATH_DOESNT_EXIST]:t=>[`Error getting the value at path \`${t}\`. There is probably an error in your \`render\` function.`],[st.PATH_DOESNT_EXIST]:t=>[`Error accessing the value at path \`${t}\``],[st.INPUT_TYPE_OVERRIDE]:(t,e,g)=>[`Input at path \`${t}\` already exists with type: \`${e}\`. Its type cannot be overridden with type \`${g}\`.`],[st.EMPTY_KEY]:()=>["Keys can not be empty, if you want to hide a label use whitespace."]};function b2(t,e,...g){const[n,...I]=P5[e](...g);console[t]("LEVA: "+n,...I)}const dI=b2.bind(null,"warn"),_5=b2.bind(null,"log"),q5=["value"],$5=["schema"],e1=["value"],G2=[],ei={};function F0(t){let{value:e}=t,g=Ee(t,q5);for(let n of G2){const I=n(e,g);if(I)return I}}function VI(t,e){let{schema:g}=e,n=Ee(e,$5);if(t in ei){dI(st.ALREADY_REGISTERED_TYPE,t);return}G2.push((I,o)=>g(I,o)&&t),ei[t]=n}function Pu(t,e,g,n){const{normalize:I}=ei[t];if(I)return I(e,g,n);if(typeof e!="object"||!("value"in e))return{value:e};const{value:o}=e,i=Ee(e,e1);return{value:o,settings:i}}function t1(t,e,g,n,I,o){const{sanitize:i}=ei[t];return i?i(e,g,n,I,o):e}function k0(t,e,g){const{format:n}=ei[t];return n?n(e,g):e}function g1(t,e,g){return e in t?Object.defineProperty(t,e,{value:g,enumerable:!0,configurable:!0,writable:!0}):t[e]=g,t}function z0(t,e){var g=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(I){return Object.getOwnPropertyDescriptor(t,I).enumerable})),g.push.apply(g,n)}return g}function pe(t){for(var e=1;e<arguments.length;e++){var g=arguments[e]!=null?arguments[e]:{};e%2?z0(Object(g),!0).forEach(function(n){g1(t,n,g[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(g)):z0(Object(g)).forEach(function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(g,n))})}return t}const Ao=(t,e,g)=>t>g?g:t<e?e:t,n1=t=>{if(t===""||typeof t=="number")return t;try{const e=jI(t);if(!isNaN(e))return e}catch{}return parseFloat(t)},I1=Math.log(10);function x0(t){let e=Math.abs(+String(t).replace(".",""));if(e===0)return .01;for(;e!==0&&e%10===0;)e/=10;const g=Math.floor(Math.log(e)/I1)+1,n=Math.floor(Math.log10(Math.abs(t))),I=Math.pow(10,n-g);return Math.max(I,.001)}const eA=(t,e,g)=>g===e?0:(Ao(t,e,g)-e)/(g-e),tA=(t,e,g)=>t*(g-e)+e,o1=()=>"_"+Math.random().toString(36).substr(2,9),L0=/\(([0-9+\-*/^ .]+)\)/,J0=/(\d+(?:\.\d+)?) ?\^ ?(\d+(?:\.\d+)?)/,M0=/(\d+(?:\.\d+)?) ?\* ?(\d+(?:\.\d+)?)/,E0=/(\d+(?:\.\d+)?) ?\/ ?(\d+(?:\.\d+)?)/,Q0=/(\d+(?:\.\d+)?) ?\+ ?(\d+(?:\.\d+)?)/,T0=/(\d+(?:\.\d+)?) ?- ?(\d+(?:\.\d+)?)/;function jI(t){if(isNaN(Number(t)))if(L0.test(t)){const e=t.replace(L0,(g,n)=>String(jI(n)));return jI(e)}else if(J0.test(t)){const e=t.replace(J0,(g,n,I)=>String(Math.pow(Number(n),Number(I))));return jI(e)}else if(M0.test(t)){const e=t.replace(M0,(g,n,I)=>String(Number(n)*Number(I)));return jI(e)}else if(E0.test(t)){const e=t.replace(E0,(g,n,I)=>{if(I!=0)return String(Number(n)/Number(I));throw new Error("Division by zero")});return jI(e)}else if(Q0.test(t)){const e=t.replace(Q0,(g,n,I)=>String(Number(n)+Number(I)));return jI(e)}else if(T0.test(t)){const e=t.replace(T0,(g,n,I)=>String(Number(n)-Number(I)));return jI(e)}else return Number(t);return Number(t)}function i1(t,e){return e.reduce((g,n)=>(!!t&&t.hasOwnProperty(n)&&(g[n]=t[n]),g),{})}function C1(t,e){const g=pe({},t);return e.forEach(n=>n in t&&delete g[n]),g}function l1(t,e){return t.reduce((g,n,I)=>Object.assign(g,{[e[I]]:n}),{})}let Cn;(function(t){t.BUTTON="BUTTON",t.BUTTON_GROUP="BUTTON_GROUP",t.MONITOR="MONITOR",t.FOLDER="FOLDER"})(Cn||(Cn={}));let Wn;(function(t){t.SELECT="SELECT",t.IMAGE="IMAGE",t.NUMBER="NUMBER",t.COLOR="COLOR",t.STRING="STRING",t.BOOLEAN="BOOLEAN",t.INTERVAL="INTERVAL",t.VECTOR3D="VECTOR3D",t.VECTOR2D="VECTOR2D"})(Wn||(Wn={}));const s1=["type","__customInput"],r1=["render","label","optional","disabled","hint","onChange","onEditStart","onEditEnd","transient"],c1=["type"];function m2(t,e,g={},n){var I,o;if(typeof t!="object"||Array.isArray(t))return{type:n,input:t,options:pe({key:e,label:e,optional:!1,disabled:!1},g)};if("__customInput"in t){const{type:B,__customInput:w}=t,X=Ee(t,s1);return m2(w,e,X,B)}const{render:i,label:l,optional:r,disabled:c,hint:A,onChange:u,onEditStart:h,onEditEnd:b,transient:p}=t,Z=Ee(t,r1),v=pe({render:i,key:e,label:l!=null?l:e,hint:A,transient:p!=null?p:!!u,onEditStart:h,onEditEnd:b,disabled:c,optional:r},g);let{type:y}=Z,m=Ee(Z,c1);return y=n!=null?n:y,y in Cn?{type:y,input:m,options:v}:{type:y,input:m,options:pe(pe({},v),{},{onChange:u,optional:(I=v.optional)!==null&&I!==void 0?I:!1,disabled:(o=v.disabled)!==null&&o!==void 0?o:!1})}}function A1(t,e,g,n){const I=m2(t,e),{type:o,input:i,options:l}=I;if(o)return o in Cn?I:{type:o,input:Pu(o,i,g,n),options:l};let r=F0(i);return r?{type:r,input:Pu(r,i,g,n),options:l}:(r=F0({value:i}),r?{type:r,input:Pu(r,{value:i},g,n),options:l}:!1)}function U0(t,e,g,n,I){const{value:o,type:i,settings:l}=t;t.value=p2({type:i,value:o,settings:l},e,g,n),t.fromPanel=I}const D0=function(e,g,n){this.type="LEVA_ERROR",this.message="LEVA: "+e,this.previousValue=g,this.error=n};function p2({type:t,value:e,settings:g},n,I,o){const i=t!=="SELECT"&&typeof n=="function"?n(e):n;let l;try{l=t1(t,i,g,e,I,o)}catch(r){throw new D0(`The value \`${n}\` did not result in a correct value.`,e,r)}if(is(l,e))throw new D0(`The value \`${n}\` did not result in a value update, which remained the same: \`${e}\`.
|
|
113
|
+
You can ignore this warning if this is the intended behavior.`,e);return l}const B2=(t,e,g=!1)=>{let n=0;return function(){const I=arguments,o=g&&!n,i=()=>t.apply(this,I);window.clearTimeout(n),n=window.setTimeout(i,e),o&&i()}},Z2=t=>t.shiftKey?5:t.altKey?1/5:1,a1=["value"],u1=["min","max"],d1=t=>typeof t=="number"||typeof t=="string"&&!isNaN(parseFloat(t)),y2=(t,{min:e=-1/0,max:g=1/0,suffix:n})=>{const I=parseFloat(t);if(t===""||isNaN(I))throw Error("Invalid number");const o=Ao(I,e,g);return n?o+n:o},h1=(t,{pad:e=0,suffix:g})=>{const n=parseFloat(t).toFixed(e);return g?n+g:n},f2=t=>{let{value:e}=t,g=Ee(t,a1);const{min:n=-1/0,max:I=1/0}=g,o=Ee(g,u1),i=Ao(parseFloat(e),n,I);let l;if(!Number.isFinite(e)){const u=String(e).match(/[A-Z]+/i);u&&(l=u[0])}let r=g.step;r||(Number.isFinite(n)?Number.isFinite(I)?r=+(Math.abs(I-n)/100).toPrecision(1):r=+(Math.abs(i-n)/100).toPrecision(1):Number.isFinite(I)&&(r=+(Math.abs(I-i)/100).toPrecision(1)));const c=r?x0(r)*10:x0(i);r=r||c/10;const A=Math.round(Ao(Math.log10(1/c),0,2));return{value:l?i+l:i,settings:pe({initialValue:i,step:r,pad:A,min:n,max:I,suffix:l},o)}},v2=(t,{step:e,initialValue:g})=>{const n=Math.round((t-g)/e);return g+n*e};var W2=Object.freeze({__proto__:null,schema:d1,sanitize:y2,format:h1,normalize:f2,sanitizeStep:v2});const w2=W.exports.createContext({});function gg(){return W.exports.useContext(w2)}const Ob=W.exports.createContext(null),V2=W.exports.createContext(null),R2=W.exports.createContext(null);function xA(){return W.exports.useContext(V2)}function b1(){return W.exports.useContext(R2)}const X2=()=>({colors:{elevation1:"#292d39",elevation2:"#181c20",elevation3:"#373c4b",accent1:"#0066dc",accent2:"#007bff",accent3:"#3c93ff",highlight1:"#535760",highlight2:"#8c92a4",highlight3:"#fefefe",vivid1:"#ffcc00",folderWidgetColor:"$highlight2",folderTextColor:"$highlight3",toolTipBackground:"$highlight3",toolTipText:"$elevation2"},radii:{xs:"2px",sm:"3px",lg:"10px"},space:{xs:"3px",sm:"6px",md:"10px",rowGap:"7px",colGap:"7px"},fonts:{mono:"ui-monospace, SFMono-Regular, Menlo, 'Roboto Mono', monospace",sans:"system-ui, sans-serif"},fontSizes:{root:"11px",toolTip:"$root"},sizes:{rootWidth:"280px",controlWidth:"160px",numberInputMinWidth:"38px",scrubberWidth:"8px",scrubberHeight:"16px",rowHeight:"24px",folderTitleHeight:"20px",checkboxSize:"16px",joystickWidth:"100px",joystickHeight:"100px",colorPickerWidth:"$controlWidth",colorPickerHeight:"100px",imagePreviewWidth:"$controlWidth",imagePreviewHeight:"100px",monitorHeight:"60px",titleBarHeight:"39px"},shadows:{level1:"0 0 9px 0 #00000088",level2:"0 4px 14px #00000033"},borderWidths:{root:"0px",input:"1px",focus:"1px",hover:"1px",active:"1px",folder:"1px"},fontWeights:{label:"normal",folder:"normal",button:"normal"}});function gc(t,e){const[g,n]=t.split(" "),I={};return g!=="none"&&(I.boxShadow=`${e.inset?"inset ":""}0 0 0 $borderWidths${[e.key]} $colors${g!=="default"&&g||e.borderColor}`),n&&(I.backgroundColor=n),I}const al={$inputStyle:()=>t=>gc(t,{key:"$input",borderColor:"$highlight1",inset:!0}),$focusStyle:()=>t=>gc(t,{key:"$focus",borderColor:"$accent2"}),$hoverStyle:()=>t=>gc(t,{key:"$hover",borderColor:"$accent1",inset:!0}),$activeStyle:()=>t=>gc(t,{key:"$active",borderColor:"$accent1",inset:!0})},{styled:Ge,css:SL,createTheme:G1,globalCss:m1,keyframes:HL}=n5({prefix:"leva",theme:X2(),utils:pe(pe({},al),{},{$flex:()=>({display:"flex",alignItems:"center"}),$flexCenter:()=>({display:"flex",alignItems:"center",justifyContent:"center"}),$reset:()=>({outline:"none",fontSize:"inherit",fontWeight:"inherit",color:"inherit",fontFamily:"inherit",border:"none",backgroundColor:"transparent",appearance:"none"}),$draggable:()=>({touchAction:"none",WebkitUserDrag:"none",userSelect:"none"}),$focus:t=>({"&:focus":al.$focusStyle()(t)}),$focusWithin:t=>({"&:focus-within":al.$focusStyle()(t)}),$hover:t=>({"&:hover":al.$hoverStyle()(t)}),$active:t=>({"&:active":al.$activeStyle()(t)})})}),p1=m1({".leva__panel__dragged":{WebkitUserDrag:"none",userSelect:"none",input:{userSelect:"none"},"*":{cursor:"ew-resize !important"}}});function B1(t){const e=X2();if(!t)return{theme:e,className:""};Object.keys(t).forEach(n=>{Object.assign(e[n],t[n])});const g=G1(e);return{theme:e,className:g.className}}function ZI(t,e){const{theme:g}=W.exports.useContext(Ob);if(!(t in g)||!(e in g[t]))return dI(st.THEME_ERROR,t,e),"";let n=e;for(;;){let I=g[t][n];if(typeof I=="string"&&I.charAt(0)==="$")n=I.substr(1);else return I}}const Y2=Ge("input",{$reset:"",padding:"0 $sm",width:0,minWidth:0,flex:1,height:"100%",variants:{levaType:{number:{textAlign:"right"}},as:{textarea:{padding:"$sm"}}}}),K2=Ge("div",{$draggable:"",height:"100%",$flexCenter:"",position:"relative",padding:"0 $xs",fontSize:"0.8em",opacity:.8,cursor:"default",touchAction:"none",[`& + ${Y2}`]:{paddingLeft:0}}),Z1=Ge(K2,{cursor:"ew-resize",marginRight:"-$xs",textTransform:"uppercase",opacity:.3,"&:hover":{opacity:1},variants:{dragging:{true:{backgroundColor:"$accent2",opacity:1}}}}),y1=Ge("div",{$flex:"",position:"relative",borderRadius:"$sm",overflow:"hidden",color:"inherit",height:"$rowHeight",backgroundColor:"$elevation3",$inputStyle:"$elevation1",$hover:"",$focusWithin:"",variants:{textArea:{true:{height:"auto"}}}}),f1=["innerLabel","value","onUpdate","onChange","onKeyDown","type","id","inputType","rows"],v1=["onUpdate"];function Pb(t){let{innerLabel:e,value:g,onUpdate:n,onChange:I,onKeyDown:o,type:i,id:l,inputType:r="text",rows:c=0}=t,A=Ee(t,f1);const{id:u,emitOnEditStart:h,emitOnEditEnd:b,disabled:p}=gg(),Z=l||u,v=W.exports.useRef(null),y=c>0,m=y?"textarea":"input",B=W.exports.useCallback(R=>S=>{const Y=S.currentTarget.value;R(Y)},[]);ae.useEffect(()=>{const R=v.current,S=B(Y=>{n(Y),b()});return R==null||R.addEventListener("blur",S),()=>R==null?void 0:R.removeEventListener("blur",S)},[B,n,b]);const w=W.exports.useCallback(R=>{R.key==="Enter"&&B(n)(R)},[B,n]),X=Object.assign({as:m},y?{rows:c}:{},A);return we(y1,{textArea:y,children:[e&&typeof e=="string"?D(K2,{children:e}):e,D(Y2,_({levaType:i,ref:v,id:Z,type:r,autoComplete:"off",spellCheck:"false",value:g,onChange:B(I),onFocus:()=>h(),onKeyPress:w,onKeyDown:o,disabled:p},X))]})}function W1(t){let{onUpdate:e}=t,g=Ee(t,v1);const n=W.exports.useCallback(o=>e(n1(o)),[e]),I=W.exports.useCallback(o=>{const i=o.key==="ArrowUp"?1:o.key==="ArrowDown"?-1:0;if(i){o.preventDefault();const l=o.altKey?.1:o.shiftKey?10:1;e(r=>parseFloat(r)+i*l)}},[e]);return D(Pb,Ze(_({},g),{onUpdate:n,onKeyDown:I,type:"number"}))}const gA=Ge("div",{}),Bh=Ge("div",{position:"relative",background:"$elevation2",transition:"height 300ms ease",variants:{fill:{true:{},false:{}},flat:{false:{},true:{}},isRoot:{true:{},false:{paddingLeft:"$md","&::after":{content:'""',position:"absolute",left:0,top:0,width:"$borderWidths$folder",height:"100%",backgroundColor:"$folderWidgetColor",opacity:.4,transform:"translateX(-50%)"}}}},compoundVariants:[{isRoot:!0,fill:!1,css:{overflowY:"auto",maxHeight:"calc(100vh - 20px - $$titleBarHeight)"}},{isRoot:!0,flat:!1,css:{borderRadius:"$lg"}}]}),w1=Ge("div",{$flex:"",color:"$folderTextColor",userSelect:"none",cursor:"pointer",height:"$folderTitleHeight",fontWeight:"$folder","> svg":{marginLeft:-4,marginRight:4,cursor:"pointer",fill:"$folderWidgetColor",opacity:.6},"&:hover > svg":{fill:"$folderWidgetColor"},[`&:hover + ${Bh}::after`]:{opacity:.6},[`${gA}:hover > & + ${Bh}::after`]:{opacity:.6},[`${gA}:hover > & > svg`]:{opacity:1}}),S2=Ge("div",{position:"relative",display:"grid",gridTemplateColumns:"100%",rowGap:"$rowGap",transition:"opacity 250ms ease",variants:{toggled:{true:{opacity:1,transitionDelay:"250ms"},false:{opacity:0,transitionDelay:"0ms",pointerEvents:"none"}},isRoot:{true:{"& > div":{paddingLeft:"$md",paddingRight:"$md"},"& > div:first-of-type":{paddingTop:"$sm"},"& > div:last-of-type":{paddingBottom:"$sm"},[`> ${gA}:not(:first-of-type)`]:{paddingTop:"$sm",marginTop:"$md",borderTop:"$borderWidths$folder solid $colors$elevation1"}}}}}),H2=Ge("div",{position:"relative",zIndex:100,display:"grid",rowGap:"$rowGap",gridTemplateRows:"minmax($sizes$rowHeight, max-content)",alignItems:"center",color:"$highlight2",[`${S2} > &`]:{"&:first-of-type":{marginTop:"$rowGap"},"&:last-of-type":{marginBottom:"$rowGap"}},"&:hover,&:focus-within":{color:"$highlight3"}}),N2=Ge(H2,{gridTemplateColumns:"auto $sizes$controlWidth",columnGap:"$colGap"}),V1=Ge("div",{$flex:"",height:"100%",position:"relative",overflow:"hidden","& > div":{marginLeft:"$colGap",padding:"0 $xs",opacity:.4},"& > div:hover":{opacity:.8},"& > div > svg":{display:"none",cursor:"pointer",width:13,minWidth:13,height:13,backgroundColor:"$elevation2"},"&:hover > div > svg":{display:"block"},variants:{align:{top:{height:"100%",alignItems:"flex-start",paddingTop:"$sm"}}}}),R1=Ge("input",{$reset:"",height:0,width:0,opacity:0,margin:0,"& + label":{position:"relative",$flexCenter:"",height:"100%",userSelect:"none",cursor:"pointer",paddingLeft:2,paddingRight:"$sm",pointerEvents:"auto"},"& + label:after":{content:'""',width:6,height:6,backgroundColor:"$elevation3",borderRadius:"50%",$activeStyle:""},"&:focus + label:after":{$focusStyle:""},"& + label:active:after":{backgroundColor:"$accent1",$focusStyle:""},"&:checked + label:after":{backgroundColor:"$accent1"}}),X1=Ge("div",{opacity:1,variants:{disabled:{true:{opacity:.6,pointerEvents:"none"}}}}),j0=Ge("label",{fontWeight:"$label",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap","& > svg":{display:"block"}}),F2=Ge("div",{position:"fixed",top:0,bottom:0,right:0,left:0,zIndex:1e3,userSelect:"none"}),Y1=Ge("div",{background:"$toolTipBackground",fontFamily:"$sans",fontSize:"$toolTip",padding:"$xs $sm",color:"$toolTipText",borderRadius:"$xs",boxShadow:"$level2",maxWidth:260}),K1=Ge(j5,{fill:"$toolTipBackground"});function _b({children:t}){const{className:e}=W.exports.useContext(Ob);return D(WF,{className:e,children:t})}const S1=["align"];function H1(){const{id:t,disable:e,disabled:g}=gg();return we(oi,{children:[D(R1,{id:t+"__disable",type:"checkbox",checked:!g,onChange:()=>e(!g)}),D("label",{htmlFor:t+"__disable"})]})}function N1(t){const{id:e,optional:g,hint:n}=gg(),I=t.htmlFor||(e?{htmlFor:e}:null),o=!n&&typeof t.children=="string"?{title:t.children}:null;return we(oi,{children:[g&&D(H1,{}),n!==void 0?we(T5,{children:[D(U5,{asChild:!0,children:D(j0,_(_({},I),t))}),D(D5,{side:"top",sideOffset:2,children:we(Y1,{children:[n,D(K1,{})]})})]}):D(j0,_(_(_({},I),o),t))]})}function wn(t){let{align:e}=t,g=Ee(t,S1);const{value:n,label:I,key:o}=gg(),{hideCopyButton:i}=b1(),l=!i&&o!==void 0,[r,c]=W.exports.useState(!1),A=async()=>{try{await navigator.clipboard.writeText(JSON.stringify({[o]:n!=null?n:""})),c(!0)}catch{dI(st.CLIPBOARD_ERROR,{[o]:n})}};return we(V1,{align:e,onPointerLeave:()=>c(!1),children:[D(N1,_({},g)),l&&D("div",{title:`Click to copy ${typeof I=="string"?I:o} value`,children:r?we("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",children:[D("path",{d:"M9 2a1 1 0 000 2h2a1 1 0 100-2H9z"}),D("path",{fillRule:"evenodd",d:"M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm9.707 5.707a1 1 0 00-1.414-1.414L9 12.586l-1.293-1.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",clipRule:"evenodd"})]}):we("svg",{onClick:A,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",fill:"currentColor",children:[D("path",{d:"M8 3a1 1 0 011-1h2a1 1 0 110 2H9a1 1 0 01-1-1z"}),D("path",{d:"M6 3a2 2 0 00-2 2v11a2 2 0 002 2h8a2 2 0 002-2V5a2 2 0 00-2-2 3 3 0 01-3 3H9a3 3 0 01-3-3z"})]})})]})}const F1=["toggled"],k1=Ge("svg",{fill:"currentColor",transition:"transform 350ms ease, fill 250ms ease"});function qb(t){let{toggled:e}=t,g=Ee(t,F1);return D(k1,Ze(_({width:"9",height:"5",viewBox:"0 0 9 5",xmlns:"http://www.w3.org/2000/svg",style:{transform:`rotate(${e?0:-90}deg)`}},g),{children:D("path",{d:"M3.8 4.4c.4.3 1 .3 1.4 0L8 1.7A1 1 0 007.4 0H1.6a1 1 0 00-.7 1.7l3 2.7z"})}))}const z1=["input"];function rn(t){let{input:e}=t,g=Ee(t,z1);return e?D(N2,_({},g)):D(H2,_({},g))}function k2({value:t,type:e,settings:g,setValue:n}){const[I,o]=W.exports.useState(k0(e,t,g)),i=W.exports.useRef(t),l=W.exports.useRef(g);l.current=g;const r=W.exports.useCallback(A=>o(k0(e,A,l.current)),[e]),c=W.exports.useCallback(A=>{try{n(A)}catch(u){const{type:h,previousValue:b}=u;if(h!=="LEVA_ERROR")throw u;r(b)}},[r,n]);return W.exports.useEffect(()=>{is(t,i.current)||r(t),i.current=t},[t,r]),{displayValue:I,onChange:o,onUpdate:c}}function ps(t,e){const{emitOnEditStart:g,emitOnEditEnd:n}=gg();return BK(I=>{I.first&&(document.body.classList.add("leva__panel__dragged"),g==null||g());const o=t(I);return I.last&&(document.body.classList.remove("leva__panel__dragged"),n==null||n()),o},e)}function x1(t){const e=W.exports.useRef(null),g=W.exports.useRef(null),n=W.exports.useRef(!1);return W.exports.useEffect(()=>{const I=B2(()=>{e.current.width=e.current.offsetWidth*window.devicePixelRatio,e.current.height=e.current.offsetHeight*window.devicePixelRatio,t(e.current,g.current)},250);return window.addEventListener("resize",I),n.current||(I(),n.current=!0),()=>window.removeEventListener("resize",I)},[t]),W.exports.useEffect(()=>{g.current=e.current.getContext("2d")},[]),[e,g]}function z2(){const t=W.exports.useRef(null),e=W.exports.useRef({x:0,y:0}),g=W.exports.useCallback(n=>{Object.assign(e.current,n),t.current&&(t.current.style.transform=`translate3d(${e.current.x}px, ${e.current.y}px, 0)`)},[]);return[t,g]}const L1=["__refCount"],_u=(t,e)=>{if(!t[e])return null;const g=t[e];return Ee(g,L1)};function J1(t){const e=xA(),[g,n]=W.exports.useState(_u(e.getData(),t)),I=W.exports.useCallback(c=>e.setValueAtPath(t,c,!0),[t,e]),o=W.exports.useCallback(c=>e.setSettingsAtPath(t,c),[t,e]),i=W.exports.useCallback(c=>e.disableInputAtPath(t,c),[t,e]),l=W.exports.useCallback(()=>e.emitOnEditStart(t),[t,e]),r=W.exports.useCallback(()=>e.emitOnEditEnd(t),[t,e]);return W.exports.useEffect(()=>{n(_u(e.getData(),t));const c=e.useStore.subscribe(A=>_u(A.data,t),n,{equalityFn:bs});return()=>c()},[e,t]),[g,{set:I,setSettings:o,disable:i,storeId:e.storeId,emitOnEditStart:l,emitOnEditEnd:r}]}const M1=Ge("div",{variants:{hasRange:{true:{position:"relative",display:"grid",gridTemplateColumns:"auto $sizes$numberInputMinWidth",columnGap:"$colGap",alignItems:"center"}}}}),x2=Ge("div",{position:"relative",width:"100%",height:2,borderRadius:"$xs",backgroundColor:"$elevation1"}),Zh=Ge("div",{position:"absolute",width:"$scrubberWidth",height:"$scrubberHeight",borderRadius:"$xs",boxShadow:"0 0 0 2px $colors$elevation2",backgroundColor:"$accent2",cursor:"pointer",$active:"none $accent1",$hover:"none $accent3",variants:{position:{left:{borderTopRightRadius:0,borderBottomRightRadius:0,transform:"translateX(calc(-0.5 * ($sizes$scrubberWidth + 4px)))"},right:{borderTopLeftRadius:0,borderBottomLeftRadius:0,transform:"translateX(calc(0.5 * ($sizes$scrubberWidth + 4px)))"}}}}),L2=Ge("div",{position:"relative",$flex:"",height:"100%",cursor:"pointer",touchAction:"none"}),J2=Ge("div",{position:"absolute",height:"100%",backgroundColor:"$accent2"});function E1({value:t,min:e,max:g,onDrag:n,step:I,initialValue:o}){const i=W.exports.useRef(null),l=W.exports.useRef(null),r=W.exports.useRef(0),c=ZI("sizes","scrubberWidth"),A=ps(({event:h,first:b,xy:[p],movement:[Z],memo:v})=>{if(b){const{width:m,left:B}=i.current.getBoundingClientRect();r.current=m-parseFloat(c),v=(h==null?void 0:h.target)===l.current?t:tA((p-B)/m,e,g)}const y=v+tA(Z/r.current,0,g-e);return n(v2(y,{step:I,initialValue:o})),v}),u=eA(t,e,g);return we(L2,Ze(_({ref:i},A()),{children:[D(x2,{children:D(J2,{style:{left:0,right:`${(1-u)*100}%`}})}),D(Zh,{ref:l,style:{left:`calc(${u} * (100% - ${c}))`}})]}))}const Q1=ae.memo(({label:t,onUpdate:e,step:g,innerLabelTrim:n})=>{const[I,o]=W.exports.useState(!1),i=ps(({active:l,delta:[r],event:c,memo:A=0})=>(o(l),A+=r/2,Math.abs(A)>=1&&(e(u=>parseFloat(u)+Math.floor(A)*g*Z2(c)),A=0),A));return D(Z1,Ze(_({dragging:I,title:t.length>1?t:""},i()),{children:t.slice(0,n)}))});function M2({label:t,id:e,displayValue:g,onUpdate:n,onChange:I,settings:o,innerLabelTrim:i=1}){const l=i>0&&D(Q1,{label:t,step:o.step,onUpdate:n,innerLabelTrim:i});return D(W1,{id:e,value:String(g),onUpdate:n,onChange:I,innerLabel:l})}function T1(){const t=gg(),{label:e,value:g,onUpdate:n,settings:I,id:o}=t,{min:i,max:l}=I,r=l!==1/0&&i!==-1/0;return we(rn,{input:!0,children:[D(wn,{children:e}),we(M1,{hasRange:r,children:[r&&D(E1,_({value:parseFloat(g),onDrag:n},I)),D(M2,Ze(_({},t),{id:o,label:"value",innerLabelTrim:r?0:1}))]})]})}const{sanitizeStep:U1}=W2,D1=Ee(W2,["sanitizeStep"]);var j1=pe({component:T1},D1);const O1=(t,e)=>Rg().schema({options:Rg().passesAnyOf(Rg().object(),Rg().array())}).test(e),P1=(t,{values:e})=>{if(e.indexOf(t)<0)throw Error("Selected value doesn't match Select options");return t},_1=(t,{values:e})=>e.indexOf(t),q1=t=>{let{value:e,options:g}=t,n,I;return Array.isArray(g)?(I=g,n=g.map(o=>String(o))):(I=Object.values(g),n=Object.keys(g)),"value"in t?I.includes(e)||(n.unshift(String(e)),I.unshift(e)):e=I[0],Object.values(g).includes(e)||(g[String(e)]=e),{value:e,settings:{keys:n,values:I}}};var $1=Object.freeze({__proto__:null,schema:O1,sanitize:P1,format:_1,normalize:q1});const ek=Ge("div",{$flexCenter:"",position:"relative","> svg":{pointerEvents:"none",position:"absolute",right:"$md"}}),yh=Ge("select",{position:"absolute",top:0,left:0,width:"100%",height:"100%",opacity:0}),tk=Ge("div",{display:"flex",alignItems:"center",width:"100%",height:"$rowHeight",backgroundColor:"$elevation3",borderRadius:"$sm",padding:"0 $sm",cursor:"pointer",[`${yh}:focus + &`]:{$focusStyle:""},[`${yh}:hover + &`]:{$hoverStyle:""}});function gk({displayValue:t,value:e,onUpdate:g,id:n,settings:I,disabled:o}){const{keys:i,values:l}=I,r=W.exports.useRef();return e===l[t]&&(r.current=i[t]),we(ek,{children:[D(yh,{id:n,value:t,onChange:c=>g(l[Number(c.currentTarget.value)]),disabled:o,children:i.map((c,A)=>D("option",{value:A,children:c},c))}),D(tk,{children:r.current}),D(qb,{toggled:!0})]})}function nk(){const{label:t,value:e,displayValue:g,onUpdate:n,id:I,disabled:o,settings:i}=gg();return we(rn,{input:!0,children:[D(wn,{children:t}),D(gk,{id:I,value:e,displayValue:g,onUpdate:n,settings:i,disabled:o})]})}var Ik=pe({component:nk},$1);const ok=t=>Rg().string().test(t),ik=t=>{if(typeof t!="string")throw Error("Invalid string");return t},Ck=({value:t,editable:e=!0,rows:g=!1})=>({value:t,settings:{editable:e,rows:typeof g=="number"?g:g?5:0}});var lk=Object.freeze({__proto__:null,schema:ok,sanitize:ik,normalize:Ck});const sk=["displayValue","onUpdate","onChange","editable"],rk=Ge("div",{whiteSpace:"pre-wrap"});function ck(t){let{displayValue:e,onUpdate:g,onChange:n,editable:I=!0}=t,o=Ee(t,sk);return I?D(Pb,_({value:e,onUpdate:g,onChange:n},o)):D(rk,{children:e})}function Ak(){const{label:t,settings:e,displayValue:g,onUpdate:n,onChange:I}=gg();return we(rn,{input:!0,children:[D(wn,{children:t}),D(ck,_({displayValue:g,onUpdate:n,onChange:I},e))]})}var ak=pe({component:Ak},lk);const uk=t=>Rg().boolean().test(t),dk=t=>{if(typeof t!="boolean")throw Error("Invalid boolean");return t};var hk=Object.freeze({__proto__:null,schema:uk,sanitize:dk});const bk=Ge("div",{position:"relative",$flex:"",height:"$rowHeight",input:{$reset:"",height:0,width:0,opacity:0,margin:0},label:{position:"relative",$flexCenter:"",userSelect:"none",cursor:"pointer",height:"$checkboxSize",width:"$checkboxSize",backgroundColor:"$elevation3",borderRadius:"$sm",$hover:""},"input:focus + label":{$focusStyle:""},"input:focus:checked + label, input:checked + label:hover":{$hoverStyle:"$accent3"},"input + label:active":{backgroundColor:"$accent1"},"input:checked + label:active":{backgroundColor:"$accent1"},"label > svg":{display:"none",width:"90%",height:"90%",stroke:"$highlight3"},"input:checked + label":{backgroundColor:"$accent2"},"input:checked + label > svg":{display:"block"}});function Gk({value:t,onUpdate:e,id:g,disabled:n}){return we(bk,{children:[D("input",{id:g,type:"checkbox",checked:t,onChange:I=>e(I.currentTarget.checked),disabled:n}),D("label",{htmlFor:g,children:D("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:D("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})})]})}function mk(){const{label:t,value:e,onUpdate:g,disabled:n,id:I}=gg();return we(rn,{input:!0,children:[D(wn,{children:t}),D(Gk,{value:e,onUpdate:g,id:I,disabled:n})]})}var pk=pe({component:mk},hk);const Bk=["locked"];function Zk({value:t,id:e,valueKey:g,settings:n,onUpdate:I,innerLabelTrim:o}){const i=W.exports.useRef(t[g]);i.current=t[g];const l=W.exports.useCallback(c=>I({[g]:p2({type:"NUMBER",value:i.current,settings:n},c)}),[I,n,g]),r=k2({type:"NUMBER",value:t[g],settings:n,setValue:l});return D(M2,{id:e,label:g,value:t[g],displayValue:r.displayValue,onUpdate:r.onUpdate,onChange:r.onChange,settings:n,innerLabelTrim:o})}const yk=Ge("div",{display:"grid",columnGap:"$colGap",gridAutoFlow:"column dense",alignItems:"center",variants:{withLock:{true:{gridTemplateColumns:"10px auto","> svg":{cursor:"pointer"}}}}});function fk(t){let{locked:e}=t,g=Ee(t,Bk);return D("svg",Ze(_({width:"10",height:"10",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},g),{children:e?D("path",{d:"M5 4.63601C5 3.76031 5.24219 3.1054 5.64323 2.67357C6.03934 2.24705 6.64582 1.9783 7.5014 1.9783C8.35745 1.9783 8.96306 2.24652 9.35823 2.67208C9.75838 3.10299 10 3.75708 10 4.63325V5.99999H5V4.63601ZM4 5.99999V4.63601C4 3.58148 4.29339 2.65754 4.91049 1.99307C5.53252 1.32329 6.42675 0.978302 7.5014 0.978302C8.57583 0.978302 9.46952 1.32233 10.091 1.99162C10.7076 2.65557 11 3.57896 11 4.63325V5.99999H12C12.5523 5.99999 13 6.44771 13 6.99999V13C13 13.5523 12.5523 14 12 14H3C2.44772 14 2 13.5523 2 13V6.99999C2 6.44771 2.44772 5.99999 3 5.99999H4ZM3 6.99999H12V13H3V6.99999Z",fill:"currentColor",fillRule:"evenodd",clipRule:"evenodd"}):D("path",{d:"M9 3.63601C9 2.76044 9.24207 2.11211 9.64154 1.68623C10.0366 1.26502 10.6432 1 11.5014 1C12.4485 1 13.0839 1.30552 13.4722 1.80636C13.8031 2.23312 14 2.84313 14 3.63325H15C15 2.68242 14.7626 1.83856 14.2625 1.19361C13.6389 0.38943 12.6743 0 11.5014 0C10.4294 0 9.53523 0.337871 8.91218 1.0021C8.29351 1.66167 8 2.58135 8 3.63601V6H1C0.447715 6 0 6.44772 0 7V13C0 13.5523 0.447715 14 1 14H10C10.5523 14 11 13.5523 11 13V7C11 6.44772 10.5523 6 10 6H9V3.63601ZM1 7H10V13H1V7Z",fill:"currentColor",fillRule:"evenodd",clipRule:"evenodd"})}))}function $b({value:t,onUpdate:e,settings:g,innerLabelTrim:n}){const{id:I,setSettings:o}=gg(),{lock:i,locked:l}=g;return we(yk,{withLock:i,children:[i&&D(fk,{locked:l,onClick:()=>o({locked:!l})}),Object.keys(t).map((r,c)=>D(Zk,{id:c===0?I:`${I}.${r}`,valueKey:r,value:t,settings:g[r],onUpdate:e,innerLabelTrim:n},r))]})}const E2=(t,e)=>{const g={};let n=0,I=1/0;Object.entries(t).forEach(([o,i])=>{g[o]=f2(pe({value:i},e[o])).settings,n=Math.max(n,g[o].step),I=Math.min(I,g[o].pad)});for(let o in g){const{step:i,min:l,max:r}=e[o]||{};!isFinite(i)&&(!isFinite(l)||!isFinite(r))&&(g[o].step=n,g[o].pad=I)}return g},vk=["lock"],Wk=["value"];function wk(t){const e=Rg().array().length(t).every.number(),g=n=>{if(!n||typeof n!="object")return!1;const I=Object.values(n);return I.length===t&&I.every(o=>isFinite(o))};return n=>e.test(n)||g(n)}function Vk(t){return Array.isArray(t)?"array":"object"}function Sl(t,e,g){return Vk(t)===e?t:e==="array"?Object.values(t):l1(t,g)}const Rk=(t,e,g)=>{const n=Sl(t,"object",e.keys);for(let i in n)n[i]=y2(n[i],e[i]);const I=Object.keys(n);let o={};if(I.length===e.keys.length)o=n;else{const i=Sl(g,"object",e.keys);if(I.length===1&&e.locked){const l=I[0],r=n[l],c=i[l],A=c!==0?r/c:1;for(let u in i)u===l?o[l]=r:o[u]=i[u]*A}else o=pe(pe({},i),n)}return Sl(o,e.format,e.keys)},Xk=(t,e)=>Sl(t,"object",e.keys),Yk=t=>!!t&&("step"in t||"min"in t||"max"in t);function Kk(t,e,g=[]){const{lock:n=!1}=e,I=Ee(e,vk),o=Array.isArray(t)?"array":"object",i=o==="object"?Object.keys(t):g,l=Sl(t,"object",i),r=Yk(I)?i.reduce((A,u)=>Object.assign(A,{[u]:I}),{}):I,c=E2(l,r);return{value:o==="array"?t:l,settings:pe(pe({},c),{},{format:o,keys:i,lock:n,locked:!1})}}function Q2(t){return{schema:wk(t.length),normalize:e=>{let{value:g}=e,n=Ee(e,Wk);return Kk(g,n,t)},format:(e,g)=>Xk(e,g),sanitize:(e,g,n)=>Rk(e,g,n)}}var Sk={grad:.9,turn:360,rad:360/(2*Math.PI)},cI=function(t){return typeof t=="string"?t.length>0:typeof t=="number"},Ft=function(t,e,g){return e===void 0&&(e=0),g===void 0&&(g=Math.pow(10,e)),Math.round(g*t)/g+0},gn=function(t,e,g){return e===void 0&&(e=0),g===void 0&&(g=1),t>g?g:t>e?t:e},T2=function(t){return(t=isFinite(t)?t%360:0)>0?t:t+360},O0=function(t){return{r:gn(t.r,0,255),g:gn(t.g,0,255),b:gn(t.b,0,255),a:gn(t.a)}},qu=function(t){return{r:Ft(t.r),g:Ft(t.g),b:Ft(t.b),a:Ft(t.a,3)}},Hk=/^#([0-9a-f]{3,8})$/i,nc=function(t){var e=t.toString(16);return e.length<2?"0"+e:e},U2=function(t){var e=t.r,g=t.g,n=t.b,I=t.a,o=Math.max(e,g,n),i=o-Math.min(e,g,n),l=i?o===e?(g-n)/i:o===g?2+(n-e)/i:4+(e-g)/i:0;return{h:60*(l<0?l+6:l),s:o?i/o*100:0,v:o/255*100,a:I}},D2=function(t){var e=t.h,g=t.s,n=t.v,I=t.a;e=e/360*6,g/=100,n/=100;var o=Math.floor(e),i=n*(1-g),l=n*(1-(e-o)*g),r=n*(1-(1-e+o)*g),c=o%6;return{r:255*[n,l,i,i,r,n][c],g:255*[r,n,n,l,i,i][c],b:255*[i,i,r,n,n,l][c],a:I}},P0=function(t){return{h:T2(t.h),s:gn(t.s,0,100),l:gn(t.l,0,100),a:gn(t.a)}},_0=function(t){return{h:Ft(t.h),s:Ft(t.s),l:Ft(t.l),a:Ft(t.a,3)}},q0=function(t){return D2((g=(e=t).s,{h:e.h,s:(g*=((n=e.l)<50?n:100-n)/100)>0?2*g/(n+g)*100:0,v:n+g,a:e.a}));var e,g,n},Hl=function(t){return{h:(e=U2(t)).h,s:(I=(200-(g=e.s))*(n=e.v)/100)>0&&I<200?g*n/100/(I<=100?I:200-I)*100:0,l:I/2,a:e.a};var e,g,n,I},Nk=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,Fk=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,kk=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,zk=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,fh={string:[[function(t){var e=Hk.exec(t);return e?(t=e[1]).length<=4?{r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16),a:t.length===4?Ft(parseInt(t[3]+t[3],16)/255,2):1}:t.length===6||t.length===8?{r:parseInt(t.substr(0,2),16),g:parseInt(t.substr(2,2),16),b:parseInt(t.substr(4,2),16),a:t.length===8?Ft(parseInt(t.substr(6,2),16)/255,2):1}:null:null},"hex"],[function(t){var e=kk.exec(t)||zk.exec(t);return e?e[2]!==e[4]||e[4]!==e[6]?null:O0({r:Number(e[1])/(e[2]?100/255:1),g:Number(e[3])/(e[4]?100/255:1),b:Number(e[5])/(e[6]?100/255:1),a:e[7]===void 0?1:Number(e[7])/(e[8]?100:1)}):null},"rgb"],[function(t){var e=Nk.exec(t)||Fk.exec(t);if(!e)return null;var g,n,I=P0({h:(g=e[1],n=e[2],n===void 0&&(n="deg"),Number(g)*(Sk[n]||1)),s:Number(e[3]),l:Number(e[4]),a:e[5]===void 0?1:Number(e[5])/(e[6]?100:1)});return q0(I)},"hsl"]],object:[[function(t){var e=t.r,g=t.g,n=t.b,I=t.a,o=I===void 0?1:I;return cI(e)&&cI(g)&&cI(n)?O0({r:Number(e),g:Number(g),b:Number(n),a:Number(o)}):null},"rgb"],[function(t){var e=t.h,g=t.s,n=t.l,I=t.a,o=I===void 0?1:I;if(!cI(e)||!cI(g)||!cI(n))return null;var i=P0({h:Number(e),s:Number(g),l:Number(n),a:Number(o)});return q0(i)},"hsl"],[function(t){var e=t.h,g=t.s,n=t.v,I=t.a,o=I===void 0?1:I;if(!cI(e)||!cI(g)||!cI(n))return null;var i=function(l){return{h:T2(l.h),s:gn(l.s,0,100),v:gn(l.v,0,100),a:gn(l.a)}}({h:Number(e),s:Number(g),v:Number(n),a:Number(o)});return D2(i)},"hsv"]]},$0=function(t,e){for(var g=0;g<e.length;g++){var n=e[g][0](t);if(n)return[n,e[g][1]]}return[null,void 0]},j2=function(t){return typeof t=="string"?$0(t.trim(),fh.string):typeof t=="object"&&t!==null?$0(t,fh.object):[null,void 0]},xk=function(t){return j2(t)[1]},$u=function(t,e){var g=Hl(t);return{h:g.h,s:gn(g.s+100*e,0,100),l:g.l,a:g.a}},ed=function(t){return(299*t.r+587*t.g+114*t.b)/1e3/255},eZ=function(t,e){var g=Hl(t);return{h:g.h,s:g.s,l:gn(g.l+100*e,0,100),a:g.a}},vh=function(){function t(e){this.parsed=j2(e)[0],this.rgba=this.parsed||{r:0,g:0,b:0,a:1}}return t.prototype.isValid=function(){return this.parsed!==null},t.prototype.brightness=function(){return Ft(ed(this.rgba),2)},t.prototype.isDark=function(){return ed(this.rgba)<.5},t.prototype.isLight=function(){return ed(this.rgba)>=.5},t.prototype.toHex=function(){return e=qu(this.rgba),g=e.r,n=e.g,I=e.b,i=(o=e.a)<1?nc(Ft(255*o)):"","#"+nc(g)+nc(n)+nc(I)+i;var e,g,n,I,o,i},t.prototype.toRgb=function(){return qu(this.rgba)},t.prototype.toRgbString=function(){return e=qu(this.rgba),g=e.r,n=e.g,I=e.b,(o=e.a)<1?"rgba("+g+", "+n+", "+I+", "+o+")":"rgb("+g+", "+n+", "+I+")";var e,g,n,I,o},t.prototype.toHsl=function(){return _0(Hl(this.rgba))},t.prototype.toHslString=function(){return e=_0(Hl(this.rgba)),g=e.h,n=e.s,I=e.l,(o=e.a)<1?"hsla("+g+", "+n+"%, "+I+"%, "+o+")":"hsl("+g+", "+n+"%, "+I+"%)";var e,g,n,I,o},t.prototype.toHsv=function(){return e=U2(this.rgba),{h:Ft(e.h),s:Ft(e.s),v:Ft(e.v),a:Ft(e.a,3)};var e},t.prototype.invert=function(){return Cg({r:255-(e=this.rgba).r,g:255-e.g,b:255-e.b,a:e.a});var e},t.prototype.saturate=function(e){return e===void 0&&(e=.1),Cg($u(this.rgba,e))},t.prototype.desaturate=function(e){return e===void 0&&(e=.1),Cg($u(this.rgba,-e))},t.prototype.grayscale=function(){return Cg($u(this.rgba,-1))},t.prototype.lighten=function(e){return e===void 0&&(e=.1),Cg(eZ(this.rgba,e))},t.prototype.darken=function(e){return e===void 0&&(e=.1),Cg(eZ(this.rgba,-e))},t.prototype.rotate=function(e){return e===void 0&&(e=15),this.hue(this.hue()+e)},t.prototype.alpha=function(e){return typeof e=="number"?Cg({r:(g=this.rgba).r,g:g.g,b:g.b,a:e}):Ft(this.rgba.a,3);var g},t.prototype.hue=function(e){var g=Hl(this.rgba);return typeof e=="number"?Cg({h:e,s:g.s,l:g.l,a:g.a}):Ft(g.h)},t.prototype.isEqual=function(e){return this.toHex()===Cg(e).toHex()},t}(),Cg=function(t){return t instanceof vh?t:new vh(t)},tZ=[],Lk=function(t){t.forEach(function(e){tZ.indexOf(e)<0&&(e(vh,fh),tZ.push(e))})};function Jk(t,e){var g={white:"#ffffff",bisque:"#ffe4c4",blue:"#0000ff",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",antiquewhite:"#faebd7",aqua:"#00ffff",azure:"#f0ffff",whitesmoke:"#f5f5f5",papayawhip:"#ffefd5",plum:"#dda0dd",blanchedalmond:"#ffebcd",black:"#000000",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",cornsilk:"#fff8dc",cornflowerblue:"#6495ed",burlywood:"#deb887",aquamarine:"#7fffd4",beige:"#f5f5dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkkhaki:"#bdb76b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",peachpuff:"#ffdab9",darkmagenta:"#8b008b",darkred:"#8b0000",darkorchid:"#9932cc",darkorange:"#ff8c00",darkslateblue:"#483d8b",gray:"#808080",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",deeppink:"#ff1493",deepskyblue:"#00bfff",wheat:"#f5deb3",firebrick:"#b22222",floralwhite:"#fffaf0",ghostwhite:"#f8f8ff",darkviolet:"#9400d3",magenta:"#ff00ff",green:"#008000",dodgerblue:"#1e90ff",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",blueviolet:"#8a2be2",forestgreen:"#228b22",lawngreen:"#7cfc00",indianred:"#cd5c5c",indigo:"#4b0082",fuchsia:"#ff00ff",brown:"#a52a2a",maroon:"#800000",mediumblue:"#0000cd",lightcoral:"#f08080",darkturquoise:"#00ced1",lightcyan:"#e0ffff",ivory:"#fffff0",lightyellow:"#ffffe0",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",linen:"#faf0e6",mediumaquamarine:"#66cdaa",lemonchiffon:"#fffacd",lime:"#00ff00",khaki:"#f0e68c",mediumseagreen:"#3cb371",limegreen:"#32cd32",mediumspringgreen:"#00fa9a",lightskyblue:"#87cefa",lightblue:"#add8e6",midnightblue:"#191970",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",mintcream:"#f5fffa",lightslategray:"#778899",lightslategrey:"#778899",navajowhite:"#ffdead",navy:"#000080",mediumvioletred:"#c71585",powderblue:"#b0e0e6",palegoldenrod:"#eee8aa",oldlace:"#fdf5e6",paleturquoise:"#afeeee",mediumturquoise:"#48d1cc",mediumorchid:"#ba55d3",rebeccapurple:"#663399",lightsteelblue:"#b0c4de",mediumslateblue:"#7b68ee",thistle:"#d8bfd8",tan:"#d2b48c",orchid:"#da70d6",mediumpurple:"#9370db",purple:"#800080",pink:"#ffc0cb",skyblue:"#87ceeb",springgreen:"#00ff7f",palegreen:"#98fb98",red:"#ff0000",yellow:"#ffff00",slateblue:"#6a5acd",lavenderblush:"#fff0f5",peru:"#cd853f",palevioletred:"#db7093",violet:"#ee82ee",teal:"#008080",slategray:"#708090",slategrey:"#708090",aliceblue:"#f0f8ff",darkseagreen:"#8fbc8f",darkolivegreen:"#556b2f",greenyellow:"#adff2f",seagreen:"#2e8b57",seashell:"#fff5ee",tomato:"#ff6347",silver:"#c0c0c0",sienna:"#a0522d",lavender:"#e6e6fa",lightgreen:"#90ee90",orange:"#ffa500",orangered:"#ff4500",steelblue:"#4682b4",royalblue:"#4169e1",turquoise:"#40e0d0",yellowgreen:"#9acd32",salmon:"#fa8072",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",darksalmon:"#e9967a",lightgoldenrodyellow:"#fafad2",snow:"#fffafa",lightgrey:"#d3d3d3",lightgray:"#d3d3d3",dimgray:"#696969",dimgrey:"#696969",olivedrab:"#6b8e23",olive:"#808000"},n={};for(var I in g)n[g[I]]=I;var o={};t.prototype.toName=function(i){if(!(this.rgba.a||this.rgba.r||this.rgba.g||this.rgba.b))return"transparent";var l,r,c=n[this.toHex()];if(c)return c;if(i!=null&&i.closest){var A=this.toRgb(),u=1/0,h="black";if(!o.length)for(var b in g)o[b]=new t(g[b]).toRgb();for(var p in g){var Z=(l=A,r=o[p],Math.pow(l.r-r.r,2)+Math.pow(l.g-r.g,2)+Math.pow(l.b-r.b,2));Z<u&&(u=Z,h=p)}return h}},e.string.push([function(i){var l=i.toLowerCase(),r=l==="transparent"?"#0000":g[l];return r?new t(r).toRgb():null},"name"])}function ii(){return(ii=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var g=arguments[e];for(var n in g)Object.prototype.hasOwnProperty.call(g,n)&&(t[n]=g[n])}return t}).apply(this,arguments)}function eG(t,e){if(t==null)return{};var g,n,I={},o=Object.keys(t);for(n=0;n<o.length;n++)e.indexOf(g=o[n])>=0||(I[g]=t[g]);return I}function Wh(t){var e=W.exports.useRef(t),g=W.exports.useRef(function(n){e.current&&e.current(n)});return e.current=t,g.current}var hC=function(t,e,g){return e===void 0&&(e=0),g===void 0&&(g=1),t>g?g:t<e?e:t},Nl=function(t){return"touches"in t},wh=function(t){return t&&t.ownerDocument.defaultView||self},gZ=function(t,e,g){var n=t.getBoundingClientRect(),I=Nl(e)?function(o,i){for(var l=0;l<o.length;l++)if(o[l].identifier===i)return o[l];return o[0]}(e.touches,g):e;return{left:hC((I.pageX-(n.left+wh(t).pageXOffset))/n.width),top:hC((I.pageY-(n.top+wh(t).pageYOffset))/n.height)}},nZ=function(t){!Nl(t)&&t.preventDefault()},tG=ae.memo(function(t){var e=t.onMove,g=t.onKey,n=eG(t,["onMove","onKey"]),I=W.exports.useRef(null),o=Wh(e),i=Wh(g),l=W.exports.useRef(null),r=W.exports.useRef(!1),c=W.exports.useMemo(function(){var b=function(v){nZ(v),(Nl(v)?v.touches.length>0:v.buttons>0)&&I.current?o(gZ(I.current,v,l.current)):Z(!1)},p=function(){return Z(!1)};function Z(v){var y=r.current,m=wh(I.current),B=v?m.addEventListener:m.removeEventListener;B(y?"touchmove":"mousemove",b),B(y?"touchend":"mouseup",p)}return[function(v){var y=v.nativeEvent,m=I.current;if(m&&(nZ(y),!function(w,X){return X&&!Nl(w)}(y,r.current)&&m)){if(Nl(y)){r.current=!0;var B=y.changedTouches||[];B.length&&(l.current=B[0].identifier)}m.focus(),o(gZ(m,y,l.current)),Z(!0)}},function(v){var y=v.which||v.keyCode;y<37||y>40||(v.preventDefault(),i({left:y===39?.05:y===37?-.05:0,top:y===40?.05:y===38?-.05:0}))},Z]},[i,o]),A=c[0],u=c[1],h=c[2];return W.exports.useEffect(function(){return h},[h]),ae.createElement("div",ii({},n,{onTouchStart:A,onMouseDown:A,className:"react-colorful__interactive",ref:I,onKeyDown:u,tabIndex:0,role:"slider"}))}),Bs=function(t){return t.filter(Boolean).join(" ")},gG=function(t){var e=t.color,g=t.left,n=t.top,I=n===void 0?.5:n,o=Bs(["react-colorful__pointer",t.className]);return ae.createElement("div",{className:o,style:{top:100*I+"%",left:100*g+"%"}},ae.createElement("div",{className:"react-colorful__pointer-fill",style:{backgroundColor:e}}))},lg=function(t,e,g){return e===void 0&&(e=0),g===void 0&&(g=Math.pow(10,e)),Math.round(g*t)/g},td=function(t){return t[0]==="#"&&(t=t.substr(1)),t.length<6?{r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16),a:1}:{r:parseInt(t.substr(0,2),16),g:parseInt(t.substr(2,2),16),b:parseInt(t.substr(4,2),16),a:1}},O2=function(t){var e=t.s,g=t.v,n=t.a,I=(200-e)*g/100;return{h:lg(t.h),s:lg(I>0&&I<200?e*g/100/(I<=100?I:200-I)*100:0),l:lg(I/2),a:lg(n,2)}},Vh=function(t){var e=O2(t);return"hsl("+e.h+", "+e.s+"%, "+e.l+"%)"},gd=function(t){var e=O2(t);return"hsla("+e.h+", "+e.s+"%, "+e.l+"%, "+e.a+")"},nG=function(t){var e=t.h,g=t.s,n=t.v,I=t.a;e=e/360*6,g/=100,n/=100;var o=Math.floor(e),i=n*(1-g),l=n*(1-(e-o)*g),r=n*(1-(1-e+o)*g),c=o%6;return{r:lg(255*[n,l,i,i,r,n][c]),g:lg(255*[r,n,n,l,i,i][c]),b:lg(255*[i,i,r,n,n,l][c]),a:lg(I,2)}},nd=function(t){var e=t.toString(16);return e.length<2?"0"+e:e},IG=function(t){var e=t.r,g=t.g,n=t.b,I=t.a,o=Math.max(e,g,n),i=o-Math.min(e,g,n),l=i?o===e?(g-n)/i:o===g?2+(n-e)/i:4+(e-g)/i:0;return{h:lg(60*(l<0?l+6:l)),s:lg(o?i/o*100:0),v:lg(o/255*100),a:I}},P2=ae.memo(function(t){var e=t.hue,g=t.onChange,n=Bs(["react-colorful__hue",t.className]);return ae.createElement("div",{className:n},ae.createElement(tG,{onMove:function(I){g({h:360*I.left})},onKey:function(I){g({h:hC(e+360*I.left,0,360)})},"aria-label":"Hue","aria-valuetext":lg(e)},ae.createElement(gG,{className:"react-colorful__hue-pointer",left:e/360,color:Vh({h:e,s:100,v:100,a:1})})))}),_2=ae.memo(function(t){var e=t.hsva,g=t.onChange,n={backgroundColor:Vh({h:e.h,s:100,v:100,a:1})};return ae.createElement("div",{className:"react-colorful__saturation",style:n},ae.createElement(tG,{onMove:function(I){g({s:100*I.left,v:100-100*I.top})},onKey:function(I){g({s:hC(e.s+100*I.left,0,100),v:hC(e.v-100*I.top,0,100)})},"aria-label":"Color","aria-valuetext":"Saturation "+lg(e.s)+"%, Brightness "+lg(e.v)+"%"},ae.createElement(gG,{className:"react-colorful__saturation-pointer",top:1-e.v/100,left:e.s/100,color:Vh(e)})))}),LA=function(t,e){if(t===e)return!0;for(var g in t)if(t[g]!==e[g])return!1;return!0};function q2(t,e,g){var n=Wh(g),I=W.exports.useState(function(){return t.toHsva(e)}),o=I[0],i=I[1],l=W.exports.useRef({color:e,hsva:o});W.exports.useEffect(function(){if(!t.equal(e,l.current.color)){var c=t.toHsva(e);l.current={hsva:c,color:e},i(c)}},[e,t]),W.exports.useEffect(function(){var c;LA(o,l.current.hsva)||t.equal(c=t.fromHsva(o),l.current.color)||(l.current={hsva:o,color:c},n(c))},[o,t,n]);var r=W.exports.useCallback(function(c){i(function(A){return Object.assign({},A,c)})},[]);return[o,r]}var Mk=typeof window!="undefined"?W.exports.useLayoutEffect:W.exports.useEffect,Ek=function(){return typeof __webpack_nonce__!="undefined"?__webpack_nonce__:void 0},IZ=new Map,$2=function(t){Mk(function(){var e=t.current?t.current.ownerDocument:document;if(e!==void 0&&!IZ.has(e)){var g=e.createElement("style");g.innerHTML=`.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:"";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-opacity=".05"><path d="M8 0h8v8H8zM0 8h8v8H0z"/></svg>')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}`,IZ.set(e,g);var n=Ek();n&&g.setAttribute("nonce",n),e.head.appendChild(g)}},[])},eW=function(t){var e=t.className,g=t.colorModel,n=t.color,I=n===void 0?g.defaultColor:n,o=t.onChange,i=eG(t,["className","colorModel","color","onChange"]),l=W.exports.useRef(null);$2(l);var r=q2(g,I,o),c=r[0],A=r[1],u=Bs(["react-colorful",e]);return ae.createElement("div",ii({},i,{ref:l,className:u}),ae.createElement(_2,{hsva:c,onChange:A}),ae.createElement(P2,{hue:c.h,onChange:A,className:"react-colorful__last-control"}))},Qk={defaultColor:"000",toHsva:function(t){return IG(td(t))},fromHsva:function(t){return g=(e=nG(t)).g,n=e.b,"#"+nd(e.r)+nd(g)+nd(n);var e,g,n},equal:function(t,e){return t.toLowerCase()===e.toLowerCase()||LA(td(t),td(e))}},NL=function(t){return ae.createElement(eW,ii({},t,{colorModel:Qk}))},Tk=function(t){var e=t.className,g=t.hsva,n=t.onChange,I={backgroundImage:"linear-gradient(90deg, "+gd(Object.assign({},g,{a:0}))+", "+gd(Object.assign({},g,{a:1}))+")"},o=Bs(["react-colorful__alpha",e]);return ae.createElement("div",{className:o},ae.createElement("div",{className:"react-colorful__alpha-gradient",style:I}),ae.createElement(tG,{onMove:function(i){n({a:i.left})},onKey:function(i){n({a:hC(g.a+i.left)})},"aria-label":"Alpha","aria-valuetext":lg(100*g.a)+"%"},ae.createElement(gG,{className:"react-colorful__alpha-pointer",left:g.a,color:gd(g)})))},Uk=function(t){var e=t.className,g=t.colorModel,n=t.color,I=n===void 0?g.defaultColor:n,o=t.onChange,i=eG(t,["className","colorModel","color","onChange"]),l=W.exports.useRef(null);$2(l);var r=q2(g,I,o),c=r[0],A=r[1],u=Bs(["react-colorful",e]);return ae.createElement("div",ii({},i,{ref:l,className:u}),ae.createElement(_2,{hsva:c,onChange:A}),ae.createElement(P2,{hue:c.h,onChange:A}),ae.createElement(Tk,{hsva:c,onChange:A,className:"react-colorful__last-control"}))},Dk={defaultColor:{r:0,g:0,b:0,a:1},toHsva:IG,fromHsva:nG,equal:LA},jk=function(t){return ae.createElement(Uk,ii({},t,{colorModel:Dk}))},Ok={defaultColor:{r:0,g:0,b:0},toHsva:function(t){return IG({r:t.r,g:t.g,b:t.b,a:1})},fromHsva:function(t){return{r:(e=nG(t)).r,g:e.g,b:e.b};var e},equal:LA},Pk=function(t){return ae.createElement(eW,ii({},t,{colorModel:Ok}))};/*! *****************************************************************************
|
|
114
|
+
Copyright (c) Microsoft Corporation.
|
|
115
|
+
|
|
116
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
117
|
+
purpose with or without fee is hereby granted.
|
|
118
|
+
|
|
119
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
120
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
121
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
122
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
123
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
124
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
125
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
126
|
+
***************************************************************************** */function yC(t,e,g,n){function I(o){return o instanceof g?o:new g(function(i){i(o)})}return new(g||(g=Promise))(function(o,i){function l(A){try{c(n.next(A))}catch(u){i(u)}}function r(A){try{c(n.throw(A))}catch(u){i(u)}}function c(A){A.done?o(A.value):I(A.value).then(l,r)}c((n=n.apply(t,e||[])).next())})}function fC(t,e){var g={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},n,I,o,i;return i={next:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(i[Symbol.iterator]=function(){return this}),i;function l(c){return function(A){return r([c,A])}}function r(c){if(n)throw new TypeError("Generator is already executing.");for(;g;)try{if(n=1,I&&(o=c[0]&2?I.return:c[0]?I.throw||((o=I.return)&&o.call(I),0):I.next)&&!(o=o.call(I,c[1])).done)return o;switch(I=0,o&&(c=[c[0]&2,o.value]),c[0]){case 0:case 1:o=c;break;case 4:return g.label++,{value:c[1],done:!1};case 5:g.label++,I=c[1],c=[0];continue;case 7:c=g.ops.pop(),g.trys.pop();continue;default:if(o=g.trys,!(o=o.length>0&&o[o.length-1])&&(c[0]===6||c[0]===2)){g=0;continue}if(c[0]===3&&(!o||c[1]>o[0]&&c[1]<o[3])){g.label=c[1];break}if(c[0]===6&&g.label<o[1]){g.label=o[1],o=c;break}if(o&&g.label<o[2]){g.label=o[2],g.ops.push(c);break}o[2]&&g.ops.pop(),g.trys.pop();continue}c=e.call(t,g)}catch(A){c=[6,A],I=0}finally{n=o=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}function _k(t,e){var g=typeof Symbol=="function"&&t[Symbol.iterator];if(!g)return t;var n=g.call(t),I,o=[],i;try{for(;(e===void 0||e-- >0)&&!(I=n.next()).done;)o.push(I.value)}catch(l){i={error:l}}finally{try{I&&!I.done&&(g=n.return)&&g.call(n)}finally{if(i)throw i.error}}return o}function qk(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(_k(arguments[e]));return t}var $k=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]);function Zs(t,e){var g=ez(t);if(typeof g.path!="string"){var n=t.webkitRelativePath;Object.defineProperty(g,"path",{value:typeof e=="string"?e:typeof n=="string"&&n.length>0?n:t.name,writable:!1,configurable:!1,enumerable:!0})}return g}function ez(t){var e=t.name,g=e&&e.lastIndexOf(".")!==-1;if(g&&!t.type){var n=e.split(".").pop().toLowerCase(),I=$k.get(n);I&&Object.defineProperty(t,"type",{value:I,writable:!1,configurable:!1,enumerable:!0})}return t}var tz=[".DS_Store","Thumbs.db"];function gz(t){return yC(this,void 0,void 0,function(){return fC(this,function(e){return nA(t)&&nz(t)?[2,Cz(t.dataTransfer,t.type)]:Iz(t)?[2,oz(t)]:Array.isArray(t)&&t.every(function(g){return"getFile"in g&&typeof g.getFile=="function"})?[2,iz(t)]:[2,[]]})})}function nz(t){return nA(t.dataTransfer)}function Iz(t){return nA(t)&&nA(t.target)}function nA(t){return typeof t=="object"&&t!==null}function oz(t){return Rh(t.target.files).map(function(e){return Zs(e)})}function iz(t){return yC(this,void 0,void 0,function(){var e;return fC(this,function(g){switch(g.label){case 0:return[4,Promise.all(t.map(function(n){return n.getFile()}))];case 1:return e=g.sent(),[2,e.map(function(n){return Zs(n)})]}})})}function Cz(t,e){return yC(this,void 0,void 0,function(){var g,n;return fC(this,function(I){switch(I.label){case 0:return t===null?[2,[]]:t.items?(g=Rh(t.items).filter(function(o){return o.kind==="file"}),e!=="drop"?[2,g]:[4,Promise.all(g.map(lz))]):[3,2];case 1:return n=I.sent(),[2,oZ(tW(n))];case 2:return[2,oZ(Rh(t.files).map(function(o){return Zs(o)}))]}})})}function oZ(t){return t.filter(function(e){return tz.indexOf(e.name)===-1})}function Rh(t){if(t===null)return[];for(var e=[],g=0;g<t.length;g++){var n=t[g];e.push(n)}return e}function lz(t){if(typeof t.webkitGetAsEntry!="function")return iZ(t);var e=t.webkitGetAsEntry();return e&&e.isDirectory?gW(e):iZ(t)}function tW(t){return t.reduce(function(e,g){return qk(e,Array.isArray(g)?tW(g):[g])},[])}function iZ(t){var e=t.getAsFile();if(!e)return Promise.reject(t+" is not a File");var g=Zs(e);return Promise.resolve(g)}function sz(t){return yC(this,void 0,void 0,function(){return fC(this,function(e){return[2,t.isDirectory?gW(t):rz(t)]})})}function gW(t){var e=t.createReader();return new Promise(function(g,n){var I=[];function o(){var i=this;e.readEntries(function(l){return yC(i,void 0,void 0,function(){var r,c,A;return fC(this,function(u){switch(u.label){case 0:if(l.length)return[3,5];u.label=1;case 1:return u.trys.push([1,3,,4]),[4,Promise.all(I)];case 2:return r=u.sent(),g(r),[3,4];case 3:return c=u.sent(),n(c),[3,4];case 4:return[3,6];case 5:A=Promise.all(l.map(sz)),I.push(A),o(),u.label=6;case 6:return[2]}})})},function(l){n(l)})}o()})}function rz(t){return yC(this,void 0,void 0,function(){return fC(this,function(e){return[2,new Promise(function(g,n){t.file(function(I){var o=Zs(I,t.fullPath);g(o)},function(I){n(I)})})]})})}var cz=function(t,e){if(t&&e){var g=Array.isArray(e)?e:e.split(","),n=t.name||"",I=(t.type||"").toLowerCase(),o=I.replace(/\/.*$/,"");return g.some(function(i){var l=i.trim().toLowerCase();return l.charAt(0)==="."?n.toLowerCase().endsWith(l):l.endsWith("/*")?o===l.replace(/\/.*$/,""):I===l})}return!0};function CZ(t,e){var g=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(I){return Object.getOwnPropertyDescriptor(t,I).enumerable})),g.push.apply(g,n)}return g}function lZ(t){for(var e=1;e<arguments.length;e++){var g=arguments[e]!=null?arguments[e]:{};e%2?CZ(Object(g),!0).forEach(function(n){nW(t,n,g[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(g)):CZ(Object(g)).forEach(function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(g,n))})}return t}function nW(t,e,g){return e in t?Object.defineProperty(t,e,{value:g,enumerable:!0,configurable:!0,writable:!0}):t[e]=g,t}function sZ(t,e){return dz(t)||uz(t,e)||az(t,e)||Az()}function Az(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
127
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function az(t,e){if(!!t){if(typeof t=="string")return rZ(t,e);var g=Object.prototype.toString.call(t).slice(8,-1);if(g==="Object"&&t.constructor&&(g=t.constructor.name),g==="Map"||g==="Set")return Array.from(t);if(g==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(g))return rZ(t,e)}}function rZ(t,e){(e==null||e>t.length)&&(e=t.length);for(var g=0,n=new Array(e);g<e;g++)n[g]=t[g];return n}function uz(t,e){var g=t==null?null:typeof Symbol!="undefined"&&t[Symbol.iterator]||t["@@iterator"];if(g!=null){var n=[],I=!0,o=!1,i,l;try{for(g=g.call(t);!(I=(i=g.next()).done)&&(n.push(i.value),!(e&&n.length===e));I=!0);}catch(r){o=!0,l=r}finally{try{!I&&g.return!=null&&g.return()}finally{if(o)throw l}}return n}}function dz(t){if(Array.isArray(t))return t}var hz="file-invalid-type",bz="file-too-large",Gz="file-too-small",mz="too-many-files",pz=function(e){e=Array.isArray(e)&&e.length===1?e[0]:e;var g=Array.isArray(e)?"one of ".concat(e.join(", ")):e;return{code:hz,message:"File type must be ".concat(g)}},cZ=function(e){return{code:bz,message:"File is larger than ".concat(e," ").concat(e===1?"byte":"bytes")}},AZ=function(e){return{code:Gz,message:"File is smaller than ".concat(e," ").concat(e===1?"byte":"bytes")}},Bz={code:mz,message:"Too many files"};function IW(t,e){var g=t.type==="application/x-moz-file"||cz(t,e);return[g,g?null:pz(e)]}function oW(t,e,g){if(ul(t.size))if(ul(e)&&ul(g)){if(t.size>g)return[!1,cZ(g)];if(t.size<e)return[!1,AZ(e)]}else{if(ul(e)&&t.size<e)return[!1,AZ(e)];if(ul(g)&&t.size>g)return[!1,cZ(g)]}return[!0,null]}function ul(t){return t!=null}function Zz(t){var e=t.files,g=t.accept,n=t.minSize,I=t.maxSize,o=t.multiple,i=t.maxFiles;return!o&&e.length>1||o&&i>=1&&e.length>i?!1:e.every(function(l){var r=IW(l,g),c=sZ(r,1),A=c[0],u=oW(l,n,I),h=sZ(u,1),b=h[0];return A&&b})}function IA(t){return typeof t.isPropagationStopped=="function"?t.isPropagationStopped():typeof t.cancelBubble!="undefined"?t.cancelBubble:!1}function Ic(t){return t.dataTransfer?Array.prototype.some.call(t.dataTransfer.types,function(e){return e==="Files"||e==="application/x-moz-file"}):!!t.target&&!!t.target.files}function aZ(t){t.preventDefault()}function yz(t){return t.indexOf("MSIE")!==-1||t.indexOf("Trident/")!==-1}function fz(t){return t.indexOf("Edge/")!==-1}function vz(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:window.navigator.userAgent;return yz(t)||fz(t)}function Mn(){for(var t=arguments.length,e=new Array(t),g=0;g<t;g++)e[g]=arguments[g];return function(n){for(var I=arguments.length,o=new Array(I>1?I-1:0),i=1;i<I;i++)o[i-1]=arguments[i];return e.some(function(l){return!IA(n)&&l&&l.apply(void 0,[n].concat(o)),IA(n)})}}function Wz(){return"showOpenFilePicker"in window}function wz(t){return t=typeof t=="string"?t.split(","):t,[{description:"everything",accept:Array.isArray(t)?t.filter(function(e){return e==="audio/*"||e==="video/*"||e==="image/*"||e==="text/*"||/\w+\/[-+.\w]+/g.test(e)}).reduce(function(e,g){return lZ(lZ({},e),{},nW({},g,[]))},{}):{}}]}function Vz(t){return t instanceof DOMException&&(t.name==="AbortError"||t.code===t.ABORT_ERR)}function Rz(t){return t instanceof DOMException&&(t.name==="SecurityError"||t.code===t.SECURITY_ERR)}var Xz=["children"],Yz=["open"],Kz=["refKey","role","onKeyDown","onFocus","onBlur","onClick","onDragEnter","onDragOver","onDragLeave","onDrop"],Sz=["refKey","onChange","onClick"];function Hz(t){return kz(t)||Fz(t)||iW(t)||Nz()}function Nz(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
|
|
128
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Fz(t){if(typeof Symbol!="undefined"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)}function kz(t){if(Array.isArray(t))return Xh(t)}function Id(t,e){return Lz(t)||xz(t,e)||iW(t,e)||zz()}function zz(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
129
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function iW(t,e){if(!!t){if(typeof t=="string")return Xh(t,e);var g=Object.prototype.toString.call(t).slice(8,-1);if(g==="Object"&&t.constructor&&(g=t.constructor.name),g==="Map"||g==="Set")return Array.from(t);if(g==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(g))return Xh(t,e)}}function Xh(t,e){(e==null||e>t.length)&&(e=t.length);for(var g=0,n=new Array(e);g<e;g++)n[g]=t[g];return n}function xz(t,e){var g=t==null?null:typeof Symbol!="undefined"&&t[Symbol.iterator]||t["@@iterator"];if(g!=null){var n=[],I=!0,o=!1,i,l;try{for(g=g.call(t);!(I=(i=g.next()).done)&&(n.push(i.value),!(e&&n.length===e));I=!0);}catch(r){o=!0,l=r}finally{try{!I&&g.return!=null&&g.return()}finally{if(o)throw l}}return n}}function Lz(t){if(Array.isArray(t))return t}function uZ(t,e){var g=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(I){return Object.getOwnPropertyDescriptor(t,I).enumerable})),g.push.apply(g,n)}return g}function lt(t){for(var e=1;e<arguments.length;e++){var g=arguments[e]!=null?arguments[e]:{};e%2?uZ(Object(g),!0).forEach(function(n){Yh(t,n,g[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(g)):uZ(Object(g)).forEach(function(n){Object.defineProperty(t,n,Object.getOwnPropertyDescriptor(g,n))})}return t}function Yh(t,e,g){return e in t?Object.defineProperty(t,e,{value:g,enumerable:!0,configurable:!0,writable:!0}):t[e]=g,t}function oA(t,e){if(t==null)return{};var g=Jz(t,e),n,I;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(I=0;I<o.length;I++)n=o[I],!(e.indexOf(n)>=0)&&(!Object.prototype.propertyIsEnumerable.call(t,n)||(g[n]=t[n]))}return g}function Jz(t,e){if(t==null)return{};var g={},n=Object.keys(t),I,o;for(o=0;o<n.length;o++)I=n[o],!(e.indexOf(I)>=0)&&(g[I]=t[I]);return g}var oG=W.exports.forwardRef(function(t,e){var g=t.children,n=oA(t,Xz),I=lW(n),o=I.open,i=oA(I,Yz);return W.exports.useImperativeHandle(e,function(){return{open:o}},[o]),D(oi,{children:g(lt(lt({},i),{},{open:o}))})});oG.displayName="Dropzone";var CW={disabled:!1,getFilesFromEvent:gz,maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!0};oG.defaultProps=CW;oG.propTypes={children:je.func,accept:je.oneOfType([je.string,je.arrayOf(je.string)]),multiple:je.bool,preventDropOnDocument:je.bool,noClick:je.bool,noKeyboard:je.bool,noDrag:je.bool,noDragEventsBubbling:je.bool,minSize:je.number,maxSize:je.number,maxFiles:je.number,disabled:je.bool,getFilesFromEvent:je.func,onFileDialogCancel:je.func,onFileDialogOpen:je.func,useFsAccessApi:je.bool,onDragEnter:je.func,onDragLeave:je.func,onDragOver:je.func,onDrop:je.func,onDropAccepted:je.func,onDropRejected:je.func,validator:je.func};var Kh={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,draggedFiles:[],acceptedFiles:[],fileRejections:[]};function lW(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=lt(lt({},CW),t),g=e.accept,n=e.disabled,I=e.getFilesFromEvent,o=e.maxSize,i=e.minSize,l=e.multiple,r=e.maxFiles,c=e.onDragEnter,A=e.onDragLeave,u=e.onDragOver,h=e.onDrop,b=e.onDropAccepted,p=e.onDropRejected,Z=e.onFileDialogCancel,v=e.onFileDialogOpen,y=e.useFsAccessApi,m=e.preventDropOnDocument,B=e.noClick,w=e.noKeyboard,X=e.noDrag,R=e.noDragEventsBubbling,S=e.validator,Y=W.exports.useMemo(function(){return typeof v=="function"?v:dZ},[v]),k=W.exports.useMemo(function(){return typeof Z=="function"?Z:dZ},[Z]),N=W.exports.useRef(null),z=W.exports.useRef(null),M=W.exports.useReducer(Mz,Kh),j=Id(M,2),F=j[0],L=j[1],P=F.isFocused,$=F.isFileDialogActive,T=F.draggedFiles,q=W.exports.useRef(typeof window!="undefined"&&window.isSecureContext&&y&&Wz()),ge=function(){!q.current&&$&&setTimeout(function(){if(z.current){var me=z.current.files;me.length||(L({type:"closeDialog"}),k())}},300)};W.exports.useEffect(function(){return window.addEventListener("focus",ge,!1),function(){window.removeEventListener("focus",ge,!1)}},[z,$,k,q]);var se=W.exports.useRef([]),ue=function(me){N.current&&N.current.contains(me.target)||(me.preventDefault(),se.current=[])};W.exports.useEffect(function(){return m&&(document.addEventListener("dragover",aZ,!1),document.addEventListener("drop",ue,!1)),function(){m&&(document.removeEventListener("dragover",aZ),document.removeEventListener("drop",ue))}},[N,m]);var Ye=W.exports.useCallback(function(le){le.preventDefault(),le.persist(),YI(le),se.current=[].concat(Hz(se.current),[le.target]),Ic(le)&&Promise.resolve(I(le)).then(function(me){IA(le)&&!R||(L({draggedFiles:me,isDragActive:!0,type:"setDraggedFiles"}),c&&c(le))})},[I,c,R]),Te=W.exports.useCallback(function(le){le.preventDefault(),le.persist(),YI(le);var me=Ic(le);if(me&&le.dataTransfer)try{le.dataTransfer.dropEffect="copy"}catch{}return me&&u&&u(le),!1},[u,R]),et=W.exports.useCallback(function(le){le.preventDefault(),le.persist(),YI(le);var me=se.current.filter(function(Yt){return N.current&&N.current.contains(Yt)}),ht=me.indexOf(le.target);ht!==-1&&me.splice(ht,1),se.current=me,!(me.length>0)&&(L({isDragActive:!1,type:"setDraggedFiles",draggedFiles:[]}),Ic(le)&&A&&A(le))},[N,A,R]),yt=W.exports.useCallback(function(le,me){var ht=[],Yt=[];le.forEach(function(Et){var tI=IW(Et,g),An=Id(tI,2),KI=An[0],gI=An[1],E=oW(Et,i,o),ne=Id(E,2),Be=ne[0],Ke=ne[1],it=S?S(Et):null;if(KI&&Be&&!it)ht.push(Et);else{var kt=[gI,Ke];it&&(kt=kt.concat(it)),Yt.push({file:Et,errors:kt.filter(function(SI){return SI})})}}),(!l&&ht.length>1||l&&r>=1&&ht.length>r)&&(ht.forEach(function(Et){Yt.push({file:Et,errors:[Bz]})}),ht.splice(0)),L({acceptedFiles:ht,fileRejections:Yt,type:"setFiles"}),h&&h(ht,Yt,me),Yt.length>0&&p&&p(Yt,me),ht.length>0&&b&&b(ht,me)},[L,l,g,i,o,r,h,b,p,S]),dt=W.exports.useCallback(function(le){le.preventDefault(),le.persist(),YI(le),se.current=[],Ic(le)&&Promise.resolve(I(le)).then(function(me){IA(le)&&!R||yt(me,le)}),L({type:"reset"})},[I,yt,R]),ag=W.exports.useCallback(function(){if(q.current){L({type:"openDialog"}),Y();var le={multiple:l,types:wz(g)};window.showOpenFilePicker(le).then(function(me){return I(me)}).then(function(me){yt(me,null),L({type:"closeDialog"})}).catch(function(me){Vz(me)?(k(me),L({type:"closeDialog"})):Rz(me)&&(q.current=!1,z.current&&(z.current.value=null,z.current.click()))});return}z.current&&(L({type:"openDialog"}),Y(),z.current.value=null,z.current.click())},[L,Y,k,y,yt,g,l]),$n=W.exports.useCallback(function(le){!N.current||!N.current.isEqualNode(le.target)||(le.keyCode===32||le.keyCode===13)&&(le.preventDefault(),ag())},[N,ag]),eI=W.exports.useCallback(function(){L({type:"focus"})},[]),Mt=W.exports.useCallback(function(){L({type:"blur"})},[]),Vn=W.exports.useCallback(function(){B||(vz()?setTimeout(ag,0):ag())},[B,ag]),ot=function(me){return n?null:me},RI=function(me){return w?null:ot(me)},XI=function(me){return X?null:ot(me)},YI=function(me){R&&me.stopPropagation()},Ci=W.exports.useMemo(function(){return function(){var le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},me=le.refKey,ht=me===void 0?"ref":me,Yt=le.role,Et=le.onKeyDown,tI=le.onFocus,An=le.onBlur,KI=le.onClick,gI=le.onDragEnter,E=le.onDragOver,ne=le.onDragLeave,Be=le.onDrop,Ke=oA(le,Kz);return lt(lt(Yh({onKeyDown:RI(Mn(Et,$n)),onFocus:RI(Mn(tI,eI)),onBlur:RI(Mn(An,Mt)),onClick:ot(Mn(KI,Vn)),onDragEnter:XI(Mn(gI,Ye)),onDragOver:XI(Mn(E,Te)),onDragLeave:XI(Mn(ne,et)),onDrop:XI(Mn(Be,dt)),role:typeof Yt=="string"&&Yt!==""?Yt:"button"},ht,N),!n&&!w?{tabIndex:0}:{}),Ke)}},[N,$n,eI,Mt,Vn,Ye,Te,et,dt,w,X,n]),bo=W.exports.useCallback(function(le){le.stopPropagation()},[]),Go=W.exports.useMemo(function(){return function(){var le=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},me=le.refKey,ht=me===void 0?"ref":me,Yt=le.onChange,Et=le.onClick,tI=oA(le,Sz),An=Yh({accept:g,multiple:l,type:"file",style:{display:"none"},onChange:ot(Mn(Yt,dt)),onClick:ot(Mn(Et,bo)),autoComplete:"off",tabIndex:-1},ht,z);return lt(lt({},An),tI)}},[z,g,l,dt,n]),cn=T.length,li=cn>0&&Zz({files:T,accept:g,minSize:i,maxSize:o,multiple:l,maxFiles:r}),vC=cn>0&&!li;return lt(lt({},F),{},{isDragAccept:li,isDragReject:vC,isFocused:P&&!n,getRootProps:Ci,getInputProps:Go,rootRef:N,inputRef:z,open:ot(ag)})}function Mz(t,e){switch(e.type){case"focus":return lt(lt({},t),{},{isFocused:!0});case"blur":return lt(lt({},t),{},{isFocused:!1});case"openDialog":return lt(lt({},Kh),{},{isFileDialogActive:!0});case"closeDialog":return lt(lt({},t),{},{isFileDialogActive:!1});case"setDraggedFiles":var g=e.isDragActive,n=e.draggedFiles;return lt(lt({},t),{},{draggedFiles:n,isDragActive:g});case"setFiles":return lt(lt({},t),{},{acceptedFiles:e.acceptedFiles,fileRejections:e.fileRejections});case"reset":return lt({},Kh);default:return t}}function dZ(){}const Ez=t=>(e,g,n)=>{const I=n.subscribe;return n.subscribe=(i,l,r)=>{let c=i;if(l){const A=(r==null?void 0:r.equalityFn)||Object.is;let u=i(n.getState());c=h=>{const b=i(h);if(!A(u,b)){const p=u;l(u=b,p)}},r!=null&&r.fireImmediately&&l(u,u)}return I(c)},t(e,g,n)};/*!
|
|
130
|
+
* isobject <https://github.com/jonschlinkert/isobject>
|
|
131
|
+
*
|
|
132
|
+
* Copyright (c) 2014-2017, Jon Schlinkert.
|
|
133
|
+
* Released under the MIT License.
|
|
134
|
+
*/var Qz=function(e){return e!=null&&typeof e=="object"&&Array.isArray(e)===!1};/*!
|
|
135
|
+
* is-plain-object <https://github.com/jonschlinkert/is-plain-object>
|
|
136
|
+
*
|
|
137
|
+
* Copyright (c) 2014-2017, Jon Schlinkert.
|
|
138
|
+
* Released under the MIT License.
|
|
139
|
+
*/var Tz=Qz;function hZ(t){return Tz(t)===!0&&Object.prototype.toString.call(t)==="[object Object]"}var sW=function(e){var g,n;return!(hZ(e)===!1||(g=e.constructor,typeof g!="function")||(n=g.prototype,hZ(n)===!1)||n.hasOwnProperty("isPrototypeOf")===!1)};/*!
|
|
140
|
+
* is-extendable <https://github.com/jonschlinkert/is-extendable>
|
|
141
|
+
*
|
|
142
|
+
* Copyright (c) 2015-2017, Jon Schlinkert.
|
|
143
|
+
* Released under the MIT License.
|
|
144
|
+
*/var Uz=sW,iG=function(e){return Uz(e)||typeof e=="function"||Array.isArray(e)};/*!
|
|
145
|
+
* for-in <https://github.com/jonschlinkert/for-in>
|
|
146
|
+
*
|
|
147
|
+
* Copyright (c) 2014-2017, Jon Schlinkert.
|
|
148
|
+
* Released under the MIT License.
|
|
149
|
+
*/var Dz=function(e,g,n){for(var I in e)if(g.call(n,e[I],I,e)===!1)break},jz=iG,Oz=Dz;function rW(t,e){for(var g=arguments.length,n=0;++n<g;){var I=arguments[n];Sh(I)&&Oz(I,Pz,t)}return t}function Pz(t,e){if(!!_z(e)){var g=this[e];Sh(t)&&Sh(g)?rW(g,t):this[e]=t}}function Sh(t){return jz(t)&&!Array.isArray(t)}function _z(t){return t!=="__proto__"&&t!=="constructor"&&t!=="prototype"}var qz=rW;/*!
|
|
150
|
+
* get-value <https://github.com/jonschlinkert/get-value>
|
|
151
|
+
*
|
|
152
|
+
* Copyright (c) 2014-2015, Jon Schlinkert.
|
|
153
|
+
* Licensed under the MIT License.
|
|
154
|
+
*/var $z=function(t,e,g,n,I){if(!e3(t)||!e)return t;if(e=oc(e),g&&(e+="."+oc(g)),n&&(e+="."+oc(n)),I&&(e+="."+oc(I)),e in t)return t[e];for(var o=e.split("."),i=o.length,l=-1;t&&++l<i;){for(var r=o[l];r[r.length-1]==="\\";)r=r.slice(0,-1)+"."+o[++l];t=t[r]}return t};function e3(t){return t!==null&&(typeof t=="object"||typeof t=="function")}function oc(t){return t?Array.isArray(t)?t.join("."):t:""}/*!
|
|
155
|
+
* assign-symbols <https://github.com/jonschlinkert/assign-symbols>
|
|
156
|
+
*
|
|
157
|
+
* Copyright (c) 2015, Jon Schlinkert.
|
|
158
|
+
* Licensed under the MIT License.
|
|
159
|
+
*/var t3=function(t,e){if(t===null||typeof t=="undefined")throw new TypeError("expected first argument to be an object.");if(typeof e=="undefined"||typeof Symbol=="undefined"||typeof Object.getOwnPropertySymbols!="function")return t;for(var g=Object.prototype.propertyIsEnumerable,n=Object(t),I=arguments.length,o=0;++o<I;)for(var i=Object(arguments[o]),l=Object.getOwnPropertySymbols(i),r=0;r<l.length;r++){var c=l[r];g.call(i,c)&&(n[c]=i[c])}return n},g3=iG,n3=t3,I3=Object.assign||function(t){if(t===null||typeof t=="undefined")throw new TypeError("Cannot convert undefined or null to object");bZ(t)||(t={});for(var e=1;e<arguments.length;e++){var g=arguments[e];i3(g)&&(g=C3(g)),bZ(g)&&(o3(t,g),n3(t,g))}return t};function o3(t,e){for(var g in e)l3(e,g)&&(t[g]=e[g])}function i3(t){return t&&typeof t=="string"}function C3(t){var e={};for(var g in t)e[g]=t[g];return e}function bZ(t){return t&&typeof t=="object"||g3(t)}function l3(t,e){return Object.prototype.hasOwnProperty.call(t,e)}/*!
|
|
160
|
+
* split-string <https://github.com/jonschlinkert/split-string>
|
|
161
|
+
*
|
|
162
|
+
* Copyright (c) 2015-2017, Jon Schlinkert.
|
|
163
|
+
* Released under the MIT License.
|
|
164
|
+
*/var s3=I3,r3=function(t,e,g){if(typeof t!="string")throw new TypeError("expected a string");typeof e=="function"&&(g=e,e=null),typeof e=="string"&&(e={sep:e});var n=s3({sep:"."},e),I=n.quotes||['"',"'","`"],o;n.brackets===!0?o={"<":">","(":")","[":"]","{":"}"}:n.brackets&&(o=n.brackets);var i=[],l=[],r=[""],c=n.sep,A=t.length,u=-1,h;function b(){if(o&&l.length)return o[l[l.length-1]]}for(;++u<A;){var p=t[u],Z=t[u+1],v={val:p,idx:u,arr:r,str:t};if(i.push(v),p==="\\"){v.val=A3(n,t,u)===!0?p+Z:Z,v.escaped=!0,typeof g=="function"&&g(v),r[r.length-1]+=v.val,u++;continue}if(o&&o[p]){l.push(p);var y=b(),m=u+1;if(t.indexOf(y,m+1)!==-1)for(;l.length&&m<A;){var B=t[++m];if(B==="\\"){B++;continue}if(I.indexOf(B)!==-1){m=Hh(t,B,m+1);continue}if(y=b(),l.length&&t.indexOf(y,m+1)===-1)break;if(o[B]){l.push(B);continue}y===B&&l.pop()}if(h=m,h===-1){r[r.length-1]+=p;continue}p=t.slice(u,h+1),v.val=p,v.idx=u=h}if(I.indexOf(p)!==-1){if(h=Hh(t,p,u+1),h===-1){r[r.length-1]+=p;continue}c3(p,n)===!0?p=t.slice(u,h+1):p=t.slice(u+1,h),v.val=p,v.idx=u=h}if(typeof g=="function"&&(g(v,i),p=v.val,u=v.idx),v.val===c&&v.split!==!1){r.push("");continue}r[r.length-1]+=v.val}return r};function Hh(t,e,g,n){var I=t.indexOf(e,g);return t.charAt(I-1)==="\\"?Hh(t,e,I+1):I}function c3(t,e){return e.keepDoubleQuotes===!0&&t==='"'||e.keepSingleQuotes===!0&&t==="'"?!0:e.keepQuotes}function A3(t,e,g){return typeof t.keepEscaping=="function"?t.keepEscaping(e,g):t.keepEscaping===!0||e[g+1]==="\\"}/*!
|
|
165
|
+
* is-extendable <https://github.com/jonschlinkert/is-extendable>
|
|
166
|
+
*
|
|
167
|
+
* Copyright (c) 2015, Jon Schlinkert.
|
|
168
|
+
* Licensed under the MIT License.
|
|
169
|
+
*/var a3=function(e){return typeof e!="undefined"&&e!==null&&(typeof e=="object"||typeof e=="function")},GZ=a3,u3=function(e){GZ(e)||(e={});for(var g=arguments.length,n=1;n<g;n++){var I=arguments[n];GZ(I)&&d3(e,I)}return e};function d3(t,e){for(var g in e)h3(e,g)&&(t[g]=e[g])}function h3(t,e){return Object.prototype.hasOwnProperty.call(t,e)}/*!
|
|
170
|
+
* is-extendable <https://github.com/jonschlinkert/is-extendable>
|
|
171
|
+
*
|
|
172
|
+
* Copyright (c) 2015, Jon Schlinkert.
|
|
173
|
+
* Licensed under the MIT License.
|
|
174
|
+
*/var b3=function(e){return typeof e!="undefined"&&e!==null&&(typeof e=="object"||typeof e=="function")};/*!
|
|
175
|
+
* set-value <https://github.com/jonschlinkert/set-value>
|
|
176
|
+
*
|
|
177
|
+
* Copyright (c) 2014-2015, 2017, Jon Schlinkert.
|
|
178
|
+
* Released under the MIT License.
|
|
179
|
+
*/var G3=r3,m3=u3,mZ=sW,pZ=b3,p3=function(t,e,g){if(!pZ(t)||(Array.isArray(e)&&(e=[].concat.apply([],e).join(".")),typeof e!="string"))return t;for(var n=G3(e,{sep:".",brackets:!0}).filter(B3),I=n.length,o=-1,i=t;++o<I;){var l=n[o];if(o!==I-1){pZ(i[l])||(i[l]={}),i=i[l];continue}mZ(i[l])&&mZ(g)?i[l]=m3({},i[l],g):i[l]=g}return t};function B3(t){return t!=="__proto__"&&t!=="constructor"&&t!=="prototype"}var od=iG,BZ=qz,Z3=$z,ZZ=p3,y3=function(e,g,n){if(!od(e))throw new TypeError("expected an object");if(typeof g!="string"||n==null)return BZ.apply(null,arguments);if(typeof n=="string")return ZZ(e,g,n),e;var I=Z3(e,g);return od(n)&&od(I)&&(n=BZ({},I,n)),ZZ(e,g,n),e};const cW=(...t)=>t.filter(Boolean).join(".");function f3(t){const e=t.split(".");return[e.pop(),e.join(".")||void 0]}function v3(t,e){return Object.entries(i1(t,e)).reduce((g,[,{value:n,disabled:I,key:o}])=>(g[o]=I?void 0:n,g),{})}function W3(t,e){const g=W.exports.useRef();return(e?is:bs)(t,g.current)||(g.current=t),g.current}function AW(t,e){return W.exports.useMemo(t,W3(e,!0))}function w3(t){const e=W.exports.useRef(null),g=W.exports.useRef(null),n=W.exports.useRef(!0);return W.exports.useLayoutEffect(()=>{t||(e.current.style.height="0px",e.current.style.overflow="hidden")},[]),W.exports.useEffect(()=>{if(n.current){n.current=!1;return}let I;const o=e.current,i=()=>{t&&(o.style.removeProperty("height"),o.style.removeProperty("overflow"),g.current.scrollIntoView({behavior:"smooth",block:"nearest"}))};o.addEventListener("transitionend",i,{once:!0});const{height:l}=g.current.getBoundingClientRect();return o.style.height=l+"px",t||(o.style.overflow="hidden",I=window.setTimeout(()=>o.style.height="0px",50)),()=>{o.removeEventListener("transitionend",i),clearTimeout(I)}},[t]),{wrapperRef:e,contentRef:g}}const V3=t=>{const[e,g]=W.exports.useState(t.getVisiblePaths());return W.exports.useEffect(()=>{g(t.getVisiblePaths());const n=t.useStore.subscribe(t.getVisiblePaths,g,{equalityFn:bs});return()=>n()},[t]),e};function R3(t,e,g){return t.useStore(I=>{const o=pe(pe({},g),I.data);return v3(o,e)},bs)}function aW(t=3){const e=W.exports.useRef(null),g=W.exports.useRef(null),[n,I]=W.exports.useState(!1),o=W.exports.useCallback(()=>I(!0),[]),i=W.exports.useCallback(()=>I(!1),[]);return W.exports.useLayoutEffect(()=>{if(n){const{bottom:l,top:r,left:c}=e.current.getBoundingClientRect(),{height:A}=g.current.getBoundingClientRect(),u=l+A>window.innerHeight-40?"up":"down";g.current.style.position="fixed",g.current.style.zIndex="10000",g.current.style.left=c+"px",u==="down"?g.current.style.top=l+t+"px":g.current.style.bottom=window.innerHeight-r+t+"px"}},[t,n]),{popinRef:e,wrapperRef:g,shown:n,show:o,hide:i}}Lk([Jk]);const X3={rgb:"toRgb",hsl:"toHsl",hsv:"toHsv",hex:"toHex"};Rg.extend({color:()=>t=>Cg(t).isValid()});const Y3=t=>Rg().color().test(t);function uW(t,{format:e,hasAlpha:g,isString:n}){const I=X3[e]+(n&&e!=="hex"?"String":""),o=t[I]();return typeof o=="object"&&!g?C1(o,["a"]):o}const dW=(t,e)=>{const g=Cg(t);if(!g.isValid())throw Error("Invalid color");return uW(g,e)},K3=(t,e)=>uW(Cg(t),pe(pe({},e),{},{isString:!0,format:"hex"})),S3=({value:t})=>{const e=xk(t),g=e==="name"?"hex":e,n=typeof t=="object"?"a"in t:e==="hex"&&t.length===8||/^(rgba)|(hsla)|(hsva)/.test(t),I={format:g,hasAlpha:n,isString:typeof t=="string"};return{value:dW(t,I),settings:I}};var H3=Object.freeze({__proto__:null,schema:Y3,sanitize:dW,format:K3,normalize:S3});const N3=Ge("div",{position:"relative",boxSizing:"border-box",borderRadius:"$sm",overflow:"hidden",cursor:"pointer",height:"$rowHeight",width:"$rowHeight",backgroundColor:"#fff",backgroundImage:`url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-opacity=".05"><path d="M8 0h8v8H8zM0 8h8v8H0z"/></svg>')`,$inputStyle:"",$hover:"",zIndex:1,variants:{active:{true:{$inputStyle:"$accent1"}}},"&::before":{content:'""',position:"absolute",top:0,bottom:0,right:0,left:0,backgroundColor:"currentColor",zIndex:1}}),F3=Ge("div",{position:"relative",display:"grid",gridTemplateColumns:"$sizes$rowHeight auto",columnGap:"$colGap",alignItems:"center"}),k3=Ge("div",{width:"$colorPickerWidth",height:"$colorPickerHeight",".react-colorful":{width:"100%",height:"100%",boxShadow:"$level2",cursor:"crosshair"},".react-colorful__saturation":{borderRadius:"$sm $sm 0 0"},".react-colorful__alpha, .react-colorful__hue":{height:10},".react-colorful__last-control":{borderRadius:"0 0 $sm $sm"},".react-colorful__pointer":{height:12,width:12}});function yZ(t,e){return e!=="rgb"?Cg(t).toRgb():t}function z3({value:t,displayValue:e,settings:g,onUpdate:n}){const{emitOnEditStart:I,emitOnEditEnd:o}=gg(),{format:i,hasAlpha:l}=g,{popinRef:r,wrapperRef:c,shown:A,show:u,hide:h}=aW(),b=W.exports.useRef(0),[p,Z]=W.exports.useState(()=>yZ(t,i)),v=l?jk:Pk,y=()=>{Z(yZ(t,i)),u(),I()},m=()=>{h(),o(),window.clearTimeout(b.current)},B=()=>{b.current=window.setTimeout(m,500)};return W.exports.useEffect(()=>()=>window.clearTimeout(b.current),[]),we(oi,{children:[D(N3,{ref:r,active:A,onClick:()=>y(),style:{color:e}}),A&&we(_b,{children:[D(F2,{onPointerUp:m}),D(k3,{ref:c,onMouseEnter:()=>window.clearTimeout(b.current),onMouseLeave:w=>w.buttons===0&&B(),children:D(v,{color:p,onChange:n})})]})]})}function x3(){const{value:t,displayValue:e,label:g,onChange:n,onUpdate:I,settings:o}=gg();return we(rn,{input:!0,children:[D(wn,{children:g}),we(F3,{children:[D(z3,{value:t,displayValue:e,onChange:n,onUpdate:I,settings:o}),D(Pb,{value:e,onChange:n,onUpdate:I})]})]})}var L3=pe({component:x3},H3);function J3(){const{label:t,displayValue:e,onUpdate:g,settings:n}=gg();return we(rn,{input:!0,children:[D(wn,{children:t}),D($b,{value:e,settings:n,onUpdate:g})]})}var M3=pe({component:J3},Q2(["x","y","z"]));const E3=Ge("div",{$flexCenter:"",position:"relative",backgroundColor:"$elevation3",borderRadius:"$sm",cursor:"pointer",height:"$rowHeight",width:"$rowHeight",touchAction:"none",$draggable:"",$hover:"","&:active":{cursor:"none"},"&::after":{content:'""',backgroundColor:"$accent2",height:4,width:4,borderRadius:2}}),Q3=Ge("div",{$flexCenter:"",width:"$joystickWidth",height:"$joystickHeight",borderRadius:"$sm",boxShadow:"$level2",position:"fixed",zIndex:1e4,overflow:"hidden",$draggable:"",transform:"translate(-50%, -50%)",variants:{isOutOfBounds:{true:{backgroundColor:"$elevation1"},false:{backgroundColor:"$elevation3"}}},"> div":{position:"absolute",$flexCenter:"",borderStyle:"solid",borderWidth:1,borderColor:"$highlight1",backgroundColor:"$elevation3",width:"80%",height:"80%","&::after,&::before":{content:'""',position:"absolute",zindex:10,backgroundColor:"$highlight1"},"&::before":{width:"100%",height:1},"&::after":{height:"100%",width:1}},"> span":{position:"relative",zindex:100,width:10,height:10,backgroundColor:"$accent2",borderRadius:"50%"}});function T3({value:t,settings:e,onUpdate:g}){const n=W.exports.useRef(),I=W.exports.useRef(0),o=W.exports.useRef(0),i=W.exports.useRef(1),[l,r]=W.exports.useState(!1),[c,A]=W.exports.useState(!1),[u,h]=z2(),b=W.exports.useRef(null),p=W.exports.useRef(null);W.exports.useLayoutEffect(()=>{if(l){const{top:M,left:j,width:F,height:L}=b.current.getBoundingClientRect();p.current.style.left=j+F/2+"px",p.current.style.top=M+L/2+"px"}},[l]);const{keys:[Z,v],joystick:y}=e,m=y==="invertY"?1:-1,{[Z]:{step:B},[v]:{step:w}}=e,X=ZI("sizes","joystickWidth"),R=ZI("sizes","joystickHeight"),S=parseFloat(X)*.8/2,Y=parseFloat(R)*.8/2,k=W.exports.useCallback(()=>{n.current||(A(!0),I.current&&h({x:I.current*S}),o.current&&h({y:o.current*-Y}),n.current=window.setInterval(()=>{g(M=>{const j=B*I.current*i.current,F=m*w*o.current*i.current;return Array.isArray(M)?{[Z]:M[0]+j,[v]:M[1]+F}:{[Z]:M[Z]+j,[v]:M[v]+F}})},16))},[S,Y,g,h,B,w,Z,v,m]),N=W.exports.useCallback(()=>{window.clearTimeout(n.current),n.current=void 0,A(!1)},[]);W.exports.useEffect(()=>{function M(j){i.current=Z2(j)}return window.addEventListener("keydown",M),window.addEventListener("keyup",M),()=>{window.clearTimeout(n.current),window.removeEventListener("keydown",M),window.removeEventListener("keyup",M)}},[]);const z=ps(({first:M,active:j,delta:[F,L],movement:[P,$]})=>{M&&r(!0);const T=Ao(P,-S,S),q=Ao($,-Y,Y);I.current=Math.abs(P)>Math.abs(T)?Math.sign(P-T):0,o.current=Math.abs($)>Math.abs(q)?Math.sign(q-$):0;let ge=t[Z],se=t[v];j?(I.current||(ge+=F*B*i.current,h({x:T})),o.current||(se-=m*L*w*i.current,h({y:q})),I.current||o.current?k():N(),g({[Z]:ge,[v]:se})):(r(!1),I.current=0,o.current=0,h({x:0,y:0}),N())});return D(E3,Ze(_({ref:b},z()),{children:l&&D(_b,{children:we(Q3,{ref:p,isOutOfBounds:c,children:[D("div",{}),D("span",{ref:u})]})})}))}const U3=Ge("div",{display:"grid",columnGap:"$colGap",variants:{withJoystick:{true:{gridTemplateColumns:"$sizes$rowHeight auto"},false:{gridTemplateColumns:"auto"}}}});function D3(){const{label:t,displayValue:e,onUpdate:g,settings:n}=gg();return we(rn,{input:!0,children:[D(wn,{children:t}),we(U3,{withJoystick:!!n.joystick,children:[n.joystick&&D(T3,{value:e,settings:n,onUpdate:g}),D($b,{value:e,settings:n,onUpdate:g})]})]})}const j3=["joystick"],hW=Q2(["x","y"]),O3=t=>{let{joystick:e=!0}=t,g=Ee(t,j3);const{value:n,settings:I}=hW.normalize(g);return{value:n,settings:pe(pe({},I),{},{joystick:e})}};var P3=pe(pe({component:D3},hW),{},{normalize:O3});const _3=t=>{if(t!==void 0){if(t instanceof File)try{return URL.createObjectURL(t)}catch{return}if(typeof t=="string"&&t.indexOf("blob:")===0)return t;throw Error("Invalid image format [undefined | blob |\xA0File].")}},q3=(t,e)=>typeof e=="object"&&"image"in e,$3=({image:t})=>({value:t});var ex=Object.freeze({__proto__:null,sanitize:_3,schema:q3,normalize:$3});const tx=Ge("div",{position:"relative",display:"grid",gridTemplateColumns:"$sizes$rowHeight auto 20px",columnGap:"$colGap",alignItems:"center"}),gx=Ge("div",{$flexCenter:"",overflow:"hidden",height:"$rowHeight",background:"$elevation3",textAlign:"center",color:"inherit",borderRadius:"$sm",outline:"none",userSelect:"none",cursor:"pointer",$inputStyle:"",$hover:"",$focusWithin:"",$active:"$accent1 $elevation1",variants:{isDragAccept:{true:{$inputStyle:"$accent1",backgroundColor:"$elevation1"}}}}),nx=Ge("div",{boxSizing:"border-box",borderRadius:"$sm",height:"$rowHeight",width:"$rowHeight",$inputStyle:"",backgroundSize:"cover",backgroundPosition:"center",variants:{hasImage:{true:{cursor:"pointer",$hover:"",$active:""}}}}),Ix=Ge("div",{$flexCenter:"",width:"$imagePreviewWidth",height:"$imagePreviewHeight",borderRadius:"$sm",boxShadow:"$level2",pointerEvents:"none",$inputStyle:"",backgroundSize:"cover",backgroundPosition:"center"}),ox=Ge("div",{fontSize:"0.8em",height:"100%",padding:"$rowGap $md"}),ix=Ge("div",{$flexCenter:"",top:"0",right:"0",marginRight:"$sm",height:"100%",cursor:"pointer",variants:{disabled:{true:{color:"$elevation3",cursor:"default"}}},"&::after,&::before":{content:'""',position:"absolute",height:2,width:10,borderRadius:1,backgroundColor:"currentColor"},"&::after":{transform:"rotate(45deg)"},"&::before":{transform:"rotate(-45deg)"}});function Cx(){const{label:t,value:e,onUpdate:g,disabled:n}=gg(),{popinRef:I,wrapperRef:o,shown:i,show:l,hide:r}=aW(),c=W.exports.useCallback(p=>{p.length&&g(p[0])},[g]),A=W.exports.useCallback(p=>{p.stopPropagation(),g(void 0)},[g]),{getRootProps:u,getInputProps:h,isDragAccept:b}=lW({maxFiles:1,accept:"image/*",onDrop:c,disabled:n});return we(rn,{input:!0,children:[D(wn,{children:t}),we(tx,{children:[D(nx,{ref:I,hasImage:!!e,onPointerDown:()=>!!e&&l(),onPointerUp:r,style:{backgroundImage:e?`url(${e})`:"none"}}),i&&!!e&&we(_b,{children:[D(F2,{onPointerUp:r,style:{cursor:"pointer"}}),D(Ix,{ref:o,style:{backgroundImage:`url(${e})`}})]}),we(gx,Ze(_({},u({isDragAccept:b})),{children:[D("input",_({},h())),D(ox,{children:b?"drop image":"click or drop"})]})),D(ix,{onClick:A,disabled:!e})]})]})}var lx=pe({component:Cx},ex);const fZ=Rg().number(),sx=(t,e)=>Rg().array().length(2).every.number().test(t)&&Rg().schema({min:fZ,max:fZ}).test(e),Nh=t=>({min:t[0],max:t[1]}),bW=(t,{bounds:[e,g]},n)=>{const I={min:n[0],max:n[1]},{min:o,max:i}=pe(pe({},I),t);return[Ao(Number(o),e,Math.max(e,i)),Ao(Number(i),Math.min(g,o),g)]},rx=({value:t,min:e,max:g})=>{const n={min:e,max:g},I=E2(Nh(t),{min:n,max:n}),o=[e,g],i=pe(pe({},I),{},{bounds:o});return{value:bW(Nh(t),i,t),settings:i}};var cx=Object.freeze({__proto__:null,schema:sx,format:Nh,sanitize:bW,normalize:rx});const Ax=["value","bounds","onDrag"],ax=["bounds"],ux=Ge("div",{display:"grid",columnGap:"$colGap",gridTemplateColumns:"auto calc($sizes$numberInputMinWidth * 2 + $space$rowGap)"});function dx(t){let{value:e,bounds:[g,n],onDrag:I}=t,o=Ee(t,Ax);const i=W.exports.useRef(null),l=W.exports.useRef(null),r=W.exports.useRef(null),c=W.exports.useRef(0),A=ZI("sizes","scrubberWidth"),u=ps(({event:p,first:Z,xy:[v],movement:[y],memo:m={}})=>{if(Z){const{width:w,left:X}=i.current.getBoundingClientRect();c.current=w-parseFloat(A);const R=(p==null?void 0:p.target)===l.current||(p==null?void 0:p.target)===r.current;m.pos=tA((v-X)/w,g,n);const S=Math.abs(m.pos-e.min)-Math.abs(m.pos-e.max);m.key=S<0||S===0&&m.pos<=e.min?"min":"max",R&&(m.pos=e[m.key])}const B=m.pos+tA(y/c.current,0,n-g);return I({[m.key]:U1(B,o[m.key])}),m}),h=`calc(${eA(e.min,g,n)} * (100% - ${A} - 8px) + 4px)`,b=`calc(${1-eA(e.max,g,n)} * (100% - ${A} - 8px) + 4px)`;return we(L2,Ze(_({ref:i},u()),{children:[D(x2,{children:D(J2,{style:{left:h,right:b}})}),D(Zh,{position:"left",ref:l,style:{left:h}}),D(Zh,{position:"right",ref:r,style:{right:b}})]}))}function hx(){const{label:t,displayValue:e,onUpdate:g,settings:n}=gg(),I=Ee(n,ax);return D(oi,{children:we(rn,{input:!0,children:[D(wn,{children:t}),we(ux,{children:[D(dx,Ze(_({value:e},n),{onDrag:g})),D($b,{value:e,settings:I,onUpdate:g,innerLabelTrim:0})]})]})})}var bx=pe({component:hx},cx);const Gx=()=>{const t=new Map;return{on:(e,g)=>{let n=t.get(e);n===void 0&&(n=new Set,t.set(e,n)),n.add(g)},off:(e,g)=>{const n=t.get(e);n!==void 0&&(n.delete(g),n.size===0&&t.delete(e))},emit:(e,...g)=>{const n=t.get(e);if(n!==void 0)for(const I of n)I(...g)}}},mx=["type","value"],px=["onChange","transient","onEditStart","onEditEnd"],Bx=function(){const e=vA(Ez(()=>({data:{}}))),g=Gx();this.storeId=o1(),this.useStore=e;const n={},I=new Set;this.getVisiblePaths=()=>{const i=this.getData(),l=Object.keys(i),r=[];Object.entries(n).forEach(([A,u])=>{u.render&&l.some(h=>h.indexOf(A)===0)&&!u.render(this.get)&&r.push(A+".")});const c=[];return I.forEach(A=>{A in i&&i[A].__refCount>0&&r.every(u=>A.indexOf(u)===-1)&&(!i[A].render||i[A].render(this.get))&&c.push(A)}),c},this.setOrderedPaths=i=>{i.forEach(l=>I.add(l))},this.orderPaths=i=>(this.setOrderedPaths(i),i),this.disposePaths=i=>{e.setState(l=>{const r=l.data;return i.forEach(c=>{if(c in r){const A=r[c];A.__refCount--,A.__refCount===0&&A.type in Cn&&delete r[c]}}),{data:r}})},this.dispose=()=>{e.setState(()=>({data:{}}))},this.getFolderSettings=i=>n[i]||{},this.getData=()=>e.getState().data,this.addData=(i,l)=>{e.setState(r=>{const c=r.data;return Object.entries(i).forEach(([A,u])=>{let h=c[A];if(h){const{type:b,value:p}=u,Z=Ee(u,mx);b!==h.type?dI(st.INPUT_TYPE_OVERRIDE,b):((h.__refCount===0||l)&&Object.assign(h,Z),h.__refCount++)}else c[A]=pe(pe({},u),{},{__refCount:1})}),{data:c}})},this.setValueAtPath=(i,l,r)=>{e.setState(c=>{const A=c.data;return U0(A[i],l,i,this,r),{data:A}})},this.setSettingsAtPath=(i,l)=>{e.setState(r=>{const c=r.data;return c[i].settings=pe(pe({},c[i].settings),l),{data:c}})},this.disableInputAtPath=(i,l)=>{e.setState(r=>{const c=r.data;return c[i].disabled=l,{data:c}})},this.set=(i,l)=>{e.setState(r=>{const c=r.data;return Object.entries(i).forEach(([A,u])=>{try{U0(c[A],u,void 0,void 0,l)}catch{}}),{data:c}})},this.getInput=i=>{try{return this.getData()[i]}catch{dI(st.PATH_DOESNT_EXIST,i)}},this.get=i=>{var l;return(l=this.getInput(i))===null||l===void 0?void 0:l.value},this.emitOnEditStart=i=>{g.emit(`onEditStart:${i}`,this.get(i),i,pe(pe({},this.getInput(i)),{},{get:this.get}))},this.emitOnEditEnd=i=>{g.emit(`onEditEnd:${i}`,this.get(i),i,pe(pe({},this.getInput(i)),{},{get:this.get}))},this.subscribeToEditStart=(i,l)=>{const r=`onEditStart:${i}`;return g.on(r,l),()=>g.off(r,l)},this.subscribeToEditEnd=(i,l)=>{const r=`onEditEnd:${i}`;return g.on(r,l),()=>g.off(r,l)};const o=(i,l,r)=>{const c={};return Object.entries(i).forEach(([A,u])=>{if(A==="")return dI(st.EMPTY_KEY);let h=cW(l,A);if(u.type===Cn.FOLDER){const b=o(u.schema,h,r);Object.assign(c,b),h in n||(n[h]=u.settings)}else if(A in r)dI(st.DUPLICATE_KEYS,A,h,r[A].path);else{const b=A1(u,A,h,c);if(b){const{type:p,options:Z,input:v}=b,{onChange:y,transient:m,onEditStart:B,onEditEnd:w}=Z,X=Ee(Z,px);c[h]=pe(pe(pe({type:p},X),v),{},{fromPanel:!0}),r[A]={path:h,onChange:y,transient:m,onEditStart:B,onEditEnd:w}}else dI(st.UNKNOWN_INPUT,h,u)}}),c};this.getDataFromSchema=i=>{const l={};return[o(i,"",l),l]}},GW=new Bx,Zx={collapsed:!1};function yx(t,e){return{type:Cn.FOLDER,schema:t,settings:pe(pe({},Zx),e)}}const fx={disabled:!1};function FL(t,e){return{type:Cn.BUTTON,onClick:t,settings:pe(pe({},fx),e)}}const vx=t=>"__levaInput"in t,Wx=(t,e)=>{const g={},n=e?e.toLowerCase():null;return t.forEach(I=>{const[o,i]=f3(I);(!n||o.toLowerCase().indexOf(n)>-1)&&y3(g,i,{[o]:{__levaInput:!0,path:I}})}),g};function wx({toggle:t,toggled:e,name:g}){return we(w1,{onClick:()=>t(),children:[D(qb,{toggled:e}),D("div",{children:g})]})}const Vx=["type","label","path","valueKey","value","settings","setValue","disabled"];function Rx(t){let{type:e,label:g,path:n,valueKey:I,value:o,settings:i,setValue:l,disabled:r}=t,c=Ee(t,Vx);const{displayValue:A,onChange:u,onUpdate:h}=k2({type:e,value:o,settings:i,setValue:l}),b=ei[e].component;return b?D(w2.Provider,{value:pe({key:I,path:n,id:""+n,label:g,displayValue:A,value:o,onChange:u,onUpdate:h,settings:i,setValue:l,disabled:r},c),children:D(X1,{disabled:r,children:D(b,{})})}):(dI(st.NO_COMPONENT_FOR_TYPE,e,n),null)}const Xx=Ge("button",{display:"block",$reset:"",fontWeight:"$button",height:"$rowHeight",borderStyle:"none",borderRadius:"$sm",backgroundColor:"$elevation1",color:"$highlight1","&:not(:disabled)":{color:"$highlight3",backgroundColor:"$accent2",cursor:"pointer",$hover:"$accent3",$active:"$accent3 $accent1",$focus:""}});function Yx({onClick:t,settings:e,label:g}){const n=xA();return D(rn,{children:D(Xx,{disabled:e.disabled,onClick:()=>t(n.get),children:g})})}const Kx=Ge("div",{$flex:"",justifyContent:"flex-end",gap:"$colGap"}),Sx=Ge("button",{$reset:"",cursor:"pointer",borderRadius:"$xs","&:hover":{backgroundColor:"$elevation3"}}),Hx=({label:t,opts:e})=>{let g=typeof t=="string"&&t.trim()===""?null:t,n=e;return typeof e.opts=="object"&&(n.label!==void 0&&(g=e.label),n=e.opts),{label:g,opts:n}};function Nx(t){const{label:e,opts:g}=Hx(t),n=xA();return we(rn,{input:!!e,children:[e&&D(wn,{children:e}),D(Kx,{children:Object.entries(g).map(([I,o])=>D(Sx,{onClick:()=>o(n.get),children:I},I))})]})}const Fx=Ge("canvas",{height:"$monitorHeight",width:"100%",display:"block",borderRadius:"$sm"}),mW=100;function kx(t,e){t.push(e),t.length>mW&&t.shift()}const zx=W.exports.forwardRef(function({initialValue:t},e){const g=ZI("colors","highlight3"),n=ZI("colors","elevation2"),I=ZI("colors","highlight1"),[o,i]=W.exports.useMemo(()=>[Cg(I).alpha(.4).toRgbString(),Cg(I).alpha(.1).toRgbString()],[I]),l=W.exports.useRef([t]),r=W.exports.useRef(t),c=W.exports.useRef(t),A=W.exports.useRef(),u=W.exports.useCallback((p,Z)=>{if(!p)return;const{width:v,height:y}=p,m=new Path2D,B=v/mW,w=y*.05;for(let S=0;S<l.current.length;S++){const Y=eA(l.current[S],r.current,c.current),k=B*S,N=y-Y*(y-w*2)-w;m.lineTo(k,N)}Z.clearRect(0,0,v,y);const X=new Path2D(m);X.lineTo(B*(l.current.length+1),y),X.lineTo(0,y),X.lineTo(0,0);const R=Z.createLinearGradient(0,0,0,y);R.addColorStop(0,o),R.addColorStop(1,i),Z.fillStyle=R,Z.fill(X),Z.strokeStyle=n,Z.lineJoin="round",Z.lineWidth=14,Z.stroke(m),Z.strokeStyle=g,Z.lineWidth=2,Z.stroke(m)},[g,n,o,i]),[h,b]=x1(u);return W.exports.useImperativeHandle(e,()=>({frame:p=>{(r.current===void 0||p<r.current)&&(r.current=p),(c.current===void 0||p>c.current)&&(c.current=p),kx(l.current,p),A.current=requestAnimationFrame(()=>u(h.current,b.current))}}),[h,b,u]),W.exports.useEffect(()=>()=>cancelAnimationFrame(A.current),[]),D(Fx,{ref:h})}),vZ=t=>Number.isFinite(t)?t.toPrecision(2):t.toString(),xx=W.exports.forwardRef(function({initialValue:t},e){const[g,n]=W.exports.useState(vZ(t));return W.exports.useImperativeHandle(e,()=>({frame:I=>n(vZ(I))}),[]),D("div",{children:g})});function WZ(t){return typeof t=="function"?t():t.current}function Lx({label:t,objectOrFn:e,settings:g}){const n=W.exports.useRef(),I=W.exports.useRef(WZ(e));return W.exports.useEffect(()=>{const o=window.setInterval(()=>{var i;document.hidden||(i=n.current)===null||i===void 0||i.frame(WZ(e))},g.interval);return()=>window.clearInterval(o)},[e,g.interval]),we(rn,{input:!0,children:[D(wn,{align:"top",children:t}),g.graph?D(zx,{ref:n,initialValue:I.current}):D(xx,{ref:n,initialValue:I.current})]})}const Jx=["type","label","key"],Mx={[Cn.BUTTON]:Yx,[Cn.BUTTON_GROUP]:Nx,[Cn.MONITOR]:Lx},Ex=ae.memo(({path:t})=>{const[e,{set:g,setSettings:n,disable:I,storeId:o,emitOnEditStart:i,emitOnEditEnd:l}]=J1(t);if(!e)return null;const{type:r,label:c,key:A}=e,u=Ee(e,Jx);if(r in Cn){const h=Mx[r];return D(h,_({label:c,path:t},u))}return r in ei?D(Rx,_({type:r,label:c,storeId:o,path:t,valueKey:A,setValue:g,setSettings:n,disable:I,emitOnEditStart:i,emitOnEditEnd:l},u),o+t):(_5(st.UNSUPPORTED_INPUT,r,t),null)}),Qx=({name:t,path:e,tree:g})=>{const n=xA(),I=cW(e,t),{collapsed:o,color:i}=n.getFolderSettings(I),[l,r]=W.exports.useState(!o),c=W.exports.useRef(null),A=ZI("colors","folderWidgetColor"),u=ZI("colors","folderTextColor");return W.exports.useLayoutEffect(()=>{c.current.style.setProperty("--leva-colors-folderWidgetColor",i||A),c.current.style.setProperty("--leva-colors-folderTextColor",i||u)},[i,A,u]),we(gA,{ref:c,children:[D(wx,{name:t,toggled:l,toggle:()=>r(h=>!h)}),D(pW,{parent:I,tree:g,toggled:l})]})},pW=ae.memo(({isRoot:t=!1,fill:e=!1,flat:g=!1,parent:n,tree:I,toggled:o})=>{const{wrapperRef:i,contentRef:l}=w3(o);return D(Bh,{ref:i,isRoot:t,fill:e,flat:g,children:D(S2,{ref:l,isRoot:t,toggled:o,children:Object.entries(I).map(([r,c])=>vx(c)?D(Ex,{valueKey:c.valueKey,path:c.path},c.path):D(Qx,{name:r,path:n,tree:c},r))})})}),Tx=Ge("div",{position:"relative",fontFamily:"$mono",fontSize:"$root",color:"$rootText",backgroundColor:"$elevation1",variants:{fill:{false:{position:"fixed",top:"10px",right:"10px",zIndex:1e3,width:"$rootWidth"},true:{position:"relative",width:"100%"}},flat:{false:{borderRadius:"$lg",boxShadow:"$level1"}},oneLineLabels:{true:{[`${N2}`]:{gridTemplateColumns:"auto",gridAutoColumns:"minmax(max-content, 1fr)",gridAutoRows:"minmax($sizes$rowHeight), auto)",rowGap:0,columnGap:0,marginTop:"$rowGap"}}},hideTitleBar:{true:{$$titleBarHeight:"0px"},false:{$$titleBarHeight:"$sizes$titleBarHeight"}}},"&,*,*:after,*:before":{boxSizing:"border-box"},"*::selection":{backgroundColor:"$accent2"}}),BW=40,iA=Ge("i",{$flexCenter:"",width:BW,userSelect:"none",cursor:"pointer","> svg":{fill:"$highlight1",transition:"transform 350ms ease, fill 250ms ease"},"&:hover > svg":{fill:"$highlight3"},variants:{active:{true:{"> svg":{fill:"$highlight2"}}}}}),Ux=Ge("div",{display:"flex",alignItems:"stretch",justifyContent:"space-between",height:"$titleBarHeight",variants:{mode:{drag:{cursor:"grab"}}}}),Dx=Ge("div",{$flex:"",position:"relative",width:"100%",overflow:"hidden",transition:"height 250ms ease",color:"$highlight3",paddingLeft:"$md",[`> ${iA}`]:{height:30},variants:{toggled:{true:{height:30},false:{height:0}}}}),jx=Ge("input",{$reset:"",flex:1,position:"relative",height:30,width:"100%",backgroundColor:"transparent",fontSize:"10px",borderRadius:"$root","&:focus":{},"&::placeholder":{color:"$highlight2"}}),Ox=Ge("div",{touchAction:"none",$flexCenter:"",flex:1,"> svg":{fill:"$highlight1"},color:"$highlight1",variants:{drag:{true:{$draggable:"","> svg":{transition:"fill 250ms ease"},"&:hover":{color:"$highlight3"},"&:hover > svg":{fill:"$highlight3"}}},filterEnabled:{false:{paddingRight:BW}}}}),Px=ae.forwardRef(({setFilter:t,toggle:e},g)=>{const[n,I]=W.exports.useState(""),o=W.exports.useMemo(()=>B2(t,250),[t]),i=()=>{t(""),I("")},l=r=>{const c=r.currentTarget.value;e(!0),I(c)};return W.exports.useEffect(()=>{o(n)},[n,o]),we(oi,{children:[D(jx,{ref:g,value:n,placeholder:"[Open filter with CMD+SHIFT+L]",onPointerDown:r=>r.stopPropagation(),onChange:l}),D(iA,{onClick:()=>i(),style:{visibility:n?"visible":"hidden"},children:D("svg",{xmlns:"http://www.w3.org/2000/svg",height:"14",width:"14",viewBox:"0 0 20 20",fill:"currentColor",children:D("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z",clipRule:"evenodd"})})})]})});function _x({setFilter:t,onDrag:e,toggle:g,toggled:n,title:I,drag:o,filterEnabled:i}){const[l,r]=W.exports.useState(!1),c=W.exports.useRef(null);W.exports.useEffect(()=>{var u,h;l?(u=c.current)===null||u===void 0||u.focus():(h=c.current)===null||h===void 0||h.blur()},[l]);const A=ps(({offset:[u,h]})=>e({x:u,y:h}),{filterTaps:!0});return W.exports.useEffect(()=>{const u=h=>{h.key==="L"&&h.shiftKey&&h.metaKey&&r(b=>!b)};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[]),we(oi,{children:[we(Ux,{mode:o?"drag":void 0,children:[D(iA,{active:!n,onClick:()=>g(),children:D(qb,{toggled:n,width:12,height:8})}),D(Ox,Ze(_({},o?A():{}),{drag:o,filterEnabled:i,children:I===void 0&&o?we("svg",{width:"20",height:"10",viewBox:"0 0 28 14",xmlns:"http://www.w3.org/2000/svg",children:[D("circle",{cx:"2",cy:"2",r:"2"}),D("circle",{cx:"14",cy:"2",r:"2"}),D("circle",{cx:"26",cy:"2",r:"2"}),D("circle",{cx:"2",cy:"12",r:"2"}),D("circle",{cx:"14",cy:"12",r:"2"}),D("circle",{cx:"26",cy:"12",r:"2"})]}):I})),i&&D(iA,{active:l,onClick:()=>r(u=>!u),children:we("svg",{xmlns:"http://www.w3.org/2000/svg",height:"20",viewBox:"0 0 20 20",children:[D("path",{d:"M9 9a2 2 0 114 0 2 2 0 01-4 0z"}),D("path",{fillRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm1-13a4 4 0 00-3.446 6.032l-2.261 2.26a1 1 0 101.414 1.415l2.261-2.261A4 4 0 1011 5z",clipRule:"evenodd"})]})})]}),D(Dx,{toggled:l,children:D(Px,{ref:c,setFilter:t,toggle:g})})]})}const qx=["store","hidden","theme","collapsed"];function $x(t){let{store:e,hidden:g=!1,theme:n,collapsed:I=!1}=t,o=Ee(t,qx);const i=AW(()=>B1(n),[n]),[l,r]=W.exports.useState(!I),c=typeof I=="object"?!I.collapsed:l,A=W.exports.useMemo(()=>typeof I=="object"?u=>{typeof u=="function"?I.onChange(!u(!I.collapsed)):I.onChange(!u)}:r,[I]);return!e||g?null:D(Ob.Provider,{value:i,children:D(eL,Ze(_({store:e},o),{toggled:c,setToggle:A,rootClass:i.className}))})}const eL=ae.memo(({store:t,rootClass:e,fill:g=!1,flat:n=!1,neverHide:I=!1,oneLineLabels:o=!1,titleBar:i={title:void 0,drag:!0,filter:!0},hideCopyButton:l=!1,toggled:r,setToggle:c})=>{var A,u;const h=V3(t),[b,p]=W.exports.useState(""),Z=W.exports.useMemo(()=>Wx(h,b),[h,b]),[v,y]=z2(),m=I||h.length>0,B=typeof i=="object"&&i.title||void 0,w=typeof i=="object"&&(A=i.drag)!==null&&A!==void 0?A:!0,X=typeof i=="object"&&(u=i.filter)!==null&&u!==void 0?u:!0;return p1(),D(R2.Provider,{value:{hideCopyButton:l},children:we(Tx,{ref:v,className:e,fill:g,flat:n,oneLineLabels:o,hideTitleBar:!i,style:{display:m?"block":"none"},children:[i&&D(_x,{onDrag:y,setFilter:p,toggle:R=>c(S=>R!=null?R:!S),toggled:r,title:B,drag:w,filterEnabled:X}),m&&D(V2.Provider,{value:t,children:D(pW,{isRoot:!0,fill:g,flat:n,tree:Z,toggled:r})})]})})}),tL=["isRoot"];let CA=!1,Eo=null;function gL(t){let{isRoot:e=!1}=t,g=Ee(t,tL);return W.exports.useEffect(()=>(CA=!0,!e&&Eo&&(Eo.remove(),Eo=null),()=>{e||(CA=!1)}),[e]),D($x,_({store:GW},g))}function nL(t){W.exports.useEffect(()=>{t&&!CA&&(Eo||(Eo=document.getElementById("leva__root")||Object.assign(document.createElement("div"),{id:"leva__root"}),document.body&&(document.body.appendChild(Eo),Xb.render(D(gL,{isRoot:!0}),Eo))),CA=!0)},[t])}function IL(t,e,g,n,I){let o,i,l,r,c;return typeof t=="string"?(i=t,o=e,Array.isArray(g)?c=g:g&&("store"in g?(r=g,c=n):(l=g,Array.isArray(n)?c=n:(r=n,c=I)))):(o=t,Array.isArray(e)?c=e:(r=e,c=g)),{schema:o,folderName:i,folderSettings:l,hookSettings:r,deps:c||[]}}function kL(t,e,g,n,I){const{folderName:o,schema:i,folderSettings:l,hookSettings:r,deps:c}=IL(t,e,g,n,I),A=typeof i=="function",u=W.exports.useRef(!1),h=W.exports.useRef(!0),b=AW(()=>{u.current=!0;const N=typeof i=="function"?i():i;return o?{[o]:yx(N,l)}:N},c),p=!(r!=null&&r.store);nL(p);const[Z]=W.exports.useState(()=>(r==null?void 0:r.store)||GW),[v,y]=W.exports.useMemo(()=>Z.getDataFromSchema(b),[Z,b]),[m,B,w,X,R]=W.exports.useMemo(()=>{const N=[],z=[],M={},j={},F={};return Object.values(y).forEach(({path:L,onChange:P,onEditStart:$,onEditEnd:T,transient:q})=>{N.push(L),P?(M[L]=P,q||z.push(L)):z.push(L),$&&(j[L]=$),T&&(F[L]=T)}),[N,z,M,j,F]},[y]),S=W.exports.useMemo(()=>Z.orderPaths(m),[m,Z]),Y=R3(Z,B,v),k=W.exports.useCallback(N=>{const z=Object.entries(N).reduce((M,[j,F])=>Object.assign(M,{[y[j].path]:F}),{});Z.set(z,!1)},[Z,y]);return W.exports.useEffect(()=>{const N=!h.current&&u.current;return Z.addData(v,N),h.current=!1,u.current=!1,()=>Z.disposePaths(S)},[Z,S,v]),W.exports.useEffect(()=>{const N=[];return Object.entries(w).forEach(([z,M])=>{M(Z.get(z),z,pe({initial:!0,get:Z.get},Z.getInput(z)));const j=Z.useStore.subscribe(F=>{const L=F.data[z];return[L.disabled?void 0:L.value,L]},([F,L])=>M(F,z,pe({initial:!1,get:Z.get},L)),{equalityFn:bs});N.push(j)}),()=>N.forEach(z=>z())},[Z,w]),W.exports.useEffect(()=>{const N=[];return Object.entries(X).forEach(([z,M])=>N.push(Z.subscribeToEditStart(z,M))),Object.entries(R).forEach(([z,M])=>N.push(Z.subscribeToEditEnd(z,M))),()=>N.forEach(z=>z())},[X,R,Z]),A?[Y,k]:Y}VI(Wn.SELECT,Ik);VI(Wn.IMAGE,lx);VI(Wn.NUMBER,j1);VI(Wn.COLOR,L3);VI(Wn.STRING,ak);VI(Wn.BOOLEAN,pk);VI(Wn.INTERVAL,bx);VI(Wn.VECTOR3D,M3);VI(Wn.VECTOR2D,P3);function oL(g){var n=g,{color:t="black"}=n,e=ye(n,["color"]);return ae.createElement("svg",Le({"aria-hidden":"true",viewBox:"0 0 800 800",fill:t,xmlns:"http://www.w3.org/2000/svg"},e),ae.createElement("rect",{x:"280",y:"560",width:"240",height:"240",fill:"inherit"}),ae.createElement("rect",{x:"280",y:"280",width:"240",height:"240",fill:"inherit"}),ae.createElement("rect",{y:"280",width:"240",height:"240",fill:"inherit"}),ae.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M560 0H280V240H560V520H800V0H560Z",fill:"inherit"}))}function zL({date:t,year:e,link1:g,link2:n}){return ae.createElement("div",{className:"pmndrs-menu"},ae.createElement("div",null,ae.createElement(oL,{style:{width:42,height:42},color:"#b0b0b0"})),ae.createElement("div",null,ae.createElement("span",null,ae.createElement("b",null,"poimandres")),ae.createElement("a",{href:"https://pmnd.rs"},"pmndrs.rs"),ae.createElement("a",{href:"https://twitter.com/pmndrs"},"@pmndrs")),ae.createElement("div",null,ae.createElement("span",null,t),ae.createElement("span",null,e)),ae.createElement("div",null,ae.createElement("span",null,"Open Source"),ae.createElement("span",null,"Developer collective")),ae.createElement("div",{style:{width:"100%"}}),ae.createElement("div",null,ae.createElement("b",null,g),n))}export{rL as A,zL as B,uL as C,sL as D,wL as E,oi as F,mL as G,BL as H,dL as I,NL as J,_X as K,GL as M,AL as O,cL as P,pL as S,we as a,aL as b,vA as c,VL as d,Cv as e,dC as f,fL as g,sv as h,yL as i,D as j,bL as k,RL as l,vL as m,pt as n,WL as o,ZL as p,XL as q,W as r,bs as s,GY as t,pC as u,kL as v,yx as w,FL as x,hL as y,vY as z};
|