1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 | 3 22 2 3 33 1 1 1 1 1 1 1 1 1 1 1 1 11 11 11 1 1 6 1 1 1 11 11 11 11 11 1 1 6 1 1 1 11 11 11 11 1 1 1 1 1 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); Iif (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else Eif ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _prototypeProperties = function (child, staticProps, instanceProps) { Iif (staticProps) Object.defineProperties(child, staticProps); Eif (instanceProps) Object.defineProperties(child.prototype, instanceProps); }; var _inherits = function (subClass, superClass) { Iif (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; }; var _classCallCheck = function (instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var ReactMixin = _interopRequire(require("../ReactMixin")); var _Flux = require("../../Flux"); var Flummox = _Flux.Flummox; var Store = _Flux.Store; var Actions = _Flux.Actions; var sinon = _interopRequire(require("sinon")); var React = _interopRequire(require("react/addons")); var PropTypes = React.PropTypes; var TestUtils = React.addons.TestUtils; describe("ReactMixin", function () { var TestActions = (function (Actions) { function TestActions() { _classCallCheck(this, TestActions); Eif (Actions != null) { Actions.apply(this, arguments); } } _inherits(TestActions, Actions); _prototypeProperties(TestActions, null, { getSomething: { value: function getSomething(something) { return something; }, writable: true, configurable: true } }); return TestActions; })(Actions); var TestStore = (function (Store) { function TestStore(flux) { _classCallCheck(this, TestStore); _get(Object.getPrototypeOf(TestStore.prototype), "constructor", this).call(this); var testActions = flux.getActions("test"); this.register(testActions.getSomething, this.handleGetSomething); this.state = { something: null }; } _inherits(TestStore, Store); _prototypeProperties(TestStore, null, { handleGetSomething: { value: function handleGetSomething(something) { this.setState({ something: something }); }, writable: true, configurable: true } }); return TestStore; })(Store); var Flux = (function (Flummox) { function Flux() { _classCallCheck(this, Flux); _get(Object.getPrototypeOf(Flux.prototype), "constructor", this).call(this); this.createActions("test", TestActions); this.createStore("test", TestStore, this); } _inherits(Flux, Flummox); return Flux; })(Flummox); var ContextComponent = React.createClass({ displayName: "ContextComponent", mixins: [ReactMixin()], render: function render() { return null; } }); var PropsComponent = React.createClass({ displayName: "PropsComponent", mixins: [ReactMixin()], render: function render() { return null; } }); before(function () { jsdom(); }); it("gets flux from either props or context", function () { var flux = new Flux(); var contextComponent = undefined, propsComponent = undefined; React.withContext({ flux: flux }, function () { contextComponent = TestUtils.renderIntoDocument(React.createElement(ContextComponent, null)); }); propsComponent = TestUtils.renderIntoDocument(React.createElement(PropsComponent, { flux: flux })); expect(contextComponent.flux).to.be.an["instanceof"](Flummox); expect(propsComponent.flux).to.be.an["instanceof"](Flummox); }); it("exposes flux as context", function () { var flux = new Flux(); var Component = React.createClass({ displayName: "Component", mixins: [ReactMixin()], render: function render() { return React.createElement( "div", null, React.createElement(ChildComponent, null) ); } }); var ChildComponent = React.createClass({ displayName: "ChildComponent", contextTypes: { flux: PropTypes.instanceOf(Flummox) }, render: function render() { return React.createElement("div", null); } }); var tree = TestUtils.renderIntoDocument(React.createElement(Component, { flux: flux })); var childComponent = TestUtils.findRenderedComponentWithType(tree, ChildComponent); expect(childComponent.context.flux).to.equal(flux); }); it("throws error if neither props or context is set", function () { var flux = new Flux(); expect(TestUtils.renderIntoDocument.bind(null, React.createElement(PropsComponent, null))).to["throw"]("ReactMixin: Could not find Flux instance. Ensure that your component " + "has either `this.context.flux` or `this.props.flux`."); }); it("uses #connectToStores() to get initial state", function () { var flux = new Flux(); flux.getActions("test").getSomething("foobar"); var getterMap = { test: function (store) { return { something: store.state.something, custom: true }; } }; var mixin = ReactMixin(getterMap); var connectToStores = sinon.spy(mixin, "connectToStores"); var Component = React.createClass({ displayName: "Component", mixins: [mixin], getInitialState: function getInitialState() { return { foobar: "baz" }; }, render: function render() { return null; } }); var component = TestUtils.renderIntoDocument(React.createElement(Component, { flux: flux })); expect(connectToStores.calledOnce).to.be["true"]; expect(connectToStores.firstCall.args[0]).to.equal(getterMap); expect(flux.getStore("test").listeners("change")).to.have.length(1); expect(component.state).to.deep.equal({ something: "foobar", custom: true, foobar: "baz" }); }); describe("#connectToStores", function () { it("returns initial state", function () { var flux = new Flux(); var component = TestUtils.renderIntoDocument(React.createElement(PropsComponent, { flux: flux })); var initialState = component.connectToStores("test"); expect(initialState).to.deep.equal({ something: null }); }); it("merges store state with component state on change", function () { var flux = new Flux(); var component = TestUtils.renderIntoDocument(React.createElement(PropsComponent, { flux: flux })); component.setState({ otherThing: "barbaz" }); component.connectToStores("test"); flux.getActions("test").getSomething("foobar"); expect(component.state).to.deep.equal({ something: "foobar", otherThing: "barbaz" }); }); it("uses custom state getter, if given", function () { var flux = new Flux(); var component = TestUtils.renderIntoDocument(React.createElement(PropsComponent, { flux: flux })); component.setState({ otherThing: "barbaz" }); component.connectToStores("test", function (store) { return { something: store.state.something, custom: true }; }); flux.getActions("test").getSomething("foobar"); expect(component.state).to.deep.equal({ something: "foobar", otherThing: "barbaz", custom: true }); }); it("binds state getter to component", function () { var flux = new Flux(); var Component = React.createClass({ displayName: "Component", mixins: [ReactMixin({ test: function (store) { this.someComponentMethod("some arg"); return { something: store.state.something, custom: true }; } })], render: function render() { return null; }, someComponentMethod: function someComponentMethod(string) { return string; } }); var component = TestUtils.renderIntoDocument(React.createElement(Component, { flux: flux })); var someComponentMethod = sinon.spy(component, "someComponentMethod"); flux.getActions("test").getSomething("foobar"); expect(someComponentMethod.calledOnce).to.be["true"]; expect(someComponentMethod.firstCall.args[0]).to.equal("some arg"); }); it("accepts object of keys to state getters", function () { var flux = new Flux(); var component = TestUtils.renderIntoDocument(React.createElement(PropsComponent, { flux: flux })); component.setState({ otherThing: "barbaz" }); component.connectToStores({ test: function (store) { return { something: store.state.something, custom: true }; } }); flux.getActions("test").getSomething("foobar"); expect(component.state).to.deep.equal({ something: "foobar", otherThing: "barbaz", custom: true }); }); it("uses default getter if null is passed as getter", function () { var flux = new Flux(); var component = TestUtils.renderIntoDocument(React.createElement(PropsComponent, { flux: flux })); component.setState({ otherThing: "barbaz" }); component.connectToStores("test", null); flux.getActions("test").getSomething("foobar"); expect(component.state).to.deep.equal({ something: "foobar", otherThing: "barbaz" }); }); it("removes listener before unmounting", function () { var flux = new Flux(); var div = document.createElement("div"); var component = React.render(React.createElement(PropsComponent, { flux: flux }), div); var store = flux.getStore("test"); component.connectToStores("test"); expect(store.listeners("change").length).to.equal(1); React.unmountComponentAtNode(div); expect(store.listeners("change").length).to.equal(0); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hZGRvbnMvX190ZXN0c19fL1JlYWN0TWl4aW4tdGVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7Ozs7Ozs7Ozs7OztJQUVOLFVBQVUsMkJBQU0sZUFBZTs7b0JBQ0UsWUFBWTs7SUFBM0MsT0FBTyxTQUFQLE9BQU87SUFBRSxLQUFLLFNBQUwsS0FBSztJQUFFLE9BQU8sU0FBUCxPQUFPO0lBQ3pCLEtBQUssMkJBQU0sT0FBTzs7SUFFbEIsS0FBSywyQkFBTSxjQUFjOztJQUMxQixTQUFTLEdBQUssS0FBSyxDQUFuQixTQUFTO0lBQ1QsU0FBUyxHQUFLLEtBQUssQ0FBQyxNQUFNLENBQTFCLFNBQVM7OztBQUVmLFFBQVEsQ0FBQyxZQUFZLEVBQUUsWUFBTTtNQUVyQixXQUFXLGNBQVMsT0FBTzthQUEzQixXQUFXOzRCQUFYLFdBQVc7O1VBQVMsT0FBTztBQUFQLGVBQU87Ozs7Y0FBM0IsV0FBVyxFQUFTLE9BQU87O3lCQUEzQixXQUFXO0FBQ2Ysa0JBQVk7ZUFBQSxzQkFBQyxTQUFTLEVBQUU7QUFDdEIsaUJBQU8sU0FBUyxDQUFDO1NBQ2xCOzs7Ozs7V0FIRyxXQUFXO0tBQVMsT0FBTzs7TUFNM0IsU0FBUyxjQUFTLEtBQUs7QUFDaEIsYUFEUCxTQUFTLENBQ0QsSUFBSTs0QkFEWixTQUFTOztBQUVYLGlDQUZFLFNBQVMsNkNBRUg7O0FBRVIsVUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxVQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7O0FBRWpFLFVBQUksQ0FBQyxLQUFLLEdBQUc7QUFDWCxpQkFBUyxFQUFFLElBQUk7T0FDaEIsQ0FBQztLQUNIOztjQVZHLFNBQVMsRUFBUyxLQUFLOzt5QkFBdkIsU0FBUztBQVliLHdCQUFrQjtlQUFBLDRCQUFDLFNBQVMsRUFBRTtBQUM1QixjQUFJ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QUFDO0FBQ2xDLFlBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEQsQ0FBQyxDQUFDO0dBRUosQ0FBQyxDQUFDO0NBRUosQ0FBQyxDQUFDIiwiZmlsZSI6InNyYy9hZGRvbnMvX190ZXN0c19fL1JlYWN0TWl4aW4tdGVzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IFJlYWN0TWl4aW4gZnJvbSAnLi4vUmVhY3RNaXhpbic7XG5pbXBvcnQgeyBGbHVtbW94LCBTdG9yZSwgQWN0aW9ucyB9IGZyb20gJy4uLy4uL0ZsdXgnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0L2FkZG9ucyc7XG5sZXQgeyBQcm9wVHlwZXMgfSA9IFJlYWN0O1xubGV0IHsgVGVzdFV0aWxzIH0gPSBSZWFjdC5hZGRvbnM7XG5cbmRlc2NyaWJlKCdSZWFjdE1peGluJywgKCkgPT4ge1xuXG4gIGNsYXNzIFRlc3RBY3Rpb25zIGV4dGVuZHMgQWN0aW9ucyB7XG4gICAgZ2V0U29tZXRoaW5nKHNvbWV0aGluZykge1xuICAgICAgcmV0dXJuIHNvbWV0aGluZztcbiAgICB9XG4gIH1cblxuICBjbGFzcyBUZXN0U3RvcmUgZXh0ZW5kcyBTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoZmx1eCkge1xuICAgICAgc3VwZXIoKTtcblxuICAgICAgbGV0IHRlc3RBY3Rpb25zID0gZmx1eC5nZXRBY3Rpb25zKCd0ZXN0Jyk7XG4gICAgICB0aGlzLnJlZ2lzdGVyKHRlc3RBY3Rpb25zLmdldFNvbWV0aGluZywgdGhpcy5oYW5kbGVHZXRTb21ldGhpbmcpO1xuXG4gICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICBzb21ldGhpbmc6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaGFuZGxlR2V0U29tZXRoaW5nKHNvbWV0aGluZykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNvbWV0aGluZyB9KTtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBGbHV4IGV4dGVuZHMgRmx1bW1veCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcigpO1xuXG4gICAgICB0aGlzLmNyZWF0ZUFjdGlvbnMoJ3Rlc3QnLCBUZXN0QWN0aW9ucyk7XG4gICAgICB0aGlzLmNyZWF0ZVN0b3JlKCd0ZXN0JywgVGVzdFN0b3JlLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBsZXQgQ29udGV4dENvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICBtaXhpbnM6IFtSZWFjdE1peGluKCldLFxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9KTtcblxuICBsZXQgUHJvcHNDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAgbWl4aW5zOiBbUmVhY3RNaXhpbigpXSxcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSk7XG5cbiAgYmVmb3JlKCgpID0+IHtcbiAgICBqc2RvbSgpO1xuICB9KTtcblxuICBpdCgnZ2V0cyBmbHV4IGZyb20gZWl0aGVyIHByb3BzIG9yIGNvbnRleHQnLCAoKSA9PiB7XG4gICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuICAgIGxldCBjb250ZXh0Q29tcG9uZW50LCBwcm9wc0NvbXBvbmVudDtcblxuICAgIFJlYWN0LndpdGhDb250ZXh0KHsgZmx1eCB9LCAoKSA9PiB7XG4gICAgICBjb250ZXh0Q29tcG9uZW50ID0gVGVzdFV0aWxzLnJlbmRlckludG9Eb2N1bWVudCg8Q29udGV4dENvbXBvbmVudCAvPik7XG4gICAgfSk7XG5cbiAgICBwcm9wc0NvbXBvbmVudCA9IFRlc3RVdGlscy5yZW5kZXJJbnRvRG9jdW1lbnQoXG4gICAgICA8UHJvcHNDb21wb25lbnQgZmx1eD17Zmx1eH0gLz5cbiAgICApO1xuXG4gICAgZXhwZWN0KGNvbnRleHRDb21wb25lbnQuZmx1eCkudG8uYmUuYW4uaW5zdGFuY2VvZihGbHVtbW94KTtcbiAgICBleHBlY3QocHJvcHNDb21wb25lbnQuZmx1eCkudG8uYmUuYW4uaW5zdGFuY2VvZihGbHVtbW94KTtcbiAgfSk7XG5cbiAgaXQoJ2V4cG9zZXMgZmx1eCBhcyBjb250ZXh0JywgKCkgPT4ge1xuICAgIGxldCBmbHV4ID0gbmV3IEZsdXgoKTtcblxuICAgIGxldCBDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAgICBtaXhpbnM6IFtSZWFjdE1peGluKCldLFxuXG4gICAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxDaGlsZENvbXBvbmVudCAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IENoaWxkQ29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgICAgY29udGV4dFR5cGVzOiB7XG4gICAgICAgIGZsdXg6IFByb3BUeXBlcy5pbnN0YW5jZU9mKEZsdW1tb3gpLFxuICAgICAgfSxcblxuICAgICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gPGRpdiAvPjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCB0cmVlID0gVGVzdFV0aWxzLnJlbmRlckludG9Eb2N1bWVudCg8Q29tcG9uZW50IGZsdXg9e2ZsdXh9IC8+KTtcblxuICAgIGxldCBjaGlsZENvbXBvbmVudCA9IFRlc3RVdGlscy5maW5kUmVuZGVyZWRDb21wb25lbnRXaXRoVHlwZShcbiAgICAgIHRyZWUsXG4gICAgICBDaGlsZENvbXBvbmVudFxuICAgICk7XG5cbiAgICBleHBlY3QoY2hpbGRDb21wb25lbnQuY29udGV4dC5mbHV4KS50by5lcXVhbChmbHV4KTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyBlcnJvciBpZiBuZWl0aGVyIHByb3BzIG9yIGNvbnRleHQgaXMgc2V0JywgKCkgPT4ge1xuICAgIGxldCBmbHV4ID0gbmV3IEZsdXgoKTtcblxuICAgIGV4cGVjdChUZXN0VXRpbHMucmVuZGVySW50b0RvY3VtZW50LmJpbmQobnVsbCwgPFByb3BzQ29tcG9uZW50IC8+KSlcbiAgICAgIC50by50aHJvdyhcbiAgICAgICAgJ1JlYWN0TWl4aW46IENvdWxkIG5vdCBmaW5kIEZsdXggaW5zdGFuY2UuIEVuc3VyZSB0aGF0IHlvdXIgY29tcG9uZW50ICdcbiAgICAgICsgJ2hhcyBlaXRoZXIgYHRoaXMuY29udGV4dC5mbHV4YCBvciBgdGhpcy5wcm9wcy5mbHV4YC4nXG4gICAgICApO1xuICB9KTtcblxuICBpdCgndXNlcyAjY29ubmVjdFRvU3RvcmVzKCkgdG8gZ2V0IGluaXRpYWwgc3RhdGUnLCAoKSA9PiB7XG4gICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuXG4gICAgZmx1eC5nZXRBY3Rpb25zKCd0ZXN0JykuZ2V0U29tZXRoaW5nKCdmb29iYXInKTtcblxuICAgIGxldCBnZXR0ZXJNYXAgPSB7XG4gICAgICB0ZXN0OiBzdG9yZSA9PiAoe1xuICAgICAgICBzb21ldGhpbmc6IHN0b3JlLnN0YXRlLnNvbWV0aGluZyxcbiAgICAgICAgY3VzdG9tOiB0cnVlLFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGxldCBtaXhpbiA9IFJlYWN0TWl4aW4oZ2V0dGVyTWFwKTtcblxuICAgIGxldCBjb25uZWN0VG9TdG9yZXMgPSBzaW5vbi5zcHkobWl4aW4sICdjb25uZWN0VG9TdG9yZXMnKTtcblxuICAgIGxldCBDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAgICBtaXhpbnM6IFttaXhpbl0sXG5cbiAgICAgIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmb29iYXI6ICdiYXonLFxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGNvbXBvbmVudCA9IFRlc3RVdGlscy5yZW5kZXJJbnRvRG9jdW1lbnQoXG4gICAgICA8Q29tcG9uZW50IGZsdXg9e2ZsdXh9IC8+XG4gICAgKTtcblxuICAgIGV4cGVjdChjb25uZWN0VG9TdG9yZXMuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICBleHBlY3QoY29ubmVjdFRvU3RvcmVzLmZpcnN0Q2FsbC5hcmdzWzBdKS50by5lcXVhbChnZXR0ZXJNYXApO1xuXG4gICAgZXhwZWN0KGZsdXguZ2V0U3RvcmUoJ3Rlc3QnKS5saXN0ZW5lcnMoJ2NoYW5nZScpKS50by5oYXZlLmxlbmd0aCgxKTtcblxuICAgIGV4cGVjdChjb21wb25lbnQuc3RhdGUpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgc29tZXRoaW5nOiAnZm9vYmFyJyxcbiAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgIGZvb2JhcjogJ2JheicsXG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNjb25uZWN0VG9TdG9yZXMnLCAoKSA9PiB7XG5cbiAgICBpdCgncmV0dXJucyBpbml0aWFsIHN0YXRlJywgKCkgPT4ge1xuICAgICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuXG4gICAgICBsZXQgY29tcG9uZW50ID0gVGVzdFV0aWxzLnJlbmRlckludG9Eb2N1bWVudChcbiAgICAgICAgPFByb3BzQ29tcG9uZW50IGZsdXg9e2ZsdXh9IC8+XG4gICAgICApO1xuXG4gICAgICBsZXQgaW5pdGlhbFN0YXRlID0gY29tcG9uZW50LmNvbm5lY3RUb1N0b3JlcygndGVzdCcpO1xuXG4gICAgICBleHBlY3QoaW5pdGlhbFN0YXRlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgc29tZXRoaW5nOiBudWxsLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWVyZ2VzIHN0b3JlIHN0YXRlIHdpdGggY29tcG9uZW50IHN0YXRlIG9uIGNoYW5nZScsICgpID0+IHtcbiAgICAgIGxldCBmbHV4ID0gbmV3IEZsdXgoKTtcblxuICAgICAgbGV0IGNvbXBvbmVudCA9IFRlc3RVdGlscy5yZW5kZXJJbnRvRG9jdW1lbnQoXG4gICAgICAgIDxQcm9wc0NvbXBvbmVudCBmbHV4PXtmbHV4fSAvPlxuICAgICAgKTtcblxuICAgICAgY29tcG9uZW50LnNldFN0YXRlKHsgb3RoZXJUaGluZzogJ2JhcmJheicgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5jb25uZWN0VG9TdG9yZXMoJ3Rlc3QnKTtcbiAgICAgIGZsdXguZ2V0QWN0aW9ucygndGVzdCcpLmdldFNvbWV0aGluZygnZm9vYmFyJyk7XG5cbiAgICAgIGV4cGVjdChjb21wb25lbnQuc3RhdGUpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICBzb21ldGhpbmc6ICdmb29iYXInLFxuICAgICAgICBvdGhlclRoaW5nOiAnYmFyYmF6JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VzZXMgY3VzdG9tIHN0YXRlIGdldHRlciwgaWYgZ2l2ZW4nLCAoKSA9PiB7XG4gICAgICBsZXQgZmx1eCA9IG5ldyBGbHV4KCk7XG5cbiAgICAgIGxldCBjb21wb25lbnQgPSBUZXN0VXRpbHMucmVuZGVySW50b0RvY3VtZW50KFxuICAgICAgICA8UHJvcHNDb21wb25lbnQgZmx1eD17Zmx1eH0gLz5cbiAgICAgICk7XG5cbiAgICAgIGNvbXBvbmVudC5zZXRTdGF0ZSh7IG90aGVyVGhpbmc6ICdiYXJiYXonIH0pO1xuXG4gICAgICBjb21wb25lbnQuY29ubmVjdFRvU3RvcmVzKCd0ZXN0Jywgc3RvcmUgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvbWV0aGluZzogc3RvcmUuc3RhdGUuc29tZXRoaW5nLFxuICAgICAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBmbHV4LmdldEFjdGlvbnMoJ3Rlc3QnKS5nZXRTb21ldGhpbmcoJ2Zvb2JhcicpO1xuXG4gICAgICBleHBlY3QoY29tcG9uZW50LnN0YXRlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgc29tZXRoaW5nOiAnZm9vYmFyJyxcbiAgICAgICAgb3RoZXJUaGluZzogJ2JhcmJheicsXG4gICAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2JpbmRzIHN0YXRlIGdldHRlciB0byBjb21wb25lbnQnLCAoKSA9PiB7XG4gICAgICBsZXQgZmx1eCA9IG5ldyBGbHV4KCk7XG5cbiAgICAgIGxldCBDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAgICAgIG1peGluczogW1JlYWN0TWl4aW4oe1xuICAgICAgICAgIHRlc3Q6IGZ1bmN0aW9uKHN0b3JlKSB7XG4gICAgICAgICAgICB0aGlzLnNvbWVDb21wb25lbnRNZXRob2QoJ3NvbWUgYXJnJyk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNvbWV0aGluZzogc3RvcmUuc3RhdGUuc29tZXRoaW5nLFxuICAgICAgICAgICAgICBjdXN0b206IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pXSxcblxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc29tZUNvbXBvbmVudE1ldGhvZChzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IGNvbXBvbmVudCA9IFRlc3RVdGlscy5yZW5kZXJJbnRvRG9jdW1lbnQoXG4gICAgICAgIDxDb21wb25lbnQgZmx1eD17Zmx1eH0gLz5cbiAgICAgICk7XG5cbiAgICAgIGxldCBzb21lQ29tcG9uZW50TWV0aG9kID0gc2lub24uc3B5KGNvbXBvbmVudCwgJ3NvbWVDb21wb25lbnRNZXRob2QnKTtcbiAgICAgIGZsdXguZ2V0QWN0aW9ucygndGVzdCcpLmdldFNvbWV0aGluZygnZm9vYmFyJyk7XG5cbiAgICAgIGV4cGVjdChzb21lQ29tcG9uZW50TWV0aG9kLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc29tZUNvbXBvbmVudE1ldGhvZC5maXJzdENhbGwuYXJnc1swXSkudG8uZXF1YWwoJ3NvbWUgYXJnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWNjZXB0cyBvYmplY3Qgb2Yga2V5cyB0byBzdGF0ZSBnZXR0ZXJzJywgKCkgPT4ge1xuICAgICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuXG4gICAgICBsZXQgY29tcG9uZW50ID0gVGVzdFV0aWxzLnJlbmRlckludG9Eb2N1bWVudChcbiAgICAgICAgPFByb3BzQ29tcG9uZW50IGZsdXg9e2ZsdXh9IC8+XG4gICAgICApO1xuXG4gICAgICBjb21wb25lbnQuc2V0U3RhdGUoeyBvdGhlclRoaW5nOiAnYmFyYmF6JyB9KTtcblxuICAgICAgY29tcG9uZW50LmNvbm5lY3RUb1N0b3Jlcyh7XG4gICAgICAgIHRlc3Q6IHN0b3JlID0+ICh7XG4gICAgICAgICAgc29tZXRoaW5nOiBzdG9yZS5zdGF0ZS5zb21ldGhpbmcsXG4gICAgICAgICAgY3VzdG9tOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBmbHV4LmdldEFjdGlvbnMoJ3Rlc3QnKS5nZXRTb21ldGhpbmcoJ2Zvb2JhcicpO1xuXG4gICAgICBleHBlY3QoY29tcG9uZW50LnN0YXRlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgc29tZXRoaW5nOiAnZm9vYmFyJyxcbiAgICAgICAgb3RoZXJUaGluZzogJ2JhcmJheicsXG4gICAgICAgIGN1c3RvbTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VzZXMgZGVmYXVsdCBnZXR0ZXIgaWYgbnVsbCBpcyBwYXNzZWQgYXMgZ2V0dGVyJywgKCkgPT4ge1xuICAgICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuXG4gICAgICBsZXQgY29tcG9uZW50ID0gVGVzdFV0aWxzLnJlbmRlckludG9Eb2N1bWVudChcbiAgICAgICAgPFByb3BzQ29tcG9uZW50IGZsdXg9e2ZsdXh9IC8+XG4gICAgICApO1xuXG4gICAgICBjb21wb25lbnQuc2V0U3RhdGUoeyBvdGhlclRoaW5nOiAnYmFyYmF6JyB9KTtcblxuICAgICAgY29tcG9uZW50LmNvbm5lY3RUb1N0b3JlcygndGVzdCcsIG51bGwpO1xuXG4gICAgICBmbHV4LmdldEFjdGlvbnMoJ3Rlc3QnKS5nZXRTb21ldGhpbmcoJ2Zvb2JhcicpO1xuXG4gICAgICBleHBlY3QoY29tcG9uZW50LnN0YXRlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgc29tZXRoaW5nOiAnZm9vYmFyJyxcbiAgICAgICAgb3RoZXJUaGluZzogJ2JhcmJheicsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW1vdmVzIGxpc3RlbmVyIGJlZm9yZSB1bm1vdW50aW5nJywgKCkgPT4ge1xuICAgICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBsZXQgY29tcG9uZW50ID0gUmVhY3QucmVuZGVyKDxQcm9wc0NvbXBvbmVudCBmbHV4PXtmbHV4fSAvPiwgZGl2KTtcblxuICAgICAgbGV0IHN0b3JlID0gZmx1eC5nZXRTdG9yZSgndGVzdCcpO1xuICAgICAgY29tcG9uZW50LmNvbm5lY3RUb1N0b3JlcygndGVzdCcpO1xuXG4gICAgICBleHBlY3Qoc3RvcmUubGlzdGVuZXJzKCdjaGFuZ2UnKS5sZW5ndGgpLnRvLmVxdWFsKDEpO1xuICAgICAgUmVhY3QudW5tb3VudENvbXBvbmVudEF0Tm9kZShkaXYpO1xuICAgICAgZXhwZWN0KHN0b3JlLmxpc3RlbmVycygnY2hhbmdlJykubGVuZ3RoKS50by5lcXVhbCgwKTtcbiAgICB9KTtcblxuICB9KTtcblxufSk7XG4iXX0= |