aamp-openclaw-plugin 0.1.19 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/aamp-openclaw-plugin.mjs +174 -42
- package/dist/file-store.js +35 -9
- package/dist/file-store.js.map +3 -3
- package/dist/index.js +316 -14989
- package/dist/index.js.map +4 -4
- package/openclaw.plugin.json +1 -0
- package/package.json +4 -3
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../sdk/
|
|
4
|
-
"sourcesContent": ["'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n CLOSE_TIMEOUT: 30000,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n", "'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n", "'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n", "'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n\n //\n // The choice to employ `zlib.reset()` over `zlib.close()` is dictated by the\n // fact that in Node.js versions prior to 13.10.0, the callback for\n // `zlib.flush()` is not called if `zlib.close()` is used. Utilizing\n // `zlib.reset()` ensures that either the callback is invoked or an error is\n // emitted.\n //\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n\n if (this[kError]) {\n this[kCallback](this[kError]);\n return;\n }\n\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n", "'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n", "'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {(Buffer | String)[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n", "'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n", "'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n CLOSE_TIMEOUT,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._closeTimeout = options.closeTimeout;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to wait\n * for the closing handshake to finish after `websocket.close()` is called\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n closeTimeout: CLOSE_TIMEOUT,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n websocket._closeTimeout = opts.closeTimeout;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch (e) {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https:\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n websocket._closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written. If instead, the\n // socket is paused, any possible buffered data will be read as a single\n // chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n this._readableState.length !== 0\n ) {\n const chunk = this.read(this._readableState.length);\n\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^WebSocket$\" }] */\n'use strict';\n\nconst WebSocket = require('./websocket');\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n", "'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n", "/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { CLOSE_TIMEOUT, GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to\n * wait for the closing handshake to finish after `websocket.close()` is\n * called\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n closeTimeout: CLOSE_TIMEOUT,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 13 && version !== 8) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, {\n 'Sec-WebSocket-Version': '13, 8'\n });\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate(\n this.options.perMessageDeflate,\n true,\n this.options.maxPayload\n );\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @param {Object} [headers] The HTTP response headers\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(\n server,\n req,\n socket,\n code,\n message,\n headers\n) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message, headers);\n }\n}\n", "'use strict';\n\n// module to handle cookies\n\nconst urllib = require('url');\n\nconst SESSION_TIMEOUT = 1800; // 30 min\n\n/**\n * Creates a biskviit cookie jar for managing cookie values in memory\n *\n * @constructor\n * @param {Object} [options] Optional options object\n */\nclass Cookies {\n constructor(options) {\n this.options = options || {};\n this.cookies = [];\n }\n\n /**\n * Stores a cookie string to the cookie storage\n *\n * @param {String} cookieStr Value from the 'Set-Cookie:' header\n * @param {String} url Current URL\n */\n set(cookieStr, url) {\n let urlparts = urllib.parse(url || '');\n let cookie = this.parse(cookieStr);\n let domain;\n\n if (cookie.domain) {\n domain = cookie.domain.replace(/^\\./, '');\n\n // do not allow cross origin cookies\n if (\n // can't be valid if the requested domain is shorter than current hostname\n urlparts.hostname.length < domain.length ||\n // prefix domains with dot to be sure that partial matches are not used\n ('.' + urlparts.hostname).substr(-domain.length + 1) !== '.' + domain\n ) {\n cookie.domain = urlparts.hostname;\n }\n } else {\n cookie.domain = urlparts.hostname;\n }\n\n if (!cookie.path) {\n cookie.path = this.getPath(urlparts.pathname);\n }\n\n // if no expire date, then use sessionTimeout value\n if (!cookie.expires) {\n cookie.expires = new Date(Date.now() + (Number(this.options.sessionTimeout || SESSION_TIMEOUT) || SESSION_TIMEOUT) * 1000);\n }\n\n return this.add(cookie);\n }\n\n /**\n * Returns cookie string for the 'Cookie:' header.\n *\n * @param {String} url URL to check for\n * @returns {String} Cookie header or empty string if no matches were found\n */\n get(url) {\n return this.list(url)\n .map(cookie => cookie.name + '=' + cookie.value)\n .join('; ');\n }\n\n /**\n * Lists all valied cookie objects for the specified URL\n *\n * @param {String} url URL to check for\n * @returns {Array} An array of cookie objects\n */\n list(url) {\n let result = [];\n let i;\n let cookie;\n\n for (i = this.cookies.length - 1; i >= 0; i--) {\n cookie = this.cookies[i];\n\n if (this.isExpired(cookie)) {\n this.cookies.splice(i, i);\n continue;\n }\n\n if (this.match(cookie, url)) {\n result.unshift(cookie);\n }\n }\n\n return result;\n }\n\n /**\n * Parses cookie string from the 'Set-Cookie:' header\n *\n * @param {String} cookieStr String from the 'Set-Cookie:' header\n * @returns {Object} Cookie object\n */\n parse(cookieStr) {\n let cookie = {};\n\n (cookieStr || '')\n .toString()\n .split(';')\n .forEach(cookiePart => {\n let valueParts = cookiePart.split('=');\n let key = valueParts.shift().trim().toLowerCase();\n let value = valueParts.join('=').trim();\n let domain;\n\n if (!key) {\n // skip empty parts\n return;\n }\n\n switch (key) {\n case 'expires':\n value = new Date(value);\n // ignore date if can not parse it\n if (value.toString() !== 'Invalid Date') {\n cookie.expires = value;\n }\n break;\n\n case 'path':\n cookie.path = value;\n break;\n\n case 'domain':\n domain = value.toLowerCase();\n if (domain.length && domain.charAt(0) !== '.') {\n domain = '.' + domain; // ensure preceeding dot for user set domains\n }\n cookie.domain = domain;\n break;\n\n case 'max-age':\n cookie.expires = new Date(Date.now() + (Number(value) || 0) * 1000);\n break;\n\n case 'secure':\n cookie.secure = true;\n break;\n\n case 'httponly':\n cookie.httponly = true;\n break;\n\n default:\n if (!cookie.name) {\n cookie.name = key;\n cookie.value = value;\n }\n }\n });\n\n return cookie;\n }\n\n /**\n * Checks if a cookie object is valid for a specified URL\n *\n * @param {Object} cookie Cookie object\n * @param {String} url URL to check for\n * @returns {Boolean} true if cookie is valid for specifiec URL\n */\n match(cookie, url) {\n let urlparts = urllib.parse(url || '');\n\n // check if hostname matches\n // .foo.com also matches subdomains, foo.com does not\n if (\n urlparts.hostname !== cookie.domain &&\n (cookie.domain.charAt(0) !== '.' || ('.' + urlparts.hostname).substr(-cookie.domain.length) !== cookie.domain)\n ) {\n return false;\n }\n\n // check if path matches\n let path = this.getPath(urlparts.pathname);\n if (path.substr(0, cookie.path.length) !== cookie.path) {\n return false;\n }\n\n // check secure argument\n if (cookie.secure && urlparts.protocol !== 'https:') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Adds (or updates/removes if needed) a cookie object to the cookie storage\n *\n * @param {Object} cookie Cookie value to be stored\n */\n add(cookie) {\n let i;\n let len;\n\n // nothing to do here\n if (!cookie || !cookie.name) {\n return false;\n }\n\n // overwrite if has same params\n for (i = 0, len = this.cookies.length; i < len; i++) {\n if (this.compare(this.cookies[i], cookie)) {\n // check if the cookie needs to be removed instead\n if (this.isExpired(cookie)) {\n this.cookies.splice(i, 1); // remove expired/unset cookie\n return false;\n }\n\n this.cookies[i] = cookie;\n return true;\n }\n }\n\n // add as new if not already expired\n if (!this.isExpired(cookie)) {\n this.cookies.push(cookie);\n }\n\n return true;\n }\n\n /**\n * Checks if two cookie objects are the same\n *\n * @param {Object} a Cookie to check against\n * @param {Object} b Cookie to check against\n * @returns {Boolean} True, if the cookies are the same\n */\n compare(a, b) {\n return a.name === b.name && a.path === b.path && a.domain === b.domain && a.secure === b.secure && a.httponly === a.httponly;\n }\n\n /**\n * Checks if a cookie is expired\n *\n * @param {Object} cookie Cookie object to check against\n * @returns {Boolean} True, if the cookie is expired\n */\n isExpired(cookie) {\n return (cookie.expires && cookie.expires < new Date()) || !cookie.value;\n }\n\n /**\n * Returns normalized cookie path for an URL path argument\n *\n * @param {String} pathname\n * @returns {String} Normalized path\n */\n getPath(pathname) {\n let path = (pathname || '/').split('/');\n path.pop(); // remove filename part\n path = path.join('/').trim();\n\n // ensure path prefix /\n if (path.charAt(0) !== '/') {\n path = '/' + path;\n }\n\n // ensure path suffix /\n if (path.substr(-1) !== '/') {\n path += '/';\n }\n\n return path;\n }\n}\n\nmodule.exports = Cookies;\n", "{\n \"name\": \"nodemailer\",\n \"version\": \"6.10.1\",\n \"description\": \"Easy as cake e-mail sending from your Node.js applications\",\n \"main\": \"lib/nodemailer.js\",\n \"scripts\": {\n \"test\": \"node --test --test-concurrency=1 test/**/*.test.js test/**/*-test.js\",\n \"test:coverage\": \"c8 node --test --test-concurrency=1 test/**/*.test.js test/**/*-test.js\",\n \"lint\": \"eslint .\",\n \"update\": \"rm -rf node_modules/ package-lock.json && ncu -u && npm install\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nodemailer/nodemailer.git\"\n },\n \"keywords\": [\n \"Nodemailer\"\n ],\n \"author\": \"Andris Reinman\",\n \"license\": \"MIT-0\",\n \"bugs\": {\n \"url\": \"https://github.com/nodemailer/nodemailer/issues\"\n },\n \"homepage\": \"https://nodemailer.com/\",\n \"devDependencies\": {\n \"@aws-sdk/client-ses\": \"3.731.1\",\n \"bunyan\": \"1.8.15\",\n \"c8\": \"10.1.3\",\n \"eslint\": \"8.57.0\",\n \"eslint-config-nodemailer\": \"1.2.0\",\n \"eslint-config-prettier\": \"9.1.0\",\n \"libbase64\": \"1.3.0\",\n \"libmime\": \"5.3.6\",\n \"libqp\": \"2.1.1\",\n \"nodemailer-ntlm-auth\": \"1.0.4\",\n \"proxy\": \"1.0.2\",\n \"proxy-test-server\": \"1.0.0\",\n \"smtp-server\": \"3.13.6\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n}\n", "'use strict';\n\nconst http = require('http');\nconst https = require('https');\nconst urllib = require('url');\nconst zlib = require('zlib');\nconst PassThrough = require('stream').PassThrough;\nconst Cookies = require('./cookies');\nconst packageData = require('../../package.json');\nconst net = require('net');\n\nconst MAX_REDIRECTS = 5;\n\nmodule.exports = function (url, options) {\n return nmfetch(url, options);\n};\n\nmodule.exports.Cookies = Cookies;\n\nfunction nmfetch(url, options) {\n options = options || {};\n\n options.fetchRes = options.fetchRes || new PassThrough();\n options.cookies = options.cookies || new Cookies();\n options.redirects = options.redirects || 0;\n options.maxRedirects = isNaN(options.maxRedirects) ? MAX_REDIRECTS : options.maxRedirects;\n\n if (options.cookie) {\n [].concat(options.cookie || []).forEach(cookie => {\n options.cookies.set(cookie, url);\n });\n options.cookie = false;\n }\n\n let fetchRes = options.fetchRes;\n let parsed = urllib.parse(url);\n let method = (options.method || '').toString().trim().toUpperCase() || 'GET';\n let finished = false;\n let cookies;\n let body;\n\n let handler = parsed.protocol === 'https:' ? https : http;\n\n let headers = {\n 'accept-encoding': 'gzip,deflate',\n 'user-agent': 'nodemailer/' + packageData.version\n };\n\n Object.keys(options.headers || {}).forEach(key => {\n headers[key.toLowerCase().trim()] = options.headers[key];\n });\n\n if (options.userAgent) {\n headers['user-agent'] = options.userAgent;\n }\n\n if (parsed.auth) {\n headers.Authorization = 'Basic ' + Buffer.from(parsed.auth).toString('base64');\n }\n\n if ((cookies = options.cookies.get(url))) {\n headers.cookie = cookies;\n }\n\n if (options.body) {\n if (options.contentType !== false) {\n headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';\n }\n\n if (typeof options.body.pipe === 'function') {\n // it's a stream\n headers['Transfer-Encoding'] = 'chunked';\n body = options.body;\n body.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n } else {\n if (options.body instanceof Buffer) {\n body = options.body;\n } else if (typeof options.body === 'object') {\n try {\n // encodeURIComponent can fail on invalid input (partial emoji etc.)\n body = Buffer.from(\n Object.keys(options.body)\n .map(key => {\n let value = options.body[key].toString().trim();\n return encodeURIComponent(key) + '=' + encodeURIComponent(value);\n })\n .join('&')\n );\n } catch (E) {\n if (finished) {\n return;\n }\n finished = true;\n E.type = 'FETCH';\n E.sourceUrl = url;\n fetchRes.emit('error', E);\n return;\n }\n } else {\n body = Buffer.from(options.body.toString().trim());\n }\n\n headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';\n headers['Content-Length'] = body.length;\n }\n // if method is not provided, use POST instead of GET\n method = (options.method || '').toString().trim().toUpperCase() || 'POST';\n }\n\n let req;\n let reqOptions = {\n method,\n host: parsed.hostname,\n path: parsed.path,\n port: parsed.port ? parsed.port : parsed.protocol === 'https:' ? 443 : 80,\n headers,\n rejectUnauthorized: false,\n agent: false\n };\n\n if (options.tls) {\n Object.keys(options.tls).forEach(key => {\n reqOptions[key] = options.tls[key];\n });\n }\n\n if (parsed.protocol === 'https:' && parsed.hostname && parsed.hostname !== reqOptions.host && !net.isIP(parsed.hostname) && !reqOptions.servername) {\n reqOptions.servername = parsed.hostname;\n }\n\n try {\n req = handler.request(reqOptions);\n } catch (E) {\n finished = true;\n setImmediate(() => {\n E.type = 'FETCH';\n E.sourceUrl = url;\n fetchRes.emit('error', E);\n });\n return fetchRes;\n }\n\n if (options.timeout) {\n req.setTimeout(options.timeout, () => {\n if (finished) {\n return;\n }\n finished = true;\n req.abort();\n let err = new Error('Request Timeout');\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n }\n\n req.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n\n req.on('response', res => {\n let inflate;\n\n if (finished) {\n return;\n }\n\n switch (res.headers['content-encoding']) {\n case 'gzip':\n case 'deflate':\n inflate = zlib.createUnzip();\n break;\n }\n\n if (res.headers['set-cookie']) {\n [].concat(res.headers['set-cookie'] || []).forEach(cookie => {\n options.cookies.set(cookie, url);\n });\n }\n\n if ([301, 302, 303, 307, 308].includes(res.statusCode) && res.headers.location) {\n // redirect\n options.redirects++;\n if (options.redirects > options.maxRedirects) {\n finished = true;\n let err = new Error('Maximum redirect count exceeded');\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n return;\n }\n // redirect does not include POST body\n options.method = 'GET';\n options.body = false;\n return nmfetch(urllib.resolve(url, res.headers.location), options);\n }\n\n fetchRes.statusCode = res.statusCode;\n fetchRes.headers = res.headers;\n\n if (res.statusCode >= 300 && !options.allowErrorResponse) {\n finished = true;\n let err = new Error('Invalid status code ' + res.statusCode);\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n return;\n }\n\n res.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n });\n\n if (inflate) {\n res.pipe(inflate).pipe(fetchRes);\n inflate.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n });\n } else {\n res.pipe(fetchRes);\n }\n });\n\n setImmediate(() => {\n if (body) {\n try {\n if (typeof body.pipe === 'function') {\n return body.pipe(req);\n } else {\n req.write(body);\n }\n } catch (err) {\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n return;\n }\n }\n req.end();\n });\n\n return fetchRes;\n}\n", "/* eslint no-console: 0 */\n\n'use strict';\n\nconst urllib = require('url');\nconst util = require('util');\nconst fs = require('fs');\nconst nmfetch = require('../fetch');\nconst dns = require('dns');\nconst net = require('net');\nconst os = require('os');\n\nconst DNS_TTL = 5 * 60 * 1000;\n\nlet networkInterfaces;\ntry {\n networkInterfaces = os.networkInterfaces();\n} catch (err) {\n // fails on some systems\n}\n\nmodule.exports.networkInterfaces = networkInterfaces;\n\nconst isFamilySupported = (family, allowInternal) => {\n let networkInterfaces = module.exports.networkInterfaces;\n if (!networkInterfaces) {\n // hope for the best\n return true;\n }\n\n const familySupported =\n // crux that replaces Object.values(networkInterfaces) as Object.values is not supported in nodejs v6\n Object.keys(networkInterfaces)\n .map(key => networkInterfaces[key])\n // crux that replaces .flat() as it is not supported in older Node versions (v10 and older)\n .reduce((acc, val) => acc.concat(val), [])\n .filter(i => !i.internal || allowInternal)\n .filter(i => i.family === 'IPv' + family || i.family === family).length > 0;\n\n return familySupported;\n};\n\nconst resolver = (family, hostname, options, callback) => {\n options = options || {};\n const familySupported = isFamilySupported(family, options.allowInternalNetworkInterfaces);\n\n if (!familySupported) {\n return callback(null, []);\n }\n\n const resolver = dns.Resolver ? new dns.Resolver(options) : dns;\n resolver['resolve' + family](hostname, (err, addresses) => {\n if (err) {\n switch (err.code) {\n case dns.NODATA:\n case dns.NOTFOUND:\n case dns.NOTIMP:\n case dns.SERVFAIL:\n case dns.CONNREFUSED:\n case dns.REFUSED:\n case 'EAI_AGAIN':\n return callback(null, []);\n }\n return callback(err);\n }\n return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));\n });\n};\n\nconst dnsCache = (module.exports.dnsCache = new Map());\n\nconst formatDNSValue = (value, extra) => {\n if (!value) {\n return Object.assign({}, extra || {});\n }\n\n return Object.assign(\n {\n servername: value.servername,\n host:\n !value.addresses || !value.addresses.length\n ? null\n : value.addresses.length === 1\n ? value.addresses[0]\n : value.addresses[Math.floor(Math.random() * value.addresses.length)]\n },\n extra || {}\n );\n};\n\nmodule.exports.resolveHostname = (options, callback) => {\n options = options || {};\n\n if (!options.host && options.servername) {\n options.host = options.servername;\n }\n\n if (!options.host || net.isIP(options.host)) {\n // nothing to do here\n let value = {\n addresses: [options.host],\n servername: options.servername || false\n };\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n let cached;\n if (dnsCache.has(options.host)) {\n cached = dnsCache.get(options.host);\n\n if (!cached.expires || cached.expires >= Date.now()) {\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true\n })\n );\n }\n }\n\n resolver(4, options.host, options, (err, addresses) => {\n if (err) {\n if (cached) {\n // ignore error, use expired value\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n\n if (addresses && addresses.length) {\n let value = {\n addresses,\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n resolver(6, options.host, options, (err, addresses) => {\n if (err) {\n if (cached) {\n // ignore error, use expired value\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n\n if (addresses && addresses.length) {\n let value = {\n addresses,\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n try {\n dns.lookup(options.host, { all: true }, (err, addresses) => {\n if (err) {\n if (cached) {\n // ignore error, use expired value\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n\n let address = addresses\n ? addresses\n .filter(addr => isFamilySupported(addr.family))\n .map(addr => addr.address)\n .shift()\n : false;\n\n if (addresses && addresses.length && !address) {\n // there are addresses but none can be used\n console.warn(`Failed to resolve IPv${addresses[0].family} addresses with current network`);\n }\n\n if (!address && cached) {\n // nothing was found, fallback to cached value\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true\n })\n );\n }\n\n let value = {\n addresses: address ? [address] : [options.host],\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n });\n } catch (err) {\n if (cached) {\n // ignore error, use expired value\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n });\n });\n};\n/**\n * Parses connection url to a structured configuration object\n *\n * @param {String} str Connection url\n * @return {Object} Configuration object\n */\nmodule.exports.parseConnectionUrl = str => {\n str = str || '';\n let options = {};\n\n [urllib.parse(str, true)].forEach(url => {\n let auth;\n\n switch (url.protocol) {\n case 'smtp:':\n options.secure = false;\n break;\n case 'smtps:':\n options.secure = true;\n break;\n case 'direct:':\n options.direct = true;\n break;\n }\n\n if (!isNaN(url.port) && Number(url.port)) {\n options.port = Number(url.port);\n }\n\n if (url.hostname) {\n options.host = url.hostname;\n }\n\n if (url.auth) {\n auth = url.auth.split(':');\n\n if (!options.auth) {\n options.auth = {};\n }\n\n options.auth.user = auth.shift();\n options.auth.pass = auth.join(':');\n }\n\n Object.keys(url.query || {}).forEach(key => {\n let obj = options;\n let lKey = key;\n let value = url.query[key];\n\n if (!isNaN(value)) {\n value = Number(value);\n }\n\n switch (value) {\n case 'true':\n value = true;\n break;\n case 'false':\n value = false;\n break;\n }\n\n // tls is nested object\n if (key.indexOf('tls.') === 0) {\n lKey = key.substr(4);\n if (!options.tls) {\n options.tls = {};\n }\n obj = options.tls;\n } else if (key.indexOf('.') >= 0) {\n // ignore nested properties besides tls\n return;\n }\n\n if (!(lKey in obj)) {\n obj[lKey] = value;\n }\n });\n });\n\n return options;\n};\n\nmodule.exports._logFunc = (logger, level, defaults, data, message, ...args) => {\n let entry = {};\n\n Object.keys(defaults || {}).forEach(key => {\n if (key !== 'level') {\n entry[key] = defaults[key];\n }\n });\n\n Object.keys(data || {}).forEach(key => {\n if (key !== 'level') {\n entry[key] = data[key];\n }\n });\n\n logger[level](entry, message, ...args);\n};\n\n/**\n * Returns a bunyan-compatible logger interface. Uses either provided logger or\n * creates a default console logger\n *\n * @param {Object} [options] Options object that might include 'logger' value\n * @return {Object} bunyan compatible logger\n */\nmodule.exports.getLogger = (options, defaults) => {\n options = options || {};\n\n let response = {};\n let levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\n\n if (!options.logger) {\n // use vanity logger\n levels.forEach(level => {\n response[level] = () => false;\n });\n return response;\n }\n\n let logger = options.logger;\n\n if (options.logger === true) {\n // create console logger\n logger = createDefaultLogger(levels);\n }\n\n levels.forEach(level => {\n response[level] = (data, message, ...args) => {\n module.exports._logFunc(logger, level, defaults, data, message, ...args);\n };\n });\n\n return response;\n};\n\n/**\n * Wrapper for creating a callback that either resolves or rejects a promise\n * based on input\n *\n * @param {Function} resolve Function to run if callback is called\n * @param {Function} reject Function to run if callback ends with an error\n */\nmodule.exports.callbackPromise = (resolve, reject) =>\n function () {\n let args = Array.from(arguments);\n let err = args.shift();\n if (err) {\n reject(err);\n } else {\n resolve(...args);\n }\n };\n\nmodule.exports.parseDataURI = uri => {\n let input = uri;\n let commaPos = input.indexOf(',');\n if (!commaPos) {\n return uri;\n }\n\n let data = input.substring(commaPos + 1);\n let metaStr = input.substring('data:'.length, commaPos);\n\n let encoding;\n\n let metaEntries = metaStr.split(';');\n let lastMetaEntry = metaEntries.length > 1 ? metaEntries[metaEntries.length - 1] : false;\n if (lastMetaEntry && lastMetaEntry.indexOf('=') < 0) {\n encoding = lastMetaEntry.toLowerCase();\n metaEntries.pop();\n }\n\n let contentType = metaEntries.shift() || 'application/octet-stream';\n let params = {};\n for (let entry of metaEntries) {\n let sep = entry.indexOf('=');\n if (sep >= 0) {\n let key = entry.substring(0, sep);\n let value = entry.substring(sep + 1);\n params[key] = value;\n }\n }\n\n switch (encoding) {\n case 'base64':\n data = Buffer.from(data, 'base64');\n break;\n case 'utf8':\n data = Buffer.from(data);\n break;\n default:\n try {\n data = Buffer.from(decodeURIComponent(data));\n } catch (err) {\n data = Buffer.from(data);\n }\n data = Buffer.from(data);\n }\n\n return { data, encoding, contentType, params };\n};\n\n/**\n * Resolves a String or a Buffer value for content value. Useful if the value\n * is a Stream or a file or an URL. If the value is a Stream, overwrites\n * the stream object with the resolved value (you can't stream a value twice).\n *\n * This is useful when you want to create a plugin that needs a content value,\n * for example the `html` or `text` value as a String or a Buffer but not as\n * a file path or an URL.\n *\n * @param {Object} data An object or an Array you want to resolve an element for\n * @param {String|Number} key Property name or an Array index\n * @param {Function} callback Callback function with (err, value)\n */\nmodule.exports.resolveContent = (data, key, callback) => {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = module.exports.callbackPromise(resolve, reject);\n });\n }\n\n let content = (data && data[key] && data[key].content) || data[key];\n let contentStream;\n let encoding = ((typeof data[key] === 'object' && data[key].encoding) || 'utf8')\n .toString()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n\n if (!content) {\n return callback(null, content);\n }\n\n if (typeof content === 'object') {\n if (typeof content.pipe === 'function') {\n return resolveStream(content, (err, value) => {\n if (err) {\n return callback(err);\n }\n // we can't stream twice the same content, so we need\n // to replace the stream object with the streaming result\n if (data[key].content) {\n data[key].content = value;\n } else {\n data[key] = value;\n }\n callback(null, value);\n });\n } else if (/^https?:\\/\\//i.test(content.path || content.href)) {\n contentStream = nmfetch(content.path || content.href);\n return resolveStream(contentStream, callback);\n } else if (/^data:/i.test(content.path || content.href)) {\n let parsedDataUri = module.exports.parseDataURI(content.path || content.href);\n\n if (!parsedDataUri || !parsedDataUri.data) {\n return callback(null, Buffer.from(0));\n }\n return callback(null, parsedDataUri.data);\n } else if (content.path) {\n return resolveStream(fs.createReadStream(content.path), callback);\n }\n }\n\n if (typeof data[key].content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {\n content = Buffer.from(data[key].content, encoding);\n }\n\n // default action, return as is\n setImmediate(() => callback(null, content));\n\n return promise;\n};\n\n/**\n * Copies properties from source objects to target objects\n */\nmodule.exports.assign = function (/* target, ... sources */) {\n let args = Array.from(arguments);\n let target = args.shift() || {};\n\n args.forEach(source => {\n Object.keys(source || {}).forEach(key => {\n if (['tls', 'auth'].includes(key) && source[key] && typeof source[key] === 'object') {\n // tls and auth are special keys that need to be enumerated separately\n // other objects are passed as is\n if (!target[key]) {\n // ensure that target has this key\n target[key] = {};\n }\n Object.keys(source[key]).forEach(subKey => {\n target[key][subKey] = source[key][subKey];\n });\n } else {\n target[key] = source[key];\n }\n });\n });\n return target;\n};\n\nmodule.exports.encodeXText = str => {\n // ! 0x21\n // + 0x2B\n // = 0x3D\n // ~ 0x7E\n if (!/[^\\x21-\\x2A\\x2C-\\x3C\\x3E-\\x7E]/.test(str)) {\n return str;\n }\n let buf = Buffer.from(str);\n let result = '';\n for (let i = 0, len = buf.length; i < len; i++) {\n let c = buf[i];\n if (c < 0x21 || c > 0x7e || c === 0x2b || c === 0x3d) {\n result += '+' + (c < 0x10 ? '0' : '') + c.toString(16).toUpperCase();\n } else {\n result += String.fromCharCode(c);\n }\n }\n return result;\n};\n\n/**\n * Streams a stream value into a Buffer\n *\n * @param {Object} stream Readable stream\n * @param {Function} callback Callback function with (err, value)\n */\nfunction resolveStream(stream, callback) {\n let responded = false;\n let chunks = [];\n let chunklen = 0;\n\n stream.on('error', err => {\n if (responded) {\n return;\n }\n\n responded = true;\n callback(err);\n });\n\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n stream.on('end', () => {\n if (responded) {\n return;\n }\n responded = true;\n\n let value;\n\n try {\n value = Buffer.concat(chunks, chunklen);\n } catch (E) {\n return callback(E);\n }\n callback(null, value);\n });\n}\n\n/**\n * Generates a bunyan-like logger that prints to console\n *\n * @returns {Object} Bunyan logger instance\n */\nfunction createDefaultLogger(levels) {\n let levelMaxLen = 0;\n let levelNames = new Map();\n levels.forEach(level => {\n if (level.length > levelMaxLen) {\n levelMaxLen = level.length;\n }\n });\n\n levels.forEach(level => {\n let levelName = level.toUpperCase();\n if (levelName.length < levelMaxLen) {\n levelName += ' '.repeat(levelMaxLen - levelName.length);\n }\n levelNames.set(level, levelName);\n });\n\n let print = (level, entry, message, ...args) => {\n let prefix = '';\n if (entry) {\n if (entry.tnx === 'server') {\n prefix = 'S: ';\n } else if (entry.tnx === 'client') {\n prefix = 'C: ';\n }\n\n if (entry.sid) {\n prefix = '[' + entry.sid + '] ' + prefix;\n }\n\n if (entry.cid) {\n prefix = '[#' + entry.cid + '] ' + prefix;\n }\n }\n\n message = util.format(message, ...args);\n message.split(/\\r?\\n/).forEach(line => {\n console.log('[%s] %s %s', new Date().toISOString().substr(0, 19).replace(/T/, ' '), levelNames.get(level), prefix + line);\n });\n };\n\n let logger = {};\n levels.forEach(level => {\n logger[level] = print.bind(null, level);\n });\n\n return logger;\n}\n", "/* eslint quote-props: 0 */\n\n'use strict';\n\nconst path = require('path');\n\nconst defaultMimeType = 'application/octet-stream';\nconst defaultExtension = 'bin';\n\nconst mimeTypes = new Map([\n ['application/acad', 'dwg'],\n ['application/applixware', 'aw'],\n ['application/arj', 'arj'],\n ['application/atom+xml', 'xml'],\n ['application/atomcat+xml', 'atomcat'],\n ['application/atomsvc+xml', 'atomsvc'],\n ['application/base64', ['mm', 'mme']],\n ['application/binhex', 'hqx'],\n ['application/binhex4', 'hqx'],\n ['application/book', ['book', 'boo']],\n ['application/ccxml+xml,', 'ccxml'],\n ['application/cdf', 'cdf'],\n ['application/cdmi-capability', 'cdmia'],\n ['application/cdmi-container', 'cdmic'],\n ['application/cdmi-domain', 'cdmid'],\n ['application/cdmi-object', 'cdmio'],\n ['application/cdmi-queue', 'cdmiq'],\n ['application/clariscad', 'ccad'],\n ['application/commonground', 'dp'],\n ['application/cu-seeme', 'cu'],\n ['application/davmount+xml', 'davmount'],\n ['application/drafting', 'drw'],\n ['application/dsptype', 'tsp'],\n ['application/dssc+der', 'dssc'],\n ['application/dssc+xml', 'xdssc'],\n ['application/dxf', 'dxf'],\n ['application/ecmascript', ['js', 'es']],\n ['application/emma+xml', 'emma'],\n ['application/envoy', 'evy'],\n ['application/epub+zip', 'epub'],\n ['application/excel', ['xls', 'xl', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],\n ['application/exi', 'exi'],\n ['application/font-tdpfr', 'pfr'],\n ['application/fractals', 'fif'],\n ['application/freeloader', 'frl'],\n ['application/futuresplash', 'spl'],\n ['application/geo+json', 'geojson'],\n ['application/gnutar', 'tgz'],\n ['application/groupwise', 'vew'],\n ['application/hlp', 'hlp'],\n ['application/hta', 'hta'],\n ['application/hyperstudio', 'stk'],\n ['application/i-deas', 'unv'],\n ['application/iges', ['iges', 'igs']],\n ['application/inf', 'inf'],\n ['application/internet-property-stream', 'acx'],\n ['application/ipfix', 'ipfix'],\n ['application/java', 'class'],\n ['application/java-archive', 'jar'],\n ['application/java-byte-code', 'class'],\n ['application/java-serialized-object', 'ser'],\n ['application/java-vm', 'class'],\n ['application/javascript', 'js'],\n ['application/json', 'json'],\n ['application/lha', 'lha'],\n ['application/lzx', 'lzx'],\n ['application/mac-binary', 'bin'],\n ['application/mac-binhex', 'hqx'],\n ['application/mac-binhex40', 'hqx'],\n ['application/mac-compactpro', 'cpt'],\n ['application/macbinary', 'bin'],\n ['application/mads+xml', 'mads'],\n ['application/marc', 'mrc'],\n ['application/marcxml+xml', 'mrcx'],\n ['application/mathematica', 'ma'],\n ['application/mathml+xml', 'mathml'],\n ['application/mbedlet', 'mbd'],\n ['application/mbox', 'mbox'],\n ['application/mcad', 'mcd'],\n ['application/mediaservercontrol+xml', 'mscml'],\n ['application/metalink4+xml', 'meta4'],\n ['application/mets+xml', 'mets'],\n ['application/mime', 'aps'],\n ['application/mods+xml', 'mods'],\n ['application/mp21', 'm21'],\n ['application/mp4', 'mp4'],\n ['application/mspowerpoint', ['ppt', 'pot', 'pps', 'ppz']],\n ['application/msword', ['doc', 'dot', 'w6w', 'wiz', 'word']],\n ['application/mswrite', 'wri'],\n ['application/mxf', 'mxf'],\n ['application/netmc', 'mcp'],\n ['application/octet-stream', ['*']],\n ['application/oda', 'oda'],\n ['application/oebps-package+xml', 'opf'],\n ['application/ogg', 'ogx'],\n ['application/olescript', 'axs'],\n ['application/onenote', 'onetoc'],\n ['application/patch-ops-error+xml', 'xer'],\n ['application/pdf', 'pdf'],\n ['application/pgp-encrypted', 'asc'],\n ['application/pgp-signature', 'pgp'],\n ['application/pics-rules', 'prf'],\n ['application/pkcs-12', 'p12'],\n ['application/pkcs-crl', 'crl'],\n ['application/pkcs10', 'p10'],\n ['application/pkcs7-mime', ['p7c', 'p7m']],\n ['application/pkcs7-signature', 'p7s'],\n ['application/pkcs8', 'p8'],\n ['application/pkix-attr-cert', 'ac'],\n ['application/pkix-cert', ['cer', 'crt']],\n ['application/pkix-crl', 'crl'],\n ['application/pkix-pkipath', 'pkipath'],\n ['application/pkixcmp', 'pki'],\n ['application/plain', 'text'],\n ['application/pls+xml', 'pls'],\n ['application/postscript', ['ps', 'ai', 'eps']],\n ['application/powerpoint', 'ppt'],\n ['application/pro_eng', ['part', 'prt']],\n ['application/prs.cww', 'cww'],\n ['application/pskc+xml', 'pskcxml'],\n ['application/rdf+xml', 'rdf'],\n ['application/reginfo+xml', 'rif'],\n ['application/relax-ng-compact-syntax', 'rnc'],\n ['application/resource-lists+xml', 'rl'],\n ['application/resource-lists-diff+xml', 'rld'],\n ['application/ringing-tones', 'rng'],\n ['application/rls-services+xml', 'rs'],\n ['application/rsd+xml', 'rsd'],\n ['application/rss+xml', 'xml'],\n ['application/rtf', ['rtf', 'rtx']],\n ['application/sbml+xml', 'sbml'],\n ['application/scvp-cv-request', 'scq'],\n ['application/scvp-cv-response', 'scs'],\n ['application/scvp-vp-request', 'spq'],\n ['application/scvp-vp-response', 'spp'],\n ['application/sdp', 'sdp'],\n ['application/sea', 'sea'],\n ['application/set', 'set'],\n ['application/set-payment-initiation', 'setpay'],\n ['application/set-registration-initiation', 'setreg'],\n ['application/shf+xml', 'shf'],\n ['application/sla', 'stl'],\n ['application/smil', ['smi', 'smil']],\n ['application/smil+xml', 'smi'],\n ['application/solids', 'sol'],\n ['application/sounder', 'sdr'],\n ['application/sparql-query', 'rq'],\n ['application/sparql-results+xml', 'srx'],\n ['application/srgs', 'gram'],\n ['application/srgs+xml', 'grxml'],\n ['application/sru+xml', 'sru'],\n ['application/ssml+xml', 'ssml'],\n ['application/step', ['step', 'stp']],\n ['application/streamingmedia', 'ssm'],\n ['application/tei+xml', 'tei'],\n ['application/thraud+xml', 'tfi'],\n ['application/timestamped-data', 'tsd'],\n ['application/toolbook', 'tbk'],\n ['application/vda', 'vda'],\n ['application/vnd.3gpp.pic-bw-large', 'plb'],\n ['application/vnd.3gpp.pic-bw-small', 'psb'],\n ['application/vnd.3gpp.pic-bw-var', 'pvb'],\n ['application/vnd.3gpp2.tcap', 'tcap'],\n ['application/vnd.3m.post-it-notes', 'pwn'],\n ['application/vnd.accpac.simply.aso', 'aso'],\n ['application/vnd.accpac.simply.imp', 'imp'],\n ['application/vnd.acucobol', 'acu'],\n ['application/vnd.acucorp', 'atc'],\n ['application/vnd.adobe.air-application-installer-package+zip', 'air'],\n ['application/vnd.adobe.fxp', 'fxp'],\n ['application/vnd.adobe.xdp+xml', 'xdp'],\n ['application/vnd.adobe.xfdf', 'xfdf'],\n ['application/vnd.ahead.space', 'ahead'],\n ['application/vnd.airzip.filesecure.azf', 'azf'],\n ['application/vnd.airzip.filesecure.azs', 'azs'],\n ['application/vnd.amazon.ebook', 'azw'],\n ['application/vnd.americandynamics.acc', 'acc'],\n ['application/vnd.amiga.ami', 'ami'],\n ['application/vnd.android.package-archive', 'apk'],\n ['application/vnd.anser-web-certificate-issue-initiation', 'cii'],\n ['application/vnd.anser-web-funds-transfer-initiation', 'fti'],\n ['application/vnd.antix.game-component', 'atx'],\n ['application/vnd.apple.installer+xml', 'mpkg'],\n ['application/vnd.apple.mpegurl', 'm3u8'],\n ['application/vnd.aristanetworks.swi', 'swi'],\n ['application/vnd.audiograph', 'aep'],\n ['application/vnd.blueice.multipass', 'mpm'],\n ['application/vnd.bmi', 'bmi'],\n ['application/vnd.businessobjects', 'rep'],\n ['application/vnd.chemdraw+xml', 'cdxml'],\n ['application/vnd.chipnuts.karaoke-mmd', 'mmd'],\n ['application/vnd.cinderella', 'cdy'],\n ['application/vnd.claymore', 'cla'],\n ['application/vnd.cloanto.rp9', 'rp9'],\n ['application/vnd.clonk.c4group', 'c4g'],\n ['application/vnd.cluetrust.cartomobile-config', 'c11amc'],\n ['application/vnd.cluetrust.cartomobile-config-pkg', 'c11amz'],\n ['application/vnd.commonspace', 'csp'],\n ['application/vnd.contact.cmsg', 'cdbcmsg'],\n ['application/vnd.cosmocaller', 'cmc'],\n ['application/vnd.crick.clicker', 'clkx'],\n ['application/vnd.crick.clicker.keyboard', 'clkk'],\n ['application/vnd.crick.clicker.palette', 'clkp'],\n ['application/vnd.crick.clicker.template', 'clkt'],\n ['application/vnd.crick.clicker.wordbank', 'clkw'],\n ['application/vnd.criticaltools.wbs+xml', 'wbs'],\n ['application/vnd.ctc-posml', 'pml'],\n ['application/vnd.cups-ppd', 'ppd'],\n ['application/vnd.curl.car', 'car'],\n ['application/vnd.curl.pcurl', 'pcurl'],\n ['application/vnd.data-vision.rdz', 'rdz'],\n ['application/vnd.denovo.fcselayout-link', 'fe_launch'],\n ['application/vnd.dna', 'dna'],\n ['application/vnd.dolby.mlp', 'mlp'],\n ['application/vnd.dpgraph', 'dpg'],\n ['application/vnd.dreamfactory', 'dfac'],\n ['application/vnd.dvb.ait', 'ait'],\n ['application/vnd.dvb.service', 'svc'],\n ['application/vnd.dynageo', 'geo'],\n ['application/vnd.ecowin.chart', 'mag'],\n ['application/vnd.enliven', 'nml'],\n ['application/vnd.epson.esf', 'esf'],\n ['application/vnd.epson.msf', 'msf'],\n ['application/vnd.epson.quickanime', 'qam'],\n ['application/vnd.epson.salt', 'slt'],\n ['application/vnd.epson.ssf', 'ssf'],\n ['application/vnd.eszigno3+xml', 'es3'],\n ['application/vnd.ezpix-album', 'ez2'],\n ['application/vnd.ezpix-package', 'ez3'],\n ['application/vnd.fdf', 'fdf'],\n ['application/vnd.fdsn.seed', 'seed'],\n ['application/vnd.flographit', 'gph'],\n ['application/vnd.fluxtime.clip', 'ftc'],\n ['application/vnd.framemaker', 'fm'],\n ['application/vnd.frogans.fnc', 'fnc'],\n ['application/vnd.frogans.ltf', 'ltf'],\n ['application/vnd.fsc.weblaunch', 'fsc'],\n ['application/vnd.fujitsu.oasys', 'oas'],\n ['application/vnd.fujitsu.oasys2', 'oa2'],\n ['application/vnd.fujitsu.oasys3', 'oa3'],\n ['application/vnd.fujitsu.oasysgp', 'fg5'],\n ['application/vnd.fujitsu.oasysprs', 'bh2'],\n ['application/vnd.fujixerox.ddd', 'ddd'],\n ['application/vnd.fujixerox.docuworks', 'xdw'],\n ['application/vnd.fujixerox.docuworks.binder', 'xbd'],\n ['application/vnd.fuzzysheet', 'fzs'],\n ['application/vnd.genomatix.tuxedo', 'txd'],\n ['application/vnd.geogebra.file', 'ggb'],\n ['application/vnd.geogebra.tool', 'ggt'],\n ['application/vnd.geometry-explorer', 'gex'],\n ['application/vnd.geonext', 'gxt'],\n ['application/vnd.geoplan', 'g2w'],\n ['application/vnd.geospace', 'g3w'],\n ['application/vnd.gmx', 'gmx'],\n ['application/vnd.google-earth.kml+xml', 'kml'],\n ['application/vnd.google-earth.kmz', 'kmz'],\n ['application/vnd.grafeq', 'gqf'],\n ['application/vnd.groove-account', 'gac'],\n ['application/vnd.groove-help', 'ghf'],\n ['application/vnd.groove-identity-message', 'gim'],\n ['application/vnd.groove-injector', 'grv'],\n ['application/vnd.groove-tool-message', 'gtm'],\n ['application/vnd.groove-tool-template', 'tpl'],\n ['application/vnd.groove-vcard', 'vcg'],\n ['application/vnd.hal+xml', 'hal'],\n ['application/vnd.handheld-entertainment+xml', 'zmm'],\n ['application/vnd.hbci', 'hbci'],\n ['application/vnd.hhe.lesson-player', 'les'],\n ['application/vnd.hp-hpgl', ['hgl', 'hpg', 'hpgl']],\n ['application/vnd.hp-hpid', 'hpid'],\n ['application/vnd.hp-hps', 'hps'],\n ['application/vnd.hp-jlyt', 'jlt'],\n ['application/vnd.hp-pcl', 'pcl'],\n ['application/vnd.hp-pclxl', 'pclxl'],\n ['application/vnd.hydrostatix.sof-data', 'sfd-hdstx'],\n ['application/vnd.hzn-3d-crossword', 'x3d'],\n ['application/vnd.ibm.minipay', 'mpy'],\n ['application/vnd.ibm.modcap', 'afp'],\n ['application/vnd.ibm.rights-management', 'irm'],\n ['application/vnd.ibm.secure-container', 'sc'],\n ['application/vnd.iccprofile', 'icc'],\n ['application/vnd.igloader', 'igl'],\n ['application/vnd.immervision-ivp', 'ivp'],\n ['application/vnd.immervision-ivu', 'ivu'],\n ['application/vnd.insors.igm', 'igm'],\n ['application/vnd.intercon.formnet', 'xpw'],\n ['application/vnd.intergeo', 'i2g'],\n ['application/vnd.intu.qbo', 'qbo'],\n ['application/vnd.intu.qfx', 'qfx'],\n ['application/vnd.ipunplugged.rcprofile', 'rcprofile'],\n ['application/vnd.irepository.package+xml', 'irp'],\n ['application/vnd.is-xpr', 'xpr'],\n ['application/vnd.isac.fcs', 'fcs'],\n ['application/vnd.jam', 'jam'],\n ['application/vnd.jcp.javame.midlet-rms', 'rms'],\n ['application/vnd.jisp', 'jisp'],\n ['application/vnd.joost.joda-archive', 'joda'],\n ['application/vnd.kahootz', 'ktz'],\n ['application/vnd.kde.karbon', 'karbon'],\n ['application/vnd.kde.kchart', 'chrt'],\n ['application/vnd.kde.kformula', 'kfo'],\n ['application/vnd.kde.kivio', 'flw'],\n ['application/vnd.kde.kontour', 'kon'],\n ['application/vnd.kde.kpresenter', 'kpr'],\n ['application/vnd.kde.kspread', 'ksp'],\n ['application/vnd.kde.kword', 'kwd'],\n ['application/vnd.kenameaapp', 'htke'],\n ['application/vnd.kidspiration', 'kia'],\n ['application/vnd.kinar', 'kne'],\n ['application/vnd.koan', 'skp'],\n ['application/vnd.kodak-descriptor', 'sse'],\n ['application/vnd.las.las+xml', 'lasxml'],\n ['application/vnd.llamagraphics.life-balance.desktop', 'lbd'],\n ['application/vnd.llamagraphics.life-balance.exchange+xml', 'lbe'],\n ['application/vnd.lotus-1-2-3', '123'],\n ['application/vnd.lotus-approach', 'apr'],\n ['application/vnd.lotus-freelance', 'pre'],\n ['application/vnd.lotus-notes', 'nsf'],\n ['application/vnd.lotus-organizer', 'org'],\n ['application/vnd.lotus-screencam', 'scm'],\n ['application/vnd.lotus-wordpro', 'lwp'],\n ['application/vnd.macports.portpkg', 'portpkg'],\n ['application/vnd.mcd', 'mcd'],\n ['application/vnd.medcalcdata', 'mc1'],\n ['application/vnd.mediastation.cdkey', 'cdkey'],\n ['application/vnd.mfer', 'mwf'],\n ['application/vnd.mfmp', 'mfm'],\n ['application/vnd.micrografx.flo', 'flo'],\n ['application/vnd.micrografx.igx', 'igx'],\n ['application/vnd.mif', 'mif'],\n ['application/vnd.mobius.daf', 'daf'],\n ['application/vnd.mobius.dis', 'dis'],\n ['application/vnd.mobius.mbk', 'mbk'],\n ['application/vnd.mobius.mqy', 'mqy'],\n ['application/vnd.mobius.msl', 'msl'],\n ['application/vnd.mobius.plc', 'plc'],\n ['application/vnd.mobius.txf', 'txf'],\n ['application/vnd.mophun.application', 'mpn'],\n ['application/vnd.mophun.certificate', 'mpc'],\n ['application/vnd.mozilla.xul+xml', 'xul'],\n ['application/vnd.ms-artgalry', 'cil'],\n ['application/vnd.ms-cab-compressed', 'cab'],\n ['application/vnd.ms-excel', ['xls', 'xla', 'xlc', 'xlm', 'xlt', 'xlw', 'xlb', 'xll']],\n ['application/vnd.ms-excel.addin.macroenabled.12', 'xlam'],\n ['application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsb'],\n ['application/vnd.ms-excel.sheet.macroenabled.12', 'xlsm'],\n ['application/vnd.ms-excel.template.macroenabled.12', 'xltm'],\n ['application/vnd.ms-fontobject', 'eot'],\n ['application/vnd.ms-htmlhelp', 'chm'],\n ['application/vnd.ms-ims', 'ims'],\n ['application/vnd.ms-lrm', 'lrm'],\n ['application/vnd.ms-officetheme', 'thmx'],\n ['application/vnd.ms-outlook', 'msg'],\n ['application/vnd.ms-pki.certstore', 'sst'],\n ['application/vnd.ms-pki.pko', 'pko'],\n ['application/vnd.ms-pki.seccat', 'cat'],\n ['application/vnd.ms-pki.stl', 'stl'],\n ['application/vnd.ms-pkicertstore', 'sst'],\n ['application/vnd.ms-pkiseccat', 'cat'],\n ['application/vnd.ms-pkistl', 'stl'],\n ['application/vnd.ms-powerpoint', ['ppt', 'pot', 'pps', 'ppa', 'pwz']],\n ['application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppam'],\n ['application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptm'],\n ['application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldm'],\n ['application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsm'],\n ['application/vnd.ms-powerpoint.template.macroenabled.12', 'potm'],\n ['application/vnd.ms-project', 'mpp'],\n ['application/vnd.ms-word.document.macroenabled.12', 'docm'],\n ['application/vnd.ms-word.template.macroenabled.12', 'dotm'],\n ['application/vnd.ms-works', ['wks', 'wcm', 'wdb', 'wps']],\n ['application/vnd.ms-wpl', 'wpl'],\n ['application/vnd.ms-xpsdocument', 'xps'],\n ['application/vnd.mseq', 'mseq'],\n ['application/vnd.musician', 'mus'],\n ['application/vnd.muvee.style', 'msty'],\n ['application/vnd.neurolanguage.nlu', 'nlu'],\n ['application/vnd.noblenet-directory', 'nnd'],\n ['application/vnd.noblenet-sealer', 'nns'],\n ['application/vnd.noblenet-web', 'nnw'],\n ['application/vnd.nokia.configuration-message', 'ncm'],\n ['application/vnd.nokia.n-gage.data', 'ngdat'],\n ['application/vnd.nokia.n-gage.symbian.install', 'n-gage'],\n ['application/vnd.nokia.radio-preset', 'rpst'],\n ['application/vnd.nokia.radio-presets', 'rpss'],\n ['application/vnd.nokia.ringing-tone', 'rng'],\n ['application/vnd.novadigm.edm', 'edm'],\n ['application/vnd.novadigm.edx', 'edx'],\n ['application/vnd.novadigm.ext', 'ext'],\n ['application/vnd.oasis.opendocument.chart', 'odc'],\n ['application/vnd.oasis.opendocument.chart-template', 'otc'],\n ['application/vnd.oasis.opendocument.database', 'odb'],\n ['application/vnd.oasis.opendocument.formula', 'odf'],\n ['application/vnd.oasis.opendocument.formula-template', 'odft'],\n ['application/vnd.oasis.opendocument.graphics', 'odg'],\n ['application/vnd.oasis.opendocument.graphics-template', 'otg'],\n ['application/vnd.oasis.opendocument.image', 'odi'],\n ['application/vnd.oasis.opendocument.image-template', 'oti'],\n ['application/vnd.oasis.opendocument.presentation', 'odp'],\n ['application/vnd.oasis.opendocument.presentation-template', 'otp'],\n ['application/vnd.oasis.opendocument.spreadsheet', 'ods'],\n ['application/vnd.oasis.opendocument.spreadsheet-template', 'ots'],\n ['application/vnd.oasis.opendocument.text', 'odt'],\n ['application/vnd.oasis.opendocument.text-master', 'odm'],\n ['application/vnd.oasis.opendocument.text-template', 'ott'],\n ['application/vnd.oasis.opendocument.text-web', 'oth'],\n ['application/vnd.olpc-sugar', 'xo'],\n ['application/vnd.oma.dd2+xml', 'dd2'],\n ['application/vnd.openofficeorg.extension', 'oxt'],\n ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pptx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.slide', 'sldx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppsx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.template', 'potx'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlsx'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xltx'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'docx'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dotx'],\n ['application/vnd.osgeo.mapguide.package', 'mgp'],\n ['application/vnd.osgi.dp', 'dp'],\n ['application/vnd.palm', 'pdb'],\n ['application/vnd.pawaafile', 'paw'],\n ['application/vnd.pg.format', 'str'],\n ['application/vnd.pg.osasli', 'ei6'],\n ['application/vnd.picsel', 'efif'],\n ['application/vnd.pmi.widget', 'wg'],\n ['application/vnd.pocketlearn', 'plf'],\n ['application/vnd.powerbuilder6', 'pbd'],\n ['application/vnd.previewsystems.box', 'box'],\n ['application/vnd.proteus.magazine', 'mgz'],\n ['application/vnd.publishare-delta-tree', 'qps'],\n ['application/vnd.pvi.ptid1', 'ptid'],\n ['application/vnd.quark.quarkxpress', 'qxd'],\n ['application/vnd.realvnc.bed', 'bed'],\n ['application/vnd.recordare.musicxml', 'mxl'],\n ['application/vnd.recordare.musicxml+xml', 'musicxml'],\n ['application/vnd.rig.cryptonote', 'cryptonote'],\n ['application/vnd.rim.cod', 'cod'],\n ['application/vnd.rn-realmedia', 'rm'],\n ['application/vnd.rn-realplayer', 'rnx'],\n ['application/vnd.route66.link66+xml', 'link66'],\n ['application/vnd.sailingtracker.track', 'st'],\n ['application/vnd.seemail', 'see'],\n ['application/vnd.sema', 'sema'],\n ['application/vnd.semd', 'semd'],\n ['application/vnd.semf', 'semf'],\n ['application/vnd.shana.informed.formdata', 'ifm'],\n ['application/vnd.shana.informed.formtemplate', 'itp'],\n ['application/vnd.shana.informed.interchange', 'iif'],\n ['application/vnd.shana.informed.package', 'ipk'],\n ['application/vnd.simtech-mindmapper', 'twd'],\n ['application/vnd.smaf', 'mmf'],\n ['application/vnd.smart.teacher', 'teacher'],\n ['application/vnd.solent.sdkm+xml', 'sdkm'],\n ['application/vnd.spotfire.dxp', 'dxp'],\n ['application/vnd.spotfire.sfs', 'sfs'],\n ['application/vnd.stardivision.calc', 'sdc'],\n ['application/vnd.stardivision.draw', 'sda'],\n ['application/vnd.stardivision.impress', 'sdd'],\n ['application/vnd.stardivision.math', 'smf'],\n ['application/vnd.stardivision.writer', 'sdw'],\n ['application/vnd.stardivision.writer-global', 'sgl'],\n ['application/vnd.stepmania.stepchart', 'sm'],\n ['application/vnd.sun.xml.calc', 'sxc'],\n ['application/vnd.sun.xml.calc.template', 'stc'],\n ['application/vnd.sun.xml.draw', 'sxd'],\n ['application/vnd.sun.xml.draw.template', 'std'],\n ['application/vnd.sun.xml.impress', 'sxi'],\n ['application/vnd.sun.xml.impress.template', 'sti'],\n ['application/vnd.sun.xml.math', 'sxm'],\n ['application/vnd.sun.xml.writer', 'sxw'],\n ['application/vnd.sun.xml.writer.global', 'sxg'],\n ['application/vnd.sun.xml.writer.template', 'stw'],\n ['application/vnd.sus-calendar', 'sus'],\n ['application/vnd.svd', 'svd'],\n ['application/vnd.symbian.install', 'sis'],\n ['application/vnd.syncml+xml', 'xsm'],\n ['application/vnd.syncml.dm+wbxml', 'bdm'],\n ['application/vnd.syncml.dm+xml', 'xdm'],\n ['application/vnd.tao.intent-module-archive', 'tao'],\n ['application/vnd.tmobile-livetv', 'tmo'],\n ['application/vnd.trid.tpt', 'tpt'],\n ['application/vnd.triscape.mxs', 'mxs'],\n ['application/vnd.trueapp', 'tra'],\n ['application/vnd.ufdl', 'ufd'],\n ['application/vnd.uiq.theme', 'utz'],\n ['application/vnd.umajin', 'umj'],\n ['application/vnd.unity', 'unityweb'],\n ['application/vnd.uoml+xml', 'uoml'],\n ['application/vnd.vcx', 'vcx'],\n ['application/vnd.visio', 'vsd'],\n ['application/vnd.visionary', 'vis'],\n ['application/vnd.vsf', 'vsf'],\n ['application/vnd.wap.wbxml', 'wbxml'],\n ['application/vnd.wap.wmlc', 'wmlc'],\n ['application/vnd.wap.wmlscriptc', 'wmlsc'],\n ['application/vnd.webturbo', 'wtb'],\n ['application/vnd.wolfram.player', 'nbp'],\n ['application/vnd.wordperfect', 'wpd'],\n ['application/vnd.wqd', 'wqd'],\n ['application/vnd.wt.stf', 'stf'],\n ['application/vnd.xara', ['web', 'xar']],\n ['application/vnd.xfdl', 'xfdl'],\n ['application/vnd.yamaha.hv-dic', 'hvd'],\n ['application/vnd.yamaha.hv-script', 'hvs'],\n ['application/vnd.yamaha.hv-voice', 'hvp'],\n ['application/vnd.yamaha.openscoreformat', 'osf'],\n ['application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osfpvg'],\n ['application/vnd.yamaha.smaf-audio', 'saf'],\n ['application/vnd.yamaha.smaf-phrase', 'spf'],\n ['application/vnd.yellowriver-custom-menu', 'cmp'],\n ['application/vnd.zul', 'zir'],\n ['application/vnd.zzazz.deck+xml', 'zaz'],\n ['application/vocaltec-media-desc', 'vmd'],\n ['application/vocaltec-media-file', 'vmf'],\n ['application/voicexml+xml', 'vxml'],\n ['application/widget', 'wgt'],\n ['application/winhlp', 'hlp'],\n ['application/wordperfect', ['wp', 'wp5', 'wp6', 'wpd']],\n ['application/wordperfect6.0', ['w60', 'wp5']],\n ['application/wordperfect6.1', 'w61'],\n ['application/wsdl+xml', 'wsdl'],\n ['application/wspolicy+xml', 'wspolicy'],\n ['application/x-123', 'wk1'],\n ['application/x-7z-compressed', '7z'],\n ['application/x-abiword', 'abw'],\n ['application/x-ace-compressed', 'ace'],\n ['application/x-aim', 'aim'],\n ['application/x-authorware-bin', 'aab'],\n ['application/x-authorware-map', 'aam'],\n ['application/x-authorware-seg', 'aas'],\n ['application/x-bcpio', 'bcpio'],\n ['application/x-binary', 'bin'],\n ['application/x-binhex40', 'hqx'],\n ['application/x-bittorrent', 'torrent'],\n ['application/x-bsh', ['bsh', 'sh', 'shar']],\n ['application/x-bytecode.elisp', 'elc'],\n ['application/x-bytecode.python', 'pyc'],\n ['application/x-bzip', 'bz'],\n ['application/x-bzip2', ['boz', 'bz2']],\n ['application/x-cdf', 'cdf'],\n ['application/x-cdlink', 'vcd'],\n ['application/x-chat', ['cha', 'chat']],\n ['application/x-chess-pgn', 'pgn'],\n ['application/x-cmu-raster', 'ras'],\n ['application/x-cocoa', 'cco'],\n ['application/x-compactpro', 'cpt'],\n ['application/x-compress', 'z'],\n ['application/x-compressed', ['tgz', 'gz', 'z', 'zip']],\n ['application/x-conference', 'nsc'],\n ['application/x-cpio', 'cpio'],\n ['application/x-cpt', 'cpt'],\n ['application/x-csh', 'csh'],\n ['application/x-debian-package', 'deb'],\n ['application/x-deepv', 'deepv'],\n ['application/x-director', ['dir', 'dcr', 'dxr']],\n ['application/x-doom', 'wad'],\n ['application/x-dtbncx+xml', 'ncx'],\n ['application/x-dtbook+xml', 'dtb'],\n ['application/x-dtbresource+xml', 'res'],\n ['application/x-dvi', 'dvi'],\n ['application/x-elc', 'elc'],\n ['application/x-envoy', ['env', 'evy']],\n ['application/x-esrehber', 'es'],\n ['application/x-excel', ['xls', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],\n ['application/x-font-bdf', 'bdf'],\n ['application/x-font-ghostscript', 'gsf'],\n ['application/x-font-linux-psf', 'psf'],\n ['application/x-font-otf', 'otf'],\n ['application/x-font-pcf', 'pcf'],\n ['application/x-font-snf', 'snf'],\n ['application/x-font-ttf', 'ttf'],\n ['application/x-font-type1', 'pfa'],\n ['application/x-font-woff', 'woff'],\n ['application/x-frame', 'mif'],\n ['application/x-freelance', 'pre'],\n ['application/x-futuresplash', 'spl'],\n ['application/x-gnumeric', 'gnumeric'],\n ['application/x-gsp', 'gsp'],\n ['application/x-gss', 'gss'],\n ['application/x-gtar', 'gtar'],\n ['application/x-gzip', ['gz', 'gzip']],\n ['application/x-hdf', 'hdf'],\n ['application/x-helpfile', ['help', 'hlp']],\n ['application/x-httpd-imap', 'imap'],\n ['application/x-ima', 'ima'],\n ['application/x-internet-signup', ['ins', 'isp']],\n ['application/x-internett-signup', 'ins'],\n ['application/x-inventor', 'iv'],\n ['application/x-ip2', 'ip'],\n ['application/x-iphone', 'iii'],\n ['application/x-java-class', 'class'],\n ['application/x-java-commerce', 'jcm'],\n ['application/x-java-jnlp-file', 'jnlp'],\n ['application/x-javascript', 'js'],\n ['application/x-koan', ['skd', 'skm', 'skp', 'skt']],\n ['application/x-ksh', 'ksh'],\n ['application/x-latex', ['latex', 'ltx']],\n ['application/x-lha', 'lha'],\n ['application/x-lisp', 'lsp'],\n ['application/x-livescreen', 'ivy'],\n ['application/x-lotus', 'wq1'],\n ['application/x-lotusscreencam', 'scm'],\n ['application/x-lzh', 'lzh'],\n ['application/x-lzx', 'lzx'],\n ['application/x-mac-binhex40', 'hqx'],\n ['application/x-macbinary', 'bin'],\n ['application/x-magic-cap-package-1.0', 'mc$'],\n ['application/x-mathcad', 'mcd'],\n ['application/x-meme', 'mm'],\n ['application/x-midi', ['mid', 'midi']],\n ['application/x-mif', 'mif'],\n ['application/x-mix-transfer', 'nix'],\n ['application/x-mobipocket-ebook', 'prc'],\n ['application/x-mplayer2', 'asx'],\n ['application/x-ms-application', 'application'],\n ['application/x-ms-wmd', 'wmd'],\n ['application/x-ms-wmz', 'wmz'],\n ['application/x-ms-xbap', 'xbap'],\n ['application/x-msaccess', 'mdb'],\n ['application/x-msbinder', 'obd'],\n ['application/x-mscardfile', 'crd'],\n ['application/x-msclip', 'clp'],\n ['application/x-msdownload', ['exe', 'dll']],\n ['application/x-msexcel', ['xls', 'xla', 'xlw']],\n ['application/x-msmediaview', ['mvb', 'm13', 'm14']],\n ['application/x-msmetafile', 'wmf'],\n ['application/x-msmoney', 'mny'],\n ['application/x-mspowerpoint', 'ppt'],\n ['application/x-mspublisher', 'pub'],\n ['application/x-msschedule', 'scd'],\n ['application/x-msterminal', 'trm'],\n ['application/x-mswrite', 'wri'],\n ['application/x-navi-animation', 'ani'],\n ['application/x-navidoc', 'nvd'],\n ['application/x-navimap', 'map'],\n ['application/x-navistyle', 'stl'],\n ['application/x-netcdf', ['cdf', 'nc']],\n ['application/x-newton-compatible-pkg', 'pkg'],\n ['application/x-nokia-9000-communicator-add-on-software', 'aos'],\n ['application/x-omc', 'omc'],\n ['application/x-omcdatamaker', 'omcd'],\n ['application/x-omcregerator', 'omcr'],\n ['application/x-pagemaker', ['pm4', 'pm5']],\n ['application/x-pcl', 'pcl'],\n ['application/x-perfmon', ['pma', 'pmc', 'pml', 'pmr', 'pmw']],\n ['application/x-pixclscript', 'plx'],\n ['application/x-pkcs10', 'p10'],\n ['application/x-pkcs12', ['p12', 'pfx']],\n ['application/x-pkcs7-certificates', ['p7b', 'spc']],\n ['application/x-pkcs7-certreqresp', 'p7r'],\n ['application/x-pkcs7-mime', ['p7m', 'p7c']],\n ['application/x-pkcs7-signature', ['p7s', 'p7a']],\n ['application/x-pointplus', 'css'],\n ['application/x-portable-anymap', 'pnm'],\n ['application/x-project', ['mpc', 'mpt', 'mpv', 'mpx']],\n ['application/x-qpro', 'wb1'],\n ['application/x-rar-compressed', 'rar'],\n ['application/x-rtf', 'rtf'],\n ['application/x-sdp', 'sdp'],\n ['application/x-sea', 'sea'],\n ['application/x-seelogo', 'sl'],\n ['application/x-sh', 'sh'],\n ['application/x-shar', ['shar', 'sh']],\n ['application/x-shockwave-flash', 'swf'],\n ['application/x-silverlight-app', 'xap'],\n ['application/x-sit', 'sit'],\n ['application/x-sprite', ['spr', 'sprite']],\n ['application/x-stuffit', 'sit'],\n ['application/x-stuffitx', 'sitx'],\n ['application/x-sv4cpio', 'sv4cpio'],\n ['application/x-sv4crc', 'sv4crc'],\n ['application/x-tar', 'tar'],\n ['application/x-tbook', ['sbk', 'tbk']],\n ['application/x-tcl', 'tcl'],\n ['application/x-tex', 'tex'],\n ['application/x-tex-tfm', 'tfm'],\n ['application/x-texinfo', ['texi', 'texinfo']],\n ['application/x-troff', ['roff', 't', 'tr']],\n ['application/x-troff-man', 'man'],\n ['application/x-troff-me', 'me'],\n ['application/x-troff-ms', 'ms'],\n ['application/x-troff-msvideo', 'avi'],\n ['application/x-ustar', 'ustar'],\n ['application/x-visio', ['vsd', 'vst', 'vsw']],\n ['application/x-vnd.audioexplosion.mzz', 'mzz'],\n ['application/x-vnd.ls-xpix', 'xpix'],\n ['application/x-vrml', 'vrml'],\n ['application/x-wais-source', ['src', 'wsrc']],\n ['application/x-winhelp', 'hlp'],\n ['application/x-wintalk', 'wtk'],\n ['application/x-world', ['wrl', 'svr']],\n ['application/x-wpwin', 'wpd'],\n ['application/x-wri', 'wri'],\n ['application/x-x509-ca-cert', ['cer', 'crt', 'der']],\n ['application/x-x509-user-cert', 'crt'],\n ['application/x-xfig', 'fig'],\n ['application/x-xpinstall', 'xpi'],\n ['application/x-zip-compressed', 'zip'],\n ['application/xcap-diff+xml', 'xdf'],\n ['application/xenc+xml', 'xenc'],\n ['application/xhtml+xml', 'xhtml'],\n ['application/xml', 'xml'],\n ['application/xml-dtd', 'dtd'],\n ['application/xop+xml', 'xop'],\n ['application/xslt+xml', 'xslt'],\n ['application/xspf+xml', 'xspf'],\n ['application/xv+xml', 'mxml'],\n ['application/yang', 'yang'],\n ['application/yin+xml', 'yin'],\n ['application/ynd.ms-pkipko', 'pko'],\n ['application/zip', 'zip'],\n ['audio/adpcm', 'adp'],\n ['audio/aiff', ['aiff', 'aif', 'aifc']],\n ['audio/basic', ['snd', 'au']],\n ['audio/it', 'it'],\n ['audio/make', ['funk', 'my', 'pfunk']],\n ['audio/make.my.funk', 'pfunk'],\n ['audio/mid', ['mid', 'rmi']],\n ['audio/midi', ['midi', 'kar', 'mid']],\n ['audio/mod', 'mod'],\n ['audio/mp4', 'mp4a'],\n ['audio/mpeg', ['mpga', 'mp3', 'm2a', 'mp2', 'mpa', 'mpg']],\n ['audio/mpeg3', 'mp3'],\n ['audio/nspaudio', ['la', 'lma']],\n ['audio/ogg', 'oga'],\n ['audio/s3m', 's3m'],\n ['audio/tsp-audio', 'tsi'],\n ['audio/tsplayer', 'tsp'],\n ['audio/vnd.dece.audio', 'uva'],\n ['audio/vnd.digital-winds', 'eol'],\n ['audio/vnd.dra', 'dra'],\n ['audio/vnd.dts', 'dts'],\n ['audio/vnd.dts.hd', 'dtshd'],\n ['audio/vnd.lucent.voice', 'lvp'],\n ['audio/vnd.ms-playready.media.pya', 'pya'],\n ['audio/vnd.nuera.ecelp4800', 'ecelp4800'],\n ['audio/vnd.nuera.ecelp7470', 'ecelp7470'],\n ['audio/vnd.nuera.ecelp9600', 'ecelp9600'],\n ['audio/vnd.qcelp', 'qcp'],\n ['audio/vnd.rip', 'rip'],\n ['audio/voc', 'voc'],\n ['audio/voxware', 'vox'],\n ['audio/wav', 'wav'],\n ['audio/webm', 'weba'],\n ['audio/x-aac', 'aac'],\n ['audio/x-adpcm', 'snd'],\n ['audio/x-aiff', ['aiff', 'aif', 'aifc']],\n ['audio/x-au', 'au'],\n ['audio/x-gsm', ['gsd', 'gsm']],\n ['audio/x-jam', 'jam'],\n ['audio/x-liveaudio', 'lam'],\n ['audio/x-mid', ['mid', 'midi']],\n ['audio/x-midi', ['midi', 'mid']],\n ['audio/x-mod', 'mod'],\n ['audio/x-mpeg', 'mp2'],\n ['audio/x-mpeg-3', 'mp3'],\n ['audio/x-mpegurl', 'm3u'],\n ['audio/x-mpequrl', 'm3u'],\n ['audio/x-ms-wax', 'wax'],\n ['audio/x-ms-wma', 'wma'],\n ['audio/x-nspaudio', ['la', 'lma']],\n ['audio/x-pn-realaudio', ['ra', 'ram', 'rm', 'rmm', 'rmp']],\n ['audio/x-pn-realaudio-plugin', ['ra', 'rmp', 'rpm']],\n ['audio/x-psid', 'sid'],\n ['audio/x-realaudio', 'ra'],\n ['audio/x-twinvq', 'vqf'],\n ['audio/x-twinvq-plugin', ['vqe', 'vql']],\n ['audio/x-vnd.audioexplosion.mjuicemediafile', 'mjf'],\n ['audio/x-voc', 'voc'],\n ['audio/x-wav', 'wav'],\n ['audio/xm', 'xm'],\n ['chemical/x-cdx', 'cdx'],\n ['chemical/x-cif', 'cif'],\n ['chemical/x-cmdf', 'cmdf'],\n ['chemical/x-cml', 'cml'],\n ['chemical/x-csml', 'csml'],\n ['chemical/x-pdb', ['pdb', 'xyz']],\n ['chemical/x-xyz', 'xyz'],\n ['drawing/x-dwf', 'dwf'],\n ['i-world/i-vrml', 'ivr'],\n ['image/bmp', ['bmp', 'bm']],\n ['image/cgm', 'cgm'],\n ['image/cis-cod', 'cod'],\n ['image/cmu-raster', ['ras', 'rast']],\n ['image/fif', 'fif'],\n ['image/florian', ['flo', 'turbot']],\n ['image/g3fax', 'g3'],\n ['image/gif', 'gif'],\n ['image/ief', ['ief', 'iefs']],\n ['image/jpeg', ['jpeg', 'jpe', 'jpg', 'jfif', 'jfif-tbnl']],\n ['image/jutvision', 'jut'],\n ['image/ktx', 'ktx'],\n ['image/naplps', ['nap', 'naplps']],\n ['image/pict', ['pic', 'pict']],\n ['image/pipeg', 'jfif'],\n ['image/pjpeg', ['jfif', 'jpe', 'jpeg', 'jpg']],\n ['image/png', ['png', 'x-png']],\n ['image/prs.btif', 'btif'],\n ['image/svg+xml', 'svg'],\n ['image/tiff', ['tif', 'tiff']],\n ['image/vasa', 'mcf'],\n ['image/vnd.adobe.photoshop', 'psd'],\n ['image/vnd.dece.graphic', 'uvi'],\n ['image/vnd.djvu', 'djvu'],\n ['image/vnd.dvb.subtitle', 'sub'],\n ['image/vnd.dwg', ['dwg', 'dxf', 'svf']],\n ['image/vnd.dxf', 'dxf'],\n ['image/vnd.fastbidsheet', 'fbs'],\n ['image/vnd.fpx', 'fpx'],\n ['image/vnd.fst', 'fst'],\n ['image/vnd.fujixerox.edmics-mmr', 'mmr'],\n ['image/vnd.fujixerox.edmics-rlc', 'rlc'],\n ['image/vnd.ms-modi', 'mdi'],\n ['image/vnd.net-fpx', ['fpx', 'npx']],\n ['image/vnd.rn-realflash', 'rf'],\n ['image/vnd.rn-realpix', 'rp'],\n ['image/vnd.wap.wbmp', 'wbmp'],\n ['image/vnd.xiff', 'xif'],\n ['image/webp', 'webp'],\n ['image/x-cmu-raster', 'ras'],\n ['image/x-cmx', 'cmx'],\n ['image/x-dwg', ['dwg', 'dxf', 'svf']],\n ['image/x-freehand', 'fh'],\n ['image/x-icon', 'ico'],\n ['image/x-jg', 'art'],\n ['image/x-jps', 'jps'],\n ['image/x-niff', ['niff', 'nif']],\n ['image/x-pcx', 'pcx'],\n ['image/x-pict', ['pct', 'pic']],\n ['image/x-portable-anymap', 'pnm'],\n ['image/x-portable-bitmap', 'pbm'],\n ['image/x-portable-graymap', 'pgm'],\n ['image/x-portable-greymap', 'pgm'],\n ['image/x-portable-pixmap', 'ppm'],\n ['image/x-quicktime', ['qif', 'qti', 'qtif']],\n ['image/x-rgb', 'rgb'],\n ['image/x-tiff', ['tif', 'tiff']],\n ['image/x-windows-bmp', 'bmp'],\n ['image/x-xbitmap', 'xbm'],\n ['image/x-xbm', 'xbm'],\n ['image/x-xpixmap', ['xpm', 'pm']],\n ['image/x-xwd', 'xwd'],\n ['image/x-xwindowdump', 'xwd'],\n ['image/xbm', 'xbm'],\n ['image/xpm', 'xpm'],\n ['message/rfc822', ['eml', 'mht', 'mhtml', 'nws', 'mime']],\n ['model/iges', ['iges', 'igs']],\n ['model/mesh', 'msh'],\n ['model/vnd.collada+xml', 'dae'],\n ['model/vnd.dwf', 'dwf'],\n ['model/vnd.gdl', 'gdl'],\n ['model/vnd.gtw', 'gtw'],\n ['model/vnd.mts', 'mts'],\n ['model/vnd.vtu', 'vtu'],\n ['model/vrml', ['vrml', 'wrl', 'wrz']],\n ['model/x-pov', 'pov'],\n ['multipart/x-gzip', 'gzip'],\n ['multipart/x-ustar', 'ustar'],\n ['multipart/x-zip', 'zip'],\n ['music/crescendo', ['mid', 'midi']],\n ['music/x-karaoke', 'kar'],\n ['paleovu/x-pv', 'pvu'],\n ['text/asp', 'asp'],\n ['text/calendar', 'ics'],\n ['text/css', 'css'],\n ['text/csv', 'csv'],\n ['text/ecmascript', 'js'],\n ['text/h323', '323'],\n ['text/html', ['html', 'htm', 'stm', 'acgi', 'htmls', 'htx', 'shtml']],\n ['text/iuls', 'uls'],\n ['text/javascript', 'js'],\n ['text/mcf', 'mcf'],\n ['text/n3', 'n3'],\n ['text/pascal', 'pas'],\n [\n 'text/plain',\n [\n 'txt',\n 'bas',\n 'c',\n 'h',\n 'c++',\n 'cc',\n 'com',\n 'conf',\n 'cxx',\n 'def',\n 'f',\n 'f90',\n 'for',\n 'g',\n 'hh',\n 'idc',\n 'jav',\n 'java',\n 'list',\n 'log',\n 'lst',\n 'm',\n 'mar',\n 'pl',\n 'sdml',\n 'text'\n ]\n ],\n ['text/plain-bas', 'par'],\n ['text/prs.lines.tag', 'dsc'],\n ['text/richtext', ['rtx', 'rt', 'rtf']],\n ['text/scriplet', 'wsc'],\n ['text/scriptlet', 'sct'],\n ['text/sgml', ['sgm', 'sgml']],\n ['text/tab-separated-values', 'tsv'],\n ['text/troff', 't'],\n ['text/turtle', 'ttl'],\n ['text/uri-list', ['uni', 'unis', 'uri', 'uris']],\n ['text/vnd.abc', 'abc'],\n ['text/vnd.curl', 'curl'],\n ['text/vnd.curl.dcurl', 'dcurl'],\n ['text/vnd.curl.mcurl', 'mcurl'],\n ['text/vnd.curl.scurl', 'scurl'],\n ['text/vnd.fly', 'fly'],\n ['text/vnd.fmi.flexstor', 'flx'],\n ['text/vnd.graphviz', 'gv'],\n ['text/vnd.in3d.3dml', '3dml'],\n ['text/vnd.in3d.spot', 'spot'],\n ['text/vnd.rn-realtext', 'rt'],\n ['text/vnd.sun.j2me.app-descriptor', 'jad'],\n ['text/vnd.wap.wml', 'wml'],\n ['text/vnd.wap.wmlscript', 'wmls'],\n ['text/webviewhtml', 'htt'],\n ['text/x-asm', ['asm', 's']],\n ['text/x-audiosoft-intra', 'aip'],\n ['text/x-c', ['c', 'cc', 'cpp']],\n ['text/x-component', 'htc'],\n ['text/x-fortran', ['for', 'f', 'f77', 'f90']],\n ['text/x-h', ['h', 'hh']],\n ['text/x-java-source', ['java', 'jav']],\n ['text/x-java-source,java', 'java'],\n ['text/x-la-asf', 'lsx'],\n ['text/x-m', 'm'],\n ['text/x-pascal', 'p'],\n ['text/x-script', 'hlb'],\n ['text/x-script.csh', 'csh'],\n ['text/x-script.elisp', 'el'],\n ['text/x-script.guile', 'scm'],\n ['text/x-script.ksh', 'ksh'],\n ['text/x-script.lisp', 'lsp'],\n ['text/x-script.perl', 'pl'],\n ['text/x-script.perl-module', 'pm'],\n ['text/x-script.phyton', 'py'],\n ['text/x-script.rexx', 'rexx'],\n ['text/x-script.scheme', 'scm'],\n ['text/x-script.sh', 'sh'],\n ['text/x-script.tcl', 'tcl'],\n ['text/x-script.tcsh', 'tcsh'],\n ['text/x-script.zsh', 'zsh'],\n ['text/x-server-parsed-html', ['shtml', 'ssi']],\n ['text/x-setext', 'etx'],\n ['text/x-sgml', ['sgm', 'sgml']],\n ['text/x-speech', ['spc', 'talk']],\n ['text/x-uil', 'uil'],\n ['text/x-uuencode', ['uu', 'uue']],\n ['text/x-vcalendar', 'vcs'],\n ['text/x-vcard', 'vcf'],\n ['text/xml', 'xml'],\n ['video/3gpp', '3gp'],\n ['video/3gpp2', '3g2'],\n ['video/animaflex', 'afl'],\n ['video/avi', 'avi'],\n ['video/avs-video', 'avs'],\n ['video/dl', 'dl'],\n ['video/fli', 'fli'],\n ['video/gl', 'gl'],\n ['video/h261', 'h261'],\n ['video/h263', 'h263'],\n ['video/h264', 'h264'],\n ['video/jpeg', 'jpgv'],\n ['video/jpm', 'jpm'],\n ['video/mj2', 'mj2'],\n ['video/mp4', 'mp4'],\n ['video/mpeg', ['mpeg', 'mp2', 'mpa', 'mpe', 'mpg', 'mpv2', 'm1v', 'm2v', 'mp3']],\n ['video/msvideo', 'avi'],\n ['video/ogg', 'ogv'],\n ['video/quicktime', ['mov', 'qt', 'moov']],\n ['video/vdo', 'vdo'],\n ['video/vivo', ['viv', 'vivo']],\n ['video/vnd.dece.hd', 'uvh'],\n ['video/vnd.dece.mobile', 'uvm'],\n ['video/vnd.dece.pd', 'uvp'],\n ['video/vnd.dece.sd', 'uvs'],\n ['video/vnd.dece.video', 'uvv'],\n ['video/vnd.fvt', 'fvt'],\n ['video/vnd.mpegurl', 'mxu'],\n ['video/vnd.ms-playready.media.pyv', 'pyv'],\n ['video/vnd.rn-realvideo', 'rv'],\n ['video/vnd.uvvu.mp4', 'uvu'],\n ['video/vnd.vivo', ['viv', 'vivo']],\n ['video/vosaic', 'vos'],\n ['video/webm', 'webm'],\n ['video/x-amt-demorun', 'xdr'],\n ['video/x-amt-showrun', 'xsr'],\n ['video/x-atomic3d-feature', 'fmf'],\n ['video/x-dl', 'dl'],\n ['video/x-dv', ['dif', 'dv']],\n ['video/x-f4v', 'f4v'],\n ['video/x-fli', 'fli'],\n ['video/x-flv', 'flv'],\n ['video/x-gl', 'gl'],\n ['video/x-isvideo', 'isu'],\n ['video/x-la-asf', ['lsf', 'lsx']],\n ['video/x-m4v', 'm4v'],\n ['video/x-motion-jpeg', 'mjpg'],\n ['video/x-mpeg', ['mp3', 'mp2']],\n ['video/x-mpeq2a', 'mp2'],\n ['video/x-ms-asf', ['asf', 'asr', 'asx']],\n ['video/x-ms-asf-plugin', 'asx'],\n ['video/x-ms-wm', 'wm'],\n ['video/x-ms-wmv', 'wmv'],\n ['video/x-ms-wmx', 'wmx'],\n ['video/x-ms-wvx', 'wvx'],\n ['video/x-msvideo', 'avi'],\n ['video/x-qtc', 'qtc'],\n ['video/x-scm', 'scm'],\n ['video/x-sgi-movie', ['movie', 'mv']],\n ['windows/metafile', 'wmf'],\n ['www/mime', 'mime'],\n ['x-conference/x-cooltalk', 'ice'],\n ['x-music/x-midi', ['mid', 'midi']],\n ['x-world/x-3dmf', ['3dm', '3dmf', 'qd3', 'qd3d']],\n ['x-world/x-svr', 'svr'],\n ['x-world/x-vrml', ['flr', 'vrml', 'wrl', 'wrz', 'xaf', 'xof']],\n ['x-world/x-vrt', 'vrt'],\n ['xgl/drawing', 'xgz'],\n ['xgl/movie', 'xmz']\n]);\nconst extensions = new Map([\n ['123', 'application/vnd.lotus-1-2-3'],\n ['323', 'text/h323'],\n ['*', 'application/octet-stream'],\n ['3dm', 'x-world/x-3dmf'],\n ['3dmf', 'x-world/x-3dmf'],\n ['3dml', 'text/vnd.in3d.3dml'],\n ['3g2', 'video/3gpp2'],\n ['3gp', 'video/3gpp'],\n ['7z', 'application/x-7z-compressed'],\n ['a', 'application/octet-stream'],\n ['aab', 'application/x-authorware-bin'],\n ['aac', 'audio/x-aac'],\n ['aam', 'application/x-authorware-map'],\n ['aas', 'application/x-authorware-seg'],\n ['abc', 'text/vnd.abc'],\n ['abw', 'application/x-abiword'],\n ['ac', 'application/pkix-attr-cert'],\n ['acc', 'application/vnd.americandynamics.acc'],\n ['ace', 'application/x-ace-compressed'],\n ['acgi', 'text/html'],\n ['acu', 'application/vnd.acucobol'],\n ['acx', 'application/internet-property-stream'],\n ['adp', 'audio/adpcm'],\n ['aep', 'application/vnd.audiograph'],\n ['afl', 'video/animaflex'],\n ['afp', 'application/vnd.ibm.modcap'],\n ['ahead', 'application/vnd.ahead.space'],\n ['ai', 'application/postscript'],\n ['aif', ['audio/aiff', 'audio/x-aiff']],\n ['aifc', ['audio/aiff', 'audio/x-aiff']],\n ['aiff', ['audio/aiff', 'audio/x-aiff']],\n ['aim', 'application/x-aim'],\n ['aip', 'text/x-audiosoft-intra'],\n ['air', 'application/vnd.adobe.air-application-installer-package+zip'],\n ['ait', 'application/vnd.dvb.ait'],\n ['ami', 'application/vnd.amiga.ami'],\n ['ani', 'application/x-navi-animation'],\n ['aos', 'application/x-nokia-9000-communicator-add-on-software'],\n ['apk', 'application/vnd.android.package-archive'],\n ['application', 'application/x-ms-application'],\n ['apr', 'application/vnd.lotus-approach'],\n ['aps', 'application/mime'],\n ['arc', 'application/octet-stream'],\n ['arj', ['application/arj', 'application/octet-stream']],\n ['art', 'image/x-jg'],\n ['asf', 'video/x-ms-asf'],\n ['asm', 'text/x-asm'],\n ['aso', 'application/vnd.accpac.simply.aso'],\n ['asp', 'text/asp'],\n ['asr', 'video/x-ms-asf'],\n ['asx', ['video/x-ms-asf', 'application/x-mplayer2', 'video/x-ms-asf-plugin']],\n ['atc', 'application/vnd.acucorp'],\n ['atomcat', 'application/atomcat+xml'],\n ['atomsvc', 'application/atomsvc+xml'],\n ['atx', 'application/vnd.antix.game-component'],\n ['au', ['audio/basic', 'audio/x-au']],\n ['avi', ['video/avi', 'video/msvideo', 'application/x-troff-msvideo', 'video/x-msvideo']],\n ['avs', 'video/avs-video'],\n ['aw', 'application/applixware'],\n ['axs', 'application/olescript'],\n ['azf', 'application/vnd.airzip.filesecure.azf'],\n ['azs', 'application/vnd.airzip.filesecure.azs'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bas', 'text/plain'],\n ['bcpio', 'application/x-bcpio'],\n ['bdf', 'application/x-font-bdf'],\n ['bdm', 'application/vnd.syncml.dm+wbxml'],\n ['bed', 'application/vnd.realvnc.bed'],\n ['bh2', 'application/vnd.fujitsu.oasysprs'],\n ['bin', ['application/octet-stream', 'application/mac-binary', 'application/macbinary', 'application/x-macbinary', 'application/x-binary']],\n ['bm', 'image/bmp'],\n ['bmi', 'application/vnd.bmi'],\n ['bmp', ['image/bmp', 'image/x-windows-bmp']],\n ['boo', 'application/book'],\n ['book', 'application/book'],\n ['box', 'application/vnd.previewsystems.box'],\n ['boz', 'application/x-bzip2'],\n ['bsh', 'application/x-bsh'],\n ['btif', 'image/prs.btif'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['c', ['text/plain', 'text/x-c']],\n ['c++', 'text/plain'],\n ['c11amc', 'application/vnd.cluetrust.cartomobile-config'],\n ['c11amz', 'application/vnd.cluetrust.cartomobile-config-pkg'],\n ['c4g', 'application/vnd.clonk.c4group'],\n ['cab', 'application/vnd.ms-cab-compressed'],\n ['car', 'application/vnd.curl.car'],\n ['cat', ['application/vnd.ms-pkiseccat', 'application/vnd.ms-pki.seccat']],\n ['cc', ['text/plain', 'text/x-c']],\n ['ccad', 'application/clariscad'],\n ['cco', 'application/x-cocoa'],\n ['ccxml', 'application/ccxml+xml,'],\n ['cdbcmsg', 'application/vnd.contact.cmsg'],\n ['cdf', ['application/cdf', 'application/x-cdf', 'application/x-netcdf']],\n ['cdkey', 'application/vnd.mediastation.cdkey'],\n ['cdmia', 'application/cdmi-capability'],\n ['cdmic', 'application/cdmi-container'],\n ['cdmid', 'application/cdmi-domain'],\n ['cdmio', 'application/cdmi-object'],\n ['cdmiq', 'application/cdmi-queue'],\n ['cdx', 'chemical/x-cdx'],\n ['cdxml', 'application/vnd.chemdraw+xml'],\n ['cdy', 'application/vnd.cinderella'],\n ['cer', ['application/pkix-cert', 'application/x-x509-ca-cert']],\n ['cgm', 'image/cgm'],\n ['cha', 'application/x-chat'],\n ['chat', 'application/x-chat'],\n ['chm', 'application/vnd.ms-htmlhelp'],\n ['chrt', 'application/vnd.kde.kchart'],\n ['cif', 'chemical/x-cif'],\n ['cii', 'application/vnd.anser-web-certificate-issue-initiation'],\n ['cil', 'application/vnd.ms-artgalry'],\n ['cla', 'application/vnd.claymore'],\n ['class', ['application/octet-stream', 'application/java', 'application/java-byte-code', 'application/java-vm', 'application/x-java-class']],\n ['clkk', 'application/vnd.crick.clicker.keyboard'],\n ['clkp', 'application/vnd.crick.clicker.palette'],\n ['clkt', 'application/vnd.crick.clicker.template'],\n ['clkw', 'application/vnd.crick.clicker.wordbank'],\n ['clkx', 'application/vnd.crick.clicker'],\n ['clp', 'application/x-msclip'],\n ['cmc', 'application/vnd.cosmocaller'],\n ['cmdf', 'chemical/x-cmdf'],\n ['cml', 'chemical/x-cml'],\n ['cmp', 'application/vnd.yellowriver-custom-menu'],\n ['cmx', 'image/x-cmx'],\n ['cod', ['image/cis-cod', 'application/vnd.rim.cod']],\n ['com', ['application/octet-stream', 'text/plain']],\n ['conf', 'text/plain'],\n ['cpio', 'application/x-cpio'],\n ['cpp', 'text/x-c'],\n ['cpt', ['application/mac-compactpro', 'application/x-compactpro', 'application/x-cpt']],\n ['crd', 'application/x-mscardfile'],\n ['crl', ['application/pkix-crl', 'application/pkcs-crl']],\n ['crt', ['application/pkix-cert', 'application/x-x509-user-cert', 'application/x-x509-ca-cert']],\n ['cryptonote', 'application/vnd.rig.cryptonote'],\n ['csh', ['text/x-script.csh', 'application/x-csh']],\n ['csml', 'chemical/x-csml'],\n ['csp', 'application/vnd.commonspace'],\n ['css', ['text/css', 'application/x-pointplus']],\n ['csv', 'text/csv'],\n ['cu', 'application/cu-seeme'],\n ['curl', 'text/vnd.curl'],\n ['cww', 'application/prs.cww'],\n ['cxx', 'text/plain'],\n ['dae', 'model/vnd.collada+xml'],\n ['daf', 'application/vnd.mobius.daf'],\n ['davmount', 'application/davmount+xml'],\n ['dcr', 'application/x-director'],\n ['dcurl', 'text/vnd.curl.dcurl'],\n ['dd2', 'application/vnd.oma.dd2+xml'],\n ['ddd', 'application/vnd.fujixerox.ddd'],\n ['deb', 'application/x-debian-package'],\n ['deepv', 'application/x-deepv'],\n ['def', 'text/plain'],\n ['der', 'application/x-x509-ca-cert'],\n ['dfac', 'application/vnd.dreamfactory'],\n ['dif', 'video/x-dv'],\n ['dir', 'application/x-director'],\n ['dis', 'application/vnd.mobius.dis'],\n ['djvu', 'image/vnd.djvu'],\n ['dl', ['video/dl', 'video/x-dl']],\n ['dll', 'application/x-msdownload'],\n ['dms', 'application/octet-stream'],\n ['dna', 'application/vnd.dna'],\n ['doc', 'application/msword'],\n ['docm', 'application/vnd.ms-word.document.macroenabled.12'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['dot', 'application/msword'],\n ['dotm', 'application/vnd.ms-word.template.macroenabled.12'],\n ['dotx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template'],\n ['dp', ['application/commonground', 'application/vnd.osgi.dp']],\n ['dpg', 'application/vnd.dpgraph'],\n ['dra', 'audio/vnd.dra'],\n ['drw', 'application/drafting'],\n ['dsc', 'text/prs.lines.tag'],\n ['dssc', 'application/dssc+der'],\n ['dtb', 'application/x-dtbook+xml'],\n ['dtd', 'application/xml-dtd'],\n ['dts', 'audio/vnd.dts'],\n ['dtshd', 'audio/vnd.dts.hd'],\n ['dump', 'application/octet-stream'],\n ['dv', 'video/x-dv'],\n ['dvi', 'application/x-dvi'],\n ['dwf', ['model/vnd.dwf', 'drawing/x-dwf']],\n ['dwg', ['application/acad', 'image/vnd.dwg', 'image/x-dwg']],\n ['dxf', ['application/dxf', 'image/vnd.dwg', 'image/vnd.dxf', 'image/x-dwg']],\n ['dxp', 'application/vnd.spotfire.dxp'],\n ['dxr', 'application/x-director'],\n ['ecelp4800', 'audio/vnd.nuera.ecelp4800'],\n ['ecelp7470', 'audio/vnd.nuera.ecelp7470'],\n ['ecelp9600', 'audio/vnd.nuera.ecelp9600'],\n ['edm', 'application/vnd.novadigm.edm'],\n ['edx', 'application/vnd.novadigm.edx'],\n ['efif', 'application/vnd.picsel'],\n ['ei6', 'application/vnd.pg.osasli'],\n ['el', 'text/x-script.elisp'],\n ['elc', ['application/x-elc', 'application/x-bytecode.elisp']],\n ['eml', 'message/rfc822'],\n ['emma', 'application/emma+xml'],\n ['env', 'application/x-envoy'],\n ['eol', 'audio/vnd.digital-winds'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['eps', 'application/postscript'],\n ['epub', 'application/epub+zip'],\n ['es', ['application/ecmascript', 'application/x-esrehber']],\n ['es3', 'application/vnd.eszigno3+xml'],\n ['esf', 'application/vnd.epson.esf'],\n ['etx', 'text/x-setext'],\n ['evy', ['application/envoy', 'application/x-envoy']],\n ['exe', ['application/octet-stream', 'application/x-msdownload']],\n ['exi', 'application/exi'],\n ['ext', 'application/vnd.novadigm.ext'],\n ['ez2', 'application/vnd.ezpix-album'],\n ['ez3', 'application/vnd.ezpix-package'],\n ['f', ['text/plain', 'text/x-fortran']],\n ['f4v', 'video/x-f4v'],\n ['f77', 'text/x-fortran'],\n ['f90', ['text/plain', 'text/x-fortran']],\n ['fbs', 'image/vnd.fastbidsheet'],\n ['fcs', 'application/vnd.isac.fcs'],\n ['fdf', 'application/vnd.fdf'],\n ['fe_launch', 'application/vnd.denovo.fcselayout-link'],\n ['fg5', 'application/vnd.fujitsu.oasysgp'],\n ['fh', 'image/x-freehand'],\n ['fif', ['application/fractals', 'image/fif']],\n ['fig', 'application/x-xfig'],\n ['fli', ['video/fli', 'video/x-fli']],\n ['flo', ['image/florian', 'application/vnd.micrografx.flo']],\n ['flr', 'x-world/x-vrml'],\n ['flv', 'video/x-flv'],\n ['flw', 'application/vnd.kde.kivio'],\n ['flx', 'text/vnd.fmi.flexstor'],\n ['fly', 'text/vnd.fly'],\n ['fm', 'application/vnd.framemaker'],\n ['fmf', 'video/x-atomic3d-feature'],\n ['fnc', 'application/vnd.frogans.fnc'],\n ['for', ['text/plain', 'text/x-fortran']],\n ['fpx', ['image/vnd.fpx', 'image/vnd.net-fpx']],\n ['frl', 'application/freeloader'],\n ['fsc', 'application/vnd.fsc.weblaunch'],\n ['fst', 'image/vnd.fst'],\n ['ftc', 'application/vnd.fluxtime.clip'],\n ['fti', 'application/vnd.anser-web-funds-transfer-initiation'],\n ['funk', 'audio/make'],\n ['fvt', 'video/vnd.fvt'],\n ['fxp', 'application/vnd.adobe.fxp'],\n ['fzs', 'application/vnd.fuzzysheet'],\n ['g', 'text/plain'],\n ['g2w', 'application/vnd.geoplan'],\n ['g3', 'image/g3fax'],\n ['g3w', 'application/vnd.geospace'],\n ['gac', 'application/vnd.groove-account'],\n ['gdl', 'model/vnd.gdl'],\n ['geo', 'application/vnd.dynageo'],\n ['geojson', 'application/geo+json'],\n ['gex', 'application/vnd.geometry-explorer'],\n ['ggb', 'application/vnd.geogebra.file'],\n ['ggt', 'application/vnd.geogebra.tool'],\n ['ghf', 'application/vnd.groove-help'],\n ['gif', 'image/gif'],\n ['gim', 'application/vnd.groove-identity-message'],\n ['gl', ['video/gl', 'video/x-gl']],\n ['gmx', 'application/vnd.gmx'],\n ['gnumeric', 'application/x-gnumeric'],\n ['gph', 'application/vnd.flographit'],\n ['gqf', 'application/vnd.grafeq'],\n ['gram', 'application/srgs'],\n ['grv', 'application/vnd.groove-injector'],\n ['grxml', 'application/srgs+xml'],\n ['gsd', 'audio/x-gsm'],\n ['gsf', 'application/x-font-ghostscript'],\n ['gsm', 'audio/x-gsm'],\n ['gsp', 'application/x-gsp'],\n ['gss', 'application/x-gss'],\n ['gtar', 'application/x-gtar'],\n ['gtm', 'application/vnd.groove-tool-message'],\n ['gtw', 'model/vnd.gtw'],\n ['gv', 'text/vnd.graphviz'],\n ['gxt', 'application/vnd.geonext'],\n ['gz', ['application/x-gzip', 'application/x-compressed']],\n ['gzip', ['multipart/x-gzip', 'application/x-gzip']],\n ['h', ['text/plain', 'text/x-h']],\n ['h261', 'video/h261'],\n ['h263', 'video/h263'],\n ['h264', 'video/h264'],\n ['hal', 'application/vnd.hal+xml'],\n ['hbci', 'application/vnd.hbci'],\n ['hdf', 'application/x-hdf'],\n ['help', 'application/x-helpfile'],\n ['hgl', 'application/vnd.hp-hpgl'],\n ['hh', ['text/plain', 'text/x-h']],\n ['hlb', 'text/x-script'],\n ['hlp', ['application/winhlp', 'application/hlp', 'application/x-helpfile', 'application/x-winhelp']],\n ['hpg', 'application/vnd.hp-hpgl'],\n ['hpgl', 'application/vnd.hp-hpgl'],\n ['hpid', 'application/vnd.hp-hpid'],\n ['hps', 'application/vnd.hp-hps'],\n [\n 'hqx',\n [\n 'application/mac-binhex40',\n 'application/binhex',\n 'application/binhex4',\n 'application/mac-binhex',\n 'application/x-binhex40',\n 'application/x-mac-binhex40'\n ]\n ],\n ['hta', 'application/hta'],\n ['htc', 'text/x-component'],\n ['htke', 'application/vnd.kenameaapp'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['htmls', 'text/html'],\n ['htt', 'text/webviewhtml'],\n ['htx', 'text/html'],\n ['hvd', 'application/vnd.yamaha.hv-dic'],\n ['hvp', 'application/vnd.yamaha.hv-voice'],\n ['hvs', 'application/vnd.yamaha.hv-script'],\n ['i2g', 'application/vnd.intergeo'],\n ['icc', 'application/vnd.iccprofile'],\n ['ice', 'x-conference/x-cooltalk'],\n ['ico', 'image/x-icon'],\n ['ics', 'text/calendar'],\n ['idc', 'text/plain'],\n ['ief', 'image/ief'],\n ['iefs', 'image/ief'],\n ['ifm', 'application/vnd.shana.informed.formdata'],\n ['iges', ['application/iges', 'model/iges']],\n ['igl', 'application/vnd.igloader'],\n ['igm', 'application/vnd.insors.igm'],\n ['igs', ['application/iges', 'model/iges']],\n ['igx', 'application/vnd.micrografx.igx'],\n ['iif', 'application/vnd.shana.informed.interchange'],\n ['iii', 'application/x-iphone'],\n ['ima', 'application/x-ima'],\n ['imap', 'application/x-httpd-imap'],\n ['imp', 'application/vnd.accpac.simply.imp'],\n ['ims', 'application/vnd.ms-ims'],\n ['inf', 'application/inf'],\n ['ins', ['application/x-internet-signup', 'application/x-internett-signup']],\n ['ip', 'application/x-ip2'],\n ['ipfix', 'application/ipfix'],\n ['ipk', 'application/vnd.shana.informed.package'],\n ['irm', 'application/vnd.ibm.rights-management'],\n ['irp', 'application/vnd.irepository.package+xml'],\n ['isp', 'application/x-internet-signup'],\n ['isu', 'video/x-isvideo'],\n ['it', 'audio/it'],\n ['itp', 'application/vnd.shana.informed.formtemplate'],\n ['iv', 'application/x-inventor'],\n ['ivp', 'application/vnd.immervision-ivp'],\n ['ivr', 'i-world/i-vrml'],\n ['ivu', 'application/vnd.immervision-ivu'],\n ['ivy', 'application/x-livescreen'],\n ['jad', 'text/vnd.sun.j2me.app-descriptor'],\n ['jam', ['application/vnd.jam', 'audio/x-jam']],\n ['jar', 'application/java-archive'],\n ['jav', ['text/plain', 'text/x-java-source']],\n ['java', ['text/plain', 'text/x-java-source,java', 'text/x-java-source']],\n ['jcm', 'application/x-java-commerce'],\n ['jfif', ['image/pipeg', 'image/jpeg', 'image/pjpeg']],\n ['jfif-tbnl', 'image/jpeg'],\n ['jisp', 'application/vnd.jisp'],\n ['jlt', 'application/vnd.hp-jlyt'],\n ['jnlp', 'application/x-java-jnlp-file'],\n ['joda', 'application/vnd.joost.joda-archive'],\n ['jpe', ['image/jpeg', 'image/pjpeg']],\n ['jpeg', ['image/jpeg', 'image/pjpeg']],\n ['jpg', ['image/jpeg', 'image/pjpeg']],\n ['jpgv', 'video/jpeg'],\n ['jpm', 'video/jpm'],\n ['jps', 'image/x-jps'],\n ['js', ['application/javascript', 'application/ecmascript', 'text/javascript', 'text/ecmascript', 'application/x-javascript']],\n ['json', 'application/json'],\n ['jut', 'image/jutvision'],\n ['kar', ['audio/midi', 'music/x-karaoke']],\n ['karbon', 'application/vnd.kde.karbon'],\n ['kfo', 'application/vnd.kde.kformula'],\n ['kia', 'application/vnd.kidspiration'],\n ['kml', 'application/vnd.google-earth.kml+xml'],\n ['kmz', 'application/vnd.google-earth.kmz'],\n ['kne', 'application/vnd.kinar'],\n ['kon', 'application/vnd.kde.kontour'],\n ['kpr', 'application/vnd.kde.kpresenter'],\n ['ksh', ['application/x-ksh', 'text/x-script.ksh']],\n ['ksp', 'application/vnd.kde.kspread'],\n ['ktx', 'image/ktx'],\n ['ktz', 'application/vnd.kahootz'],\n ['kwd', 'application/vnd.kde.kword'],\n ['la', ['audio/nspaudio', 'audio/x-nspaudio']],\n ['lam', 'audio/x-liveaudio'],\n ['lasxml', 'application/vnd.las.las+xml'],\n ['latex', 'application/x-latex'],\n ['lbd', 'application/vnd.llamagraphics.life-balance.desktop'],\n ['lbe', 'application/vnd.llamagraphics.life-balance.exchange+xml'],\n ['les', 'application/vnd.hhe.lesson-player'],\n ['lha', ['application/octet-stream', 'application/lha', 'application/x-lha']],\n ['lhx', 'application/octet-stream'],\n ['link66', 'application/vnd.route66.link66+xml'],\n ['list', 'text/plain'],\n ['lma', ['audio/nspaudio', 'audio/x-nspaudio']],\n ['log', 'text/plain'],\n ['lrm', 'application/vnd.ms-lrm'],\n ['lsf', 'video/x-la-asf'],\n ['lsp', ['application/x-lisp', 'text/x-script.lisp']],\n ['lst', 'text/plain'],\n ['lsx', ['video/x-la-asf', 'text/x-la-asf']],\n ['ltf', 'application/vnd.frogans.ltf'],\n ['ltx', 'application/x-latex'],\n ['lvp', 'audio/vnd.lucent.voice'],\n ['lwp', 'application/vnd.lotus-wordpro'],\n ['lzh', ['application/octet-stream', 'application/x-lzh']],\n ['lzx', ['application/lzx', 'application/octet-stream', 'application/x-lzx']],\n ['m', ['text/plain', 'text/x-m']],\n ['m13', 'application/x-msmediaview'],\n ['m14', 'application/x-msmediaview'],\n ['m1v', 'video/mpeg'],\n ['m21', 'application/mp21'],\n ['m2a', 'audio/mpeg'],\n ['m2v', 'video/mpeg'],\n ['m3u', ['audio/x-mpegurl', 'audio/x-mpequrl']],\n ['m3u8', 'application/vnd.apple.mpegurl'],\n ['m4v', 'video/x-m4v'],\n ['ma', 'application/mathematica'],\n ['mads', 'application/mads+xml'],\n ['mag', 'application/vnd.ecowin.chart'],\n ['man', 'application/x-troff-man'],\n ['map', 'application/x-navimap'],\n ['mar', 'text/plain'],\n ['mathml', 'application/mathml+xml'],\n ['mbd', 'application/mbedlet'],\n ['mbk', 'application/vnd.mobius.mbk'],\n ['mbox', 'application/mbox'],\n ['mc$', 'application/x-magic-cap-package-1.0'],\n ['mc1', 'application/vnd.medcalcdata'],\n ['mcd', ['application/mcad', 'application/vnd.mcd', 'application/x-mathcad']],\n ['mcf', ['image/vasa', 'text/mcf']],\n ['mcp', 'application/netmc'],\n ['mcurl', 'text/vnd.curl.mcurl'],\n ['mdb', 'application/x-msaccess'],\n ['mdi', 'image/vnd.ms-modi'],\n ['me', 'application/x-troff-me'],\n ['meta4', 'application/metalink4+xml'],\n ['mets', 'application/mets+xml'],\n ['mfm', 'application/vnd.mfmp'],\n ['mgp', 'application/vnd.osgeo.mapguide.package'],\n ['mgz', 'application/vnd.proteus.magazine'],\n ['mht', 'message/rfc822'],\n ['mhtml', 'message/rfc822'],\n ['mid', ['audio/mid', 'audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],\n ['midi', ['audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],\n ['mif', ['application/vnd.mif', 'application/x-mif', 'application/x-frame']],\n ['mime', ['message/rfc822', 'www/mime']],\n ['mj2', 'video/mj2'],\n ['mjf', 'audio/x-vnd.audioexplosion.mjuicemediafile'],\n ['mjpg', 'video/x-motion-jpeg'],\n ['mlp', 'application/vnd.dolby.mlp'],\n ['mm', ['application/base64', 'application/x-meme']],\n ['mmd', 'application/vnd.chipnuts.karaoke-mmd'],\n ['mme', 'application/base64'],\n ['mmf', 'application/vnd.smaf'],\n ['mmr', 'image/vnd.fujixerox.edmics-mmr'],\n ['mny', 'application/x-msmoney'],\n ['mod', ['audio/mod', 'audio/x-mod']],\n ['mods', 'application/mods+xml'],\n ['moov', 'video/quicktime'],\n ['mov', 'video/quicktime'],\n ['movie', 'video/x-sgi-movie'],\n ['mp2', ['video/mpeg', 'audio/mpeg', 'video/x-mpeg', 'audio/x-mpeg', 'video/x-mpeq2a']],\n ['mp3', ['audio/mpeg', 'audio/mpeg3', 'video/mpeg', 'audio/x-mpeg-3', 'video/x-mpeg']],\n ['mp4', ['video/mp4', 'application/mp4']],\n ['mp4a', 'audio/mp4'],\n ['mpa', ['video/mpeg', 'audio/mpeg']],\n ['mpc', ['application/vnd.mophun.certificate', 'application/x-project']],\n ['mpe', 'video/mpeg'],\n ['mpeg', 'video/mpeg'],\n ['mpg', ['video/mpeg', 'audio/mpeg']],\n ['mpga', 'audio/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['mpm', 'application/vnd.blueice.multipass'],\n ['mpn', 'application/vnd.mophun.application'],\n ['mpp', 'application/vnd.ms-project'],\n ['mpt', 'application/x-project'],\n ['mpv', 'application/x-project'],\n ['mpv2', 'video/mpeg'],\n ['mpx', 'application/x-project'],\n ['mpy', 'application/vnd.ibm.minipay'],\n ['mqy', 'application/vnd.mobius.mqy'],\n ['mrc', 'application/marc'],\n ['mrcx', 'application/marcxml+xml'],\n ['ms', 'application/x-troff-ms'],\n ['mscml', 'application/mediaservercontrol+xml'],\n ['mseq', 'application/vnd.mseq'],\n ['msf', 'application/vnd.epson.msf'],\n ['msg', 'application/vnd.ms-outlook'],\n ['msh', 'model/mesh'],\n ['msl', 'application/vnd.mobius.msl'],\n ['msty', 'application/vnd.muvee.style'],\n ['mts', 'model/vnd.mts'],\n ['mus', 'application/vnd.musician'],\n ['musicxml', 'application/vnd.recordare.musicxml+xml'],\n ['mv', 'video/x-sgi-movie'],\n ['mvb', 'application/x-msmediaview'],\n ['mwf', 'application/vnd.mfer'],\n ['mxf', 'application/mxf'],\n ['mxl', 'application/vnd.recordare.musicxml'],\n ['mxml', 'application/xv+xml'],\n ['mxs', 'application/vnd.triscape.mxs'],\n ['mxu', 'video/vnd.mpegurl'],\n ['my', 'audio/make'],\n ['mzz', 'application/x-vnd.audioexplosion.mzz'],\n ['n-gage', 'application/vnd.nokia.n-gage.symbian.install'],\n ['n3', 'text/n3'],\n ['nap', 'image/naplps'],\n ['naplps', 'image/naplps'],\n ['nbp', 'application/vnd.wolfram.player'],\n ['nc', 'application/x-netcdf'],\n ['ncm', 'application/vnd.nokia.configuration-message'],\n ['ncx', 'application/x-dtbncx+xml'],\n ['ngdat', 'application/vnd.nokia.n-gage.data'],\n ['nif', 'image/x-niff'],\n ['niff', 'image/x-niff'],\n ['nix', 'application/x-mix-transfer'],\n ['nlu', 'application/vnd.neurolanguage.nlu'],\n ['nml', 'application/vnd.enliven'],\n ['nnd', 'application/vnd.noblenet-directory'],\n ['nns', 'application/vnd.noblenet-sealer'],\n ['nnw', 'application/vnd.noblenet-web'],\n ['npx', 'image/vnd.net-fpx'],\n ['nsc', 'application/x-conference'],\n ['nsf', 'application/vnd.lotus-notes'],\n ['nvd', 'application/x-navidoc'],\n ['nws', 'message/rfc822'],\n ['o', 'application/octet-stream'],\n ['oa2', 'application/vnd.fujitsu.oasys2'],\n ['oa3', 'application/vnd.fujitsu.oasys3'],\n ['oas', 'application/vnd.fujitsu.oasys'],\n ['obd', 'application/x-msbinder'],\n ['oda', 'application/oda'],\n ['odb', 'application/vnd.oasis.opendocument.database'],\n ['odc', 'application/vnd.oasis.opendocument.chart'],\n ['odf', 'application/vnd.oasis.opendocument.formula'],\n ['odft', 'application/vnd.oasis.opendocument.formula-template'],\n ['odg', 'application/vnd.oasis.opendocument.graphics'],\n ['odi', 'application/vnd.oasis.opendocument.image'],\n ['odm', 'application/vnd.oasis.opendocument.text-master'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['omc', 'application/x-omc'],\n ['omcd', 'application/x-omcdatamaker'],\n ['omcr', 'application/x-omcregerator'],\n ['onetoc', 'application/onenote'],\n ['opf', 'application/oebps-package+xml'],\n ['org', 'application/vnd.lotus-organizer'],\n ['osf', 'application/vnd.yamaha.openscoreformat'],\n ['osfpvg', 'application/vnd.yamaha.openscoreformat.osfpvg+xml'],\n ['otc', 'application/vnd.oasis.opendocument.chart-template'],\n ['otf', 'application/x-font-otf'],\n ['otg', 'application/vnd.oasis.opendocument.graphics-template'],\n ['oth', 'application/vnd.oasis.opendocument.text-web'],\n ['oti', 'application/vnd.oasis.opendocument.image-template'],\n ['otp', 'application/vnd.oasis.opendocument.presentation-template'],\n ['ots', 'application/vnd.oasis.opendocument.spreadsheet-template'],\n ['ott', 'application/vnd.oasis.opendocument.text-template'],\n ['oxt', 'application/vnd.openofficeorg.extension'],\n ['p', 'text/x-pascal'],\n ['p10', ['application/pkcs10', 'application/x-pkcs10']],\n ['p12', ['application/pkcs-12', 'application/x-pkcs12']],\n ['p7a', 'application/x-pkcs7-signature'],\n ['p7b', 'application/x-pkcs7-certificates'],\n ['p7c', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],\n ['p7m', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],\n ['p7r', 'application/x-pkcs7-certreqresp'],\n ['p7s', ['application/pkcs7-signature', 'application/x-pkcs7-signature']],\n ['p8', 'application/pkcs8'],\n ['par', 'text/plain-bas'],\n ['part', 'application/pro_eng'],\n ['pas', 'text/pascal'],\n ['paw', 'application/vnd.pawaafile'],\n ['pbd', 'application/vnd.powerbuilder6'],\n ['pbm', 'image/x-portable-bitmap'],\n ['pcf', 'application/x-font-pcf'],\n ['pcl', ['application/vnd.hp-pcl', 'application/x-pcl']],\n ['pclxl', 'application/vnd.hp-pclxl'],\n ['pct', 'image/x-pict'],\n ['pcurl', 'application/vnd.curl.pcurl'],\n ['pcx', 'image/x-pcx'],\n ['pdb', ['application/vnd.palm', 'chemical/x-pdb']],\n ['pdf', 'application/pdf'],\n ['pfa', 'application/x-font-type1'],\n ['pfr', 'application/font-tdpfr'],\n ['pfunk', ['audio/make', 'audio/make.my.funk']],\n ['pfx', 'application/x-pkcs12'],\n ['pgm', ['image/x-portable-graymap', 'image/x-portable-greymap']],\n ['pgn', 'application/x-chess-pgn'],\n ['pgp', 'application/pgp-signature'],\n ['pic', ['image/pict', 'image/x-pict']],\n ['pict', 'image/pict'],\n ['pkg', 'application/x-newton-compatible-pkg'],\n ['pki', 'application/pkixcmp'],\n ['pkipath', 'application/pkix-pkipath'],\n ['pko', ['application/ynd.ms-pkipko', 'application/vnd.ms-pki.pko']],\n ['pl', ['text/plain', 'text/x-script.perl']],\n ['plb', 'application/vnd.3gpp.pic-bw-large'],\n ['plc', 'application/vnd.mobius.plc'],\n ['plf', 'application/vnd.pocketlearn'],\n ['pls', 'application/pls+xml'],\n ['plx', 'application/x-pixclscript'],\n ['pm', ['text/x-script.perl-module', 'image/x-xpixmap']],\n ['pm4', 'application/x-pagemaker'],\n ['pm5', 'application/x-pagemaker'],\n ['pma', 'application/x-perfmon'],\n ['pmc', 'application/x-perfmon'],\n ['pml', ['application/vnd.ctc-posml', 'application/x-perfmon']],\n ['pmr', 'application/x-perfmon'],\n ['pmw', 'application/x-perfmon'],\n ['png', 'image/png'],\n ['pnm', ['application/x-portable-anymap', 'image/x-portable-anymap']],\n ['portpkg', 'application/vnd.macports.portpkg'],\n ['pot', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],\n ['potm', 'application/vnd.ms-powerpoint.template.macroenabled.12'],\n ['potx', 'application/vnd.openxmlformats-officedocument.presentationml.template'],\n ['pov', 'model/x-pov'],\n ['ppa', 'application/vnd.ms-powerpoint'],\n ['ppam', 'application/vnd.ms-powerpoint.addin.macroenabled.12'],\n ['ppd', 'application/vnd.cups-ppd'],\n ['ppm', 'image/x-portable-pixmap'],\n ['pps', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],\n ['ppsm', 'application/vnd.ms-powerpoint.slideshow.macroenabled.12'],\n ['ppsx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow'],\n ['ppt', ['application/vnd.ms-powerpoint', 'application/mspowerpoint', 'application/powerpoint', 'application/x-mspowerpoint']],\n ['pptm', 'application/vnd.ms-powerpoint.presentation.macroenabled.12'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['ppz', 'application/mspowerpoint'],\n ['prc', 'application/x-mobipocket-ebook'],\n ['pre', ['application/vnd.lotus-freelance', 'application/x-freelance']],\n ['prf', 'application/pics-rules'],\n ['prt', 'application/pro_eng'],\n ['ps', 'application/postscript'],\n ['psb', 'application/vnd.3gpp.pic-bw-small'],\n ['psd', ['application/octet-stream', 'image/vnd.adobe.photoshop']],\n ['psf', 'application/x-font-linux-psf'],\n ['pskcxml', 'application/pskc+xml'],\n ['ptid', 'application/vnd.pvi.ptid1'],\n ['pub', 'application/x-mspublisher'],\n ['pvb', 'application/vnd.3gpp.pic-bw-var'],\n ['pvu', 'paleovu/x-pv'],\n ['pwn', 'application/vnd.3m.post-it-notes'],\n ['pwz', 'application/vnd.ms-powerpoint'],\n ['py', 'text/x-script.phyton'],\n ['pya', 'audio/vnd.ms-playready.media.pya'],\n ['pyc', 'application/x-bytecode.python'],\n ['pyv', 'video/vnd.ms-playready.media.pyv'],\n ['qam', 'application/vnd.epson.quickanime'],\n ['qbo', 'application/vnd.intu.qbo'],\n ['qcp', 'audio/vnd.qcelp'],\n ['qd3', 'x-world/x-3dmf'],\n ['qd3d', 'x-world/x-3dmf'],\n ['qfx', 'application/vnd.intu.qfx'],\n ['qif', 'image/x-quicktime'],\n ['qps', 'application/vnd.publishare-delta-tree'],\n ['qt', 'video/quicktime'],\n ['qtc', 'video/x-qtc'],\n ['qti', 'image/x-quicktime'],\n ['qtif', 'image/x-quicktime'],\n ['qxd', 'application/vnd.quark.quarkxpress'],\n ['ra', ['audio/x-realaudio', 'audio/x-pn-realaudio', 'audio/x-pn-realaudio-plugin']],\n ['ram', 'audio/x-pn-realaudio'],\n ['rar', 'application/x-rar-compressed'],\n ['ras', ['image/cmu-raster', 'application/x-cmu-raster', 'image/x-cmu-raster']],\n ['rast', 'image/cmu-raster'],\n ['rcprofile', 'application/vnd.ipunplugged.rcprofile'],\n ['rdf', 'application/rdf+xml'],\n ['rdz', 'application/vnd.data-vision.rdz'],\n ['rep', 'application/vnd.businessobjects'],\n ['res', 'application/x-dtbresource+xml'],\n ['rexx', 'text/x-script.rexx'],\n ['rf', 'image/vnd.rn-realflash'],\n ['rgb', 'image/x-rgb'],\n ['rif', 'application/reginfo+xml'],\n ['rip', 'audio/vnd.rip'],\n ['rl', 'application/resource-lists+xml'],\n ['rlc', 'image/vnd.fujixerox.edmics-rlc'],\n ['rld', 'application/resource-lists-diff+xml'],\n ['rm', ['application/vnd.rn-realmedia', 'audio/x-pn-realaudio']],\n ['rmi', 'audio/mid'],\n ['rmm', 'audio/x-pn-realaudio'],\n ['rmp', ['audio/x-pn-realaudio-plugin', 'audio/x-pn-realaudio']],\n ['rms', 'application/vnd.jcp.javame.midlet-rms'],\n ['rnc', 'application/relax-ng-compact-syntax'],\n ['rng', ['application/ringing-tones', 'application/vnd.nokia.ringing-tone']],\n ['rnx', 'application/vnd.rn-realplayer'],\n ['roff', 'application/x-troff'],\n ['rp', 'image/vnd.rn-realpix'],\n ['rp9', 'application/vnd.cloanto.rp9'],\n ['rpm', 'audio/x-pn-realaudio-plugin'],\n ['rpss', 'application/vnd.nokia.radio-presets'],\n ['rpst', 'application/vnd.nokia.radio-preset'],\n ['rq', 'application/sparql-query'],\n ['rs', 'application/rls-services+xml'],\n ['rsd', 'application/rsd+xml'],\n ['rt', ['text/richtext', 'text/vnd.rn-realtext']],\n ['rtf', ['application/rtf', 'text/richtext', 'application/x-rtf']],\n ['rtx', ['text/richtext', 'application/rtf']],\n ['rv', 'video/vnd.rn-realvideo'],\n ['s', 'text/x-asm'],\n ['s3m', 'audio/s3m'],\n ['saf', 'application/vnd.yamaha.smaf-audio'],\n ['saveme', 'application/octet-stream'],\n ['sbk', 'application/x-tbook'],\n ['sbml', 'application/sbml+xml'],\n ['sc', 'application/vnd.ibm.secure-container'],\n ['scd', 'application/x-msschedule'],\n ['scm', ['application/vnd.lotus-screencam', 'video/x-scm', 'text/x-script.guile', 'application/x-lotusscreencam', 'text/x-script.scheme']],\n ['scq', 'application/scvp-cv-request'],\n ['scs', 'application/scvp-cv-response'],\n ['sct', 'text/scriptlet'],\n ['scurl', 'text/vnd.curl.scurl'],\n ['sda', 'application/vnd.stardivision.draw'],\n ['sdc', 'application/vnd.stardivision.calc'],\n ['sdd', 'application/vnd.stardivision.impress'],\n ['sdkm', 'application/vnd.solent.sdkm+xml'],\n ['sdml', 'text/plain'],\n ['sdp', ['application/sdp', 'application/x-sdp']],\n ['sdr', 'application/sounder'],\n ['sdw', 'application/vnd.stardivision.writer'],\n ['sea', ['application/sea', 'application/x-sea']],\n ['see', 'application/vnd.seemail'],\n ['seed', 'application/vnd.fdsn.seed'],\n ['sema', 'application/vnd.sema'],\n ['semd', 'application/vnd.semd'],\n ['semf', 'application/vnd.semf'],\n ['ser', 'application/java-serialized-object'],\n ['set', 'application/set'],\n ['setpay', 'application/set-payment-initiation'],\n ['setreg', 'application/set-registration-initiation'],\n ['sfd-hdstx', 'application/vnd.hydrostatix.sof-data'],\n ['sfs', 'application/vnd.spotfire.sfs'],\n ['sgl', 'application/vnd.stardivision.writer-global'],\n ['sgm', ['text/sgml', 'text/x-sgml']],\n ['sgml', ['text/sgml', 'text/x-sgml']],\n ['sh', ['application/x-shar', 'application/x-bsh', 'application/x-sh', 'text/x-script.sh']],\n ['shar', ['application/x-bsh', 'application/x-shar']],\n ['shf', 'application/shf+xml'],\n ['shtml', ['text/html', 'text/x-server-parsed-html']],\n ['sid', 'audio/x-psid'],\n ['sis', 'application/vnd.symbian.install'],\n ['sit', ['application/x-stuffit', 'application/x-sit']],\n ['sitx', 'application/x-stuffitx'],\n ['skd', 'application/x-koan'],\n ['skm', 'application/x-koan'],\n ['skp', ['application/vnd.koan', 'application/x-koan']],\n ['skt', 'application/x-koan'],\n ['sl', 'application/x-seelogo'],\n ['sldm', 'application/vnd.ms-powerpoint.slide.macroenabled.12'],\n ['sldx', 'application/vnd.openxmlformats-officedocument.presentationml.slide'],\n ['slt', 'application/vnd.epson.salt'],\n ['sm', 'application/vnd.stepmania.stepchart'],\n ['smf', 'application/vnd.stardivision.math'],\n ['smi', ['application/smil', 'application/smil+xml']],\n ['smil', 'application/smil'],\n ['snd', ['audio/basic', 'audio/x-adpcm']],\n ['snf', 'application/x-font-snf'],\n ['sol', 'application/solids'],\n ['spc', ['text/x-speech', 'application/x-pkcs7-certificates']],\n ['spf', 'application/vnd.yamaha.smaf-phrase'],\n ['spl', ['application/futuresplash', 'application/x-futuresplash']],\n ['spot', 'text/vnd.in3d.spot'],\n ['spp', 'application/scvp-vp-response'],\n ['spq', 'application/scvp-vp-request'],\n ['spr', 'application/x-sprite'],\n ['sprite', 'application/x-sprite'],\n ['src', 'application/x-wais-source'],\n ['sru', 'application/sru+xml'],\n ['srx', 'application/sparql-results+xml'],\n ['sse', 'application/vnd.kodak-descriptor'],\n ['ssf', 'application/vnd.epson.ssf'],\n ['ssi', 'text/x-server-parsed-html'],\n ['ssm', 'application/streamingmedia'],\n ['ssml', 'application/ssml+xml'],\n ['sst', ['application/vnd.ms-pkicertstore', 'application/vnd.ms-pki.certstore']],\n ['st', 'application/vnd.sailingtracker.track'],\n ['stc', 'application/vnd.sun.xml.calc.template'],\n ['std', 'application/vnd.sun.xml.draw.template'],\n ['step', 'application/step'],\n ['stf', 'application/vnd.wt.stf'],\n ['sti', 'application/vnd.sun.xml.impress.template'],\n ['stk', 'application/hyperstudio'],\n ['stl', ['application/vnd.ms-pkistl', 'application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle']],\n ['stm', 'text/html'],\n ['stp', 'application/step'],\n ['str', 'application/vnd.pg.format'],\n ['stw', 'application/vnd.sun.xml.writer.template'],\n ['sub', 'image/vnd.dvb.subtitle'],\n ['sus', 'application/vnd.sus-calendar'],\n ['sv4cpio', 'application/x-sv4cpio'],\n ['sv4crc', 'application/x-sv4crc'],\n ['svc', 'application/vnd.dvb.service'],\n ['svd', 'application/vnd.svd'],\n ['svf', ['image/vnd.dwg', 'image/x-dwg']],\n ['svg', 'image/svg+xml'],\n ['svr', ['x-world/x-svr', 'application/x-world']],\n ['swf', 'application/x-shockwave-flash'],\n ['swi', 'application/vnd.aristanetworks.swi'],\n ['sxc', 'application/vnd.sun.xml.calc'],\n ['sxd', 'application/vnd.sun.xml.draw'],\n ['sxg', 'application/vnd.sun.xml.writer.global'],\n ['sxi', 'application/vnd.sun.xml.impress'],\n ['sxm', 'application/vnd.sun.xml.math'],\n ['sxw', 'application/vnd.sun.xml.writer'],\n ['t', ['text/troff', 'application/x-troff']],\n ['talk', 'text/x-speech'],\n ['tao', 'application/vnd.tao.intent-module-archive'],\n ['tar', 'application/x-tar'],\n ['tbk', ['application/toolbook', 'application/x-tbook']],\n ['tcap', 'application/vnd.3gpp2.tcap'],\n ['tcl', ['text/x-script.tcl', 'application/x-tcl']],\n ['tcsh', 'text/x-script.tcsh'],\n ['teacher', 'application/vnd.smart.teacher'],\n ['tei', 'application/tei+xml'],\n ['tex', 'application/x-tex'],\n ['texi', 'application/x-texinfo'],\n ['texinfo', 'application/x-texinfo'],\n ['text', ['application/plain', 'text/plain']],\n ['tfi', 'application/thraud+xml'],\n ['tfm', 'application/x-tex-tfm'],\n ['tgz', ['application/gnutar', 'application/x-compressed']],\n ['thmx', 'application/vnd.ms-officetheme'],\n ['tif', ['image/tiff', 'image/x-tiff']],\n ['tiff', ['image/tiff', 'image/x-tiff']],\n ['tmo', 'application/vnd.tmobile-livetv'],\n ['torrent', 'application/x-bittorrent'],\n ['tpl', 'application/vnd.groove-tool-template'],\n ['tpt', 'application/vnd.trid.tpt'],\n ['tr', 'application/x-troff'],\n ['tra', 'application/vnd.trueapp'],\n ['trm', 'application/x-msterminal'],\n ['tsd', 'application/timestamped-data'],\n ['tsi', 'audio/tsp-audio'],\n ['tsp', ['application/dsptype', 'audio/tsplayer']],\n ['tsv', 'text/tab-separated-values'],\n ['ttf', 'application/x-font-ttf'],\n ['ttl', 'text/turtle'],\n ['turbot', 'image/florian'],\n ['twd', 'application/vnd.simtech-mindmapper'],\n ['txd', 'application/vnd.genomatix.tuxedo'],\n ['txf', 'application/vnd.mobius.txf'],\n ['txt', 'text/plain'],\n ['ufd', 'application/vnd.ufdl'],\n ['uil', 'text/x-uil'],\n ['uls', 'text/iuls'],\n ['umj', 'application/vnd.umajin'],\n ['uni', 'text/uri-list'],\n ['unis', 'text/uri-list'],\n ['unityweb', 'application/vnd.unity'],\n ['unv', 'application/i-deas'],\n ['uoml', 'application/vnd.uoml+xml'],\n ['uri', 'text/uri-list'],\n ['uris', 'text/uri-list'],\n ['ustar', ['application/x-ustar', 'multipart/x-ustar']],\n ['utz', 'application/vnd.uiq.theme'],\n ['uu', ['application/octet-stream', 'text/x-uuencode']],\n ['uue', 'text/x-uuencode'],\n ['uva', 'audio/vnd.dece.audio'],\n ['uvh', 'video/vnd.dece.hd'],\n ['uvi', 'image/vnd.dece.graphic'],\n ['uvm', 'video/vnd.dece.mobile'],\n ['uvp', 'video/vnd.dece.pd'],\n ['uvs', 'video/vnd.dece.sd'],\n ['uvu', 'video/vnd.uvvu.mp4'],\n ['uvv', 'video/vnd.dece.video'],\n ['vcd', 'application/x-cdlink'],\n ['vcf', 'text/x-vcard'],\n ['vcg', 'application/vnd.groove-vcard'],\n ['vcs', 'text/x-vcalendar'],\n ['vcx', 'application/vnd.vcx'],\n ['vda', 'application/vda'],\n ['vdo', 'video/vdo'],\n ['vew', 'application/groupwise'],\n ['vis', 'application/vnd.visionary'],\n ['viv', ['video/vivo', 'video/vnd.vivo']],\n ['vivo', ['video/vivo', 'video/vnd.vivo']],\n ['vmd', 'application/vocaltec-media-desc'],\n ['vmf', 'application/vocaltec-media-file'],\n ['voc', ['audio/voc', 'audio/x-voc']],\n ['vos', 'video/vosaic'],\n ['vox', 'audio/voxware'],\n ['vqe', 'audio/x-twinvq-plugin'],\n ['vqf', 'audio/x-twinvq'],\n ['vql', 'audio/x-twinvq-plugin'],\n ['vrml', ['model/vrml', 'x-world/x-vrml', 'application/x-vrml']],\n ['vrt', 'x-world/x-vrt'],\n ['vsd', ['application/vnd.visio', 'application/x-visio']],\n ['vsf', 'application/vnd.vsf'],\n ['vst', 'application/x-visio'],\n ['vsw', 'application/x-visio'],\n ['vtu', 'model/vnd.vtu'],\n ['vxml', 'application/voicexml+xml'],\n ['w60', 'application/wordperfect6.0'],\n ['w61', 'application/wordperfect6.1'],\n ['w6w', 'application/msword'],\n ['wad', 'application/x-doom'],\n ['wav', ['audio/wav', 'audio/x-wav']],\n ['wax', 'audio/x-ms-wax'],\n ['wb1', 'application/x-qpro'],\n ['wbmp', 'image/vnd.wap.wbmp'],\n ['wbs', 'application/vnd.criticaltools.wbs+xml'],\n ['wbxml', 'application/vnd.wap.wbxml'],\n ['wcm', 'application/vnd.ms-works'],\n ['wdb', 'application/vnd.ms-works'],\n ['web', 'application/vnd.xara'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['wg', 'application/vnd.pmi.widget'],\n ['wgt', 'application/widget'],\n ['wiz', 'application/msword'],\n ['wk1', 'application/x-123'],\n ['wks', 'application/vnd.ms-works'],\n ['wm', 'video/x-ms-wm'],\n ['wma', 'audio/x-ms-wma'],\n ['wmd', 'application/x-ms-wmd'],\n ['wmf', ['windows/metafile', 'application/x-msmetafile']],\n ['wml', 'text/vnd.wap.wml'],\n ['wmlc', 'application/vnd.wap.wmlc'],\n ['wmls', 'text/vnd.wap.wmlscript'],\n ['wmlsc', 'application/vnd.wap.wmlscriptc'],\n ['wmv', 'video/x-ms-wmv'],\n ['wmx', 'video/x-ms-wmx'],\n ['wmz', 'application/x-ms-wmz'],\n ['woff', 'application/x-font-woff'],\n ['word', 'application/msword'],\n ['wp', 'application/wordperfect'],\n ['wp5', ['application/wordperfect', 'application/wordperfect6.0']],\n ['wp6', 'application/wordperfect'],\n ['wpd', ['application/wordperfect', 'application/vnd.wordperfect', 'application/x-wpwin']],\n ['wpl', 'application/vnd.ms-wpl'],\n ['wps', 'application/vnd.ms-works'],\n ['wq1', 'application/x-lotus'],\n ['wqd', 'application/vnd.wqd'],\n ['wri', ['application/mswrite', 'application/x-wri', 'application/x-mswrite']],\n ['wrl', ['model/vrml', 'x-world/x-vrml', 'application/x-world']],\n ['wrz', ['model/vrml', 'x-world/x-vrml']],\n ['wsc', 'text/scriplet'],\n ['wsdl', 'application/wsdl+xml'],\n ['wspolicy', 'application/wspolicy+xml'],\n ['wsrc', 'application/x-wais-source'],\n ['wtb', 'application/vnd.webturbo'],\n ['wtk', 'application/x-wintalk'],\n ['wvx', 'video/x-ms-wvx'],\n ['x-png', 'image/png'],\n ['x3d', 'application/vnd.hzn-3d-crossword'],\n ['xaf', 'x-world/x-vrml'],\n ['xap', 'application/x-silverlight-app'],\n ['xar', 'application/vnd.xara'],\n ['xbap', 'application/x-ms-xbap'],\n ['xbd', 'application/vnd.fujixerox.docuworks.binder'],\n ['xbm', ['image/xbm', 'image/x-xbm', 'image/x-xbitmap']],\n ['xdf', 'application/xcap-diff+xml'],\n ['xdm', 'application/vnd.syncml.dm+xml'],\n ['xdp', 'application/vnd.adobe.xdp+xml'],\n ['xdr', 'video/x-amt-demorun'],\n ['xdssc', 'application/dssc+xml'],\n ['xdw', 'application/vnd.fujixerox.docuworks'],\n ['xenc', 'application/xenc+xml'],\n ['xer', 'application/patch-ops-error+xml'],\n ['xfdf', 'application/vnd.adobe.xfdf'],\n ['xfdl', 'application/vnd.xfdl'],\n ['xgz', 'xgl/drawing'],\n ['xhtml', 'application/xhtml+xml'],\n ['xif', 'image/vnd.xiff'],\n ['xl', 'application/excel'],\n ['xla', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xlam', 'application/vnd.ms-excel.addin.macroenabled.12'],\n ['xlb', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],\n ['xlc', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xld', ['application/excel', 'application/x-excel']],\n ['xlk', ['application/excel', 'application/x-excel']],\n ['xll', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],\n ['xlm', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xls', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xlsb', 'application/vnd.ms-excel.sheet.binary.macroenabled.12'],\n ['xlsm', 'application/vnd.ms-excel.sheet.macroenabled.12'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xlt', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xltm', 'application/vnd.ms-excel.template.macroenabled.12'],\n ['xltx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template'],\n ['xlv', ['application/excel', 'application/x-excel']],\n ['xlw', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xm', 'audio/xm'],\n ['xml', ['application/xml', 'text/xml', 'application/atom+xml', 'application/rss+xml']],\n ['xmz', 'xgl/movie'],\n ['xo', 'application/vnd.olpc-sugar'],\n ['xof', 'x-world/x-vrml'],\n ['xop', 'application/xop+xml'],\n ['xpi', 'application/x-xpinstall'],\n ['xpix', 'application/x-vnd.ls-xpix'],\n ['xpm', ['image/xpm', 'image/x-xpixmap']],\n ['xpr', 'application/vnd.is-xpr'],\n ['xps', 'application/vnd.ms-xpsdocument'],\n ['xpw', 'application/vnd.intercon.formnet'],\n ['xslt', 'application/xslt+xml'],\n ['xsm', 'application/vnd.syncml+xml'],\n ['xspf', 'application/xspf+xml'],\n ['xsr', 'video/x-amt-showrun'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['xwd', ['image/x-xwd', 'image/x-xwindowdump']],\n ['xyz', ['chemical/x-xyz', 'chemical/x-pdb']],\n ['yang', 'application/yang'],\n ['yin', 'application/yin+xml'],\n ['z', ['application/x-compressed', 'application/x-compress']],\n ['zaz', 'application/vnd.zzazz.deck+xml'],\n ['zip', ['application/zip', 'multipart/x-zip', 'application/x-zip-compressed', 'application/x-compressed']],\n ['zir', 'application/vnd.zul'],\n ['zmm', 'application/vnd.handheld-entertainment+xml'],\n ['zoo', 'application/octet-stream'],\n ['zsh', 'text/x-script.zsh']\n]);\n\nmodule.exports = {\n detectMimeType(filename) {\n if (!filename) {\n return defaultMimeType;\n }\n\n let parsed = path.parse(filename);\n let extension = (parsed.ext.substr(1) || parsed.name || '').split('?').shift().trim().toLowerCase();\n let value = defaultMimeType;\n\n if (extensions.has(extension)) {\n value = extensions.get(extension);\n }\n\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n },\n\n detectExtension(mimeType) {\n if (!mimeType) {\n return defaultExtension;\n }\n let parts = (mimeType || '').toLowerCase().trim().split('/');\n let rootType = parts.shift().trim();\n let subType = parts.join('/').trim();\n\n if (mimeTypes.has(rootType + '/' + subType)) {\n let value = mimeTypes.get(rootType + '/' + subType);\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n }\n\n switch (rootType) {\n case 'text':\n return 'txt';\n default:\n return 'bin';\n }\n }\n};\n", "/*\n\nCopied from https://github.com/mathiasbynens/punycode.js/blob/ef3505c8abb5143a00d53ce59077c9f7f4b2ac47/punycode.js\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n/* eslint callback-return: 0, no-bitwise: 0, eqeqeq: 0, prefer-arrow-callback: 0, object-shorthand: 0 */\n\n'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n overflow: 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n throw new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n const result = [];\n let length = array.length;\n while (length--) {\n result[length] = callback(array[length]);\n }\n return result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n const parts = domain.split('@');\n let result = '';\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@';\n domain = parts[1];\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n domain = domain.replace(regexSeparators, '\\x2E');\n const labels = domain.split('.');\n const encoded = map(labels, callback).join('.');\n return result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n const output = [];\n let counter = 0;\n const length = string.length;\n while (counter < length) {\n const value = string.charCodeAt(counter++);\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n // It's a high surrogate, and there is a next character.\n const extra = string.charCodeAt(counter++);\n if ((extra & 0xfc00) == 0xdc00) {\n // Low surrogate.\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function (codePoint) {\n if (codePoint >= 0x30 && codePoint < 0x3a) {\n return 26 + (codePoint - 0x30);\n }\n if (codePoint >= 0x41 && codePoint < 0x5b) {\n return codePoint - 0x41;\n }\n if (codePoint >= 0x61 && codePoint < 0x7b) {\n return codePoint - 0x61;\n }\n return base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function (digit, flag) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function (delta, numPoints, firstTime) {\n let k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function (input) {\n // Don't use UCS-2.\n const output = [];\n const inputLength = input.length;\n let i = 0;\n let n = initialN;\n let bias = initialBias;\n\n // Handle the basic code points: let `basic` be the number of input code\n // points before the last delimiter, or `0` if there is none, then copy\n // the first basic code points to the output.\n\n let basic = input.lastIndexOf(delimiter);\n if (basic < 0) {\n basic = 0;\n }\n\n for (let j = 0; j < basic; ++j) {\n // if it's not a basic code point\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: start just after the last delimiter if any basic code\n // points were copied; start at the beginning otherwise.\n\n for (let index = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {\n // `index` is the index of the next character to be consumed.\n // Decode a generalized variable-length integer into `delta`,\n // which gets added to `i`. The overflow checking is easier\n // if we increase `i` as we go, then subtract off its starting\n // value at the end to obtain `delta`.\n const oldi = i;\n for (let w = 1, k = base /* no condition */; ; k += base) {\n if (index >= inputLength) {\n error('invalid-input');\n }\n\n const digit = basicToDigit(input.charCodeAt(index++));\n\n if (digit >= base) {\n error('invalid-input');\n }\n if (digit > floor((maxInt - i) / w)) {\n error('overflow');\n }\n\n i += digit * w;\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\n if (digit < t) {\n break;\n }\n\n const baseMinusT = base - t;\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow');\n }\n\n w *= baseMinusT;\n }\n\n const out = output.length + 1;\n bias = adapt(i - oldi, out, oldi == 0);\n\n // `i` was supposed to wrap around from `out` to `0`,\n // incrementing `n` each time, so we'll fix that now:\n if (floor(i / out) > maxInt - n) {\n error('overflow');\n }\n\n n += floor(i / out);\n i %= out;\n\n // Insert `n` at position `i` of the output.\n output.splice(i++, 0, n);\n }\n\n return String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function (input) {\n const output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n const inputLength = input.length;\n\n // Initialize the state.\n let n = initialN;\n let delta = 0;\n let bias = initialBias;\n\n // Handle the basic code points.\n for (const currentValue of input) {\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n const basicLength = output.length;\n let handledCPCount = basicLength;\n\n // `handledCPCount` is the number of code points that have been handled;\n // `basicLength` is the number of basic code points.\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next\n // larger one:\n let m = maxInt;\n for (const currentValue of input) {\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n // but guard against overflow.\n const handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow');\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (const currentValue of input) {\n if (currentValue < n && ++delta > maxInt) {\n error('overflow');\n }\n if (currentValue === n) {\n // Represent delta as a generalized variable-length integer.\n let q = delta;\n for (let k = base /* no condition */; ; k += base) {\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) {\n break;\n }\n const qMinusT = q - t;\n const baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function (input) {\n return mapDomain(input, function (string) {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n });\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function (input) {\n return mapDomain(input, function (string) {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n });\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n /**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n version: '2.3.1',\n /**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode\n * @type Object\n */\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode\n },\n decode: decode,\n encode: encode,\n toASCII: toASCII,\n toUnicode: toUnicode\n};\n\nmodule.exports = punycode;\n", "'use strict';\n\nconst Transform = require('stream').Transform;\n\n/**\n * Encodes a Buffer into a base64 encoded string\n *\n * @param {Buffer} buffer Buffer to convert\n * @returns {String} base64 encoded string\n */\nfunction encode(buffer) {\n if (typeof buffer === 'string') {\n buffer = Buffer.from(buffer, 'utf-8');\n }\n\n return buffer.toString('base64');\n}\n\n/**\n * Adds soft line breaks to a base64 string\n *\n * @param {String} str base64 encoded string that might need line wrapping\n * @param {Number} [lineLength=76] Maximum allowed length for a line\n * @returns {String} Soft-wrapped base64 encoded string\n */\nfunction wrap(str, lineLength) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n if (str.length <= lineLength) {\n return str;\n }\n\n let result = [];\n let pos = 0;\n let chunkLength = lineLength * 1024;\n while (pos < str.length) {\n let wrappedLines = str\n .substr(pos, chunkLength)\n .replace(new RegExp('.{' + lineLength + '}', 'g'), '$&\\r\\n')\n .trim();\n result.push(wrappedLines);\n pos += chunkLength;\n }\n\n return result.join('\\r\\n').trim();\n}\n\n/**\n * Creates a transform stream for encoding data to base64 encoding\n *\n * @constructor\n * @param {Object} options Stream options\n * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping\n */\nclass Encoder extends Transform {\n constructor(options) {\n super();\n // init Transform\n this.options = options || {};\n\n if (this.options.lineLength !== false) {\n this.options.lineLength = this.options.lineLength || 76;\n }\n\n this._curLine = '';\n this._remainingBytes = false;\n\n this.inputBytes = 0;\n this.outputBytes = 0;\n }\n\n _transform(chunk, encoding, done) {\n if (encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return setImmediate(done);\n }\n\n this.inputBytes += chunk.length;\n\n if (this._remainingBytes && this._remainingBytes.length) {\n chunk = Buffer.concat([this._remainingBytes, chunk], this._remainingBytes.length + chunk.length);\n this._remainingBytes = false;\n }\n\n if (chunk.length % 3) {\n this._remainingBytes = chunk.slice(chunk.length - (chunk.length % 3));\n chunk = chunk.slice(0, chunk.length - (chunk.length % 3));\n } else {\n this._remainingBytes = false;\n }\n\n let b64 = this._curLine + encode(chunk);\n\n if (this.options.lineLength) {\n b64 = wrap(b64, this.options.lineLength);\n\n // remove last line as it is still most probably incomplete\n let lastLF = b64.lastIndexOf('\\n');\n if (lastLF < 0) {\n this._curLine = b64;\n b64 = '';\n } else if (lastLF === b64.length - 1) {\n this._curLine = '';\n } else {\n this._curLine = b64.substr(lastLF + 1);\n b64 = b64.substr(0, lastLF + 1);\n }\n }\n\n if (b64) {\n this.outputBytes += b64.length;\n this.push(Buffer.from(b64, 'ascii'));\n }\n\n setImmediate(done);\n }\n\n _flush(done) {\n if (this._remainingBytes && this._remainingBytes.length) {\n this._curLine += encode(this._remainingBytes);\n }\n\n if (this._curLine) {\n this._curLine = wrap(this._curLine, this.options.lineLength);\n this.outputBytes += this._curLine.length;\n this.push(this._curLine, 'ascii');\n this._curLine = '';\n }\n done();\n }\n}\n\n// expose to the world\nmodule.exports = {\n encode,\n wrap,\n Encoder\n};\n", "'use strict';\n\nconst Transform = require('stream').Transform;\n\n/**\n * Encodes a Buffer into a Quoted-Printable encoded string\n *\n * @param {Buffer} buffer Buffer to convert\n * @returns {String} Quoted-Printable encoded string\n */\nfunction encode(buffer) {\n if (typeof buffer === 'string') {\n buffer = Buffer.from(buffer, 'utf-8');\n }\n\n // usable characters that do not need encoding\n let ranges = [\n // https://tools.ietf.org/html/rfc2045#section-6.7\n [0x09], // <TAB>\n [0x0a], // <LF>\n [0x0d], // <CR>\n [0x20, 0x3c], // <SP>!\"#$%&'()*+,-./0123456789:;\n [0x3e, 0x7e] // >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}\n ];\n let result = '';\n let ord;\n\n for (let i = 0, len = buffer.length; i < len; i++) {\n ord = buffer[i];\n // if the char is in allowed range, then keep as is, unless it is a WS in the end of a line\n if (checkRanges(ord, ranges) && !((ord === 0x20 || ord === 0x09) && (i === len - 1 || buffer[i + 1] === 0x0a || buffer[i + 1] === 0x0d))) {\n result += String.fromCharCode(ord);\n continue;\n }\n result += '=' + (ord < 0x10 ? '0' : '') + ord.toString(16).toUpperCase();\n }\n\n return result;\n}\n\n/**\n * Adds soft line breaks to a Quoted-Printable string\n *\n * @param {String} str Quoted-Printable encoded string that might need line wrapping\n * @param {Number} [lineLength=76] Maximum allowed length for a line\n * @returns {String} Soft-wrapped Quoted-Printable encoded string\n */\nfunction wrap(str, lineLength) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n if (str.length <= lineLength) {\n return str;\n }\n\n let pos = 0;\n let len = str.length;\n let match, code, line;\n let lineMargin = Math.floor(lineLength / 3);\n let result = '';\n\n // insert soft linebreaks where needed\n while (pos < len) {\n line = str.substr(pos, lineLength);\n if ((match = line.match(/\\r\\n/))) {\n line = line.substr(0, match.index + match[0].length);\n result += line;\n pos += line.length;\n continue;\n }\n\n if (line.substr(-1) === '\\n') {\n // nothing to change here\n result += line;\n pos += line.length;\n continue;\n } else if ((match = line.substr(-lineMargin).match(/\\n.*?$/))) {\n // truncate to nearest line break\n line = line.substr(0, line.length - (match[0].length - 1));\n result += line;\n pos += line.length;\n continue;\n } else if (line.length > lineLength - lineMargin && (match = line.substr(-lineMargin).match(/[ \\t.,!?][^ \\t.,!?]*$/))) {\n // truncate to nearest space\n line = line.substr(0, line.length - (match[0].length - 1));\n } else if (line.match(/[=][\\da-f]{0,2}$/i)) {\n // push incomplete encoding sequences to the next line\n if ((match = line.match(/[=][\\da-f]{0,1}$/i))) {\n line = line.substr(0, line.length - match[0].length);\n }\n\n // ensure that utf-8 sequences are not split\n while (line.length > 3 && line.length < len - pos && !line.match(/^(?:=[\\da-f]{2}){1,4}$/i) && (match = line.match(/[=][\\da-f]{2}$/gi))) {\n code = parseInt(match[0].substr(1, 2), 16);\n if (code < 128) {\n break;\n }\n\n line = line.substr(0, line.length - 3);\n\n if (code >= 0xc0) {\n break;\n }\n }\n }\n\n if (pos + line.length < len && line.substr(-1) !== '\\n') {\n if (line.length === lineLength && line.match(/[=][\\da-f]{2}$/i)) {\n line = line.substr(0, line.length - 3);\n } else if (line.length === lineLength) {\n line = line.substr(0, line.length - 1);\n }\n pos += line.length;\n line += '=\\r\\n';\n } else {\n pos += line.length;\n }\n\n result += line;\n }\n\n return result;\n}\n\n/**\n * Helper function to check if a number is inside provided ranges\n *\n * @param {Number} nr Number to check for\n * @param {Array} ranges An Array of allowed values\n * @returns {Boolean} True if the value was found inside allowed ranges, false otherwise\n */\nfunction checkRanges(nr, ranges) {\n for (let i = ranges.length - 1; i >= 0; i--) {\n if (!ranges[i].length) {\n continue;\n }\n if (ranges[i].length === 1 && nr === ranges[i][0]) {\n return true;\n }\n if (ranges[i].length === 2 && nr >= ranges[i][0] && nr <= ranges[i][1]) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Creates a transform stream for encoding data to Quoted-Printable encoding\n *\n * @constructor\n * @param {Object} options Stream options\n * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping\n */\nclass Encoder extends Transform {\n constructor(options) {\n super();\n\n // init Transform\n this.options = options || {};\n\n if (this.options.lineLength !== false) {\n this.options.lineLength = this.options.lineLength || 76;\n }\n\n this._curLine = '';\n\n this.inputBytes = 0;\n this.outputBytes = 0;\n }\n\n _transform(chunk, encoding, done) {\n let qp;\n\n if (encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return done();\n }\n\n this.inputBytes += chunk.length;\n\n if (this.options.lineLength) {\n qp = this._curLine + encode(chunk);\n qp = wrap(qp, this.options.lineLength);\n qp = qp.replace(/(^|\\n)([^\\n]*)$/, (match, lineBreak, lastLine) => {\n this._curLine = lastLine;\n return lineBreak;\n });\n\n if (qp) {\n this.outputBytes += qp.length;\n this.push(qp);\n }\n } else {\n qp = encode(chunk);\n this.outputBytes += qp.length;\n this.push(qp, 'ascii');\n }\n\n done();\n }\n\n _flush(done) {\n if (this._curLine) {\n this.outputBytes += this._curLine.length;\n this.push(this._curLine, 'ascii');\n }\n done();\n }\n}\n\n// expose to the world\nmodule.exports = {\n encode,\n wrap,\n Encoder\n};\n", "/* eslint no-control-regex:0 */\n\n'use strict';\n\nconst base64 = require('../base64');\nconst qp = require('../qp');\nconst mimeTypes = require('./mime-types');\n\nmodule.exports = {\n /**\n * Checks if a value is plaintext string (uses only printable 7bit chars)\n *\n * @param {String} value String to be tested\n * @returns {Boolean} true if it is a plaintext string\n */\n isPlainText(value, isParam) {\n const re = isParam ? /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\"\\u0080-\\uFFFF]/ : /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\u0080-\\uFFFF]/;\n if (typeof value !== 'string' || re.test(value)) {\n return false;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a multi line string containes lines longer than the selected value.\n *\n * Useful when detecting if a mail message needs any processing at all \u2013\n * if only plaintext characters are used and lines are short, then there is\n * no need to encode the values in any way. If the value is plaintext but has\n * longer lines then allowed, then use format=flowed\n *\n * @param {Number} lineLength Max line length to check for\n * @returns {Boolean} Returns true if there is at least one line longer than lineLength chars\n */\n hasLongerLines(str, lineLength) {\n if (str.length > 128 * 1024) {\n // do not test strings longer than 128kB\n return true;\n }\n return new RegExp('^.{' + (lineLength + 1) + ',}', 'm').test(str);\n },\n\n /**\n * Encodes a string or an Buffer to an UTF-8 MIME Word (rfc2047)\n *\n * @param {String|Buffer} data String to be encoded\n * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B\n * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed\n * @return {String} Single or several mime words joined together\n */\n encodeWord(data, mimeWordEncoding, maxLength) {\n mimeWordEncoding = (mimeWordEncoding || 'Q').toString().toUpperCase().trim().charAt(0);\n maxLength = maxLength || 0;\n\n let encodedStr;\n let toCharset = 'UTF-8';\n\n if (maxLength && maxLength > 7 + toCharset.length) {\n maxLength -= 7 + toCharset.length;\n }\n\n if (mimeWordEncoding === 'Q') {\n // https://tools.ietf.org/html/rfc2047#section-5 rule (3)\n encodedStr = qp.encode(data).replace(/[^a-z0-9!*+\\-/=]/gi, chr => {\n let ord = chr.charCodeAt(0).toString(16).toUpperCase();\n if (chr === ' ') {\n return '_';\n } else {\n return '=' + (ord.length === 1 ? '0' + ord : ord);\n }\n });\n } else if (mimeWordEncoding === 'B') {\n encodedStr = typeof data === 'string' ? data : base64.encode(data);\n maxLength = maxLength ? Math.max(3, ((maxLength - (maxLength % 4)) / 4) * 3) : 0;\n }\n\n if (maxLength && (mimeWordEncoding !== 'B' ? encodedStr : base64.encode(data)).length > maxLength) {\n if (mimeWordEncoding === 'Q') {\n encodedStr = this.splitMimeEncodedString(encodedStr, maxLength).join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');\n } else {\n // RFC2047 6.3 (2) states that encoded-word must include an integral number of characters, so no chopping unicode sequences\n let parts = [];\n let lpart = '';\n for (let i = 0, len = encodedStr.length; i < len; i++) {\n let chr = encodedStr.charAt(i);\n\n if (/[\\ud83c\\ud83d\\ud83e]/.test(chr) && i < len - 1) {\n // composite emoji byte, so add the next byte as well\n chr += encodedStr.charAt(++i);\n }\n\n // check if we can add this character to the existing string\n // without breaking byte length limit\n if (Buffer.byteLength(lpart + chr) <= maxLength || i === 0) {\n lpart += chr;\n } else {\n // we hit the length limit, so push the existing string and start over\n parts.push(base64.encode(lpart));\n lpart = chr;\n }\n }\n if (lpart) {\n parts.push(base64.encode(lpart));\n }\n\n if (parts.length > 1) {\n encodedStr = parts.join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');\n } else {\n encodedStr = parts.join('');\n }\n }\n } else if (mimeWordEncoding === 'B') {\n encodedStr = base64.encode(data);\n }\n\n return '=?' + toCharset + '?' + mimeWordEncoding + '?' + encodedStr + (encodedStr.substr(-2) === '?=' ? '' : '?=');\n },\n\n /**\n * Finds word sequences with non ascii text and converts these to mime words\n *\n * @param {String} value String to be encoded\n * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B\n * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed\n * @param {Boolean} [encodeAll=false] If true and the value needs encoding then encodes entire string, not just the smallest match\n * @return {String} String with possible mime words\n */\n encodeWords(value, mimeWordEncoding, maxLength, encodeAll) {\n maxLength = maxLength || 0;\n\n let encodedValue;\n\n // find first word with a non-printable ascii or special symbol in it\n let firstMatch = value.match(/(?:^|\\s)([^\\s]*[\"\\u0080-\\uFFFF])/);\n if (!firstMatch) {\n return value;\n }\n\n if (encodeAll) {\n // if it is requested to encode everything or the string contains something that resebles encoded word, then encode everything\n\n return this.encodeWord(value, mimeWordEncoding, maxLength);\n }\n\n // find the last word with a non-printable ascii in it\n let lastMatch = value.match(/([\"\\u0080-\\uFFFF][^\\s]*)[^\"\\u0080-\\uFFFF]*$/);\n if (!lastMatch) {\n // should not happen\n return value;\n }\n\n let startIndex =\n firstMatch.index +\n (\n firstMatch[0].match(/[^\\s]/) || {\n index: 0\n }\n ).index;\n let endIndex = lastMatch.index + (lastMatch[1] || '').length;\n\n encodedValue =\n (startIndex ? value.substr(0, startIndex) : '') +\n this.encodeWord(value.substring(startIndex, endIndex), mimeWordEncoding || 'Q', maxLength) +\n (endIndex < value.length ? value.substr(endIndex) : '');\n\n return encodedValue;\n },\n\n /**\n * Joins parsed header value together as 'value; param1=value1; param2=value2'\n * PS: We are following RFC 822 for the list of special characters that we need to keep in quotes.\n * Refer: https://www.w3.org/Protocols/rfc1341/4_Content-Type.html\n * @param {Object} structured Parsed header value\n * @return {String} joined header value\n */\n buildHeaderValue(structured) {\n let paramsArray = [];\n\n Object.keys(structured.params || {}).forEach(param => {\n // filename might include unicode characters so it is a special case\n // other values probably do not\n let value = structured.params[param];\n if (!this.isPlainText(value, true) || value.length >= 75) {\n this.buildHeaderParam(param, value, 50).forEach(encodedParam => {\n if (!/[\\s\"\\\\;:/=(),<>@[\\]?]|^[-']|'$/.test(encodedParam.value) || encodedParam.key.substr(-1) === '*') {\n paramsArray.push(encodedParam.key + '=' + encodedParam.value);\n } else {\n paramsArray.push(encodedParam.key + '=' + JSON.stringify(encodedParam.value));\n }\n });\n } else if (/[\\s'\"\\\\;:/=(),<>@[\\]?]|^-/.test(value)) {\n paramsArray.push(param + '=' + JSON.stringify(value));\n } else {\n paramsArray.push(param + '=' + value);\n }\n });\n\n return structured.value + (paramsArray.length ? '; ' + paramsArray.join('; ') : '');\n },\n\n /**\n * Encodes a string or an Buffer to an UTF-8 Parameter Value Continuation encoding (rfc2231)\n * Useful for splitting long parameter values.\n *\n * For example\n * title=\"unicode string\"\n * becomes\n * title*0*=utf-8''unicode\n * title*1*=%20string\n *\n * @param {String|Buffer} data String to be encoded\n * @param {Number} [maxLength=50] Max length for generated chunks\n * @param {String} [fromCharset='UTF-8'] Source sharacter set\n * @return {Array} A list of encoded keys and headers\n */\n buildHeaderParam(key, data, maxLength) {\n let list = [];\n let encodedStr = typeof data === 'string' ? data : (data || '').toString();\n let encodedStrArr;\n let chr, ord;\n let line;\n let startPos = 0;\n let i, len;\n\n maxLength = maxLength || 50;\n\n // process ascii only text\n if (this.isPlainText(data, true)) {\n // check if conversion is even needed\n if (encodedStr.length <= maxLength) {\n return [\n {\n key,\n value: encodedStr\n }\n ];\n }\n\n encodedStr = encodedStr.replace(new RegExp('.{' + maxLength + '}', 'g'), str => {\n list.push({\n line: str\n });\n return '';\n });\n\n if (encodedStr) {\n list.push({\n line: encodedStr\n });\n }\n } else {\n if (/[\\uD800-\\uDBFF]/.test(encodedStr)) {\n // string containts surrogate pairs, so normalize it to an array of bytes\n encodedStrArr = [];\n for (i = 0, len = encodedStr.length; i < len; i++) {\n chr = encodedStr.charAt(i);\n ord = chr.charCodeAt(0);\n if (ord >= 0xd800 && ord <= 0xdbff && i < len - 1) {\n chr += encodedStr.charAt(i + 1);\n encodedStrArr.push(chr);\n i++;\n } else {\n encodedStrArr.push(chr);\n }\n }\n encodedStr = encodedStrArr;\n }\n\n // first line includes the charset and language info and needs to be encoded\n // even if it does not contain any unicode characters\n line = 'utf-8\\x27\\x27';\n let encoded = true;\n startPos = 0;\n\n // process text with unicode or special chars\n for (i = 0, len = encodedStr.length; i < len; i++) {\n chr = encodedStr[i];\n\n if (encoded) {\n chr = this.safeEncodeURIComponent(chr);\n } else {\n // try to urlencode current char\n chr = chr === ' ' ? chr : this.safeEncodeURIComponent(chr);\n // By default it is not required to encode a line, the need\n // only appears when the string contains unicode or special chars\n // in this case we start processing the line over and encode all chars\n if (chr !== encodedStr[i]) {\n // Check if it is even possible to add the encoded char to the line\n // If not, there is no reason to use this line, just push it to the list\n // and start a new line with the char that needs encoding\n if ((this.safeEncodeURIComponent(line) + chr).length >= maxLength) {\n list.push({\n line,\n encoded\n });\n line = '';\n startPos = i - 1;\n } else {\n encoded = true;\n i = startPos;\n line = '';\n continue;\n }\n }\n }\n\n // if the line is already too long, push it to the list and start a new one\n if ((line + chr).length >= maxLength) {\n list.push({\n line,\n encoded\n });\n line = chr = encodedStr[i] === ' ' ? ' ' : this.safeEncodeURIComponent(encodedStr[i]);\n if (chr === encodedStr[i]) {\n encoded = false;\n startPos = i - 1;\n } else {\n encoded = true;\n }\n } else {\n line += chr;\n }\n }\n\n if (line) {\n list.push({\n line,\n encoded\n });\n }\n }\n\n return list.map((item, i) => ({\n // encoded lines: {name}*{part}*\n // unencoded lines: {name}*{part}\n // if any line needs to be encoded then the first line (part==0) is always encoded\n key: key + '*' + i + (item.encoded ? '*' : ''),\n value: item.line\n }));\n },\n\n /**\n * Parses a header value with key=value arguments into a structured\n * object.\n *\n * parseHeaderValue('content-type: text/plain; CHARSET='UTF-8'') ->\n * {\n * 'value': 'text/plain',\n * 'params': {\n * 'charset': 'UTF-8'\n * }\n * }\n *\n * @param {String} str Header value\n * @return {Object} Header value as a parsed structure\n */\n parseHeaderValue(str) {\n let response = {\n value: false,\n params: {}\n };\n let key = false;\n let value = '';\n let type = 'value';\n let quote = false;\n let escaped = false;\n let chr;\n\n for (let i = 0, len = str.length; i < len; i++) {\n chr = str.charAt(i);\n if (type === 'key') {\n if (chr === '=') {\n key = value.trim().toLowerCase();\n type = 'value';\n value = '';\n continue;\n }\n value += chr;\n } else {\n if (escaped) {\n value += chr;\n } else if (chr === '\\\\') {\n escaped = true;\n continue;\n } else if (quote && chr === quote) {\n quote = false;\n } else if (!quote && chr === '\"') {\n quote = chr;\n } else if (!quote && chr === ';') {\n if (key === false) {\n response.value = value.trim();\n } else {\n response.params[key] = value.trim();\n }\n type = 'key';\n value = '';\n } else {\n value += chr;\n }\n escaped = false;\n }\n }\n\n if (type === 'value') {\n if (key === false) {\n response.value = value.trim();\n } else {\n response.params[key] = value.trim();\n }\n } else if (value.trim()) {\n response.params[value.trim().toLowerCase()] = '';\n }\n\n // handle parameter value continuations\n // https://tools.ietf.org/html/rfc2231#section-3\n\n // preprocess values\n Object.keys(response.params).forEach(key => {\n let actualKey, nr, match, value;\n if ((match = key.match(/(\\*(\\d+)|\\*(\\d+)\\*|\\*)$/))) {\n actualKey = key.substr(0, match.index);\n nr = Number(match[2] || match[3]) || 0;\n\n if (!response.params[actualKey] || typeof response.params[actualKey] !== 'object') {\n response.params[actualKey] = {\n charset: false,\n values: []\n };\n }\n\n value = response.params[key];\n\n if (nr === 0 && match[0].substr(-1) === '*' && (match = value.match(/^([^']*)'[^']*'(.*)$/))) {\n response.params[actualKey].charset = match[1] || 'iso-8859-1';\n value = match[2];\n }\n\n response.params[actualKey].values[nr] = value;\n\n // remove the old reference\n delete response.params[key];\n }\n });\n\n // concatenate split rfc2231 strings and convert encoded strings to mime encoded words\n Object.keys(response.params).forEach(key => {\n let value;\n if (response.params[key] && Array.isArray(response.params[key].values)) {\n value = response.params[key].values.map(val => val || '').join('');\n\n if (response.params[key].charset) {\n // convert \"%AB\" to \"=?charset?Q?=AB?=\"\n response.params[key] =\n '=?' +\n response.params[key].charset +\n '?Q?' +\n value\n // fix invalidly encoded chars\n .replace(/[=?_\\s]/g, s => {\n let c = s.charCodeAt(0).toString(16);\n if (s === ' ') {\n return '_';\n } else {\n return '%' + (c.length < 2 ? '0' : '') + c;\n }\n })\n // change from urlencoding to percent encoding\n .replace(/%/g, '=') +\n '?=';\n } else {\n response.params[key] = value;\n }\n }\n });\n\n return response;\n },\n\n /**\n * Returns file extension for a content type string. If no suitable extensions\n * are found, 'bin' is used as the default extension\n *\n * @param {String} mimeType Content type to be checked for\n * @return {String} File extension\n */\n detectExtension: mimeType => mimeTypes.detectExtension(mimeType),\n\n /**\n * Returns content type for a file extension. If no suitable content types\n * are found, 'application/octet-stream' is used as the default content type\n *\n * @param {String} extension Extension to be checked for\n * @return {String} File extension\n */\n detectMimeType: extension => mimeTypes.detectMimeType(extension),\n\n /**\n * Folds long lines, useful for folding header lines (afterSpace=false) and\n * flowed text (afterSpace=true)\n *\n * @param {String} str String to be folded\n * @param {Number} [lineLength=76] Maximum length of a line\n * @param {Boolean} afterSpace If true, leave a space in th end of a line\n * @return {String} String with folded lines\n */\n foldLines(str, lineLength, afterSpace) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n let pos = 0,\n len = str.length,\n result = '',\n line,\n match;\n\n while (pos < len) {\n line = str.substr(pos, lineLength);\n if (line.length < lineLength) {\n result += line;\n break;\n }\n if ((match = line.match(/^[^\\n\\r]*(\\r?\\n|\\r)/))) {\n line = match[0];\n result += line;\n pos += line.length;\n continue;\n } else if ((match = line.match(/(\\s+)[^\\s]*$/)) && match[0].length - (afterSpace ? (match[1] || '').length : 0) < line.length) {\n line = line.substr(0, line.length - (match[0].length - (afterSpace ? (match[1] || '').length : 0)));\n } else if ((match = str.substr(pos + line.length).match(/^[^\\s]+(\\s*)/))) {\n line = line + match[0].substr(0, match[0].length - (!afterSpace ? (match[1] || '').length : 0));\n }\n\n result += line;\n pos += line.length;\n if (pos < len) {\n result += '\\r\\n';\n }\n }\n\n return result;\n },\n\n /**\n * Splits a mime encoded string. Needed for dividing mime words into smaller chunks\n *\n * @param {String} str Mime encoded string to be split up\n * @param {Number} maxlen Maximum length of characters for one part (minimum 12)\n * @return {Array} Split string\n */\n splitMimeEncodedString: (str, maxlen) => {\n let curLine,\n match,\n chr,\n done,\n lines = [];\n\n // require at least 12 symbols to fit possible 4 octet UTF-8 sequences\n maxlen = Math.max(maxlen || 0, 12);\n\n while (str.length) {\n curLine = str.substr(0, maxlen);\n\n // move incomplete escaped char back to main\n if ((match = curLine.match(/[=][0-9A-F]?$/i))) {\n curLine = curLine.substr(0, match.index);\n }\n\n done = false;\n while (!done) {\n done = true;\n // check if not middle of a unicode char sequence\n if ((match = str.substr(curLine.length).match(/^[=]([0-9A-F]{2})/i))) {\n chr = parseInt(match[1], 16);\n // invalid sequence, move one char back anc recheck\n if (chr < 0xc2 && chr > 0x7f) {\n curLine = curLine.substr(0, curLine.length - 3);\n done = false;\n }\n }\n }\n\n if (curLine.length) {\n lines.push(curLine);\n }\n str = str.substr(curLine.length);\n }\n\n return lines;\n },\n\n encodeURICharComponent: chr => {\n let res = '';\n let ord = chr.charCodeAt(0).toString(16).toUpperCase();\n\n if (ord.length % 2) {\n ord = '0' + ord;\n }\n\n if (ord.length > 2) {\n for (let i = 0, len = ord.length / 2; i < len; i++) {\n res += '%' + ord.substr(i, 2);\n }\n } else {\n res += '%' + ord;\n }\n\n return res;\n },\n\n safeEncodeURIComponent(str) {\n str = (str || '').toString();\n\n try {\n // might throw if we try to encode invalid sequences, eg. partial emoji\n str = encodeURIComponent(str);\n } catch (E) {\n // should never run\n return str.replace(/[^\\x00-\\x1F *'()<>@,;:\\\\\"[\\]?=\\u007F-\\uFFFF]+/g, '');\n }\n\n // ensure chars that are not handled by encodeURICompent are converted as well\n return str.replace(/[\\x00-\\x1F *'()<>@,;:\\\\\"[\\]?=\\u007F-\\uFFFF]/g, chr => this.encodeURICharComponent(chr));\n }\n};\n", "'use strict';\n\n/**\n * Converts tokens for a single address into an address object\n *\n * @param {Array} tokens Tokens object\n * @return {Object} Address object\n */\nfunction _handleAddress(tokens) {\n let isGroup = false;\n let state = 'text';\n let address;\n let addresses = [];\n let data = {\n address: [],\n comment: [],\n group: [],\n text: []\n };\n let i;\n let len;\n\n // Filter out <addresses>, (comments) and regular text\n for (i = 0, len = tokens.length; i < len; i++) {\n let token = tokens[i];\n let prevToken = i ? tokens[i - 1] : null;\n if (token.type === 'operator') {\n switch (token.value) {\n case '<':\n state = 'address';\n break;\n case '(':\n state = 'comment';\n break;\n case ':':\n state = 'group';\n isGroup = true;\n break;\n default:\n state = 'text';\n break;\n }\n } else if (token.value) {\n if (state === 'address') {\n // handle use case where unquoted name includes a \"<\"\n // Apple Mail truncates everything between an unexpected < and an address\n // and so will we\n token.value = token.value.replace(/^[^<]*<\\s*/, '');\n }\n\n if (prevToken && prevToken.noBreak && data[state].length) {\n // join values\n data[state][data[state].length - 1] += token.value;\n } else {\n data[state].push(token.value);\n }\n }\n }\n\n // If there is no text but a comment, replace the two\n if (!data.text.length && data.comment.length) {\n data.text = data.comment;\n data.comment = [];\n }\n\n if (isGroup) {\n // http://tools.ietf.org/html/rfc2822#appendix-A.1.3\n data.text = data.text.join(' ');\n addresses.push({\n name: data.text || (address && address.name),\n group: data.group.length ? addressparser(data.group.join(',')) : []\n });\n } else {\n // If no address was found, try to detect one from regular text\n if (!data.address.length && data.text.length) {\n for (i = data.text.length - 1; i >= 0; i--) {\n if (data.text[i].match(/^[^@\\s]+@[^@\\s]+$/)) {\n data.address = data.text.splice(i, 1);\n break;\n }\n }\n\n let _regexHandler = function (address) {\n if (!data.address.length) {\n data.address = [address.trim()];\n return ' ';\n } else {\n return address;\n }\n };\n\n // still no address\n if (!data.address.length) {\n for (i = data.text.length - 1; i >= 0; i--) {\n // fixed the regex to parse email address correctly when email address has more than one @\n data.text[i] = data.text[i].replace(/\\s*\\b[^@\\s]+@[^\\s]+\\b\\s*/, _regexHandler).trim();\n if (data.address.length) {\n break;\n }\n }\n }\n }\n\n // If there's still is no text but a comment exixts, replace the two\n if (!data.text.length && data.comment.length) {\n data.text = data.comment;\n data.comment = [];\n }\n\n // Keep only the first address occurence, push others to regular text\n if (data.address.length > 1) {\n data.text = data.text.concat(data.address.splice(1));\n }\n\n // Join values with spaces\n data.text = data.text.join(' ');\n data.address = data.address.join(' ');\n\n if (!data.address && isGroup) {\n return [];\n } else {\n address = {\n address: data.address || data.text || '',\n name: data.text || data.address || ''\n };\n\n if (address.address === address.name) {\n if ((address.address || '').match(/@/)) {\n address.name = '';\n } else {\n address.address = '';\n }\n }\n\n addresses.push(address);\n }\n }\n\n return addresses;\n}\n\n/**\n * Creates a Tokenizer object for tokenizing address field strings\n *\n * @constructor\n * @param {String} str Address field string\n */\nclass Tokenizer {\n constructor(str) {\n this.str = (str || '').toString();\n this.operatorCurrent = '';\n this.operatorExpecting = '';\n this.node = null;\n this.escaped = false;\n\n this.list = [];\n /**\n * Operator tokens and which tokens are expected to end the sequence\n */\n this.operators = {\n '\"': '\"',\n '(': ')',\n '<': '>',\n ',': '',\n ':': ';',\n // Semicolons are not a legal delimiter per the RFC2822 grammar other\n // than for terminating a group, but they are also not valid for any\n // other use in this context. Given that some mail clients have\n // historically allowed the semicolon as a delimiter equivalent to the\n // comma in their UI, it makes sense to treat them the same as a comma\n // when used outside of a group.\n ';': ''\n };\n }\n\n /**\n * Tokenizes the original input string\n *\n * @return {Array} An array of operator|text tokens\n */\n tokenize() {\n let list = [];\n\n for (let i = 0, len = this.str.length; i < len; i++) {\n let chr = this.str.charAt(i);\n let nextChr = i < len - 1 ? this.str.charAt(i + 1) : null;\n this.checkChar(chr, nextChr);\n }\n\n this.list.forEach(node => {\n node.value = (node.value || '').toString().trim();\n if (node.value) {\n list.push(node);\n }\n });\n\n return list;\n }\n\n /**\n * Checks if a character is an operator or text and acts accordingly\n *\n * @param {String} chr Character from the address field\n */\n checkChar(chr, nextChr) {\n if (this.escaped) {\n // ignore next condition blocks\n } else if (chr === this.operatorExpecting) {\n this.node = {\n type: 'operator',\n value: chr\n };\n\n if (nextChr && ![' ', '\\t', '\\r', '\\n', ',', ';'].includes(nextChr)) {\n this.node.noBreak = true;\n }\n\n this.list.push(this.node);\n this.node = null;\n this.operatorExpecting = '';\n this.escaped = false;\n\n return;\n } else if (!this.operatorExpecting && chr in this.operators) {\n this.node = {\n type: 'operator',\n value: chr\n };\n this.list.push(this.node);\n this.node = null;\n this.operatorExpecting = this.operators[chr];\n this.escaped = false;\n return;\n } else if (['\"', \"'\"].includes(this.operatorExpecting) && chr === '\\\\') {\n this.escaped = true;\n return;\n }\n\n if (!this.node) {\n this.node = {\n type: 'text',\n value: ''\n };\n this.list.push(this.node);\n }\n\n if (chr === '\\n') {\n // Convert newlines to spaces. Carriage return is ignored as \\r and \\n usually\n // go together anyway and there already is a WS for \\n. Lone \\r means something is fishy.\n chr = ' ';\n }\n\n if (chr.charCodeAt(0) >= 0x21 || [' ', '\\t'].includes(chr)) {\n // skip command bytes\n this.node.value += chr;\n }\n\n this.escaped = false;\n }\n}\n\n/**\n * Parses structured e-mail addresses from an address field\n *\n * Example:\n *\n * 'Name <address@domain>'\n *\n * will be converted to\n *\n * [{name: 'Name', address: 'address@domain'}]\n *\n * @param {String} str Address field\n * @return {Array} An array of address objects\n */\nfunction addressparser(str, options) {\n options = options || {};\n\n let tokenizer = new Tokenizer(str);\n let tokens = tokenizer.tokenize();\n\n let addresses = [];\n let address = [];\n let parsedAddresses = [];\n\n tokens.forEach(token => {\n if (token.type === 'operator' && (token.value === ',' || token.value === ';')) {\n if (address.length) {\n addresses.push(address);\n }\n address = [];\n } else {\n address.push(token);\n }\n });\n\n if (address.length) {\n addresses.push(address);\n }\n\n addresses.forEach(address => {\n address = _handleAddress(address);\n if (address.length) {\n parsedAddresses = parsedAddresses.concat(address);\n }\n });\n\n if (options.flatten) {\n let addresses = [];\n let walkAddressList = list => {\n list.forEach(address => {\n if (address.group) {\n return walkAddressList(address.group);\n } else {\n addresses.push(address);\n }\n });\n };\n walkAddressList(parsedAddresses);\n return addresses;\n }\n\n return parsedAddresses;\n}\n\n// expose to the world\nmodule.exports = addressparser;\n", "'use strict';\n\nconst Transform = require('stream').Transform;\n\nclass LastNewline extends Transform {\n constructor() {\n super();\n this.lastByte = false;\n }\n\n _transform(chunk, encoding, done) {\n if (chunk.length) {\n this.lastByte = chunk[chunk.length - 1];\n }\n\n this.push(chunk);\n done();\n }\n\n _flush(done) {\n if (this.lastByte === 0x0a) {\n return done();\n }\n if (this.lastByte === 0x0d) {\n this.push(Buffer.from('\\n'));\n return done();\n }\n this.push(Buffer.from('\\r\\n'));\n return done();\n }\n}\n\nmodule.exports = LastNewline;\n", "'use strict';\n\nconst stream = require('stream');\nconst Transform = stream.Transform;\n\n/**\n * Ensures that only <CR><LF> sequences are used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass LeWindows extends Transform {\n constructor(options) {\n super(options);\n // init Transform\n this.options = options || {};\n this.lastByte = false;\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let buf;\n let lastPos = 0;\n\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x0a) {\n // \\n\n if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {\n if (i > lastPos) {\n buf = chunk.slice(lastPos, i);\n this.push(buf);\n }\n this.push(Buffer.from('\\r\\n'));\n lastPos = i + 1;\n }\n }\n }\n\n if (lastPos && lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n this.push(buf);\n } else if (!lastPos) {\n this.push(chunk);\n }\n\n this.lastByte = chunk[chunk.length - 1];\n done();\n }\n}\n\nmodule.exports = LeWindows;\n", "'use strict';\n\nconst stream = require('stream');\nconst Transform = stream.Transform;\n\n/**\n * Ensures that only <LF> is used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass LeWindows extends Transform {\n constructor(options) {\n super(options);\n // init Transform\n this.options = options || {};\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let buf;\n let lastPos = 0;\n\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x0d) {\n // \\n\n buf = chunk.slice(lastPos, i);\n lastPos = i + 1;\n this.push(buf);\n }\n }\n if (lastPos && lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n this.push(buf);\n } else if (!lastPos) {\n this.push(chunk);\n }\n done();\n }\n}\n\nmodule.exports = LeWindows;\n", "/* eslint no-undefined: 0, prefer-spread: 0, no-control-regex: 0 */\n\n'use strict';\n\nconst crypto = require('crypto');\nconst fs = require('fs');\nconst punycode = require('../punycode');\nconst PassThrough = require('stream').PassThrough;\nconst shared = require('../shared');\n\nconst mimeFuncs = require('../mime-funcs');\nconst qp = require('../qp');\nconst base64 = require('../base64');\nconst addressparser = require('../addressparser');\nconst nmfetch = require('../fetch');\nconst LastNewline = require('./last-newline');\n\nconst LeWindows = require('./le-windows');\nconst LeUnix = require('./le-unix');\n\n/**\n * Creates a new mime tree node. Assumes 'multipart/*' as the content type\n * if it is a branch, anything else counts as leaf. If rootNode is missing from\n * the options, assumes this is the root.\n *\n * @param {String} contentType Define the content type for the node. Can be left blank for attachments (derived from filename)\n * @param {Object} [options] optional options\n * @param {Object} [options.rootNode] root node for this tree\n * @param {Object} [options.parentNode] immediate parent for this node\n * @param {Object} [options.filename] filename for an attachment node\n * @param {String} [options.baseBoundary] shared part of the unique multipart boundary\n * @param {Boolean} [options.keepBcc] If true, do not exclude Bcc from the generated headers\n * @param {Function} [options.normalizeHeaderKey] method to normalize header keys for custom caseing\n * @param {String} [options.textEncoding] either 'Q' (the default) or 'B'\n */\nclass MimeNode {\n constructor(contentType, options) {\n this.nodeCounter = 0;\n\n options = options || {};\n\n /**\n * shared part of the unique multipart boundary\n */\n this.baseBoundary = options.baseBoundary || crypto.randomBytes(8).toString('hex');\n this.boundaryPrefix = options.boundaryPrefix || '--_NmP';\n\n this.disableFileAccess = !!options.disableFileAccess;\n this.disableUrlAccess = !!options.disableUrlAccess;\n\n this.normalizeHeaderKey = options.normalizeHeaderKey;\n\n /**\n * If date headers is missing and current node is the root, this value is used instead\n */\n this.date = new Date();\n\n /**\n * Root node for current mime tree\n */\n this.rootNode = options.rootNode || this;\n\n /**\n * If true include Bcc in generated headers (if available)\n */\n this.keepBcc = !!options.keepBcc;\n\n /**\n * If filename is specified but contentType is not (probably an attachment)\n * detect the content type from filename extension\n */\n if (options.filename) {\n /**\n * Filename for this node. Useful with attachments\n */\n this.filename = options.filename;\n if (!contentType) {\n contentType = mimeFuncs.detectMimeType(this.filename.split('.').pop());\n }\n }\n\n /**\n * Indicates which encoding should be used for header strings: \"Q\" or \"B\"\n */\n this.textEncoding = (options.textEncoding || '').toString().trim().charAt(0).toUpperCase();\n\n /**\n * Immediate parent for this node (or undefined if not set)\n */\n this.parentNode = options.parentNode;\n\n /**\n * Hostname for default message-id values\n */\n this.hostname = options.hostname;\n\n /**\n * If set to 'win' then uses \\r\\n, if 'linux' then \\n. If not set (or `raw` is used) then newlines are kept as is.\n */\n this.newline = options.newline;\n\n /**\n * An array for possible child nodes\n */\n this.childNodes = [];\n\n /**\n * Used for generating unique boundaries (prepended to the shared base)\n */\n this._nodeId = ++this.rootNode.nodeCounter;\n\n /**\n * A list of header values for this node in the form of [{key:'', value:''}]\n */\n this._headers = [];\n\n /**\n * True if the content only uses ASCII printable characters\n * @type {Boolean}\n */\n this._isPlainText = false;\n\n /**\n * True if the content is plain text but has longer lines than allowed\n * @type {Boolean}\n */\n this._hasLongLines = false;\n\n /**\n * If set, use instead this value for envelopes instead of generating one\n * @type {Boolean}\n */\n this._envelope = false;\n\n /**\n * If set then use this value as the stream content instead of building it\n * @type {String|Buffer|Stream}\n */\n this._raw = false;\n\n /**\n * Additional transform streams that the message will be piped before\n * exposing by createReadStream\n * @type {Array}\n */\n this._transforms = [];\n\n /**\n * Additional process functions that the message will be piped through before\n * exposing by createReadStream. These functions are run after transforms\n * @type {Array}\n */\n this._processFuncs = [];\n\n /**\n * If content type is set (or derived from the filename) add it to headers\n */\n if (contentType) {\n this.setHeader('Content-Type', contentType);\n }\n }\n\n /////// PUBLIC METHODS\n\n /**\n * Creates and appends a child node.Arguments provided are passed to MimeNode constructor\n *\n * @param {String} [contentType] Optional content type\n * @param {Object} [options] Optional options object\n * @return {Object} Created node object\n */\n createChild(contentType, options) {\n if (!options && typeof contentType === 'object') {\n options = contentType;\n contentType = undefined;\n }\n let node = new MimeNode(contentType, options);\n this.appendChild(node);\n return node;\n }\n\n /**\n * Appends an existing node to the mime tree. Removes the node from an existing\n * tree if needed\n *\n * @param {Object} childNode node to be appended\n * @return {Object} Appended node object\n */\n appendChild(childNode) {\n if (childNode.rootNode !== this.rootNode) {\n childNode.rootNode = this.rootNode;\n childNode._nodeId = ++this.rootNode.nodeCounter;\n }\n\n childNode.parentNode = this;\n\n this.childNodes.push(childNode);\n return childNode;\n }\n\n /**\n * Replaces current node with another node\n *\n * @param {Object} node Replacement node\n * @return {Object} Replacement node\n */\n replace(node) {\n if (node === this) {\n return this;\n }\n\n this.parentNode.childNodes.forEach((childNode, i) => {\n if (childNode === this) {\n node.rootNode = this.rootNode;\n node.parentNode = this.parentNode;\n node._nodeId = this._nodeId;\n\n this.rootNode = this;\n this.parentNode = undefined;\n\n node.parentNode.childNodes[i] = node;\n }\n });\n\n return node;\n }\n\n /**\n * Removes current node from the mime tree\n *\n * @return {Object} removed node\n */\n remove() {\n if (!this.parentNode) {\n return this;\n }\n\n for (let i = this.parentNode.childNodes.length - 1; i >= 0; i--) {\n if (this.parentNode.childNodes[i] === this) {\n this.parentNode.childNodes.splice(i, 1);\n this.parentNode = undefined;\n this.rootNode = this;\n return this;\n }\n }\n }\n\n /**\n * Sets a header value. If the value for selected key exists, it is overwritten.\n * You can set multiple values as well by using [{key:'', value:''}] or\n * {key: 'value'} as the first argument.\n *\n * @param {String|Array|Object} key Header key or a list of key value pairs\n * @param {String} value Header value\n * @return {Object} current node\n */\n setHeader(key, value) {\n let added = false,\n headerValue;\n\n // Allow setting multiple headers at once\n if (!value && key && typeof key === 'object') {\n // allow {key:'content-type', value: 'text/plain'}\n if (key.key && 'value' in key) {\n this.setHeader(key.key, key.value);\n } else if (Array.isArray(key)) {\n // allow [{key:'content-type', value: 'text/plain'}]\n key.forEach(i => {\n this.setHeader(i.key, i.value);\n });\n } else {\n // allow {'content-type': 'text/plain'}\n Object.keys(key).forEach(i => {\n this.setHeader(i, key[i]);\n });\n }\n return this;\n }\n\n key = this._normalizeHeaderKey(key);\n\n headerValue = {\n key,\n value\n };\n\n // Check if the value exists and overwrite\n for (let i = 0, len = this._headers.length; i < len; i++) {\n if (this._headers[i].key === key) {\n if (!added) {\n // replace the first match\n this._headers[i] = headerValue;\n added = true;\n } else {\n // remove following matches\n this._headers.splice(i, 1);\n i--;\n len--;\n }\n }\n }\n\n // match not found, append the value\n if (!added) {\n this._headers.push(headerValue);\n }\n\n return this;\n }\n\n /**\n * Adds a header value. If the value for selected key exists, the value is appended\n * as a new field and old one is not touched.\n * You can set multiple values as well by using [{key:'', value:''}] or\n * {key: 'value'} as the first argument.\n *\n * @param {String|Array|Object} key Header key or a list of key value pairs\n * @param {String} value Header value\n * @return {Object} current node\n */\n addHeader(key, value) {\n // Allow setting multiple headers at once\n if (!value && key && typeof key === 'object') {\n // allow {key:'content-type', value: 'text/plain'}\n if (key.key && key.value) {\n this.addHeader(key.key, key.value);\n } else if (Array.isArray(key)) {\n // allow [{key:'content-type', value: 'text/plain'}]\n key.forEach(i => {\n this.addHeader(i.key, i.value);\n });\n } else {\n // allow {'content-type': 'text/plain'}\n Object.keys(key).forEach(i => {\n this.addHeader(i, key[i]);\n });\n }\n return this;\n } else if (Array.isArray(value)) {\n value.forEach(val => {\n this.addHeader(key, val);\n });\n return this;\n }\n\n this._headers.push({\n key: this._normalizeHeaderKey(key),\n value\n });\n\n return this;\n }\n\n /**\n * Retrieves the first mathcing value of a selected key\n *\n * @param {String} key Key to search for\n * @retun {String} Value for the key\n */\n getHeader(key) {\n key = this._normalizeHeaderKey(key);\n for (let i = 0, len = this._headers.length; i < len; i++) {\n if (this._headers[i].key === key) {\n return this._headers[i].value;\n }\n }\n }\n\n /**\n * Sets body content for current node. If the value is a string, charset is added automatically\n * to Content-Type (if it is text/*). If the value is a Buffer, you need to specify\n * the charset yourself\n *\n * @param (String|Buffer) content Body content\n * @return {Object} current node\n */\n setContent(content) {\n this.content = content;\n if (typeof this.content.pipe === 'function') {\n // pre-stream handler. might be triggered if a stream is set as content\n // and 'error' fires before anything is done with this stream\n this._contentErrorHandler = err => {\n this.content.removeListener('error', this._contentErrorHandler);\n this.content = err;\n };\n this.content.once('error', this._contentErrorHandler);\n } else if (typeof this.content === 'string') {\n this._isPlainText = mimeFuncs.isPlainText(this.content);\n if (this._isPlainText && mimeFuncs.hasLongerLines(this.content, 76)) {\n // If there are lines longer than 76 symbols/bytes do not use 7bit\n this._hasLongLines = true;\n }\n }\n return this;\n }\n\n build(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n let stream = this.createReadStream();\n let buf = [];\n let buflen = 0;\n let returned = false;\n\n stream.on('readable', () => {\n let chunk;\n\n while ((chunk = stream.read()) !== null) {\n buf.push(chunk);\n buflen += chunk.length;\n }\n });\n\n stream.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n\n return callback(err);\n });\n\n stream.once('end', chunk => {\n if (returned) {\n return;\n }\n returned = true;\n\n if (chunk && chunk.length) {\n buf.push(chunk);\n buflen += chunk.length;\n }\n return callback(null, Buffer.concat(buf, buflen));\n });\n\n return promise;\n }\n\n getTransferEncoding() {\n let transferEncoding = false;\n let contentType = (this.getHeader('Content-Type') || '').toString().toLowerCase().trim();\n\n if (this.content) {\n transferEncoding = (this.getHeader('Content-Transfer-Encoding') || '').toString().toLowerCase().trim();\n if (!transferEncoding || !['base64', 'quoted-printable'].includes(transferEncoding)) {\n if (/^text\\//i.test(contentType)) {\n // If there are no special symbols, no need to modify the text\n if (this._isPlainText && !this._hasLongLines) {\n transferEncoding = '7bit';\n } else if (typeof this.content === 'string' || this.content instanceof Buffer) {\n // detect preferred encoding for string value\n transferEncoding = this._getTextEncoding(this.content) === 'Q' ? 'quoted-printable' : 'base64';\n } else {\n // we can not check content for a stream, so either use preferred encoding or fallback to QP\n transferEncoding = this.textEncoding === 'B' ? 'base64' : 'quoted-printable';\n }\n } else if (!/^(multipart|message)\\//i.test(contentType)) {\n transferEncoding = transferEncoding || 'base64';\n }\n }\n }\n return transferEncoding;\n }\n\n /**\n * Builds the header block for the mime node. Append \\r\\n\\r\\n before writing the content\n *\n * @returns {String} Headers\n */\n buildHeaders() {\n let transferEncoding = this.getTransferEncoding();\n let headers = [];\n\n if (transferEncoding) {\n this.setHeader('Content-Transfer-Encoding', transferEncoding);\n }\n\n if (this.filename && !this.getHeader('Content-Disposition')) {\n this.setHeader('Content-Disposition', 'attachment');\n }\n\n // Ensure mandatory header fields\n if (this.rootNode === this) {\n if (!this.getHeader('Date')) {\n this.setHeader('Date', this.date.toUTCString().replace(/GMT/, '+0000'));\n }\n\n // ensure that Message-Id is present\n this.messageId();\n\n if (!this.getHeader('MIME-Version')) {\n this.setHeader('MIME-Version', '1.0');\n }\n\n // Ensure that Content-Type is the last header for the root node\n for (let i = this._headers.length - 2; i >= 0; i--) {\n let header = this._headers[i];\n if (header.key === 'Content-Type') {\n this._headers.splice(i, 1);\n this._headers.push(header);\n }\n }\n }\n\n this._headers.forEach(header => {\n let key = header.key;\n let value = header.value;\n let structured;\n let param;\n let options = {};\n let formattedHeaders = ['From', 'Sender', 'To', 'Cc', 'Bcc', 'Reply-To', 'Date', 'References'];\n\n if (value && typeof value === 'object' && !formattedHeaders.includes(key)) {\n Object.keys(value).forEach(key => {\n if (key !== 'value') {\n options[key] = value[key];\n }\n });\n value = (value.value || '').toString();\n if (!value.trim()) {\n return;\n }\n }\n\n if (options.prepared) {\n // header value is\n if (options.foldLines) {\n headers.push(mimeFuncs.foldLines(key + ': ' + value));\n } else {\n headers.push(key + ': ' + value);\n }\n return;\n }\n\n switch (header.key) {\n case 'Content-Disposition':\n structured = mimeFuncs.parseHeaderValue(value);\n if (this.filename) {\n structured.params.filename = this.filename;\n }\n value = mimeFuncs.buildHeaderValue(structured);\n break;\n\n case 'Content-Type':\n structured = mimeFuncs.parseHeaderValue(value);\n\n this._handleContentType(structured);\n\n if (structured.value.match(/^text\\/plain\\b/) && typeof this.content === 'string' && /[\\u0080-\\uFFFF]/.test(this.content)) {\n structured.params.charset = 'utf-8';\n }\n\n value = mimeFuncs.buildHeaderValue(structured);\n\n if (this.filename) {\n // add support for non-compliant clients like QQ webmail\n // we can't build the value with buildHeaderValue as the value is non standard and\n // would be converted to parameter continuation encoding that we do not want\n param = this._encodeWords(this.filename);\n\n if (param !== this.filename || /[\\s'\"\\\\;:/=(),<>@[\\]?]|^-/.test(param)) {\n // include value in quotes if needed\n param = '\"' + param + '\"';\n }\n value += '; name=' + param;\n }\n break;\n\n case 'Bcc':\n if (!this.keepBcc) {\n // skip BCC values\n return;\n }\n break;\n }\n\n value = this._encodeHeaderValue(key, value);\n\n // skip empty lines\n if (!(value || '').toString().trim()) {\n return;\n }\n\n if (typeof this.normalizeHeaderKey === 'function') {\n let normalized = this.normalizeHeaderKey(key, value);\n if (normalized && typeof normalized === 'string' && normalized.length) {\n key = normalized;\n }\n }\n\n headers.push(mimeFuncs.foldLines(key + ': ' + value, 76));\n });\n\n return headers.join('\\r\\n');\n }\n\n /**\n * Streams the rfc2822 message from the current node. If this is a root node,\n * mandatory header fields are set if missing (Date, Message-Id, MIME-Version)\n *\n * @return {String} Compiled message\n */\n createReadStream(options) {\n options = options || {};\n\n let stream = new PassThrough(options);\n let outputStream = stream;\n let transform;\n\n this.stream(stream, options, err => {\n if (err) {\n outputStream.emit('error', err);\n return;\n }\n stream.end();\n });\n\n for (let i = 0, len = this._transforms.length; i < len; i++) {\n transform = typeof this._transforms[i] === 'function' ? this._transforms[i]() : this._transforms[i];\n outputStream.once('error', err => {\n transform.emit('error', err);\n });\n outputStream = outputStream.pipe(transform);\n }\n\n // ensure terminating newline after possible user transforms\n transform = new LastNewline();\n outputStream.once('error', err => {\n transform.emit('error', err);\n });\n outputStream = outputStream.pipe(transform);\n\n // dkim and stuff\n for (let i = 0, len = this._processFuncs.length; i < len; i++) {\n transform = this._processFuncs[i];\n outputStream = transform(outputStream);\n }\n\n if (this.newline) {\n const winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes(this.newline.toString().toLowerCase());\n const newlineTransform = winbreak ? new LeWindows() : new LeUnix();\n\n const stream = outputStream.pipe(newlineTransform);\n outputStream.on('error', err => stream.emit('error', err));\n return stream;\n }\n\n return outputStream;\n }\n\n /**\n * Appends a transform stream object to the transforms list. Final output\n * is passed through this stream before exposing\n *\n * @param {Object} transform Read-Write stream\n */\n transform(transform) {\n this._transforms.push(transform);\n }\n\n /**\n * Appends a post process function. The functon is run after transforms and\n * uses the following syntax\n *\n * processFunc(input) -> outputStream\n *\n * @param {Object} processFunc Read-Write stream\n */\n processFunc(processFunc) {\n this._processFuncs.push(processFunc);\n }\n\n stream(outputStream, options, done) {\n let transferEncoding = this.getTransferEncoding();\n let contentStream;\n let localStream;\n\n // protect actual callback against multiple triggering\n let returned = false;\n let callback = err => {\n if (returned) {\n return;\n }\n returned = true;\n done(err);\n };\n\n // for multipart nodes, push child nodes\n // for content nodes end the stream\n let finalize = () => {\n let childId = 0;\n let processChildNode = () => {\n if (childId >= this.childNodes.length) {\n outputStream.write('\\r\\n--' + this.boundary + '--\\r\\n');\n return callback();\n }\n let child = this.childNodes[childId++];\n outputStream.write((childId > 1 ? '\\r\\n' : '') + '--' + this.boundary + '\\r\\n');\n child.stream(outputStream, options, err => {\n if (err) {\n return callback(err);\n }\n setImmediate(processChildNode);\n });\n };\n\n if (this.multipart) {\n setImmediate(processChildNode);\n } else {\n return callback();\n }\n };\n\n // pushes node content\n let sendContent = () => {\n if (this.content) {\n if (Object.prototype.toString.call(this.content) === '[object Error]') {\n // content is already errored\n return callback(this.content);\n }\n\n if (typeof this.content.pipe === 'function') {\n this.content.removeListener('error', this._contentErrorHandler);\n this._contentErrorHandler = err => callback(err);\n this.content.once('error', this._contentErrorHandler);\n }\n\n let createStream = () => {\n if (['quoted-printable', 'base64'].includes(transferEncoding)) {\n contentStream = new (transferEncoding === 'base64' ? base64 : qp).Encoder(options);\n\n contentStream.pipe(outputStream, {\n end: false\n });\n contentStream.once('end', finalize);\n contentStream.once('error', err => callback(err));\n\n localStream = this._getStream(this.content);\n localStream.pipe(contentStream);\n } else {\n // anything that is not QP or Base54 passes as-is\n localStream = this._getStream(this.content);\n localStream.pipe(outputStream, {\n end: false\n });\n localStream.once('end', finalize);\n }\n\n localStream.once('error', err => callback(err));\n };\n\n if (this.content._resolve) {\n let chunks = [];\n let chunklen = 0;\n let returned = false;\n let sourceStream = this._getStream(this.content);\n sourceStream.on('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n callback(err);\n });\n sourceStream.on('readable', () => {\n let chunk;\n while ((chunk = sourceStream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n sourceStream.on('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n this.content._resolve = false;\n this.content._resolvedValue = Buffer.concat(chunks, chunklen);\n setImmediate(createStream);\n });\n } else {\n setImmediate(createStream);\n }\n return;\n } else {\n return setImmediate(finalize);\n }\n };\n\n if (this._raw) {\n setImmediate(() => {\n if (Object.prototype.toString.call(this._raw) === '[object Error]') {\n // content is already errored\n return callback(this._raw);\n }\n\n // remove default error handler (if set)\n if (typeof this._raw.pipe === 'function') {\n this._raw.removeListener('error', this._contentErrorHandler);\n }\n\n let raw = this._getStream(this._raw);\n raw.pipe(outputStream, {\n end: false\n });\n raw.on('error', err => outputStream.emit('error', err));\n raw.on('end', finalize);\n });\n } else {\n outputStream.write(this.buildHeaders() + '\\r\\n\\r\\n');\n setImmediate(sendContent);\n }\n }\n\n /**\n * Sets envelope to be used instead of the generated one\n *\n * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}\n */\n setEnvelope(envelope) {\n let list;\n\n this._envelope = {\n from: false,\n to: []\n };\n\n if (envelope.from) {\n list = [];\n this._convertAddresses(this._parseAddresses(envelope.from), list);\n list = list.filter(address => address && address.address);\n if (list.length && list[0]) {\n this._envelope.from = list[0].address;\n }\n }\n ['to', 'cc', 'bcc'].forEach(key => {\n if (envelope[key]) {\n this._convertAddresses(this._parseAddresses(envelope[key]), this._envelope.to);\n }\n });\n\n this._envelope.to = this._envelope.to.map(to => to.address).filter(address => address);\n\n let standardFields = ['to', 'cc', 'bcc', 'from'];\n Object.keys(envelope).forEach(key => {\n if (!standardFields.includes(key)) {\n this._envelope[key] = envelope[key];\n }\n });\n\n return this;\n }\n\n /**\n * Generates and returns an object with parsed address fields\n *\n * @return {Object} Address object\n */\n getAddresses() {\n let addresses = {};\n\n this._headers.forEach(header => {\n let key = header.key.toLowerCase();\n if (['from', 'sender', 'reply-to', 'to', 'cc', 'bcc'].includes(key)) {\n if (!Array.isArray(addresses[key])) {\n addresses[key] = [];\n }\n\n this._convertAddresses(this._parseAddresses(header.value), addresses[key]);\n }\n });\n\n return addresses;\n }\n\n /**\n * Generates and returns SMTP envelope with the sender address and a list of recipients addresses\n *\n * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}\n */\n getEnvelope() {\n if (this._envelope) {\n return this._envelope;\n }\n\n let envelope = {\n from: false,\n to: []\n };\n this._headers.forEach(header => {\n let list = [];\n if (header.key === 'From' || (!envelope.from && ['Reply-To', 'Sender'].includes(header.key))) {\n this._convertAddresses(this._parseAddresses(header.value), list);\n if (list.length && list[0]) {\n envelope.from = list[0].address;\n }\n } else if (['To', 'Cc', 'Bcc'].includes(header.key)) {\n this._convertAddresses(this._parseAddresses(header.value), envelope.to);\n }\n });\n\n envelope.to = envelope.to.map(to => to.address);\n\n return envelope;\n }\n\n /**\n * Returns Message-Id value. If it does not exist, then creates one\n *\n * @return {String} Message-Id value\n */\n messageId() {\n let messageId = this.getHeader('Message-ID');\n // You really should define your own Message-Id field!\n if (!messageId) {\n messageId = this._generateMessageId();\n this.setHeader('Message-ID', messageId);\n }\n return messageId;\n }\n\n /**\n * Sets pregenerated content that will be used as the output of this node\n *\n * @param {String|Buffer|Stream} Raw MIME contents\n */\n setRaw(raw) {\n this._raw = raw;\n\n if (this._raw && typeof this._raw.pipe === 'function') {\n // pre-stream handler. might be triggered if a stream is set as content\n // and 'error' fires before anything is done with this stream\n this._contentErrorHandler = err => {\n this._raw.removeListener('error', this._contentErrorHandler);\n this._raw = err;\n };\n this._raw.once('error', this._contentErrorHandler);\n }\n\n return this;\n }\n\n /////// PRIVATE METHODS\n\n /**\n * Detects and returns handle to a stream related with the content.\n *\n * @param {Mixed} content Node content\n * @returns {Object} Stream object\n */\n _getStream(content) {\n let contentStream;\n\n if (content._resolvedValue) {\n // pass string or buffer content as a stream\n contentStream = new PassThrough();\n\n setImmediate(() => {\n try {\n contentStream.end(content._resolvedValue);\n } catch (err) {\n contentStream.emit('error', err);\n }\n });\n\n return contentStream;\n } else if (typeof content.pipe === 'function') {\n // assume as stream\n return content;\n } else if (content && typeof content.path === 'string' && !content.href) {\n if (this.disableFileAccess) {\n contentStream = new PassThrough();\n setImmediate(() => contentStream.emit('error', new Error('File access rejected for ' + content.path)));\n return contentStream;\n }\n // read file\n return fs.createReadStream(content.path);\n } else if (content && typeof content.href === 'string') {\n if (this.disableUrlAccess) {\n contentStream = new PassThrough();\n setImmediate(() => contentStream.emit('error', new Error('Url access rejected for ' + content.href)));\n return contentStream;\n }\n // fetch URL\n return nmfetch(content.href, { headers: content.httpHeaders });\n } else {\n // pass string or buffer content as a stream\n contentStream = new PassThrough();\n\n setImmediate(() => {\n try {\n contentStream.end(content || '');\n } catch (err) {\n contentStream.emit('error', err);\n }\n });\n return contentStream;\n }\n }\n\n /**\n * Parses addresses. Takes in a single address or an array or an\n * array of address arrays (eg. To: [[first group], [second group],...])\n *\n * @param {Mixed} addresses Addresses to be parsed\n * @return {Array} An array of address objects\n */\n _parseAddresses(addresses) {\n return [].concat.apply(\n [],\n [].concat(addresses).map(address => {\n // eslint-disable-line prefer-spread\n if (address && address.address) {\n address.address = this._normalizeAddress(address.address);\n address.name = address.name || '';\n return [address];\n }\n return addressparser(address);\n })\n );\n }\n\n /**\n * Normalizes a header key, uses Camel-Case form, except for uppercase MIME-\n *\n * @param {String} key Key to be normalized\n * @return {String} key in Camel-Case form\n */\n _normalizeHeaderKey(key) {\n key = (key || '')\n .toString()\n // no newlines in keys\n .replace(/\\r?\\n|\\r/g, ' ')\n .trim()\n .toLowerCase()\n // use uppercase words, except MIME\n .replace(/^X-SMTPAPI$|^(MIME|DKIM|ARC|BIMI)\\b|^[a-z]|-(SPF|FBL|ID|MD5)$|-[a-z]/gi, c => c.toUpperCase())\n // special case\n .replace(/^Content-Features$/i, 'Content-features');\n\n return key;\n }\n\n /**\n * Checks if the content type is multipart and defines boundary if needed.\n * Doesn't return anything, modifies object argument instead.\n *\n * @param {Object} structured Parsed header value for 'Content-Type' key\n */\n _handleContentType(structured) {\n this.contentType = structured.value.trim().toLowerCase();\n\n this.multipart = /^multipart\\//i.test(this.contentType) ? this.contentType.substr(this.contentType.indexOf('/') + 1) : false;\n\n if (this.multipart) {\n this.boundary = structured.params.boundary = structured.params.boundary || this.boundary || this._generateBoundary();\n } else {\n this.boundary = false;\n }\n }\n\n /**\n * Generates a multipart boundary value\n *\n * @return {String} boundary value\n */\n _generateBoundary() {\n return this.rootNode.boundaryPrefix + '-' + this.rootNode.baseBoundary + '-Part_' + this._nodeId;\n }\n\n /**\n * Encodes a header value for use in the generated rfc2822 email.\n *\n * @param {String} key Header key\n * @param {String} value Header value\n */\n _encodeHeaderValue(key, value) {\n key = this._normalizeHeaderKey(key);\n\n switch (key) {\n // Structured headers\n case 'From':\n case 'Sender':\n case 'To':\n case 'Cc':\n case 'Bcc':\n case 'Reply-To':\n return this._convertAddresses(this._parseAddresses(value));\n\n // values enclosed in <>\n case 'Message-ID':\n case 'In-Reply-To':\n case 'Content-Id':\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n\n if (value.charAt(0) !== '<') {\n value = '<' + value;\n }\n\n if (value.charAt(value.length - 1) !== '>') {\n value = value + '>';\n }\n return value;\n\n // space separated list of values enclosed in <>\n case 'References':\n value = [].concat\n .apply(\n [],\n [].concat(value || '').map(elm => {\n // eslint-disable-line prefer-spread\n elm = (elm || '')\n .toString()\n .replace(/\\r?\\n|\\r/g, ' ')\n .trim();\n return elm.replace(/<[^>]*>/g, str => str.replace(/\\s/g, '')).split(/\\s+/);\n })\n )\n .map(elm => {\n if (elm.charAt(0) !== '<') {\n elm = '<' + elm;\n }\n if (elm.charAt(elm.length - 1) !== '>') {\n elm = elm + '>';\n }\n return elm;\n });\n\n return value.join(' ').trim();\n\n case 'Date':\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return value.toUTCString().replace(/GMT/, '+0000');\n }\n\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n return this._encodeWords(value);\n\n case 'Content-Type':\n case 'Content-Disposition':\n // if it includes a filename then it is already encoded\n return (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n\n default:\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n // encodeWords only encodes if needed, otherwise the original string is returned\n return this._encodeWords(value);\n }\n }\n\n /**\n * Rebuilds address object using punycode and other adjustments\n *\n * @param {Array} addresses An array of address objects\n * @param {Array} [uniqueList] An array to be populated with addresses\n * @return {String} address string\n */\n _convertAddresses(addresses, uniqueList) {\n let values = [];\n\n uniqueList = uniqueList || [];\n\n [].concat(addresses || []).forEach(address => {\n if (address.address) {\n address.address = this._normalizeAddress(address.address);\n\n if (!address.name) {\n values.push(address.address.indexOf(' ') >= 0 ? `<${address.address}>` : `${address.address}`);\n } else if (address.name) {\n values.push(`${this._encodeAddressName(address.name)} <${address.address}>`);\n }\n\n if (address.address) {\n if (!uniqueList.filter(a => a.address === address.address).length) {\n uniqueList.push(address);\n }\n }\n } else if (address.group) {\n let groupListAddresses = (address.group.length ? this._convertAddresses(address.group, uniqueList) : '').trim();\n values.push(`${this._encodeAddressName(address.name)}:${groupListAddresses};`);\n }\n });\n\n return values.join(', ');\n }\n\n /**\n * Normalizes an email address\n *\n * @param {Array} address An array of address objects\n * @return {String} address string\n */\n _normalizeAddress(address) {\n address = (address || '')\n .toString()\n .replace(/[\\x00-\\x1F<>]+/g, ' ') // remove unallowed characters\n .trim();\n\n let lastAt = address.lastIndexOf('@');\n if (lastAt < 0) {\n // Bare username\n return address;\n }\n\n let user = address.substr(0, lastAt);\n let domain = address.substr(lastAt + 1);\n\n // Usernames are not touched and are kept as is even if these include unicode\n // Domains are punycoded by default\n // 'j\u00F5geva.ee' will be converted to 'xn--jgeva-dua.ee'\n // non-unicode domains are left as is\n\n let encodedDomain;\n\n try {\n encodedDomain = punycode.toASCII(domain.toLowerCase());\n } catch (err) {\n // keep as is?\n }\n\n if (user.indexOf(' ') >= 0) {\n if (user.charAt(0) !== '\"') {\n user = '\"' + user;\n }\n if (user.substr(-1) !== '\"') {\n user = user + '\"';\n }\n }\n\n return `${user}@${encodedDomain}`;\n }\n\n /**\n * If needed, mime encodes the name part\n *\n * @param {String} name Name part of an address\n * @returns {String} Mime word encoded string if needed\n */\n _encodeAddressName(name) {\n if (!/^[\\w ]*$/.test(name)) {\n if (/^[\\x20-\\x7e]*$/.test(name)) {\n return '\"' + name.replace(/([\\\\\"])/g, '\\\\$1') + '\"';\n } else {\n return mimeFuncs.encodeWord(name, this._getTextEncoding(name), 52);\n }\n }\n return name;\n }\n\n /**\n * If needed, mime encodes the name part\n *\n * @param {String} name Name part of an address\n * @returns {String} Mime word encoded string if needed\n */\n _encodeWords(value) {\n // set encodeAll parameter to true even though it is against the recommendation of RFC2047,\n // by default only words that include non-ascii should be converted into encoded words\n // but some clients (eg. Zimbra) do not handle it properly and remove surrounding whitespace\n return mimeFuncs.encodeWords(value, this._getTextEncoding(value), 52, true);\n }\n\n /**\n * Detects best mime encoding for a text value\n *\n * @param {String} value Value to check for\n * @return {String} either 'Q' or 'B'\n */\n _getTextEncoding(value) {\n value = (value || '').toString();\n\n let encoding = this.textEncoding;\n let latinLen;\n let nonLatinLen;\n\n if (!encoding) {\n // count latin alphabet symbols and 8-bit range symbols + control symbols\n // if there are more latin characters, then use quoted-printable\n // encoding, otherwise use base64\n nonLatinLen = (value.match(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\u0080-\\uFFFF]/g) || []).length; // eslint-disable-line no-control-regex\n latinLen = (value.match(/[a-z]/gi) || []).length;\n // if there are more latin symbols than binary/unicode, then prefer Q, otherwise B\n encoding = nonLatinLen < latinLen ? 'Q' : 'B';\n }\n return encoding;\n }\n\n /**\n * Generates a message id\n *\n * @return {String} Random Message-ID value\n */\n _generateMessageId() {\n return (\n '<' +\n [2, 2, 2, 6].reduce(\n // crux to generate UUID-like random strings\n (prev, len) => prev + '-' + crypto.randomBytes(len).toString('hex'),\n crypto.randomBytes(4).toString('hex')\n ) +\n '@' +\n // try to use the domain of the FROM address or fallback to server hostname\n (this.getEnvelope().from || this.hostname || 'localhost').split('@').pop() +\n '>'\n );\n }\n}\n\nmodule.exports = MimeNode;\n", "/* eslint no-undefined: 0 */\n\n'use strict';\n\nconst MimeNode = require('../mime-node');\nconst mimeFuncs = require('../mime-funcs');\nconst parseDataURI = require('../shared').parseDataURI;\n\n/**\n * Creates the object for composing a MimeNode instance out from the mail options\n *\n * @constructor\n * @param {Object} mail Mail options\n */\nclass MailComposer {\n constructor(mail) {\n this.mail = mail || {};\n this.message = false;\n }\n\n /**\n * Builds MimeNode instance\n */\n compile() {\n this._alternatives = this.getAlternatives();\n this._htmlNode = this._alternatives.filter(alternative => /^text\\/html\\b/i.test(alternative.contentType)).pop();\n this._attachments = this.getAttachments(!!this._htmlNode);\n\n this._useRelated = !!(this._htmlNode && this._attachments.related.length);\n this._useAlternative = this._alternatives.length > 1;\n this._useMixed = this._attachments.attached.length > 1 || (this._alternatives.length && this._attachments.attached.length === 1);\n\n // Compose MIME tree\n if (this.mail.raw) {\n this.message = new MimeNode('message/rfc822', { newline: this.mail.newline }).setRaw(this.mail.raw);\n } else if (this._useMixed) {\n this.message = this._createMixed();\n } else if (this._useAlternative) {\n this.message = this._createAlternative();\n } else if (this._useRelated) {\n this.message = this._createRelated();\n } else {\n this.message = this._createContentNode(\n false,\n []\n .concat(this._alternatives || [])\n .concat(this._attachments.attached || [])\n .shift() || {\n contentType: 'text/plain',\n content: ''\n }\n );\n }\n\n // Add custom headers\n if (this.mail.headers) {\n this.message.addHeader(this.mail.headers);\n }\n\n // Add headers to the root node, always overrides custom headers\n ['from', 'sender', 'to', 'cc', 'bcc', 'reply-to', 'in-reply-to', 'references', 'subject', 'message-id', 'date'].forEach(header => {\n let key = header.replace(/-(\\w)/g, (o, c) => c.toUpperCase());\n if (this.mail[key]) {\n this.message.setHeader(header, this.mail[key]);\n }\n });\n\n // Sets custom envelope\n if (this.mail.envelope) {\n this.message.setEnvelope(this.mail.envelope);\n }\n\n // ensure Message-Id value\n this.message.messageId();\n\n return this.message;\n }\n\n /**\n * List all attachments. Resulting attachment objects can be used as input for MimeNode nodes\n *\n * @param {Boolean} findRelated If true separate related attachments from attached ones\n * @returns {Object} An object of arrays (`related` and `attached`)\n */\n getAttachments(findRelated) {\n let icalEvent, eventObject;\n let attachments = [].concat(this.mail.attachments || []).map((attachment, i) => {\n let data;\n let isMessageNode = /^message\\//i.test(attachment.contentType);\n\n if (/^data:/i.test(attachment.path || attachment.href)) {\n attachment = this._processDataUrl(attachment);\n }\n\n let contentType = attachment.contentType || mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');\n let isImage = /^image\\//i.test(contentType);\n let contentDisposition = attachment.contentDisposition || (isMessageNode || (isImage && attachment.cid) ? 'inline' : 'attachment');\n\n data = {\n contentType,\n contentDisposition,\n contentTransferEncoding: 'contentTransferEncoding' in attachment ? attachment.contentTransferEncoding : 'base64'\n };\n\n if (attachment.filename) {\n data.filename = attachment.filename;\n } else if (!isMessageNode && attachment.filename !== false) {\n data.filename = (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);\n if (data.filename.indexOf('.') < 0) {\n data.filename += '.' + mimeFuncs.detectExtension(data.contentType);\n }\n }\n\n if (/^https?:\\/\\//i.test(attachment.path)) {\n attachment.href = attachment.path;\n attachment.path = undefined;\n }\n\n if (attachment.cid) {\n data.cid = attachment.cid;\n }\n\n if (attachment.raw) {\n data.raw = attachment.raw;\n } else if (attachment.path) {\n data.content = {\n path: attachment.path\n };\n } else if (attachment.href) {\n data.content = {\n href: attachment.href,\n httpHeaders: attachment.httpHeaders\n };\n } else {\n data.content = attachment.content || '';\n }\n\n if (attachment.encoding) {\n data.encoding = attachment.encoding;\n }\n\n if (attachment.headers) {\n data.headers = attachment.headers;\n }\n\n return data;\n });\n\n if (this.mail.icalEvent) {\n if (\n typeof this.mail.icalEvent === 'object' &&\n (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)\n ) {\n icalEvent = this.mail.icalEvent;\n } else {\n icalEvent = {\n content: this.mail.icalEvent\n };\n }\n\n eventObject = {};\n Object.keys(icalEvent).forEach(key => {\n eventObject[key] = icalEvent[key];\n });\n\n eventObject.contentType = 'application/ics';\n if (!eventObject.headers) {\n eventObject.headers = {};\n }\n eventObject.filename = eventObject.filename || 'invite.ics';\n eventObject.headers['Content-Disposition'] = 'attachment';\n eventObject.headers['Content-Transfer-Encoding'] = 'base64';\n }\n\n if (!findRelated) {\n return {\n attached: attachments.concat(eventObject || []),\n related: []\n };\n } else {\n return {\n attached: attachments.filter(attachment => !attachment.cid).concat(eventObject || []),\n related: attachments.filter(attachment => !!attachment.cid)\n };\n }\n }\n\n /**\n * List alternatives. Resulting objects can be used as input for MimeNode nodes\n *\n * @returns {Array} An array of alternative elements. Includes the `text` and `html` values as well\n */\n getAlternatives() {\n let alternatives = [],\n text,\n html,\n watchHtml,\n amp,\n icalEvent,\n eventObject;\n\n if (this.mail.text) {\n if (typeof this.mail.text === 'object' && (this.mail.text.content || this.mail.text.path || this.mail.text.href || this.mail.text.raw)) {\n text = this.mail.text;\n } else {\n text = {\n content: this.mail.text\n };\n }\n text.contentType = 'text/plain; charset=utf-8';\n }\n\n if (this.mail.watchHtml) {\n if (\n typeof this.mail.watchHtml === 'object' &&\n (this.mail.watchHtml.content || this.mail.watchHtml.path || this.mail.watchHtml.href || this.mail.watchHtml.raw)\n ) {\n watchHtml = this.mail.watchHtml;\n } else {\n watchHtml = {\n content: this.mail.watchHtml\n };\n }\n watchHtml.contentType = 'text/watch-html; charset=utf-8';\n }\n\n if (this.mail.amp) {\n if (typeof this.mail.amp === 'object' && (this.mail.amp.content || this.mail.amp.path || this.mail.amp.href || this.mail.amp.raw)) {\n amp = this.mail.amp;\n } else {\n amp = {\n content: this.mail.amp\n };\n }\n amp.contentType = 'text/x-amp-html; charset=utf-8';\n }\n\n // NB! when including attachments with a calendar alternative you might end up in a blank screen on some clients\n if (this.mail.icalEvent) {\n if (\n typeof this.mail.icalEvent === 'object' &&\n (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)\n ) {\n icalEvent = this.mail.icalEvent;\n } else {\n icalEvent = {\n content: this.mail.icalEvent\n };\n }\n\n eventObject = {};\n Object.keys(icalEvent).forEach(key => {\n eventObject[key] = icalEvent[key];\n });\n\n if (eventObject.content && typeof eventObject.content === 'object') {\n // we are going to have the same attachment twice, so mark this to be\n // resolved just once\n eventObject.content._resolve = true;\n }\n\n eventObject.filename = false;\n eventObject.contentType = 'text/calendar; charset=utf-8; method=' + (eventObject.method || 'PUBLISH').toString().trim().toUpperCase();\n if (!eventObject.headers) {\n eventObject.headers = {};\n }\n }\n\n if (this.mail.html) {\n if (typeof this.mail.html === 'object' && (this.mail.html.content || this.mail.html.path || this.mail.html.href || this.mail.html.raw)) {\n html = this.mail.html;\n } else {\n html = {\n content: this.mail.html\n };\n }\n html.contentType = 'text/html; charset=utf-8';\n }\n\n []\n .concat(text || [])\n .concat(watchHtml || [])\n .concat(amp || [])\n .concat(html || [])\n .concat(eventObject || [])\n .concat(this.mail.alternatives || [])\n .forEach(alternative => {\n let data;\n\n if (/^data:/i.test(alternative.path || alternative.href)) {\n alternative = this._processDataUrl(alternative);\n }\n\n data = {\n contentType: alternative.contentType || mimeFuncs.detectMimeType(alternative.filename || alternative.path || alternative.href || 'txt'),\n contentTransferEncoding: alternative.contentTransferEncoding\n };\n\n if (alternative.filename) {\n data.filename = alternative.filename;\n }\n\n if (/^https?:\\/\\//i.test(alternative.path)) {\n alternative.href = alternative.path;\n alternative.path = undefined;\n }\n\n if (alternative.raw) {\n data.raw = alternative.raw;\n } else if (alternative.path) {\n data.content = {\n path: alternative.path\n };\n } else if (alternative.href) {\n data.content = {\n href: alternative.href\n };\n } else {\n data.content = alternative.content || '';\n }\n\n if (alternative.encoding) {\n data.encoding = alternative.encoding;\n }\n\n if (alternative.headers) {\n data.headers = alternative.headers;\n }\n\n alternatives.push(data);\n });\n\n return alternatives;\n }\n\n /**\n * Builds multipart/mixed node. It should always contain different type of elements on the same level\n * eg. text + attachments\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createMixed(parentNode) {\n let node;\n\n if (!parentNode) {\n node = new MimeNode('multipart/mixed', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n } else {\n node = parentNode.createChild('multipart/mixed', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n }\n\n if (this._useAlternative) {\n this._createAlternative(node);\n } else if (this._useRelated) {\n this._createRelated(node);\n }\n\n []\n .concat((!this._useAlternative && this._alternatives) || [])\n .concat(this._attachments.attached || [])\n .forEach(element => {\n // if the element is a html node from related subpart then ignore it\n if (!this._useRelated || element !== this._htmlNode) {\n this._createContentNode(node, element);\n }\n });\n\n return node;\n }\n\n /**\n * Builds multipart/alternative node. It should always contain same type of elements on the same level\n * eg. text + html view of the same data\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createAlternative(parentNode) {\n let node;\n\n if (!parentNode) {\n node = new MimeNode('multipart/alternative', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n } else {\n node = parentNode.createChild('multipart/alternative', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n }\n\n this._alternatives.forEach(alternative => {\n if (this._useRelated && this._htmlNode === alternative) {\n this._createRelated(node);\n } else {\n this._createContentNode(node, alternative);\n }\n });\n\n return node;\n }\n\n /**\n * Builds multipart/related node. It should always contain html node with related attachments\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createRelated(parentNode) {\n let node;\n\n if (!parentNode) {\n node = new MimeNode('multipart/related; type=\"text/html\"', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n } else {\n node = parentNode.createChild('multipart/related; type=\"text/html\"', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n }\n\n this._createContentNode(node, this._htmlNode);\n\n this._attachments.related.forEach(alternative => this._createContentNode(node, alternative));\n\n return node;\n }\n\n /**\n * Creates a regular node with contents\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @param {Object} element Node data\n * @returns {Object} MimeNode node element\n */\n _createContentNode(parentNode, element) {\n element = element || {};\n element.content = element.content || '';\n\n let node;\n let encoding = (element.encoding || 'utf8')\n .toString()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n\n if (!parentNode) {\n node = new MimeNode(element.contentType, {\n filename: element.filename,\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n } else {\n node = parentNode.createChild(element.contentType, {\n filename: element.filename,\n textEncoding: this.mail.textEncoding,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n }\n\n // add custom headers\n if (element.headers) {\n node.addHeader(element.headers);\n }\n\n if (element.cid) {\n node.setHeader('Content-Id', '<' + element.cid.replace(/[<>]/g, '') + '>');\n }\n\n if (element.contentTransferEncoding) {\n node.setHeader('Content-Transfer-Encoding', element.contentTransferEncoding);\n } else if (this.mail.encoding && /^text\\//i.test(element.contentType)) {\n node.setHeader('Content-Transfer-Encoding', this.mail.encoding);\n }\n\n if (!/^text\\//i.test(element.contentType) || element.contentDisposition) {\n node.setHeader(\n 'Content-Disposition',\n element.contentDisposition || (element.cid && /^image\\//i.test(element.contentType) ? 'inline' : 'attachment')\n );\n }\n\n if (typeof element.content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {\n element.content = Buffer.from(element.content, encoding);\n }\n\n // prefer pregenerated raw content\n if (element.raw) {\n node.setRaw(element.raw);\n } else {\n node.setContent(element.content);\n }\n\n return node;\n }\n\n /**\n * Parses data uri and converts it to a Buffer\n *\n * @param {Object} element Content element\n * @return {Object} Parsed element\n */\n _processDataUrl(element) {\n let parsedDataUri;\n if ((element.path || element.href).match(/^data:/)) {\n parsedDataUri = parseDataURI(element.path || element.href);\n }\n\n if (!parsedDataUri) {\n return element;\n }\n\n element.content = parsedDataUri.data;\n element.contentType = element.contentType || parsedDataUri.contentType;\n\n if ('path' in element) {\n element.path = false;\n }\n\n if ('href' in element) {\n element.href = false;\n }\n\n return element;\n }\n}\n\nmodule.exports = MailComposer;\n", "'use strict';\n\nconst Transform = require('stream').Transform;\n\n/**\n * MessageParser instance is a transform stream that separates message headers\n * from the rest of the body. Headers are emitted with the 'headers' event. Message\n * body is passed on as the resulting stream.\n */\nclass MessageParser extends Transform {\n constructor(options) {\n super(options);\n this.lastBytes = Buffer.alloc(4);\n this.headersParsed = false;\n this.headerBytes = 0;\n this.headerChunks = [];\n this.rawHeaders = false;\n this.bodySize = 0;\n }\n\n /**\n * Keeps count of the last 4 bytes in order to detect line breaks on chunk boundaries\n *\n * @param {Buffer} data Next data chunk from the stream\n */\n updateLastBytes(data) {\n let lblen = this.lastBytes.length;\n let nblen = Math.min(data.length, lblen);\n\n // shift existing bytes\n for (let i = 0, len = lblen - nblen; i < len; i++) {\n this.lastBytes[i] = this.lastBytes[i + nblen];\n }\n\n // add new bytes\n for (let i = 1; i <= nblen; i++) {\n this.lastBytes[lblen - i] = data[data.length - i];\n }\n }\n\n /**\n * Finds and removes message headers from the remaining body. We want to keep\n * headers separated until final delivery to be able to modify these\n *\n * @param {Buffer} data Next chunk of data\n * @return {Boolean} Returns true if headers are already found or false otherwise\n */\n checkHeaders(data) {\n if (this.headersParsed) {\n return true;\n }\n\n let lblen = this.lastBytes.length;\n let headerPos = 0;\n this.curLinePos = 0;\n for (let i = 0, len = this.lastBytes.length + data.length; i < len; i++) {\n let chr;\n if (i < lblen) {\n chr = this.lastBytes[i];\n } else {\n chr = data[i - lblen];\n }\n if (chr === 0x0a && i) {\n let pr1 = i - 1 < lblen ? this.lastBytes[i - 1] : data[i - 1 - lblen];\n let pr2 = i > 1 ? (i - 2 < lblen ? this.lastBytes[i - 2] : data[i - 2 - lblen]) : false;\n if (pr1 === 0x0a) {\n this.headersParsed = true;\n headerPos = i - lblen + 1;\n this.headerBytes += headerPos;\n break;\n } else if (pr1 === 0x0d && pr2 === 0x0a) {\n this.headersParsed = true;\n headerPos = i - lblen + 1;\n this.headerBytes += headerPos;\n break;\n }\n }\n }\n\n if (this.headersParsed) {\n this.headerChunks.push(data.slice(0, headerPos));\n this.rawHeaders = Buffer.concat(this.headerChunks, this.headerBytes);\n this.headerChunks = null;\n this.emit('headers', this.parseHeaders());\n if (data.length - 1 > headerPos) {\n let chunk = data.slice(headerPos);\n this.bodySize += chunk.length;\n // this would be the first chunk of data sent downstream\n setImmediate(() => this.push(chunk));\n }\n return false;\n } else {\n this.headerBytes += data.length;\n this.headerChunks.push(data);\n }\n\n // store last 4 bytes to catch header break\n this.updateLastBytes(data);\n\n return false;\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n let headersFound;\n\n try {\n headersFound = this.checkHeaders(chunk);\n } catch (E) {\n return callback(E);\n }\n\n if (headersFound) {\n this.bodySize += chunk.length;\n this.push(chunk);\n }\n\n setImmediate(callback);\n }\n\n _flush(callback) {\n if (this.headerChunks) {\n let chunk = Buffer.concat(this.headerChunks, this.headerBytes);\n this.bodySize += chunk.length;\n this.push(chunk);\n this.headerChunks = null;\n }\n callback();\n }\n\n parseHeaders() {\n let lines = (this.rawHeaders || '').toString().split(/\\r?\\n/);\n for (let i = lines.length - 1; i > 0; i--) {\n if (/^\\s/.test(lines[i])) {\n lines[i - 1] += '\\n' + lines[i];\n lines.splice(i, 1);\n }\n }\n return lines\n .filter(line => line.trim())\n .map(line => ({\n key: line.substr(0, line.indexOf(':')).trim().toLowerCase(),\n line\n }));\n }\n}\n\nmodule.exports = MessageParser;\n", "'use strict';\n\n// streams through a message body and calculates relaxed body hash\n\nconst Transform = require('stream').Transform;\nconst crypto = require('crypto');\n\nclass RelaxedBody extends Transform {\n constructor(options) {\n super();\n options = options || {};\n this.chunkBuffer = [];\n this.chunkBufferLen = 0;\n this.bodyHash = crypto.createHash(options.hashAlgo || 'sha1');\n this.remainder = '';\n this.byteLength = 0;\n\n this.debug = options.debug;\n this._debugBody = options.debug ? [] : false;\n }\n\n updateHash(chunk) {\n let bodyStr;\n\n // find next remainder\n let nextRemainder = '';\n\n // This crux finds and removes the spaces from the last line and the newline characters after the last non-empty line\n // If we get another chunk that does not match this description then we can restore the previously processed data\n let state = 'file';\n for (let i = chunk.length - 1; i >= 0; i--) {\n let c = chunk[i];\n\n if (state === 'file' && (c === 0x0a || c === 0x0d)) {\n // do nothing, found \\n or \\r at the end of chunk, stil end of file\n } else if (state === 'file' && (c === 0x09 || c === 0x20)) {\n // switch to line ending mode, this is the last non-empty line\n state = 'line';\n } else if (state === 'line' && (c === 0x09 || c === 0x20)) {\n // do nothing, found ' ' or \\t at the end of line, keep processing the last non-empty line\n } else if (state === 'file' || state === 'line') {\n // non line/file ending character found, switch to body mode\n state = 'body';\n if (i === chunk.length - 1) {\n // final char is not part of line end or file end, so do nothing\n break;\n }\n }\n\n if (i === 0) {\n // reached to the beginning of the chunk, check if it is still about the ending\n // and if the remainder also matches\n if (\n (state === 'file' && (!this.remainder || /[\\r\\n]$/.test(this.remainder))) ||\n (state === 'line' && (!this.remainder || /[ \\t]$/.test(this.remainder)))\n ) {\n // keep everything\n this.remainder += chunk.toString('binary');\n return;\n } else if (state === 'line' || state === 'file') {\n // process existing remainder as normal line but store the current chunk\n nextRemainder = chunk.toString('binary');\n chunk = false;\n break;\n }\n }\n\n if (state !== 'body') {\n continue;\n }\n\n // reached first non ending byte\n nextRemainder = chunk.slice(i + 1).toString('binary');\n chunk = chunk.slice(0, i + 1);\n break;\n }\n\n let needsFixing = !!this.remainder;\n if (chunk && !needsFixing) {\n // check if we even need to change anything\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (i && chunk[i] === 0x0a && chunk[i - 1] !== 0x0d) {\n // missing \\r before \\n\n needsFixing = true;\n break;\n } else if (i && chunk[i] === 0x0d && chunk[i - 1] === 0x20) {\n // trailing WSP found\n needsFixing = true;\n break;\n } else if (i && chunk[i] === 0x20 && chunk[i - 1] === 0x20) {\n // multiple spaces found, needs to be replaced with just one\n needsFixing = true;\n break;\n } else if (chunk[i] === 0x09) {\n // TAB found, needs to be replaced with a space\n needsFixing = true;\n break;\n }\n }\n }\n\n if (needsFixing) {\n bodyStr = this.remainder + (chunk ? chunk.toString('binary') : '');\n this.remainder = nextRemainder;\n bodyStr = bodyStr\n .replace(/\\r?\\n/g, '\\n') // use js line endings\n .replace(/[ \\t]*$/gm, '') // remove line endings, rtrim\n .replace(/[ \\t]+/gm, ' ') // single spaces\n .replace(/\\n/g, '\\r\\n'); // restore rfc822 line endings\n chunk = Buffer.from(bodyStr, 'binary');\n } else if (nextRemainder) {\n this.remainder = nextRemainder;\n }\n\n if (this.debug) {\n this._debugBody.push(chunk);\n }\n this.bodyHash.update(chunk);\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n this.updateHash(chunk);\n\n this.byteLength += chunk.length;\n this.push(chunk);\n callback();\n }\n\n _flush(callback) {\n // generate final hash and emit it\n if (/[\\r\\n]$/.test(this.remainder) && this.byteLength > 2) {\n // add terminating line end\n this.bodyHash.update(Buffer.from('\\r\\n'));\n }\n if (!this.byteLength) {\n // emit empty line buffer to keep the stream flowing\n this.push(Buffer.from('\\r\\n'));\n // this.bodyHash.update(Buffer.from('\\r\\n'));\n }\n\n this.emit('hash', this.bodyHash.digest('base64'), this.debug ? Buffer.concat(this._debugBody) : false);\n callback();\n }\n}\n\nmodule.exports = RelaxedBody;\n", "'use strict';\n\nconst punycode = require('../punycode');\nconst mimeFuncs = require('../mime-funcs');\nconst crypto = require('crypto');\n\n/**\n * Returns DKIM signature header line\n *\n * @param {Object} headers Parsed headers object from MessageParser\n * @param {String} bodyHash Base64 encoded hash of the message\n * @param {Object} options DKIM options\n * @param {String} options.domainName Domain name to be signed for\n * @param {String} options.keySelector DKIM key selector to use\n * @param {String} options.privateKey DKIM private key to use\n * @return {String} Complete header line\n */\n\nmodule.exports = (headers, hashAlgo, bodyHash, options) => {\n options = options || {};\n\n // all listed fields from RFC4871 #5.5\n let defaultFieldNames =\n 'From:Sender:Reply-To:Subject:Date:Message-ID:To:' +\n 'Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:' +\n 'Content-Description:Resent-Date:Resent-From:Resent-Sender:' +\n 'Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:' +\n 'List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:' +\n 'List-Owner:List-Archive';\n\n let fieldNames = options.headerFieldNames || defaultFieldNames;\n\n let canonicalizedHeaderData = relaxedHeaders(headers, fieldNames, options.skipFields);\n let dkimHeader = generateDKIMHeader(options.domainName, options.keySelector, canonicalizedHeaderData.fieldNames, hashAlgo, bodyHash);\n\n let signer, signature;\n\n canonicalizedHeaderData.headers += 'dkim-signature:' + relaxedHeaderLine(dkimHeader);\n\n signer = crypto.createSign(('rsa-' + hashAlgo).toUpperCase());\n signer.update(canonicalizedHeaderData.headers);\n try {\n signature = signer.sign(options.privateKey, 'base64');\n } catch (E) {\n return false;\n }\n\n return dkimHeader + signature.replace(/(^.{73}|.{75}(?!\\r?\\n|\\r))/g, '$&\\r\\n ').trim();\n};\n\nmodule.exports.relaxedHeaders = relaxedHeaders;\n\nfunction generateDKIMHeader(domainName, keySelector, fieldNames, hashAlgo, bodyHash) {\n let dkim = [\n 'v=1',\n 'a=rsa-' + hashAlgo,\n 'c=relaxed/relaxed',\n 'd=' + punycode.toASCII(domainName),\n 'q=dns/txt',\n 's=' + keySelector,\n 'bh=' + bodyHash,\n 'h=' + fieldNames\n ].join('; ');\n\n return mimeFuncs.foldLines('DKIM-Signature: ' + dkim, 76) + ';\\r\\n b=';\n}\n\nfunction relaxedHeaders(headers, fieldNames, skipFields) {\n let includedFields = new Set();\n let skip = new Set();\n let headerFields = new Map();\n\n (skipFields || '')\n .toLowerCase()\n .split(':')\n .forEach(field => {\n skip.add(field.trim());\n });\n\n (fieldNames || '')\n .toLowerCase()\n .split(':')\n .filter(field => !skip.has(field.trim()))\n .forEach(field => {\n includedFields.add(field.trim());\n });\n\n for (let i = headers.length - 1; i >= 0; i--) {\n let line = headers[i];\n // only include the first value from bottom to top\n if (includedFields.has(line.key) && !headerFields.has(line.key)) {\n headerFields.set(line.key, relaxedHeaderLine(line.line));\n }\n }\n\n let headersList = [];\n let fields = [];\n includedFields.forEach(field => {\n if (headerFields.has(field)) {\n fields.push(field);\n headersList.push(field + ':' + headerFields.get(field));\n }\n });\n\n return {\n headers: headersList.join('\\r\\n') + '\\r\\n',\n fieldNames: fields.join(':')\n };\n}\n\nfunction relaxedHeaderLine(line) {\n return line\n .substr(line.indexOf(':') + 1)\n .replace(/\\r?\\n/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n", "'use strict';\n\n// FIXME:\n// replace this Transform mess with a method that pipes input argument to output argument\n\nconst MessageParser = require('./message-parser');\nconst RelaxedBody = require('./relaxed-body');\nconst sign = require('./sign');\nconst PassThrough = require('stream').PassThrough;\nconst fs = require('fs');\nconst path = require('path');\nconst crypto = require('crypto');\n\nconst DKIM_ALGO = 'sha256';\nconst MAX_MESSAGE_SIZE = 128 * 1024; // buffer messages larger than this to disk\n\n/*\n// Usage:\n\nlet dkim = new DKIM({\n domainName: 'example.com',\n keySelector: 'key-selector',\n privateKey,\n cacheDir: '/tmp'\n});\ndkim.sign(input).pipe(process.stdout);\n\n// Where inputStream is a rfc822 message (either a stream, string or Buffer)\n// and outputStream is a DKIM signed rfc822 message\n*/\n\nclass DKIMSigner {\n constructor(options, keys, input, output) {\n this.options = options || {};\n this.keys = keys;\n\n this.cacheTreshold = Number(this.options.cacheTreshold) || MAX_MESSAGE_SIZE;\n this.hashAlgo = this.options.hashAlgo || DKIM_ALGO;\n\n this.cacheDir = this.options.cacheDir || false;\n\n this.chunks = [];\n this.chunklen = 0;\n this.readPos = 0;\n this.cachePath = this.cacheDir ? path.join(this.cacheDir, 'message.' + Date.now() + '-' + crypto.randomBytes(14).toString('hex')) : false;\n this.cache = false;\n\n this.headers = false;\n this.bodyHash = false;\n this.parser = false;\n this.relaxedBody = false;\n\n this.input = input;\n this.output = output;\n this.output.usingCache = false;\n\n this.hasErrored = false;\n\n this.input.on('error', err => {\n this.hasErrored = true;\n this.cleanup();\n output.emit('error', err);\n });\n }\n\n cleanup() {\n if (!this.cache || !this.cachePath) {\n return;\n }\n fs.unlink(this.cachePath, () => false);\n }\n\n createReadCache() {\n // pipe remainings to cache file\n this.cache = fs.createReadStream(this.cachePath);\n this.cache.once('error', err => {\n this.cleanup();\n this.output.emit('error', err);\n });\n this.cache.once('close', () => {\n this.cleanup();\n });\n this.cache.pipe(this.output);\n }\n\n sendNextChunk() {\n if (this.hasErrored) {\n return;\n }\n\n if (this.readPos >= this.chunks.length) {\n if (!this.cache) {\n return this.output.end();\n }\n return this.createReadCache();\n }\n let chunk = this.chunks[this.readPos++];\n if (this.output.write(chunk) === false) {\n return this.output.once('drain', () => {\n this.sendNextChunk();\n });\n }\n setImmediate(() => this.sendNextChunk());\n }\n\n sendSignedOutput() {\n let keyPos = 0;\n let signNextKey = () => {\n if (keyPos >= this.keys.length) {\n this.output.write(this.parser.rawHeaders);\n return setImmediate(() => this.sendNextChunk());\n }\n let key = this.keys[keyPos++];\n let dkimField = sign(this.headers, this.hashAlgo, this.bodyHash, {\n domainName: key.domainName,\n keySelector: key.keySelector,\n privateKey: key.privateKey,\n headerFieldNames: this.options.headerFieldNames,\n skipFields: this.options.skipFields\n });\n if (dkimField) {\n this.output.write(Buffer.from(dkimField + '\\r\\n'));\n }\n return setImmediate(signNextKey);\n };\n\n if (this.bodyHash && this.headers) {\n return signNextKey();\n }\n\n this.output.write(this.parser.rawHeaders);\n this.sendNextChunk();\n }\n\n createWriteCache() {\n this.output.usingCache = true;\n // pipe remainings to cache file\n this.cache = fs.createWriteStream(this.cachePath);\n this.cache.once('error', err => {\n this.cleanup();\n // drain input\n this.relaxedBody.unpipe(this.cache);\n this.relaxedBody.on('readable', () => {\n while (this.relaxedBody.read() !== null) {\n // do nothing\n }\n });\n this.hasErrored = true;\n // emit error\n this.output.emit('error', err);\n });\n this.cache.once('close', () => {\n this.sendSignedOutput();\n });\n this.relaxedBody.removeAllListeners('readable');\n this.relaxedBody.pipe(this.cache);\n }\n\n signStream() {\n this.parser = new MessageParser();\n this.relaxedBody = new RelaxedBody({\n hashAlgo: this.hashAlgo\n });\n\n this.parser.on('headers', value => {\n this.headers = value;\n });\n\n this.relaxedBody.on('hash', value => {\n this.bodyHash = value;\n });\n\n this.relaxedBody.on('readable', () => {\n let chunk;\n if (this.cache) {\n return;\n }\n while ((chunk = this.relaxedBody.read()) !== null) {\n this.chunks.push(chunk);\n this.chunklen += chunk.length;\n if (this.chunklen >= this.cacheTreshold && this.cachePath) {\n return this.createWriteCache();\n }\n }\n });\n\n this.relaxedBody.on('end', () => {\n if (this.cache) {\n return;\n }\n this.sendSignedOutput();\n });\n\n this.parser.pipe(this.relaxedBody);\n setImmediate(() => this.input.pipe(this.parser));\n }\n}\n\nclass DKIM {\n constructor(options) {\n this.options = options || {};\n this.keys = [].concat(\n this.options.keys || {\n domainName: options.domainName,\n keySelector: options.keySelector,\n privateKey: options.privateKey\n }\n );\n }\n\n sign(input, extraOptions) {\n let output = new PassThrough();\n let inputStream = input;\n let writeValue = false;\n\n if (Buffer.isBuffer(input)) {\n writeValue = input;\n inputStream = new PassThrough();\n } else if (typeof input === 'string') {\n writeValue = Buffer.from(input);\n inputStream = new PassThrough();\n }\n\n let options = this.options;\n if (extraOptions && Object.keys(extraOptions).length) {\n options = {};\n Object.keys(this.options || {}).forEach(key => {\n options[key] = this.options[key];\n });\n Object.keys(extraOptions || {}).forEach(key => {\n if (!(key in options)) {\n options[key] = extraOptions[key];\n }\n });\n }\n\n let signer = new DKIMSigner(options, this.keys, inputStream, output);\n setImmediate(() => {\n signer.signStream();\n if (writeValue) {\n setImmediate(() => {\n inputStream.end(writeValue);\n });\n }\n });\n\n return output;\n }\n}\n\nmodule.exports = DKIM;\n", "'use strict';\n\n/**\n * Minimal HTTP/S proxy client\n */\n\nconst net = require('net');\nconst tls = require('tls');\nconst urllib = require('url');\n\n/**\n * Establishes proxied connection to destinationPort\n *\n * httpProxyClient(\"http://localhost:3128/\", 80, \"google.com\", function(err, socket){\n * socket.write(\"GET / HTTP/1.0\\r\\n\\r\\n\");\n * });\n *\n * @param {String} proxyUrl proxy configuration, etg \"http://proxy.host:3128/\"\n * @param {Number} destinationPort Port to open in destination host\n * @param {String} destinationHost Destination hostname\n * @param {Function} callback Callback to run with the rocket object once connection is established\n */\nfunction httpProxyClient(proxyUrl, destinationPort, destinationHost, callback) {\n let proxy = urllib.parse(proxyUrl);\n\n // create a socket connection to the proxy server\n let options;\n let connect;\n let socket;\n\n options = {\n host: proxy.hostname,\n port: Number(proxy.port) ? Number(proxy.port) : proxy.protocol === 'https:' ? 443 : 80\n };\n\n if (proxy.protocol === 'https:') {\n // we can use untrusted proxies as long as we verify actual SMTP certificates\n options.rejectUnauthorized = false;\n connect = tls.connect.bind(tls);\n } else {\n connect = net.connect.bind(net);\n }\n\n // Error harness for initial connection. Once connection is established, the responsibility\n // to handle errors is passed to whoever uses this socket\n let finished = false;\n let tempSocketErr = err => {\n if (finished) {\n return;\n }\n finished = true;\n try {\n socket.destroy();\n } catch (E) {\n // ignore\n }\n callback(err);\n };\n\n let timeoutErr = () => {\n let err = new Error('Proxy socket timed out');\n err.code = 'ETIMEDOUT';\n tempSocketErr(err);\n };\n\n socket = connect(options, () => {\n if (finished) {\n return;\n }\n\n let reqHeaders = {\n Host: destinationHost + ':' + destinationPort,\n Connection: 'close'\n };\n if (proxy.auth) {\n reqHeaders['Proxy-Authorization'] = 'Basic ' + Buffer.from(proxy.auth).toString('base64');\n }\n\n socket.write(\n // HTTP method\n 'CONNECT ' +\n destinationHost +\n ':' +\n destinationPort +\n ' HTTP/1.1\\r\\n' +\n // HTTP request headers\n Object.keys(reqHeaders)\n .map(key => key + ': ' + reqHeaders[key])\n .join('\\r\\n') +\n // End request\n '\\r\\n\\r\\n'\n );\n\n let headers = '';\n let onSocketData = chunk => {\n let match;\n let remainder;\n\n if (finished) {\n return;\n }\n\n headers += chunk.toString('binary');\n if ((match = headers.match(/\\r\\n\\r\\n/))) {\n socket.removeListener('data', onSocketData);\n\n remainder = headers.substr(match.index + match[0].length);\n headers = headers.substr(0, match.index);\n if (remainder) {\n socket.unshift(Buffer.from(remainder, 'binary'));\n }\n\n // proxy connection is now established\n finished = true;\n\n // check response code\n match = headers.match(/^HTTP\\/\\d+\\.\\d+ (\\d+)/i);\n if (!match || (match[1] || '').charAt(0) !== '2') {\n try {\n socket.destroy();\n } catch (E) {\n // ignore\n }\n return callback(new Error('Invalid response from proxy' + ((match && ': ' + match[1]) || '')));\n }\n\n socket.removeListener('error', tempSocketErr);\n socket.removeListener('timeout', timeoutErr);\n socket.setTimeout(0);\n\n return callback(null, socket);\n }\n };\n socket.on('data', onSocketData);\n });\n\n socket.setTimeout(httpProxyClient.timeout || 30 * 1000);\n socket.on('timeout', timeoutErr);\n\n socket.once('error', tempSocketErr);\n}\n\nmodule.exports = httpProxyClient;\n", "'use strict';\n\nconst shared = require('../shared');\nconst MimeNode = require('../mime-node');\nconst mimeFuncs = require('../mime-funcs');\n\nclass MailMessage {\n constructor(mailer, data) {\n this.mailer = mailer;\n this.data = {};\n this.message = null;\n\n data = data || {};\n let options = mailer.options || {};\n let defaults = mailer._defaults || {};\n\n Object.keys(data).forEach(key => {\n this.data[key] = data[key];\n });\n\n this.data.headers = this.data.headers || {};\n\n // apply defaults\n Object.keys(defaults).forEach(key => {\n if (!(key in this.data)) {\n this.data[key] = defaults[key];\n } else if (key === 'headers') {\n // headers is a special case. Allow setting individual default headers\n Object.keys(defaults.headers).forEach(key => {\n if (!(key in this.data.headers)) {\n this.data.headers[key] = defaults.headers[key];\n }\n });\n }\n });\n\n // force specific keys from transporter options\n ['disableFileAccess', 'disableUrlAccess', 'normalizeHeaderKey'].forEach(key => {\n if (key in options) {\n this.data[key] = options[key];\n }\n });\n }\n\n resolveContent(...args) {\n return shared.resolveContent(...args);\n }\n\n resolveAll(callback) {\n let keys = [\n [this.data, 'html'],\n [this.data, 'text'],\n [this.data, 'watchHtml'],\n [this.data, 'amp'],\n [this.data, 'icalEvent']\n ];\n\n if (this.data.alternatives && this.data.alternatives.length) {\n this.data.alternatives.forEach((alternative, i) => {\n keys.push([this.data.alternatives, i]);\n });\n }\n\n if (this.data.attachments && this.data.attachments.length) {\n this.data.attachments.forEach((attachment, i) => {\n if (!attachment.filename) {\n attachment.filename = (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);\n if (attachment.filename.indexOf('.') < 0) {\n attachment.filename += '.' + mimeFuncs.detectExtension(attachment.contentType);\n }\n }\n\n if (!attachment.contentType) {\n attachment.contentType = mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');\n }\n\n keys.push([this.data.attachments, i]);\n });\n }\n\n let mimeNode = new MimeNode();\n\n let addressKeys = ['from', 'to', 'cc', 'bcc', 'sender', 'replyTo'];\n\n addressKeys.forEach(address => {\n let value;\n if (this.message) {\n value = [].concat(mimeNode._parseAddresses(this.message.getHeader(address === 'replyTo' ? 'reply-to' : address)) || []);\n } else if (this.data[address]) {\n value = [].concat(mimeNode._parseAddresses(this.data[address]) || []);\n }\n if (value && value.length) {\n this.data[address] = value;\n } else if (address in this.data) {\n this.data[address] = null;\n }\n });\n\n let singleKeys = ['from', 'sender'];\n singleKeys.forEach(address => {\n if (this.data[address]) {\n this.data[address] = this.data[address].shift();\n }\n });\n\n let pos = 0;\n let resolveNext = () => {\n if (pos >= keys.length) {\n return callback(null, this.data);\n }\n let args = keys[pos++];\n if (!args[0] || !args[0][args[1]]) {\n return resolveNext();\n }\n shared.resolveContent(...args, (err, value) => {\n if (err) {\n return callback(err);\n }\n\n let node = {\n content: value\n };\n if (args[0][args[1]] && typeof args[0][args[1]] === 'object' && !Buffer.isBuffer(args[0][args[1]])) {\n Object.keys(args[0][args[1]]).forEach(key => {\n if (!(key in node) && !['content', 'path', 'href', 'raw'].includes(key)) {\n node[key] = args[0][args[1]][key];\n }\n });\n }\n\n args[0][args[1]] = node;\n resolveNext();\n });\n };\n\n setImmediate(() => resolveNext());\n }\n\n normalize(callback) {\n let envelope = this.data.envelope || this.message.getEnvelope();\n let messageId = this.message.messageId();\n\n this.resolveAll((err, data) => {\n if (err) {\n return callback(err);\n }\n\n data.envelope = envelope;\n data.messageId = messageId;\n\n ['html', 'text', 'watchHtml', 'amp'].forEach(key => {\n if (data[key] && data[key].content) {\n if (typeof data[key].content === 'string') {\n data[key] = data[key].content;\n } else if (Buffer.isBuffer(data[key].content)) {\n data[key] = data[key].content.toString();\n }\n }\n });\n\n if (data.icalEvent && Buffer.isBuffer(data.icalEvent.content)) {\n data.icalEvent.content = data.icalEvent.content.toString('base64');\n data.icalEvent.encoding = 'base64';\n }\n\n if (data.alternatives && data.alternatives.length) {\n data.alternatives.forEach(alternative => {\n if (alternative && alternative.content && Buffer.isBuffer(alternative.content)) {\n alternative.content = alternative.content.toString('base64');\n alternative.encoding = 'base64';\n }\n });\n }\n\n if (data.attachments && data.attachments.length) {\n data.attachments.forEach(attachment => {\n if (attachment && attachment.content && Buffer.isBuffer(attachment.content)) {\n attachment.content = attachment.content.toString('base64');\n attachment.encoding = 'base64';\n }\n });\n }\n\n data.normalizedHeaders = {};\n Object.keys(data.headers || {}).forEach(key => {\n let value = [].concat(data.headers[key] || []).shift();\n value = (value && value.value) || value;\n if (value) {\n if (['references', 'in-reply-to', 'message-id', 'content-id'].includes(key)) {\n value = this.message._encodeHeaderValue(key, value);\n }\n data.normalizedHeaders[key] = value;\n }\n });\n\n if (data.list && typeof data.list === 'object') {\n let listHeaders = this._getListHeaders(data.list);\n listHeaders.forEach(entry => {\n data.normalizedHeaders[entry.key] = entry.value.map(val => (val && val.value) || val).join(', ');\n });\n }\n\n if (data.references) {\n data.normalizedHeaders.references = this.message._encodeHeaderValue('references', data.references);\n }\n\n if (data.inReplyTo) {\n data.normalizedHeaders['in-reply-to'] = this.message._encodeHeaderValue('in-reply-to', data.inReplyTo);\n }\n\n return callback(null, data);\n });\n }\n\n setMailerHeader() {\n if (!this.message || !this.data.xMailer) {\n return;\n }\n this.message.setHeader('X-Mailer', this.data.xMailer);\n }\n\n setPriorityHeaders() {\n if (!this.message || !this.data.priority) {\n return;\n }\n switch ((this.data.priority || '').toString().toLowerCase()) {\n case 'high':\n this.message.setHeader('X-Priority', '1 (Highest)');\n this.message.setHeader('X-MSMail-Priority', 'High');\n this.message.setHeader('Importance', 'High');\n break;\n case 'low':\n this.message.setHeader('X-Priority', '5 (Lowest)');\n this.message.setHeader('X-MSMail-Priority', 'Low');\n this.message.setHeader('Importance', 'Low');\n break;\n default:\n // do not add anything, since all messages are 'Normal' by default\n }\n }\n\n setListHeaders() {\n if (!this.message || !this.data.list || typeof this.data.list !== 'object') {\n return;\n }\n // add optional List-* headers\n if (this.data.list && typeof this.data.list === 'object') {\n this._getListHeaders(this.data.list).forEach(listHeader => {\n listHeader.value.forEach(value => {\n this.message.addHeader(listHeader.key, value);\n });\n });\n }\n }\n\n _getListHeaders(listData) {\n // make sure an url looks like <protocol:url>\n return Object.keys(listData).map(key => ({\n key: 'list-' + key.toLowerCase().trim(),\n value: [].concat(listData[key] || []).map(value => ({\n prepared: true,\n foldLines: true,\n value: []\n .concat(value || [])\n .map(value => {\n if (typeof value === 'string') {\n value = {\n url: value\n };\n }\n\n if (value && value.url) {\n if (key.toLowerCase().trim() === 'id') {\n // List-ID: \"comment\" <domain>\n let comment = value.comment || '';\n if (mimeFuncs.isPlainText(comment)) {\n comment = '\"' + comment + '\"';\n } else {\n comment = mimeFuncs.encodeWord(comment);\n }\n\n return (value.comment ? comment + ' ' : '') + this._formatListUrl(value.url).replace(/^<[^:]+\\/{,2}/, '');\n }\n\n // List-*: <http://domain> (comment)\n let comment = value.comment || '';\n if (!mimeFuncs.isPlainText(comment)) {\n comment = mimeFuncs.encodeWord(comment);\n }\n\n return this._formatListUrl(value.url) + (value.comment ? ' (' + comment + ')' : '');\n }\n\n return '';\n })\n .filter(value => value)\n .join(', ')\n }))\n }));\n }\n\n _formatListUrl(url) {\n url = url.replace(/[\\s<]+|[\\s>]+/g, '');\n if (/^(https?|mailto|ftp):/.test(url)) {\n return '<' + url + '>';\n }\n if (/^[^@]+@[^@]+$/.test(url)) {\n return '<mailto:' + url + '>';\n }\n\n return '<http://' + url + '>';\n }\n}\n\nmodule.exports = MailMessage;\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst shared = require('../shared');\nconst mimeTypes = require('../mime-funcs/mime-types');\nconst MailComposer = require('../mail-composer');\nconst DKIM = require('../dkim');\nconst httpProxyClient = require('../smtp-connection/http-proxy-client');\nconst util = require('util');\nconst urllib = require('url');\nconst packageData = require('../../package.json');\nconst MailMessage = require('./mail-message');\nconst net = require('net');\nconst dns = require('dns');\nconst crypto = require('crypto');\n\n/**\n * Creates an object for exposing the Mail API\n *\n * @constructor\n * @param {Object} transporter Transport object instance to pass the mails to\n */\nclass Mail extends EventEmitter {\n constructor(transporter, options, defaults) {\n super();\n\n this.options = options || {};\n this._defaults = defaults || {};\n\n this._defaultPlugins = {\n compile: [(...args) => this._convertDataImages(...args)],\n stream: []\n };\n\n this._userPlugins = {\n compile: [],\n stream: []\n };\n\n this.meta = new Map();\n\n this.dkim = this.options.dkim ? new DKIM(this.options.dkim) : false;\n\n this.transporter = transporter;\n this.transporter.mailer = this;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'mail'\n });\n\n this.logger.debug(\n {\n tnx: 'create'\n },\n 'Creating transport: %s',\n this.getVersionString()\n );\n\n // setup emit handlers for the transporter\n if (typeof this.transporter.on === 'function') {\n // deprecated log interface\n this.transporter.on('log', log => {\n this.logger.debug(\n {\n tnx: 'transport'\n },\n '%s: %s',\n log.type,\n log.message\n );\n });\n\n // transporter errors\n this.transporter.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'transport'\n },\n 'Transport Error: %s',\n err.message\n );\n this.emit('error', err);\n });\n\n // indicates if the sender has became idle\n this.transporter.on('idle', (...args) => {\n this.emit('idle', ...args);\n });\n }\n\n /**\n * Optional methods passed to the underlying transport object\n */\n ['close', 'isIdle', 'verify'].forEach(method => {\n this[method] = (...args) => {\n if (typeof this.transporter[method] === 'function') {\n if (method === 'verify' && typeof this.getSocket === 'function') {\n this.transporter.getSocket = this.getSocket;\n this.getSocket = false;\n }\n return this.transporter[method](...args);\n } else {\n this.logger.warn(\n {\n tnx: 'transport',\n methodName: method\n },\n 'Non existing method %s called for transport',\n method\n );\n return false;\n }\n };\n });\n\n // setup proxy handling\n if (this.options.proxy && typeof this.options.proxy === 'string') {\n this.setupProxy(this.options.proxy);\n }\n }\n\n use(step, plugin) {\n step = (step || '').toString();\n if (!this._userPlugins.hasOwnProperty(step)) {\n this._userPlugins[step] = [plugin];\n } else {\n this._userPlugins[step].push(plugin);\n }\n\n return this;\n }\n\n /**\n * Sends an email using the preselected transport object\n *\n * @param {Object} data E-data description\n * @param {Function?} callback Callback to run once the sending succeeded or failed\n */\n sendMail(data, callback = null) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n if (typeof this.getSocket === 'function') {\n this.transporter.getSocket = this.getSocket;\n this.getSocket = false;\n }\n\n let mail = new MailMessage(this, data);\n\n this.logger.debug(\n {\n tnx: 'transport',\n name: this.transporter.name,\n version: this.transporter.version,\n action: 'send'\n },\n 'Sending mail using %s/%s',\n this.transporter.name,\n this.transporter.version\n );\n\n this._processPlugins('compile', mail, err => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'plugin',\n action: 'compile'\n },\n 'PluginCompile Error: %s',\n err.message\n );\n return callback(err);\n }\n\n mail.message = new MailComposer(mail.data).compile();\n\n mail.setMailerHeader();\n mail.setPriorityHeaders();\n mail.setListHeaders();\n\n this._processPlugins('stream', mail, err => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'plugin',\n action: 'stream'\n },\n 'PluginStream Error: %s',\n err.message\n );\n return callback(err);\n }\n\n if (mail.data.dkim || this.dkim) {\n mail.message.processFunc(input => {\n let dkim = mail.data.dkim ? new DKIM(mail.data.dkim) : this.dkim;\n this.logger.debug(\n {\n tnx: 'DKIM',\n messageId: mail.message.messageId(),\n dkimDomains: dkim.keys.map(key => key.keySelector + '.' + key.domainName).join(', ')\n },\n 'Signing outgoing message with %s keys',\n dkim.keys.length\n );\n return dkim.sign(input, mail.data._dkim);\n });\n }\n\n this.transporter.send(mail, (...args) => {\n if (args[0]) {\n this.logger.error(\n {\n err: args[0],\n tnx: 'transport',\n action: 'send'\n },\n 'Send Error: %s',\n args[0].message\n );\n }\n callback(...args);\n });\n });\n });\n\n return promise;\n }\n\n getVersionString() {\n return util.format('%s (%s; +%s; %s/%s)', packageData.name, packageData.version, packageData.homepage, this.transporter.name, this.transporter.version);\n }\n\n _processPlugins(step, mail, callback) {\n step = (step || '').toString();\n\n if (!this._userPlugins.hasOwnProperty(step)) {\n return callback();\n }\n\n let userPlugins = this._userPlugins[step] || [];\n let defaultPlugins = this._defaultPlugins[step] || [];\n\n if (userPlugins.length) {\n this.logger.debug(\n {\n tnx: 'transaction',\n pluginCount: userPlugins.length,\n step\n },\n 'Using %s plugins for %s',\n userPlugins.length,\n step\n );\n }\n\n if (userPlugins.length + defaultPlugins.length === 0) {\n return callback();\n }\n\n let pos = 0;\n let block = 'default';\n let processPlugins = () => {\n let curplugins = block === 'default' ? defaultPlugins : userPlugins;\n if (pos >= curplugins.length) {\n if (block === 'default' && userPlugins.length) {\n block = 'user';\n pos = 0;\n curplugins = userPlugins;\n } else {\n return callback();\n }\n }\n let plugin = curplugins[pos++];\n plugin(mail, err => {\n if (err) {\n return callback(err);\n }\n processPlugins();\n });\n };\n\n processPlugins();\n }\n\n /**\n * Sets up proxy handler for a Nodemailer object\n *\n * @param {String} proxyUrl Proxy configuration url\n */\n setupProxy(proxyUrl) {\n let proxy = urllib.parse(proxyUrl);\n\n // setup socket handler for the mailer object\n this.getSocket = (options, callback) => {\n let protocol = proxy.protocol.replace(/:$/, '').toLowerCase();\n\n if (this.meta.has('proxy_handler_' + protocol)) {\n return this.meta.get('proxy_handler_' + protocol)(proxy, options, callback);\n }\n\n switch (protocol) {\n // Connect using a HTTP CONNECT method\n case 'http':\n case 'https':\n httpProxyClient(proxy.href, options.port, options.host, (err, socket) => {\n if (err) {\n return callback(err);\n }\n return callback(null, {\n connection: socket\n });\n });\n return;\n case 'socks':\n case 'socks5':\n case 'socks4':\n case 'socks4a': {\n if (!this.meta.has('proxy_socks_module')) {\n return callback(new Error('Socks module not loaded'));\n }\n let connect = ipaddress => {\n let proxyV2 = !!this.meta.get('proxy_socks_module').SocksClient;\n let socksClient = proxyV2 ? this.meta.get('proxy_socks_module').SocksClient : this.meta.get('proxy_socks_module');\n let proxyType = Number(proxy.protocol.replace(/\\D/g, '')) || 5;\n let connectionOpts = {\n proxy: {\n ipaddress,\n port: Number(proxy.port),\n type: proxyType\n },\n [proxyV2 ? 'destination' : 'target']: {\n host: options.host,\n port: options.port\n },\n command: 'connect'\n };\n\n if (proxy.auth) {\n let username = decodeURIComponent(proxy.auth.split(':').shift());\n let password = decodeURIComponent(proxy.auth.split(':').pop());\n if (proxyV2) {\n connectionOpts.proxy.userId = username;\n connectionOpts.proxy.password = password;\n } else if (proxyType === 4) {\n connectionOpts.userid = username;\n } else {\n connectionOpts.authentication = {\n username,\n password\n };\n }\n }\n\n socksClient.createConnection(connectionOpts, (err, info) => {\n if (err) {\n return callback(err);\n }\n return callback(null, {\n connection: info.socket || info\n });\n });\n };\n\n if (net.isIP(proxy.hostname)) {\n return connect(proxy.hostname);\n }\n\n return dns.resolve(proxy.hostname, (err, address) => {\n if (err) {\n return callback(err);\n }\n connect(Array.isArray(address) ? address[0] : address);\n });\n }\n }\n callback(new Error('Unknown proxy configuration'));\n };\n }\n\n _convertDataImages(mail, callback) {\n if ((!this.options.attachDataUrls && !mail.data.attachDataUrls) || !mail.data.html) {\n return callback();\n }\n mail.resolveContent(mail.data, 'html', (err, html) => {\n if (err) {\n return callback(err);\n }\n let cidCounter = 0;\n html = (html || '')\n .toString()\n .replace(/(<img\\b[^<>]{0,1024} src\\s{0,20}=[\\s\"']{0,20})(data:([^;]+);[^\"'>\\s]+)/gi, (match, prefix, dataUri, mimeType) => {\n let cid = crypto.randomBytes(10).toString('hex') + '@localhost';\n if (!mail.data.attachments) {\n mail.data.attachments = [];\n }\n if (!Array.isArray(mail.data.attachments)) {\n mail.data.attachments = [].concat(mail.data.attachments || []);\n }\n mail.data.attachments.push({\n path: dataUri,\n cid,\n filename: 'image-' + ++cidCounter + '.' + mimeTypes.detectExtension(mimeType)\n });\n return prefix + 'cid:' + cid;\n });\n mail.data.html = html;\n callback();\n });\n }\n\n set(key, value) {\n return this.meta.set(key, value);\n }\n\n get(key) {\n return this.meta.get(key);\n }\n}\n\nmodule.exports = Mail;\n", "'use strict';\n\nconst stream = require('stream');\nconst Transform = stream.Transform;\n\n/**\n * Escapes dots in the beginning of lines. Ends the stream with <CR><LF>.<CR><LF>\n * Also makes sure that only <CR><LF> sequences are used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass DataStream extends Transform {\n constructor(options) {\n super(options);\n // init Transform\n this.options = options || {};\n this._curLine = '';\n\n this.inByteCount = 0;\n this.outByteCount = 0;\n this.lastByte = false;\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let chunks = [];\n let chunklen = 0;\n let i,\n len,\n lastPos = 0;\n let buf;\n\n if (!chunk || !chunk.length) {\n return done();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk);\n }\n\n this.inByteCount += chunk.length;\n\n for (i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x2e) {\n // .\n if ((i && chunk[i - 1] === 0x0a) || (!i && (!this.lastByte || this.lastByte === 0x0a))) {\n buf = chunk.slice(lastPos, i + 1);\n chunks.push(buf);\n chunks.push(Buffer.from('.'));\n chunklen += buf.length + 1;\n lastPos = i + 1;\n }\n } else if (chunk[i] === 0x0a) {\n // .\n if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {\n if (i > lastPos) {\n buf = chunk.slice(lastPos, i);\n chunks.push(buf);\n chunklen += buf.length + 2;\n } else {\n chunklen += 2;\n }\n chunks.push(Buffer.from('\\r\\n'));\n lastPos = i + 1;\n }\n }\n }\n\n if (chunklen) {\n // add last piece\n if (lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n chunks.push(buf);\n chunklen += buf.length;\n }\n\n this.outByteCount += chunklen;\n this.push(Buffer.concat(chunks, chunklen));\n } else {\n this.outByteCount += chunk.length;\n this.push(chunk);\n }\n\n this.lastByte = chunk[chunk.length - 1];\n done();\n }\n\n /**\n * Finalizes the stream with a dot on a single line\n */\n _flush(done) {\n let buf;\n if (this.lastByte === 0x0a) {\n buf = Buffer.from('.\\r\\n');\n } else if (this.lastByte === 0x0d) {\n buf = Buffer.from('\\n.\\r\\n');\n } else {\n buf = Buffer.from('\\r\\n.\\r\\n');\n }\n this.outByteCount += buf.length;\n this.push(buf);\n done();\n }\n}\n\nmodule.exports = DataStream;\n", "'use strict';\n\nconst packageInfo = require('../../package.json');\nconst EventEmitter = require('events').EventEmitter;\nconst net = require('net');\nconst tls = require('tls');\nconst os = require('os');\nconst crypto = require('crypto');\nconst DataStream = require('./data-stream');\nconst PassThrough = require('stream').PassThrough;\nconst shared = require('../shared');\n\n// default timeout values in ms\nconst CONNECTION_TIMEOUT = 2 * 60 * 1000; // how much to wait for the connection to be established\nconst SOCKET_TIMEOUT = 10 * 60 * 1000; // how much to wait for socket inactivity before disconnecting the client\nconst GREETING_TIMEOUT = 30 * 1000; // how much to wait after connection is established but SMTP greeting is not receieved\nconst DNS_TIMEOUT = 30 * 1000; // how much to wait for resolveHostname\n\n/**\n * Generates a SMTP connection object\n *\n * Optional options object takes the following possible properties:\n *\n * * **port** - is the port to connect to (defaults to 587 or 465)\n * * **host** - is the hostname or IP address to connect to (defaults to 'localhost')\n * * **secure** - use SSL\n * * **ignoreTLS** - ignore server support for STARTTLS\n * * **requireTLS** - forces the client to use STARTTLS\n * * **name** - the name of the client server\n * * **localAddress** - outbound address to bind to (see: http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener)\n * * **greetingTimeout** - Time to wait in ms until greeting message is received from the server (defaults to 10000)\n * * **connectionTimeout** - how many milliseconds to wait for the connection to establish\n * * **socketTimeout** - Time of inactivity until the connection is closed (defaults to 1 hour)\n * * **dnsTimeout** - Time to wait in ms for the DNS requests to be resolved (defaults to 30 seconds)\n * * **lmtp** - if true, uses LMTP instead of SMTP protocol\n * * **logger** - bunyan compatible logger interface\n * * **debug** - if true pass SMTP traffic to the logger\n * * **tls** - options for createCredentials\n * * **socket** - existing socket to use instead of creating a new one (see: http://nodejs.org/api/net.html#net_class_net_socket)\n * * **secured** - boolean indicates that the provided socket has already been upgraded to tls\n *\n * @constructor\n * @namespace SMTP Client module\n * @param {Object} [options] Option properties\n */\nclass SMTPConnection extends EventEmitter {\n constructor(options) {\n super(options);\n\n this.id = crypto.randomBytes(8).toString('base64').replace(/\\W/g, '');\n this.stage = 'init';\n\n this.options = options || {};\n\n this.secureConnection = !!this.options.secure;\n this.alreadySecured = !!this.options.secured;\n\n this.port = Number(this.options.port) || (this.secureConnection ? 465 : 587);\n this.host = this.options.host || 'localhost';\n\n this.servername = this.options.servername ? this.options.servername : !net.isIP(this.host) ? this.host : false;\n\n this.allowInternalNetworkInterfaces = this.options.allowInternalNetworkInterfaces || false;\n\n if (typeof this.options.secure === 'undefined' && this.port === 465) {\n // if secure option is not set but port is 465, then default to secure\n this.secureConnection = true;\n }\n\n this.name = this.options.name || this._getHostname();\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-connection',\n sid: this.id\n });\n\n this.customAuth = new Map();\n Object.keys(this.options.customAuth || {}).forEach(key => {\n let mapKey = (key || '').toString().trim().toUpperCase();\n if (!mapKey) {\n return;\n }\n this.customAuth.set(mapKey, this.options.customAuth[key]);\n });\n\n /**\n * Expose version nr, just for the reference\n * @type {String}\n */\n this.version = packageInfo.version;\n\n /**\n * If true, then the user is authenticated\n * @type {Boolean}\n */\n this.authenticated = false;\n\n /**\n * If set to true, this instance is no longer active\n * @private\n */\n this.destroyed = false;\n\n /**\n * Defines if the current connection is secure or not. If not,\n * STARTTLS can be used if available\n * @private\n */\n this.secure = !!this.secureConnection;\n\n /**\n * Store incomplete messages coming from the server\n * @private\n */\n this._remainder = '';\n\n /**\n * Unprocessed responses from the server\n * @type {Array}\n */\n this._responseQueue = [];\n\n this.lastServerResponse = false;\n\n /**\n * The socket connecting to the server\n * @publick\n */\n this._socket = false;\n\n /**\n * Lists supported auth mechanisms\n * @private\n */\n this._supportedAuth = [];\n\n /**\n * Set to true, if EHLO response includes \"AUTH\".\n * If false then authentication is not tried\n */\n this.allowsAuth = false;\n\n /**\n * Includes current envelope (from, to)\n * @private\n */\n this._envelope = false;\n\n /**\n * Lists supported extensions\n * @private\n */\n this._supportedExtensions = [];\n\n /**\n * Defines the maximum allowed size for a single message\n * @private\n */\n this._maxAllowedSize = 0;\n\n /**\n * Function queue to run if a data chunk comes from the server\n * @private\n */\n this._responseActions = [];\n this._recipientQueue = [];\n\n /**\n * Timeout variable for waiting the greeting\n * @private\n */\n this._greetingTimeout = false;\n\n /**\n * Timeout variable for waiting the connection to start\n * @private\n */\n this._connectionTimeout = false;\n\n /**\n * If the socket is deemed already closed\n * @private\n */\n this._destroyed = false;\n\n /**\n * If the socket is already being closed\n * @private\n */\n this._closing = false;\n\n /**\n * Callbacks for socket's listeners\n */\n this._onSocketData = chunk => this._onData(chunk);\n this._onSocketError = error => this._onError(error, 'ESOCKET', false, 'CONN');\n this._onSocketClose = () => this._onClose();\n this._onSocketEnd = () => this._onEnd();\n this._onSocketTimeout = () => this._onTimeout();\n }\n\n /**\n * Creates a connection to a SMTP server and sets up connection\n * listener\n */\n connect(connectCallback) {\n if (typeof connectCallback === 'function') {\n this.once('connect', () => {\n this.logger.debug(\n {\n tnx: 'smtp'\n },\n 'SMTP handshake finished'\n );\n connectCallback();\n });\n\n const isDestroyedMessage = this._isDestroyedMessage('connect');\n if (isDestroyedMessage) {\n return connectCallback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'CONN'));\n }\n }\n\n let opts = {\n port: this.port,\n host: this.host,\n allowInternalNetworkInterfaces: this.allowInternalNetworkInterfaces,\n timeout: this.options.dnsTimeout || DNS_TIMEOUT\n };\n\n if (this.options.localAddress) {\n opts.localAddress = this.options.localAddress;\n }\n\n let setupConnectionHandlers = () => {\n this._connectionTimeout = setTimeout(() => {\n this._onError('Connection timeout', 'ETIMEDOUT', false, 'CONN');\n }, this.options.connectionTimeout || CONNECTION_TIMEOUT);\n\n this._socket.on('error', this._onSocketError);\n };\n\n if (this.options.connection) {\n // connection is already opened\n this._socket = this.options.connection;\n setupConnectionHandlers();\n\n if (this.secureConnection && !this.alreadySecured) {\n setImmediate(() =>\n this._upgradeConnection(err => {\n if (err) {\n this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'CONN');\n return;\n }\n this._onConnect();\n })\n );\n } else {\n setImmediate(() => this._onConnect());\n }\n return;\n } else if (this.options.socket) {\n // socket object is set up but not yet connected\n this._socket = this.options.socket;\n return shared.resolveHostname(opts, (err, resolved) => {\n if (err) {\n return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));\n }\n this.logger.debug(\n {\n tnx: 'dns',\n source: opts.host,\n resolved: resolved.host,\n cached: !!resolved.cached\n },\n 'Resolved %s as %s [cache %s]',\n opts.host,\n resolved.host,\n resolved.cached ? 'hit' : 'miss'\n );\n Object.keys(resolved).forEach(key => {\n if (key.charAt(0) !== '_' && resolved[key]) {\n opts[key] = resolved[key];\n }\n });\n try {\n this._socket.connect(this.port, this.host, () => {\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n });\n } else if (this.secureConnection) {\n // connect using tls\n if (this.options.tls) {\n Object.keys(this.options.tls).forEach(key => {\n opts[key] = this.options.tls[key];\n });\n }\n\n // ensure servername for SNI\n if (this.servername && !opts.servername) {\n opts.servername = this.servername;\n }\n\n return shared.resolveHostname(opts, (err, resolved) => {\n if (err) {\n return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));\n }\n this.logger.debug(\n {\n tnx: 'dns',\n source: opts.host,\n resolved: resolved.host,\n cached: !!resolved.cached\n },\n 'Resolved %s as %s [cache %s]',\n opts.host,\n resolved.host,\n resolved.cached ? 'hit' : 'miss'\n );\n Object.keys(resolved).forEach(key => {\n if (key.charAt(0) !== '_' && resolved[key]) {\n opts[key] = resolved[key];\n }\n });\n try {\n this._socket = tls.connect(opts, () => {\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n });\n } else {\n // connect using plaintext\n return shared.resolveHostname(opts, (err, resolved) => {\n if (err) {\n return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));\n }\n this.logger.debug(\n {\n tnx: 'dns',\n source: opts.host,\n resolved: resolved.host,\n cached: !!resolved.cached\n },\n 'Resolved %s as %s [cache %s]',\n opts.host,\n resolved.host,\n resolved.cached ? 'hit' : 'miss'\n );\n Object.keys(resolved).forEach(key => {\n if (key.charAt(0) !== '_' && resolved[key]) {\n opts[key] = resolved[key];\n }\n });\n try {\n this._socket = net.connect(opts, () => {\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n });\n }\n }\n\n /**\n * Sends QUIT\n */\n quit() {\n this._sendCommand('QUIT');\n this._responseActions.push(this.close);\n }\n\n /**\n * Closes the connection to the server\n */\n close() {\n clearTimeout(this._connectionTimeout);\n clearTimeout(this._greetingTimeout);\n this._responseActions = [];\n\n // allow to run this function only once\n if (this._closing) {\n return;\n }\n this._closing = true;\n\n let closeMethod = 'end';\n\n if (this.stage === 'init') {\n // Close the socket immediately when connection timed out\n closeMethod = 'destroy';\n }\n\n this.logger.debug(\n {\n tnx: 'smtp'\n },\n 'Closing connection to the server using \"%s\"',\n closeMethod\n );\n\n let socket = (this._socket && this._socket.socket) || this._socket;\n\n if (socket && !socket.destroyed) {\n try {\n socket[closeMethod]();\n } catch (E) {\n // just ignore\n }\n }\n\n this._destroy();\n }\n\n /**\n * Authenticate user\n */\n login(authData, callback) {\n const isDestroyedMessage = this._isDestroyedMessage('login');\n if (isDestroyedMessage) {\n return callback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));\n }\n\n this._auth = authData || {};\n // Select SASL authentication method\n this._authMethod = (this._auth.method || '').toString().trim().toUpperCase() || false;\n\n if (!this._authMethod && this._auth.oauth2 && !this._auth.credentials) {\n this._authMethod = 'XOAUTH2';\n } else if (!this._authMethod || (this._authMethod === 'XOAUTH2' && !this._auth.oauth2)) {\n // use first supported\n this._authMethod = (this._supportedAuth[0] || 'PLAIN').toUpperCase().trim();\n }\n\n if (this._authMethod !== 'XOAUTH2' && (!this._auth.credentials || !this._auth.credentials.user || !this._auth.credentials.pass)) {\n if ((this._auth.user && this._auth.pass) || this.customAuth.has(this._authMethod)) {\n this._auth.credentials = {\n user: this._auth.user,\n pass: this._auth.pass,\n options: this._auth.options\n };\n } else {\n return callback(this._formatError('Missing credentials for \"' + this._authMethod + '\"', 'EAUTH', false, 'API'));\n }\n }\n\n if (this.customAuth.has(this._authMethod)) {\n let handler = this.customAuth.get(this._authMethod);\n let lastResponse;\n let returned = false;\n\n let resolve = () => {\n if (returned) {\n return;\n }\n returned = true;\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n };\n\n let reject = err => {\n if (returned) {\n return;\n }\n returned = true;\n callback(this._formatError(err, 'EAUTH', lastResponse, 'AUTH ' + this._authMethod));\n };\n\n let handlerResponse = handler({\n auth: this._auth,\n method: this._authMethod,\n\n extensions: [].concat(this._supportedExtensions),\n authMethods: [].concat(this._supportedAuth),\n maxAllowedSize: this._maxAllowedSize || false,\n\n sendCommand: (cmd, done) => {\n let promise;\n\n if (!done) {\n promise = new Promise((resolve, reject) => {\n done = shared.callbackPromise(resolve, reject);\n });\n }\n\n this._responseActions.push(str => {\n lastResponse = str;\n\n let codes = str.match(/^(\\d+)(?:\\s(\\d+\\.\\d+\\.\\d+))?\\s/);\n let data = {\n command: cmd,\n response: str\n };\n if (codes) {\n data.status = Number(codes[1]) || 0;\n if (codes[2]) {\n data.code = codes[2];\n }\n data.text = str.substr(codes[0].length);\n } else {\n data.text = str;\n data.status = 0; // just in case we need to perform numeric comparisons\n }\n done(null, data);\n });\n setImmediate(() => this._sendCommand(cmd));\n\n return promise;\n },\n\n resolve,\n reject\n });\n\n if (handlerResponse && typeof handlerResponse.catch === 'function') {\n // a promise was returned\n handlerResponse.then(resolve).catch(reject);\n }\n\n return;\n }\n\n switch (this._authMethod) {\n case 'XOAUTH2':\n this._handleXOauth2Token(false, callback);\n return;\n case 'LOGIN':\n this._responseActions.push(str => {\n this._actionAUTH_LOGIN_USER(str, callback);\n });\n this._sendCommand('AUTH LOGIN');\n return;\n case 'PLAIN':\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, callback);\n });\n this._sendCommand(\n 'AUTH PLAIN ' +\n Buffer.from(\n //this._auth.user+'\\u0000'+\n '\\u0000' + // skip authorization identity as it causes problems with some servers\n this._auth.credentials.user +\n '\\u0000' +\n this._auth.credentials.pass,\n 'utf-8'\n ).toString('base64'),\n // log entry without passwords\n 'AUTH PLAIN ' +\n Buffer.from(\n //this._auth.user+'\\u0000'+\n '\\u0000' + // skip authorization identity as it causes problems with some servers\n this._auth.credentials.user +\n '\\u0000' +\n '/* secret */',\n 'utf-8'\n ).toString('base64')\n );\n return;\n case 'CRAM-MD5':\n this._responseActions.push(str => {\n this._actionAUTH_CRAM_MD5(str, callback);\n });\n this._sendCommand('AUTH CRAM-MD5');\n return;\n }\n\n return callback(this._formatError('Unknown authentication method \"' + this._authMethod + '\"', 'EAUTH', false, 'API'));\n }\n\n /**\n * Sends a message\n *\n * @param {Object} envelope Envelope object, {from: addr, to: [addr]}\n * @param {Object} message String, Buffer or a Stream\n * @param {Function} callback Callback to return once sending is completed\n */\n send(envelope, message, done) {\n if (!message) {\n return done(this._formatError('Empty message', 'EMESSAGE', false, 'API'));\n }\n\n const isDestroyedMessage = this._isDestroyedMessage('send message');\n if (isDestroyedMessage) {\n return done(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));\n }\n\n // reject larger messages than allowed\n if (this._maxAllowedSize && envelope.size > this._maxAllowedSize) {\n return setImmediate(() => {\n done(this._formatError('Message size larger than allowed ' + this._maxAllowedSize, 'EMESSAGE', false, 'MAIL FROM'));\n });\n }\n\n // ensure that callback is only called once\n let returned = false;\n let callback = function () {\n if (returned) {\n return;\n }\n returned = true;\n\n done(...arguments);\n };\n\n if (typeof message.on === 'function') {\n message.on('error', err => callback(this._formatError(err, 'ESTREAM', false, 'API')));\n }\n\n let startTime = Date.now();\n this._setEnvelope(envelope, (err, info) => {\n if (err) {\n // create passthrough stream to consume to prevent OOM\n let stream = new PassThrough();\n if (typeof message.pipe === 'function') {\n message.pipe(stream);\n } else {\n stream.write(message);\n stream.end();\n }\n\n return callback(err);\n }\n let envelopeTime = Date.now();\n let stream = this._createSendStream((err, str) => {\n if (err) {\n return callback(err);\n }\n\n info.envelopeTime = envelopeTime - startTime;\n info.messageTime = Date.now() - envelopeTime;\n info.messageSize = stream.outByteCount;\n info.response = str;\n\n return callback(null, info);\n });\n if (typeof message.pipe === 'function') {\n message.pipe(stream);\n } else {\n stream.write(message);\n stream.end();\n }\n });\n }\n\n /**\n * Resets connection state\n *\n * @param {Function} callback Callback to return once connection is reset\n */\n reset(callback) {\n this._sendCommand('RSET');\n this._responseActions.push(str => {\n if (str.charAt(0) !== '2') {\n return callback(this._formatError('Could not reset session state. response=' + str, 'EPROTOCOL', str, 'RSET'));\n }\n this._envelope = false;\n return callback(null, true);\n });\n }\n\n /**\n * Connection listener that is run when the connection to\n * the server is opened\n *\n * @event\n */\n _onConnect() {\n clearTimeout(this._connectionTimeout);\n\n this.logger.info(\n {\n tnx: 'network',\n localAddress: this._socket.localAddress,\n localPort: this._socket.localPort,\n remoteAddress: this._socket.remoteAddress,\n remotePort: this._socket.remotePort\n },\n '%s established to %s:%s',\n this.secure ? 'Secure connection' : 'Connection',\n this._socket.remoteAddress,\n this._socket.remotePort\n );\n\n if (this._destroyed) {\n // Connection was established after we already had canceled it\n this.close();\n return;\n }\n\n this.stage = 'connected';\n\n // clear existing listeners for the socket\n this._socket.removeListener('data', this._onSocketData);\n this._socket.removeListener('timeout', this._onSocketTimeout);\n this._socket.removeListener('close', this._onSocketClose);\n this._socket.removeListener('end', this._onSocketEnd);\n\n this._socket.on('data', this._onSocketData);\n this._socket.once('close', this._onSocketClose);\n this._socket.once('end', this._onSocketEnd);\n\n this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT);\n this._socket.on('timeout', this._onSocketTimeout);\n\n this._greetingTimeout = setTimeout(() => {\n // if still waiting for greeting, give up\n if (this._socket && !this._destroyed && this._responseActions[0] === this._actionGreeting) {\n this._onError('Greeting never received', 'ETIMEDOUT', false, 'CONN');\n }\n }, this.options.greetingTimeout || GREETING_TIMEOUT);\n\n this._responseActions.push(this._actionGreeting);\n\n // we have a 'data' listener set up so resume socket if it was paused\n this._socket.resume();\n }\n\n /**\n * 'data' listener for data coming from the server\n *\n * @event\n * @param {Buffer} chunk Data chunk coming from the server\n */\n _onData(chunk) {\n if (this._destroyed || !chunk || !chunk.length) {\n return;\n }\n\n let data = (chunk || '').toString('binary');\n let lines = (this._remainder + data).split(/\\r?\\n/);\n let lastline;\n\n this._remainder = lines.pop();\n\n for (let i = 0, len = lines.length; i < len; i++) {\n if (this._responseQueue.length) {\n lastline = this._responseQueue[this._responseQueue.length - 1];\n if (/^\\d+-/.test(lastline.split('\\n').pop())) {\n this._responseQueue[this._responseQueue.length - 1] += '\\n' + lines[i];\n continue;\n }\n }\n this._responseQueue.push(lines[i]);\n }\n\n if (this._responseQueue.length) {\n lastline = this._responseQueue[this._responseQueue.length - 1];\n if (/^\\d+-/.test(lastline.split('\\n').pop())) {\n return;\n }\n }\n\n this._processResponse();\n }\n\n /**\n * 'error' listener for the socket\n *\n * @event\n * @param {Error} err Error object\n * @param {String} type Error name\n */\n _onError(err, type, data, command) {\n clearTimeout(this._connectionTimeout);\n clearTimeout(this._greetingTimeout);\n\n if (this._destroyed) {\n // just ignore, already closed\n // this might happen when a socket is canceled because of reached timeout\n // but the socket timeout error itself receives only after\n return;\n }\n\n err = this._formatError(err, type, data, command);\n\n this.logger.error(data, err.message);\n\n this.emit('error', err);\n this.close();\n }\n\n _formatError(message, type, response, command) {\n let err;\n\n if (/Error\\]$/i.test(Object.prototype.toString.call(message))) {\n err = message;\n } else {\n err = new Error(message);\n }\n\n if (type && type !== 'Error') {\n err.code = type;\n }\n\n if (response) {\n err.response = response;\n err.message += ': ' + response;\n }\n\n let responseCode = (typeof response === 'string' && Number((response.match(/^\\d+/) || [])[0])) || false;\n if (responseCode) {\n err.responseCode = responseCode;\n }\n\n if (command) {\n err.command = command;\n }\n\n return err;\n }\n\n /**\n * 'close' listener for the socket\n *\n * @event\n */\n _onClose() {\n let serverResponse = false;\n\n if (this._remainder && this._remainder.trim()) {\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'server'\n },\n this._remainder.replace(/\\r?\\n$/, '')\n );\n }\n this.lastServerResponse = serverResponse = this._remainder.trim();\n }\n\n this.logger.info(\n {\n tnx: 'network'\n },\n 'Connection closed'\n );\n\n if (this.upgrading && !this._destroyed) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ETLS', serverResponse, 'CONN');\n } else if (![this._actionGreeting, this.close].includes(this._responseActions[0]) && !this._destroyed) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');\n } else if (/^[45]\\d{2}\\b/.test(serverResponse)) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');\n }\n\n this._destroy();\n }\n\n /**\n * 'end' listener for the socket\n *\n * @event\n */\n _onEnd() {\n if (this._socket && !this._socket.destroyed) {\n this._socket.destroy();\n }\n }\n\n /**\n * 'timeout' listener for the socket\n *\n * @event\n */\n _onTimeout() {\n return this._onError(new Error('Timeout'), 'ETIMEDOUT', false, 'CONN');\n }\n\n /**\n * Destroys the client, emits 'end'\n */\n _destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this.emit('end');\n }\n\n /**\n * Upgrades the connection to TLS\n *\n * @param {Function} callback Callback function to run when the connection\n * has been secured\n */\n _upgradeConnection(callback) {\n // do not remove all listeners or it breaks node v0.10 as there's\n // apparently a 'finish' event set that would be cleared as well\n\n // we can safely keep 'error', 'end', 'close' etc. events\n this._socket.removeListener('data', this._onSocketData); // incoming data is going to be gibberish from this point onwards\n this._socket.removeListener('timeout', this._onSocketTimeout); // timeout will be re-set for the new socket object\n\n let socketPlain = this._socket;\n let opts = {\n socket: this._socket,\n host: this.host\n };\n\n Object.keys(this.options.tls || {}).forEach(key => {\n opts[key] = this.options.tls[key];\n });\n\n // ensure servername for SNI\n if (this.servername && !opts.servername) {\n opts.servername = this.servername;\n }\n\n this.upgrading = true;\n // tls.connect is not an asynchronous function however it may still throw errors and requires to be wrapped with try/catch\n try {\n this._socket = tls.connect(opts, () => {\n this.secure = true;\n this.upgrading = false;\n this._socket.on('data', this._onSocketData);\n\n socketPlain.removeListener('close', this._onSocketClose);\n socketPlain.removeListener('end', this._onSocketEnd);\n\n return callback(null, true);\n });\n } catch (err) {\n return callback(err);\n }\n\n this._socket.on('error', this._onSocketError);\n this._socket.once('close', this._onSocketClose);\n this._socket.once('end', this._onSocketEnd);\n\n this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT); // 10 min.\n this._socket.on('timeout', this._onSocketTimeout);\n\n // resume in case the socket was paused\n socketPlain.resume();\n }\n\n /**\n * Processes queued responses from the server\n *\n * @param {Boolean} force If true, ignores _processing flag\n */\n _processResponse() {\n if (!this._responseQueue.length) {\n return false;\n }\n\n let str = (this.lastServerResponse = (this._responseQueue.shift() || '').toString());\n\n if (/^\\d+-/.test(str.split('\\n').pop())) {\n // keep waiting for the final part of multiline response\n return;\n }\n\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'server'\n },\n str.replace(/\\r?\\n$/, '')\n );\n }\n\n if (!str.trim()) {\n // skip unexpected empty lines\n setImmediate(() => this._processResponse());\n }\n\n let action = this._responseActions.shift();\n\n if (typeof action === 'function') {\n action.call(this, str);\n setImmediate(() => this._processResponse());\n } else {\n return this._onError(new Error('Unexpected Response'), 'EPROTOCOL', str, 'CONN');\n }\n }\n\n /**\n * Send a command to the server, append \\r\\n\n *\n * @param {String} str String to be sent to the server\n * @param {String} logStr Optional string to be used for logging instead of the actual string\n */\n _sendCommand(str, logStr) {\n if (this._destroyed) {\n // Connection already closed, can't send any more data\n return;\n }\n\n if (this._socket.destroyed) {\n return this.close();\n }\n\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'client'\n },\n (logStr || str || '').toString().replace(/\\r?\\n$/, '')\n );\n }\n\n this._socket.write(Buffer.from(str + '\\r\\n', 'utf-8'));\n }\n\n /**\n * Initiates a new message by submitting envelope data, starting with\n * MAIL FROM: command\n *\n * @param {Object} envelope Envelope object in the form of\n * {from:'...', to:['...']}\n * or\n * {from:{address:'...',name:'...'}, to:[address:'...',name:'...']}\n */\n _setEnvelope(envelope, callback) {\n let args = [];\n let useSmtpUtf8 = false;\n\n this._envelope = envelope || {};\n this._envelope.from = ((this._envelope.from && this._envelope.from.address) || this._envelope.from || '').toString().trim();\n\n this._envelope.to = [].concat(this._envelope.to || []).map(to => ((to && to.address) || to || '').toString().trim());\n\n if (!this._envelope.to.length) {\n return callback(this._formatError('No recipients defined', 'EENVELOPE', false, 'API'));\n }\n\n if (this._envelope.from && /[\\r\\n<>]/.test(this._envelope.from)) {\n return callback(this._formatError('Invalid sender ' + JSON.stringify(this._envelope.from), 'EENVELOPE', false, 'API'));\n }\n\n // check if the sender address uses only ASCII characters,\n // otherwise require usage of SMTPUTF8 extension\n if (/[\\x80-\\uFFFF]/.test(this._envelope.from)) {\n useSmtpUtf8 = true;\n }\n\n for (let i = 0, len = this._envelope.to.length; i < len; i++) {\n if (!this._envelope.to[i] || /[\\r\\n<>]/.test(this._envelope.to[i])) {\n return callback(this._formatError('Invalid recipient ' + JSON.stringify(this._envelope.to[i]), 'EENVELOPE', false, 'API'));\n }\n\n // check if the recipients addresses use only ASCII characters,\n // otherwise require usage of SMTPUTF8 extension\n if (/[\\x80-\\uFFFF]/.test(this._envelope.to[i])) {\n useSmtpUtf8 = true;\n }\n }\n\n // clone the recipients array for latter manipulation\n this._envelope.rcptQueue = JSON.parse(JSON.stringify(this._envelope.to || []));\n this._envelope.rejected = [];\n this._envelope.rejectedErrors = [];\n this._envelope.accepted = [];\n\n if (this._envelope.dsn) {\n try {\n this._envelope.dsn = this._setDsnEnvelope(this._envelope.dsn);\n } catch (err) {\n return callback(this._formatError('Invalid DSN ' + err.message, 'EENVELOPE', false, 'API'));\n }\n }\n\n this._responseActions.push(str => {\n this._actionMAIL(str, callback);\n });\n\n // If the server supports SMTPUTF8 and the envelope includes an internationalized\n // email address then append SMTPUTF8 keyword to the MAIL FROM command\n if (useSmtpUtf8 && this._supportedExtensions.includes('SMTPUTF8')) {\n args.push('SMTPUTF8');\n this._usingSmtpUtf8 = true;\n }\n\n // If the server supports 8BITMIME and the message might contain non-ascii bytes\n // then append the 8BITMIME keyword to the MAIL FROM command\n if (this._envelope.use8BitMime && this._supportedExtensions.includes('8BITMIME')) {\n args.push('BODY=8BITMIME');\n this._using8BitMime = true;\n }\n\n if (this._envelope.size && this._supportedExtensions.includes('SIZE')) {\n args.push('SIZE=' + this._envelope.size);\n }\n\n // If the server supports DSN and the envelope includes an DSN prop\n // then append DSN params to the MAIL FROM command\n if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {\n if (this._envelope.dsn.ret) {\n args.push('RET=' + shared.encodeXText(this._envelope.dsn.ret));\n }\n if (this._envelope.dsn.envid) {\n args.push('ENVID=' + shared.encodeXText(this._envelope.dsn.envid));\n }\n }\n\n this._sendCommand('MAIL FROM:<' + this._envelope.from + '>' + (args.length ? ' ' + args.join(' ') : ''));\n }\n\n _setDsnEnvelope(params) {\n let ret = (params.ret || params.return || '').toString().toUpperCase() || null;\n if (ret) {\n switch (ret) {\n case 'HDRS':\n case 'HEADERS':\n ret = 'HDRS';\n break;\n case 'FULL':\n case 'BODY':\n ret = 'FULL';\n break;\n }\n }\n\n if (ret && !['FULL', 'HDRS'].includes(ret)) {\n throw new Error('ret: ' + JSON.stringify(ret));\n }\n\n let envid = (params.envid || params.id || '').toString() || null;\n\n let notify = params.notify || null;\n if (notify) {\n if (typeof notify === 'string') {\n notify = notify.split(',');\n }\n notify = notify.map(n => n.trim().toUpperCase());\n let validNotify = ['NEVER', 'SUCCESS', 'FAILURE', 'DELAY'];\n let invaliNotify = notify.filter(n => !validNotify.includes(n));\n if (invaliNotify.length || (notify.length > 1 && notify.includes('NEVER'))) {\n throw new Error('notify: ' + JSON.stringify(notify.join(',')));\n }\n notify = notify.join(',');\n }\n\n let orcpt = (params.recipient || params.orcpt || '').toString() || null;\n if (orcpt && orcpt.indexOf(';') < 0) {\n orcpt = 'rfc822;' + orcpt;\n }\n\n return {\n ret,\n envid,\n notify,\n orcpt\n };\n }\n\n _getDsnRcptToArgs() {\n let args = [];\n // If the server supports DSN and the envelope includes an DSN prop\n // then append DSN params to the RCPT TO command\n if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {\n if (this._envelope.dsn.notify) {\n args.push('NOTIFY=' + shared.encodeXText(this._envelope.dsn.notify));\n }\n if (this._envelope.dsn.orcpt) {\n args.push('ORCPT=' + shared.encodeXText(this._envelope.dsn.orcpt));\n }\n }\n return args.length ? ' ' + args.join(' ') : '';\n }\n\n _createSendStream(callback) {\n let dataStream = new DataStream();\n let logStream;\n\n if (this.options.lmtp) {\n this._envelope.accepted.forEach((recipient, i) => {\n let final = i === this._envelope.accepted.length - 1;\n this._responseActions.push(str => {\n this._actionLMTPStream(recipient, final, str, callback);\n });\n });\n } else {\n this._responseActions.push(str => {\n this._actionSMTPStream(str, callback);\n });\n }\n\n dataStream.pipe(this._socket, {\n end: false\n });\n\n if (this.options.debug) {\n logStream = new PassThrough();\n logStream.on('readable', () => {\n let chunk;\n while ((chunk = logStream.read())) {\n this.logger.debug(\n {\n tnx: 'message'\n },\n chunk.toString('binary').replace(/\\r?\\n$/, '')\n );\n }\n });\n dataStream.pipe(logStream);\n }\n\n dataStream.once('end', () => {\n this.logger.info(\n {\n tnx: 'message',\n inByteCount: dataStream.inByteCount,\n outByteCount: dataStream.outByteCount\n },\n '<%s bytes encoded mime message (source size %s bytes)>',\n dataStream.outByteCount,\n dataStream.inByteCount\n );\n });\n\n return dataStream;\n }\n\n /** ACTIONS **/\n\n /**\n * Will be run after the connection is created and the server sends\n * a greeting. If the incoming message starts with 220 initiate\n * SMTP session by sending EHLO command\n *\n * @param {String} str Message from the server\n */\n _actionGreeting(str) {\n clearTimeout(this._greetingTimeout);\n\n if (str.substr(0, 3) !== '220') {\n this._onError(new Error('Invalid greeting. response=' + str), 'EPROTOCOL', str, 'CONN');\n return;\n }\n\n if (this.options.lmtp) {\n this._responseActions.push(this._actionLHLO);\n this._sendCommand('LHLO ' + this.name);\n } else {\n this._responseActions.push(this._actionEHLO);\n this._sendCommand('EHLO ' + this.name);\n }\n }\n\n /**\n * Handles server response for LHLO command. If it yielded in\n * error, emit 'error', otherwise treat this as an EHLO response\n *\n * @param {String} str Message from the server\n */\n _actionLHLO(str) {\n if (str.charAt(0) !== '2') {\n this._onError(new Error('Invalid LHLO. response=' + str), 'EPROTOCOL', str, 'LHLO');\n return;\n }\n\n this._actionEHLO(str);\n }\n\n /**\n * Handles server response for EHLO command. If it yielded in\n * error, try HELO instead, otherwise initiate TLS negotiation\n * if STARTTLS is supported by the server or move into the\n * authentication phase.\n *\n * @param {String} str Message from the server\n */\n _actionEHLO(str) {\n let match;\n\n if (str.substr(0, 3) === '421') {\n this._onError(new Error('Server terminates connection. response=' + str), 'ECONNECTION', str, 'EHLO');\n return;\n }\n\n if (str.charAt(0) !== '2') {\n if (this.options.requireTLS) {\n this._onError(new Error('EHLO failed but HELO does not support required STARTTLS. response=' + str), 'ECONNECTION', str, 'EHLO');\n return;\n }\n\n // Try HELO instead\n this._responseActions.push(this._actionHELO);\n this._sendCommand('HELO ' + this.name);\n return;\n }\n\n this._ehloLines = str\n .split(/\\r?\\n/)\n .map(line => line.replace(/^\\d+[ -]/, '').trim())\n .filter(line => line)\n .slice(1);\n\n // Detect if the server supports STARTTLS\n if (!this.secure && !this.options.ignoreTLS && (/[ -]STARTTLS\\b/im.test(str) || this.options.requireTLS)) {\n this._sendCommand('STARTTLS');\n this._responseActions.push(this._actionSTARTTLS);\n return;\n }\n\n // Detect if the server supports SMTPUTF8\n if (/[ -]SMTPUTF8\\b/im.test(str)) {\n this._supportedExtensions.push('SMTPUTF8');\n }\n\n // Detect if the server supports DSN\n if (/[ -]DSN\\b/im.test(str)) {\n this._supportedExtensions.push('DSN');\n }\n\n // Detect if the server supports 8BITMIME\n if (/[ -]8BITMIME\\b/im.test(str)) {\n this._supportedExtensions.push('8BITMIME');\n }\n\n // Detect if the server supports PIPELINING\n if (/[ -]PIPELINING\\b/im.test(str)) {\n this._supportedExtensions.push('PIPELINING');\n }\n\n // Detect if the server supports AUTH\n if (/[ -]AUTH\\b/i.test(str)) {\n this.allowsAuth = true;\n }\n\n // Detect if the server supports PLAIN auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)PLAIN/i.test(str)) {\n this._supportedAuth.push('PLAIN');\n }\n\n // Detect if the server supports LOGIN auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)LOGIN/i.test(str)) {\n this._supportedAuth.push('LOGIN');\n }\n\n // Detect if the server supports CRAM-MD5 auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)CRAM-MD5/i.test(str)) {\n this._supportedAuth.push('CRAM-MD5');\n }\n\n // Detect if the server supports XOAUTH2 auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)XOAUTH2/i.test(str)) {\n this._supportedAuth.push('XOAUTH2');\n }\n\n // Detect if the server supports SIZE extensions (and the max allowed size)\n if ((match = str.match(/[ -]SIZE(?:[ \\t]+(\\d+))?/im))) {\n this._supportedExtensions.push('SIZE');\n this._maxAllowedSize = Number(match[1]) || 0;\n }\n\n this.emit('connect');\n }\n\n /**\n * Handles server response for HELO command. If it yielded in\n * error, emit 'error', otherwise move into the authentication phase.\n *\n * @param {String} str Message from the server\n */\n _actionHELO(str) {\n if (str.charAt(0) !== '2') {\n this._onError(new Error('Invalid HELO. response=' + str), 'EPROTOCOL', str, 'HELO');\n return;\n }\n\n // assume that authentication is enabled (most probably is not though)\n this.allowsAuth = true;\n\n this.emit('connect');\n }\n\n /**\n * Handles server response for STARTTLS command. If there's an error\n * try HELO instead, otherwise initiate TLS upgrade. If the upgrade\n * succeedes restart the EHLO\n *\n * @param {String} str Message from the server\n */\n _actionSTARTTLS(str) {\n if (str.charAt(0) !== '2') {\n if (this.options.opportunisticTLS) {\n this.logger.info(\n {\n tnx: 'smtp'\n },\n 'Failed STARTTLS upgrade, continuing unencrypted'\n );\n return this.emit('connect');\n }\n this._onError(new Error('Error upgrading connection with STARTTLS'), 'ETLS', str, 'STARTTLS');\n return;\n }\n\n this._upgradeConnection((err, secured) => {\n if (err) {\n this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'STARTTLS');\n return;\n }\n\n this.logger.info(\n {\n tnx: 'smtp'\n },\n 'Connection upgraded with STARTTLS'\n );\n\n if (secured) {\n // restart session\n if (this.options.lmtp) {\n this._responseActions.push(this._actionLHLO);\n this._sendCommand('LHLO ' + this.name);\n } else {\n this._responseActions.push(this._actionEHLO);\n this._sendCommand('EHLO ' + this.name);\n }\n } else {\n this.emit('connect');\n }\n });\n }\n\n /**\n * Handle the response for AUTH LOGIN command. We are expecting\n * '334 VXNlcm5hbWU6' (base64 for 'Username:'). Data to be sent as\n * response needs to be base64 encoded username. We do not need\n * exact match but settle with 334 response in general as some\n * hosts invalidly use a longer message than VXNlcm5hbWU6\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_LOGIN_USER(str, callback) {\n if (!/^334[ -]/.test(str)) {\n // expecting '334 VXNlcm5hbWU6'\n callback(this._formatError('Invalid login sequence while waiting for \"334 VXNlcm5hbWU6\"', 'EAUTH', str, 'AUTH LOGIN'));\n return;\n }\n\n this._responseActions.push(str => {\n this._actionAUTH_LOGIN_PASS(str, callback);\n });\n\n this._sendCommand(Buffer.from(this._auth.credentials.user + '', 'utf-8').toString('base64'));\n }\n\n /**\n * Handle the response for AUTH CRAM-MD5 command. We are expecting\n * '334 <challenge string>'. Data to be sent as response needs to be\n * base64 decoded challenge string, MD5 hashed using the password as\n * a HMAC key, prefixed by the username and a space, and finally all\n * base64 encoded again.\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_CRAM_MD5(str, callback) {\n let challengeMatch = str.match(/^334\\s+(.+)$/);\n let challengeString = '';\n\n if (!challengeMatch) {\n return callback(this._formatError('Invalid login sequence while waiting for server challenge string', 'EAUTH', str, 'AUTH CRAM-MD5'));\n } else {\n challengeString = challengeMatch[1];\n }\n\n // Decode from base64\n let base64decoded = Buffer.from(challengeString, 'base64').toString('ascii'),\n hmacMD5 = crypto.createHmac('md5', this._auth.credentials.pass);\n\n hmacMD5.update(base64decoded);\n\n let prepended = this._auth.credentials.user + ' ' + hmacMD5.digest('hex');\n\n this._responseActions.push(str => {\n this._actionAUTH_CRAM_MD5_PASS(str, callback);\n });\n\n this._sendCommand(\n Buffer.from(prepended).toString('base64'),\n // hidden hash for logs\n Buffer.from(this._auth.credentials.user + ' /* secret */').toString('base64')\n );\n }\n\n /**\n * Handles the response to CRAM-MD5 authentication, if there's no error,\n * the user can be considered logged in. Start waiting for a message to send\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_CRAM_MD5_PASS(str, callback) {\n if (!str.match(/^235\\s+/)) {\n return callback(this._formatError('Invalid login sequence while waiting for \"235\"', 'EAUTH', str, 'AUTH CRAM-MD5'));\n }\n\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n }\n\n /**\n * Handle the response for AUTH LOGIN command. We are expecting\n * '334 UGFzc3dvcmQ6' (base64 for 'Password:'). Data to be sent as\n * response needs to be base64 encoded password.\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_LOGIN_PASS(str, callback) {\n if (!/^334[ -]/.test(str)) {\n // expecting '334 UGFzc3dvcmQ6'\n return callback(this._formatError('Invalid login sequence while waiting for \"334 UGFzc3dvcmQ6\"', 'EAUTH', str, 'AUTH LOGIN'));\n }\n\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, callback);\n });\n\n this._sendCommand(\n Buffer.from((this._auth.credentials.pass || '').toString(), 'utf-8').toString('base64'),\n // Hidden pass for logs\n Buffer.from('/* secret */', 'utf-8').toString('base64')\n );\n }\n\n /**\n * Handles the response for authentication, if there's no error,\n * the user can be considered logged in. Start waiting for a message to send\n *\n * @param {String} str Message from the server\n */\n _actionAUTHComplete(str, isRetry, callback) {\n if (!callback && typeof isRetry === 'function') {\n callback = isRetry;\n isRetry = false;\n }\n\n if (str.substr(0, 3) === '334') {\n this._responseActions.push(str => {\n if (isRetry || this._authMethod !== 'XOAUTH2') {\n this._actionAUTHComplete(str, true, callback);\n } else {\n // fetch a new OAuth2 access token\n setImmediate(() => this._handleXOauth2Token(true, callback));\n }\n });\n this._sendCommand('');\n return;\n }\n\n if (str.charAt(0) !== '2') {\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authfail',\n method: this._authMethod\n },\n 'User %s failed to authenticate',\n JSON.stringify(this._auth.user)\n );\n return callback(this._formatError('Invalid login', 'EAUTH', str, 'AUTH ' + this._authMethod));\n }\n\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n }\n\n /**\n * Handle response for a MAIL FROM: command\n *\n * @param {String} str Message from the server\n */\n _actionMAIL(str, callback) {\n let message, curRecipient;\n if (Number(str.charAt(0)) !== 2) {\n if (this._usingSmtpUtf8 && /^550 /.test(str) && /[\\x80-\\uFFFF]/.test(this._envelope.from)) {\n message = 'Internationalized mailbox name not allowed';\n } else {\n message = 'Mail command failed';\n }\n return callback(this._formatError(message, 'EENVELOPE', str, 'MAIL FROM'));\n }\n\n if (!this._envelope.rcptQueue.length) {\n return callback(this._formatError('Can\\x27t send mail - no recipients defined', 'EENVELOPE', false, 'API'));\n } else {\n this._recipientQueue = [];\n\n if (this._supportedExtensions.includes('PIPELINING')) {\n while (this._envelope.rcptQueue.length) {\n curRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(curRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());\n }\n } else {\n curRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(curRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());\n }\n }\n }\n\n /**\n * Handle response for a RCPT TO: command\n *\n * @param {String} str Message from the server\n */\n _actionRCPT(str, callback) {\n let message,\n err,\n curRecipient = this._recipientQueue.shift();\n if (Number(str.charAt(0)) !== 2) {\n // this is a soft error\n if (this._usingSmtpUtf8 && /^553 /.test(str) && /[\\x80-\\uFFFF]/.test(curRecipient)) {\n message = 'Internationalized mailbox name not allowed';\n } else {\n message = 'Recipient command failed';\n }\n this._envelope.rejected.push(curRecipient);\n // store error for the failed recipient\n err = this._formatError(message, 'EENVELOPE', str, 'RCPT TO');\n err.recipient = curRecipient;\n this._envelope.rejectedErrors.push(err);\n } else {\n this._envelope.accepted.push(curRecipient);\n }\n\n if (!this._envelope.rcptQueue.length && !this._recipientQueue.length) {\n if (this._envelope.rejected.length < this._envelope.to.length) {\n this._responseActions.push(str => {\n this._actionDATA(str, callback);\n });\n this._sendCommand('DATA');\n } else {\n err = this._formatError('Can\\x27t send mail - all recipients were rejected', 'EENVELOPE', str, 'RCPT TO');\n err.rejected = this._envelope.rejected;\n err.rejectedErrors = this._envelope.rejectedErrors;\n return callback(err);\n }\n } else if (this._envelope.rcptQueue.length) {\n curRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(curRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());\n }\n }\n\n /**\n * Handle response for a DATA command\n *\n * @param {String} str Message from the server\n */\n _actionDATA(str, callback) {\n // response should be 354 but according to this issue https://github.com/eleith/emailjs/issues/24\n // some servers might use 250 instead, so lets check for 2 or 3 as the first digit\n if (!/^[23]/.test(str)) {\n return callback(this._formatError('Data command failed', 'EENVELOPE', str, 'DATA'));\n }\n\n let response = {\n accepted: this._envelope.accepted,\n rejected: this._envelope.rejected\n };\n\n if (this._ehloLines && this._ehloLines.length) {\n response.ehlo = this._ehloLines;\n }\n\n if (this._envelope.rejectedErrors.length) {\n response.rejectedErrors = this._envelope.rejectedErrors;\n }\n\n callback(null, response);\n }\n\n /**\n * Handle response for a DATA stream when using SMTP\n * We expect a single response that defines if the sending succeeded or failed\n *\n * @param {String} str Message from the server\n */\n _actionSMTPStream(str, callback) {\n if (Number(str.charAt(0)) !== 2) {\n // Message failed\n return callback(this._formatError('Message failed', 'EMESSAGE', str, 'DATA'));\n } else {\n // Message sent succesfully\n return callback(null, str);\n }\n }\n\n /**\n * Handle response for a DATA stream\n * We expect a separate response for every recipient. All recipients can either\n * succeed or fail separately\n *\n * @param {String} recipient The recipient this response applies to\n * @param {Boolean} final Is this the final recipient?\n * @param {String} str Message from the server\n */\n _actionLMTPStream(recipient, final, str, callback) {\n let err;\n if (Number(str.charAt(0)) !== 2) {\n // Message failed\n err = this._formatError('Message failed for recipient ' + recipient, 'EMESSAGE', str, 'DATA');\n err.recipient = recipient;\n this._envelope.rejected.push(recipient);\n this._envelope.rejectedErrors.push(err);\n for (let i = 0, len = this._envelope.accepted.length; i < len; i++) {\n if (this._envelope.accepted[i] === recipient) {\n this._envelope.accepted.splice(i, 1);\n }\n }\n }\n if (final) {\n return callback(null, str);\n }\n }\n\n _handleXOauth2Token(isRetry, callback) {\n this._auth.oauth2.getToken(isRetry, (err, accessToken) => {\n if (err) {\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authfail',\n method: this._authMethod\n },\n 'User %s failed to authenticate',\n JSON.stringify(this._auth.user)\n );\n return callback(this._formatError(err, 'EAUTH', false, 'AUTH XOAUTH2'));\n }\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, isRetry, callback);\n });\n this._sendCommand(\n 'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token(accessToken),\n // Hidden for logs\n 'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token('/* secret */')\n );\n });\n }\n\n /**\n *\n * @param {string} command\n * @private\n */\n _isDestroyedMessage(command) {\n if (this._destroyed) {\n return 'Cannot ' + command + ' - smtp connection is already destroyed.';\n }\n\n if (this._socket) {\n if (this._socket.destroyed) {\n return 'Cannot ' + command + ' - smtp connection socket is already destroyed.';\n }\n\n if (!this._socket.writable) {\n return 'Cannot ' + command + ' - smtp connection socket is already half-closed.';\n }\n }\n }\n\n _getHostname() {\n // defaul hostname is machine hostname or [IP]\n let defaultHostname;\n try {\n defaultHostname = os.hostname() || '';\n } catch (err) {\n // fails on windows 7\n defaultHostname = 'localhost';\n }\n\n // ignore if not FQDN\n if (!defaultHostname || defaultHostname.indexOf('.') < 0) {\n defaultHostname = '[127.0.0.1]';\n }\n\n // IP should be enclosed in []\n if (defaultHostname.match(/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/)) {\n defaultHostname = '[' + defaultHostname + ']';\n }\n\n return defaultHostname;\n }\n}\n\nmodule.exports = SMTPConnection;\n", "'use strict';\n\nconst Stream = require('stream').Stream;\nconst nmfetch = require('../fetch');\nconst crypto = require('crypto');\nconst shared = require('../shared');\n\n/**\n * XOAUTH2 access_token generator for Gmail.\n * Create client ID for web applications in Google API console to use it.\n * See Offline Access for receiving the needed refreshToken for an user\n * https://developers.google.com/accounts/docs/OAuth2WebServer#offline\n *\n * Usage for generating access tokens with a custom method using provisionCallback:\n * provisionCallback(user, renew, callback)\n * * user is the username to get the token for\n * * renew is a boolean that if true indicates that existing token failed and needs to be renewed\n * * callback is the callback to run with (error, accessToken [, expires])\n * * accessToken is a string\n * * expires is an optional expire time in milliseconds\n * If provisionCallback is used, then Nodemailer does not try to attempt generating the token by itself\n *\n * @constructor\n * @param {Object} options Client information for token generation\n * @param {String} options.user User e-mail address\n * @param {String} options.clientId Client ID value\n * @param {String} options.clientSecret Client secret value\n * @param {String} options.refreshToken Refresh token for an user\n * @param {String} options.accessUrl Endpoint for token generation, defaults to 'https://accounts.google.com/o/oauth2/token'\n * @param {String} options.accessToken An existing valid accessToken\n * @param {String} options.privateKey Private key for JSW\n * @param {Number} options.expires Optional Access Token expire time in ms\n * @param {Number} options.timeout Optional TTL for Access Token in seconds\n * @param {Function} options.provisionCallback Function to run when a new access token is required\n */\nclass XOAuth2 extends Stream {\n constructor(options, logger) {\n super();\n\n this.options = options || {};\n\n if (options && options.serviceClient) {\n if (!options.privateKey || !options.user) {\n setImmediate(() => this.emit('error', new Error('Options \"privateKey\" and \"user\" are required for service account!')));\n return;\n }\n\n let serviceRequestTimeout = Math.min(Math.max(Number(this.options.serviceRequestTimeout) || 0, 0), 3600);\n this.options.serviceRequestTimeout = serviceRequestTimeout || 5 * 60;\n }\n\n this.logger = shared.getLogger(\n {\n logger\n },\n {\n component: this.options.component || 'OAuth2'\n }\n );\n\n this.provisionCallback = typeof this.options.provisionCallback === 'function' ? this.options.provisionCallback : false;\n\n this.options.accessUrl = this.options.accessUrl || 'https://accounts.google.com/o/oauth2/token';\n this.options.customHeaders = this.options.customHeaders || {};\n this.options.customParams = this.options.customParams || {};\n\n this.accessToken = this.options.accessToken || false;\n\n if (this.options.expires && Number(this.options.expires)) {\n this.expires = this.options.expires;\n } else {\n let timeout = Math.max(Number(this.options.timeout) || 0, 0);\n this.expires = (timeout && Date.now() + timeout * 1000) || 0;\n }\n }\n\n /**\n * Returns or generates (if previous has expired) a XOAuth2 token\n *\n * @param {Boolean} renew If false then use cached access token (if available)\n * @param {Function} callback Callback function with error object and token string\n */\n getToken(renew, callback) {\n if (!renew && this.accessToken && (!this.expires || this.expires > Date.now())) {\n return callback(null, this.accessToken);\n }\n\n let generateCallback = (...args) => {\n if (args[0]) {\n this.logger.error(\n {\n err: args[0],\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n },\n 'Failed generating new Access Token for %s',\n this.options.user\n );\n } else {\n this.logger.info(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n },\n 'Generated new Access Token for %s',\n this.options.user\n );\n }\n callback(...args);\n };\n\n if (this.provisionCallback) {\n this.provisionCallback(this.options.user, !!renew, (err, accessToken, expires) => {\n if (!err && accessToken) {\n this.accessToken = accessToken;\n this.expires = expires || 0;\n }\n generateCallback(err, accessToken);\n });\n } else {\n this.generateToken(generateCallback);\n }\n }\n\n /**\n * Updates token values\n *\n * @param {String} accessToken New access token\n * @param {Number} timeout Access token lifetime in seconds\n *\n * Emits 'token': { user: User email-address, accessToken: the new accessToken, timeout: TTL in seconds}\n */\n updateToken(accessToken, timeout) {\n this.accessToken = accessToken;\n timeout = Math.max(Number(timeout) || 0, 0);\n this.expires = (timeout && Date.now() + timeout * 1000) || 0;\n\n this.emit('token', {\n user: this.options.user,\n accessToken: accessToken || '',\n expires: this.expires\n });\n }\n\n /**\n * Generates a new XOAuth2 token with the credentials provided at initialization\n *\n * @param {Function} callback Callback function with error object and token string\n */\n generateToken(callback) {\n let urlOptions;\n let loggedUrlOptions;\n if (this.options.serviceClient) {\n // service account - https://developers.google.com/identity/protocols/OAuth2ServiceAccount\n let iat = Math.floor(Date.now() / 1000); // unix time\n let tokenData = {\n iss: this.options.serviceClient,\n scope: this.options.scope || 'https://mail.google.com/',\n sub: this.options.user,\n aud: this.options.accessUrl,\n iat,\n exp: iat + this.options.serviceRequestTimeout\n };\n let token;\n try {\n token = this.jwtSignRS256(tokenData);\n } catch (err) {\n return callback(new Error('Can\\x27t generate token. Check your auth options'));\n }\n\n urlOptions = {\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: token\n };\n\n loggedUrlOptions = {\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: tokenData\n };\n } else {\n if (!this.options.refreshToken) {\n return callback(new Error('Can\\x27t create new access token for user'));\n }\n\n // web app - https://developers.google.com/identity/protocols/OAuth2WebServer\n urlOptions = {\n client_id: this.options.clientId || '',\n client_secret: this.options.clientSecret || '',\n refresh_token: this.options.refreshToken,\n grant_type: 'refresh_token'\n };\n\n loggedUrlOptions = {\n client_id: this.options.clientId || '',\n client_secret: (this.options.clientSecret || '').substr(0, 6) + '...',\n refresh_token: (this.options.refreshToken || '').substr(0, 6) + '...',\n grant_type: 'refresh_token'\n };\n }\n\n Object.keys(this.options.customParams).forEach(key => {\n urlOptions[key] = this.options.customParams[key];\n loggedUrlOptions[key] = this.options.customParams[key];\n });\n\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'generate'\n },\n 'Requesting token using: %s',\n JSON.stringify(loggedUrlOptions)\n );\n\n this.postRequest(this.options.accessUrl, urlOptions, this.options, (error, body) => {\n let data;\n\n if (error) {\n return callback(error);\n }\n\n try {\n data = JSON.parse(body.toString());\n } catch (E) {\n return callback(E);\n }\n\n if (!data || typeof data !== 'object') {\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'post'\n },\n 'Response: %s',\n (body || '').toString()\n );\n return callback(new Error('Invalid authentication response'));\n }\n\n let logData = {};\n Object.keys(data).forEach(key => {\n if (key !== 'access_token') {\n logData[key] = data[key];\n } else {\n logData[key] = (data[key] || '').toString().substr(0, 6) + '...';\n }\n });\n\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'post'\n },\n 'Response: %s',\n JSON.stringify(logData)\n );\n\n if (data.error) {\n // Error Response : https://tools.ietf.org/html/rfc6749#section-5.2\n let errorMessage = data.error;\n if (data.error_description) {\n errorMessage += ': ' + data.error_description;\n }\n if (data.error_uri) {\n errorMessage += ' (' + data.error_uri + ')';\n }\n return callback(new Error(errorMessage));\n }\n\n if (data.access_token) {\n this.updateToken(data.access_token, data.expires_in);\n return callback(null, this.accessToken);\n }\n\n return callback(new Error('No access token'));\n });\n }\n\n /**\n * Converts an access_token and user id into a base64 encoded XOAuth2 token\n *\n * @param {String} [accessToken] Access token string\n * @return {String} Base64 encoded token for IMAP or SMTP login\n */\n buildXOAuth2Token(accessToken) {\n let authData = ['user=' + (this.options.user || ''), 'auth=Bearer ' + (accessToken || this.accessToken), '', ''];\n return Buffer.from(authData.join('\\x01'), 'utf-8').toString('base64');\n }\n\n /**\n * Custom POST request handler.\n * This is only needed to keep paths short in Windows \u2013 usually this module\n * is a dependency of a dependency and if it tries to require something\n * like the request module the paths get way too long to handle for Windows.\n * As we do only a simple POST request we do not actually require complicated\n * logic support (no redirects, no nothing) anyway.\n *\n * @param {String} url Url to POST to\n * @param {String|Buffer} payload Payload to POST\n * @param {Function} callback Callback function with (err, buff)\n */\n postRequest(url, payload, params, callback) {\n let returned = false;\n\n let chunks = [];\n let chunklen = 0;\n\n let req = nmfetch(url, {\n method: 'post',\n headers: params.customHeaders,\n body: payload,\n allowErrorResponse: true\n });\n\n req.on('readable', () => {\n let chunk;\n while ((chunk = req.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n req.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(err);\n });\n\n req.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(null, Buffer.concat(chunks, chunklen));\n });\n }\n\n /**\n * Encodes a buffer or a string into Base64url format\n *\n * @param {Buffer|String} data The data to convert\n * @return {String} The encoded string\n */\n toBase64URL(data) {\n if (typeof data === 'string') {\n data = Buffer.from(data);\n }\n\n return data\n .toString('base64')\n .replace(/[=]+/g, '') // remove '='s\n .replace(/\\+/g, '-') // '+' \u2192 '-'\n .replace(/\\//g, '_'); // '/' \u2192 '_'\n }\n\n /**\n * Creates a JSON Web Token signed with RS256 (SHA256 + RSA)\n *\n * @param {Object} payload The payload to include in the generated token\n * @return {String} The generated and signed token\n */\n jwtSignRS256(payload) {\n payload = ['{\"alg\":\"RS256\",\"typ\":\"JWT\"}', JSON.stringify(payload)].map(val => this.toBase64URL(val)).join('.');\n let signature = crypto.createSign('RSA-SHA256').update(payload).sign(this.options.privateKey);\n return payload + '.' + this.toBase64URL(signature);\n }\n}\n\nmodule.exports = XOAuth2;\n", "'use strict';\n\nconst SMTPConnection = require('../smtp-connection');\nconst assign = require('../shared').assign;\nconst XOAuth2 = require('../xoauth2');\nconst EventEmitter = require('events');\n\n/**\n * Creates an element for the pool\n *\n * @constructor\n * @param {Object} options SMTPPool instance\n */\nclass PoolResource extends EventEmitter {\n constructor(pool) {\n super();\n\n this.pool = pool;\n this.options = pool.options;\n this.logger = this.pool.logger;\n\n if (this.options.auth) {\n switch ((this.options.auth.type || '').toString().toUpperCase()) {\n case 'OAUTH2': {\n let oauth2 = new XOAuth2(this.options.auth, this.logger);\n oauth2.provisionCallback = (this.pool.mailer && this.pool.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;\n this.auth = {\n type: 'OAUTH2',\n user: this.options.auth.user,\n oauth2,\n method: 'XOAUTH2'\n };\n oauth2.on('token', token => this.pool.mailer.emit('token', token));\n oauth2.on('error', err => this.emit('error', err));\n break;\n }\n default:\n if (!this.options.auth.user && !this.options.auth.pass) {\n break;\n }\n this.auth = {\n type: (this.options.auth.type || '').toString().toUpperCase() || 'LOGIN',\n user: this.options.auth.user,\n credentials: {\n user: this.options.auth.user || '',\n pass: this.options.auth.pass,\n options: this.options.auth.options\n },\n method: (this.options.auth.method || '').trim().toUpperCase() || this.options.authMethod || false\n };\n }\n }\n\n this._connection = false;\n this._connected = false;\n\n this.messages = 0;\n this.available = true;\n }\n\n /**\n * Initiates a connection to the SMTP server\n *\n * @param {Function} callback Callback function to run once the connection is established or failed\n */\n connect(callback) {\n this.pool.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let returned = false;\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n options = assign(false, options);\n Object.keys(socketOptions).forEach(key => {\n options[key] = socketOptions[key];\n });\n }\n\n this.connection = new SMTPConnection(options);\n\n this.connection.once('error', err => {\n this.emit('error', err);\n if (returned) {\n return;\n }\n returned = true;\n return callback(err);\n });\n\n this.connection.once('end', () => {\n this.close();\n if (returned) {\n return;\n }\n returned = true;\n\n let timer = setTimeout(() => {\n if (returned) {\n return;\n }\n // still have not returned, this means we have an unexpected connection close\n let err = new Error('Unexpected socket close');\n if (this.connection && this.connection._socket && this.connection._socket.upgrading) {\n // starttls connection errors\n err.code = 'ETLS';\n }\n callback(err);\n }, 1000);\n\n try {\n timer.unref();\n } catch (E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n });\n\n this.connection.connect(() => {\n if (returned) {\n return;\n }\n\n if (this.auth && (this.connection.allowsAuth || options.forceAuth)) {\n this.connection.login(this.auth, err => {\n if (returned) {\n return;\n }\n returned = true;\n\n if (err) {\n this.connection.close();\n this.emit('error', err);\n return callback(err);\n }\n\n this._connected = true;\n callback(null, true);\n });\n } else {\n returned = true;\n this._connected = true;\n return callback(null, true);\n }\n });\n });\n }\n\n /**\n * Sends an e-mail to be sent using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n if (!this._connected) {\n return this.connect(err => {\n if (err) {\n return callback(err);\n }\n return this.send(mail, callback);\n });\n }\n\n let envelope = mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId,\n cid: this.id\n },\n 'Sending message %s using #%s to <%s>',\n messageId,\n this.id,\n recipients.join(', ')\n );\n\n if (mail.data.dsn) {\n envelope.dsn = mail.data.dsn;\n }\n\n this.connection.send(envelope, mail.message.createReadStream(), (err, info) => {\n this.messages++;\n\n if (err) {\n this.connection.close();\n this.emit('error', err);\n return callback(err);\n }\n\n info.envelope = {\n from: envelope.from,\n to: envelope.to\n };\n info.messageId = messageId;\n\n setImmediate(() => {\n let err;\n if (this.messages >= this.options.maxMessages) {\n err = new Error('Resource exhausted');\n err.code = 'EMAXLIMIT';\n this.connection.close();\n this.emit('error', err);\n } else {\n this.pool._checkRateLimit(() => {\n this.available = true;\n this.emit('available');\n });\n }\n });\n\n callback(null, info);\n });\n }\n\n /**\n * Closes the connection\n */\n close() {\n this._connected = false;\n if (this.auth && this.auth.oauth2) {\n this.auth.oauth2.removeAllListeners();\n }\n if (this.connection) {\n this.connection.close();\n }\n this.emit('close');\n }\n}\n\nmodule.exports = PoolResource;\n", "{\n \"1und1\": {\n \"host\": \"smtp.1und1.de\",\n \"port\": 465,\n \"secure\": true,\n \"authMethod\": \"LOGIN\"\n },\n \n \"Aliyun\": {\n \"domains\": [\"aliyun.com\"],\n \"host\": \"smtp.aliyun.com\",\n \"port\": 465,\n \"secure\": true\n },\n \n \"AOL\": {\n \"domains\": [\"aol.com\"],\n \"host\": \"smtp.aol.com\",\n \"port\": 587\n },\n\n \"Bluewin\": {\n \"host\": \"smtpauths.bluewin.ch\",\n \"domains\": [\"bluewin.ch\"],\n \"port\": 465\n },\n\n \"DebugMail\": {\n \"host\": \"debugmail.io\",\n \"port\": 25\n },\n\n \"DynectEmail\": {\n \"aliases\": [\"Dynect\"],\n \"host\": \"smtp.dynect.net\",\n \"port\": 25\n },\n\n \"Ethereal\": {\n \"aliases\": [\"ethereal.email\"],\n \"host\": \"smtp.ethereal.email\",\n \"port\": 587\n },\n\n \"FastMail\": {\n \"domains\": [\"fastmail.fm\"],\n \"host\": \"smtp.fastmail.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Forward Email\": {\n \"aliases\": [\"FE\", \"ForwardEmail\"],\n \"domains\": [\"forwardemail.net\"],\n \"host\": \"smtp.forwardemail.net\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Feishu Mail\": {\n \"aliases\": [\"Feishu\", \"FeishuMail\"],\n \"domains\": [\"www.feishu.cn\"],\n \"host\": \"smtp.feishu.cn\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"GandiMail\": {\n \"aliases\": [\"Gandi\", \"Gandi Mail\"],\n \"host\": \"mail.gandi.net\",\n \"port\": 587\n },\n\n \"Gmail\": {\n \"aliases\": [\"Google Mail\"],\n \"domains\": [\"gmail.com\", \"googlemail.com\"],\n \"host\": \"smtp.gmail.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Godaddy\": {\n \"host\": \"smtpout.secureserver.net\",\n \"port\": 25\n },\n\n \"GodaddyAsia\": {\n \"host\": \"smtp.asia.secureserver.net\",\n \"port\": 25\n },\n\n \"GodaddyEurope\": {\n \"host\": \"smtp.europe.secureserver.net\",\n \"port\": 25\n },\n\n \"hot.ee\": {\n \"host\": \"mail.hot.ee\"\n },\n\n \"Hotmail\": {\n \"aliases\": [\"Outlook\", \"Outlook.com\", \"Hotmail.com\"],\n \"domains\": [\"hotmail.com\", \"outlook.com\"],\n \"host\": \"smtp-mail.outlook.com\",\n \"port\": 587\n },\n\n \"iCloud\": {\n \"aliases\": [\"Me\", \"Mac\"],\n \"domains\": [\"me.com\", \"mac.com\"],\n \"host\": \"smtp.mail.me.com\",\n \"port\": 587\n },\n\n \"Infomaniak\": {\n \"host\": \"mail.infomaniak.com\",\n \"domains\": [\"ik.me\", \"ikmail.com\", \"etik.com\"],\n \"port\": 587\n },\n \"Loopia\": {\n \"host\": \"mailcluster.loopia.se\",\n \"port\": 465\n },\n \"mail.ee\": {\n \"host\": \"smtp.mail.ee\"\n },\n\n \"Mail.ru\": {\n \"host\": \"smtp.mail.ru\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Mailcatch.app\": {\n \"host\": \"sandbox-smtp.mailcatch.app\",\n \"port\": 2525\n },\n\n \"Maildev\": {\n \"port\": 1025,\n \"ignoreTLS\": true\n },\n\n \"Mailgun\": {\n \"host\": \"smtp.mailgun.org\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Mailjet\": {\n \"host\": \"in.mailjet.com\",\n \"port\": 587\n },\n\n \"Mailosaur\": {\n \"host\": \"mailosaur.io\",\n \"port\": 25\n },\n\n \"Mailtrap\": {\n \"host\": \"live.smtp.mailtrap.io\",\n \"port\": 587\n },\n\n \"Mandrill\": {\n \"host\": \"smtp.mandrillapp.com\",\n \"port\": 587\n },\n\n \"Naver\": {\n \"host\": \"smtp.naver.com\",\n \"port\": 587\n },\n\n \"One\": {\n \"host\": \"send.one.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"OpenMailBox\": {\n \"aliases\": [\"OMB\", \"openmailbox.org\"],\n \"host\": \"smtp.openmailbox.org\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Outlook365\": {\n \"host\": \"smtp.office365.com\",\n \"port\": 587,\n \"secure\": false\n },\n\n \"OhMySMTP\": {\n \"host\": \"smtp.ohmysmtp.com\",\n \"port\": 587,\n \"secure\": false\n },\n\n \"Postmark\": {\n \"aliases\": [\"PostmarkApp\"],\n \"host\": \"smtp.postmarkapp.com\",\n \"port\": 2525\n },\n\n \"Proton\": {\n \"aliases\": [\"ProtonMail\", \"Proton.me\", \"Protonmail.com\", \"Protonmail.ch\"],\n \"domains\": [\"proton.me\", \"protonmail.com\", \"pm.me\", \"protonmail.ch\"],\n \"host\": \"smtp.protonmail.ch\",\n \"port\": 587,\n \"requireTLS\": true\n },\n\n \"qiye.aliyun\": {\n \"host\": \"smtp.mxhichina.com\",\n \"port\": \"465\",\n \"secure\": true\n },\n\n \"QQ\": {\n \"domains\": [\"qq.com\"],\n \"host\": \"smtp.qq.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"QQex\": {\n \"aliases\": [\"QQ Enterprise\"],\n \"domains\": [\"exmail.qq.com\"],\n \"host\": \"smtp.exmail.qq.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SendCloud\": {\n \"host\": \"smtp.sendcloud.net\",\n \"port\": 2525\n },\n\n \"SendGrid\": {\n \"host\": \"smtp.sendgrid.net\",\n \"port\": 587\n },\n\n \"SendinBlue\": {\n \"aliases\": [\"Brevo\"],\n \"host\": \"smtp-relay.brevo.com\",\n \"port\": 587\n },\n\n \"SendPulse\": {\n \"host\": \"smtp-pulse.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES\": {\n \"host\": \"email-smtp.us-east-1.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-US-EAST-1\": {\n \"host\": \"email-smtp.us-east-1.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-US-WEST-2\": {\n \"host\": \"email-smtp.us-west-2.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-EU-WEST-1\": {\n \"host\": \"email-smtp.eu-west-1.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-AP-SOUTH-1\": {\n \"host\": \"email-smtp.ap-south-1.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-AP-NORTHEAST-1\": {\n \"host\": \"email-smtp.ap-northeast-1.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-AP-NORTHEAST-2\": {\n \"host\": \"email-smtp.ap-northeast-2.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-AP-NORTHEAST-3\": {\n \"host\": \"email-smtp.ap-northeast-3.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-AP-SOUTHEAST-1\": {\n \"host\": \"email-smtp.ap-southeast-1.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"SES-AP-SOUTHEAST-2\": {\n \"host\": \"email-smtp.ap-southeast-2.amazonaws.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Seznam\": {\n \"aliases\": [\"Seznam Email\"],\n \"domains\": [\"seznam.cz\", \"email.cz\", \"post.cz\", \"spoluzaci.cz\"],\n \"host\": \"smtp.seznam.cz\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Sparkpost\": {\n \"aliases\": [\"SparkPost\", \"SparkPost Mail\"],\n \"domains\": [\"sparkpost.com\"],\n \"host\": \"smtp.sparkpostmail.com\",\n \"port\": 587,\n \"secure\": false\n },\n\n \"Tipimail\": {\n \"host\": \"smtp.tipimail.com\",\n \"port\": 587\n },\n\n \"Yahoo\": {\n \"domains\": [\"yahoo.com\"],\n \"host\": \"smtp.mail.yahoo.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Yandex\": {\n \"domains\": [\"yandex.ru\"],\n \"host\": \"smtp.yandex.ru\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"Zoho\": {\n \"host\": \"smtp.zoho.com\",\n \"port\": 465,\n \"secure\": true,\n \"authMethod\": \"LOGIN\"\n },\n\n \"126\": {\n \"host\": \"smtp.126.com\",\n \"port\": 465,\n \"secure\": true\n },\n\n \"163\": {\n \"host\": \"smtp.163.com\",\n \"port\": 465,\n \"secure\": true\n }\n}\n", "'use strict';\n\nconst services = require('./services.json');\nconst normalized = {};\n\nObject.keys(services).forEach(key => {\n let service = services[key];\n\n normalized[normalizeKey(key)] = normalizeService(service);\n\n [].concat(service.aliases || []).forEach(alias => {\n normalized[normalizeKey(alias)] = normalizeService(service);\n });\n\n [].concat(service.domains || []).forEach(domain => {\n normalized[normalizeKey(domain)] = normalizeService(service);\n });\n});\n\nfunction normalizeKey(key) {\n return key.replace(/[^a-zA-Z0-9.-]/g, '').toLowerCase();\n}\n\nfunction normalizeService(service) {\n let filter = ['domains', 'aliases'];\n let response = {};\n\n Object.keys(service).forEach(key => {\n if (filter.indexOf(key) < 0) {\n response[key] = service[key];\n }\n });\n\n return response;\n}\n\n/**\n * Resolves SMTP config for given key. Key can be a name (like 'Gmail'), alias (like 'Google Mail') or\n * an email address (like 'test@googlemail.com').\n *\n * @param {String} key [description]\n * @returns {Object} SMTP config or false if not found\n */\nmodule.exports = function (key) {\n key = normalizeKey(key.split('@').pop());\n return normalized[key] || false;\n};\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst PoolResource = require('./pool-resource');\nconst SMTPConnection = require('../smtp-connection');\nconst wellKnown = require('../well-known');\nconst shared = require('../shared');\nconst packageData = require('../../package.json');\n\n/**\n * Creates a SMTP pool transport object for Nodemailer\n *\n * @constructor\n * @param {Object} options SMTP Connection options\n */\nclass SMTPPool extends EventEmitter {\n constructor(options) {\n super();\n\n options = options || {};\n if (typeof options === 'string') {\n options = {\n url: options\n };\n }\n\n let urlData;\n let service = options.service;\n\n if (typeof options.getSocket === 'function') {\n this.getSocket = options.getSocket;\n }\n\n if (options.url) {\n urlData = shared.parseConnectionUrl(options.url);\n service = service || urlData.service;\n }\n\n this.options = shared.assign(\n false, // create new object\n options, // regular options\n urlData, // url options\n service && wellKnown(service) // wellknown options\n );\n\n this.options.maxConnections = this.options.maxConnections || 5;\n this.options.maxMessages = this.options.maxMessages || 100;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-pool'\n });\n\n // temporary object\n let connection = new SMTPConnection(this.options);\n\n this.name = 'SMTP (pool)';\n this.version = packageData.version + '[client:' + connection.version + ']';\n\n this._rateLimit = {\n counter: 0,\n timeout: null,\n waiting: [],\n checkpoint: false,\n delta: Number(this.options.rateDelta) || 1000,\n limit: Number(this.options.rateLimit) || 0\n };\n this._closed = false;\n this._queue = [];\n this._connections = [];\n this._connectionCounter = 0;\n\n this.idling = true;\n\n setImmediate(() => {\n if (this.idling) {\n this.emit('idle');\n }\n });\n }\n\n /**\n * Placeholder function for creating proxy sockets. This method immediatelly returns\n * without a socket\n *\n * @param {Object} options Connection options\n * @param {Function} callback Callback function to run with the socket keys\n */\n getSocket(options, callback) {\n // return immediatelly\n return setImmediate(() => callback(null, false));\n }\n\n /**\n * Queues an e-mail to be sent using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n if (this._closed) {\n return false;\n }\n\n this._queue.push({\n mail,\n requeueAttempts: 0,\n callback\n });\n\n if (this.idling && this._queue.length >= this.options.maxConnections) {\n this.idling = false;\n }\n\n setImmediate(() => this._processMessages());\n\n return true;\n }\n\n /**\n * Closes all connections in the pool. If there is a message being sent, the connection\n * is closed later\n */\n close() {\n let connection;\n let len = this._connections.length;\n this._closed = true;\n\n // clear rate limit timer if it exists\n clearTimeout(this._rateLimit.timeout);\n\n if (!len && !this._queue.length) {\n return;\n }\n\n // remove all available connections\n for (let i = len - 1; i >= 0; i--) {\n if (this._connections[i] && this._connections[i].available) {\n connection = this._connections[i];\n connection.close();\n this.logger.info(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'removed'\n },\n 'Connection #%s removed',\n connection.id\n );\n }\n }\n\n if (len && !this._connections.length) {\n this.logger.debug(\n {\n tnx: 'connection'\n },\n 'All connections removed'\n );\n }\n\n if (!this._queue.length) {\n return;\n }\n\n // make sure that entire queue would be cleaned\n let invokeCallbacks = () => {\n if (!this._queue.length) {\n this.logger.debug(\n {\n tnx: 'connection'\n },\n 'Pending queue entries cleared'\n );\n return;\n }\n let entry = this._queue.shift();\n if (entry && typeof entry.callback === 'function') {\n try {\n entry.callback(new Error('Connection pool was closed'));\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n }\n setImmediate(invokeCallbacks);\n };\n setImmediate(invokeCallbacks);\n }\n\n /**\n * Check the queue and available connections. If there is a message to be sent and there is\n * an available connection, then use this connection to send the mail\n */\n _processMessages() {\n let connection;\n let i, len;\n\n // do nothing if already closed\n if (this._closed) {\n return;\n }\n\n // do nothing if queue is empty\n if (!this._queue.length) {\n if (!this.idling) {\n // no pending jobs\n this.idling = true;\n this.emit('idle');\n }\n return;\n }\n\n // find first available connection\n for (i = 0, len = this._connections.length; i < len; i++) {\n if (this._connections[i].available) {\n connection = this._connections[i];\n break;\n }\n }\n\n if (!connection && this._connections.length < this.options.maxConnections) {\n connection = this._createConnection();\n }\n\n if (!connection) {\n // no more free connection slots available\n this.idling = false;\n return;\n }\n\n // check if there is free space in the processing queue\n if (!this.idling && this._queue.length < this.options.maxConnections) {\n this.idling = true;\n this.emit('idle');\n }\n\n let entry = (connection.queueEntry = this._queue.shift());\n entry.messageId = (connection.queueEntry.mail.message.getHeader('message-id') || '').replace(/[<>\\s]/g, '');\n\n connection.available = false;\n\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n messageId: entry.messageId,\n action: 'assign'\n },\n 'Assigned message <%s> to #%s (%s)',\n entry.messageId,\n connection.id,\n connection.messages + 1\n );\n\n if (this._rateLimit.limit) {\n this._rateLimit.counter++;\n if (!this._rateLimit.checkpoint) {\n this._rateLimit.checkpoint = Date.now();\n }\n }\n\n connection.send(entry.mail, (err, info) => {\n // only process callback if current handler is not changed\n if (entry === connection.queueEntry) {\n try {\n entry.callback(err, info);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n });\n }\n\n /**\n * Creates a new pool resource\n */\n _createConnection() {\n let connection = new PoolResource(this);\n\n connection.id = ++this._connectionCounter;\n\n this.logger.info(\n {\n tnx: 'pool',\n cid: connection.id,\n action: 'conection'\n },\n 'Created new pool resource #%s',\n connection.id\n );\n\n // resource comes available\n connection.on('available', () => {\n this.logger.debug(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'available'\n },\n 'Connection #%s became available',\n connection.id\n );\n\n if (this._closed) {\n // if already closed run close() that will remove this connections from connections list\n this.close();\n } else {\n // check if there's anything else to send\n this._processMessages();\n }\n });\n\n // resource is terminated with an error\n connection.once('error', err => {\n if (err.code !== 'EMAXLIMIT') {\n this.logger.error(\n {\n err,\n tnx: 'pool',\n cid: connection.id\n },\n 'Pool Error for #%s: %s',\n connection.id,\n err.message\n );\n } else {\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n action: 'maxlimit'\n },\n 'Max messages limit exchausted for #%s',\n connection.id\n );\n }\n\n if (connection.queueEntry) {\n try {\n connection.queueEntry.callback(err);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n\n // remove the erroneus connection from connections list\n this._removeConnection(connection);\n\n this._continueProcessing();\n });\n\n connection.once('close', () => {\n this.logger.info(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'closed'\n },\n 'Connection #%s was closed',\n connection.id\n );\n\n this._removeConnection(connection);\n\n if (connection.queueEntry) {\n // If the connection closed when sending, add the message to the queue again\n // if max number of requeues is not reached yet\n // Note that we must wait a bit.. because the callback of the 'error' handler might be called\n // in the next event loop\n setTimeout(() => {\n if (connection.queueEntry) {\n if (this._shouldRequeuOnConnectionClose(connection.queueEntry)) {\n this._requeueEntryOnConnectionClose(connection);\n } else {\n this._failDeliveryOnConnectionClose(connection);\n }\n }\n this._continueProcessing();\n }, 50);\n } else {\n this._continueProcessing();\n }\n });\n\n this._connections.push(connection);\n\n return connection;\n }\n\n _shouldRequeuOnConnectionClose(queueEntry) {\n if (this.options.maxRequeues === undefined || this.options.maxRequeues < 0) {\n return true;\n }\n\n return queueEntry.requeueAttempts < this.options.maxRequeues;\n }\n\n _failDeliveryOnConnectionClose(connection) {\n if (connection.queueEntry && connection.queueEntry.callback) {\n try {\n connection.queueEntry.callback(new Error('Reached maximum number of retries after connection was closed'));\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n messageId: connection.queueEntry.messageId,\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n }\n\n _requeueEntryOnConnectionClose(connection) {\n connection.queueEntry.requeueAttempts = connection.queueEntry.requeueAttempts + 1;\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n messageId: connection.queueEntry.messageId,\n action: 'requeue'\n },\n 'Re-queued message <%s> for #%s. Attempt: #%s',\n connection.queueEntry.messageId,\n connection.id,\n connection.queueEntry.requeueAttempts\n );\n this._queue.unshift(connection.queueEntry);\n connection.queueEntry = false;\n }\n\n /**\n * Continue to process message if the pool hasn't closed\n */\n _continueProcessing() {\n if (this._closed) {\n this.close();\n } else {\n setTimeout(() => this._processMessages(), 100);\n }\n }\n\n /**\n * Remove resource from pool\n *\n * @param {Object} connection The PoolResource to remove\n */\n _removeConnection(connection) {\n let index = this._connections.indexOf(connection);\n\n if (index !== -1) {\n this._connections.splice(index, 1);\n }\n }\n\n /**\n * Checks if connections have hit current rate limit and if so, queues the availability callback\n *\n * @param {Function} callback Callback function to run once rate limiter has been cleared\n */\n _checkRateLimit(callback) {\n if (!this._rateLimit.limit) {\n return callback();\n }\n\n let now = Date.now();\n\n if (this._rateLimit.counter < this._rateLimit.limit) {\n return callback();\n }\n\n this._rateLimit.waiting.push(callback);\n\n if (this._rateLimit.checkpoint <= now - this._rateLimit.delta) {\n return this._clearRateLimit();\n } else if (!this._rateLimit.timeout) {\n this._rateLimit.timeout = setTimeout(() => this._clearRateLimit(), this._rateLimit.delta - (now - this._rateLimit.checkpoint));\n this._rateLimit.checkpoint = now;\n }\n }\n\n /**\n * Clears current rate limit limitation and runs paused callback\n */\n _clearRateLimit() {\n clearTimeout(this._rateLimit.timeout);\n this._rateLimit.timeout = null;\n this._rateLimit.counter = 0;\n this._rateLimit.checkpoint = false;\n\n // resume all paused connections\n while (this._rateLimit.waiting.length) {\n let cb = this._rateLimit.waiting.shift();\n setImmediate(cb);\n }\n }\n\n /**\n * Returns true if there are free slots in the queue\n */\n isIdle() {\n return this.idling;\n }\n\n /**\n * Verifies SMTP configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n let auth = new PoolResource(this).auth;\n\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n options = shared.assign(false, options);\n Object.keys(socketOptions).forEach(key => {\n options[key] = socketOptions[key];\n });\n }\n\n let connection = new SMTPConnection(options);\n let returned = false;\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(new Error('Connection closed'));\n });\n\n let finalize = () => {\n if (returned) {\n return;\n }\n returned = true;\n connection.quit();\n return callback(null, true);\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n if (auth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(auth, err => {\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n finalize();\n });\n } else if (!auth && connection.allowsAuth && options.forceAuth) {\n let err = new Error('Authentication info was not provided');\n err.code = 'NoAuth';\n\n returned = true;\n connection.close();\n return callback(err);\n } else {\n finalize();\n }\n });\n });\n\n return promise;\n }\n}\n\n// expose to the world\nmodule.exports = SMTPPool;\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst SMTPConnection = require('../smtp-connection');\nconst wellKnown = require('../well-known');\nconst shared = require('../shared');\nconst XOAuth2 = require('../xoauth2');\nconst packageData = require('../../package.json');\n\n/**\n * Creates a SMTP transport object for Nodemailer\n *\n * @constructor\n * @param {Object} options Connection options\n */\nclass SMTPTransport extends EventEmitter {\n constructor(options) {\n super();\n\n options = options || {};\n\n if (typeof options === 'string') {\n options = {\n url: options\n };\n }\n\n let urlData;\n let service = options.service;\n\n if (typeof options.getSocket === 'function') {\n this.getSocket = options.getSocket;\n }\n\n if (options.url) {\n urlData = shared.parseConnectionUrl(options.url);\n service = service || urlData.service;\n }\n\n this.options = shared.assign(\n false, // create new object\n options, // regular options\n urlData, // url options\n service && wellKnown(service) // wellknown options\n );\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-transport'\n });\n\n // temporary object\n let connection = new SMTPConnection(this.options);\n\n this.name = 'SMTP';\n this.version = packageData.version + '[client:' + connection.version + ']';\n\n if (this.options.auth) {\n this.auth = this.getAuth({});\n }\n }\n\n /**\n * Placeholder function for creating proxy sockets. This method immediatelly returns\n * without a socket\n *\n * @param {Object} options Connection options\n * @param {Function} callback Callback function to run with the socket keys\n */\n getSocket(options, callback) {\n // return immediatelly\n return setImmediate(() => callback(null, false));\n }\n\n getAuth(authOpts) {\n if (!authOpts) {\n return this.auth;\n }\n\n let hasAuth = false;\n let authData = {};\n\n if (this.options.auth && typeof this.options.auth === 'object') {\n Object.keys(this.options.auth).forEach(key => {\n hasAuth = true;\n authData[key] = this.options.auth[key];\n });\n }\n\n if (authOpts && typeof authOpts === 'object') {\n Object.keys(authOpts).forEach(key => {\n hasAuth = true;\n authData[key] = authOpts[key];\n });\n }\n\n if (!hasAuth) {\n return false;\n }\n\n switch ((authData.type || '').toString().toUpperCase()) {\n case 'OAUTH2': {\n if (!authData.service && !authData.user) {\n return false;\n }\n let oauth2 = new XOAuth2(authData, this.logger);\n oauth2.provisionCallback = (this.mailer && this.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;\n oauth2.on('token', token => this.mailer.emit('token', token));\n oauth2.on('error', err => this.emit('error', err));\n return {\n type: 'OAUTH2',\n user: authData.user,\n oauth2,\n method: 'XOAUTH2'\n };\n }\n default:\n return {\n type: (authData.type || '').toString().toUpperCase() || 'LOGIN',\n user: authData.user,\n credentials: {\n user: authData.user || '',\n pass: authData.pass,\n options: authData.options\n },\n method: (authData.method || '').trim().toUpperCase() || this.options.authMethod || false\n };\n }\n }\n\n /**\n * Sends an e-mail using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let returned = false;\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n // only copy options if we need to modify it\n options = shared.assign(false, options);\n Object.keys(socketOptions).forEach(key => {\n options[key] = socketOptions[key];\n });\n }\n\n let connection = new SMTPConnection(options);\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n\n let timer = setTimeout(() => {\n if (returned) {\n return;\n }\n returned = true;\n // still have not returned, this means we have an unexpected connection close\n let err = new Error('Unexpected socket close');\n if (connection && connection._socket && connection._socket.upgrading) {\n // starttls connection errors\n err.code = 'ETLS';\n }\n callback(err);\n }, 1000);\n\n try {\n timer.unref();\n } catch (E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n });\n\n let sendMessage = () => {\n let envelope = mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n\n if (mail.data.dsn) {\n envelope.dsn = mail.data.dsn;\n }\n\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n connection.send(envelope, mail.message.createReadStream(), (err, info) => {\n returned = true;\n connection.close();\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send'\n },\n 'Send error for %s: %s',\n messageId,\n err.message\n );\n return callback(err);\n }\n info.envelope = {\n from: envelope.from,\n to: envelope.to\n };\n info.messageId = messageId;\n try {\n return callback(null, info);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback'\n },\n 'Callback error for %s: %s',\n messageId,\n E.message\n );\n }\n });\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n let auth = this.getAuth(mail.data.auth);\n\n if (auth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(auth, err => {\n if (auth && auth !== this.auth && auth.oauth2) {\n auth.oauth2.removeAllListeners();\n }\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n sendMessage();\n });\n } else {\n sendMessage();\n }\n });\n });\n }\n\n /**\n * Verifies SMTP configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n options = shared.assign(false, options);\n Object.keys(socketOptions).forEach(key => {\n options[key] = socketOptions[key];\n });\n }\n\n let connection = new SMTPConnection(options);\n let returned = false;\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(new Error('Connection closed'));\n });\n\n let finalize = () => {\n if (returned) {\n return;\n }\n returned = true;\n connection.quit();\n return callback(null, true);\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n let authData = this.getAuth({});\n\n if (authData && (connection.allowsAuth || options.forceAuth)) {\n connection.login(authData, err => {\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n finalize();\n });\n } else if (!authData && connection.allowsAuth && options.forceAuth) {\n let err = new Error('Authentication info was not provided');\n err.code = 'NoAuth';\n\n returned = true;\n connection.close();\n return callback(err);\n } else {\n finalize();\n }\n });\n });\n\n return promise;\n }\n\n /**\n * Releases resources\n */\n close() {\n if (this.auth && this.auth.oauth2) {\n this.auth.oauth2.removeAllListeners();\n }\n this.emit('close');\n }\n}\n\n// expose to the world\nmodule.exports = SMTPTransport;\n", "'use strict';\n\nconst spawn = require('child_process').spawn;\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\n\n/**\n * Generates a Transport object for Sendmail\n *\n * Possible options can be the following:\n *\n * * **path** optional path to sendmail binary\n * * **newline** either 'windows' or 'unix'\n * * **args** an array of arguments for the sendmail binary\n *\n * @constructor\n * @param {Object} optional config parameter for Sendmail\n */\nclass SendmailTransport {\n constructor(options) {\n options = options || {};\n\n // use a reference to spawn for mocking purposes\n this._spawn = spawn;\n\n this.options = options || {};\n\n this.name = 'Sendmail';\n this.version = packageData.version;\n\n this.path = 'sendmail';\n this.args = false;\n this.winbreak = false;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'sendmail'\n });\n\n if (options) {\n if (typeof options === 'string') {\n this.path = options;\n } else if (typeof options === 'object') {\n if (options.path) {\n this.path = options.path;\n }\n if (Array.isArray(options.args)) {\n this.args = options.args;\n }\n this.winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes((options.newline || '').toString().toLowerCase());\n }\n }\n }\n\n /**\n * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // Sendmail strips this header line by itself\n mail.message.keepBcc = true;\n\n let envelope = mail.data.envelope || mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n let args;\n let sendmail;\n let returned;\n\n const hasInvalidAddresses = []\n .concat(envelope.from || [])\n .concat(envelope.to || [])\n .some(addr => /^-/.test(addr));\n if (hasInvalidAddresses) {\n return done(new Error('Can not send mail. Invalid envelope addresses.'));\n }\n\n if (this.args) {\n // force -i to keep single dots\n args = ['-i'].concat(this.args).concat(envelope.to);\n } else {\n args = ['-i'].concat(envelope.from ? ['-f', envelope.from] : []).concat(envelope.to);\n }\n\n let callback = err => {\n if (returned) {\n // ignore any additional responses, already done\n return;\n }\n returned = true;\n if (typeof done === 'function') {\n if (err) {\n return done(err);\n } else {\n return done(null, {\n envelope: mail.data.envelope || mail.message.getEnvelope(),\n messageId,\n response: 'Messages queued for delivery'\n });\n }\n }\n };\n\n try {\n sendmail = this._spawn(this.path, args);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'spawn',\n messageId\n },\n 'Error occurred while spawning sendmail. %s',\n E.message\n );\n return callback(E);\n }\n\n if (sendmail) {\n sendmail.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'spawn',\n messageId\n },\n 'Error occurred when sending message %s. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n\n sendmail.once('exit', code => {\n if (!code) {\n return callback();\n }\n let err;\n if (code === 127) {\n err = new Error('Sendmail command not found, process exited with code ' + code);\n } else {\n err = new Error('Sendmail exited with code ' + code);\n }\n\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error sending message %s to sendmail. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n sendmail.once('close', callback);\n\n sendmail.stdin.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error occurred when piping message %s to sendmail. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n let sourceStream = mail.message.createReadStream();\n sourceStream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error occurred when generating message %s. %s',\n messageId,\n err.message\n );\n sendmail.kill('SIGINT'); // do not deliver the message\n callback(err);\n });\n\n sourceStream.pipe(sendmail.stdin);\n } else {\n return callback(new Error('sendmail was not found'));\n }\n }\n}\n\nmodule.exports = SendmailTransport;\n", "'use strict';\n\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\n\n/**\n * Generates a Transport object for streaming\n *\n * Possible options can be the following:\n *\n * * **buffer** if true, then returns the message as a Buffer object instead of a stream\n * * **newline** either 'windows' or 'unix'\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass StreamTransport {\n constructor(options) {\n options = options || {};\n\n this.options = options || {};\n\n this.name = 'StreamTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'stream-transport'\n });\n\n this.winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes((options.newline || '').toString().toLowerCase());\n }\n\n /**\n * Compiles a mailcomposer message and forwards it to handler that sends it\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // We probably need this in the output\n mail.message.keepBcc = true;\n\n let envelope = mail.data.envelope || mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s> using %s line breaks',\n messageId,\n recipients.join(', '),\n this.winbreak ? '<CR><LF>' : '<LF>'\n );\n\n setImmediate(() => {\n let stream;\n\n try {\n stream = mail.message.createReadStream();\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'send',\n messageId\n },\n 'Creating send stream failed for %s. %s',\n messageId,\n E.message\n );\n return done(E);\n }\n\n if (!this.options.buffer) {\n stream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n });\n return done(null, {\n envelope: mail.data.envelope || mail.message.getEnvelope(),\n messageId,\n message: stream\n });\n }\n\n let chunks = [];\n let chunklen = 0;\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n stream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n return done(err);\n });\n\n stream.on('end', () =>\n done(null, {\n envelope: mail.data.envelope || mail.message.getEnvelope(),\n messageId,\n message: Buffer.concat(chunks, chunklen)\n })\n );\n });\n }\n}\n\nmodule.exports = StreamTransport;\n", "'use strict';\n\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\n\n/**\n * Generates a Transport object to generate JSON output\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass JSONTransport {\n constructor(options) {\n options = options || {};\n\n this.options = options || {};\n\n this.name = 'JSONTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'json-transport'\n });\n }\n\n /**\n * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // Sendmail strips this header line by itself\n mail.message.keepBcc = true;\n\n let envelope = mail.data.envelope || mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Composing JSON structure of %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n setImmediate(() => {\n mail.normalize((err, data) => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed building JSON structure for %s. %s',\n messageId,\n err.message\n );\n return done(err);\n }\n\n delete data.envelope;\n delete data.normalizedHeaders;\n\n return done(null, {\n envelope,\n messageId,\n message: this.options.skipEncoding ? data : JSON.stringify(data)\n });\n });\n });\n }\n}\n\nmodule.exports = JSONTransport;\n", "'use strict';\n\nconst EventEmitter = require('events');\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\nconst LeWindows = require('../mime-node/le-windows');\n\n/**\n * Generates a Transport object for AWS SES\n *\n * Possible options can be the following:\n *\n * * **sendingRate** optional Number specifying how many messages per second should be delivered to SES\n * * **maxConnections** optional Number specifying max number of parallel connections to SES\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass SESTransport extends EventEmitter {\n constructor(options) {\n super();\n options = options || {};\n\n this.options = options || {};\n this.ses = this.options.SES;\n\n this.name = 'SESTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'ses-transport'\n });\n\n // parallel sending connections\n this.maxConnections = Number(this.options.maxConnections) || Infinity;\n this.connections = 0;\n\n // max messages per second\n this.sendingRate = Number(this.options.sendingRate) || Infinity;\n this.sendingRateTTL = null;\n this.rateInterval = 1000; // milliseconds\n this.rateMessages = [];\n\n this.pending = [];\n\n this.idling = true;\n\n setImmediate(() => {\n if (this.idling) {\n this.emit('idle');\n }\n });\n }\n\n /**\n * Schedules a sending of a message\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, callback) {\n if (this.connections >= this.maxConnections) {\n this.idling = false;\n return this.pending.push({\n mail,\n callback\n });\n }\n\n if (!this._checkSendingRate()) {\n this.idling = false;\n return this.pending.push({\n mail,\n callback\n });\n }\n\n this._send(mail, (...args) => {\n setImmediate(() => callback(...args));\n this._sent();\n });\n }\n\n _checkRatedQueue() {\n if (this.connections >= this.maxConnections || !this._checkSendingRate()) {\n return;\n }\n\n if (!this.pending.length) {\n if (!this.idling) {\n this.idling = true;\n this.emit('idle');\n }\n return;\n }\n\n let next = this.pending.shift();\n this._send(next.mail, (...args) => {\n setImmediate(() => next.callback(...args));\n this._sent();\n });\n }\n\n _checkSendingRate() {\n clearTimeout(this.sendingRateTTL);\n\n let now = Date.now();\n let oldest = false;\n // delete older messages\n for (let i = this.rateMessages.length - 1; i >= 0; i--) {\n if (this.rateMessages[i].ts >= now - this.rateInterval && (!oldest || this.rateMessages[i].ts < oldest)) {\n oldest = this.rateMessages[i].ts;\n }\n\n if (this.rateMessages[i].ts < now - this.rateInterval && !this.rateMessages[i].pending) {\n this.rateMessages.splice(i, 1);\n }\n }\n\n if (this.rateMessages.length < this.sendingRate) {\n return true;\n }\n\n let delay = Math.max(oldest + 1001, now + 20);\n this.sendingRateTTL = setTimeout(() => this._checkRatedQueue(), now - delay);\n\n try {\n this.sendingRateTTL.unref();\n } catch (E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n\n return false;\n }\n\n _sent() {\n this.connections--;\n this._checkRatedQueue();\n }\n\n /**\n * Returns true if there are free slots in the queue\n */\n isIdle() {\n return this.idling;\n }\n\n /**\n * Compiles a mailcomposer message and forwards it to SES\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n _send(mail, callback) {\n let statObject = {\n ts: Date.now(),\n pending: true\n };\n this.connections++;\n this.rateMessages.push(statObject);\n\n let envelope = mail.data.envelope || mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n let getRawMessage = next => {\n // do not use Message-ID and Date in DKIM signature\n if (!mail.data._dkim) {\n mail.data._dkim = {};\n }\n if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {\n mail.data._dkim.skipFields += ':date:message-id';\n } else {\n mail.data._dkim.skipFields = 'date:message-id';\n }\n\n let sourceStream = mail.message.createReadStream();\n let stream = sourceStream.pipe(new LeWindows());\n let chunks = [];\n let chunklen = 0;\n\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n sourceStream.once('error', err => stream.emit('error', err));\n\n stream.once('error', err => {\n next(err);\n });\n\n stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));\n };\n\n setImmediate(() =>\n getRawMessage((err, raw) => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n statObject.pending = false;\n return callback(err);\n }\n\n let sesMessage = {\n RawMessage: {\n // required\n Data: raw // required\n },\n Source: envelope.from,\n Destinations: envelope.to\n };\n\n Object.keys(mail.data.ses || {}).forEach(key => {\n sesMessage[key] = mail.data.ses[key];\n });\n\n let ses = (this.ses.aws ? this.ses.ses : this.ses) || {};\n let aws = this.ses.aws || {};\n\n let getRegion = cb => {\n if (ses.config && typeof ses.config.region === 'function') {\n // promise\n return ses.config\n .region()\n .then(region => cb(null, region))\n .catch(err => cb(err));\n }\n return cb(null, (ses.config && ses.config.region) || 'us-east-1');\n };\n\n getRegion((err, region) => {\n if (err || !region) {\n region = 'us-east-1';\n }\n\n let sendPromise;\n if (typeof ses.send === 'function' && aws.SendRawEmailCommand) {\n // v3 API\n sendPromise = ses.send(new aws.SendRawEmailCommand(sesMessage));\n } else {\n // v2 API\n sendPromise = ses.sendRawEmail(sesMessage).promise();\n }\n\n sendPromise\n .then(data => {\n if (region === 'us-east-1') {\n region = 'email';\n }\n\n statObject.pending = false;\n callback(null, {\n envelope: {\n from: envelope.from,\n to: envelope.to\n },\n messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',\n response: data.MessageId,\n raw\n });\n })\n .catch(err => {\n this.logger.error(\n {\n err,\n tnx: 'send'\n },\n 'Send error for %s: %s',\n messageId,\n err.message\n );\n statObject.pending = false;\n callback(err);\n });\n });\n })\n );\n }\n\n /**\n * Verifies SES configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n let ses = (this.ses.aws ? this.ses.ses : this.ses) || {};\n let aws = this.ses.aws || {};\n\n const sesMessage = {\n RawMessage: {\n // required\n Data: 'From: invalid@invalid\\r\\nTo: invalid@invalid\\r\\n Subject: Invalid\\r\\n\\r\\nInvalid'\n },\n Source: 'invalid@invalid',\n Destinations: ['invalid@invalid']\n };\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n const cb = err => {\n if (err && (err.code || err.Code) !== 'InvalidParameterValue') {\n return callback(err);\n }\n return callback(null, true);\n };\n\n if (typeof ses.send === 'function' && aws.SendRawEmailCommand) {\n // v3 API\n sesMessage.RawMessage.Data = Buffer.from(sesMessage.RawMessage.Data);\n ses.send(new aws.SendRawEmailCommand(sesMessage), cb);\n } else {\n // v2 API\n ses.sendRawEmail(sesMessage, cb);\n }\n\n return promise;\n }\n}\n\nmodule.exports = SESTransport;\n", "'use strict';\n\nconst Mailer = require('./mailer');\nconst shared = require('./shared');\nconst SMTPPool = require('./smtp-pool');\nconst SMTPTransport = require('./smtp-transport');\nconst SendmailTransport = require('./sendmail-transport');\nconst StreamTransport = require('./stream-transport');\nconst JSONTransport = require('./json-transport');\nconst SESTransport = require('./ses-transport');\nconst nmfetch = require('./fetch');\nconst packageData = require('../package.json');\n\nconst ETHEREAL_API = (process.env.ETHEREAL_API || 'https://api.nodemailer.com').replace(/\\/+$/, '');\nconst ETHEREAL_WEB = (process.env.ETHEREAL_WEB || 'https://ethereal.email').replace(/\\/+$/, '');\nconst ETHEREAL_API_KEY = (process.env.ETHEREAL_API_KEY || '').replace(/\\s*/g, '') || null;\nconst ETHEREAL_CACHE = ['true', 'yes', 'y', '1'].includes((process.env.ETHEREAL_CACHE || 'yes').toString().trim().toLowerCase());\n\nlet testAccount = false;\n\nmodule.exports.createTransport = function (transporter, defaults) {\n let urlConfig;\n let options;\n let mailer;\n\n if (\n // provided transporter is a configuration object, not transporter plugin\n (typeof transporter === 'object' && typeof transporter.send !== 'function') ||\n // provided transporter looks like a connection url\n (typeof transporter === 'string' && /^(smtps?|direct):/i.test(transporter))\n ) {\n if ((urlConfig = typeof transporter === 'string' ? transporter : transporter.url)) {\n // parse a configuration URL into configuration options\n options = shared.parseConnectionUrl(urlConfig);\n } else {\n options = transporter;\n }\n\n if (options.pool) {\n transporter = new SMTPPool(options);\n } else if (options.sendmail) {\n transporter = new SendmailTransport(options);\n } else if (options.streamTransport) {\n transporter = new StreamTransport(options);\n } else if (options.jsonTransport) {\n transporter = new JSONTransport(options);\n } else if (options.SES) {\n transporter = new SESTransport(options);\n } else {\n transporter = new SMTPTransport(options);\n }\n }\n\n mailer = new Mailer(transporter, options, defaults);\n\n return mailer;\n};\n\nmodule.exports.createTestAccount = function (apiUrl, callback) {\n let promise;\n\n if (!callback && typeof apiUrl === 'function') {\n callback = apiUrl;\n apiUrl = false;\n }\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n if (ETHEREAL_CACHE && testAccount) {\n setImmediate(() => callback(null, testAccount));\n return promise;\n }\n\n apiUrl = apiUrl || ETHEREAL_API;\n\n let chunks = [];\n let chunklen = 0;\n\n let requestHeaders = {};\n let requestBody = {\n requestor: packageData.name,\n version: packageData.version\n };\n\n if (ETHEREAL_API_KEY) {\n requestHeaders.Authorization = 'Bearer ' + ETHEREAL_API_KEY;\n }\n\n let req = nmfetch(apiUrl + '/user', {\n contentType: 'application/json',\n method: 'POST',\n headers: requestHeaders,\n body: Buffer.from(JSON.stringify(requestBody))\n });\n\n req.on('readable', () => {\n let chunk;\n while ((chunk = req.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n req.once('error', err => callback(err));\n\n req.once('end', () => {\n let res = Buffer.concat(chunks, chunklen);\n let data;\n let err;\n try {\n data = JSON.parse(res.toString());\n } catch (E) {\n err = E;\n }\n if (err) {\n return callback(err);\n }\n if (data.status !== 'success' || data.error) {\n return callback(new Error(data.error || 'Request failed'));\n }\n delete data.status;\n testAccount = data;\n callback(null, testAccount);\n });\n\n return promise;\n};\n\nmodule.exports.getTestMessageUrl = function (info) {\n if (!info || !info.response) {\n return false;\n }\n\n let infoProps = new Map();\n info.response.replace(/\\[([^\\]]+)\\]$/, (m, props) => {\n props.replace(/\\b([A-Z0-9]+)=([^\\s]+)/g, (m, key, value) => {\n infoProps.set(key, value);\n });\n });\n\n if (infoProps.has('STATUS') && infoProps.has('MSGID')) {\n return (testAccount.web || ETHEREAL_WEB) + '/message/' + infoProps.get('MSGID');\n }\n\n return false;\n};\n", "/**\n * AampClient \u2014 Main SDK entry point\n *\n * Combines JMAP WebSocket Push (receive) + SMTP (send) into a single client.\n *\n * Usage:\n *\n * ```typescript\n * const client = new AampClient({\n * email: 'codereviewer-abc@aamp.example.com',\n * jmapToken: '<base64-token>',\n * jmapUrl: 'http://localhost:8080',\n * smtpHost: 'localhost',\n * smtpPort: 587,\n * smtpPassword: 'agent-smtp-password',\n * })\n *\n * // Listen for incoming tasks\n * client.on('task.dispatch', async (task) => {\n * const result = await doWork(task)\n * await client.sendResult({\n * to: task.from,\n * taskId: task.taskId,\n * status: 'completed',\n * output: result,\n * })\n * })\n *\n * await client.connect()\n * ```\n */\n\nimport { EventEmitter } from 'events'\nimport { JmapPushClient } from './jmap-push.js'\nimport { SmtpSender } from './smtp-sender.js'\nimport type {\n AampClientConfig,\n AampClientEvents,\n TaskDispatch,\n TaskResult,\n TaskHelp,\n TaskAck,\n HumanReply,\n SendTaskOptions,\n SendResultOptions,\n SendHelpOptions,\n} from './types.js'\n\nexport class AampClient extends EventEmitter {\n private jmapClient: JmapPushClient\n private smtpSender: SmtpSender\n private readonly config: AampClientConfig\n\n constructor(config: AampClientConfig) {\n super()\n this.config = config\n\n // Decode JMAP token (format: base64(email:password))\n let password: string\n try {\n const decoded = Buffer.from(config.jmapToken, 'base64').toString('utf-8')\n const colonIdx = decoded.indexOf(':')\n if (colonIdx < 0) throw new Error('Invalid jmapToken format: expected base64(email:password)')\n password = decoded.slice(colonIdx + 1)\n if (!password) throw new Error('Invalid jmapToken: empty password')\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('Invalid jmapToken')) throw err\n throw new Error(`Failed to decode jmapToken: ${(err as Error).message}`)\n }\n\n this.jmapClient = new JmapPushClient({\n email: config.email,\n password: password ?? config.smtpPassword,\n jmapUrl: config.jmapUrl,\n reconnectInterval: config.reconnectInterval ?? 5000,\n rejectUnauthorized: config.rejectUnauthorized,\n })\n\n this.smtpSender = new SmtpSender({\n host: config.smtpHost,\n port: config.smtpPort ?? 587,\n user: config.email,\n password: config.smtpPassword,\n httpBaseUrl: config.httpSendBaseUrl ?? config.jmapUrl,\n authToken: config.jmapToken,\n rejectUnauthorized: config.rejectUnauthorized,\n })\n\n // Forward JMAP events to this emitter\n this.jmapClient.on('task.dispatch', (task: TaskDispatch) => {\n this.emit('task.dispatch', task)\n })\n\n this.jmapClient.on('task.result', (result: TaskResult) => {\n this.emit('task.result', result)\n })\n\n this.jmapClient.on('task.help', (help: TaskHelp) => {\n this.emit('task.help', help)\n })\n\n this.jmapClient.on('task.ack', (ack: TaskAck) => {\n this.emit('task.ack', ack)\n })\n\n // Auto-ACK: when a task.dispatch is received, automatically send an ACK back\n this.jmapClient.on('_autoAck', async ({ to, taskId, messageId }: { to: string; taskId: string; messageId: string }) => {\n try {\n await this.smtpSender.sendAck({ to, taskId, inReplyTo: messageId })\n } catch (err) {\n console.warn(`[AAMP] Failed to send ACK for task ${taskId}: ${(err as Error).message}`)\n }\n })\n\n this.jmapClient.on('reply', (reply: HumanReply) => {\n this.emit('reply', reply)\n })\n\n this.jmapClient.on('connected', () => {\n this.emit('connected')\n })\n\n this.jmapClient.on('disconnected', (reason: string) => {\n this.emit('disconnected', reason)\n })\n\n this.jmapClient.on('error', (err: Error) => {\n this.emit('error', err)\n })\n }\n\n // =====================================================\n // Type-safe event emitter methods\n // =====================================================\n\n override on<K extends keyof AampClientEvents>(\n event: K,\n listener: AampClientEvents[K],\n ): this {\n return super.on(event, listener as (...args: unknown[]) => void)\n }\n\n override once<K extends keyof AampClientEvents>(\n event: K,\n listener: AampClientEvents[K],\n ): this {\n return super.once(event, listener as (...args: unknown[]) => void)\n }\n\n override off<K extends keyof AampClientEvents>(\n event: K,\n listener: AampClientEvents[K],\n ): this {\n return super.off(event, listener as (...args: unknown[]) => void)\n }\n\n // =====================================================\n // Lifecycle\n // =====================================================\n\n /**\n * Connect to JMAP and start listening for tasks\n */\n async connect(): Promise<void> {\n await this.jmapClient.start()\n }\n\n /**\n * Disconnect and clean up\n */\n disconnect(): void {\n this.jmapClient.stop()\n this.smtpSender.close()\n }\n\n /**\n * Returns true if the JMAP connection is active\n */\n isConnected(): boolean {\n return this.jmapClient.isConnected()\n }\n\n isUsingPollingFallback(): boolean {\n return this.jmapClient.isUsingPollingFallback()\n }\n\n // =====================================================\n // Sending\n // =====================================================\n\n /**\n * Send a task.dispatch email to an agent.\n * Returns the generated taskId and the SMTP Message-ID.\n * Store messageId \u2192 taskId in Redis/DB to support In-Reply-To thread routing\n * for human replies that arrive without X-AAMP headers.\n */\n async sendTask(opts: SendTaskOptions): Promise<{ taskId: string; messageId: string }> {\n return this.smtpSender.sendTask(opts)\n }\n\n /**\n * Send a task.result email (agent \u2192 system/dispatcher)\n */\n async sendResult(opts: SendResultOptions): Promise<void> {\n return this.smtpSender.sendResult(opts)\n }\n\n /**\n * Send a task.help email when the agent needs human assistance\n */\n async sendHelp(opts: SendHelpOptions): Promise<void> {\n return this.smtpSender.sendHelp(opts)\n }\n\n /**\n * Download a blob (attachment) by its JMAP blobId.\n * Use this to retrieve attachment content from received TaskDispatch or TaskResult messages.\n * Returns the raw binary content as a Buffer.\n */\n async downloadBlob(blobId: string, filename?: string): Promise<Buffer> {\n return this.jmapClient.downloadBlob(blobId, filename)\n }\n\n /**\n * Reconcile recent mailbox contents via JMAP HTTP to catch messages missed by\n * a flaky WebSocket path. Safe to call periodically; duplicate processing is\n * suppressed by the JMAP push client.\n */\n async reconcileRecentEmails(limit?: number): Promise<number> {\n return this.jmapClient.reconcileRecentEmails(limit)\n }\n\n /**\n * Verify SMTP connectivity\n */\n async verifySmtp(): Promise<boolean> {\n return this.smtpSender.verify()\n }\n\n get email(): string {\n return this.config.email\n }\n}\n", "import createWebSocketStream from './lib/stream.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport { createWebSocketStream, Receiver, Sender, WebSocket, WebSocketServer };\nexport default WebSocket;\n", "/**\n * JMAP WebSocket Push Client\n *\n * Connects to Stalwart's JMAP WebSocket endpoint and subscribes to\n * Email StateChange events. When a new email arrives in the agent's\n * mailbox, fetches it via JMAP and emits the parsed AAMP headers.\n *\n * Protocol: RFC 8887 (JMAP over WebSocket)\n * Ref: https://www.rfc-editor.org/rfc/rfc8887\n */\n\nimport WebSocket from 'ws'\nimport { EventEmitter } from 'events'\nimport { parseAampHeaders } from './parser.js'\nimport type { AampMessage, HumanReply } from './types.js'\n\ninterface JmapSession {\n capabilities: Record<string, unknown>\n accounts: Record<string, { name: string; isPrimary: boolean; accountCapabilities: Record<string, unknown> }>\n primaryAccounts: Record<string, string>\n username: string\n apiUrl: string\n downloadUrl: string\n uploadUrl: string\n eventSourceUrl: string\n state: string\n}\n\ninterface JmapStateChange {\n '@type': 'StateChange'\n changed: Record<string, Record<string, string>>\n pushState?: string\n}\n\ninterface JmapEmail {\n id: string\n blobId: string\n threadId: string\n mailboxIds: Record<string, boolean>\n subject: string\n from: Array<{ email: string; name?: string }>\n to: Array<{ email: string; name?: string }>\n replyTo?: Array<{ email: string; name?: string }>\n messageId?: string[]\n headers: Array<{ name: string; value: string }>\n receivedAt: string\n size: number\n /** Plain-text body parts (JMAP bodyStructure) */\n textBody?: Array<{ partId: string; type: string }>\n /** Decoded body values keyed by partId */\n bodyValues?: Record<string, { value: string; isEncodingProblem?: boolean; isTruncated?: boolean }>\n /** JMAP attachments (non-inline parts) */\n attachments?: Array<{\n blobId: string\n type: string\n name: string | null\n size: number\n }>\n}\n\ninterface JmapMethodResponse {\n methodResponses: Array<[string, Record<string, unknown>, string]>\n}\n\nexport class JmapPushClient extends EventEmitter {\n private ws: WebSocket | null = null\n private session: JmapSession | null = null\n private reconnectTimer: NodeJS.Timeout | null = null\n private pollTimer: NodeJS.Timeout | null = null\n private pingTimer: NodeJS.Timeout | null = null\n private readonly seenMessageIds = new Set<string>()\n private connected = false\n private pollingActive = false\n private running = false\n private connecting = false\n /** JMAP Email state \u2014 tracks processed position; null = not yet initialized */\n private emailState: string | null = null\n private readonly startedAtMs = Date.now()\n\n private readonly email: string\n private readonly password: string\n private readonly jmapUrl: string\n private readonly reconnectInterval: number\n private readonly rejectUnauthorized: boolean\n private readonly pingIntervalMs = 5000\n\n constructor(opts: {\n email: string\n password: string\n jmapUrl: string\n reconnectInterval?: number\n /** Whether to reject unauthorized TLS certificates (default: true) */\n rejectUnauthorized?: boolean\n }) {\n super()\n this.email = opts.email\n this.password = opts.password\n this.jmapUrl = opts.jmapUrl.replace(/\\/$/, '')\n this.reconnectInterval = opts.reconnectInterval ?? 5000\n this.rejectUnauthorized = opts.rejectUnauthorized ?? true\n }\n\n /**\n * Start the JMAP Push listener\n */\n async start(): Promise<void> {\n this.running = true\n await this.connect()\n }\n\n /**\n * Stop the JMAP Push listener\n */\n stop(): void {\n this.running = false\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n if (this.pollTimer) {\n clearTimeout(this.pollTimer)\n this.pollTimer = null\n }\n if (this.pingTimer) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n this.connected = false\n this.pollingActive = false\n this.connecting = false\n }\n\n private getAuthHeader(): string {\n const creds = `${this.email}:${this.password}`\n return `Basic ${Buffer.from(creds).toString('base64')}`\n }\n\n /**\n * Fetch the JMAP session object\n */\n private async fetchSession(): Promise<JmapSession> {\n const url = `${this.jmapUrl}/.well-known/jmap`\n const res = await fetch(url, {\n headers: { Authorization: this.getAuthHeader() },\n })\n\n if (!res.ok) {\n throw new Error(`Failed to fetch JMAP session: ${res.status} ${res.statusText}`)\n }\n\n return res.json() as Promise<JmapSession>\n }\n\n /**\n * Perform a JMAP API call\n */\n private async jmapCall(\n methods: Array<[string, Record<string, unknown>, string]>,\n ): Promise<JmapMethodResponse> {\n if (!this.session) throw new Error('No JMAP session')\n\n // Use the configured jmapUrl (external hostname) rather than session.apiUrl\n // which Stalwart populates with its own internal URL (e.g. http://aamp.local:8080/jmap)\n // and is unreachable when running behind a proxy.\n const apiUrl = `${this.jmapUrl}/jmap/`\n const res = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n Authorization: this.getAuthHeader(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n using: [\n 'urn:ietf:params:jmap:core',\n 'urn:ietf:params:jmap:mail',\n ],\n methodCalls: methods,\n }),\n })\n\n if (!res.ok) {\n throw new Error(`JMAP API call failed: ${res.status}`)\n }\n\n return res.json() as Promise<JmapMethodResponse>\n }\n\n /**\n * Initialize emailState by fetching the current state without loading any emails.\n * Called on first connect so we only process emails that arrive AFTER this point.\n */\n private async initEmailState(accountId: string): Promise<void> {\n const response = await this.jmapCall([\n ['Email/get', { accountId, ids: [] }, 'g0'],\n ])\n const getResp = response.methodResponses.find(([name]) => name === 'Email/get')\n if (getResp) {\n this.emailState = (getResp[1] as { state?: string }).state ?? null\n }\n }\n\n /**\n * Fetch only emails created since `sinceState` using Email/changes.\n * Updates `this.emailState` to the new state after fetching.\n * Returns [] and resets state if the server cannot calculate changes (state too old).\n */\n private async fetchEmailsSince(accountId: string, sinceState: string): Promise<JmapEmail[]> {\n const changesResp = await this.jmapCall([\n ['Email/changes', { accountId, sinceState, maxChanges: 50 }, 'c1'],\n ])\n\n const changesResult = changesResp.methodResponses.find(([name]) => name === 'Email/changes')\n\n // Handle server error \u2014 e.g. \"cannotCalculateChanges\" when state is too old\n if (!changesResult || changesResult[0] === 'error') {\n await this.initEmailState(accountId)\n return []\n }\n\n const changes = changesResult[1] as {\n created?: string[]\n newState?: string\n hasMoreChanges?: boolean\n }\n\n if (changes.newState) {\n this.emailState = changes.newState\n }\n\n const newIds = changes.created ?? []\n if (newIds.length === 0) return []\n\n const emailResp = await this.jmapCall([\n [\n 'Email/get',\n {\n accountId,\n ids: newIds,\n properties: ['id', 'subject', 'from', 'to', 'headers', 'messageId', 'receivedAt', 'textBody', 'bodyValues', 'attachments'],\n fetchTextBodyValues: true,\n maxBodyValueBytes: 262144,\n },\n 'g1',\n ],\n ])\n\n const getResult = emailResp.methodResponses.find(([name]) => name === 'Email/get')\n if (!getResult) return []\n\n const data = getResult[1] as { list?: JmapEmail[] }\n return data.list ?? []\n }\n\n /**\n * Process a received email.\n *\n * Priority:\n * 1. If X-AAMP-Intent is present \u2192 emit typed AAMP event (task.dispatch / task.result / task.help)\n * 2. If In-Reply-To is present \u2192 emit 'reply' event so the application layer can\n * resolve the thread (inReplyTo \u2192 taskId via Redis/DB) and handle human replies.\n * 3. Otherwise \u2192 ignore (not an AAMP-related email)\n */\n private processEmail(email: JmapEmail): void {\n // Build lowercase header map from JMAP header array\n const headerMap: Record<string, string> = {}\n for (const h of email.headers ?? []) {\n headerMap[h.name.toLowerCase()] = h.value.trim()\n }\n\n const fromAddr = email.from?.[0]?.email ?? ''\n const toAddr = email.to?.[0]?.email ?? ''\n const messageId = email.messageId?.[0] ?? email.id\n\n if (this.seenMessageIds.has(messageId)) return\n this.seenMessageIds.add(messageId)\n\n // \u2500\u2500 Path 1: AAMP-tagged email \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const msg: AampMessage | null = parseAampHeaders({\n from: fromAddr,\n to: toAddr,\n messageId,\n subject: email.subject ?? '',\n headers: headerMap,\n })\n\n if (msg && 'intent' in msg) {\n // Attach email body text (task description) to all AAMP messages\n const aampTextPartId = email.textBody?.[0]?.partId\n const aampBodyText = aampTextPartId ? (email.bodyValues?.[aampTextPartId]?.value ?? '').trim() : ''\n ;(msg as unknown as Record<string, unknown>).bodyText = aampBodyText\n\n // Attach received attachment metadata (blobId-based, downloadable via downloadBlob)\n const receivedAttachments = (email.attachments ?? []).map(a => ({\n filename: a.name ?? 'attachment',\n contentType: a.type,\n size: a.size,\n blobId: a.blobId,\n }))\n if (receivedAttachments.length > 0) {\n ;(msg as unknown as Record<string, unknown>).attachments = receivedAttachments\n }\n\n // Auto-ACK for dispatches \u2014 AampClient handles the actual sending\n if ((msg as { intent: string }).intent === 'task.dispatch') {\n this.emit('_autoAck', { to: fromAddr, taskId: (msg as { taskId: string }).taskId, messageId })\n }\n\n this.emit((msg as { intent: string }).intent, msg)\n return\n }\n\n // \u2500\u2500 Path 2: standard email reply \u2014 In-Reply-To fallback \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Standard email clients automatically set In-Reply-To when replying.\n // We strip angle brackets (<msgid@host>) to get the bare Message-ID.\n const rawInReplyTo = headerMap['in-reply-to'] ?? ''\n if (!rawInReplyTo) return // unrelated email, ignore\n\n // Handle \"References\" chain: prefer the last (most recent) Message-ID\n // so multi-turn threads still resolve to the correct task.\n const rawReferences = headerMap['references'] ?? ''\n const referencesIds = rawReferences\n .split(/\\s+/)\n .map((s) => s.replace(/[<>]/g, '').trim())\n .filter(Boolean)\n\n const inReplyTo = rawInReplyTo.replace(/[<>]/g, '').trim()\n\n // Extract plain-text body if available (fetched via fetchTextBodyValues)\n const textPartId = email.textBody?.[0]?.partId\n const bodyText = textPartId ? (email.bodyValues?.[textPartId]?.value ?? '').trim() : ''\n\n const reply: HumanReply = {\n inReplyTo,\n messageId,\n from: fromAddr,\n to: toAddr,\n subject: email.subject ?? '',\n bodyText,\n }\n\n // Also expose the full References chain so callers can walk the thread if needed\n if (referencesIds.length > 0) {\n Object.assign(reply, { references: referencesIds })\n }\n\n this.emit('reply', reply)\n }\n\n private async fetchRecentEmails(accountId: string): Promise<JmapEmail[]> {\n const queryResp = await this.jmapCall([\n [\n 'Email/query',\n {\n accountId,\n sort: [{ property: 'receivedAt', isAscending: false }],\n limit: 20,\n },\n 'q1',\n ],\n ])\n\n const queryResult = queryResp.methodResponses.find(([name]) => name === 'Email/query')\n if (!queryResult) return []\n\n const ids = ((queryResult[1] as { ids?: string[] }).ids ?? []).slice(0, 20)\n if (ids.length === 0) return []\n\n const emailResp = await this.jmapCall([\n [\n 'Email/get',\n {\n accountId,\n ids,\n properties: ['id', 'subject', 'from', 'to', 'headers', 'messageId', 'receivedAt', 'textBody', 'bodyValues', 'attachments'],\n fetchTextBodyValues: true,\n maxBodyValueBytes: 262144,\n },\n 'gRecent',\n ],\n ])\n\n const getResult = emailResp.methodResponses.find(([name]) => name === 'Email/get')\n if (!getResult) return []\n\n return (getResult[1] as { list?: JmapEmail[] }).list ?? []\n }\n\n private shouldProcessBootstrapEmail(email: JmapEmail): boolean {\n const receivedAtMs = new Date(email.receivedAt).getTime()\n // Keep a small grace window for mail that arrived during startup / reconnect races,\n // but do not replay older historical mailbox contents as fresh tasks.\n return Number.isFinite(receivedAtMs) && receivedAtMs >= this.startedAtMs - 15_000\n }\n\n /**\n * Connect to JMAP WebSocket\n */\n private async connect(): Promise<void> {\n if (this.connecting || !this.running) return\n this.connecting = true\n\n try {\n this.session = await this.fetchSession()\n } catch (err) {\n this.connecting = false\n this.emit('error', new Error(`Failed to get JMAP session: ${(err as Error).message}`))\n this.startPolling('session fetch failed')\n this.scheduleReconnect()\n return\n }\n\n // Build WebSocket URL from the configured jmapUrl (the management-service proxy).\n // The management service exposes the standard external WebSocket path /jmap/ws\n // and proxies upgrades to Stalwart. We never use the session capability URL\n // directly because Stalwart populates it with its own internal hostname\n // (e.g. ws://aamp.local:8080/jmap/ws), which is unreachable from outside\n // the Docker / cluster network.\n const stalwartWsUrl = `${this.jmapUrl}/jmap/ws`\n .replace(/^https:\\/\\//, 'wss://')\n .replace(/^http:\\/\\//, 'ws://')\n\n this.ws = new WebSocket(stalwartWsUrl, 'jmap', {\n headers: {\n Authorization: this.getAuthHeader(),\n },\n perMessageDeflate: false,\n rejectUnauthorized: this.rejectUnauthorized,\n })\n\n this.ws.on('unexpected-response', (_req, res) => {\n this.connecting = false\n const headerSummary = Object.entries(res.headers)\n .map(([key, value]) => `${key}: ${Array.isArray(value) ? value.join(', ') : (value ?? '')}`)\n .join('; ')\n this.startPolling(`websocket handshake failed: ${res.statusCode ?? 'unknown'}`)\n this.emit(\n 'error',\n new Error(\n `JMAP WebSocket handshake failed: ${res.statusCode ?? 'unknown'} ${res.statusMessage ?? ''}${headerSummary ? ` | headers: ${headerSummary}` : ''}`,\n ),\n )\n this.scheduleReconnect()\n })\n\n this.ws.on('open', async () => {\n this.connecting = false\n this.connected = true\n this.stopPolling()\n this.startPingHeartbeat()\n\n // On first connect (emailState is null), initialize state so we only\n // process emails arriving AFTER this point.\n // On reconnect, emailState is already set \u2014 Email/changes will catch up.\n const accountId = this.session?.primaryAccounts['urn:ietf:params:jmap:mail']\n if (accountId && this.emailState === null) {\n await this.initEmailState(accountId)\n }\n\n // Subscribe to Email state changes AFTER state is initialized\n this.ws!.send(\n JSON.stringify({\n '@type': 'WebSocketPushEnable',\n dataTypes: ['Email'],\n pushState: null,\n }),\n )\n\n this.emit('connected')\n })\n\n this.ws.on('pong', () => {\n // Receiving pong confirms the upstream and LB path are still alive.\n })\n\n this.ws.on('message', async (rawData: WebSocket.RawData) => {\n try {\n const msg = JSON.parse(rawData.toString()) as {\n '@type': string\n } & JmapStateChange\n\n if (msg['@type'] === 'StateChange') {\n await this.handleStateChange(msg)\n }\n } catch (err) {\n this.emit('error', new Error(`Failed to process JMAP push message: ${(err as Error).message}`))\n }\n })\n\n this.ws.on('close', (code, reason) => {\n this.connecting = false\n this.connected = false\n this.stopPingHeartbeat()\n const reasonStr = reason?.toString() ?? 'connection closed'\n this.startPolling(reasonStr)\n this.emit('disconnected', reasonStr)\n\n if (this.running) {\n this.scheduleReconnect()\n }\n })\n\n this.ws.on('error', (err) => {\n this.connecting = false\n this.stopPingHeartbeat()\n this.startPolling(err.message)\n this.emit('error', err)\n })\n }\n\n private startPingHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n\n this.pingTimer = setInterval(() => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return\n try {\n this.ws.ping()\n } catch (err) {\n this.emit('error', new Error(`Failed to send WebSocket ping: ${(err as Error).message}`))\n }\n }, this.pingIntervalMs)\n }\n\n private stopPingHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n }\n\n private async handleStateChange(stateChange: JmapStateChange): Promise<void> {\n if (!this.session) return\n\n const accountId = this.session.primaryAccounts['urn:ietf:params:jmap:mail']\n if (!accountId) return\n\n const changedAccount = stateChange.changed[accountId]\n if (!changedAccount?.Email) return\n\n try {\n if (this.emailState === null) {\n // State not yet initialized (race between open handler and first StateChange)\n // Just initialize and skip \u2014 next StateChange will use Email/changes properly\n await this.initEmailState(accountId)\n return\n }\n\n const emails = await this.fetchEmailsSince(accountId, this.emailState)\n for (const email of emails) {\n this.processEmail(email)\n }\n } catch (err) {\n this.emit('error', new Error(`Failed to fetch emails: ${(err as Error).message}`))\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null\n if (this.running) {\n await this.connect()\n }\n }, this.reconnectInterval)\n }\n\n isConnected(): boolean {\n return this.connected || this.pollingActive\n }\n\n isUsingPollingFallback(): boolean {\n return this.pollingActive && !this.connected\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearTimeout(this.pollTimer)\n this.pollTimer = null\n }\n this.pollingActive = false\n }\n\n private startPolling(reason: string): void {\n if (!this.running || this.pollingActive) return\n\n this.pollingActive = true\n this.emit('error', new Error(`JMAP WebSocket unavailable, falling back to polling: ${reason}`))\n this.emit('connected')\n\n const poll = async () => {\n if (!this.running || this.connected) {\n this.stopPolling()\n return\n }\n\n try {\n if (!this.session) {\n this.session = await this.fetchSession()\n }\n\n const accountId = this.session.primaryAccounts['urn:ietf:params:jmap:mail']\n ?? Object.keys(this.session.accounts)[0]\n\n if (!accountId) {\n throw new Error('No mail account available in JMAP session')\n }\n\n if (this.emailState === null) {\n const recentEmails = await this.fetchRecentEmails(accountId)\n for (const email of recentEmails.sort((a, b) => {\n const aTs = new Date(a.receivedAt).getTime()\n const bTs = new Date(b.receivedAt).getTime()\n return aTs - bTs\n })) {\n if (!this.shouldProcessBootstrapEmail(email)) continue\n this.processEmail(email)\n }\n await this.initEmailState(accountId)\n } else {\n const emails = await this.fetchEmailsSince(accountId, this.emailState)\n for (const email of emails) {\n this.processEmail(email)\n }\n }\n } catch (err) {\n this.emit('error', new Error(`Polling fallback failed: ${(err as Error).message}`))\n } finally {\n if (this.running && !this.connected) {\n this.pollTimer = setTimeout(poll, this.reconnectInterval)\n }\n }\n }\n\n this.pollTimer = setTimeout(poll, 0)\n }\n\n /**\n * Download a blob (attachment) by its JMAP blobId.\n * Returns the raw binary content as a Buffer.\n */\n async downloadBlob(blobId: string, filename?: string): Promise<Buffer> {\n if (!this.session) {\n // Fetch session on demand if not yet connected\n this.session = await this.fetchSession()\n }\n\n const accountId = this.session.primaryAccounts['urn:ietf:params:jmap:mail']\n ?? Object.keys(this.session.accounts)[0]\n\n // Build download URL from session template or fall back to standard JMAP path\n let downloadUrl = this.session.downloadUrl\n ?? `${this.jmapUrl}/jmap/download/{accountId}/{blobId}/{name}`\n\n // Replace session.downloadUrl host with our configured jmapUrl\n // (Stalwart may report an internal hostname unreachable from outside Docker)\n try {\n const parsed = new URL(downloadUrl)\n const configured = new URL(this.jmapUrl)\n parsed.protocol = configured.protocol\n parsed.host = configured.host\n downloadUrl = parsed.toString()\n } catch {\n // If URL parsing fails, use the template as-is\n }\n\n const safeFilename = filename ?? 'attachment'\n downloadUrl = downloadUrl\n .replace(/\\{accountId\\}|%7BaccountId%7D/gi, encodeURIComponent(accountId))\n .replace(/\\{blobId\\}|%7BblobId%7D/gi, encodeURIComponent(blobId))\n .replace(/\\{name\\}|%7Bname%7D/gi, encodeURIComponent(safeFilename))\n .replace(/\\{type\\}|%7Btype%7D/gi, 'application/octet-stream')\n\n // Retry with exponential backoff \u2014 the blob may not be immediately available\n // after the result email is observed (store/index write delay).\n const maxAttempts = 8\n let lastStatus: number | null = null\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const res = await fetch(downloadUrl, {\n headers: { Authorization: this.getAuthHeader() },\n })\n lastStatus = res.status\n if (res.ok) {\n const arrayBuffer = await res.arrayBuffer()\n return Buffer.from(arrayBuffer)\n }\n if (attempt < maxAttempts && (res.status === 404 || res.status === 429 || res.status === 503)) {\n console.warn(\n `[AAMP-SDK] blob download retry status=${res.status} attempt=${attempt}/${maxAttempts} url=${downloadUrl}`,\n )\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 15000) // 1s, 2s, 4s, 8s, 15s...\n await new Promise(r => setTimeout(r, delay))\n continue\n }\n console.error(\n `[AAMP-SDK] blob download failed status=${res.status} attempt=${attempt}/${maxAttempts} url=${downloadUrl}`,\n )\n throw new Error(\n `Blob download failed: status=${res.status} attempt=${attempt}/${maxAttempts} blobId=${blobId} filename=${filename ?? 'attachment'} url=${downloadUrl}`,\n )\n }\n throw new Error(\n `Blob download failed after retries: status=${lastStatus ?? 'unknown'} attempt=${maxAttempts}/${maxAttempts} blobId=${blobId} filename=${filename ?? 'attachment'} url=${downloadUrl}`,\n )\n }\n\n /**\n * Actively reconcile recent mailbox contents via JMAP HTTP.\n * Useful as a safety net when the WebSocket stays \"connected\"\n * but a notification is missed by an intermediate layer.\n */\n async reconcileRecentEmails(limit = 20): Promise<number> {\n if (!this.session) {\n this.session = await this.fetchSession()\n }\n\n const accountId = this.session.primaryAccounts['urn:ietf:params:jmap:mail']\n ?? Object.keys(this.session.accounts)[0]\n\n if (!accountId) {\n throw new Error('No mail account available in JMAP session')\n }\n\n const queryResp = await this.jmapCall([\n [\n 'Email/query',\n {\n accountId,\n sort: [{ property: 'receivedAt', isAscending: false }],\n limit,\n },\n 'qReconcile',\n ],\n ])\n\n const queryResult = queryResp.methodResponses.find(([name]) => name === 'Email/query')\n if (!queryResult) return 0\n\n const ids = ((queryResult[1] as { ids?: string[] }).ids ?? []).slice(0, limit)\n if (ids.length === 0) return 0\n\n const emailResp = await this.jmapCall([\n [\n 'Email/get',\n {\n accountId,\n ids,\n properties: ['id', 'subject', 'from', 'to', 'headers', 'messageId', 'receivedAt', 'textBody', 'bodyValues', 'attachments'],\n fetchTextBodyValues: true,\n maxBodyValueBytes: 262144,\n },\n 'gReconcile',\n ],\n ])\n\n const getResult = emailResp.methodResponses.find(([name]) => name === 'Email/get')\n if (!getResult) return 0\n\n const emails = (getResult[1] as { list?: JmapEmail[] }).list ?? []\n for (const email of emails.sort((a, b) => {\n const aTs = new Date(a.receivedAt).getTime()\n const bTs = new Date(b.receivedAt).getTime()\n return aTs - bTs\n })) {\n if (!this.shouldProcessBootstrapEmail(email)) continue\n this.processEmail(email)\n }\n\n return emails.length\n }\n}\n", "/**\n * AAMP SDK Type Definitions\n */\n\nexport type AampIntent = 'task.dispatch' | 'task.result' | 'task.help' | 'task.ack'\n\nexport type TaskStatus =\n | 'pending'\n | 'running'\n | 'completed'\n | 'rejected'\n | 'failed'\n | 'timeout'\n | 'help_needed'\n\n// =====================================================\n// AAMP Header constants\n// =====================================================\nexport const AAMP_HEADER = {\n INTENT: 'X-AAMP-Intent',\n TASK_ID: 'X-AAMP-TaskId',\n TIMEOUT: 'X-AAMP-Timeout',\n CONTEXT_LINKS: 'X-AAMP-ContextLinks',\n DISPATCH_CONTEXT: 'X-AAMP-Dispatch-Context',\n STATUS: 'X-AAMP-Status',\n OUTPUT: 'X-AAMP-Output',\n ERROR_MSG: 'X-AAMP-ErrorMsg',\n STRUCTURED_RESULT: 'X-AAMP-StructuredResult',\n QUESTION: 'X-AAMP-Question',\n BLOCKED_REASON: 'X-AAMP-BlockedReason',\n SUGGESTED_OPTIONS: 'X-AAMP-SuggestedOptions',\n PARENT_TASK_ID: 'X-AAMP-ParentTaskId',\n} as const\n\nexport interface StructuredResultField {\n fieldKey: string\n fieldTypeKey: string\n value?: unknown\n fieldAlias?: string\n index?: string\n attachmentFilenames?: string[]\n}\n\n// =====================================================\n// Parsed AAMP headers for task.dispatch\n// =====================================================\nexport interface TaskDispatch {\n intent: 'task.dispatch'\n taskId: string\n title: string\n timeoutSecs: number\n contextLinks: string[]\n dispatchContext?: Record<string, string>\n parentTaskId?: string\n // Email metadata\n from: string\n to: string\n messageId: string\n subject: string\n /** Plain-text body of the email (task description) */\n bodyText: string\n /** Attachments received with this dispatch (use blobId to download) */\n attachments?: ReceivedAttachment[]\n}\n\n// =====================================================\n// Parsed AAMP headers for task.result\n// =====================================================\nexport interface TaskResult {\n intent: 'task.result'\n taskId: string\n status: 'completed' | 'rejected'\n output: string\n errorMsg?: string\n structuredResult?: StructuredResultField[]\n from: string\n to: string\n messageId?: string\n /** True when the reply came from a standard email client (no X-AAMP-Intent header).\n * taskId was resolved via In-Reply-To \u2192 Message-ID reverse lookup. */\n isHumanReply?: boolean\n /** Attachments received with this result (use blobId to download) */\n attachments?: ReceivedAttachment[]\n}\n\n// =====================================================\n// Human reply via standard email client (no AAMP headers)\n// Emitted as 'reply' event when an email has In-Reply-To but no X-AAMP-Intent.\n// The application layer is responsible for resolving inReplyTo \u2192 taskId\n// (e.g. via Redis reverse index) and deciding how to handle it.\n// =====================================================\nexport interface HumanReply {\n /** Message-ID of the email being replied to \u2014 use this to look up the taskId */\n inReplyTo: string\n /** This reply email's own Message-ID */\n messageId: string\n from: string\n to: string\n subject: string\n /** Plain-text body of the reply */\n bodyText: string\n}\n\n// =====================================================\n// Parsed AAMP headers for task.help\n// =====================================================\nexport interface TaskHelp {\n intent: 'task.help'\n taskId: string\n question: string\n blockedReason: string\n suggestedOptions: string[]\n from: string\n to: string\n messageId?: string\n}\n\n// =====================================================\n// Parsed AAMP headers for task.ack\n// =====================================================\nexport interface TaskAck {\n intent: 'task.ack'\n taskId: string\n from: string\n to: string\n messageId?: string\n}\n\n// =====================================================\n// Attachment types\n// =====================================================\n\n/** Attachment for sending (binary content) */\nexport interface AampAttachment {\n filename: string\n contentType: string\n content: Buffer | string // Buffer for binary, base64 string for REST API\n size?: number\n}\n\n/** Attachment metadata received via JMAP (use blobId to download) */\nexport interface ReceivedAttachment {\n filename: string\n contentType: string\n size: number\n blobId: string\n}\n\nexport type AampMessage = TaskDispatch | TaskResult | TaskHelp | TaskAck | HumanReply\n\n// =====================================================\n// SDK Configuration\n// =====================================================\nexport interface AampClientConfig {\n /** Node email address, e.g. codereviewer-abc123@aamp.yourdomain.com */\n email: string\n\n /** Base64(email:smtpPassword) \u2014 returned by management service on agent creation */\n jmapToken: string\n\n /** Stalwart base URL, e.g. http://localhost:8080 */\n jmapUrl: string\n\n /** Optional HTTP send base URL. Defaults to jmapUrl and is used for same-domain send fallback via /api/send. */\n httpSendBaseUrl?: string\n\n /** SMTP submission host */\n smtpHost: string\n\n /** SMTP submission port (default: 587) */\n smtpPort?: number\n\n /** SMTP password (returned by management service on agent creation) */\n smtpPassword: string\n\n /** How often to retry failed JMAP connection (ms, default: 5000) */\n reconnectInterval?: number\n\n /** Whether to reject unauthorized TLS certificates (default: true).\n * Set to false only for development with self-signed certificates. */\n rejectUnauthorized?: boolean\n}\n\n// =====================================================\n// Options for sending emails\n// =====================================================\nexport interface SendTaskOptions {\n /** Target node email */\n to: string\n title: string\n bodyText?: string\n timeoutSecs?: number\n contextLinks?: string[]\n dispatchContext?: Record<string, string>\n parentTaskId?: string\n /** Attachments to include with the dispatch email */\n attachments?: AampAttachment[]\n}\n\nexport interface SendResultOptions {\n /** Send to: the original from address of the dispatch email */\n to: string\n taskId: string\n status: 'completed' | 'rejected'\n output: string\n errorMsg?: string\n structuredResult?: StructuredResultField[]\n /** Message-ID of the dispatch email, for In-Reply-To threading */\n inReplyTo?: string\n /** Attachments to include with the result email */\n attachments?: AampAttachment[]\n}\n\nexport interface SendHelpOptions {\n /** Send to: the original from address of the dispatch email */\n to: string\n taskId: string\n question: string\n blockedReason: string\n suggestedOptions: string[]\n /** Message-ID of the dispatch email, for In-Reply-To threading */\n inReplyTo?: string\n /** Attachments to include with the help email */\n attachments?: AampAttachment[]\n}\n\n// =====================================================\n// Event emitter types\n// =====================================================\nexport interface AampClientEvents {\n 'task.dispatch': (task: TaskDispatch) => void\n 'task.result': (result: TaskResult) => void\n 'task.help': (help: TaskHelp) => void\n 'task.ack': (ack: TaskAck) => void\n /** Emitted when a standard email reply (no X-AAMP headers) is received for a known thread.\n * Use inReplyTo to look up the taskId in your own store (Redis / DB). */\n 'reply': (reply: HumanReply) => void\n connected: () => void\n disconnected: (reason: string) => void\n error: (err: Error) => void\n}\n", "/**\n * AAMP Header Parser\n *\n * Parses AAMP protocol headers from email messages.\n * Works with both raw header objects and JMAP Email objects.\n *\n * Headers are case-insensitive; we normalize to lowercase for lookup.\n */\n\nimport { AAMP_HEADER, type AampMessage, type TaskDispatch, type TaskResult, type TaskHelp, type TaskAck } from './types.js'\n\ntype RawHeaders = Record<string, string | string[]>\n\nfunction decodeMimeEncodedWordSegment(segment: string): string {\n const match = /^=\\?([^?]+)\\?([bBqQ])\\?([^?]*)\\?=$/.exec(segment)\n if (!match) return segment\n\n const [, charsetRaw, encodingRaw, body] = match\n const charset = charsetRaw.toLowerCase()\n const encoding = encodingRaw.toUpperCase()\n\n try {\n if (encoding === 'B') {\n const buf = Buffer.from(body, 'base64')\n return buf.toString(charset === 'utf-8' || charset === 'utf8' ? 'utf8' : 'utf8')\n }\n\n const normalized = body\n .replace(/_/g, ' ')\n .replace(/=([0-9A-Fa-f]{2})/g, (_, hex: string) =>\n String.fromCharCode(parseInt(hex, 16)),\n )\n const bytes = Buffer.from(normalized, 'binary')\n return bytes.toString(charset === 'utf-8' || charset === 'utf8' ? 'utf8' : 'utf8')\n } catch {\n return segment\n }\n}\n\nfunction decodeMimeEncodedWords(value?: string): string {\n if (!value || !value.includes('=?')) return value ?? ''\n const collapsed = value.replace(/\\r?\\n[ \\t]+/g, ' ')\n const decoded = collapsed.replace(/=\\?[^?]+\\?[bBqQ]\\?[^?]*\\?=/g, (segment) =>\n decodeMimeEncodedWordSegment(segment),\n )\n return decoded.replace(/\\s{2,}/g, ' ').trim()\n}\n\n/**\n * Normalize a header map to lowercase keys with string values\n */\nexport function normalizeHeaders(headers: RawHeaders): Record<string, string> {\n return Object.fromEntries(\n Object.entries(headers).map(([k, v]) => [\n k.toLowerCase(),\n Array.isArray(v) ? v[0] : v,\n ]),\n )\n}\n\n/**\n * Get a header value by its X-AAMP-* name (case-insensitive)\n */\nfunction getAampHeader(\n headers: Record<string, string>,\n headerName: string,\n): string | undefined {\n return headers[headerName.toLowerCase()]\n}\n\nconst DISPATCH_CONTEXT_KEY_RE = /^[a-z0-9_-]+$/\n\nexport function parseDispatchContextHeader(value?: string): Record<string, string> | undefined {\n if (!value) return undefined\n const context: Record<string, string> = {}\n\n for (const part of value.split(';')) {\n const segment = part.trim()\n if (!segment) continue\n const eqIdx = segment.indexOf('=')\n if (eqIdx <= 0) continue\n const rawKey = segment.slice(0, eqIdx).trim()\n const rawValue = segment.slice(eqIdx + 1).trim()\n if (!DISPATCH_CONTEXT_KEY_RE.test(rawKey)) continue\n try {\n context[rawKey] = decodeURIComponent(rawValue)\n } catch {\n context[rawKey] = rawValue\n }\n }\n\n return Object.keys(context).length ? context : undefined\n}\n\nexport function serializeDispatchContextHeader(context?: Record<string, string>): string | undefined {\n if (!context) return undefined\n const parts = Object.entries(context)\n .flatMap(([key, value]) => {\n const normalizedKey = key.trim().toLowerCase()\n if (!DISPATCH_CONTEXT_KEY_RE.test(normalizedKey)) return []\n const normalizedValue = String(value ?? '').trim()\n if (!normalizedValue) return []\n return `${normalizedKey}=${encodeURIComponent(normalizedValue)}`\n })\n return parts.length ? parts.join('; ') : undefined\n}\n\nfunction decodeStructuredResult(value?: string): TaskResult['structuredResult'] | undefined {\n if (!value) return undefined\n try {\n const normalized = value.replace(/-/g, '+').replace(/_/g, '/')\n const padding = normalized.length % 4 === 0 ? '' : '='.repeat(4 - (normalized.length % 4))\n const decoded = Buffer.from(normalized + padding, 'base64').toString('utf-8')\n return JSON.parse(decoded) as TaskResult['structuredResult']\n } catch {\n return undefined\n }\n}\n\nfunction encodeStructuredResult(value?: TaskResult['structuredResult']): string | undefined {\n if (!value) return undefined\n const json = JSON.stringify(value)\n return Buffer.from(json, 'utf-8')\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/g, '')\n}\n\nexport interface EmailMetadata {\n from: string\n to: string\n messageId: string\n subject: string\n headers: RawHeaders\n}\n\n/**\n * Parse AAMP headers from an email's header map.\n * Returns null if this email is not an AAMP message.\n *\n * @param meta - Email metadata (from, to, messageId, subject, headers)\n */\nexport function parseAampHeaders(meta: EmailMetadata): AampMessage | null {\n const headers = normalizeHeaders(meta.headers)\n\n const intent = getAampHeader(headers, AAMP_HEADER.INTENT)\n const taskId = getAampHeader(headers, AAMP_HEADER.TASK_ID)\n\n if (!intent || !taskId) return null\n\n const from = meta.from.replace(/^<|>$/g, '')\n const to = meta.to.replace(/^<|>$/g, '')\n const decodedSubject = decodeMimeEncodedWords(meta.subject)\n\n if (intent === 'task.dispatch') {\n const timeoutStr = getAampHeader(headers, AAMP_HEADER.TIMEOUT) ?? '300'\n const contextLinksStr = getAampHeader(headers, AAMP_HEADER.CONTEXT_LINKS) ?? ''\n const dispatchContext = parseDispatchContextHeader(\n getAampHeader(headers, AAMP_HEADER.DISPATCH_CONTEXT),\n )\n\n const parentTaskId = getAampHeader(headers, AAMP_HEADER.PARENT_TASK_ID)\n\n const dispatch: TaskDispatch = {\n intent: 'task.dispatch',\n taskId,\n title: decodedSubject.replace(/^\\[AAMP Task\\]\\s*/, '').trim() || 'Untitled Task',\n timeoutSecs: parseInt(timeoutStr, 10) || 300,\n contextLinks: contextLinksStr\n ? contextLinksStr.split(',').map((s) => s.trim()).filter(Boolean)\n : [],\n ...(dispatchContext ? { dispatchContext } : {}),\n ...(parentTaskId ? { parentTaskId } : {}),\n from,\n to,\n messageId: meta.messageId,\n subject: meta.subject,\n bodyText: '', // filled in by jmap-push.ts after parsing\n }\n return dispatch\n }\n\n if (intent === 'task.result') {\n const status = (getAampHeader(headers, AAMP_HEADER.STATUS) ?? 'completed') as\n | 'completed'\n | 'rejected'\n const output = getAampHeader(headers, AAMP_HEADER.OUTPUT) ?? ''\n const errorMsg = getAampHeader(headers, AAMP_HEADER.ERROR_MSG)\n const structuredResult = decodeStructuredResult(\n getAampHeader(headers, AAMP_HEADER.STRUCTURED_RESULT),\n )\n\n const result: TaskResult = {\n intent: 'task.result',\n taskId,\n status,\n output: decodeMimeEncodedWords(output),\n errorMsg: errorMsg ? decodeMimeEncodedWords(errorMsg) : errorMsg,\n structuredResult,\n from,\n to,\n messageId: meta.messageId,\n }\n return result\n }\n\n if (intent === 'task.help') {\n const question = getAampHeader(headers, AAMP_HEADER.QUESTION) ?? ''\n const blockedReason = getAampHeader(headers, AAMP_HEADER.BLOCKED_REASON) ?? ''\n const suggestedOptionsStr = getAampHeader(headers, AAMP_HEADER.SUGGESTED_OPTIONS) ?? ''\n\n const help: TaskHelp = {\n intent: 'task.help',\n taskId,\n question: decodeMimeEncodedWords(question),\n blockedReason: decodeMimeEncodedWords(blockedReason),\n suggestedOptions: suggestedOptionsStr\n ? suggestedOptionsStr.split('|').map((s) => decodeMimeEncodedWords(s.trim())).filter(Boolean)\n : [],\n from,\n to,\n messageId: meta.messageId,\n }\n return help\n }\n\n if (intent === 'task.ack') {\n const ack: TaskAck = {\n intent: 'task.ack',\n taskId,\n from,\n to,\n messageId: meta.messageId,\n }\n return ack\n }\n\n return null\n}\n\n/**\n * Build AAMP headers for a task.dispatch email\n */\nexport function buildDispatchHeaders(params: {\n taskId: string\n /** Omit or pass undefined/null to send without a deadline */\n timeoutSecs?: number | null\n contextLinks: string[]\n dispatchContext?: Record<string, string>\n parentTaskId?: string\n}): Record<string, string> {\n const headers: Record<string, string> = {\n [AAMP_HEADER.INTENT]: 'task.dispatch',\n [AAMP_HEADER.TASK_ID]: params.taskId,\n }\n if (params.timeoutSecs != null) {\n headers[AAMP_HEADER.TIMEOUT] = String(params.timeoutSecs)\n }\n if (params.contextLinks.length > 0) {\n headers[AAMP_HEADER.CONTEXT_LINKS] = params.contextLinks.join(',')\n }\n const dispatchContext = serializeDispatchContextHeader(params.dispatchContext)\n if (dispatchContext) {\n headers[AAMP_HEADER.DISPATCH_CONTEXT] = dispatchContext\n }\n if (params.parentTaskId) {\n headers[AAMP_HEADER.PARENT_TASK_ID] = params.parentTaskId\n }\n return headers\n}\n\n/**\n * Build AAMP headers for a task.ack email\n */\nexport function buildAckHeaders(opts: { taskId: string }): Record<string, string> {\n return {\n [AAMP_HEADER.INTENT]: 'task.ack',\n [AAMP_HEADER.TASK_ID]: opts.taskId,\n }\n}\n\n/**\n * Build AAMP headers for a task.result email\n */\nexport function buildResultHeaders(params: {\n taskId: string\n status: 'completed' | 'rejected'\n output: string\n errorMsg?: string\n structuredResult?: TaskResult['structuredResult']\n}): Record<string, string> {\n const headers: Record<string, string> = {\n [AAMP_HEADER.INTENT]: 'task.result',\n [AAMP_HEADER.TASK_ID]: params.taskId,\n [AAMP_HEADER.STATUS]: params.status,\n [AAMP_HEADER.OUTPUT]: params.output,\n }\n if (params.errorMsg) {\n headers[AAMP_HEADER.ERROR_MSG] = params.errorMsg\n }\n const structuredResult = encodeStructuredResult(params.structuredResult)\n if (structuredResult) {\n headers[AAMP_HEADER.STRUCTURED_RESULT] = structuredResult\n }\n return headers\n}\n\n/**\n * Build AAMP headers for a task.help email\n */\nexport function buildHelpHeaders(params: {\n taskId: string\n question: string\n blockedReason: string\n suggestedOptions: string[]\n}): Record<string, string> {\n return {\n [AAMP_HEADER.INTENT]: 'task.help',\n [AAMP_HEADER.TASK_ID]: params.taskId,\n [AAMP_HEADER.QUESTION]: params.question,\n [AAMP_HEADER.BLOCKED_REASON]: params.blockedReason,\n [AAMP_HEADER.SUGGESTED_OPTIONS]: params.suggestedOptions.join('|'),\n }\n}\n", "/**\n * SMTP Sender\n *\n * Sends AAMP protocol emails via SMTP (Stalwart submission port 587).\n */\n\nimport { createTransport, type Transporter } from 'nodemailer'\nimport { randomUUID } from 'crypto'\n\n/** Strip CR/LF to prevent email header injection */\nconst sanitize = (s: string) => s.replace(/[\\r\\n]/g, ' ').trim()\nimport { buildDispatchHeaders, buildResultHeaders, buildHelpHeaders, buildAckHeaders } from './parser.js'\nimport type {\n SendTaskOptions,\n SendResultOptions,\n SendHelpOptions,\n} from './types.js'\n\nexport interface SmtpConfig {\n host: string\n port: number\n user: string\n password: string\n httpBaseUrl?: string\n authToken?: string\n secure?: boolean\n /** Whether to reject unauthorized TLS certificates (default: true) */\n rejectUnauthorized?: boolean\n}\n\nexport class SmtpSender {\n private transport: Transporter\n\n constructor(private readonly config: SmtpConfig) {\n this.transport = createTransport({\n host: config.host,\n port: config.port,\n secure: config.secure ?? false,\n auth: {\n user: config.user,\n pass: config.password,\n },\n tls: {\n rejectUnauthorized: config.rejectUnauthorized ?? true,\n },\n })\n }\n\n private senderDomain(): string {\n return this.config.user.split('@')[1]?.toLowerCase() ?? ''\n }\n\n private recipientDomain(email: string): string {\n return email.split('@')[1]?.toLowerCase() ?? ''\n }\n\n private shouldUseHttpFallback(to: string): boolean {\n return Boolean(\n this.config.httpBaseUrl\n && this.config.authToken\n && this.senderDomain()\n && this.senderDomain() === this.recipientDomain(to),\n )\n }\n\n private async sendViaHttp(opts: {\n to: string\n subject: string\n text: string\n aampHeaders: Record<string, string>\n attachments?: Array<{ filename: string; contentType: string; content: Buffer | string }>\n }): Promise<{ messageId?: string }> {\n const base = this.config.httpBaseUrl?.replace(/\\/$/, '')\n if (!base || !this.config.authToken) {\n throw new Error('HTTP send fallback is not configured')\n }\n\n const res = await fetch(`${base}/api/send`, {\n method: 'POST',\n headers: {\n Authorization: `Basic ${this.config.authToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n to: opts.to,\n subject: opts.subject,\n text: opts.text,\n aampHeaders: opts.aampHeaders,\n attachments: opts.attachments?.map((a) => ({\n filename: a.filename,\n contentType: a.contentType,\n content: typeof a.content === 'string' ? a.content : a.content.toString('base64'),\n })),\n }),\n })\n\n const data = await res.json().catch(() => ({})) as { details?: string; messageId?: string }\n if (!res.ok) {\n throw new Error(data.details || `HTTP send failed: ${res.status}`)\n }\n return { messageId: data.messageId }\n }\n\n /**\n * Send a task.dispatch email.\n * Returns both the generated taskId and the SMTP Message-ID so callers can\n * store a reverse-index (messageId \u2192 taskId) for In-Reply-To thread routing.\n */\n async sendTask(opts: SendTaskOptions): Promise<{ taskId: string; messageId: string }> {\n const taskId = randomUUID()\n const aampHeaders = buildDispatchHeaders({\n taskId,\n timeoutSecs: opts.timeoutSecs,\n contextLinks: opts.contextLinks ?? [],\n parentTaskId: opts.parentTaskId,\n })\n\n const sendMailOpts: Record<string, unknown> = {\n from: this.config.user,\n to: opts.to,\n subject: `[AAMP Task] ${sanitize(opts.title)}`,\n text: [\n `Task: ${opts.title}`,\n `Task ID: ${taskId}`,\n opts.timeoutSecs ? `Deadline: ${opts.timeoutSecs}s` : `Deadline: none`,\n opts.contextLinks?.length\n ? `Context:\\n${opts.contextLinks.map((l) => ` ${l}`).join('\\n')}`\n : '',\n opts.bodyText ?? '',\n ``,\n `--- This email was sent by AAMP. Reply directly to submit your result. ---`,\n ]\n .filter(Boolean)\n .join('\\n'),\n headers: aampHeaders,\n }\n\n if (opts.attachments?.length) {\n sendMailOpts.attachments = opts.attachments.map(a => ({\n filename: a.filename,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n contentType: a.contentType,\n }))\n }\n\n if (this.shouldUseHttpFallback(opts.to)) {\n const info = await this.sendViaHttp({\n to: opts.to,\n subject: sendMailOpts.subject as string,\n text: sendMailOpts.text as string,\n aampHeaders,\n attachments: opts.attachments?.map(a => ({\n filename: a.filename,\n contentType: a.contentType,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n })),\n })\n return { taskId, messageId: info.messageId ?? '' }\n }\n\n const info = await this.transport.sendMail(sendMailOpts)\n\n return { taskId, messageId: info.messageId ?? '' }\n }\n\n /**\n * Send a task.result email back to the dispatcher\n */\n async sendResult(opts: SendResultOptions): Promise<void> {\n const aampHeaders = buildResultHeaders({\n taskId: opts.taskId,\n status: opts.status,\n output: opts.output,\n errorMsg: opts.errorMsg,\n structuredResult: opts.structuredResult,\n })\n\n const mailOpts: Record<string, unknown> = {\n from: this.config.user,\n to: opts.to,\n subject: `[AAMP Result] Task ${opts.taskId} \u2014 ${opts.status}`,\n text: [\n `AAMP Task Result`,\n ``,\n `Task ID: ${opts.taskId}`,\n `Status: ${opts.status}`,\n ``,\n `Output:`,\n opts.output,\n opts.errorMsg ? `\\nError: ${opts.errorMsg}` : '',\n ]\n .filter((s) => s !== '')\n .join('\\n'),\n headers: aampHeaders,\n }\n if (opts.inReplyTo) {\n mailOpts.inReplyTo = opts.inReplyTo\n mailOpts.references = opts.inReplyTo\n }\n if (opts.attachments?.length) {\n mailOpts.attachments = opts.attachments.map(a => ({\n filename: a.filename,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n contentType: a.contentType,\n }))\n }\n\n if (this.shouldUseHttpFallback(opts.to)) {\n await this.sendViaHttp({\n to: opts.to,\n subject: mailOpts.subject as string,\n text: mailOpts.text as string,\n aampHeaders,\n attachments: opts.attachments?.map(a => ({\n filename: a.filename,\n contentType: a.contentType,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n })),\n })\n return\n }\n await this.transport.sendMail(mailOpts)\n }\n\n /**\n * Send a task.help email when the agent is blocked\n */\n async sendHelp(opts: SendHelpOptions): Promise<void> {\n const aampHeaders = buildHelpHeaders({\n taskId: opts.taskId,\n question: opts.question,\n blockedReason: opts.blockedReason,\n suggestedOptions: opts.suggestedOptions,\n })\n\n const helpMailOpts: Record<string, unknown> = {\n from: this.config.user,\n to: opts.to,\n subject: `[AAMP Help] Task ${opts.taskId} needs assistance`,\n text: [\n `AAMP Task Help Request`,\n ``,\n `Task ID: ${opts.taskId}`,\n ``,\n `Question: ${opts.question}`,\n ``,\n `Blocked reason: ${opts.blockedReason}`,\n ``,\n opts.suggestedOptions.length\n ? `Suggested options:\\n${opts.suggestedOptions.map((o, i) => ` ${i + 1}. ${o}`).join('\\n')}`\n : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n headers: aampHeaders,\n }\n if (opts.inReplyTo) {\n helpMailOpts.inReplyTo = opts.inReplyTo\n helpMailOpts.references = opts.inReplyTo\n }\n if (opts.attachments?.length) {\n helpMailOpts.attachments = opts.attachments.map(a => ({\n filename: a.filename,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n contentType: a.contentType,\n }))\n }\n\n if (this.shouldUseHttpFallback(opts.to)) {\n await this.sendViaHttp({\n to: opts.to,\n subject: helpMailOpts.subject as string,\n text: helpMailOpts.text as string,\n aampHeaders,\n attachments: opts.attachments?.map(a => ({\n filename: a.filename,\n contentType: a.contentType,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n })),\n })\n return\n }\n await this.transport.sendMail(helpMailOpts)\n }\n\n /**\n * Send a task.ack email to confirm receipt of a dispatch\n */\n async sendAck(opts: { to: string; taskId: string; inReplyTo?: string }): Promise<void> {\n const aampHeaders = buildAckHeaders({ taskId: opts.taskId })\n const mailOpts: Record<string, unknown> = {\n from: this.config.user,\n to: opts.to,\n subject: `[AAMP ACK] Task ${opts.taskId}`,\n text: '',\n headers: aampHeaders,\n }\n if (opts.inReplyTo) {\n mailOpts.inReplyTo = opts.inReplyTo\n mailOpts.references = opts.inReplyTo\n }\n\n if (this.shouldUseHttpFallback(opts.to)) {\n await this.sendViaHttp({\n to: opts.to,\n subject: mailOpts.subject as string,\n text: mailOpts.text as string,\n aampHeaders,\n })\n return\n }\n await this.transport.sendMail(mailOpts)\n }\n\n /**\n * Verify SMTP connection\n */\n async verify(): Promise<boolean> {\n try {\n await this.transport.verify()\n return true\n } catch {\n return false\n }\n }\n\n close(): void {\n this.transport.close()\n }\n}\n", "/**\n * @aamp/openclaw-plugin\n *\n * OpenClaw plugin that gives the agent an AAMP mailbox identity and lets it\n * receive, process, and reply to AAMP tasks \u2014 entirely through standard email.\n *\n * How it works:\n * 1. Plugin resolves or auto-registers an AAMP mailbox identity on startup.\n * 2. Credentials are cached to a local file so the same mailbox is reused\n * across gateway restarts (no re-registration needed).\n * 3. Background JMAP WebSocket Push receives incoming task.dispatch emails.\n * 4. Incoming tasks are stored in an in-memory pending-task queue.\n * 5. before_prompt_build injects the oldest pending task into the LLM's\n * system context so the agent sees it and acts without user prompting.\n * 6. The agent calls aamp_send_result or aamp_send_help to reply.\n *\n * OpenClaw config (openclaw.json):\n *\n * \"plugins\": {\n * \"entries\": {\n * \"aamp\": {\n * \"enabled\": true,\n * \"config\": {\n * \"aampHost\": \"https://meshmail.ai\",\n * \"slug\": \"openclaw-agent\",\n * \"credentialsFile\": \"/absolute/path/to/.aamp-credentials.json\"\n * }\n * }\n * }\n * }\n *\n * Install:\n * openclaw plugins install ./packages/openclaw-plugin\n */\n\nimport { AampClient } from 'aamp-sdk'\nimport type { TaskDispatch, TaskResult, TaskHelp, AampAttachment, ReceivedAttachment } from 'aamp-sdk'\nimport {\n defaultCredentialsPath,\n ensureDir,\n loadCachedIdentity,\n readBinaryFile,\n saveCachedIdentity,\n writeBinaryFile,\n type Identity,\n} from './file-store.js'\n\n// \u2500\u2500\u2500 Shared runtime state (single instance per plugin lifetime) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface PendingTask {\n taskId: string\n from: string\n title: string\n bodyText: string\n contextLinks: string[]\n timeoutSecs: number\n messageId: string\n receivedAt: string // ISO-8601\n}\n\ninterface PluginConfig {\n /** e.g. \"meshmail.ai\" \u2014 all URLs are derived from this */\n aampHost: string\n slug?: string\n /** Absolute path to cache AAMP credentials. Default: ~/.openclaw/extensions/aamp-openclaw-plugin/.credentials.json */\n credentialsFile?: string\n senderPolicies?: SenderPolicy[]\n}\n\ninterface SenderPolicy {\n sender: string\n dispatchContextRules?: Record<string, string[]>\n}\n\nfunction matchSenderPolicy(\n task: TaskDispatch,\n senderPolicies: SenderPolicy[] | undefined,\n): { allowed: boolean; reason?: string } {\n if (!senderPolicies?.length) return { allowed: true }\n\n const sender = task.from.toLowerCase()\n const policy = senderPolicies.find((item) => item.sender.trim().toLowerCase() === sender)\n if (!policy) {\n return { allowed: false, reason: `sender ${task.from} is not allowed by senderPolicies` }\n }\n\n const rules = policy.dispatchContextRules\n if (!rules || Object.keys(rules).length === 0) {\n return { allowed: true }\n }\n\n const context = task.dispatchContext ?? {}\n const effectiveRules = Object.entries(rules)\n .map(([key, allowedValues]) => [\n key,\n (allowedValues ?? []).map((value) => value.trim()).filter(Boolean),\n ] as const)\n .filter(([, allowedValues]) => allowedValues.length > 0)\n\n if (effectiveRules.length === 0) {\n return { allowed: true }\n }\n\n for (const [key, allowedValues] of effectiveRules) {\n const contextValue = context[key]\n if (!contextValue) {\n return { allowed: false, reason: `dispatchContext missing required key \"${key}\"` }\n }\n if (!allowedValues.includes(contextValue)) {\n return { allowed: false, reason: `dispatchContext ${key}=${contextValue} is not allowed` }\n }\n }\n\n return { allowed: true }\n}\n\ntype StructuredResultFieldInput = {\n fieldKey: string\n fieldTypeKey: string\n fieldAlias?: string\n value?: unknown\n index?: string\n attachmentFilenames?: string[]\n}\n\n/** Normalise aampHost to a base URL with scheme and no trailing slash */\nfunction baseUrl(aampHost: string): string {\n if (aampHost.startsWith('http://') || aampHost.startsWith('https://')) {\n return aampHost.replace(/\\/$/, '')\n }\n return `https://${aampHost}`\n}\n\nconst pendingTasks = new Map<string, PendingTask>()\n// Tracks sub-tasks dispatched TO other agents \u2014 waiting for their result/help replies\nconst dispatchedSubtasks = new Map<string, { to: string; title: string; dispatchedAt: string; parentTaskId?: string }>()\n// Tracks notification keys that have been shown to LLM (auto-cleaned on next prompt build)\nconst shownNotifications = new Set<string>()\n// Pending synchronous dispatch waiters \u2014 resolve callback keyed by sub-task ID.\n// When aamp_dispatch_task sends a sub-task, it parks a Promise here and waits.\n// When task.result/help arrives for that sub-task ID, the waiter is resolved\n// directly, keeping the LLM awake with full context (no heartbeat needed).\nconst waitingDispatches = new Map<string, (reply: { type: 'result' | 'help'; data: unknown }) => void>()\nlet aampClient: AampClient | null = null\nlet agentEmail = ''\nlet lastConnectionError = ''\nlet lastDisconnectReason = ''\nlet lastTransportMode: 'disconnected' | 'websocket' | 'polling' = 'disconnected'\nlet lastLoggedTransportMode: 'disconnected' | 'websocket' | 'polling' = 'disconnected'\nlet reconcileTimer: NodeJS.Timeout | null = null\nlet transportMonitorTimer: NodeJS.Timeout | null = null\n// Tracks the most recently seen session key so task.dispatch can wake the right session.\n// Default 'agent:main:main' is the standard OpenClaw single-agent session key.\nlet currentSessionKey = 'agent:main:main'\n// Channel runtime \u2014 captured from channel adapter's startAccount for instant dispatch.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet channelRuntime: any = null\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet channelCfg: any = null\n\nfunction dispatchSessionKey(): string {\n return currentSessionKey || 'agent:main:main'\n}\n\nfunction logTransportState(\n api: { logger: { info: (msg: string) => void; warn: (msg: string) => void } },\n mode: 'websocket' | 'polling',\n email: string,\n previousMode: 'disconnected' | 'websocket' | 'polling',\n): void {\n if (mode === previousMode) return\n\n if (mode === 'polling') {\n api.logger.info(`[AAMP] Connected (polling fallback active) \u2014 listening as ${email}`)\n return\n }\n\n if (previousMode === 'polling') {\n api.logger.info(`[AAMP] WebSocket restored \u2014 listening as ${email}`)\n return\n }\n\n api.logger.info(`[AAMP] Connected \u2014 listening as ${email}`)\n}\n\n// \u2500\u2500\u2500 Identity helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface Identity {\n email: string\n jmapToken: string\n smtpPassword: string\n}\n\n/**\n * Register a new AAMP node via the management service.\n *\n * Always creates a NEW mailbox (always returns 201). The slug is just a\n * human-readable prefix; a random hex suffix makes the email unique.\n * Callers should only call this once and persist the returned credentials.\n */\nasync function registerNode(cfg: PluginConfig): Promise<Identity> {\n const slug = (cfg.slug ?? 'openclaw-agent')\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n\n const base = baseUrl(cfg.aampHost)\n\n // Step 1: Self-register \u2192 get one-time registration code\n const res = await fetch(`${base}/api/nodes/self-register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ slug, description: 'OpenClaw AAMP agent node' }),\n })\n\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as { error?: string }\n throw new Error(`AAMP registration failed (${res.status}): ${err.error ?? res.statusText}`)\n }\n\n const regData = (await res.json()) as {\n registrationCode: string\n email: string\n }\n\n // Step 2: Exchange registration code for credentials\n const credRes = await fetch(\n `${base}/api/nodes/credentials?code=${encodeURIComponent(regData.registrationCode)}`,\n )\n\n if (!credRes.ok) {\n const err = (await credRes.json().catch(() => ({}))) as { error?: string }\n throw new Error(`AAMP credential exchange failed (${credRes.status}): ${err.error ?? credRes.statusText}`)\n }\n\n const credData = (await credRes.json()) as {\n email: string\n jmap: { token: string }\n smtp: { password: string }\n }\n\n return {\n email: credData.email,\n jmapToken: credData.jmap.token,\n smtpPassword: credData.smtp.password,\n }\n}\n\n/**\n * Resolve this agent's identity:\n * 1. Return cached credentials from disk if available.\n * 2. Otherwise register a new node and cache the result.\n */\nasync function resolveIdentity(cfg: PluginConfig): Promise<Identity> {\n const cached = loadCachedIdentity(cfg.credentialsFile ?? defaultCredentialsPath())\n if (cached) return cached\n\n const identity = await registerNode(cfg)\n saveCachedIdentity(identity, cfg.credentialsFile ?? defaultCredentialsPath())\n return identity\n}\n\n// \u2500\u2500\u2500 Plugin definition \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport default {\n id: 'aamp-openclaw-plugin',\n name: 'AAMP Agent Mail Protocol',\n\n configSchema: {\n type: 'object',\n properties: {\n aampHost: {\n type: 'string',\n description: 'AAMP service host, e.g. https://meshmail.ai',\n },\n slug: {\n type: 'string',\n default: 'openclaw-agent',\n description: 'Agent name prefix used in the mailbox address',\n },\n credentialsFile: {\n type: 'string',\n description:\n 'Absolute path to cache AAMP credentials between gateway restarts. ' +\n 'Default: ~/.openclaw/extensions/aamp-openclaw-plugin/.credentials.json. ' +\n 'Delete this file to force re-registration with a new mailbox.',\n },\n senderPolicies: {\n type: 'array',\n description:\n 'Per-sender authorization policies. Each sender can optionally require specific ' +\n 'X-AAMP-Dispatch-Context key/value pairs before a task is accepted.',\n items: {\n type: 'object',\n required: ['sender'],\n properties: {\n sender: {\n type: 'string',\n description: 'Dispatch sender email address (case-insensitive exact match).',\n },\n dispatchContextRules: {\n type: 'object',\n description:\n 'Optional exact-match rules over X-AAMP-Dispatch-Context. ' +\n 'All listed keys must be present and their values must match one of the configured entries.',\n additionalProperties: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n },\n },\n },\n },\n },\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(api: any) {\n // api.pluginConfig = the config block under plugins.entries[\"aamp-openclaw-plugin\"].config in openclaw.json\n // api.config = the full global OpenClaw config (NOT our plugin's config)\n const cfg = (api.pluginConfig ?? {}) as PluginConfig\n\n // \u2500\u2500 Register lightweight channel adapter to capture channelRuntime \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // We register as a channel SOLELY to get access to channelRuntime, which provides\n // dispatchReplyWithBufferedBlockDispatcher for instant LLM dispatch (bypassing\n // heartbeat's global running-mutex + requests-in-flight ~60s delay).\n // JMAP connection is managed by registerService, NOT startAccount.\n api.registerChannel({\n id: 'aamp',\n meta: { label: 'AAMP' },\n capabilities: { chatTypes: ['dm'] },\n config: {\n listAccountIds: () => cfg.aampHost ? ['default'] : [],\n resolveAccount: () => ({ aampHost: cfg.aampHost }),\n isEnabled: () => !!cfg.aampHost,\n isConfigured: () => !!loadCachedIdentity(cfg.credentialsFile ?? defaultCredentialsPath()),\n },\n gateway: {\n startAccount: async (ctx: { channelRuntime?: unknown; cfg?: unknown; abortSignal?: AbortSignal }) => {\n // Capture channelRuntime for use by sub-task notification dispatch\n channelRuntime = ctx.channelRuntime ?? null\n channelCfg = ctx.cfg ?? null\n api.logger.info(`[AAMP] Channel adapter started \u2014 channelRuntime ${channelRuntime ? 'available' : 'NOT available'}`)\n\n // Keep alive until abort \u2014 JMAP connection is managed by registerService\n await new Promise<void>((resolve) => {\n ctx.abortSignal?.addEventListener('abort', () => resolve())\n })\n channelRuntime = null\n channelCfg = null\n },\n stopAccount: async () => {\n channelRuntime = null\n channelCfg = null\n },\n },\n })\n\n function triggerHeartbeatWake(sessionKey: string, label: string): void {\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey })\n api.logger.info(`[AAMP] Heartbeat triggered for ${label} via session ${sessionKey}`)\n } catch (err) {\n api.logger.warn(`[AAMP] Could not trigger heartbeat for ${label}: ${(err as Error).message}`)\n }\n }\n\n function wakeAgentForPendingTask(task: PendingTask): void {\n const sessionKey = dispatchSessionKey()\n const fallback = () => triggerHeartbeatWake(sessionKey, `task ${task.taskId}`)\n\n api.logger.info(\n `[AAMP] Wake requested for task ${task.taskId} \u2014 channelRuntime=${channelRuntime ? 'yes' : 'no'} channelCfg=${channelCfg ? 'yes' : 'no'} session=${sessionKey}`,\n )\n fallback()\n }\n\n // \u2500\u2500 Shared connect logic (used by service auto-connect and startup recovery) \u2500\u2500\u2500\u2500\u2500\u2500\n async function doConnect(identity: { email: string; jmapToken: string; smtpPassword: string }) {\n if (reconcileTimer) {\n clearInterval(reconcileTimer)\n reconcileTimer = null\n }\n if (transportMonitorTimer) {\n clearInterval(transportMonitorTimer)\n transportMonitorTimer = null\n }\n\n agentEmail = identity.email\n lastConnectionError = ''\n lastDisconnectReason = ''\n lastTransportMode = 'disconnected'\n lastLoggedTransportMode = 'disconnected'\n api.logger.info(`[AAMP] Mailbox identity ready \u2014 ${agentEmail}`)\n\n // All traffic goes through aampHost (port 3000).\n // The management service proxies /jmap/* and /.well-known/jmap \u2192 Stalwart:8080.\n const base = baseUrl(cfg.aampHost)\n\n aampClient = new AampClient({\n email: identity.email,\n jmapToken: identity.jmapToken,\n jmapUrl: base,\n smtpHost: new URL(base).hostname,\n smtpPort: 587,\n smtpPassword: identity.smtpPassword,\n // Local/dev: management-service proxy uses plain HTTP, no TLS cert to verify.\n // Production: set to true when using wss:// with valid certs.\n rejectUnauthorized: false,\n })\n\n aampClient.on('task.dispatch', (task: TaskDispatch) => {\n api.logger.info(`[AAMP] \u2190 task.dispatch ${task.taskId} \"${task.title}\" from=${task.from}`)\n\n try {\n // \u2500\u2500 Sender policy / dispatch-context authorization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const decision = matchSenderPolicy(task, cfg.senderPolicies)\n if (!decision.allowed) {\n api.logger.warn(`[AAMP] \u2717 rejected by senderPolicies: ${task.from} task=${task.taskId} reason=${decision.reason}`)\n void aampClient!.sendResult({\n to: task.from,\n taskId: task.taskId,\n status: 'rejected',\n output: '',\n errorMsg: decision.reason ?? `Sender ${task.from} is not allowed.`,\n }).catch((err: Error) => {\n api.logger.error(`[AAMP] Failed to send rejection for task ${task.taskId}: ${err.message}`)\n })\n return\n }\n\n pendingTasks.set(task.taskId, {\n taskId: task.taskId,\n from: task.from,\n title: task.title,\n bodyText: task.bodyText ?? '',\n contextLinks: task.contextLinks,\n timeoutSecs: task.timeoutSecs,\n messageId: task.messageId ?? '',\n receivedAt: new Date().toISOString(),\n })\n\n // Wake the agent immediately after enqueueing the task.\n // In polling fallback mode heartbeat wakes can be delayed, so prefer a direct\n // channel dispatch when channelRuntime is available and only fall back to heartbeat.\n wakeAgentForPendingTask(pendingTasks.get(task.taskId)!)\n } catch (err) {\n api.logger.error(`[AAMP] task.dispatch handler failed for ${task.taskId}: ${(err as Error).message}`)\n if (pendingTasks.has(task.taskId)) {\n triggerHeartbeatWake(currentSessionKey, `task ${task.taskId}`)\n }\n }\n })\n\n // \u2500\u2500 Sub-task result: another agent completed a task we dispatched \u2500\u2500\u2500\u2500\u2500\u2500\n aampClient.on('task.result', (result: TaskResult) => {\n api.logger.info(`[AAMP] \u2190 task.result ${result.taskId} status=${result.status} from=${result.from}`)\n\n const sub = dispatchedSubtasks.get(result.taskId)\n dispatchedSubtasks.delete(result.taskId)\n\n // \u2500\u2500 Synchronous dispatch: if aamp_dispatch_task is waiting, resolve it directly \u2500\u2500\n const waiter = waitingDispatches.get(result.taskId)\n if (waiter) {\n waitingDispatches.delete(result.taskId)\n api.logger.info(`[AAMP] Resolving sync waiter for sub-task ${result.taskId}`)\n waiter({ type: 'result', data: result })\n return // Don't go through heartbeat/channel \u2014 the LLM is already awake\n }\n\n // Pre-download attachments to local disk so the LLM can reference them\n // by local file path (instead of requiring a separate download tool call).\n const downloadedFiles: Array<{ filename: string; path: string; size: number }> = []\n const downloadPromise = (async () => {\n if (!result.attachments?.length) return\n const dir = '/tmp/aamp-files'\n ensureDir(dir)\n for (const att of result.attachments) {\n try {\n const buffer = await aampClient!.downloadBlob(att.blobId, att.filename)\n const filepath = `${dir}/${att.filename}`\n writeBinaryFile(filepath, buffer)\n downloadedFiles.push({ filename: att.filename, path: filepath, size: buffer.length })\n api.logger.info(`[AAMP] Pre-downloaded: ${att.filename} (${(buffer.length / 1024).toFixed(1)} KB) \u2192 ${filepath}`)\n } catch (dlErr) {\n api.logger.warn(`[AAMP] Pre-download failed for ${att.filename}: ${(dlErr as Error).message}`)\n }\n }\n })()\n\n downloadPromise.then(() => {\n // Build notification with pre-downloaded file paths\n const MAX_OUTPUT_CHARS = 800\n const label = result.status === 'completed' ? 'Sub-task completed' : 'Sub-task rejected'\n const rawOutput = result.output ?? ''\n const truncatedOutput = rawOutput.length > MAX_OUTPUT_CHARS\n ? rawOutput.slice(0, MAX_OUTPUT_CHARS) + `\\n\\n... [truncated, ${rawOutput.length} chars total]`\n : rawOutput\n\n let attachmentInfo = ''\n if (downloadedFiles.length > 0) {\n attachmentInfo = `\\n\\nAttachments (pre-downloaded to local disk):\\n${downloadedFiles.map(f =>\n `- ${f.filename} (${(f.size / 1024).toFixed(1)} KB) \u2192 ${f.path}`\n ).join('\\n')}\\nUse aamp_send_result with attachments: [${downloadedFiles.map(f => `{ filename: \"${f.filename}\", path: \"${f.path}\" }`).join(', ')}] to forward them.`\n } else if (result.attachments?.length) {\n const files = result.attachments.map((a: ReceivedAttachment) =>\n `${a.filename} (${(a.size / 1024).toFixed(1)} KB, blobId: ${a.blobId})`,\n )\n attachmentInfo = `\\n\\nAttachments (download failed \u2014 use aamp_download_attachment manually):\\n${files.join('\\n')}`\n }\n\n pendingTasks.set(`result:${result.taskId}`, {\n taskId: result.taskId,\n from: result.from,\n title: `${label}: ${sub?.title ?? result.taskId}`,\n bodyText: result.status === 'completed'\n ? `Agent ${result.from} completed the sub-task.\\n\\nOutput:\\n${truncatedOutput}${attachmentInfo}`\n : `Agent ${result.from} rejected the sub-task.\\n\\nReason: ${result.errorMsg ?? 'unknown'}`,\n contextLinks: [],\n timeoutSecs: 0,\n messageId: '',\n receivedAt: new Date().toISOString(),\n })\n\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey: dispatchSessionKey() })\n api.logger.info(`[AAMP] Heartbeat for sub-task result ${result.taskId}`)\n } catch (err) {\n api.logger.warn(`[AAMP] Heartbeat for sub-task result failed: ${(err as Error).message}`)\n }\n }).catch((err: Error) => {\n api.logger.error(`[AAMP] Sub-task result processing failed: ${err.message}`)\n })\n })\n\n // \u2500\u2500 Sub-task help: another agent asks for clarification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n aampClient.on('task.help', (help: TaskHelp) => {\n api.logger.info(`[AAMP] \u2190 task.help ${help.taskId} question=\"${help.question}\" from=${help.from}`)\n\n // \u2500\u2500 Synchronous dispatch: if aamp_dispatch_task is waiting, resolve it directly \u2500\u2500\n const waiter = waitingDispatches.get(help.taskId)\n if (waiter) {\n waitingDispatches.delete(help.taskId)\n api.logger.info(`[AAMP] Resolving sync waiter for sub-task help ${help.taskId}`)\n waiter({ type: 'help', data: help })\n return\n }\n\n const sub = dispatchedSubtasks.get(help.taskId)\n\n pendingTasks.set(`help:${help.taskId}`, {\n taskId: help.taskId,\n from: help.from,\n title: `Sub-task needs help: ${sub?.title ?? help.taskId}`,\n bodyText: `Agent ${help.from} is asking for help on the sub-task.\\n\\nQuestion: ${help.question}\\nBlocked reason: ${help.blockedReason}${help.suggestedOptions?.length ? `\\nSuggested options: ${help.suggestedOptions.join(', ')}` : ''}`,\n contextLinks: [],\n timeoutSecs: 0,\n messageId: '',\n receivedAt: new Date().toISOString(),\n })\n\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey: dispatchSessionKey() })\n api.logger.info(`[AAMP] Heartbeat fallback for sub-task help ${help.taskId}`)\n } catch (err) {\n api.logger.warn(`[AAMP] Heartbeat for sub-task help failed: ${(err as Error).message}`)\n }\n })\n\n aampClient.on('connected', () => {\n lastConnectionError = ''\n lastDisconnectReason = ''\n const mode = aampClient?.isUsingPollingFallback() ? 'polling' : 'websocket'\n logTransportState(api, mode, agentEmail, lastLoggedTransportMode)\n lastTransportMode = mode\n lastLoggedTransportMode = mode\n })\n\n aampClient.on('disconnected', (reason: string) => {\n lastDisconnectReason = reason\n // In polling fallback mode, websocket reconnect attempts may still emit\n // transient \"disconnected\" events. Do not reset the logged transport\n // state in that case, or polling mode will be re-logged every cycle.\n if (aampClient?.isUsingPollingFallback()) {\n lastTransportMode = 'polling'\n return\n }\n if (lastTransportMode !== 'disconnected') {\n api.logger.warn(`[AAMP] Disconnected: ${reason} (will auto-reconnect)`)\n lastTransportMode = 'disconnected'\n lastLoggedTransportMode = 'disconnected'\n }\n })\n\n aampClient.on('error', (err: Error) => {\n lastConnectionError = err.message\n if (err.message.startsWith('JMAP WebSocket unavailable, falling back to polling:')) {\n if (lastTransportMode !== 'polling') {\n logTransportState(api, 'polling', agentEmail, lastLoggedTransportMode)\n lastTransportMode = 'polling'\n lastLoggedTransportMode = 'polling'\n }\n return\n }\n api.logger.error(`[AAMP] ${err.message}`)\n })\n\n await aampClient.connect()\n\n api.logger.info(\n `[AAMP] Transport after connect \u2014 ${aampClient.isUsingPollingFallback() ? 'polling fallback' : 'websocket'} as ${agentEmail}`,\n )\n\n if (aampClient.isConnected() && lastTransportMode === 'disconnected') {\n if (aampClient.isUsingPollingFallback()) {\n logTransportState(api, 'polling', agentEmail, lastLoggedTransportMode)\n lastTransportMode = 'polling'\n lastLoggedTransportMode = 'polling'\n } else {\n logTransportState(api, 'websocket', agentEmail, lastLoggedTransportMode)\n lastTransportMode = 'websocket'\n lastLoggedTransportMode = 'websocket'\n }\n }\n\n setTimeout(() => {\n if (!aampClient?.isConnected()) return\n const mode = aampClient.isUsingPollingFallback() ? 'polling' : 'websocket'\n logTransportState(api, mode, agentEmail, lastLoggedTransportMode)\n lastTransportMode = mode\n lastLoggedTransportMode = mode\n }, 1000)\n\n transportMonitorTimer = setInterval(() => {\n if (!aampClient) return\n if (!aampClient.isConnected()) {\n if (lastTransportMode !== 'disconnected') {\n lastTransportMode = 'disconnected'\n }\n return\n }\n const mode = aampClient.isUsingPollingFallback() ? 'polling' : 'websocket'\n logTransportState(api, mode, agentEmail, lastLoggedTransportMode)\n lastTransportMode = mode\n lastLoggedTransportMode = mode\n }, 5000)\n\n reconcileTimer = setInterval(() => {\n if (!aampClient) return\n void aampClient.reconcileRecentEmails(20).catch((err: Error) => {\n lastConnectionError = err.message\n api.logger.warn(`[AAMP] Mailbox reconcile failed: ${err.message}`)\n })\n }, 15000)\n }\n\n // \u2500\u2500 Service: auto-connect at gateway startup, disconnect on shutdown \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // registerService causes this plugin to load eagerly (at gateway startup),\n // not lazily (on first agent run). start() is called once the gateway is up.\n api.registerService({\n id: 'aamp-service',\n start: async () => {\n if (!cfg.aampHost) {\n api.logger.info('[AAMP] aampHost not configured \u2014 skipping auto-connect')\n return\n }\n try {\n const identity = await resolveIdentity(cfg)\n await doConnect(identity)\n } catch (err) {\n api.logger.warn(`[AAMP] Service auto-connect failed: ${(err as Error).message}`)\n }\n },\n stop: () => {\n if (reconcileTimer) {\n clearInterval(reconcileTimer)\n reconcileTimer = null\n }\n if (transportMonitorTimer) {\n clearInterval(transportMonitorTimer)\n transportMonitorTimer = null\n }\n if (aampClient) {\n try {\n aampClient.disconnect()\n api.logger.info('[AAMP] Disconnected on gateway stop')\n } catch {\n // ignore disconnect errors on shutdown\n }\n }\n },\n })\n\n // \u2500\u2500 gateway_start hook: re-trigger heartbeat after runner is initialized \u2500\u2500\u2500\n // Service start() runs BEFORE the heartbeat runner is ready, so\n // requestHeartbeatNow() called during JMAP initial fetch is silently dropped\n // (handler == null). gateway_start fires AFTER the heartbeat runner starts,\n // so we re-trigger here to process any tasks queued during startup.\n api.on('gateway_start', () => {\n if (pendingTasks.size === 0) return\n api.logger.info(`[AAMP] gateway_start: re-triggering heartbeat for ${pendingTasks.size} pending task(s)`)\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey: currentSessionKey })\n } catch (err) {\n api.logger.warn(`[AAMP] gateway_start heartbeat failed: ${(err as Error).message}`)\n }\n })\n\n // \u2500\u2500 2. Prompt injection: surface the oldest pending task to the LLM \u2500\u2500\u2500\u2500\u2500\u2500\n api.on(\n 'before_prompt_build',\n (_event, ctx) => {\n if (pendingTasks.size > 0) {\n api.logger.info(\n `[AAMP] before_prompt_build \u2014 pending=${pendingTasks.size} session=${ctx?.sessionKey ?? 'unknown'} currentSession=${currentSessionKey}`,\n )\n }\n\n // Keep currentSessionKey fresh \u2014 used by task.dispatch to target the right session.\n // Skip channel dispatch sessions (aamp:*) to avoid polluting the heartbeat session key.\n if (ctx?.sessionKey && !String(ctx.sessionKey).startsWith('aamp:')) {\n currentSessionKey = ctx.sessionKey\n }\n\n // Expire tasks that have exceeded their timeout\n const now = Date.now()\n for (const [id, t] of pendingTasks) {\n if (t.timeoutSecs && now - new Date(t.receivedAt).getTime() > t.timeoutSecs * 1000) {\n api.logger.warn(`[AAMP] Task ${id} timed out \u2014 removing from queue`)\n pendingTasks.delete(id)\n }\n }\n\n if (pendingTasks.size === 0) return {}\n\n // Prioritize notifications (sub-task results/help) over actionable tasks.\n // Without this, the oldest actionable task blocks notification delivery,\n // preventing the LLM from seeing sub-task results and completing the parent task.\n const allEntries = [...pendingTasks.entries()]\n const notifications = allEntries.filter(([key]) => key.startsWith('result:') || key.startsWith('help:'))\n const actionable = allEntries.filter(([key]) => !key.startsWith('result:') && !key.startsWith('help:'))\n\n // Pick notification first if available, otherwise oldest actionable task\n const [taskKey, task] = notifications.length > 0\n ? notifications.sort((a, b) => new Date(a[1].receivedAt).getTime() - new Date(b[1].receivedAt).getTime())[0]\n : actionable.sort((a, b) => new Date(a[1].receivedAt).getTime() - new Date(b[1].receivedAt).getTime())[0]\n\n const isNotification = taskKey.startsWith('result:') || taskKey.startsWith('help:')\n\n // Notifications are one-shot: remove immediately after injecting into prompt\n if (isNotification && taskKey) {\n pendingTasks.delete(taskKey)\n }\n\n // Find remaining actionable tasks (non-notification) that still need a response\n const actionableTasks = [...pendingTasks.entries()]\n .filter(([key]) => !key.startsWith('result:') && !key.startsWith('help:'))\n .map(([, t]) => t)\n\n const hasAttachmentInfo = isNotification && (task.bodyText?.includes('aamp_download_attachment') ?? false)\n const actionRequiredSection = isNotification && actionableTasks.length > 0\n ? [\n ``,\n `### Action Required`,\n ``,\n `You still have ${actionableTasks.length} pending task(s) that need a response.`,\n `Use the sub-task result above to complete them by calling aamp_send_result.`,\n ``,\n ...actionableTasks.map((t) =>\n `- Task ID: ${t.taskId} | From: ${t.from} | Title: \"${t.title}\"`\n ),\n ...(hasAttachmentInfo ? [\n ``,\n `### Forwarding Attachments`,\n `The sub-task result includes file attachments. To forward them:`,\n `1. Call aamp_download_attachment for each blobId listed above`,\n `2. Include the downloaded files in aamp_send_result via the attachments parameter`,\n ` Example: attachments: [{ filename: \"file.html\", path: \"/tmp/aamp-files/file.html\" }]`,\n ] : []),\n ].join('\\n')\n : ''\n\n const lines = isNotification ? [\n `## Sub-task Update`,\n ``,\n `A sub-task you dispatched has returned a result. Review the information below.`,\n `If the sub-task included attachments, use aamp_download_attachment to fetch them.`,\n ``,\n `Task ID: ${task.taskId}`,\n `From: ${task.from}`,\n `Title: ${task.title}`,\n task.bodyText ? `\\n${task.bodyText}` : '',\n actionRequiredSection,\n pendingTasks.size > 1 ? `\\n(+${pendingTasks.size - 1} more items queued)` : '',\n ] : [\n `## Pending AAMP Task (action required)`,\n ``,\n `You have received a task via AAMP email. You MUST call one of the two tools below`,\n `BEFORE responding to the user \u2014 do not skip this step.`,\n ``,\n `### Tool selection rules (follow strictly):`,\n ``,\n `Use aamp_send_result ONLY when ALL of the following are true:`,\n ` 1. The title contains a clear, specific action verb (e.g. \"summarise\", \"review\",`,\n ` \"translate\", \"generate\", \"fix\", \"search\", \"compare\", \"list\")`,\n ` 2. You know exactly what input/resource to act on`,\n ` 3. No ambiguity remains \u2014 you could start work immediately without asking anything`,\n ``,\n `Use aamp_send_help in ALL other cases, including:`,\n ` - Title is a greeting or salutation (\"hello\", \"hi\", \"hey\", \"test\", \"ping\", etc.)`,\n ` - Title is fewer than 4 words and contains no actionable verb`,\n ` - Title is too vague to act on without guessing (e.g. \"help\", \"task\", \"question\")`,\n ` - Required context is missing (which file? which URL? which criteria?)`,\n ` - Multiple interpretations are equally plausible`,\n ``,\n `IMPORTANT: Responding to a greeting with a greeting is WRONG. \"hello\" is not a`,\n `valid task description \u2014 ask what specific task the dispatcher needs done.`,\n ``,\n `### Sub-task dispatch rules:`,\n `If you delegate work to another agent via aamp_dispatch_task, you MUST pass`,\n `parentTaskId: \"${task.taskId}\" to establish the parent-child relationship.`,\n ``,\n `Task ID: ${task.taskId}`,\n `From: ${task.from}`,\n `Title: ${task.title}`,\n task.bodyText ? `Description:\\n${task.bodyText}` : '',\n task.contextLinks.length\n ? `Context Links:\\n${task.contextLinks.map((l) => ` - ${l}`).join('\\n')}`\n : '',\n task.timeoutSecs ? `Deadline: ${task.timeoutSecs}s from dispatch` : `Deadline: none`,\n `Received: ${task.receivedAt}`,\n pendingTasks.size > 1 ? `\\n(+${pendingTasks.size - 1} more tasks queued)` : '',\n ]\n .filter(Boolean)\n .join('\\n')\n\n api.logger.info(\n `[AAMP] Injecting pending task into prompt \u2014 taskId=${task.taskId} notification=${isNotification ? 'yes' : 'no'} remaining=${pendingTasks.size}`,\n )\n\n return { prependContext: lines }\n },\n { priority: 5 },\n )\n\n // \u2500\u2500 3. Tool: send task result \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_send_result',\n description:\n 'Send the result of an AAMP task back to the dispatcher. ' +\n 'Call this after you have finished processing the task.',\n parameters: {\n type: 'object',\n required: ['taskId', 'status', 'output'],\n properties: {\n taskId: {\n type: 'string',\n description: 'The AAMP task ID to reply to (from the system context)',\n },\n status: {\n type: 'string',\n enum: ['completed', 'rejected'],\n description: '\"completed\" on success, \"rejected\" if the task cannot be done',\n },\n output: {\n type: 'string',\n description: 'Your result or explanation',\n },\n errorMsg: {\n type: 'string',\n description: 'Optional error details (use only when status = rejected)',\n },\n attachments: {\n type: 'array',\n description: 'File attachments. Each item: { filename, contentType, path (local file path) }',\n items: {\n type: 'object',\n properties: {\n filename: { type: 'string' },\n contentType: { type: 'string' },\n path: { type: 'string', description: 'Absolute path to the file on disk' },\n },\n required: ['filename', 'path'],\n },\n },\n structuredResult: {\n type: 'array',\n description: 'Optional structured Meego field values.',\n items: {\n type: 'object',\n required: ['fieldKey', 'fieldTypeKey'],\n properties: {\n fieldKey: { type: 'string' },\n fieldTypeKey: { type: 'string' },\n fieldAlias: { type: 'string' },\n value: {\n description: 'Field value in the exact format required by Meego for this field type.',\n },\n index: { type: 'string' },\n attachmentFilenames: {\n type: 'array',\n items: { type: 'string' },\n description: 'For attachment fields, filenames from attachments[] that should be uploaded into this field.',\n },\n },\n },\n },\n },\n },\n execute: async (_id, params) => {\n const p = params as {\n taskId: string\n status: 'completed' | 'rejected'\n output: string\n errorMsg?: string\n attachments?: Array<{ filename: string; contentType?: string; path: string }>\n structuredResult?: StructuredResultFieldInput[]\n }\n\n const task = pendingTasks.get(p.taskId)\n if (!task) {\n return {\n content: [{ type: 'text', text: `Error: task ${p.taskId} not found in pending queue.` }],\n }\n }\n\n if (!aampClient?.isConnected()) {\n return { content: [{ type: 'text', text: 'Error: AAMP client is not connected.' }] }\n }\n\n api.logger.info(`[AAMP] aamp_send_result params ${JSON.stringify({\n taskId: p.taskId,\n status: p.status,\n output: p.output,\n errorMsg: p.errorMsg,\n attachments: p.attachments?.map((a) => ({\n filename: a.filename,\n contentType: a.contentType ?? 'application/octet-stream',\n path: a.path,\n })) ?? [],\n structuredResult: p.structuredResult?.map((field) => ({\n fieldKey: field.fieldKey,\n fieldTypeKey: field.fieldTypeKey,\n fieldAlias: field.fieldAlias,\n value: field.value,\n index: field.index,\n attachmentFilenames: field.attachmentFilenames ?? [],\n })) ?? [],\n })}`)\n\n // Build attachments from file paths\n let attachments: AampAttachment[] | undefined\n if (p.attachments?.length) {\n attachments = p.attachments.map((a: { filename: string; contentType?: string; path: string }) => ({\n filename: a.filename,\n contentType: a.contentType ?? 'application/octet-stream',\n content: readBinaryFile(a.path),\n }))\n }\n\n await aampClient.sendResult({\n to: task.from,\n taskId: task.taskId,\n status: p.status,\n output: p.output,\n errorMsg: p.errorMsg,\n structuredResult: p.structuredResult?.length ? p.structuredResult : undefined,\n inReplyTo: task.messageId || undefined,\n attachments,\n })\n\n pendingTasks.delete(task.taskId)\n api.logger.info(`[AAMP] \u2192 task.result ${task.taskId} ${p.status}`)\n\n // If more tasks remain, wake the agent to process them\n if (pendingTasks.size > 0) {\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey: currentSessionKey })\n } catch { /* ignore */ }\n }\n\n return {\n content: [\n {\n type: 'text',\n text: `Result sent for task ${task.taskId} (status: ${p.status}).`,\n },\n ],\n }\n },\n }, { name: 'aamp_send_result' })\n\n // \u2500\u2500 4. Tool: ask for help \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_send_help',\n description:\n 'Send a help request for an AAMP task when you are blocked or need human clarification ' +\n 'before you can proceed.',\n parameters: {\n type: 'object',\n required: ['taskId', 'question', 'blockedReason'],\n properties: {\n taskId: {\n type: 'string',\n description: 'The AAMP task ID',\n },\n question: {\n type: 'string',\n description: 'Your question for the human dispatcher',\n },\n blockedReason: {\n type: 'string',\n description: 'Why you cannot proceed without their input',\n },\n suggestedOptions: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional list of choices for the dispatcher to pick from',\n },\n },\n },\n execute: async (_id, params) => {\n const p = params as {\n taskId: string\n question: string\n blockedReason: string\n suggestedOptions?: string[]\n }\n\n const task = pendingTasks.get(p.taskId)\n if (!task) {\n return {\n content: [{ type: 'text', text: `Error: task ${p.taskId} not found in pending queue.` }],\n }\n }\n\n if (!aampClient?.isConnected()) {\n return { content: [{ type: 'text', text: 'Error: AAMP client is not connected.' }] }\n }\n\n await aampClient.sendHelp({\n to: task.from,\n taskId: task.taskId,\n question: p.question,\n blockedReason: p.blockedReason,\n suggestedOptions: p.suggestedOptions ?? [],\n inReplyTo: task.messageId || undefined,\n })\n\n api.logger.info(`[AAMP] \u2192 task.help ${task.taskId}`)\n\n // Keep the task in pending \u2014 the help reply may arrive later\n return {\n content: [\n {\n type: 'text',\n text: `Help request sent for task ${task.taskId}. The task remains pending until the dispatcher replies.`,\n },\n ],\n }\n },\n }, { name: 'aamp_send_help' })\n\n // \u2500\u2500 5. Tool: inspect queue \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_pending_tasks',\n description: 'List all AAMP tasks currently waiting to be processed.',\n parameters: { type: 'object', properties: {} },\n execute: async () => {\n if (pendingTasks.size === 0) {\n return { content: [{ type: 'text', text: 'No pending AAMP tasks.' }] }\n }\n\n const lines = [...pendingTasks.values()]\n .sort((a, b) => new Date(a.receivedAt).getTime() - new Date(b.receivedAt).getTime())\n .map(\n (t, i) =>\n `${i + 1}. [${t.taskId}] \"${t.title}\"${t.bodyText ? `\\n Description: ${t.bodyText}` : ''} \u2014 from ${t.from} (received ${t.receivedAt})`,\n )\n\n return {\n content: [\n {\n type: 'text',\n text: `${pendingTasks.size} pending task(s):\\n${lines.join('\\n')}`,\n },\n ],\n }\n },\n }, { name: 'aamp_pending_tasks' })\n\n // \u2500\u2500 6. Tool: dispatch task to another agent (SYNCHRONOUS) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Sends the task and BLOCKS until the sub-agent replies with task.result or\n // task.help. The reply is returned directly as the tool result, keeping the\n // LLM awake with full context \u2014 no heartbeat/channel dispatch needed.\n api.registerTool({\n name: 'aamp_dispatch_task',\n description:\n 'Send a task to another AAMP agent and WAIT for the result. ' +\n 'This tool blocks until the sub-agent replies (typically 5-60s). ' +\n 'The sub-agent\\'s output and any attachment file paths are returned directly.',\n parameters: {\n type: 'object',\n required: ['to', 'title'],\n properties: {\n to: { type: 'string', description: 'Target agent AAMP email address' },\n title: { type: 'string', description: 'Task title (concise summary)' },\n bodyText: { type: 'string', description: 'Detailed task description' },\n parentTaskId: { type: 'string', description: 'If you are processing a pending AAMP task, pass its Task ID here to establish parent-child nesting. Omit for top-level tasks.' },\n timeoutSecs: { type: 'number', description: 'Timeout in seconds (optional)' },\n contextLinks: {\n type: 'array', items: { type: 'string' },\n description: 'URLs providing context (optional)',\n },\n attachments: {\n type: 'array',\n description: 'File attachments. Each item: { filename, contentType, path (local file path) }',\n items: {\n type: 'object',\n properties: {\n filename: { type: 'string' },\n contentType: { type: 'string' },\n path: { type: 'string', description: 'Absolute path to the file on disk' },\n },\n required: ['filename', 'path'],\n },\n },\n },\n },\n execute: async (_id: unknown, params: {\n to: string; title: string; bodyText?: string;\n parentTaskId?: string; timeoutSecs?: number; contextLinks?: string[];\n attachments?: Array<{ filename: string; contentType?: string; path: string }>\n }) => {\n if (!aampClient?.isConnected()) {\n return { content: [{ type: 'text', text: 'Error: AAMP client is not connected.' }] }\n }\n\n try {\n // Build attachments from file paths\n let attachments: AampAttachment[] | undefined\n if (params.attachments?.length) {\n attachments = params.attachments.map((a: { filename: string; contentType?: string; path: string }) => ({\n filename: a.filename,\n contentType: a.contentType ?? 'application/octet-stream',\n content: readBinaryFile(a.path),\n }))\n }\n\n const result = await aampClient.sendTask({\n to: params.to,\n title: params.title,\n parentTaskId: params.parentTaskId,\n timeoutSecs: params.timeoutSecs,\n contextLinks: params.contextLinks,\n attachments,\n })\n\n // Track as dispatched sub-task\n dispatchedSubtasks.set(result.taskId, {\n to: params.to,\n title: params.title,\n dispatchedAt: new Date().toISOString(),\n parentTaskId: params.parentTaskId,\n })\n\n api.logger.info(`[AAMP] \u2192 task.dispatch ${result.taskId} to=${params.to} parent=${params.parentTaskId ?? 'none'} (waiting for reply\u2026)`)\n\n // \u2500\u2500 SYNCHRONOUS WAIT: block until sub-agent replies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const timeoutMs = (params.timeoutSecs ?? 300) * 1000\n const reply = await new Promise<{ type: 'result' | 'help'; data: unknown }>((resolve, reject) => {\n waitingDispatches.set(result.taskId, resolve)\n setTimeout(() => {\n if (waitingDispatches.delete(result.taskId)) {\n reject(new Error(`Sub-task ${result.taskId} timed out after ${params.timeoutSecs ?? 300}s`))\n }\n }, timeoutMs)\n })\n\n api.logger.info(`[AAMP] \u2190 sync reply for ${result.taskId}: type=${reply.type} attachments=${JSON.stringify((reply.data as any)?.attachments?.length ?? 0)}`)\n\n if (reply.type === 'result') {\n const r = reply.data as TaskResult\n\n // Pre-download attachments \u2014 use direct JMAP blob download (bypass SDK's downloadBlob\n // which was returning 404 due to URL construction issues in the esbuild bundle).\n let attachmentLines = ''\n if (r.attachments?.length) {\n api.logger.info(`[AAMP] Downloading ${r.attachments.length} attachment(s) from sync reply...`)\n const dir = '/tmp/aamp-files'\n ensureDir(dir)\n const downloaded: string[] = []\n const base = baseUrl(cfg.aampHost)\n const identity = loadCachedIdentity(cfg.credentialsFile ?? defaultCredentialsPath())\n const authHeader = identity ? `Basic ${Buffer.from(identity.email + ':' + identity.smtpPassword).toString('base64')}` : ''\n for (const att of r.attachments) {\n try {\n // Direct JMAP blob download \u2014 construct URL manually\n const dlUrl = `${base}/jmap/download/n/${encodeURIComponent(att.blobId)}/${encodeURIComponent(att.filename)}?accept=application/octet-stream`\n api.logger.info(`[AAMP] Fetching ${dlUrl}`)\n const dlRes = await fetch(dlUrl, { headers: { Authorization: authHeader } })\n if (!dlRes.ok) throw new Error(`HTTP ${dlRes.status}`)\n const buffer = Buffer.from(await dlRes.arrayBuffer())\n const filepath = `${dir}/${att.filename}`\n writeBinaryFile(filepath, buffer)\n downloaded.push(`${att.filename} (${(buffer.length / 1024).toFixed(1)} KB) \u2192 ${filepath}`)\n api.logger.info(`[AAMP] Downloaded: ${att.filename} (${(buffer.length / 1024).toFixed(1)} KB)`)\n } catch (dlErr) {\n api.logger.error(`[AAMP] Download failed for ${att.filename}: ${(dlErr as Error).message}`)\n }\n }\n if (downloaded.length) {\n attachmentLines = `\\n\\nAttachments downloaded:\\n${downloaded.join('\\n')}`\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: [\n `Sub-task ${r.status}: ${params.title}`,\n `Agent: ${r.from}`,\n `Task ID: ${result.taskId}`,\n r.status === 'completed' ? `\\nOutput:\\n${r.output}` : `\\nError: ${r.errorMsg ?? 'rejected'}`,\n attachmentLines,\n ].filter(Boolean).join('\\n'),\n }],\n }\n } else {\n const h = reply.data as TaskHelp\n return {\n content: [{\n type: 'text',\n text: [\n `Sub-task needs help: ${params.title}`,\n `Agent: ${h.from}`,\n `Task ID: ${result.taskId}`,\n `\\nQuestion: ${h.question}`,\n `Blocked reason: ${h.blockedReason}`,\n h.suggestedOptions?.length ? `Options: ${h.suggestedOptions.join(' | ')}` : '',\n ].filter(Boolean).join('\\n'),\n }],\n }\n }\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Error dispatching task: ${(err as Error).message}` }],\n }\n }\n },\n }, { name: 'aamp_dispatch_task' })\n\n // \u2500\u2500 7. Tool: check AAMP protocol support \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_check_protocol',\n description:\n 'Check if an email address supports the AAMP protocol. ' +\n 'Returns { aamp: true/false } indicating whether the address is an AAMP agent.',\n parameters: {\n type: 'object',\n required: ['email'],\n properties: {\n email: { type: 'string', description: 'Email address to check' },\n },\n },\n execute: async (_id: unknown, params: { email: string }) => {\n const base = baseUrl(cfg.aampHost)\n const email = params?.email ?? ''\n if (!email) {\n return { content: [{ type: 'text', text: 'Error: email parameter is required' }] }\n }\n try {\n const res = await fetch(`${base}/api/aamp-check?email=${encodeURIComponent(email)}`)\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n const data = await res.json() as { aamp: boolean; domain?: string }\n return {\n content: [{\n type: 'text',\n text: data.aamp\n ? `${params.email} supports AAMP protocol (domain: ${data.domain ?? 'unknown'})`\n : `${params.email} does not support AAMP protocol`,\n }],\n }\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not check ${params.email}: ${(err as Error).message}` }],\n }\n }\n },\n }, { name: 'aamp_check_protocol' })\n\n // \u2500\u2500 8. Tool: download attachment blob \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_download_attachment',\n description:\n 'Download an AAMP email attachment to local disk by its blobId. ' +\n 'Use this to retrieve files received from sub-agent task results.',\n parameters: {\n type: 'object',\n required: ['blobId', 'filename'],\n properties: {\n blobId: { type: 'string', description: 'The JMAP blobId from the attachment metadata' },\n filename: { type: 'string', description: 'Filename to save as' },\n saveTo: { type: 'string', description: 'Directory to save to (default: /tmp/aamp-files)' },\n },\n },\n execute: async (_id: unknown, params: { blobId: string; filename: string; saveTo?: string }) => {\n if (!aampClient?.isConnected()) {\n return { content: [{ type: 'text', text: 'Error: AAMP client is not connected.' }] }\n }\n\n const dir = params.saveTo ?? '/tmp/aamp-files'\n ensureDir(dir)\n\n try {\n const buffer = await aampClient.downloadBlob(params.blobId, params.filename)\n const filepath = `${dir}/${params.filename}`\n writeBinaryFile(filepath, buffer)\n return {\n content: [{\n type: 'text',\n text: `Downloaded ${params.filename} (${(buffer.length / 1024).toFixed(1)} KB) to ${filepath}`,\n }],\n }\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Download failed: ${(err as Error).message}` }],\n }\n }\n },\n }, { name: 'aamp_download_attachment' })\n\n // \u2500\u2500 9. Slash command: /aamp-status \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerCommand({\n name: 'aamp-status',\n description: 'Show AAMP connection status and pending task queue',\n acceptsArgs: false,\n requireAuth: false,\n handler: () => {\n const isPollingFallback = aampClient?.isUsingPollingFallback?.() ?? false\n const connectionLine = aampClient?.isConnected()\n ? (isPollingFallback ? '\uD83D\uDFE1 connected (polling fallback)' : '\u2705 connected')\n : '\u274C disconnected'\n\n return {\n text: [\n `**AAMP Plugin Status**`,\n `Host: ${cfg.aampHost || '(not configured)'}`,\n `Identity: ${agentEmail || '(not yet registered)'}`,\n `Connection: ${connectionLine}`,\n `Cached: ${loadCachedIdentity(cfg.credentialsFile ?? defaultCredentialsPath()) ? 'yes' : 'no'}`,\n lastConnectionError ? `Last error: ${lastConnectionError}` : '',\n lastDisconnectReason ? `Last disconnect: ${lastDisconnectReason}` : '',\n `Pending: ${pendingTasks.size} task(s)`,\n ...[...pendingTasks.values()].map(\n (t) => ` \u2022 ${t.taskId.slice(0, 8)}\u2026 \"${t.title}\" from ${t.from}`,\n ),\n ]\n .filter(Boolean)\n .join('\\n'),\n }\n },\n })\n },\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../../sdk/src/jmap-push.ts", "../../sdk/src/types.ts", "../../sdk/src/parser.ts", "../../sdk/src/tiny-emitter.ts", "../../sdk/src/smtp-sender.ts", "../../sdk/src/client.ts", "../src/file-store.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * JMAP WebSocket Push Client\n *\n * Connects to Stalwart's JMAP WebSocket endpoint and subscribes to\n * Email StateChange events. When a new email arrives in the agent's\n * mailbox, fetches it via JMAP and emits the parsed AAMP headers.\n *\n * Protocol: RFC 8887 (JMAP over WebSocket)\n * Ref: https://www.rfc-editor.org/rfc/rfc8887\n */\n\nimport WebSocket from 'ws'\nimport { parseAampHeaders } from './parser.js'\nimport type { AampMessage, HumanReply, TaskAck, TaskDispatch, TaskHelp, TaskResult } from './types.js'\nimport { TinyEmitter } from './tiny-emitter.js'\n\ninterface JmapSession {\n capabilities: Record<string, unknown>\n accounts: Record<string, { name: string; isPrimary: boolean; accountCapabilities: Record<string, unknown> }>\n primaryAccounts: Record<string, string>\n username: string\n apiUrl: string\n downloadUrl: string\n uploadUrl: string\n eventSourceUrl: string\n state: string\n}\n\ninterface JmapStateChange {\n '@type': 'StateChange'\n changed: Record<string, Record<string, string>>\n pushState?: string\n}\n\ninterface JmapEmail {\n id: string\n blobId: string\n threadId: string\n mailboxIds: Record<string, boolean>\n subject: string\n from: Array<{ email: string; name?: string }>\n to: Array<{ email: string; name?: string }>\n replyTo?: Array<{ email: string; name?: string }>\n messageId?: string[]\n headers: Array<{ name: string; value: string }>\n receivedAt: string\n size: number\n /** Plain-text body parts (JMAP bodyStructure) */\n textBody?: Array<{ partId: string; type: string }>\n /** Decoded body values keyed by partId */\n bodyValues?: Record<string, { value: string; isEncodingProblem?: boolean; isTruncated?: boolean }>\n /** JMAP attachments (non-inline parts) */\n attachments?: Array<{\n blobId: string\n type: string\n name: string | null\n size: number\n }>\n}\n\ninterface JmapMethodResponse {\n methodResponses: Array<[string, Record<string, unknown>, string]>\n}\n\nfunction describeError(err: unknown): string {\n if (!(err instanceof Error)) return String(err)\n\n const parts = [err.message]\n const details = err as Error & {\n code?: string\n errno?: number | string\n syscall?: string\n address?: string\n port?: number\n cause?: unknown\n }\n\n if (details.code) parts.push(`code=${details.code}`)\n if (details.errno !== undefined) parts.push(`errno=${details.errno}`)\n if (details.syscall) parts.push(`syscall=${details.syscall}`)\n if (details.address) parts.push(`address=${details.address}`)\n if (details.port !== undefined) parts.push(`port=${details.port}`)\n\n if (details.cause instanceof Error) {\n parts.push(`cause=${describeError(details.cause)}`)\n } else if (details.cause !== undefined) {\n parts.push(`cause=${String(details.cause)}`)\n }\n\n return parts.join(' | ')\n}\n\ntype JmapPushEvents = {\n 'task.dispatch': (task: TaskDispatch) => void\n 'task.result': (result: TaskResult) => void\n 'task.help': (help: TaskHelp) => void\n 'task.ack': (ack: TaskAck) => void\n reply: (reply: HumanReply) => void\n connected: () => void\n disconnected: (reason: string) => void\n error: (err: Error) => void\n _autoAck: (payload: { to: string; taskId: string; messageId: string }) => void\n}\n\nexport class JmapPushClient extends TinyEmitter<JmapPushEvents> {\n private ws: WebSocket | null = null\n private session: JmapSession | null = null\n private reconnectTimer: NodeJS.Timeout | null = null\n private pollTimer: NodeJS.Timeout | null = null\n private pingTimer: NodeJS.Timeout | null = null\n private safetySyncTimer: NodeJS.Timeout | null = null\n private readonly seenMessageIds = new Set<string>()\n private connected = false\n private pollingActive = false\n private running = false\n private connecting = false\n /** JMAP Email state \u2014 tracks processed position; null = not yet initialized */\n private emailState: string | null = null\n private readonly startedAtMs = Date.now()\n\n private readonly email: string\n private readonly password: string\n private readonly jmapUrl: string\n private readonly reconnectInterval: number\n private readonly rejectUnauthorized: boolean\n private readonly pingIntervalMs = 5000\n private readonly safetySyncIntervalMs = 5000\n\n constructor(opts: {\n email: string\n password: string\n jmapUrl: string\n reconnectInterval?: number\n /** Whether to reject unauthorized TLS certificates (default: true) */\n rejectUnauthorized?: boolean\n }) {\n super()\n this.email = opts.email\n this.password = opts.password\n this.jmapUrl = opts.jmapUrl.replace(/\\/$/, '')\n this.reconnectInterval = opts.reconnectInterval ?? 5000\n this.rejectUnauthorized = opts.rejectUnauthorized ?? true\n }\n\n /**\n * Start the JMAP Push listener\n */\n async start(): Promise<void> {\n this.running = true\n this.startSafetySync()\n await this.connect()\n }\n\n /**\n * Stop the JMAP Push listener\n */\n stop(): void {\n this.running = false\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n if (this.pollTimer) {\n clearTimeout(this.pollTimer)\n this.pollTimer = null\n }\n if (this.pingTimer) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n if (this.safetySyncTimer) {\n clearInterval(this.safetySyncTimer)\n this.safetySyncTimer = null\n }\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n this.connected = false\n this.pollingActive = false\n this.connecting = false\n }\n\n private getAuthHeader(): string {\n const creds = `${this.email}:${this.password}`\n return `Basic ${Buffer.from(creds).toString('base64')}`\n }\n\n /**\n * Fetch the JMAP session object\n */\n private async fetchSession(): Promise<JmapSession> {\n const url = `${this.jmapUrl}/.well-known/jmap`\n let res: Response\n try {\n res = await fetch(url, {\n headers: { Authorization: this.getAuthHeader() },\n })\n } catch (err) {\n throw new Error(`fetchSession ${url} failed: ${describeError(err)}`)\n }\n\n if (!res.ok) {\n throw new Error(`Failed to fetch JMAP session: ${res.status} ${res.statusText}`)\n }\n\n return res.json() as Promise<JmapSession>\n }\n\n /**\n * Perform a JMAP API call\n */\n private async jmapCall(\n methods: Array<[string, Record<string, unknown>, string]>,\n ): Promise<JmapMethodResponse> {\n if (!this.session) throw new Error('No JMAP session')\n\n // Use the configured jmapUrl (external hostname) rather than session.apiUrl\n // which Stalwart populates with its own internal URL (e.g. http://aamp.local:8080/jmap)\n // and is unreachable when running behind a proxy.\n const apiUrl = `${this.jmapUrl}/jmap/`\n let res: Response\n try {\n res = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n Authorization: this.getAuthHeader(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n using: [\n 'urn:ietf:params:jmap:core',\n 'urn:ietf:params:jmap:mail',\n ],\n methodCalls: methods,\n }),\n })\n } catch (err) {\n throw new Error(`jmapCall ${apiUrl} failed: ${describeError(err)}`)\n }\n\n if (!res.ok) {\n throw new Error(`JMAP API call failed: ${res.status}`)\n }\n\n return res.json() as Promise<JmapMethodResponse>\n }\n\n /**\n * Initialize emailState by fetching the current state without loading any emails.\n * Called on first connect so we only process emails that arrive AFTER this point.\n */\n private async initEmailState(accountId: string): Promise<void> {\n const response = await this.jmapCall([\n ['Email/get', { accountId, ids: [] }, 'g0'],\n ])\n const getResp = response.methodResponses.find(([name]) => name === 'Email/get')\n if (getResp) {\n this.emailState = (getResp[1] as { state?: string }).state ?? null\n }\n }\n\n /**\n * Fetch only emails created since `sinceState` using Email/changes.\n * Updates `this.emailState` to the new state after fetching.\n * Returns [] and resets state if the server cannot calculate changes (state too old).\n */\n private async fetchEmailsSince(accountId: string, sinceState: string): Promise<JmapEmail[]> {\n const changesResp = await this.jmapCall([\n ['Email/changes', { accountId, sinceState, maxChanges: 50 }, 'c1'],\n ])\n\n const changesResult = changesResp.methodResponses.find(([name]) => name === 'Email/changes')\n\n // Handle server error \u2014 e.g. \"cannotCalculateChanges\" when state is too old\n if (!changesResult || changesResult[0] === 'error') {\n await this.initEmailState(accountId)\n return []\n }\n\n const changes = changesResult[1] as {\n created?: string[]\n newState?: string\n hasMoreChanges?: boolean\n }\n\n if (changes.newState) {\n this.emailState = changes.newState\n }\n\n const newIds = changes.created ?? []\n if (newIds.length === 0) return []\n\n const emailResp = await this.jmapCall([\n [\n 'Email/get',\n {\n accountId,\n ids: newIds,\n properties: ['id', 'subject', 'from', 'to', 'headers', 'messageId', 'receivedAt', 'textBody', 'bodyValues', 'attachments'],\n fetchTextBodyValues: true,\n maxBodyValueBytes: 262144,\n },\n 'g1',\n ],\n ])\n\n const getResult = emailResp.methodResponses.find(([name]) => name === 'Email/get')\n if (!getResult) return []\n\n const data = getResult[1] as { list?: JmapEmail[] }\n return data.list ?? []\n }\n\n /**\n * Process a received email.\n *\n * Priority:\n * 1. If X-AAMP-Intent is present \u2192 emit typed AAMP event (task.dispatch / task.result / task.help)\n * 2. If In-Reply-To is present \u2192 emit 'reply' event so the application layer can\n * resolve the thread (inReplyTo \u2192 taskId via Redis/DB) and handle human replies.\n * 3. Otherwise \u2192 ignore (not an AAMP-related email)\n */\n private processEmail(email: JmapEmail): void {\n // Build lowercase header map from JMAP header array\n const headerMap: Record<string, string> = {}\n for (const h of email.headers ?? []) {\n headerMap[h.name.toLowerCase()] = h.value.trim()\n }\n\n const fromAddr = email.from?.[0]?.email ?? ''\n const toAddr = email.to?.[0]?.email ?? ''\n const messageId = email.messageId?.[0] ?? email.id\n\n if (this.seenMessageIds.has(messageId)) return\n this.seenMessageIds.add(messageId)\n\n // \u2500\u2500 Path 1: AAMP-tagged email \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const msg: AampMessage | null = parseAampHeaders({\n from: fromAddr,\n to: toAddr,\n messageId,\n subject: email.subject ?? '',\n headers: headerMap,\n })\n\n if (msg && 'intent' in msg) {\n // Attach email body text (task description) to all AAMP messages\n const aampTextPartId = email.textBody?.[0]?.partId\n const aampBodyText = aampTextPartId ? (email.bodyValues?.[aampTextPartId]?.value ?? '').trim() : ''\n ;(msg as unknown as Record<string, unknown>).bodyText = aampBodyText\n\n // Attach received attachment metadata (blobId-based, downloadable via downloadBlob)\n const receivedAttachments = (email.attachments ?? []).map(a => ({\n filename: a.name ?? 'attachment',\n contentType: a.type,\n size: a.size,\n blobId: a.blobId,\n }))\n if (receivedAttachments.length > 0) {\n ;(msg as unknown as Record<string, unknown>).attachments = receivedAttachments\n }\n\n // Auto-ACK for dispatches \u2014 AampClient handles the actual sending\n if ((msg as { intent: string }).intent === 'task.dispatch') {\n this.emit('_autoAck', { to: fromAddr, taskId: (msg as { taskId: string }).taskId, messageId })\n }\n\n const aampMsg = msg as Exclude<AampMessage, HumanReply>\n switch (aampMsg.intent) {\n case 'task.dispatch':\n this.emit('task.dispatch', aampMsg)\n break\n case 'task.result':\n this.emit('task.result', aampMsg)\n break\n case 'task.help':\n this.emit('task.help', aampMsg)\n break\n case 'task.ack':\n this.emit('task.ack', aampMsg)\n break\n }\n return\n }\n\n // \u2500\u2500 Path 2: standard email reply \u2014 In-Reply-To fallback \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Standard email clients automatically set In-Reply-To when replying.\n // We strip angle brackets (<msgid@host>) to get the bare Message-ID.\n const rawInReplyTo = headerMap['in-reply-to'] ?? ''\n if (!rawInReplyTo) return // unrelated email, ignore\n\n // Handle \"References\" chain: prefer the last (most recent) Message-ID\n // so multi-turn threads still resolve to the correct task.\n const rawReferences = headerMap['references'] ?? ''\n const referencesIds = rawReferences\n .split(/\\s+/)\n .map((s) => s.replace(/[<>]/g, '').trim())\n .filter(Boolean)\n\n const inReplyTo = rawInReplyTo.replace(/[<>]/g, '').trim()\n\n // Extract plain-text body if available (fetched via fetchTextBodyValues)\n const textPartId = email.textBody?.[0]?.partId\n const bodyText = textPartId ? (email.bodyValues?.[textPartId]?.value ?? '').trim() : ''\n\n const reply: HumanReply = {\n inReplyTo,\n messageId,\n from: fromAddr,\n to: toAddr,\n subject: email.subject ?? '',\n bodyText,\n }\n\n // Also expose the full References chain so callers can walk the thread if needed\n if (referencesIds.length > 0) {\n Object.assign(reply, { references: referencesIds })\n }\n\n this.emit('reply', reply)\n }\n\n private async fetchRecentEmails(accountId: string): Promise<JmapEmail[]> {\n const queryResp = await this.jmapCall([\n [\n 'Email/query',\n {\n accountId,\n sort: [{ property: 'receivedAt', isAscending: false }],\n limit: 20,\n },\n 'q1',\n ],\n ])\n\n const queryResult = queryResp.methodResponses.find(([name]) => name === 'Email/query')\n if (!queryResult) return []\n\n const ids = ((queryResult[1] as { ids?: string[] }).ids ?? []).slice(0, 20)\n if (ids.length === 0) return []\n\n const emailResp = await this.jmapCall([\n [\n 'Email/get',\n {\n accountId,\n ids,\n properties: ['id', 'subject', 'from', 'to', 'headers', 'messageId', 'receivedAt', 'textBody', 'bodyValues', 'attachments'],\n fetchTextBodyValues: true,\n maxBodyValueBytes: 262144,\n },\n 'gRecent',\n ],\n ])\n\n const getResult = emailResp.methodResponses.find(([name]) => name === 'Email/get')\n if (!getResult) return []\n\n return (getResult[1] as { list?: JmapEmail[] }).list ?? []\n }\n\n private shouldProcessBootstrapEmail(email: JmapEmail): boolean {\n const receivedAtMs = new Date(email.receivedAt).getTime()\n // Keep a small grace window for mail that arrived during startup / reconnect races,\n // but do not replay older historical mailbox contents as fresh tasks.\n return Number.isFinite(receivedAtMs) && receivedAtMs >= this.startedAtMs - 15_000\n }\n\n /**\n * Connect to JMAP WebSocket\n */\n private async connect(): Promise<void> {\n if (this.connecting || !this.running) return\n this.connecting = true\n\n try {\n this.session = await this.fetchSession()\n } catch (err) {\n this.connecting = false\n this.emit('error', new Error(`Failed to get JMAP session: ${(err as Error).message}`))\n this.startPolling('session fetch failed')\n this.scheduleReconnect()\n return\n }\n\n // Build WebSocket URL from the configured jmapUrl (the management-service proxy).\n // The management service exposes the standard external WebSocket path /jmap/ws\n // and proxies upgrades to Stalwart. We never use the session capability URL\n // directly because Stalwart populates it with its own internal hostname\n // (e.g. ws://aamp.local:8080/jmap/ws), which is unreachable from outside\n // the Docker / cluster network.\n const stalwartWsUrl = `${this.jmapUrl}/jmap/ws`\n .replace(/^https:\\/\\//, 'wss://')\n .replace(/^http:\\/\\//, 'ws://')\n\n this.ws = new WebSocket(stalwartWsUrl, 'jmap', {\n headers: {\n Authorization: this.getAuthHeader(),\n },\n perMessageDeflate: false,\n rejectUnauthorized: this.rejectUnauthorized,\n })\n\n this.ws.on('unexpected-response', (_req, res) => {\n this.connecting = false\n const headerSummary = Object.entries(res.headers)\n .map(([key, value]) => `${key}: ${Array.isArray(value) ? value.join(', ') : (value ?? '')}`)\n .join('; ')\n this.startPolling(`websocket handshake failed: ${res.statusCode ?? 'unknown'}`)\n this.emit(\n 'error',\n new Error(\n `JMAP WebSocket handshake failed: ${res.statusCode ?? 'unknown'} ${res.statusMessage ?? ''}${headerSummary ? ` | headers: ${headerSummary}` : ''}`,\n ),\n )\n this.scheduleReconnect()\n })\n\n this.ws.on('open', async () => {\n this.connecting = false\n this.connected = true\n this.stopPolling()\n this.startPingHeartbeat()\n\n // On first connect (emailState is null), initialize state so we only\n // process emails arriving AFTER this point.\n // On reconnect, emailState is already set \u2014 Email/changes will catch up.\n const accountId = this.session?.primaryAccounts['urn:ietf:params:jmap:mail']\n if (accountId && this.emailState === null) {\n await this.initEmailState(accountId)\n }\n\n // Subscribe to Email state changes AFTER state is initialized\n this.ws!.send(\n JSON.stringify({\n '@type': 'WebSocketPushEnable',\n dataTypes: ['Email'],\n pushState: null,\n }),\n )\n\n this.emit('connected')\n })\n\n this.ws.on('pong', () => {\n // Receiving pong confirms the upstream and LB path are still alive.\n })\n\n this.ws.on('message', async (rawData: WebSocket.RawData) => {\n try {\n const msg = JSON.parse(rawData.toString()) as {\n '@type': string\n } & JmapStateChange\n\n if (msg['@type'] === 'StateChange') {\n await this.handleStateChange(msg)\n }\n } catch (err) {\n this.emit('error', new Error(`Failed to process JMAP push message: ${(err as Error).message}`))\n }\n })\n\n this.ws.on('close', (code, reason) => {\n this.connecting = false\n this.connected = false\n this.stopPingHeartbeat()\n const reasonStr = reason?.toString() ?? 'connection closed'\n this.startPolling(reasonStr)\n this.emit('disconnected', reasonStr)\n\n if (this.running) {\n this.scheduleReconnect()\n }\n })\n\n this.ws.on('error', (err) => {\n this.connecting = false\n this.stopPingHeartbeat()\n this.startPolling(err.message)\n this.emit('error', err)\n })\n }\n\n private startPingHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n\n this.pingTimer = setInterval(() => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return\n try {\n this.ws.ping()\n } catch (err) {\n this.emit('error', new Error(`Failed to send WebSocket ping: ${(err as Error).message}`))\n }\n }, this.pingIntervalMs)\n }\n\n private stopPingHeartbeat(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer)\n this.pingTimer = null\n }\n }\n\n private startSafetySync(): void {\n if (this.safetySyncTimer) return\n\n this.safetySyncTimer = setInterval(() => {\n if (!this.running) return\n\n void this.reconcileRecentEmails(20).catch((err) => {\n this.emit('error', new Error(`Safety reconcile failed: ${(err as Error).message}`))\n })\n }, this.safetySyncIntervalMs)\n }\n\n private async handleStateChange(stateChange: JmapStateChange): Promise<void> {\n if (!this.session) return\n\n const accountId = this.session.primaryAccounts['urn:ietf:params:jmap:mail']\n if (!accountId) return\n\n const changedAccount = stateChange.changed[accountId]\n if (!changedAccount?.Email) return\n\n try {\n if (this.emailState === null) {\n // State not yet initialized (race between open handler and first StateChange)\n // Just initialize and skip \u2014 next StateChange will use Email/changes properly\n await this.initEmailState(accountId)\n return\n }\n\n const emails = await this.fetchEmailsSince(accountId, this.emailState)\n for (const email of emails) {\n this.processEmail(email)\n }\n } catch (err) {\n this.emit('error', new Error(`Failed to fetch emails: ${(err as Error).message}`))\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null\n if (this.running) {\n await this.connect()\n }\n }, this.reconnectInterval)\n }\n\n isConnected(): boolean {\n return this.connected || this.pollingActive\n }\n\n isUsingPollingFallback(): boolean {\n return this.pollingActive && !this.connected\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearTimeout(this.pollTimer)\n this.pollTimer = null\n }\n this.pollingActive = false\n }\n\n private startPolling(reason: string): void {\n if (!this.running || this.pollingActive) return\n\n this.pollingActive = true\n this.emit('error', new Error(`JMAP WebSocket unavailable, falling back to polling: ${reason}`))\n this.emit('connected')\n\n const poll = async () => {\n if (!this.running || this.connected) {\n this.stopPolling()\n return\n }\n\n try {\n if (!this.session) {\n this.session = await this.fetchSession()\n }\n\n const accountId = this.session.primaryAccounts['urn:ietf:params:jmap:mail']\n ?? Object.keys(this.session.accounts)[0]\n\n if (!accountId) {\n throw new Error('No mail account available in JMAP session')\n }\n\n if (this.emailState === null) {\n const recentEmails = await this.fetchRecentEmails(accountId)\n for (const email of recentEmails.sort((a, b) => {\n const aTs = new Date(a.receivedAt).getTime()\n const bTs = new Date(b.receivedAt).getTime()\n return aTs - bTs\n })) {\n if (!this.shouldProcessBootstrapEmail(email)) continue\n this.processEmail(email)\n }\n await this.initEmailState(accountId)\n } else {\n const emails = await this.fetchEmailsSince(accountId, this.emailState)\n for (const email of emails) {\n this.processEmail(email)\n }\n }\n } catch (err) {\n this.emit('error', new Error(`Polling fallback failed: ${(err as Error).message}`))\n } finally {\n if (this.running && !this.connected) {\n this.pollTimer = setTimeout(poll, this.reconnectInterval)\n }\n }\n }\n\n this.pollTimer = setTimeout(poll, 0)\n }\n\n /**\n * Download a blob (attachment) by its JMAP blobId.\n * Returns the raw binary content as a Buffer.\n */\n async downloadBlob(blobId: string, filename?: string): Promise<Buffer> {\n if (!this.session) {\n // Fetch session on demand if not yet connected\n this.session = await this.fetchSession()\n }\n\n const accountId = this.session.primaryAccounts['urn:ietf:params:jmap:mail']\n ?? Object.keys(this.session.accounts)[0]\n\n // Build download URL from session template or fall back to standard JMAP path\n let downloadUrl = this.session.downloadUrl\n ?? `${this.jmapUrl}/jmap/download/{accountId}/{blobId}/{name}`\n\n // Replace session.downloadUrl host with our configured jmapUrl\n // (Stalwart may report an internal hostname unreachable from outside Docker)\n try {\n const parsed = new URL(downloadUrl)\n const configured = new URL(this.jmapUrl)\n parsed.protocol = configured.protocol\n parsed.host = configured.host\n downloadUrl = parsed.toString()\n } catch {\n // If URL parsing fails, use the template as-is\n }\n\n const safeFilename = filename ?? 'attachment'\n downloadUrl = downloadUrl\n .replace(/\\{accountId\\}|%7BaccountId%7D/gi, encodeURIComponent(accountId))\n .replace(/\\{blobId\\}|%7BblobId%7D/gi, encodeURIComponent(blobId))\n .replace(/\\{name\\}|%7Bname%7D/gi, encodeURIComponent(safeFilename))\n .replace(/\\{type\\}|%7Btype%7D/gi, 'application/octet-stream')\n\n // Retry with exponential backoff \u2014 the blob may not be immediately available\n // after the result email is observed (store/index write delay).\n const maxAttempts = 8\n let lastStatus: number | null = null\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const res = await fetch(downloadUrl, {\n headers: { Authorization: this.getAuthHeader() },\n })\n lastStatus = res.status\n if (res.ok) {\n const arrayBuffer = await res.arrayBuffer()\n return Buffer.from(arrayBuffer)\n }\n if (attempt < maxAttempts && (res.status === 404 || res.status === 429 || res.status === 503)) {\n console.warn(\n `[AAMP-SDK] blob download retry status=${res.status} attempt=${attempt}/${maxAttempts} url=${downloadUrl}`,\n )\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 15000) // 1s, 2s, 4s, 8s, 15s...\n await new Promise(r => setTimeout(r, delay))\n continue\n }\n console.error(\n `[AAMP-SDK] blob download failed status=${res.status} attempt=${attempt}/${maxAttempts} url=${downloadUrl}`,\n )\n throw new Error(\n `Blob download failed: status=${res.status} attempt=${attempt}/${maxAttempts} blobId=${blobId} filename=${filename ?? 'attachment'} url=${downloadUrl}`,\n )\n }\n throw new Error(\n `Blob download failed after retries: status=${lastStatus ?? 'unknown'} attempt=${maxAttempts}/${maxAttempts} blobId=${blobId} filename=${filename ?? 'attachment'} url=${downloadUrl}`,\n )\n }\n\n /**\n * Actively reconcile recent mailbox contents via JMAP HTTP.\n * Useful as a safety net when the WebSocket stays \"connected\"\n * but a notification is missed by an intermediate layer.\n */\n async reconcileRecentEmails(limit = 20): Promise<number> {\n if (!this.session) {\n this.session = await this.fetchSession()\n }\n\n const accountId = this.session.primaryAccounts['urn:ietf:params:jmap:mail']\n ?? Object.keys(this.session.accounts)[0]\n\n if (!accountId) {\n throw new Error('No mail account available in JMAP session')\n }\n\n const queryResp = await this.jmapCall([\n [\n 'Email/query',\n {\n accountId,\n sort: [{ property: 'receivedAt', isAscending: false }],\n limit,\n },\n 'qReconcile',\n ],\n ])\n\n const queryResult = queryResp.methodResponses.find(([name]) => name === 'Email/query')\n if (!queryResult) return 0\n\n const ids = ((queryResult[1] as { ids?: string[] }).ids ?? []).slice(0, limit)\n if (ids.length === 0) return 0\n\n const emailResp = await this.jmapCall([\n [\n 'Email/get',\n {\n accountId,\n ids,\n properties: ['id', 'subject', 'from', 'to', 'headers', 'messageId', 'receivedAt', 'textBody', 'bodyValues', 'attachments'],\n fetchTextBodyValues: true,\n maxBodyValueBytes: 262144,\n },\n 'gReconcile',\n ],\n ])\n\n const getResult = emailResp.methodResponses.find(([name]) => name === 'Email/get')\n if (!getResult) return 0\n\n const emails = (getResult[1] as { list?: JmapEmail[] }).list ?? []\n for (const email of emails.sort((a, b) => {\n const aTs = new Date(a.receivedAt).getTime()\n const bTs = new Date(b.receivedAt).getTime()\n return aTs - bTs\n })) {\n if (!this.shouldProcessBootstrapEmail(email)) continue\n this.processEmail(email)\n }\n\n return emails.length\n }\n}\n", "/**\n * AAMP SDK Type Definitions\n */\n\nexport type AampIntent = 'task.dispatch' | 'task.result' | 'task.help' | 'task.ack'\n\nexport type TaskStatus =\n | 'pending'\n | 'running'\n | 'completed'\n | 'rejected'\n | 'failed'\n | 'timeout'\n | 'help_needed'\n\n// =====================================================\n// AAMP Header constants\n// =====================================================\nexport const AAMP_HEADER = {\n INTENT: 'X-AAMP-Intent',\n TASK_ID: 'X-AAMP-TaskId',\n TIMEOUT: 'X-AAMP-Timeout',\n CONTEXT_LINKS: 'X-AAMP-ContextLinks',\n DISPATCH_CONTEXT: 'X-AAMP-Dispatch-Context',\n STATUS: 'X-AAMP-Status',\n OUTPUT: 'X-AAMP-Output',\n ERROR_MSG: 'X-AAMP-ErrorMsg',\n STRUCTURED_RESULT: 'X-AAMP-StructuredResult',\n QUESTION: 'X-AAMP-Question',\n BLOCKED_REASON: 'X-AAMP-BlockedReason',\n SUGGESTED_OPTIONS: 'X-AAMP-SuggestedOptions',\n PARENT_TASK_ID: 'X-AAMP-ParentTaskId',\n} as const\n\nexport interface StructuredResultField {\n fieldKey: string\n fieldTypeKey: string\n value?: unknown\n fieldAlias?: string\n index?: string\n attachmentFilenames?: string[]\n}\n\n// =====================================================\n// Parsed AAMP headers for task.dispatch\n// =====================================================\nexport interface TaskDispatch {\n intent: 'task.dispatch'\n taskId: string\n title: string\n timeoutSecs: number\n contextLinks: string[]\n dispatchContext?: Record<string, string>\n parentTaskId?: string\n // Email metadata\n from: string\n to: string\n messageId: string\n subject: string\n /** Plain-text body of the email (task description) */\n bodyText: string\n /** Attachments received with this dispatch (use blobId to download) */\n attachments?: ReceivedAttachment[]\n}\n\n// =====================================================\n// Parsed AAMP headers for task.result\n// =====================================================\nexport interface TaskResult {\n intent: 'task.result'\n taskId: string\n status: 'completed' | 'rejected'\n output: string\n errorMsg?: string\n structuredResult?: StructuredResultField[]\n from: string\n to: string\n messageId?: string\n /** True when the reply came from a standard email client (no X-AAMP-Intent header).\n * taskId was resolved via In-Reply-To \u2192 Message-ID reverse lookup. */\n isHumanReply?: boolean\n /** Attachments received with this result (use blobId to download) */\n attachments?: ReceivedAttachment[]\n}\n\n// =====================================================\n// Human reply via standard email client (no AAMP headers)\n// Emitted as 'reply' event when an email has In-Reply-To but no X-AAMP-Intent.\n// The application layer is responsible for resolving inReplyTo \u2192 taskId\n// (e.g. via Redis reverse index) and deciding how to handle it.\n// =====================================================\nexport interface HumanReply {\n /** Message-ID of the email being replied to \u2014 use this to look up the taskId */\n inReplyTo: string\n /** This reply email's own Message-ID */\n messageId: string\n from: string\n to: string\n subject: string\n /** Plain-text body of the reply */\n bodyText: string\n}\n\n// =====================================================\n// Parsed AAMP headers for task.help\n// =====================================================\nexport interface TaskHelp {\n intent: 'task.help'\n taskId: string\n question: string\n blockedReason: string\n suggestedOptions: string[]\n from: string\n to: string\n messageId?: string\n}\n\n// =====================================================\n// Parsed AAMP headers for task.ack\n// =====================================================\nexport interface TaskAck {\n intent: 'task.ack'\n taskId: string\n from: string\n to: string\n messageId?: string\n}\n\n// =====================================================\n// Attachment types\n// =====================================================\n\n/** Attachment for sending (binary content) */\nexport interface AampAttachment {\n filename: string\n contentType: string\n content: Buffer | string // Buffer for binary, base64 string for REST API\n size?: number\n}\n\n/** Attachment metadata received via JMAP (use blobId to download) */\nexport interface ReceivedAttachment {\n filename: string\n contentType: string\n size: number\n blobId: string\n}\n\nexport type AampMessage = TaskDispatch | TaskResult | TaskHelp | TaskAck | HumanReply\n\n// =====================================================\n// SDK Configuration\n// =====================================================\nexport interface AampClientConfig {\n /** Node email address, e.g. codereviewer-abc123@aamp.yourdomain.com */\n email: string\n\n /** Base64(email:smtpPassword) \u2014 returned by management service on agent creation */\n jmapToken: string\n\n /** Stalwart base URL, e.g. http://localhost:8080 */\n jmapUrl: string\n\n /** Optional HTTP send base URL. Defaults to jmapUrl and is used for same-domain send fallback via /api/send. */\n httpSendBaseUrl?: string\n\n /** SMTP submission host */\n smtpHost: string\n\n /** SMTP submission port (default: 587) */\n smtpPort?: number\n\n /** SMTP password (returned by management service on agent creation) */\n smtpPassword: string\n\n /** How often to retry failed JMAP connection (ms, default: 5000) */\n reconnectInterval?: number\n\n /** Whether to reject unauthorized TLS certificates (default: true).\n * Set to false only for development with self-signed certificates. */\n rejectUnauthorized?: boolean\n}\n\n// =====================================================\n// Options for sending emails\n// =====================================================\nexport interface SendTaskOptions {\n /** Target node email */\n to: string\n title: string\n bodyText?: string\n timeoutSecs?: number\n contextLinks?: string[]\n dispatchContext?: Record<string, string>\n parentTaskId?: string\n /** Attachments to include with the dispatch email */\n attachments?: AampAttachment[]\n}\n\nexport interface SendResultOptions {\n /** Send to: the original from address of the dispatch email */\n to: string\n taskId: string\n status: 'completed' | 'rejected'\n output: string\n errorMsg?: string\n structuredResult?: StructuredResultField[]\n /** Message-ID of the dispatch email, for In-Reply-To threading */\n inReplyTo?: string\n /** Attachments to include with the result email */\n attachments?: AampAttachment[]\n}\n\nexport interface SendHelpOptions {\n /** Send to: the original from address of the dispatch email */\n to: string\n taskId: string\n question: string\n blockedReason: string\n suggestedOptions: string[]\n /** Message-ID of the dispatch email, for In-Reply-To threading */\n inReplyTo?: string\n /** Attachments to include with the help email */\n attachments?: AampAttachment[]\n}\n\n// =====================================================\n// Event emitter types\n// =====================================================\nexport interface AampClientEvents {\n 'task.dispatch': (task: TaskDispatch) => void\n 'task.result': (result: TaskResult) => void\n 'task.help': (help: TaskHelp) => void\n 'task.ack': (ack: TaskAck) => void\n /** Emitted when a standard email reply (no X-AAMP headers) is received for a known thread.\n * Use inReplyTo to look up the taskId in your own store (Redis / DB). */\n 'reply': (reply: HumanReply) => void\n connected: () => void\n disconnected: (reason: string) => void\n error: (err: Error) => void\n}\n", "/**\n * AAMP Header Parser\n *\n * Parses AAMP protocol headers from email messages.\n * Works with both raw header objects and JMAP Email objects.\n *\n * Headers are case-insensitive; we normalize to lowercase for lookup.\n */\n\nimport { AAMP_HEADER, type AampMessage, type TaskDispatch, type TaskResult, type TaskHelp, type TaskAck } from './types.js'\n\ntype RawHeaders = Record<string, string | string[]>\n\nfunction decodeMimeEncodedWordSegment(segment: string): string {\n const match = /^=\\?([^?]+)\\?([bBqQ])\\?([^?]*)\\?=$/.exec(segment)\n if (!match) return segment\n\n const [, charsetRaw, encodingRaw, body] = match\n const charset = charsetRaw.toLowerCase()\n const encoding = encodingRaw.toUpperCase()\n\n try {\n if (encoding === 'B') {\n const buf = Buffer.from(body, 'base64')\n return buf.toString(charset === 'utf-8' || charset === 'utf8' ? 'utf8' : 'utf8')\n }\n\n const normalized = body\n .replace(/_/g, ' ')\n .replace(/=([0-9A-Fa-f]{2})/g, (_, hex: string) =>\n String.fromCharCode(parseInt(hex, 16)),\n )\n const bytes = Buffer.from(normalized, 'binary')\n return bytes.toString(charset === 'utf-8' || charset === 'utf8' ? 'utf8' : 'utf8')\n } catch {\n return segment\n }\n}\n\nfunction decodeMimeEncodedWords(value?: string): string {\n if (!value || !value.includes('=?')) return value ?? ''\n const collapsed = value.replace(/\\r?\\n[ \\t]+/g, ' ')\n const decoded = collapsed.replace(/=\\?[^?]+\\?[bBqQ]\\?[^?]*\\?=/g, (segment) =>\n decodeMimeEncodedWordSegment(segment),\n )\n return decoded.replace(/\\s{2,}/g, ' ').trim()\n}\n\n/**\n * Normalize a header map to lowercase keys with string values\n */\nexport function normalizeHeaders(headers: RawHeaders): Record<string, string> {\n return Object.fromEntries(\n Object.entries(headers).map(([k, v]) => [\n k.toLowerCase(),\n Array.isArray(v) ? v[0] : v,\n ]),\n )\n}\n\n/**\n * Get a header value by its X-AAMP-* name (case-insensitive)\n */\nfunction getAampHeader(\n headers: Record<string, string>,\n headerName: string,\n): string | undefined {\n return headers[headerName.toLowerCase()]\n}\n\nconst DISPATCH_CONTEXT_KEY_RE = /^[a-z0-9_-]+$/\n\nexport function parseDispatchContextHeader(value?: string): Record<string, string> | undefined {\n if (!value) return undefined\n const context: Record<string, string> = {}\n\n for (const part of value.split(';')) {\n const segment = part.trim()\n if (!segment) continue\n const eqIdx = segment.indexOf('=')\n if (eqIdx <= 0) continue\n const rawKey = segment.slice(0, eqIdx).trim()\n const rawValue = segment.slice(eqIdx + 1).trim()\n if (!DISPATCH_CONTEXT_KEY_RE.test(rawKey)) continue\n try {\n context[rawKey] = decodeURIComponent(rawValue)\n } catch {\n context[rawKey] = rawValue\n }\n }\n\n return Object.keys(context).length ? context : undefined\n}\n\nexport function serializeDispatchContextHeader(context?: Record<string, string>): string | undefined {\n if (!context) return undefined\n const parts = Object.entries(context)\n .flatMap(([key, value]) => {\n const normalizedKey = key.trim().toLowerCase()\n if (!DISPATCH_CONTEXT_KEY_RE.test(normalizedKey)) return []\n const normalizedValue = String(value ?? '').trim()\n if (!normalizedValue) return []\n return `${normalizedKey}=${encodeURIComponent(normalizedValue)}`\n })\n return parts.length ? parts.join('; ') : undefined\n}\n\nfunction decodeStructuredResult(value?: string): TaskResult['structuredResult'] | undefined {\n if (!value) return undefined\n try {\n const normalized = value.replace(/-/g, '+').replace(/_/g, '/')\n const padding = normalized.length % 4 === 0 ? '' : '='.repeat(4 - (normalized.length % 4))\n const decoded = Buffer.from(normalized + padding, 'base64').toString('utf-8')\n return JSON.parse(decoded) as TaskResult['structuredResult']\n } catch {\n return undefined\n }\n}\n\nfunction encodeStructuredResult(value?: TaskResult['structuredResult']): string | undefined {\n if (!value) return undefined\n const json = JSON.stringify(value)\n return Buffer.from(json, 'utf-8')\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/g, '')\n}\n\nexport interface EmailMetadata {\n from: string\n to: string\n messageId: string\n subject: string\n headers: RawHeaders\n}\n\n/**\n * Parse AAMP headers from an email's header map.\n * Returns null if this email is not an AAMP message.\n *\n * @param meta - Email metadata (from, to, messageId, subject, headers)\n */\nexport function parseAampHeaders(meta: EmailMetadata): AampMessage | null {\n const headers = normalizeHeaders(meta.headers)\n\n const intent = getAampHeader(headers, AAMP_HEADER.INTENT)\n const taskId = getAampHeader(headers, AAMP_HEADER.TASK_ID)\n\n if (!intent || !taskId) return null\n\n const from = meta.from.replace(/^<|>$/g, '')\n const to = meta.to.replace(/^<|>$/g, '')\n const decodedSubject = decodeMimeEncodedWords(meta.subject)\n\n if (intent === 'task.dispatch') {\n const timeoutStr = getAampHeader(headers, AAMP_HEADER.TIMEOUT) ?? '300'\n const contextLinksStr = getAampHeader(headers, AAMP_HEADER.CONTEXT_LINKS) ?? ''\n const dispatchContext = parseDispatchContextHeader(\n getAampHeader(headers, AAMP_HEADER.DISPATCH_CONTEXT),\n )\n\n const parentTaskId = getAampHeader(headers, AAMP_HEADER.PARENT_TASK_ID)\n\n const dispatch: TaskDispatch = {\n intent: 'task.dispatch',\n taskId,\n title: decodedSubject.replace(/^\\[AAMP Task\\]\\s*/, '').trim() || 'Untitled Task',\n timeoutSecs: parseInt(timeoutStr, 10) || 300,\n contextLinks: contextLinksStr\n ? contextLinksStr.split(',').map((s) => s.trim()).filter(Boolean)\n : [],\n ...(dispatchContext ? { dispatchContext } : {}),\n ...(parentTaskId ? { parentTaskId } : {}),\n from,\n to,\n messageId: meta.messageId,\n subject: meta.subject,\n bodyText: '', // filled in by jmap-push.ts after parsing\n }\n return dispatch\n }\n\n if (intent === 'task.result') {\n const status = (getAampHeader(headers, AAMP_HEADER.STATUS) ?? 'completed') as\n | 'completed'\n | 'rejected'\n const output = getAampHeader(headers, AAMP_HEADER.OUTPUT) ?? ''\n const errorMsg = getAampHeader(headers, AAMP_HEADER.ERROR_MSG)\n const structuredResult = decodeStructuredResult(\n getAampHeader(headers, AAMP_HEADER.STRUCTURED_RESULT),\n )\n\n const result: TaskResult = {\n intent: 'task.result',\n taskId,\n status,\n output: decodeMimeEncodedWords(output),\n errorMsg: errorMsg ? decodeMimeEncodedWords(errorMsg) : errorMsg,\n structuredResult,\n from,\n to,\n messageId: meta.messageId,\n }\n return result\n }\n\n if (intent === 'task.help') {\n const question = getAampHeader(headers, AAMP_HEADER.QUESTION) ?? ''\n const blockedReason = getAampHeader(headers, AAMP_HEADER.BLOCKED_REASON) ?? ''\n const suggestedOptionsStr = getAampHeader(headers, AAMP_HEADER.SUGGESTED_OPTIONS) ?? ''\n\n const help: TaskHelp = {\n intent: 'task.help',\n taskId,\n question: decodeMimeEncodedWords(question),\n blockedReason: decodeMimeEncodedWords(blockedReason),\n suggestedOptions: suggestedOptionsStr\n ? suggestedOptionsStr.split('|').map((s) => decodeMimeEncodedWords(s.trim())).filter(Boolean)\n : [],\n from,\n to,\n messageId: meta.messageId,\n }\n return help\n }\n\n if (intent === 'task.ack') {\n const ack: TaskAck = {\n intent: 'task.ack',\n taskId,\n from,\n to,\n messageId: meta.messageId,\n }\n return ack\n }\n\n return null\n}\n\n/**\n * Build AAMP headers for a task.dispatch email\n */\nexport function buildDispatchHeaders(params: {\n taskId: string\n /** Omit or pass undefined/null to send without a deadline */\n timeoutSecs?: number | null\n contextLinks: string[]\n dispatchContext?: Record<string, string>\n parentTaskId?: string\n}): Record<string, string> {\n const headers: Record<string, string> = {\n [AAMP_HEADER.INTENT]: 'task.dispatch',\n [AAMP_HEADER.TASK_ID]: params.taskId,\n }\n if (params.timeoutSecs != null) {\n headers[AAMP_HEADER.TIMEOUT] = String(params.timeoutSecs)\n }\n if (params.contextLinks.length > 0) {\n headers[AAMP_HEADER.CONTEXT_LINKS] = params.contextLinks.join(',')\n }\n const dispatchContext = serializeDispatchContextHeader(params.dispatchContext)\n if (dispatchContext) {\n headers[AAMP_HEADER.DISPATCH_CONTEXT] = dispatchContext\n }\n if (params.parentTaskId) {\n headers[AAMP_HEADER.PARENT_TASK_ID] = params.parentTaskId\n }\n return headers\n}\n\n/**\n * Build AAMP headers for a task.ack email\n */\nexport function buildAckHeaders(opts: { taskId: string }): Record<string, string> {\n return {\n [AAMP_HEADER.INTENT]: 'task.ack',\n [AAMP_HEADER.TASK_ID]: opts.taskId,\n }\n}\n\n/**\n * Build AAMP headers for a task.result email\n */\nexport function buildResultHeaders(params: {\n taskId: string\n status: 'completed' | 'rejected'\n output: string\n errorMsg?: string\n structuredResult?: TaskResult['structuredResult']\n}): Record<string, string> {\n const headers: Record<string, string> = {\n [AAMP_HEADER.INTENT]: 'task.result',\n [AAMP_HEADER.TASK_ID]: params.taskId,\n [AAMP_HEADER.STATUS]: params.status,\n [AAMP_HEADER.OUTPUT]: params.output,\n }\n if (params.errorMsg) {\n headers[AAMP_HEADER.ERROR_MSG] = params.errorMsg\n }\n const structuredResult = encodeStructuredResult(params.structuredResult)\n if (structuredResult) {\n headers[AAMP_HEADER.STRUCTURED_RESULT] = structuredResult\n }\n return headers\n}\n\n/**\n * Build AAMP headers for a task.help email\n */\nexport function buildHelpHeaders(params: {\n taskId: string\n question: string\n blockedReason: string\n suggestedOptions: string[]\n}): Record<string, string> {\n return {\n [AAMP_HEADER.INTENT]: 'task.help',\n [AAMP_HEADER.TASK_ID]: params.taskId,\n [AAMP_HEADER.QUESTION]: params.question,\n [AAMP_HEADER.BLOCKED_REASON]: params.blockedReason,\n [AAMP_HEADER.SUGGESTED_OPTIONS]: params.suggestedOptions.join('|'),\n }\n}\n", "type Listener = (...args: unknown[]) => void\ntype EventListener<Events, K extends keyof Events> =\n Extract<Events[K], (...args: any[]) => void>\ntype EventArgs<Events, K extends keyof Events> =\n EventListener<Events, K> extends (...args: infer A) => void ? A : never\n\nexport class TinyEmitter<Events extends object> {\n private readonly listeners = new Map<keyof Events, Set<Listener>>()\n private readonly onceWrappers = new WeakMap<Listener, Listener>()\n\n on<K extends keyof Events>(event: K, listener: EventListener<Events, K>): this {\n const bucket = this.listeners.get(event) ?? new Set<Listener>()\n bucket.add(listener as Listener)\n this.listeners.set(event, bucket)\n return this\n }\n\n once<K extends keyof Events>(event: K, listener: EventListener<Events, K>): this {\n const wrapped: Listener = (...args: unknown[]) => {\n this.off(event, listener)\n ;(listener as Listener)(...args)\n }\n this.onceWrappers.set(listener as Listener, wrapped)\n return this.on(event, wrapped as EventListener<Events, K>)\n }\n\n off<K extends keyof Events>(event: K, listener: EventListener<Events, K>): this {\n const bucket = this.listeners.get(event)\n if (!bucket) return this\n\n const original = listener as Listener\n const wrapped = this.onceWrappers.get(original)\n bucket.delete(wrapped ?? original)\n if (wrapped) this.onceWrappers.delete(original)\n if (bucket.size === 0) this.listeners.delete(event)\n return this\n }\n\n protected emit<K extends keyof Events>(event: K, ...args: EventArgs<Events, K>): boolean {\n const bucket = this.listeners.get(event)\n if (!bucket || bucket.size === 0) return false\n\n for (const listener of [...bucket]) {\n listener(...args)\n }\n return true\n }\n}\n", "/**\n * SMTP Sender\n *\n * Sends AAMP protocol emails via SMTP (Stalwart submission port 587).\n */\n\nimport { createTransport, type Transporter } from 'nodemailer'\nimport { randomUUID } from 'crypto'\n\n/** Strip CR/LF to prevent email header injection */\nconst sanitize = (s: string) => s.replace(/[\\r\\n]/g, ' ').trim()\nimport { buildDispatchHeaders, buildResultHeaders, buildHelpHeaders, buildAckHeaders } from './parser.js'\nimport type {\n SendTaskOptions,\n SendResultOptions,\n SendHelpOptions,\n} from './types.js'\n\nexport interface SmtpConfig {\n host: string\n port: number\n user: string\n password: string\n httpBaseUrl?: string\n authToken?: string\n secure?: boolean\n /** Whether to reject unauthorized TLS certificates (default: true) */\n rejectUnauthorized?: boolean\n}\n\nexport class SmtpSender {\n private transport: Transporter\n\n constructor(private readonly config: SmtpConfig) {\n this.transport = createTransport({\n host: config.host,\n port: config.port,\n secure: config.secure ?? false,\n auth: {\n user: config.user,\n pass: config.password,\n },\n tls: {\n rejectUnauthorized: config.rejectUnauthorized ?? true,\n },\n })\n }\n\n private senderDomain(): string {\n return this.config.user.split('@')[1]?.toLowerCase() ?? ''\n }\n\n private recipientDomain(email: string): string {\n return email.split('@')[1]?.toLowerCase() ?? ''\n }\n\n private shouldUseHttpFallback(to: string): boolean {\n return Boolean(\n this.config.httpBaseUrl\n && this.config.authToken\n && this.senderDomain()\n && this.senderDomain() === this.recipientDomain(to),\n )\n }\n\n private async sendViaHttp(opts: {\n to: string\n subject: string\n text: string\n aampHeaders: Record<string, string>\n attachments?: Array<{ filename: string; contentType: string; content: Buffer | string }>\n }): Promise<{ messageId?: string }> {\n const base = this.config.httpBaseUrl?.replace(/\\/$/, '')\n if (!base || !this.config.authToken) {\n throw new Error('HTTP send fallback is not configured')\n }\n\n const res = await fetch(`${base}/api/send`, {\n method: 'POST',\n headers: {\n Authorization: `Basic ${this.config.authToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n to: opts.to,\n subject: opts.subject,\n text: opts.text,\n aampHeaders: opts.aampHeaders,\n attachments: opts.attachments?.map((a) => ({\n filename: a.filename,\n contentType: a.contentType,\n content: typeof a.content === 'string' ? a.content : a.content.toString('base64'),\n })),\n }),\n })\n\n const data = await res.json().catch(() => ({})) as { details?: string; messageId?: string }\n if (!res.ok) {\n throw new Error(data.details || `HTTP send failed: ${res.status}`)\n }\n return { messageId: data.messageId }\n }\n\n /**\n * Send a task.dispatch email.\n * Returns both the generated taskId and the SMTP Message-ID so callers can\n * store a reverse-index (messageId \u2192 taskId) for In-Reply-To thread routing.\n */\n async sendTask(opts: SendTaskOptions): Promise<{ taskId: string; messageId: string }> {\n const taskId = randomUUID()\n const aampHeaders = buildDispatchHeaders({\n taskId,\n timeoutSecs: opts.timeoutSecs,\n contextLinks: opts.contextLinks ?? [],\n parentTaskId: opts.parentTaskId,\n })\n\n const sendMailOpts: Record<string, unknown> = {\n from: this.config.user,\n to: opts.to,\n subject: `[AAMP Task] ${sanitize(opts.title)}`,\n text: [\n `Task: ${opts.title}`,\n `Task ID: ${taskId}`,\n opts.timeoutSecs ? `Deadline: ${opts.timeoutSecs}s` : `Deadline: none`,\n opts.contextLinks?.length\n ? `Context:\\n${opts.contextLinks.map((l) => ` ${l}`).join('\\n')}`\n : '',\n opts.bodyText ?? '',\n ``,\n `--- This email was sent by AAMP. Reply directly to submit your result. ---`,\n ]\n .filter(Boolean)\n .join('\\n'),\n headers: aampHeaders,\n }\n\n if (opts.attachments?.length) {\n sendMailOpts.attachments = opts.attachments.map(a => ({\n filename: a.filename,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n contentType: a.contentType,\n }))\n }\n\n if (this.shouldUseHttpFallback(opts.to)) {\n const info = await this.sendViaHttp({\n to: opts.to,\n subject: sendMailOpts.subject as string,\n text: sendMailOpts.text as string,\n aampHeaders,\n attachments: opts.attachments?.map(a => ({\n filename: a.filename,\n contentType: a.contentType,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n })),\n })\n return { taskId, messageId: info.messageId ?? '' }\n }\n\n const info = await this.transport.sendMail(sendMailOpts)\n\n return { taskId, messageId: info.messageId ?? '' }\n }\n\n /**\n * Send a task.result email back to the dispatcher\n */\n async sendResult(opts: SendResultOptions): Promise<void> {\n const aampHeaders = buildResultHeaders({\n taskId: opts.taskId,\n status: opts.status,\n output: opts.output,\n errorMsg: opts.errorMsg,\n structuredResult: opts.structuredResult,\n })\n\n const mailOpts: Record<string, unknown> = {\n from: this.config.user,\n to: opts.to,\n subject: `[AAMP Result] Task ${opts.taskId} \u2014 ${opts.status}`,\n text: [\n `AAMP Task Result`,\n ``,\n `Task ID: ${opts.taskId}`,\n `Status: ${opts.status}`,\n ``,\n `Output:`,\n opts.output,\n opts.errorMsg ? `\\nError: ${opts.errorMsg}` : '',\n ]\n .filter((s) => s !== '')\n .join('\\n'),\n headers: aampHeaders,\n }\n if (opts.inReplyTo) {\n mailOpts.inReplyTo = opts.inReplyTo\n mailOpts.references = opts.inReplyTo\n }\n if (opts.attachments?.length) {\n mailOpts.attachments = opts.attachments.map(a => ({\n filename: a.filename,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n contentType: a.contentType,\n }))\n }\n\n if (this.shouldUseHttpFallback(opts.to)) {\n await this.sendViaHttp({\n to: opts.to,\n subject: mailOpts.subject as string,\n text: mailOpts.text as string,\n aampHeaders,\n attachments: opts.attachments?.map(a => ({\n filename: a.filename,\n contentType: a.contentType,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n })),\n })\n return\n }\n await this.transport.sendMail(mailOpts)\n }\n\n /**\n * Send a task.help email when the agent is blocked\n */\n async sendHelp(opts: SendHelpOptions): Promise<void> {\n const aampHeaders = buildHelpHeaders({\n taskId: opts.taskId,\n question: opts.question,\n blockedReason: opts.blockedReason,\n suggestedOptions: opts.suggestedOptions,\n })\n\n const helpMailOpts: Record<string, unknown> = {\n from: this.config.user,\n to: opts.to,\n subject: `[AAMP Help] Task ${opts.taskId} needs assistance`,\n text: [\n `AAMP Task Help Request`,\n ``,\n `Task ID: ${opts.taskId}`,\n ``,\n `Question: ${opts.question}`,\n ``,\n `Blocked reason: ${opts.blockedReason}`,\n ``,\n opts.suggestedOptions.length\n ? `Suggested options:\\n${opts.suggestedOptions.map((o, i) => ` ${i + 1}. ${o}`).join('\\n')}`\n : '',\n ]\n .filter(Boolean)\n .join('\\n'),\n headers: aampHeaders,\n }\n if (opts.inReplyTo) {\n helpMailOpts.inReplyTo = opts.inReplyTo\n helpMailOpts.references = opts.inReplyTo\n }\n if (opts.attachments?.length) {\n helpMailOpts.attachments = opts.attachments.map(a => ({\n filename: a.filename,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n contentType: a.contentType,\n }))\n }\n\n if (this.shouldUseHttpFallback(opts.to)) {\n await this.sendViaHttp({\n to: opts.to,\n subject: helpMailOpts.subject as string,\n text: helpMailOpts.text as string,\n aampHeaders,\n attachments: opts.attachments?.map(a => ({\n filename: a.filename,\n contentType: a.contentType,\n content: typeof a.content === 'string' ? Buffer.from(a.content, 'base64') : a.content,\n })),\n })\n return\n }\n await this.transport.sendMail(helpMailOpts)\n }\n\n /**\n * Send a task.ack email to confirm receipt of a dispatch\n */\n async sendAck(opts: { to: string; taskId: string; inReplyTo?: string }): Promise<void> {\n const aampHeaders = buildAckHeaders({ taskId: opts.taskId })\n const mailOpts: Record<string, unknown> = {\n from: this.config.user,\n to: opts.to,\n subject: `[AAMP ACK] Task ${opts.taskId}`,\n text: '',\n headers: aampHeaders,\n }\n if (opts.inReplyTo) {\n mailOpts.inReplyTo = opts.inReplyTo\n mailOpts.references = opts.inReplyTo\n }\n\n if (this.shouldUseHttpFallback(opts.to)) {\n await this.sendViaHttp({\n to: opts.to,\n subject: mailOpts.subject as string,\n text: mailOpts.text as string,\n aampHeaders,\n })\n return\n }\n await this.transport.sendMail(mailOpts)\n }\n\n /**\n * Verify SMTP connection\n */\n async verify(): Promise<boolean> {\n try {\n await this.transport.verify()\n return true\n } catch {\n return false\n }\n }\n\n close(): void {\n this.transport.close()\n }\n}\n", "/**\n * AampClient \u2014 Main SDK entry point\n *\n * Combines JMAP WebSocket Push (receive) + SMTP (send) into a single client.\n *\n * Usage:\n *\n * ```typescript\n * const client = new AampClient({\n * email: 'codereviewer-abc@aamp.example.com',\n * jmapToken: '<base64-token>',\n * jmapUrl: 'http://localhost:8080',\n * smtpHost: 'localhost',\n * smtpPort: 587,\n * smtpPassword: 'agent-smtp-password',\n * })\n *\n * // Listen for incoming tasks\n * client.on('task.dispatch', async (task) => {\n * const result = await doWork(task)\n * await client.sendResult({\n * to: task.from,\n * taskId: task.taskId,\n * status: 'completed',\n * output: result,\n * })\n * })\n *\n * await client.connect()\n * ```\n */\n\nimport { JmapPushClient } from './jmap-push.js'\nimport { SmtpSender } from './smtp-sender.js'\nimport { TinyEmitter } from './tiny-emitter.js'\nimport type {\n AampClientConfig,\n AampClientEvents,\n TaskDispatch,\n TaskResult,\n TaskHelp,\n TaskAck,\n HumanReply,\n SendTaskOptions,\n SendResultOptions,\n SendHelpOptions,\n} from './types.js'\n\nexport class AampClient extends TinyEmitter<AampClientEvents> {\n private jmapClient: JmapPushClient\n private smtpSender: SmtpSender\n private readonly config: AampClientConfig\n\n constructor(config: AampClientConfig) {\n super()\n this.config = config\n\n // Decode JMAP token (format: base64(email:password))\n let password: string\n try {\n const decoded = Buffer.from(config.jmapToken, 'base64').toString('utf-8')\n const colonIdx = decoded.indexOf(':')\n if (colonIdx < 0) throw new Error('Invalid jmapToken format: expected base64(email:password)')\n password = decoded.slice(colonIdx + 1)\n if (!password) throw new Error('Invalid jmapToken: empty password')\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('Invalid jmapToken')) throw err\n throw new Error(`Failed to decode jmapToken: ${(err as Error).message}`)\n }\n\n this.jmapClient = new JmapPushClient({\n email: config.email,\n password: password ?? config.smtpPassword,\n jmapUrl: config.jmapUrl,\n reconnectInterval: config.reconnectInterval ?? 5000,\n rejectUnauthorized: config.rejectUnauthorized,\n })\n\n this.smtpSender = new SmtpSender({\n host: config.smtpHost,\n port: config.smtpPort ?? 587,\n user: config.email,\n password: config.smtpPassword,\n httpBaseUrl: config.httpSendBaseUrl ?? config.jmapUrl,\n authToken: config.jmapToken,\n rejectUnauthorized: config.rejectUnauthorized,\n })\n\n // Forward JMAP events to this emitter\n this.jmapClient.on('task.dispatch', (task: TaskDispatch) => {\n this.emit('task.dispatch', task)\n })\n\n this.jmapClient.on('task.result', (result: TaskResult) => {\n this.emit('task.result', result)\n })\n\n this.jmapClient.on('task.help', (help: TaskHelp) => {\n this.emit('task.help', help)\n })\n\n this.jmapClient.on('task.ack', (ack: TaskAck) => {\n this.emit('task.ack', ack)\n })\n\n // Auto-ACK: when a task.dispatch is received, automatically send an ACK back\n this.jmapClient.on('_autoAck', async ({ to, taskId, messageId }: { to: string; taskId: string; messageId: string }) => {\n try {\n await this.smtpSender.sendAck({ to, taskId, inReplyTo: messageId })\n } catch (err) {\n console.warn(`[AAMP] Failed to send ACK for task ${taskId}: ${(err as Error).message}`)\n }\n })\n\n this.jmapClient.on('reply', (reply: HumanReply) => {\n this.emit('reply', reply)\n })\n\n this.jmapClient.on('connected', () => {\n this.emit('connected')\n })\n\n this.jmapClient.on('disconnected', (reason: string) => {\n this.emit('disconnected', reason)\n })\n\n this.jmapClient.on('error', (err: Error) => {\n this.emit('error', err)\n })\n }\n\n // =====================================================\n // Lifecycle\n // =====================================================\n\n /**\n * Connect to JMAP and start listening for tasks\n */\n async connect(): Promise<void> {\n await this.jmapClient.start()\n }\n\n /**\n * Disconnect and clean up\n */\n disconnect(): void {\n this.jmapClient.stop()\n this.smtpSender.close()\n }\n\n /**\n * Returns true if the JMAP connection is active\n */\n isConnected(): boolean {\n return this.jmapClient.isConnected()\n }\n\n isUsingPollingFallback(): boolean {\n return this.jmapClient.isUsingPollingFallback()\n }\n\n // =====================================================\n // Sending\n // =====================================================\n\n /**\n * Send a task.dispatch email to an agent.\n * Returns the generated taskId and the SMTP Message-ID.\n * Store messageId \u2192 taskId in Redis/DB to support In-Reply-To thread routing\n * for human replies that arrive without X-AAMP headers.\n */\n async sendTask(opts: SendTaskOptions): Promise<{ taskId: string; messageId: string }> {\n return this.smtpSender.sendTask(opts)\n }\n\n /**\n * Send a task.result email (agent \u2192 system/dispatcher)\n */\n async sendResult(opts: SendResultOptions): Promise<void> {\n return this.smtpSender.sendResult(opts)\n }\n\n /**\n * Send a task.help email when the agent needs human assistance\n */\n async sendHelp(opts: SendHelpOptions): Promise<void> {\n return this.smtpSender.sendHelp(opts)\n }\n\n /**\n * Download a blob (attachment) by its JMAP blobId.\n * Use this to retrieve attachment content from received TaskDispatch or TaskResult messages.\n * Returns the raw binary content as a Buffer.\n */\n async downloadBlob(blobId: string, filename?: string): Promise<Buffer> {\n return this.jmapClient.downloadBlob(blobId, filename)\n }\n\n /**\n * Reconcile recent mailbox contents via JMAP HTTP to catch messages missed by\n * a flaky WebSocket path. Safe to call periodically; duplicate processing is\n * suppressed by the JMAP push client.\n */\n async reconcileRecentEmails(limit?: number): Promise<number> {\n return this.jmapClient.reconcileRecentEmails(limit)\n }\n\n /**\n * Verify SMTP connectivity\n */\n async verifySmtp(): Promise<boolean> {\n return this.smtpSender.verify()\n }\n\n get email(): string {\n return this.config.email\n }\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { homedir } from 'node:os'\n\nexport interface Identity {\n email: string\n jmapToken: string\n smtpPassword: string\n}\n\nexport function defaultCredentialsPath(): string {\n return join(homedir(), '.openclaw', 'extensions', 'aamp-openclaw-plugin', '.credentials.json')\n}\n\nexport function loadCachedIdentity(file?: string): Identity | null {\n const resolved = file ?? defaultCredentialsPath()\n if (!existsSync(resolved)) return null\n try {\n const parsed = JSON.parse(readFileSync(resolved, 'utf-8')) as Partial<Identity>\n if (!parsed.email || !parsed.jmapToken || !parsed.smtpPassword) return null\n return parsed as Identity\n } catch {\n return null\n }\n}\n\nexport function saveCachedIdentity(identity: Identity, file?: string): void {\n const resolved = file ?? defaultCredentialsPath()\n mkdirSync(dirname(resolved), { recursive: true })\n writeFileSync(resolved, JSON.stringify(identity, null, 2), 'utf-8')\n}\n\nexport function ensureDir(dir: string): void {\n mkdirSync(dir, { recursive: true })\n}\n\nexport function readBinaryFile(path: string): Buffer {\n return readFileSync(path)\n}\n\nexport function writeBinaryFile(path: string, content: Uint8Array | Buffer): void {\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, content)\n}\n", "/**\n * @aamp/openclaw-plugin\n *\n * OpenClaw plugin that gives the agent an AAMP mailbox identity and lets it\n * receive, process, and reply to AAMP tasks \u2014 entirely through standard email.\n *\n * How it works:\n * 1. Plugin resolves or auto-registers an AAMP mailbox identity on startup.\n * 2. Credentials are cached to a local file so the same mailbox is reused\n * across gateway restarts (no re-registration needed).\n * 3. Background JMAP WebSocket Push receives incoming task.dispatch emails.\n * 4. Incoming tasks are stored in an in-memory pending-task queue.\n * 5. before_prompt_build injects the oldest pending task into the LLM's\n * system context so the agent sees it and acts without user prompting.\n * 6. The agent calls aamp_send_result or aamp_send_help to reply.\n *\n * OpenClaw config (openclaw.json):\n *\n * \"plugins\": {\n * \"entries\": {\n * \"aamp\": {\n * \"enabled\": true,\n * \"config\": {\n * \"aampHost\": \"https://meshmail.ai\",\n * \"slug\": \"openclaw-agent\",\n * \"credentialsFile\": \"/absolute/path/to/.aamp-credentials.json\"\n * }\n * }\n * }\n * }\n *\n * Install:\n * openclaw plugins install ./packages/openclaw-plugin\n */\n\nimport { AampClient } from '../../sdk/src/index.ts'\nimport type {\n TaskDispatch,\n TaskResult,\n TaskHelp,\n AampAttachment,\n ReceivedAttachment,\n} from '../../sdk/src/types.ts'\nimport {\n defaultCredentialsPath,\n ensureDir,\n loadCachedIdentity,\n readBinaryFile,\n saveCachedIdentity,\n writeBinaryFile,\n type Identity,\n} from './file-store.js'\n\n// \u2500\u2500\u2500 Shared runtime state (single instance per plugin lifetime) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface PendingTask {\n taskId: string\n from: string\n title: string\n bodyText: string\n contextLinks: string[]\n timeoutSecs: number\n messageId: string\n receivedAt: string // ISO-8601\n}\n\ninterface PluginConfig {\n /** e.g. \"meshmail.ai\" \u2014 all URLs are derived from this */\n aampHost: string\n slug?: string\n /** Absolute path to cache AAMP credentials. Default: ~/.openclaw/extensions/aamp-openclaw-plugin/.credentials.json */\n credentialsFile?: string\n senderPolicies?: SenderPolicy[]\n}\n\ninterface SenderPolicy {\n sender: string\n dispatchContextRules?: Record<string, string[]>\n}\n\nfunction matchSenderPolicy(\n task: TaskDispatch,\n senderPolicies: SenderPolicy[] | undefined,\n): { allowed: boolean; reason?: string } {\n if (!senderPolicies?.length) return { allowed: true }\n\n const sender = task.from.toLowerCase()\n const policy = senderPolicies.find((item) => item.sender.trim().toLowerCase() === sender)\n if (!policy) {\n return { allowed: false, reason: `sender ${task.from} is not allowed by senderPolicies` }\n }\n\n const rules = policy.dispatchContextRules\n if (!rules || Object.keys(rules).length === 0) {\n return { allowed: true }\n }\n\n const context = task.dispatchContext ?? {}\n const effectiveRules = Object.entries(rules)\n .map(([key, allowedValues]) => [\n key,\n (allowedValues ?? []).map((value) => value.trim()).filter(Boolean),\n ] as const)\n .filter(([, allowedValues]) => allowedValues.length > 0)\n\n if (effectiveRules.length === 0) {\n return { allowed: true }\n }\n\n for (const [key, allowedValues] of effectiveRules) {\n const contextValue = context[key]\n if (!contextValue) {\n return { allowed: false, reason: `dispatchContext missing required key \"${key}\"` }\n }\n if (!allowedValues.includes(contextValue)) {\n return { allowed: false, reason: `dispatchContext ${key}=${contextValue} is not allowed` }\n }\n }\n\n return { allowed: true }\n}\n\ntype StructuredResultFieldInput = {\n fieldKey: string\n fieldTypeKey: string\n fieldAlias?: string\n value?: unknown\n index?: string\n attachmentFilenames?: string[]\n}\n\n/** Normalise aampHost to a base URL with scheme and no trailing slash */\nfunction baseUrl(aampHost: string): string {\n if (aampHost.startsWith('http://') || aampHost.startsWith('https://')) {\n return aampHost.replace(/\\/$/, '')\n }\n return `https://${aampHost}`\n}\n\nconst pendingTasks = new Map<string, PendingTask>()\n// Tracks sub-tasks dispatched TO other agents \u2014 waiting for their result/help replies\nconst dispatchedSubtasks = new Map<string, { to: string; title: string; dispatchedAt: string; parentTaskId?: string }>()\n// Tracks notification keys that have been shown to LLM (auto-cleaned on next prompt build)\nconst shownNotifications = new Set<string>()\n// Pending synchronous dispatch waiters \u2014 resolve callback keyed by sub-task ID.\n// When aamp_dispatch_task sends a sub-task, it parks a Promise here and waits.\n// When task.result/help arrives for that sub-task ID, the waiter is resolved\n// directly, keeping the LLM awake with full context (no heartbeat needed).\nconst waitingDispatches = new Map<string, (reply: { type: 'result' | 'help'; data: unknown }) => void>()\nlet aampClient: AampClient | null = null\nlet agentEmail = ''\nlet lastConnectionError = ''\nlet lastDisconnectReason = ''\nlet lastTransportMode: 'disconnected' | 'websocket' | 'polling' = 'disconnected'\nlet lastLoggedTransportMode: 'disconnected' | 'websocket' | 'polling' = 'disconnected'\nlet reconcileTimer: NodeJS.Timeout | null = null\nlet transportMonitorTimer: NodeJS.Timeout | null = null\n// Tracks the most recently seen session key so task.dispatch can wake the right session.\n// Default 'agent:main:main' is the standard OpenClaw single-agent session key.\nlet currentSessionKey = 'agent:main:main'\n// Channel runtime \u2014 captured from channel adapter's startAccount for instant dispatch.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet channelRuntime: any = null\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet channelCfg: any = null\n\nfunction logTransportState(\n api: { logger: { info: (msg: string) => void; warn: (msg: string) => void } },\n mode: 'websocket' | 'polling',\n email: string,\n previousMode: 'disconnected' | 'websocket' | 'polling',\n): void {\n if (mode === previousMode) return\n\n if (mode === 'polling') {\n api.logger.info(`[AAMP] Connected (polling fallback active) \u2014 listening as ${email}`)\n return\n }\n\n if (previousMode === 'polling') {\n api.logger.info(`[AAMP] WebSocket restored \u2014 listening as ${email}`)\n return\n }\n\n api.logger.info(`[AAMP] Connected \u2014 listening as ${email}`)\n}\n\n// \u2500\u2500\u2500 Identity helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface Identity {\n email: string\n jmapToken: string\n smtpPassword: string\n}\n\n/**\n * Register a new AAMP node via the management service.\n *\n * Always creates a NEW mailbox (always returns 201). The slug is just a\n * human-readable prefix; a random hex suffix makes the email unique.\n * Callers should only call this once and persist the returned credentials.\n */\nasync function registerNode(cfg: PluginConfig): Promise<Identity> {\n const slug = (cfg.slug ?? 'openclaw-agent')\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n\n const base = baseUrl(cfg.aampHost)\n\n // Step 1: Self-register \u2192 get one-time registration code\n const res = await fetch(`${base}/api/nodes/self-register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ slug, description: 'OpenClaw AAMP agent node' }),\n })\n\n if (!res.ok) {\n const err = (await res.json().catch(() => ({}))) as { error?: string }\n throw new Error(`AAMP registration failed (${res.status}): ${err.error ?? res.statusText}`)\n }\n\n const regData = (await res.json()) as {\n registrationCode: string\n email: string\n }\n\n // Step 2: Exchange registration code for credentials\n const credRes = await fetch(\n `${base}/api/nodes/credentials?code=${encodeURIComponent(regData.registrationCode)}`,\n )\n\n if (!credRes.ok) {\n const err = (await credRes.json().catch(() => ({}))) as { error?: string }\n throw new Error(`AAMP credential exchange failed (${credRes.status}): ${err.error ?? credRes.statusText}`)\n }\n\n const credData = (await credRes.json()) as {\n email: string\n jmap: { token: string }\n smtp: { password: string }\n }\n\n return {\n email: credData.email,\n jmapToken: credData.jmap.token,\n smtpPassword: credData.smtp.password,\n }\n}\n\n/**\n * Resolve this agent's identity:\n * 1. Return cached credentials from disk if available.\n * 2. Otherwise register a new node and cache the result.\n */\nasync function resolveIdentity(cfg: PluginConfig): Promise<Identity> {\n const cached = loadCachedIdentity(cfg.credentialsFile ?? defaultCredentialsPath())\n if (cached) return cached\n\n const identity = await registerNode(cfg)\n saveCachedIdentity(identity, cfg.credentialsFile ?? defaultCredentialsPath())\n return identity\n}\n\n// \u2500\u2500\u2500 Plugin definition \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport default {\n id: 'aamp-openclaw-plugin',\n name: 'AAMP Agent Mail Protocol',\n\n configSchema: {\n type: 'object',\n properties: {\n aampHost: {\n type: 'string',\n description: 'AAMP service host, e.g. https://meshmail.ai',\n },\n slug: {\n type: 'string',\n default: 'openclaw-agent',\n description: 'Agent name prefix used in the mailbox address',\n },\n credentialsFile: {\n type: 'string',\n description:\n 'Absolute path to cache AAMP credentials between gateway restarts. ' +\n 'Default: ~/.openclaw/extensions/aamp-openclaw-plugin/.credentials.json. ' +\n 'Delete this file to force re-registration with a new mailbox.',\n },\n senderPolicies: {\n type: 'array',\n description:\n 'Per-sender authorization policies. Each sender can optionally require specific ' +\n 'X-AAMP-Dispatch-Context key/value pairs before a task is accepted.',\n items: {\n type: 'object',\n required: ['sender'],\n properties: {\n sender: {\n type: 'string',\n description: 'Dispatch sender email address (case-insensitive exact match).',\n },\n dispatchContextRules: {\n type: 'object',\n description:\n 'Optional exact-match rules over X-AAMP-Dispatch-Context. ' +\n 'All listed keys must be present and their values must match one of the configured entries.',\n additionalProperties: {\n type: 'array',\n items: { type: 'string' },\n },\n },\n },\n },\n },\n },\n },\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(api: any) {\n // api.pluginConfig = the config block under plugins.entries[\"aamp-openclaw-plugin\"].config in openclaw.json\n // api.config = the full global OpenClaw config (NOT our plugin's config)\n const cfg = (api.pluginConfig ?? {}) as PluginConfig\n\n // \u2500\u2500 Register lightweight channel adapter to capture channelRuntime \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // We register as a channel SOLELY to get access to channelRuntime, which provides\n // dispatchReplyWithBufferedBlockDispatcher for instant LLM dispatch (bypassing\n // heartbeat's global running-mutex + requests-in-flight ~60s delay).\n // JMAP connection is managed by registerService, NOT startAccount.\n api.registerChannel({\n id: 'aamp',\n meta: { label: 'AAMP' },\n capabilities: { chatTypes: ['dm'] },\n config: {\n listAccountIds: () => cfg.aampHost ? ['default'] : [],\n resolveAccount: () => ({ aampHost: cfg.aampHost }),\n isEnabled: () => !!cfg.aampHost,\n isConfigured: () => !!loadCachedIdentity(cfg.credentialsFile ?? defaultCredentialsPath()),\n },\n gateway: {\n startAccount: async (ctx: { channelRuntime?: unknown; cfg?: unknown; abortSignal?: AbortSignal }) => {\n // Capture channelRuntime for use by sub-task notification dispatch\n channelRuntime = ctx.channelRuntime ?? null\n channelCfg = ctx.cfg ?? null\n api.logger.info(`[AAMP] Channel adapter started \u2014 channelRuntime ${channelRuntime ? 'available' : 'NOT available'}`)\n\n // Keep alive until abort \u2014 JMAP connection is managed by registerService\n await new Promise<void>((resolve) => {\n ctx.abortSignal?.addEventListener('abort', () => resolve())\n })\n channelRuntime = null\n channelCfg = null\n },\n stopAccount: async () => {\n channelRuntime = null\n channelCfg = null\n },\n },\n })\n\n function triggerHeartbeatWake(sessionKey: string, label: string): void {\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey })\n api.logger.info(`[AAMP] Heartbeat triggered for ${label} via session ${sessionKey}`)\n } catch (err) {\n api.logger.warn(`[AAMP] Could not trigger heartbeat for ${label}: ${(err as Error).message}`)\n }\n }\n\n function wakeAgentForPendingTask(task: PendingTask): void {\n const fallback = () => triggerHeartbeatWake(currentSessionKey, `task ${task.taskId}`)\n const dispatcher = channelRuntime?.reply?.dispatchReplyWithBufferedBlockDispatcher\n\n api.logger.info(\n `[AAMP] Wake requested for task ${task.taskId} \u2014 channelRuntime=${channelRuntime ? 'yes' : 'no'} channelCfg=${channelCfg ? 'yes' : 'no'} dispatcher=${typeof dispatcher === 'function' ? 'yes' : 'no'} session=${currentSessionKey}`,\n )\n\n if (!channelRuntime || !channelCfg || typeof dispatcher !== 'function') {\n fallback()\n return\n }\n\n const prompt = [\n '## New AAMP Task',\n '',\n 'A new AAMP task just arrived.',\n 'Use the pending AAMP task in system context as the source of truth and handle it now.',\n 'Reply with aamp_send_result or aamp_send_help before responding.',\n ].join('\\n')\n\n try {\n void Promise.resolve(dispatcher({\n ctx: {\n Body: task.bodyText || task.title,\n BodyForAgent: prompt,\n From: task.from,\n To: agentEmail,\n SessionKey: `aamp:default:task:${task.taskId}`,\n AccountId: 'default',\n ChatType: 'dm',\n Provider: 'aamp',\n Surface: 'aamp',\n OriginatingChannel: 'aamp',\n OriginatingTo: task.from,\n MessageSid: task.messageId || task.taskId,\n Timestamp: Date.now(),\n SenderName: task.from,\n SenderId: task.from,\n CommandAuthorized: true,\n },\n cfg: channelCfg,\n dispatcherOptions: {\n deliver: async () => {},\n onError: (err: unknown) => {\n api.logger.error(`[AAMP] Channel dispatch error for task ${task.taskId}: ${err instanceof Error ? err.message : String(err)}`)\n },\n },\n })).then(() => {\n api.logger.info(`[AAMP] Channel dispatch triggered for task ${task.taskId}`)\n }).catch((err: Error) => {\n api.logger.error(`[AAMP] Channel dispatch failed for task ${task.taskId}: ${err.message}`)\n fallback()\n })\n } catch (err) {\n api.logger.error(`[AAMP] Channel dispatch threw synchronously for task ${task.taskId}: ${(err as Error).message}`)\n fallback()\n }\n }\n\n // \u2500\u2500 Shared connect logic (used by service auto-connect and startup recovery) \u2500\u2500\u2500\u2500\u2500\u2500\n async function doConnect(identity: { email: string; jmapToken: string; smtpPassword: string }) {\n if (reconcileTimer) {\n clearInterval(reconcileTimer)\n reconcileTimer = null\n }\n if (transportMonitorTimer) {\n clearInterval(transportMonitorTimer)\n transportMonitorTimer = null\n }\n\n agentEmail = identity.email\n lastConnectionError = ''\n lastDisconnectReason = ''\n lastTransportMode = 'disconnected'\n lastLoggedTransportMode = 'disconnected'\n api.logger.info(`[AAMP] Mailbox identity ready \u2014 ${agentEmail}`)\n\n // All traffic goes through aampHost (port 3000).\n // The management service proxies /jmap/* and /.well-known/jmap \u2192 Stalwart:8080.\n const base = baseUrl(cfg.aampHost)\n\n aampClient = new AampClient({\n email: identity.email,\n jmapToken: identity.jmapToken,\n jmapUrl: base,\n smtpHost: new URL(base).hostname,\n smtpPort: 587,\n smtpPassword: identity.smtpPassword,\n // Local/dev: management-service proxy uses plain HTTP, no TLS cert to verify.\n // Production: set to true when using wss:// with valid certs.\n rejectUnauthorized: false,\n })\n\n aampClient.on('task.dispatch', (task: TaskDispatch) => {\n api.logger.info(`[AAMP] \u2190 task.dispatch ${task.taskId} \"${task.title}\" from=${task.from}`)\n\n try {\n // \u2500\u2500 Sender policy / dispatch-context authorization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const decision = matchSenderPolicy(task, cfg.senderPolicies)\n if (!decision.allowed) {\n api.logger.warn(`[AAMP] \u2717 rejected by senderPolicies: ${task.from} task=${task.taskId} reason=${decision.reason}`)\n void aampClient!.sendResult({\n to: task.from,\n taskId: task.taskId,\n status: 'rejected',\n output: '',\n errorMsg: decision.reason ?? `Sender ${task.from} is not allowed.`,\n }).catch((err: Error) => {\n api.logger.error(`[AAMP] Failed to send rejection for task ${task.taskId}: ${err.message}`)\n })\n return\n }\n\n pendingTasks.set(task.taskId, {\n taskId: task.taskId,\n from: task.from,\n title: task.title,\n bodyText: task.bodyText ?? '',\n contextLinks: task.contextLinks,\n timeoutSecs: task.timeoutSecs,\n messageId: task.messageId ?? '',\n receivedAt: new Date().toISOString(),\n })\n\n // Wake the agent immediately after enqueueing the task.\n // In polling fallback mode heartbeat wakes can be delayed, so prefer a direct\n // channel dispatch when channelRuntime is available and only fall back to heartbeat.\n wakeAgentForPendingTask(pendingTasks.get(task.taskId)!)\n } catch (err) {\n api.logger.error(`[AAMP] task.dispatch handler failed for ${task.taskId}: ${(err as Error).message}`)\n if (pendingTasks.has(task.taskId)) {\n triggerHeartbeatWake(currentSessionKey, `task ${task.taskId}`)\n }\n }\n })\n\n // \u2500\u2500 Sub-task result: another agent completed a task we dispatched \u2500\u2500\u2500\u2500\u2500\u2500\n aampClient.on('task.result', (result: TaskResult) => {\n api.logger.info(`[AAMP] \u2190 task.result ${result.taskId} status=${result.status} from=${result.from}`)\n\n const sub = dispatchedSubtasks.get(result.taskId)\n dispatchedSubtasks.delete(result.taskId)\n\n // \u2500\u2500 Synchronous dispatch: if aamp_dispatch_task is waiting, resolve it directly \u2500\u2500\n const waiter = waitingDispatches.get(result.taskId)\n if (waiter) {\n waitingDispatches.delete(result.taskId)\n api.logger.info(`[AAMP] Resolving sync waiter for sub-task ${result.taskId}`)\n waiter({ type: 'result', data: result })\n return // Don't go through heartbeat/channel \u2014 the LLM is already awake\n }\n\n // Pre-download attachments to local disk so the LLM can reference them\n // by local file path (instead of requiring a separate download tool call).\n const downloadedFiles: Array<{ filename: string; path: string; size: number }> = []\n const downloadPromise = (async () => {\n if (!result.attachments?.length) return\n const dir = '/tmp/aamp-files'\n ensureDir(dir)\n for (const att of result.attachments) {\n try {\n const buffer = await aampClient!.downloadBlob(att.blobId, att.filename)\n const filepath = `${dir}/${att.filename}`\n writeBinaryFile(filepath, buffer)\n downloadedFiles.push({ filename: att.filename, path: filepath, size: buffer.length })\n api.logger.info(`[AAMP] Pre-downloaded: ${att.filename} (${(buffer.length / 1024).toFixed(1)} KB) \u2192 ${filepath}`)\n } catch (dlErr) {\n api.logger.warn(`[AAMP] Pre-download failed for ${att.filename}: ${(dlErr as Error).message}`)\n }\n }\n })()\n\n downloadPromise.then(() => {\n // Build notification with pre-downloaded file paths\n const MAX_OUTPUT_CHARS = 800\n const label = result.status === 'completed' ? 'Sub-task completed' : 'Sub-task rejected'\n const rawOutput = result.output ?? ''\n const truncatedOutput = rawOutput.length > MAX_OUTPUT_CHARS\n ? rawOutput.slice(0, MAX_OUTPUT_CHARS) + `\\n\\n... [truncated, ${rawOutput.length} chars total]`\n : rawOutput\n\n let attachmentInfo = ''\n if (downloadedFiles.length > 0) {\n attachmentInfo = `\\n\\nAttachments (pre-downloaded to local disk):\\n${downloadedFiles.map(f =>\n `- ${f.filename} (${(f.size / 1024).toFixed(1)} KB) \u2192 ${f.path}`\n ).join('\\n')}\\nUse aamp_send_result with attachments: [${downloadedFiles.map(f => `{ filename: \"${f.filename}\", path: \"${f.path}\" }`).join(', ')}] to forward them.`\n } else if (result.attachments?.length) {\n const files = result.attachments.map((a: ReceivedAttachment) =>\n `${a.filename} (${(a.size / 1024).toFixed(1)} KB, blobId: ${a.blobId})`,\n )\n attachmentInfo = `\\n\\nAttachments (download failed \u2014 use aamp_download_attachment manually):\\n${files.join('\\n')}`\n }\n\n pendingTasks.set(`result:${result.taskId}`, {\n taskId: result.taskId,\n from: result.from,\n title: `${label}: ${sub?.title ?? result.taskId}`,\n bodyText: result.status === 'completed'\n ? `Agent ${result.from} completed the sub-task.\\n\\nOutput:\\n${truncatedOutput}${attachmentInfo}`\n : `Agent ${result.from} rejected the sub-task.\\n\\nReason: ${result.errorMsg ?? 'unknown'}`,\n contextLinks: [],\n timeoutSecs: 0,\n messageId: '',\n receivedAt: new Date().toISOString(),\n })\n\n // Wake LLM via channel dispatch (instant) or heartbeat (fallback)\n if (channelRuntime && channelCfg) {\n const notifyBody = pendingTasks.get(`result:${result.taskId}`)\n const actionableTasks = [...pendingTasks.entries()]\n .filter(([key]) => !key.startsWith('result:') && !key.startsWith('help:'))\n .map(([, t]) => t)\n const actionSection = actionableTasks.length > 0\n ? `\\n\\n### Action Required\\nYou MUST call aamp_send_result to complete the pending task(s):\\n${actionableTasks.map(t => `- Task ID: ${t.taskId} | From: ${t.from} | Title: \"${t.title}\"`).join('\\n')}`\n : ''\n const prompt = `## Sub-task Update\\n\\n${notifyBody?.bodyText ?? 'Sub-task completed.'}${actionSection}`\n\n channelRuntime.reply.dispatchReplyWithBufferedBlockDispatcher({\n ctx: {\n Body: `Sub-task result: ${result.taskId}`,\n BodyForAgent: prompt,\n From: result.from,\n To: agentEmail,\n SessionKey: `aamp:default:${result.from}`,\n AccountId: 'default',\n ChatType: 'dm',\n Provider: 'aamp',\n Surface: 'aamp',\n OriginatingChannel: 'aamp',\n OriginatingTo: result.from,\n MessageSid: result.taskId,\n Timestamp: Date.now(),\n SenderName: result.from,\n SenderId: result.from,\n CommandAuthorized: true,\n },\n cfg: channelCfg,\n dispatcherOptions: {\n deliver: async () => {},\n onError: (err: unknown) => {\n api.logger.error(`[AAMP] Channel dispatch error: ${err instanceof Error ? err.message : String(err)}`)\n },\n },\n }).then(() => {\n api.logger.info(`[AAMP] Channel dispatch completed for sub-task result ${result.taskId}`)\n pendingTasks.delete(`result:${result.taskId}`)\n }).catch((err: Error) => {\n api.logger.error(`[AAMP] Channel dispatch failed: ${err.message}`)\n })\n } else {\n const notifySessionKey = `agent:main:aamp-notify-${Date.now()}`\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey: notifySessionKey })\n api.logger.info(`[AAMP] Heartbeat for sub-task result ${result.taskId}`)\n } catch (err) {\n api.logger.warn(`[AAMP] Heartbeat for sub-task result failed: ${(err as Error).message}`)\n }\n }\n }).catch((err: Error) => {\n api.logger.error(`[AAMP] Sub-task result processing failed: ${err.message}`)\n })\n })\n\n // \u2500\u2500 Sub-task help: another agent asks for clarification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n aampClient.on('task.help', (help: TaskHelp) => {\n api.logger.info(`[AAMP] \u2190 task.help ${help.taskId} question=\"${help.question}\" from=${help.from}`)\n\n // \u2500\u2500 Synchronous dispatch: if aamp_dispatch_task is waiting, resolve it directly \u2500\u2500\n const waiter = waitingDispatches.get(help.taskId)\n if (waiter) {\n waitingDispatches.delete(help.taskId)\n api.logger.info(`[AAMP] Resolving sync waiter for sub-task help ${help.taskId}`)\n waiter({ type: 'help', data: help })\n return\n }\n\n const sub = dispatchedSubtasks.get(help.taskId)\n\n pendingTasks.set(`help:${help.taskId}`, {\n taskId: help.taskId,\n from: help.from,\n title: `Sub-task needs help: ${sub?.title ?? help.taskId}`,\n bodyText: `Agent ${help.from} is asking for help on the sub-task.\\n\\nQuestion: ${help.question}\\nBlocked reason: ${help.blockedReason}${help.suggestedOptions?.length ? `\\nSuggested options: ${help.suggestedOptions.join(', ')}` : ''}`,\n contextLinks: [],\n timeoutSecs: 0,\n messageId: '',\n receivedAt: new Date().toISOString(),\n })\n\n if (channelRuntime && channelCfg) {\n const notifyBody = pendingTasks.get(`help:${help.taskId}`)\n const prompt = `## Sub-task Help Request\\n\\n${notifyBody?.bodyText ?? help.question}`\n\n channelRuntime.reply.dispatchReplyWithBufferedBlockDispatcher({\n ctx: {\n Body: `Sub-task help: ${help.taskId}`,\n BodyForAgent: prompt,\n From: help.from,\n To: agentEmail,\n SessionKey: `aamp:default:${help.from}`,\n AccountId: 'default',\n ChatType: 'dm',\n Provider: 'aamp',\n Surface: 'aamp',\n OriginatingChannel: 'aamp',\n OriginatingTo: help.from,\n MessageSid: help.taskId,\n Timestamp: Date.now(),\n SenderName: help.from,\n SenderId: help.from,\n CommandAuthorized: true,\n },\n cfg: channelCfg,\n dispatcherOptions: {\n deliver: async () => {},\n onError: (err: unknown) => {\n api.logger.error(`[AAMP] Channel dispatch error (help): ${err instanceof Error ? err.message : String(err)}`)\n },\n },\n }).then(() => {\n pendingTasks.delete(`help:${help.taskId}`)\n }).catch((err: Error) => {\n api.logger.error(`[AAMP] Channel dispatch failed for help: ${err.message}`)\n })\n } else {\n const helpSessionKey = `agent:main:aamp-notify-${Date.now()}`\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey: helpSessionKey })\n api.logger.info(`[AAMP] Heartbeat fallback for sub-task help ${help.taskId}`)\n } catch (err) {\n api.logger.warn(`[AAMP] Heartbeat for sub-task help failed: ${(err as Error).message}`)\n }\n }\n })\n\n aampClient.on('connected', () => {\n lastConnectionError = ''\n lastDisconnectReason = ''\n const mode = aampClient?.isUsingPollingFallback() ? 'polling' : 'websocket'\n logTransportState(api, mode, agentEmail, lastLoggedTransportMode)\n lastTransportMode = mode\n lastLoggedTransportMode = mode\n })\n\n aampClient.on('disconnected', (reason: string) => {\n lastDisconnectReason = reason\n if (lastTransportMode !== 'disconnected') {\n api.logger.warn(`[AAMP] Disconnected: ${reason} (will auto-reconnect)`)\n lastTransportMode = 'disconnected'\n lastLoggedTransportMode = 'disconnected'\n }\n })\n\n aampClient.on('error', (err: Error) => {\n lastConnectionError = err.message\n if (err.message.startsWith('JMAP WebSocket unavailable, falling back to polling:')) {\n if (lastTransportMode !== 'polling') {\n logTransportState(api, 'polling', agentEmail, lastLoggedTransportMode)\n lastTransportMode = 'polling'\n lastLoggedTransportMode = 'polling'\n }\n return\n }\n api.logger.error(`[AAMP] ${err.message}`)\n })\n\n await aampClient.connect()\n\n api.logger.info(\n `[AAMP] Transport after connect \u2014 ${aampClient.isUsingPollingFallback() ? 'polling fallback' : 'websocket'} as ${agentEmail}`,\n )\n\n if (aampClient.isConnected() && lastTransportMode === 'disconnected') {\n if (aampClient.isUsingPollingFallback()) {\n logTransportState(api, 'polling', agentEmail, lastLoggedTransportMode)\n lastTransportMode = 'polling'\n lastLoggedTransportMode = 'polling'\n } else {\n logTransportState(api, 'websocket', agentEmail, lastLoggedTransportMode)\n lastTransportMode = 'websocket'\n lastLoggedTransportMode = 'websocket'\n }\n }\n\n setTimeout(() => {\n if (!aampClient?.isConnected()) return\n const mode = aampClient.isUsingPollingFallback() ? 'polling' : 'websocket'\n logTransportState(api, mode, agentEmail, lastLoggedTransportMode)\n lastTransportMode = mode\n lastLoggedTransportMode = mode\n }, 1000)\n\n transportMonitorTimer = setInterval(() => {\n if (!aampClient) return\n if (!aampClient.isConnected()) {\n if (lastTransportMode !== 'disconnected') {\n lastTransportMode = 'disconnected'\n }\n return\n }\n const mode = aampClient.isUsingPollingFallback() ? 'polling' : 'websocket'\n logTransportState(api, mode, agentEmail, lastLoggedTransportMode)\n lastTransportMode = mode\n lastLoggedTransportMode = mode\n }, 5000)\n\n reconcileTimer = setInterval(() => {\n if (!aampClient) return\n void aampClient.reconcileRecentEmails(20).catch((err: Error) => {\n lastConnectionError = err.message\n api.logger.warn(`[AAMP] Mailbox reconcile failed: ${err.message}`)\n })\n }, 15000)\n }\n\n // \u2500\u2500 Service: auto-connect at gateway startup, disconnect on shutdown \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // registerService causes this plugin to load eagerly (at gateway startup),\n // not lazily (on first agent run). start() is called once the gateway is up.\n api.registerService({\n id: 'aamp-service',\n start: async () => {\n if (!cfg.aampHost) {\n api.logger.info('[AAMP] aampHost not configured \u2014 skipping auto-connect')\n return\n }\n try {\n const identity = await resolveIdentity(cfg)\n await doConnect(identity)\n } catch (err) {\n api.logger.warn(`[AAMP] Service auto-connect failed: ${(err as Error).message}`)\n }\n },\n stop: () => {\n if (reconcileTimer) {\n clearInterval(reconcileTimer)\n reconcileTimer = null\n }\n if (transportMonitorTimer) {\n clearInterval(transportMonitorTimer)\n transportMonitorTimer = null\n }\n if (aampClient) {\n try {\n aampClient.disconnect()\n api.logger.info('[AAMP] Disconnected on gateway stop')\n } catch {\n // ignore disconnect errors on shutdown\n }\n }\n },\n })\n\n // \u2500\u2500 gateway_start hook: re-trigger heartbeat after runner is initialized \u2500\u2500\u2500\n // Service start() runs BEFORE the heartbeat runner is ready, so\n // requestHeartbeatNow() called during JMAP initial fetch is silently dropped\n // (handler == null). gateway_start fires AFTER the heartbeat runner starts,\n // so we re-trigger here to process any tasks queued during startup.\n api.on('gateway_start', () => {\n if (pendingTasks.size === 0) return\n api.logger.info(`[AAMP] gateway_start: re-triggering heartbeat for ${pendingTasks.size} pending task(s)`)\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey: currentSessionKey })\n } catch (err) {\n api.logger.warn(`[AAMP] gateway_start heartbeat failed: ${(err as Error).message}`)\n }\n })\n\n // \u2500\u2500 2. Prompt injection: surface the oldest pending task to the LLM \u2500\u2500\u2500\u2500\u2500\u2500\n api.on(\n 'before_prompt_build',\n (_event, ctx) => {\n // Keep currentSessionKey fresh \u2014 used by task.dispatch to target the right session.\n // Skip channel dispatch sessions (aamp:*) to avoid polluting the heartbeat session key.\n if (ctx?.sessionKey && !String(ctx.sessionKey).startsWith('aamp:')) {\n currentSessionKey = ctx.sessionKey\n }\n\n // Expire tasks that have exceeded their timeout\n const now = Date.now()\n for (const [id, t] of pendingTasks) {\n if (t.timeoutSecs && now - new Date(t.receivedAt).getTime() > t.timeoutSecs * 1000) {\n api.logger.warn(`[AAMP] Task ${id} timed out \u2014 removing from queue`)\n pendingTasks.delete(id)\n }\n }\n\n if (pendingTasks.size === 0) return {}\n\n // Prioritize notifications (sub-task results/help) over actionable tasks.\n // Without this, the oldest actionable task blocks notification delivery,\n // preventing the LLM from seeing sub-task results and completing the parent task.\n const allEntries = [...pendingTasks.entries()]\n const notifications = allEntries.filter(([key]) => key.startsWith('result:') || key.startsWith('help:'))\n const actionable = allEntries.filter(([key]) => !key.startsWith('result:') && !key.startsWith('help:'))\n\n // Pick notification first if available, otherwise oldest actionable task\n const [taskKey, task] = notifications.length > 0\n ? notifications.sort((a, b) => new Date(a[1].receivedAt).getTime() - new Date(b[1].receivedAt).getTime())[0]\n : actionable.sort((a, b) => new Date(a[1].receivedAt).getTime() - new Date(b[1].receivedAt).getTime())[0]\n\n const isNotification = taskKey.startsWith('result:') || taskKey.startsWith('help:')\n\n // Notifications are one-shot: remove immediately after injecting into prompt\n if (isNotification && taskKey) {\n pendingTasks.delete(taskKey)\n }\n\n // Find remaining actionable tasks (non-notification) that still need a response\n const actionableTasks = [...pendingTasks.entries()]\n .filter(([key]) => !key.startsWith('result:') && !key.startsWith('help:'))\n .map(([, t]) => t)\n\n const hasAttachmentInfo = isNotification && (task.bodyText?.includes('aamp_download_attachment') ?? false)\n const actionRequiredSection = isNotification && actionableTasks.length > 0\n ? [\n ``,\n `### Action Required`,\n ``,\n `You still have ${actionableTasks.length} pending task(s) that need a response.`,\n `Use the sub-task result above to complete them by calling aamp_send_result.`,\n ``,\n ...actionableTasks.map((t) =>\n `- Task ID: ${t.taskId} | From: ${t.from} | Title: \"${t.title}\"`\n ),\n ...(hasAttachmentInfo ? [\n ``,\n `### Forwarding Attachments`,\n `The sub-task result includes file attachments. To forward them:`,\n `1. Call aamp_download_attachment for each blobId listed above`,\n `2. Include the downloaded files in aamp_send_result via the attachments parameter`,\n ` Example: attachments: [{ filename: \"file.html\", path: \"/tmp/aamp-files/file.html\" }]`,\n ] : []),\n ].join('\\n')\n : ''\n\n const lines = isNotification ? [\n `## Sub-task Update`,\n ``,\n `A sub-task you dispatched has returned a result. Review the information below.`,\n `If the sub-task included attachments, use aamp_download_attachment to fetch them.`,\n ``,\n `Task ID: ${task.taskId}`,\n `From: ${task.from}`,\n `Title: ${task.title}`,\n task.bodyText ? `\\n${task.bodyText}` : '',\n actionRequiredSection,\n pendingTasks.size > 1 ? `\\n(+${pendingTasks.size - 1} more items queued)` : '',\n ] : [\n `## Pending AAMP Task (action required)`,\n ``,\n `You have received a task via AAMP email. You MUST call one of the two tools below`,\n `BEFORE responding to the user \u2014 do not skip this step.`,\n ``,\n `### Tool selection rules (follow strictly):`,\n ``,\n `Use aamp_send_result ONLY when ALL of the following are true:`,\n ` 1. The title contains a clear, specific action verb (e.g. \"summarise\", \"review\",`,\n ` \"translate\", \"generate\", \"fix\", \"search\", \"compare\", \"list\")`,\n ` 2. You know exactly what input/resource to act on`,\n ` 3. No ambiguity remains \u2014 you could start work immediately without asking anything`,\n ``,\n `Use aamp_send_help in ALL other cases, including:`,\n ` - Title is a greeting or salutation (\"hello\", \"hi\", \"hey\", \"test\", \"ping\", etc.)`,\n ` - Title is fewer than 4 words and contains no actionable verb`,\n ` - Title is too vague to act on without guessing (e.g. \"help\", \"task\", \"question\")`,\n ` - Required context is missing (which file? which URL? which criteria?)`,\n ` - Multiple interpretations are equally plausible`,\n ``,\n `IMPORTANT: Responding to a greeting with a greeting is WRONG. \"hello\" is not a`,\n `valid task description \u2014 ask what specific task the dispatcher needs done.`,\n ``,\n `### Sub-task dispatch rules:`,\n `If you delegate work to another agent via aamp_dispatch_task, you MUST pass`,\n `parentTaskId: \"${task.taskId}\" to establish the parent-child relationship.`,\n ``,\n `Task ID: ${task.taskId}`,\n `From: ${task.from}`,\n `Title: ${task.title}`,\n task.bodyText ? `Description:\\n${task.bodyText}` : '',\n task.contextLinks.length\n ? `Context Links:\\n${task.contextLinks.map((l) => ` - ${l}`).join('\\n')}`\n : '',\n task.timeoutSecs ? `Deadline: ${task.timeoutSecs}s from dispatch` : `Deadline: none`,\n `Received: ${task.receivedAt}`,\n pendingTasks.size > 1 ? `\\n(+${pendingTasks.size - 1} more tasks queued)` : '',\n ]\n .filter(Boolean)\n .join('\\n')\n\n return { prependContext: lines }\n },\n { priority: 5 },\n )\n\n // \u2500\u2500 3. Tool: send task result \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_send_result',\n description:\n 'Send the result of an AAMP task back to the dispatcher. ' +\n 'Call this after you have finished processing the task.',\n parameters: {\n type: 'object',\n required: ['taskId', 'status', 'output'],\n properties: {\n taskId: {\n type: 'string',\n description: 'The AAMP task ID to reply to (from the system context)',\n },\n status: {\n type: 'string',\n enum: ['completed', 'rejected'],\n description: '\"completed\" on success, \"rejected\" if the task cannot be done',\n },\n output: {\n type: 'string',\n description: 'Your result or explanation',\n },\n errorMsg: {\n type: 'string',\n description: 'Optional error details (use only when status = rejected)',\n },\n attachments: {\n type: 'array',\n description: 'File attachments. Each item: { filename, contentType, path (local file path) }',\n items: {\n type: 'object',\n properties: {\n filename: { type: 'string' },\n contentType: { type: 'string' },\n path: { type: 'string', description: 'Absolute path to the file on disk' },\n },\n required: ['filename', 'path'],\n },\n },\n structuredResult: {\n type: 'array',\n description: 'Optional structured Meego field values.',\n items: {\n type: 'object',\n required: ['fieldKey', 'fieldTypeKey'],\n properties: {\n fieldKey: { type: 'string' },\n fieldTypeKey: { type: 'string' },\n fieldAlias: { type: 'string' },\n value: {\n description: 'Field value in the exact format required by Meego for this field type.',\n },\n index: { type: 'string' },\n attachmentFilenames: {\n type: 'array',\n items: { type: 'string' },\n description: 'For attachment fields, filenames from attachments[] that should be uploaded into this field.',\n },\n },\n },\n },\n },\n },\n execute: async (_id, params) => {\n const p = params as {\n taskId: string\n status: 'completed' | 'rejected'\n output: string\n errorMsg?: string\n attachments?: Array<{ filename: string; contentType?: string; path: string }>\n structuredResult?: StructuredResultFieldInput[]\n }\n\n const task = pendingTasks.get(p.taskId)\n if (!task) {\n return {\n content: [{ type: 'text', text: `Error: task ${p.taskId} not found in pending queue.` }],\n }\n }\n\n if (!aampClient?.isConnected()) {\n return { content: [{ type: 'text', text: 'Error: AAMP client is not connected.' }] }\n }\n\n api.logger.info(`[AAMP] aamp_send_result params ${JSON.stringify({\n taskId: p.taskId,\n status: p.status,\n output: p.output,\n errorMsg: p.errorMsg,\n attachments: p.attachments?.map((a) => ({\n filename: a.filename,\n contentType: a.contentType ?? 'application/octet-stream',\n path: a.path,\n })) ?? [],\n structuredResult: p.structuredResult?.map((field) => ({\n fieldKey: field.fieldKey,\n fieldTypeKey: field.fieldTypeKey,\n fieldAlias: field.fieldAlias,\n value: field.value,\n index: field.index,\n attachmentFilenames: field.attachmentFilenames ?? [],\n })) ?? [],\n })}`)\n\n // Build attachments from file paths\n let attachments: AampAttachment[] | undefined\n if (p.attachments?.length) {\n attachments = p.attachments.map((a: { filename: string; contentType?: string; path: string }) => ({\n filename: a.filename,\n contentType: a.contentType ?? 'application/octet-stream',\n content: readBinaryFile(a.path),\n }))\n }\n\n await aampClient.sendResult({\n to: task.from,\n taskId: task.taskId,\n status: p.status,\n output: p.output,\n errorMsg: p.errorMsg,\n structuredResult: p.structuredResult?.length ? p.structuredResult : undefined,\n inReplyTo: task.messageId || undefined,\n attachments,\n })\n\n pendingTasks.delete(task.taskId)\n api.logger.info(`[AAMP] \u2192 task.result ${task.taskId} ${p.status}`)\n\n // If more tasks remain, wake the agent to process them\n if (pendingTasks.size > 0) {\n try {\n api.runtime.system.requestHeartbeatNow({ reason: 'wake', sessionKey: currentSessionKey })\n } catch { /* ignore */ }\n }\n\n return {\n content: [\n {\n type: 'text',\n text: `Result sent for task ${task.taskId} (status: ${p.status}).`,\n },\n ],\n }\n },\n }, { name: 'aamp_send_result' })\n\n // \u2500\u2500 4. Tool: ask for help \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_send_help',\n description:\n 'Send a help request for an AAMP task when you are blocked or need human clarification ' +\n 'before you can proceed.',\n parameters: {\n type: 'object',\n required: ['taskId', 'question', 'blockedReason'],\n properties: {\n taskId: {\n type: 'string',\n description: 'The AAMP task ID',\n },\n question: {\n type: 'string',\n description: 'Your question for the human dispatcher',\n },\n blockedReason: {\n type: 'string',\n description: 'Why you cannot proceed without their input',\n },\n suggestedOptions: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional list of choices for the dispatcher to pick from',\n },\n },\n },\n execute: async (_id, params) => {\n const p = params as {\n taskId: string\n question: string\n blockedReason: string\n suggestedOptions?: string[]\n }\n\n const task = pendingTasks.get(p.taskId)\n if (!task) {\n return {\n content: [{ type: 'text', text: `Error: task ${p.taskId} not found in pending queue.` }],\n }\n }\n\n if (!aampClient?.isConnected()) {\n return { content: [{ type: 'text', text: 'Error: AAMP client is not connected.' }] }\n }\n\n await aampClient.sendHelp({\n to: task.from,\n taskId: task.taskId,\n question: p.question,\n blockedReason: p.blockedReason,\n suggestedOptions: p.suggestedOptions ?? [],\n inReplyTo: task.messageId || undefined,\n })\n\n api.logger.info(`[AAMP] \u2192 task.help ${task.taskId}`)\n\n // Keep the task in pending \u2014 the help reply may arrive later\n return {\n content: [\n {\n type: 'text',\n text: `Help request sent for task ${task.taskId}. The task remains pending until the dispatcher replies.`,\n },\n ],\n }\n },\n }, { name: 'aamp_send_help' })\n\n // \u2500\u2500 5. Tool: inspect queue \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_pending_tasks',\n description: 'List all AAMP tasks currently waiting to be processed.',\n parameters: { type: 'object', properties: {} },\n execute: async () => {\n if (pendingTasks.size === 0) {\n return { content: [{ type: 'text', text: 'No pending AAMP tasks.' }] }\n }\n\n const lines = [...pendingTasks.values()]\n .sort((a, b) => new Date(a.receivedAt).getTime() - new Date(b.receivedAt).getTime())\n .map(\n (t, i) =>\n `${i + 1}. [${t.taskId}] \"${t.title}\"${t.bodyText ? `\\n Description: ${t.bodyText}` : ''} \u2014 from ${t.from} (received ${t.receivedAt})`,\n )\n\n return {\n content: [\n {\n type: 'text',\n text: `${pendingTasks.size} pending task(s):\\n${lines.join('\\n')}`,\n },\n ],\n }\n },\n }, { name: 'aamp_pending_tasks' })\n\n // \u2500\u2500 6. Tool: dispatch task to another agent (SYNCHRONOUS) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Sends the task and BLOCKS until the sub-agent replies with task.result or\n // task.help. The reply is returned directly as the tool result, keeping the\n // LLM awake with full context \u2014 no heartbeat/channel dispatch needed.\n api.registerTool({\n name: 'aamp_dispatch_task',\n description:\n 'Send a task to another AAMP agent and WAIT for the result. ' +\n 'This tool blocks until the sub-agent replies (typically 5-60s). ' +\n 'The sub-agent\\'s output and any attachment file paths are returned directly.',\n parameters: {\n type: 'object',\n required: ['to', 'title'],\n properties: {\n to: { type: 'string', description: 'Target agent AAMP email address' },\n title: { type: 'string', description: 'Task title (concise summary)' },\n bodyText: { type: 'string', description: 'Detailed task description' },\n parentTaskId: { type: 'string', description: 'If you are processing a pending AAMP task, pass its Task ID here to establish parent-child nesting. Omit for top-level tasks.' },\n timeoutSecs: { type: 'number', description: 'Timeout in seconds (optional)' },\n contextLinks: {\n type: 'array', items: { type: 'string' },\n description: 'URLs providing context (optional)',\n },\n attachments: {\n type: 'array',\n description: 'File attachments. Each item: { filename, contentType, path (local file path) }',\n items: {\n type: 'object',\n properties: {\n filename: { type: 'string' },\n contentType: { type: 'string' },\n path: { type: 'string', description: 'Absolute path to the file on disk' },\n },\n required: ['filename', 'path'],\n },\n },\n },\n },\n execute: async (_id: unknown, params: {\n to: string; title: string; bodyText?: string;\n parentTaskId?: string; timeoutSecs?: number; contextLinks?: string[];\n attachments?: Array<{ filename: string; contentType?: string; path: string }>\n }) => {\n if (!aampClient?.isConnected()) {\n return { content: [{ type: 'text', text: 'Error: AAMP client is not connected.' }] }\n }\n\n try {\n // Build attachments from file paths\n let attachments: AampAttachment[] | undefined\n if (params.attachments?.length) {\n attachments = params.attachments.map((a: { filename: string; contentType?: string; path: string }) => ({\n filename: a.filename,\n contentType: a.contentType ?? 'application/octet-stream',\n content: readBinaryFile(a.path),\n }))\n }\n\n const result = await aampClient.sendTask({\n to: params.to,\n title: params.title,\n parentTaskId: params.parentTaskId,\n timeoutSecs: params.timeoutSecs,\n contextLinks: params.contextLinks,\n attachments,\n })\n\n // Track as dispatched sub-task\n dispatchedSubtasks.set(result.taskId, {\n to: params.to,\n title: params.title,\n dispatchedAt: new Date().toISOString(),\n parentTaskId: params.parentTaskId,\n })\n\n api.logger.info(`[AAMP] \u2192 task.dispatch ${result.taskId} to=${params.to} parent=${params.parentTaskId ?? 'none'} (waiting for reply\u2026)`)\n\n // \u2500\u2500 SYNCHRONOUS WAIT: block until sub-agent replies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const timeoutMs = (params.timeoutSecs ?? 300) * 1000\n const reply = await new Promise<{ type: 'result' | 'help'; data: unknown }>((resolve, reject) => {\n waitingDispatches.set(result.taskId, resolve)\n setTimeout(() => {\n if (waitingDispatches.delete(result.taskId)) {\n reject(new Error(`Sub-task ${result.taskId} timed out after ${params.timeoutSecs ?? 300}s`))\n }\n }, timeoutMs)\n })\n\n api.logger.info(`[AAMP] \u2190 sync reply for ${result.taskId}: type=${reply.type} attachments=${JSON.stringify((reply.data as any)?.attachments?.length ?? 0)}`)\n\n if (reply.type === 'result') {\n const r = reply.data as TaskResult\n\n // Pre-download attachments \u2014 use direct JMAP blob download (bypass SDK's downloadBlob\n // which was returning 404 due to URL construction issues in the esbuild bundle).\n let attachmentLines = ''\n if (r.attachments?.length) {\n api.logger.info(`[AAMP] Downloading ${r.attachments.length} attachment(s) from sync reply...`)\n const dir = '/tmp/aamp-files'\n ensureDir(dir)\n const downloaded: string[] = []\n const base = baseUrl(cfg.aampHost)\n const identity = loadCachedIdentity(cfg.credentialsFile ?? defaultCredentialsPath())\n const authHeader = identity ? `Basic ${Buffer.from(identity.email + ':' + identity.smtpPassword).toString('base64')}` : ''\n for (const att of r.attachments) {\n try {\n // Direct JMAP blob download \u2014 construct URL manually\n const dlUrl = `${base}/jmap/download/n/${encodeURIComponent(att.blobId)}/${encodeURIComponent(att.filename)}?accept=application/octet-stream`\n api.logger.info(`[AAMP] Fetching ${dlUrl}`)\n const dlRes = await fetch(dlUrl, { headers: { Authorization: authHeader } })\n if (!dlRes.ok) throw new Error(`HTTP ${dlRes.status}`)\n const buffer = Buffer.from(await dlRes.arrayBuffer())\n const filepath = `${dir}/${att.filename}`\n writeBinaryFile(filepath, buffer)\n downloaded.push(`${att.filename} (${(buffer.length / 1024).toFixed(1)} KB) \u2192 ${filepath}`)\n api.logger.info(`[AAMP] Downloaded: ${att.filename} (${(buffer.length / 1024).toFixed(1)} KB)`)\n } catch (dlErr) {\n api.logger.error(`[AAMP] Download failed for ${att.filename}: ${(dlErr as Error).message}`)\n }\n }\n if (downloaded.length) {\n attachmentLines = `\\n\\nAttachments downloaded:\\n${downloaded.join('\\n')}`\n }\n }\n\n return {\n content: [{\n type: 'text',\n text: [\n `Sub-task ${r.status}: ${params.title}`,\n `Agent: ${r.from}`,\n `Task ID: ${result.taskId}`,\n r.status === 'completed' ? `\\nOutput:\\n${r.output}` : `\\nError: ${r.errorMsg ?? 'rejected'}`,\n attachmentLines,\n ].filter(Boolean).join('\\n'),\n }],\n }\n } else {\n const h = reply.data as TaskHelp\n return {\n content: [{\n type: 'text',\n text: [\n `Sub-task needs help: ${params.title}`,\n `Agent: ${h.from}`,\n `Task ID: ${result.taskId}`,\n `\\nQuestion: ${h.question}`,\n `Blocked reason: ${h.blockedReason}`,\n h.suggestedOptions?.length ? `Options: ${h.suggestedOptions.join(' | ')}` : '',\n ].filter(Boolean).join('\\n'),\n }],\n }\n }\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Error dispatching task: ${(err as Error).message}` }],\n }\n }\n },\n }, { name: 'aamp_dispatch_task' })\n\n // \u2500\u2500 7. Tool: check AAMP protocol support \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_check_protocol',\n description:\n 'Check if an email address supports the AAMP protocol. ' +\n 'Returns { aamp: true/false } indicating whether the address is an AAMP agent.',\n parameters: {\n type: 'object',\n required: ['email'],\n properties: {\n email: { type: 'string', description: 'Email address to check' },\n },\n },\n execute: async (_id: unknown, params: { email: string }) => {\n const base = baseUrl(cfg.aampHost)\n const email = params?.email ?? ''\n if (!email) {\n return { content: [{ type: 'text', text: 'Error: email parameter is required' }] }\n }\n try {\n const res = await fetch(`${base}/api/aamp-check?email=${encodeURIComponent(email)}`)\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n const data = await res.json() as { aamp: boolean; domain?: string }\n return {\n content: [{\n type: 'text',\n text: data.aamp\n ? `${params.email} supports AAMP protocol (domain: ${data.domain ?? 'unknown'})`\n : `${params.email} does not support AAMP protocol`,\n }],\n }\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Could not check ${params.email}: ${(err as Error).message}` }],\n }\n }\n },\n }, { name: 'aamp_check_protocol' })\n\n // \u2500\u2500 8. Tool: download attachment blob \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerTool({\n name: 'aamp_download_attachment',\n description:\n 'Download an AAMP email attachment to local disk by its blobId. ' +\n 'Use this to retrieve files received from sub-agent task results.',\n parameters: {\n type: 'object',\n required: ['blobId', 'filename'],\n properties: {\n blobId: { type: 'string', description: 'The JMAP blobId from the attachment metadata' },\n filename: { type: 'string', description: 'Filename to save as' },\n saveTo: { type: 'string', description: 'Directory to save to (default: /tmp/aamp-files)' },\n },\n },\n execute: async (_id: unknown, params: { blobId: string; filename: string; saveTo?: string }) => {\n if (!aampClient?.isConnected()) {\n return { content: [{ type: 'text', text: 'Error: AAMP client is not connected.' }] }\n }\n\n const dir = params.saveTo ?? '/tmp/aamp-files'\n ensureDir(dir)\n\n try {\n const buffer = await aampClient.downloadBlob(params.blobId, params.filename)\n const filepath = `${dir}/${params.filename}`\n writeBinaryFile(filepath, buffer)\n return {\n content: [{\n type: 'text',\n text: `Downloaded ${params.filename} (${(buffer.length / 1024).toFixed(1)} KB) to ${filepath}`,\n }],\n }\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Download failed: ${(err as Error).message}` }],\n }\n }\n },\n }, { name: 'aamp_download_attachment' })\n\n // \u2500\u2500 9. Slash command: /aamp-status \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n api.registerCommand({\n name: 'aamp-status',\n description: 'Show AAMP connection status and pending task queue',\n acceptsArgs: false,\n requireAuth: false,\n handler: () => {\n const isPollingFallback = aampClient?.isUsingPollingFallback?.() ?? false\n const connectionLine = aampClient?.isConnected()\n ? (isPollingFallback ? '\uD83D\uDFE1 connected (polling fallback)' : '\u2705 connected')\n : '\u274C disconnected'\n\n return {\n text: [\n `**AAMP Plugin Status**`,\n `Host: ${cfg.aampHost || '(not configured)'}`,\n `Identity: ${agentEmail || '(not yet registered)'}`,\n `Connection: ${connectionLine}`,\n `Cached: ${loadCachedIdentity(cfg.credentialsFile ?? defaultCredentialsPath()) ? 'yes' : 'no'}`,\n lastConnectionError ? `Last error: ${lastConnectionError}` : '',\n lastDisconnectReason ? `Last disconnect: ${lastDisconnectReason}` : '',\n `Pending: ${pendingTasks.size} task(s)`,\n ...[...pendingTasks.values()].map(\n (t) => ` \u2022 ${t.taskId.slice(0, 8)}\u2026 \"${t.title}\" from ${t.from}`,\n ),\n ]\n .filter(Boolean)\n .join('\\n'),\n }\n },\n })\n },\n}\n"],
|
|
5
|
+
"mappings": ";AAWA,OAAO,eAAe;;;ACOf,IAAM,cAAc;AAAA,EACzB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,gBAAgB;AAClB;;;ACnBA,SAAS,6BAA6B,SAAyB;AAC7D,QAAM,QAAQ,qCAAqC,KAAK,OAAO;AAC/D,MAAI,CAAC;AAAO,WAAO;AAEnB,QAAM,CAAC,EAAE,YAAY,aAAa,IAAI,IAAI;AAC1C,QAAM,UAAU,WAAW,YAAY;AACvC,QAAM,WAAW,YAAY,YAAY;AAEzC,MAAI;AACF,QAAI,aAAa,KAAK;AACpB,YAAM,MAAM,OAAO,KAAK,MAAM,QAAQ;AACtC,aAAO,IAAI,SAAS,YAAY,WAAW,YAAY,SAAS,SAAS,MAAM;AAAA,IACjF;AAEA,UAAM,aAAa,KAChB,QAAQ,MAAM,GAAG,EACjB;AAAA,MAAQ;AAAA,MAAsB,CAAC,GAAG,QACjC,OAAO,aAAa,SAAS,KAAK,EAAE,CAAC;AAAA,IACvC;AACF,UAAM,QAAQ,OAAO,KAAK,YAAY,QAAQ;AAC9C,WAAO,MAAM,SAAS,YAAY,WAAW,YAAY,SAAS,SAAS,MAAM;AAAA,EACnF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,OAAwB;AACtD,MAAI,CAAC,SAAS,CAAC,MAAM,SAAS,IAAI;AAAG,WAAO,SAAS;AACrD,QAAM,YAAY,MAAM,QAAQ,gBAAgB,GAAG;AACnD,QAAM,UAAU,UAAU;AAAA,IAAQ;AAAA,IAA+B,CAAC,YAChE,6BAA6B,OAAO;AAAA,EACtC;AACA,SAAO,QAAQ,QAAQ,WAAW,GAAG,EAAE,KAAK;AAC9C;AAKO,SAAS,iBAAiB,SAA6C;AAC5E,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;AAAA,MACtC,EAAE,YAAY;AAAA,MACd,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAKA,SAAS,cACP,SACA,YACoB;AACpB,SAAO,QAAQ,WAAW,YAAY,CAAC;AACzC;AAEA,IAAM,0BAA0B;AAEzB,SAAS,2BAA2B,OAAoD;AAC7F,MAAI,CAAC;AAAO,WAAO;AACnB,QAAM,UAAkC,CAAC;AAEzC,aAAW,QAAQ,MAAM,MAAM,GAAG,GAAG;AACnC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC;AAAS;AACd,UAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,QAAI,SAAS;AAAG;AAChB,UAAM,SAAS,QAAQ,MAAM,GAAG,KAAK,EAAE,KAAK;AAC5C,UAAM,WAAW,QAAQ,MAAM,QAAQ,CAAC,EAAE,KAAK;AAC/C,QAAI,CAAC,wBAAwB,KAAK,MAAM;AAAG;AAC3C,QAAI;AACF,cAAQ,MAAM,IAAI,mBAAmB,QAAQ;AAAA,IAC/C,QAAQ;AACN,cAAQ,MAAM,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,OAAO,EAAE,SAAS,UAAU;AACjD;AAEO,SAAS,+BAA+B,SAAsD;AACnG,MAAI,CAAC;AAAS,WAAO;AACrB,QAAM,QAAQ,OAAO,QAAQ,OAAO,EACjC,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzB,UAAM,gBAAgB,IAAI,KAAK,EAAE,YAAY;AAC7C,QAAI,CAAC,wBAAwB,KAAK,aAAa;AAAG,aAAO,CAAC;AAC1D,UAAM,kBAAkB,OAAO,SAAS,EAAE,EAAE,KAAK;AACjD,QAAI,CAAC;AAAiB,aAAO,CAAC;AAC9B,WAAO,GAAG,aAAa,IAAI,mBAAmB,eAAe,CAAC;AAAA,EAChE,CAAC;AACH,SAAO,MAAM,SAAS,MAAM,KAAK,IAAI,IAAI;AAC3C;AAEA,SAAS,uBAAuB,OAA4D;AAC1F,MAAI,CAAC;AAAO,WAAO;AACnB,MAAI;AACF,UAAM,aAAa,MAAM,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC7D,UAAM,UAAU,WAAW,SAAS,MAAM,IAAI,KAAK,IAAI,OAAO,IAAK,WAAW,SAAS,CAAE;AACzF,UAAM,UAAU,OAAO,KAAK,aAAa,SAAS,QAAQ,EAAE,SAAS,OAAO;AAC5E,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,OAA4D;AAC1F,MAAI,CAAC;AAAO,WAAO;AACnB,QAAM,OAAO,KAAK,UAAU,KAAK;AACjC,SAAO,OAAO,KAAK,MAAM,OAAO,EAC7B,SAAS,QAAQ,EACjB,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,EAAE;AACvB;AAgBO,SAAS,iBAAiB,MAAyC;AACxE,QAAM,UAAU,iBAAiB,KAAK,OAAO;AAE7C,QAAM,SAAS,cAAc,SAAS,YAAY,MAAM;AACxD,QAAM,SAAS,cAAc,SAAS,YAAY,OAAO;AAEzD,MAAI,CAAC,UAAU,CAAC;AAAQ,WAAO;AAE/B,QAAM,OAAO,KAAK,KAAK,QAAQ,UAAU,EAAE;AAC3C,QAAM,KAAK,KAAK,GAAG,QAAQ,UAAU,EAAE;AACvC,QAAM,iBAAiB,uBAAuB,KAAK,OAAO;AAE1D,MAAI,WAAW,iBAAiB;AAC9B,UAAM,aAAa,cAAc,SAAS,YAAY,OAAO,KAAK;AAClE,UAAM,kBAAkB,cAAc,SAAS,YAAY,aAAa,KAAK;AAC7E,UAAM,kBAAkB;AAAA,MACtB,cAAc,SAAS,YAAY,gBAAgB;AAAA,IACrD;AAEA,UAAM,eAAe,cAAc,SAAS,YAAY,cAAc;AAEtE,UAAM,WAAyB;AAAA,MAC7B,QAAQ;AAAA,MACR;AAAA,MACA,OAAO,eAAe,QAAQ,qBAAqB,EAAE,EAAE,KAAK,KAAK;AAAA,MACjE,aAAa,SAAS,YAAY,EAAE,KAAK;AAAA,MACzC,cAAc,kBACV,gBAAgB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAC9D,CAAC;AAAA,MACL,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,MAC7C,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,UAAU;AAAA;AAAA,IACZ;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,eAAe;AAC5B,UAAM,SAAU,cAAc,SAAS,YAAY,MAAM,KAAK;AAG9D,UAAM,SAAS,cAAc,SAAS,YAAY,MAAM,KAAK;AAC7D,UAAM,WAAW,cAAc,SAAS,YAAY,SAAS;AAC7D,UAAM,mBAAmB;AAAA,MACvB,cAAc,SAAS,YAAY,iBAAiB;AAAA,IACtD;AAEA,UAAM,SAAqB;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,QAAQ,uBAAuB,MAAM;AAAA,MACrC,UAAU,WAAW,uBAAuB,QAAQ,IAAI;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,aAAa;AAC1B,UAAM,WAAW,cAAc,SAAS,YAAY,QAAQ,KAAK;AACjE,UAAM,gBAAgB,cAAc,SAAS,YAAY,cAAc,KAAK;AAC5E,UAAM,sBAAsB,cAAc,SAAS,YAAY,iBAAiB,KAAK;AAErF,UAAM,OAAiB;AAAA,MACrB,QAAQ;AAAA,MACR;AAAA,MACA,UAAU,uBAAuB,QAAQ;AAAA,MACzC,eAAe,uBAAuB,aAAa;AAAA,MACnD,kBAAkB,sBACd,oBAAoB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,uBAAuB,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,OAAO,IAC1F,CAAC;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,YAAY;AACzB,UAAM,MAAe;AAAA,MACnB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,SAAS,qBAAqB,QAOV;AACzB,QAAM,UAAkC;AAAA,IACtC,CAAC,YAAY,MAAM,GAAG;AAAA,IACtB,CAAC,YAAY,OAAO,GAAG,OAAO;AAAA,EAChC;AACA,MAAI,OAAO,eAAe,MAAM;AAC9B,YAAQ,YAAY,OAAO,IAAI,OAAO,OAAO,WAAW;AAAA,EAC1D;AACA,MAAI,OAAO,aAAa,SAAS,GAAG;AAClC,YAAQ,YAAY,aAAa,IAAI,OAAO,aAAa,KAAK,GAAG;AAAA,EACnE;AACA,QAAM,kBAAkB,+BAA+B,OAAO,eAAe;AAC7E,MAAI,iBAAiB;AACnB,YAAQ,YAAY,gBAAgB,IAAI;AAAA,EAC1C;AACA,MAAI,OAAO,cAAc;AACvB,YAAQ,YAAY,cAAc,IAAI,OAAO;AAAA,EAC/C;AACA,SAAO;AACT;AAKO,SAAS,gBAAgB,MAAkD;AAChF,SAAO;AAAA,IACL,CAAC,YAAY,MAAM,GAAG;AAAA,IACtB,CAAC,YAAY,OAAO,GAAG,KAAK;AAAA,EAC9B;AACF;AAKO,SAAS,mBAAmB,QAMR;AACzB,QAAM,UAAkC;AAAA,IACtC,CAAC,YAAY,MAAM,GAAG;AAAA,IACtB,CAAC,YAAY,OAAO,GAAG,OAAO;AAAA,IAC9B,CAAC,YAAY,MAAM,GAAG,OAAO;AAAA,IAC7B,CAAC,YAAY,MAAM,GAAG,OAAO;AAAA,EAC/B;AACA,MAAI,OAAO,UAAU;AACnB,YAAQ,YAAY,SAAS,IAAI,OAAO;AAAA,EAC1C;AACA,QAAM,mBAAmB,uBAAuB,OAAO,gBAAgB;AACvE,MAAI,kBAAkB;AACpB,YAAQ,YAAY,iBAAiB,IAAI;AAAA,EAC3C;AACA,SAAO;AACT;AAKO,SAAS,iBAAiB,QAKN;AACzB,SAAO;AAAA,IACL,CAAC,YAAY,MAAM,GAAG;AAAA,IACtB,CAAC,YAAY,OAAO,GAAG,OAAO;AAAA,IAC9B,CAAC,YAAY,QAAQ,GAAG,OAAO;AAAA,IAC/B,CAAC,YAAY,cAAc,GAAG,OAAO;AAAA,IACrC,CAAC,YAAY,iBAAiB,GAAG,OAAO,iBAAiB,KAAK,GAAG;AAAA,EACnE;AACF;;;AC9TO,IAAM,cAAN,MAAyC;AAAA,EAC7B,YAAY,oBAAI,IAAiC;AAAA,EACjD,eAAe,oBAAI,QAA4B;AAAA,EAEhE,GAA2B,OAAU,UAA0C;AAC7E,UAAM,SAAS,KAAK,UAAU,IAAI,KAAK,KAAK,oBAAI,IAAc;AAC9D,WAAO,IAAI,QAAoB;AAC/B,SAAK,UAAU,IAAI,OAAO,MAAM;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,KAA6B,OAAU,UAA0C;AAC/E,UAAM,UAAoB,IAAI,SAAoB;AAChD,WAAK,IAAI,OAAO,QAAQ;AACvB,MAAC,SAAsB,GAAG,IAAI;AAAA,IACjC;AACA,SAAK,aAAa,IAAI,UAAsB,OAAO;AACnD,WAAO,KAAK,GAAG,OAAO,OAAmC;AAAA,EAC3D;AAAA,EAEA,IAA4B,OAAU,UAA0C;AAC9E,UAAM,SAAS,KAAK,UAAU,IAAI,KAAK;AACvC,QAAI,CAAC;AAAQ,aAAO;AAEpB,UAAM,WAAW;AACjB,UAAM,UAAU,KAAK,aAAa,IAAI,QAAQ;AAC9C,WAAO,OAAO,WAAW,QAAQ;AACjC,QAAI;AAAS,WAAK,aAAa,OAAO,QAAQ;AAC9C,QAAI,OAAO,SAAS;AAAG,WAAK,UAAU,OAAO,KAAK;AAClD,WAAO;AAAA,EACT;AAAA,EAEU,KAA6B,UAAa,MAAqC;AACvF,UAAM,SAAS,KAAK,UAAU,IAAI,KAAK;AACvC,QAAI,CAAC,UAAU,OAAO,SAAS;AAAG,aAAO;AAEzC,eAAW,YAAY,CAAC,GAAG,MAAM,GAAG;AAClC,eAAS,GAAG,IAAI;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AACF;;;AHiBA,SAAS,cAAc,KAAsB;AAC3C,MAAI,EAAE,eAAe;AAAQ,WAAO,OAAO,GAAG;AAE9C,QAAM,QAAQ,CAAC,IAAI,OAAO;AAC1B,QAAM,UAAU;AAShB,MAAI,QAAQ;AAAM,UAAM,KAAK,QAAQ,QAAQ,IAAI,EAAE;AACnD,MAAI,QAAQ,UAAU;AAAW,UAAM,KAAK,SAAS,QAAQ,KAAK,EAAE;AACpE,MAAI,QAAQ;AAAS,UAAM,KAAK,WAAW,QAAQ,OAAO,EAAE;AAC5D,MAAI,QAAQ;AAAS,UAAM,KAAK,WAAW,QAAQ,OAAO,EAAE;AAC5D,MAAI,QAAQ,SAAS;AAAW,UAAM,KAAK,QAAQ,QAAQ,IAAI,EAAE;AAEjE,MAAI,QAAQ,iBAAiB,OAAO;AAClC,UAAM,KAAK,SAAS,cAAc,QAAQ,KAAK,CAAC,EAAE;AAAA,EACpD,WAAW,QAAQ,UAAU,QAAW;AACtC,UAAM,KAAK,SAAS,OAAO,QAAQ,KAAK,CAAC,EAAE;AAAA,EAC7C;AAEA,SAAO,MAAM,KAAK,KAAK;AACzB;AAcO,IAAM,iBAAN,cAA6B,YAA4B;AAAA,EACtD,KAAuB;AAAA,EACvB,UAA8B;AAAA,EAC9B,iBAAwC;AAAA,EACxC,YAAmC;AAAA,EACnC,YAAmC;AAAA,EACnC,kBAAyC;AAAA,EAChC,iBAAiB,oBAAI,IAAY;AAAA,EAC1C,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,aAAa;AAAA;AAAA,EAEb,aAA4B;AAAA,EACnB,cAAc,KAAK,IAAI;AAAA,EAEvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EAExC,YAAY,MAOT;AACD,UAAM;AACN,SAAK,QAAQ,KAAK;AAClB,SAAK,WAAW,KAAK;AACrB,SAAK,UAAU,KAAK,QAAQ,QAAQ,OAAO,EAAE;AAC7C,SAAK,oBAAoB,KAAK,qBAAqB;AACnD,SAAK,qBAAqB,KAAK,sBAAsB;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,UAAM,KAAK,QAAQ;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,SAAK,UAAU;AACf,QAAI,KAAK,gBAAgB;AACvB,mBAAa,KAAK,cAAc;AAChC,WAAK,iBAAiB;AAAA,IACxB;AACA,QAAI,KAAK,WAAW;AAClB,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,KAAK,WAAW;AAClB,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,KAAK,iBAAiB;AACxB,oBAAc,KAAK,eAAe;AAClC,WAAK,kBAAkB;AAAA,IACzB;AACA,QAAI,KAAK,IAAI;AACX,WAAK,GAAG,MAAM;AACd,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,YAAY;AACjB,SAAK,gBAAgB;AACrB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,gBAAwB;AAC9B,UAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,KAAK,QAAQ;AAC5C,WAAO,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAqC;AACjD,UAAM,MAAM,GAAG,KAAK,OAAO;AAC3B,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,MAAM,KAAK;AAAA,QACrB,SAAS,EAAE,eAAe,KAAK,cAAc,EAAE;AAAA,MACjD,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,gBAAgB,GAAG,YAAY,cAAc,GAAG,CAAC,EAAE;AAAA,IACrE;AAEA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,iCAAiC,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AAAA,IACjF;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SACZ,SAC6B;AAC7B,QAAI,CAAC,KAAK;AAAS,YAAM,IAAI,MAAM,iBAAiB;AAKpD,UAAM,SAAS,GAAG,KAAK,OAAO;AAC9B,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,MAAM,QAAQ;AAAA,QACxB,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,KAAK,cAAc;AAAA,UAClC,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,YACL;AAAA,YACA;AAAA,UACF;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,YAAY,MAAM,YAAY,cAAc,GAAG,CAAC,EAAE;AAAA,IACpE;AAEA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,EAAE;AAAA,IACvD;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,eAAe,WAAkC;AAC7D,UAAM,WAAW,MAAM,KAAK,SAAS;AAAA,MACnC,CAAC,aAAa,EAAE,WAAW,KAAK,CAAC,EAAE,GAAG,IAAI;AAAA,IAC5C,CAAC;AACD,UAAM,UAAU,SAAS,gBAAgB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,WAAW;AAC9E,QAAI,SAAS;AACX,WAAK,aAAc,QAAQ,CAAC,EAAyB,SAAS;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,iBAAiB,WAAmB,YAA0C;AAC1F,UAAM,cAAc,MAAM,KAAK,SAAS;AAAA,MACtC,CAAC,iBAAiB,EAAE,WAAW,YAAY,YAAY,GAAG,GAAG,IAAI;AAAA,IACnE,CAAC;AAED,UAAM,gBAAgB,YAAY,gBAAgB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,eAAe;AAG3F,QAAI,CAAC,iBAAiB,cAAc,CAAC,MAAM,SAAS;AAClD,YAAM,KAAK,eAAe,SAAS;AACnC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAU,cAAc,CAAC;AAM/B,QAAI,QAAQ,UAAU;AACpB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAEA,UAAM,SAAS,QAAQ,WAAW,CAAC;AACnC,QAAI,OAAO,WAAW;AAAG,aAAO,CAAC;AAEjC,UAAM,YAAY,MAAM,KAAK,SAAS;AAAA,MACpC;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA,KAAK;AAAA,UACL,YAAY,CAAC,MAAM,WAAW,QAAQ,MAAM,WAAW,aAAa,cAAc,YAAY,cAAc,aAAa;AAAA,UACzH,qBAAqB;AAAA,UACrB,mBAAmB;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,YAAY,UAAU,gBAAgB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,WAAW;AACjF,QAAI,CAAC;AAAW,aAAO,CAAC;AAExB,UAAM,OAAO,UAAU,CAAC;AACxB,WAAO,KAAK,QAAQ,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,aAAa,OAAwB;AAE3C,UAAM,YAAoC,CAAC;AAC3C,eAAW,KAAK,MAAM,WAAW,CAAC,GAAG;AACnC,gBAAU,EAAE,KAAK,YAAY,CAAC,IAAI,EAAE,MAAM,KAAK;AAAA,IACjD;AAEA,UAAM,WAAW,MAAM,OAAO,CAAC,GAAG,SAAS;AAC3C,UAAM,SAAS,MAAM,KAAK,CAAC,GAAG,SAAS;AACvC,UAAM,YAAY,MAAM,YAAY,CAAC,KAAK,MAAM;AAEhD,QAAI,KAAK,eAAe,IAAI,SAAS;AAAG;AACxC,SAAK,eAAe,IAAI,SAAS;AAGjC,UAAM,MAA0B,iBAAiB;AAAA,MAC/C,MAAM;AAAA,MACN,IAAI;AAAA,MACJ;AAAA,MACA,SAAS,MAAM,WAAW;AAAA,MAC1B,SAAS;AAAA,IACX,CAAC;AAED,QAAI,OAAO,YAAY,KAAK;AAE1B,YAAM,iBAAiB,MAAM,WAAW,CAAC,GAAG;AAC5C,YAAM,eAAe,kBAAkB,MAAM,aAAa,cAAc,GAAG,SAAS,IAAI,KAAK,IAAI;AAChG,MAAC,IAA2C,WAAW;AAGxD,YAAM,uBAAuB,MAAM,eAAe,CAAC,GAAG,IAAI,QAAM;AAAA,QAC9D,UAAU,EAAE,QAAQ;AAAA,QACpB,aAAa,EAAE;AAAA,QACf,MAAM,EAAE;AAAA,QACR,QAAQ,EAAE;AAAA,MACZ,EAAE;AACF,UAAI,oBAAoB,SAAS,GAAG;AAClC;AAAC,QAAC,IAA2C,cAAc;AAAA,MAC7D;AAGA,UAAK,IAA2B,WAAW,iBAAiB;AAC1D,aAAK,KAAK,YAAY,EAAE,IAAI,UAAU,QAAS,IAA2B,QAAQ,UAAU,CAAC;AAAA,MAC/F;AAEA,YAAM,UAAU;AAChB,cAAQ,QAAQ,QAAQ;AAAA,QACtB,KAAK;AACH,eAAK,KAAK,iBAAiB,OAAO;AAClC;AAAA,QACF,KAAK;AACH,eAAK,KAAK,eAAe,OAAO;AAChC;AAAA,QACF,KAAK;AACH,eAAK,KAAK,aAAa,OAAO;AAC9B;AAAA,QACF,KAAK;AACH,eAAK,KAAK,YAAY,OAAO;AAC7B;AAAA,MACJ;AACA;AAAA,IACF;AAKA,UAAM,eAAe,UAAU,aAAa,KAAK;AACjD,QAAI,CAAC;AAAc;AAInB,UAAM,gBAAgB,UAAU,YAAY,KAAK;AACjD,UAAM,gBAAgB,cACnB,MAAM,KAAK,EACX,IAAI,CAAC,MAAM,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK,CAAC,EACxC,OAAO,OAAO;AAEjB,UAAM,YAAY,aAAa,QAAQ,SAAS,EAAE,EAAE,KAAK;AAGzD,UAAM,aAAa,MAAM,WAAW,CAAC,GAAG;AACxC,UAAM,WAAW,cAAc,MAAM,aAAa,UAAU,GAAG,SAAS,IAAI,KAAK,IAAI;AAErF,UAAM,QAAoB;AAAA,MACxB;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,MAAM,WAAW;AAAA,MAC1B;AAAA,IACF;AAGA,QAAI,cAAc,SAAS,GAAG;AAC5B,aAAO,OAAO,OAAO,EAAE,YAAY,cAAc,CAAC;AAAA,IACpD;AAEA,SAAK,KAAK,SAAS,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAc,kBAAkB,WAAyC;AACvE,UAAM,YAAY,MAAM,KAAK,SAAS;AAAA,MACpC;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA,MAAM,CAAC,EAAE,UAAU,cAAc,aAAa,MAAM,CAAC;AAAA,UACrD,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,cAAc,UAAU,gBAAgB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,aAAa;AACrF,QAAI,CAAC;AAAa,aAAO,CAAC;AAE1B,UAAM,OAAQ,YAAY,CAAC,EAAyB,OAAO,CAAC,GAAG,MAAM,GAAG,EAAE;AAC1E,QAAI,IAAI,WAAW;AAAG,aAAO,CAAC;AAE9B,UAAM,YAAY,MAAM,KAAK,SAAS;AAAA,MACpC;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA,YAAY,CAAC,MAAM,WAAW,QAAQ,MAAM,WAAW,aAAa,cAAc,YAAY,cAAc,aAAa;AAAA,UACzH,qBAAqB;AAAA,UACrB,mBAAmB;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,YAAY,UAAU,gBAAgB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,WAAW;AACjF,QAAI,CAAC;AAAW,aAAO,CAAC;AAExB,WAAQ,UAAU,CAAC,EAA6B,QAAQ,CAAC;AAAA,EAC3D;AAAA,EAEQ,4BAA4B,OAA2B;AAC7D,UAAM,eAAe,IAAI,KAAK,MAAM,UAAU,EAAE,QAAQ;AAGxD,WAAO,OAAO,SAAS,YAAY,KAAK,gBAAgB,KAAK,cAAc;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAyB;AACrC,QAAI,KAAK,cAAc,CAAC,KAAK;AAAS;AACtC,SAAK,aAAa;AAElB,QAAI;AACF,WAAK,UAAU,MAAM,KAAK,aAAa;AAAA,IACzC,SAAS,KAAK;AACZ,WAAK,aAAa;AAClB,WAAK,KAAK,SAAS,IAAI,MAAM,+BAAgC,IAAc,OAAO,EAAE,CAAC;AACrF,WAAK,aAAa,sBAAsB;AACxC,WAAK,kBAAkB;AACvB;AAAA,IACF;AAQA,UAAM,gBAAgB,GAAG,KAAK,OAAO,WAClC,QAAQ,eAAe,QAAQ,EAC/B,QAAQ,cAAc,OAAO;AAEhC,SAAK,KAAK,IAAI,UAAU,eAAe,QAAQ;AAAA,MAC7C,SAAS;AAAA,QACP,eAAe,KAAK,cAAc;AAAA,MACpC;AAAA,MACA,mBAAmB;AAAA,MACnB,oBAAoB,KAAK;AAAA,IAC3B,CAAC;AAED,SAAK,GAAG,GAAG,uBAAuB,CAAC,MAAM,QAAQ;AAC/C,WAAK,aAAa;AAClB,YAAM,gBAAgB,OAAO,QAAQ,IAAI,OAAO,EAC7C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,IAAI,IAAK,SAAS,EAAG,EAAE,EAC1F,KAAK,IAAI;AACZ,WAAK,aAAa,+BAA+B,IAAI,cAAc,SAAS,EAAE;AAC9E,WAAK;AAAA,QACH;AAAA,QACA,IAAI;AAAA,UACF,oCAAoC,IAAI,cAAc,SAAS,IAAI,IAAI,iBAAiB,EAAE,GAAG,gBAAgB,eAAe,aAAa,KAAK,EAAE;AAAA,QAClJ;AAAA,MACF;AACA,WAAK,kBAAkB;AAAA,IACzB,CAAC;AAED,SAAK,GAAG,GAAG,QAAQ,YAAY;AAC7B,WAAK,aAAa;AAClB,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,mBAAmB;AAKxB,YAAM,YAAY,KAAK,SAAS,gBAAgB,2BAA2B;AAC3E,UAAI,aAAa,KAAK,eAAe,MAAM;AACzC,cAAM,KAAK,eAAe,SAAS;AAAA,MACrC;AAGA,WAAK,GAAI;AAAA,QACP,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,WAAW,CAAC,OAAO;AAAA,UACnB,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAEA,WAAK,KAAK,WAAW;AAAA,IACvB,CAAC;AAED,SAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,IAEzB,CAAC;AAED,SAAK,GAAG,GAAG,WAAW,OAAO,YAA+B;AAC1D,UAAI;AACF,cAAM,MAAM,KAAK,MAAM,QAAQ,SAAS,CAAC;AAIzC,YAAI,IAAI,OAAO,MAAM,eAAe;AAClC,gBAAM,KAAK,kBAAkB,GAAG;AAAA,QAClC;AAAA,MACF,SAAS,KAAK;AACZ,aAAK,KAAK,SAAS,IAAI,MAAM,wCAAyC,IAAc,OAAO,EAAE,CAAC;AAAA,MAChG;AAAA,IACF,CAAC;AAED,SAAK,GAAG,GAAG,SAAS,CAAC,MAAM,WAAW;AACpC,WAAK,aAAa;AAClB,WAAK,YAAY;AACjB,WAAK,kBAAkB;AACvB,YAAM,YAAY,QAAQ,SAAS,KAAK;AACxC,WAAK,aAAa,SAAS;AAC3B,WAAK,KAAK,gBAAgB,SAAS;AAEnC,UAAI,KAAK,SAAS;AAChB,aAAK,kBAAkB;AAAA,MACzB;AAAA,IACF,CAAC;AAED,SAAK,GAAG,GAAG,SAAS,CAAC,QAAQ;AAC3B,WAAK,aAAa;AAClB,WAAK,kBAAkB;AACvB,WAAK,aAAa,IAAI,OAAO;AAC7B,WAAK,KAAK,SAAS,GAAG;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEQ,qBAA2B;AACjC,QAAI,KAAK,WAAW;AAClB,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IACnB;AAEA,SAAK,YAAY,YAAY,MAAM;AACjC,UAAI,CAAC,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU;AAAM;AACvD,UAAI;AACF,aAAK,GAAG,KAAK;AAAA,MACf,SAAS,KAAK;AACZ,aAAK,KAAK,SAAS,IAAI,MAAM,kCAAmC,IAAc,OAAO,EAAE,CAAC;AAAA,MAC1F;AAAA,IACF,GAAG,KAAK,cAAc;AAAA,EACxB;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,WAAW;AAClB,oBAAc,KAAK,SAAS;AAC5B,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK;AAAiB;AAE1B,SAAK,kBAAkB,YAAY,MAAM;AACvC,UAAI,CAAC,KAAK;AAAS;AAEnB,WAAK,KAAK,sBAAsB,EAAE,EAAE,MAAM,CAAC,QAAQ;AACjD,aAAK,KAAK,SAAS,IAAI,MAAM,4BAA6B,IAAc,OAAO,EAAE,CAAC;AAAA,MACpF,CAAC;AAAA,IACH,GAAG,KAAK,oBAAoB;AAAA,EAC9B;AAAA,EAEA,MAAc,kBAAkB,aAA6C;AAC3E,QAAI,CAAC,KAAK;AAAS;AAEnB,UAAM,YAAY,KAAK,QAAQ,gBAAgB,2BAA2B;AAC1E,QAAI,CAAC;AAAW;AAEhB,UAAM,iBAAiB,YAAY,QAAQ,SAAS;AACpD,QAAI,CAAC,gBAAgB;AAAO;AAE5B,QAAI;AACF,UAAI,KAAK,eAAe,MAAM;AAG5B,cAAM,KAAK,eAAe,SAAS;AACnC;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,KAAK,iBAAiB,WAAW,KAAK,UAAU;AACrE,iBAAW,SAAS,QAAQ;AAC1B,aAAK,aAAa,KAAK;AAAA,MACzB;AAAA,IACF,SAAS,KAAK;AACZ,WAAK,KAAK,SAAS,IAAI,MAAM,2BAA4B,IAAc,OAAO,EAAE,CAAC;AAAA,IACnF;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK;AAAgB;AAEzB,SAAK,iBAAiB,WAAW,YAAY;AAC3C,WAAK,iBAAiB;AACtB,UAAI,KAAK,SAAS;AAChB,cAAM,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF,GAAG,KAAK,iBAAiB;AAAA,EAC3B;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,aAAa,KAAK;AAAA,EAChC;AAAA,EAEA,yBAAkC;AAChC,WAAO,KAAK,iBAAiB,CAAC,KAAK;AAAA,EACrC;AAAA,EAEQ,cAAoB;AAC1B,QAAI,KAAK,WAAW;AAClB,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IACnB;AACA,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,aAAa,QAAsB;AACzC,QAAI,CAAC,KAAK,WAAW,KAAK;AAAe;AAEzC,SAAK,gBAAgB;AACrB,SAAK,KAAK,SAAS,IAAI,MAAM,wDAAwD,MAAM,EAAE,CAAC;AAC9F,SAAK,KAAK,WAAW;AAErB,UAAM,OAAO,YAAY;AACvB,UAAI,CAAC,KAAK,WAAW,KAAK,WAAW;AACnC,aAAK,YAAY;AACjB;AAAA,MACF;AAEA,UAAI;AACF,YAAI,CAAC,KAAK,SAAS;AACjB,eAAK,UAAU,MAAM,KAAK,aAAa;AAAA,QACzC;AAEA,cAAM,YAAY,KAAK,QAAQ,gBAAgB,2BAA2B,KACrE,OAAO,KAAK,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAEzC,YAAI,CAAC,WAAW;AACd,gBAAM,IAAI,MAAM,2CAA2C;AAAA,QAC7D;AAEA,YAAI,KAAK,eAAe,MAAM;AAC5B,gBAAM,eAAe,MAAM,KAAK,kBAAkB,SAAS;AAC3D,qBAAW,SAAS,aAAa,KAAK,CAAC,GAAG,MAAM;AAC9C,kBAAM,MAAM,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ;AAC3C,kBAAM,MAAM,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ;AAC3C,mBAAO,MAAM;AAAA,UACf,CAAC,GAAG;AACF,gBAAI,CAAC,KAAK,4BAA4B,KAAK;AAAG;AAC9C,iBAAK,aAAa,KAAK;AAAA,UACzB;AACA,gBAAM,KAAK,eAAe,SAAS;AAAA,QACrC,OAAO;AACL,gBAAM,SAAS,MAAM,KAAK,iBAAiB,WAAW,KAAK,UAAU;AACrE,qBAAW,SAAS,QAAQ;AAC1B,iBAAK,aAAa,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,aAAK,KAAK,SAAS,IAAI,MAAM,4BAA6B,IAAc,OAAO,EAAE,CAAC;AAAA,MACpF,UAAE;AACA,YAAI,KAAK,WAAW,CAAC,KAAK,WAAW;AACnC,eAAK,YAAY,WAAW,MAAM,KAAK,iBAAiB;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,SAAK,YAAY,WAAW,MAAM,CAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,QAAgB,UAAoC;AACrE,QAAI,CAAC,KAAK,SAAS;AAEjB,WAAK,UAAU,MAAM,KAAK,aAAa;AAAA,IACzC;AAEA,UAAM,YAAY,KAAK,QAAQ,gBAAgB,2BAA2B,KACrE,OAAO,KAAK,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAGzC,QAAI,cAAc,KAAK,QAAQ,eAC1B,GAAG,KAAK,OAAO;AAIpB,QAAI;AACF,YAAM,SAAS,IAAI,IAAI,WAAW;AAClC,YAAM,aAAa,IAAI,IAAI,KAAK,OAAO;AACvC,aAAO,WAAW,WAAW;AAC7B,aAAO,OAAO,WAAW;AACzB,oBAAc,OAAO,SAAS;AAAA,IAChC,QAAQ;AAAA,IAER;AAEA,UAAM,eAAe,YAAY;AACjC,kBAAc,YACX,QAAQ,mCAAmC,mBAAmB,SAAS,CAAC,EACxE,QAAQ,6BAA6B,mBAAmB,MAAM,CAAC,EAC/D,QAAQ,yBAAyB,mBAAmB,YAAY,CAAC,EACjE,QAAQ,yBAAyB,0BAA0B;AAI9D,UAAM,cAAc;AACpB,QAAI,aAA4B;AAChC,aAAS,UAAU,GAAG,WAAW,aAAa,WAAW;AACvD,YAAM,MAAM,MAAM,MAAM,aAAa;AAAA,QACnC,SAAS,EAAE,eAAe,KAAK,cAAc,EAAE;AAAA,MACjD,CAAC;AACD,mBAAa,IAAI;AACjB,UAAI,IAAI,IAAI;AACV,cAAM,cAAc,MAAM,IAAI,YAAY;AAC1C,eAAO,OAAO,KAAK,WAAW;AAAA,MAChC;AACA,UAAI,UAAU,gBAAgB,IAAI,WAAW,OAAO,IAAI,WAAW,OAAO,IAAI,WAAW,MAAM;AAC7F,gBAAQ;AAAA,UACN,yCAAyC,IAAI,MAAM,YAAY,OAAO,IAAI,WAAW,QAAQ,WAAW;AAAA,QAC1G;AACA,cAAM,QAAQ,KAAK,IAAI,MAAO,KAAK,IAAI,GAAG,UAAU,CAAC,GAAG,IAAK;AAC7D,cAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,KAAK,CAAC;AAC3C;AAAA,MACF;AACA,cAAQ;AAAA,QACN,0CAA0C,IAAI,MAAM,YAAY,OAAO,IAAI,WAAW,QAAQ,WAAW;AAAA,MAC3G;AACA,YAAM,IAAI;AAAA,QACR,gCAAgC,IAAI,MAAM,YAAY,OAAO,IAAI,WAAW,WAAW,MAAM,aAAa,YAAY,YAAY,QAAQ,WAAW;AAAA,MACvJ;AAAA,IACF;AACA,UAAM,IAAI;AAAA,MACR,8CAA8C,cAAc,SAAS,YAAY,WAAW,IAAI,WAAW,WAAW,MAAM,aAAa,YAAY,YAAY,QAAQ,WAAW;AAAA,IACtL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAsB,QAAQ,IAAqB;AACvD,QAAI,CAAC,KAAK,SAAS;AACjB,WAAK,UAAU,MAAM,KAAK,aAAa;AAAA,IACzC;AAEA,UAAM,YAAY,KAAK,QAAQ,gBAAgB,2BAA2B,KACrE,OAAO,KAAK,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAEzC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,UAAM,YAAY,MAAM,KAAK,SAAS;AAAA,MACpC;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA,MAAM,CAAC,EAAE,UAAU,cAAc,aAAa,MAAM,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,cAAc,UAAU,gBAAgB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,aAAa;AACrF,QAAI,CAAC;AAAa,aAAO;AAEzB,UAAM,OAAQ,YAAY,CAAC,EAAyB,OAAO,CAAC,GAAG,MAAM,GAAG,KAAK;AAC7E,QAAI,IAAI,WAAW;AAAG,aAAO;AAE7B,UAAM,YAAY,MAAM,KAAK,SAAS;AAAA,MACpC;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA,YAAY,CAAC,MAAM,WAAW,QAAQ,MAAM,WAAW,aAAa,cAAc,YAAY,cAAc,aAAa;AAAA,UACzH,qBAAqB;AAAA,UACrB,mBAAmB;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,YAAY,UAAU,gBAAgB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,WAAW;AACjF,QAAI,CAAC;AAAW,aAAO;AAEvB,UAAM,SAAU,UAAU,CAAC,EAA6B,QAAQ,CAAC;AACjE,eAAW,SAAS,OAAO,KAAK,CAAC,GAAG,MAAM;AACxC,YAAM,MAAM,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ;AAC3C,YAAM,MAAM,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ;AAC3C,aAAO,MAAM;AAAA,IACf,CAAC,GAAG;AACF,UAAI,CAAC,KAAK,4BAA4B,KAAK;AAAG;AAC9C,WAAK,aAAa,KAAK;AAAA,IACzB;AAEA,WAAO,OAAO;AAAA,EAChB;AACF;;;AIr1BA,SAAS,uBAAyC;AAClD,SAAS,kBAAkB;AAG3B,IAAM,WAAW,CAAC,MAAc,EAAE,QAAQ,WAAW,GAAG,EAAE,KAAK;AAoBxD,IAAM,aAAN,MAAiB;AAAA,EAGtB,YAA6B,QAAoB;AAApB;AAC3B,SAAK,YAAY,gBAAgB;AAAA,MAC/B,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO,UAAU;AAAA,MACzB,MAAM;AAAA,QACJ,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,oBAAoB,OAAO,sBAAsB;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAfQ;AAAA,EAiBA,eAAuB;AAC7B,WAAO,KAAK,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY,KAAK;AAAA,EAC1D;AAAA,EAEQ,gBAAgB,OAAuB;AAC7C,WAAO,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY,KAAK;AAAA,EAC/C;AAAA,EAEQ,sBAAsB,IAAqB;AACjD,WAAO;AAAA,MACL,KAAK,OAAO,eACT,KAAK,OAAO,aACZ,KAAK,aAAa,KAClB,KAAK,aAAa,MAAM,KAAK,gBAAgB,EAAE;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,MAMU;AAClC,UAAM,OAAO,KAAK,OAAO,aAAa,QAAQ,OAAO,EAAE;AACvD,QAAI,CAAC,QAAQ,CAAC,KAAK,OAAO,WAAW;AACnC,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,UAAM,MAAM,MAAM,MAAM,GAAG,IAAI,aAAa;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,SAAS,KAAK,OAAO,SAAS;AAAA,QAC7C,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,IAAI,KAAK;AAAA,QACT,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK,aAAa,IAAI,CAAC,OAAO;AAAA,UACzC,UAAU,EAAE;AAAA,UACZ,aAAa,EAAE;AAAA,UACf,SAAS,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU,EAAE,QAAQ,SAAS,QAAQ;AAAA,QAClF,EAAE;AAAA,MACJ,CAAC;AAAA,IACH,CAAC;AAED,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC9C,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,KAAK,WAAW,qBAAqB,IAAI,MAAM,EAAE;AAAA,IACnE;AACA,WAAO,EAAE,WAAW,KAAK,UAAU;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,MAAuE;AACpF,UAAM,SAAS,WAAW;AAC1B,UAAM,cAAc,qBAAqB;AAAA,MACvC;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK,gBAAgB,CAAC;AAAA,MACpC,cAAc,KAAK;AAAA,IACrB,CAAC;AAED,UAAM,eAAwC;AAAA,MAC5C,MAAM,KAAK,OAAO;AAAA,MAClB,IAAI,KAAK;AAAA,MACT,SAAS,eAAe,SAAS,KAAK,KAAK,CAAC;AAAA,MAC5C,MAAM;AAAA,QACJ,SAAS,KAAK,KAAK;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB,KAAK,cAAc,aAAa,KAAK,WAAW,MAAM;AAAA,QACtD,KAAK,cAAc,SACf;AAAA,EAAa,KAAK,aAAa,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KAC9D;AAAA,QACJ,KAAK,YAAY;AAAA,QACjB;AAAA,QACA;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,MACZ,SAAS;AAAA,IACX;AAEA,QAAI,KAAK,aAAa,QAAQ;AAC5B,mBAAa,cAAc,KAAK,YAAY,IAAI,QAAM;AAAA,QACpD,UAAU,EAAE;AAAA,QACZ,SAAS,OAAO,EAAE,YAAY,WAAW,OAAO,KAAK,EAAE,SAAS,QAAQ,IAAI,EAAE;AAAA,QAC9E,aAAa,EAAE;AAAA,MACjB,EAAE;AAAA,IACJ;AAEA,QAAI,KAAK,sBAAsB,KAAK,EAAE,GAAG;AACvC,YAAMA,QAAO,MAAM,KAAK,YAAY;AAAA,QAClC,IAAI,KAAK;AAAA,QACT,SAAS,aAAa;AAAA,QACtB,MAAM,aAAa;AAAA,QACnB;AAAA,QACA,aAAa,KAAK,aAAa,IAAI,QAAM;AAAA,UACvC,UAAU,EAAE;AAAA,UACZ,aAAa,EAAE;AAAA,UACf,SAAS,OAAO,EAAE,YAAY,WAAW,OAAO,KAAK,EAAE,SAAS,QAAQ,IAAI,EAAE;AAAA,QAChF,EAAE;AAAA,MACJ,CAAC;AACD,aAAO,EAAE,QAAQ,WAAWA,MAAK,aAAa,GAAG;AAAA,IACnD;AAEA,UAAM,OAAO,MAAM,KAAK,UAAU,SAAS,YAAY;AAEvD,WAAO,EAAE,QAAQ,WAAW,KAAK,aAAa,GAAG;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAwC;AACvD,UAAM,cAAc,mBAAmB;AAAA,MACrC,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,kBAAkB,KAAK;AAAA,IACzB,CAAC;AAED,UAAM,WAAoC;AAAA,MACxC,MAAM,KAAK,OAAO;AAAA,MAClB,IAAI,KAAK;AAAA,MACT,SAAS,sBAAsB,KAAK,MAAM,WAAM,KAAK,MAAM;AAAA,MAC3D,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,YAAY,KAAK,MAAM;AAAA,QACvB,WAAW,KAAK,MAAM;AAAA,QACtB;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK,WAAW;AAAA,SAAY,KAAK,QAAQ,KAAK;AAAA,MAChD,EACG,OAAO,CAAC,MAAM,MAAM,EAAE,EACtB,KAAK,IAAI;AAAA,MACZ,SAAS;AAAA,IACX;AACA,QAAI,KAAK,WAAW;AAClB,eAAS,YAAY,KAAK;AAC1B,eAAS,aAAa,KAAK;AAAA,IAC7B;AACA,QAAI,KAAK,aAAa,QAAQ;AAC5B,eAAS,cAAc,KAAK,YAAY,IAAI,QAAM;AAAA,QAChD,UAAU,EAAE;AAAA,QACZ,SAAS,OAAO,EAAE,YAAY,WAAW,OAAO,KAAK,EAAE,SAAS,QAAQ,IAAI,EAAE;AAAA,QAC9E,aAAa,EAAE;AAAA,MACjB,EAAE;AAAA,IACJ;AAEA,QAAI,KAAK,sBAAsB,KAAK,EAAE,GAAG;AACvC,YAAM,KAAK,YAAY;AAAA,QACrB,IAAI,KAAK;AAAA,QACT,SAAS,SAAS;AAAA,QAClB,MAAM,SAAS;AAAA,QACf;AAAA,QACA,aAAa,KAAK,aAAa,IAAI,QAAM;AAAA,UACvC,UAAU,EAAE;AAAA,UACZ,aAAa,EAAE;AAAA,UACf,SAAS,OAAO,EAAE,YAAY,WAAW,OAAO,KAAK,EAAE,SAAS,QAAQ,IAAI,EAAE;AAAA,QAChF,EAAE;AAAA,MACJ,CAAC;AACD;AAAA,IACF;AACA,UAAM,KAAK,UAAU,SAAS,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,MAAsC;AACnD,UAAM,cAAc,iBAAiB;AAAA,MACnC,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,eAAe,KAAK;AAAA,MACpB,kBAAkB,KAAK;AAAA,IACzB,CAAC;AAED,UAAM,eAAwC;AAAA,MAC5C,MAAM,KAAK,OAAO;AAAA,MAClB,IAAI,KAAK;AAAA,MACT,SAAS,oBAAoB,KAAK,MAAM;AAAA,MACxC,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,YAAY,KAAK,MAAM;AAAA,QACvB;AAAA,QACA,aAAa,KAAK,QAAQ;AAAA,QAC1B;AAAA,QACA,mBAAmB,KAAK,aAAa;AAAA,QACrC;AAAA,QACA,KAAK,iBAAiB,SAClB;AAAA,EAAuB,KAAK,iBAAiB,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KACzF;AAAA,MACN,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,MACZ,SAAS;AAAA,IACX;AACA,QAAI,KAAK,WAAW;AAClB,mBAAa,YAAY,KAAK;AAC9B,mBAAa,aAAa,KAAK;AAAA,IACjC;AACA,QAAI,KAAK,aAAa,QAAQ;AAC5B,mBAAa,cAAc,KAAK,YAAY,IAAI,QAAM;AAAA,QACpD,UAAU,EAAE;AAAA,QACZ,SAAS,OAAO,EAAE,YAAY,WAAW,OAAO,KAAK,EAAE,SAAS,QAAQ,IAAI,EAAE;AAAA,QAC9E,aAAa,EAAE;AAAA,MACjB,EAAE;AAAA,IACJ;AAEA,QAAI,KAAK,sBAAsB,KAAK,EAAE,GAAG;AACvC,YAAM,KAAK,YAAY;AAAA,QACrB,IAAI,KAAK;AAAA,QACT,SAAS,aAAa;AAAA,QACtB,MAAM,aAAa;AAAA,QACnB;AAAA,QACA,aAAa,KAAK,aAAa,IAAI,QAAM;AAAA,UACvC,UAAU,EAAE;AAAA,UACZ,aAAa,EAAE;AAAA,UACf,SAAS,OAAO,EAAE,YAAY,WAAW,OAAO,KAAK,EAAE,SAAS,QAAQ,IAAI,EAAE;AAAA,QAChF,EAAE;AAAA,MACJ,CAAC;AACD;AAAA,IACF;AACA,UAAM,KAAK,UAAU,SAAS,YAAY;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAyE;AACrF,UAAM,cAAc,gBAAgB,EAAE,QAAQ,KAAK,OAAO,CAAC;AAC3D,UAAM,WAAoC;AAAA,MACxC,MAAM,KAAK,OAAO;AAAA,MAClB,IAAI,KAAK;AAAA,MACT,SAAS,mBAAmB,KAAK,MAAM;AAAA,MACvC,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AACA,QAAI,KAAK,WAAW;AAClB,eAAS,YAAY,KAAK;AAC1B,eAAS,aAAa,KAAK;AAAA,IAC7B;AAEA,QAAI,KAAK,sBAAsB,KAAK,EAAE,GAAG;AACvC,YAAM,KAAK,YAAY;AAAA,QACrB,IAAI,KAAK;AAAA,QACT,SAAS,SAAS;AAAA,QAClB,MAAM,SAAS;AAAA,QACf;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,UAAM,KAAK,UAAU,SAAS,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAA2B;AAC/B,QAAI;AACF,YAAM,KAAK,UAAU,OAAO;AAC5B,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;;;ACzRO,IAAM,aAAN,cAAyB,YAA8B;AAAA,EACpD;AAAA,EACA;AAAA,EACS;AAAA,EAEjB,YAAY,QAA0B;AACpC,UAAM;AACN,SAAK,SAAS;AAGd,QAAI;AACJ,QAAI;AACF,YAAM,UAAU,OAAO,KAAK,OAAO,WAAW,QAAQ,EAAE,SAAS,OAAO;AACxE,YAAM,WAAW,QAAQ,QAAQ,GAAG;AACpC,UAAI,WAAW;AAAG,cAAM,IAAI,MAAM,2DAA2D;AAC7F,iBAAW,QAAQ,MAAM,WAAW,CAAC;AACrC,UAAI,CAAC;AAAU,cAAM,IAAI,MAAM,mCAAmC;AAAA,IACpE,SAAS,KAAK;AACZ,UAAI,eAAe,SAAS,IAAI,QAAQ,WAAW,mBAAmB;AAAG,cAAM;AAC/E,YAAM,IAAI,MAAM,+BAAgC,IAAc,OAAO,EAAE;AAAA,IACzE;AAEA,SAAK,aAAa,IAAI,eAAe;AAAA,MACnC,OAAO,OAAO;AAAA,MACd,UAAU,YAAY,OAAO;AAAA,MAC7B,SAAS,OAAO;AAAA,MAChB,mBAAmB,OAAO,qBAAqB;AAAA,MAC/C,oBAAoB,OAAO;AAAA,IAC7B,CAAC;AAED,SAAK,aAAa,IAAI,WAAW;AAAA,MAC/B,MAAM,OAAO;AAAA,MACb,MAAM,OAAO,YAAY;AAAA,MACzB,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,aAAa,OAAO,mBAAmB,OAAO;AAAA,MAC9C,WAAW,OAAO;AAAA,MAClB,oBAAoB,OAAO;AAAA,IAC7B,CAAC;AAGD,SAAK,WAAW,GAAG,iBAAiB,CAAC,SAAuB;AAC1D,WAAK,KAAK,iBAAiB,IAAI;AAAA,IACjC,CAAC;AAED,SAAK,WAAW,GAAG,eAAe,CAAC,WAAuB;AACxD,WAAK,KAAK,eAAe,MAAM;AAAA,IACjC,CAAC;AAED,SAAK,WAAW,GAAG,aAAa,CAAC,SAAmB;AAClD,WAAK,KAAK,aAAa,IAAI;AAAA,IAC7B,CAAC;AAED,SAAK,WAAW,GAAG,YAAY,CAAC,QAAiB;AAC/C,WAAK,KAAK,YAAY,GAAG;AAAA,IAC3B,CAAC;AAGD,SAAK,WAAW,GAAG,YAAY,OAAO,EAAE,IAAI,QAAQ,UAAU,MAAyD;AACrH,UAAI;AACF,cAAM,KAAK,WAAW,QAAQ,EAAE,IAAI,QAAQ,WAAW,UAAU,CAAC;AAAA,MACpE,SAAS,KAAK;AACZ,gBAAQ,KAAK,sCAAsC,MAAM,KAAM,IAAc,OAAO,EAAE;AAAA,MACxF;AAAA,IACF,CAAC;AAED,SAAK,WAAW,GAAG,SAAS,CAAC,UAAsB;AACjD,WAAK,KAAK,SAAS,KAAK;AAAA,IAC1B,CAAC;AAED,SAAK,WAAW,GAAG,aAAa,MAAM;AACpC,WAAK,KAAK,WAAW;AAAA,IACvB,CAAC;AAED,SAAK,WAAW,GAAG,gBAAgB,CAAC,WAAmB;AACrD,WAAK,KAAK,gBAAgB,MAAM;AAAA,IAClC,CAAC;AAED,SAAK,WAAW,GAAG,SAAS,CAAC,QAAe;AAC1C,WAAK,KAAK,SAAS,GAAG;AAAA,IACxB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAyB;AAC7B,UAAM,KAAK,WAAW,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,WAAW,KAAK;AACrB,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAuB;AACrB,WAAO,KAAK,WAAW,YAAY;AAAA,EACrC;AAAA,EAEA,yBAAkC;AAChC,WAAO,KAAK,WAAW,uBAAuB;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,SAAS,MAAuE;AACpF,WAAO,KAAK,WAAW,SAAS,IAAI;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAwC;AACvD,WAAO,KAAK,WAAW,WAAW,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,MAAsC;AACnD,WAAO,KAAK,WAAW,SAAS,IAAI;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,QAAgB,UAAoC;AACrE,WAAO,KAAK,WAAW,aAAa,QAAQ,QAAQ;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAsB,OAAiC;AAC3D,WAAO,KAAK,WAAW,sBAAsB,KAAK;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA+B;AACnC,WAAO,KAAK,WAAW,OAAO;AAAA,EAChC;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,KAAK,OAAO;AAAA,EACrB;AACF;;;ACzNA,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,SAAS,YAAY;AAC9B,SAAS,eAAe;AAQjB,SAAS,yBAAiC;AAC/C,SAAO,KAAK,QAAQ,GAAG,aAAa,cAAc,wBAAwB,mBAAmB;AAC/F;AAEO,SAAS,mBAAmB,MAAgC;AACjE,QAAM,WAAW,QAAQ,uBAAuB;AAChD,MAAI,CAAC,WAAW,QAAQ;AAAG,WAAO;AAClC,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,aAAa,UAAU,OAAO,CAAC;AACzD,QAAI,CAAC,OAAO,SAAS,CAAC,OAAO,aAAa,CAAC,OAAO;AAAc,aAAO;AACvE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,UAAoB,MAAqB;AAC1E,QAAM,WAAW,QAAQ,uBAAuB;AAChD,YAAU,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,gBAAc,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AACpE;AAEO,SAAS,UAAU,KAAmB;AAC3C,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC;AAEO,SAAS,eAAe,MAAsB;AACnD,SAAO,aAAa,IAAI;AAC1B;AAEO,SAAS,gBAAgB,MAAc,SAAoC;AAChF,YAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,gBAAc,MAAM,OAAO;AAC7B;;;ACqCA,SAAS,kBACP,MACA,gBACuC;AACvC,MAAI,CAAC,gBAAgB;AAAQ,WAAO,EAAE,SAAS,KAAK;AAEpD,QAAM,SAAS,KAAK,KAAK,YAAY;AACrC,QAAM,SAAS,eAAe,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,EAAE,YAAY,MAAM,MAAM;AACxF,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,SAAS,OAAO,QAAQ,UAAU,KAAK,IAAI,oCAAoC;AAAA,EAC1F;AAEA,QAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC7C,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAEA,QAAM,UAAU,KAAK,mBAAmB,CAAC;AACzC,QAAM,iBAAiB,OAAO,QAAQ,KAAK,EACxC,IAAI,CAAC,CAAC,KAAK,aAAa,MAAM;AAAA,IAC7B;AAAA,KACC,iBAAiB,CAAC,GAAG,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,EACnE,CAAU,EACT,OAAO,CAAC,CAAC,EAAE,aAAa,MAAM,cAAc,SAAS,CAAC;AAEzD,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAEA,aAAW,CAAC,KAAK,aAAa,KAAK,gBAAgB;AACjD,UAAM,eAAe,QAAQ,GAAG;AAChC,QAAI,CAAC,cAAc;AACjB,aAAO,EAAE,SAAS,OAAO,QAAQ,yCAAyC,GAAG,IAAI;AAAA,IACnF;AACA,QAAI,CAAC,cAAc,SAAS,YAAY,GAAG;AACzC,aAAO,EAAE,SAAS,OAAO,QAAQ,mBAAmB,GAAG,IAAI,YAAY,kBAAkB;AAAA,IAC3F;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,KAAK;AACzB;AAYA,SAAS,QAAQ,UAA0B;AACzC,MAAI,SAAS,WAAW,SAAS,KAAK,SAAS,WAAW,UAAU,GAAG;AACrE,WAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,EACnC;AACA,SAAO,WAAW,QAAQ;AAC5B;AAEA,IAAM,eAAe,oBAAI,IAAyB;AAElD,IAAM,qBAAqB,oBAAI,IAAwF;AAOvH,IAAM,oBAAoB,oBAAI,IAAyE;AACvG,IAAI,aAAgC;AACpC,IAAI,aAAa;AACjB,IAAI,sBAAsB;AAC1B,IAAI,uBAAuB;AAC3B,IAAI,oBAA8D;AAClE,IAAI,0BAAoE;AACxE,IAAI,iBAAwC;AAC5C,IAAI,wBAA+C;AAGnD,IAAI,oBAAoB;AAGxB,IAAI,iBAAsB;AAE1B,IAAI,aAAkB;AAEtB,SAAS,kBACP,KACA,MACA,OACA,cACM;AACN,MAAI,SAAS;AAAc;AAE3B,MAAI,SAAS,WAAW;AACtB,QAAI,OAAO,KAAK,kEAA6D,KAAK,EAAE;AACpF;AAAA,EACF;AAEA,MAAI,iBAAiB,WAAW;AAC9B,QAAI,OAAO,KAAK,iDAA4C,KAAK,EAAE;AACnE;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,wCAAmC,KAAK,EAAE;AAC5D;AAiBA,eAAe,aAAa,KAAsC;AAChE,QAAM,QAAQ,IAAI,QAAQ,kBACvB,YAAY,EACZ,QAAQ,WAAW,GAAG,EACtB,QAAQ,eAAe,EAAE;AAE5B,QAAM,OAAO,QAAQ,IAAI,QAAQ;AAGjC,QAAM,MAAM,MAAM,MAAM,GAAG,IAAI,4BAA4B;AAAA,IACzD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,aAAa,2BAA2B,CAAC;AAAA,EACxE,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAO,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC9C,UAAM,IAAI,MAAM,6BAA6B,IAAI,MAAM,MAAM,IAAI,SAAS,IAAI,UAAU,EAAE;AAAA,EAC5F;AAEA,QAAM,UAAW,MAAM,IAAI,KAAK;AAMhC,QAAM,UAAU,MAAM;AAAA,IACpB,GAAG,IAAI,+BAA+B,mBAAmB,QAAQ,gBAAgB,CAAC;AAAA,EACpF;AAEA,MAAI,CAAC,QAAQ,IAAI;AACf,UAAM,MAAO,MAAM,QAAQ,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAClD,UAAM,IAAI,MAAM,oCAAoC,QAAQ,MAAM,MAAM,IAAI,SAAS,QAAQ,UAAU,EAAE;AAAA,EAC3G;AAEA,QAAM,WAAY,MAAM,QAAQ,KAAK;AAMrC,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,WAAW,SAAS,KAAK;AAAA,IACzB,cAAc,SAAS,KAAK;AAAA,EAC9B;AACF;AAOA,eAAe,gBAAgB,KAAsC;AACnE,QAAM,SAAS,mBAAmB,IAAI,mBAAmB,uBAAuB,CAAC;AACjF,MAAI;AAAQ,WAAO;AAEnB,QAAM,WAAW,MAAM,aAAa,GAAG;AACvC,qBAAmB,UAAU,IAAI,mBAAmB,uBAAuB,CAAC;AAC5E,SAAO;AACT;AAIA,IAAO,cAAQ;AAAA,EACb,IAAI;AAAA,EACJ,MAAM;AAAA,EAEN,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,YAAY;AAAA,MACV,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACf;AAAA,MACA,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,aACE;AAAA,MAGJ;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,aACE;AAAA,QAEF,OAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU,CAAC,QAAQ;AAAA,UACnB,YAAY;AAAA,YACV,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,YACA,sBAAsB;AAAA,cACpB,MAAM;AAAA,cACN,aACE;AAAA,cAEF,sBAAsB;AAAA,gBACpB,MAAM;AAAA,gBACN,OAAO,EAAE,MAAM,SAAS;AAAA,cAC1B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,KAAU;AAGjB,UAAM,MAAO,IAAI,gBAAgB,CAAC;AAOlC,QAAI,gBAAgB;AAAA,MAClB,IAAI;AAAA,MACJ,MAAM,EAAE,OAAO,OAAO;AAAA,MACtB,cAAc,EAAE,WAAW,CAAC,IAAI,EAAE;AAAA,MAClC,QAAQ;AAAA,QACN,gBAAgB,MAAM,IAAI,WAAW,CAAC,SAAS,IAAI,CAAC;AAAA,QACpD,gBAAgB,OAAO,EAAE,UAAU,IAAI,SAAS;AAAA,QAChD,WAAW,MAAM,CAAC,CAAC,IAAI;AAAA,QACvB,cAAc,MAAM,CAAC,CAAC,mBAAmB,IAAI,mBAAmB,uBAAuB,CAAC;AAAA,MAC1F;AAAA,MACA,SAAS;AAAA,QACP,cAAc,OAAO,QAAgF;AAEnG,2BAAiB,IAAI,kBAAkB;AACvC,uBAAa,IAAI,OAAO;AACxB,cAAI,OAAO,KAAK,wDAAmD,iBAAiB,cAAc,eAAe,EAAE;AAGnH,gBAAM,IAAI,QAAc,CAAC,YAAY;AACnC,gBAAI,aAAa,iBAAiB,SAAS,MAAM,QAAQ,CAAC;AAAA,UAC5D,CAAC;AACD,2BAAiB;AACjB,uBAAa;AAAA,QACf;AAAA,QACA,aAAa,YAAY;AACvB,2BAAiB;AACjB,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF,CAAC;AAED,aAAS,qBAAqB,YAAoB,OAAqB;AACrE,UAAI;AACF,YAAI,QAAQ,OAAO,oBAAoB,EAAE,QAAQ,QAAQ,WAAW,CAAC;AACrE,YAAI,OAAO,KAAK,kCAAkC,KAAK,gBAAgB,UAAU,EAAE;AAAA,MACrF,SAAS,KAAK;AACZ,YAAI,OAAO,KAAK,0CAA0C,KAAK,KAAM,IAAc,OAAO,EAAE;AAAA,MAC9F;AAAA,IACF;AAEA,aAAS,wBAAwB,MAAyB;AACxD,YAAM,WAAW,MAAM,qBAAqB,mBAAmB,QAAQ,KAAK,MAAM,EAAE;AACpF,YAAM,aAAa,gBAAgB,OAAO;AAE1C,UAAI,OAAO;AAAA,QACT,kCAAkC,KAAK,MAAM,0BAAqB,iBAAiB,QAAQ,IAAI,eAAe,aAAa,QAAQ,IAAI,eAAe,OAAO,eAAe,aAAa,QAAQ,IAAI,YAAY,iBAAiB;AAAA,MACpO;AAEA,UAAI,CAAC,kBAAkB,CAAC,cAAc,OAAO,eAAe,YAAY;AACtE,iBAAS;AACT;AAAA,MACF;AAEA,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAEX,UAAI;AACF,aAAK,QAAQ,QAAQ,WAAW;AAAA,UAC9B,KAAK;AAAA,YACH,MAAM,KAAK,YAAY,KAAK;AAAA,YAC5B,cAAc;AAAA,YACd,MAAM,KAAK;AAAA,YACX,IAAI;AAAA,YACJ,YAAY,qBAAqB,KAAK,MAAM;AAAA,YAC5C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,UAAU;AAAA,YACV,SAAS;AAAA,YACT,oBAAoB;AAAA,YACpB,eAAe,KAAK;AAAA,YACpB,YAAY,KAAK,aAAa,KAAK;AAAA,YACnC,WAAW,KAAK,IAAI;AAAA,YACpB,YAAY,KAAK;AAAA,YACjB,UAAU,KAAK;AAAA,YACf,mBAAmB;AAAA,UACrB;AAAA,UACA,KAAK;AAAA,UACL,mBAAmB;AAAA,YACjB,SAAS,YAAY;AAAA,YAAC;AAAA,YACtB,SAAS,CAAC,QAAiB;AACzB,kBAAI,OAAO,MAAM,0CAA0C,KAAK,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,YAC/H;AAAA,UACF;AAAA,QACF,CAAC,CAAC,EAAE,KAAK,MAAM;AACb,cAAI,OAAO,KAAK,8CAA8C,KAAK,MAAM,EAAE;AAAA,QAC7E,CAAC,EAAE,MAAM,CAAC,QAAe;AACvB,cAAI,OAAO,MAAM,2CAA2C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AACzF,mBAAS;AAAA,QACX,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,YAAI,OAAO,MAAM,wDAAwD,KAAK,MAAM,KAAM,IAAc,OAAO,EAAE;AACjH,iBAAS;AAAA,MACX;AAAA,IACF;AAGA,mBAAe,UAAU,UAAsE;AAC7F,UAAI,gBAAgB;AAClB,sBAAc,cAAc;AAC5B,yBAAiB;AAAA,MACnB;AACA,UAAI,uBAAuB;AACzB,sBAAc,qBAAqB;AACnC,gCAAwB;AAAA,MAC1B;AAEA,mBAAa,SAAS;AACtB,4BAAsB;AACtB,6BAAuB;AACvB,0BAAoB;AACpB,gCAA0B;AAC1B,UAAI,OAAO,KAAK,wCAAmC,UAAU,EAAE;AAI/D,YAAM,OAAO,QAAQ,IAAI,QAAQ;AAEjC,mBAAa,IAAI,WAAW;AAAA,QAC1B,OAAO,SAAS;AAAA,QAChB,WAAW,SAAS;AAAA,QACpB,SAAS;AAAA,QACT,UAAU,IAAI,IAAI,IAAI,EAAE;AAAA,QACxB,UAAU;AAAA,QACV,cAAc,SAAS;AAAA;AAAA;AAAA,QAGvB,oBAAoB;AAAA,MACtB,CAAC;AAED,iBAAW,GAAG,iBAAiB,CAAC,SAAuB;AACrD,YAAI,OAAO,KAAK,gCAA2B,KAAK,MAAM,MAAM,KAAK,KAAK,WAAW,KAAK,IAAI,EAAE;AAE5F,YAAI;AAEF,gBAAM,WAAW,kBAAkB,MAAM,IAAI,cAAc;AAC3D,cAAI,CAAC,SAAS,SAAS;AACrB,gBAAI,OAAO,KAAK,6CAAwC,KAAK,IAAI,UAAU,KAAK,MAAM,YAAY,SAAS,MAAM,EAAE;AACnH,iBAAK,WAAY,WAAW;AAAA,cAC1B,IAAI,KAAK;AAAA,cACT,QAAQ,KAAK;AAAA,cACb,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,UAAU,SAAS,UAAU,UAAU,KAAK,IAAI;AAAA,YAClD,CAAC,EAAE,MAAM,CAAC,QAAe;AACvB,kBAAI,OAAO,MAAM,4CAA4C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAAA,YAC5F,CAAC;AACD;AAAA,UACF;AAEA,uBAAa,IAAI,KAAK,QAAQ;AAAA,YAC5B,QAAQ,KAAK;AAAA,YACb,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,UAAU,KAAK,YAAY;AAAA,YAC3B,cAAc,KAAK;AAAA,YACnB,aAAa,KAAK;AAAA,YAClB,WAAW,KAAK,aAAa;AAAA,YAC7B,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,UACrC,CAAC;AAKD,kCAAwB,aAAa,IAAI,KAAK,MAAM,CAAE;AAAA,QACxD,SAAS,KAAK;AACZ,cAAI,OAAO,MAAM,2CAA2C,KAAK,MAAM,KAAM,IAAc,OAAO,EAAE;AACpG,cAAI,aAAa,IAAI,KAAK,MAAM,GAAG;AACjC,iCAAqB,mBAAmB,QAAQ,KAAK,MAAM,EAAE;AAAA,UAC/D;AAAA,QACF;AAAA,MACF,CAAC;AAGD,iBAAW,GAAG,eAAe,CAAC,WAAuB;AACnD,YAAI,OAAO,KAAK,8BAAyB,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU,OAAO,IAAI,EAAE;AAEtG,cAAM,MAAM,mBAAmB,IAAI,OAAO,MAAM;AAChD,2BAAmB,OAAO,OAAO,MAAM;AAGvC,cAAM,SAAS,kBAAkB,IAAI,OAAO,MAAM;AAClD,YAAI,QAAQ;AACV,4BAAkB,OAAO,OAAO,MAAM;AACtC,cAAI,OAAO,KAAK,6CAA6C,OAAO,MAAM,EAAE;AAC5E,iBAAO,EAAE,MAAM,UAAU,MAAM,OAAO,CAAC;AACvC;AAAA,QACF;AAIA,cAAM,kBAA2E,CAAC;AAClF,cAAM,mBAAmB,YAAY;AACnC,cAAI,CAAC,OAAO,aAAa;AAAQ;AACjC,gBAAM,MAAM;AACZ,oBAAU,GAAG;AACb,qBAAW,OAAO,OAAO,aAAa;AACpC,gBAAI;AACF,oBAAM,SAAS,MAAM,WAAY,aAAa,IAAI,QAAQ,IAAI,QAAQ;AACtE,oBAAM,WAAW,GAAG,GAAG,IAAI,IAAI,QAAQ;AACvC,8BAAgB,UAAU,MAAM;AAChC,8BAAgB,KAAK,EAAE,UAAU,IAAI,UAAU,MAAM,UAAU,MAAM,OAAO,OAAO,CAAC;AACpF,kBAAI,OAAO,KAAK,0BAA0B,IAAI,QAAQ,MAAM,OAAO,SAAS,MAAM,QAAQ,CAAC,CAAC,eAAU,QAAQ,EAAE;AAAA,YAClH,SAAS,OAAO;AACd,kBAAI,OAAO,KAAK,kCAAkC,IAAI,QAAQ,KAAM,MAAgB,OAAO,EAAE;AAAA,YAC/F;AAAA,UACF;AAAA,QACF,GAAG;AAEH,wBAAgB,KAAK,MAAM;AAEzB,gBAAM,mBAAmB;AACzB,gBAAM,QAAQ,OAAO,WAAW,cAAc,uBAAuB;AACrE,gBAAM,YAAY,OAAO,UAAU;AACnC,gBAAM,kBAAkB,UAAU,SAAS,mBACvC,UAAU,MAAM,GAAG,gBAAgB,IAAI;AAAA;AAAA,kBAAuB,UAAU,MAAM,kBAC9E;AAEJ,cAAI,iBAAiB;AACrB,cAAI,gBAAgB,SAAS,GAAG;AAC9B,6BAAiB;AAAA;AAAA;AAAA,EAAoD,gBAAgB;AAAA,cAAI,OACvF,KAAK,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,CAAC,eAAU,EAAE,IAAI;AAAA,YAChE,EAAE,KAAK,IAAI,CAAC;AAAA,0CAA6C,gBAAgB,IAAI,OAAK,gBAAgB,EAAE,QAAQ,aAAa,EAAE,IAAI,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,UAClJ,WAAW,OAAO,aAAa,QAAQ;AACrC,kBAAM,QAAQ,OAAO,YAAY;AAAA,cAAI,CAAC,MACpC,GAAG,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,QAAQ,CAAC,CAAC,gBAAgB,EAAE,MAAM;AAAA,YACtE;AACA,6BAAiB;AAAA;AAAA;AAAA,EAA+E,MAAM,KAAK,IAAI,CAAC;AAAA,UAClH;AAEA,uBAAa,IAAI,UAAU,OAAO,MAAM,IAAI;AAAA,YAC1C,QAAQ,OAAO;AAAA,YACf,MAAM,OAAO;AAAA,YACb,OAAO,GAAG,KAAK,KAAK,KAAK,SAAS,OAAO,MAAM;AAAA,YAC/C,UAAU,OAAO,WAAW,cACxB,SAAS,OAAO,IAAI;AAAA;AAAA;AAAA,EAAwC,eAAe,GAAG,cAAc,KAC5F,SAAS,OAAO,IAAI;AAAA;AAAA,UAAsC,OAAO,YAAY,SAAS;AAAA,YAC1F,cAAc,CAAC;AAAA,YACf,aAAa;AAAA,YACb,WAAW;AAAA,YACX,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,UACrC,CAAC;AAGD,cAAI,kBAAkB,YAAY;AAChC,kBAAM,aAAa,aAAa,IAAI,UAAU,OAAO,MAAM,EAAE;AAC7D,kBAAM,kBAAkB,CAAC,GAAG,aAAa,QAAQ,CAAC,EAC/C,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,SAAS,KAAK,CAAC,IAAI,WAAW,OAAO,CAAC,EACxE,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AACnB,kBAAM,gBAAgB,gBAAgB,SAAS,IAC3C;AAAA;AAAA;AAAA;AAAA,EAA6F,gBAAgB,IAAI,OAAK,cAAc,EAAE,MAAM,YAAY,EAAE,IAAI,cAAc,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC,KAClM;AACJ,kBAAM,SAAS;AAAA;AAAA,EAAyB,YAAY,YAAY,qBAAqB,GAAG,aAAa;AAErG,2BAAe,MAAM,yCAAyC;AAAA,cAC5D,KAAK;AAAA,gBACH,MAAM,oBAAoB,OAAO,MAAM;AAAA,gBACvC,cAAc;AAAA,gBACd,MAAM,OAAO;AAAA,gBACb,IAAI;AAAA,gBACJ,YAAY,gBAAgB,OAAO,IAAI;AAAA,gBACvC,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,oBAAoB;AAAA,gBACpB,eAAe,OAAO;AAAA,gBACtB,YAAY,OAAO;AAAA,gBACnB,WAAW,KAAK,IAAI;AAAA,gBACpB,YAAY,OAAO;AAAA,gBACnB,UAAU,OAAO;AAAA,gBACjB,mBAAmB;AAAA,cACrB;AAAA,cACA,KAAK;AAAA,cACL,mBAAmB;AAAA,gBACjB,SAAS,YAAY;AAAA,gBAAC;AAAA,gBACtB,SAAS,CAAC,QAAiB;AACzB,sBAAI,OAAO,MAAM,kCAAkC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,gBACvG;AAAA,cACF;AAAA,YACF,CAAC,EAAE,KAAK,MAAM;AACZ,kBAAI,OAAO,KAAK,yDAAyD,OAAO,MAAM,EAAE;AACxF,2BAAa,OAAO,UAAU,OAAO,MAAM,EAAE;AAAA,YAC/C,CAAC,EAAE,MAAM,CAAC,QAAe;AACvB,kBAAI,OAAO,MAAM,mCAAmC,IAAI,OAAO,EAAE;AAAA,YACnE,CAAC;AAAA,UACH,OAAO;AACL,kBAAM,mBAAmB,0BAA0B,KAAK,IAAI,CAAC;AAC7D,gBAAI;AACF,kBAAI,QAAQ,OAAO,oBAAoB,EAAE,QAAQ,QAAQ,YAAY,iBAAiB,CAAC;AACvF,kBAAI,OAAO,KAAK,wCAAwC,OAAO,MAAM,EAAE;AAAA,YACzE,SAAS,KAAK;AACZ,kBAAI,OAAO,KAAK,gDAAiD,IAAc,OAAO,EAAE;AAAA,YAC1F;AAAA,UACF;AAAA,QACF,CAAC,EAAE,MAAM,CAAC,QAAe;AACvB,cAAI,OAAO,MAAM,6CAA6C,IAAI,OAAO,EAAE;AAAA,QAC7E,CAAC;AAAA,MACH,CAAC;AAGD,iBAAW,GAAG,aAAa,CAAC,SAAmB;AAC7C,YAAI,OAAO,KAAK,4BAAuB,KAAK,MAAM,eAAe,KAAK,QAAQ,WAAW,KAAK,IAAI,EAAE;AAGpG,cAAM,SAAS,kBAAkB,IAAI,KAAK,MAAM;AAChD,YAAI,QAAQ;AACV,4BAAkB,OAAO,KAAK,MAAM;AACpC,cAAI,OAAO,KAAK,kDAAkD,KAAK,MAAM,EAAE;AAC/E,iBAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AACnC;AAAA,QACF;AAEA,cAAM,MAAM,mBAAmB,IAAI,KAAK,MAAM;AAE9C,qBAAa,IAAI,QAAQ,KAAK,MAAM,IAAI;AAAA,UACtC,QAAQ,KAAK;AAAA,UACb,MAAM,KAAK;AAAA,UACX,OAAO,wBAAwB,KAAK,SAAS,KAAK,MAAM;AAAA,UACxD,UAAU,SAAS,KAAK,IAAI;AAAA;AAAA,YAAqD,KAAK,QAAQ;AAAA,kBAAqB,KAAK,aAAa,GAAG,KAAK,kBAAkB,SAAS;AAAA,qBAAwB,KAAK,iBAAiB,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,UACvO,cAAc,CAAC;AAAA,UACf,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QACrC,CAAC;AAED,YAAI,kBAAkB,YAAY;AAChC,gBAAM,aAAa,aAAa,IAAI,QAAQ,KAAK,MAAM,EAAE;AACzD,gBAAM,SAAS;AAAA;AAAA,EAA+B,YAAY,YAAY,KAAK,QAAQ;AAEnF,yBAAe,MAAM,yCAAyC;AAAA,YAC5D,KAAK;AAAA,cACH,MAAM,kBAAkB,KAAK,MAAM;AAAA,cACnC,cAAc;AAAA,cACd,MAAM,KAAK;AAAA,cACX,IAAI;AAAA,cACJ,YAAY,gBAAgB,KAAK,IAAI;AAAA,cACrC,WAAW;AAAA,cACX,UAAU;AAAA,cACV,UAAU;AAAA,cACV,SAAS;AAAA,cACT,oBAAoB;AAAA,cACpB,eAAe,KAAK;AAAA,cACpB,YAAY,KAAK;AAAA,cACjB,WAAW,KAAK,IAAI;AAAA,cACpB,YAAY,KAAK;AAAA,cACjB,UAAU,KAAK;AAAA,cACf,mBAAmB;AAAA,YACrB;AAAA,YACA,KAAK;AAAA,YACL,mBAAmB;AAAA,cACjB,SAAS,YAAY;AAAA,cAAC;AAAA,cACtB,SAAS,CAAC,QAAiB;AACzB,oBAAI,OAAO,MAAM,yCAAyC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,cAC9G;AAAA,YACF;AAAA,UACF,CAAC,EAAE,KAAK,MAAM;AACZ,yBAAa,OAAO,QAAQ,KAAK,MAAM,EAAE;AAAA,UAC3C,CAAC,EAAE,MAAM,CAAC,QAAe;AACvB,gBAAI,OAAO,MAAM,4CAA4C,IAAI,OAAO,EAAE;AAAA,UAC5E,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,iBAAiB,0BAA0B,KAAK,IAAI,CAAC;AAC3D,cAAI;AACF,gBAAI,QAAQ,OAAO,oBAAoB,EAAE,QAAQ,QAAQ,YAAY,eAAe,CAAC;AACrF,gBAAI,OAAO,KAAK,+CAA+C,KAAK,MAAM,EAAE;AAAA,UAC9E,SAAS,KAAK;AACZ,gBAAI,OAAO,KAAK,8CAA+C,IAAc,OAAO,EAAE;AAAA,UACxF;AAAA,QACF;AAAA,MACF,CAAC;AAED,iBAAW,GAAG,aAAa,MAAM;AAC/B,8BAAsB;AACtB,+BAAuB;AACvB,cAAM,OAAO,YAAY,uBAAuB,IAAI,YAAY;AAChE,0BAAkB,KAAK,MAAM,YAAY,uBAAuB;AAChE,4BAAoB;AACpB,kCAA0B;AAAA,MAC5B,CAAC;AAED,iBAAW,GAAG,gBAAgB,CAAC,WAAmB;AAChD,+BAAuB;AACvB,YAAI,sBAAsB,gBAAgB;AACxC,cAAI,OAAO,KAAK,wBAAwB,MAAM,wBAAwB;AACtE,8BAAoB;AACpB,oCAA0B;AAAA,QAC5B;AAAA,MACF,CAAC;AAED,iBAAW,GAAG,SAAS,CAAC,QAAe;AACrC,8BAAsB,IAAI;AAC1B,YAAI,IAAI,QAAQ,WAAW,sDAAsD,GAAG;AAClF,cAAI,sBAAsB,WAAW;AACnC,8BAAkB,KAAK,WAAW,YAAY,uBAAuB;AACrE,gCAAoB;AACpB,sCAA0B;AAAA,UAC5B;AACA;AAAA,QACF;AACA,YAAI,OAAO,MAAM,UAAU,IAAI,OAAO,EAAE;AAAA,MAC1C,CAAC;AAED,YAAM,WAAW,QAAQ;AAEzB,UAAI,OAAO;AAAA,QACT,yCAAoC,WAAW,uBAAuB,IAAI,qBAAqB,WAAW,OAAO,UAAU;AAAA,MAC7H;AAEA,UAAI,WAAW,YAAY,KAAK,sBAAsB,gBAAgB;AACpE,YAAI,WAAW,uBAAuB,GAAG;AACvC,4BAAkB,KAAK,WAAW,YAAY,uBAAuB;AACrE,8BAAoB;AACpB,oCAA0B;AAAA,QAC5B,OAAO;AACL,4BAAkB,KAAK,aAAa,YAAY,uBAAuB;AACvE,8BAAoB;AACpB,oCAA0B;AAAA,QAC5B;AAAA,MACF;AAEA,iBAAW,MAAM;AACf,YAAI,CAAC,YAAY,YAAY;AAAG;AAChC,cAAM,OAAO,WAAW,uBAAuB,IAAI,YAAY;AAC/D,0BAAkB,KAAK,MAAM,YAAY,uBAAuB;AAChE,4BAAoB;AACpB,kCAA0B;AAAA,MAC5B,GAAG,GAAI;AAEP,8BAAwB,YAAY,MAAM;AACxC,YAAI,CAAC;AAAY;AACjB,YAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,cAAI,sBAAsB,gBAAgB;AACxC,gCAAoB;AAAA,UACtB;AACA;AAAA,QACF;AACA,cAAM,OAAO,WAAW,uBAAuB,IAAI,YAAY;AAC/D,0BAAkB,KAAK,MAAM,YAAY,uBAAuB;AAChE,4BAAoB;AACpB,kCAA0B;AAAA,MAC5B,GAAG,GAAI;AAEP,uBAAiB,YAAY,MAAM;AACjC,YAAI,CAAC;AAAY;AACjB,aAAK,WAAW,sBAAsB,EAAE,EAAE,MAAM,CAAC,QAAe;AAC9D,gCAAsB,IAAI;AAC1B,cAAI,OAAO,KAAK,oCAAoC,IAAI,OAAO,EAAE;AAAA,QACnE,CAAC;AAAA,MACH,GAAG,IAAK;AAAA,IACV;AAKA,QAAI,gBAAgB;AAAA,MAClB,IAAI;AAAA,MACJ,OAAO,YAAY;AACjB,YAAI,CAAC,IAAI,UAAU;AACjB,cAAI,OAAO,KAAK,6DAAwD;AACxE;AAAA,QACF;AACA,YAAI;AACF,gBAAM,WAAW,MAAM,gBAAgB,GAAG;AAC1C,gBAAM,UAAU,QAAQ;AAAA,QAC1B,SAAS,KAAK;AACZ,cAAI,OAAO,KAAK,uCAAwC,IAAc,OAAO,EAAE;AAAA,QACjF;AAAA,MACF;AAAA,MACA,MAAM,MAAM;AACV,YAAI,gBAAgB;AAClB,wBAAc,cAAc;AAC5B,2BAAiB;AAAA,QACnB;AACA,YAAI,uBAAuB;AACzB,wBAAc,qBAAqB;AACnC,kCAAwB;AAAA,QAC1B;AACA,YAAI,YAAY;AACd,cAAI;AACF,uBAAW,WAAW;AACtB,gBAAI,OAAO,KAAK,qCAAqC;AAAA,UACvD,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAOD,QAAI,GAAG,iBAAiB,MAAM;AAC5B,UAAI,aAAa,SAAS;AAAG;AAC7B,UAAI,OAAO,KAAK,qDAAqD,aAAa,IAAI,kBAAkB;AACxG,UAAI;AACF,YAAI,QAAQ,OAAO,oBAAoB,EAAE,QAAQ,QAAQ,YAAY,kBAAkB,CAAC;AAAA,MAC1F,SAAS,KAAK;AACZ,YAAI,OAAO,KAAK,0CAA2C,IAAc,OAAO,EAAE;AAAA,MACpF;AAAA,IACF,CAAC;AAGD,QAAI;AAAA,MACF;AAAA,MACA,CAAC,QAAQ,QAAQ;AAGf,YAAI,KAAK,cAAc,CAAC,OAAO,IAAI,UAAU,EAAE,WAAW,OAAO,GAAG;AAClE,8BAAoB,IAAI;AAAA,QAC1B;AAGA,cAAM,MAAM,KAAK,IAAI;AACrB,mBAAW,CAAC,IAAI,CAAC,KAAK,cAAc;AAClC,cAAI,EAAE,eAAe,MAAM,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,IAAI,EAAE,cAAc,KAAM;AAClF,gBAAI,OAAO,KAAK,eAAe,EAAE,uCAAkC;AACnE,yBAAa,OAAO,EAAE;AAAA,UACxB;AAAA,QACF;AAEA,YAAI,aAAa,SAAS;AAAG,iBAAO,CAAC;AAKrC,cAAM,aAAa,CAAC,GAAG,aAAa,QAAQ,CAAC;AAC7C,cAAM,gBAAgB,WAAW,OAAO,CAAC,CAAC,GAAG,MAAM,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,OAAO,CAAC;AACvG,cAAM,aAAa,WAAW,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,SAAS,KAAK,CAAC,IAAI,WAAW,OAAO,CAAC;AAGtG,cAAM,CAAC,SAAS,IAAI,IAAI,cAAc,SAAS,IAC3C,cAAc,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,IACzG,WAAW,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;AAE1G,cAAM,iBAAiB,QAAQ,WAAW,SAAS,KAAK,QAAQ,WAAW,OAAO;AAGlF,YAAI,kBAAkB,SAAS;AAC7B,uBAAa,OAAO,OAAO;AAAA,QAC7B;AAGA,cAAM,kBAAkB,CAAC,GAAG,aAAa,QAAQ,CAAC,EAC/C,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,WAAW,SAAS,KAAK,CAAC,IAAI,WAAW,OAAO,CAAC,EACxE,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAEnB,cAAM,oBAAoB,mBAAmB,KAAK,UAAU,SAAS,0BAA0B,KAAK;AACpG,cAAM,wBAAwB,kBAAkB,gBAAgB,SAAS,IACrE;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,kBAAkB,gBAAgB,MAAM;AAAA,UACxC;AAAA,UACA;AAAA,UACA,GAAG,gBAAgB;AAAA,YAAI,CAAC,MACtB,cAAc,EAAE,MAAM,YAAY,EAAE,IAAI,cAAc,EAAE,KAAK;AAAA,UAC/D;AAAA,UACA,GAAI,oBAAoB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IAAI,CAAC;AAAA,QACP,EAAE,KAAK,IAAI,IACX;AAEJ,cAAM,QAAQ,iBAAiB;AAAA,UAC7B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa,KAAK,MAAM;AAAA,UACxB,aAAa,KAAK,IAAI;AAAA,UACtB,aAAa,KAAK,KAAK;AAAA,UACvB,KAAK,WAAW;AAAA,EAAK,KAAK,QAAQ,KAAK;AAAA,UACvC;AAAA,UACA,aAAa,OAAO,IAAI;AAAA,IAAO,aAAa,OAAO,CAAC,wBAAwB;AAAA,QAC9E,IAAI;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,kBAAkB,KAAK,MAAM;AAAA,UAC7B;AAAA,UACA,aAAa,KAAK,MAAM;AAAA,UACxB,aAAa,KAAK,IAAI;AAAA,UACtB,aAAa,KAAK,KAAK;AAAA,UACvB,KAAK,WAAW;AAAA,EAAiB,KAAK,QAAQ,KAAK;AAAA,UACnD,KAAK,aAAa,SACd;AAAA,EAAmB,KAAK,aAAa,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KACtE;AAAA,UACJ,KAAK,cAAc,aAAa,KAAK,WAAW,oBAAoB;AAAA,UACpE,aAAa,KAAK,UAAU;AAAA,UAC5B,aAAa,OAAO,IAAI;AAAA,IAAO,aAAa,OAAO,CAAC,wBAAwB;AAAA,QAC9E,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAEZ,eAAO,EAAE,gBAAgB,MAAM;AAAA,MACjC;AAAA,MACA,EAAE,UAAU,EAAE;AAAA,IAChB;AAGA,QAAI,aAAa;AAAA,MACf,MAAM;AAAA,MACN,aACE;AAAA,MAEF,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU,CAAC,UAAU,UAAU,QAAQ;AAAA,QACvC,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,MAAM,CAAC,aAAa,UAAU;AAAA,YAC9B,aAAa;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,UAAU;AAAA,YACR,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,aAAa;AAAA,YACX,MAAM;AAAA,YACN,aAAa;AAAA,YACb,OAAO;AAAA,cACL,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,UAAU,EAAE,MAAM,SAAS;AAAA,gBAC3B,aAAa,EAAE,MAAM,SAAS;AAAA,gBAC9B,MAAM,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,cAC3E;AAAA,cACA,UAAU,CAAC,YAAY,MAAM;AAAA,YAC/B;AAAA,UACF;AAAA,UACA,kBAAkB;AAAA,YAChB,MAAM;AAAA,YACN,aAAa;AAAA,YACb,OAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU,CAAC,YAAY,cAAc;AAAA,cACrC,YAAY;AAAA,gBACV,UAAU,EAAE,MAAM,SAAS;AAAA,gBAC3B,cAAc,EAAE,MAAM,SAAS;AAAA,gBAC/B,YAAY,EAAE,MAAM,SAAS;AAAA,gBAC7B,OAAO;AAAA,kBACL,aAAa;AAAA,gBACf;AAAA,gBACA,OAAO,EAAE,MAAM,SAAS;AAAA,gBACxB,qBAAqB;AAAA,kBACnB,MAAM;AAAA,kBACN,OAAO,EAAE,MAAM,SAAS;AAAA,kBACxB,aAAa;AAAA,gBACf;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,OAAO,KAAK,WAAW;AAC9B,cAAM,IAAI;AASV,cAAM,OAAO,aAAa,IAAI,EAAE,MAAM;AACtC,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAAA,UACzF;AAAA,QACF;AAEA,YAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uCAAuC,CAAC,EAAE;AAAA,QACrF;AAEA,YAAI,OAAO,KAAK,kCAAkC,KAAK,UAAU;AAAA,UAC/D,QAAQ,EAAE;AAAA,UACV,QAAQ,EAAE;AAAA,UACV,QAAQ,EAAE;AAAA,UACV,UAAU,EAAE;AAAA,UACZ,aAAa,EAAE,aAAa,IAAI,CAAC,OAAO;AAAA,YACtC,UAAU,EAAE;AAAA,YACZ,aAAa,EAAE,eAAe;AAAA,YAC9B,MAAM,EAAE;AAAA,UACV,EAAE,KAAK,CAAC;AAAA,UACR,kBAAkB,EAAE,kBAAkB,IAAI,CAAC,WAAW;AAAA,YACpD,UAAU,MAAM;AAAA,YAChB,cAAc,MAAM;AAAA,YACpB,YAAY,MAAM;AAAA,YAClB,OAAO,MAAM;AAAA,YACb,OAAO,MAAM;AAAA,YACb,qBAAqB,MAAM,uBAAuB,CAAC;AAAA,UACrD,EAAE,KAAK,CAAC;AAAA,QACV,CAAC,CAAC,EAAE;AAGJ,YAAI;AACJ,YAAI,EAAE,aAAa,QAAQ;AACzB,wBAAc,EAAE,YAAY,IAAI,CAAC,OAAiE;AAAA,YAChG,UAAU,EAAE;AAAA,YACZ,aAAa,EAAE,eAAe;AAAA,YAC9B,SAAS,eAAe,EAAE,IAAI;AAAA,UAChC,EAAE;AAAA,QACJ;AAEA,cAAM,WAAW,WAAW;AAAA,UAC1B,IAAI,KAAK;AAAA,UACT,QAAQ,KAAK;AAAA,UACb,QAAQ,EAAE;AAAA,UACV,QAAQ,EAAE;AAAA,UACV,UAAU,EAAE;AAAA,UACZ,kBAAkB,EAAE,kBAAkB,SAAS,EAAE,mBAAmB;AAAA,UACpE,WAAW,KAAK,aAAa;AAAA,UAC7B;AAAA,QACF,CAAC;AAED,qBAAa,OAAO,KAAK,MAAM;AAC/B,YAAI,OAAO,KAAK,8BAAyB,KAAK,MAAM,KAAK,EAAE,MAAM,EAAE;AAGnE,YAAI,aAAa,OAAO,GAAG;AACzB,cAAI;AACF,gBAAI,QAAQ,OAAO,oBAAoB,EAAE,QAAQ,QAAQ,YAAY,kBAAkB,CAAC;AAAA,UAC1F,QAAQ;AAAA,UAAe;AAAA,QACzB;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,wBAAwB,KAAK,MAAM,aAAa,EAAE,MAAM;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAG/B,QAAI,aAAa;AAAA,MACf,MAAM;AAAA,MACN,aACE;AAAA,MAEF,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU,CAAC,UAAU,YAAY,eAAe;AAAA,QAChD,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,UAAU;AAAA,YACR,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,eAAe;AAAA,YACb,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AAAA,UACA,kBAAkB;AAAA,YAChB,MAAM;AAAA,YACN,OAAO,EAAE,MAAM,SAAS;AAAA,YACxB,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,OAAO,KAAK,WAAW;AAC9B,cAAM,IAAI;AAOV,cAAM,OAAO,aAAa,IAAI,EAAE,MAAM;AACtC,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAAA,UACzF;AAAA,QACF;AAEA,YAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uCAAuC,CAAC,EAAE;AAAA,QACrF;AAEA,cAAM,WAAW,SAAS;AAAA,UACxB,IAAI,KAAK;AAAA,UACT,QAAQ,KAAK;AAAA,UACb,UAAU,EAAE;AAAA,UACZ,eAAe,EAAE;AAAA,UACjB,kBAAkB,EAAE,oBAAoB,CAAC;AAAA,UACzC,WAAW,KAAK,aAAa;AAAA,QAC/B,CAAC;AAED,YAAI,OAAO,KAAK,4BAAuB,KAAK,MAAM,EAAE;AAGpD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,8BAA8B,KAAK,MAAM;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAG7B,QAAI,aAAa;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,MAC7C,SAAS,YAAY;AACnB,YAAI,aAAa,SAAS,GAAG;AAC3B,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,yBAAyB,CAAC,EAAE;AAAA,QACvE;AAEA,cAAM,QAAQ,CAAC,GAAG,aAAa,OAAO,CAAC,EACpC,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAClF;AAAA,UACC,CAAC,GAAG,MACF,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,IAAI,EAAE,WAAW;AAAA,kBAAqB,EAAE,QAAQ,KAAK,EAAE,gBAAW,EAAE,IAAI,cAAc,EAAE,UAAU;AAAA,QACzI;AAEF,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,GAAG,aAAa,IAAI;AAAA,EAAsB,MAAM,KAAK,IAAI,CAAC;AAAA,YAClE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAMjC,QAAI,aAAa;AAAA,MACf,MAAM;AAAA,MACN,aACE;AAAA,MAGF,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU,CAAC,MAAM,OAAO;AAAA,QACxB,YAAY;AAAA,UACV,IAAI,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,UACrE,OAAO,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,UACrE,UAAU,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,UACrE,cAAc,EAAE,MAAM,UAAU,aAAa,gIAAgI;AAAA,UAC7K,aAAa,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,UAC5E,cAAc;AAAA,YACZ,MAAM;AAAA,YAAS,OAAO,EAAE,MAAM,SAAS;AAAA,YACvC,aAAa;AAAA,UACf;AAAA,UACA,aAAa;AAAA,YACX,MAAM;AAAA,YACN,aAAa;AAAA,YACb,OAAO;AAAA,cACL,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,UAAU,EAAE,MAAM,SAAS;AAAA,gBAC3B,aAAa,EAAE,MAAM,SAAS;AAAA,gBAC9B,MAAM,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,cAC3E;AAAA,cACA,UAAU,CAAC,YAAY,MAAM;AAAA,YAC/B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS,OAAO,KAAc,WAIxB;AACJ,YAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uCAAuC,CAAC,EAAE;AAAA,QACrF;AAEA,YAAI;AAEF,cAAI;AACJ,cAAI,OAAO,aAAa,QAAQ;AAC9B,0BAAc,OAAO,YAAY,IAAI,CAAC,OAAiE;AAAA,cACrG,UAAU,EAAE;AAAA,cACZ,aAAa,EAAE,eAAe;AAAA,cAC9B,SAAS,eAAe,EAAE,IAAI;AAAA,YAChC,EAAE;AAAA,UACJ;AAEA,gBAAM,SAAS,MAAM,WAAW,SAAS;AAAA,YACvC,IAAI,OAAO;AAAA,YACX,OAAO,OAAO;AAAA,YACd,cAAc,OAAO;AAAA,YACrB,aAAa,OAAO;AAAA,YACpB,cAAc,OAAO;AAAA,YACrB;AAAA,UACF,CAAC;AAGD,6BAAmB,IAAI,OAAO,QAAQ;AAAA,YACpC,IAAI,OAAO;AAAA,YACX,OAAO,OAAO;AAAA,YACd,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,YACrC,cAAc,OAAO;AAAA,UACvB,CAAC;AAED,cAAI,OAAO,KAAK,gCAA2B,OAAO,MAAM,QAAQ,OAAO,EAAE,YAAY,OAAO,gBAAgB,MAAM,6BAAwB;AAG1I,gBAAM,aAAa,OAAO,eAAe,OAAO;AAChD,gBAAM,QAAQ,MAAM,IAAI,QAAoD,CAAC,SAAS,WAAW;AAC/F,8BAAkB,IAAI,OAAO,QAAQ,OAAO;AAC5C,uBAAW,MAAM;AACf,kBAAI,kBAAkB,OAAO,OAAO,MAAM,GAAG;AAC3C,uBAAO,IAAI,MAAM,YAAY,OAAO,MAAM,oBAAoB,OAAO,eAAe,GAAG,GAAG,CAAC;AAAA,cAC7F;AAAA,YACF,GAAG,SAAS;AAAA,UACd,CAAC;AAED,cAAI,OAAO,KAAK,gCAA2B,OAAO,MAAM,UAAU,MAAM,IAAI,gBAAgB,KAAK,UAAW,MAAM,MAAc,aAAa,UAAU,CAAC,CAAC,EAAE;AAE3J,cAAI,MAAM,SAAS,UAAU;AAC3B,kBAAM,IAAI,MAAM;AAIhB,gBAAI,kBAAkB;AACtB,gBAAI,EAAE,aAAa,QAAQ;AACzB,kBAAI,OAAO,KAAK,sBAAsB,EAAE,YAAY,MAAM,mCAAmC;AAC7F,oBAAM,MAAM;AACZ,wBAAU,GAAG;AACb,oBAAM,aAAuB,CAAC;AAC9B,oBAAM,OAAO,QAAQ,IAAI,QAAQ;AACjC,oBAAM,WAAW,mBAAmB,IAAI,mBAAmB,uBAAuB,CAAC;AACnF,oBAAM,aAAa,WAAW,SAAS,OAAO,KAAK,SAAS,QAAQ,MAAM,SAAS,YAAY,EAAE,SAAS,QAAQ,CAAC,KAAK;AACxH,yBAAW,OAAO,EAAE,aAAa;AAC/B,oBAAI;AAEF,wBAAM,QAAQ,GAAG,IAAI,oBAAoB,mBAAmB,IAAI,MAAM,CAAC,IAAI,mBAAmB,IAAI,QAAQ,CAAC;AAC3G,sBAAI,OAAO,KAAK,mBAAmB,KAAK,EAAE;AAC1C,wBAAM,QAAQ,MAAM,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,WAAW,EAAE,CAAC;AAC3E,sBAAI,CAAC,MAAM;AAAI,0BAAM,IAAI,MAAM,QAAQ,MAAM,MAAM,EAAE;AACrD,wBAAM,SAAS,OAAO,KAAK,MAAM,MAAM,YAAY,CAAC;AACpD,wBAAM,WAAW,GAAG,GAAG,IAAI,IAAI,QAAQ;AACvC,kCAAgB,UAAU,MAAM;AAChC,6BAAW,KAAK,GAAG,IAAI,QAAQ,MAAM,OAAO,SAAS,MAAM,QAAQ,CAAC,CAAC,eAAU,QAAQ,EAAE;AACzF,sBAAI,OAAO,KAAK,sBAAsB,IAAI,QAAQ,MAAM,OAAO,SAAS,MAAM,QAAQ,CAAC,CAAC,MAAM;AAAA,gBAChG,SAAS,OAAO;AACd,sBAAI,OAAO,MAAM,8BAA8B,IAAI,QAAQ,KAAM,MAAgB,OAAO,EAAE;AAAA,gBAC5F;AAAA,cACF;AACA,kBAAI,WAAW,QAAQ;AACrB,kCAAkB;AAAA;AAAA;AAAA,EAAgC,WAAW,KAAK,IAAI,CAAC;AAAA,cACzE;AAAA,YACF;AAEA,mBAAO;AAAA,cACL,SAAS,CAAC;AAAA,gBACR,MAAM;AAAA,gBACN,MAAM;AAAA,kBACJ,YAAY,EAAE,MAAM,KAAK,OAAO,KAAK;AAAA,kBACrC,UAAU,EAAE,IAAI;AAAA,kBAChB,YAAY,OAAO,MAAM;AAAA,kBACzB,EAAE,WAAW,cAAc;AAAA;AAAA,EAAc,EAAE,MAAM,KAAK;AAAA,SAAY,EAAE,YAAY,UAAU;AAAA,kBAC1F;AAAA,gBACF,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,cAC7B,CAAC;AAAA,YACH;AAAA,UACF,OAAO;AACL,kBAAM,IAAI,MAAM;AAChB,mBAAO;AAAA,cACL,SAAS,CAAC;AAAA,gBACR,MAAM;AAAA,gBACN,MAAM;AAAA,kBACJ,wBAAwB,OAAO,KAAK;AAAA,kBACpC,UAAU,EAAE,IAAI;AAAA,kBAChB,YAAY,OAAO,MAAM;AAAA,kBACzB;AAAA,YAAe,EAAE,QAAQ;AAAA,kBACzB,mBAAmB,EAAE,aAAa;AAAA,kBAClC,EAAE,kBAAkB,SAAS,YAAY,EAAE,iBAAiB,KAAK,KAAK,CAAC,KAAK;AAAA,gBAC9E,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,cAC7B,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,2BAA4B,IAAc,OAAO,GAAG,CAAC;AAAA,UACvF;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAGjC,QAAI,aAAa;AAAA,MACf,MAAM;AAAA,MACN,aACE;AAAA,MAEF,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU,CAAC,OAAO;AAAA,QAClB,YAAY;AAAA,UACV,OAAO,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,QACjE;AAAA,MACF;AAAA,MACA,SAAS,OAAO,KAAc,WAA8B;AAC1D,cAAM,OAAO,QAAQ,IAAI,QAAQ;AACjC,cAAM,QAAQ,QAAQ,SAAS;AAC/B,YAAI,CAAC,OAAO;AACV,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,qCAAqC,CAAC,EAAE;AAAA,QACnF;AACA,YAAI;AACF,gBAAM,MAAM,MAAM,MAAM,GAAG,IAAI,yBAAyB,mBAAmB,KAAK,CAAC,EAAE;AACnF,cAAI,CAAC,IAAI;AAAI,kBAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,EAAE;AACjD,gBAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,KAAK,OACP,GAAG,OAAO,KAAK,oCAAoC,KAAK,UAAU,SAAS,MAC3E,GAAG,OAAO,KAAK;AAAA,YACrB,CAAC;AAAA,UACH;AAAA,QACF,SAAS,KAAK;AACZ,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,mBAAmB,OAAO,KAAK,KAAM,IAAc,OAAO,GAAG,CAAC;AAAA,UAChG;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGlC,QAAI,aAAa;AAAA,MACf,MAAM;AAAA,MACN,aACE;AAAA,MAEF,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU,CAAC,UAAU,UAAU;AAAA,QAC/B,YAAY;AAAA,UACV,QAAQ,EAAE,MAAM,UAAU,aAAa,+CAA+C;AAAA,UACtF,UAAU,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,UAC/D,QAAQ,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,QAC3F;AAAA,MACF;AAAA,MACA,SAAS,OAAO,KAAc,WAAkE;AAC9F,YAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,uCAAuC,CAAC,EAAE;AAAA,QACrF;AAEA,cAAM,MAAM,OAAO,UAAU;AAC7B,kBAAU,GAAG;AAEb,YAAI;AACF,gBAAM,SAAS,MAAM,WAAW,aAAa,OAAO,QAAQ,OAAO,QAAQ;AAC3E,gBAAM,WAAW,GAAG,GAAG,IAAI,OAAO,QAAQ;AAC1C,0BAAgB,UAAU,MAAM;AAChC,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,cAAc,OAAO,QAAQ,MAAM,OAAO,SAAS,MAAM,QAAQ,CAAC,CAAC,WAAW,QAAQ;AAAA,YAC9F,CAAC;AAAA,UACH;AAAA,QACF,SAAS,KAAK;AACZ,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,oBAAqB,IAAc,OAAO,GAAG,CAAC;AAAA,UAChF;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAGvC,QAAI,gBAAgB;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAS,MAAM;AACb,cAAM,oBAAoB,YAAY,yBAAyB,KAAK;AACpE,cAAM,iBAAiB,YAAY,YAAY,IAC1C,oBAAoB,2CAAoC,qBACzD;AAEJ,eAAO;AAAA,UACL,MAAM;AAAA,YACN;AAAA,YACA,eAAe,IAAI,YAAY,kBAAkB;AAAA,YACjD,eAAe,cAAc,sBAAsB;AAAA,YACnD,eAAe,cAAc;AAAA,YAC7B,eAAe,mBAAmB,IAAI,mBAAmB,uBAAuB,CAAC,IAAI,QAAQ,IAAI;AAAA,YACjG,sBAAsB,eAAe,mBAAmB,KAAK;AAAA,YAC7D,uBAAuB,oBAAoB,oBAAoB,KAAK;AAAA,YACpE,eAAe,aAAa,IAAI;AAAA,YAChC,GAAG,CAAC,GAAG,aAAa,OAAO,CAAC,EAAE;AAAA,cAC5B,CAAC,MAAM,YAAO,EAAE,OAAO,MAAM,GAAG,CAAC,CAAC,WAAM,EAAE,KAAK,UAAU,EAAE,IAAI;AAAA,YACjE;AAAA,UACA,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
|
|
6
|
+
"names": ["info"]
|
|
7
7
|
}
|