UNPKG

@specifai-net/appsync-template-tester

Version:

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

148 lines 18 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const index_1 = __importDefault(require("../index")); test("Simple vtl returns correctly", () => { const vtl = '$utils.toJson({"test": true})'; const parser = new index_1.default(vtl); const result = parser.resolve({}); expect(result).toEqual({ test: true }); }); test("util.qr hides result", () => { const vtl = ` #set($array = []) $util.qr($array.add(1)) {"test": $array}`; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toEqual({ test: [1] }); // expect(res.includes('$util.qr($array.add("element in array"))')).toBeFalsy(); }); test("util.quiet hides result", () => { const vtl = ` #set($array = []) $util.quiet($array.add(1)) {"test": $array}`; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toEqual({ test: [1] }); }); test("util.validate hides result if valid", () => { const vtl = ` $util.validate(true, "Error") {}`; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toEqual({}); }); test("resolve with additional util", () => { const mockRdsToJsonObject = jest.fn(); const rdsResult = "rds result text"; mockRdsToJsonObject.mockImplementationOnce((args) => { return args === rdsResult ? [10] : []; }); const additionalUtil = { rds: { toJsonObject: mockRdsToJsonObject, }, }; const vtl = ` #set($response = $utils.rds.toJsonObject($ctx.result)[0]) {"test": $response}`; const parser = new index_1.default(vtl); const res = parser.resolve({ result: rdsResult }, additionalUtil); expect(res).toEqual({ test: 10 }); }); test("valueMapper works correctly", () => { const vtl = ` #set($array = [1,2,3]) { "test": $array.contains(1) }`; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toEqual({ test: true }); }); test("#return can return an object early", () => { const vtl = ` #return({"result": "A"}) {"result": "B"}`; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toEqual({ result: "A" }); }); test("#return returns null if called without arguments", () => { const vtl = ` #return() {"result": "B"}`; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toEqual(null); }); describe("$context.stash keeps data", () => { test("Keep initial data", () => { const vtl = ""; const parser = new index_1.default(vtl); parser.resolve({ stash: { key: "value" }, }); expect(parser.stash).toStrictEqual({ key: "value" }); }); test("Keep resolved data", () => { const vtl = '$ctx.stash.put("key", "value")'; const parser = new index_1.default(vtl); parser.resolve({}); expect(parser.stash).toStrictEqual({ key: "value" }); }); }); describe("Typecasting works as expected", () => { test("Boolean false", () => { const vtl = "\nfalse "; // Note surrounding whitespace should be ignored const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toBe(false); }); test("Boolean true", () => { const vtl = "true"; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toBe(true); }); test("Null", () => { const vtl = "null"; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toBe(null); }); test("Integer", () => { const vtl = "123"; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toBe(123); }); test("Float", () => { const vtl = "123.456"; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toBe(123.456); }); test("JSON", () => { const vtl = '{"test": true}'; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toEqual({ test: true }); }); test("Array", () => { const vtl = "[1,2,3]"; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toEqual([1, 2, 3]); }); test("String", () => { const vtl = "abc123"; const parser = new index_1.default(vtl); const res = parser.resolve({}); expect(res).toBe("abc123"); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0cy9pbmRleC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBQThCO0FBRTlCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsTUFBTSxHQUFHLEdBQUcsK0JBQStCLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLE1BQU0sR0FBRyxHQUFHOzs7bUJBR0ssQ0FBQztJQUNsQixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsZ0ZBQWdGO0FBQ2xGLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtJQUNuQyxNQUFNLEdBQUcsR0FBRzs7O21CQUdLLENBQUM7SUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtJQUMvQyxNQUFNLEdBQUcsR0FBRzs7S0FFVCxDQUFDO0lBQ0osTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtJQUN4QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUN0QyxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQztJQUNwQyxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2xELE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxjQUFjLEdBQUc7UUFDckIsR0FBRyxFQUFFO1lBQ0gsWUFBWSxFQUFFLG1CQUFtQjtTQUNsQztLQUNGLENBQUM7SUFDRixNQUFNLEdBQUcsR0FBRzs7c0JBRVEsQ0FBQztJQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7SUFDdkMsTUFBTSxHQUFHLEdBQUc7O2lDQUVtQixDQUFDO0lBQ2hDLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtJQUM5QyxNQUFNLEdBQUcsR0FBRzs7a0JBRUksQ0FBQztJQUNqQixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN2QyxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7SUFDNUQsTUFBTSxHQUFHLEdBQUc7O2tCQUVJLENBQUM7SUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtJQUN6QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxFQUFFO1FBQzdCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNmLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDYixLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFO1NBQ3hCLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQzlCLE1BQU0sR0FBRyxHQUFHLGdDQUFnQyxDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtJQUM3QyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtRQUN6QixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxnREFBZ0Q7UUFDeEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDeEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBQ25CLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUNuQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDakIsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDakIsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZXIgZnJvbSBcIi4uL2luZGV4XCI7XG5cbnRlc3QoXCJTaW1wbGUgdnRsIHJldHVybnMgY29ycmVjdGx5XCIsICgpID0+IHtcbiAgY29uc3QgdnRsID0gJyR1dGlscy50b0pzb24oe1widGVzdFwiOiB0cnVlfSknO1xuICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHZ0bCk7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7IHRlc3Q6IHRydWUgfSk7XG59KTtcblxudGVzdChcInV0aWwucXIgaGlkZXMgcmVzdWx0XCIsICgpID0+IHtcbiAgY29uc3QgdnRsID0gYFxuICAjc2V0KCRhcnJheSA9IFtdKVxuICAkdXRpbC5xcigkYXJyYXkuYWRkKDEpKVxuICB7XCJ0ZXN0XCI6ICRhcnJheX1gO1xuICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHZ0bCk7XG4gIGNvbnN0IHJlcyA9IHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgZXhwZWN0KHJlcykudG9FcXVhbCh7IHRlc3Q6IFsxXSB9KTtcbiAgLy8gZXhwZWN0KHJlcy5pbmNsdWRlcygnJHV0aWwucXIoJGFycmF5LmFkZChcImVsZW1lbnQgaW4gYXJyYXlcIikpJykpLnRvQmVGYWxzeSgpO1xufSk7XG5cbnRlc3QoXCJ1dGlsLnF1aWV0IGhpZGVzIHJlc3VsdFwiLCAoKSA9PiB7XG4gIGNvbnN0IHZ0bCA9IGBcbiAgI3NldCgkYXJyYXkgPSBbXSlcbiAgJHV0aWwucXVpZXQoJGFycmF5LmFkZCgxKSlcbiAge1widGVzdFwiOiAkYXJyYXl9YDtcbiAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICBjb25zdCByZXMgPSBwYXJzZXIucmVzb2x2ZSh7fSk7XG4gIGV4cGVjdChyZXMpLnRvRXF1YWwoeyB0ZXN0OiBbMV0gfSk7XG59KTtcblxudGVzdChcInV0aWwudmFsaWRhdGUgaGlkZXMgcmVzdWx0IGlmIHZhbGlkXCIsICgpID0+IHtcbiAgY29uc3QgdnRsID0gYFxuICAkdXRpbC52YWxpZGF0ZSh0cnVlLCBcIkVycm9yXCIpXG4gIHt9YDtcbiAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICBjb25zdCByZXMgPSBwYXJzZXIucmVzb2x2ZSh7fSk7XG4gIGV4cGVjdChyZXMpLnRvRXF1YWwoe30pO1xufSk7XG5cbnRlc3QoXCJyZXNvbHZlIHdpdGggYWRkaXRpb25hbCB1dGlsXCIsICgpID0+IHtcbiAgY29uc3QgbW9ja1Jkc1RvSnNvbk9iamVjdCA9IGplc3QuZm4oKTtcbiAgY29uc3QgcmRzUmVzdWx0ID0gXCJyZHMgcmVzdWx0IHRleHRcIjtcbiAgbW9ja1Jkc1RvSnNvbk9iamVjdC5tb2NrSW1wbGVtZW50YXRpb25PbmNlKChhcmdzKSA9PiB7XG4gICAgcmV0dXJuIGFyZ3MgPT09IHJkc1Jlc3VsdCA/IFsxMF0gOiBbXTtcbiAgfSk7XG4gIGNvbnN0IGFkZGl0aW9uYWxVdGlsID0ge1xuICAgIHJkczoge1xuICAgICAgdG9Kc29uT2JqZWN0OiBtb2NrUmRzVG9Kc29uT2JqZWN0LFxuICAgIH0sXG4gIH07XG4gIGNvbnN0IHZ0bCA9IGBcbiAgI3NldCgkcmVzcG9uc2UgPSAkdXRpbHMucmRzLnRvSnNvbk9iamVjdCgkY3R4LnJlc3VsdClbMF0pXG4gIHtcInRlc3RcIjogJHJlc3BvbnNlfWA7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIodnRsKTtcbiAgY29uc3QgcmVzID0gcGFyc2VyLnJlc29sdmUoeyByZXN1bHQ6IHJkc1Jlc3VsdCB9LCBhZGRpdGlvbmFsVXRpbCk7XG4gIGV4cGVjdChyZXMpLnRvRXF1YWwoeyB0ZXN0OiAxMCB9KTtcbn0pO1xuXG50ZXN0KFwidmFsdWVNYXBwZXIgd29ya3MgY29ycmVjdGx5XCIsICgpID0+IHtcbiAgY29uc3QgdnRsID0gYFxuICAjc2V0KCRhcnJheSA9IFsxLDIsM10pXG4gIHsgXCJ0ZXN0XCI6ICRhcnJheS5jb250YWlucygxKSB9YDtcbiAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICBjb25zdCByZXMgPSBwYXJzZXIucmVzb2x2ZSh7fSk7XG4gIGV4cGVjdChyZXMpLnRvRXF1YWwoeyB0ZXN0OiB0cnVlIH0pO1xufSk7XG5cbnRlc3QoXCIjcmV0dXJuIGNhbiByZXR1cm4gYW4gb2JqZWN0IGVhcmx5XCIsICgpID0+IHtcbiAgY29uc3QgdnRsID0gYFxuICAjcmV0dXJuKHtcInJlc3VsdFwiOiBcIkFcIn0pXG4gIHtcInJlc3VsdFwiOiBcIkJcIn1gO1xuICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHZ0bCk7XG4gIGNvbnN0IHJlcyA9IHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgZXhwZWN0KHJlcykudG9FcXVhbCh7IHJlc3VsdDogXCJBXCIgfSk7XG59KTtcblxudGVzdChcIiNyZXR1cm4gcmV0dXJucyBudWxsIGlmIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50c1wiLCAoKSA9PiB7XG4gIGNvbnN0IHZ0bCA9IGBcbiAgI3JldHVybigpXG4gIHtcInJlc3VsdFwiOiBcIkJcIn1gO1xuICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHZ0bCk7XG4gIGNvbnN0IHJlcyA9IHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgZXhwZWN0KHJlcykudG9FcXVhbChudWxsKTtcbn0pO1xuXG5kZXNjcmliZShcIiRjb250ZXh0LnN0YXNoIGtlZXBzIGRhdGFcIiwgKCkgPT4ge1xuICB0ZXN0KFwiS2VlcCBpbml0aWFsIGRhdGFcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHZ0bCA9IFwiXCI7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICAgIHBhcnNlci5yZXNvbHZlKHtcbiAgICAgIHN0YXNoOiB7IGtleTogXCJ2YWx1ZVwiIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhcnNlci5zdGFzaCkudG9TdHJpY3RFcXVhbCh7IGtleTogXCJ2YWx1ZVwiIH0pO1xuICB9KTtcblxuICB0ZXN0KFwiS2VlcCByZXNvbHZlZCBkYXRhXCIsICgpID0+IHtcbiAgICBjb25zdCB2dGwgPSAnJGN0eC5zdGFzaC5wdXQoXCJrZXlcIiwgXCJ2YWx1ZVwiKSc7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICAgIHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgICBleHBlY3QocGFyc2VyLnN0YXNoKS50b1N0cmljdEVxdWFsKHsga2V5OiBcInZhbHVlXCIgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiVHlwZWNhc3Rpbmcgd29ya3MgYXMgZXhwZWN0ZWRcIiwgKCkgPT4ge1xuICB0ZXN0KFwiQm9vbGVhbiBmYWxzZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgdnRsID0gXCJcXG5mYWxzZSBcIjsgLy8gTm90ZSBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICAgIGNvbnN0IHJlcyA9IHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgICBleHBlY3QocmVzKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgdGVzdChcIkJvb2xlYW4gdHJ1ZVwiLCAoKSA9PiB7XG4gICAgY29uc3QgdnRsID0gXCJ0cnVlXCI7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICAgIGNvbnN0IHJlcyA9IHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgICBleHBlY3QocmVzKS50b0JlKHRydWUpO1xuICB9KTtcblxuICB0ZXN0KFwiTnVsbFwiLCAoKSA9PiB7XG4gICAgY29uc3QgdnRsID0gXCJudWxsXCI7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICAgIGNvbnN0IHJlcyA9IHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgICBleHBlY3QocmVzKS50b0JlKG51bGwpO1xuICB9KTtcblxuICB0ZXN0KFwiSW50ZWdlclwiLCAoKSA9PiB7XG4gICAgY29uc3QgdnRsID0gXCIxMjNcIjtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHZ0bCk7XG4gICAgY29uc3QgcmVzID0gcGFyc2VyLnJlc29sdmUoe30pO1xuICAgIGV4cGVjdChyZXMpLnRvQmUoMTIzKTtcbiAgfSk7XG5cbiAgdGVzdChcIkZsb2F0XCIsICgpID0+IHtcbiAgICBjb25zdCB2dGwgPSBcIjEyMy40NTZcIjtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHZ0bCk7XG4gICAgY29uc3QgcmVzID0gcGFyc2VyLnJlc29sdmUoe30pO1xuICAgIGV4cGVjdChyZXMpLnRvQmUoMTIzLjQ1Nik7XG4gIH0pO1xuXG4gIHRlc3QoXCJKU09OXCIsICgpID0+IHtcbiAgICBjb25zdCB2dGwgPSAne1widGVzdFwiOiB0cnVlfSc7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih2dGwpO1xuICAgIGNvbnN0IHJlcyA9IHBhcnNlci5yZXNvbHZlKHt9KTtcbiAgICBleHBlY3QocmVzKS50b0VxdWFsKHsgdGVzdDogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgdGVzdChcIkFycmF5XCIsICgpID0+IHtcbiAgICBjb25zdCB2dGwgPSBcIlsxLDIsM11cIjtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHZ0bCk7XG4gICAgY29uc3QgcmVzID0gcGFyc2VyLnJlc29sdmUoe30pO1xuICAgIGV4cGVjdChyZXMpLnRvRXF1YWwoWzEsIDIsIDNdKTtcbiAgfSk7XG5cbiAgdGVzdChcIlN0cmluZ1wiLCAoKSA9PiB7XG4gICAgY29uc3QgdnRsID0gXCJhYmMxMjNcIjtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHZ0bCk7XG4gICAgY29uc3QgcmVzID0gcGFyc2VyLnJlc29sdmUoe30pO1xuICAgIGV4cGVjdChyZXMpLnRvQmUoXCJhYmMxMjNcIik7XG4gIH0pO1xufSk7XG4iXX0=