UNPKG

@specifai-net/appsync-template-tester

Version:

Unit test AppSync VTL resolvers, with popular frameworks such as Jest

196 lines 26.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const util_1 = require("../util"); /** * Tests are predominantly generated by running these objects through an AppSync resolver tester (on a real resolver) */ test("qr returns blank string", () => { const res = (0, util_1.qr)(); expect(res).toBe(""); }); test("quiet returns blank string", () => { const res = (0, util_1.quiet)(); expect(res).toBe(""); }); test("escapeJavaScrip escapes JavaScript (not necessarily in exactly the same way as AppSync)", () => { const str = "' ? ! ` /"; const res = (0, util_1.escapeJavaScript)(str); expect(res).not.toBe(str); }); test("urlEncode encodes URLs in the same way as AppSync", () => { const str = "/hi?page=1&test=2"; const expected = "%2Fhi%3Fpage%3D1%26test%3D2"; const res = (0, util_1.urlEncode)(str); expect(res).toBe(expected); }); test("urlDecode decodes URLs in the same way as AppSync", () => { const str = "%2Fhi%3Fpage%3D1%26test%3D2"; const expected = "/hi?page=1&test=2"; const res = (0, util_1.urlDecode)(str); expect(res).toBe(expected); }); test("base64Encode encodes in the same way as AppSync", () => { const str = "hello()"; const expected = "aGVsbG8oKQ=="; const res = (0, util_1.base64Encode)(str); expect(res).toBe(expected); }); test("base64Decode decodes in the same way as AppSync", () => { const buffer = "aGVsbG8oKQ=="; const expected = "hello()"; const res = (0, util_1.base64Decode)(buffer); expect(res).toBe(expected); }); test("parseJson parses a JSON string and returns the object", () => { const obj = { testKey: "testValue", }; const json = JSON.stringify(obj); const res = (0, util_1.parseJson)(json); expect(res).toEqual(obj); }); test("toJson stringifies an object", () => { const obj = { testKey: "testValue", }; const json = JSON.stringify(obj); const res = (0, util_1.toJson)(obj); expect(res).toBe(json); }); test("toJson stringifies an string", () => { const obj = "testValue"; const json = JSON.stringify(obj); const res = (0, util_1.toJson)(obj); expect(res).toBe(json); }); test("autoId returns a 128-bit ID", () => { const res = (0, util_1.autoId)(); const expectedFormat = /^[\w\d]{8}-[\w\d]{4}-[\w\d]{4}-[\w\d]{4}-[\w\d]{12}$/; expect(res).toMatch(expectedFormat); }); test("unauthorized", () => { expect(() => (0, util_1.unauthorized)()).toThrow("Unauthorized"); }); describe("error", () => { test("throws first string argument if given", () => { const testMessage = "errorMessage"; expect(() => (0, util_1.error)(testMessage)).toThrow(testMessage); }); test("does nothing with no arguments", () => { (0, util_1.error)(); }); }); test("appendError does nothing", () => { (0, util_1.appendError)(); }); describe("validate", () => { test("false throws an error", () => { const testMessage = "errorMessage"; expect(() => (0, util_1.validate)(false, testMessage)).toThrow(testMessage); }); test("true returns a blank string", () => { const result = (0, util_1.validate)(true, "errorMessage"); expect(result).toBe(""); }); }); describe("isNull", () => { test.each([ [null, true], [undefined, true], ["", false], ["\t", false], ["sdfasdf", false], ])("isNull(%p) -> %p", (input, expected) => { const res = (0, util_1.isNull)(input); expect(res).toBe(expected); }); }); describe("isNullOrEmpty", () => { test.each([ [null, true], [undefined, true], ["", true], ["\t", false], ["sdfasdf", false], ])("isNullOrEmpty(%p) -> %p", (input, expected) => { const res = (0, util_1.isNullOrEmpty)(input); expect(res).toBe(expected); }); }); describe("isNullOrBlank", () => { test.each([ [null, true], [undefined, true], ["", true], ["\t", true], ["sdfasdf", false], ])("isNullOrBlank(%p) -> %p", (input, expected) => { const res = (0, util_1.isNullOrBlank)(input); expect(res).toBe(expected); }); }); describe("defaultIfNull", () => { test.each([ [null, true], ["", false], ["\t", false], ["sdfasdf", false], ])("defaultIfNull(%p) -> %p", (obj, expectShowDefault) => { const defaultObj = "default"; const res = (0, util_1.defaultIfNull)(obj, defaultObj); const expected = expectShowDefault ? defaultObj : obj; expect(res).toBe(expected); }); }); describe("defaultIfNullOrEmpty", () => { test.each([ [null, true], ["", true], ["\t", false], ["sdfasdf", false], ])("defaultIfNullOrEmpty(%p) -> %p", (obj, expectShowDefault) => { const defaultObj = "default"; const res = (0, util_1.defaultIfNullOrEmpty)(obj, defaultObj); const expected = expectShowDefault ? defaultObj : obj; expect(res).toBe(expected); }); }); describe("defaultIfNullOrBlank", () => { test.each([ [null, true], ["", true], ["\t", true], ["sdfasdf", false], ])("defaultIfNullOrBlank(%p) -> %p", (obj, expectShowDefault) => { const defaultObj = "default"; const res = (0, util_1.defaultIfNullOrBlank)(obj, defaultObj); const expected = expectShowDefault ? defaultObj : obj; expect(res).toBe(expected); }); }); describe("type checking", () => { test.each ` value | isStr | isNum | isBool | isLst | isMp | typ ${null} | ${false} | ${false} | ${false} | ${false} | ${false} | ${"Null"} ${"abc"} | ${true} | ${false} | ${false} | ${false} | ${false} | ${"String"} ${""} | ${true} | ${false} | ${false} | ${false} | ${false} | ${"String"} ${1} | ${false} | ${true} | ${false} | ${false} | ${false} | ${"Number"} ${0} | ${false} | ${true} | ${false} | ${false} | ${false} | ${"Number"} ${false} | ${false} | ${false} | ${true} | ${false} | ${false} | ${"Boolean"} ${true} | ${false} | ${false} | ${true} | ${false} | ${false} | ${"Boolean"} ${[]} | ${false} | ${false} | ${false} | ${true} | ${false} | ${"List"} ${{}} | ${false} | ${false} | ${false} | ${false} | ${true} | ${"Map"} `("the type for value %p is detected correctly", ({ value, isStr, isNum, isBool, isLst, isMp, typ }) => { expect((0, util_1.isString)(value)).toBe(isStr); expect((0, util_1.isNumber)(value)).toBe(isNum); expect((0, util_1.isBoolean)(value)).toBe(isBool); expect((0, util_1.isList)(value)).toBe(isLst); expect((0, util_1.isMap)(value)).toBe(isMp); expect((0, util_1.typeOf)(value)).toBe(typ); }); }); test("matches", () => { const res = (0, util_1.matches)("^a", "a"); expect(res).toBeTruthy(); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RzL3V0aWwudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQTRCaUI7QUFFakI7O0dBRUc7QUFFSCxJQUFJLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO0lBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUEsU0FBRSxHQUFFLENBQUM7SUFDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUU7SUFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBQSxZQUFLLEdBQUUsQ0FBQztJQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLHlGQUF5RixFQUFFLEdBQUcsRUFBRTtJQUNuRyxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUM7SUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxtREFBbUQsRUFBRSxHQUFHLEVBQUU7SUFDN0QsTUFBTSxHQUFHLEdBQUcsbUJBQW1CLENBQUM7SUFDaEMsTUFBTSxRQUFRLEdBQUcsNkJBQTZCLENBQUM7SUFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBQSxnQkFBUyxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0IsQ0FBQyxDQUFDLENBQUM7QUFFSCxJ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TUFBTSxDQUFDLElBQUEsZUFBUSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxJQUFBLGdCQUFTLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLElBQUEsYUFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxJQUFBLFlBQUssRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsSUFBQSxhQUFNLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ25CLE1BQU0sR0FBRyxHQUFHLElBQUEsY0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBlc2NhcGVKYXZhU2NyaXB0LFxuICBxcixcbiAgcXVpZXQsXG4gIHVybEVuY29kZSxcbiAgdXJsRGVjb2RlLFxuICBiYXNlNjRFbmNvZGUsXG4gIGJhc2U2NERlY29kZSxcbiAgcGFyc2VKc29uLFxuICB0b0pzb24sXG4gIGF1dG9JZCxcbiAgdW5hdXRob3JpemVkLFxuICBlcnJvcixcbiAgYXBwZW5kRXJyb3IsXG4gIHZhbGlkYXRlLFxuICBpc051bGwsXG4gIGlzTnVsbE9yRW1wdHksXG4gIGlzTnVsbE9yQmxhbmssXG4gIGRlZmF1bHRJZk51bGwsXG4gIGRlZmF1bHRJZk51bGxPckVtcHR5LFxuICBkZWZhdWx0SWZOdWxsT3JCbGFuayxcbiAgaXNTdHJpbmcsXG4gIGlzTnVtYmVyLFxuICBpc0Jvb2xlYW4sXG4gIGlzTGlzdCxcbiAgaXNNYXAsXG4gIHR5cGVPZixcbiAgbWF0Y2hlcyxcbn0gZnJvbSBcIi4uL3V0aWxcIjtcblxuLyoqXG4gKiBUZXN0cyBhcmUgcHJlZG9taW5hbnRseSBnZW5lcmF0ZWQgYnkgcnVubmluZyB0aGVzZSBvYmplY3RzIHRocm91Z2ggYW4gQXBwU3luYyByZXNvbHZlciB0ZXN0ZXIgKG9uIGEgcmVhbCByZXNvbHZlcilcbiAqL1xuXG50ZXN0KFwicXIgcmV0dXJucyBibGFuayBzdHJpbmdcIiwgKCkgPT4ge1xuICBjb25zdCByZXMgPSBxcigpO1xuICBleHBlY3QocmVzKS50b0JlKFwiXCIpO1xufSk7XG5cbnRlc3QoXCJxdWlldCByZXR1cm5zIGJsYW5rIHN0cmluZ1wiLCAoKSA9PiB7XG4gIGNvbnN0IHJlcyA9IHF1aWV0KCk7XG4gIGV4cGVjdChyZXMpLnRvQmUoXCJcIik7XG59KTtcblxudGVzdChcImVzY2FwZUphdmFTY3JpcCBlc2NhcGVzIEphdmFTY3JpcHQgKG5vdCBuZWNlc3NhcmlseSBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBBcHBTeW5jKVwiLCAoKSA9PiB7XG4gIGNvbnN0IHN0ciA9IFwiJyA/ICEgYCAgL1wiO1xuICBjb25zdCByZXMgPSBlc2NhcGVKYXZhU2NyaXB0KHN0cik7XG4gIGV4cGVjdChyZXMpLm5vdC50b0JlKHN0cik7XG59KTtcblxudGVzdChcInVybEVuY29kZSBlbmNvZGVzIFVSTHMgaW4gdGhlIHNhbWUgd2F5IGFzIEFwcFN5bmNcIiwgKCkgPT4ge1xuICBjb25zdCBzdHIgPSBcIi9oaT9wYWdlPTEmdGVzdD0yXCI7XG4gIGNvbnN0IGV4cGVjdGVkID0gXCIlMkZoaSUzRnBhZ2UlM0QxJTI2dGVzdCUzRDJcIjtcbiAgY29uc3QgcmVzID0gdXJsRW5jb2RlKHN0cik7XG4gIGV4cGVjdChyZXMpLnRvQmUoZXhwZWN0ZWQpO1xufSk7XG5cbnRlc3QoXCJ1cmxEZWNvZGUgZGVjb2RlcyBVUkxzIGluIHRoZSBzYW1lIHdheSBhcyBBcHBTeW5jXCIsICgpID0+IHtcbiAgY29uc3Qgc3RyID0gXCIlMkZoaSUzRnBhZ2UlM0QxJTI2dGVzdCUzRDJcIjtcbiAgY29uc3QgZXhwZWN0ZWQgPSBcIi9oaT9wYWdlPTEmdGVzdD0yXCI7XG4gIGNvbnN0IHJlcyA9IHVybERlY29kZShzdHIpO1xuICBleHBlY3QocmVzKS50b0JlKGV4cGVjdGVkKTtcbn0pO1xuXG50ZXN0KFwiYmFzZTY0RW5jb2RlIGVuY29kZXMgaW4gdGhlIHNhbWUgd2F5IGFzIEFwcFN5bmNcIiwgKCkgPT4ge1xuICBjb25zdCBzdHIgPSBcImhlbGxvKClcIjtcbiAgY29uc3QgZXhwZWN0ZWQgPSBcImFHVnNiRzhvS1E9PVwiO1xuICBjb25zdCByZXMgPSBiYXNlNjRFbmNvZGUoc3RyKTtcbiAgZXhwZWN0KHJlcykudG9CZShleHBlY3RlZCk7XG59KTtcblxudGVzdChcImJhc2U2NERlY29kZSBkZWNvZGVzIGluIHRoZSBzYW1lIHdheSBhcyBBcHBTeW5jXCIsICgpID0+IHtcbiAgY29uc3QgYnVmZmVyID0gXCJhR1ZzYkc4b0tRPT1cIjtcbiAgY29uc3QgZXhwZWN0ZWQgPSBcImhlbGxvKClcIjtcbiAgY29uc3QgcmVzID0gYmFzZTY0RGVjb2RlKGJ1ZmZlcik7XG4gIGV4cGVjdChyZXMpLnRvQmUoZXhwZWN0ZWQpO1xufSk7XG5cbnRlc3QoXCJwYXJzZUpzb24gcGFyc2VzIGEgSlNPTiBzdHJpbmcgYW5kIHJldHVybnMgdGhlIG9iamVjdFwiLCAoKSA9PiB7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICB0ZXN0S2V5OiBcInRlc3RWYWx1ZVwiLFxuICB9O1xuICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgY29uc3QgcmVzID0gcGFyc2VKc29uKGpzb24pO1xuICBleHBlY3QocmVzKS50b0VxdWFsKG9iaik7XG59KTtcblxudGVzdChcInRvSnNvbiBzdHJpbmdpZmllcyBhbiBvYmplY3RcIiwgKCkgPT4ge1xuICBjb25zdCBvYmogPSB7XG4gICAgdGVzdEtleTogXCJ0ZXN0VmFsdWVcIixcbiAgfTtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KG9iaik7XG4gIGNvbnN0IHJlcyA9IHRvSnNvbihvYmopO1xuICBleHBlY3QocmVzKS50b0JlKGpzb24pO1xufSk7XG5cbnRlc3QoXCJ0b0pzb24gc3RyaW5naWZpZXMgYW4gc3RyaW5nXCIsICgpID0+IHtcbiAgY29uc3Qgb2JqID0gXCJ0ZXN0VmFsdWVcIjtcbiAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KG9iaik7XG4gIGNvbnN0IHJlcyA9IHRvSnNvbihvYmopO1xuICBleHBlY3QocmVzKS50b0JlKGpzb24pO1xufSk7XG5cbnRlc3QoXCJhdXRvSWQgcmV0dXJucyBhIDEyOC1iaXQgSURcIiwgKCkgPT4ge1xuICBjb25zdCByZXMgPSBhdXRvSWQoKTtcbiAgY29uc3QgZXhwZWN0ZWRGb3JtYXQgPSAvXltcXHdcXGRdezh9LVtcXHdcXGRdezR9LVtcXHdcXGRdezR9LVtcXHdcXGRdezR9LVtcXHdcXGRdezEyfSQvO1xuICBleHBlY3QocmVzKS50b01hdGNoKGV4cGVjdGVkRm9ybWF0KTtcbn0pO1xuXG50ZXN0KFwidW5hdXRob3JpemVkXCIsICgpID0+IHtcbiAgZXhwZWN0KCgpID0+IHVuYXV0aG9yaXplZCgpKS50b1Rocm93KFwiVW5hdXRob3JpemVkXCIpO1xufSk7XG5cbmRlc2NyaWJlKFwiZXJyb3JcIiwgKCkgPT4ge1xuICB0ZXN0KFwidGhyb3dzIGZpcnN0IHN0cmluZyBhcmd1bWVudCBpZiBnaXZlblwiLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdE1lc3NhZ2UgPSBcImVycm9yTWVzc2FnZVwiO1xuICAgIGV4cGVjdCgoKSA9PiBlcnJvcih0ZXN0TWVzc2FnZSkpLnRvVGhyb3codGVzdE1lc3NhZ2UpO1xuICB9KTtcblxuICB0ZXN0KFwiZG9lcyBub3RoaW5nIHdpdGggbm8gYXJndW1lbnRzXCIsICgpID0+IHtcbiAgICBlcnJvcigpO1xuICB9KTtcbn0pO1xuXG50ZXN0KFwiYXBwZW5kRXJyb3IgZG9lcyBub3RoaW5nXCIsICgpID0+IHtcbiAgYXBwZW5kRXJyb3IoKTtcbn0pO1xuXG5kZXNjcmliZShcInZhbGlkYXRlXCIsICgpID0+IHtcbiAgdGVzdChcImZhbHNlIHRocm93cyBhbiBlcnJvclwiLCAoKSA9PiB7XG4gICAgY29uc3QgdGVzdE1lc3NhZ2UgPSBcImVycm9yTWVzc2FnZVwiO1xuICAgIGV4cGVjdCgoKSA9PiB2YWxpZGF0ZShmYWxzZSwgdGVzdE1lc3NhZ2UpKS50b1Rocm93KHRlc3RNZXNzYWdlKTtcbiAgfSk7XG5cbiAgdGVzdChcInRydWUgcmV0dXJucyBhIGJsYW5rIHN0cmluZ1wiLCAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGUodHJ1ZSwgXCJlcnJvck1lc3NhZ2VcIik7XG4gICAgZXhwZWN0KHJlc3VsdCkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJpc051bGxcIiwgKCkgPT4ge1xuICB0ZXN0LmVhY2goW1xuICAgIFtudWxsLCB0cnVlXSxcbiAgICBbdW5kZWZpbmVkLCB0cnVlXSxcbiAgICBbXCJcIiwgZmFsc2VdLFxuICAgIFtcIlxcdFwiLCBmYWxzZV0sXG4gICAgW1wic2RmYXNkZlwiLCBmYWxzZV0sXG4gIF0pKFwiaXNOdWxsKCVwKSAtPiAlcFwiLCAoaW5wdXQsIGV4cGVjdGVkKSA9PiB7XG4gICAgY29uc3QgcmVzID0gaXNOdWxsKGlucHV0KTtcbiAgICBleHBlY3QocmVzKS50b0JlKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJpc051bGxPckVtcHR5XCIsICgpID0+IHtcbiAgdGVzdC5lYWNoKFtcbiAgICBbbnVsbCwgdHJ1ZV0sXG4gICAgW3VuZGVmaW5lZCwgdHJ1ZV0sXG4gICAgW1wiXCIsIHRydWVdLFxuICAgIFtcIlxcdFwiLCBmYWxzZV0sXG4gICAgW1wic2RmYXNkZlwiLCBmYWxzZV0sXG4gIF0pKFwiaXNOdWxsT3JFbXB0eSglcCkgLT4gJXBcIiwgKGlucHV0LCBleHBlY3RlZCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGlzTnVsbE9yRW1wdHkoaW5wdXQpO1xuICAgIGV4cGVjdChyZXMpLnRvQmUoZXhwZWN0ZWQpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImlzTnVsbE9yQmxhbmtcIiwgKCkgPT4ge1xuICB0ZXN0LmVhY2goW1xuICAgIFtudWxsLCB0cnVlXSxcbiAgICBbdW5kZWZpbmVkLCB0cnVlXSxcbiAgICBbXCJcIiwgdHJ1ZV0sXG4gICAgW1wiXFx0XCIsIHRydWVdLFxuICAgIFtcInNkZmFzZGZcIiwgZmFsc2VdLFxuICBdKShcImlzTnVsbE9yQmxhbmsoJXApIC0+ICVwXCIsIChpbnB1dCwgZXhwZWN0ZWQpID0+IHtcbiAgICBjb25zdCByZXMgPSBpc051bGxPckJsYW5rKGlucHV0KTtcbiAgICBleHBlY3QocmVzKS50b0JlKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJkZWZhdWx0SWZOdWxsXCIsICgpID0+IHtcbiAgdGVzdC5lYWNoKFtcbiAgICBbbnVsbCwgdHJ1ZV0sXG4gICAgW1wiXCIsIGZhbHNlXSxcbiAgICBbXCJcXHRcIiwgZmFsc2VdLFxuICAgIFtcInNkZmFzZGZcIiwgZmFsc2VdLFxuICBdKShcImRlZmF1bHRJZk51bGwoJXApIC0+ICVwXCIsIChvYmosIGV4cGVjdFNob3dEZWZhdWx0KSA9PiB7XG4gICAgY29uc3QgZGVmYXVsdE9iaiA9IFwiZGVmYXVsdFwiO1xuICAgIGNvbnN0IHJlcyA9IGRlZmF1bHRJZk51bGwob2JqLCBkZWZhdWx0T2JqKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IGV4cGVjdFNob3dEZWZhdWx0ID8gZGVmYXVsdE9iaiA6IG9iajtcbiAgICBleHBlY3QocmVzKS50b0JlKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJkZWZhdWx0SWZOdWxsT3JFbXB0eVwiLCAoKSA9PiB7XG4gIHRlc3QuZWFjaChbXG4gICAgW251bGwsIHRydWVdLFxuICAgIFtcIlwiLCB0cnVlXSxcbiAgICBbXCJcXHRcIiwgZmFsc2VdLFxuICAgIFtcInNkZmFzZGZcIiwgZmFsc2VdLFxuICBdKShcImRlZmF1bHRJZk51bGxPckVtcHR5KCVwKSAtPiAlcFwiLCAob2JqLCBleHBlY3RTaG93RGVmYXVsdCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRPYmogPSBcImRlZmF1bHRcIjtcbiAgICBjb25zdCByZXMgPSBkZWZhdWx0SWZOdWxsT3JFbXB0eShvYmosIGRlZmF1bHRPYmopO1xuICAgIGNvbnN0IGV4cGVjdGVkID0gZXhwZWN0U2hvd0RlZmF1bHQgPyBkZWZhdWx0T2JqIDogb2JqO1xuICAgIGV4cGVjdChyZXMpLnRvQmUoZXhwZWN0ZWQpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImRlZmF1bHRJZk51bGxPckJsYW5rXCIsICgpID0+IHtcbiAgdGVzdC5lYWNoKFtcbiAgICBbbnVsbCwgdHJ1ZV0sXG4gICAgW1wiXCIsIHRydWVdLFxuICAgIFtcIlxcdFwiLCB0cnVlXSxcbiAgICBbXCJzZGZhc2RmXCIsIGZhbHNlXSxcbiAgXSkoXCJkZWZhdWx0SWZOdWxsT3JCbGFuayglcCkgLT4gJXBcIiwgKG9iaiwgZXhwZWN0U2hvd0RlZmF1bHQpID0+IHtcbiAgICBjb25zdCBkZWZhdWx0T2JqID0gXCJkZWZhdWx0XCI7XG4gICAgY29uc3QgcmVzID0gZGVmYXVsdElmTnVsbE9yQmxhbmsob2JqLCBkZWZhdWx0T2JqKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IGV4cGVjdFNob3dEZWZhdWx0ID8gZGVmYXVsdE9iaiA6IG9iajtcbiAgICBleHBlY3QocmVzKS50b0JlKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJ0eXBlIGNoZWNraW5nXCIsICgpID0+IHtcbiAgdGVzdC5lYWNoYFxuICAgIHZhbHVlICAgIHwgaXNTdHIgICAgfCBpc051bSAgICB8IGlzQm9vbCAgIHwgaXNMc3QgICAgfCBpc01wICAgICB8IHR5cFxuICAgICR7bnVsbH0gIHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7ZmFsc2V9IHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7XCJOdWxsXCJ9XG4gICAgJHtcImFiY1wifSB8ICR7dHJ1ZX0gIHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7ZmFsc2V9IHwgJHtmYWxzZX0gfCAke1wiU3RyaW5nXCJ9XG4gICAgJHtcIlwifSAgICB8ICR7dHJ1ZX0gIHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7ZmFsc2V9IHwgJHtmYWxzZX0gfCAke1wiU3RyaW5nXCJ9XG4gICAgJHsxfSAgICAgfCAke2ZhbHNlfSB8ICR7dHJ1ZX0gIHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7ZmFsc2V9IHwgJHtcIk51bWJlclwifVxuICAgICR7MH0gICAgIHwgJHtmYWxzZX0gfCAke3RydWV9ICB8ICR7ZmFsc2V9IHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7XCJOdW1iZXJcIn1cbiAgICAke2ZhbHNlfSB8ICR7ZmFsc2V9IHwgJHtmYWxzZX0gfCAke3RydWV9ICB8ICR7ZmFsc2V9IHwgJHtmYWxzZX0gfCAke1wiQm9vbGVhblwifVxuICAgICR7dHJ1ZX0gIHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7dHJ1ZX0gIHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7XCJCb29sZWFuXCJ9XG4gICAgJHtbXX0gICAgfCAke2ZhbHNlfSB8ICR7ZmFsc2V9IHwgJHtmYWxzZX0gfCAke3RydWV9ICB8ICR7ZmFsc2V9IHwgJHtcIkxpc3RcIn1cbiAgICAke3t9fSAgICB8ICR7ZmFsc2V9IHwgJHtmYWxzZX0gfCAke2ZhbHNlfSB8ICR7ZmFsc2V9IHwgJHt0cnVlfSAgfCAke1wiTWFwXCJ9XG4gIGAoXG4gICAgXCJ0aGUgdHlwZSBmb3IgdmFsdWUgJXAgaXMgZGV0ZWN0ZWQgY29ycmVjdGx5XCIsXG4gICAgKHsgdmFsdWUsIGlzU3RyLCBpc051bSwgaXNCb29sLCBpc0xzdCwgaXNNcCwgdHlwIH0pID0+IHtcbiAgICAgIGV4cGVjdChpc1N0cmluZyh2YWx1ZSkpLnRvQmUoaXNTdHIpO1xuICAgICAgZXhwZWN0KGlzTnVtYmVyKHZhbHVlKSkudG9CZShpc051bSk7XG4gICAgICBleHBlY3QoaXNCb29sZWFuKHZhbHVlKSkudG9CZShpc0Jvb2wpO1xuICAgICAgZXhwZWN0KGlzTGlzdCh2YWx1ZSkpLnRvQmUoaXNMc3QpO1xuICAgICAgZXhwZWN0KGlzTWFwKHZhbHVlKSkudG9CZShpc01wKTtcbiAgICAgIGV4cGVjdCh0eXBlT2YodmFsdWUpKS50b0JlKHR5cCk7XG4gICAgfVxuICApO1xufSk7XG5cbnRlc3QoXCJtYXRjaGVzXCIsICgpID0+IHtcbiAgY29uc3QgcmVzID0gbWF0Y2hlcyhcIl5hXCIsIFwiYVwiKTtcbiAgZXhwZWN0KHJlcykudG9CZVRydXRoeSgpO1xufSk7XG4iXX0=