Code coverage report for lib/__tests__/Store-test.js

Statements: 96.53% (306 / 317)      Branches: 66.67% (34 / 51)      Functions: 98.55% (68 / 69)      Lines: 99.66% (289 / 290)      Ignored: none     

All files » lib/__tests__/ » Store-test.js
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 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525    1   3   21   7   24   1   1 1 1 1   1 1 1 18   18 18     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 4   1 1 1 1   1 1       1   1     2 2 5   2 1 1   1   1     2                 1 2   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 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 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 1 1 1   1 1       1   1     4 8               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          
"use strict";
 
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
 
var _prototypeProperties = function (child, staticProps, instanceProps) { if (staticProps) Object.defineProperties(child, staticProps); if (instanceProps) Object.defineProperties(child.prototype, instanceProps); };
 
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 _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 _Flux = require("../Flux");
 
var Store = _Flux.Store;
var Flux = _Flux.Flux;
var Actions = _Flux.Actions;
var sinon = _interopRequire(require("sinon"));
 
describe("Store", function () {
  var ExampleStore = (function (Store) {
    function ExampleStore() {
      _classCallCheck(this, ExampleStore);
 
      _get(Object.getPrototypeOf(ExampleStore.prototype), "constructor", this).call(this);
      this.state = { foo: "bar" };
    }
 
    _inherits(ExampleStore, Store);
 
    return ExampleStore;
  })(Store);
 
  var actionId = "actionId";
 
  describe("#register()", function () {
    it("adds handler to internal collection of handlers", function () {
      var _store$_handlers;
      var store = new ExampleStore();
      var handler = sinon.spy();
      store.register(actionId, handler);
 
      var mockArgs = ["foo", "bar"];
      (_store$_handlers = store._handlers)[actionId].apply(_store$_handlers, mockArgs);
 
      expect(handler.calledWith.apply(handler, mockArgs)).to.be["true"];
    });
 
    it("binds handler to store", function () {
      var store = new ExampleStore();
      store.foo = "bar";
 
      function handler() {
        return this.foo;
      }
 
      store.register(actionId, handler);
 
      expect(store._handlers[actionId]()).to.equal("bar");
    });
 
    it("accepts actions instead of action ids", function () {
      var _store$_handlers;
      var ExampleActions = (function (Actions) {
        function ExampleActions() {
          _classCallCheck(this, ExampleActions);
 
          Eif (Actions != null) {
            Actions.apply(this, arguments);
          }
        }
 
        _inherits(ExampleActions, Actions);
 
        _prototypeProperties(ExampleActions, null, {
          getFoo: {
            value: function getFoo() {
              return "foo";
            },
            writable: true,
            configurable: true
          }
        });
 
        return ExampleActions;
      })(Actions);
 
      var actions = new ExampleActions();
      var store = new ExampleStore();
      var handler = sinon.spy();
      store.register(actions.getFoo, handler);
 
      var mockArgs = ["foo", "bar"];
      (_store$_handlers = store._handlers)[actions.getFoo._id].apply(_store$_handlers, mockArgs);
 
      expect(handler.calledWith.apply(handler, mockArgs)).to.be["true"];
    });
 
    it("ignores non-function handlers", function () {
      var store = new ExampleStore();
      expect(store.register.bind(store, null)).not.to["throw"]();
    });
  });
 
  it("default state is null", function () {
    var store = new Store();
    expect(store.state).to.be["null"];
  });
 
  describe("#registerAsync()", function () {
    it("registers handlers for begin, success, and failure of async action", function callee$2$0() {
      var error, ExampleActions, ExampleFlux, flux, actions, store, handler, begin, success, failure;
      return regeneratorRuntime.async(function callee$2$0$(context$3$0) {
        while (1) switch (context$3$0.prev = context$3$0.next) {
          case 0:
            error = new Error();
            ExampleActions = (function (Actions) {
              function ExampleActions() {
                _classCallCheck(this, ExampleActions);
 
                Eif (Actions != null) {
                  Actions.apply(this, arguments);
                }
              }
 
              _inherits(ExampleActions, Actions);
 
              _prototypeProperties(ExampleActions, null, {
                getFoo: {
                  value: function getFoo(message) {
                    var _success = arguments[1] === undefined ? true : arguments[1];
                    return regeneratorRuntime.async(function getFoo$(context$5$0) {
                      while (1) switch (context$5$0.prev = context$5$0.next) {
                        case 0:
                          if (_success) {
                            context$5$0.next = 2;
                            break;
                          }
                          throw error;
                        case 2:
                          return context$5$0.abrupt("return", message + " success");
                        case 3:
                        case "end":
                          return context$5$0.stop();
                      }
                    }, null, this);
                  },
                  writable: true,
                  configurable: true
                },
                getBar: {
                  value: function getBar(message) {
                    return regeneratorRuntime.async(function getBar$(context$5$0) {
                      while (1) switch (context$5$0.prev = context$5$0.next) {
                        case 0:
                          return context$5$0.abrupt("return", message);
                        case 1:
                        case "end":
                          return context$5$0.stop();
                      }
                    }, null, this);
                  },
                  writable: true,
                  configurable: true
                }
              });
 
              return ExampleActions;
            })(Actions);
            ExampleFlux = (function (Flux) {
              function ExampleFlux() {
                _classCallCheck(this, ExampleFlux);
 
                _get(Object.getPrototypeOf(ExampleFlux.prototype), "constructor", this).call(this);
                this.createActions("example", ExampleActions);
                this.createStore("example", ExampleStore);
              }
 
              _inherits(ExampleFlux, Flux);
 
              return ExampleFlux;
            })(Flux);
            flux = new ExampleFlux();
            actions = flux.getActions("example");
            store = flux.getStore("example");
            handler = sinon.spy();
            store.register(actions.getBar, handler);
 
            context$3$0.next = 10;
            return actions.getBar("bar");
          case 10:
            expect(handler.calledOnce).to.be["true"];
            expect(handler.firstCall.args).to.deep.equal(["bar"]);
 
            begin = sinon.spy();
            success = sinon.spy();
            failure = sinon.spy();
            store.registerAsync(actions.getFoo, begin, success, failure);
 
            context$3$0.next = 18;
            return actions.getFoo("foo", true);
          case 18:
            expect(begin.calledOnce).to.be["true"];
            expect(begin.firstCall.args).to.deep.equal(["foo", true]);
            expect(success.calledOnce).to.be["true"];
            expect(success.firstCall.args[0]).to.equal("foo success");
            expect(failure.called).to.be["false"];
 
            context$3$0.next = 25;
            return expect(actions.getFoo("bar", false)).to.be.rejected;
          case 25:
 
 
            expect(begin.calledTwice).to.be["true"];
            expect(success.calledOnce).to.be["true"];
            expect(failure.calledOnce).to.be["true"];
            expect(failure.firstCall.args[0]).to.equal(error);
          case 29:
          case "end":
            return context$3$0.stop();
        }
      }, null, this);
    });
 
    it("ignores non-function handlers", function () {
      var store = new ExampleStore();
      expect(store.registerAsync.bind(store, null)).not.to["throw"]();
    });
  });
 
  describe("#handler()", function () {
    it("delegates dispatches to registered handlers", function () {
      var store = new ExampleStore();
      var handler = sinon.spy();
      store.register(actionId, handler);
 
      // Simulate dispatch
      var body = { foo: "bar" };
      store.handler({ body: body, actionId: actionId });
 
      expect(handler.calledWith(body)).to.be["true"];
    });
  });
 
  describe("#waitFor()", function () {
    it("waits for other stores", function () {
      var flux = new Flux();
      var result = [];
 
      var store2 = undefined;
 
      var Store1 = (function (Store) {
        function Store1() {
          _classCallCheck(this, Store1);
 
          _get(Object.getPrototypeOf(Store1.prototype), "constructor", this).call(this);
 
          this.register(actionId, function () {
            this.waitFor(store2);
            result.push(1);
          });
        }
 
        _inherits(Store1, Store);
 
        return Store1;
      })(Store);
 
      var Store2 = (function (Store) {
        function Store2() {
          _classCallCheck(this, Store2);
 
          _get(Object.getPrototypeOf(Store2.prototype), "constructor", this).call(this);
 
          this.register(actionId, function () {
            result.push(2);
          });
        }
 
        _inherits(Store2, Store);
 
        return Store2;
      })(Store);
 
      flux.createStore("store1", Store1);
      flux.createStore("store2", Store2);
 
      store2 = flux.getStore("store2");
 
      flux.dispatch(actionId, "foobar");
 
      expect(result).to.deep.equal([2, 1]);
    });
  });
 
  describe("#forceUpdate()", function () {
    it("emits change event", function () {
      var store = new ExampleStore();
      var listener = sinon.spy();
      store.addListener("change", listener);
 
      store.forceUpdate();
 
      expect(listener.calledOnce).to.be["true"];
    });
 
    it("doesn't modify existing state", function () {
      var store = new ExampleStore();
      var listener = sinon.spy();
      store.addListener("change", listener);
 
      store.register(actionId, function () {
        this.replaceState({ bar: "baz" });
        this.forceUpdate();
 
        expect(this.state).to.deep.equal({ foo: "bar" });
        expect(listener.called).to.be["false"];
 
        this.setState({ foo: "bar" });
        this.forceUpdate();
        this.replaceState({ baz: "foo" });
      });
 
      // Simulate dispatch
      store.handler({ actionId: actionId, body: "foobar" });
 
      expect(listener.calledOnce).to.be["true"];
      expect(store.state).to.deep.equal({ baz: "foo" });
    });
  });
 
  describe("#setState()", function () {
    it("shallow merges old state with new state", function () {
      var store = new ExampleStore();
 
      store.setState({ bar: "baz" });
 
      expect(store.state).to.deep.equal({
        foo: "bar",
        bar: "baz" });
    });
 
    it("supports transactional updates", function () {
      var store = new Store();
      store.state = { a: 1 };
      store.setState(function (state) {
        return { a: state.a + 1 };
      });
      expect(store.state.a).to.equal(2);
      store.setState(function (state) {
        return { a: state.a + 1 };
      });
      expect(store.state.a).to.equal(3);
      store.setState(function (state) {
        return { a: state.a + 1 };
      });
      expect(store.state.a).to.equal(4);
    });
 
    it("emits change event", function () {
      var store = new ExampleStore();
      var listener = sinon.spy();
      store.addListener("change", listener);
 
      store.setState({ foo: "bar" });
 
      expect(listener.calledOnce).to.be["true"];
    });
 
    it("batches multiple state updates within action handler", function () {
      var store = new ExampleStore();
      var listener = sinon.spy();
      store.addListener("change", listener);
 
      store.register(actionId, function () {
        this.setState({ bar: "baz" });
 
        expect(this.state).to.deep.equal({ foo: "bar" });
        expect(listener.called).to.be["false"];
 
        this.setState({ baz: "foo" });
      });
 
      // Simulate dispatch
      store.handler({ actionId: actionId, body: "foobar" });
 
      expect(listener.calledOnce).to.be["true"];
      expect(store.state).to.deep.equal({ foo: "bar", bar: "baz", baz: "foo" });
    });
 
    it("warns if called from outside an action handler", function () {
      var store = new ExampleStore();
      var warn = sinon.spy(console, "warn");
 
      store.setState({ foo: "bar" });
 
      expect(warn.firstCall.args[0]).to.equal("Store#setState() called from outside an action handler. This is " + "likely a mistake. Flux stores should manage their own state.");
 
      console.warn.restore();
    });
  });
 
  describe("#replaceState()", function () {
    it("replaces old state with new state", function () {
      var store = new ExampleStore();
 
      store.replaceState({ bar: "baz" });
 
      expect(store.state).to.deep.equal({
        bar: "baz" });
    });
 
    it("batches multiple state updates within action handler", function () {
      var store = new ExampleStore();
      var listener = sinon.spy();
      store.addListener("change", listener);
 
      store.register(actionId, function () {
        this.replaceState({ bar: "baz" });
 
        expect(this.state).to.deep.equal({ foo: "bar" });
        expect(listener.called).to.be["false"];
 
        this.setState({ foo: "bar" });
        this.replaceState({ baz: "foo" });
      });
 
      // Simulate dispatch
      store.handler({ actionId: actionId, body: "foobar" });
 
      expect(listener.calledOnce).to.be["true"];
      expect(store.state).to.deep.equal({ baz: "foo" });
    });
 
    it("emits change event", function () {
      var store = new ExampleStore();
      var listener = sinon.spy();
      store.addListener("change", listener);
 
      store.replaceState({ foo: "bar" });
 
      expect(listener.calledOnce).to.be["true"];
    });
  });
 
  describe(".assignState", function () {
    it("can be overridden to enable custom state types", function () {
      var StringStore = (function (Store) {
        function StringStore() {
          _classCallCheck(this, StringStore);
 
          Eif (Store != null) {
            Store.apply(this, arguments);
          }
        }
 
        _inherits(StringStore, Store);
 
        _prototypeProperties(StringStore, {
          assignState: {
            value: function assignState(prevState, nextState) {
              return [prevState, nextState].filter(function (state) {
                return typeof state === "string";
              }).join("");
            },
            writable: true,
            configurable: true
          }
        });
 
        return StringStore;
      })(Store);
 
      var store = new StringStore();
 
      expect(store.state).to.be["null"];
      store.setState("a");
      expect(store.state).to.equal("a");
      store.setState("b");
      expect(store.state).to.equal("ab");
      store.replaceState("xyz");
      expect(store.state).to.equal("xyz");
      store.setState("zyx");
      expect(store.state).to.equal("xyzzyx");
    });
  });
 
  describe("#forceUpdate()", function () {
    it("emits change event", function () {
      var store = new ExampleStore();
      var listener = sinon.spy();
      store.addListener("change", listener);
 
      store.forceUpdate();
 
      expect(listener.calledOnce).to.be["true"];
    });
 
    it("doesn't modify existing state", function () {
      var store = new ExampleStore();
      var listener = sinon.spy();
      store.addListener("change", listener);
 
      store.register(actionId, function () {
        this.replaceState({ bar: "baz" });
        this.forceUpdate();
 
        expect(this.state).to.deep.equal({ foo: "bar" });
        expect(listener.called).to.be["false"];
 
        this.setState({ foo: "bar" });
        this.forceUpdate();
        this.replaceState({ baz: "foo" });
      });
 
      // Simulate dispatch
      store.handler({ actionId: actionId, body: "foobar" });
 
      expect(listener.calledOnce).to.be["true"];
      expect(store.state).to.deep.equal({ baz: "foo" });
    });
  });
});
 
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9fX3Rlc3RzX18vU3RvcmUtdGVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7b0JBQXFDLFNBQVM7O0lBQXJDLEtBQUssU0FBTCxLQUFLO0lBQUUsSUFBSSxTQUFKLElBQUk7SUFBRSxPQUFPLFNBQVAsT0FBTztJQUN0QixLQUFLLDJCQUFNLE9BQU87O0FBRXpCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsWUFBTTtNQUNoQixZQUFZLGNBQVMsS0FBSztBQUNuQixhQURQLFlBQVk7NEJBQVosWUFBWTs7QUFFZCxpQ0FGRSxZQUFZLDZDQUVOO0FBQ1IsVUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztLQUM3Qjs7Y0FKRyxZQUFZLEVBQVMsS0FBSzs7V0FBMUIsWUFBWTtLQUFTLEtBQUs7O0FBT2hDLE1BQUksUUFBUSxHQUFHLFVBQVUsQ0FBQzs7QUFFMUIsVUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFNO0FBQzVCLE1BQUUsQ0FBQyxpREFBaUQsRUFBRSxZQUFNOztBQUMxRCxVQUFJLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0FBQy9CLFVBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixXQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbEMsVUFBSSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUIsMEJBQUEsS0FBSyxDQUFDLFNBQVMsRUFBQyxRQUFRLE9BQUMsbUJBQUksUUFBUSxDQUFDLENBQUM7O0FBRXZDLFlBQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUFBLENBQWxCLE9BQU8sRUFBZSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQUssQ0FBQztLQUNwRCxDQUFDLENBQUM7O0FBRUgsTUFBRSxDQUFDLHdCQUF3QixFQUFFLFlBQU07QUFDakMsVUFB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Q0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNuRCxDQUFDLENBQUM7R0FDSixDQUFDLENBQUM7Q0FFSixDQUFDLENBQUMiLCJmaWxlIjoibGliL19fdGVzdHNfXy9TdG9yZS10ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RvcmUsIEZsdXgsIEFjdGlvbnMgfSBmcm9tICcuLi9GbHV4JztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmRlc2NyaWJlKCdTdG9yZScsICgpID0+IHtcbiAgY2xhc3MgRXhhbXBsZVN0b3JlIGV4dGVuZHMgU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2JhcicgfTtcbiAgICB9XG4gIH1cblxuICBsZXQgYWN0aW9uSWQgPSAnYWN0aW9uSWQnO1xuXG4gIGRlc2NyaWJlKCcjcmVnaXN0ZXIoKScsICgpID0+IHtcbiAgICBpdCgnYWRkcyBoYW5kbGVyIHRvIGludGVybmFsIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnMnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgaGFuZGxlciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGhhbmRsZXIpO1xuXG4gICAgICBsZXQgbW9ja0FyZ3MgPSBbJ2ZvbycsICdiYXInXTtcbiAgICAgIHN0b3JlLl9oYW5kbGVyc1thY3Rpb25JZF0oLi4ubW9ja0FyZ3MpO1xuXG4gICAgICBleHBlY3QoaGFuZGxlci5jYWxsZWRXaXRoKC4uLm1vY2tBcmdzKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdiaW5kcyBoYW5kbGVyIHRvIHN0b3JlJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgc3RvcmUuZm9vID0gJ2Jhcic7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvbztcbiAgICAgIH1cblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGhhbmRsZXIpO1xuXG4gICAgICBleHBlY3Qoc3RvcmUuX2hhbmRsZXJzW2FjdGlvbklkXSgpKS50by5lcXVhbCgnYmFyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWNjZXB0cyBhY3Rpb25zIGluc3RlYWQgb2YgYWN0aW9uIGlkcycsICgpID0+IHtcbiAgICAgIGNsYXNzIEV4YW1wbGVBY3Rpb25zIGV4dGVuZHMgQWN0aW9ucyB7XG4gICAgICAgIGdldEZvbygpIHtcbiAgICAgICAgICByZXR1cm4gJ2Zvbyc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGFjdGlvbnMgPSBuZXcgRXhhbXBsZUFjdGlvbnMoKTtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBoYW5kbGVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25zLmdldEZvbywgaGFuZGxlcik7XG5cbiAgICAgIGxldCBtb2NrQXJncyA9IFsnZm9vJywgJ2JhciddO1xuICAgICAgc3RvcmUuX2hhbmRsZXJzW2FjdGlvbnMuZ2V0Rm9vLl9pZF0oLi4ubW9ja0FyZ3MpO1xuXG4gICAgICBleHBlY3QoaGFuZGxlci5jYWxsZWRXaXRoKC4uLm1vY2tBcmdzKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdpZ25vcmVzIG5vbi1mdW5jdGlvbiBoYW5kbGVycycsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGV4cGVjdChzdG9yZS5yZWdpc3Rlci5iaW5kKHN0b3JlLCBudWxsKSkubm90LnRvLnRocm93KCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHQgc3RhdGUgaXMgbnVsbCcsICgpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IG5ldyBTdG9yZSgpO1xuICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uYmUubnVsbDtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZWdpc3RlckFzeW5jKCknLCAoKSA9PiB7XG4gICAgaXQoJ3JlZ2lzdGVycyBoYW5kbGVycyBmb3IgYmVnaW4sIHN1Y2Nlc3MsIGFuZCBmYWlsdXJlIG9mIGFzeW5jIGFjdGlvbicsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKCk7XG5cbiAgICAgIGNsYXNzIEV4YW1wbGVBY3Rpb25zIGV4dGVuZHMgQWN0aW9ucyB7XG4gICAgICAgIGFzeW5jIGdldEZvbyhtZXNzYWdlLCBfc3VjY2VzcyA9IHRydWUpIHtcbiAgICAgICAgICBpZiAoIV9zdWNjZXNzKSB0aHJvdyBlcnJvcjtcblxuICAgICAgICAgIHJldHVybiBtZXNzYWdlICsgJyBzdWNjZXNzJztcbiAgICAgICAgfVxuXG4gICAgICAgIGFzeW5jIGdldEJhcihtZXNzYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3MgRXhhbXBsZUZsdXggZXh0ZW5kcyBGbHV4IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUFjdGlvbnMoJ2V4YW1wbGUnLCBFeGFtcGxlQWN0aW9ucyk7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTdG9yZSgnZXhhbXBsZScsIEV4YW1wbGVTdG9yZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGZsdXggPSBuZXcgRXhhbXBsZUZsdXgoKTtcbiAgICAgIGxldCBhY3Rpb25zID0gZmx1eC5nZXRBY3Rpb25zKCdleGFtcGxlJyk7XG4gICAgICBsZXQgc3RvcmUgPSBmbHV4LmdldFN0b3JlKCdleGFtcGxlJyk7XG5cbiAgICAgIGxldCBoYW5kbGVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25zLmdldEJhciwgaGFuZGxlcik7XG5cbiAgICAgIGF3YWl0IGFjdGlvbnMuZ2V0QmFyKCdiYXInKTtcbiAgICAgIGV4cGVjdChoYW5kbGVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoaGFuZGxlci5maXJzdENhbGwuYXJncykudG8uZGVlcC5lcXVhbChbJ2JhciddKTtcblxuICAgICAgbGV0IGJlZ2luID0gc2lub24uc3B5KCk7XG4gICAgICBsZXQgc3VjY2VzcyA9IHNpbm9uLnNweSgpO1xuICAgICAgbGV0IGZhaWx1cmUgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLnJlZ2lzdGVyQXN5bmMoYWN0aW9ucy5nZXRGb28sIGJlZ2luLCBzdWNjZXNzLCBmYWlsdXJlKTtcblxuICAgICAgYXdhaXQgYWN0aW9ucy5nZXRGb28oJ2ZvbycsIHRydWUpO1xuICAgICAgZXhwZWN0KGJlZ2luLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoYmVnaW4uZmlyc3RDYWxsLmFyZ3MpLnRvLmRlZXAuZXF1YWwoWydmb28nLCB0cnVlXSk7XG4gICAgICBleHBlY3Qoc3VjY2Vzcy5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN1Y2Nlc3MuZmlyc3RDYWxsLmFyZ3NbMF0pLnRvLmVxdWFsKCdmb28gc3VjY2VzcycpO1xuICAgICAgZXhwZWN0KGZhaWx1cmUuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgYXdhaXQgZXhwZWN0KGFjdGlvbnMuZ2V0Rm9vKCdiYXInLCBmYWxzZSkpLnRvLmJlLnJlamVjdGVkO1xuXG4gICAgICBleHBlY3QoYmVnaW4uY2FsbGVkVHdpY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3VjY2Vzcy5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KGZhaWx1cmUuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChmYWlsdXJlLmZpcnN0Q2FsbC5hcmdzWzBdKS50by5lcXVhbChlcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBub24tZnVuY3Rpb24gaGFuZGxlcnMnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBleHBlY3Qoc3RvcmUucmVnaXN0ZXJBc3luYy5iaW5kKHN0b3JlLCBudWxsKSkubm90LnRvLnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjaGFuZGxlcigpJywgKCkgPT4ge1xuICAgIGl0KCdkZWxlZ2F0ZXMgZGlzcGF0Y2hlcyB0byByZWdpc3RlcmVkIGhhbmRsZXJzJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGhhbmRsZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLnJlZ2lzdGVyKGFjdGlvbklkLCBoYW5kbGVyKTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIGxldCBib2R5ID0geyBmb286ICdiYXInIH07XG4gICAgICBzdG9yZS5oYW5kbGVyKHsgYm9keSwgYWN0aW9uSWQgfSk7XG5cbiAgICAgIGV4cGVjdChoYW5kbGVyLmNhbGxlZFdpdGgoYm9keSkpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjd2FpdEZvcigpJywgKCkgPT4ge1xuICAgIGl0KCd3YWl0cyBmb3Igb3RoZXIgc3RvcmVzJywgKCkgPT4ge1xuICAgICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gICAgICBsZXQgc3RvcmUyO1xuXG4gICAgICBjbGFzcyBTdG9yZTEgZXh0ZW5kcyBTdG9yZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGFjdGlvbklkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMud2FpdEZvcihzdG9yZTIpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goMSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3MgU3RvcmUyIGV4dGVuZHMgU3RvcmUge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcihhY3Rpb25JZCwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goMik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmx1eC5jcmVhdGVTdG9yZSgnc3RvcmUxJywgU3RvcmUxKTtcbiAgICAgIGZsdXguY3JlYXRlU3RvcmUoJ3N0b3JlMicsIFN0b3JlMik7XG5cbiAgICAgIHN0b3JlMiA9IGZsdXguZ2V0U3RvcmUoJ3N0b3JlMicpO1xuXG4gICAgICBmbHV4LmRpc3BhdGNoKGFjdGlvbklkLCAnZm9vYmFyJyk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoWzIsIDFdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNmb3JjZVVwZGF0ZSgpJywgKCkgPT4ge1xuICAgIGl0KCdlbWl0cyBjaGFuZ2UgZXZlbnQnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLmFkZExpc3RlbmVyKCdjaGFuZ2UnLCBsaXN0ZW5lcik7XG5cbiAgICAgIHN0b3JlLmZvcmNlVXBkYXRlKCk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXNuXFwndCBtb2RpZnkgZXhpc3Rpbmcgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLmFkZExpc3RlbmVyKCdjaGFuZ2UnLCBsaXN0ZW5lcik7XG5cbiAgICAgIHN0b3JlLnJlZ2lzdGVyKGFjdGlvbklkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlU3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG5cbiAgICAgICAgZXhwZWN0KHRoaXMuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBmb286ICdiYXInIH0pO1xuICAgICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhejogJ2ZvbycgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIHN0b3JlLmhhbmRsZXIoeyBhY3Rpb25JZCwgYm9keTogJ2Zvb2JhcicgfSk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgYmF6OiAnZm9vJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNzZXRTdGF0ZSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaGFsbG93IG1lcmdlcyBvbGQgc3RhdGUgd2l0aCBuZXcgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG5cbiAgICAgIHN0b3JlLnNldFN0YXRlKHsgYmFyOiAnYmF6JyB9KTtcblxuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgZm9vOiAnYmFyJyxcbiAgICAgICAgYmFyOiAnYmF6JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1cHBvcnRzIHRyYW5zYWN0aW9uYWwgdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICBzdG9yZS5zdGF0ZSA9IHsgYTogMSB9O1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDIpO1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDMpO1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VtaXRzIGNoYW5nZSBldmVudCcsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdiYXRjaGVzIG11bHRpcGxlIHN0YXRlIHVwZGF0ZXMgd2l0aGluIGFjdGlvbiBoYW5kbGVyJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGxpc3RlbmVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5hZGRMaXN0ZW5lcignY2hhbmdlJywgbGlzdGVuZXIpO1xuXG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25JZCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuXG4gICAgICAgIGV4cGVjdCh0aGlzLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZCkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGJhejogJ2ZvbycgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIHN0b3JlLmhhbmRsZXIoeyBhY3Rpb25JZCwgYm9keTogJ2Zvb2JhcicgfSk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgZm9vOiAnYmFyJywgYmFyOiAnYmF6JywgYmF6OiAnZm9vJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd3YXJucyBpZiBjYWxsZWQgZnJvbSBvdXRzaWRlIGFuIGFjdGlvbiBoYW5kbGVyJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IHdhcm4gPSBzaW5vbi5zcHkoY29uc29sZSwgJ3dhcm4nKTtcblxuICAgICAgc3RvcmUuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3Qod2Fybi5maXJzdENhbGwuYXJnc1swXSkudG8uZXF1YWwoXG4gICAgICAgICdTdG9yZSNzZXRTdGF0ZSgpIGNhbGxlZCBmcm9tIG91dHNpZGUgYW4gYWN0aW9uIGhhbmRsZXIuIFRoaXMgaXMgJ1xuICAgICAgKyAnbGlrZWx5IGEgbWlzdGFrZS4gRmx1eCBzdG9yZXMgc2hvdWxkIG1hbmFnZSB0aGVpciBvd24gc3RhdGUuJ1xuICAgICAgKTtcblxuICAgICAgY29uc29sZS53YXJuLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZXBsYWNlU3RhdGUoKScsICgpID0+IHtcbiAgICBpdCgncmVwbGFjZXMgb2xkIHN0YXRlIHdpdGggbmV3IHN0YXRlJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuXG4gICAgICBzdG9yZS5yZXBsYWNlU3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuXG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICBiYXI6ICdiYXonLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYmF0Y2hlcyBtdWx0aXBsZSBzdGF0ZSB1cGRhdGVzIHdpdGhpbiBhY3Rpb24gaGFuZGxlcicsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhcjogJ2JheicgfSk7XG5cbiAgICAgICAgZXhwZWN0KHRoaXMuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBmb286ICdiYXInIH0pO1xuICAgICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgdGhpcy5yZXBsYWNlU3RhdGUoeyBiYXo6ICdmb28nIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNpbXVsYXRlIGRpc3BhdGNoXG4gICAgICBzdG9yZS5oYW5kbGVyKHsgYWN0aW9uSWQsIGJvZHk6ICdmb29iYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uZGVlcC5lcXVhbCh7IGJhejogJ2ZvbycgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW1pdHMgY2hhbmdlIGV2ZW50JywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGxpc3RlbmVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5hZGRMaXN0ZW5lcignY2hhbmdlJywgbGlzdGVuZXIpO1xuXG4gICAgICBzdG9yZS5yZXBsYWNlU3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5hc3NpZ25TdGF0ZScsICgpID0+IHtcbiAgICBpdCgnY2FuIGJlIG92ZXJyaWRkZW4gdG8gZW5hYmxlIGN1c3RvbSBzdGF0ZSB0eXBlcycsICgpID0+IHtcbiAgICAgIGNsYXNzIFN0cmluZ1N0b3JlIGV4dGVuZHMgU3RvcmUge1xuICAgICAgICBzdGF0aWMgYXNzaWduU3RhdGUocHJldlN0YXRlLCBuZXh0U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gW3ByZXZTdGF0ZSwgbmV4dFN0YXRlXVxuICAgICAgICAgICAgLmZpbHRlcihzdGF0ZSA9PiB0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JlID0gbmV3IFN0cmluZ1N0b3JlKCk7XG5cbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uYmUubnVsbDtcbiAgICAgIHN0b3JlLnNldFN0YXRlKCdhJyk7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmVxdWFsKCdhJyk7XG4gICAgICBzdG9yZS5zZXRTdGF0ZSgnYicpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5lcXVhbCgnYWInKTtcbiAgICAgIHN0b3JlLnJlcGxhY2VTdGF0ZSgneHl6Jyk7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmVxdWFsKCd4eXonKTtcbiAgICAgIHN0b3JlLnNldFN0YXRlKCd6eXgnKTtcbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uZXF1YWwoJ3h5enp5eCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2ZvcmNlVXBkYXRlKCknLCAoKSA9PiB7XG4gICAgaXQoJ2VtaXRzIGNoYW5nZSBldmVudCcsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUuZm9yY2VVcGRhdGUoKTtcblxuICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lc25cXCd0IG1vZGlmeSBleGlzdGluZyBzdGF0ZScsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhcjogJ2JheicgfSk7XG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcblxuICAgICAgICBleHBlY3QodGhpcy5zdGF0ZSkudG8uZGVlcC5lcXVhbCh7IGZvbzogJ2JhcicgfSk7XG4gICAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWQpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgIHRoaXMucmVwbGFjZVN0YXRlKHsgYmF6OiAnZm9vJyB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTaW11bGF0ZSBkaXNwYXRjaFxuICAgICAgc3RvcmUuaGFuZGxlcih7IGFjdGlvbklkLCBib2R5OiAnZm9vYmFyJyB9KTtcblxuICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBiYXo6ICdmb28nIH0pO1xuICAgIH0pO1xuICB9KTtcblxufSk7XG4iXX0=