(self["webpackChunkramsey_plus_forms"] = self["webpackChunkramsey_plus_forms"] || []).push([[749],{ /***/ 1030: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ A: () => (/* binding */ Text) /* harmony export */ }); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6942); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6540); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; /** * * Demos: * * - [RDS Text](https://design.ramseysolutions.com/storybook/?path=/story/design-system-text--default) * * API: * * - [RDS Text API](https://design.ramseysolutions.com/components/text/?tab=technologies#react) */ var Text = function (_a) { var _b; var children = _a.children, className = _a.className, _c = _a.color, color = _c === void 0 ? "normal" : _c, element = _a.element, _d = _a.isOnDarkCanvas, isOnDarkCanvas = _d === void 0 ? false : _d, _e = _a.size, size = _e === void 0 ? "bodyMedium" : _e, rest = __rest(_a, ["children", "className", "color", "element", "isOnDarkCanvas", "size"]); var textClasses = classnames__WEBPACK_IMPORTED_MODULE_0___default()("rds-Text", (_b = {}, _b["rds-Text--".concat(size)] = size !== "bodyMedium", _b["rds-Text--".concat(color)] = color !== "normal", _b["on-darkCanvas"] = isOnDarkCanvas, _b), className); var Element = element || "p"; return (react__WEBPACK_IMPORTED_MODULE_1__.createElement(Element, __assign({ className: textClasses }, rest), children)); }; Text.displayName = "Text"; //# sourceMappingURL=Text.esm.js.map /***/ }), /***/ 1338: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ A: () => (/* binding */ Stack) /* harmony export */ }); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6942); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6540); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; /** * * Demos: * * - [RDS Stack](https://design.ramseysolutions.com/storybook/?path=/story/design-system-stack--default) * * API: * * - [RDS Stack API](https://design.ramseysolutions.com/components/stack/?tab=technologies#react) */ var Stack = function (_a) { var _b; var children = _a.children, className = _a.className, element = _a.element, _c = _a.horizontalAlignment, horizontalAlignment = _c === void 0 ? "left" : _c, _d = _a.spacing, spacing = _d === void 0 ? "md" : _d, _e = _a.vertical, vertical = _e === void 0 ? false : _e, _f = _a.verticalAlignment, verticalAlignment = _f === void 0 ? "center" : _f, _g = _a.wrap, wrap = _g === void 0 ? true : _g, rest = __rest(_a, ["children", "className", "element", "horizontalAlignment", "spacing", "vertical", "verticalAlignment", "wrap"]); var stackClasses = classnames__WEBPACK_IMPORTED_MODULE_0___default()("rds-Stack", (_b = { "rds-Stack--vertical": vertical }, _b["rds-Stack--".concat(horizontalAlignment, "HorizontalAlignment")] = horizontalAlignment !== "left", _b["rds-Stack--".concat(spacing, "Spacing")] = spacing !== "md", _b["rds-Stack--".concat(verticalAlignment, "VerticalAlignment")] = verticalAlignment !== "center", _b["rds-Stack--noWrap"] = !wrap, _b), className); var Element = element || "div"; return (react__WEBPACK_IMPORTED_MODULE_1__.createElement(Element, __assign({ className: stackClasses }, rest), children)); }; Stack.displayName = "Stack"; //# sourceMappingURL=Stack.esm.js.map /***/ }), /***/ 2675: /***/ ((module) => { "use strict"; module.exports = /*#__PURE__*/JSON.parse('{"R_o":"14px","K4M":"16px","qEL":"24px"}'); /***/ }), /***/ 2694: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; /** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ var ReactPropTypesSecret = __webpack_require__(6925); function emptyFunction() {} function emptyFunctionWithReset() {} emptyFunctionWithReset.resetWarningCache = emptyFunction; module.exports = function() { function shim(props, propName, componentName, location, propFullName, secret) { if (secret === ReactPropTypesSecret) { // It is still safe when called from React. return; } var err = new Error( 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + 'Use PropTypes.checkPropTypes() to call them. ' + 'Read more at http://fb.me/use-check-prop-types' ); err.name = 'Invariant Violation'; throw err; }; shim.isRequired = shim; function getShim() { return shim; }; // Important! // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`. var ReactPropTypes = { array: shim, bigint: shim, bool: shim, func: shim, number: shim, object: shim, string: shim, symbol: shim, any: shim, arrayOf: getShim, element: shim, elementType: shim, instanceOf: getShim, node: shim, objectOf: getShim, oneOf: getShim, oneOfType: getShim, shape: getShim, exact: getShim, checkPropTypes: emptyFunctionWithReset, resetWarningCache: emptyFunction }; ReactPropTypes.PropTypes = ReactPropTypes; return ReactPropTypes; }; /***/ }), /***/ 2799: /***/ ((__unused_webpack_module, exports) => { "use strict"; /** @license React v16.13.1 * react-is.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b? Symbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119; function z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d; exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t}; exports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p}; exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z; /***/ }), /***/ 3413: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; // EXPORTS __webpack_require__.d(__webpack_exports__, { A: () => (/* binding */ esm) }); // UNUSED EXPORTS: ReCAPTCHA // EXTERNAL MODULE: ./node_modules/react/index.js var react = __webpack_require__(6540); // EXTERNAL MODULE: ./node_modules/prop-types/index.js var prop_types = __webpack_require__(5556); var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types); ;// ./node_modules/react-google-recaptcha/lib/esm/recaptcha.js var _excluded = ["sitekey", "onChange", "theme", "type", "tabindex", "onExpired", "onErrored", "size", "stoken", "grecaptcha", "badge", "hl", "isolated"]; function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var ReCAPTCHA = /*#__PURE__*/function (_React$Component) { _inheritsLoose(ReCAPTCHA, _React$Component); function ReCAPTCHA() { var _this; _this = _React$Component.call(this) || this; _this.handleExpired = _this.handleExpired.bind(_assertThisInitialized(_this)); _this.handleErrored = _this.handleErrored.bind(_assertThisInitialized(_this)); _this.handleChange = _this.handleChange.bind(_assertThisInitialized(_this)); _this.handleRecaptchaRef = _this.handleRecaptchaRef.bind(_assertThisInitialized(_this)); return _this; } var _proto = ReCAPTCHA.prototype; _proto.getCaptchaFunction = function getCaptchaFunction(fnName) { if (this.props.grecaptcha) { if (this.props.grecaptcha.enterprise) { return this.props.grecaptcha.enterprise[fnName]; } return this.props.grecaptcha[fnName]; } return null; }; _proto.getValue = function getValue() { var getResponse = this.getCaptchaFunction("getResponse"); if (getResponse && this._widgetId !== undefined) { return getResponse(this._widgetId); } return null; }; _proto.getWidgetId = function getWidgetId() { if (this.props.grecaptcha && this._widgetId !== undefined) { return this._widgetId; } return null; }; _proto.execute = function execute() { var execute = this.getCaptchaFunction("execute"); if (execute && this._widgetId !== undefined) { return execute(this._widgetId); } else { this._executeRequested = true; } }; _proto.executeAsync = function executeAsync() { var _this2 = this; return new Promise(function (resolve, reject) { _this2.executionResolve = resolve; _this2.executionReject = reject; _this2.execute(); }); }; _proto.reset = function reset() { var resetter = this.getCaptchaFunction("reset"); if (resetter && this._widgetId !== undefined) { resetter(this._widgetId); } }; _proto.forceReset = function forceReset() { var resetter = this.getCaptchaFunction("reset"); if (resetter) { resetter(); } }; _proto.handleExpired = function handleExpired() { if (this.props.onExpired) { this.props.onExpired(); } else { this.handleChange(null); } }; _proto.handleErrored = function handleErrored() { if (this.props.onErrored) { this.props.onErrored(); } if (this.executionReject) { this.executionReject(); delete this.executionResolve; delete this.executionReject; } }; _proto.handleChange = function handleChange(token) { if (this.props.onChange) { this.props.onChange(token); } if (this.executionResolve) { this.executionResolve(token); delete this.executionReject; delete this.executionResolve; } }; _proto.explicitRender = function explicitRender() { var render = this.getCaptchaFunction("render"); if (render && this._widgetId === undefined) { var wrapper = document.createElement("div"); this._widgetId = render(wrapper, { sitekey: this.props.sitekey, callback: this.handleChange, theme: this.props.theme, type: this.props.type, tabindex: this.props.tabindex, "expired-callback": this.handleExpired, "error-callback": this.handleErrored, size: this.props.size, stoken: this.props.stoken, hl: this.props.hl, badge: this.props.badge, isolated: this.props.isolated }); this.captcha.appendChild(wrapper); } if (this._executeRequested && this.props.grecaptcha && this._widgetId !== undefined) { this._executeRequested = false; this.execute(); } }; _proto.componentDidMount = function componentDidMount() { this.explicitRender(); }; _proto.componentDidUpdate = function componentDidUpdate() { this.explicitRender(); }; _proto.handleRecaptchaRef = function handleRecaptchaRef(elem) { this.captcha = elem; }; _proto.render = function render() { // consume properties owned by the reCATPCHA, pass the rest to the div so the user can style it. /* eslint-disable no-unused-vars */ var _this$props = this.props, sitekey = _this$props.sitekey, onChange = _this$props.onChange, theme = _this$props.theme, type = _this$props.type, tabindex = _this$props.tabindex, onExpired = _this$props.onExpired, onErrored = _this$props.onErrored, size = _this$props.size, stoken = _this$props.stoken, grecaptcha = _this$props.grecaptcha, badge = _this$props.badge, hl = _this$props.hl, isolated = _this$props.isolated, childProps = _objectWithoutPropertiesLoose(_this$props, _excluded); /* eslint-enable no-unused-vars */ return /*#__PURE__*/react.createElement("div", _extends({}, childProps, { ref: this.handleRecaptchaRef })); }; return ReCAPTCHA; }(react.Component); ReCAPTCHA.displayName = "ReCAPTCHA"; ReCAPTCHA.propTypes = { sitekey: (prop_types_default()).string.isRequired, onChange: (prop_types_default()).func, grecaptcha: (prop_types_default()).object, theme: prop_types_default().oneOf(["dark", "light"]), type: prop_types_default().oneOf(["image", "audio"]), tabindex: (prop_types_default()).number, onExpired: (prop_types_default()).func, onErrored: (prop_types_default()).func, size: prop_types_default().oneOf(["compact", "normal", "invisible"]), stoken: (prop_types_default()).string, hl: (prop_types_default()).string, badge: prop_types_default().oneOf(["bottomright", "bottomleft", "inline"]), isolated: (prop_types_default()).bool }; ReCAPTCHA.defaultProps = { onChange: function onChange() {}, theme: "light", type: "image", tabindex: 0, size: "normal", badge: "bottomright" }; // EXTERNAL MODULE: ./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js var hoist_non_react_statics_cjs = __webpack_require__(4146); var hoist_non_react_statics_cjs_default = /*#__PURE__*/__webpack_require__.n(hoist_non_react_statics_cjs); ;// ./node_modules/react-async-script/lib/esm/async-script-loader.js function async_script_loader_extends() { async_script_loader_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return async_script_loader_extends.apply(this, arguments); } function async_script_loader_objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function async_script_loader_inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } var SCRIPT_MAP = {}; // A counter used to generate a unique id for each component that uses the function var idCount = 0; function makeAsyncScript(getScriptURL, options) { options = options || {}; return function wrapWithAsyncScript(WrappedComponent) { var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || "Component"; var AsyncScriptLoader = /*#__PURE__*/ function (_Component) { async_script_loader_inheritsLoose(AsyncScriptLoader, _Component); function AsyncScriptLoader(props, context) { var _this; _this = _Component.call(this, props, context) || this; _this.state = {}; _this.__scriptURL = ""; return _this; } var _proto = AsyncScriptLoader.prototype; _proto.asyncScriptLoaderGetScriptLoaderID = function asyncScriptLoaderGetScriptLoaderID() { if (!this.__scriptLoaderID) { this.__scriptLoaderID = "async-script-loader-" + idCount++; } return this.__scriptLoaderID; }; _proto.setupScriptURL = function setupScriptURL() { this.__scriptURL = typeof getScriptURL === "function" ? getScriptURL() : getScriptURL; return this.__scriptURL; }; _proto.asyncScriptLoaderHandleLoad = function asyncScriptLoaderHandleLoad(state) { var _this2 = this; // use reacts setState callback to fire props.asyncScriptOnLoad with new state/entry this.setState(state, function () { return _this2.props.asyncScriptOnLoad && _this2.props.asyncScriptOnLoad(_this2.state); }); }; _proto.asyncScriptLoaderTriggerOnScriptLoaded = function asyncScriptLoaderTriggerOnScriptLoaded() { var mapEntry = SCRIPT_MAP[this.__scriptURL]; if (!mapEntry || !mapEntry.loaded) { throw new Error("Script is not loaded."); } for (var obsKey in mapEntry.observers) { mapEntry.observers[obsKey](mapEntry); } delete window[options.callbackName]; }; _proto.componentDidMount = function componentDidMount() { var _this3 = this; var scriptURL = this.setupScriptURL(); var key = this.asyncScriptLoaderGetScriptLoaderID(); var _options = options, globalName = _options.globalName, callbackName = _options.callbackName, scriptId = _options.scriptId; // check if global object already attached to window if (globalName && typeof window[globalName] !== "undefined") { SCRIPT_MAP[scriptURL] = { loaded: true, observers: {} }; } // check if script loading already if (SCRIPT_MAP[scriptURL]) { var entry = SCRIPT_MAP[scriptURL]; // if loaded or errored then "finish" if (entry && (entry.loaded || entry.errored)) { this.asyncScriptLoaderHandleLoad(entry); return; } // if still loading then callback to observer queue entry.observers[key] = function (entry) { return _this3.asyncScriptLoaderHandleLoad(entry); }; return; } /* * hasn't started loading * start the "magic" * setup script to load and observers */ var observers = {}; observers[key] = function (entry) { return _this3.asyncScriptLoaderHandleLoad(entry); }; SCRIPT_MAP[scriptURL] = { loaded: false, observers: observers }; var script = document.createElement("script"); script.src = scriptURL; script.async = true; for (var attribute in options.attributes) { script.setAttribute(attribute, options.attributes[attribute]); } if (scriptId) { script.id = scriptId; } var callObserverFuncAndRemoveObserver = function callObserverFuncAndRemoveObserver(func) { if (SCRIPT_MAP[scriptURL]) { var mapEntry = SCRIPT_MAP[scriptURL]; var observersMap = mapEntry.observers; for (var obsKey in observersMap) { if (func(observersMap[obsKey])) { delete observersMap[obsKey]; } } } }; if (callbackName && typeof window !== "undefined") { window[callbackName] = function () { return _this3.asyncScriptLoaderTriggerOnScriptLoaded(); }; } script.onload = function () { var mapEntry = SCRIPT_MAP[scriptURL]; if (mapEntry) { mapEntry.loaded = true; callObserverFuncAndRemoveObserver(function (observer) { if (callbackName) { return false; } observer(mapEntry); return true; }); } }; script.onerror = function () { var mapEntry = SCRIPT_MAP[scriptURL]; if (mapEntry) { mapEntry.errored = true; callObserverFuncAndRemoveObserver(function (observer) { observer(mapEntry); return true; }); } }; document.body.appendChild(script); }; _proto.componentWillUnmount = function componentWillUnmount() { // Remove tag script var scriptURL = this.__scriptURL; if (options.removeOnUnmount === true) { var allScripts = document.getElementsByTagName("script"); for (var i = 0; i < allScripts.length; i += 1) { if (allScripts[i].src.indexOf(scriptURL) > -1) { if (allScripts[i].parentNode) { allScripts[i].parentNode.removeChild(allScripts[i]); } } } } // Clean the observer entry var mapEntry = SCRIPT_MAP[scriptURL]; if (mapEntry) { delete mapEntry.observers[this.asyncScriptLoaderGetScriptLoaderID()]; if (options.removeOnUnmount === true) { delete SCRIPT_MAP[scriptURL]; } } }; _proto.render = function render() { var globalName = options.globalName; // remove asyncScriptOnLoad from childProps var _this$props = this.props, asyncScriptOnLoad = _this$props.asyncScriptOnLoad, forwardedRef = _this$props.forwardedRef, childProps = async_script_loader_objectWithoutPropertiesLoose(_this$props, ["asyncScriptOnLoad", "forwardedRef"]); // eslint-disable-line no-unused-vars if (globalName && typeof window !== "undefined") { childProps[globalName] = typeof window[globalName] !== "undefined" ? window[globalName] : undefined; } childProps.ref = forwardedRef; return (0,react.createElement)(WrappedComponent, childProps); }; return AsyncScriptLoader; }(react.Component); // Note the second param "ref" provided by React.forwardRef. // We can pass it along to AsyncScriptLoader as a regular prop, e.g. "forwardedRef" // And it can then be attached to the Component. var ForwardedComponent = (0,react.forwardRef)(function (props, ref) { return (0,react.createElement)(AsyncScriptLoader, async_script_loader_extends({}, props, { forwardedRef: ref })); }); ForwardedComponent.displayName = "AsyncScriptLoader(" + wrappedComponentName + ")"; ForwardedComponent.propTypes = { asyncScriptOnLoad: (prop_types_default()).func }; return hoist_non_react_statics_cjs_default()(ForwardedComponent, WrappedComponent); }; } ;// ./node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js var callbackName = "onloadcallback"; var globalName = "grecaptcha"; function getOptions() { return typeof window !== "undefined" && window.recaptchaOptions || {}; } function getURL() { var dynamicOptions = getOptions(); var hostname = dynamicOptions.useRecaptchaNet ? "recaptcha.net" : "www.google.com"; if (dynamicOptions.enterprise) { return "https://" + hostname + "/recaptcha/enterprise.js?onload=" + callbackName + "&render=explicit"; } return "https://" + hostname + "/recaptcha/api.js?onload=" + callbackName + "&render=explicit"; } /* harmony default export */ const recaptcha_wrapper = (makeAsyncScript(getURL, { callbackName: callbackName, globalName: globalName, attributes: getOptions().nonce ? { nonce: getOptions().nonce } : {} })(ReCAPTCHA)); ;// ./node_modules/react-google-recaptcha/lib/esm/index.js /* harmony default export */ const esm = (recaptcha_wrapper); /***/ }), /***/ 4146: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; var reactIs = __webpack_require__(4363); /** * Copyright 2015, Yahoo! Inc. * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. */ var REACT_STATICS = { childContextTypes: true, contextType: true, contextTypes: true, defaultProps: true, displayName: true, getDefaultProps: true, getDerivedStateFromError: true, getDerivedStateFromProps: true, mixins: true, propTypes: true, type: true }; var KNOWN_STATICS = { name: true, length: true, prototype: true, caller: true, callee: true, arguments: true, arity: true }; var FORWARD_REF_STATICS = { '$$typeof': true, render: true, defaultProps: true, displayName: true, propTypes: true }; var MEMO_STATICS = { '$$typeof': true, compare: true, defaultProps: true, displayName: true, propTypes: true, type: true }; var TYPE_STATICS = {}; TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS; TYPE_STATICS[reactIs.Memo] = MEMO_STATICS; function getStatics(component) { // React v16.11 and below if (reactIs.isMemo(component)) { return MEMO_STATICS; } // React v16.12 and above return TYPE_STATICS[component['$$typeof']] || REACT_STATICS; } var defineProperty = Object.defineProperty; var getOwnPropertyNames = Object.getOwnPropertyNames; var getOwnPropertySymbols = Object.getOwnPropertySymbols; var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var getPrototypeOf = Object.getPrototypeOf; var objectPrototype = Object.prototype; function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) { if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components if (objectPrototype) { var inheritedComponent = getPrototypeOf(sourceComponent); if (inheritedComponent && inheritedComponent !== objectPrototype) { hoistNonReactStatics(targetComponent, inheritedComponent, blacklist); } } var keys = getOwnPropertyNames(sourceComponent); if (getOwnPropertySymbols) { keys = keys.concat(getOwnPropertySymbols(sourceComponent)); } var targetStatics = getStatics(targetComponent); var sourceStatics = getStatics(sourceComponent); for (var i = 0; i < keys.length; ++i) { var key = keys[i]; if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) { var descriptor = getOwnPropertyDescriptor(sourceComponent, key); try { // Avoid failures from read-only properties defineProperty(targetComponent, key, descriptor); } catch (e) {} } } } return targetComponent; } module.exports = hoistNonReactStatics; /***/ }), /***/ 4363: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; if (true) { module.exports = __webpack_require__(2799); } else // removed by dead control flow {} /***/ }), /***/ 5556: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ if (false) // removed by dead control flow { var throwOnDirectAccess, ReactIs; } else { // By explicitly using `prop-types` you are opting into new production behavior. // http://fb.me/prop-types-in-prod module.exports = __webpack_require__(2694)(); } /***/ }), /***/ 6925: /***/ ((module) => { "use strict"; /** * Copyright (c) 2013-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; module.exports = ReactPropTypesSecret; /***/ }), /***/ 6929: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ A: () => (/* binding */ FormField) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6540); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6942); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; var getConditionalProps = function (group, disabled) { var props = {}; if (group && disabled) { props.disabled = true; } return props; }; var getConditionalLabelProps = function (group, id) { var props = {}; if (!group && id) { props.htmlFor = id; } return props; }; var getOptions = function (group, invalid, disabled, size, id, errors, helper) { var options = { size: size, disabled: disabled, }; if (!group) options.id = id; var ariaDescribedby = ""; if (!group && invalid) options.invalid = invalid; if (helper) ariaDescribedby += "helper-form-field-".concat(id, " "); if (errors) ariaDescribedby += "error-form-field-".concat(id); if (ariaDescribedby.length > 0) options["aria-describedby"] = ariaDescribedby; return options; }; /** * * Demos: * * - [RDS Form Field](https://design.ramseysolutions.com/storybook/?path=/story/design-system-form-field--default) * * API: * * - [RDS Form Field API](https://design.ramseysolutions.com/components/form-field/?tab=technologies#react) */ var FormField = function (_a) { var _b, _c; var children = _a.children, className = _a.className, _d = _a.disabled, disabled = _d === void 0 ? false : _d, errors = _a.errors, _e = _a.group, group = _e === void 0 ? false : _e, helper = _a.helper, id = _a.id, _f = _a.invalid, invalid = _f === void 0 ? false : _f, _g = _a.isOnDarkCanvas, isOnDarkCanvas = _g === void 0 ? false : _g, label = _a.label, length = _a.length, note = _a.note, _h = _a.size, size = _h === void 0 ? "md" : _h, rest = __rest(_a, ["children", "className", "disabled", "errors", "group", "helper", "id", "invalid", "isOnDarkCanvas", "label", "length", "note", "size"]); var uuid = id || "".concat(Math.random().toString(36).slice(2, 16)); var options = getOptions(group, invalid, disabled, size, uuid, errors, helper); var formFieldClasses = classnames__WEBPACK_IMPORTED_MODULE_1___default()("rds-FormField", (_b = {}, _b["rds-FormField--".concat(size)] = size !== "md", _b["is-disabled"] = disabled, _b["is-invalid"] = invalid, _b["on-darkCanvas"] = isOnDarkCanvas, _b), className); var formFieldControlClasses = classnames__WEBPACK_IMPORTED_MODULE_1___default()("rds-FormField-control", (_c = {}, _c["rds-FormField-control--".concat(length)] = length, _c)); var Element = group ? "fieldset" : "div"; var LabelElement = group ? "legend" : "label"; var showErrors = invalid && errors && !disabled; return (react__WEBPACK_IMPORTED_MODULE_0__.createElement(Element, __assign({}, rest, getConditionalProps(group, disabled), { className: formFieldClasses }), label && (react__WEBPACK_IMPORTED_MODULE_0__.createElement(LabelElement, __assign({ className: "rds-FormField-label" }, getConditionalLabelProps(group, uuid)), label, note && react__WEBPACK_IMPORTED_MODULE_0__.createElement("span", { className: "rds-FormField-note" }, note))), react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { className: formFieldControlClasses }, children(options)), helper && (react__WEBPACK_IMPORTED_MODULE_0__.createElement("p", { id: "helper-form-field-".concat(uuid), className: "rds-FormField-helper" }, helper)), showErrors && (react__WEBPACK_IMPORTED_MODULE_0__.createElement("div", { id: "error-form-field-".concat(uuid), role: "alert" }, errors.map(function (error, i) { return (react__WEBPACK_IMPORTED_MODULE_0__.createElement("p", { key: i, className: "rds-FormField-error" }, error)); }))))); }; FormField.displayName = "FormField"; //# sourceMappingURL=FormField.esm.js.map /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QixnREFBbUIsV0FBVyxpQ0FBaUM7QUFDbkYsUUFBUSxnREFBbUIsVUFBVSxvQ0FBb0M7QUFDekUsbUJBQW1CLGdEQUFtQixRQUFRLDBFQUEwRTtBQUN4SCx1QkFBdUIsZ0RBQW1CLFVBQVUscURBQXFELG1DQUFtQyxRQUFRLGdEQUFtQixRQUFRLDBDQUEwQyxZQUFZO0FBQ3JPO0FBQ0E7O0FBRWdDO0FBQ2hDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvQHJhbXNleS1kZXNpZ24tc3lzdGVtL3RleHQvZGlzdC9UZXh0LmVzbS5qcyIsIndlYnBhY2s6Ly9yYW1zZXktcGx1cy1mb3Jtcy8uL25vZGVfbW9kdWxlcy9AcmFtc2V5LWRlc2lnbi1zeXN0ZW0vc3RhY2svZGlzdC9TdGFjay5lc20uanMiLCJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzIiwid2VicGFjazovL3JhbXNleS1wbHVzLWZvcm1zLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWdvb2dsZS1yZWNhcHRjaGEvbGliL2VzbS9yZWNhcHRjaGEuanMiLCJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvcmVhY3QtYXN5bmMtc2NyaXB0L2xpYi9lc20vYXN5bmMtc2NyaXB0LWxvYWRlci5qcyIsIndlYnBhY2s6Ly9yYW1zZXktcGx1cy1mb3Jtcy8uL25vZGVfbW9kdWxlcy9yZWFjdC1nb29nbGUtcmVjYXB0Y2hhL2xpYi9lc20vcmVjYXB0Y2hhLXdyYXBwZXIuanMiLCJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvcmVhY3QtZ29vZ2xlLXJlY2FwdGNoYS9saWIvZXNtL2luZGV4LmpzIiwid2VicGFjazovL3JhbXNleS1wbHVzLWZvcm1zLy4vbm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL2Rpc3QvaG9pc3Qtbm9uLXJlYWN0LXN0YXRpY3MuY2pzLmpzIiwid2VicGFjazovL3JhbXNleS1wbHVzLWZvcm1zLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL3JhbXNleS1wbHVzLWZvcm1zLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvQHJhbXNleS1kZXNpZ24tc3lzdGVtL2Zvcm0tZmllbGQvZGlzdC9Gb3JtRmllbGQuZXNtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcblxyXG52YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG50eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcblxuLyoqXG4gKlxuICogRGVtb3M6XG4gKlxuICogLSBbUkRTIFRleHRdKGh0dHBzOi8vZGVzaWduLnJhbXNleXNvbHV0aW9ucy5jb20vc3Rvcnlib29rLz9wYXRoPS9zdG9yeS9kZXNpZ24tc3lzdGVtLXRleHQtLWRlZmF1bHQpXG4gKlxuICogQVBJOlxuICpcbiAqIC0gW1JEUyBUZXh0IEFQSV0oaHR0cHM6Ly9kZXNpZ24ucmFtc2V5c29sdXRpb25zLmNvbS9jb21wb25lbnRzL3RleHQvP3RhYj10ZWNobm9sb2dpZXMjcmVhY3QpXG4gKi9cbnZhciBUZXh0ID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgdmFyIF9iO1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsIF9jID0gX2EuY29sb3IsIGNvbG9yID0gX2MgPT09IHZvaWQgMCA/IFwibm9ybWFsXCIgOiBfYywgZWxlbWVudCA9IF9hLmVsZW1lbnQsIF9kID0gX2EuaXNPbkRhcmtDYW52YXMsIGlzT25EYXJrQ2FudmFzID0gX2QgPT09IHZvaWQgMCA/IGZhbHNlIDogX2QsIF9lID0gX2Euc2l6ZSwgc2l6ZSA9IF9lID09PSB2b2lkIDAgPyBcImJvZHlNZWRpdW1cIiA6IF9lLCByZXN0ID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiZWxlbWVudFwiLCBcImlzT25EYXJrQ2FudmFzXCIsIFwic2l6ZVwiXSk7XG4gICAgdmFyIHRleHRDbGFzc2VzID0gY2xhc3NOYW1lcyhcInJkcy1UZXh0XCIsIChfYiA9IHt9LFxuICAgICAgICBfYltcInJkcy1UZXh0LS1cIi5jb25jYXQoc2l6ZSldID0gc2l6ZSAhPT0gXCJib2R5TWVkaXVtXCIsXG4gICAgICAgIF9iW1wicmRzLVRleHQtLVwiLmNvbmNhdChjb2xvcildID0gY29sb3IgIT09IFwibm9ybWFsXCIsXG4gICAgICAgIF9iW1wib24tZGFya0NhbnZhc1wiXSA9IGlzT25EYXJrQ2FudmFzLFxuICAgICAgICBfYiksIGNsYXNzTmFtZSk7XG4gICAgdmFyIEVsZW1lbnQgPSBlbGVtZW50IHx8IFwicFwiO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50LCBfX2Fzc2lnbih7IGNsYXNzTmFtZTogdGV4dENsYXNzZXMgfSwgcmVzdCksIGNoaWxkcmVuKSk7XG59O1xuVGV4dC5kaXNwbGF5TmFtZSA9IFwiVGV4dFwiO1xuXG5leHBvcnQgeyBUZXh0IGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRleHQuZXNtLmpzLm1hcFxuIiwiaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxuXHJcbnZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbnR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xuXG4vKipcbiAqXG4gKiBEZW1vczpcbiAqXG4gKiAtIFtSRFMgU3RhY2tdKGh0dHBzOi8vZGVzaWduLnJhbXNleXNvbHV0aW9ucy5jb20vc3Rvcnlib29rLz9wYXRoPS9zdG9yeS9kZXNpZ24tc3lzdGVtLXN0YWNrLS1kZWZhdWx0KVxuICpcbiAqIEFQSTpcbiAqXG4gKiAtIFtSRFMgU3RhY2sgQVBJXShodHRwczovL2Rlc2lnbi5yYW1zZXlzb2x1dGlvbnMuY29tL2NvbXBvbmVudHMvc3RhY2svP3RhYj10ZWNobm9sb2dpZXMjcmVhY3QpXG4gKi9cbnZhciBTdGFjayA9IGZ1bmN0aW9uIChfYSkge1xuICAgIHZhciBfYjtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBlbGVtZW50ID0gX2EuZWxlbWVudCwgX2MgPSBfYS5ob3Jpem9udGFsQWxpZ25tZW50LCBob3Jpem9udGFsQWxpZ25tZW50ID0gX2MgPT09IHZvaWQgMCA/IFwibGVmdFwiIDogX2MsIF9kID0gX2Euc3BhY2luZywgc3BhY2luZyA9IF9kID09PSB2b2lkIDAgPyBcIm1kXCIgOiBfZCwgX2UgPSBfYS52ZXJ0aWNhbCwgdmVydGljYWwgPSBfZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZSwgX2YgPSBfYS52ZXJ0aWNhbEFsaWdubWVudCwgdmVydGljYWxBbGlnbm1lbnQgPSBfZiA9PT0gdm9pZCAwID8gXCJjZW50ZXJcIiA6IF9mLCBfZyA9IF9hLndyYXAsIHdyYXAgPSBfZyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9nLCByZXN0ID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImVsZW1lbnRcIiwgXCJob3Jpem9udGFsQWxpZ25tZW50XCIsIFwic3BhY2luZ1wiLCBcInZlcnRpY2FsXCIsIFwidmVydGljYWxBbGlnbm1lbnRcIiwgXCJ3cmFwXCJdKTtcbiAgICB2YXIgc3RhY2tDbGFzc2VzID0gY2xhc3NOYW1lcyhcInJkcy1TdGFja1wiLCAoX2IgPSB7XG4gICAgICAgICAgICBcInJkcy1TdGFjay0tdmVydGljYWxcIjogdmVydGljYWxcbiAgICAgICAgfSxcbiAgICAgICAgX2JbXCJyZHMtU3RhY2stLVwiLmNvbmNhdChob3Jpem9udGFsQWxpZ25tZW50LCBcIkhvcml6b250YWxBbGlnbm1lbnRcIildID0gaG9yaXpvbnRhbEFsaWdubWVudCAhPT0gXCJsZWZ0XCIsXG4gICAgICAgIF9iW1wicmRzLVN0YWNrLS1cIi5jb25jYXQoc3BhY2luZywgXCJTcGFjaW5nXCIpXSA9IHNwYWNpbmcgIT09IFwibWRcIixcbiAgICAgICAgX2JbXCJyZHMtU3RhY2stLVwiLmNvbmNhdCh2ZXJ0aWNhbEFsaWdubWVudCwgXCJWZXJ0aWNhbEFsaWdubWVudFwiKV0gPSB2ZXJ0aWNhbEFsaWdubWVudCAhPT0gXCJjZW50ZXJcIixcbiAgICAgICAgX2JbXCJyZHMtU3RhY2stLW5vV3JhcFwiXSA9ICF3cmFwLFxuICAgICAgICBfYiksIGNsYXNzTmFtZSk7XG4gICAgdmFyIEVsZW1lbnQgPSBlbGVtZW50IHx8IFwiZGl2XCI7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9fYXNzaWduKHsgY2xhc3NOYW1lOiBzdGFja0NsYXNzZXMgfSwgcmVzdCksIGNoaWxkcmVuKSk7XG59O1xuU3RhY2suZGlzcGxheU5hbWUgPSBcIlN0YWNrXCI7XG5cbmV4cG9ydCB7IFN0YWNrIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YWNrLmVzbS5qcy5tYXBcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge31cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQoKSB7fVxuZW1wdHlGdW5jdGlvbldpdGhSZXNldC5yZXNldFdhcm5pbmdDYWNoZSA9IGVtcHR5RnVuY3Rpb247XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIHNoaW0ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICBpZiAoc2VjcmV0ID09PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgLy8gSXQgaXMgc3RpbGwgc2FmZSB3aGVuIGNhbGxlZCBmcm9tIFJlYWN0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgJ1VzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgKTtcbiAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB0aHJvdyBlcnI7XG4gIH07XG4gIHNoaW0uaXNSZXF1aXJlZCA9IHNoaW07XG4gIGZ1bmN0aW9uIGdldFNoaW0oKSB7XG4gICAgcmV0dXJuIHNoaW07XG4gIH07XG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogc2hpbSxcbiAgICBiaWdpbnQ6IHNoaW0sXG4gICAgYm9vbDogc2hpbSxcbiAgICBmdW5jOiBzaGltLFxuICAgIG51bWJlcjogc2hpbSxcbiAgICBvYmplY3Q6IHNoaW0sXG4gICAgc3RyaW5nOiBzaGltLFxuICAgIHN5bWJvbDogc2hpbSxcblxuICAgIGFueTogc2hpbSxcbiAgICBhcnJheU9mOiBnZXRTaGltLFxuICAgIGVsZW1lbnQ6IHNoaW0sXG4gICAgZWxlbWVudFR5cGU6IHNoaW0sXG4gICAgaW5zdGFuY2VPZjogZ2V0U2hpbSxcbiAgICBub2RlOiBzaGltLFxuICAgIG9iamVjdE9mOiBnZXRTaGltLFxuICAgIG9uZU9mOiBnZXRTaGltLFxuICAgIG9uZU9mVHlwZTogZ2V0U2hpbSxcbiAgICBzaGFwZTogZ2V0U2hpbSxcbiAgICBleGFjdDogZ2V0U2hpbSxcblxuICAgIGNoZWNrUHJvcFR5cGVzOiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0LFxuICAgIHJlc2V0V2FybmluZ0NhY2hlOiBlbXB0eUZ1bmN0aW9uXG4gIH07XG5cbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7dmFyIGI9XCJmdW5jdGlvblwiPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvcixjPWI/U3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIik6NjAxMDMsZD1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIik6NjAxMDYsZT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKTo2MDEwNyxmPWI/U3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpOjYwMTA4LGc9Yj9TeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIik6NjAxMTQsaD1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm92aWRlclwiKTo2MDEwOSxrPWI/U3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIik6NjAxMTAsbD1iP1N5bWJvbC5mb3IoXCJyZWFjdC5hc3luY19tb2RlXCIpOjYwMTExLG09Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29uY3VycmVudF9tb2RlXCIpOjYwMTExLG49Yj9TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIik6NjAxMTIscD1iP1N5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKTo2MDExMyxxPWI/XG5TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKTo2MDEyMCxyPWI/U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIik6NjAxMTUsdD1iP1N5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpOjYwMTE2LHY9Yj9TeW1ib2wuZm9yKFwicmVhY3QuYmxvY2tcIik6NjAxMjEsdz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mdW5kYW1lbnRhbFwiKTo2MDExNyx4PWI/U3ltYm9sLmZvcihcInJlYWN0LnJlc3BvbmRlclwiKTo2MDExOCx5PWI/U3ltYm9sLmZvcihcInJlYWN0LnNjb3BlXCIpOjYwMTE5O1xuZnVuY3Rpb24geihhKXtpZihcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hKXt2YXIgdT1hLiQkdHlwZW9mO3N3aXRjaCh1KXtjYXNlIGM6c3dpdGNoKGE9YS50eXBlLGEpe2Nhc2UgbDpjYXNlIG06Y2FzZSBlOmNhc2UgZzpjYXNlIGY6Y2FzZSBwOnJldHVybiBhO2RlZmF1bHQ6c3dpdGNoKGE9YSYmYS4kJHR5cGVvZixhKXtjYXNlIGs6Y2FzZSBuOmNhc2UgdDpjYXNlIHI6Y2FzZSBoOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuIHV9fWNhc2UgZDpyZXR1cm4gdX19fWZ1bmN0aW9uIEEoYSl7cmV0dXJuIHooYSk9PT1tfWV4cG9ydHMuQXN5bmNNb2RlPWw7ZXhwb3J0cy5Db25jdXJyZW50TW9kZT1tO2V4cG9ydHMuQ29udGV4dENvbnN1bWVyPWs7ZXhwb3J0cy5Db250ZXh0UHJvdmlkZXI9aDtleHBvcnRzLkVsZW1lbnQ9YztleHBvcnRzLkZvcndhcmRSZWY9bjtleHBvcnRzLkZyYWdtZW50PWU7ZXhwb3J0cy5MYXp5PXQ7ZXhwb3J0cy5NZW1vPXI7ZXhwb3J0cy5Qb3J0YWw9ZDtcbmV4cG9ydHMuUHJvZmlsZXI9ZztleHBvcnRzLlN0cmljdE1vZGU9ZjtleHBvcnRzLlN1c3BlbnNlPXA7ZXhwb3J0cy5pc0FzeW5jTW9kZT1mdW5jdGlvbihhKXtyZXR1cm4gQShhKXx8eihhKT09PWx9O2V4cG9ydHMuaXNDb25jdXJyZW50TW9kZT1BO2V4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1rfTtleHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09aH07ZXhwb3J0cy5pc0VsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmYS4kJHR5cGVvZj09PWN9O2V4cG9ydHMuaXNGb3J3YXJkUmVmPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09bn07ZXhwb3J0cy5pc0ZyYWdtZW50PWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZX07ZXhwb3J0cy5pc0xhenk9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT10fTtcbmV4cG9ydHMuaXNNZW1vPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09cn07ZXhwb3J0cy5pc1BvcnRhbD1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWR9O2V4cG9ydHMuaXNQcm9maWxlcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWd9O2V4cG9ydHMuaXNTdHJpY3RNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Zn07ZXhwb3J0cy5pc1N1c3BlbnNlPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09cH07XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZT1mdW5jdGlvbihhKXtyZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGF8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhfHxhPT09ZXx8YT09PW18fGE9PT1nfHxhPT09Znx8YT09PXB8fGE9PT1xfHxcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiYoYS4kJHR5cGVvZj09PXR8fGEuJCR0eXBlb2Y9PT1yfHxhLiQkdHlwZW9mPT09aHx8YS4kJHR5cGVvZj09PWt8fGEuJCR0eXBlb2Y9PT1ufHxhLiQkdHlwZW9mPT09d3x8YS4kJHR5cGVvZj09PXh8fGEuJCR0eXBlb2Y9PT15fHxhLiQkdHlwZW9mPT09dil9O2V4cG9ydHMudHlwZU9mPXo7XG4iLCJ2YXIgX2V4Y2x1ZGVkID0gW1wic2l0ZWtleVwiLCBcIm9uQ2hhbmdlXCIsIFwidGhlbWVcIiwgXCJ0eXBlXCIsIFwidGFiaW5kZXhcIiwgXCJvbkV4cGlyZWRcIiwgXCJvbkVycm9yZWRcIiwgXCJzaXplXCIsIFwic3Rva2VuXCIsIFwiZ3JlY2FwdGNoYVwiLCBcImJhZGdlXCIsIFwiaGxcIiwgXCJpc29sYXRlZFwiXTtcbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbnZhciBSZUNBUFRDSEEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUmVDQVBUQ0hBLCBfUmVhY3QkQ29tcG9uZW50KTtcbiAgZnVuY3Rpb24gUmVDQVBUQ0hBKCkge1xuICAgIHZhciBfdGhpcztcbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLmhhbmRsZUV4cGlyZWQgPSBfdGhpcy5oYW5kbGVFeHBpcmVkLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIF90aGlzLmhhbmRsZUVycm9yZWQgPSBfdGhpcy5oYW5kbGVFcnJvcmVkLmJpbmQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIF90aGlzLmhhbmRsZUNoYW5nZSA9IF90aGlzLmhhbmRsZUNoYW5nZS5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICBfdGhpcy5oYW5kbGVSZWNhcHRjaGFSZWYgPSBfdGhpcy5oYW5kbGVSZWNhcHRjaGFSZWYuYmluZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIHZhciBfcHJvdG8gPSBSZUNBUFRDSEEucHJvdG90eXBlO1xuICBfcHJvdG8uZ2V0Q2FwdGNoYUZ1bmN0aW9uID0gZnVuY3Rpb24gZ2V0Q2FwdGNoYUZ1bmN0aW9uKGZuTmFtZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmdyZWNhcHRjaGEpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmdyZWNhcHRjaGEuZW50ZXJwcmlzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5ncmVjYXB0Y2hhLmVudGVycHJpc2VbZm5OYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmdyZWNhcHRjaGFbZm5OYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIF9wcm90by5nZXRWYWx1ZSA9IGZ1bmN0aW9uIGdldFZhbHVlKCkge1xuICAgIHZhciBnZXRSZXNwb25zZSA9IHRoaXMuZ2V0Q2FwdGNoYUZ1bmN0aW9uKFwiZ2V0UmVzcG9uc2VcIik7XG4gICAgaWYgKGdldFJlc3BvbnNlICYmIHRoaXMuX3dpZGdldElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBnZXRSZXNwb25zZSh0aGlzLl93aWRnZXRJZCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuICBfcHJvdG8uZ2V0V2lkZ2V0SWQgPSBmdW5jdGlvbiBnZXRXaWRnZXRJZCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5ncmVjYXB0Y2hhICYmIHRoaXMuX3dpZGdldElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl93aWRnZXRJZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIF9wcm90by5leGVjdXRlID0gZnVuY3Rpb24gZXhlY3V0ZSgpIHtcbiAgICB2YXIgZXhlY3V0ZSA9IHRoaXMuZ2V0Q2FwdGNoYUZ1bmN0aW9uKFwiZXhlY3V0ZVwiKTtcbiAgICBpZiAoZXhlY3V0ZSAmJiB0aGlzLl93aWRnZXRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZSh0aGlzLl93aWRnZXRJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4ZWN1dGVSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgX3Byb3RvLmV4ZWN1dGVBc3luYyA9IGZ1bmN0aW9uIGV4ZWN1dGVBc3luYygpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMyLmV4ZWN1dGlvblJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgX3RoaXMyLmV4ZWN1dGlvblJlamVjdCA9IHJlamVjdDtcbiAgICAgIF90aGlzMi5leGVjdXRlKCk7XG4gICAgfSk7XG4gIH07XG4gIF9wcm90by5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIHZhciByZXNldHRlciA9IHRoaXMuZ2V0Q2FwdGNoYUZ1bmN0aW9uKFwicmVzZXRcIik7XG4gICAgaWYgKHJlc2V0dGVyICYmIHRoaXMuX3dpZGdldElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc2V0dGVyKHRoaXMuX3dpZGdldElkKTtcbiAgICB9XG4gIH07XG4gIF9wcm90by5mb3JjZVJlc2V0ID0gZnVuY3Rpb24gZm9yY2VSZXNldCgpIHtcbiAgICB2YXIgcmVzZXR0ZXIgPSB0aGlzLmdldENhcHRjaGFGdW5jdGlvbihcInJlc2V0XCIpO1xuICAgIGlmIChyZXNldHRlcikge1xuICAgICAgcmVzZXR0ZXIoKTtcbiAgICB9XG4gIH07XG4gIF9wcm90by5oYW5kbGVFeHBpcmVkID0gZnVuY3Rpb24gaGFuZGxlRXhwaXJlZCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vbkV4cGlyZWQpIHtcbiAgICAgIHRoaXMucHJvcHMub25FeHBpcmVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlKG51bGwpO1xuICAgIH1cbiAgfTtcbiAgX3Byb3RvLmhhbmRsZUVycm9yZWQgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcmVkKCkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uRXJyb3JlZCkge1xuICAgICAgdGhpcy5wcm9wcy5vbkVycm9yZWQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZXhlY3V0aW9uUmVqZWN0KSB7XG4gICAgICB0aGlzLmV4ZWN1dGlvblJlamVjdCgpO1xuICAgICAgZGVsZXRlIHRoaXMuZXhlY3V0aW9uUmVzb2x2ZTtcbiAgICAgIGRlbGV0ZSB0aGlzLmV4ZWN1dGlvblJlamVjdDtcbiAgICB9XG4gIH07XG4gIF9wcm90by5oYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UodG9rZW4pIHtcbiAgICBpZiAodGhpcy5wcm9wcy5vbkNoYW5nZSkge1xuICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0b2tlbik7XG4gICAgfVxuICAgIGlmICh0aGlzLmV4ZWN1dGlvblJlc29sdmUpIHtcbiAgICAgIHRoaXMuZXhlY3V0aW9uUmVzb2x2ZSh0b2tlbik7XG4gICAgICBkZWxldGUgdGhpcy5leGVjdXRpb25SZWplY3Q7XG4gICAgICBkZWxldGUgdGhpcy5leGVjdXRpb25SZXNvbHZlO1xuICAgIH1cbiAgfTtcbiAgX3Byb3RvLmV4cGxpY2l0UmVuZGVyID0gZnVuY3Rpb24gZXhwbGljaXRSZW5kZXIoKSB7XG4gICAgdmFyIHJlbmRlciA9IHRoaXMuZ2V0Q2FwdGNoYUZ1bmN0aW9uKFwicmVuZGVyXCIpO1xuICAgIGlmIChyZW5kZXIgJiYgdGhpcy5fd2lkZ2V0SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGhpcy5fd2lkZ2V0SWQgPSByZW5kZXIod3JhcHBlciwge1xuICAgICAgICBzaXRla2V5OiB0aGlzLnByb3BzLnNpdGVrZXksXG4gICAgICAgIGNhbGxiYWNrOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgICAgdGhlbWU6IHRoaXMucHJvcHMudGhlbWUsXG4gICAgICAgIHR5cGU6IHRoaXMucHJvcHMudHlwZSxcbiAgICAgICAgdGFiaW5kZXg6IHRoaXMucHJvcHMudGFiaW5kZXgsXG4gICAgICAgIFwiZXhwaXJlZC1jYWxsYmFja1wiOiB0aGlzLmhhbmRsZUV4cGlyZWQsXG4gICAgICAgIFwiZXJyb3ItY2FsbGJhY2tcIjogdGhpcy5oYW5kbGVFcnJvcmVkLFxuICAgICAgICBzaXplOiB0aGlzLnByb3BzLnNpemUsXG4gICAgICAgIHN0b2tlbjogdGhpcy5wcm9wcy5zdG9rZW4sXG4gICAgICAgIGhsOiB0aGlzLnByb3BzLmhsLFxuICAgICAgICBiYWRnZTogdGhpcy5wcm9wcy5iYWRnZSxcbiAgICAgICAgaXNvbGF0ZWQ6IHRoaXMucHJvcHMuaXNvbGF0ZWRcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYXB0Y2hhLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZXhlY3V0ZVJlcXVlc3RlZCAmJiB0aGlzLnByb3BzLmdyZWNhcHRjaGEgJiYgdGhpcy5fd2lkZ2V0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZXhlY3V0ZVJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5leGVjdXRlKCk7XG4gICAgfVxuICB9O1xuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLmV4cGxpY2l0UmVuZGVyKCk7XG4gIH07XG4gIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdGhpcy5leHBsaWNpdFJlbmRlcigpO1xuICB9O1xuICBfcHJvdG8uaGFuZGxlUmVjYXB0Y2hhUmVmID0gZnVuY3Rpb24gaGFuZGxlUmVjYXB0Y2hhUmVmKGVsZW0pIHtcbiAgICB0aGlzLmNhcHRjaGEgPSBlbGVtO1xuICB9O1xuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIC8vIGNvbnN1bWUgcHJvcGVydGllcyBvd25lZCBieSB0aGUgcmVDQVRQQ0hBLCBwYXNzIHRoZSByZXN0IHRvIHRoZSBkaXYgc28gdGhlIHVzZXIgY2FuIHN0eWxlIGl0LlxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgIHNpdGVrZXkgPSBfdGhpcyRwcm9wcy5zaXRla2V5LFxuICAgICAgb25DaGFuZ2UgPSBfdGhpcyRwcm9wcy5vbkNoYW5nZSxcbiAgICAgIHRoZW1lID0gX3RoaXMkcHJvcHMudGhlbWUsXG4gICAgICB0eXBlID0gX3RoaXMkcHJvcHMudHlwZSxcbiAgICAgIHRhYmluZGV4ID0gX3RoaXMkcHJvcHMudGFiaW5kZXgsXG4gICAgICBvbkV4cGlyZWQgPSBfdGhpcyRwcm9wcy5vbkV4cGlyZWQsXG4gICAgICBvbkVycm9yZWQgPSBfdGhpcyRwcm9wcy5vbkVycm9yZWQsXG4gICAgICBzaXplID0gX3RoaXMkcHJvcHMuc2l6ZSxcbiAgICAgIHN0b2tlbiA9IF90aGlzJHByb3BzLnN0b2tlbixcbiAgICAgIGdyZWNhcHRjaGEgPSBfdGhpcyRwcm9wcy5ncmVjYXB0Y2hhLFxuICAgICAgYmFkZ2UgPSBfdGhpcyRwcm9wcy5iYWRnZSxcbiAgICAgIGhsID0gX3RoaXMkcHJvcHMuaGwsXG4gICAgICBpc29sYXRlZCA9IF90aGlzJHByb3BzLmlzb2xhdGVkLFxuICAgICAgY2hpbGRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzLCBfZXhjbHVkZWQpO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe30sIGNoaWxkUHJvcHMsIHtcbiAgICAgIHJlZjogdGhpcy5oYW5kbGVSZWNhcHRjaGFSZWZcbiAgICB9KSk7XG4gIH07XG4gIHJldHVybiBSZUNBUFRDSEE7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5leHBvcnQgeyBSZUNBUFRDSEEgYXMgZGVmYXVsdCB9O1xuUmVDQVBUQ0hBLmRpc3BsYXlOYW1lID0gXCJSZUNBUFRDSEFcIjtcblJlQ0FQVENIQS5wcm9wVHlwZXMgPSB7XG4gIHNpdGVrZXk6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICBncmVjYXB0Y2hhOiBQcm9wVHlwZXMub2JqZWN0LFxuICB0aGVtZTogUHJvcFR5cGVzLm9uZU9mKFtcImRhcmtcIiwgXCJsaWdodFwiXSksXG4gIHR5cGU6IFByb3BUeXBlcy5vbmVPZihbXCJpbWFnZVwiLCBcImF1ZGlvXCJdKSxcbiAgdGFiaW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG4gIG9uRXhwaXJlZDogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRXJyb3JlZDogUHJvcFR5cGVzLmZ1bmMsXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihbXCJjb21wYWN0XCIsIFwibm9ybWFsXCIsIFwiaW52aXNpYmxlXCJdKSxcbiAgc3Rva2VuOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBobDogUHJvcFR5cGVzLnN0cmluZyxcbiAgYmFkZ2U6IFByb3BUeXBlcy5vbmVPZihbXCJib3R0b21yaWdodFwiLCBcImJvdHRvbWxlZnRcIiwgXCJpbmxpbmVcIl0pLFxuICBpc29sYXRlZDogUHJvcFR5cGVzLmJvb2xcbn07XG5SZUNBUFRDSEEuZGVmYXVsdFByb3BzID0ge1xuICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoKSB7fSxcbiAgdGhlbWU6IFwibGlnaHRcIixcbiAgdHlwZTogXCJpbWFnZVwiLFxuICB0YWJpbmRleDogMCxcbiAgc2l6ZTogXCJub3JtYWxcIixcbiAgYmFkZ2U6IFwiYm90dG9tcmlnaHRcIlxufTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5pbXBvcnQgeyBDb21wb25lbnQsIGNyZWF0ZUVsZW1lbnQsIGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCBob2lzdFN0YXRpY3MgZnJvbSBcImhvaXN0LW5vbi1yZWFjdC1zdGF0aWNzXCI7XG52YXIgU0NSSVBUX01BUCA9IHt9OyAvLyBBIGNvdW50ZXIgdXNlZCB0byBnZW5lcmF0ZSBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBjb21wb25lbnQgdGhhdCB1c2VzIHRoZSBmdW5jdGlvblxuXG52YXIgaWRDb3VudCA9IDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlQXN5bmNTY3JpcHQoZ2V0U2NyaXB0VVJMLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcFdpdGhBc3luY1NjcmlwdChXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgdmFyIHdyYXBwZWRDb21wb25lbnROYW1lID0gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgXCJDb21wb25lbnRcIjtcblxuICAgIHZhciBBc3luY1NjcmlwdExvYWRlciA9XG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgICBfaW5oZXJpdHNMb29zZShBc3luY1NjcmlwdExvYWRlciwgX0NvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIEFzeW5jU2NyaXB0TG9hZGVyKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcztcblxuICAgICAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7fTtcbiAgICAgICAgX3RoaXMuX19zY3JpcHRVUkwgPSBcIlwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBfcHJvdG8gPSBBc3luY1NjcmlwdExvYWRlci5wcm90b3R5cGU7XG5cbiAgICAgIF9wcm90by5hc3luY1NjcmlwdExvYWRlckdldFNjcmlwdExvYWRlcklEID0gZnVuY3Rpb24gYXN5bmNTY3JpcHRMb2FkZXJHZXRTY3JpcHRMb2FkZXJJRCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9fc2NyaXB0TG9hZGVySUQpIHtcbiAgICAgICAgICB0aGlzLl9fc2NyaXB0TG9hZGVySUQgPSBcImFzeW5jLXNjcmlwdC1sb2FkZXItXCIgKyBpZENvdW50Kys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fX3NjcmlwdExvYWRlcklEO1xuICAgICAgfTtcblxuICAgICAgX3Byb3RvLnNldHVwU2NyaXB0VVJMID0gZnVuY3Rpb24gc2V0dXBTY3JpcHRVUkwoKSB7XG4gICAgICAgIHRoaXMuX19zY3JpcHRVUkwgPSB0eXBlb2YgZ2V0U2NyaXB0VVJMID09PSBcImZ1bmN0aW9uXCIgPyBnZXRTY3JpcHRVUkwoKSA6IGdldFNjcmlwdFVSTDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19zY3JpcHRVUkw7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uYXN5bmNTY3JpcHRMb2FkZXJIYW5kbGVMb2FkID0gZnVuY3Rpb24gYXN5bmNTY3JpcHRMb2FkZXJIYW5kbGVMb2FkKHN0YXRlKSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIC8vIHVzZSByZWFjdHMgc2V0U3RhdGUgY2FsbGJhY2sgdG8gZmlyZSBwcm9wcy5hc3luY1NjcmlwdE9uTG9hZCB3aXRoIG5ldyBzdGF0ZS9lbnRyeVxuICAgICAgICB0aGlzLnNldFN0YXRlKHN0YXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5wcm9wcy5hc3luY1NjcmlwdE9uTG9hZCAmJiBfdGhpczIucHJvcHMuYXN5bmNTY3JpcHRPbkxvYWQoX3RoaXMyLnN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uYXN5bmNTY3JpcHRMb2FkZXJUcmlnZ2VyT25TY3JpcHRMb2FkZWQgPSBmdW5jdGlvbiBhc3luY1NjcmlwdExvYWRlclRyaWdnZXJPblNjcmlwdExvYWRlZCgpIHtcbiAgICAgICAgdmFyIG1hcEVudHJ5ID0gU0NSSVBUX01BUFt0aGlzLl9fc2NyaXB0VVJMXTtcblxuICAgICAgICBpZiAoIW1hcEVudHJ5IHx8ICFtYXBFbnRyeS5sb2FkZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY3JpcHQgaXMgbm90IGxvYWRlZC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBvYnNLZXkgaW4gbWFwRW50cnkub2JzZXJ2ZXJzKSB7XG4gICAgICAgICAgbWFwRW50cnkub2JzZXJ2ZXJzW29ic0tleV0obWFwRW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHdpbmRvd1tvcHRpb25zLmNhbGxiYWNrTmFtZV07XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgICAgdmFyIHNjcmlwdFVSTCA9IHRoaXMuc2V0dXBTY3JpcHRVUkwoKTtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMuYXN5bmNTY3JpcHRMb2FkZXJHZXRTY3JpcHRMb2FkZXJJRCgpO1xuICAgICAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICAgICAgZ2xvYmFsTmFtZSA9IF9vcHRpb25zLmdsb2JhbE5hbWUsXG4gICAgICAgICAgICBjYWxsYmFja05hbWUgPSBfb3B0aW9ucy5jYWxsYmFja05hbWUsXG4gICAgICAgICAgICBzY3JpcHRJZCA9IF9vcHRpb25zLnNjcmlwdElkOyAvLyBjaGVjayBpZiBnbG9iYWwgb2JqZWN0IGFscmVhZHkgYXR0YWNoZWQgdG8gd2luZG93XG5cbiAgICAgICAgaWYgKGdsb2JhbE5hbWUgJiYgdHlwZW9mIHdpbmRvd1tnbG9iYWxOYW1lXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIFNDUklQVF9NQVBbc2NyaXB0VVJMXSA9IHtcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgIG9ic2VydmVyczoge31cbiAgICAgICAgICB9O1xuICAgICAgICB9IC8vIGNoZWNrIGlmIHNjcmlwdCBsb2FkaW5nIGFscmVhZHlcblxuXG4gICAgICAgIGlmIChTQ1JJUFRfTUFQW3NjcmlwdFVSTF0pIHtcbiAgICAgICAgICB2YXIgZW50cnkgPSBTQ1JJUFRfTUFQW3NjcmlwdFVSTF07IC8vIGlmIGxvYWRlZCBvciBlcnJvcmVkIHRoZW4gXCJmaW5pc2hcIlxuXG4gICAgICAgICAgaWYgKGVudHJ5ICYmIChlbnRyeS5sb2FkZWQgfHwgZW50cnkuZXJyb3JlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYXN5bmNTY3JpcHRMb2FkZXJIYW5kbGVMb2FkKGVudHJ5KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IC8vIGlmIHN0aWxsIGxvYWRpbmcgdGhlbiBjYWxsYmFjayB0byBvYnNlcnZlciBxdWV1ZVxuXG5cbiAgICAgICAgICBlbnRyeS5vYnNlcnZlcnNba2V5XSA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5hc3luY1NjcmlwdExvYWRlckhhbmRsZUxvYWQoZW50cnkpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgICogaGFzbid0IHN0YXJ0ZWQgbG9hZGluZ1xuICAgICAgICAgKiBzdGFydCB0aGUgXCJtYWdpY1wiXG4gICAgICAgICAqIHNldHVwIHNjcmlwdCB0byBsb2FkIGFuZCBvYnNlcnZlcnNcbiAgICAgICAgICovXG5cblxuICAgICAgICB2YXIgb2JzZXJ2ZXJzID0ge307XG5cbiAgICAgICAgb2JzZXJ2ZXJzW2tleV0gPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmFzeW5jU2NyaXB0TG9hZGVySGFuZGxlTG9hZChlbnRyeSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgU0NSSVBUX01BUFtzY3JpcHRVUkxdID0ge1xuICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgb2JzZXJ2ZXJzOiBvYnNlcnZlcnNcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgIHNjcmlwdC5zcmMgPSBzY3JpcHRVUkw7XG4gICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG5cbiAgICAgICAgZm9yICh2YXIgYXR0cmlidXRlIGluIG9wdGlvbnMuYXR0cmlidXRlcykge1xuICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBvcHRpb25zLmF0dHJpYnV0ZXNbYXR0cmlidXRlXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NyaXB0SWQpIHtcbiAgICAgICAgICBzY3JpcHQuaWQgPSBzY3JpcHRJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjYWxsT2JzZXJ2ZXJGdW5jQW5kUmVtb3ZlT2JzZXJ2ZXIgPSBmdW5jdGlvbiBjYWxsT2JzZXJ2ZXJGdW5jQW5kUmVtb3ZlT2JzZXJ2ZXIoZnVuYykge1xuICAgICAgICAgIGlmIChTQ1JJUFRfTUFQW3NjcmlwdFVSTF0pIHtcbiAgICAgICAgICAgIHZhciBtYXBFbnRyeSA9IFNDUklQVF9NQVBbc2NyaXB0VVJMXTtcbiAgICAgICAgICAgIHZhciBvYnNlcnZlcnNNYXAgPSBtYXBFbnRyeS5vYnNlcnZlcnM7XG5cbiAgICAgICAgICAgIGZvciAodmFyIG9ic0tleSBpbiBvYnNlcnZlcnNNYXApIHtcbiAgICAgICAgICAgICAgaWYgKGZ1bmMob2JzZXJ2ZXJzTWFwW29ic0tleV0pKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG9ic2VydmVyc01hcFtvYnNLZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjYWxsYmFja05hbWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHdpbmRvd1tjYWxsYmFja05hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5hc3luY1NjcmlwdExvYWRlclRyaWdnZXJPblNjcmlwdExvYWRlZCgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBzY3JpcHQub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBtYXBFbnRyeSA9IFNDUklQVF9NQVBbc2NyaXB0VVJMXTtcblxuICAgICAgICAgIGlmIChtYXBFbnRyeSkge1xuICAgICAgICAgICAgbWFwRW50cnkubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbGxPYnNlcnZlckZ1bmNBbmRSZW1vdmVPYnNlcnZlcihmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG9ic2VydmVyKG1hcEVudHJ5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIG1hcEVudHJ5ID0gU0NSSVBUX01BUFtzY3JpcHRVUkxdO1xuXG4gICAgICAgICAgaWYgKG1hcEVudHJ5KSB7XG4gICAgICAgICAgICBtYXBFbnRyeS5lcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbGxPYnNlcnZlckZ1bmNBbmRSZW1vdmVPYnNlcnZlcihmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIobWFwRW50cnkpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRhZyBzY3JpcHRcbiAgICAgICAgdmFyIHNjcmlwdFVSTCA9IHRoaXMuX19zY3JpcHRVUkw7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVtb3ZlT25Vbm1vdW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgdmFyIGFsbFNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsU2NyaXB0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKGFsbFNjcmlwdHNbaV0uc3JjLmluZGV4T2Yoc2NyaXB0VVJMKSA+IC0xKSB7XG4gICAgICAgICAgICAgIGlmIChhbGxTY3JpcHRzW2ldLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBhbGxTY3JpcHRzW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYWxsU2NyaXB0c1tpXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gQ2xlYW4gdGhlIG9ic2VydmVyIGVudHJ5XG5cblxuICAgICAgICB2YXIgbWFwRW50cnkgPSBTQ1JJUFRfTUFQW3NjcmlwdFVSTF07XG5cbiAgICAgICAgaWYgKG1hcEVudHJ5KSB7XG4gICAgICAgICAgZGVsZXRlIG1hcEVudHJ5Lm9ic2VydmVyc1t0aGlzLmFzeW5jU2NyaXB0TG9hZGVyR2V0U2NyaXB0TG9hZGVySUQoKV07XG5cbiAgICAgICAgICBpZiAob3B0aW9ucy5yZW1vdmVPblVubW91bnQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBTQ1JJUFRfTUFQW3NjcmlwdFVSTF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICB2YXIgZ2xvYmFsTmFtZSA9IG9wdGlvbnMuZ2xvYmFsTmFtZTsgLy8gcmVtb3ZlIGFzeW5jU2NyaXB0T25Mb2FkIGZyb20gY2hpbGRQcm9wc1xuXG4gICAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICBhc3luY1NjcmlwdE9uTG9hZCA9IF90aGlzJHByb3BzLmFzeW5jU2NyaXB0T25Mb2FkLFxuICAgICAgICAgICAgZm9yd2FyZGVkUmVmID0gX3RoaXMkcHJvcHMuZm9yd2FyZGVkUmVmLFxuICAgICAgICAgICAgY2hpbGRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJHByb3BzLCBbXCJhc3luY1NjcmlwdE9uTG9hZFwiLCBcImZvcndhcmRlZFJlZlwiXSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuXG4gICAgICAgIGlmIChnbG9iYWxOYW1lICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBjaGlsZFByb3BzW2dsb2JhbE5hbWVdID0gdHlwZW9mIHdpbmRvd1tnbG9iYWxOYW1lXSAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvd1tnbG9iYWxOYW1lXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkUHJvcHMucmVmID0gZm9yd2FyZGVkUmVmO1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChXcmFwcGVkQ29tcG9uZW50LCBjaGlsZFByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBBc3luY1NjcmlwdExvYWRlcjtcbiAgICB9KENvbXBvbmVudCk7IC8vIE5vdGUgdGhlIHNlY29uZCBwYXJhbSBcInJlZlwiIHByb3ZpZGVkIGJ5IFJlYWN0LmZvcndhcmRSZWYuXG4gICAgLy8gV2UgY2FuIHBhc3MgaXQgYWxvbmcgdG8gQXN5bmNTY3JpcHRMb2FkZXIgYXMgYSByZWd1bGFyIHByb3AsIGUuZy4gXCJmb3J3YXJkZWRSZWZcIlxuICAgIC8vIEFuZCBpdCBjYW4gdGhlbiBiZSBhdHRhY2hlZCB0byB0aGUgQ29tcG9uZW50LlxuXG5cbiAgICB2YXIgRm9yd2FyZGVkQ29tcG9uZW50ID0gZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQXN5bmNTY3JpcHRMb2FkZXIsIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgICBmb3J3YXJkZWRSZWY6IHJlZlxuICAgICAgfSkpO1xuICAgIH0pO1xuICAgIEZvcndhcmRlZENvbXBvbmVudC5kaXNwbGF5TmFtZSA9IFwiQXN5bmNTY3JpcHRMb2FkZXIoXCIgKyB3cmFwcGVkQ29tcG9uZW50TmFtZSArIFwiKVwiO1xuICAgIEZvcndhcmRlZENvbXBvbmVudC5wcm9wVHlwZXMgPSB7XG4gICAgICBhc3luY1NjcmlwdE9uTG9hZDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9O1xuICAgIHJldHVybiBob2lzdFN0YXRpY3MoRm9yd2FyZGVkQ29tcG9uZW50LCBXcmFwcGVkQ29tcG9uZW50KTtcbiAgfTtcbn0iLCJpbXBvcnQgUmVDQVBUQ0hBIGZyb20gXCIuL3JlY2FwdGNoYVwiO1xuaW1wb3J0IG1ha2VBc3luY1NjcmlwdExvYWRlciBmcm9tIFwicmVhY3QtYXN5bmMtc2NyaXB0XCI7XG52YXIgY2FsbGJhY2tOYW1lID0gXCJvbmxvYWRjYWxsYmFja1wiO1xudmFyIGdsb2JhbE5hbWUgPSBcImdyZWNhcHRjaGFcIjtcbmZ1bmN0aW9uIGdldE9wdGlvbnMoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5yZWNhcHRjaGFPcHRpb25zIHx8IHt9O1xufVxuZnVuY3Rpb24gZ2V0VVJMKCkge1xuICB2YXIgZHluYW1pY09wdGlvbnMgPSBnZXRPcHRpb25zKCk7XG4gIHZhciBob3N0bmFtZSA9IGR5bmFtaWNPcHRpb25zLnVzZVJlY2FwdGNoYU5ldCA/IFwicmVjYXB0Y2hhLm5ldFwiIDogXCJ3d3cuZ29vZ2xlLmNvbVwiO1xuICBpZiAoZHluYW1pY09wdGlvbnMuZW50ZXJwcmlzZSkge1xuICAgIHJldHVybiBcImh0dHBzOi8vXCIgKyBob3N0bmFtZSArIFwiL3JlY2FwdGNoYS9lbnRlcnByaXNlLmpzP29ubG9hZD1cIiArIGNhbGxiYWNrTmFtZSArIFwiJnJlbmRlcj1leHBsaWNpdFwiO1xuICB9XG4gIHJldHVybiBcImh0dHBzOi8vXCIgKyBob3N0bmFtZSArIFwiL3JlY2FwdGNoYS9hcGkuanM/b25sb2FkPVwiICsgY2FsbGJhY2tOYW1lICsgXCImcmVuZGVyPWV4cGxpY2l0XCI7XG59XG5leHBvcnQgZGVmYXVsdCBtYWtlQXN5bmNTY3JpcHRMb2FkZXIoZ2V0VVJMLCB7XG4gIGNhbGxiYWNrTmFtZTogY2FsbGJhY2tOYW1lLFxuICBnbG9iYWxOYW1lOiBnbG9iYWxOYW1lLFxuICBhdHRyaWJ1dGVzOiBnZXRPcHRpb25zKCkubm9uY2UgPyB7XG4gICAgbm9uY2U6IGdldE9wdGlvbnMoKS5ub25jZVxuICB9IDoge31cbn0pKFJlQ0FQVENIQSk7IiwiaW1wb3J0IFJlY2FwdGNoYVdyYXBwZXIgZnJvbSBcIi4vcmVjYXB0Y2hhLXdyYXBwZXJcIjtcbmltcG9ydCBSZUNBUFRDSEEgZnJvbSBcIi4vcmVjYXB0Y2hhXCI7XG5leHBvcnQgZGVmYXVsdCBSZWNhcHRjaGFXcmFwcGVyO1xuZXhwb3J0IHsgUmVDQVBUQ0hBIH07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbnZhciBSRUFDVF9TVEFUSUNTID0ge1xuICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgY29udGV4dFR5cGU6IHRydWUsXG4gIGNvbnRleHRUeXBlczogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgZ2V0RGVmYXVsdFByb3BzOiB0cnVlLFxuICBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6IHRydWUsXG4gIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogdHJ1ZSxcbiAgbWl4aW5zOiB0cnVlLFxuICBwcm9wVHlwZXM6IHRydWUsXG4gIHR5cGU6IHRydWVcbn07XG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgbGVuZ3RoOiB0cnVlLFxuICBwcm90b3R5cGU6IHRydWUsXG4gIGNhbGxlcjogdHJ1ZSxcbiAgY2FsbGVlOiB0cnVlLFxuICBhcmd1bWVudHM6IHRydWUsXG4gIGFyaXR5OiB0cnVlXG59O1xudmFyIEZPUldBUkRfUkVGX1NUQVRJQ1MgPSB7XG4gICckJHR5cGVvZic6IHRydWUsXG4gIHJlbmRlcjogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlXG59O1xudmFyIE1FTU9fU1RBVElDUyA9IHtcbiAgJyQkdHlwZW9mJzogdHJ1ZSxcbiAgY29tcGFyZTogdHJ1ZSxcbiAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgcHJvcFR5cGVzOiB0cnVlLFxuICB0eXBlOiB0cnVlXG59O1xudmFyIFRZUEVfU1RBVElDUyA9IHt9O1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuRm9yd2FyZFJlZl0gPSBGT1JXQVJEX1JFRl9TVEFUSUNTO1xuVFlQRV9TVEFUSUNTW3JlYWN0SXMuTWVtb10gPSBNRU1PX1NUQVRJQ1M7XG5cbmZ1bmN0aW9uIGdldFN0YXRpY3MoY29tcG9uZW50KSB7XG4gIC8vIFJlYWN0IHYxNi4xMSBhbmQgYmVsb3dcbiAgaWYgKHJlYWN0SXMuaXNNZW1vKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gTUVNT19TVEFUSUNTO1xuICB9IC8vIFJlYWN0IHYxNi4xMiBhbmQgYWJvdmVcblxuXG4gIHJldHVybiBUWVBFX1NUQVRJQ1NbY29tcG9uZW50WyckJHR5cGVvZiddXSB8fCBSRUFDVF9TVEFUSUNTO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGJsYWNrbGlzdCkge1xuICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgIGlmIChvYmplY3RQcm90b3R5cGUpIHtcbiAgICAgIHZhciBpbmhlcml0ZWRDb21wb25lbnQgPSBnZXRQcm90b3R5cGVPZihzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICBpZiAoaW5oZXJpdGVkQ29tcG9uZW50ICYmIGluaGVyaXRlZENvbXBvbmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7XG4gICAgICAgIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKHRhcmdldENvbXBvbmVudCwgaW5oZXJpdGVkQ29tcG9uZW50LCBibGFja2xpc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgICAga2V5cyA9IGtleXMuY29uY2F0KGdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0U3RhdGljcyA9IGdldFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50KTtcbiAgICB2YXIgc291cmNlU3RhdGljcyA9IGdldFN0YXRpY3Moc291cmNlQ29tcG9uZW50KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghS05PV05fU1RBVElDU1trZXldICYmICEoYmxhY2tsaXN0ICYmIGJsYWNrbGlzdFtrZXldKSAmJiAhKHNvdXJjZVN0YXRpY3MgJiYgc291cmNlU3RhdGljc1trZXldKSAmJiAhKHRhcmdldFN0YXRpY3MgJiYgdGFyZ2V0U3RhdGljc1trZXldKSkge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2VDb21wb25lbnQsIGtleSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBmcm9tIHJlYWQtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29tcG9uZW50LCBrZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaG9pc3ROb25SZWFjdFN0YXRpY3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoUmVhY3RJcy5pc0VsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxuXHJcbnZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbnR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xuXG52YXIgZ2V0Q29uZGl0aW9uYWxQcm9wcyA9IGZ1bmN0aW9uIChncm91cCwgZGlzYWJsZWQpIHtcbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICBpZiAoZ3JvdXAgJiYgZGlzYWJsZWQpIHtcbiAgICAgICAgcHJvcHMuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcHM7XG59O1xudmFyIGdldENvbmRpdGlvbmFsTGFiZWxQcm9wcyA9IGZ1bmN0aW9uIChncm91cCwgaWQpIHtcbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICBpZiAoIWdyb3VwICYmIGlkKSB7XG4gICAgICAgIHByb3BzLmh0bWxGb3IgPSBpZDtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BzO1xufTtcbnZhciBnZXRPcHRpb25zID0gZnVuY3Rpb24gKGdyb3VwLCBpbnZhbGlkLCBkaXNhYmxlZCwgc2l6ZSwgaWQsIGVycm9ycywgaGVscGVyKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHNpemU6IHNpemUsXG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICB9O1xuICAgIGlmICghZ3JvdXApXG4gICAgICAgIG9wdGlvbnMuaWQgPSBpZDtcbiAgICB2YXIgYXJpYURlc2NyaWJlZGJ5ID0gXCJcIjtcbiAgICBpZiAoIWdyb3VwICYmIGludmFsaWQpXG4gICAgICAgIG9wdGlvbnMuaW52YWxpZCA9IGludmFsaWQ7XG4gICAgaWYgKGhlbHBlcilcbiAgICAgICAgYXJpYURlc2NyaWJlZGJ5ICs9IFwiaGVscGVyLWZvcm0tZmllbGQtXCIuY29uY2F0KGlkLCBcIiBcIik7XG4gICAgaWYgKGVycm9ycylcbiAgICAgICAgYXJpYURlc2NyaWJlZGJ5ICs9IFwiZXJyb3ItZm9ybS1maWVsZC1cIi5jb25jYXQoaWQpO1xuICAgIGlmIChhcmlhRGVzY3JpYmVkYnkubGVuZ3RoID4gMClcbiAgICAgICAgb3B0aW9uc1tcImFyaWEtZGVzY3JpYmVkYnlcIl0gPSBhcmlhRGVzY3JpYmVkYnk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG59O1xuLyoqXG4gKlxuICogRGVtb3M6XG4gKlxuICogLSBbUkRTIEZvcm0gRmllbGRdKGh0dHBzOi8vZGVzaWduLnJhbXNleXNvbHV0aW9ucy5jb20vc3Rvcnlib29rLz9wYXRoPS9zdG9yeS9kZXNpZ24tc3lzdGVtLWZvcm0tZmllbGQtLWRlZmF1bHQpXG4gKlxuICogQVBJOlxuICpcbiAqIC0gW1JEUyBGb3JtIEZpZWxkIEFQSV0oaHR0cHM6Ly9kZXNpZ24ucmFtc2V5c29sdXRpb25zLmNvbS9jb21wb25lbnRzL2Zvcm0tZmllbGQvP3RhYj10ZWNobm9sb2dpZXMjcmVhY3QpXG4gKi9cbnZhciBGb3JtRmllbGQgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICB2YXIgX2IsIF9jO1xuICAgIHZhciBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWUsIF9kID0gX2EuZGlzYWJsZWQsIGRpc2FibGVkID0gX2QgPT09IHZvaWQgMCA/IGZhbHNlIDogX2QsIGVycm9ycyA9IF9hLmVycm9ycywgX2UgPSBfYS5ncm91cCwgZ3JvdXAgPSBfZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZSwgaGVscGVyID0gX2EuaGVscGVyLCBpZCA9IF9hLmlkLCBfZiA9IF9hLmludmFsaWQsIGludmFsaWQgPSBfZiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZiwgX2cgPSBfYS5pc09uRGFya0NhbnZhcywgaXNPbkRhcmtDYW52YXMgPSBfZyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZywgbGFiZWwgPSBfYS5sYWJlbCwgbGVuZ3RoID0gX2EubGVuZ3RoLCBub3RlID0gX2Eubm90ZSwgX2ggPSBfYS5zaXplLCBzaXplID0gX2ggPT09IHZvaWQgMCA/IFwibWRcIiA6IF9oLCByZXN0ID0gX19yZXN0KF9hLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImRpc2FibGVkXCIsIFwiZXJyb3JzXCIsIFwiZ3JvdXBcIiwgXCJoZWxwZXJcIiwgXCJpZFwiLCBcImludmFsaWRcIiwgXCJpc09uRGFya0NhbnZhc1wiLCBcImxhYmVsXCIsIFwibGVuZ3RoXCIsIFwibm90ZVwiLCBcInNpemVcIl0pO1xuICAgIHZhciB1dWlkID0gaWQgfHwgXCJcIi5jb25jYXQoTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTYpKTtcbiAgICB2YXIgb3B0aW9ucyA9IGdldE9wdGlvbnMoZ3JvdXAsIGludmFsaWQsIGRpc2FibGVkLCBzaXplLCB1dWlkLCBlcnJvcnMsIGhlbHBlcik7XG4gICAgdmFyIGZvcm1GaWVsZENsYXNzZXMgPSBjbGFzc05hbWVzKFwicmRzLUZvcm1GaWVsZFwiLCAoX2IgPSB7fSxcbiAgICAgICAgX2JbXCJyZHMtRm9ybUZpZWxkLS1cIi5jb25jYXQoc2l6ZSldID0gc2l6ZSAhPT0gXCJtZFwiLFxuICAgICAgICBfYltcImlzLWRpc2FibGVkXCJdID0gZGlzYWJsZWQsXG4gICAgICAgIF9iW1wiaXMtaW52YWxpZFwiXSA9IGludmFsaWQsXG4gICAgICAgIF9iW1wib24tZGFya0NhbnZhc1wiXSA9IGlzT25EYXJrQ2FudmFzLFxuICAgICAgICBfYiksIGNsYXNzTmFtZSk7XG4gICAgdmFyIGZvcm1GaWVsZENvbnRyb2xDbGFzc2VzID0gY2xhc3NOYW1lcyhcInJkcy1Gb3JtRmllbGQtY29udHJvbFwiLCAoX2MgPSB7fSxcbiAgICAgICAgX2NbXCJyZHMtRm9ybUZpZWxkLWNvbnRyb2wtLVwiLmNvbmNhdChsZW5ndGgpXSA9IGxlbmd0aCxcbiAgICAgICAgX2MpKTtcbiAgICB2YXIgRWxlbWVudCA9IGdyb3VwID8gXCJmaWVsZHNldFwiIDogXCJkaXZcIjtcbiAgICB2YXIgTGFiZWxFbGVtZW50ID0gZ3JvdXAgPyBcImxlZ2VuZFwiIDogXCJsYWJlbFwiO1xuICAgIHZhciBzaG93RXJyb3JzID0gaW52YWxpZCAmJiBlcnJvcnMgJiYgIWRpc2FibGVkO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50LCBfX2Fzc2lnbih7fSwgcmVzdCwgZ2V0Q29uZGl0aW9uYWxQcm9wcyhncm91cCwgZGlzYWJsZWQpLCB7IGNsYXNzTmFtZTogZm9ybUZpZWxkQ2xhc3NlcyB9KSxcbiAgICAgICAgbGFiZWwgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoTGFiZWxFbGVtZW50LCBfX2Fzc2lnbih7IGNsYXNzTmFtZTogXCJyZHMtRm9ybUZpZWxkLWxhYmVsXCIgfSwgZ2V0Q29uZGl0aW9uYWxMYWJlbFByb3BzKGdyb3VwLCB1dWlkKSksXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG5vdGUgJiYgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwicmRzLUZvcm1GaWVsZC1ub3RlXCIgfSwgbm90ZSkpKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogZm9ybUZpZWxkQ29udHJvbENsYXNzZXMgfSwgY2hpbGRyZW4ob3B0aW9ucykpLFxuICAgICAgICBoZWxwZXIgJiYgKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwXCIsIHsgaWQ6IFwiaGVscGVyLWZvcm0tZmllbGQtXCIuY29uY2F0KHV1aWQpLCBjbGFzc05hbWU6IFwicmRzLUZvcm1GaWVsZC1oZWxwZXJcIiB9LCBoZWxwZXIpKSxcbiAgICAgICAgc2hvd0Vycm9ycyAmJiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGlkOiBcImVycm9yLWZvcm0tZmllbGQtXCIuY29uY2F0KHV1aWQpLCByb2xlOiBcImFsZXJ0XCIgfSwgZXJyb3JzLm1hcChmdW5jdGlvbiAoZXJyb3IsIGkpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7IGtleTogaSwgY2xhc3NOYW1lOiBcInJkcy1Gb3JtRmllbGQtZXJyb3JcIiB9LCBlcnJvcikpOyB9KSkpKSk7XG59O1xuRm9ybUZpZWxkLmRpc3BsYXlOYW1lID0gXCJGb3JtRmllbGRcIjtcblxuZXhwb3J0IHsgRm9ybUZpZWxkIGFzIGRlZmF1bHQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZvcm1GaWVsZC5lc20uanMubWFwXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9