UNPKG

emailjs-imap-handler

Version:
856 lines (719 loc) 97.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); exports.default = function (buffers) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var parser = new ParserInstance(buffers, options); var response = {}; response.tag = parser.getTag(); parser.getSpace(); response.command = parser.getCommand(); if (['UID', 'AUTHENTICATE'].indexOf((response.command || '').toUpperCase()) >= 0) { parser.getSpace(); response.command += ' ' + parser.getElement(_formalSyntax.IS_COMMAND); } if (!isEmpty(parser.remainder)) { parser.getSpace(); response.attributes = parser.getAttributes(); } if (parser.humanReadable) { response.attributes = (response.attributes || []).concat({ type: 'TEXT', value: parser.humanReadable }); } return response; }; var _formalSyntax = require('./formal-syntax'); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function fromCharCode(uint8Array) { var batchSize = 10240; var strings = []; for (var i = 0; i < uint8Array.length; i += batchSize) { var begin = i; var end = Math.min(i + batchSize, uint8Array.length); strings.push(String.fromCharCode.apply(null, uint8Array.subarray(begin, end))); } return strings.join(''); } function fromCharCodeTrimmed(uint8Array) { var begin = 0; var end = uint8Array.length; while (uint8Array[begin] === _formalSyntax.ASCII_SPACE) { begin++; } while (uint8Array[end - 1] === _formalSyntax.ASCII_SPACE) { end--; } if (begin !== 0 || end !== uint8Array.length) { uint8Array = uint8Array.subarray(begin, end); } return fromCharCode(uint8Array); } function isEmpty(uint8Array) { for (var i = 0; i < uint8Array.length; i++) { if (uint8Array[i] !== _formalSyntax.ASCII_SPACE) { return false; } } return true; } var ParserInstance = function () { function ParserInstance(input, options) { _classCallCheck(this, ParserInstance); this.remainder = new Uint8Array(input || 0); this.options = options || {}; this.pos = 0; } _createClass(ParserInstance, [{ key: 'getTag', value: function getTag() { if (!this.tag) { var syntaxChecker = function syntaxChecker(chr) { return (0, _formalSyntax.IS_TAG)(chr) || chr === _formalSyntax.ASCII_ASTERISK || chr === _formalSyntax.ASCII_PLUS; }; this.tag = this.getElement(syntaxChecker); } return this.tag; } }, { key: 'getCommand', value: function getCommand() { if (!this.command) { this.command = this.getElement(_formalSyntax.IS_COMMAND); } switch ((this.command || '').toString().toUpperCase()) { case 'OK': case 'NO': case 'BAD': case 'PREAUTH': case 'BYE': var lastRightBracket = this.remainder.lastIndexOf(_formalSyntax.ASCII_RIGHT_BRACKET); if (this.remainder[1] === _formalSyntax.ASCII_LEFT_BRACKET && lastRightBracket > 1) { this.humanReadable = fromCharCodeTrimmed(this.remainder.subarray(lastRightBracket + 1)); this.remainder = this.remainder.subarray(0, lastRightBracket + 1); } else { this.humanReadable = fromCharCodeTrimmed(this.remainder); this.remainder = new Uint8Array(0); } break; } return this.command; } }, { key: 'getElement', value: function getElement(syntaxChecker) { var element = void 0; if (this.remainder[0] === _formalSyntax.ASCII_SPACE) { throw new Error('Unexpected whitespace at position ' + this.pos); } var firstSpace = this.remainder.indexOf(_formalSyntax.ASCII_SPACE); if (this.remainder.length > 0 && firstSpace !== 0) { if (firstSpace === -1) { element = this.remainder; } else { element = this.remainder.subarray(0, firstSpace); } for (var i = 0; i < element.length; i++) { if (!syntaxChecker(element[i])) { throw new Error('Unexpected char at position ' + (this.pos + i)); } } } else { throw new Error('Unexpected end of input at position ' + this.pos); } this.pos += element.length; this.remainder = this.remainder.subarray(element.length); return fromCharCode(element); } }, { key: 'getSpace', value: function getSpace() { if (!this.remainder.length) { throw new Error('Unexpected end of input at position ' + this.pos); } if (this.remainder[0] !== _formalSyntax.ASCII_SPACE) { throw new Error('Unexpected char at position ' + this.pos); } this.pos++; this.remainder = this.remainder.subarray(1); } }, { key: 'getAttributes', value: function getAttributes() { if (!this.remainder.length) { throw new Error('Unexpected end of input at position ' + this.pos); } if (this.remainder[0] === _formalSyntax.ASCII_SPACE) { throw new Error('Unexpected whitespace at position ' + this.pos); } return new TokenParser(this, this.pos, this.remainder.subarray(), this.options).getAttributes(); } }]); return ParserInstance; }(); var Node = function () { function Node(uint8Array, parentNode, startPos) { _classCallCheck(this, Node); this.uint8Array = uint8Array; this.childNodes = []; this.type = false; this.closed = true; this.valueSkip = []; this.startPos = startPos; this.valueStart = this.valueEnd = typeof startPos === 'number' ? startPos + 1 : 0; if (parentNode) { this.parentNode = parentNode; parentNode.childNodes.push(this); } } _createClass(Node, [{ key: 'getValue', value: function getValue() { var value = fromCharCode(this.getValueArray()); return this.valueToUpperCase ? value.toUpperCase() : value; } }, { key: 'getValueLength', value: function getValueLength() { return this.valueEnd - this.valueStart - this.valueSkip.length; } }, { key: 'getValueArray', value: function getValueArray() { var valueArray = this.uint8Array.subarray(this.valueStart, this.valueEnd); if (this.valueSkip.length === 0) { return valueArray; } var filteredArray = new Uint8Array(valueArray.length - this.valueSkip.length); var begin = 0; var offset = 0; var skip = this.valueSkip.slice(); skip.push(valueArray.length); skip.forEach(function (end) { if (end > begin) { var subArray = valueArray.subarray(begin, end); filteredArray.set(subArray, offset); offset += subArray.length; } begin = end + 1; }); return filteredArray; } }, { key: 'equals', value: function equals(value, caseSensitive) { if (this.getValueLength() !== value.length) { return false; } return this.equalsAt(value, 0, caseSensitive); } }, { key: 'equalsAt', value: function equalsAt(value, index, caseSensitive) { caseSensitive = typeof caseSensitive === 'boolean' ? caseSensitive : true; if (index < 0) { index = this.valueEnd + index; while (this.valueSkip.indexOf(this.valueStart + index) >= 0) { index--; } } else { index = this.valueStart + index; } for (var i = 0; i < value.length; i++) { while (this.valueSkip.indexOf(index - this.valueStart) >= 0) { index++; } if (index >= this.valueEnd) { return false; } var uint8Char = String.fromCharCode(this.uint8Array[index]); var char = value[i]; if (!caseSensitive) { uint8Char = uint8Char.toUpperCase(); char = char.toUpperCase(); } if (uint8Char !== char) { return false; } index++; } return true; } }, { key: 'isNumber', value: function isNumber() { for (var i = 0; i < this.valueEnd - this.valueStart; i++) { if (this.valueSkip.indexOf(i) >= 0) { continue; } if (!this.isDigit(i)) { return false; } } return true; } }, { key: 'isDigit', value: function isDigit(index) { if (index < 0) { index = this.valueEnd + index; while (this.valueSkip.indexOf(this.valueStart + index) >= 0) { index--; } } else { index = this.valueStart + index; while (this.valueSkip.indexOf(this.valueStart + index) >= 0) { index++; } } return (0, _formalSyntax.IS_DIGIT)(this.uint8Array[index]); } }, { key: 'containsChar', value: function containsChar(char) { var ascii = char.charCodeAt(0); for (var i = this.valueStart; i < this.valueEnd; i++) { if (this.valueSkip.indexOf(i - this.valueStart) >= 0) { continue; } if (this.uint8Array[i] === ascii) { return true; } } return false; } }]); return Node; }(); var TokenParser = function () { function TokenParser(parent, startPos, uint8Array) { var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; _classCallCheck(this, TokenParser); this.uint8Array = uint8Array; this.options = options; this.parent = parent; this.tree = this.currentNode = this.createNode(); this.pos = startPos || 0; this.currentNode.type = 'TREE'; this.state = 'NORMAL'; if (this.options.valueAsString === undefined) { this.options.valueAsString = true; } this.processString(); } _createClass(TokenParser, [{ key: 'getAttributes', value: function getAttributes() { var _this = this; var attributes = []; var branch = attributes; var walk = function walk(node) { var elm = void 0; var curBranch = branch; var partial = void 0; if (!node.closed && node.type === 'SEQUENCE' && node.equals('*')) { node.closed = true; node.type = 'ATOM'; } // If the node was never closed, throw it if (!node.closed) { throw new Error('Unexpected end of input at position ' + (_this.pos + _this.uint8Array.length - 1)); } switch (node.type.toUpperCase()) { case 'LITERAL': case 'STRING': elm = { type: node.type.toUpperCase(), value: _this.options.valueAsString ? node.getValue() : node.getValueArray() }; branch.push(elm); break; case 'SEQUENCE': elm = { type: node.type.toUpperCase(), value: node.getValue() }; branch.push(elm); break; case 'ATOM': if (node.equals('NIL', true)) { branch.push(null); break; } elm = { type: node.type.toUpperCase(), value: node.getValue() }; branch.push(elm); break; case 'SECTION': branch = branch[branch.length - 1].section = []; break; case 'LIST': elm = []; branch.push(elm); branch = elm; break; case 'PARTIAL': partial = node.getValue().split('.').map(Number); branch[branch.length - 1].partial = partial; break; } node.childNodes.forEach(function (childNode) { walk(childNode); }); branch = curBranch; }; walk(this.tree); return attributes; } }, { key: 'createNode', value: function createNode(parentNode, startPos) { return new Node(this.uint8Array, parentNode, startPos); } }, { key: 'processString', value: function processString() { var _this2 = this; var i = void 0; var len = void 0; var checkSP = function checkSP(pos) { // jump to the next non whitespace pos while (_this2.uint8Array[i + 1] === _formalSyntax.ASCII_SPACE) { i++; } }; for (i = 0, len = this.uint8Array.length; i < len; i++) { var chr = this.uint8Array[i]; switch (this.state) { case 'NORMAL': switch (chr) { // DQUOTE starts a new string case _formalSyntax.ASCII_DQUOTE: this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'string'; this.state = 'STRING'; this.currentNode.closed = false; break; // ( starts a new list case _formalSyntax.ASCII_LEFT_PARENTHESIS: this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'LIST'; this.currentNode.closed = false; break; // ) closes a list case _formalSyntax.ASCII_RIGHT_PARENTHESIS: if (this.currentNode.type !== 'LIST') { throw new Error('Unexpected list terminator ) at position ' + (this.pos + i)); } this.currentNode.closed = true; this.currentNode.endPos = this.pos + i; this.currentNode = this.currentNode.parentNode; checkSP(); break; // ] closes section group case _formalSyntax.ASCII_RIGHT_BRACKET: if (this.currentNode.type !== 'SECTION') { throw new Error('Unexpected section terminator ] at position ' + (this.pos + i)); } this.currentNode.closed = true; this.currentNode.endPos = this.pos + i; this.currentNode = this.currentNode.parentNode; checkSP(); break; // < starts a new partial case _formalSyntax.ASCII_LESS_THAN_SIGN: if (this.uint8Array[i - 1] !== _formalSyntax.ASCII_RIGHT_BRACKET) { this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'ATOM'; this.currentNode.valueStart = i; this.currentNode.valueEnd = i + 1; this.state = 'ATOM'; } else { this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'PARTIAL'; this.state = 'PARTIAL'; this.currentNode.closed = false; } break; // { starts a new literal case _formalSyntax.ASCII_LEFT_CURLY_BRACKET: this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'LITERAL'; this.state = 'LITERAL'; this.currentNode.closed = false; break; // ( starts a new sequence case _formalSyntax.ASCII_ASTERISK: this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'SEQUENCE'; this.currentNode.valueStart = i; this.currentNode.valueEnd = i + 1; this.currentNode.closed = false; this.state = 'SEQUENCE'; break; // normally a space should never occur case _formalSyntax.ASCII_SPACE: // just ignore break; // start of a literal8, handle in case ASCII_LEFT_CURLY_BRACKET case _formalSyntax.ASCII_TILDE: break; // [ starts section case _formalSyntax.ASCII_LEFT_BRACKET: // If it is the *first* element after response command, then process as a response argument list if (['OK', 'NO', 'BAD', 'BYE', 'PREAUTH'].indexOf(this.parent.command.toUpperCase()) >= 0 && this.currentNode === this.tree) { this.currentNode.endPos = this.pos + i; this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'ATOM'; this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'SECTION'; this.currentNode.closed = false; this.state = 'NORMAL'; // RFC2221 defines a response code REFERRAL whose payload is an // RFC2192/RFC5092 imapurl that we will try to parse as an ATOM but // fail quite badly at parsing. Since the imapurl is such a unique // (and crazy) term, we just specialize that case here. if (fromCharCode(this.uint8Array.subarray(i + 1, i + 10)).toUpperCase() === 'REFERRAL ') { // create the REFERRAL atom this.currentNode = this.createNode(this.currentNode, this.pos + i + 1); this.currentNode.type = 'ATOM'; this.currentNode.endPos = this.pos + i + 8; this.currentNode.valueStart = i + 1; this.currentNode.valueEnd = i + 9; this.currentNode.valueToUpperCase = true; this.currentNode = this.currentNode.parentNode; // eat all the way through the ] to be the IMAPURL token. this.currentNode = this.createNode(this.currentNode, this.pos + i + 10); // just call this an ATOM, even though IMAPURL might be more correct this.currentNode.type = 'ATOM'; // jump i to the ']' i = this.uint8Array.indexOf(_formalSyntax.ASCII_RIGHT_BRACKET, i + 10); this.currentNode.endPos = this.pos + i - 1; this.currentNode.valueStart = this.currentNode.startPos - this.pos; this.currentNode.valueEnd = this.currentNode.endPos - this.pos + 1; this.currentNode = this.currentNode.parentNode; // close out the SECTION this.currentNode.closed = true; this.currentNode = this.currentNode.parentNode; checkSP(); } break; } /* falls through */ default: // Any ATOM supported char starts a new Atom sequence, otherwise throw an error // Allow \ as the first char for atom to support system flags // Allow % to support LIST '' % if (!(0, _formalSyntax.IS_ATOM_CHAR)(chr) && chr !== _formalSyntax.ASCII_BACKSLASH && chr !== _formalSyntax.ASCII_PERCENT_SIGN) { throw new Error('Unexpected char at position ' + (this.pos + i)); } this.currentNode = this.createNode(this.currentNode, i); this.currentNode.type = 'ATOM'; this.currentNode.valueStart = i; this.currentNode.valueEnd = i + 1; this.state = 'ATOM'; break; } break; case 'ATOM': // space finishes an atom if (chr === _formalSyntax.ASCII_SPACE) { this.currentNode.endPos = this.pos + i - 1; this.currentNode = this.currentNode.parentNode; this.state = 'NORMAL'; break; } // if (this.currentNode.parentNode && (chr === _formalSyntax.ASCII_RIGHT_PARENTHESIS && this.currentNode.parentNode.type === 'LIST' || chr === _formalSyntax.ASCII_RIGHT_BRACKET && this.currentNode.parentNode.type === 'SECTION')) { this.currentNode.endPos = this.pos + i - 1; this.currentNode = this.currentNode.parentNode; this.currentNode.closed = true; this.currentNode.endPos = this.pos + i; this.currentNode = this.currentNode.parentNode; this.state = 'NORMAL'; checkSP(); break; } if ((chr === _formalSyntax.ASCII_COMMA || chr === _formalSyntax.ASCII_COLON) && this.currentNode.isNumber()) { this.currentNode.type = 'SEQUENCE'; this.currentNode.closed = true; this.state = 'SEQUENCE'; } // [ starts a section group for this element if (chr === _formalSyntax.ASCII_LEFT_BRACKET && (this.currentNode.equals('BODY', false) || this.currentNode.equals('BODY.PEEK', false))) { this.currentNode.endPos = this.pos + i; this.currentNode = this.createNode(this.currentNode.parentNode, this.pos + i); this.currentNode.type = 'SECTION'; this.currentNode.closed = false; this.state = 'NORMAL'; break; } if (chr === _formalSyntax.ASCII_LESS_THAN_SIGN) { throw new Error('Unexpected start of partial at position ' + this.pos); } // if the char is not ATOM compatible, throw. Allow \* as an exception if (!(0, _formalSyntax.IS_ATOM_CHAR)(chr) && chr !== _formalSyntax.ASCII_RIGHT_BRACKET && !(chr === _formalSyntax.ASCII_ASTERISK && this.currentNode.equals('\\'))) { throw new Error('Unexpected char at position ' + (this.pos + i)); } else if (this.currentNode.equals('\\*')) { throw new Error('Unexpected char at position ' + (this.pos + i)); } this.currentNode.valueEnd = i + 1; break; case 'STRING': // DQUOTE ends the string sequence if (chr === _formalSyntax.ASCII_DQUOTE) { this.currentNode.endPos = this.pos + i; this.currentNode.closed = true; this.currentNode = this.currentNode.parentNode; this.state = 'NORMAL'; checkSP(); break; } // \ Escapes the following char if (chr === _formalSyntax.ASCII_BACKSLASH) { this.currentNode.valueSkip.push(i - this.currentNode.valueStart); i++; if (i >= len) { throw new Error('Unexpected end of input at position ' + (this.pos + i)); } chr = this.uint8Array[i]; } /* // skip this check, otherwise the parser might explode on binary input if (TEXT_CHAR().indexOf(chr) < 0) { throw new Error('Unexpected char at position ' + (this.pos + i)); } */ this.currentNode.valueEnd = i + 1; break; case 'PARTIAL': if (chr === _formalSyntax.ASCII_GREATER_THAN_SIGN) { if (this.currentNode.equalsAt('.', -1)) { throw new Error('Unexpected end of partial at position ' + this.pos); } this.currentNode.endPos = this.pos + i; this.currentNode.closed = true; this.currentNode = this.currentNode.parentNode; this.state = 'NORMAL'; checkSP(); break; } if (chr === _formalSyntax.ASCII_FULL_STOP && (!this.currentNode.getValueLength() || this.currentNode.containsChar('.'))) { throw new Error('Unexpected partial separator . at position ' + this.pos); } if (!(0, _formalSyntax.IS_DIGIT)(chr) && chr !== _formalSyntax.ASCII_FULL_STOP) { throw new Error('Unexpected char at position ' + (this.pos + i)); } if (chr !== _formalSyntax.ASCII_FULL_STOP && (this.currentNode.equals('0') || this.currentNode.equalsAt('.0', -2))) { throw new Error('Invalid partial at position ' + (this.pos + i)); } this.currentNode.valueEnd = i + 1; break; case 'LITERAL': if (this.currentNode.started) { this.currentNode.valueEnd = i + 1; if (this.currentNode.getValueLength() >= this.currentNode.literalLength) { this.currentNode.endPos = this.pos + i; this.currentNode.closed = true; this.currentNode = this.currentNode.parentNode; this.state = 'NORMAL'; checkSP(); } break; } if (chr === _formalSyntax.ASCII_PLUS) { // assuming capability LITERAL+ or LITERAL- this.currentNode.literalPlus = true; break; } if (chr === _formalSyntax.ASCII_RIGHT_CURLY_BRACKET) { if (!('literalLength' in this.currentNode)) { throw new Error('Unexpected literal prefix end char } at position ' + (this.pos + i)); } if (this.uint8Array[i + 1] === _formalSyntax.ASCII_NL) { i++; } else if (this.uint8Array[i + 1] === _formalSyntax.ASCII_CR && this.uint8Array[i + 2] === _formalSyntax.ASCII_NL) { i += 2; } else { throw new Error('Unexpected char at position ' + (this.pos + i)); } this.currentNode.valueStart = i + 1; this.currentNode.literalLength = Number(this.currentNode.literalLength); this.currentNode.started = true; if (!this.currentNode.literalLength) { // special case where literal content length is 0 // close the node right away, do not wait for additional input this.currentNode.endPos = this.pos + i; this.currentNode.closed = true; this.currentNode = this.currentNode.parentNode; this.state = 'NORMAL'; checkSP(); } break; } if (!(0, _formalSyntax.IS_DIGIT)(chr)) { throw new Error('Unexpected char at position ' + (this.pos + i)); } if (this.currentNode.literalLength === '0') { throw new Error('Invalid literal at position ' + (this.pos + i)); } this.currentNode.literalLength = (this.currentNode.literalLength || '') + String.fromCharCode(chr); break; case 'SEQUENCE': // space finishes the sequence set if (chr === _formalSyntax.ASCII_SPACE) { if (!this.currentNode.isDigit(-1) && !this.currentNode.equalsAt('*', -1)) { throw new Error('Unexpected whitespace at position ' + (this.pos + i)); } if (this.currentNode.equalsAt('*', -1) && !this.currentNode.equalsAt(':', -2)) { throw new Error('Unexpected whitespace at position ' + (this.pos + i)); } this.currentNode.closed = true; this.currentNode.endPos = this.pos + i - 1; this.currentNode = this.currentNode.parentNode; this.state = 'NORMAL'; break; } else if (this.currentNode.parentNode && chr === _formalSyntax.ASCII_RIGHT_BRACKET && this.currentNode.parentNode.type === 'SECTION') { this.currentNode.endPos = this.pos + i - 1; this.currentNode = this.currentNode.parentNode; this.currentNode.closed = true; this.currentNode.endPos = this.pos + i; this.currentNode = this.currentNode.parentNode; this.state = 'NORMAL'; checkSP(); break; } if (chr === _formalSyntax.ASCII_COLON) { if (!this.currentNode.isDigit(-1) && !this.currentNode.equalsAt('*', -1)) { throw new Error('Unexpected range separator : at position ' + (this.pos + i)); } } else if (chr === _formalSyntax.ASCII_ASTERISK) { if (!this.currentNode.equalsAt(',', -1) && !this.currentNode.equalsAt(':', -1)) { throw new Error('Unexpected range wildcard at position ' + (this.pos + i)); } } else if (chr === _formalSyntax.ASCII_COMMA) { if (!this.currentNode.isDigit(-1) && !this.currentNode.equalsAt('*', -1)) { throw new Error('Unexpected sequence separator , at position ' + (this.pos + i)); } if (this.currentNode.equalsAt('*', -1) && !this.currentNode.equalsAt(':', -2)) { throw new Error('Unexpected sequence separator , at position ' + (this.pos + i)); } } else if (!(0, _formalSyntax.IS_DIGIT)(chr)) { throw new Error('Unexpected char at position ' + (this.pos + i)); } if ((0, _formalSyntax.IS_DIGIT)(chr) && this.currentNode.equalsAt('*', -1)) { throw new Error('Unexpected number at position ' + (this.pos + i)); } this.currentNode.valueEnd = i + 1; break; } } } }]); return TokenParser; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZXIuanMiXSwibmFtZXMiOlsiYnVmZmVycyIsIm9wdGlvbnMiLCJwYXJzZXIiLCJQYXJzZXJJbnN0YW5jZSIsInJlc3BvbnNlIiwidGFnIiwiZ2V0VGFnIiwiZ2V0U3BhY2UiLCJjb21tYW5kIiwiZ2V0Q29tbWFuZCIsImluZGV4T2YiLCJ0b1VwcGVyQ2FzZSIsImdldEVsZW1lbnQiLCJJU19DT01NQU5EIiwiaXNFbXB0eSIsInJlbWFpbmRlciIsImF0dHJpYnV0ZXMiLCJnZXRBdHRyaWJ1dGVzIiwiaHVtYW5SZWFkYWJsZSIsImNvbmNhdCIsInR5cGUiLCJ2YWx1ZSIsImZyb21DaGFyQ29kZSIsInVpbnQ4QXJyYXkiLCJiYXRjaFNpemUiLCJzdHJpbmdzIiwiaSIsImxlbmd0aCIsImJlZ2luIiwiZW5kIiwiTWF0aCIsIm1pbiIsInB1c2giLCJTdHJpbmciLCJhcHBseSIsInN1YmFycmF5Iiwiam9pbiIsImZyb21DaGFyQ29kZVRyaW1tZWQiLCJBU0NJSV9TUEFDRSIsImlucHV0IiwiVWludDhBcnJheSIsInBvcyIsInN5bnRheENoZWNrZXIiLCJjaHIiLCJBU0NJSV9BU1RFUklTSyIsIkFTQ0lJX1BMVVMiLCJ0b1N0cmluZyIsImxhc3RSaWdodEJyYWNrZXQiLCJsYXN0SW5kZXhPZiIsIkFTQ0lJX1JJR0hUX0JSQUNLRVQiLCJBU0NJSV9MRUZUX0JSQUNLRVQiLCJlbGVtZW50IiwiRXJyb3IiLCJmaXJzdFNwYWNlIiwiVG9rZW5QYXJzZXIiLCJOb2RlIiwicGFyZW50Tm9kZSIsInN0YXJ0UG9zIiwiY2hpbGROb2RlcyIsImNsb3NlZCIsInZhbHVlU2tpcCIsInZhbHVlU3RhcnQiLCJ2YWx1ZUVuZCIsImdldFZhbHVlQXJyYXkiLCJ2YWx1ZVRvVXBwZXJDYXNlIiwidmFsdWVBcnJheSIsImZpbHRlcmVkQXJyYXkiLCJvZmZzZXQiLCJza2lwIiwic2xpY2UiLCJmb3JFYWNoIiwic3ViQXJyYXkiLCJzZXQiLCJjYXNlU2Vuc2l0aXZlIiwiZ2V0VmFsdWVMZW5ndGgiLCJlcXVhbHNBdCIsImluZGV4IiwidWludDhDaGFyIiwiY2hhciIsImlzRGlnaXQiLCJhc2NpaSIsImNoYXJDb2RlQXQiLCJwYXJlbnQiLCJ0cmVlIiwiY3VycmVudE5vZGUiLCJjcmVhdGVOb2RlIiwic3RhdGUiLCJ2YWx1ZUFzU3RyaW5nIiwidW5kZWZpbmVkIiwicHJvY2Vzc1N0cmluZyIsImJyYW5jaCIsIndhbGsiLCJlbG0iLCJjdXJCcmFuY2giLCJwYXJ0aWFsIiwibm9kZSIsImVxdWFscyIsImdldFZhbHVlIiwic2VjdGlvbiIsInNwbGl0IiwibWFwIiwiTnVtYmVyIiwiY2hpbGROb2RlIiwibGVuIiwiY2hlY2tTUCIsIkFTQ0lJX0RRVU9URSIsIkFTQ0lJX0xFRlRfUEFSRU5USEVTSVMiLCJBU0NJSV9SSUdIVF9QQVJFTlRIRVNJUyIsImVuZFBvcyIsIkFTQ0lJX0xFU1NfVEhBTl9TSUdOIiwiQVNDSUlfTEVGVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfVElMREUiLCJBU0NJSV9CQUNLU0xBU0giLCJBU0NJSV9QRVJDRU5UX1NJR04iLCJBU0NJSV9DT01NQSIsIkFTQ0lJX0NPTE9OIiwiaXNOdW1iZXIiLCJBU0NJSV9HUkVBVEVSX1RIQU5fU0lHTiIsIkFTQ0lJX0ZVTExfU1RPUCIsImNvbnRhaW5zQ2hhciIsInN0YXJ0ZWQiLCJsaXRlcmFsTGVuZ3RoIiwibGl0ZXJhbFBsdXMiLCJBU0NJSV9SSUdIVF9DVVJMWV9CUkFDS0VUIiwiQVNDSUlfTkwiLCJBU0NJSV9DUiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7a0JBc3lCZSxVQUFVQSxPQUFWLEVBQWlDO0FBQUEsTUFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUM5QyxNQUFJQyxTQUFTLElBQUlDLGNBQUosQ0FBbUJILE9BQW5CLEVBQTRCQyxPQUE1QixDQUFiO0FBQ0EsTUFBSUcsV0FBVyxFQUFmOztBQUVBQSxXQUFTQyxHQUFULEdBQWVILE9BQU9JLE1BQVAsRUFBZjtBQUNBSixTQUFPSyxRQUFQO0FBQ0FILFdBQVNJ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