@jsenv/plugin-react 0.0.2 → 0.0.5
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/package.json +6 -2
- package/script/test/test.mjs +0 -20
- package/test/react_build/client/.jsenv/build/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.js +0 -2438
- package/test/react_build/client/.jsenv/build/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-runtime.js +0 -1332
- package/test/react_build/client/.jsenv/build/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.js +0 -27173
- package/test/react_build/client/.jsenv/build/app.jsx +0 -6
- package/test/react_build/client/.jsenv/build/main.html +0 -15
- package/test/react_build/client/.jsenv/build/main.html@L14-L16.js +0 -1
- package/test/react_build/client/.jsenv/build/main.html@L8-L12.js +0 -3
- package/test/react_build/client/.jsenv/build/main.jsx +0 -22
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.js +0 -2482
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.js__compile_info__.json +0 -22
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.map +0 -1
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-runtime.js +0 -1347
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-runtime.js__compile_info__.json +0 -22
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-runtime.map +0 -1
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.js +0 -27410
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.js__compile_info__.json +0 -38
- package/test/react_build/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.map +0 -1
- package/test/react_build/client/.jsenv/postbuild/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/test/react_build/dist/js/app.es5.js +0 -17
- package/test/react_build/client/.jsenv/postbuild/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/test/react_build/dist/js/main.es5.js +0 -30944
- package/test/react_build/client/.jsenv/postbuild/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/test/react_build/dist/js/main.html@L14-L16.es5.js +0 -10
- package/test/react_build/client/.jsenv/postbuild/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/test/react_build/dist/js/s.js +0 -777
- package/test/react_build/client/.jsenv/postbuild/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/test/react_build/dist/main.html +0 -25
- package/test/react_build/client/.jsenv/postbuild/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/test/react_build/dist/main.html@L8-L12.js +0 -3
- package/test/react_build/client/app.jsx +0 -3
- package/test/react_build/client/main.html +0 -20
- package/test/react_build/client/main.jsx +0 -9
- package/test/react_build/dist/asset-manifest.json +0 -8
- package/test/react_build/dist/js/app.es5.js +0 -17
- package/test/react_build/dist/js/main.es5.js +0 -30944
- package/test/react_build/dist/js/s.js +0 -777
- package/test/react_build/dist/main.html +0 -35
- package/test/react_build/react_build.test.mjs +0 -57
- package/test/react_refresh/client/.jsenv/build/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.js +0 -2438
- package/test/react_refresh/client/.jsenv/build/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-runtime.js +0 -1332
- package/test/react_refresh/client/.jsenv/build/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.js +0 -27165
- package/test/react_refresh/client/.jsenv/build/app.jsx +0 -24
- package/test/react_refresh/client/.jsenv/build/index.html +0 -12
- package/test/react_refresh/client/.jsenv/build/main.jsx +0 -8
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.js +0 -2482
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.js__compile_info__.json +0 -21
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.map +0 -1
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-dev-runtime.js +0 -1328
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-dev-runtime.js__compile_info__.json +0 -21
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-dev-runtime.map +0 -1
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-runtime.js +0 -1347
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-runtime.js__compile_info__.json +0 -22
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-runtime.map +0 -1
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.js +0 -27410
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.js__compile_info__.json +0 -37
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.map +0 -1
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-refresh/runtime.js +0 -694
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-refresh/runtime.js__compile_info__.json +0 -17
- package/test/react_refresh/client/.jsenv/cjs_to_esm/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-refresh/runtime.map +0 -1
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/plugin-preact/src/client/preact_refresh.js +0 -38
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/plugin-preact/src/client/preact_refresh.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/plugin-react/src/client/react_refresh.js +0 -35
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/plugin-react/src/client/react_refresh.js.map +0 -27
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/index.js +0 -3
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/index.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/decompose.js +0 -405
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/decompose.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/escapeString.js +0 -28
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/escapeString.js.map +0 -19
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/global-value-path.js +0 -60
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/global-value-path.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/isComposite.js +0 -18
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/isComposite.js.map +0 -12
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/sortRecipe.js +0 -76
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/internal/sortRecipe.js.map +0 -31
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/uneval.js +0 -212
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/uneval/src/uneval.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/utils/event_source/event_source.js +0 -197
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/utils/event_source/event_source.js.map +0 -71
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/utils/html_ast/html_attribute_src_set.js +0 -19
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@jsenv/utils/html_ast/html_attribute_src_set.js.map +0 -23
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/computeKey.js +0 -38
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/computeKey.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/constants.js +0 -13
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/constants.js.map +0 -22
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/index.js +0 -206
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/index.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/catchError.js +0 -17
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/catchError.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/debounceRendering.js +0 -21
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/debounceRendering.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/signaturesForType.js +0 -2
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/signaturesForType.js.map +0 -11
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/unmount.js +0 -20
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/unmount.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/vnode.js +0 -46
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/vnode.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/vnodesForComponent.js +0 -3
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/core/src/runtime/vnodesForComponent.js.map +0 -12
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/utils/src/index.js +0 -43
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/@prefresh/utils/src/index.js.map +0 -33
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/compat/dist/compat.module.js +0 -408
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/compat/dist/compat.module.js.map +0 -229
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/debug/dist/debug.module.js +0 -2
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/debug/dist/debug.module.js.map +0 -135
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/devtools/dist/devtools.module.js +0 -2
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/devtools/dist/devtools.module.js.map +0 -20
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/dist/preact.module.js +0 -2
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/dist/preact.module.js.map +0 -231
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/hooks/dist/hooks.module.js +0 -167
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/hooks/dist/hooks.module.js.map +0 -100
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js +0 -2
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js.map +0 -24
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.js +0 -2484
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/index.js.map +0 -19
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-dev-runtime.js +0 -1330
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react/jsx-dev-runtime.js.map +0 -13
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.js +0 -27412
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-dom/index.js.map +0 -19
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-refresh/runtime.js +0 -696
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/node_modules/react-refresh/runtime.js.map +0 -16
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/src/client/react_refresh.js +0 -35
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/src/client/react_refresh.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/src/client/react_refresh_preamble.js +0 -24
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/packages/jsenv-plugin-react/src/client/react_refresh_preamble.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/dev_sse/client/autoreload_preference.js +0 -11
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/dev_sse/client/autoreload_preference.js.map +0 -16
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/dev_sse/client/event_source_client.js +0 -188
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/dev_sse/client/event_source_client.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/dev_sse/client/reload.js +0 -103
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/dev_sse/client/reload.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/dev_sse/client/url_helpers.js +0 -20
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/autoreload/dev_sse/client/url_helpers.js.map +0 -26
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/error_in_document.js +0 -198
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/error_in_document.js.map +0 -70
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/error_in_notification.js +0 -21
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/error_in_notification.js.map +0 -23
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/html_supervisor_installer.js +0 -171
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/html_supervisor_installer.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/html_supervisor_setup.js +0 -77
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/uneval_exception.js +0 -10
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/html_supervisor/client/uneval_exception.js.map +0 -9
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/import_meta_hot/client/import_meta_hot.js +0 -82
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/@fs/Users/d.maillard/dev/jsenv/jsenv-core/src/plugins/import_meta_hot/client/import_meta_hot.js.map +0 -38
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/app.jsx +0 -59
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/app.jsx.map +0 -20
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/count_label.jsx +0 -27
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/count_label.jsx.map +0 -16
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/main.html +0 -30
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/main.html@L3-L8.js +0 -7
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/main.html@L3-L8.js.map +0 -12
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/main.html@L9-L11.js +0 -4
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/main.html@L9-L11.js.map +0 -12
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/main.jsx +0 -16
- package/test/react_refresh/client/.jsenv/dev/chrome@101.00/main.jsx.map +0 -22
- package/test/react_refresh/client/.jsenv/postbuild/@fs/Users/d.maillard/dev/jsenv/jsenv-core/test/dev_server/react_and_autoreload/dist/index.html +0 -12
- package/test/react_refresh/client/.jsenv/postbuild/@fs/Users/d.maillard/dev/jsenv/jsenv-core/test/dev_server/react_and_autoreload/dist/js/main.js +0 -30952
- package/test/react_refresh/client/app.jsx +0 -29
- package/test/react_refresh/client/count_label.jsx +0 -7
- package/test/react_refresh/client/main.html +0 -13
- package/test/react_refresh/client/main.jsx +0 -8
- package/test/react_refresh/react_refresh.test.mjs +0 -93
- package/test/react_refresh/react_refresh.test_manual.mjs +0 -26
|
@@ -1,2484 +0,0 @@
|
|
|
1
|
-
function getDefaultExportFromCjs (x) {
|
|
2
|
-
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
var react = {exports: {}};
|
|
6
|
-
|
|
7
|
-
/*
|
|
8
|
-
object-assign
|
|
9
|
-
(c) Sindre Sorhus
|
|
10
|
-
@license MIT
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
var objectAssign;
|
|
14
|
-
var hasRequiredObjectAssign;
|
|
15
|
-
|
|
16
|
-
function requireObjectAssign () {
|
|
17
|
-
if (hasRequiredObjectAssign) return objectAssign;
|
|
18
|
-
hasRequiredObjectAssign = 1;
|
|
19
|
-
/* eslint-disable no-unused-vars */
|
|
20
|
-
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
|
21
|
-
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
22
|
-
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
|
23
|
-
|
|
24
|
-
function toObject(val) {
|
|
25
|
-
if (val === null || val === undefined) {
|
|
26
|
-
throw new TypeError('Object.assign cannot be called with null or undefined');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return Object(val);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function shouldUseNative() {
|
|
33
|
-
try {
|
|
34
|
-
if (!Object.assign) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Detect buggy property enumeration order in older V8 versions.
|
|
39
|
-
|
|
40
|
-
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
|
41
|
-
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
|
|
42
|
-
test1[5] = 'de';
|
|
43
|
-
if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
|
48
|
-
var test2 = {};
|
|
49
|
-
for (var i = 0; i < 10; i++) {
|
|
50
|
-
test2['_' + String.fromCharCode(i)] = i;
|
|
51
|
-
}
|
|
52
|
-
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
|
53
|
-
return test2[n];
|
|
54
|
-
});
|
|
55
|
-
if (order2.join('') !== '0123456789') {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
|
60
|
-
var test3 = {};
|
|
61
|
-
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
|
62
|
-
test3[letter] = letter;
|
|
63
|
-
});
|
|
64
|
-
if (Object.keys(Object.assign({}, test3)).join('') !==
|
|
65
|
-
'abcdefghijklmnopqrst') {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return true;
|
|
70
|
-
} catch (err) {
|
|
71
|
-
// We don't expect any of the above to throw, but better to be safe.
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
|
|
77
|
-
var from;
|
|
78
|
-
var to = toObject(target);
|
|
79
|
-
var symbols;
|
|
80
|
-
|
|
81
|
-
for (var s = 1; s < arguments.length; s++) {
|
|
82
|
-
from = Object(arguments[s]);
|
|
83
|
-
|
|
84
|
-
for (var key in from) {
|
|
85
|
-
if (hasOwnProperty.call(from, key)) {
|
|
86
|
-
to[key] = from[key];
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (getOwnPropertySymbols) {
|
|
91
|
-
symbols = getOwnPropertySymbols(from);
|
|
92
|
-
for (var i = 0; i < symbols.length; i++) {
|
|
93
|
-
if (propIsEnumerable.call(from, symbols[i])) {
|
|
94
|
-
to[symbols[i]] = from[symbols[i]];
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return to;
|
|
101
|
-
};
|
|
102
|
-
return objectAssign;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
var react_development = {};
|
|
106
|
-
|
|
107
|
-
/** @license React v17.0.2
|
|
108
|
-
* react.development.js
|
|
109
|
-
*
|
|
110
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
111
|
-
*
|
|
112
|
-
* This source code is licensed under the MIT license found in the
|
|
113
|
-
* LICENSE file in the root directory of this source tree.
|
|
114
|
-
*/
|
|
115
|
-
|
|
116
|
-
var hasRequiredReact_development;
|
|
117
|
-
|
|
118
|
-
function requireReact_development () {
|
|
119
|
-
if (hasRequiredReact_development) return react_development;
|
|
120
|
-
hasRequiredReact_development = 1;
|
|
121
|
-
(function (exports) {
|
|
122
|
-
|
|
123
|
-
{
|
|
124
|
-
(function() {
|
|
125
|
-
|
|
126
|
-
var _assign = requireObjectAssign();
|
|
127
|
-
|
|
128
|
-
// TODO: this is special because it gets imported during build.
|
|
129
|
-
var ReactVersion = '17.0.2';
|
|
130
|
-
|
|
131
|
-
// ATTENTION
|
|
132
|
-
// When adding new symbols to this file,
|
|
133
|
-
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
|
|
134
|
-
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
|
|
135
|
-
// nor polyfill, then a plain number is used for performance.
|
|
136
|
-
var REACT_ELEMENT_TYPE = 0xeac7;
|
|
137
|
-
var REACT_PORTAL_TYPE = 0xeaca;
|
|
138
|
-
exports.Fragment = 0xeacb;
|
|
139
|
-
exports.StrictMode = 0xeacc;
|
|
140
|
-
exports.Profiler = 0xead2;
|
|
141
|
-
var REACT_PROVIDER_TYPE = 0xeacd;
|
|
142
|
-
var REACT_CONTEXT_TYPE = 0xeace;
|
|
143
|
-
var REACT_FORWARD_REF_TYPE = 0xead0;
|
|
144
|
-
exports.Suspense = 0xead1;
|
|
145
|
-
var REACT_SUSPENSE_LIST_TYPE = 0xead8;
|
|
146
|
-
var REACT_MEMO_TYPE = 0xead3;
|
|
147
|
-
var REACT_LAZY_TYPE = 0xead4;
|
|
148
|
-
var REACT_BLOCK_TYPE = 0xead9;
|
|
149
|
-
var REACT_SERVER_BLOCK_TYPE = 0xeada;
|
|
150
|
-
var REACT_FUNDAMENTAL_TYPE = 0xead5;
|
|
151
|
-
var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;
|
|
152
|
-
var REACT_LEGACY_HIDDEN_TYPE = 0xeae3;
|
|
153
|
-
|
|
154
|
-
if (typeof Symbol === 'function' && Symbol.for) {
|
|
155
|
-
var symbolFor = Symbol.for;
|
|
156
|
-
REACT_ELEMENT_TYPE = symbolFor('react.element');
|
|
157
|
-
REACT_PORTAL_TYPE = symbolFor('react.portal');
|
|
158
|
-
exports.Fragment = symbolFor('react.fragment');
|
|
159
|
-
exports.StrictMode = symbolFor('react.strict_mode');
|
|
160
|
-
exports.Profiler = symbolFor('react.profiler');
|
|
161
|
-
REACT_PROVIDER_TYPE = symbolFor('react.provider');
|
|
162
|
-
REACT_CONTEXT_TYPE = symbolFor('react.context');
|
|
163
|
-
REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');
|
|
164
|
-
exports.Suspense = symbolFor('react.suspense');
|
|
165
|
-
REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');
|
|
166
|
-
REACT_MEMO_TYPE = symbolFor('react.memo');
|
|
167
|
-
REACT_LAZY_TYPE = symbolFor('react.lazy');
|
|
168
|
-
REACT_BLOCK_TYPE = symbolFor('react.block');
|
|
169
|
-
REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');
|
|
170
|
-
REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');
|
|
171
|
-
symbolFor('react.scope');
|
|
172
|
-
symbolFor('react.opaque.id');
|
|
173
|
-
REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');
|
|
174
|
-
symbolFor('react.offscreen');
|
|
175
|
-
REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
|
179
|
-
var FAUX_ITERATOR_SYMBOL = '@@iterator';
|
|
180
|
-
function getIteratorFn(maybeIterable) {
|
|
181
|
-
if (maybeIterable === null || typeof maybeIterable !== 'object') {
|
|
182
|
-
return null;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
|
|
186
|
-
|
|
187
|
-
if (typeof maybeIterator === 'function') {
|
|
188
|
-
return maybeIterator;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return null;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Keeps track of the current dispatcher.
|
|
196
|
-
*/
|
|
197
|
-
var ReactCurrentDispatcher = {
|
|
198
|
-
/**
|
|
199
|
-
* @internal
|
|
200
|
-
* @type {ReactComponent}
|
|
201
|
-
*/
|
|
202
|
-
current: null
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Keeps track of the current batch's configuration such as how long an update
|
|
207
|
-
* should suspend for if it needs to.
|
|
208
|
-
*/
|
|
209
|
-
var ReactCurrentBatchConfig = {
|
|
210
|
-
transition: 0
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Keeps track of the current owner.
|
|
215
|
-
*
|
|
216
|
-
* The current owner is the component who should own any components that are
|
|
217
|
-
* currently being constructed.
|
|
218
|
-
*/
|
|
219
|
-
var ReactCurrentOwner = {
|
|
220
|
-
/**
|
|
221
|
-
* @internal
|
|
222
|
-
* @type {ReactComponent}
|
|
223
|
-
*/
|
|
224
|
-
current: null
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
var ReactDebugCurrentFrame = {};
|
|
228
|
-
var currentExtraStackFrame = null;
|
|
229
|
-
function setExtraStackFrame(stack) {
|
|
230
|
-
{
|
|
231
|
-
currentExtraStackFrame = stack;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
{
|
|
236
|
-
ReactDebugCurrentFrame.setExtraStackFrame = function (stack) {
|
|
237
|
-
{
|
|
238
|
-
currentExtraStackFrame = stack;
|
|
239
|
-
}
|
|
240
|
-
}; // Stack implementation injected by the current renderer.
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
ReactDebugCurrentFrame.getCurrentStack = null;
|
|
244
|
-
|
|
245
|
-
ReactDebugCurrentFrame.getStackAddendum = function () {
|
|
246
|
-
var stack = ''; // Add an extra top frame while an element is being validated
|
|
247
|
-
|
|
248
|
-
if (currentExtraStackFrame) {
|
|
249
|
-
stack += currentExtraStackFrame;
|
|
250
|
-
} // Delegate to the injected renderer-specific implementation
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
var impl = ReactDebugCurrentFrame.getCurrentStack;
|
|
254
|
-
|
|
255
|
-
if (impl) {
|
|
256
|
-
stack += impl() || '';
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
return stack;
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Used by act() to track whether you're inside an act() scope.
|
|
265
|
-
*/
|
|
266
|
-
var IsSomeRendererActing = {
|
|
267
|
-
current: false
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
var ReactSharedInternals = {
|
|
271
|
-
ReactCurrentDispatcher: ReactCurrentDispatcher,
|
|
272
|
-
ReactCurrentBatchConfig: ReactCurrentBatchConfig,
|
|
273
|
-
ReactCurrentOwner: ReactCurrentOwner,
|
|
274
|
-
IsSomeRendererActing: IsSomeRendererActing,
|
|
275
|
-
// Used by renderers to avoid bundling object-assign twice in UMD bundles:
|
|
276
|
-
assign: _assign
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
{
|
|
280
|
-
ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// by calls to these methods by a Babel plugin.
|
|
284
|
-
//
|
|
285
|
-
// In PROD (or in packages without access to React internals),
|
|
286
|
-
// they are left as they are instead.
|
|
287
|
-
|
|
288
|
-
function warn(format) {
|
|
289
|
-
{
|
|
290
|
-
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
291
|
-
args[_key - 1] = arguments[_key];
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
printWarning('warn', format, args);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
function error(format) {
|
|
298
|
-
{
|
|
299
|
-
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
300
|
-
args[_key2 - 1] = arguments[_key2];
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
printWarning('error', format, args);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
function printWarning(level, format, args) {
|
|
308
|
-
// When changing this logic, you might want to also
|
|
309
|
-
// update consoleWithStackDev.www.js as well.
|
|
310
|
-
{
|
|
311
|
-
var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
|
|
312
|
-
var stack = ReactDebugCurrentFrame.getStackAddendum();
|
|
313
|
-
|
|
314
|
-
if (stack !== '') {
|
|
315
|
-
format += '%s';
|
|
316
|
-
args = args.concat([stack]);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
var argsWithFormat = args.map(function (item) {
|
|
320
|
-
return '' + item;
|
|
321
|
-
}); // Careful: RN currently depends on this prefix
|
|
322
|
-
|
|
323
|
-
argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
|
|
324
|
-
// breaks IE9: https://github.com/facebook/react/issues/13610
|
|
325
|
-
// eslint-disable-next-line react-internal/no-production-logging
|
|
326
|
-
|
|
327
|
-
Function.prototype.apply.call(console[level], console, argsWithFormat);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
var didWarnStateUpdateForUnmountedComponent = {};
|
|
332
|
-
|
|
333
|
-
function warnNoop(publicInstance, callerName) {
|
|
334
|
-
{
|
|
335
|
-
var _constructor = publicInstance.constructor;
|
|
336
|
-
var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';
|
|
337
|
-
var warningKey = componentName + "." + callerName;
|
|
338
|
-
|
|
339
|
-
if (didWarnStateUpdateForUnmountedComponent[warningKey]) {
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);
|
|
344
|
-
|
|
345
|
-
didWarnStateUpdateForUnmountedComponent[warningKey] = true;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* This is the abstract API for an update queue.
|
|
350
|
-
*/
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
var ReactNoopUpdateQueue = {
|
|
354
|
-
/**
|
|
355
|
-
* Checks whether or not this composite component is mounted.
|
|
356
|
-
* @param {ReactClass} publicInstance The instance we want to test.
|
|
357
|
-
* @return {boolean} True if mounted, false otherwise.
|
|
358
|
-
* @protected
|
|
359
|
-
* @final
|
|
360
|
-
*/
|
|
361
|
-
isMounted: function (publicInstance) {
|
|
362
|
-
return false;
|
|
363
|
-
},
|
|
364
|
-
|
|
365
|
-
/**
|
|
366
|
-
* Forces an update. This should only be invoked when it is known with
|
|
367
|
-
* certainty that we are **not** in a DOM transaction.
|
|
368
|
-
*
|
|
369
|
-
* You may want to call this when you know that some deeper aspect of the
|
|
370
|
-
* component's state has changed but `setState` was not called.
|
|
371
|
-
*
|
|
372
|
-
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
|
373
|
-
* `componentWillUpdate` and `componentDidUpdate`.
|
|
374
|
-
*
|
|
375
|
-
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
376
|
-
* @param {?function} callback Called after component is updated.
|
|
377
|
-
* @param {?string} callerName name of the calling function in the public API.
|
|
378
|
-
* @internal
|
|
379
|
-
*/
|
|
380
|
-
enqueueForceUpdate: function (publicInstance, callback, callerName) {
|
|
381
|
-
warnNoop(publicInstance, 'forceUpdate');
|
|
382
|
-
},
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Replaces all of the state. Always use this or `setState` to mutate state.
|
|
386
|
-
* You should treat `this.state` as immutable.
|
|
387
|
-
*
|
|
388
|
-
* There is no guarantee that `this.state` will be immediately updated, so
|
|
389
|
-
* accessing `this.state` after calling this method may return the old value.
|
|
390
|
-
*
|
|
391
|
-
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
392
|
-
* @param {object} completeState Next state.
|
|
393
|
-
* @param {?function} callback Called after component is updated.
|
|
394
|
-
* @param {?string} callerName name of the calling function in the public API.
|
|
395
|
-
* @internal
|
|
396
|
-
*/
|
|
397
|
-
enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {
|
|
398
|
-
warnNoop(publicInstance, 'replaceState');
|
|
399
|
-
},
|
|
400
|
-
|
|
401
|
-
/**
|
|
402
|
-
* Sets a subset of the state. This only exists because _pendingState is
|
|
403
|
-
* internal. This provides a merging strategy that is not available to deep
|
|
404
|
-
* properties which is confusing. TODO: Expose pendingState or don't use it
|
|
405
|
-
* during the merge.
|
|
406
|
-
*
|
|
407
|
-
* @param {ReactClass} publicInstance The instance that should rerender.
|
|
408
|
-
* @param {object} partialState Next partial state to be merged with state.
|
|
409
|
-
* @param {?function} callback Called after component is updated.
|
|
410
|
-
* @param {?string} Name of the calling function in the public API.
|
|
411
|
-
* @internal
|
|
412
|
-
*/
|
|
413
|
-
enqueueSetState: function (publicInstance, partialState, callback, callerName) {
|
|
414
|
-
warnNoop(publicInstance, 'setState');
|
|
415
|
-
}
|
|
416
|
-
};
|
|
417
|
-
|
|
418
|
-
var emptyObject = {};
|
|
419
|
-
|
|
420
|
-
{
|
|
421
|
-
Object.freeze(emptyObject);
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Base class helpers for the updating state of a component.
|
|
425
|
-
*/
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
function Component(props, context, updater) {
|
|
429
|
-
this.props = props;
|
|
430
|
-
this.context = context; // If a component has string refs, we will assign a different object later.
|
|
431
|
-
|
|
432
|
-
this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the
|
|
433
|
-
// renderer.
|
|
434
|
-
|
|
435
|
-
this.updater = updater || ReactNoopUpdateQueue;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
Component.prototype.isReactComponent = {};
|
|
439
|
-
/**
|
|
440
|
-
* Sets a subset of the state. Always use this to mutate
|
|
441
|
-
* state. You should treat `this.state` as immutable.
|
|
442
|
-
*
|
|
443
|
-
* There is no guarantee that `this.state` will be immediately updated, so
|
|
444
|
-
* accessing `this.state` after calling this method may return the old value.
|
|
445
|
-
*
|
|
446
|
-
* There is no guarantee that calls to `setState` will run synchronously,
|
|
447
|
-
* as they may eventually be batched together. You can provide an optional
|
|
448
|
-
* callback that will be executed when the call to setState is actually
|
|
449
|
-
* completed.
|
|
450
|
-
*
|
|
451
|
-
* When a function is provided to setState, it will be called at some point in
|
|
452
|
-
* the future (not synchronously). It will be called with the up to date
|
|
453
|
-
* component arguments (state, props, context). These values can be different
|
|
454
|
-
* from this.* because your function may be called after receiveProps but before
|
|
455
|
-
* shouldComponentUpdate, and this new state, props, and context will not yet be
|
|
456
|
-
* assigned to this.
|
|
457
|
-
*
|
|
458
|
-
* @param {object|function} partialState Next partial state or function to
|
|
459
|
-
* produce next partial state to be merged with current state.
|
|
460
|
-
* @param {?function} callback Called after state is updated.
|
|
461
|
-
* @final
|
|
462
|
-
* @protected
|
|
463
|
-
*/
|
|
464
|
-
|
|
465
|
-
Component.prototype.setState = function (partialState, callback) {
|
|
466
|
-
if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) {
|
|
467
|
-
{
|
|
468
|
-
throw Error( "setState(...): takes an object of state variables to update or a function which returns an object of state variables." );
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
this.updater.enqueueSetState(this, partialState, callback, 'setState');
|
|
473
|
-
};
|
|
474
|
-
/**
|
|
475
|
-
* Forces an update. This should only be invoked when it is known with
|
|
476
|
-
* certainty that we are **not** in a DOM transaction.
|
|
477
|
-
*
|
|
478
|
-
* You may want to call this when you know that some deeper aspect of the
|
|
479
|
-
* component's state has changed but `setState` was not called.
|
|
480
|
-
*
|
|
481
|
-
* This will not invoke `shouldComponentUpdate`, but it will invoke
|
|
482
|
-
* `componentWillUpdate` and `componentDidUpdate`.
|
|
483
|
-
*
|
|
484
|
-
* @param {?function} callback Called after update is complete.
|
|
485
|
-
* @final
|
|
486
|
-
* @protected
|
|
487
|
-
*/
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
Component.prototype.forceUpdate = function (callback) {
|
|
491
|
-
this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');
|
|
492
|
-
};
|
|
493
|
-
/**
|
|
494
|
-
* Deprecated APIs. These APIs used to exist on classic React classes but since
|
|
495
|
-
* we would like to deprecate them, we're not going to move them over to this
|
|
496
|
-
* modern base class. Instead, we define a getter that warns if it's accessed.
|
|
497
|
-
*/
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
{
|
|
501
|
-
var deprecatedAPIs = {
|
|
502
|
-
isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],
|
|
503
|
-
replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']
|
|
504
|
-
};
|
|
505
|
-
|
|
506
|
-
var defineDeprecationWarning = function (methodName, info) {
|
|
507
|
-
Object.defineProperty(Component.prototype, methodName, {
|
|
508
|
-
get: function () {
|
|
509
|
-
warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);
|
|
510
|
-
|
|
511
|
-
return undefined;
|
|
512
|
-
}
|
|
513
|
-
});
|
|
514
|
-
};
|
|
515
|
-
|
|
516
|
-
for (var fnName in deprecatedAPIs) {
|
|
517
|
-
if (deprecatedAPIs.hasOwnProperty(fnName)) {
|
|
518
|
-
defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
function ComponentDummy() {}
|
|
524
|
-
|
|
525
|
-
ComponentDummy.prototype = Component.prototype;
|
|
526
|
-
/**
|
|
527
|
-
* Convenience component with default shallow equality check for sCU.
|
|
528
|
-
*/
|
|
529
|
-
|
|
530
|
-
function PureComponent(props, context, updater) {
|
|
531
|
-
this.props = props;
|
|
532
|
-
this.context = context; // If a component has string refs, we will assign a different object later.
|
|
533
|
-
|
|
534
|
-
this.refs = emptyObject;
|
|
535
|
-
this.updater = updater || ReactNoopUpdateQueue;
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
var pureComponentPrototype = PureComponent.prototype = new ComponentDummy();
|
|
539
|
-
pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.
|
|
540
|
-
|
|
541
|
-
_assign(pureComponentPrototype, Component.prototype);
|
|
542
|
-
|
|
543
|
-
pureComponentPrototype.isPureReactComponent = true;
|
|
544
|
-
|
|
545
|
-
// an immutable object with a single mutable value
|
|
546
|
-
function createRef() {
|
|
547
|
-
var refObject = {
|
|
548
|
-
current: null
|
|
549
|
-
};
|
|
550
|
-
|
|
551
|
-
{
|
|
552
|
-
Object.seal(refObject);
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
return refObject;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
function getWrappedName(outerType, innerType, wrapperName) {
|
|
559
|
-
var functionName = innerType.displayName || innerType.name || '';
|
|
560
|
-
return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
function getContextName(type) {
|
|
564
|
-
return type.displayName || 'Context';
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
function getComponentName(type) {
|
|
568
|
-
if (type == null) {
|
|
569
|
-
// Host root, text node or just invalid type.
|
|
570
|
-
return null;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
{
|
|
574
|
-
if (typeof type.tag === 'number') {
|
|
575
|
-
error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
if (typeof type === 'function') {
|
|
580
|
-
return type.displayName || type.name || null;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
if (typeof type === 'string') {
|
|
584
|
-
return type;
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
switch (type) {
|
|
588
|
-
case exports.Fragment:
|
|
589
|
-
return 'Fragment';
|
|
590
|
-
|
|
591
|
-
case REACT_PORTAL_TYPE:
|
|
592
|
-
return 'Portal';
|
|
593
|
-
|
|
594
|
-
case exports.Profiler:
|
|
595
|
-
return 'Profiler';
|
|
596
|
-
|
|
597
|
-
case exports.StrictMode:
|
|
598
|
-
return 'StrictMode';
|
|
599
|
-
|
|
600
|
-
case exports.Suspense:
|
|
601
|
-
return 'Suspense';
|
|
602
|
-
|
|
603
|
-
case REACT_SUSPENSE_LIST_TYPE:
|
|
604
|
-
return 'SuspenseList';
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
if (typeof type === 'object') {
|
|
608
|
-
switch (type.$$typeof) {
|
|
609
|
-
case REACT_CONTEXT_TYPE:
|
|
610
|
-
var context = type;
|
|
611
|
-
return getContextName(context) + '.Consumer';
|
|
612
|
-
|
|
613
|
-
case REACT_PROVIDER_TYPE:
|
|
614
|
-
var provider = type;
|
|
615
|
-
return getContextName(provider._context) + '.Provider';
|
|
616
|
-
|
|
617
|
-
case REACT_FORWARD_REF_TYPE:
|
|
618
|
-
return getWrappedName(type, type.render, 'ForwardRef');
|
|
619
|
-
|
|
620
|
-
case REACT_MEMO_TYPE:
|
|
621
|
-
return getComponentName(type.type);
|
|
622
|
-
|
|
623
|
-
case REACT_BLOCK_TYPE:
|
|
624
|
-
return getComponentName(type._render);
|
|
625
|
-
|
|
626
|
-
case REACT_LAZY_TYPE:
|
|
627
|
-
{
|
|
628
|
-
var lazyComponent = type;
|
|
629
|
-
var payload = lazyComponent._payload;
|
|
630
|
-
var init = lazyComponent._init;
|
|
631
|
-
|
|
632
|
-
try {
|
|
633
|
-
return getComponentName(init(payload));
|
|
634
|
-
} catch (x) {
|
|
635
|
-
return null;
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
return null;
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
645
|
-
var RESERVED_PROPS = {
|
|
646
|
-
key: true,
|
|
647
|
-
ref: true,
|
|
648
|
-
__self: true,
|
|
649
|
-
__source: true
|
|
650
|
-
};
|
|
651
|
-
var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;
|
|
652
|
-
|
|
653
|
-
{
|
|
654
|
-
didWarnAboutStringRefs = {};
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
function hasValidRef(config) {
|
|
658
|
-
{
|
|
659
|
-
if (hasOwnProperty.call(config, 'ref')) {
|
|
660
|
-
var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;
|
|
661
|
-
|
|
662
|
-
if (getter && getter.isReactWarning) {
|
|
663
|
-
return false;
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
return config.ref !== undefined;
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
function hasValidKey(config) {
|
|
672
|
-
{
|
|
673
|
-
if (hasOwnProperty.call(config, 'key')) {
|
|
674
|
-
var getter = Object.getOwnPropertyDescriptor(config, 'key').get;
|
|
675
|
-
|
|
676
|
-
if (getter && getter.isReactWarning) {
|
|
677
|
-
return false;
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
return config.key !== undefined;
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
function defineKeyPropWarningGetter(props, displayName) {
|
|
686
|
-
var warnAboutAccessingKey = function () {
|
|
687
|
-
{
|
|
688
|
-
if (!specialPropKeyWarningShown) {
|
|
689
|
-
specialPropKeyWarningShown = true;
|
|
690
|
-
|
|
691
|
-
error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
};
|
|
695
|
-
|
|
696
|
-
warnAboutAccessingKey.isReactWarning = true;
|
|
697
|
-
Object.defineProperty(props, 'key', {
|
|
698
|
-
get: warnAboutAccessingKey,
|
|
699
|
-
configurable: true
|
|
700
|
-
});
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
function defineRefPropWarningGetter(props, displayName) {
|
|
704
|
-
var warnAboutAccessingRef = function () {
|
|
705
|
-
{
|
|
706
|
-
if (!specialPropRefWarningShown) {
|
|
707
|
-
specialPropRefWarningShown = true;
|
|
708
|
-
|
|
709
|
-
error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
};
|
|
713
|
-
|
|
714
|
-
warnAboutAccessingRef.isReactWarning = true;
|
|
715
|
-
Object.defineProperty(props, 'ref', {
|
|
716
|
-
get: warnAboutAccessingRef,
|
|
717
|
-
configurable: true
|
|
718
|
-
});
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
function warnIfStringRefCannotBeAutoConverted(config) {
|
|
722
|
-
{
|
|
723
|
-
if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {
|
|
724
|
-
var componentName = getComponentName(ReactCurrentOwner.current.type);
|
|
725
|
-
|
|
726
|
-
if (!didWarnAboutStringRefs[componentName]) {
|
|
727
|
-
error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref);
|
|
728
|
-
|
|
729
|
-
didWarnAboutStringRefs[componentName] = true;
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
/**
|
|
735
|
-
* Factory method to create a new React element. This no longer adheres to
|
|
736
|
-
* the class pattern, so do not use new to call it. Also, instanceof check
|
|
737
|
-
* will not work. Instead test $$typeof field against Symbol.for('react.element') to check
|
|
738
|
-
* if something is a React Element.
|
|
739
|
-
*
|
|
740
|
-
* @param {*} type
|
|
741
|
-
* @param {*} props
|
|
742
|
-
* @param {*} key
|
|
743
|
-
* @param {string|object} ref
|
|
744
|
-
* @param {*} owner
|
|
745
|
-
* @param {*} self A *temporary* helper to detect places where `this` is
|
|
746
|
-
* different from the `owner` when React.createElement is called, so that we
|
|
747
|
-
* can warn. We want to get rid of owner and replace string `ref`s with arrow
|
|
748
|
-
* functions, and as long as `this` and owner are the same, there will be no
|
|
749
|
-
* change in behavior.
|
|
750
|
-
* @param {*} source An annotation object (added by a transpiler or otherwise)
|
|
751
|
-
* indicating filename, line number, and/or other information.
|
|
752
|
-
* @internal
|
|
753
|
-
*/
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
var ReactElement = function (type, key, ref, self, source, owner, props) {
|
|
757
|
-
var element = {
|
|
758
|
-
// This tag allows us to uniquely identify this as a React Element
|
|
759
|
-
$$typeof: REACT_ELEMENT_TYPE,
|
|
760
|
-
// Built-in properties that belong on the element
|
|
761
|
-
type: type,
|
|
762
|
-
key: key,
|
|
763
|
-
ref: ref,
|
|
764
|
-
props: props,
|
|
765
|
-
// Record the component responsible for creating this element.
|
|
766
|
-
_owner: owner
|
|
767
|
-
};
|
|
768
|
-
|
|
769
|
-
{
|
|
770
|
-
// The validation flag is currently mutative. We put it on
|
|
771
|
-
// an external backing store so that we can freeze the whole object.
|
|
772
|
-
// This can be replaced with a WeakMap once they are implemented in
|
|
773
|
-
// commonly used development environments.
|
|
774
|
-
element._store = {}; // To make comparing ReactElements easier for testing purposes, we make
|
|
775
|
-
// the validation flag non-enumerable (where possible, which should
|
|
776
|
-
// include every environment we run tests in), so the test framework
|
|
777
|
-
// ignores it.
|
|
778
|
-
|
|
779
|
-
Object.defineProperty(element._store, 'validated', {
|
|
780
|
-
configurable: false,
|
|
781
|
-
enumerable: false,
|
|
782
|
-
writable: true,
|
|
783
|
-
value: false
|
|
784
|
-
}); // self and source are DEV only properties.
|
|
785
|
-
|
|
786
|
-
Object.defineProperty(element, '_self', {
|
|
787
|
-
configurable: false,
|
|
788
|
-
enumerable: false,
|
|
789
|
-
writable: false,
|
|
790
|
-
value: self
|
|
791
|
-
}); // Two elements created in two different places should be considered
|
|
792
|
-
// equal for testing purposes and therefore we hide it from enumeration.
|
|
793
|
-
|
|
794
|
-
Object.defineProperty(element, '_source', {
|
|
795
|
-
configurable: false,
|
|
796
|
-
enumerable: false,
|
|
797
|
-
writable: false,
|
|
798
|
-
value: source
|
|
799
|
-
});
|
|
800
|
-
|
|
801
|
-
if (Object.freeze) {
|
|
802
|
-
Object.freeze(element.props);
|
|
803
|
-
Object.freeze(element);
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
return element;
|
|
808
|
-
};
|
|
809
|
-
/**
|
|
810
|
-
* Create and return a new ReactElement of the given type.
|
|
811
|
-
* See https://reactjs.org/docs/react-api.html#createelement
|
|
812
|
-
*/
|
|
813
|
-
|
|
814
|
-
function createElement(type, config, children) {
|
|
815
|
-
var propName; // Reserved names are extracted
|
|
816
|
-
|
|
817
|
-
var props = {};
|
|
818
|
-
var key = null;
|
|
819
|
-
var ref = null;
|
|
820
|
-
var self = null;
|
|
821
|
-
var source = null;
|
|
822
|
-
|
|
823
|
-
if (config != null) {
|
|
824
|
-
if (hasValidRef(config)) {
|
|
825
|
-
ref = config.ref;
|
|
826
|
-
|
|
827
|
-
{
|
|
828
|
-
warnIfStringRefCannotBeAutoConverted(config);
|
|
829
|
-
}
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
if (hasValidKey(config)) {
|
|
833
|
-
key = '' + config.key;
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
self = config.__self === undefined ? null : config.__self;
|
|
837
|
-
source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object
|
|
838
|
-
|
|
839
|
-
for (propName in config) {
|
|
840
|
-
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
|
841
|
-
props[propName] = config[propName];
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
} // Children can be more than one argument, and those are transferred onto
|
|
845
|
-
// the newly allocated props object.
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
var childrenLength = arguments.length - 2;
|
|
849
|
-
|
|
850
|
-
if (childrenLength === 1) {
|
|
851
|
-
props.children = children;
|
|
852
|
-
} else if (childrenLength > 1) {
|
|
853
|
-
var childArray = Array(childrenLength);
|
|
854
|
-
|
|
855
|
-
for (var i = 0; i < childrenLength; i++) {
|
|
856
|
-
childArray[i] = arguments[i + 2];
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
{
|
|
860
|
-
if (Object.freeze) {
|
|
861
|
-
Object.freeze(childArray);
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
props.children = childArray;
|
|
866
|
-
} // Resolve default props
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
if (type && type.defaultProps) {
|
|
870
|
-
var defaultProps = type.defaultProps;
|
|
871
|
-
|
|
872
|
-
for (propName in defaultProps) {
|
|
873
|
-
if (props[propName] === undefined) {
|
|
874
|
-
props[propName] = defaultProps[propName];
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
{
|
|
880
|
-
if (key || ref) {
|
|
881
|
-
var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;
|
|
882
|
-
|
|
883
|
-
if (key) {
|
|
884
|
-
defineKeyPropWarningGetter(props, displayName);
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
if (ref) {
|
|
888
|
-
defineRefPropWarningGetter(props, displayName);
|
|
889
|
-
}
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
|
|
894
|
-
}
|
|
895
|
-
function cloneAndReplaceKey(oldElement, newKey) {
|
|
896
|
-
var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
|
|
897
|
-
return newElement;
|
|
898
|
-
}
|
|
899
|
-
/**
|
|
900
|
-
* Clone and return a new ReactElement using element as the starting point.
|
|
901
|
-
* See https://reactjs.org/docs/react-api.html#cloneelement
|
|
902
|
-
*/
|
|
903
|
-
|
|
904
|
-
function cloneElement(element, config, children) {
|
|
905
|
-
if (!!(element === null || element === undefined)) {
|
|
906
|
-
{
|
|
907
|
-
throw Error( "React.cloneElement(...): The argument must be a React element, but you passed " + element + "." );
|
|
908
|
-
}
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
var propName; // Original props are copied
|
|
912
|
-
|
|
913
|
-
var props = _assign({}, element.props); // Reserved names are extracted
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
var key = element.key;
|
|
917
|
-
var ref = element.ref; // Self is preserved since the owner is preserved.
|
|
918
|
-
|
|
919
|
-
var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a
|
|
920
|
-
// transpiler, and the original source is probably a better indicator of the
|
|
921
|
-
// true owner.
|
|
922
|
-
|
|
923
|
-
var source = element._source; // Owner will be preserved, unless ref is overridden
|
|
924
|
-
|
|
925
|
-
var owner = element._owner;
|
|
926
|
-
|
|
927
|
-
if (config != null) {
|
|
928
|
-
if (hasValidRef(config)) {
|
|
929
|
-
// Silently steal the ref from the parent.
|
|
930
|
-
ref = config.ref;
|
|
931
|
-
owner = ReactCurrentOwner.current;
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
if (hasValidKey(config)) {
|
|
935
|
-
key = '' + config.key;
|
|
936
|
-
} // Remaining properties override existing props
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
var defaultProps;
|
|
940
|
-
|
|
941
|
-
if (element.type && element.type.defaultProps) {
|
|
942
|
-
defaultProps = element.type.defaultProps;
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
for (propName in config) {
|
|
946
|
-
if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
|
|
947
|
-
if (config[propName] === undefined && defaultProps !== undefined) {
|
|
948
|
-
// Resolve default props
|
|
949
|
-
props[propName] = defaultProps[propName];
|
|
950
|
-
} else {
|
|
951
|
-
props[propName] = config[propName];
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
}
|
|
955
|
-
} // Children can be more than one argument, and those are transferred onto
|
|
956
|
-
// the newly allocated props object.
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
var childrenLength = arguments.length - 2;
|
|
960
|
-
|
|
961
|
-
if (childrenLength === 1) {
|
|
962
|
-
props.children = children;
|
|
963
|
-
} else if (childrenLength > 1) {
|
|
964
|
-
var childArray = Array(childrenLength);
|
|
965
|
-
|
|
966
|
-
for (var i = 0; i < childrenLength; i++) {
|
|
967
|
-
childArray[i] = arguments[i + 2];
|
|
968
|
-
}
|
|
969
|
-
|
|
970
|
-
props.children = childArray;
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
return ReactElement(element.type, key, ref, self, source, owner, props);
|
|
974
|
-
}
|
|
975
|
-
/**
|
|
976
|
-
* Verifies the object is a ReactElement.
|
|
977
|
-
* See https://reactjs.org/docs/react-api.html#isvalidelement
|
|
978
|
-
* @param {?object} object
|
|
979
|
-
* @return {boolean} True if `object` is a ReactElement.
|
|
980
|
-
* @final
|
|
981
|
-
*/
|
|
982
|
-
|
|
983
|
-
function isValidElement(object) {
|
|
984
|
-
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
|
985
|
-
}
|
|
986
|
-
|
|
987
|
-
var SEPARATOR = '.';
|
|
988
|
-
var SUBSEPARATOR = ':';
|
|
989
|
-
/**
|
|
990
|
-
* Escape and wrap key so it is safe to use as a reactid
|
|
991
|
-
*
|
|
992
|
-
* @param {string} key to be escaped.
|
|
993
|
-
* @return {string} the escaped key.
|
|
994
|
-
*/
|
|
995
|
-
|
|
996
|
-
function escape(key) {
|
|
997
|
-
var escapeRegex = /[=:]/g;
|
|
998
|
-
var escaperLookup = {
|
|
999
|
-
'=': '=0',
|
|
1000
|
-
':': '=2'
|
|
1001
|
-
};
|
|
1002
|
-
var escapedString = key.replace(escapeRegex, function (match) {
|
|
1003
|
-
return escaperLookup[match];
|
|
1004
|
-
});
|
|
1005
|
-
return '$' + escapedString;
|
|
1006
|
-
}
|
|
1007
|
-
/**
|
|
1008
|
-
* TODO: Test that a single child and an array with one item have the same key
|
|
1009
|
-
* pattern.
|
|
1010
|
-
*/
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
var didWarnAboutMaps = false;
|
|
1014
|
-
var userProvidedKeyEscapeRegex = /\/+/g;
|
|
1015
|
-
|
|
1016
|
-
function escapeUserProvidedKey(text) {
|
|
1017
|
-
return text.replace(userProvidedKeyEscapeRegex, '$&/');
|
|
1018
|
-
}
|
|
1019
|
-
/**
|
|
1020
|
-
* Generate a key string that identifies a element within a set.
|
|
1021
|
-
*
|
|
1022
|
-
* @param {*} element A element that could contain a manual key.
|
|
1023
|
-
* @param {number} index Index that is used if a manual key is not provided.
|
|
1024
|
-
* @return {string}
|
|
1025
|
-
*/
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
function getElementKey(element, index) {
|
|
1029
|
-
// Do some typechecking here since we call this blindly. We want to ensure
|
|
1030
|
-
// that we don't block potential future ES APIs.
|
|
1031
|
-
if (typeof element === 'object' && element !== null && element.key != null) {
|
|
1032
|
-
// Explicit key
|
|
1033
|
-
return escape('' + element.key);
|
|
1034
|
-
} // Implicit key determined by the index in the set
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
return index.toString(36);
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {
|
|
1041
|
-
var type = typeof children;
|
|
1042
|
-
|
|
1043
|
-
if (type === 'undefined' || type === 'boolean') {
|
|
1044
|
-
// All of the above are perceived as null.
|
|
1045
|
-
children = null;
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
var invokeCallback = false;
|
|
1049
|
-
|
|
1050
|
-
if (children === null) {
|
|
1051
|
-
invokeCallback = true;
|
|
1052
|
-
} else {
|
|
1053
|
-
switch (type) {
|
|
1054
|
-
case 'string':
|
|
1055
|
-
case 'number':
|
|
1056
|
-
invokeCallback = true;
|
|
1057
|
-
break;
|
|
1058
|
-
|
|
1059
|
-
case 'object':
|
|
1060
|
-
switch (children.$$typeof) {
|
|
1061
|
-
case REACT_ELEMENT_TYPE:
|
|
1062
|
-
case REACT_PORTAL_TYPE:
|
|
1063
|
-
invokeCallback = true;
|
|
1064
|
-
}
|
|
1065
|
-
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
|
|
1069
|
-
if (invokeCallback) {
|
|
1070
|
-
var _child = children;
|
|
1071
|
-
var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array
|
|
1072
|
-
// so that it's consistent if the number of children grows:
|
|
1073
|
-
|
|
1074
|
-
var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar;
|
|
1075
|
-
|
|
1076
|
-
if (Array.isArray(mappedChild)) {
|
|
1077
|
-
var escapedChildKey = '';
|
|
1078
|
-
|
|
1079
|
-
if (childKey != null) {
|
|
1080
|
-
escapedChildKey = escapeUserProvidedKey(childKey) + '/';
|
|
1081
|
-
}
|
|
1082
|
-
|
|
1083
|
-
mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) {
|
|
1084
|
-
return c;
|
|
1085
|
-
});
|
|
1086
|
-
} else if (mappedChild != null) {
|
|
1087
|
-
if (isValidElement(mappedChild)) {
|
|
1088
|
-
mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as
|
|
1089
|
-
// traverseAllChildren used to do for objects as children
|
|
1090
|
-
escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key
|
|
1091
|
-
mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number
|
|
1092
|
-
escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey);
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
array.push(mappedChild);
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
|
-
return 1;
|
|
1099
|
-
}
|
|
1100
|
-
|
|
1101
|
-
var child;
|
|
1102
|
-
var nextName;
|
|
1103
|
-
var subtreeCount = 0; // Count of children found in the current subtree.
|
|
1104
|
-
|
|
1105
|
-
var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
|
|
1106
|
-
|
|
1107
|
-
if (Array.isArray(children)) {
|
|
1108
|
-
for (var i = 0; i < children.length; i++) {
|
|
1109
|
-
child = children[i];
|
|
1110
|
-
nextName = nextNamePrefix + getElementKey(child, i);
|
|
1111
|
-
subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);
|
|
1112
|
-
}
|
|
1113
|
-
} else {
|
|
1114
|
-
var iteratorFn = getIteratorFn(children);
|
|
1115
|
-
|
|
1116
|
-
if (typeof iteratorFn === 'function') {
|
|
1117
|
-
var iterableChildren = children;
|
|
1118
|
-
|
|
1119
|
-
{
|
|
1120
|
-
// Warn about using Maps as children
|
|
1121
|
-
if (iteratorFn === iterableChildren.entries) {
|
|
1122
|
-
if (!didWarnAboutMaps) {
|
|
1123
|
-
warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.');
|
|
1124
|
-
}
|
|
1125
|
-
|
|
1126
|
-
didWarnAboutMaps = true;
|
|
1127
|
-
}
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
var iterator = iteratorFn.call(iterableChildren);
|
|
1131
|
-
var step;
|
|
1132
|
-
var ii = 0;
|
|
1133
|
-
|
|
1134
|
-
while (!(step = iterator.next()).done) {
|
|
1135
|
-
child = step.value;
|
|
1136
|
-
nextName = nextNamePrefix + getElementKey(child, ii++);
|
|
1137
|
-
subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback);
|
|
1138
|
-
}
|
|
1139
|
-
} else if (type === 'object') {
|
|
1140
|
-
var childrenString = '' + children;
|
|
1141
|
-
|
|
1142
|
-
{
|
|
1143
|
-
{
|
|
1144
|
-
throw Error( "Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). If you meant to render a collection of children, use an array instead." );
|
|
1145
|
-
}
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
return subtreeCount;
|
|
1151
|
-
}
|
|
1152
|
-
|
|
1153
|
-
/**
|
|
1154
|
-
* Maps children that are typically specified as `props.children`.
|
|
1155
|
-
*
|
|
1156
|
-
* See https://reactjs.org/docs/react-api.html#reactchildrenmap
|
|
1157
|
-
*
|
|
1158
|
-
* The provided mapFunction(child, index) will be called for each
|
|
1159
|
-
* leaf child.
|
|
1160
|
-
*
|
|
1161
|
-
* @param {?*} children Children tree container.
|
|
1162
|
-
* @param {function(*, int)} func The map function.
|
|
1163
|
-
* @param {*} context Context for mapFunction.
|
|
1164
|
-
* @return {object} Object containing the ordered map of results.
|
|
1165
|
-
*/
|
|
1166
|
-
function mapChildren(children, func, context) {
|
|
1167
|
-
if (children == null) {
|
|
1168
|
-
return children;
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
var result = [];
|
|
1172
|
-
var count = 0;
|
|
1173
|
-
mapIntoArray(children, result, '', '', function (child) {
|
|
1174
|
-
return func.call(context, child, count++);
|
|
1175
|
-
});
|
|
1176
|
-
return result;
|
|
1177
|
-
}
|
|
1178
|
-
/**
|
|
1179
|
-
* Count the number of children that are typically specified as
|
|
1180
|
-
* `props.children`.
|
|
1181
|
-
*
|
|
1182
|
-
* See https://reactjs.org/docs/react-api.html#reactchildrencount
|
|
1183
|
-
*
|
|
1184
|
-
* @param {?*} children Children tree container.
|
|
1185
|
-
* @return {number} The number of children.
|
|
1186
|
-
*/
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
function countChildren(children) {
|
|
1190
|
-
var n = 0;
|
|
1191
|
-
mapChildren(children, function () {
|
|
1192
|
-
n++; // Don't return anything
|
|
1193
|
-
});
|
|
1194
|
-
return n;
|
|
1195
|
-
}
|
|
1196
|
-
|
|
1197
|
-
/**
|
|
1198
|
-
* Iterates through children that are typically specified as `props.children`.
|
|
1199
|
-
*
|
|
1200
|
-
* See https://reactjs.org/docs/react-api.html#reactchildrenforeach
|
|
1201
|
-
*
|
|
1202
|
-
* The provided forEachFunc(child, index) will be called for each
|
|
1203
|
-
* leaf child.
|
|
1204
|
-
*
|
|
1205
|
-
* @param {?*} children Children tree container.
|
|
1206
|
-
* @param {function(*, int)} forEachFunc
|
|
1207
|
-
* @param {*} forEachContext Context for forEachContext.
|
|
1208
|
-
*/
|
|
1209
|
-
function forEachChildren(children, forEachFunc, forEachContext) {
|
|
1210
|
-
mapChildren(children, function () {
|
|
1211
|
-
forEachFunc.apply(this, arguments); // Don't return anything.
|
|
1212
|
-
}, forEachContext);
|
|
1213
|
-
}
|
|
1214
|
-
/**
|
|
1215
|
-
* Flatten a children object (typically specified as `props.children`) and
|
|
1216
|
-
* return an array with appropriately re-keyed children.
|
|
1217
|
-
*
|
|
1218
|
-
* See https://reactjs.org/docs/react-api.html#reactchildrentoarray
|
|
1219
|
-
*/
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
function toArray(children) {
|
|
1223
|
-
return mapChildren(children, function (child) {
|
|
1224
|
-
return child;
|
|
1225
|
-
}) || [];
|
|
1226
|
-
}
|
|
1227
|
-
/**
|
|
1228
|
-
* Returns the first child in a collection of children and verifies that there
|
|
1229
|
-
* is only one child in the collection.
|
|
1230
|
-
*
|
|
1231
|
-
* See https://reactjs.org/docs/react-api.html#reactchildrenonly
|
|
1232
|
-
*
|
|
1233
|
-
* The current implementation of this function assumes that a single child gets
|
|
1234
|
-
* passed without a wrapper, but the purpose of this helper function is to
|
|
1235
|
-
* abstract away the particular structure of children.
|
|
1236
|
-
*
|
|
1237
|
-
* @param {?object} children Child collection structure.
|
|
1238
|
-
* @return {ReactElement} The first and only `ReactElement` contained in the
|
|
1239
|
-
* structure.
|
|
1240
|
-
*/
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
function onlyChild(children) {
|
|
1244
|
-
if (!isValidElement(children)) {
|
|
1245
|
-
{
|
|
1246
|
-
throw Error( "React.Children.only expected to receive a single React element child." );
|
|
1247
|
-
}
|
|
1248
|
-
}
|
|
1249
|
-
|
|
1250
|
-
return children;
|
|
1251
|
-
}
|
|
1252
|
-
|
|
1253
|
-
function createContext(defaultValue, calculateChangedBits) {
|
|
1254
|
-
if (calculateChangedBits === undefined) {
|
|
1255
|
-
calculateChangedBits = null;
|
|
1256
|
-
} else {
|
|
1257
|
-
{
|
|
1258
|
-
if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') {
|
|
1259
|
-
error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits);
|
|
1260
|
-
}
|
|
1261
|
-
}
|
|
1262
|
-
}
|
|
1263
|
-
|
|
1264
|
-
var context = {
|
|
1265
|
-
$$typeof: REACT_CONTEXT_TYPE,
|
|
1266
|
-
_calculateChangedBits: calculateChangedBits,
|
|
1267
|
-
// As a workaround to support multiple concurrent renderers, we categorize
|
|
1268
|
-
// some renderers as primary and others as secondary. We only expect
|
|
1269
|
-
// there to be two concurrent renderers at most: React Native (primary) and
|
|
1270
|
-
// Fabric (secondary); React DOM (primary) and React ART (secondary).
|
|
1271
|
-
// Secondary renderers store their context values on separate fields.
|
|
1272
|
-
_currentValue: defaultValue,
|
|
1273
|
-
_currentValue2: defaultValue,
|
|
1274
|
-
// Used to track how many concurrent renderers this context currently
|
|
1275
|
-
// supports within in a single renderer. Such as parallel server rendering.
|
|
1276
|
-
_threadCount: 0,
|
|
1277
|
-
// These are circular
|
|
1278
|
-
Provider: null,
|
|
1279
|
-
Consumer: null
|
|
1280
|
-
};
|
|
1281
|
-
context.Provider = {
|
|
1282
|
-
$$typeof: REACT_PROVIDER_TYPE,
|
|
1283
|
-
_context: context
|
|
1284
|
-
};
|
|
1285
|
-
var hasWarnedAboutUsingNestedContextConsumers = false;
|
|
1286
|
-
var hasWarnedAboutUsingConsumerProvider = false;
|
|
1287
|
-
var hasWarnedAboutDisplayNameOnConsumer = false;
|
|
1288
|
-
|
|
1289
|
-
{
|
|
1290
|
-
// A separate object, but proxies back to the original context object for
|
|
1291
|
-
// backwards compatibility. It has a different $$typeof, so we can properly
|
|
1292
|
-
// warn for the incorrect usage of Context as a Consumer.
|
|
1293
|
-
var Consumer = {
|
|
1294
|
-
$$typeof: REACT_CONTEXT_TYPE,
|
|
1295
|
-
_context: context,
|
|
1296
|
-
_calculateChangedBits: context._calculateChangedBits
|
|
1297
|
-
}; // $FlowFixMe: Flow complains about not setting a value, which is intentional here
|
|
1298
|
-
|
|
1299
|
-
Object.defineProperties(Consumer, {
|
|
1300
|
-
Provider: {
|
|
1301
|
-
get: function () {
|
|
1302
|
-
if (!hasWarnedAboutUsingConsumerProvider) {
|
|
1303
|
-
hasWarnedAboutUsingConsumerProvider = true;
|
|
1304
|
-
|
|
1305
|
-
error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');
|
|
1306
|
-
}
|
|
1307
|
-
|
|
1308
|
-
return context.Provider;
|
|
1309
|
-
},
|
|
1310
|
-
set: function (_Provider) {
|
|
1311
|
-
context.Provider = _Provider;
|
|
1312
|
-
}
|
|
1313
|
-
},
|
|
1314
|
-
_currentValue: {
|
|
1315
|
-
get: function () {
|
|
1316
|
-
return context._currentValue;
|
|
1317
|
-
},
|
|
1318
|
-
set: function (_currentValue) {
|
|
1319
|
-
context._currentValue = _currentValue;
|
|
1320
|
-
}
|
|
1321
|
-
},
|
|
1322
|
-
_currentValue2: {
|
|
1323
|
-
get: function () {
|
|
1324
|
-
return context._currentValue2;
|
|
1325
|
-
},
|
|
1326
|
-
set: function (_currentValue2) {
|
|
1327
|
-
context._currentValue2 = _currentValue2;
|
|
1328
|
-
}
|
|
1329
|
-
},
|
|
1330
|
-
_threadCount: {
|
|
1331
|
-
get: function () {
|
|
1332
|
-
return context._threadCount;
|
|
1333
|
-
},
|
|
1334
|
-
set: function (_threadCount) {
|
|
1335
|
-
context._threadCount = _threadCount;
|
|
1336
|
-
}
|
|
1337
|
-
},
|
|
1338
|
-
Consumer: {
|
|
1339
|
-
get: function () {
|
|
1340
|
-
if (!hasWarnedAboutUsingNestedContextConsumers) {
|
|
1341
|
-
hasWarnedAboutUsingNestedContextConsumers = true;
|
|
1342
|
-
|
|
1343
|
-
error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
|
|
1344
|
-
}
|
|
1345
|
-
|
|
1346
|
-
return context.Consumer;
|
|
1347
|
-
}
|
|
1348
|
-
},
|
|
1349
|
-
displayName: {
|
|
1350
|
-
get: function () {
|
|
1351
|
-
return context.displayName;
|
|
1352
|
-
},
|
|
1353
|
-
set: function (displayName) {
|
|
1354
|
-
if (!hasWarnedAboutDisplayNameOnConsumer) {
|
|
1355
|
-
warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName);
|
|
1356
|
-
|
|
1357
|
-
hasWarnedAboutDisplayNameOnConsumer = true;
|
|
1358
|
-
}
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
}); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty
|
|
1362
|
-
|
|
1363
|
-
context.Consumer = Consumer;
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
{
|
|
1367
|
-
context._currentRenderer = null;
|
|
1368
|
-
context._currentRenderer2 = null;
|
|
1369
|
-
}
|
|
1370
|
-
|
|
1371
|
-
return context;
|
|
1372
|
-
}
|
|
1373
|
-
|
|
1374
|
-
var Uninitialized = -1;
|
|
1375
|
-
var Pending = 0;
|
|
1376
|
-
var Resolved = 1;
|
|
1377
|
-
var Rejected = 2;
|
|
1378
|
-
|
|
1379
|
-
function lazyInitializer(payload) {
|
|
1380
|
-
if (payload._status === Uninitialized) {
|
|
1381
|
-
var ctor = payload._result;
|
|
1382
|
-
var thenable = ctor(); // Transition to the next state.
|
|
1383
|
-
|
|
1384
|
-
var pending = payload;
|
|
1385
|
-
pending._status = Pending;
|
|
1386
|
-
pending._result = thenable;
|
|
1387
|
-
thenable.then(function (moduleObject) {
|
|
1388
|
-
if (payload._status === Pending) {
|
|
1389
|
-
var defaultExport = moduleObject.default;
|
|
1390
|
-
|
|
1391
|
-
{
|
|
1392
|
-
if (defaultExport === undefined) {
|
|
1393
|
-
error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies.
|
|
1394
|
-
'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject);
|
|
1395
|
-
}
|
|
1396
|
-
} // Transition to the next state.
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
var resolved = payload;
|
|
1400
|
-
resolved._status = Resolved;
|
|
1401
|
-
resolved._result = defaultExport;
|
|
1402
|
-
}
|
|
1403
|
-
}, function (error) {
|
|
1404
|
-
if (payload._status === Pending) {
|
|
1405
|
-
// Transition to the next state.
|
|
1406
|
-
var rejected = payload;
|
|
1407
|
-
rejected._status = Rejected;
|
|
1408
|
-
rejected._result = error;
|
|
1409
|
-
}
|
|
1410
|
-
});
|
|
1411
|
-
}
|
|
1412
|
-
|
|
1413
|
-
if (payload._status === Resolved) {
|
|
1414
|
-
return payload._result;
|
|
1415
|
-
} else {
|
|
1416
|
-
throw payload._result;
|
|
1417
|
-
}
|
|
1418
|
-
}
|
|
1419
|
-
|
|
1420
|
-
function lazy(ctor) {
|
|
1421
|
-
var payload = {
|
|
1422
|
-
// We use these fields to store the result.
|
|
1423
|
-
_status: -1,
|
|
1424
|
-
_result: ctor
|
|
1425
|
-
};
|
|
1426
|
-
var lazyType = {
|
|
1427
|
-
$$typeof: REACT_LAZY_TYPE,
|
|
1428
|
-
_payload: payload,
|
|
1429
|
-
_init: lazyInitializer
|
|
1430
|
-
};
|
|
1431
|
-
|
|
1432
|
-
{
|
|
1433
|
-
// In production, this would just set it on the object.
|
|
1434
|
-
var defaultProps;
|
|
1435
|
-
var propTypes; // $FlowFixMe
|
|
1436
|
-
|
|
1437
|
-
Object.defineProperties(lazyType, {
|
|
1438
|
-
defaultProps: {
|
|
1439
|
-
configurable: true,
|
|
1440
|
-
get: function () {
|
|
1441
|
-
return defaultProps;
|
|
1442
|
-
},
|
|
1443
|
-
set: function (newDefaultProps) {
|
|
1444
|
-
error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');
|
|
1445
|
-
|
|
1446
|
-
defaultProps = newDefaultProps; // Match production behavior more closely:
|
|
1447
|
-
// $FlowFixMe
|
|
1448
|
-
|
|
1449
|
-
Object.defineProperty(lazyType, 'defaultProps', {
|
|
1450
|
-
enumerable: true
|
|
1451
|
-
});
|
|
1452
|
-
}
|
|
1453
|
-
},
|
|
1454
|
-
propTypes: {
|
|
1455
|
-
configurable: true,
|
|
1456
|
-
get: function () {
|
|
1457
|
-
return propTypes;
|
|
1458
|
-
},
|
|
1459
|
-
set: function (newPropTypes) {
|
|
1460
|
-
error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');
|
|
1461
|
-
|
|
1462
|
-
propTypes = newPropTypes; // Match production behavior more closely:
|
|
1463
|
-
// $FlowFixMe
|
|
1464
|
-
|
|
1465
|
-
Object.defineProperty(lazyType, 'propTypes', {
|
|
1466
|
-
enumerable: true
|
|
1467
|
-
});
|
|
1468
|
-
}
|
|
1469
|
-
}
|
|
1470
|
-
});
|
|
1471
|
-
}
|
|
1472
|
-
|
|
1473
|
-
return lazyType;
|
|
1474
|
-
}
|
|
1475
|
-
|
|
1476
|
-
function forwardRef(render) {
|
|
1477
|
-
{
|
|
1478
|
-
if (render != null && render.$$typeof === REACT_MEMO_TYPE) {
|
|
1479
|
-
error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');
|
|
1480
|
-
} else if (typeof render !== 'function') {
|
|
1481
|
-
error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);
|
|
1482
|
-
} else {
|
|
1483
|
-
if (render.length !== 0 && render.length !== 2) {
|
|
1484
|
-
error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');
|
|
1485
|
-
}
|
|
1486
|
-
}
|
|
1487
|
-
|
|
1488
|
-
if (render != null) {
|
|
1489
|
-
if (render.defaultProps != null || render.propTypes != null) {
|
|
1490
|
-
error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');
|
|
1491
|
-
}
|
|
1492
|
-
}
|
|
1493
|
-
}
|
|
1494
|
-
|
|
1495
|
-
var elementType = {
|
|
1496
|
-
$$typeof: REACT_FORWARD_REF_TYPE,
|
|
1497
|
-
render: render
|
|
1498
|
-
};
|
|
1499
|
-
|
|
1500
|
-
{
|
|
1501
|
-
var ownName;
|
|
1502
|
-
Object.defineProperty(elementType, 'displayName', {
|
|
1503
|
-
enumerable: false,
|
|
1504
|
-
configurable: true,
|
|
1505
|
-
get: function () {
|
|
1506
|
-
return ownName;
|
|
1507
|
-
},
|
|
1508
|
-
set: function (name) {
|
|
1509
|
-
ownName = name;
|
|
1510
|
-
|
|
1511
|
-
if (render.displayName == null) {
|
|
1512
|
-
render.displayName = name;
|
|
1513
|
-
}
|
|
1514
|
-
}
|
|
1515
|
-
});
|
|
1516
|
-
}
|
|
1517
|
-
|
|
1518
|
-
return elementType;
|
|
1519
|
-
}
|
|
1520
|
-
|
|
1521
|
-
// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.
|
|
1522
|
-
|
|
1523
|
-
var enableScopeAPI = false; // Experimental Create Event Handle API.
|
|
1524
|
-
|
|
1525
|
-
function isValidElementType(type) {
|
|
1526
|
-
if (typeof type === 'string' || typeof type === 'function') {
|
|
1527
|
-
return true;
|
|
1528
|
-
} // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
if (type === exports.Fragment || type === exports.Profiler || type === REACT_DEBUG_TRACING_MODE_TYPE || type === exports.StrictMode || type === exports.Suspense || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {
|
|
1532
|
-
return true;
|
|
1533
|
-
}
|
|
1534
|
-
|
|
1535
|
-
if (typeof type === 'object' && type !== null) {
|
|
1536
|
-
if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {
|
|
1537
|
-
return true;
|
|
1538
|
-
}
|
|
1539
|
-
}
|
|
1540
|
-
|
|
1541
|
-
return false;
|
|
1542
|
-
}
|
|
1543
|
-
|
|
1544
|
-
function memo(type, compare) {
|
|
1545
|
-
{
|
|
1546
|
-
if (!isValidElementType(type)) {
|
|
1547
|
-
error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);
|
|
1548
|
-
}
|
|
1549
|
-
}
|
|
1550
|
-
|
|
1551
|
-
var elementType = {
|
|
1552
|
-
$$typeof: REACT_MEMO_TYPE,
|
|
1553
|
-
type: type,
|
|
1554
|
-
compare: compare === undefined ? null : compare
|
|
1555
|
-
};
|
|
1556
|
-
|
|
1557
|
-
{
|
|
1558
|
-
var ownName;
|
|
1559
|
-
Object.defineProperty(elementType, 'displayName', {
|
|
1560
|
-
enumerable: false,
|
|
1561
|
-
configurable: true,
|
|
1562
|
-
get: function () {
|
|
1563
|
-
return ownName;
|
|
1564
|
-
},
|
|
1565
|
-
set: function (name) {
|
|
1566
|
-
ownName = name;
|
|
1567
|
-
|
|
1568
|
-
if (type.displayName == null) {
|
|
1569
|
-
type.displayName = name;
|
|
1570
|
-
}
|
|
1571
|
-
}
|
|
1572
|
-
});
|
|
1573
|
-
}
|
|
1574
|
-
|
|
1575
|
-
return elementType;
|
|
1576
|
-
}
|
|
1577
|
-
|
|
1578
|
-
function resolveDispatcher() {
|
|
1579
|
-
var dispatcher = ReactCurrentDispatcher.current;
|
|
1580
|
-
|
|
1581
|
-
if (!(dispatcher !== null)) {
|
|
1582
|
-
{
|
|
1583
|
-
throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." );
|
|
1584
|
-
}
|
|
1585
|
-
}
|
|
1586
|
-
|
|
1587
|
-
return dispatcher;
|
|
1588
|
-
}
|
|
1589
|
-
|
|
1590
|
-
function useContext(Context, unstable_observedBits) {
|
|
1591
|
-
var dispatcher = resolveDispatcher();
|
|
1592
|
-
|
|
1593
|
-
{
|
|
1594
|
-
if (unstable_observedBits !== undefined) {
|
|
1595
|
-
error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://reactjs.org/link/rules-of-hooks' : '');
|
|
1596
|
-
} // TODO: add a more generic warning for invalid values.
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
if (Context._context !== undefined) {
|
|
1600
|
-
var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs
|
|
1601
|
-
// and nobody should be using this in existing code.
|
|
1602
|
-
|
|
1603
|
-
if (realContext.Consumer === Context) {
|
|
1604
|
-
error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');
|
|
1605
|
-
} else if (realContext.Provider === Context) {
|
|
1606
|
-
error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');
|
|
1607
|
-
}
|
|
1608
|
-
}
|
|
1609
|
-
}
|
|
1610
|
-
|
|
1611
|
-
return dispatcher.useContext(Context, unstable_observedBits);
|
|
1612
|
-
}
|
|
1613
|
-
function useState(initialState) {
|
|
1614
|
-
var dispatcher = resolveDispatcher();
|
|
1615
|
-
return dispatcher.useState(initialState);
|
|
1616
|
-
}
|
|
1617
|
-
function useReducer(reducer, initialArg, init) {
|
|
1618
|
-
var dispatcher = resolveDispatcher();
|
|
1619
|
-
return dispatcher.useReducer(reducer, initialArg, init);
|
|
1620
|
-
}
|
|
1621
|
-
function useRef(initialValue) {
|
|
1622
|
-
var dispatcher = resolveDispatcher();
|
|
1623
|
-
return dispatcher.useRef(initialValue);
|
|
1624
|
-
}
|
|
1625
|
-
function useEffect(create, deps) {
|
|
1626
|
-
var dispatcher = resolveDispatcher();
|
|
1627
|
-
return dispatcher.useEffect(create, deps);
|
|
1628
|
-
}
|
|
1629
|
-
function useLayoutEffect(create, deps) {
|
|
1630
|
-
var dispatcher = resolveDispatcher();
|
|
1631
|
-
return dispatcher.useLayoutEffect(create, deps);
|
|
1632
|
-
}
|
|
1633
|
-
function useCallback(callback, deps) {
|
|
1634
|
-
var dispatcher = resolveDispatcher();
|
|
1635
|
-
return dispatcher.useCallback(callback, deps);
|
|
1636
|
-
}
|
|
1637
|
-
function useMemo(create, deps) {
|
|
1638
|
-
var dispatcher = resolveDispatcher();
|
|
1639
|
-
return dispatcher.useMemo(create, deps);
|
|
1640
|
-
}
|
|
1641
|
-
function useImperativeHandle(ref, create, deps) {
|
|
1642
|
-
var dispatcher = resolveDispatcher();
|
|
1643
|
-
return dispatcher.useImperativeHandle(ref, create, deps);
|
|
1644
|
-
}
|
|
1645
|
-
function useDebugValue(value, formatterFn) {
|
|
1646
|
-
{
|
|
1647
|
-
var dispatcher = resolveDispatcher();
|
|
1648
|
-
return dispatcher.useDebugValue(value, formatterFn);
|
|
1649
|
-
}
|
|
1650
|
-
}
|
|
1651
|
-
|
|
1652
|
-
// Helpers to patch console.logs to avoid logging during side-effect free
|
|
1653
|
-
// replaying on render function. This currently only patches the object
|
|
1654
|
-
// lazily which won't cover if the log function was extracted eagerly.
|
|
1655
|
-
// We could also eagerly patch the method.
|
|
1656
|
-
var disabledDepth = 0;
|
|
1657
|
-
var prevLog;
|
|
1658
|
-
var prevInfo;
|
|
1659
|
-
var prevWarn;
|
|
1660
|
-
var prevError;
|
|
1661
|
-
var prevGroup;
|
|
1662
|
-
var prevGroupCollapsed;
|
|
1663
|
-
var prevGroupEnd;
|
|
1664
|
-
|
|
1665
|
-
function disabledLog() {}
|
|
1666
|
-
|
|
1667
|
-
disabledLog.__reactDisabledLog = true;
|
|
1668
|
-
function disableLogs() {
|
|
1669
|
-
{
|
|
1670
|
-
if (disabledDepth === 0) {
|
|
1671
|
-
/* eslint-disable react-internal/no-production-logging */
|
|
1672
|
-
prevLog = console.log;
|
|
1673
|
-
prevInfo = console.info;
|
|
1674
|
-
prevWarn = console.warn;
|
|
1675
|
-
prevError = console.error;
|
|
1676
|
-
prevGroup = console.group;
|
|
1677
|
-
prevGroupCollapsed = console.groupCollapsed;
|
|
1678
|
-
prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099
|
|
1679
|
-
|
|
1680
|
-
var props = {
|
|
1681
|
-
configurable: true,
|
|
1682
|
-
enumerable: true,
|
|
1683
|
-
value: disabledLog,
|
|
1684
|
-
writable: true
|
|
1685
|
-
}; // $FlowFixMe Flow thinks console is immutable.
|
|
1686
|
-
|
|
1687
|
-
Object.defineProperties(console, {
|
|
1688
|
-
info: props,
|
|
1689
|
-
log: props,
|
|
1690
|
-
warn: props,
|
|
1691
|
-
error: props,
|
|
1692
|
-
group: props,
|
|
1693
|
-
groupCollapsed: props,
|
|
1694
|
-
groupEnd: props
|
|
1695
|
-
});
|
|
1696
|
-
/* eslint-enable react-internal/no-production-logging */
|
|
1697
|
-
}
|
|
1698
|
-
|
|
1699
|
-
disabledDepth++;
|
|
1700
|
-
}
|
|
1701
|
-
}
|
|
1702
|
-
function reenableLogs() {
|
|
1703
|
-
{
|
|
1704
|
-
disabledDepth--;
|
|
1705
|
-
|
|
1706
|
-
if (disabledDepth === 0) {
|
|
1707
|
-
/* eslint-disable react-internal/no-production-logging */
|
|
1708
|
-
var props = {
|
|
1709
|
-
configurable: true,
|
|
1710
|
-
enumerable: true,
|
|
1711
|
-
writable: true
|
|
1712
|
-
}; // $FlowFixMe Flow thinks console is immutable.
|
|
1713
|
-
|
|
1714
|
-
Object.defineProperties(console, {
|
|
1715
|
-
log: _assign({}, props, {
|
|
1716
|
-
value: prevLog
|
|
1717
|
-
}),
|
|
1718
|
-
info: _assign({}, props, {
|
|
1719
|
-
value: prevInfo
|
|
1720
|
-
}),
|
|
1721
|
-
warn: _assign({}, props, {
|
|
1722
|
-
value: prevWarn
|
|
1723
|
-
}),
|
|
1724
|
-
error: _assign({}, props, {
|
|
1725
|
-
value: prevError
|
|
1726
|
-
}),
|
|
1727
|
-
group: _assign({}, props, {
|
|
1728
|
-
value: prevGroup
|
|
1729
|
-
}),
|
|
1730
|
-
groupCollapsed: _assign({}, props, {
|
|
1731
|
-
value: prevGroupCollapsed
|
|
1732
|
-
}),
|
|
1733
|
-
groupEnd: _assign({}, props, {
|
|
1734
|
-
value: prevGroupEnd
|
|
1735
|
-
})
|
|
1736
|
-
});
|
|
1737
|
-
/* eslint-enable react-internal/no-production-logging */
|
|
1738
|
-
}
|
|
1739
|
-
|
|
1740
|
-
if (disabledDepth < 0) {
|
|
1741
|
-
error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');
|
|
1742
|
-
}
|
|
1743
|
-
}
|
|
1744
|
-
}
|
|
1745
|
-
|
|
1746
|
-
var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher;
|
|
1747
|
-
var prefix;
|
|
1748
|
-
function describeBuiltInComponentFrame(name, source, ownerFn) {
|
|
1749
|
-
{
|
|
1750
|
-
if (prefix === undefined) {
|
|
1751
|
-
// Extract the VM specific prefix used by each line.
|
|
1752
|
-
try {
|
|
1753
|
-
throw Error();
|
|
1754
|
-
} catch (x) {
|
|
1755
|
-
var match = x.stack.trim().match(/\n( *(at )?)/);
|
|
1756
|
-
prefix = match && match[1] || '';
|
|
1757
|
-
}
|
|
1758
|
-
} // We use the prefix to ensure our stacks line up with native stack frames.
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
return '\n' + prefix + name;
|
|
1762
|
-
}
|
|
1763
|
-
}
|
|
1764
|
-
var reentry = false;
|
|
1765
|
-
var componentFrameCache;
|
|
1766
|
-
|
|
1767
|
-
{
|
|
1768
|
-
var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
|
|
1769
|
-
componentFrameCache = new PossiblyWeakMap();
|
|
1770
|
-
}
|
|
1771
|
-
|
|
1772
|
-
function describeNativeComponentFrame(fn, construct) {
|
|
1773
|
-
// If something asked for a stack inside a fake render, it should get ignored.
|
|
1774
|
-
if (!fn || reentry) {
|
|
1775
|
-
return '';
|
|
1776
|
-
}
|
|
1777
|
-
|
|
1778
|
-
{
|
|
1779
|
-
var frame = componentFrameCache.get(fn);
|
|
1780
|
-
|
|
1781
|
-
if (frame !== undefined) {
|
|
1782
|
-
return frame;
|
|
1783
|
-
}
|
|
1784
|
-
}
|
|
1785
|
-
|
|
1786
|
-
var control;
|
|
1787
|
-
reentry = true;
|
|
1788
|
-
var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.
|
|
1789
|
-
|
|
1790
|
-
Error.prepareStackTrace = undefined;
|
|
1791
|
-
var previousDispatcher;
|
|
1792
|
-
|
|
1793
|
-
{
|
|
1794
|
-
previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function
|
|
1795
|
-
// for warnings.
|
|
1796
|
-
|
|
1797
|
-
ReactCurrentDispatcher$1.current = null;
|
|
1798
|
-
disableLogs();
|
|
1799
|
-
}
|
|
1800
|
-
|
|
1801
|
-
try {
|
|
1802
|
-
// This should throw.
|
|
1803
|
-
if (construct) {
|
|
1804
|
-
// Something should be setting the props in the constructor.
|
|
1805
|
-
var Fake = function () {
|
|
1806
|
-
throw Error();
|
|
1807
|
-
}; // $FlowFixMe
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
Object.defineProperty(Fake.prototype, 'props', {
|
|
1811
|
-
set: function () {
|
|
1812
|
-
// We use a throwing setter instead of frozen or non-writable props
|
|
1813
|
-
// because that won't throw in a non-strict mode function.
|
|
1814
|
-
throw Error();
|
|
1815
|
-
}
|
|
1816
|
-
});
|
|
1817
|
-
|
|
1818
|
-
if (typeof Reflect === 'object' && Reflect.construct) {
|
|
1819
|
-
// We construct a different control for this case to include any extra
|
|
1820
|
-
// frames added by the construct call.
|
|
1821
|
-
try {
|
|
1822
|
-
Reflect.construct(Fake, []);
|
|
1823
|
-
} catch (x) {
|
|
1824
|
-
control = x;
|
|
1825
|
-
}
|
|
1826
|
-
|
|
1827
|
-
Reflect.construct(fn, [], Fake);
|
|
1828
|
-
} else {
|
|
1829
|
-
try {
|
|
1830
|
-
Fake.call();
|
|
1831
|
-
} catch (x) {
|
|
1832
|
-
control = x;
|
|
1833
|
-
}
|
|
1834
|
-
|
|
1835
|
-
fn.call(Fake.prototype);
|
|
1836
|
-
}
|
|
1837
|
-
} else {
|
|
1838
|
-
try {
|
|
1839
|
-
throw Error();
|
|
1840
|
-
} catch (x) {
|
|
1841
|
-
control = x;
|
|
1842
|
-
}
|
|
1843
|
-
|
|
1844
|
-
fn();
|
|
1845
|
-
}
|
|
1846
|
-
} catch (sample) {
|
|
1847
|
-
// This is inlined manually because closure doesn't do it for us.
|
|
1848
|
-
if (sample && control && typeof sample.stack === 'string') {
|
|
1849
|
-
// This extracts the first frame from the sample that isn't also in the control.
|
|
1850
|
-
// Skipping one frame that we assume is the frame that calls the two.
|
|
1851
|
-
var sampleLines = sample.stack.split('\n');
|
|
1852
|
-
var controlLines = control.stack.split('\n');
|
|
1853
|
-
var s = sampleLines.length - 1;
|
|
1854
|
-
var c = controlLines.length - 1;
|
|
1855
|
-
|
|
1856
|
-
while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
|
|
1857
|
-
// We expect at least one stack frame to be shared.
|
|
1858
|
-
// Typically this will be the root most one. However, stack frames may be
|
|
1859
|
-
// cut off due to maximum stack limits. In this case, one maybe cut off
|
|
1860
|
-
// earlier than the other. We assume that the sample is longer or the same
|
|
1861
|
-
// and there for cut off earlier. So we should find the root most frame in
|
|
1862
|
-
// the sample somewhere in the control.
|
|
1863
|
-
c--;
|
|
1864
|
-
}
|
|
1865
|
-
|
|
1866
|
-
for (; s >= 1 && c >= 0; s--, c--) {
|
|
1867
|
-
// Next we find the first one that isn't the same which should be the
|
|
1868
|
-
// frame that called our sample function and the control.
|
|
1869
|
-
if (sampleLines[s] !== controlLines[c]) {
|
|
1870
|
-
// In V8, the first line is describing the message but other VMs don't.
|
|
1871
|
-
// If we're about to return the first line, and the control is also on the same
|
|
1872
|
-
// line, that's a pretty good indicator that our sample threw at same line as
|
|
1873
|
-
// the control. I.e. before we entered the sample frame. So we ignore this result.
|
|
1874
|
-
// This can happen if you passed a class to function component, or non-function.
|
|
1875
|
-
if (s !== 1 || c !== 1) {
|
|
1876
|
-
do {
|
|
1877
|
-
s--;
|
|
1878
|
-
c--; // We may still have similar intermediate frames from the construct call.
|
|
1879
|
-
// The next one that isn't the same should be our match though.
|
|
1880
|
-
|
|
1881
|
-
if (c < 0 || sampleLines[s] !== controlLines[c]) {
|
|
1882
|
-
// V8 adds a "new" prefix for native classes. Let's remove it to make it prettier.
|
|
1883
|
-
var _frame = '\n' + sampleLines[s].replace(' at new ', ' at ');
|
|
1884
|
-
|
|
1885
|
-
{
|
|
1886
|
-
if (typeof fn === 'function') {
|
|
1887
|
-
componentFrameCache.set(fn, _frame);
|
|
1888
|
-
}
|
|
1889
|
-
} // Return the line we found.
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
return _frame;
|
|
1893
|
-
}
|
|
1894
|
-
} while (s >= 1 && c >= 0);
|
|
1895
|
-
}
|
|
1896
|
-
|
|
1897
|
-
break;
|
|
1898
|
-
}
|
|
1899
|
-
}
|
|
1900
|
-
}
|
|
1901
|
-
} finally {
|
|
1902
|
-
reentry = false;
|
|
1903
|
-
|
|
1904
|
-
{
|
|
1905
|
-
ReactCurrentDispatcher$1.current = previousDispatcher;
|
|
1906
|
-
reenableLogs();
|
|
1907
|
-
}
|
|
1908
|
-
|
|
1909
|
-
Error.prepareStackTrace = previousPrepareStackTrace;
|
|
1910
|
-
} // Fallback to just using the name if we couldn't make it throw.
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
var name = fn ? fn.displayName || fn.name : '';
|
|
1914
|
-
var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';
|
|
1915
|
-
|
|
1916
|
-
{
|
|
1917
|
-
if (typeof fn === 'function') {
|
|
1918
|
-
componentFrameCache.set(fn, syntheticFrame);
|
|
1919
|
-
}
|
|
1920
|
-
}
|
|
1921
|
-
|
|
1922
|
-
return syntheticFrame;
|
|
1923
|
-
}
|
|
1924
|
-
function describeFunctionComponentFrame(fn, source, ownerFn) {
|
|
1925
|
-
{
|
|
1926
|
-
return describeNativeComponentFrame(fn, false);
|
|
1927
|
-
}
|
|
1928
|
-
}
|
|
1929
|
-
|
|
1930
|
-
function shouldConstruct(Component) {
|
|
1931
|
-
var prototype = Component.prototype;
|
|
1932
|
-
return !!(prototype && prototype.isReactComponent);
|
|
1933
|
-
}
|
|
1934
|
-
|
|
1935
|
-
function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
|
|
1936
|
-
|
|
1937
|
-
if (type == null) {
|
|
1938
|
-
return '';
|
|
1939
|
-
}
|
|
1940
|
-
|
|
1941
|
-
if (typeof type === 'function') {
|
|
1942
|
-
{
|
|
1943
|
-
return describeNativeComponentFrame(type, shouldConstruct(type));
|
|
1944
|
-
}
|
|
1945
|
-
}
|
|
1946
|
-
|
|
1947
|
-
if (typeof type === 'string') {
|
|
1948
|
-
return describeBuiltInComponentFrame(type);
|
|
1949
|
-
}
|
|
1950
|
-
|
|
1951
|
-
switch (type) {
|
|
1952
|
-
case exports.Suspense:
|
|
1953
|
-
return describeBuiltInComponentFrame('Suspense');
|
|
1954
|
-
|
|
1955
|
-
case REACT_SUSPENSE_LIST_TYPE:
|
|
1956
|
-
return describeBuiltInComponentFrame('SuspenseList');
|
|
1957
|
-
}
|
|
1958
|
-
|
|
1959
|
-
if (typeof type === 'object') {
|
|
1960
|
-
switch (type.$$typeof) {
|
|
1961
|
-
case REACT_FORWARD_REF_TYPE:
|
|
1962
|
-
return describeFunctionComponentFrame(type.render);
|
|
1963
|
-
|
|
1964
|
-
case REACT_MEMO_TYPE:
|
|
1965
|
-
// Memo may contain any component type so we recursively resolve it.
|
|
1966
|
-
return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
|
|
1967
|
-
|
|
1968
|
-
case REACT_BLOCK_TYPE:
|
|
1969
|
-
return describeFunctionComponentFrame(type._render);
|
|
1970
|
-
|
|
1971
|
-
case REACT_LAZY_TYPE:
|
|
1972
|
-
{
|
|
1973
|
-
var lazyComponent = type;
|
|
1974
|
-
var payload = lazyComponent._payload;
|
|
1975
|
-
var init = lazyComponent._init;
|
|
1976
|
-
|
|
1977
|
-
try {
|
|
1978
|
-
// Lazy may contain any component type so we recursively resolve it.
|
|
1979
|
-
return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
|
|
1980
|
-
} catch (x) {}
|
|
1981
|
-
}
|
|
1982
|
-
}
|
|
1983
|
-
}
|
|
1984
|
-
|
|
1985
|
-
return '';
|
|
1986
|
-
}
|
|
1987
|
-
|
|
1988
|
-
var loggedTypeFailures = {};
|
|
1989
|
-
var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
|
|
1990
|
-
|
|
1991
|
-
function setCurrentlyValidatingElement(element) {
|
|
1992
|
-
{
|
|
1993
|
-
if (element) {
|
|
1994
|
-
var owner = element._owner;
|
|
1995
|
-
var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
|
|
1996
|
-
ReactDebugCurrentFrame$1.setExtraStackFrame(stack);
|
|
1997
|
-
} else {
|
|
1998
|
-
ReactDebugCurrentFrame$1.setExtraStackFrame(null);
|
|
1999
|
-
}
|
|
2000
|
-
}
|
|
2001
|
-
}
|
|
2002
|
-
|
|
2003
|
-
function checkPropTypes(typeSpecs, values, location, componentName, element) {
|
|
2004
|
-
{
|
|
2005
|
-
// $FlowFixMe This is okay but Flow doesn't know it.
|
|
2006
|
-
var has = Function.call.bind(Object.prototype.hasOwnProperty);
|
|
2007
|
-
|
|
2008
|
-
for (var typeSpecName in typeSpecs) {
|
|
2009
|
-
if (has(typeSpecs, typeSpecName)) {
|
|
2010
|
-
var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
|
|
2011
|
-
// fail the render phase where it didn't fail before. So we log it.
|
|
2012
|
-
// After these have been cleaned up, we'll let them throw.
|
|
2013
|
-
|
|
2014
|
-
try {
|
|
2015
|
-
// This is intentionally an invariant that gets caught. It's the same
|
|
2016
|
-
// behavior as without this statement except with a better message.
|
|
2017
|
-
if (typeof typeSpecs[typeSpecName] !== 'function') {
|
|
2018
|
-
var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');
|
|
2019
|
-
err.name = 'Invariant Violation';
|
|
2020
|
-
throw err;
|
|
2021
|
-
}
|
|
2022
|
-
|
|
2023
|
-
error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
|
|
2024
|
-
} catch (ex) {
|
|
2025
|
-
error$1 = ex;
|
|
2026
|
-
}
|
|
2027
|
-
|
|
2028
|
-
if (error$1 && !(error$1 instanceof Error)) {
|
|
2029
|
-
setCurrentlyValidatingElement(element);
|
|
2030
|
-
|
|
2031
|
-
error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);
|
|
2032
|
-
|
|
2033
|
-
setCurrentlyValidatingElement(null);
|
|
2034
|
-
}
|
|
2035
|
-
|
|
2036
|
-
if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
|
|
2037
|
-
// Only monitor this failure once because there tends to be a lot of the
|
|
2038
|
-
// same error.
|
|
2039
|
-
loggedTypeFailures[error$1.message] = true;
|
|
2040
|
-
setCurrentlyValidatingElement(element);
|
|
2041
|
-
|
|
2042
|
-
error('Failed %s type: %s', location, error$1.message);
|
|
2043
|
-
|
|
2044
|
-
setCurrentlyValidatingElement(null);
|
|
2045
|
-
}
|
|
2046
|
-
}
|
|
2047
|
-
}
|
|
2048
|
-
}
|
|
2049
|
-
}
|
|
2050
|
-
|
|
2051
|
-
function setCurrentlyValidatingElement$1(element) {
|
|
2052
|
-
{
|
|
2053
|
-
if (element) {
|
|
2054
|
-
var owner = element._owner;
|
|
2055
|
-
var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
|
|
2056
|
-
setExtraStackFrame(stack);
|
|
2057
|
-
} else {
|
|
2058
|
-
setExtraStackFrame(null);
|
|
2059
|
-
}
|
|
2060
|
-
}
|
|
2061
|
-
}
|
|
2062
|
-
|
|
2063
|
-
var propTypesMisspellWarningShown;
|
|
2064
|
-
|
|
2065
|
-
{
|
|
2066
|
-
propTypesMisspellWarningShown = false;
|
|
2067
|
-
}
|
|
2068
|
-
|
|
2069
|
-
function getDeclarationErrorAddendum() {
|
|
2070
|
-
if (ReactCurrentOwner.current) {
|
|
2071
|
-
var name = getComponentName(ReactCurrentOwner.current.type);
|
|
2072
|
-
|
|
2073
|
-
if (name) {
|
|
2074
|
-
return '\n\nCheck the render method of `' + name + '`.';
|
|
2075
|
-
}
|
|
2076
|
-
}
|
|
2077
|
-
|
|
2078
|
-
return '';
|
|
2079
|
-
}
|
|
2080
|
-
|
|
2081
|
-
function getSourceInfoErrorAddendum(source) {
|
|
2082
|
-
if (source !== undefined) {
|
|
2083
|
-
var fileName = source.fileName.replace(/^.*[\\\/]/, '');
|
|
2084
|
-
var lineNumber = source.lineNumber;
|
|
2085
|
-
return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.';
|
|
2086
|
-
}
|
|
2087
|
-
|
|
2088
|
-
return '';
|
|
2089
|
-
}
|
|
2090
|
-
|
|
2091
|
-
function getSourceInfoErrorAddendumForProps(elementProps) {
|
|
2092
|
-
if (elementProps !== null && elementProps !== undefined) {
|
|
2093
|
-
return getSourceInfoErrorAddendum(elementProps.__source);
|
|
2094
|
-
}
|
|
2095
|
-
|
|
2096
|
-
return '';
|
|
2097
|
-
}
|
|
2098
|
-
/**
|
|
2099
|
-
* Warn if there's no key explicitly set on dynamic arrays of children or
|
|
2100
|
-
* object keys are not valid. This allows us to keep track of children between
|
|
2101
|
-
* updates.
|
|
2102
|
-
*/
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
var ownerHasKeyUseWarning = {};
|
|
2106
|
-
|
|
2107
|
-
function getCurrentComponentErrorInfo(parentType) {
|
|
2108
|
-
var info = getDeclarationErrorAddendum();
|
|
2109
|
-
|
|
2110
|
-
if (!info) {
|
|
2111
|
-
var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;
|
|
2112
|
-
|
|
2113
|
-
if (parentName) {
|
|
2114
|
-
info = "\n\nCheck the top-level render call using <" + parentName + ">.";
|
|
2115
|
-
}
|
|
2116
|
-
}
|
|
2117
|
-
|
|
2118
|
-
return info;
|
|
2119
|
-
}
|
|
2120
|
-
/**
|
|
2121
|
-
* Warn if the element doesn't have an explicit key assigned to it.
|
|
2122
|
-
* This element is in an array. The array could grow and shrink or be
|
|
2123
|
-
* reordered. All children that haven't already been validated are required to
|
|
2124
|
-
* have a "key" property assigned to it. Error statuses are cached so a warning
|
|
2125
|
-
* will only be shown once.
|
|
2126
|
-
*
|
|
2127
|
-
* @internal
|
|
2128
|
-
* @param {ReactElement} element Element that requires a key.
|
|
2129
|
-
* @param {*} parentType element's parent's type.
|
|
2130
|
-
*/
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
function validateExplicitKey(element, parentType) {
|
|
2134
|
-
if (!element._store || element._store.validated || element.key != null) {
|
|
2135
|
-
return;
|
|
2136
|
-
}
|
|
2137
|
-
|
|
2138
|
-
element._store.validated = true;
|
|
2139
|
-
var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);
|
|
2140
|
-
|
|
2141
|
-
if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
|
|
2142
|
-
return;
|
|
2143
|
-
}
|
|
2144
|
-
|
|
2145
|
-
ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a
|
|
2146
|
-
// property, it may be the creator of the child that's responsible for
|
|
2147
|
-
// assigning it a key.
|
|
2148
|
-
|
|
2149
|
-
var childOwner = '';
|
|
2150
|
-
|
|
2151
|
-
if (element && element._owner && element._owner !== ReactCurrentOwner.current) {
|
|
2152
|
-
// Give the component that originally created this child.
|
|
2153
|
-
childOwner = " It was passed a child from " + getComponentName(element._owner.type) + ".";
|
|
2154
|
-
}
|
|
2155
|
-
|
|
2156
|
-
{
|
|
2157
|
-
setCurrentlyValidatingElement$1(element);
|
|
2158
|
-
|
|
2159
|
-
error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);
|
|
2160
|
-
|
|
2161
|
-
setCurrentlyValidatingElement$1(null);
|
|
2162
|
-
}
|
|
2163
|
-
}
|
|
2164
|
-
/**
|
|
2165
|
-
* Ensure that every element either is passed in a static location, in an
|
|
2166
|
-
* array with an explicit keys property defined, or in an object literal
|
|
2167
|
-
* with valid key property.
|
|
2168
|
-
*
|
|
2169
|
-
* @internal
|
|
2170
|
-
* @param {ReactNode} node Statically passed child of any type.
|
|
2171
|
-
* @param {*} parentType node's parent's type.
|
|
2172
|
-
*/
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
function validateChildKeys(node, parentType) {
|
|
2176
|
-
if (typeof node !== 'object') {
|
|
2177
|
-
return;
|
|
2178
|
-
}
|
|
2179
|
-
|
|
2180
|
-
if (Array.isArray(node)) {
|
|
2181
|
-
for (var i = 0; i < node.length; i++) {
|
|
2182
|
-
var child = node[i];
|
|
2183
|
-
|
|
2184
|
-
if (isValidElement(child)) {
|
|
2185
|
-
validateExplicitKey(child, parentType);
|
|
2186
|
-
}
|
|
2187
|
-
}
|
|
2188
|
-
} else if (isValidElement(node)) {
|
|
2189
|
-
// This element was passed in a valid location.
|
|
2190
|
-
if (node._store) {
|
|
2191
|
-
node._store.validated = true;
|
|
2192
|
-
}
|
|
2193
|
-
} else if (node) {
|
|
2194
|
-
var iteratorFn = getIteratorFn(node);
|
|
2195
|
-
|
|
2196
|
-
if (typeof iteratorFn === 'function') {
|
|
2197
|
-
// Entry iterators used to provide implicit keys,
|
|
2198
|
-
// but now we print a separate warning for them later.
|
|
2199
|
-
if (iteratorFn !== node.entries) {
|
|
2200
|
-
var iterator = iteratorFn.call(node);
|
|
2201
|
-
var step;
|
|
2202
|
-
|
|
2203
|
-
while (!(step = iterator.next()).done) {
|
|
2204
|
-
if (isValidElement(step.value)) {
|
|
2205
|
-
validateExplicitKey(step.value, parentType);
|
|
2206
|
-
}
|
|
2207
|
-
}
|
|
2208
|
-
}
|
|
2209
|
-
}
|
|
2210
|
-
}
|
|
2211
|
-
}
|
|
2212
|
-
/**
|
|
2213
|
-
* Given an element, validate that its props follow the propTypes definition,
|
|
2214
|
-
* provided by the type.
|
|
2215
|
-
*
|
|
2216
|
-
* @param {ReactElement} element
|
|
2217
|
-
*/
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
function validatePropTypes(element) {
|
|
2221
|
-
{
|
|
2222
|
-
var type = element.type;
|
|
2223
|
-
|
|
2224
|
-
if (type === null || type === undefined || typeof type === 'string') {
|
|
2225
|
-
return;
|
|
2226
|
-
}
|
|
2227
|
-
|
|
2228
|
-
var propTypes;
|
|
2229
|
-
|
|
2230
|
-
if (typeof type === 'function') {
|
|
2231
|
-
propTypes = type.propTypes;
|
|
2232
|
-
} else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.
|
|
2233
|
-
// Inner props are checked in the reconciler.
|
|
2234
|
-
type.$$typeof === REACT_MEMO_TYPE)) {
|
|
2235
|
-
propTypes = type.propTypes;
|
|
2236
|
-
} else {
|
|
2237
|
-
return;
|
|
2238
|
-
}
|
|
2239
|
-
|
|
2240
|
-
if (propTypes) {
|
|
2241
|
-
// Intentionally inside to avoid triggering lazy initializers:
|
|
2242
|
-
var name = getComponentName(type);
|
|
2243
|
-
checkPropTypes(propTypes, element.props, 'prop', name, element);
|
|
2244
|
-
} else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {
|
|
2245
|
-
propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:
|
|
2246
|
-
|
|
2247
|
-
var _name = getComponentName(type);
|
|
2248
|
-
|
|
2249
|
-
error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');
|
|
2250
|
-
}
|
|
2251
|
-
|
|
2252
|
-
if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {
|
|
2253
|
-
error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');
|
|
2254
|
-
}
|
|
2255
|
-
}
|
|
2256
|
-
}
|
|
2257
|
-
/**
|
|
2258
|
-
* Given a fragment, validate that it can only be provided with fragment props
|
|
2259
|
-
* @param {ReactElement} fragment
|
|
2260
|
-
*/
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
function validateFragmentProps(fragment) {
|
|
2264
|
-
{
|
|
2265
|
-
var keys = Object.keys(fragment.props);
|
|
2266
|
-
|
|
2267
|
-
for (var i = 0; i < keys.length; i++) {
|
|
2268
|
-
var key = keys[i];
|
|
2269
|
-
|
|
2270
|
-
if (key !== 'children' && key !== 'key') {
|
|
2271
|
-
setCurrentlyValidatingElement$1(fragment);
|
|
2272
|
-
|
|
2273
|
-
error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);
|
|
2274
|
-
|
|
2275
|
-
setCurrentlyValidatingElement$1(null);
|
|
2276
|
-
break;
|
|
2277
|
-
}
|
|
2278
|
-
}
|
|
2279
|
-
|
|
2280
|
-
if (fragment.ref !== null) {
|
|
2281
|
-
setCurrentlyValidatingElement$1(fragment);
|
|
2282
|
-
|
|
2283
|
-
error('Invalid attribute `ref` supplied to `React.Fragment`.');
|
|
2284
|
-
|
|
2285
|
-
setCurrentlyValidatingElement$1(null);
|
|
2286
|
-
}
|
|
2287
|
-
}
|
|
2288
|
-
}
|
|
2289
|
-
function createElementWithValidation(type, props, children) {
|
|
2290
|
-
var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to
|
|
2291
|
-
// succeed and there will likely be errors in render.
|
|
2292
|
-
|
|
2293
|
-
if (!validType) {
|
|
2294
|
-
var info = '';
|
|
2295
|
-
|
|
2296
|
-
if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
|
|
2297
|
-
info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports.";
|
|
2298
|
-
}
|
|
2299
|
-
|
|
2300
|
-
var sourceInfo = getSourceInfoErrorAddendumForProps(props);
|
|
2301
|
-
|
|
2302
|
-
if (sourceInfo) {
|
|
2303
|
-
info += sourceInfo;
|
|
2304
|
-
} else {
|
|
2305
|
-
info += getDeclarationErrorAddendum();
|
|
2306
|
-
}
|
|
2307
|
-
|
|
2308
|
-
var typeString;
|
|
2309
|
-
|
|
2310
|
-
if (type === null) {
|
|
2311
|
-
typeString = 'null';
|
|
2312
|
-
} else if (Array.isArray(type)) {
|
|
2313
|
-
typeString = 'array';
|
|
2314
|
-
} else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {
|
|
2315
|
-
typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />";
|
|
2316
|
-
info = ' Did you accidentally export a JSX literal instead of a component?';
|
|
2317
|
-
} else {
|
|
2318
|
-
typeString = typeof type;
|
|
2319
|
-
}
|
|
2320
|
-
|
|
2321
|
-
{
|
|
2322
|
-
error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);
|
|
2323
|
-
}
|
|
2324
|
-
}
|
|
2325
|
-
|
|
2326
|
-
var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.
|
|
2327
|
-
// TODO: Drop this when these are no longer allowed as the type argument.
|
|
2328
|
-
|
|
2329
|
-
if (element == null) {
|
|
2330
|
-
return element;
|
|
2331
|
-
} // Skip key warning if the type isn't valid since our key validation logic
|
|
2332
|
-
// doesn't expect a non-string/function type and can throw confusing errors.
|
|
2333
|
-
// We don't want exception behavior to differ between dev and prod.
|
|
2334
|
-
// (Rendering will throw with a helpful message and as soon as the type is
|
|
2335
|
-
// fixed, the key warnings will appear.)
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
if (validType) {
|
|
2339
|
-
for (var i = 2; i < arguments.length; i++) {
|
|
2340
|
-
validateChildKeys(arguments[i], type);
|
|
2341
|
-
}
|
|
2342
|
-
}
|
|
2343
|
-
|
|
2344
|
-
if (type === exports.Fragment) {
|
|
2345
|
-
validateFragmentProps(element);
|
|
2346
|
-
} else {
|
|
2347
|
-
validatePropTypes(element);
|
|
2348
|
-
}
|
|
2349
|
-
|
|
2350
|
-
return element;
|
|
2351
|
-
}
|
|
2352
|
-
var didWarnAboutDeprecatedCreateFactory = false;
|
|
2353
|
-
function createFactoryWithValidation(type) {
|
|
2354
|
-
var validatedFactory = createElementWithValidation.bind(null, type);
|
|
2355
|
-
validatedFactory.type = type;
|
|
2356
|
-
|
|
2357
|
-
{
|
|
2358
|
-
if (!didWarnAboutDeprecatedCreateFactory) {
|
|
2359
|
-
didWarnAboutDeprecatedCreateFactory = true;
|
|
2360
|
-
|
|
2361
|
-
warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');
|
|
2362
|
-
} // Legacy hook: remove it
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
Object.defineProperty(validatedFactory, 'type', {
|
|
2366
|
-
enumerable: false,
|
|
2367
|
-
get: function () {
|
|
2368
|
-
warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');
|
|
2369
|
-
|
|
2370
|
-
Object.defineProperty(this, 'type', {
|
|
2371
|
-
value: type
|
|
2372
|
-
});
|
|
2373
|
-
return type;
|
|
2374
|
-
}
|
|
2375
|
-
});
|
|
2376
|
-
}
|
|
2377
|
-
|
|
2378
|
-
return validatedFactory;
|
|
2379
|
-
}
|
|
2380
|
-
function cloneElementWithValidation(element, props, children) {
|
|
2381
|
-
var newElement = cloneElement.apply(this, arguments);
|
|
2382
|
-
|
|
2383
|
-
for (var i = 2; i < arguments.length; i++) {
|
|
2384
|
-
validateChildKeys(arguments[i], newElement.type);
|
|
2385
|
-
}
|
|
2386
|
-
|
|
2387
|
-
validatePropTypes(newElement);
|
|
2388
|
-
return newElement;
|
|
2389
|
-
}
|
|
2390
|
-
|
|
2391
|
-
{
|
|
2392
|
-
|
|
2393
|
-
try {
|
|
2394
|
-
var frozenObject = Object.freeze({});
|
|
2395
|
-
/* eslint-disable no-new */
|
|
2396
|
-
|
|
2397
|
-
new Map([[frozenObject, null]]);
|
|
2398
|
-
new Set([frozenObject]);
|
|
2399
|
-
/* eslint-enable no-new */
|
|
2400
|
-
} catch (e) {
|
|
2401
|
-
}
|
|
2402
|
-
}
|
|
2403
|
-
|
|
2404
|
-
var createElement$1 = createElementWithValidation ;
|
|
2405
|
-
var cloneElement$1 = cloneElementWithValidation ;
|
|
2406
|
-
var createFactory = createFactoryWithValidation ;
|
|
2407
|
-
var Children = {
|
|
2408
|
-
map: mapChildren,
|
|
2409
|
-
forEach: forEachChildren,
|
|
2410
|
-
count: countChildren,
|
|
2411
|
-
toArray: toArray,
|
|
2412
|
-
only: onlyChild
|
|
2413
|
-
};
|
|
2414
|
-
|
|
2415
|
-
exports.Children = Children;
|
|
2416
|
-
exports.Component = Component;
|
|
2417
|
-
exports.PureComponent = PureComponent;
|
|
2418
|
-
exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals;
|
|
2419
|
-
exports.cloneElement = cloneElement$1;
|
|
2420
|
-
exports.createContext = createContext;
|
|
2421
|
-
exports.createElement = createElement$1;
|
|
2422
|
-
exports.createFactory = createFactory;
|
|
2423
|
-
exports.createRef = createRef;
|
|
2424
|
-
exports.forwardRef = forwardRef;
|
|
2425
|
-
exports.isValidElement = isValidElement;
|
|
2426
|
-
exports.lazy = lazy;
|
|
2427
|
-
exports.memo = memo;
|
|
2428
|
-
exports.useCallback = useCallback;
|
|
2429
|
-
exports.useContext = useContext;
|
|
2430
|
-
exports.useDebugValue = useDebugValue;
|
|
2431
|
-
exports.useEffect = useEffect;
|
|
2432
|
-
exports.useImperativeHandle = useImperativeHandle;
|
|
2433
|
-
exports.useLayoutEffect = useLayoutEffect;
|
|
2434
|
-
exports.useMemo = useMemo;
|
|
2435
|
-
exports.useReducer = useReducer;
|
|
2436
|
-
exports.useRef = useRef;
|
|
2437
|
-
exports.useState = useState;
|
|
2438
|
-
exports.version = ReactVersion;
|
|
2439
|
-
})();
|
|
2440
|
-
}
|
|
2441
|
-
} (react_development));
|
|
2442
|
-
return react_development;
|
|
2443
|
-
}
|
|
2444
|
-
|
|
2445
|
-
(function (module) {
|
|
2446
|
-
|
|
2447
|
-
{
|
|
2448
|
-
module.exports = requireReact_development();
|
|
2449
|
-
}
|
|
2450
|
-
} (react));
|
|
2451
|
-
|
|
2452
|
-
var __jsenv_default_import__ = /*@__PURE__*/getDefaultExportFromCjs(react.exports);
|
|
2453
|
-
|
|
2454
|
-
var Children = react.exports.Children;
|
|
2455
|
-
var Component = react.exports.Component;
|
|
2456
|
-
var Fragment = react.exports.Fragment;
|
|
2457
|
-
var Profiler = react.exports.Profiler;
|
|
2458
|
-
var PureComponent = react.exports.PureComponent;
|
|
2459
|
-
var StrictMode = react.exports.StrictMode;
|
|
2460
|
-
var Suspense = react.exports.Suspense;
|
|
2461
|
-
var __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = react.exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
|
2462
|
-
var cloneElement = react.exports.cloneElement;
|
|
2463
|
-
var createContext = react.exports.createContext;
|
|
2464
|
-
var createElement = react.exports.createElement;
|
|
2465
|
-
var createFactory = react.exports.createFactory;
|
|
2466
|
-
var createRef = react.exports.createRef;
|
|
2467
|
-
var forwardRef = react.exports.forwardRef;
|
|
2468
|
-
var isValidElement = react.exports.isValidElement;
|
|
2469
|
-
var lazy = react.exports.lazy;
|
|
2470
|
-
var memo = react.exports.memo;
|
|
2471
|
-
var useCallback = react.exports.useCallback;
|
|
2472
|
-
var useContext = react.exports.useContext;
|
|
2473
|
-
var useDebugValue = react.exports.useDebugValue;
|
|
2474
|
-
var useEffect = react.exports.useEffect;
|
|
2475
|
-
var useImperativeHandle = react.exports.useImperativeHandle;
|
|
2476
|
-
var useLayoutEffect = react.exports.useLayoutEffect;
|
|
2477
|
-
var useMemo = react.exports.useMemo;
|
|
2478
|
-
var useReducer = react.exports.useReducer;
|
|
2479
|
-
var useRef = react.exports.useRef;
|
|
2480
|
-
var useState = react.exports.useState;
|
|
2481
|
-
var version = react.exports.version;
|
|
2482
|
-
export { Children, Component, Fragment, Profiler, PureComponent, StrictMode, Suspense, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, cloneElement, createContext, createElement, createFactory, createRef, __jsenv_default_import__ as default, forwardRef, isValidElement, lazy, memo, useCallback, useContext, useDebugValue, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useReducer, useRef, useState, version };
|
|
2483
|
-
|
|
2484
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvZC5tYWlsbGFyZC9kZXYvanNlbnYvanNlbnYtY29yZS9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsImZpbGU6Ly8vVXNlcnMvZC5tYWlsbGFyZC9kZXYvanNlbnYvanNlbnYtY29yZS9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwiZmlsZTovLy9Vc2Vycy9kLm1haWxsYXJkL2Rldi9qc2Vudi9qc2Vudi1jb3JlL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIFRPRE86IHRoaXMgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGdldHMgaW1wb3J0ZWQgZHVyaW5nIGJ1aWxkLlxudmFyIFJlYWN0VmVyc2lvbiA9ICcxNy4wLjInO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xuZXhwb3J0cy5GcmFnbWVudCA9IDB4ZWFjYjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IDB4ZWFjYztcbmV4cG9ydHMuUHJvZmlsZXIgPSAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSAweGVhY2U7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IDB4ZWFkMDtcbmV4cG9ydHMuU3VzcGVuc2UgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBleHBvcnRzLkZyYWdtZW50ID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBleHBvcnRzLlN0cmljdE1vZGUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIGV4cG9ydHMuUHJvZmlsZXIgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBleHBvcnRzLlN1c3BlbnNlID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1NDT1BFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNjb3BlJyk7XG4gIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vcGFxdWUuaWQnKTtcbiAgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbiAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuICBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbn1cblxudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiAwXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0ge307XG52YXIgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IG51bGw7XG5mdW5jdGlvbiBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spIHtcbiAge1xuICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgfVxufVxuXG57XG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lID0gZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAge1xuICAgICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICAgIH1cbiAgfTsgLy8gU3RhY2sgaW1wbGVtZW50YXRpb24gaW5qZWN0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIuXG5cblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9ICcnOyAvLyBBZGQgYW4gZXh0cmEgdG9wIGZyYW1lIHdoaWxlIGFuIGVsZW1lbnQgaXMgYmVpbmcgdmFsaWRhdGVkXG5cbiAgICBpZiAoY3VycmVudEV4dHJhU3RhY2tGcmFtZSkge1xuICAgICAgc3RhY2sgKz0gY3VycmVudEV4dHJhU3RhY2tGcmFtZTtcbiAgICB9IC8vIERlbGVnYXRlIHRvIHRoZSBpbmplY3RlZCByZW5kZXJlci1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuXG5cbiAgICB2YXIgaW1wbCA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrO1xuXG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHN0YWNrICs9IGltcGwoKSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG59XG5cbi8qKlxuICogVXNlZCBieSBhY3QoKSB0byB0cmFjayB3aGV0aGVyIHlvdSdyZSBpbnNpZGUgYW4gYWN0KCkgc2NvcGUuXG4gKi9cbnZhciBJc1NvbWVSZW5kZXJlckFjdGluZyA9IHtcbiAgY3VycmVudDogZmFsc2Vcbn07XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXIsXG4gIElzU29tZVJlbmRlcmVyQWN0aW5nOiBJc1NvbWVSZW5kZXJlckFjdGluZyxcbiAgLy8gVXNlZCBieSByZW5kZXJlcnMgdG8gYXZvaWQgYnVuZGxpbmcgb2JqZWN0LWFzc2lnbiB0d2ljZSBpbiBVTUQgYnVuZGxlczpcbiAgYXNzaWduOiBfYXNzaWduXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH1cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gJycgKyBpdGVtO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IHt9O1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgdmFyIF9jb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gX2NvbnN0cnVjdG9yICYmIChfY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgX2NvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJztcbiAgICB2YXIgd2FybmluZ0tleSA9IGNvbXBvbmVudE5hbWUgKyBcIi5cIiArIGNhbGxlck5hbWU7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXJyb3IoXCJDYW4ndCBjYWxsICVzIG9uIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHlldCBtb3VudGVkLiBcIiArICdUaGlzIGlzIGEgbm8tb3AsIGJ1dCBpdCBtaWdodCBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiAnICsgJ0luc3RlYWQsIGFzc2lnbiB0byBgdGhpcy5zdGF0ZWAgZGlyZWN0bHkgb3IgZGVmaW5lIGEgYHN0YXRlID0ge307YCAnICsgJ2NsYXNzIHByb3BlcnR5IHdpdGggdGhlIGRlc2lyZWQgc3RhdGUgaW4gdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSA9IHRydWU7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgQVBJIGZvciBhbiB1cGRhdGUgcXVldWUuXG4gKi9cblxuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICghKHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgfHwgcGFydGlhbFN0YXRlID09IG51bGwpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwic2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuXCIgKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuX2Fzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcblxucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgZXhwb3J0cy5GcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgZXhwb3J0cy5Qcm9maWxlcjpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBleHBvcnRzLlN0cmljdE1vZGU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBleHBvcnRzLlN1c3BlbnNlOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpO1xuXG4gICAgICBjYXNlIFJFQUNUX0JMT0NLX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHR5cGUuX3JlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignQ29tcG9uZW50IFwiJXNcIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiBcIiVzXCIuICcgKyAnU3VwcG9ydCBmb3Igc3RyaW5nIHJlZnMgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuICcgKyAnVGhpcyBjYXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvbi4gJyArICdXZSBhc2sgeW91IHRvIG1hbnVhbGx5IGZpeCB0aGlzIGNhc2UgYnkgdXNpbmcgdXNlUmVmKCkgb3IgY3JlYXRlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnLCBjb21wb25lbnROYW1lLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY3JlYXRlZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIgcHJvcHMgPSB7fTtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciByZWYgPSBudWxsO1xuICB2YXIgc2VsZiA9IG51bGw7XG4gIHZhciBzb3VyY2UgPSBudWxsO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuXG4gICAgICB7XG4gICAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmICghIShlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIG1hcHBlZENoaWxkID0gY2xvbmVBbmRSZXBsYWNlS2V5KG1hcHBlZENoaWxkLCAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgICAvLyB0cmF2ZXJzZUFsbENoaWxkcmVuIHVzZWQgdG8gZG8gZm9yIG9iamVjdHMgYXMgY2hpbGRyZW5cbiAgICAgICAgZXNjYXBlZFByZWZpeCArICggLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgIG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBleGlzdGluZyBlbGVtZW50J3Mga2V5IGNhbiBiZSBhIG51bWJlclxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSAnJyArIGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIiApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuXCIgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlLCBjYWxjdWxhdGVDaGFuZ2VkQml0cykge1xuICBpZiAoY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhbGN1bGF0ZUNoYW5nZWRCaXRzID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBpZiAoY2FsY3VsYXRlQ2hhbmdlZEJpdHMgIT09IG51bGwgJiYgdHlwZW9mIGNhbGN1bGF0ZUNoYW5nZWRCaXRzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdjcmVhdGVDb250ZXh0OiBFeHBlY3RlZCB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMnLCBjYWxjdWxhdGVDaGFuZ2VkQml0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICBfY2FsY3VsYXRlQ2hhbmdlZEJpdHM6IGNhbGN1bGF0ZUNoYW5nZWRCaXRzLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBjb250ZXh0Ll9jYWxjdWxhdGVDaGFuZ2VkQml0c1xuICAgIH07IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG5vdCBzZXR0aW5nIGEgdmFsdWUsIHdoaWNoIGlzIGludGVudGlvbmFsIGhlcmVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENvbnN1bWVyLCB7XG4gICAgICBQcm92aWRlcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuUHJvdmlkZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuUHJvdmlkZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuUHJvdmlkZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9Qcm92aWRlcikge1xuICAgICAgICAgIGNvbnRleHQuUHJvdmlkZXIgPSBfUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBfY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZTI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUyKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlMiA9IF9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3RocmVhZENvdW50OiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll90aHJlYWRDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX3RocmVhZENvdW50KSB7XG4gICAgICAgICAgY29udGV4dC5fdGhyZWFkQ291bnQgPSBfdGhyZWFkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBDb25zdW1lcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuQ29uc3VtZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuQ29uc3VtZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkaXNwbGF5TmFtZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5kaXNwbGF5TmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyKSB7XG4gICAgICAgICAgICB3YXJuKCdTZXR0aW5nIGBkaXNwbGF5TmFtZWAgb24gQ29udGV4dC5Db25zdW1lciBoYXMgbm8gZWZmZWN0LiAnICsgXCJZb3Ugc2hvdWxkIHNldCBpdCBkaXJlY3RseSBvbiB0aGUgY29udGV4dCB3aXRoIENvbnRleHQuZGlzcGxheU5hbWUgPSAnJXMnLlwiLCBkaXNwbGF5TmFtZSk7XG5cbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGRlZmluZVByb3BlcnR5XG5cbiAgICBjb250ZXh0LkNvbnN1bWVyID0gQ29uc3VtZXI7XG4gIH1cblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gbnVsbDtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjb250ZXh0O1xufVxuXG52YXIgVW5pbml0aWFsaXplZCA9IC0xO1xudmFyIFBlbmRpbmcgPSAwO1xudmFyIFJlc29sdmVkID0gMTtcbnZhciBSZWplY3RlZCA9IDI7XG5cbmZ1bmN0aW9uIGxhenlJbml0aWFsaXplcihwYXlsb2FkKSB7XG4gIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICB2YXIgY3RvciA9IHBheWxvYWQuX3Jlc3VsdDtcbiAgICB2YXIgdGhlbmFibGUgPSBjdG9yKCk7IC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG5cbiAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgcGVuZGluZy5fc3RhdHVzID0gUGVuZGluZztcbiAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRFeHBvcnQgPSBtb2R1bGVPYmplY3QuZGVmYXVsdDtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRlZmF1bHRFeHBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcG9ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG5cblxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBkZWZhdWx0RXhwb3J0O1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUGVuZGluZykge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFJlc29sdmVkKSB7XG4gICAgcmV0dXJuIHBheWxvYWQuX3Jlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiAtMSxcbiAgICBfcmVzdWx0OiBjdG9yXG4gIH07XG4gIHZhciBsYXp5VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgIF9wYXlsb2FkOiBwYXlsb2FkLFxuICAgIF9pbml0OiBsYXp5SW5pdGlhbGl6ZXJcbiAgfTtcblxuICB7XG4gICAgLy8gSW4gcHJvZHVjdGlvbiwgdGhpcyB3b3VsZCBqdXN0IHNldCBpdCBvbiB0aGUgb2JqZWN0LlxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG4gICAgdmFyIHByb3BUeXBlczsgLy8gJEZsb3dGaXhNZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGF6eVR5cGUsIHtcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJvcHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld0RlZmF1bHRQcm9wcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBkZWZhdWx0UHJvcHNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBkZWZhdWx0UHJvcHMgPSBuZXdEZWZhdWx0UHJvcHM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ2RlZmF1bHRQcm9wcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3BUeXBlczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwcm9wVHlwZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1Byb3BUeXBlcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBwcm9wVHlwZXNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBwcm9wVHlwZXMgPSBuZXdQcm9wVHlwZXM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ3Byb3BUeXBlcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxhenlUeXBlO1xufVxuXG5mdW5jdGlvbiBmb3J3YXJkUmVmKHJlbmRlcikge1xuICB7XG4gICAgaWYgKHJlbmRlciAhPSBudWxsICYmIHJlbmRlci4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgcmVjZWl2ZWQgYSBgbWVtb2AgJyArICdjb21wb25lbnQuIEluc3RlYWQgb2YgZm9yd2FyZFJlZihtZW1vKC4uLikpLCB1c2UgJyArICdtZW1vKGZvcndhcmRSZWYoLi4uKSkuJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgd2FzIGdpdmVuICVzLicsIHJlbmRlciA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiByZW5kZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVuZGVyLmxlbmd0aCAhPT0gMCAmJiByZW5kZXIubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgYWNjZXB0IGV4YWN0bHkgdHdvIHBhcmFtZXRlcnM6IHByb3BzIGFuZCByZWYuICVzJywgcmVuZGVyLmxlbmd0aCA9PT0gMSA/ICdEaWQgeW91IGZvcmdldCB0byB1c2UgdGhlIHJlZiBwYXJhbWV0ZXI/JyA6ICdBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlciAhPSBudWxsKSB7XG4gICAgICBpZiAocmVuZGVyLmRlZmF1bHRQcm9wcyAhPSBudWxsIHx8IHJlbmRlci5wcm9wVHlwZXMgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IHByb3BUeXBlcyBvciBkZWZhdWx0UHJvcHMuICcgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUsXG4gICAgcmVuZGVyOiByZW5kZXJcbiAgfTtcblxuICB7XG4gICAgdmFyIG93bk5hbWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIG93bk5hbWUgPSBuYW1lO1xuXG4gICAgICAgIGlmIChyZW5kZXIuZGlzcGxheU5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxuLy8gRmlsdGVyIGNlcnRhaW4gRE9NIGF0dHJpYnV0ZXMgKGUuZy4gc3JjLCBocmVmKSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVtcHR5IHN0cmluZ3MuXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IGV4cG9ydHMuRnJhZ21lbnQgfHwgdHlwZSA9PT0gZXhwb3J0cy5Qcm9maWxlciB8fCB0eXBlID09PSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSB8fCB0eXBlID09PSBleHBvcnRzLlN0cmljdE1vZGUgfHwgdHlwZSA9PT0gZXhwb3J0cy5TdXNwZW5zZSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUgfHwgdHlwZVswXSA9PT0gUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTtcblxuICAgICAgICBpZiAodHlwZS5kaXNwbGF5TmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURpc3BhdGNoZXIoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50O1xuXG4gIGlmICghKGRpc3BhdGNoZXIgIT09IG51bGwpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvciBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbjEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbjIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4zLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uXCIgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0LCB1bnN0YWJsZV9vYnNlcnZlZEJpdHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICBpZiAodW5zdGFibGVfb2JzZXJ2ZWRCaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yKCd1c2VDb250ZXh0KCkgc2Vjb25kIGFyZ3VtZW50IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgJyArICd1c2UgaW4gUmVhY3QuIFBhc3NpbmcgaXQgaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3UgcGFzc2VkOiAlcy4lcycsIHVuc3RhYmxlX29ic2VydmVkQml0cywgdHlwZW9mIHVuc3RhYmxlX29ic2VydmVkQml0cyA9PT0gJ251bWJlcicgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMl0pID8gJ1xcblxcbkRpZCB5b3UgY2FsbCBhcnJheS5tYXAodXNlQ29udGV4dCk/ICcgKyAnQ2FsbGluZyBIb29rcyBpbnNpZGUgYSBsb29wIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnIDogJycpO1xuICAgIH0gLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuXG5cbiAgICBpZiAoQ29udGV4dC5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVhbENvbnRleHQgPSBDb250ZXh0Ll9jb250ZXh0OyAvLyBEb24ndCBkZWR1cGxpY2F0ZSBiZWNhdXNlIHRoaXMgbGVnaXRpbWF0ZWx5IGNhdXNlcyBidWdzXG4gICAgICAvLyBhbmQgbm9ib2R5IHNob3VsZCBiZSB1c2luZyB0aGlzIGluIGV4aXN0aW5nIGNvZGUuXG5cbiAgICAgIGlmIChyZWFsQ29udGV4dC5Db25zdW1lciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuQ29uc3VtZXIpIGlzIG5vdCBzdXBwb3J0ZWQsIG1heSBjYXVzZSBidWdzLCBhbmQgd2lsbCBiZSAnICsgJ3JlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfSBlbHNlIGlmIChyZWFsQ29udGV4dC5Qcm92aWRlciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuUHJvdmlkZXIpIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgZXhwb3J0cy5TdXNwZW5zZTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUuX3JlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKSB7XG4gIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKGVsZW1lbnRQcm9wcykge1xuICBpZiAoZWxlbWVudFByb3BzICE9PSBudWxsICYmIGVsZW1lbnRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKGVsZW1lbnRQcm9wcy5fX3NvdXJjZSk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmZvO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOyAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYVxuICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICB2YXIgY2hpbGRPd25lciA9ICcnO1xuXG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG5cbiAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHlwZS5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicgJiYgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGZyYWdtZW50LCB2YWxpZGF0ZSB0aGF0IGl0IGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdpdGggZnJhZ21lbnQgcHJvcHNcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBmcmFnbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09ICdjaGlsZHJlbicgJiYga2V5ICE9PSAna2V5Jykge1xuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuXG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuXG4gIGlmICghdmFsaWRUeXBlKSB7XG4gICAgdmFyIGluZm8gPSAnJztcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmZvID0gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhwcm9wcyk7XG5cbiAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgaW5mbyArPSBzb3VyY2VJbmZvO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgIH1cblxuICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50KSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG57XG5cbiAgdHJ5IHtcbiAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbZnJvemVuT2JqZWN0LCBudWxsXV0pO1xuICAgIG5ldyBTZXQoW2Zyb3plbk9iamVjdF0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3ICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuUHVyZUNvbXBvbmVudCA9IFB1cmVDb21wb25lbnQ7XG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gUmVhY3RTaGFyZWRJbnRlcm5hbHM7XG5leHBvcnRzLmNsb25lRWxlbWVudCA9IGNsb25lRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDtcbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlRmFjdG9yeSA9IGNyZWF0ZUZhY3Rvcnk7XG5leHBvcnRzLmNyZWF0ZVJlZiA9IGNyZWF0ZVJlZjtcbmV4cG9ydHMuZm9yd2FyZFJlZiA9IGZvcndhcmRSZWY7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmxhenkgPSBsYXp5O1xuZXhwb3J0cy5tZW1vID0gbWVtbztcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwi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
|