UNPKG

matrix-react-sdk

Version:
243 lines (237 loc) 39.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _lodash = require("lodash"); var _Tooltip = _interopRequireWildcard(require("./Tooltip")); var _Keyboard = require("../../../Keyboard"); const _excluded = ["element", "inputRef", "prefixComponent", "postfixComponent", "className", "onValidate", "children", "tooltipContent", "forceValidity", "tooltipClassName", "validateOnBlur", "validateOnChange", "validateOnFocus", "usePlaceholderAsHint", "forceTooltipVisible", "tooltipAlignment"]; /* Copyright 2019-2024 New Vector Ltd. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // Invoke validation from user input (when typing, etc.) at most once every N ms. const VALIDATION_THROTTLE_MS = 200; const BASE_ID = "mx_Field"; let count = 1; function getId() { return `${BASE_ID}_${count++}`; } class Field extends _react.default.PureComponent { constructor(props) { super(props); (0, _defineProperty2.default)(this, "id", void 0); (0, _defineProperty2.default)(this, "_inputRef", /*#__PURE__*/(0, _react.createRef)()); /* * This was changed from throttle to debounce: this is more traditional for * form validation since it means that the validation doesn't happen at all * until the user stops typing for a bit (debounce defaults to not running on * the leading edge). If we're doing an HTTP hit on each validation, we have more * incentive to prevent validating input that's very unlikely to be valid. * We may find that we actually want different behaviour for registration * fields, in which case we can add some options to control it. */ (0, _defineProperty2.default)(this, "validateOnChange", (0, _lodash.debounce)(() => { this.validate({ focused: true }); }, VALIDATION_THROTTLE_MS)); (0, _defineProperty2.default)(this, "onFocus", ev => { this.setState({ focused: true }); if (this.props.validateOnFocus) { this.validate({ focused: true }); } // Parent component may have supplied its own `onFocus` as well this.props.onFocus?.(ev); }); (0, _defineProperty2.default)(this, "onChange", ev => { if (this.props.validateOnChange) { this.validateOnChange(); } // Parent component may have supplied its own `onChange` as well this.props.onChange?.(ev); }); (0, _defineProperty2.default)(this, "onBlur", ev => { this.setState({ focused: false }); if (this.props.validateOnBlur) { this.validate({ focused: false }); } // Parent component may have supplied its own `onBlur` as well this.props.onBlur?.(ev); }); (0, _defineProperty2.default)(this, "onKeyDown", evt => { // If the tooltip is displayed to show a feedback and Escape is pressed // The tooltip is hided if (this.state.feedbackVisible && evt.key === _Keyboard.Key.ESCAPE) { evt.preventDefault(); evt.stopPropagation(); this.setState({ feedbackVisible: false }); } }); this.state = { feedbackVisible: false, focused: false }; this.id = this.props.id || getId(); } focus() { this.inputRef.current?.focus(); // programmatic does not fire onFocus handler this.setState({ focused: true }); } async validate({ focused, allowEmpty = true }) { if (!this.props.onValidate) { return; } const value = this.inputRef.current?.value ?? null; const { valid, feedback } = await this.props.onValidate({ value, focused: !!focused, allowEmpty }); // this method is async and so we may have been blurred since the method was called // if we have then hide the feedback as withValidation does if (this.state.focused && feedback) { this.setState({ valid, feedback, feedbackVisible: true }); } else { // When we receive null `feedback`, we want to hide the tooltip. // We leave the previous `feedback` content in state without updating it, // so that we can hide the tooltip containing the most recent feedback // via CSS animation. this.setState({ valid, feedbackVisible: false }); } return valid; } get inputRef() { return this.props.inputRef ?? this._inputRef; } render() { /* eslint @typescript-eslint/no-unused-vars: ["error", { "ignoreRestSiblings": true }] */ const _this$props = this.props, { element, inputRef, prefixComponent, postfixComponent, className, onValidate, children, tooltipContent, forceValidity, tooltipClassName, validateOnBlur, validateOnChange, validateOnFocus, usePlaceholderAsHint, forceTooltipVisible, tooltipAlignment } = _this$props, inputProps = (0, _objectWithoutProperties2.default)(_this$props, _excluded); // Handle displaying feedback on validity let fieldTooltip; if (tooltipContent || this.state.feedback) { const tooltipId = `${this.id}_tooltip`; const visible = this.state.focused && forceTooltipVisible || this.state.feedbackVisible; if (visible) { inputProps["aria-describedby"] = tooltipId; } let role; if (tooltipContent) { role = "tooltip"; } else { role = this.state.valid ? "status" : "alert"; } fieldTooltip = /*#__PURE__*/_react.default.createElement(_Tooltip.default, { id: tooltipId, tooltipClassName: (0, _classnames.default)("mx_Field_tooltip", "mx_Tooltip_noMargin", tooltipClassName), visible: visible, label: tooltipContent || this.state.feedback, alignment: tooltipAlignment || _Tooltip.Alignment.Right, role: role }); } inputProps.placeholder = inputProps.placeholder ?? inputProps.label; inputProps.id = this.id; // this overwrites the id from props inputProps.onFocus = this.onFocus; inputProps.onChange = this.onChange; inputProps.onBlur = this.onBlur; // Appease typescript's inference const inputProps_ = _objectSpread(_objectSpread({}, inputProps), {}, { ref: this.inputRef }); const fieldInput = /*#__PURE__*/_react.default.createElement(this.props.element, inputProps_, children); let prefixContainer; if (prefixComponent) { prefixContainer = /*#__PURE__*/_react.default.createElement("span", { className: "mx_Field_prefix" }, prefixComponent); } let postfixContainer; if (postfixComponent) { postfixContainer = /*#__PURE__*/_react.default.createElement("span", { className: "mx_Field_postfix" }, postfixComponent); } const hasValidationFlag = forceValidity !== null && forceValidity !== undefined; const fieldClasses = (0, _classnames.default)("mx_Field", `mx_Field_${this.props.element}`, className, { // If we have a prefix element, leave the label always at the top left and // don't animate it, as it looks a bit clunky and would add complexity to do // properly. mx_Field_labelAlwaysTopLeft: prefixComponent || usePlaceholderAsHint, mx_Field_placeholderIsHint: usePlaceholderAsHint, mx_Field_valid: hasValidationFlag ? forceValidity : onValidate && this.state.valid === true, mx_Field_invalid: hasValidationFlag ? !forceValidity : onValidate && this.state.valid === false }); return /*#__PURE__*/_react.default.createElement("div", { className: fieldClasses, onKeyDown: this.onKeyDown }, prefixContainer, fieldInput, /*#__PURE__*/_react.default.createElement("label", { htmlFor: this.id }, this.props.label), postfixContainer, fieldTooltip); } } exports.default = Field; (0, _defineProperty2.default)(Field, "defaultProps", { element: "input", type: "text", validateOnFocus: true, validateOnBlur: true, validateOnChange: true }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbG9kYXNoIiwiX1Rvb2x0aXAiLCJfS2V5Ym9hcmQiLCJfZXhjbHVkZWQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJWQUxJREFUSU9OX1RIUk9UVExFX01TIiwiQkFTRV9JRCIsImNvdW50IiwiZ2V0SWQiLCJGaWVsZCIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJjcmVhdGVSZWYiLCJkZWJvdW5jZSIsInZhbGlkYXRlIiwiZm9jdXNlZCIsImV2Iiwic2V0U3RhdGUiLCJ2YWxpZGF0ZU9uRm9jdXMiLCJvbkZvY3VzIiwidmFsaWRhdGVPbkNoYW5nZSIsIm9uQ2hhbmdlIiwidmFsaWRhdGVPbkJsdXIiLCJvbkJsdXIiLCJldnQiLCJzdGF0ZSIsImZlZWRiYWNrVmlzaWJsZSIsImtleSIsIktleSIsIkVTQ0FQRSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiaWQiLCJmb2N1cyIsImlucHV0UmVmIiwiY3VycmVudCIsImFsbG93RW1wdHkiLCJvblZhbGlkYXRlIiwidmFsdWUiLCJ2YWxpZCIsImZlZWRiYWNrIiwiX2lucHV0UmVmIiwicmVuZGVyIiwiX3RoaXMkcHJvcHMiLCJlbGVtZW50IiwicHJlZml4Q29tcG9uZW50IiwicG9zdGZpeENvbXBvbmVudCIsImNsYXNzTmFtZSIsImNoaWxkcmVuIiwidG9vbHRpcENvbnRlbnQiLCJmb3JjZVZhbGlkaXR5IiwidG9vbHRpcENsYXNzTmFtZSIsInVzZVBsYWNlaG9sZGVyQXNIaW50IiwiZm9yY2VUb29sdGlwVmlzaWJsZSIsInRvb2x0aXBBbGlnbm1lbnQiLCJpbnB1dFByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImZpZWxkVG9vbHRpcCIsInRvb2x0aXBJZCIsInZpc2libGUiLCJyb2xlIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZXMiLCJsYWJlbCIsImFsaWdubWVudCIsIkFsaWdubWVudCIsIlJpZ2h0IiwicGxhY2Vob2xkZXIiLCJpbnB1dFByb3BzXyIsInJlZiIsImZpZWxkSW5wdXQiLCJwcmVmaXhDb250YWluZXIiLCJwb3N0Zml4Q29udGFpbmVyIiwiaGFzVmFsaWRhdGlvbkZsYWciLCJ1bmRlZmluZWQiLCJmaWVsZENsYXNzZXMiLCJteF9GaWVsZF9sYWJlbEFsd2F5c1RvcExlZnQiLCJteF9GaWVsZF9wbGFjZWhvbGRlcklzSGludCIsIm14X0ZpZWxkX3ZhbGlkIiwibXhfRmllbGRfaW52YWxpZCIsIm9uS2V5RG93biIsImh0bWxGb3IiLCJleHBvcnRzIiwidHlwZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0ZpZWxkLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTktMjAyNCBOZXcgVmVjdG9yIEx0ZC5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7XG4gICAgSW5wdXRIVE1MQXR0cmlidXRlcyxcbiAgICBTZWxlY3RIVE1MQXR0cmlidXRlcyxcbiAgICBUZXh0YXJlYUhUTUxBdHRyaWJ1dGVzLFxuICAgIFJlZk9iamVjdCxcbiAgICBjcmVhdGVSZWYsXG4gICAgS2V5Ym9hcmRFdmVudCxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tIFwibG9kYXNoXCI7XG5cbmltcG9ydCB7IElGaWVsZFN0YXRlLCBJVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gXCIuL1ZhbGlkYXRpb25cIjtcbmltcG9ydCBUb29sdGlwLCB7IEFsaWdubWVudCB9IGZyb20gXCIuL1Rvb2x0aXBcIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCIuLi8uLi8uLi9LZXlib2FyZFwiO1xuXG4vLyBJbnZva2UgdmFsaWRhdGlvbiBmcm9tIHVzZXIgaW5wdXQgKHdoZW4gdHlwaW5nLCBldGMuKSBhdCBtb3N0IG9uY2UgZXZlcnkgTiBtcy5cbmNvbnN0IFZBTElEQVRJT05fVEhST1RUTEVfTVMgPSAyMDA7XG5cbmNvbnN0IEJBU0VfSUQgPSBcIm14X0ZpZWxkXCI7XG5sZXQgY291bnQgPSAxO1xuZnVuY3Rpb24gZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7QkFTRV9JRH1fJHtjb3VudCsrfWA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZhbGlkYXRlT3B0cyB7XG4gICAgZm9jdXNlZD86IGJvb2xlYW47XG4gICAgYWxsb3dFbXB0eT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIC8vIFRoZSBmaWVsZCdzIElELCB3aGljaCBiaW5kcyB0aGUgaW5wdXQgYW5kIGxhYmVsIHRvZ2V0aGVyLiBJbW11dGFibGUuXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLy8gVGhlIGZpZWxkJ3MgbGFiZWwgc3RyaW5nLlxuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIC8vIFRoZSBmaWVsZCdzIHBsYWNlaG9sZGVyIHN0cmluZy4gRGVmYXVsdHMgdG8gdGhlIGxhYmVsLlxuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIC8vIFdoZW4gdHJ1ZSAoZGVmYXVsdCBmYWxzZSksIHRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIHNob3duIGluc3RlYWQgb2YgdGhlIGxhYmVsIHdoZW5cbiAgICAvLyB0aGUgY29tcG9uZW50IGlzIHVuZm9jdXNlZCAmIGVtcHR5LlxuICAgIHVzZVBsYWNlaG9sZGVyQXNIaW50PzogYm9vbGVhbjtcbiAgICAvLyBPcHRpb25hbCBjb21wb25lbnQgdG8gaW5jbHVkZSBpbnNpZGUgdGhlIGZpZWxkIGJlZm9yZSB0aGUgaW5wdXQuXG4gICAgcHJlZml4Q29tcG9uZW50PzogUmVhY3QuUmVhY3ROb2RlO1xuICAgIC8vIE9wdGlvbmFsIGNvbXBvbmVudCB0byBpbmNsdWRlIGluc2lkZSB0aGUgZmllbGQgYWZ0ZXIgdGhlIGlucHV0LlxuICAgIHBvc3RmaXhDb21wb25lbnQ/OiBSZWFjdC5SZWFjdE5vZGU7XG4gICAgLy8gVGhlIGNhbGxiYWNrIGNhbGxlZCB3aGVuZXZlciB0aGUgY29udGVudHMgb2YgdGhlIGZpZWxkXG4gICAgLy8gY2hhbmdlcy4gIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYHZhbGlkYCBib29sZWFuIGZpZWxkXG4gICAgLy8gYW5kIGEgYGZlZWRiYWNrYCByZWFjdCBjb21wb25lbnQgZmllbGQgdG8gcHJvdmlkZSBmZWVkYmFja1xuICAgIC8vIHRvIHRoZSB1c2VyLlxuICAgIG9uVmFsaWRhdGU/OiAoaW5wdXQ6IElGaWVsZFN0YXRlKSA9PiBQcm9taXNlPElWYWxpZGF0aW9uUmVzdWx0PjtcbiAgICAvLyBJZiBzcGVjaWZpZWQsIG92ZXJyaWRlcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgb25WYWxpZGF0ZS5cbiAgICBmb3JjZVZhbGlkaXR5PzogYm9vbGVhbjtcbiAgICAvLyBJZiBzcGVjaWZpZWQsIGNvbnRlbnRzIHdpbGwgYXBwZWFyIGFzIGEgdG9vbHRpcCBvbiB0aGUgZWxlbWVudCBhbmRcbiAgICAvLyB2YWxpZGF0aW9uIGZlZWRiYWNrIHRvb2x0aXBzIHdpbGwgYmUgc3VwcHJlc3NlZC5cbiAgICB0b29sdGlwQ29udGVudD86IFJlYWN0LlJlYWN0Tm9kZTtcbiAgICAvLyBJZiBzcGVjaWZpZWQgdGhlIHRvb2x0aXAgd2lsbCBiZSBzaG93biByZWdhcmRsZXNzIG9mIGZlZWRiYWNrXG4gICAgZm9yY2VUb29sdGlwVmlzaWJsZT86IGJvb2xlYW47XG4gICAgLy8gSWYgc3BlY2lmaWVkLCB0aGUgdG9vbHRpcCB3aXRoIGJlIGFsaWduZWQgYWNjb3JpbmRseSB3aXRoIHRoZSBmaWVsZCwgZGVmYXVsdHMgdG8gUmlnaHQuXG4gICAgdG9vbHRpcEFsaWdubWVudD86IEFsaWdubWVudDtcbiAgICAvLyBJZiBzcGVjaWZpZWQgYWxvbmdzaWRlIHRvb2x0aXBDb250ZW50LCB0aGUgY2xhc3MgbmFtZSB0byBhcHBseSB0byB0aGVcbiAgICAvLyB0b29sdGlwIGl0c2VsZi5cbiAgICB0b29sdGlwQ2xhc3NOYW1lPzogc3RyaW5nO1xuICAgIC8vIElmIHNwZWNpZmllZCwgYW4gYWRkaXRpb25hbCBjbGFzcyBuYW1lIHRvIGFwcGx5IHRvIHRoZSBmaWVsZCBjb250YWluZXJcbiAgICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgLy8gT24gd2hhdCBldmVudHMgc2hvdWxkIHZhbGlkYXRpb24gb2NjdXI7IGJ5IGRlZmF1bHQgb24gYWxsXG4gICAgdmFsaWRhdGVPbkZvY3VzPzogYm9vbGVhbjtcbiAgICB2YWxpZGF0ZU9uQmx1cj86IGJvb2xlYW47XG4gICAgdmFsaWRhdGVPbkNoYW5nZT86IGJvb2xlYW47XG4gICAgLy8gQWxsIG90aGVyIHByb3BzIHBhc3MgdGhyb3VnaCB0byB0aGUgPGlucHV0Pi5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW5wdXRQcm9wcyBleHRlbmRzIElQcm9wcywgSW5wdXRIVE1MQXR0cmlidXRlczxIVE1MSW5wdXRFbGVtZW50PiB7XG4gICAgLy8gVGhlIHJlZiBwYXNzIHRocm91Z2ggdG8gdGhlIGlucHV0XG4gICAgaW5wdXRSZWY/OiBSZWZPYmplY3Q8SFRNTElucHV0RWxlbWVudD47XG4gICAgLy8gVGhlIGVsZW1lbnQgdG8gY3JlYXRlLiBEZWZhdWx0cyB0byBcImlucHV0XCIuXG4gICAgZWxlbWVudDogXCJpbnB1dFwiO1xuICAgIC8vIFRoZSBpbnB1dCdzIHZhbHVlLiBUaGlzIGlzIGEgY29udHJvbGxlZCBjb21wb25lbnQsIHNvIHRoZSB2YWx1ZSBpcyByZXF1aXJlZC5cbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSVNlbGVjdFByb3BzIGV4dGVuZHMgSVByb3BzLCBTZWxlY3RIVE1MQXR0cmlidXRlczxIVE1MU2VsZWN0RWxlbWVudD4ge1xuICAgIC8vIFRoZSByZWYgcGFzcyB0aHJvdWdoIHRvIHRoZSBzZWxlY3RcbiAgICBpbnB1dFJlZj86IFJlZk9iamVjdDxIVE1MU2VsZWN0RWxlbWVudD47XG4gICAgLy8gVG8gZGVmaW5lIG9wdGlvbnMgZm9yIGEgc2VsZWN0LCB1c2UgPEZpZWxkPjxvcHRpb24gLi4uIC8+PC9GaWVsZD5cbiAgICBlbGVtZW50OiBcInNlbGVjdFwiO1xuICAgIC8vIFRoZSBzZWxlY3QncyB2YWx1ZS4gVGhpcyBpcyBhIGNvbnRyb2xsZWQgY29tcG9uZW50LCBzbyB0aGUgdmFsdWUgaXMgcmVxdWlyZWQuXG4gICAgdmFsdWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIElUZXh0YXJlYVByb3BzIGV4dGVuZHMgSVByb3BzLCBUZXh0YXJlYUhUTUxBdHRyaWJ1dGVzPEhUTUxUZXh0QXJlYUVsZW1lbnQ+IHtcbiAgICAvLyBUaGUgcmVmIHBhc3MgdGhyb3VnaCB0byB0aGUgdGV4dGFyZWFcbiAgICBpbnB1dFJlZj86IFJlZk9iamVjdDxIVE1MVGV4dEFyZWFFbGVtZW50PjtcbiAgICBlbGVtZW50OiBcInRleHRhcmVhXCI7XG4gICAgLy8gVGhlIHRleHRhcmVhJ3MgdmFsdWUuIFRoaXMgaXMgYSBjb250cm9sbGVkIGNvbXBvbmVudCwgc28gdGhlIHZhbHVlIGlzIHJlcXVpcmVkLlxuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5hdGl2ZU9uQ2hhbmdlSW5wdXRQcm9wcyBleHRlbmRzIElQcm9wcywgSW5wdXRIVE1MQXR0cmlidXRlczxIVE1MSW5wdXRFbGVtZW50PiB7XG4gICAgLy8gVGhlIHJlZiBwYXNzIHRocm91Z2ggdG8gdGhlIGlucHV0XG4gICAgaW5wdXRSZWY/OiBSZWZPYmplY3Q8SFRNTElucHV0RWxlbWVudD47XG4gICAgZWxlbWVudDogXCJpbnB1dFwiO1xuICAgIC8vIFRoZSBpbnB1dCdzIHZhbHVlLiBUaGlzIGlzIGEgY29udHJvbGxlZCBjb21wb25lbnQsIHNvIHRoZSB2YWx1ZSBpcyByZXF1aXJlZC5cbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG50eXBlIFByb3BTaGFwZXMgPSBJSW5wdXRQcm9wcyB8IElTZWxlY3RQcm9wcyB8IElUZXh0YXJlYVByb3BzIHwgSU5hdGl2ZU9uQ2hhbmdlSW5wdXRQcm9wcztcblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgdmFsaWQ/OiBib29sZWFuO1xuICAgIGZlZWRiYWNrPzogUmVhY3QuUmVhY3ROb2RlO1xuICAgIGZlZWRiYWNrVmlzaWJsZTogYm9vbGVhbjtcbiAgICBmb2N1c2VkOiBib29sZWFuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWVsZCBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8UHJvcFNoYXBlcywgSVN0YXRlPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lucHV0UmVmID0gY3JlYXRlUmVmPEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+KCk7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgZWxlbWVudDogXCJpbnB1dFwiLFxuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdmFsaWRhdGVPbkZvY3VzOiB0cnVlLFxuICAgICAgICB2YWxpZGF0ZU9uQmx1cjogdHJ1ZSxcbiAgICAgICAgdmFsaWRhdGVPbkNoYW5nZTogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBUaGlzIHdhcyBjaGFuZ2VkIGZyb20gdGhyb3R0bGUgdG8gZGVib3VuY2U6IHRoaXMgaXMgbW9yZSB0cmFkaXRpb25hbCBmb3JcbiAgICAgKiBmb3JtIHZhbGlkYXRpb24gc2luY2UgaXQgbWVhbnMgdGhhdCB0aGUgdmFsaWRhdGlvbiBkb2Vzbid0IGhhcHBlbiBhdCBhbGxcbiAgICAgKiB1bnRpbCB0aGUgdXNlciBzdG9wcyB0eXBpbmcgZm9yIGEgYml0IChkZWJvdW5jZSBkZWZhdWx0cyB0byBub3QgcnVubmluZyBvblxuICAgICAqIHRoZSBsZWFkaW5nIGVkZ2UpLiBJZiB3ZSdyZSBkb2luZyBhbiBIVFRQIGhpdCBvbiBlYWNoIHZhbGlkYXRpb24sIHdlIGhhdmUgbW9yZVxuICAgICAqIGluY2VudGl2ZSB0byBwcmV2ZW50IHZhbGlkYXRpbmcgaW5wdXQgdGhhdCdzIHZlcnkgdW5saWtlbHkgdG8gYmUgdmFsaWQuXG4gICAgICogV2UgbWF5IGZpbmQgdGhhdCB3ZSBhY3R1YWxseSB3YW50IGRpZmZlcmVudCBiZWhhdmlvdXIgZm9yIHJlZ2lzdHJhdGlvblxuICAgICAqIGZpZWxkcywgaW4gd2hpY2ggY2FzZSB3ZSBjYW4gYWRkIHNvbWUgb3B0aW9ucyB0byBjb250cm9sIGl0LlxuICAgICAqL1xuICAgIHByaXZhdGUgdmFsaWRhdGVPbkNoYW5nZSA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSh7XG4gICAgICAgICAgICBmb2N1c2VkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9LCBWQUxJREFUSU9OX1RIUk9UVExFX01TKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogUHJvcFNoYXBlcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBmZWVkYmFja1Zpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5pZCA9IHRoaXMucHJvcHMuaWQgfHwgZ2V0SWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICAgICAgLy8gcHJvZ3JhbW1hdGljIGRvZXMgbm90IGZpcmUgb25Gb2N1cyBoYW5kbGVyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZm9jdXNlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkZvY3VzID0gKGV2OiBSZWFjdC5Gb2N1c0V2ZW50PGFueT4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBmb2N1c2VkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMudmFsaWRhdGVPbkZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFyZW50IGNvbXBvbmVudCBtYXkgaGF2ZSBzdXBwbGllZCBpdHMgb3duIGBvbkZvY3VzYCBhcyB3ZWxsXG4gICAgICAgIHRoaXMucHJvcHMub25Gb2N1cz8uKGV2KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZSA9IChldjogUmVhY3QuQ2hhbmdlRXZlbnQ8YW55Pik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy52YWxpZGF0ZU9uQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlT25DaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXJlbnQgY29tcG9uZW50IG1heSBoYXZlIHN1cHBsaWVkIGl0cyBvd24gYG9uQ2hhbmdlYCBhcyB3ZWxsXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2U/Lihldik7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25CbHVyID0gKGV2OiBSZWFjdC5Gb2N1c0V2ZW50PGFueT4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBmb2N1c2VkOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnZhbGlkYXRlT25CbHVyKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhcmVudCBjb21wb25lbnQgbWF5IGhhdmUgc3VwcGxpZWQgaXRzIG93biBgb25CbHVyYCBhcyB3ZWxsXG4gICAgICAgIHRoaXMucHJvcHMub25CbHVyPy4oZXYpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUoeyBmb2N1c2VkLCBhbGxvd0VtcHR5ID0gdHJ1ZSB9OiBJVmFsaWRhdGVPcHRzKTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5vblZhbGlkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0UmVmLmN1cnJlbnQ/LnZhbHVlID8/IG51bGw7XG4gICAgICAgIGNvbnN0IHsgdmFsaWQsIGZlZWRiYWNrIH0gPSBhd2FpdCB0aGlzLnByb3BzLm9uVmFsaWRhdGUoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBmb2N1c2VkOiAhIWZvY3VzZWQsXG4gICAgICAgICAgICBhbGxvd0VtcHR5LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyB0aGlzIG1ldGhvZCBpcyBhc3luYyBhbmQgc28gd2UgbWF5IGhhdmUgYmVlbiBibHVycmVkIHNpbmNlIHRoZSBtZXRob2Qgd2FzIGNhbGxlZFxuICAgICAgICAvLyBpZiB3ZSBoYXZlIHRoZW4gaGlkZSB0aGUgZmVlZGJhY2sgYXMgd2l0aFZhbGlkYXRpb24gZG9lc1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5mb2N1c2VkICYmIGZlZWRiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICB2YWxpZCxcbiAgICAgICAgICAgICAgICBmZWVkYmFjayxcbiAgICAgICAgICAgICAgICBmZWVkYmFja1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBudWxsIGBmZWVkYmFja2AsIHdlIHdhbnQgdG8gaGlkZSB0aGUgdG9vbHRpcC5cbiAgICAgICAgICAgIC8vIFdlIGxlYXZlIHRoZSBwcmV2aW91cyBgZmVlZGJhY2tgIGNvbnRlbnQgaW4gc3RhdGUgd2l0aG91dCB1cGRhdGluZyBpdCxcbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGhpZGUgdGhlIHRvb2x0aXAgY29udGFpbmluZyB0aGUgbW9zdCByZWNlbnQgZmVlZGJhY2tcbiAgICAgICAgICAgIC8vIHZpYSBDU1MgYW5pbWF0aW9uLlxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdmFsaWQsXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlucHV0UmVmKCk6IFJlZk9iamVjdDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmlucHV0UmVmID8/IHRoaXMuX2lucHV0UmVmO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25LZXlEb3duID0gKGV2dDogS2V5Ym9hcmRFdmVudDxIVE1MRGl2RWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgLy8gSWYgdGhlIHRvb2x0aXAgaXMgZGlzcGxheWVkIHRvIHNob3cgYSBmZWVkYmFjayBhbmQgRXNjYXBlIGlzIHByZXNzZWRcbiAgICAgICAgLy8gVGhlIHRvb2x0aXAgaXMgaGlkZWRcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZmVlZGJhY2tWaXNpYmxlICYmIGV2dC5rZXkgPT09IEtleS5FU0NBUEUpIHtcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZmVlZGJhY2tWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgLyogZXNsaW50IEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVJlc3RTaWJsaW5nc1wiOiB0cnVlIH1dICovXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBpbnB1dFJlZixcbiAgICAgICAgICAgIHByZWZpeENvbXBvbmVudCxcbiAgICAgICAgICAgIHBvc3RmaXhDb21wb25lbnQsXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICBvblZhbGlkYXRlLFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICB0b29sdGlwQ29udGVudCxcbiAgICAgICAgICAgIGZvcmNlVmFsaWRpdHksXG4gICAgICAgICAgICB0b29sdGlwQ2xhc3NOYW1lLFxuICAgICAgICAgICAgdmFsaWRhdGVPbkJsdXIsXG4gICAgICAgICAgICB2YWxpZGF0ZU9uQ2hhbmdlLFxuICAgICAgICAgICAgdmFsaWRhdGVPbkZvY3VzLFxuICAgICAgICAgICAgdXNlUGxhY2Vob2xkZXJBc0hpbnQsXG4gICAgICAgICAgICBmb3JjZVRvb2x0aXBWaXNpYmxlLFxuICAgICAgICAgICAgdG9vbHRpcEFsaWdubWVudCxcbiAgICAgICAgICAgIC4uLmlucHV0UHJvcHNcbiAgICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgLy8gSGFuZGxlIGRpc3BsYXlpbmcgZmVlZGJhY2sgb24gdmFsaWRpdHlcbiAgICAgICAgbGV0IGZpZWxkVG9vbHRpcDogSlNYLkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0b29sdGlwQ29udGVudCB8fCB0aGlzLnN0YXRlLmZlZWRiYWNrKSB7XG4gICAgICAgICAgICBjb25zdCB0b29sdGlwSWQgPSBgJHt0aGlzLmlkfV90b29sdGlwYDtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGUgPSAodGhpcy5zdGF0ZS5mb2N1c2VkICYmIGZvcmNlVG9vbHRpcFZpc2libGUpIHx8IHRoaXMuc3RhdGUuZmVlZGJhY2tWaXNpYmxlO1xuICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICBpbnB1dFByb3BzW1wiYXJpYS1kZXNjcmliZWRieVwiXSA9IHRvb2x0aXBJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJvbGU6IFJlYWN0LkFyaWFSb2xlO1xuICAgICAgICAgICAgaWYgKHRvb2x0aXBDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgcm9sZSA9IFwidG9vbHRpcFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByb2xlID0gdGhpcy5zdGF0ZS52YWxpZCA/IFwic3RhdHVzXCIgOiBcImFsZXJ0XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpZWxkVG9vbHRpcCA9IChcbiAgICAgICAgICAgICAgICA8VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBpZD17dG9vbHRpcElkfVxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwQ2xhc3NOYW1lPXtjbGFzc05hbWVzKFwibXhfRmllbGRfdG9vbHRpcFwiLCBcIm14X1Rvb2x0aXBfbm9NYXJnaW5cIiwgdG9vbHRpcENsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU9e3Zpc2libGV9XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXt0b29sdGlwQ29udGVudCB8fCB0aGlzLnN0YXRlLmZlZWRiYWNrfVxuICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ9e3Rvb2x0aXBBbGlnbm1lbnQgfHwgQWxpZ25tZW50LlJpZ2h0fVxuICAgICAgICAgICAgICAgICAgICByb2xlPXtyb2xlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXRQcm9wcy5wbGFjZWhvbGRlciA9IGlucHV0UHJvcHMucGxhY2Vob2xkZXIgPz8gaW5wdXRQcm9wcy5sYWJlbDtcbiAgICAgICAgaW5wdXRQcm9wcy5pZCA9IHRoaXMuaWQ7IC8vIHRoaXMgb3ZlcndyaXRlcyB0aGUgaWQgZnJvbSBwcm9wc1xuXG4gICAgICAgIGlucHV0UHJvcHMub25Gb2N1cyA9IHRoaXMub25Gb2N1cztcbiAgICAgICAgaW5wdXRQcm9wcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2U7XG4gICAgICAgIGlucHV0UHJvcHMub25CbHVyID0gdGhpcy5vbkJsdXI7XG5cbiAgICAgICAgLy8gQXBwZWFzZSB0eXBlc2NyaXB0J3MgaW5mZXJlbmNlXG4gICAgICAgIGNvbnN0IGlucHV0UHJvcHNfOiBSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MU2VsZWN0RWxlbWVudCB8IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PiAmXG4gICAgICAgICAgICBSZWFjdC5DbGFzc0F0dHJpYnV0ZXM8SFRNTFNlbGVjdEVsZW1lbnQgfCBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4gPSB7XG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgICAgcmVmOiB0aGlzLmlucHV0UmVmLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGZpZWxkSW5wdXQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuZWxlbWVudCwgaW5wdXRQcm9wc18sIGNoaWxkcmVuKTtcblxuICAgICAgICBsZXQgcHJlZml4Q29udGFpbmVyOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHByZWZpeENvbXBvbmVudCkge1xuICAgICAgICAgICAgcHJlZml4Q29udGFpbmVyID0gPHNwYW4gY2xhc3NOYW1lPVwibXhfRmllbGRfcHJlZml4XCI+e3ByZWZpeENvbXBvbmVudH08L3NwYW4+O1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3N0Zml4Q29udGFpbmVyOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHBvc3RmaXhDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHBvc3RmaXhDb250YWluZXIgPSA8c3BhbiBjbGFzc05hbWU9XCJteF9GaWVsZF9wb3N0Zml4XCI+e3Bvc3RmaXhDb21wb25lbnR9PC9zcGFuPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc1ZhbGlkYXRpb25GbGFnID0gZm9yY2VWYWxpZGl0eSAhPT0gbnVsbCAmJiBmb3JjZVZhbGlkaXR5ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGZpZWxkQ2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9GaWVsZFwiLCBgbXhfRmllbGRfJHt0aGlzLnByb3BzLmVsZW1lbnR9YCwgY2xhc3NOYW1lLCB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcHJlZml4IGVsZW1lbnQsIGxlYXZlIHRoZSBsYWJlbCBhbHdheXMgYXQgdGhlIHRvcCBsZWZ0IGFuZFxuICAgICAgICAgICAgLy8gZG9uJ3QgYW5pbWF0ZSBpdCwgYXMgaXQgbG9va3MgYSBiaXQgY2x1bmt5IGFuZCB3b3VsZCBhZGQgY29tcGxleGl0eSB0byBkb1xuICAgICAgICAgICAgLy8gcHJvcGVybHkuXG4gICAgICAgICAgICBteF9GaWVsZF9sYWJlbEFsd2F5c1RvcExlZnQ6IHByZWZpeENvbXBvbmVudCB8fCB1c2VQbGFjZWhvbGRlckFzSGludCxcbiAgICAgICAgICAgIG14X0ZpZWxkX3BsYWNlaG9sZGVySXNIaW50OiB1c2VQbGFjZWhvbGRlckFzSGludCxcbiAgICAgICAgICAgIG14X0ZpZWxkX3ZhbGlkOiBoYXNWYWxpZGF0aW9uRmxhZyA/IGZvcmNlVmFsaWRpdHkgOiBvblZhbGlkYXRlICYmIHRoaXMuc3RhdGUudmFsaWQgPT09IHRydWUsXG4gICAgICAgICAgICBteF9GaWVsZF9pbnZhbGlkOiBoYXNWYWxpZGF0aW9uRmxhZyA/ICFmb3JjZVZhbGlkaXR5IDogb25WYWxpZGF0ZSAmJiB0aGlzLnN0YXRlLnZhbGlkID09PSBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtmaWVsZENsYXNzZXN9IG9uS2V5RG93bj17dGhpcy5vbktleURvd259PlxuICAgICAgICAgICAgICAgIHtwcmVmaXhDb250YWluZXJ9XG4gICAgICAgICAgICAgICAge2ZpZWxkSW5wdXR9XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9e3RoaXMuaWR9Pnt0aGlzLnByb3BzLmxhYmVsfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAge3Bvc3RmaXhDb250YWluZXJ9XG4gICAgICAgICAgICAgICAge2ZpZWxkVG9vbHRpcH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBT0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBUUEsSUFBQUMsV0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSCxPQUFBO0FBR0EsSUFBQUksUUFBQSxHQUFBTCx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssU0FBQSxHQUFBTCxPQUFBO0FBQXdDLE1BQUFNLFNBQUE7QUFwQnhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFULHdCQUFBUyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsV0FBQUssT0FBQSxFQUFBTCxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFBQyxjQUFBLENBQUFDLElBQUEs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