UNPKG

computed-types

Version:

Runtime validation types for TypeScript.

321 lines (288 loc) 35.5 kB
"use strict"; require("mocha"); var _chai = require("chai"); var _utils = require("./utils"); var _errors = require("./errors"); /* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars,@typescript-eslint/ban-types */ describe('schema/utils', () => { describe('typeCheck', () => { it('string', () => { (0, _utils.typeCheck)(true); (0, _utils.typeCheck)('string'); (0, _utils.typeCheck)('string'); }); it('number', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)([1]); }); it('1', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); (0, _utils.typeCheck)(1); }); it('boolean', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); }); it('true', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); (0, _utils.typeCheck)(true); }); it('[number]', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); }); it('number[]]', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); }); it('[1]', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); (0, _utils.typeCheck)([1]); }); it('unknown', () => { (0, _utils.typeCheck)(true); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); }); it('any', () => { (0, _utils.typeCheck)(true); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); (0, _utils.typeCheck)('any'); }); it('[any]', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(['any']); (0, _utils.typeCheck)(['any']); (0, _utils.typeCheck)(['any']); (0, _utils.typeCheck)(['any']); (0, _utils.typeCheck)(['any']); (0, _utils.typeCheck)(['any']); }); it('never', () => { (0, _utils.typeCheck)(true); }); it('PromiseLike', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(Promise.resolve('string')); (0, _utils.typeCheck)(Promise.resolve('string')); }); it('Promise', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(Promise.resolve('string')); (0, _utils.typeCheck)(Promise.resolve('string')); }); it('return type', () => { (0, _utils.typeCheck)(true); (0, _utils.typeCheck)('string'); }); describe('functions', () => { it('return value', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(() => true); (0, _utils.typeCheck)(() => true); (0, _utils.typeCheck)(() => true); (0, _utils.typeCheck)(() => true); (0, _utils.typeCheck)(() => true); (0, _utils.typeCheck)(() => 1); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(() => [1, 'foo']); (0, _utils.typeCheck)(() => [1, 'foo']); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(() => Promise.resolve(1)); }); it('parameters', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(() => {}); (0, _utils.typeCheck)(x => {}); (0, _utils.typeCheck)(x => {}); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(x => {}); (0, _utils.typeCheck)(x => {}); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)(x => x); }); }); }); describe('deepConcat', () => { it('1 element', () => { const obj = { foo: 1 }; _chai.assert.equal((0, _utils.deepConcat)('foo'), 'foo'); _chai.assert.equal((0, _utils.deepConcat)(null), null); _chai.assert.equal((0, _utils.deepConcat)(undefined), undefined); _chai.assert.equal((0, _utils.deepConcat)(1), 1); _chai.assert.equal((0, _utils.deepConcat)(obj), obj); }); it('plain elements', () => { _chai.assert.equal((0, _utils.deepConcat)('foo', 'foo'), 'foo'); _chai.assert.equal((0, _utils.deepConcat)(null, null), null); _chai.assert.equal((0, _utils.deepConcat)(undefined, undefined), undefined); _chai.assert.equal((0, _utils.deepConcat)(undefined, undefined, 1), 1); _chai.assert.equal((0, _utils.deepConcat)(undefined, 1, undefined), 1); _chai.assert.equal((0, _utils.deepConcat)(1, 1), 1); _chai.assert.equal((0, _utils.deepConcat)(true, true), true); _chai.assert.equal((0, _utils.deepConcat)(null, undefined), null); _chai.assert.equal((0, _utils.deepConcat)(undefined, 'foo'), 'foo'); _chai.assert.throw(() => (0, _utils.deepConcat)(true, false), _errors.ValidationError); _chai.assert.throw(() => (0, _utils.deepConcat)('foo', false), _errors.ValidationError); _chai.assert.throw(() => (0, _utils.deepConcat)('foo', 'bar'), _errors.ValidationError); _chai.assert.throw(() => (0, _utils.deepConcat)('foo', undefined, 'bar'), _errors.ValidationError); _chai.assert.throw(() => (0, _utils.deepConcat)(1, 1.1), _errors.ValidationError); _chai.assert.throw(() => (0, _utils.deepConcat)(1, {}), _errors.ValidationError); _chai.assert.throw(() => (0, _utils.deepConcat)(1, { foo: 1 }), _errors.ValidationError); }); it('deep elements', () => { _chai.assert.deepEqual((0, _utils.deepConcat)({ foo: 1 }, { bar: 2 }), { foo: 1, bar: 2 }); _chai.assert.deepEqual((0, _utils.deepConcat)({ foo: 1, x: { hello: 'world' } }, { foo: 1, x: { me: 'hi' } }, { bar: 3 }), { foo: 1, bar: 3, x: { hello: 'world', me: 'hi' } }); _chai.assert.deepEqual((0, _utils.deepConcat)({ foo: 1 }, undefined, { bar: 2 }), { foo: 1, bar: 2 }); _chai.assert.deepEqual((0, _utils.deepConcat)(['foo'], ['foo', 1]), ['foo', 1]); _chai.assert.deepEqual((0, _utils.deepConcat)(['foo'], [undefined, 1]), ['foo', 1]); _chai.assert.deepEqual((0, _utils.deepConcat)(['foo', { bar: 1 }], ['foo', { hello: 2 }]), ['foo', { bar: 1, hello: 2 }]); _chai.assert.throw(() => (0, _utils.deepConcat)({ foo: 1 }, { foo: 2, bar: 2 }), _errors.ValidationError); _chai.assert.throw(() => (0, _utils.deepConcat)({ foo: 1 }, null), _errors.ValidationError); _chai.assert.throw(() => (0, _utils.deepConcat)({ foo: 1 }, true), _errors.ValidationError); }); }); describe('RecursiveMerge', () => { it('or primitives', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); // typeCheck< // [RecursiveMerge<[string] | [string, string]>], // [[string] | [string | string]] // >('ok'); }); it('or primitives maybes', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); }); it('and primitives', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); }); it('and primitives maybes', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); }); it('and objects', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); }); it('or objects', () => { (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); (0, _utils.typeCheck)('ok'); }); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWEvdXRpbHMudGVzdC50cyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsIml0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJ4Iiwib2JqIiwiZm9vIiwiYXNzZXJ0IiwiZXF1YWwiLCJ1bmRlZmluZWQiLCJ0aHJvdyIsIlZhbGlkYXRpb25FcnJvciIsImRlZXBFcXVhbCIsImJhciIsImhlbGxvIiwibWUiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRUFBLFFBQVEsQ0FBQyxjQUFELEVBQWlCLE1BQU07QUFDN0JBLEVBQUFBLFFBQVEsQ0FBQyxXQUFELEVBQWMsTUFBTTtBQUMxQkMsSUFBQUEsRUFBRSxDQUFDLFFBQUQsRUFBVyxNQUFNO0FBQ2pCLDRCQUFnQyxJQUFoQztBQUNBLDRCQUFxQixRQUFyQjtBQUNBLDRCQUF5QixRQUF6QjtBQUNELEtBSkMsQ0FBRjtBQU1BQSxJQUFBQSxFQUFFLENBQUMsUUFBRCxFQUFXLE1BQU07QUFDakIsNEJBQTBCLElBQTFCO0FBQ0EsNEJBQXFCLENBQXJCO0FBQ0EsNEJBQTJCLENBQTNCO0FBQ0EsNEJBQTBCLENBQTFCO0FBQ0EsNEJBQTBCLENBQTFCO0FBQ0EsNEJBQXlCLENBQXpCO0FBQ0EsNEJBQXVCLENBQXZCO0FBQ0EsNEJBQXNCLENBQXRCO0FBQ0EsNEJBQStCLENBQUMsQ0FBRCxDQUEvQjtBQUNELEtBVkMsQ0FBRjtBQVlBQSxJQUFBQSxFQUFFLENBQUMsR0FBRCxFQUFNLE1BQU07QUFDWiw0QkFBZ0IsSUFBaEI7QUFDQSw0QkFBcUIsQ0FBckI7QUFDQSw0QkFBb0IsQ0FBcEI7QUFDQSw0QkFBa0IsQ0FBbEI7QUFDQSw0QkFBaUIsQ0FBakI7QUFDRCxLQU5DLENBQUY7QUFRQUEsSUFBQUEsRUFBRSxDQUFDLFNBQUQsRUFBWSxNQUFNO0FBQ2xCLDRCQUE0QixJQUE1QjtBQUNBLDRCQUF5QixJQUF6QjtBQUNBLDRCQUEwQixJQUExQjtBQUNB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QXlELElBQXpEO0FBQ0EsNEJBQXlELElBQXpEO0FBQ0EsNEJBQWtFLElBQWxFLEVBSHdCLENBSXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0QsS0FSQyxDQUFGO0FBVUFBLElBQUFBLEVBQUUsQ0FBQyxzQkFBRCxFQUF5QixNQUFNO0FBQy9CLDRCQUEyRCxJQUEzRDtBQUNBLDRCQUNFLElBREY7QUFHRCxLQUxDLENBQUY7QUFPQUEsSUFBQUEsRUFBRSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDekIsNEJBQXlELElBQXpEO0FBQ0EsNEJBQXdELElBQXhEO0FBQ0QsS0FIQyxDQUFGO0FBS0FBLElBQUFBLEVBQUUsQ0FBQyx1QkFBRCxFQUEwQixNQUFNO0FBQ2hDLDRCQUEwRCxJQUExRDtBQUNBLDRCQUF5RCxJQUF6RDtBQUNELEtBSEMsQ0FBRjtBQUtBQSxJQUFBQSxFQUFFLENBQUMsYUFBRCxFQUFnQixNQUFNO0FBQ3RCLDRCQUdFLElBSEY7QUFJQSw0QkFHRSxJQUhGO0FBSUEsNEJBR0UsSUFIRjtBQUlBLDRCQUdFLElBSEY7QUFJQSw0QkFHRSxJQUhGO0FBSUEsNEJBR0UsSUFIRjtBQUlELEtBekJDLENBQUY7QUEyQkFBLElBQUFBLEVBQUUsQ0FBQyxZQUFELEVBQWUsTUFBTTtBQUNyQiw0QkFHRSxJQUhGO0FBSUEsNEJBR0UsSUFIRjtBQUlBLDRCQUdFLElBSEY7QUFJQSw0QkFHRSxJQUhGO0FBSUQsS0FqQkMsQ0FBRjtBQWtCRCxHQXpFTyxDQUFSO0FBMEVELENBdlVPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHsgdHlwZUNoZWNrLCBkZWVwQ29uY2F0LCBSZWN1cnNpdmVNZXJnZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vKiBlc2xpbnQtZGlzYWJsZVxuIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uLFxuIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyxAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzICovXG5cbmRlc2NyaWJlKCdzY2hlbWEvdXRpbHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCd0eXBlQ2hlY2snLCAoKSA9PiB7XG4gICAgaXQoJ3N0cmluZycsICgpID0+IHtcbiAgICAgIHR5cGVDaGVjazxzdHJpbmcsIHN0cmluZywgdHJ1ZT4odHJ1ZSk7XG4gICAgICB0eXBlQ2hlY2s8c3RyaW5nLCAxPignc3RyaW5nJyk7XG4gICAgICB0eXBlQ2hlY2s8c3RyaW5nLCAnZm9vJz4oJ3N0cmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ251bWJlcicsICgpID0+IHtcbiAgICAgIHR5cGVDaGVjazxudW1iZXIsIG51bWJlcj4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8bnVtYmVyLCAxPigxIGFzIG51bWJlcik7XG4gICAgICB0eXBlQ2hlY2s8bnVtYmVyLCBib29sZWFuPigxKTtcbiAgICAgIHR5cGVDaGVjazxudW1iZXIsIHN0cmluZz4oMSk7XG4gICAgICB0eXBlQ2hlY2s8bnVtYmVyLCBvYmplY3Q+KDEpO1xuICAgICAgdHlwZUNoZWNrPG51bWJlciwgbmV2ZXI+KDEpO1xuICAgICAgdHlwZUNoZWNrPG51bWJlciwgYW55PigxKTtcbiAgICAgIHR5cGVDaGVjazxudW1iZXIsIHt9PigxKTtcbiAgICAgIHR5cGVDaGVjazxbbnVtYmVyXSwgW2Jvb2xlYW5dPihbMV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJzEnLCAoKSA9PiB7XG4gICAgICB0eXBlQ2hlY2s8MSwgMT4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8MSwgbnVtYmVyPigxKTtcbiAgICAgIHR5cGVDaGVjazwxLCBuZXZlcj4oMSk7XG4gICAgICB0eXBlQ2hlY2s8MSwgYW55PigxKTtcbiAgICAgIHR5cGVDaGVjazwxLCB7fT4oMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYm9vbGVhbicsICgpID0+IHtcbiAgICAgIHR5cGVDaGVjazxib29sZWFuLCBib29sZWFuPignb2snKTtcbiAgICAgIHR5cGVDaGVjazxib29sZWFuLCB0cnVlPih0cnVlKTtcbiAgICAgIHR5cGVDaGVjazxib29sZWFuLCBmYWxzZT4odHJ1ZSk7XG4gICAgICB0eXBlQ2hlY2s8Ym9vbGVhbiwge30+KHRydWUpO1xuICAgICAgdHlwZUNoZWNrPGJvb2xlYW4sIG9iamVjdD4odHJ1ZSk7XG4gICAgICB0eXBlQ2hlY2s8Ym9vbGVhbiwgc3RyaW5nPih0cnVlKTtcbiAgICAgIHR5cGVDaGVjazxib29sZWFuLCBhbnk+KHRydWUpO1xuICAgICAgdHlwZUNoZWNrPGJvb2xlYW4sIHZvaWQ+KHRydWUpO1xuICAgICAgdHlwZUNoZWNrPGJvb2xlYW4sIDE+KHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3RydWUnLCAoKSA9PiB7XG4gICAgICB0eXBlQ2hlY2s8dHJ1ZSwgdHJ1ZT4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8dHJ1ZSwgZmFsc2U+KHRydWUpO1xuICAgICAgdHlwZUNoZWNrPHRydWUsIGJvb2xlYW4+KHRydWUpO1xuICAgICAgdHlwZUNoZWNrPHRydWUsIG51bWJlcj4odHJ1ZSk7XG4gICAgICB0eXBlQ2hlY2s8dHJ1ZSwgYW55Pih0cnVlKTtcbiAgICAgIHR5cGVDaGVjazx0cnVlLCB7fT4odHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnW251bWJlcl0nLCAoKSA9PiB7XG4gICAgICB0eXBlQ2hlY2s8W251bWJlcl0sIFtudW1iZXJdPignb2snKTtcbiAgICAgIHR5cGVDaGVjazxbbnVtYmVyXSwgWzFdPihbMV0pO1xuICAgICAgdHlwZUNoZWNrPFtudW1iZXJdLCBudW1iZXJbXT4oWzFdKTtcbiAgICAgIHR5cGVDaGVjazxbbnVtYmVyXSwgW2Jvb2xlYW5dPihbMV0pO1xuICAgICAgdHlwZUNoZWNrPFtudW1iZXJdLCBvYmplY3Q+KFsxXSk7XG4gICAgICB0eXBlQ2hlY2s8W251bWJlcl0sIFtdPihbMV0pO1xuICAgICAgdHlwZUNoZWNrPFtudW1iZXJdLCBbYW55XT4oWzFdKTtcbiAgICAgIHR5cGVDaGVjazxbbnVtYmVyXSwgYW55W10+KFsxXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbnVtYmVyW11dJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPG51bWJlcltdLCBudW1iZXJbXT4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8bnVtYmVyW10sIFsxXT4oWzFdKTtcbiAgICAgIHR5cGVDaGVjazxudW1iZXJbXSwgW251bWJlcl0+KFsxXSk7XG4gICAgICB0eXBlQ2hlY2s8bnVtYmVyW10sIGFueVtdPihbMV0pO1xuICAgICAgdHlwZUNoZWNrPG51bWJlcltdLCB1bmtub3duW10+KFsxXSk7XG4gICAgICB0eXBlQ2hlY2s8bnVtYmVyW10sIG5ldmVyW10+KFsxXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnWzFdJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFsxXSwgWzFdPignb2snKTtcbiAgICAgIHR5cGVDaGVjazxbMV0sIFsyXT4oWzFdKTtcbiAgICAgIHR5cGVDaGVjazxbMV0sIFtudW1iZXJdPihbMV0pO1xuICAgICAgdHlwZUNoZWNrPFsxXSwgW2Jvb2xlYW5dPihbMV0pO1xuICAgICAgdHlwZUNoZWNrPFsxXSwgb2JqZWN0PihbMV0pO1xuICAgICAgdHlwZUNoZWNrPFsxXSwgW10+KFsxXSk7XG4gICAgfSk7XG5cbiAgICBpdCgndW5rbm93bicsICgpID0+IHtcbiAgICAgIHR5cGVDaGVjazx1bmtub3duLCB1bmtub3duLCB0cnVlPih0cnVlKTtcbiAgICAgIHR5cGVDaGVjazx1bmtub3duLCBuZXZlcj4oJ2FueScpO1xuICAgICAgdHlwZUNoZWNrPHVua25vd24sIGFueT4oJ2FueScpO1xuICAgICAgdHlwZUNoZWNrPHVua25vd24sIGJvb2xlYW4+KCdhbnknKTtcbiAgICAgIHR5cGVDaGVjazx1bmtub3duLCBzdHJpbmc+KCdhbnknKTtcbiAgICAgIHR5cGVDaGVjazx1bmtub3duLCB7fT4oJ2FueScpO1xuICAgICAgdHlwZUNoZWNrPHVua25vd24sIHRydWU+KCdhbnknKTtcbiAgICAgIHR5cGVDaGVjazx1bmtub3duLCAxPignYW55Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW55JywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPGFueSwgYW55LCB0cnVlPih0cnVlKTtcbiAgICAgIHR5cGVDaGVjazxhbnksIG5ldmVyPignYW55Jyk7XG4gICAgICB0eXBlQ2hlY2s8YW55LCBib29sZWFuPignYW55Jyk7XG4gICAgICB0eXBlQ2hlY2s8YW55LCBzdHJpbmc+KCdhbnknKTtcbiAgICAgIHR5cGVDaGVjazxhbnksIHVua25vd24+KCdhbnknKTtcbiAgICAgIHR5cGVDaGVjazxhbnksIG9iamVjdD4oJ2FueScpO1xuICAgICAgdHlwZUNoZWNrPGFueSwge30+KCdhbnknKTtcbiAgICAgIHR5cGVDaGVjazxhbnksIHRydWU+KCdhbnknKTtcbiAgICAgIHR5cGVDaGVjazxhbnksIDE+KCdhbnknKTtcbiAgICB9KTtcblxuICAgIGl0KCdbYW55XScsICgpID0+IHtcbiAgICAgIHR5cGVDaGVjazxbYW55XSwgW2FueV0+KCdvaycpO1xuICAgICAgdHlwZUNoZWNrPFthbnldLCBbbmV2ZXJdPihbJ2FueSddKTtcbiAgICAgIHR5cGVDaGVjazxbYW55XSwgYW55PihbJ2FueSddKTtcbiAgICAgIHR5cGVDaGVjazxbYW55XSwgYW55W10+KFsnYW55J10pO1xuICAgICAgdHlwZUNoZWNrPFthbnldLCBbdW5rbm93bl0+KFsnYW55J10pO1xuICAgICAgdHlwZUNoZWNrPFthbnldLCBbbnVtYmVyXT4oWydhbnknXSk7XG4gICAgICB0eXBlQ2hlY2s8W2FueV0sIFtzdHJpbmddPihbJ2FueSddKTtcbiAgICB9KTtcblxuICAgIGl0KCduZXZlcicsICgpID0+IHtcbiAgICAgIHR5cGVDaGVjazxuZXZlciwgbmV2ZXIsIHRydWU+KHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Byb21pc2VMaWtlJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFByb21pc2VMaWtlPHN0cmluZz4sIFByb21pc2VMaWtlPHN0cmluZz4+KCdvaycpO1xuICAgICAgdHlwZUNoZWNrPFByb21pc2VMaWtlPHN0cmluZz4sIFByb21pc2VMaWtlPG51bWJlcj4+KFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoJ3N0cmluZycpLFxuICAgICAgKTtcbiAgICAgIHR5cGVDaGVjazxQcm9taXNlTGlrZTxzdHJpbmc+LCBQcm9taXNlPHN0cmluZz4+KFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoJ3N0cmluZycpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdQcm9taXNlJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFByb21pc2U8c3RyaW5nPiwgUHJvbWlzZTxzdHJpbmc+Pignb2snKTtcbiAgICAgIHR5cGVDaGVjazxQcm9taXNlPHN0cmluZz4sIFByb21pc2U8bnVtYmVyPj4oUHJvbWlzZS5yZXNvbHZlKCdzdHJpbmcnKSk7XG4gICAgICB0eXBlQ2hlY2s8UHJvbWlzZUxpa2U8c3RyaW5nPiwgUHJvbWlzZTxzdHJpbmc+PihcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCdzdHJpbmcnKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJuIHR5cGUnLCAoKSA9PiB7XG4gICAgICB0eXBlQ2hlY2s8XG4gICAgICAgIFJldHVyblR5cGU8KCkgPT4gc3RyaW5nIHwgUHJvbWlzZUxpa2U8bnVtYmVyPj4sXG4gICAgICAgIHN0cmluZyB8IFByb21pc2VMaWtlPG51bWJlcj4sXG4gICAgICAgIHRydWVcbiAgICAgID4odHJ1ZSk7XG5cbiAgICAgIHR5cGVDaGVjazxcbiAgICAgICAgUmV0dXJuVHlwZTwoKSA9PiBzdHJpbmcgfCBQcm9taXNlTGlrZTxudW1iZXI+PixcbiAgICAgICAgc3RyaW5nIHwgUHJvbWlzZUxpa2U8Ym9vbGVhbj4sXG4gICAgICAgIHRydWVcbiAgICAgID4oJ3N0cmluZycpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Z1bmN0aW9ucycsICgpID0+IHtcbiAgICAgIGl0KCdyZXR1cm4gdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIHR5cGVDaGVjazwoKSA9PiB2b2lkLCAoKSA9PiB2b2lkPignb2snKTtcbiAgICAgICAgdHlwZUNoZWNrPCgpID0+IGJvb2xlYW4sICgpID0+IGJvb2xlYW4+KCdvaycpO1xuICAgICAgICB0eXBlQ2hlY2s8KCkgPT4gbnVtYmVyLCAoKSA9PiBudW1iZXI+KCdvaycpO1xuXG4gICAgICAgIHR5cGVDaGVjazwoKSA9PiB0cnVlLCAoKSA9PiBudW1iZXI+KCgpID0+IHRydWUpO1xuICAgICAgICB0eXBlQ2hlY2s8KCkgPT4gdHJ1ZSwgKCkgPT4gYm9vbGVhbj4oKCkgPT4gdHJ1ZSk7XG4gICAgICAgIHR5cGVDaGVjazwoKSA9PiB0cnVlLCAoKSA9PiB2b2lkPigoKSA9PiB0cnVlKTtcbiAgICAgICAgdHlwZUNoZWNrPCgpID0+IGJvb2xlYW4sICgpID0+IHZvaWQ+KCgpID0+IHRydWUpO1xuICAgICAgICB0eXBlQ2hlY2s8KCkgPT4gYm9vbGVhbiwgKCkgPT4gdHJ1ZT4oKCkgPT4gdHJ1ZSk7XG4gICAgICAgIHR5cGVDaGVjazwoKSA9PiBudW1iZXIsICgpID0+IHZvaWQ+KCgpID0+IDEpO1xuICAgICAgICB0eXBlQ2hlY2s8KCkgPT4gWzEsICdmb28nXSwgKCkgPT4gWzEsICdmb28nXT4oJ29rJyk7XG4gICAgICAgIHR5cGVDaGVjazwoKSA9PiBbMSwgJ2ZvbyddLCAoKSA9PiB2b2lkPigoKSA9PiBbMSwgJ2ZvbyddKTtcbiAgICAgICAgdHlwZUNoZWNrPCgpID0+IFsxLCAnZm9vJ10sICgpID0+IFsnZm9vJywgMV0+KCgpID0+IFsxLCAnZm9vJ10pO1xuXG4gICAgICAgIHR5cGVDaGVjazwoKSA9PiBQcm9taXNlTGlrZTxudW1iZXI+LCAoKSA9PiBQcm9taXNlTGlrZTxudW1iZXI+Pignb2snKTtcbiAgICAgICAgdHlwZUNoZWNrPCgpID0+IFByb21pc2VMaWtlPG51bWJlcj4sICgpID0+IFByb21pc2VMaWtlPHN0cmluZz4+KCgpID0+XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKDEpLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdwYXJhbWV0ZXJzJywgKCkgPT4ge1xuICAgICAgICB0eXBlQ2hlY2s8KCkgPT4gdm9pZCwgKCkgPT4gdm9pZD4oJ29rJyk7XG4gICAgICAgIHR5cGVDaGVjazwoeDogbnVtYmVyKSA9PiB2b2lkLCAoeDogbnVtYmVyKSA9PiB2b2lkPignb2snKTtcbiAgICAgICAgdHlwZUNoZWNrPCh4OiBib29sZWFuKSA9PiB2b2lkLCAoeDogYm9vbGVhbikgPT4gdm9pZD4oJ29rJyk7XG4gICAgICAgIHR5cGVDaGVjazwoeDogMSkgPT4gdm9pZCwgKHg6IDEpID0+IHZvaWQ+KCdvaycpO1xuICAgICAgICB0eXBlQ2hlY2s8KCkgPT4gdm9pZCwgKHg6IDEpID0+IHZvaWQ+KCgpID0+IHt9KTtcbiAgICAgICAgdHlwZUNoZWNrPCh4OiAxKSA9PiB2b2lkLCAoeDogMikgPT4gdm9pZD4oKHg6IDEpID0+IHt9KTtcbiAgICAgICAgdHlwZUNoZWNrPCh4OiBmYWxzZSkgPT4gdm9pZCwgKHg6IHRydWUpID0+IHZvaWQ+KCh4OiBmYWxzZSkgPT4ge30pO1xuICAgICAgICB0eXBlQ2hlY2s8KHg6IFsxLCAnZm9vJ10pID0+IHZvaWQsICh4OiBbMSwgJ2ZvbyddKSA9PiB2b2lkPignb2snKTtcbiAgICAgICAgdHlwZUNoZWNrPCh4OiBbMSwgJ2ZvbyddKSA9PiB2b2lkLCAoKSA9PiB2b2lkPigoeDogWzEsICdmb28nXSkgPT4ge30pO1xuICAgICAgICB0eXBlQ2hlY2s8KHg6IFsxLCAnZm9vJ10pID0+IHZvaWQsICh4OiBbJ2ZvbycsIDFdKSA9PiB2b2lkPihcbiAgICAgICAgICAoeDogWzEsICdmb28nXSkgPT4ge30sXG4gICAgICAgICk7XG4gICAgICAgIHR5cGVDaGVjazwoeDogWzEsICdmb28nXSkgPT4gWzEsICdmb28nXSwgKHg6IFsxLCAnZm9vJ10pID0+IFsxLCAnZm9vJ10+KFxuICAgICAgICAgICdvaycsXG4gICAgICAgICk7XG4gICAgICAgIHR5cGVDaGVjazwoeDogWzEsICdmb28nXSkgPT4gWzEsICdmb28nXSwgKHg6IFsxLCAnZm9vJ10pID0+IFsnZm9vJywgMV0+KFxuICAgICAgICAgICh4OiBbMSwgJ2ZvbyddKSA9PiB4LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWVwQ29uY2F0JywgKCkgPT4ge1xuICAgIGl0KCcxIGVsZW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGZvbzogMSB9O1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZGVlcENvbmNhdCgnZm9vJyksICdmb28nKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWVwQ29uY2F0KG51bGwpLCBudWxsKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWVwQ29uY2F0KHVuZGVmaW5lZCksIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVlcENvbmNhdCgxKSwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVlcENvbmNhdChvYmopLCBvYmopO1xuICAgIH0pO1xuXG4gICAgaXQoJ3BsYWluIGVsZW1lbnRzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZXBDb25jYXQoJ2ZvbycsICdmb28nKSwgJ2ZvbycpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZXBDb25jYXQobnVsbCwgbnVsbCksIG51bGwpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZXBDb25jYXQodW5kZWZpbmVkLCB1bmRlZmluZWQpLCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZXBDb25jYXQodW5kZWZpbmVkLCB1bmRlZmluZWQsIDEpLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWVwQ29uY2F0KHVuZGVmaW5lZCwgMSwgdW5kZWZpbmVkKSwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVlcENvbmNhdCgxLCAxKSwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVlcENvbmNhdCh0cnVlLCB0cnVlKSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVlcENvbmNhdChudWxsLCB1bmRlZmluZWQpLCBudWxsKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWVwQ29uY2F0KHVuZGVmaW5lZCwgJ2ZvbycpLCAnZm9vJyk7XG5cbiAgICAgIGFzc2VydC50aHJvdygoKSA9PiBkZWVwQ29uY2F0KHRydWUsIGZhbHNlKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvdygoKSA9PiBkZWVwQ29uY2F0KCdmb28nLCBmYWxzZSksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3coKCkgPT4gZGVlcENvbmNhdCgnZm9vJywgJ2JhcicpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93KCgpID0+IGRlZXBDb25jYXQoJ2ZvbycsIHVuZGVmaW5lZCwgJ2JhcicpLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgYXNzZXJ0LnRocm93KCgpID0+IGRlZXBDb25jYXQoMSwgMS4xKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvdygoKSA9PiBkZWVwQ29uY2F0KDEsIHt9KSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGFzc2VydC50aHJvdygoKSA9PiBkZWVwQ29uY2F0KDEsIHsgZm9vOiAxIH0pLCBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlZXAgZWxlbWVudHMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGRlZXBDb25jYXQoeyBmb286IDEgfSwgeyBiYXI6IDIgfSksIHsgZm9vOiAxLCBiYXI6IDIgfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICBkZWVwQ29uY2F0KFxuICAgICAgICAgIHsgZm9vOiAxLCB4OiB7IGhlbGxvOiAnd29ybGQnIH0gfSxcbiAgICAgICAgICB7IGZvbzogMSwgeDogeyBtZTogJ2hpJyB9IH0sXG4gICAgICAgICAgeyBiYXI6IDMgfSxcbiAgICAgICAgKSxcbiAgICAgICAgeyBmb286IDEsIGJhcjogMywgeDogeyBoZWxsbzogJ3dvcmxkJywgbWU6ICdoaScgfSB9LFxuICAgICAgKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoZGVlcENvbmNhdCh7IGZvbzogMSB9LCB1bmRlZmluZWQsIHsgYmFyOiAyIH0pLCB7XG4gICAgICAgIGZvbzogMSxcbiAgICAgICAgYmFyOiAyLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGRlZXBDb25jYXQoWydmb28nXSwgWydmb28nLCAxXSksIFsnZm9vJywgMV0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChkZWVwQ29uY2F0KFsnZm9vJ10sIFt1bmRlZmluZWQsIDFdKSwgWydmb28nLCAxXSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGRlZXBDb25jYXQoWydmb28nLCB7IGJhcjogMSB9XSwgWydmb28nLCB7IGhlbGxvOiAyIH1dKSwgW1xuICAgICAgICAnZm9vJyxcbiAgICAgICAgeyBiYXI6IDEsIGhlbGxvOiAyIH0gYXMgYW55LFxuICAgICAgXSk7XG5cbiAgICAgIGFzc2VydC50aHJvdyhcbiAgICAgICAgKCkgPT4gZGVlcENvbmNhdCh7IGZvbzogMSB9LCB7IGZvbzogMiwgYmFyOiAyIH0pLFxuICAgICAgICBWYWxpZGF0aW9uRXJyb3IsXG4gICAgICApO1xuICAgICAgYXNzZXJ0LnRocm93KCgpID0+IGRlZXBDb25jYXQoeyBmb286IDEgfSwgbnVsbCksIFZhbGlkYXRpb25FcnJvcik7XG4gICAgICBhc3NlcnQudGhyb3coKCkgPT4gZGVlcENvbmNhdCh7IGZvbzogMSB9LCB0cnVlKSwgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY3Vyc2l2ZU1lcmdlJywgKCkgPT4ge1xuICAgIGl0KCdvciBwcmltaXRpdmVzJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFJlY3Vyc2l2ZU1lcmdlPFtzdHJpbmddIHwgW3N0cmluZ10+LCBbc3RyaW5nXT4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8UmVjdXJzaXZlTWVyZ2U8W251bWJlcl0gfCBbbnVtYmVyXT4sIFtudW1iZXJdPignb2snKTtcbiAgICAgIHR5cGVDaGVjazxSZWN1cnNpdmVNZXJnZTxbbnVtYmVyXSB8IFtzdHJpbmddPiwgW251bWJlciB8IHN0cmluZ10+KCdvaycpO1xuICAgICAgLy8gdHlwZUNoZWNrPFxuICAgICAgLy8gICBbUmVjdXJzaXZlTWVyZ2U8W3N0cmluZ10gfCBbc3RyaW5nLCBzdHJpbmddPl0sXG4gICAgICAvLyAgIFtbc3RyaW5nXSB8IFtzdHJpbmcgfCBzdHJpbmddXVxuICAgICAgLy8gPignb2snKTtcbiAgICB9KTtcblxuICAgIGl0KCdvciBwcmltaXRpdmVzIG1heWJlcycsICgpID0+IHtcbiAgICAgIHR5cGVDaGVjazxSZWN1cnNpdmVNZXJnZTxbc3RyaW5nXSB8IFtzdHJpbmc/XT4sIFtzdHJpbmc/XT4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8UmVjdXJzaXZlTWVyZ2U8W251bWJlcj9dIHwgW3N0cmluZ10+LCBbKG51bWJlciB8IHN0cmluZyk/XT4oXG4gICAgICAgICdvaycsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuZCBwcmltaXRpdmVzJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFJlY3Vyc2l2ZU1lcmdlPFtzdHJpbmddICYgW3N0cmluZ10+LCBbc3RyaW5nXT4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8UmVjdXJzaXZlTWVyZ2U8W251bWJlcl0gJiBbc3RyaW5nXT4sIFtuZXZlcl0+KCdvaycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuZCBwcmltaXRpdmVzIG1heWJlcycsICgpID0+IHtcbiAgICAgIHR5cGVDaGVjazxSZWN1cnNpdmVNZXJnZTxbc3RyaW5nP10gJiBbc3RyaW5nXT4sIFtzdHJpbmddPignb2snKTtcbiAgICAgIHR5cGVDaGVjazxSZWN1cnNpdmVNZXJnZTxbbnVtYmVyP10gJiBbc3RyaW5nXT4sIFtuZXZlcl0+KCdvaycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FuZCBvYmplY3RzJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFxuICAgICAgICBSZWN1cnNpdmVNZXJnZTx7IGZvbzogc3RyaW5nIH0gJiB7IGZvbzogc3RyaW5nIH0+LFxuICAgICAgICB7IGZvbzogc3RyaW5nIH1cbiAgICAgID4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8XG4gICAgICAgIFJlY3Vyc2l2ZU1lcmdlPHsgZm9vOiBzdHJpbmcgfSAmIHsgZm9vOiBudW1iZXIgfT4sXG4gICAgICAgIHsgZm9vOiBuZXZlciB9XG4gICAgICA+KCdvaycpO1xuICAgICAgdHlwZUNoZWNrPFxuICAgICAgICBSZWN1cnNpdmVNZXJnZTx7IGZvbzogc3RyaW5nIH0gJiB7IGJhcjogbnVtYmVyIH0+LFxuICAgICAgICB7IGZvbzogc3RyaW5nOyBiYXI6IG51bWJlciB9XG4gICAgICA+KCdvaycpO1xuICAgICAgdHlwZUNoZWNrPFxuICAgICAgICBSZWN1cnNpdmVNZXJnZTxbeyBmb286IHN0cmluZyB9XSAmIFt7IGZvbzogc3RyaW5nIH1dPixcbiAgICAgICAgW3sgZm9vOiBzdHJpbmcgfV1cbiAgICAgID4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8XG4gICAgICAgIFJlY3Vyc2l2ZU1lcmdlPFt7IGZvbzogc3RyaW5nIH1dICYgW3sgYmFyOiBudW1iZXIgfV0+LFxuICAgICAgICBbeyBmb286IHN0cmluZzsgYmFyOiBudW1iZXIgfV1cbiAgICAgID4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8XG4gICAgICAgIFJlY3Vyc2l2ZU1lcmdlPFt7IGZvbzogc3RyaW5nIH1dICYgW3sgYmFyPzogbnVtYmVyIH1dPixcbiAgICAgICAgW3sgZm9vOiBzdHJpbmc7IGJhcj86IG51bWJlciB9XVxuICAgICAgPignb2snKTtcbiAgICB9KTtcblxuICAgIGl0KCdvciBvYmplY3RzJywgKCkgPT4ge1xuICAgICAgdHlwZUNoZWNrPFxuICAgICAgICBSZWN1cnNpdmVNZXJnZTx7IGZvbzogc3RyaW5nIH0gfCB7IGZvbzogc3RyaW5nIH0+LFxuICAgICAgICB7IGZvbzogc3RyaW5nIH1cbiAgICAgID4oJ29rJyk7XG4gICAgICB0eXBlQ2hlY2s8XG4gICAgICAgIFJlY3Vyc2l2ZU1lcmdlPHsgZm9vOiBzdHJpbmcgfSB8IHsgZm9vOiBudW1iZXIgfT4sXG4gICAgICAgIHsgZm9vOiBzdHJpbmcgfSB8IHsgZm9vOiBudW1iZXIgfVxuICAgICAgPignb2snKTtcbiAgICAgIHR5cGVDaGVjazxcbiAgICAgICAgUmVjdXJzaXZlTWVyZ2U8W3sgZm9vOiBzdHJpbmcgfV0gfCBbeyBmb286IHN0cmluZyB9XT4sXG4gICAgICAgIFt7IGZvbzogc3RyaW5nIH1dXG4gICAgICA+KCdvaycpO1xuICAgICAgdHlwZUNoZWNrPFxuICAgICAgICBSZWN1cnNpdmVNZXJnZTxbeyBmb286IHN0cmluZyB9XSB8IFt7IGZvbzogbnVtYmVyIH1dPixcbiAgICAgICAgW3sgZm9vOiBzdHJpbmcgfSB8IHsgZm9vOiBudW1iZXIgfV1cbiAgICAgID4oJ29rJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=