superagent 10.3.0 → 10.4.1

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/lib/node/agent.js CHANGED
@@ -4,6 +4,7 @@
4
4
  * Module dependencies.
5
5
  */
6
6
 
7
+ const net = require('node:net');
7
8
  const {
8
9
  CookieJar
9
10
  } = require('cookiejar');
@@ -13,6 +14,59 @@ const {
13
14
  const methods = require('methods');
14
15
  const request = require('../..');
15
16
  const AgentBase = require('../agent-base');
17
+ function defaultCookiePath(pathname) {
18
+ const lastSlash = pathname.lastIndexOf('/');
19
+ return lastSlash > 0 ? pathname.slice(0, lastSlash) : '/';
20
+ }
21
+
22
+ /**
23
+ * Whether `requestHost` domain-matches the cookie `domain` attribute
24
+ * (RFC 6265 Section 5.1.3). IP addresses only match themselves.
25
+ *
26
+ * @param {String} requestHost
27
+ * @param {String} domain
28
+ * @return {Boolean}
29
+ * @api private
30
+ */
31
+ function domainMatches(requestHost, domain) {
32
+ if (requestHost === domain) return true;
33
+ return requestHost.endsWith(`.${domain}`) && net.isIP(requestHost) === 0 && !/^\[/.test(requestHost);
34
+ }
35
+
36
+ /**
37
+ * Filter Set-Cookie values so that a server can only set cookies for itself.
38
+ *
39
+ * `cookiejar` stores any explicit `Domain` attribute as given, which would
40
+ * let one host plant cookies that the jar then sends to an unrelated host
41
+ * (session fixation across the hosts an agent talks to, e.g. through a
42
+ * redirect chain). Per RFC 6265 Section 5.3 step 6 a cookie whose domain
43
+ * attribute does not domain-match the request host is ignored; a domain
44
+ * without any dot (a bare public suffix such as "com") is ignored as well
45
+ * unless it is the request host itself (e.g. "localhost").
46
+ *
47
+ * @param {String[]} cookies raw Set-Cookie header values
48
+ * @param {String} requestHost lower-cased hostname the response came from
49
+ * @return {String[]}
50
+ * @api private
51
+ */
52
+ function filterCookiesForHost(cookies, requestHost) {
53
+ return cookies.filter(cookie => {
54
+ if (typeof cookie !== 'string') return false;
55
+ const parts = cookie.split(';');
56
+ for (const part of parts.slice(1)) {
57
+ const index = part.indexOf('=');
58
+ const name = (index === -1 ? part : part.slice(0, index)).trim().toLowerCase();
59
+ if (name !== 'domain') continue;
60
+ const domain = (index === -1 ? '' : part.slice(index + 1)).trim().replace(/^\./, '').toLowerCase();
61
+ // an empty Domain attribute means "host-only"; cookiejar treats it
62
+ // the same way
63
+ if (!domain) return true;
64
+ if (domain !== requestHost && !domain.includes('.')) return false;
65
+ return domainMatches(requestHost, domain);
66
+ }
67
+ return true;
68
+ });
69
+ }
16
70
 
17
71
  /**
18
72
  * Initialize a new `Agent`.
@@ -51,11 +105,13 @@ class Agent extends AgentBase {
51
105
  * @api private
52
106
  */
53
107
  _saveCookies(res) {
54
- const cookies = res.headers['set-cookie'];
108
+ let cookies = res.headers['set-cookie'];
55
109
  if (cookies) {
56
- var _res$request;
57
- const url = new URL(((_res$request = res.request) === null || _res$request === void 0 ? void 0 : _res$request.url) || '');
58
- this.jar.setCookies(cookies, url.hostname, url.pathname);
110
+ const url = new URL(res.request && res.request.url || '');
111
+ if (!Array.isArray(cookies)) cookies = [cookies];
112
+ cookies = filterCookiesForHost(cookies, url.hostname.toLowerCase());
113
+ if (cookies.length === 0) return;
114
+ this.jar.setCookies(cookies, url.hostname, defaultCookiePath(url.pathname));
59
115
  }
60
116
  }
61
117
 
@@ -74,11 +130,11 @@ class Agent extends AgentBase {
74
130
  }
75
131
  for (const name of methods) {
76
132
  const method = name.toUpperCase();
77
- if (method === "QUERY") continue;
133
+ if (method === 'QUERY') continue;
78
134
  Agent.prototype[name] = function (url, fn) {
79
135
  const request_ = new request.Request(method, url);
80
136
  request_.on('response', this._saveCookies.bind(this));
81
- request_.on('redirect', this._saveCookies.bind(this));
137
+ request_.on('pre-redirect', this._saveCookies.bind(this));
82
138
  request_.on('redirect', this._attachCookies.bind(this, request_));
83
139
  this._setDefaults(request_);
84
140
  this._attachCookies(request_);
@@ -93,9 +149,10 @@ Agent.prototype.del = Agent.prototype.delete;
93
149
  // create a Proxy that can instantiate a new Agent without using `new` keyword
94
150
  // (for backward compatibility and chaining)
95
151
  const proxyAgent = new Proxy(Agent, {
96
- apply(target, thisArg, argumentsList) {
152
+ apply(target, thisArgument, argumentsList) {
153
+ // eslint-disable-next-line new-cap
97
154
  return new target(...argumentsList);
98
155
  }
99
156
  });
100
157
  module.exports = proxyAgent;
101
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb29raWVKYXIiLCJyZXF1aXJlIiwiQ29va2llQWNjZXNzSW5mbyIsIm1ldGhvZHMiLCJyZXF1ZXN0IiwiQWdlbnRCYXNlIiwiQWdlbnQiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJqYXIiLCJjYSIsImtleSIsInBmeCIsImNlcnQiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJkaXNhYmxlVExTQ2VydHMiLCJfc2F2ZUNvb2tpZXMiLCJyZXMiLCJjb29raWVzIiwiaGVhZGVycyIsIl9yZXMkcmVxdWVzdCIsInVybCIsIlVSTCIsInNldENvb2tpZXMiLCJob3N0bmFtZSIsInBhdGhuYW1lIiwiX2F0dGFjaENvb2tpZXMiLCJyZXF1ZXN0XyIsImFjY2VzcyIsInByb3RvY29sIiwiZ2V0Q29va2llcyIsInRvVmFsdWVTdHJpbmciLCJuYW1lIiwibWV0aG9kIiwidG9VcHBlckNhc2UiLCJwcm90b3R5cGUiLCJmbiIsIlJlcXVlc3QiLCJvbiIsImJpbmQiLCJfc2V0RGVmYXVsdHMiLCJlbmQiLCJkZWwiLCJkZWxldGUiLCJwcm94eUFnZW50IiwiUHJveHkiLCJhcHBseSIsInRhcmdldCIsInRoaXNBcmciLCJhcmd1bWVudHNMaXN0IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub2RlL2FnZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB7IENvb2tpZUphciB9ID0gcmVxdWlyZSgnY29va2llamFyJyk7XG5jb25zdCB7IENvb2tpZUFjY2Vzc0luZm8gfSA9IHJlcXVpcmUoJ2Nvb2tpZWphcicpO1xuY29uc3QgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcbmNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKCcuLi8uLicpO1xuY29uc3QgQWdlbnRCYXNlID0gcmVxdWlyZSgnLi4vYWdlbnQtYmFzZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYEFnZW50YC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNsYXNzIEFnZW50IGV4dGVuZHMgQWdlbnRCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5qYXIgPSBuZXcgQ29va2llSmFyKCk7XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMuY2EpIHtcbiAgICAgICAgdGhpcy5jYShvcHRpb25zLmNhKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMua2V5KSB7XG4gICAgICAgIHRoaXMua2V5KG9wdGlvbnMua2V5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMucGZ4KSB7XG4gICAgICAgIHRoaXMucGZ4KG9wdGlvbnMucGZ4KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY2VydCkge1xuICAgICAgICB0aGlzLmNlcnQob3B0aW9ucy5jZXJ0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmRpc2FibGVUTFNDZXJ0cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBjb29raWVzIGluIHRoZSBnaXZlbiBgcmVzYCB0b1xuICAgKiB0aGUgYWdlbnQncyBjb29raWUgamFyIGZvciBwZXJzaXN0ZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cbiAgX3NhdmVDb29raWVzIChyZXMpIHtcbiAgICBjb25zdCBjb29raWVzID0gcmVzLmhlYWRlcnNbJ3NldC1jb29raWUnXTtcbiAgICBpZiAoY29va2llcykge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXMucmVxdWVzdD8udXJsIHx8ICcnKTtcbiAgICAgIHRoaXMuamFyLnNldENvb2tpZXMoY29va2llcywgdXJsLmhvc3RuYW1lLCB1cmwucGF0aG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggY29va2llcyB3aGVuIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gYHJlcWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cbiAgX2F0dGFjaENvb2tpZXMgKHJlcXVlc3RfKSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0Xy51cmwpO1xuICAgIGNvbnN0IGFjY2VzcyA9IG5ldyBDb29raWVBY2Nlc3NJbmZvKFxuICAgICAgdXJsLmhvc3RuYW1lLFxuICAgICAgdXJsLnBhdGhuYW1lLFxuICAgICAgdXJsLnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICk7XG4gICAgY29uc3QgY29va2llcyA9IHRoaXMuamFyLmdldENvb2tpZXMoYWNjZXNzKS50b1ZhbHVlU3RyaW5nKCk7XG4gICAgcmVxdWVzdF8uY29va2llcyA9IGNvb2tpZXM7XG4gIH1cbn1cblxuZm9yIChjb25zdCBuYW1lIG9mIG1ldGhvZHMpIHtcbiAgY29uc3QgbWV0aG9kID0gbmFtZS50b1VwcGVyQ2FzZSgpO1xuICBpZiAobWV0aG9kID09PSBcIlFVRVJZXCIpIGNvbnRpbnVlO1xuICBBZ2VudC5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAodXJsLCBmbikge1xuICAgIGNvbnN0IHJlcXVlc3RfID0gbmV3IHJlcXVlc3QuUmVxdWVzdChtZXRob2QsIHVybCk7XG5cbiAgICByZXF1ZXN0Xy5vbigncmVzcG9uc2UnLCB0aGlzLl9zYXZlQ29va2llcy5iaW5kKHRoaXMpKTtcbiAgICByZXF1ZXN0Xy5vbigncmVkaXJlY3QnLCB0aGlzLl9zYXZlQ29va2llcy5iaW5kKHRoaXMpKTtcbiAgICByZXF1ZXN0Xy5vbigncmVkaXJlY3QnLCB0aGlzLl9hdHRhY2hDb29raWVzLmJpbmQodGhpcywgcmVxdWVzdF8pKTtcbiAgICB0aGlzLl9zZXREZWZhdWx0cyhyZXF1ZXN0Xyk7XG4gICAgdGhpcy5fYXR0YWNoQ29va2llcyhyZXF1ZXN0Xyk7XG5cbiAgICBpZiAoZm4pIHtcbiAgICAgIHJlcXVlc3RfLmVuZChmbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RfO1xuICB9O1xufVxuXG5BZ2VudC5wcm90b3R5cGUuZGVsID0gQWdlbnQucHJvdG90eXBlLmRlbGV0ZTtcblxuLy8gY3JlYXRlIGEgUHJveHkgdGhhdCBjYW4gaW5zdGFudGlhdGUgYSBuZXcgQWdlbnQgd2l0aG91dCB1c2luZyBgbmV3YCBrZXl3b3JkXG4vLyAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIGNoYWluaW5nKVxuY29uc3QgcHJveHlBZ2VudCA9IG5ldyBQcm94eShBZ2VudCwge1xuICBhcHBseSAodGFyZ2V0LCB0aGlzQXJnLCBhcmd1bWVudHNMaXN0KSB7XG4gICAgcmV0dXJuIG5ldyB0YXJnZXQoLi4uYXJndW1lbnRzTGlzdCk7XG4gIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3h5QWdlbnQ7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBOztBQUVBLE1BQU07RUFBRUE7QUFBVSxDQUFDLEdBQUdDLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDMUMsTUFBTTtFQUFFQztBQUFpQixDQUFDLEdBQUdELE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDakQsTUFBTUUsT0FBTyxHQUFHRixPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2xDLE1BQU1HLE9BQU8sR0FBR0gsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNoQyxNQUFNSSxTQUFTLEdBQUdKLE9BQU8sQ0FBQyxlQUFlLENBQUM7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTUssS0FBSyxTQUFTRCxTQUFTLENBQUM7RUFDNUJFLFdBQVdBLENBQUVDLE9BQU8sRUFBRTtJQUNwQixLQUFLLENBQUMsQ0FBQztJQUVQLElBQUksQ0FBQ0MsR0FBRyxHQUFHLElBQUlULFNBQVMsQ0FBQyxDQUFDO0lBRTFCLElBQUlRLE9B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
158
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJuZXQiLCJyZXF1aXJlIiwiQ29va2llSmFyIiwiQ29va2llQWNjZXNzSW5mbyIsIm1ldGhvZHMiLCJyZXF1ZXN0IiwiQWdlbnRCYXNlIiwiZGVmYXVsdENvb2tpZVBhdGgiLCJwYXRobmFtZSIsImxhc3RTbGFzaCIsImxhc3RJbmRleE9mIiwic2xpY2UiLCJkb21haW5NYXRjaGVzIiwicmVxdWVzdEhvc3QiLCJkb21haW4iLCJlbmRzV2l0aCIsImlzSVAiLCJ0ZXN0IiwiZmlsdGVyQ29va2llc0Zvckhvc3QiLCJjb29raWVzIiwiZmlsdGVyIiwiY29va2llIiwicGFydHMiLCJzcGxpdCIsInBhcnQiLCJpbmRleCIsImluZGV4T2YiLCJuYW1lIiwidHJpbSIsInRvTG93ZXJDYXNlIiwicmVwbGFjZSIsImluY2x1ZGVzIiwiQWdlbnQiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJqYXIiLCJjYSIsImtleSIsInBmeCIsImNlcnQiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJkaXNhYmxlVExTQ2VydHMiLCJfc2F2ZUNvb2tpZXMiLCJyZXMiLCJoZWFkZXJzIiwidXJsIiwiVVJMIiwiQXJyYXkiLCJpc0FycmF5IiwiaG9zdG5hbWUiLCJsZW5ndGgiLCJzZXRDb29raWVzIiwiX2F0dGFjaENvb2tpZXMiLCJyZXF1ZXN0XyIsImFjY2VzcyIsInByb3RvY29sIiwiZ2V0Q29va2llcyIsInRvVmFsdWVTdHJpbmciLCJtZXRob2QiLCJ0b1VwcGVyQ2FzZSIsInByb3RvdHlwZSIsImZuIiwiUmVxdWVzdCIsIm9uIiwiYmluZCIsIl9zZXREZWZhdWx0cyIsImVuZCIsImRlbCIsImRlbGV0ZSIsInByb3h5QWdlbnQiLCJQcm94eSIsImFwcGx5IiwidGFyZ2V0IiwidGhpc0FyZ3VtZW50IiwiYXJndW1lbnRzTGlzdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9hZ2VudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbm9kZTpuZXQnKTtcbmNvbnN0IHsgQ29va2llSmFyIH0gPSByZXF1aXJlKCdjb29raWVqYXInKTtcbmNvbnN0IHsgQ29va2llQWNjZXNzSW5mbyB9ID0gcmVxdWlyZSgnY29va2llamFyJyk7XG5jb25zdCBtZXRob2RzID0gcmVxdWlyZSgnbWV0aG9kcycpO1xuY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoJy4uLy4uJyk7XG5jb25zdCBBZ2VudEJhc2UgPSByZXF1aXJlKCcuLi9hZ2VudC1iYXNlJyk7XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb29raWVQYXRoKHBhdGhuYW1lKSB7XG4gIGNvbnN0IGxhc3RTbGFzaCA9IHBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJyk7XG4gIHJldHVybiBsYXN0U2xhc2ggPiAwID8gcGF0aG5hbWUuc2xpY2UoMCwgbGFzdFNsYXNoKSA6ICcvJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGByZXF1ZXN0SG9zdGAgZG9tYWluLW1hdGNoZXMgdGhlIGNvb2tpZSBgZG9tYWluYCBhdHRyaWJ1dGVcbiAqIChSRkMgNjI2NSBTZWN0aW9uIDUuMS4zKS4gSVAgYWRkcmVzc2VzIG9ubHkgbWF0Y2ggdGhlbXNlbHZlcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdEhvc3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZG9tYWluTWF0Y2hlcyhyZXF1ZXN0SG9zdCwgZG9tYWluKSB7XG4gIGlmIChyZXF1ZXN0SG9zdCA9PT0gZG9tYWluKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIChcbiAgICByZXF1ZXN0SG9zdC5lbmRzV2l0aChgLiR7ZG9tYWlufWApICYmXG4gICAgbmV0LmlzSVAocmVxdWVzdEhvc3QpID09PSAwICYmXG4gICAgIS9eXFxbLy50ZXN0KHJlcXVlc3RIb3N0KVxuICApO1xufVxuXG4vKipcbiAqIEZpbHRlciBTZXQtQ29va2llIHZhbHVlcyBzbyB0aGF0IGEgc2VydmVyIGNhbiBvbmx5IHNldCBjb29raWVzIGZvciBpdHNlbGYuXG4gKlxuICogYGNvb2tpZWphcmAgc3RvcmVzIGFueSBleHBsaWNpdCBgRG9tYWluYCBhdHRyaWJ1dGUgYXMgZ2l2ZW4sIHdoaWNoIHdvdWxkXG4gKiBsZXQgb25lIGhvc3QgcGxhbnQgY29va2llcyB0aGF0IHRoZSBqYXIgdGhlbiBzZW5kcyB0byBhbiB1bnJlbGF0ZWQgaG9zdFxuICogKHNlc3Npb24gZml4YXRpb24gYWNyb3NzIHRoZSBob3N0cyBhbiBhZ2VudCB0YWxrcyB0bywgZS5nLiB0aHJvdWdoIGFcbiAqIHJlZGlyZWN0IGNoYWluKS4gUGVyIFJGQyA2MjY1IFNlY3Rpb24gNS4zIHN0ZXAgNiBhIGNvb2tpZSB3aG9zZSBkb21haW5cbiAqIGF0dHJpYnV0ZSBkb2VzIG5vdCBkb21haW4tbWF0Y2ggdGhlIHJlcXVlc3QgaG9zdCBpcyBpZ25vcmVkOyBhIGRvbWFpblxuICogd2l0aG91dCBhbnkgZG90IChhIGJhcmUgcHVibGljIHN1ZmZpeCBzdWNoIGFzIFwiY29tXCIpIGlzIGlnbm9yZWQgYXMgd2VsbFxuICogdW5sZXNzIGl0IGlzIHRoZSByZXF1ZXN0IGhvc3QgaXRzZWxmIChlLmcuIFwibG9jYWxob3N0XCIpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nW119IGNvb2tpZXMgcmF3IFNldC1Db29raWUgaGVhZGVyIHZhbHVlc1xuICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RIb3N0IGxvd2VyLWNhc2VkIGhvc3RuYW1lIHRoZSByZXNwb25zZSBjYW1lIGZyb21cbiAqIEByZXR1cm4ge1N0cmluZ1tdfVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckNvb2tpZXNGb3JIb3N0KGNvb2tpZXMsIHJlcXVlc3RIb3N0KSB7XG4gIHJldHVybiBjb29raWVzLmZpbHRlcigoY29va2llKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBjb29raWUgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGFydHMgPSBjb29raWUuc3BsaXQoJzsnKTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMuc2xpY2UoMSkpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFydC5pbmRleE9mKCc9Jyk7XG4gICAgICBjb25zdCBuYW1lID0gKGluZGV4ID09PSAtMSA/IHBhcnQgOiBwYXJ0LnNsaWNlKDAsIGluZGV4KSlcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChuYW1lICE9PSAnZG9tYWluJykgY29udGludWU7XG4gICAgICBjb25zdCBkb21haW4gPSAoaW5kZXggPT09IC0xID8gJycgOiBwYXJ0LnNsaWNlKGluZGV4ICsgMSkpXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLnJlcGxhY2UoL15cXC4vLCAnJylcbiAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICAvLyBhbiBlbXB0eSBEb21haW4gYXR0cmlidXRlIG1lYW5zIFwiaG9zdC1vbmx5XCI7IGNvb2tpZWphciB0cmVhdHMgaXRcbiAgICAgIC8vIHRoZSBzYW1lIHdheVxuICAgICAgaWYgKCFkb21haW4pIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGRvbWFpbiAhPT0gcmVxdWVzdEhvc3QgJiYgIWRvbWFpbi5pbmNsdWRlcygnLicpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gZG9tYWluTWF0Y2hlcyhyZXF1ZXN0SG9zdCwgZG9tYWluKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgQWdlbnRgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY2xhc3MgQWdlbnQgZXh0ZW5kcyBBZ2VudEJhc2Uge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuamFyID0gbmV3IENvb2tpZUphcigpO1xuXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb25zLmNhKSB7XG4gICAgICAgIHRoaXMuY2Eob3B0aW9ucy5jYSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmtleSkge1xuICAgICAgICB0aGlzLmtleShvcHRpb25zLmtleSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnBmeCkge1xuICAgICAgICB0aGlzLnBmeChvcHRpb25zLnBmeCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNlcnQpIHtcbiAgICAgICAgdGhpcy5jZXJ0KG9wdGlvbnMuY2VydCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlVExTQ2VydHMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGUgY29va2llcyBpbiB0aGUgZ2l2ZW4gYHJlc2AgdG9cbiAgICogdGhlIGFnZW50J3MgY29va2llIGphciBmb3IgcGVyc2lzdGVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIF9zYXZlQ29va2llcyhyZXMpIHtcbiAgICBsZXQgY29va2llcyA9IHJlcy5oZWFkZXJzWydzZXQtY29va2llJ107XG4gICAgaWYgKGNvb2tpZXMpIHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoKHJlcy5yZXF1ZXN0ICYmIHJlcy5yZXF1ZXN0LnVybCkgfHwgJycpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvb2tpZXMpKSBjb29raWVzID0gW2Nvb2tpZXNdO1xuICAgICAgY29va2llcyA9IGZpbHRlckNvb2tpZXNGb3JIb3N0KGNvb2tpZXMsIHVybC5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmIChjb29raWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdGhpcy5qYXIuc2V0Q29va2llcyhcbiAgICAgICAgY29va2llcyxcbiAgICAgICAgdXJsLmhvc3RuYW1lLFxuICAgICAgICBkZWZhdWx0Q29va2llUGF0aCh1cmwucGF0aG5hbWUpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggY29va2llcyB3aGVuIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gYHJlcWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cbiAgX2F0dGFjaENvb2tpZXMocmVxdWVzdF8pIHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3RfLnVybCk7XG4gICAgY29uc3QgYWNjZXNzID0gbmV3IENvb2tpZUFjY2Vzc0luZm8oXG4gICAgICB1cmwuaG9zdG5hbWUsXG4gICAgICB1cmwucGF0aG5hbWUsXG4gICAgICB1cmwucHJvdG9jb2wgPT09ICdodHRwczonXG4gICAgKTtcbiAgICBjb25zdCBjb29raWVzID0gdGhpcy5qYXIuZ2V0Q29va2llcyhhY2Nlc3MpLnRvVmFsdWVTdHJpbmcoKTtcbiAgICByZXF1ZXN0Xy5jb29raWVzID0gY29va2llcztcbiAgfVxufVxuXG5mb3IgKGNvbnN0IG5hbWUgb2YgbWV0aG9kcykge1xuICBjb25zdCBtZXRob2QgPSBuYW1lLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChtZXRob2QgPT09ICdRVUVSWScpIGNvbnRpbnVlO1xuICBBZ2VudC5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAodXJsLCBmbikge1xuICAgIGNvbnN0IHJlcXVlc3RfID0gbmV3IHJlcXVlc3QuUmVxdWVzdChtZXRob2QsIHVybCk7XG5cbiAgICByZXF1ZXN0Xy5vbigncmVzcG9uc2UnLCB0aGlzLl9zYXZlQ29va2llcy5iaW5kKHRoaXMpKTtcbiAgICByZXF1ZXN0Xy5vbigncHJlLXJlZGlyZWN0JywgdGhpcy5fc2F2ZUNvb2tpZXMuYmluZCh0aGlzKSk7XG4gICAgcmVxdWVzdF8ub24oJ3JlZGlyZWN0JywgdGhpcy5fYXR0YWNoQ29va2llcy5iaW5kKHRoaXMsIHJlcXVlc3RfKSk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdHMocmVxdWVzdF8pO1xuICAgIHRoaXMuX2F0dGFjaENvb2tpZXMocmVxdWVzdF8pO1xuXG4gICAgaWYgKGZuKSB7XG4gICAgICByZXF1ZXN0Xy5lbmQoZm4pO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0XztcbiAgfTtcbn1cblxuQWdlbnQucHJvdG90eXBlLmRlbCA9IEFnZW50LnByb3RvdHlwZS5kZWxldGU7XG5cbi8vIGNyZWF0ZSBhIFByb3h5IHRoYXQgY2FuIGluc3RhbnRpYXRlIGEgbmV3IEFnZW50IHdpdGhvdXQgdXNpbmcgYG5ld2Aga2V5d29yZFxuLy8gKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBjaGFpbmluZylcbmNvbnN0IHByb3h5QWdlbnQgPSBuZXcgUHJveHkoQWdlbnQsIHtcbiAgYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICAgIHJldHVybiBuZXcgdGFyZ2V0KC4uLmFyZ3VtZW50c0xpc3QpO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcm94eUFnZW50O1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNQSxHQUFHLEdBQUdDLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDL0IsTUFBTTtFQUFFQztBQUFVLENBQUMsR0FBR0QsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUMxQyxNQUFNO0VBQUVFO0FBQWlCLENBQUMsR0FBR0YsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNqRCxNQUFNRyxPQUFPLEdBQUdILE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDbEMsTUFBTUksT0FBTyxHQUFHSixPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ2hDLE1BQU1LLFNBQVMsR0FBR0ws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
@@ -4,6 +4,9 @@ const http2 = require('http2');
4
4
  const Stream = require('stream');
5
5
  const net = require('net');
6
6
  const tls = require('tls');
7
+ const {
8
+ isSafeKey
9
+ } = require('../utils');
7
10
  const {
8
11
  HTTP2_HEADER_PATH,
9
12
  HTTP2_HEADER_STATUS,
@@ -89,7 +92,7 @@ class Request extends Stream {
89
92
  this.emit('response', frame);
90
93
  });
91
94
  this._headerSent = true;
92
- frame.once('drain', () => this.emit('drain'));
95
+ frame.on('drain', () => this.emit('drain'));
93
96
  frame.on('error', error => this.emit('error', error));
94
97
  frame.on('close', () => this.session.close());
95
98
  this.frame = frame;
@@ -101,6 +104,9 @@ class Request extends Stream {
101
104
  for (let key of keys) {
102
105
  let value = headers[key];
103
106
  key = key.toLowerCase();
107
+ // header names come from the peer; never let one such as "__proto__"
108
+ // reach into the prototype chain of the headers object
109
+ if (!isSafeKey(key)) continue;
104
110
  switch (key) {
105
111
  case HTTP2_HEADER_SET_COOKIE:
106
112
  value = Array.isArray(value) ? value : [value];
@@ -153,6 +159,23 @@ class Request extends Stream {
153
159
  frame.close(NGHTTP2_CANCEL);
154
160
  this.session.destroy();
155
161
  }
162
+ _destroy(error, callback) {
163
+ try {
164
+ if (this.frame) {
165
+ this.frame.close(NGHTTP2_CANCEL);
166
+ }
167
+ } catch (err) {
168
+ // ignore
169
+ }
170
+ try {
171
+ if (this.session && !this.session.destroyed) {
172
+ this.session.destroy();
173
+ }
174
+ } catch (err) {
175
+ // ignore
176
+ }
177
+ callback(error);
178
+ }
156
179
  }
157
180
  exports.setProtocol = setProtocol;
158
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwMiIsInJlcXVpcmUiLCJTdHJlYW0iLCJuZXQiLCJ0bHMiLCJIVFRQMl9IRUFERVJfUEFUSCIsIkhUVFAyX0hFQURFUl9TVEFUVVMiLCJIVFRQMl9IRUFERVJfTUVUSE9EIiwiSFRUUDJfSEVBREVSX0FVVEhPUklUWSIsIkhUVFAyX0hFQURFUl9IT1NUIiwiSFRUUDJfSEVBREVSX1NFVF9DT09LSUUiLCJOR0hUVFAyX0NBTkNFTCIsImNvbnN0YW50cyIsInNldFByb3RvY29sIiwicHJvdG9jb2wiLCJyZXF1ZXN0Iiwib3B0aW9ucyIsIlJlcXVlc3QiLCJub3JtYWxpemVJcHY2SG9zdCIsImhvc3QiLCJpc0lQIiwiY29uc3RydWN0b3IiLCJkZWZhdWx0UG9ydCIsImRlZmF1bHRIb3N0IiwicG9ydCIsIm1ldGhvZCIsInBhdGgiLCJzZXNzaW9uT3B0aW9ucyIsInNvY2tldFBhdGgiLCJjcmVhdGVDb25uZWN0aW9uIiwiY3JlYXRlVW5peENvbm5lY3Rpb24iLCJiaW5kIiwiX2hlYWRlcnMiLCJub3JtYWxpemVkSG9zdCIsInNlc3Npb24iLCJjb25uZWN0Iiwic2V0SGVhZGVyIiwib24iLCJlcnJvciIsImVtaXQiLCJhdXRob3JpdHkiLCJBTFBOUHJvdG9jb2xzIiwic2VydmVybmFtZSIsImFsbG93SGFsZk9wZW4iLCJFcnJvciIsInNldE5vRGVsYXkiLCJib29sIiwiZ2V0RnJhbWUiLCJmcmFtZSIsImhlYWRlcnMiLCJtYXBUb0h0dHAySGVhZGVyIiwiT2JqZWN0IiwiYXNzaWduIiwib25jZSIsImZsYWdzIiwibWFwVG9IdHRwSGVhZGVyIiwic3RhdHVzQ29kZSIsInN0YXR1cyIsIl9oZWFkZXJTZW50IiwiY2xvc2UiLCJrZXlzIiwiaHR0cDJIZWFkZXJzIiwia2V5IiwidmFsdWUiLCJ0b0xvd2VyQ2FzZSIsIkFycmF5IiwiaXNBcnJheSIsInRlc3QiLCJVUkwiLCJuYW1lIiwiZ2V0SGVhZGVyIiwid3JpdGUiLCJkYXRhIiwiZW5jb2RpbmciLCJwaXBlIiwic3RyZWFtIiwiZW5kIiwiYWJvcnQiLCJkZXN0cm95IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub2RlL2h0dHAyd3JhcHBlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBodHRwMiA9IHJlcXVpcmUoJ2h0dHAyJyk7XG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xuY29uc3QgdGxzID0gcmVxdWlyZSgndGxzJyk7XG5cbmNvbnN0IHtcbiAgSFRUUDJfSEVBREVSX1BBVEgsXG4gIEhUVFAyX0hFQURFUl9TVEFUVVMsXG4gIEhUVFAyX0hFQURFUl9NRVRIT0QsXG4gIEhUVFAyX0hFQURFUl9BVVRIT1JJVFksXG4gIEhUVFAyX0hFQURFUl9IT1NULFxuICBIVFRQMl9IRUFERVJfU0VUX0NPT0tJRSxcbiAgTkdIVFRQMl9DQU5DRUxcbn0gPSBodHRwMi5jb25zdGFudHM7XG5cbmZ1bmN0aW9uIHNldFByb3RvY29sKHByb3RvY29sKSB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gbmV3IFJlcXVlc3QocHJvdG9jb2wsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSXB2Nkhvc3QoaG9zdCkge1xuICByZXR1cm4gbmV0LmlzSVAoaG9zdCkgPT09IDYgPyBgWyR7aG9zdH1dYCA6IGhvc3Q7XG59XG5cbmNsYXNzIFJlcXVlc3QgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihwcm90b2NvbCwgb3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFBvcnQgPSBwcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MDtcbiAgICBjb25zdCBkZWZhdWx0SG9zdCA9ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgZGVmYXVsdFBvcnQ7XG4gICAgY29uc3QgaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCBkZWZhdWx0SG9zdDtcblxuICAgIGRlbGV0ZSBvcHRpb25zLnBvcnQ7XG4gICAgZGVsZXRlIG9wdGlvbnMuaG9zdDtcblxuICAgIHRoaXMubWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gICAgdGhpcy5wYXRoID0gb3B0aW9ucy5wYXRoO1xuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuXG4gICAgZGVsZXRlIG9wdGlvbnMubWV0aG9kO1xuICAgIGRlbGV0ZSBvcHRpb25zLnBhdGg7XG5cbiAgICBjb25zdCBzZXNzaW9uT3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9O1xuICAgIGlmIChvcHRpb25zLnNvY2tldFBhdGgpIHtcbiAgICAgIHNlc3Npb25PcHRpb25zLnNvY2tldFBhdGggPSBvcHRpb25zLnNvY2tldFBhdGg7XG4gICAgICBzZXNzaW9uT3B0aW9ucy5jcmVhdGVDb25uZWN0aW9uID0gdGhpcy5jcmVhdGVVbml4Q29ubmVjdGlvbi5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMuX2hlYWRlcnMgPSB7fTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRIb3N0ID0gbm9ybWFsaXplSXB2Nkhvc3QoaG9zdCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGh0dHAyLmNvbm5lY3QoXG4gICAgICBgJHtwcm90b2NvbH0vLyR7bm9ybWFsaXplZEhvc3R9OiR7cG9ydH1gLFxuICAgICAgc2Vzc2lvbk9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuc2V0SGVhZGVyKCdob3N0JywgYCR7bm9ybWFsaXplZEhvc3R9OiR7cG9ydH1gKTtcblxuICAgIHNlc3Npb24ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gIH1cblxuICBjcmVhdGVVbml4Q29ubmVjdGlvbihhdXRob3JpdHksIG9wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKHRoaXMucHJvdG9jb2wpIHtcbiAgICAgIGNhc2UgJ2h0dHA6JzpcbiAgICAgICAgcmV0dXJuIG5ldC5jb25uZWN0KG9wdGlvbnMuc29ja2V0UGF0aCk7XG4gICAgICBjYXNlICdodHRwczonOlxuICAgICAgICBvcHRpb25zLkFMUE5Qcm90b2NvbHMgPSBbJ2gyJ107XG4gICAgICAgIG9wdGlvbnMuc2VydmVybmFtZSA9IHRoaXMuaG9zdDtcbiAgICAgICAgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRscy5jb25uZWN0KG9wdGlvbnMuc29ja2V0UGF0aCwgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHByb3RvY29sJywgdGhpcy5wcm90b2NvbCk7XG4gICAgfVxuICB9XG5cbiAgc2V0Tm9EZWxheShib29sKSB7XG4gICAgLy8gV2UgY2FuIG5vdCB1c2Ugc2V0Tm9EZWxheSB3aXRoIEhUVFAvMi5cbiAgICAvLyBOb2RlIDEwIGxpbWl0cyBodHRwMnNlc3Npb24uc29ja2V0IG1ldGhvZHMgdG8gb25lcyBzYWZlIHRvIHVzZSB3aXRoIEhUVFAvMi5cbiAgICAvLyBTZWUgYWxzbyBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAyLmh0bWwjaHR0cDJfaHR0cDJzZXNzaW9uX3NvY2tldFxuICB9XG5cbiAgZ2V0RnJhbWUoKSB7XG4gICAgaWYgKHRoaXMuZnJhbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZyYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9IHtcbiAgICAgIFtIVFRQMl9IRUFERVJfUEFUSF06IHRoaXMucGF0aCxcbiAgICAgIFtIVFRQMl9IRUFERVJfTUVUSE9EXTogdGhpcy5tZXRob2RcbiAgICB9O1xuXG4gICAgbGV0IGhlYWRlcnMgPSB0aGlzLm1hcFRvSHR0cDJIZWFkZXIodGhpcy5faGVhZGVycyk7XG5cbiAgICBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbihoZWFkZXJzLCBtZXRob2QpO1xuXG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLnNlc3Npb24ucmVxdWVzdChoZWFkZXJzKTtcblxuICAgIGZyYW1lLm9uY2UoJ3Jlc3BvbnNlJywgKGhlYWRlcnMsIGZsYWdzKSA9PiB7XG4gICAgICBoZWFkZXJzID0gdGhpcy5tYXBUb0h0dHBIZWFkZXIoaGVhZGVycyk7XG4gICAgICBmcmFtZS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgIGZyYW1lLnN0YXR1c0NvZGUgPSBoZWFkZXJzW0hUVFAyX0hFQURFUl9TVEFUVVNdO1xuICAgICAgZnJhbWUuc3RhdHVzID0gZnJhbWUuc3RhdHVzQ29kZTtcbiAgICAgIHRoaXMuZW1pdCgncmVzcG9uc2UnLCBmcmFtZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9oZWFkZXJTZW50ID0gdHJ1ZTtcblxuICAgIGZyYW1lLm9uY2UoJ2RyYWluJywgKCkgPT4gdGhpcy5lbWl0KCdkcmFpbicpKTtcbiAgICBmcmFtZS5vbignZXJyb3InLCAoZXJyb3IpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnJvcikpO1xuICAgIGZyYW1lLm9uKCdjbG9zZScsICgpID0+IHRoaXMuc2Vzc2lvbi5jbG9zZSgpKTtcblxuICAgIHRoaXMuZnJhbWUgPSBmcmFtZTtcbiAgICByZXR1cm4gZnJhbWU7XG4gIH1cblxuICBtYXBUb0h0dHBIZWFkZXIoaGVhZGVycykge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKTtcbiAgICBjb25zdCBodHRwMkhlYWRlcnMgPSB7fTtcbiAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgbGV0IHZhbHVlID0gaGVhZGVyc1trZXldO1xuICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIEhUVFAyX0hFQURFUl9TRVRfQ09PS0lFOlxuICAgICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGh0dHAySGVhZGVyc1trZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0dHAySGVhZGVycztcbiAgfVxuXG4gIG1hcFRvSHR0cDJIZWFkZXIoaGVhZGVycykge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKTtcbiAgICBjb25zdCBodHRwMkhlYWRlcnMgPSB7fTtcbiAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgbGV0IHZhbHVlID0gaGVhZGVyc1trZXldO1xuICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIEhUVFAyX0hFQURFUl9IT1NUOlxuICAgICAgICAgIGtleSA9IEhUVFAyX0hFQURFUl9BVVRIT1JJVFk7XG4gICAgICAgICAgdmFsdWUgPSAvXmh0dHA6XFwvXFwvfF5odHRwczpcXC9cXC8vLnRlc3QodmFsdWUpXG4gICAgICAgICAgICA/IG5ldyBVUkwodmFsdWUpLmhvc3RcbiAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGh0dHAySGVhZGVyc1trZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0dHAySGVhZGVycztcbiAgfVxuXG4gIHNldEhlYWRlcihuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0SGVhZGVyKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xuICB9XG5cbiAgd3JpdGUoZGF0YSwgZW5jb2RpbmcpIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZ2V0RnJhbWUoKTtcbiAgICByZXR1cm4gZnJhbWUud3JpdGUoZGF0YSwgZW5jb2RpbmcpO1xuICB9XG5cbiAgcGlwZShzdHJlYW0sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZ2V0RnJhbWUoKTtcbiAgICByZXR1cm4gZnJhbWUucGlwZShzdHJlYW0sIG9wdGlvbnMpO1xuICB9XG5cbiAgZW5kKGRhdGEpIHtcbiAgICBjb25zdCBmcmFtZSA9IHRoaXMuZ2V0RnJhbWUoKTtcbiAgICBmcmFtZS5lbmQoZGF0YSk7XG4gIH1cblxuICBhYm9ydChkYXRhKSB7XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLmdldEZyYW1lKCk7XG4gICAgZnJhbWUuY2xvc2UoTkdIVFRQMl9DQU5DRUwpO1xuICAgIHRoaXMuc2Vzc2lvbi5kZXN0cm95KCk7XG4gIH1cbn1cblxuZXhwb3J0cy5zZXRQcm90b2NvbCA9IHNldFByb3RvY29sO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBLE1BQU1BLEtBQUssR0FBR0MsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUM5QixNQUFNQyxNQUFNLEdBQUdELE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDaEMsTUFBTUUsR0FBRyxHQUFHRixPQUFPLENBQUMsS0FBSyxDQUFDO0FBQzFCLE1BQU1HLEdBQUcsR0FBR0gsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUUxQixNQUFNO0VBQ0pJLGlCQUFpQjtFQUNqQkMsbUJBQW1CO0VBQ25CQyxtQkFBbUI7RUFDbkJDLHNCQUFzQjtFQUN0QkMsaUJBQWlCO0VBQ2pCQyx1QkFBdUI7RUFDdkJDO0FBQ0YsQ0FBQyxHQUFHWCxLQUFLLENBQUNZLFNBQVM7QUFFbkIsU0FBU0MsV0FBV0EsQ0FBQ0MsUUFBUSxFQUFFO0VBQzdCLE9BQU87SUFDTEMsT0FBT0EsQ0FBQ0MsT0FBTyxFQUFFO01BQ2YsT0FBTyxJQUFJQyxPQUFPLENBQUNILFFBQVEsRUFBRUUsT0FBTyxDQUFDO0lBQ3ZDO0VBQ0YsQ0FBQztBQUNIO0FBRUEsU0FBU0UsaUJBQWlC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
181
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwMiIsInJlcXVpcmUiLCJTdHJlYW0iLCJuZXQiLCJ0bHMiLCJpc1NhZmVLZXkiLCJIVFRQMl9IRUFERVJfUEFUSCIsIkhUVFAyX0hFQURFUl9TVEFUVVMiLCJIVFRQMl9IRUFERVJfTUVUSE9EIiwiSFRUUDJfSEVBREVSX0FVVEhPUklUWSIsIkhUVFAyX0hFQURFUl9IT1NUIiwiSFRUUDJfSEVBREVSX1NFVF9DT09LSUUiLCJOR0hUVFAyX0NBTkNFTCIsImNvbnN0YW50cyIsInNldFByb3RvY29sIiwicHJvdG9jb2wiLCJyZXF1ZXN0Iiwib3B0aW9ucyIsIlJlcXVlc3QiLCJub3JtYWxpemVJcHY2SG9zdCIsImhvc3QiLCJpc0lQIiwiY29uc3RydWN0b3IiLCJkZWZhdWx0UG9ydCIsImRlZmF1bHRIb3N0IiwicG9ydCIsIm1ldGhvZCIsInBhdGgiLCJzZXNzaW9uT3B0aW9ucyIsInNvY2tldFBhdGgiLCJjcmVhdGVDb25uZWN0aW9uIiwiY3JlYXRlVW5peENvbm5lY3Rpb24iLCJiaW5kIiwiX2hlYWRlcnMiLCJub3JtYWxpemVkSG9zdCIsInNlc3Npb24iLCJjb25uZWN0Iiwic2V0SGVhZGVyIiwib24iLCJlcnJvciIsImVtaXQiLCJhdXRob3JpdHkiLCJBTFBOUHJvdG9jb2xzIiwic2VydmVybmFtZSIsImFsbG93SGFsZk9wZW4iLCJFcnJvciIsInNldE5vRGVsYXkiLCJib29sIiwiZ2V0RnJhbWUiLCJmcmFtZSIsImhlYWRlcnMiLCJtYXBUb0h0dHAySGVhZGVyIiwiT2JqZWN0IiwiYXNzaWduIiwib25jZSIsImZsYWdzIiwibWFwVG9IdHRwSGVhZGVyIiwic3RhdHVzQ29kZSIsInN0YXR1cyIsIl9oZWFkZXJTZW50IiwiY2xvc2UiLCJrZXlzIiwiaHR0cDJIZWFkZXJzIiwia2V5IiwidmFsdWUiLCJ0b0xvd2VyQ2FzZSIsIkFycmF5IiwiaXNBcnJheSIsInRlc3QiLCJVUkwiLCJuYW1lIiwiZ2V0SGVhZGVyIiwid3JpdGUiLCJkYXRhIiwiZW5jb2RpbmciLCJwaXBlIiwic3RyZWFtIiwiZW5kIiwiYWJvcnQiLCJkZXN0cm95IiwiX2Rlc3Ryb3kiLCJjYWxsYmFjayIsImVyciIsImRlc3Ryb3llZCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9odHRwMndyYXBwZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaHR0cDIgPSByZXF1aXJlKCdodHRwMicpO1xuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcbmNvbnN0IHRscyA9IHJlcXVpcmUoJ3RscycpO1xuY29uc3QgeyBpc1NhZmVLZXkgfSA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmNvbnN0IHtcbiAgSFRUUDJfSEVBREVSX1BBVEgsXG4gIEhUVFAyX0hFQURFUl9TVEFUVVMsXG4gIEhUVFAyX0hFQURFUl9NRVRIT0QsXG4gIEhUVFAyX0hFQURFUl9BVVRIT1JJVFksXG4gIEhUVFAyX0hFQURFUl9IT1NULFxuICBIVFRQMl9IRUFERVJfU0VUX0NPT0tJRSxcbiAgTkdIVFRQMl9DQU5DRUxcbn0gPSBodHRwMi5jb25zdGFudHM7XG5cbmZ1bmN0aW9uIHNldFByb3RvY29sKHByb3RvY29sKSB7XG4gIHJldHVybiB7XG4gICAgcmVxdWVzdChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gbmV3IFJlcXVlc3QocHJvdG9jb2wsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSXB2Nkhvc3QoaG9zdCkge1xuICByZXR1cm4gbmV0LmlzSVAoaG9zdCkgPT09IDYgPyBgWyR7aG9zdH1dYCA6IGhvc3Q7XG59XG5cbmNsYXNzIFJlcXVlc3QgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3Rvcihwcm90b2NvbCwgb3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFBvcnQgPSBwcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MDtcbiAgICBjb25zdCBkZWZhdWx0SG9zdCA9ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgfHwgZGVmYXVsdFBvcnQ7XG4gICAgY29uc3QgaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCBkZWZhdWx0SG9zdDtcblxuICAgIGRlbGV0ZSBvcHRpb25zLnBvcnQ7XG4gICAgZGVsZXRlIG9wdGlvbnMuaG9zdDtcblxuICAgIHRoaXMubWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gICAgdGhpcy5wYXRoID0gb3B0aW9ucy5wYXRoO1xuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB0aGlzLmhvc3QgPSBob3N0O1xuXG4gICAgZGVsZXRlIG9wdGlvbnMubWV0aG9kO1xuICAgIGRlbGV0ZSBvcHRpb25zLnBhdGg7XG5cbiAgICBjb25zdCBzZXNzaW9uT3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9O1xuICAgIGlmIChvcHRpb25zLnNvY2tldFBhdGgpIHtcbiAgICAgIHNlc3Npb25PcHRpb25zLnNvY2tldFBhdGggPSBvcHRpb25zLnNvY2tldFBhdGg7XG4gICAgICBzZXNzaW9uT3B0aW9ucy5jcmVhdGVDb25uZWN0aW9uID0gdGhpcy5jcmVhdGVVbml4Q29ubmVjdGlvbi5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMuX2hlYWRlcnMgPSB7fTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRIb3N0ID0gbm9ybWFsaXplSXB2Nkhvc3QoaG9zdCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGh0dHAyLmNvbm5lY3QoXG4gICAgICBgJHtwcm90b2NvbH0vLyR7bm9ybWFsaXplZEhvc3R9OiR7cG9ydH1gLFxuICAgICAgc2Vzc2lvbk9wdGlvbnNcbiAgICApO1xuICAgIHRoaXMuc2V0SGVhZGVyKCdob3N0JywgYCR7bm9ybWFsaXplZEhvc3R9OiR7cG9ydH1gKTtcblxuICAgIHNlc3Npb24ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gIH1cblxuICBjcmVhdGVVbml4Q29ubmVjdGlvbihhdXRob3JpdHksIG9wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKHRoaXMucHJvdG9jb2wpIHtcbiAgICAgIGNhc2UgJ2h0dHA6JzpcbiAgICAgICAgcmV0dXJuIG5ldC5jb25uZWN0KG9wdGlvbnMuc29ja2V0UGF0aCk7XG4gICAgICBjYXNlICdodHRwczonOlxuICAgICAgICBvcHRpb25zLkFMUE5Qcm90b2NvbHMgPSBbJ2gyJ107XG4gICAgICAgIG9wdGlvbnMuc2VydmVybmFtZSA9IHRoaXMuaG9zdDtcbiAgICAgICAgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRscy5jb25uZWN0KG9wdGlvbnMuc29ja2V0UGF0aCwgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHByb3RvY29sJywgdGhpcy5wcm90b2NvbCk7XG4gICAgfVxuICB9XG5cbiAgc2V0Tm9EZWxheShib29sKSB7XG4gICAgLy8gV2UgY2FuIG5vdCB1c2Ugc2V0Tm9EZWxheSB3aXRoIEhUVFAvMi5cbiAgICAvLyBOb2RlIDEwIGxpbWl0cyBodHRwMnNlc3Npb24uc29ja2V0IG1ldGhvZHMgdG8gb25lcyBzYWZlIHRvIHVzZSB3aXRoIEhUVFAvMi5cbiAgICAvLyBTZWUgYWxzbyBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAyLmh0bWwjaHR0cDJfaHR0cDJzZXNzaW9uX3NvY2tldFxuICB9XG5cbiAgZ2V0RnJhbWUoKSB7XG4gICAgaWYgKHRoaXMuZnJhbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZyYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9IHtcbiAgICAgIFtIVFRQMl9IRUFERVJfUEFUSF06IHRoaXMucGF0aCxcbiAgICAgIFtIVFRQMl9IRUFERVJfTUVUSE9EXTogdGhpcy5tZXRob2RcbiAgICB9O1xuXG4gICAgbGV0IGhlYWRlcnMgPSB0aGlzLm1hcFRvSHR0cDJIZWFkZXIodGhpcy5faGVhZGVycyk7XG5cbiAgICBoZWFkZXJzID0gT2JqZWN0LmFzc2lnbihoZWFkZXJzLCBtZXRob2QpO1xuXG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLnNlc3Npb24ucmVxdWVzdChoZWFkZXJzKTtcblxuICAgIGZyYW1lLm9uY2UoJ3Jlc3BvbnNlJywgKGhlYWRlcnMsIGZsYWdzKSA9PiB7XG4gICAgICBoZWFkZXJzID0gdGhpcy5tYXBUb0h0dHBIZWFkZXIoaGVhZGVycyk7XG4gICAgICBmcmFtZS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgIGZyYW1lLnN0YXR1c0NvZGUgPSBoZWFkZXJzW0hUVFAyX0hFQURFUl9TVEFUVVNdO1xuICAgICAgZnJhbWUuc3RhdHVzID0gZnJhbWUuc3RhdHVzQ29kZTtcbiAgICAgIHRoaXMuZW1pdCgncmVzcG9uc2UnLCBmcmFtZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9oZWFkZXJTZW50ID0gdHJ1ZTtcblxuICAgIGZyYW1lLm9uKCdkcmFpbicsICgpID0+IHRoaXMuZW1pdCgnZHJhaW4nKSk7XG4gICAgZnJhbWUub24oJ2Vycm9yJywgKGVycm9yKSA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcbiAgICBmcmFtZS5vbignY2xvc2UnLCAoKSA9PiB0aGlzLnNlc3Npb24uY2xvc2UoKSk7XG5cbiAgICB0aGlzLmZyYW1lID0gZnJhbWU7XG4gICAgcmV0dXJuIGZyYW1lO1xuICB9XG5cbiAgbWFwVG9IdHRwSGVhZGVyKGhlYWRlcnMpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycyk7XG4gICAgY29uc3QgaHR0cDJIZWFkZXJzID0ge307XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGhlYWRlcnNba2V5XTtcbiAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgLy8gaGVhZGVyIG5hbWVzIGNvbWUgZnJvbSB0aGUgcGVlcjsgbmV2ZXIgbGV0IG9uZSBzdWNoIGFzIFwiX19wcm90b19fXCJcbiAgICAgIC8vIHJlYWNoIGludG8gdGhlIHByb3RvdHlwZSBjaGFpbiBvZiB0aGUgaGVhZGVycyBvYmplY3RcbiAgICAgIGlmICghaXNTYWZlS2V5KGtleSkpIGNvbnRpbnVlO1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBIVFRQMl9IRUFERVJfU0VUX0NPT0tJRTpcbiAgICAgICAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBodHRwMkhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBodHRwMkhlYWRlcnM7XG4gIH1cblxuICBtYXBUb0h0dHAySGVhZGVyKGhlYWRlcnMpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycyk7XG4gICAgY29uc3QgaHR0cDJIZWFkZXJzID0ge307XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGhlYWRlcnNba2V5XTtcbiAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBIVFRQMl9IRUFERVJfSE9TVDpcbiAgICAgICAgICBrZXkgPSBIVFRQMl9IRUFERVJfQVVUSE9SSVRZO1xuICAgICAgICAgIHZhbHVlID0gL15odHRwOlxcL1xcL3xeaHR0cHM6XFwvXFwvLy50ZXN0KHZhbHVlKVxuICAgICAgICAgICAgPyBuZXcgVVJMKHZhbHVlKS5ob3N0XG4gICAgICAgICAgICA6IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBodHRwMkhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBodHRwMkhlYWRlcnM7XG4gIH1cblxuICBzZXRIZWFkZXIobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLl9oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcbiAgfVxuXG4gIGdldEhlYWRlcihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgfVxuXG4gIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLmdldEZyYW1lKCk7XG4gICAgcmV0dXJuIGZyYW1lLndyaXRlKGRhdGEsIGVuY29kaW5nKTtcbiAgfVxuXG4gIHBpcGUoc3RyZWFtLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLmdldEZyYW1lKCk7XG4gICAgcmV0dXJuIGZyYW1lLnBpcGUoc3RyZWFtLCBvcHRpb25zKTtcbiAgfVxuXG4gIGVuZChkYXRhKSB7XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLmdldEZyYW1lKCk7XG4gICAgZnJhbWUuZW5kKGRhdGEpO1xuICB9XG5cbiAgYWJvcnQoZGF0YSkge1xuICAgIGNvbnN0IGZyYW1lID0gdGhpcy5nZXRGcmFtZSgpO1xuICAgIGZyYW1lLmNsb3NlKE5HSFRUUDJfQ0FOQ0VMKTtcbiAgICB0aGlzLnNlc3Npb24uZGVzdHJveSgpO1xuICB9XG5cbiAgX2Rlc3Ryb3koZXJyb3IsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmZyYW1lKSB7XG4gICAgICAgIHRoaXMuZnJhbWUuY2xvc2UoTkdIVFRQMl9DQU5DRUwpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNlc3Npb24gJiYgIXRoaXMuc2Vzc2lvbi5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cblxuICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgfVxufVxuXG5leHBvcnRzLnNldFByb3RvY29sID0gc2V0UHJvdG9jb2w7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQzlCLE1BQU1DLE1BQU0sR0FBR0QsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUNoQyxNQUFNRSxHQUFHLEdBQUdGLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDMUIsTUFBTUcsR0FBRyxHQUFHSCxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQzFCLE1BQU07RUFBRUk7QUFBVSxDQUFDLEdBQUdKLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFFekMsTUFBTTtFQUNKSyxpQkFBaUI7RUFDakJDLG1CQUFtQjtFQUNuQkMsbUJBQW1CO0VBQ25CQyxzQkFBc0I7RUFDdEJDLGlCQUFpQjtFQUNqQkMsdUJBQXVCO0VBQ3ZCQztBQUNGLENBQUMsR0FBR1osS0FBSyxDQUFDYSxTQUFTO0FBRW5CLFNBQVNDLFdBQVdBLENBQUNDLFFBQVEsRUFBRTtFQUM3QixPQUFPO0lBQ0xDLE9BQU9BLENBQUNDLE9BQU8sRUFBRTtNQUNmLE9BQU8sSUFBSUMsT0FBTyxDQUFDSCxRQUFRLEVBQUVFLE9BQU8sQ0FBQztJQUN2QztFQUNGLENBQUM7QUFDSDtBQUVBLFNBQVNFLGlCQUFpQkEsQ0FBQ0MsSUFBSSxFQUFFO0VBQy9CLE9BQU9qQixHQUFHLENBQUNrQixJQUFJLENBQUNELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJQSxJQUFJLEdBQUcsR0FBR0EsSUFBSTtBQUNsRDtBQUVBLE1BQU1GLE9BQU8sU0FBU2hCLE1BQU0sQ0FBQztFQUMzQm9CLFdBQVdBLENBQUNQLFFBQVEsRUFBRUUsT0FBTyxFQUFFO0lBQzdCLEtBQUssQ0FBQyxDQUFDO0lBQ1AsTUFBTU0sV0FBVyxH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