adui
Version:
<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>
332 lines (283 loc) • 33.1 kB
JavaScript
;
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
var _react = _interopRequireWildcard(require("react"));
var _sinon = _interopRequireDefault(require("sinon"));
var _enzyme = require("enzyme");
var _reactTestRenderer = _interopRequireDefault(require("react-test-renderer"));
var _ = _interopRequireDefault(require(".."));
var _icon = _interopRequireDefault(require("../../icon"));
var _excluded = ["countHanzi"],
_excluded2 = ["countHanzi"];
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
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 _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _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); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
var stub = _sinon["default"].stub(console, "error");
var InputMounter = function (_Component) {
_inherits(InputMounter, _Component);
var _super = _createSuper(InputMounter);
function InputMounter() {
var _this;
_classCallCheck(this, InputMounter);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_this.state = {
value: "中文abc",
leftElement: _react["default"].createElement(_icon["default"], {
icon: "add"
})
};
return _this;
}
_createClass(InputMounter, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props = this.props,
countHanzi = _this$props.countHanzi,
others = _objectWithoutProperties(_this$props, _excluded);
var _this$state = this.state,
leftElement = _this$state.leftElement,
value = _this$state.value;
return _react["default"].createElement(_["default"], _extends({
countHanzi: countHanzi,
leftElement: leftElement,
limit: 10,
value: value,
onChange: function onChange(_ref) {
var val = _ref.target.value;
return _this2.setState({
value: val
});
}
}, others));
}
}]);
return InputMounter;
}(_react.Component);
var TextareaMounter = function (_Component2) {
_inherits(TextareaMounter, _Component2);
var _super2 = _createSuper(TextareaMounter);
function TextareaMounter() {
var _this3;
_classCallCheck(this, TextareaMounter);
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
_this3 = _super2.call.apply(_super2, [this].concat(args));
_this3.state = {
value: "中文abc"
};
return _this3;
}
_createClass(TextareaMounter, [{
key: "render",
value: function render() {
var _this4 = this;
var _this$props2 = this.props,
countHanzi = _this$props2.countHanzi,
others = _objectWithoutProperties(_this$props2, _excluded2);
var value = this.state.value;
return _react["default"].createElement(_["default"].Textarea, _extends({
countHanzi: countHanzi,
limit: 10,
value: value,
onChange: function onChange(_ref2) {
var val = _ref2.target.value;
return _this4.setState({
value: val
});
}
}, others));
}
}]);
return TextareaMounter;
}(_react.Component);
describe("Input", function () {
beforeAll(function () {
Object.defineProperty(Element.prototype, "clientWidth", {
writable: true,
configurable: true,
value: 200
});
});
it("快照验证", function () {
var wrapper = _reactTestRenderer["default"].create(_react["default"].createElement(_["default"], null));
expect(wrapper).toMatchSnapshot();
});
it("是否正确渲染文本框", function () {
var wrapper = _reactTestRenderer["default"].create(_react["default"].createElement(_["default"].Textarea, null));
expect(wrapper).toMatchSnapshot();
});
it("是否能验证 contentJustify", function () {
(0, _enzyme.render)(_react["default"].createElement(_["default"], {
contentJustify: true
}));
(0, _enzyme.render)(_react["default"].createElement(_["default"], {
contentJustify: true,
value: "111\u4E2D\u6587"
}));
expect(stub.calledOnce).toEqual(true);
stub.restore();
});
it("是否能验证 limit", function () {
(0, _enzyme.render)(_react["default"].createElement(_["default"], {
limit: 10,
rightElement: _react["default"].createElement("div", null, "string")
}));
expect(stub.calledOnce).toEqual(true);
stub.restore();
});
it("是否支持 limit 功能", function () {
var wrapper0 = (0, _enzyme.mount)(_react["default"].createElement(InputMounter, {
countHanzi: true
}));
var wrapper1 = (0, _enzyme.mount)(_react["default"].createElement(InputMounter, {
countHanzi: false
}));
wrapper0.find("input").simulate("change", {
target: {
value: "111中文"
}
});
wrapper1.find("input").simulate("change", {
target: {
value: "111中文"
}
});
expect(wrapper0.find(".adui-input-limit").text()).toEqual("4/10");
expect(wrapper1.find(".adui-input-limit").text()).toEqual("5/10");
});
it("是否显示正确的 leftElement rightElement", function () {
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(_["default"], {
leftElement: _react["default"].createElement(_icon["default"], {
icon: "search"
}),
rightElement: _react["default"].createElement(_icon["default"], {
icon: "search"
})
}));
var left = wrapper.find(".adui-input-left");
var right = wrapper.find(".adui-input-right");
left.simulate("click");
right.simulate("click");
});
it("是否能正确处理 leftElement 宽度", function () {
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(InputMounter, null));
wrapper.setState({
leftElement: null
});
wrapper.setProps({
rightElement: _react["default"].createElement(_icon["default"], {
icon: "add"
})
});
wrapper.setProps({
rightElement: null
});
});
it("事件验证", function () {
var onPressEnter = jest.fn();
var onKeyDown = jest.fn();
var onBlur = jest.fn();
var onFocus = jest.fn();
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(_["default"], {
onPressEnter: onPressEnter,
onKeyDown: onKeyDown,
onBlur: onBlur,
onFocus: onFocus
}));
wrapper.find("input").simulate("keydown", {
key: "enter",
keyCode: 13
});
wrapper.find("input").simulate("focus");
wrapper.find("input").simulate("blur");
expect(onPressEnter).toHaveBeenCalledTimes(1);
expect(onKeyDown).toHaveBeenCalledTimes(1);
expect(onBlur).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledTimes(1);
});
it("验证 Cleave.js", function () {
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(InputMounter, {
cleaveOptions: {
uppercase: true
}
}));
wrapper.setState({
value: "abc"
});
wrapper.update();
expect(wrapper.find("input").get(0).props.value).toBe("ABC");
});
it("Textarea: 快照验证", function () {
var wrapper = _reactTestRenderer["default"].create(_react["default"].createElement(_["default"].Textarea, null));
expect(wrapper).toMatchSnapshot();
});
it("Textarea: 是否能正确验证 limit", function () {
(0, _enzyme.render)(_react["default"].createElement(_["default"].Textarea, {
limit: 10,
resize: "both"
}));
expect(stub.calledOnce).toEqual(true);
});
it("Textarea: 是否支持 limit 功能", function () {
var wrapper0 = (0, _enzyme.mount)(_react["default"].createElement(TextareaMounter, {
countHanzi: true
}));
var wrapper1 = (0, _enzyme.mount)(_react["default"].createElement(TextareaMounter, {
countHanzi: false
}));
wrapper0.find("textarea").simulate("change", {
target: {
value: "111中文"
}
});
wrapper1.find("textarea").simulate("change", {
target: {
value: "111中文"
}
});
expect(wrapper0.find(".adui-input-limit").text()).toEqual("4/10");
expect(wrapper1.find(".adui-input-limit").text()).toEqual("5/10");
});
it("Textarea: 事件验证", function () {
var onPressEnter = jest.fn();
var onKeyDown = jest.fn();
var onBlur = jest.fn();
var onFocus = jest.fn();
var wrapper = (0, _enzyme.mount)(_react["default"].createElement(_["default"].Textarea, {
onPressEnter: onPressEnter,
onKeyDown: onKeyDown,
onBlur: onBlur,
onFocus: onFocus
}));
wrapper.find("textarea").simulate("keydown", {
key: "enter",
keyCode: 13
});
wrapper.find("textarea").simulate("focus");
expect(wrapper.find(".adui-input-wrapper").at(0).props().className.includes("adui-input-focused")).toBe(true);
wrapper.find("textarea").simulate("blur");
expect(wrapper.find(".adui-input-wrapper").at(0).props().className.includes("adui-input-focused")).toBe(false);
expect(onPressEnter).toHaveBeenCalledTimes(1);
expect(onKeyDown).toHaveBeenCalledTimes(1);
expect(onBlur).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledTimes(1);
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzdHViIiwic2lub24iLCJjb25zb2xlIiwiSW5wdXRNb3VudGVyIiwic3RhdGUiLCJ2YWx1ZSIsImxlZnRFbGVtZW50IiwicHJvcHMiLCJjb3VudEhhbnppIiwib3RoZXJzIiwidmFsIiwidGFyZ2V0Iiwic2V0U3RhdGUiLCJDb21wb25lbnQiLCJUZXh0YXJlYU1vdW50ZXIiLCJkZXNjcmliZSIsImJlZm9yZUFsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiRWxlbWVudCIsInByb3RvdHlwZSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiaXQiLCJ3cmFwcGVyIiwiVGVzdFJlbmRlcmVyIiwiY3JlYXRlIiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwicmVuZGVyIiwiY2FsbGVkT25jZSIsInRvRXF1YWwiLCJyZXN0b3JlIiwid3JhcHBlcjAiLCJtb3VudCIsIndyYXBwZXIxIiwiZmluZCIsInNpbXVsYXRlIiwidGV4dCIsImxlZnQiLCJyaWdodCIsInNldFByb3BzIiwicmlnaHRFbGVtZW50Iiwib25QcmVzc0VudGVyIiwiamVzdCIsImZuIiwib25LZXlEb3duIiwib25CbHVyIiwib25Gb2N1cyIsImtleSIsImtleUNvZGUiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJ1cHBlcmNhc2UiLCJ1cGRhdGUiLCJnZXQiLCJ0b0JlIiwiYXQiLCJjbGFzc05hbWUiLCJpbmNsdWRlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvaW5wdXQvX190ZXN0c19fL2luZGV4LnRlc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgc2lub24gZnJvbSBcInNpbm9uXCJcbmltcG9ydCB7IG1vdW50LCByZW5kZXIgfSBmcm9tIFwiZW56eW1lXCJcbmltcG9ydCBUZXN0UmVuZGVyZXIgZnJvbSBcInJlYWN0LXRlc3QtcmVuZGVyZXJcIlxuaW1wb3J0IElucHV0IGZyb20gXCIuLlwiXG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vLi4vaWNvblwiXG5cbmNvbnN0IHN0dWIgPSBzaW5vbi5zdHViKGNvbnNvbGUsIFwiZXJyb3JcIilcblxuY2xhc3MgSW5wdXRNb3VudGVyIGV4dGVuZHMgQ29tcG9uZW50PGFueSwgYW55PiB7XG4gIHN0YXRlID0ge1xuICAgIHZhbHVlOiBcIuS4reaWh2FiY1wiLFxuICAgIGxlZnRFbGVtZW50OiA8SWNvbiBpY29uPVwiYWRkXCIgLz4sXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBjb3VudEhhbnppLCAuLi5vdGhlcnMgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGxlZnRFbGVtZW50LCB2YWx1ZSB9ID0gdGhpcy5zdGF0ZVxuICAgIHJldHVybiAoXG4gICAgICA8SW5wdXRcbiAgICAgICAgY291bnRIYW56aT17Y291bnRIYW56aX1cbiAgICAgICAgbGVmdEVsZW1lbnQ9e2xlZnRFbGVtZW50fVxuICAgICAgICBsaW1pdD17MTB9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9eyh7IHRhcmdldDogeyB2YWx1ZTogdmFsIH0gfSkgPT4gdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB2YWwgfSl9XG4gICAgICAgIHsuLi5vdGhlcnN9XG4gICAgICAvPlxuICAgIClcbiAgfVxufVxuXG5jbGFzcyBUZXh0YXJlYU1vdW50ZXIgZXh0ZW5kcyBDb21wb25lbnQ8YW55LCBhbnk+IHtcbiAgc3RhdGUgPSB7XG4gICAgdmFsdWU6IFwi5Lit5paHYWJjXCIsXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBjb3VudEhhbnppLCAuLi5vdGhlcnMgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLnN0YXRlXG4gICAgcmV0dXJuIChcbiAgICAgIDxJbnB1dC5UZXh0YXJlYVxuICAgICAgICBjb3VudEhhbnppPXtjb3VudEhhbnppfVxuICAgICAgICBsaW1pdD17MTB9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9eyh7IHRhcmdldDogeyB2YWx1ZTogdmFsIH0gfSkgPT4gdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB2YWwgfSl9XG4gICAgICAgIHsuLi5vdGhlcnN9XG4gICAgICAvPlxuICAgIClcbiAgfVxufVxuXG5kZXNjcmliZShcIklucHV0XCIsICgpID0+IHtcbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsIFwiY2xpZW50V2lkdGhcIiwge1xuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogMjAwLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCLlv6vnhafpqozor4FcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBUZXN0UmVuZGVyZXIuY3JlYXRlKDxJbnB1dCAvPilcbiAgICBleHBlY3Qod3JhcHBlcikudG9NYXRjaFNuYXBzaG90KClcbiAgfSlcbiAgaXQoXCLmmK/lkKbmraPnoa7muLLmn5PmlofmnKzmoYZcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBUZXN0UmVuZGVyZXIuY3JlYXRlKDxJbnB1dC5UZXh0YXJlYSAvPilcbiAgICBleHBlY3Qod3JhcHBlcikudG9NYXRjaFNuYXBzaG90KClcbiAgfSlcbiAgaXQoXCLmmK/lkKbog73pqozor4EgY29udGVudEp1c3RpZnlcIiwgKCkgPT4ge1xuICAgIHJlbmRlcig8SW5wdXQgY29udGVudEp1c3RpZnkgLz4pXG4gICAgcmVuZGVyKDxJbnB1dCBjb250ZW50SnVzdGlmeSB2YWx1ZT1cIjExMeS4reaWh1wiIC8+KVxuICAgIGV4cGVjdChzdHViLmNhbGxlZE9uY2UpLnRvRXF1YWwodHJ1ZSlcbiAgICBzdHViLnJlc3RvcmUoKVxuICB9KVxuICBpdChcIuaYr+WQpuiDvemqjOivgSBsaW1pdFwiLCAoKSA9PiB7XG4gICAgcmVuZGVyKDxJbnB1dCBsaW1pdD17MTB9IHJpZ2h0RWxlbWVudD17PGRpdj5zdHJpbmc8L2Rpdj59IC8+KVxuICAgIGV4cGVjdChzdHViLmNhbGxlZE9uY2UpLnRvRXF1YWwodHJ1ZSlcbiAgICBzdHViLnJlc3RvcmUoKVxuICB9KVxuICBpdChcIuaYr+WQpuaUr+aMgSBsaW1pdCDlip/og71cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIwID0gbW91bnQoPElucHV0TW91bnRlciBjb3VudEhhbnppIC8+KVxuICAgIGNvbnN0IHdyYXBwZXIxID0gbW91bnQoPElucHV0TW91bnRlciBjb3VudEhhbnppPXtmYWxzZX0gLz4pXG4gICAgd3JhcHBlcjAuZmluZChcImlucHV0XCIpLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjExMeS4reaWh1wiIH0gfSlcbiAgICB3cmFwcGVyMS5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMTEx5Lit5paHXCIgfSB9KVxuICAgIGV4cGVjdCh3cmFwcGVyMC5maW5kKFwiLmFkdWktaW5wdXQtbGltaXRcIikudGV4dCgpKS50b0VxdWFsKFwiNC8xMFwiKVxuICAgIGV4cGVjdCh3cmFwcGVyMS5maW5kKFwiLmFkdWktaW5wdXQtbGltaXRcIikudGV4dCgpKS50b0VxdWFsKFwiNS8xMFwiKVxuICB9KVxuICBpdChcIuaYr+WQpuaYvuekuuato+ehrueahCBsZWZ0RWxlbWVudCByaWdodEVsZW1lbnRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxJbnB1dFxuICAgICAgICBsZWZ0RWxlbWVudD17PEljb24gaWNvbj1cInNlYXJjaFwiIC8+fVxuICAgICAgICByaWdodEVsZW1lbnQ9ezxJY29uIGljb249XCJzZWFyY2hcIiAvPn1cbiAgICAgIC8+XG4gICAgKVxuICAgIGNvbnN0IGxlZnQgPSB3cmFwcGVyLmZpbmQoXCIuYWR1aS1pbnB1dC1sZWZ0XCIpXG4gICAgY29uc3QgcmlnaHQgPSB3cmFwcGVyLmZpbmQoXCIuYWR1aS1pbnB1dC1yaWdodFwiKVxuICAgIGxlZnQuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgIHJpZ2h0LnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgfSlcbiAgaXQoXCLmmK/lkKbog73mraPnoa7lpITnkIYgbGVmdEVsZW1lbnQg5a695bqmXCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPElucHV0TW91bnRlciAvPilcbiAgICB3cmFwcGVyLnNldFN0YXRlKHsgbGVmdEVsZW1lbnQ6IG51bGwgfSlcbiAgICB3cmFwcGVyLnNldFByb3BzKHsgcmlnaHRFbGVtZW50OiA8SWNvbiBpY29uPVwiYWRkXCIgLz4gfSlcbiAgICB3cmFwcGVyLnNldFByb3BzKHsgcmlnaHRFbGVtZW50OiBudWxsIH0pXG4gIH0pXG4gIGl0KFwi5LqL5Lu26aqM6K+BXCIsICgpID0+IHtcbiAgICBjb25zdCBvblByZXNzRW50ZXIgPSBqZXN0LmZuKClcbiAgICBjb25zdCBvbktleURvd24gPSBqZXN0LmZuKClcbiAgICBjb25zdCBvbkJsdXIgPSBqZXN0LmZuKClcbiAgICBjb25zdCBvbkZvY3VzID0gamVzdC5mbigpXG5cbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICA8SW5wdXRcbiAgICAgICAgb25QcmVzc0VudGVyPXtvblByZXNzRW50ZXJ9XG4gICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICBvbkJsdXI9e29uQmx1cn1cbiAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgIC8+XG4gICAgKVxuICAgIHdyYXBwZXIuZmluZChcImlucHV0XCIpLnNpbXVsYXRlKFwia2V5ZG93blwiLCB7IGtleTogXCJlbnRlclwiLCBrZXlDb2RlOiAxMyB9KVxuICAgIHdyYXBwZXIuZmluZChcImlucHV0XCIpLnNpbXVsYXRlKFwiZm9jdXNcIilcbiAgICB3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImJsdXJcIilcbiAgICBleHBlY3Qob25QcmVzc0VudGVyKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3Qob25LZXlEb3duKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3Qob25CbHVyKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICBleHBlY3Qob25Gb2N1cykudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gIH0pXG4gIGl0KFwi6aqM6K+BIENsZWF2ZS5qc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxJbnB1dE1vdW50ZXIgY2xlYXZlT3B0aW9ucz17eyB1cHBlcmNhc2U6IHRydWUgfX0gLz4pXG4gICAgd3JhcHBlci5zZXRTdGF0ZSh7IHZhbHVlOiBcImFiY1wiIH0pXG4gICAgd3JhcHBlci51cGRhdGUoKVxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5nZXQoMCkucHJvcHMudmFsdWUpLnRvQmUoXCJBQkNcIilcbiAgfSlcblxuICBpdChcIlRleHRhcmVhOiDlv6vnhafpqozor4FcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBUZXN0UmVuZGVyZXIuY3JlYXRlKDxJbnB1dC5UZXh0YXJlYSAvPilcbiAgICBleHBlY3Qod3JhcHBlcikudG9NYXRjaFNuYXBzaG90KClcbiAgfSlcbiAgaXQoXCJUZXh0YXJlYTog5piv5ZCm6IO95q2j56Gu6aqM6K+BIGxpbWl0XCIsICgpID0+IHtcbiAgICByZW5kZXIoPElucHV0LlRleHRhcmVhIGxpbWl0PXsxMH0gcmVzaXplPVwiYm90aFwiIC8+KVxuICAgIGV4cGVjdChzdHViLmNhbGxlZE9uY2UpLnRvRXF1YWwodHJ1ZSlcbiAgfSlcbiAgaXQoXCJUZXh0YXJlYTog5piv5ZCm5pSv5oyBIGxpbWl0IOWKn+iDvVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlcjAgPSBtb3VudCg8VGV4dGFyZWFNb3VudGVyIGNvdW50SGFuemkgLz4pXG4gICAgY29uc3Qgd3JhcHBlcjEgPSBtb3VudCg8VGV4dGFyZWFNb3VudGVyIGNvdW50SGFuemk9e2ZhbHNlfSAvPilcbiAgICB3cmFwcGVyMFxuICAgICAgLmZpbmQoXCJ0ZXh0YXJlYVwiKVxuICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjExMeS4reaWh1wiIH0gfSlcbiAgICB3cmFwcGVyMVxuICAgICAgLmZpbmQoXCJ0ZXh0YXJlYVwiKVxuICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjExMeS4reaWh1wiIH0gfSlcbiAgICBleHBlY3Qod3JhcHBlcjAuZmluZChcIi5hZHVpLWlucHV0LWxpbWl0XCIpLnRleHQoKSkudG9FcXVhbChcIjQvMTBcIilcbiAgICBleHBlY3Qod3JhcHBlcjEuZmluZChcIi5hZHVpLWlucHV0LWxpbWl0XCIpLnRleHQoKSkudG9FcXVhbChcIjUvMTBcIilcbiAgfSlcbiAgaXQoXCJUZXh0YXJlYTog5LqL5Lu26aqM6K+BXCIsICgpID0+IHtcbiAgICBjb25zdCBvblByZXNzRW50ZXIgPSBqZXN0LmZuKClcbiAgICBjb25zdCBvbktleURvd24gPSBqZXN0LmZuKClcbiAgICBjb25zdCBvbkJsdXIgPSBqZXN0LmZuKClcbiAgICBjb25zdCBvbkZvY3VzID0gamVzdC5mbigpXG5cbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICA8SW5wdXQuVGV4dGFyZWFcbiAgICAgICAgb25QcmVzc0VudGVyPXtvblByZXNzRW50ZXJ9XG4gICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICBvbkJsdXI9e29uQmx1cn1cbiAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgIC8+XG4gICAgKVxuICAgIHdyYXBwZXIuZmluZChcInRleHRhcmVhXCIpLnNpbXVsYXRlKFwia2V5ZG93blwiLCB7IGtleTogXCJlbnRlclwiLCBrZXlDb2RlOiAxMyB9KVxuICAgIHdyYXBwZXIuZmluZChcInRleHRhcmVhXCIpLnNpbXVsYXRlKFwiZm9jdXNcIilcbiAgICBleHBlY3QoXG4gICAgICB3cmFwcGVyXG4gICAgICAgIC5maW5kKFwiLmFkdWktaW5wdXQtd3JhcHBlclwiKVxuICAgICAgICAuYXQoMClcbiAgICAgICAgLnByb3BzKClcbiAgICAgICAgLmNsYXNzTmFtZS5pbmNsdWRlcyhcImFkdWktaW5wdXQtZm9jdXNlZFwiKVxuICAgICkudG9CZSh0cnVlKVxuICAgIHdyYXBwZXIuZmluZChcInRleHRhcmVhXCIpLnNpbXVsYXRlKFwiYmx1clwiKVxuICAgIGV4cGVjdChcbiAgICAgIHdyYXBwZXJcbiAgICAgICAgLmZpbmQoXCIuYWR1aS1pbnB1dC13cmFwcGVyXCIpXG4gICAgICAgIC5hdCgwKVxuICAgICAgICAucHJvcHMoKVxuICAgICAgICAuY2xhc3NOYW1lLmluY2x1ZGVzKFwiYWR1aS1pbnB1dC1mb2N1c2VkXCIpXG4gICAgKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChvblByZXNzRW50ZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbktleURvd24pLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbkJsdXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKVxuICAgIGV4cGVjdChvbkZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgfSlcbn0pXG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLElBQUksR0FBR0MsaUJBQUEsQ0FBTUQsSUFBTixDQUFXRSxPQUFYLEVBQW9CLE9BQXBCLENBQWI7O0lBRU1DLFk7Ozs7Ozs7Ozs7Ozs7OztVQUNKQyxLLEdBQVE7TUFDTkMsS0FBSyxFQUFFLE9BREQ7TUFFTkMsV0FB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