UNPKG

firebase-bolt

Version:

Firebase Bolt Security and Modeling Language Compiler

214 lines (212 loc) 26.7 kB
"use strict"; exports.__esModule = true; /* * Copyright 2015 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var chai_1 = require("chai"); var helper = require("./test-helper"); var bolt = require("../bolt"); var parse = bolt.parse; var ast = require("../ast"); suite("Abstract Syntax Tree (AST)", function () { suite("Left Associative Operators (AND OR)", function () { var t = ast.boolean(true); var f = ast.boolean(false); var v = ast.variable; var and = ast.and; var or = ast.or; var a = v('a'); var b = v('b'); var c = v('c'); var d = v('d'); var tests = [ { data: [], expect: { and: t, or: f } }, { data: [t], expect: { and: t, or: t } }, { data: [f], expect: { and: f, or: f } }, { data: [f, t], expect: { and: f, or: t } }, { data: [t, f], expect: { and: f, or: t } }, { data: [t, f, t], expect: { and: f, or: t } }, { data: [f, t, f], expect: { and: f, or: t } }, { data: [a], expect: { and: a, or: a } }, { data: [a, t], expect: { and: a, or: t } }, { data: [a, f], expect: { and: f, or: a } }, { data: [t, a], expect: { and: a, or: t } }, { data: [f, a], expect: { and: f, or: a } }, { data: [t, a, f], expect: { and: f, or: t } }, { data: [f, a, t], expect: { and: f, or: t } }, { data: [a, f, a], expect: { and: f, or: ast.or(a, a) } }, { data: [a, t, a], expect: { and: and(a, a), or: t } }, { data: [and(a, b), and(c, d)], expect: { and: and(and(and(a, b), c), d), or: or(and(a, b), and(c, d)) } }, { data: [or(a, b), or(c, d)], expect: { and: and(or(a, b), or(c, d)), or: or(or(or(a, b), c), d) } }, ]; helper.dataDrivenTest(tests, function (data, expect) { chai_1.assert.deepEqual(ast.andArray(data), expect.and, 'AND'); chai_1.assert.deepEqual(ast.orArray(data), expect.or, 'OR'); }, helper.expFormat); }); suite("Flatten", function () { var v = ast.variable; var and = ast.and; var a = v('a'); var b = v('b'); var c = v('c'); var d = v('d'); var tests = [ { data: a, expect: [a] }, { data: and(a, b), expect: [a, b] }, { data: and(a, b), expect: [a, b] }, { data: and(and(a, b), c), expect: [a, b, c] }, { data: and(a, and(b, c)), expect: [a, b, c] }, { data: and(and(a, b), and(c, d)), expect: [a, b, c, d] }, ]; helper.dataDrivenTest(tests, function (data, expect) { var result = ast.flatten('&&', data); chai_1.assert.deepEqual(result, expect); }, helper.expFormat); }); suite("isIdentifierString", function () { var tests = [ [ast.string('hi'), true], [ast.string('Hi'), true], [ast.string('a'), true], [ast.string('A'), true], [ast.string('hiThere'), true], [ast.string('H123'), true], [ast.string('$id'), true], [ast.string('a$id'), false], [ast.string('a b'), false], [ast.string('0H123'), false], [ast.boolean(true), false], [ast.number(123), false], ['hi', false], ]; helper.dataDrivenTest(tests, function (data, expect) { var result = ast.isIdentifierStringExp(data); chai_1.assert.equal(result, expect); }, helper.expFormat); }); suite("Expression decoding.", function () { var tests = [ ["true"], ["false"], ["1"], ["(1)", '1'], ["1.1"], ["+3", "3"], ["-3"], ["0x2", "2"], ["\"string\"", "'string'"], ["'string'"], ["'st\\'ring'"], ["'st\\ring'"], ["'\\u000d'", "'\\r'"], ["/pattern/"], ["/pattern/i"], ["/pat\\/tern/i"], ["a"], ["a.b"], ["a.b.c"], ["a['b']", 'a.b'], ["a[b]"], ["a[b][c]"], ["a.b[c]"], ["a[b].c"], ["(a.b)[c]", "a.b[c]"], ["(a(b))[c]", "a(b)[c]"], ["a()"], ["a()()"], ["a.b()"], ["a().b"], ["a[0]()"], ["a()[0]"], ["-a"], ["--a"], ["+a", "a"], ["+a +b", "a + b"], ["-a -b", "-a - b"], ["-a --b", "-a - -b"], ["-a ---b", "-a - --b"], ["!a"], ["!!a"], ["!+a", '!a'], ["!-a"], ["-!a"], ["2 * a"], ["(2 * a)", '2 * a'], ["2 / a"], ["a % 2"], ["1 + 1"], ["a - 1"], ["a - -b"], ["a + b + c"], ["a + (b + c)"], ["(a + b) + c", 'a + b + c'], ["a + b * c"], ["(a + b) * c"], ["a < 7"], ["a > 7"], ["a <= 7"], ["a >= 7"], ["a == 3"], ["a != 0"], ["a === 3", "a == 3"], ["a !== 0", "a != 0"], ["3 * a == b"], ["a == 1 && b <= 2", "(a == 1 && b <= 2)"], ["a == 1 || b <= 2", "(a == 1 || b <= 2)"], ["a && b && c", "((a && b) && c)"], ["a || b || c", "((a || b) || c)"], ["a && b || c && d", "((a && b) || (c && d))"], ["a ? b : c"], ["a || b ? c : d", "(a || b) ? c : d"], ["(this + ' ').test(/\d+/)"], ]; helper.dataDrivenTest(tests, function (data, expect) { // Decode to self by default expect = expect || data; var result = parse('function f() {return ' + data + ';}'); var exp = result.functions.f.body; var decode = bolt.decodeExpression(exp); chai_1.assert.equal(decode, expect); }); }); }); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvYXN0LXRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILDZCQUE0QjtBQUM1QixzQ0FBd0M7QUFFeEMsOEJBQWdDO0FBQ2hDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDdkIsNEJBQThCO0FBRTlCLEtBQUssQ0FBQyw0QkFBNEIsRUFBRTtJQUNsQyxLQUFLLENBQUMscUNBQXFDLEVBQUU7UUFDM0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDckIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNsQixJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVmLElBQUksS0FBSyxHQUFHO1lBQ1YsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDUixNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDVCxNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDVCxNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1osTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLEVBQUU7WUFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQyxFQUFFO1lBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLEVBQUU7WUFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDZixNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDVCxNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1osTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLEVBQUU7WUFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQyxFQUFFO1lBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDWixNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ1osTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFDLEVBQUU7WUFDM0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDZixNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUMzQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQyxFQUFFO1lBQzNCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsRUFBRTtZQUN0QyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsRUFBRTtZQUNuQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxFQUFFLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMs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QUFRLENBQUU7WUFDdkIsQ0FBRSxTQUFTLEVBQUUsUUFBUSxDQUFFO1lBQ3ZCLENBQUUsWUFBWSxDQUFFO1lBQ2hCLENBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUU7WUFDNUMsQ0FBRSxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBRTtZQUM1QyxDQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBRTtZQUNwQyxDQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBRTtZQUNwQyxDQUFFLGtCQUFrQixFQUFFLHdCQUF3QixDQUFFO1lBQ2hELENBQUUsV0FBVyxDQUFFO1lBQ2YsQ0FBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBRTtZQUN4QyxDQUFFLDBCQUEwQixDQUFFO1NBQy9CLENBQUM7UUFFRixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxVQUFTLElBQVksRUFBRSxNQUFjO1lBQ2hFLDRCQUE0QjtZQUM1QixNQUFNLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQztZQUN4QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNsQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QvYXN0LXRlc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCAqIGFzIGhlbHBlciBmcm9tICcuL3Rlc3QtaGVscGVyJztcblxuaW1wb3J0ICogYXMgYm9sdCBmcm9tICcuLi9ib2x0JztcbmxldCBwYXJzZSA9IGJvbHQucGFyc2U7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAnLi4vYXN0Jztcblxuc3VpdGUoXCJBYnN0cmFjdCBTeW50YXggVHJlZSAoQVNUKVwiLCBmdW5jdGlvbigpIHtcbiAgc3VpdGUoXCJMZWZ0IEFzc29jaWF0aXZlIE9wZXJhdG9ycyAoQU5EIE9SKVwiLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgdCA9IGFzdC5ib29sZWFuKHRydWUpO1xuICAgIHZhciBmID0gYXN0LmJvb2xlYW4oZmFsc2UpO1xuICAgIHZhciB2ID0gYXN0LnZhcmlhYmxlO1xuICAgIHZhciBhbmQgPSBhc3QuYW5kO1xuICAgIHZhciBvciA9IGFzdC5vcjtcbiAgICB2YXIgYSA9IHYoJ2EnKTtcbiAgICB2YXIgYiA9IHYoJ2InKTtcbiAgICB2YXIgYyA9IHYoJ2MnKTtcbiAgICB2YXIgZCA9IHYoJ2QnKTtcblxuICAgIHZhciB0ZXN0cyA9IFtcbiAgICAgIHsgZGF0YTogW10sXG4gICAgICAgIGV4cGVjdDoge2FuZDogdCwgb3I6IGZ9IH0sXG4gICAgICB7IGRhdGE6IFt0XSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiB0LCBvcjogdH0gfSxcbiAgICAgIHsgZGF0YTogW2ZdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGYsIG9yOiBmfSB9LFxuICAgICAgeyBkYXRhOiBbZiwgdF0sXG4gICAgICAgIGV4cGVjdDoge2FuZDogZiwgb3I6IHR9IH0sXG4gICAgICB7IGRhdGE6IFt0LCBmXSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBmLCBvcjogdH0gfSxcbiAgICAgIHsgZGF0YTogW3QsIGYsIHRdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGYsIG9yOiB0fSB9LFxuICAgICAgeyBkYXRhOiBbZiwgdCwgZl0sXG4gICAgICAgIGV4cGVjdDoge2FuZDogZiwgb3I6IHR9IH0sXG4gICAgICB7IGRhdGE6IFthXSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBhLCBvcjogYX0gfSxcbiAgICAgIHsgZGF0YTogW2EsIHRdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGEsIG9yOiB0fSB9LFxuICAgICAgeyBkYXRhOiBbYSwgZl0sXG4gICAgICAgIGV4cGVjdDoge2FuZDogZiwgb3I6IGF9IH0sXG4gICAgICB7IGRhdGE6IFt0LCBhXSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBhLCBvcjogdH0gfSxcbiAgICAgIHsgZGF0YTogW2YsIGFdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGYsIG9yOiBhfSB9LFxuICAgICAgeyBkYXRhOiBbdCwgYSwgZl0sXG4gICAgICAgIGV4cGVjdDoge2FuZDogZiwgb3I6IHR9IH0sXG4gICAgICB7IGRhdGE6IFtmLCBhLCB0XSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBmLCBvcjogdH0gfSxcbiAgICAgIHsgZGF0YTogW2EsIGYsIGFdLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGYsIG9yOiBhc3Qub3IoYSwgYSl9IH0sXG4gICAgICB7IGRhdGE6IFthLCB0LCBhXSxcbiAgICAgICAgZXhwZWN0OiB7YW5kOiBhbmQoYSwgYSksIG9yOiB0fSB9LFxuICAgICAgeyBkYXRhOiBbYW5kKGEsIGIpLCBhbmQoYywgZCldLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGFuZChhbmQoYW5kKGEsIGIpLCBjKSwgZCksXG4gICAgICAgICAgICAgICAgIG9yOiBvcihhbmQoYSwgYiksIGFuZChjLCBkKSl9IH0sXG4gICAgICB7IGRhdGE6IFtvcihhLCBiKSwgb3IoYywgZCldLFxuICAgICAgICBleHBlY3Q6IHthbmQ6IGFuZChvcihhLCBiKSwgb3IoYywgZCkpLFxuICAgICAgICAgICAgICAgICBvcjogb3Iob3Iob3IoYSwgYiksIGMpLCBkKX0gfSxcbiAgICBdO1xuXG4gICAgaGVscGVyLmRhdGFEcml2ZW5UZXN0KHRlc3RzLCBmdW5jdGlvbihkYXRhOiBhc3QuRXhwW10sIGV4cGVjdDogYW55KSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGFzdC5hbmRBcnJheShkYXRhKSwgZXhwZWN0LmFuZCwgJ0FORCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhc3Qub3JBcnJheShkYXRhKSwgZXhwZWN0Lm9yLCAnT1InKTtcbiAgICB9LCBoZWxwZXIuZXhwRm9ybWF0KTtcbiAgfSk7XG5cbiAgc3VpdGUoXCJGbGF0dGVuXCIsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gYXN0LnZhcmlhYmxlO1xuICAgIHZhciBhbmQgPSBhc3QuYW5kO1xuICAgIHZhciBhID0gdignYScpO1xuICAgIHZhciBiID0gdignYicpO1xuICAgIHZhciBjID0gdignYycpO1xuICAgIHZhciBkID0gdignZCcpO1xuXG4gICAgdmFyIHRlc3RzID0gW1xuICAgICAgeyBkYXRhOiBhLFxuICAgICAgICBleHBlY3Q6IFthXSB9LFxuICAgICAgeyBkYXRhOiBhbmQoYSwgYiksXG4gICAgICAgIGV4cGVjdDogW2EsIGJdIH0sXG4gICAgICB7IGRhdGE6IGFuZChhLCBiKSxcbiAgICAgICAgZXhwZWN0OiBbYSwgYl0gfSxcbiAgICAgIHsgZGF0YTogYW5kKGFuZChhLCBiKSwgYyksXG4gICAgICAgIGV4cGVjdDogW2EsIGIsIGNdIH0sXG4gICAgICB7IGRhdGE6IGFuZChhLCBhbmQoYiwgYykpLFxuICAgICAgICBleHBlY3Q6IFthLCBiLCBjXSB9LFxuICAgICAgeyBkYXRhOiBhbmQoYW5kKGEsIGIpLCBhbmQoYywgZCkpLFxuICAgICAgICBleHBlY3Q6IFthLCBiLCBjLCBkXSB9LFxuICAgIF07XG5cbiAgICBoZWxwZXIuZGF0YURyaXZlblRlc3QodGVzdHMsIGZ1bmN0aW9uKGRhdGE6IGFzdC5FeHAsIGV4cGVjdDogYXN0LkV4cFtdKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYXN0LmZsYXR0ZW4oJyYmJywgZGF0YSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3VsdCwgZXhwZWN0KTtcbiAgICB9LCBoZWxwZXIuZXhwRm9ybWF0KTtcbiAgfSk7XG5cbiAgc3VpdGUoXCJpc0lkZW50aWZpZXJTdHJpbmdcIiwgZnVuY3Rpb24oKSB7XG4gICAgbGV0IHRlc3RzID0gW1xuICAgICAgW2FzdC5zdHJpbmcoJ2hpJyksIHRydWVdLFxuICAgICAgW2FzdC5zdHJpbmcoJ0hpJyksIHRydWVdLFxuICAgICAgW2FzdC5zdHJpbmcoJ2EnKSwgdHJ1ZV0sXG4gICAgICBbYXN0LnN0cmluZygnQScpLCB0cnVlXSxcbiAgICAgIFthc3Quc3RyaW5nKCdoaVRoZXJlJyksIHRydWVdLFxuICAgICAgW2FzdC5zdHJpbmcoJ0gxMjMnKSwgdHJ1ZV0sXG4gICAgICBbYXN0LnN0cmluZygnJGlkJyksIHRydWVdLFxuICAgICAgW2FzdC5zdHJpbmcoJ2EkaWQnKSwgZmFsc2VdLFxuICAgICAgW2FzdC5zdHJpbmcoJ2EgYicpLCBmYWxzZV0sXG4gICAgICBbYXN0LnN0cmluZygnMEgxMjMnKSwgZmFsc2VdLFxuICAgICAgW2FzdC5ib29sZWFuKHRydWUpLCBmYWxzZV0sXG4gICAgICBbYXN0Lm51bWJlcigxMjMpLCBmYWxzZV0sXG4gICAgICBbJ2hpJywgZmFsc2VdLFxuICAgIF07XG5cbiAgICBoZWxwZXIuZGF0YURyaXZlblRlc3QodGVzdHMsIGZ1bmN0aW9uKGRhdGE6IGFzdC5FeHAsIGV4cGVjdDogYm9vbGVhbikge1xuICAgICAgdmFyIHJlc3VsdCA9IGFzdC5pc0lkZW50aWZpZXJTdHJpbmdFeHAoZGF0YSk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBleHBlY3QpO1xuICAgIH0sIGhlbHBlci5leHBGb3JtYXQpO1xuICB9KTtcblxuICBzdWl0ZShcIkV4cHJlc3Npb24gZGVjb2RpbmcuXCIsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ZXN0cyA9IFtcbiAgICAgIFsgXCJ0cnVlXCIgXSxcbiAgICAgIFsgXCJmYWxzZVwiIF0sXG4gICAgICBbIFwiMVwiIF0sXG4gICAgICBbIFwiKDEpXCIsICcxJyBdLFxuICAgICAgWyBcIjEuMVwiIF0sXG4gICAgICBbIFwiKzNcIiwgXCIzXCJdLFxuICAgICAgWyBcIi0zXCIgXSxcbiAgICAgIFsgXCIweDJcIiwgXCIyXCIgXSxcbiAgICAgIFsgXCJcXFwic3RyaW5nXFxcIlwiLCBcIidzdHJpbmcnXCIgXSxcbiAgICAgIFsgXCInc3RyaW5nJ1wiIF0sXG4gICAgICBbIFwiJ3N0XFxcXCdyaW5nJ1wiXSxcbiAgICAgIFsgXCInc3RcXFxccmluZydcIiBdLFxuICAgICAgWyBcIidcXFxcdTAwMGQnXCIsIFwiJ1xcXFxyJ1wiIF0sXG4gICAgICBbIFwiL3BhdHRlcm4vXCIgXSxcbiAgICAgIFsgXCIvcGF0dGVybi9pXCIgXSxcbiAgICAgIFsgXCIvcGF0XFxcXC90ZXJuL2lcIiBdLFxuICAgICAgWyBcImFcIiBdLFxuICAgICAgWyBcImEuYlwiIF0sXG4gICAgICBbIFwiYS5iLmNcIiBdLFxuXG4gICAgICBbIFwiYVsnYiddXCIsICdhLmInIF0sXG4gICAgICBbIFwiYVtiXVwiIF0sXG4gICAgICBbIFwiYVtiXVtjXVwiIF0sXG4gICAgICBbIFwiYS5iW2NdXCIgXSxcbiAgICAgIFsgXCJhW2JdLmNcIiBdLFxuICAgICAgWyBcIihhLmIpW2NdXCIsIFwiYS5iW2NdXCIgXSxcbiAgICAgIFsgXCIoYShiKSlbY11cIiwgXCJhKGIpW2NdXCIgXSxcblxuICAgICAgWyBcImEoKVwiIF0sXG4gICAgICBbIFwiYSgpKClcIiBdLFxuICAgICAgWyBcImEuYigpXCIgXSxcbiAgICAgIFsgXCJhKCkuYlwiIF0sXG4gICAgICBbIFwiYVswXSgpXCIgXSxcbiAgICAgIFsgXCJhKClbMF1cIiBdLFxuXG4gICAgICBbIFwiLWFcIiBdLFxuICAgICAgWyBcIi0tYVwiIF0sXG4gICAgICBbIFwiK2FcIiwgXCJhXCJdLFxuICAgICAgWyBcIithICtiXCIsIFwiYSArIGJcIiBdLFxuICAgICAgWyBcIi1hIC1iXCIsIFwiLWEgLSBiXCIgXSxcbiAgICAgIFsgXCItYSAtLWJcIiwgXCItYSAtIC1iXCIgXSxcbiAgICAgIFsgXCItYSAtLS1iXCIsIFwiLWEgLSAtLWJcIiBdLFxuICAgICAgWyBcIiFhXCIgXSxcbiAgICAgIFsgXCIhIWFcIiBdLFxuICAgICAgWyBcIiErYVwiLCAnIWEnIF0sXG4gICAgICBbIFwiIS1hXCIgXSxcbiAgICAgIFsgXCItIWFcIiBdLFxuICAgICAgWyBcIjIgKiBhXCIgXSxcbiAgICAgIFsgXCIoMiAqIGEpXCIsICcyICogYScgXSxcbiAgICAgIFsgXCIyIC8gYVwiIF0sXG4gICAgICBbIFwiYSAlIDJcIiBdLFxuICAgICAgWyBcIjEgKyAxXCIgXSxcbiAgICAgIFsgXCJhIC0gMVwiIF0sXG4gICAgICBbIFwiYSAtIC1iXCIgXSxcbiAgICAgIFsgXCJhICsgYiArIGNcIiBdLFxuICAgICAgWyBcImEgKyAoYiArIGMpXCIgXSxcbiAgICAgIFsgXCIoYSArIGIpICsgY1wiLCAnYSArIGIgKyBjJyBdLFxuICAgICAgWyBcImEgKyBiICogY1wiIF0sXG4gICAgICBbIFwiKGEgKyBiKSAqIGNcIiBdLFxuICAgICAgWyBcImEgPCA3XCIgXSxcbiAgICAgIFsgXCJhID4gN1wiIF0sXG4gICAgICBbIFwiYSA8PSA3XCIgXSxcbiAgICAgIFsgXCJhID49IDdcIiBdLFxuICAgICAgWyBcImEgPT0gM1wiIF0sXG4gICAgICBbIFwiYSAhPSAwXCIgXSxcbiAgICAgIFsgXCJhID09PSAzXCIsIFwiYSA9PSAzXCIgXSxcbiAgICAgIFsgXCJhICE9PSAwXCIsIFwiYSAhPSAwXCIgXSxcbiAgICAgIFsgXCIzICogYSA9PSBiXCIgXSxcbiAgICAgIFsgXCJhID09IDEgJiYgYiA8PSAyXCIsIFwiKGEgPT0gMSAmJiBiIDw9IDIpXCIgXSxcbiAgICAgIFsgXCJhID09IDEgfHwgYiA8PSAyXCIsIFwiKGEgPT0gMSB8fCBiIDw9IDIpXCIgXSxcbiAgICAgIFsgXCJhICYmIGIgJiYgY1wiLCBcIigoYSAmJiBiKSAmJiBjKVwiIF0sXG4gICAgICBbIFwiYSB8fCBiIHx8IGNcIiwgXCIoKGEgfHwgYikgfHwgYylcIiBdLFxuICAgICAgWyBcImEgJiYgYiB8fCBjICYmIGRcIiwgXCIoKGEgJiYgYikgfHwgKGMgJiYgZCkpXCIgXSxcbiAgICAgIFsgXCJhID8gYiA6IGNcIiBdLFxuICAgICAgWyBcImEgfHwgYiA/IGMgOiBkXCIsIFwiKGEgfHwgYikgPyBjIDogZFwiIF0sXG4gICAgICBbIFwiKHRoaXMgKyAnICcpLnRlc3QoL1xcZCsvKVwiIF0sXG4gICAgXTtcblxuICAgIGhlbHBlci5kYXRhRHJpdmVuVGVzdCh0ZXN0cywgZnVuY3Rpb24oZGF0YTogc3RyaW5nLCBleHBlY3Q6IHN0cmluZykge1xuICAgICAgLy8gRGVjb2RlIHRvIHNlbGYgYnkgZGVmYXVsdFxuICAgICAgZXhwZWN0ID0gZXhwZWN0IHx8IGRhdGE7XG4gICAgICB2YXIgcmVzdWx0ID0gcGFyc2UoJ2Z1bmN0aW9uIGYoKSB7cmV0dXJuICcgKyBkYXRhICsgJzt9Jyk7XG4gICAgICB2YXIgZXhwID0gcmVzdWx0LmZ1bmN0aW9ucy5mLmJvZHk7XG4gICAgICB2YXIgZGVjb2RlID0gYm9sdC5kZWNvZGVFeHByZXNzaW9uKGV4cCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVjb2RlLCBleHBlY3QpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19