UNPKG

emailjs-imap-client

Version:
461 lines (453 loc) 44.7 kB
"use strict"; var _emailjsImapHandler = require("emailjs-imap-handler"); var _commandParser = require("./command-parser"); var _common = require("./common"); var _envelope = _interopRequireDefault(require("../res/fixtures/envelope")); var _mimeTortureBodystructure = _interopRequireDefault(require("../res/fixtures/mime-torture-bodystructure")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable no-unused-expressions */ /* eslint-disable no-useless-escape */ describe('parseNAMESPACE', () => { it('should not succeed for no namespace response', () => { expect((0, _commandParser.parseNAMESPACE)({ payload: { NAMESPACE: [] } })).to.be.false; }); it('should return single personal namespace', () => { expect((0, _commandParser.parseNAMESPACE)({ payload: { NAMESPACE: [{ attributes: [[[{ type: 'STRING', value: 'INBOX.' }, { type: 'STRING', value: '.' }]], null, null] }] } })).to.deep.equal({ personal: [{ prefix: 'INBOX.', delimiter: '.' }], users: false, shared: false }); }); it('should return single personal, single users, multiple shared', () => { expect((0, _commandParser.parseNAMESPACE)({ payload: { NAMESPACE: [{ attributes: [// personal [[{ type: 'STRING', value: '' }, { type: 'STRING', value: '/' }]], // users [[{ type: 'STRING', value: '~' }, { type: 'STRING', value: '/' }]], // shared [[{ type: 'STRING', value: '#shared/' }, { type: 'STRING', value: '/' }], [{ type: 'STRING', value: '#public/' }, { type: 'STRING', value: '/' }]]] }] } })).to.deep.equal({ personal: [{ prefix: '', delimiter: '/' }], users: [{ prefix: '~', delimiter: '/' }], shared: [{ prefix: '#shared/', delimiter: '/' }, { prefix: '#public/', delimiter: '/' }] }); }); it('should handle NIL namespace hierarchy delim', () => { expect((0, _commandParser.parseNAMESPACE)({ payload: { NAMESPACE: [// This specific value is returned by yahoo.co.jp's // imapgate version 0.7.68_11_1.61475 IMAP server (0, _emailjsImapHandler.parser)((0, _common.toTypedArray)('* NAMESPACE (("" NIL)) NIL NIL'))] } })).to.deep.equal({ personal: [{ prefix: '', delimiter: null }], users: false, shared: false }); }); }); describe('parseSELECT', () => { it('should parse a complete response', () => { expect((0, _commandParser.parseSELECT)({ code: 'READ-WRITE', payload: { EXISTS: [{ nr: 123 }], FLAGS: [{ attributes: [[{ type: 'ATOM', value: '\\Answered' }, { type: 'ATOM', value: '\\Flagged' }]] }], OK: [{ code: 'PERMANENTFLAGS', permanentflags: ['\\Answered', '\\Flagged'] }, { code: 'UIDVALIDITY', uidvalidity: '2' }, { code: 'UIDNEXT', uidnext: '38361' }, { code: 'HIGHESTMODSEQ', highestmodseq: '3682918' }] } })).to.deep.equal({ exists: 123, flags: ['\\Answered', '\\Flagged'], highestModseq: '3682918', permanentFlags: ['\\Answered', '\\Flagged'], readOnly: false, uidNext: 38361, uidValidity: 2 }); }); it('should parse response with no modseq', () => { expect((0, _commandParser.parseSELECT)({ code: 'READ-WRITE', payload: { EXISTS: [{ nr: 123 }], FLAGS: [{ attributes: [[{ type: 'ATOM', value: '\\Answered' }, { type: 'ATOM', value: '\\Flagged' }]] }], OK: [{ code: 'PERMANENTFLAGS', permanentflags: ['\\Answered', '\\Flagged'] }, { code: 'UIDVALIDITY', uidvalidity: '2' }, { code: 'UIDNEXT', uidnext: '38361' }] } })).to.deep.equal({ exists: 123, flags: ['\\Answered', '\\Flagged'], permanentFlags: ['\\Answered', '\\Flagged'], readOnly: false, uidNext: 38361, uidValidity: 2 }); }); it('should parse response with read-only', () => { expect((0, _commandParser.parseSELECT)({ code: 'READ-ONLY', payload: { EXISTS: [{ nr: 123 }], FLAGS: [{ attributes: [[{ type: 'ATOM', value: '\\Answered' }, { type: 'ATOM', value: '\\Flagged' }]] }], OK: [{ code: 'PERMANENTFLAGS', permanentflags: ['\\Answered', '\\Flagged'] }, { code: 'UIDVALIDITY', uidvalidity: '2' }, { code: 'UIDNEXT', uidnext: '38361' }] } })).to.deep.equal({ exists: 123, flags: ['\\Answered', '\\Flagged'], permanentFlags: ['\\Answered', '\\Flagged'], readOnly: true, uidNext: 38361, uidValidity: 2 }); }); it('should parse response with NOMODSEQ flag', () => { expect((0, _commandParser.parseSELECT)({ code: 'READ-WRITE', payload: { EXISTS: [{ nr: 123 }], FLAGS: [{ attributes: [[{ type: 'ATOM', value: '\\Answered' }, { type: 'ATOM', value: '\\Flagged' }]] }], OK: [{ code: 'PERMANENTFLAGS', permanentflags: ['\\Answered', '\\Flagged'] }, { code: 'UIDVALIDITY', uidvalidity: '2' }, { code: 'UIDNEXT', uidnext: '38361' }, { code: 'NOMODSEQ' }] } })).to.deep.equal({ exists: 123, flags: ['\\Answered', '\\Flagged'], permanentFlags: ['\\Answered', '\\Flagged'], readOnly: false, uidNext: 38361, uidValidity: 2, noModseq: true }); }); }); describe('parseENVELOPE', () => { it('should parsed envelope object', () => { expect((0, _commandParser.parseENVELOPE)(_envelope.default.source)).to.deep.equal(_envelope.default.parsed); }); }); describe('parseBODYSTRUCTURE', () => { it('should parse bodystructure object', () => { expect((0, _commandParser.parseBODYSTRUCTURE)(_mimeTortureBodystructure.default.source)).to.deep.equal(_mimeTortureBodystructure.default.parsed); }); it('should parse bodystructure with unicode filename', () => { var input = [[{ type: 'STRING', value: 'APPLICATION' }, { type: 'STRING', value: 'OCTET-STREAM' }, null, null, null, { type: 'STRING', value: 'BASE64' }, { type: 'ATOM', value: '40' }, null, [{ type: 'STRING', value: 'ATTACHMENT' }, [{ type: 'STRING', value: 'FILENAME' }, { type: 'STRING', value: '=?ISO-8859-1?Q?BBR_Handel,_Gewerbe,_B=FCrobetriebe,?= =?ISO-8859-1?Q?_private_Bildungseinrichtungen.txt?=' }]], null], { type: 'STRING', value: 'MIXED' }, [{ type: 'STRING', value: 'BOUNDARY' }, { type: 'STRING', value: '----sinikael-?=_1-14105085265110.49903922458179295' }], null, null]; var expected = { childNodes: [{ part: '1', type: 'application/octet-stream', encoding: 'base64', size: 40, disposition: 'attachment', dispositionParameters: { filename: 'BBR Handel, Gewerbe, Bürobetriebe, private Bildungseinrichtungen.txt' } }], type: 'multipart/mixed', parameters: { boundary: '----sinikael-?=_1-14105085265110.49903922458179295' } }; expect((0, _commandParser.parseBODYSTRUCTURE)(input)).to.deep.equal(expected); }); }); describe('parseFETCH', () => { it('should return values lowercase keys', () => { expect((0, _commandParser.parseFETCH)({ payload: { FETCH: [{ nr: 123, attributes: [[{ type: 'ATOM', value: 'BODY', section: [{ type: 'ATOM', value: 'HEADER' }, [{ type: 'ATOM', value: 'DATE' }, { type: 'ATOM', value: 'SUBJECT' }]], partial: [0, 123] }, { type: 'ATOM', value: 'abc' }]] }] } })).to.deep.equal([{ '#': 123, 'body[header (date subject)]<0.123>': 'abc' }]); }); it('should merge multiple responses based on sequence number', () => { expect((0, _commandParser.parseFETCH)({ payload: { FETCH: [{ nr: 123, attributes: [[{ type: 'ATOM', value: 'UID' }, { type: 'ATOM', value: 789 }]] }, { nr: 124, attributes: [[{ type: 'ATOM', value: 'UID' }, { type: 'ATOM', value: 790 }]] }, { nr: 123, attributes: [[{ type: 'ATOM', value: 'MODSEQ' }, { type: 'ATOM', value: '127' }]] }] } })).to.deep.equal([{ '#': 123, uid: 789, modseq: '127' }, { '#': 124, uid: 790 }]); }); }); describe('parseSEARCH', () => { it('should parse SEARCH response', () => { expect((0, _commandParser.parseSEARCH)({ payload: { SEARCH: [{ attributes: [{ value: 5 }, { value: 7 }] }, { attributes: [{ value: 6 }] }] } })).to.deep.equal([5, 6, 7]); }); it('should parse empty SEARCH response', () => { expect((0, _commandParser.parseSEARCH)({ payload: { SEARCH: [{ command: 'SEARCH', tag: '*' }] } })).to.deep.equal([]); }); }); describe('parseCOPY', () => { it('should parse COPY response', () => { expect((0, _commandParser.parseCOPY)({ copyuid: ['1', '1:3', '3,4,2'] })).to.deep.equal({ srcSeqSet: '1:3', destSeqSet: '3,4,2' }); }); it('should return undefined when response does not contain copyuid', () => { expect((0, _commandParser.parseCOPY)({})).to.equal(undefined); }); it('should return undefined when response is not defined', () => { expect((0, _commandParser.parseCOPY)()).to.equal(undefined); }); }); describe('parseAPPEND', () => { it('should parse APPEND response', () => { expect((0, _commandParser.parseAPPEND)({ appenduid: ['1', '3'] })).to.equal('3'); }); it('should return undefined when response does not contain copyuid', () => { expect((0, _commandParser.parseAPPEND)({})).to.equal(undefined); }); it('should return undefined when response is not defined', () => { expect((0, _commandParser.parseAPPEND)()).to.equal(undefined); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21tYW5kLXBhcnNlci11bml0LmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJwYXlsb2FkIiwiTkFNRVNQQUNFIiwidG8iLCJiZSIsImZhbHNlIiwiYXR0cmlidXRlcyIsInR5cGUiLCJ2YWx1ZSIsImRlZXAiLCJlcXVhbCIsInBlcnNvbmFsIiwicHJlZml4IiwiZGVsaW1pdGVyIiwidXNlcnMiLCJzaGFyZWQiLCJjb2RlIiwiRVhJU1RTIiwibnIiLCJGTEFHUyIsIk9LIiwicGVybWFuZW50ZmxhZ3MiLCJ1aWR2YWxpZGl0eSIsInVpZG5leHQiLCJoaWdoZXN0bW9kc2VxIiwiZXhpc3RzIiwiZmxhZ3MiLCJoaWdoZXN0TW9kc2VxIiwicGVybWFuZW50RmxhZ3MiLCJyZWFkT25seSIsInVpZE5leHQiLCJ1aWRWYWxpZGl0eSIsIm5vTW9kc2VxIiwidGVzdEVudmVsb3BlIiwic291cmNlIiwicGFyc2VkIiwibWltZVRvcnR1cmUiLCJpbnB1dCIsImV4cGVjdGVkIiwiY2hpbGROb2RlcyIsInBhcnQiLCJlbmNvZGluZyIsInNpemUiLCJkaXNwb3NpdGlvbiIsImRpc3Bvc2l0aW9uUGFyYW1ldGVycyIsImZpbGVuYW1lIiwicGFyYW1ldGVycyIsImJvdW5kYXJ5IiwiRkVUQ0giLCJzZWN0aW9uIiwicGFydGlhbCIsInVpZCIsIm1vZHNlcSIsIlNFQVJDSCIsImNvbW1hbmQiLCJ0YWciLCJjb3B5dWlkIiwic3JjU2VxU2V0IiwiZGVzdFNlcVNldCIsInVuZGVmaW5lZCIsImFwcGVuZHVpZCJdLCJtYXBwaW5ncyI6Ijs7QUFHQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7OztBQWhCQTs7QUFDQTtBQWlCQUEsUUFBUSxDQUFDLGdCQUFELEVBQW1CLE1BQU07QUFDL0JDLEVBQUFBLEVBQUUsQ0FBQyw4Q0FBRCxFQUFpRCxNQUFNO0FBQ3ZEQyxJQUFBQSxNQUFNLENBQUMsbUNBQWU7QUFDcEJDLE1BQUFBLE9BQU8sRUFBRTtB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QUErQmlELFNBQS9CO0FBQ0QsR0FGQyxDQUFGO0FBSUE1RCxFQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsTUFBTTtBQUMvREMsSUFBQUEsTUFBTSxDQUFDLCtCQUFELENBQU4sQ0FBb0JHLEVBQXBCLENBQXVCTyxLQUF2QixDQUE2QmlELFNBQTdCO0FBQ0QsR0FGQyxDQUFGO0FBR0QsQ0FqQk8sQ0FBUjtBQW1CQTdELFFBQVEsQ0FBQyxhQUFELEVBQWdCLE1BQU07QUFDNUJDLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxNQUFNO0FBQ3ZDQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVk7QUFDakI0RCxNQUFBQSxTQUFTLEVBQUUsQ0FBQyxHQUFELEVBQU0sR0FBTjtBQURNLEtBQVosQ0FBRCxDQUFOLENBRUl6RCxFQUZKLENBRU9PLEtBRlAsQ0FFYSxHQUZiO0FBR0QsR0FKQyxDQUFGO0FBTUFYLEVBQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxNQUFNO0FBQ3pFQyxJQUFBQSxNQUFNLENBQUMsZ0NBQVksRUFBWixDQUFELENBQU4sQ0FBd0JHLEVBQXhCLENBQTJCTyxLQUEzQixDQUFpQ2lELFNBQWpDO0FBQ0QsR0FGQyxDQUFGO0FBSUE1RCxFQUFBQSxFQUFFLENBQUMsc0RBQUQsRUFBeUQsTUFBTTtBQUMvREMsSUFBQUEsTUFBTSxDQUFDLGlDQUFELENBQU4sQ0FBc0JHLEVBQXRCLENBQXlCTyxLQUF6QixDQUErQmlELFNBQS9CO0FBQ0QsR0FGQyxDQUFGO0FBR0QsQ0FkTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuXG5pbXBvcnQgeyBwYXJzZXIgfSBmcm9tICdlbWFpbGpzLWltYXAtaGFuZGxlcidcbmltcG9ydCB7XG4gIHBhcnNlQVBQRU5ELFxuICBwYXJzZUNPUFksXG4gIHBhcnNlU0VBUkNILFxuICBwYXJzZU5BTUVTUEFDRSxcbiAgcGFyc2VFTlZFTE9QRSxcbiAgcGFyc2VTRUxFQ1QsXG4gIHBhcnNlQk9EWVNUUlVDVFVSRSxcbiAgcGFyc2VGRVRDSFxufSBmcm9tICcuL2NvbW1hbmQtcGFyc2VyJ1xuaW1wb3J0IHsgdG9UeXBlZEFycmF5IH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgdGVzdEVudmVsb3BlIGZyb20gJy4uL3Jlcy9maXh0dXJlcy9lbnZlbG9wZSdcbmltcG9ydCBtaW1lVG9ydHVyZSBmcm9tICcuLi9yZXMvZml4dHVyZXMvbWltZS10b3J0dXJlLWJvZHlzdHJ1Y3R1cmUnXG5cbmRlc2NyaWJlKCdwYXJzZU5BTUVTUEFDRScsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBub3Qgc3VjY2VlZCBmb3Igbm8gbmFtZXNwYWNlIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW11cbiAgICAgIH1cbiAgICB9KSkudG8uYmUuZmFsc2VcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzaW5nbGUgcGVyc29uYWwgbmFtZXNwYWNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW3tcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdJTkJPWC4nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy4nXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICBdLCBudWxsLCBudWxsXG4gICAgICAgICAgXVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICBwcmVmaXg6ICdJTkJPWC4nLFxuICAgICAgICBkZWxpbWl0ZXI6ICcuJ1xuICAgICAgfV0sXG4gICAgICB1c2VyczogZmFsc2UsXG4gICAgICBzaGFyZWQ6IGZhbHNlXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBzaW5nbGUgcGVyc29uYWwsIHNpbmdsZSB1c2VycywgbXVsdGlwbGUgc2hhcmVkJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5BTUVTUEFDRSh7XG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIE5BTUVTUEFDRTogW3tcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICAvLyBwZXJzb25hbFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJ1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcvJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIHVzZXJzXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICd+J1xuICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1NUUklORycsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcvJ1xuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vIHNoYXJlZFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnI3NoYXJlZC8nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgICBbe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTVFJJTkcnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnI3B1YmxpYy8nXG4gICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU1RSSU5HJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJy8nXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICBdXG4gICAgICAgICAgXVxuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIHBlcnNvbmFsOiBbe1xuICAgICAgICBwcmVmaXg6ICcnLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJ1xuICAgICAgfV0sXG4gICAgICB1c2VyczogW3tcbiAgICAgICAgcHJlZml4OiAnficsXG4gICAgICAgIGRlbGltaXRlcjogJy8nXG4gICAgICB9XSxcbiAgICAgIHNoYXJlZDogW3tcbiAgICAgICAgcHJlZml4OiAnI3NoYXJlZC8nLFxuICAgICAgICBkZWxpbWl0ZXI6ICcvJ1xuICAgICAgfSwge1xuICAgICAgICBwcmVmaXg6ICcjcHVibGljLycsXG4gICAgICAgIGRlbGltaXRlcjogJy8nXG4gICAgICB9XVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBoYW5kbGUgTklMIG5hbWVzcGFjZSBoaWVyYXJjaHkgZGVsaW0nLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlTkFNRVNQQUNFKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgTkFNRVNQQUNFOiBbXG4gICAgICAgICAgLy8gVGhpcyBzcGVjaWZpYyB2YWx1ZSBpcyByZXR1cm5lZCBieSB5YWhvby5jby5qcCdzXG4gICAgICAgICAgLy8gaW1hcGdhdGUgdmVyc2lvbiAwLjcuNjhfMTFfMS42MTQ3NSBJTUFQIHNlcnZlclxuICAgICAgICAgIHBhcnNlcih0b1R5cGVkQXJyYXkoJyogTkFNRVNQQUNFICgoXCJcIiBOSUwpKSBOSUwgTklMJykpXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBwZXJzb25hbDogW3tcbiAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgZGVsaW1pdGVyOiBudWxsXG4gICAgICB9XSxcbiAgICAgIHVzZXJzOiBmYWxzZSxcbiAgICAgIHNoYXJlZDogZmFsc2VcbiAgICB9KVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ3BhcnNlU0VMRUNUJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIGEgY29tcGxldGUgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELVdSSVRFJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRVhJU1RTOiBbe1xuICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgfV0sXG4gICAgICAgIEZMQUdTOiBbe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcQW5zd2VyZWQnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcRmxhZ2dlZCdcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9XSxcbiAgICAgICAgT0s6IFt7XG4gICAgICAgICAgY29kZTogJ1BFUk1BTkVOVEZMQUdTJyxcbiAgICAgICAgICBwZXJtYW5lbnRmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ1VJRFZBTElESVRZJyxcbiAgICAgICAgICB1aWR2YWxpZGl0eTogJzInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlETkVYVCcsXG4gICAgICAgICAgdWlkbmV4dDogJzM4MzYxJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ0hJR0hFU1RNT0RTRVEnLFxuICAgICAgICAgIGhpZ2hlc3Rtb2RzZXE6ICczNjgyOTE4J1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGV4aXN0czogMTIzLFxuICAgICAgZmxhZ3M6IFsnXFxcXEFuc3dlcmVkJywgJ1xcXFxGbGFnZ2VkJ10sXG4gICAgICBoaWdoZXN0TW9kc2VxOiAnMzY4MjkxOCcsXG4gICAgICBwZXJtYW5lbnRGbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVpZE5leHQ6IDM4MzYxLFxuICAgICAgdWlkVmFsaWRpdHk6IDJcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcGFyc2UgcmVzcG9uc2Ugd2l0aCBubyBtb2RzZXEnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELVdSSVRFJyxcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRVhJU1RTOiBbe1xuICAgICAgICAgIG5yOiAxMjNcbiAgICAgICAgfV0sXG4gICAgICAgIEZMQUdTOiBbe1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcQW5zd2VyZWQnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdcXFxcRmxhZ2dlZCdcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9XSxcbiAgICAgICAgT0s6IFt7XG4gICAgICAgICAgY29kZTogJ1BFUk1BTkVOVEZMQUdTJyxcbiAgICAgICAgICBwZXJtYW5lbnRmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgY29kZTogJ1VJRFZBTElESVRZJyxcbiAgICAgICAgICB1aWR2YWxpZGl0eTogJzInXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlETkVYVCcsXG4gICAgICAgICAgdWlkbmV4dDogJzM4MzYxJ1xuICAgICAgICB9XVxuICAgICAgfVxuICAgIH0pKS50by5kZWVwLmVxdWFsKHtcbiAgICAgIGV4aXN0czogMTIzLFxuICAgICAgZmxhZ3M6IFsnXFxcXEFuc3dlcmVkJywgJ1xcXFxGbGFnZ2VkJ10sXG4gICAgICBwZXJtYW5lbnRGbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHVpZE5leHQ6IDM4MzYxLFxuICAgICAgdWlkVmFsaWRpdHk6IDJcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcGFyc2UgcmVzcG9uc2Ugd2l0aCByZWFkLW9ubHknLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VMRUNUKHtcbiAgICAgIGNvZGU6ICdSRUFELU9OTFknLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBFWElTVFM6IFt7XG4gICAgICAgICAgbnI6IDEyM1xuICAgICAgICB9XSxcbiAgICAgICAgRkxBR1M6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxBbnN3ZXJlZCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxGbGFnZ2VkJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dLFxuICAgICAgICBPSzogW3tcbiAgICAgICAgICBjb2RlOiAnUEVSTUFORU5URkxBR1MnLFxuICAgICAgICAgIHBlcm1hbmVudGZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlEVkFMSURJVFknLFxuICAgICAgICAgIHVpZHZhbGlkaXR5OiAnMidcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNvZGU6ICdVSURORVhUJyxcbiAgICAgICAgICB1aWRuZXh0OiAnMzgzNjEnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgZXhpc3RzOiAxMjMsXG4gICAgICBmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHBlcm1hbmVudEZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddLFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICB1aWROZXh0OiAzODM2MSxcbiAgICAgIHVpZFZhbGlkaXR5OiAyXG4gICAgfSlcbiAgfSlcblxuICBpdCgnc2hvdWxkIHBhcnNlIHJlc3BvbnNlIHdpdGggTk9NT0RTRVEgZmxhZycsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VTRUxFQ1Qoe1xuICAgICAgY29kZTogJ1JFQUQtV1JJVEUnLFxuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBFWElTVFM6IFt7XG4gICAgICAgICAgbnI6IDEyM1xuICAgICAgICB9XSxcbiAgICAgICAgRkxBR1M6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAgW3tcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxBbnN3ZXJlZCdcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICB2YWx1ZTogJ1xcXFxGbGFnZ2VkJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dLFxuICAgICAgICBPSzogW3tcbiAgICAgICAgICBjb2RlOiAnUEVSTUFORU5URkxBR1MnLFxuICAgICAgICAgIHBlcm1hbmVudGZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnVUlEVkFMSURJVFknLFxuICAgICAgICAgIHVpZHZhbGlkaXR5OiAnMidcbiAgICAgICAgfSwge1xuICAgICAgICAgIGNvZGU6ICdVSURORVhUJyxcbiAgICAgICAgICB1aWRuZXh0OiAnMzgzNjEnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBjb2RlOiAnTk9NT0RTRVEnXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgZXhpc3RzOiAxMjMsXG4gICAgICBmbGFnczogWydcXFxcQW5zd2VyZWQnLCAnXFxcXEZsYWdnZWQnXSxcbiAgICAgIHBlcm1hbmVudEZsYWdzOiBbJ1xcXFxBbnN3ZXJlZCcsICdcXFxcRmxhZ2dlZCddLFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgdWlkTmV4dDogMzgzNjEsXG4gICAgICB1aWRWYWxpZGl0eTogMixcbiAgICAgIG5vTW9kc2VxOiB0cnVlXG4gICAgfSlcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUVOVkVMT1BFJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlZCBlbnZlbG9wZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlRU5WRUxPUEUodGVzdEVudmVsb3BlLnNvdXJjZSkpLnRvLmRlZXAuZXF1YWwodGVzdEVudmVsb3BlLnBhcnNlZClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUJPRFlTVFJVQ1RVUkUnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcGFyc2UgYm9keXN0cnVjdHVyZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQk9EWVNUUlVDVFVSRShtaW1lVG9ydHVyZS5zb3VyY2UpKS50by5kZWVwLmVxdWFsKG1pbWVUb3J0dXJlLnBhcnNlZClcbiAgfSlcblxuICBpdCgnc2hvdWxkIHBhcnNlIGJvZHlzdHJ1Y3R1cmUgd2l0aCB1bmljb2RlIGZpbGVuYW1lJywgKCkgPT4ge1xuICAgIHZhciBpbnB1dCA9IFtcbiAgICAgIFtcbiAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICdBUFBMSUNBVElPTicgfSxcbiAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICdPQ1RFVC1TVFJFQU0nIH0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiAnQkFTRTY0JyB9LFxuICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICc0MCcgfSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgW1xuICAgICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiAnQVRUQUNITUVOVCcgfSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ0ZJTEVOQU1FJyB9LFxuICAgICAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6ICc9P0lTTy04ODU5LTE/UT9CQlJfSGFuZGVsLF9HZXdlcmJlLF9CPUZDcm9iZXRyaWViZSw/PSA9P0lTTy04ODU5LTE/UT9fcHJpdmF0ZV9CaWxkdW5nc2VpbnJpY2h0dW5nZW4udHh0Pz0nIH1cbiAgICAgICAgICBdXG4gICAgICAgIF0sXG4gICAgICAgIG51bGxcbiAgICAgIF0sXG4gICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ01JWEVEJyB9LFxuICAgICAgW1xuICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJ0JPVU5EQVJZJyB9LFxuICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogJy0tLS1zaW5pa2FlbC0/PV8xLTE0MTA1MDg1MjY1MTEwLjQ5OTAzOTIyNDU4MTc5Mjk1JyB9XG4gICAgICBdLFxuICAgICAgbnVsbCxcbiAgICAgIG51bGxcbiAgICBdXG5cbiAgICB2YXIgZXhwZWN0ZWQgPSB7XG4gICAgICBjaGlsZE5vZGVzOiBbe1xuICAgICAgICBwYXJ0OiAnMScsXG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICBlbmNvZGluZzogJ2Jhc2U2NCcsXG4gICAgICAgIHNpemU6IDQwLFxuICAgICAgICBkaXNwb3NpdGlvbjogJ2F0dGFjaG1lbnQnLFxuICAgICAgICBkaXNwb3NpdGlvblBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBmaWxlbmFtZTogJ0JCUiBIYW5kZWwsIEdld2VyYmUsIELDvHJvYmV0cmllYmUsIHByaXZhdGUgQmlsZHVuZ3NlaW5yaWNodHVuZ2VuLnR4dCdcbiAgICAgICAgfVxuICAgICAgfV0sXG4gICAgICB0eXBlOiAnbXVsdGlwYXJ0L21peGVkJyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgYm91bmRhcnk6ICctLS0tc2luaWthZWwtPz1fMS0xNDEwNTA4NTI2NTExMC40OTkwMzkyMjQ1ODE3OTI5NSdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBleHBlY3QocGFyc2VCT0RZU1RSVUNUVVJFKGlucHV0KSkudG8uZGVlcC5lcXVhbChleHBlY3RlZClcbiAgfSlcbn0pXG5cbmRlc2NyaWJlKCdwYXJzZUZFVENIJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHJldHVybiB2YWx1ZXMgbG93ZXJjYXNlIGtleXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlRkVUQ0goe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBGRVRDSDogW3tcbiAgICAgICAgICBucjogMTIzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdCT0RZJyxcbiAgICAgICAgICAgICAgc2VjdGlvbjogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdIRUFERVInXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFt7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnREFURSdcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ1NVQkpFQ1QnXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHBhcnRpYWw6IFswLCAxMjNdXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdhYmMnXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIF1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbChbe1xuICAgICAgJyMnOiAxMjMsXG4gICAgICAnYm9keVtoZWFkZXIgKGRhdGUgc3ViamVjdCldPDAuMTIzPic6ICdhYmMnXG4gICAgfV0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBtZXJnZSBtdWx0aXBsZSByZXNwb25zZXMgYmFzZWQgb24gc2VxdWVuY2UgbnVtYmVyJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUZFVENIKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgRkVUQ0g6IFt7XG4gICAgICAgICAgbnI6IDEyMyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiA3ODlcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbnI6IDEyNCxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVUlEJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiA3OTBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgXVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbnI6IDEyMyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICBbe1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnTU9EU0VRJ1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMTI3J1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICBdXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoW3tcbiAgICAgICcjJzogMTIzLFxuICAgICAgdWlkOiA3ODksXG4gICAgICBtb2RzZXE6ICcxMjcnXG4gICAgfSwge1xuICAgICAgJyMnOiAxMjQsXG4gICAgICB1aWQ6IDc5MFxuICAgIH1dKVxuICB9KVxufSlcblxuZGVzY3JpYmUoJ3BhcnNlU0VBUkNIJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIFNFQVJDSCByZXNwb25zZScsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VTRUFSQ0goe1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBTRUFSQ0g6IFt7XG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHZhbHVlOiA1XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgdmFsdWU6IDdcbiAgICAgICAgICB9XVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYXR0cmlidXRlczogW3tcbiAgICAgICAgICAgIHZhbHVlOiA2XG4gICAgICAgICAgfV1cbiAgICAgICAgfV1cbiAgICAgIH1cbiAgICB9KSkudG8uZGVlcC5lcXVhbChbNSwgNiwgN10pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCBwYXJzZSBlbXB0eSBTRUFSQ0ggcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlU0VBUkNIKHtcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgU0VBUkNIOiBbe1xuICAgICAgICAgIGNvbW1hbmQ6ICdTRUFSQ0gnLFxuICAgICAgICAgIHRhZzogJyonXG4gICAgICAgIH1dXG4gICAgICB9XG4gICAgfSkpLnRvLmRlZXAuZXF1YWwoW10pXG4gIH0pXG59KVxuXG5kZXNjcmliZSgncGFyc2VDT1BZJywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIHBhcnNlIENPUFkgcmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQ09QWSh7XG4gICAgICBjb3B5dWlkOiBbJzEnLCAnMTozJywgJzMsNCwyJ11cbiAgICB9KSkudG8uZGVlcC5lcXVhbCh7XG4gICAgICBzcmNTZXFTZXQ6ICcxOjMnLFxuICAgICAgZGVzdFNlcVNldDogJzMsNCwyJ1xuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBjb3B5dWlkJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUNPUFkoe30pKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQ09QWSgpKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG59KVxuXG5kZXNjcmliZSgncGFyc2VBUFBFTkQnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgcGFyc2UgQVBQRU5EIHJlc3BvbnNlJywgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZUFQUEVORCh7XG4gICAgICBhcHBlbmR1aWQ6IFsnMScsICczJ11cbiAgICB9KSkudG8uZXF1YWwoJzMnKVxuICB9KVxuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIHJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gY29weXVpZCcsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VBUFBFTkQoe30pKS50by5lcXVhbCh1bmRlZmluZWQpXG4gIH0pXG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gcmVzcG9uc2UgaXMgbm90IGRlZmluZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHBhcnNlQVBQRU5EKCkpLnRvLmVxdWFsKHVuZGVmaW5lZClcbiAgfSlcbn0pXG4iXX0=