UNPKG

jsoniq

Version:

JSONiq implementation for JavaScript

241 lines (239 loc) 36.2 kB
"use strict"; /// <reference path="../../../typings/tsd.d.ts" /> require("jasmine2-pit"); var PUL_1 = require("../../../lib/updates/PUL"); var jerr = require("../../../lib/errors"); var MemoryStore_1 = require("../../../lib/stores/memory/MemoryStore"); describe("Memory Store", () => { it("simple test", () => { var store = new MemoryStore_1.default(); expect(() => { store.get("a"); }).toThrow(); var object = { a: [1, 2], b: 2 }; var id = store.put(object); var obj = store.get(id); expect(obj).toEqual(object); }); pit("Insert & delete", () => { var obj = { a: 1, b: { c: 1 } }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul.insert("hello", { z: 1 }); pul.remove(id); return store.commitWith(pul).then(() => { expect(store.get("hello")).toEqual({ z: 1 }); expect(() => { store.get(id); }).toThrow(); }); }); pit("simple update (1)", () => { var obj = { a: 1, b: { c: 1 } }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul .insertIntoObject(id, ["b"], { d: 1 }) .deleteFromObject(id, ["b"], ["c"]); expect(obj.b["d"]).toBe(undefined); expect(obj.b.c).toBe(1); var serializedPUL = pul.serialize(); return store.commitWith(pul).then(() => { obj = store.get(id); expect(obj.b["d"]).toBe(1); expect(obj.b.c).toBe(undefined); obj = { a: 1, b: { c: 1 } }; store = new MemoryStore_1.default(); store.put(obj, id); pul = new PUL_1.default(); pul.parse(serializedPUL); return store.commitWith(pul).then(() => { obj = store.get(id); expect(obj.b["d"]).toBe(1); expect(obj.b.c).toBe(undefined); //done(); }); }); }); pit("simple update (2)", () => { var obj = { a: 1, b: { c: 1 } }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul.renameInObject(id, [], "a", "z"); return store.commitWith(pul).then(() => { obj = store.get(id); expect(obj["z"]).toBe(1); expect(obj.a).toBe(undefined); }); }); pit("simple update (3)", () => { var obj = { a: 1, b: { c: 1 } }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul.renameInObject(id, [], "a", "z") .insertIntoObject(id, [], { a: 2 }); return store.commitWith(pul).then(() => { obj = store.get(id); expect(obj.a).toBe(2); expect(obj["z"]).toBe(1); }); }); pit("simple update (4)", () => { var obj = { a: 1, b: { c: 1 } }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul.insertIntoObject(id, [], { z: 1 }) .insertIntoObject(id, [], { a: 2 }); //throws [JNUP0006] "a": pair to insert already exists in object return store.commitWith(pul).catch(e => { expect(e instanceof jerr.JNUP0006).toBe(true); //"An individual function may create an invalid JSON instance; // however, an updating query must produce a valid JSON instance once the entire query is evaluated, // or an error is raised and the entire update fails, leaving the instance in its original state." obj = store.get(id); expect(obj.a).toBe(1); expect(obj["z"]).toBe(undefined); }); }); //http://try.zorba.io/queries/xquery/YLem0q2eDKwF7Yb9GyBKIwdUA20%3D //http://try.zorba.io/queries/xquery/J5QX9GgI64MnJlJ3IJ9vCUcCG8o%3D pit("example", () => { var todos = [{ id: 0, title: "Write thesis", complete: false }]; var store = new MemoryStore_1.default(); var id = store.put(todos); var pul = new PUL_1.default(); pul .insertIntoArray(id, [], 1, [{ id: 1 }]) .replaceInObject(id, ["0"], "complete", true) .renameInObject(id, ["0"], "complete", "completed") .insertIntoObject(id, ["0"], { title: "More figures" }) .deleteFromObject(id, ["0"], ["title"]); return store.commitWith(pul).then(() => { todos = store.get(id); expect(todos[0]["completed"]).toBe(true); expect(todos[0].complete).toBe(undefined); expect(todos[0].id).toBe(0); expect(todos[0].title).toBe("More figures"); expect(todos[1].id).toBe(1); }); }); pit("JNUP0008", () => { var obj = { a: 1, b: {} }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul.insertIntoObject(id, ["c"], { a: 1 }); return store.commitWith(pul).catch(e => { expect(e instanceof jerr.JNUP0008).toBe(true); }); }); //http://try.zorba.io/queries/xquery/ggGUhCUEuOUaVmfxjTOJ4ygDdas%3D pit("rename & insert (1)", () => { var obj = { a: 1, b: {} }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul .insertIntoObject(id, ["b"], { a: 1 }) .renameInObject(id, [], "b", "z"); return store.commitWith(pul).then(() => { obj = store.get(id); expect(obj["z"]["a"]).toBe(1); }); }); //http://try.zorba.io/queries/xquery/HdaN8mUvpAIlifs1CgBmz8gZhQo= pit("rename & insert (2)", () => { var obj = { a: 1 }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul .insertIntoObject(id, [], { a: 1 }) .renameInObject(id, [], "a", "b") .insert("myID", { z: 1 }); return store.commitWith(pul).then(() => { obj = store.get(id); expect(obj.a).toBe(1); expect(obj["b"]).toBe(1); obj = store.get("myID"); expect(obj["z"]).toBe(1); }); }); //http://try.zorba.io/queries/xquery/D4xY%2FX8P10C1bTKtz6ZNnVRIwWs%3D pit("[JNUP0016] selector cannot be resolved against supplied object", () => { var obj = { completed: true }; var store = new MemoryStore_1.default(); var id = store.put(obj); var pul = new PUL_1.default(); pul.renameInObject(id, [], "completed", "complete"); pul.replaceInObject(id, [], "complete", false); return store.commitWith(pul).catch(e => { expect(e instanceof jerr.JNUP0016).toBe(true); }); }); //http://try.zorba.io/queries/xquery/tzcZsn7c8sI82o45LJUo3SgkENM%3D pit("[JNUP0006] b: pair to insert already exists in object", () => { var d0 = new PUL_1.default(); d0.insertIntoObject("1", [], { a: 1, b: 1 }); var d1 = new PUL_1.default(); d1.renameInObject("1", [], "a", "b"); var store = new MemoryStore_1.default(); store.put({}, "1"); return store.commitWith(d0).then(() => { return store.commitWith(d1); }).catch(e => { expect(e instanceof jerr.JNUP0006).toBe(true); }); }); it("ReplaceInObject (1)", () => { var d0 = new PUL_1.default(); d0.replaceInObject("1", [], "a", { b: 1 }); var d1 = new PUL_1.default(); d1.renameInObject("1", ["a"], "b", "c"); var store = new MemoryStore_1.default(); store.put({ a: {} }, "1"); return store.commitWith(d0).then(() => { return store.commitWith(d1); }).then(() => { expect(_.isEqual(store.snapshot, { "1": { "a": { "c": 1 } } })).toBe(true); }); }); pit("RenameInObject (2)", () => { var d0 = new PUL_1.default(); d0.replaceInObject("1", ["a"], "b", { c: 1 }); var d1 = new PUL_1.default(); d1.renameInObject("1", ["a", "b"], "c", "d"); var store = new MemoryStore_1.default(); store.put({ a: { b: { c: 1 } } }, "1"); return store.commitWith(d0).then(() => { return store.commitWith(d1); }).then(() => { expect(store.snapshot).toEqual({ "1": { "a": { "b": { d: 1 } } } }); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3RzL25vZGUvdXBkYXRlcy9NZW1vcnlTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsa0RBQWtEO0FBQ2xELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN4QixvQkFBZ0IsMEJBQTBCLENBQUMsQ0FBQTtBQUMzQyxJQUFZLElBQUksV0FBTSxxQkFBcUIsQ0FBQyxDQUFBO0FBQzVDLDRCQUF3Qix3Q0FBd0MsQ0FBQyxDQUFBO0FBSWpFLFFBQVEsQ0FBQyxjQUFjLEVBQUU7SUFFckIsRUFBRSxDQUFDLGFBQWEsRUFBRTtRQUNkLElBQUksS0FBSyxHQUFHLElBQUkscUJBQVcsRUFBRSxDQUFDO1FBRTlCLE1BQU0sQ0FBQztZQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixJQUFJLE1BQU0sR0FBRztZQUNULENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDVCxDQUFDLEVBQUUsQ0FBQztTQUNQLENBQUM7UUFFRixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxpQkFBaUIsRUFBRTtRQUNuQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDaEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMs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QUcsRUFBRTtvQkFDRCxHQUFHLEVBQUU7d0JBQ0QsR0FBRyxFQUFFOzRCQUNELENBQUMsRUFBRSxDQUFDO3lCQUNQO3FCQUNKO2lCQUNKO2FBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3RzL25vZGUvdXBkYXRlcy9NZW1vcnlTdG9yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi90eXBpbmdzL3RzZC5kLnRzXCIgLz5cbnJlcXVpcmUoXCJqYXNtaW5lMi1waXRcIik7XG5pbXBvcnQgUFVMIGZyb20gXCIuLi8uLi8uLi9saWIvdXBkYXRlcy9QVUxcIjtcbmltcG9ydCAqIGFzIGplcnIgZnJvbSBcIi4uLy4uLy4uL2xpYi9lcnJvcnNcIjtcbmltcG9ydCBNZW1vcnlTdG9yZSBmcm9tIFwiLi4vLi4vLi4vbGliL3N0b3Jlcy9tZW1vcnkvTWVtb3J5U3RvcmVcIjtcblxuZGVjbGFyZSBmdW5jdGlvbiBwaXQoZXhwZWN0YXRpb246IHN0cmluZywgYXNzZXJ0aW9uPzogKGRvbmU6ICgpID0+IHZvaWQpID0+IGFueSk6IHZvaWQ7XG5cbmRlc2NyaWJlKFwiTWVtb3J5IFN0b3JlXCIsICgpID0+IHtcblxuICAgIGl0KFwic2ltcGxlIHRlc3RcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcblxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmUuZ2V0KFwiYVwiKTtcbiAgICAgICAgfSkudG9UaHJvdygpO1xuXG4gICAgICAgIHZhciBvYmplY3QgPSB7XG4gICAgICAgICAgICBhOiBbMSwgMl0sXG4gICAgICAgICAgICBiOiAyXG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iamVjdCk7XG4gICAgICAgIHZhciBvYmogPSBzdG9yZS5nZXQoaWQpO1xuICAgICAgICBleHBlY3Qob2JqKS50b0VxdWFsKG9iamVjdCk7XG4gICAgfSk7XG5cbiAgICBwaXQoXCJJbnNlcnQgJiBkZWxldGVcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgb2JqID0geyBhOiAxLCBiOiB7IGM6IDEgfSB9O1xuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iaik7XG5cbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgcHVsLmluc2VydChcImhlbGxvXCIsIHsgejogMSB9KTtcbiAgICAgICAgcHVsLnJlbW92ZShpZCk7XG4gICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKHB1bCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBleHBlY3Qoc3RvcmUuZ2V0KFwiaGVsbG9cIikpLnRvRXF1YWwoeyB6OiAxIH0pO1xuICAgICAgICAgICAgZXhwZWN0KCgpID0+IHsgc3RvcmUuZ2V0KGlkKTsgfSkudG9UaHJvdygpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHBpdChcInNpbXBsZSB1cGRhdGUgKDEpXCIsICgpID0+IHtcbiAgICAgICAgdmFyIG9iaiA9IHsgYTogMSwgYjogeyBjOiAxIH0gfTtcbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHZhciBpZCA9IHN0b3JlLnB1dChvYmopO1xuXG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bFxuICAgICAgICAgICAgLmluc2VydEludG9PYmplY3QoaWQsIFtcImJcIl0sIHsgZDogMSB9KVxuICAgICAgICAgICAgLmRlbGV0ZUZyb21PYmplY3QoaWQsIFtcImJcIl0sIFtcImNcIl0pO1xuICAgICAgICBleHBlY3Qob2JqLmJbXCJkXCJdKS50b0JlKHVuZGVmaW5lZCk7XG4gICAgICAgIGV4cGVjdChvYmouYi5jKS50b0JlKDEpO1xuXG4gICAgICAgIHZhciBzZXJpYWxpemVkUFVMID0gcHVsLnNlcmlhbGl6ZSgpO1xuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChwdWwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmouYltcImRcIl0pLnRvQmUoMSk7XG4gICAgICAgICAgICBleHBlY3Qob2JqLmIuYykudG9CZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgb2JqID0geyBhOiAxLCBiOiB7IGM6IDEgfSB9O1xuICAgICAgICAgICAgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgICAgIHN0b3JlLnB1dChvYmosIGlkKTtcbiAgICAgICAgICAgIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgICAgIHB1bC5wYXJzZShzZXJpYWxpemVkUFVMKTtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKHB1bCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgICAgICBleHBlY3Qob2JqLmJbXCJkXCJdKS50b0JlKDEpO1xuICAgICAgICAgICAgICAgIGV4cGVjdChvYmouYi5jKS50b0JlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgLy9kb25lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwaXQoXCJzaW1wbGUgdXBkYXRlICgyKVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBvYmogPSB7IGE6IDEsIGI6IHsgYzogMSB9IH07XG4gICAgICAgIHZhciBzdG9yZSA9IG5ldyBNZW1vcnlTdG9yZSgpO1xuICAgICAgICB2YXIgaWQgPSBzdG9yZS5wdXQob2JqKTtcblxuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwucmVuYW1lSW5PYmplY3QoaWQsIFtdLCBcImFcIiwgXCJ6XCIpO1xuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChwdWwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmpbXCJ6XCJdKS50b0JlKDEpO1xuICAgICAgICAgICAgZXhwZWN0KG9iai5hKS50b0JlKHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcGl0KFwic2ltcGxlIHVwZGF0ZSAoMylcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgb2JqID0geyBhOiAxLCBiOiB7IGM6IDEgfSB9O1xuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iaik7XG5cbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgcHVsLnJlbmFtZUluT2JqZWN0KGlkLCBbXSwgXCJhXCIsIFwielwiKVxuICAgICAgICAgICAgLmluc2VydEludG9PYmplY3QoaWQsIFtdLCB7IGE6IDIgfSk7XG5cbiAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgocHVsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIG9iaiA9IHN0b3JlLmdldChpZCk7XG4gICAgICAgICAgICBleHBlY3Qob2JqLmEpLnRvQmUoMik7XG4gICAgICAgICAgICBleHBlY3Qob2JqW1wielwiXSkudG9CZSgxKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwaXQoXCJzaW1wbGUgdXBkYXRlICg0KVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBvYmogPSB7IGE6IDEsIGI6IHsgYzogMSB9IH07XG4gICAgICAgIHZhciBzdG9yZSA9IG5ldyBNZW1vcnlTdG9yZSgpO1xuICAgICAgICB2YXIgaWQgPSBzdG9yZS5wdXQob2JqKTtcblxuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwuaW5zZXJ0SW50b09iamVjdChpZCwgW10sIHsgejogMSB9KVxuICAgICAgICAgICAgLmluc2VydEludG9PYmplY3QoaWQsIFtdLCB7IGE6IDIgfSk7XG5cbiAgICAgICAgLy90aHJvd3MgW0pOVVAwMDA2XSBcImFcIjogcGFpciB0byBpbnNlcnQgYWxyZWFkeSBleGlzdHMgaW4gb2JqZWN0XG4gICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKHB1bCkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICBleHBlY3QoZSBpbnN0YW5jZW9mIGplcnIuSk5VUDAwMDYpLnRvQmUodHJ1ZSk7XG4gICAgICAgICAgICAvL1wiQW4gaW5kaXZpZHVhbCBmdW5jdGlvbiBtYXkgY3JlYXRlIGFuIGludmFsaWQgSlNPTiBpbnN0YW5jZTtcbiAgICAgICAgICAgIC8vIGhvd2V2ZXIsIGFuIHVwZGF0aW5nIHF1ZXJ5IG11c3QgcHJvZHVjZSBhIHZhbGlkIEpTT04gaW5zdGFuY2Ugb25jZSB0aGUgZW50aXJlIHF1ZXJ5IGlzIGV2YWx1YXRlZCxcbiAgICAgICAgICAgIC8vIG9yIGFuIGVycm9yIGlzIHJhaXNlZCBhbmQgdGhlIGVudGlyZSB1cGRhdGUgZmFpbHMsIGxlYXZpbmcgdGhlIGluc3RhbmNlIGluIGl0cyBvcmlnaW5hbCBzdGF0ZS5cIlxuICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmouYSkudG9CZSgxKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmpbXCJ6XCJdKS50b0JlKHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy9odHRwOi8vdHJ5LnpvcmJhLmlvL3F1ZXJpZXMveHF1ZXJ5L1lMZW0wcTJlREt3RjdZYjlHeUJLSXdkVUEyMCUzRFxuICAgIC8vaHR0cDovL3RyeS56b3JiYS5pby9xdWVyaWVzL3hxdWVyeS9KNVFYOUdnSTY0TW5KbEozSUo5dkNVY0NHOG8lM0RcbiAgICBwaXQoXCJleGFtcGxlXCIsICgpID0+IHtcbiAgICAgICAgdmFyIHRvZG9zID0gW3tcbiAgICAgICAgICAgIGlkOiAwLFxuICAgICAgICAgICAgdGl0bGU6IFwiV3JpdGUgdGhlc2lzXCIsXG4gICAgICAgICAgICBjb21wbGV0ZTogZmFsc2VcbiAgICAgICAgfV07XG5cbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHZhciBpZCA9IHN0b3JlLnB1dCh0b2Rvcyk7XG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bFxuICAgICAgICAgICAgLmluc2VydEludG9BcnJheShpZCwgW10sIDEsIFt7IGlkOiAxIH1dKVxuICAgICAgICAgICAgLnJlcGxhY2VJbk9iamVjdChpZCwgW1wiMFwiXSwgXCJjb21wbGV0ZVwiLCB0cnVlKVxuICAgICAgICAgICAgLnJlbmFtZUluT2JqZWN0KGlkLCBbXCIwXCJdLCBcImNvbXBsZXRlXCIsIFwiY29tcGxldGVkXCIpXG4gICAgICAgICAgICAuaW5zZXJ0SW50b09iamVjdChpZCwgW1wiMFwiXSwgeyB0aXRsZTogXCJNb3JlIGZpZ3VyZXNcIiB9KVxuICAgICAgICAgICAgLmRlbGV0ZUZyb21PYmplY3QoaWQsIFtcIjBcIl0sIFtcInRpdGxlXCJdKTtcbiAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgocHVsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRvZG9zID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdCh0b2Rvc1swXVtcImNvbXBsZXRlZFwiXSkudG9CZSh0cnVlKTtcbiAgICAgICAgICAgIGV4cGVjdCh0b2Rvc1swXS5jb21wbGV0ZSkudG9CZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgZXhwZWN0KHRvZG9zWzBdLmlkKS50b0JlKDApO1xuICAgICAgICAgICAgZXhwZWN0KHRvZG9zWzBdLnRpdGxlKS50b0JlKFwiTW9yZSBmaWd1cmVzXCIpO1xuICAgICAgICAgICAgZXhwZWN0KHRvZG9zWzFdLmlkKS50b0JlKDEpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHBpdChcIkpOVVAwMDA4XCIsICgpID0+IHtcbiAgICAgICAgdmFyIG9iaiA9IHsgYTogMSwgYjoge30gfTtcblxuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iaik7XG5cbiAgICAgICAgdmFyIHB1bCA9IG5ldyBQVUwoKTtcbiAgICAgICAgcHVsLmluc2VydEludG9PYmplY3QoaWQsIFtcImNcIl0sIHsgYTogMSB9KTtcblxuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChwdWwpLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGUgaW5zdGFuY2VvZiBqZXJyLkpOVVAwMDA4KS50b0JlKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vaHR0cDovL3RyeS56b3JiYS5pby9xdWVyaWVzL3hxdWVyeS9nZ0dVaENVRXVPVWFWbWZ4alRPSjR5Z0RkYXMlM0RcbiAgICBwaXQoXCJyZW5hbWUgJiBpbnNlcnQgKDEpXCIsICgpID0+IHtcbiAgICAgICAgdmFyIG9iaiA9IHsgYTogMSwgYjoge30gfTtcbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHZhciBpZCA9IHN0b3JlLnB1dChvYmopO1xuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWxcbiAgICAgICAgICAgIC5pbnNlcnRJbnRvT2JqZWN0KGlkLCBbXCJiXCJdLCB7IGE6IDEgfSlcbiAgICAgICAgICAgIC5yZW5hbWVJbk9iamVjdChpZCwgW10sIFwiYlwiLCBcInpcIik7XG4gICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKHB1bCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBvYmogPSBzdG9yZS5nZXQoaWQpO1xuICAgICAgICAgICAgZXhwZWN0KG9ialtcInpcIl1bXCJhXCJdKS50b0JlKDEpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vaHR0cDovL3RyeS56b3JiYS5pby9xdWVyaWVzL3hxdWVyeS9IZGFOOG1VdnBBSWxpZnMxQ2dCbXo4Z1poUW89XG4gICAgcGl0KFwicmVuYW1lICYgaW5zZXJ0ICgyKVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBvYmogPSB7IGE6IDEgfTtcblxuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgdmFyIGlkID0gc3RvcmUucHV0KG9iaik7XG4gICAgICAgIHZhciBwdWwgPSBuZXcgUFVMKCk7XG4gICAgICAgIHB1bFxuICAgICAgICAgICAgLmluc2VydEludG9PYmplY3QoaWQsIFtdLCB7IGE6IDEgfSlcbiAgICAgICAgICAgIC5yZW5hbWVJbk9iamVjdChpZCwgW10sIFwiYVwiLCBcImJcIilcbiAgICAgICAgICAgIC5pbnNlcnQoXCJteUlEXCIsIHsgejogMSB9KTtcblxuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChwdWwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JqID0gc3RvcmUuZ2V0KGlkKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmouYSkudG9CZSgxKTtcbiAgICAgICAgICAgIGV4cGVjdChvYmpbXCJiXCJdKS50b0JlKDEpO1xuXG4gICAgICAgICAgICBvYmogPSBzdG9yZS5nZXQoXCJteUlEXCIpO1xuICAgICAgICAgICAgZXhwZWN0KG9ialtcInpcIl0pLnRvQmUoMSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy9odHRwOi8vdHJ5LnpvcmJhLmlvL3F1ZXJpZXMveHF1ZXJ5L0Q0eFklMkZYOFAxMEMxYlRLdHo2Wk5uVlJJd1dzJTNEXG4gICAgcGl0KFwiW0pOVVAwMDE2XSBzZWxlY3RvciBjYW5ub3QgYmUgcmVzb2x2ZWQgYWdhaW5zdCBzdXBwbGllZCBvYmplY3RcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgb2JqID0geyBjb21wbGV0ZWQ6IHRydWUgfTtcbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHZhciBpZCA9IHN0b3JlLnB1dChvYmopO1xuICAgICAgICB2YXIgcHVsID0gbmV3IFBVTCgpO1xuICAgICAgICBwdWwucmVuYW1lSW5PYmplY3QoaWQsIFtdLCBcImNvbXBsZXRlZFwiLCBcImNvbXBsZXRlXCIpO1xuICAgICAgICBwdWwucmVwbGFjZUluT2JqZWN0KGlkLCBbXSwgXCJjb21wbGV0ZVwiLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgocHVsKS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChlIGluc3RhbmNlb2YgamVyci5KTlVQMDAxNikudG9CZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvL2h0dHA6Ly90cnkuem9yYmEuaW8vcXVlcmllcy94cXVlcnkvdHpjWnNuN2M4c0k4Mm80NUxKVW8zU2drRU5NJTNEXG4gICAgcGl0KFwiW0pOVVAwMDA2XSBiOiBwYWlyIHRvIGluc2VydCBhbHJlYWR5IGV4aXN0cyBpbiBvYmplY3RcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgZDAgPSBuZXcgUFVMKCk7XG4gICAgICAgIGQwLmluc2VydEludG9PYmplY3QoXCIxXCIsIFtdLCB7IGE6IDEsIGI6IDEgfSk7XG5cbiAgICAgICAgdmFyIGQxID0gbmV3IFBVTCgpO1xuICAgICAgICBkMS5yZW5hbWVJbk9iamVjdChcIjFcIiwgW10sIFwiYVwiLCBcImJcIik7XG5cbiAgICAgICAgdmFyIHN0b3JlID0gbmV3IE1lbW9yeVN0b3JlKCk7XG4gICAgICAgIHN0b3JlLnB1dCh7fSwgXCIxXCIpO1xuICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChkMCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuY29tbWl0V2l0aChkMSk7XG4gICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGUgaW5zdGFuY2VvZiBqZXJyLkpOVVAwMDA2KS50b0JlKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwiUmVwbGFjZUluT2JqZWN0ICgxKVwiLCAoKSA9PiB7XG4gICAgICAgIHZhciBkMCA9IG5ldyBQVUwoKTtcbiAgICAgICAgZDAucmVwbGFjZUluT2JqZWN0KFwiMVwiLCBbXSwgXCJhXCIsIHsgYjogMSB9KTtcblxuICAgICAgICB2YXIgZDEgPSBuZXcgUFVMKCk7XG4gICAgICAgIGQxLnJlbmFtZUluT2JqZWN0KFwiMVwiLCBbXCJhXCJdLCBcImJcIiwgXCJjXCIpO1xuXG4gICAgICAgIHZhciBzdG9yZSA9IG5ldyBNZW1vcnlTdG9yZSgpO1xuICAgICAgICBzdG9yZS5wdXQoeyBhOiB7fSB9LCBcIjFcIik7XG4gICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKGQwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdG9yZS5jb21taXRXaXRoKGQxKTtcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBleHBlY3QoXy5pc0VxdWFsKHN0b3JlLnNuYXBzaG90LCB7XG4gICAgICAgICAgICAgICAgXCIxXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY1wiOiAxXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSkudG9CZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwaXQoXCJSZW5hbWVJbk9iamVjdCAoMilcIiwgKCkgPT4ge1xuICAgICAgICB2YXIgZDAgPSBuZXcgUFVMKCk7XG4gICAgICAgIGQwLnJlcGxhY2VJbk9iamVjdChcIjFcIiwgW1wiYVwiXSwgXCJiXCIsIHsgYzogMSB9KTtcblxuICAgICAgICB2YXIgZDEgPSBuZXcgUFVMKCk7XG4gICAgICAgIGQxLnJlbmFtZUluT2JqZWN0KFwiMVwiLCBbXCJhXCIsIFwiYlwiXSwgXCJjXCIsIFwiZFwiKTtcblxuICAgICAgICB2YXIgc3RvcmUgPSBuZXcgTWVtb3J5U3RvcmUoKTtcbiAgICAgICAgc3RvcmUucHV0KHsgYTogeyBiOiB7IGM6IDEgfSB9IH0sIFwiMVwiKTtcbiAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgoZDApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlLmNvbW1pdFdpdGgoZDEpO1xuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGV4cGVjdChzdG9yZS5zbmFwc2hvdCkudG9FcXVhbCh7XG4gICAgICAgICAgICAgICAgXCIxXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYlwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDogMVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=