tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
539 lines • 52.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TYPES = exports.TYPE = void 0;
exports.resolveParameter = resolveParameter;
exports.typeByName = void 0;
exports.writeRest = writeRest;
var _null = _interopRequireDefault(require("./data-types/null"));
var _tinyint = _interopRequireDefault(require("./data-types/tinyint"));
var _bit = _interopRequireDefault(require("./data-types/bit"));
var _smallint = _interopRequireDefault(require("./data-types/smallint"));
var _int = _interopRequireDefault(require("./data-types/int"));
var _smalldatetime = _interopRequireDefault(require("./data-types/smalldatetime"));
var _real = _interopRequireDefault(require("./data-types/real"));
var _money = _interopRequireDefault(require("./data-types/money"));
var _datetime = _interopRequireDefault(require("./data-types/datetime"));
var _float = _interopRequireDefault(require("./data-types/float"));
var _decimal = _interopRequireDefault(require("./data-types/decimal"));
var _numeric = _interopRequireDefault(require("./data-types/numeric"));
var _smallmoney = _interopRequireDefault(require("./data-types/smallmoney"));
var _bigint = _interopRequireDefault(require("./data-types/bigint"));
var _image = _interopRequireDefault(require("./data-types/image"));
var _text = _interopRequireDefault(require("./data-types/text"));
var _uniqueidentifier = _interopRequireDefault(require("./data-types/uniqueidentifier"));
var _intn = _interopRequireDefault(require("./data-types/intn"));
var _ntext = _interopRequireDefault(require("./data-types/ntext"));
var _bitn = _interopRequireDefault(require("./data-types/bitn"));
var _decimaln = _interopRequireDefault(require("./data-types/decimaln"));
var _numericn = _interopRequireDefault(require("./data-types/numericn"));
var _floatn = _interopRequireDefault(require("./data-types/floatn"));
var _moneyn = _interopRequireDefault(require("./data-types/moneyn"));
var _datetimen = _interopRequireDefault(require("./data-types/datetimen"));
var _varbinary = _interopRequireDefault(require("./data-types/varbinary"));
var _varchar = _interopRequireDefault(require("./data-types/varchar"));
var _binary = _interopRequireDefault(require("./data-types/binary"));
var _char = _interopRequireDefault(require("./data-types/char"));
var _nvarchar = _interopRequireDefault(require("./data-types/nvarchar"));
var _nchar = _interopRequireDefault(require("./data-types/nchar"));
var _xml = _interopRequireDefault(require("./data-types/xml"));
var _time = _interopRequireDefault(require("./data-types/time"));
var _date = _interopRequireDefault(require("./data-types/date"));
var _datetime2 = _interopRequireDefault(require("./data-types/datetime2"));
var _datetimeoffset = _interopRequireDefault(require("./data-types/datetimeoffset"));
var _udt = _interopRequireDefault(require("./data-types/udt"));
var _tvp = _interopRequireDefault(require("./data-types/tvp"));
var _sqlVariant = _interopRequireDefault(require("./data-types/sql-variant"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* A parameter whose value has been validated and whose declaration facts
* have been resolved: everything serialization needs.
*/
/**
* Validates a parameter's value and resolves its declaration facts. This is
* the single place where a parameter's length, precision, scale and
* collation are determined.
*/
function resolveParameter(parameter, collation, options) {
const type = parameter.type;
if (type.resolve) {
return {
name: parameter.name,
output: parameter.output,
type,
data: type.resolve(parameter, collation, options)
};
}
// `validate` is deliberately not given the connection options: no caller
// ever passed them, so the `useUTC`-dependent range checks in the date and
// time types have never been active. Enabling them is a behaviour change
// to make on its own.
const value = type.validate(parameter.value, collation);
const validated = {
...parameter,
value
};
const data = {
value
};
// An explicitly specified declaration fact wins, including an explicit
// zero; otherwise the type resolves it from the value.
if (parameter.length != null) {
data.length = parameter.length;
} else if (type.resolveLength) {
data.length = type.resolveLength(validated);
}
if (parameter.precision != null) {
data.precision = parameter.precision;
} else if (type.resolvePrecision) {
data.precision = type.resolvePrecision(validated);
}
if (parameter.scale != null) {
data.scale = parameter.scale;
} else if (type.resolveScale) {
data.scale = type.resolveScale(validated);
}
if (collation) {
data.collation = collation;
}
return {
name: parameter.name,
output: parameter.output,
type,
data
};
}
/**
* Drives the rest of a write returned by `writeValue`, yielding at each of
* its yields. An error the rest throws is passed through `wrap` (e.g. to
* name the parameter it belongs to); an error thrown into this generator by
* its consumer keeps its identity, and a consumer that stops early closes
* the rest, and with it the value's source, as `for await` would.
*/
async function* writeRest(rest, wrap) {
const iterator = rest[Symbol.asyncIterator]();
let done = false;
try {
while (true) {
let result;
try {
result = await iterator.next();
} catch (error) {
// A generator that threw is finished; there is nothing to close.
done = true;
const wrapped = wrap(error);
throw wrapped;
}
if (result.done) {
done = true;
break;
}
yield;
}
} catch (error) {
// An error thrown into this generator at a yield closes the rest. A
// close that fails must not replace the error that is propagating.
if (!done && typeof iterator.return === 'function') {
done = true;
try {
await iterator.return();
} catch {
// The propagating error is what surfaces.
}
}
throw error;
} finally {
// The consumer stopped pulling.
if (!done && typeof iterator.return === 'function') {
await iterator.return();
}
}
}
const TYPE = exports.TYPE = {
[_null.default.id]: _null.default,
[_tinyint.default.id]: _tinyint.default,
[_bit.default.id]: _bit.default,
[_smallint.default.id]: _smallint.default,
[_int.default.id]: _int.default,
[_smalldatetime.default.id]: _smalldatetime.default,
[_real.default.id]: _real.default,
[_money.default.id]: _money.default,
[_datetime.default.id]: _datetime.default,
[_float.default.id]: _float.default,
[_decimal.default.id]: _decimal.default,
[_numeric.default.id]: _numeric.default,
[_smallmoney.default.id]: _smallmoney.default,
[_bigint.default.id]: _bigint.default,
[_image.default.id]: _image.default,
[_text.default.id]: _text.default,
[_uniqueidentifier.default.id]: _uniqueidentifier.default,
[_intn.default.id]: _intn.default,
[_ntext.default.id]: _ntext.default,
[_bitn.default.id]: _bitn.default,
[_decimaln.default.id]: _decimaln.default,
[_numericn.default.id]: _numericn.default,
[_floatn.default.id]: _floatn.default,
[_moneyn.default.id]: _moneyn.default,
[_datetimen.default.id]: _datetimen.default,
[_varbinary.default.id]: _varbinary.default,
[_varchar.default.id]: _varchar.default,
[_binary.default.id]: _binary.default,
[_char.default.id]: _char.default,
[_nvarchar.default.id]: _nvarchar.default,
[_nchar.default.id]: _nchar.default,
[_xml.default.id]: _xml.default,
[_time.default.id]: _time.default,
[_date.default.id]: _date.default,
[_datetime2.default.id]: _datetime2.default,
[_datetimeoffset.default.id]: _datetimeoffset.default,
[_udt.default.id]: _udt.default,
[_tvp.default.id]: _tvp.default,
[_sqlVariant.default.id]: _sqlVariant.default
};
/**
* <table>
* <thead>
* <tr>
* <th>Type</th>
* <th>Constant</th>
* <th>JavaScript</th>
* <th>Result set</th>
* <th>Parameter</th>
* </tr>
* </thead>
*
* <tbody>
* <tr class="group-heading">
* <th colspan="5">Exact numerics</th>
* </tr>
* <tr>
* <td><code>bit</code></td>
* <td><code>[[TYPES.Bit]]</code></td>
* <td><code>boolean</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>tinyint</code></td>
* <td><code>[[TYPES.TinyInt]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>smallint</code></td>
* <td><code>[[TYPES.SmallInt]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>int</code></td>
* <td><code>[[TYPES.Int]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>bigint</code><sup>1</sup></td>
* <td><code>[[TYPES.BigInt]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>numeric</code><sup>2</sup></td>
* <td><code>[[TYPES.Numeric]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>decimal</code><sup>2</sup></td>
* <td><code>[[TYPES.Decimal]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>smallmoney</code></td>
* <td><code>[[TYPES.SmallMoney]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>money</code></td>
* <td><code>[[TYPES.Money]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* </tbody>
*
* <tbody>
* <tr class="group-heading">
* <th colspan="5">Approximate numerics</th>
* </tr>
* <tr>
* <td><code>float</code></td>
* <td><code>[[TYPES.Float]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>real</code></td>
* <td><code>[[TYPES.Real]]</code></td>
* <td><code>number</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* </tbody>
*
* <tbody>
* <tr class="group-heading">
* <th colspan="5">Date and Time</th>
* </tr>
* <tr>
* <td><code>smalldatetime</code></td>
* <td><code>[[TYPES.SmallDateTime]]</code></td>
* <td><code>Date</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>datetime</code></td>
* <td><code>[[TYPES.DateTime]]</code></td>
* <td><code>Date</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>datetime2</code></td>
* <td><code>[[TYPES.DateTime2]]</code></td>
* <td><code>Date</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>datetimeoffset</code></td>
* <td><code>[[TYPES.DateTimeOffset]]</code></td>
* <td><code>Date</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>time</code></td>
* <td><code>[[TYPES.Time]]</code></td>
* <td><code>Date</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>date</code></td>
* <td><code>[[TYPES.Date]]</code></td>
* <td><code>Date</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* </tbody>
*
* <tbody>
* <tr class="group-heading">
* <th colspan="5">Character Strings</th>
* </tr>
* <tr>
* <td><code>char</code></td>
* <td><code>[[TYPES.Char]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>varchar</code><sup>3</sup></td>
* <td><code>[[TYPES.VarChar]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>text</code></td>
* <td><code>[[TYPES.Text]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* </tbody>
*
* <tbody>
* <tr class="group-heading">
* <th colspan="5">Unicode Strings</th>
* </tr>
* <tr>
* <td><code>nchar</code></td>
* <td><code>[[TYPES.NChar]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>nvarchar</code><sup>3</sup></td>
* <td><code>[[TYPES.NVarChar]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>ntext</code></td>
* <td><code>[[TYPES.NText]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>-</td>
* </tr>
* </tbody>
*
* <tbody>
* <tr class="group-heading">
* <th colspan="5">Binary Strings<sup>4</sup></th>
* </tr>
* <tr>
* <td><code>binary</code></td>
* <td><code>[[TYPES.Binary]]</code></td>
* <td><code>Buffer</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>varbinary</code></td>
* <td><code>[[TYPES.VarBinary]]</code></td>
* <td><code>Buffer</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>image</code></td>
* <td><code>[[TYPES.Image]]</code></td>
* <td><code>Buffer</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* </tbody>
*
* <tbody>
* <tr class="group-heading">
* <th colspan="5">Other Data Types</th>
* </tr>
* <tr>
* <td><code>TVP</code></td>
* <td><code>[[TYPES.TVP]]</code></td>
* <td><code>Object</code></td>
* <td>-</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>UDT</code></td>
* <td><code>[[TYPES.UDT]]</code></td>
* <td><code>Buffer</code></td>
* <td>✓</td>
* <td>-</td>
* </tr>
* <tr>
* <td><code>uniqueidentifier</code><sup>4</sup></td>
* <td><code>[[TYPES.UniqueIdentifier]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>✓</td>
* </tr>
* <tr>
* <td><code>variant</code></td>
* <td><code>[[TYPES.Variant]]</code></td>
* <td><code>any</code></td>
* <td>✓</td>
* <td>-</td>
* </tr>
* <tr>
* <td><code>xml</code></td>
* <td><code>[[TYPES.Xml]]</code></td>
* <td><code>string</code></td>
* <td>✓</td>
* <td>-</td>
* </tr>
* </tbody>
* </table>
*
* <ol>
* <li>
* <h4>BigInt</h4>
* <p>
* Values are returned as a string. This is because values can exceed 53 bits of significant data, which is greater than a
* Javascript <code>number</code> type can represent as an integer.
* </p>
* </li>
* <li>
* <h4>Numerical, Decimal</h4>
* <p>
* For input parameters, default precision is 18 and default scale is 0. Maximum supported precision is 19.
* </p>
* </li>
* <li>
* <h4>VarChar, NVarChar</h4>
* <p>
* <code>varchar(max)</code> and <code>nvarchar(max)</code> are also supported.
* </p>
* </li>
* <li>
* <h4>UniqueIdentifier</h4>
* <p>
* Values are returned as a 16 byte hexadecimal string.
* </p>
* <p>
* Note that the order of bytes is not the same as the character representation. See
* <a href="http://msdn.microsoft.com/en-us/library/ms190215.aspx">Using uniqueidentifier Data</a>
* for an example of the different ordering of bytes.
* </p>
* </li>
* </ol>
*/
const TYPES = exports.TYPES = {
TinyInt: _tinyint.default,
Bit: _bit.default,
SmallInt: _smallint.default,
Int: _int.default,
SmallDateTime: _smalldatetime.default,
Real: _real.default,
Money: _money.default,
DateTime: _datetime.default,
Float: _float.default,
Decimal: _decimal.default,
Numeric: _numeric.default,
SmallMoney: _smallmoney.default,
BigInt: _bigint.default,
Image: _image.default,
Text: _text.default,
UniqueIdentifier: _uniqueidentifier.default,
NText: _ntext.default,
VarBinary: _varbinary.default,
VarChar: _varchar.default,
Binary: _binary.default,
Char: _char.default,
NVarChar: _nvarchar.default,
NChar: _nchar.default,
Xml: _xml.default,
Time: _time.default,
Date: _date.default,
DateTime2: _datetime2.default,
DateTimeOffset: _datetimeoffset.default,
UDT: _udt.default,
TVP: _tvp.default,
Variant: _sqlVariant.default
};
const typeByName = exports.typeByName = TYPES;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbnVsbCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3RpbnlpbnQiLCJfYml0IiwiX3NtYWxsaW50IiwiX2ludCIsIl9zbWFsbGRhdGV0aW1lIiwiX3JlYWwiLCJfbW9uZXkiLCJfZGF0ZXRpbWUiLCJfZmxvYXQiLCJfZGVjaW1hbCIsIl9udW1lcmljIiwiX3NtYWxsbW9uZXkiLCJfYmlnaW50IiwiX2ltYWdlIiwiX3RleHQiLCJfdW5pcXVlaWRlbnRpZmllciIsIl9pbnRuIiwiX250ZXh0IiwiX2JpdG4iLCJfZGVjaW1hbG4iLCJfbnVtZXJpY24iLCJfZmxvYXRuIiwiX21vbmV5biIsIl9kYXRldGltZW4iLCJfdmFyYmluYXJ5IiwiX3ZhcmNoYXIiLCJfYmluYXJ5IiwiX2NoYXIiLCJfbnZhcmNoYXIiLCJfbmNoYXIiLCJfeG1sIiwiX3RpbWUiLCJfZGF0ZSIsIl9kYXRldGltZTIiLCJfZGF0ZXRpbWVvZmZzZXQiLCJfdWR0IiwiX3R2cCIsIl9zcWxWYXJpYW50IiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwicmVzb2x2ZVBhcmFtZXRlciIsInBhcmFtZXRlciIsImNvbGxhdGlvbiIsIm9wdGlvbnMiLCJ0eXBlIiwicmVzb2x2ZSIsIm5hbWUiLCJvdXRwdXQiLCJkYXRhIiwidmFsdWUiLCJ2YWxpZGF0ZSIsInZhbGlkYXRlZCIsImxlbmd0aCIsInJlc29sdmVMZW5ndGgiLCJwcmVjaXNpb24iLCJyZXNvbHZlUHJlY2lzaW9uIiwic2NhbGUiLCJyZXNvbHZlU2NhbGUiLCJ3cml0ZVJlc3QiLCJyZXN0Iiwid3JhcCIsIml0ZXJhdG9yIiwiU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsImRvbmUiLCJyZXN1bHQiLCJuZXh0IiwiZXJyb3IiLCJ3cmFwcGVkIiwicmV0dXJuIiwiVFlQRSIsImV4cG9ydHMiLCJOdWxsIiwiaWQiLCJUaW55SW50IiwiQml0IiwiU21hbGxJbnQiLCJJbnQiLCJTbWFsbERhdGVUaW1lIiwiUmVhbCIsIk1vbmV5IiwiRGF0ZVRpbWUiLCJGbG9hdCIsIkRlY2ltYWwiLCJOdW1lcmljIiwiU21hbGxNb25leSIsIkJpZ0ludCIsIkltYWdlIiwiVGV4dCIsIlVuaXF1ZUlkZW50aWZpZXIiLCJJbnROIiwiTlRleHQiLCJCaXROIiwiRGVjaW1hbE4iLCJOdW1lcmljTiIsIkZsb2F0TiIsIk1vbmV5TiIsIkRhdGVUaW1lTiIsIlZhckJpbmFyeSIsIlZhckNoYXIiLCJCaW5hcnkiLCJDaGFyIiwiTlZhckNoYXIiLCJOQ2hhciIsIlhtbCIsIlRpbWUiLCJEYXRlIiwiRGF0ZVRpbWUyIiwiRGF0ZVRpbWVPZmZzZXQiLCJVRFQiLCJUVlAiLCJWYXJpYW50IiwiVFlQRVMiLCJ0eXBlQnlOYW1lIl0sInNvdXJjZXMiOlsiLi4vc3JjL2RhdGEtdHlwZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTnVsbCBmcm9tICcuL2RhdGEtdHlwZXMvbnVsbCc7XG5pbXBvcnQgVGlueUludCBmcm9tICcuL2RhdGEtdHlwZXMvdGlueWludCc7XG5pbXBvcnQgQml0IGZyb20gJy4vZGF0YS10eXBlcy9iaXQnO1xuaW1wb3J0IFNtYWxsSW50IGZyb20gJy4vZGF0YS10eXBlcy9zbWFsbGludCc7XG5pbXBvcnQgSW50IGZyb20gJy4vZGF0YS10eXBlcy9pbnQnO1xuaW1wb3J0IFNtYWxsRGF0ZVRpbWUgZnJvbSAnLi9kYXRhLXR5cGVzL3NtYWxsZGF0ZXRpbWUnO1xuaW1wb3J0IFJlYWwgZnJvbSAnLi9kYXRhLXR5cGVzL3JlYWwnO1xuaW1wb3J0IE1vbmV5IGZyb20gJy4vZGF0YS10eXBlcy9tb25leSc7XG5pbXBvcnQgRGF0ZVRpbWUgZnJvbSAnLi9kYXRhLXR5cGVzL2RhdGV0aW1lJztcbmltcG9ydCBGbG9hdCBmcm9tICcuL2RhdGEtdHlwZXMvZmxvYXQnO1xuaW1wb3J0IERlY2ltYWwgZnJvbSAnLi9kYXRhLXR5cGVzL2RlY2ltYWwnO1xuaW1wb3J0IE51bWVyaWMgZnJvbSAnLi9kYXRhLXR5cGVzL251bWVyaWMnO1xuaW1wb3J0IFNtYWxsTW9uZXkgZnJvbSAnLi9kYXRhLXR5cGVzL3NtYWxsbW9uZXknO1xuaW1wb3J0IEJpZ0ludCBmcm9tICcuL2RhdGEtdHlwZXMvYmlnaW50JztcbmltcG9ydCBJbWFnZSBmcm9tICcuL2RhdGEtdHlwZXMvaW1hZ2UnO1xuaW1wb3J0IFRleHQgZnJvbSAnLi9kYXRhLXR5cGVzL3RleHQnO1xuaW1wb3J0IFVuaXF1ZUlkZW50aWZpZXIgZnJvbSAnLi9kYXRhLXR5cGVzL3VuaXF1ZWlkZW50aWZpZXInO1xuaW1wb3J0IEludE4gZnJvbSAnLi9kYXRhLXR5cGVzL2ludG4nO1xuaW1wb3J0IE5UZXh0IGZyb20gJy4vZGF0YS10eXBlcy9udGV4dCc7XG5pbXBvcnQgQml0TiBmcm9tICcuL2RhdGEtdHlwZXMvYml0bic7XG5pbXBvcnQgRGVjaW1hbE4gZnJvbSAnLi9kYXRhLXR5cGVzL2RlY2ltYWxuJztcbmltcG9ydCBOdW1lcmljTiBmcm9tICcuL2RhdGEtdHlwZXMvbnVtZXJpY24nO1xuaW1wb3J0IEZsb2F0TiBmcm9tICcuL2RhdGEtdHlwZXMvZmxvYXRuJztcbmltcG9ydCBNb25leU4gZnJvbSAnLi9kYXRhLXR5cGVzL21vbmV5bic7XG5pbXBvcnQgRGF0ZVRpbWVOIGZyb20gJy4vZGF0YS10eXBlcy9kYXRldGltZW4nO1xuaW1wb3J0IFZhckJpbmFyeSBmcm9tICcuL2RhdGEtdHlwZXMvdmFyYmluYXJ5JztcbmltcG9ydCBWYXJDaGFyIGZyb20gJy4vZGF0YS10eXBlcy92YXJjaGFyJztcbmltcG9ydCBCaW5hcnkgZnJvbSAnLi9kYXRhLXR5cGVzL2JpbmFyeSc7XG5pbXBvcnQgQ2hhciBmcm9tICcuL2RhdGEtdHlwZXMvY2hhcic7XG5pbXBvcnQgTlZhckNoYXIgZnJvbSAnLi9kYXRhLXR5cGVzL252YXJjaGFyJztcbmltcG9ydCBOQ2hhciBmcm9tICcuL2RhdGEtdHlwZXMvbmNoYXInO1xuaW1wb3J0IFhtbCBmcm9tICcuL2RhdGEtdHlwZXMveG1sJztcbmltcG9ydCBUaW1lIGZyb20gJy4vZGF0YS10eXBlcy90aW1lJztcbmltcG9ydCBEYXRlIGZyb20gJy4vZGF0YS10eXBlcy9kYXRlJztcbmltcG9ydCBEYXRlVGltZTIgZnJvbSAnLi9kYXRhLXR5cGVzL2RhdGV0aW1lMic7XG5pbXBvcnQgRGF0ZVRpbWVPZmZzZXQgZnJvbSAnLi9kYXRhLXR5cGVzL2RhdGV0aW1lb2Zmc2V0JztcbmltcG9ydCBVRFQgZnJvbSAnLi9kYXRhLXR5cGVzL3VkdCc7XG5pbXBvcnQgVFZQIGZyb20gJy4vZGF0YS10eXBlcy90dnAnO1xuaW1wb3J0IFZhcmlhbnQgZnJvbSAnLi9kYXRhLXR5cGVzL3NxbC12YXJpYW50JztcbmltcG9ydCB7IHR5cGUgQ3J5cHRvTWV0YWRhdGEgfSBmcm9tICcuL2Fsd2F5cy1lbmNyeXB0ZWQvdHlwZXMnO1xuXG5pbXBvcnQgeyB0eXBlIEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXIge1xuICB0eXBlOiBEYXRhVHlwZTtcbiAgbmFtZTogc3RyaW5nO1xuXG4gIHZhbHVlOiB1bmtub3duO1xuXG4gIG91dHB1dDogYm9vbGVhbjtcbiAgbGVuZ3RoPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcmVjaXNpb24/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHNjYWxlPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIG51bGxhYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBmb3JjZUVuY3J5cHQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBjcnlwdG9NZXRhZGF0YT86IENyeXB0b01ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICBlbmNyeXB0ZWRWYWw/OiBCdWZmZXIgfCB1bmRlZmluZWQ7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXJEYXRhPFQgPSBhbnk+IHtcbiAgbGVuZ3RoPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBzY2FsZT86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJlY2lzaW9uPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbGxhdGlvbj86IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcblxuICB2YWx1ZTogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVHlwZSB7XG4gIGlkOiBudW1iZXI7XG4gIHR5cGU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuXG4gIGRlY2xhcmF0aW9uKHBhcmFtZXRlcjogUGFyYW1ldGVyKTogc3RyaW5nO1xuICB2YWxpZGF0ZSh2YWx1ZTogYW55LCBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZCwgb3B0aW9ucz86IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMpOiBhbnk7IC8vIFRPRE86IFJlZmFjdG9yICdhbnknIGFuZCByZXBsYWNlIHdpdGggbW9yZSBzcGVjaWZpYyB0eXBlLlxuXG4gIGhhc1RhYmxlTmFtZT86IGJvb2xlYW47XG5cbiAgcmVzb2x2ZUxlbmd0aD86IChwYXJhbWV0ZXI6IFBhcmFtZXRlcikgPT4gbnVtYmVyO1xuICByZXNvbHZlUHJlY2lzaW9uPzogKHBhcmFtZXRlcjogUGFyYW1ldGVyKSA9PiBudW1iZXI7XG4gIHJlc29sdmVTY2FsZT86IChwYXJhbWV0ZXI6IFBhcmFtZXRlcikgPT4gbnVtYmVyO1xuXG4gIC8vIFRoZSBzZXJpYWxpemF0aW9uIGNvbnRyYWN0IGJlbG93IHNwbGl0cyBhIHBhcmFtZXRlcidzIGhhbmRsaW5nIGludG8gdHdvXG4gIC8vIHBoYXNlczogYHJlc29sdmVgIHZhbGlkYXRlcyB0aGUgdmFsdWUgYW5kIGRldGVybWluZXMgdGhlIGRlY2xhcmF0aW9uXG4gIC8vIGZhY3RzIChsZW5ndGgsIHByZWNpc2lvbiwgc2NhbGUsIGNvbGxhdGlvbikgb25jZSwgYW5kIGB3cml0ZVR5cGVJbmZvYCAvXG4gIC8vIGB3cml0ZVZhbHVlYCBzZXJpYWxpemUgdGhlIHJlc29sdmVkIHBhcmFtZXRlciBpbnRvIGEgYnVmZmVyLiBBIHR5cGVcbiAgLy8gdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgYHJlc29sdmVgIGlzIGFkYXB0ZWQgZnJvbSBpdHMgYHZhbGlkYXRlYCAvXG4gIC8vIGByZXNvbHZlKmAgbWV0aG9kcyBieSBgcmVzb2x2ZVBhcmFtZXRlcmAgYmVsb3cuXG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgYW5kIHJlc29sdmVzIGl0cyBkZWNsYXJhdGlvbiBmYWN0c1xuICAgKiAobGVuZ3RoLCBwcmVjaXNpb24sIHNjYWxlLCBjb2xsYXRpb24pIGludG8gYSBzaW5nbGUgc3RydWN0IHRoYXQgYWxsXG4gICAqIHNlcmlhbGl6YXRpb24gaXMgZGVyaXZlZCBmcm9tLlxuICAgKi9cbiAgcmVzb2x2ZT8ocGFyYW1ldGVyOiBQYXJhbWV0ZXIsIGNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkLCBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zKTogUGFyYW1ldGVyRGF0YTtcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBUWVBFX0lORk8gb2YgYSByZXNvbHZlZCBwYXJhbWV0ZXIuXG4gICAqL1xuICB3cml0ZVR5cGVJbmZvKGJ1ZmZlcjogV3JpdGFibGVUcmFja2luZ0J1ZmZlciwgcGFyYW1ldGVyOiBQYXJhbWV0ZXJEYXRhLCBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB2YWx1ZSBvZiBhIHJlc29sdmVkIHBhcmFtZXRlciAobGVuZ3RoIHByZWZpeCBhbmQgZGF0YSkuXG4gICAqXG4gICAqIEEgdmFsdWUgdGhhdCBpcyBmdWxseSBpbiBtZW1vcnkgaXMgd3JpdHRlbiBiZWZvcmUgdGhpcyByZXR1cm5zLiBBIHZhbHVlXG4gICAqIHRoYXQgaXMgcmVhZCBmcm9tIGEgc291cmNlIHdoaWxlIHRoZSByZXF1ZXN0IGlzIHdyaXR0ZW4gKGFuIGFzeW5jXG4gICAqIGl0ZXJhYmxlLCBhY2NlcHRlZCBieSB0aGUgYG1heGAgdHlwZXMgYW5kIGJ5IGEgVFZQJ3Mgcm93cykgcmV0dXJucyB0aGVcbiAgICogcmVzdCBvZiB0aGUgd3JpdGUgaW5zdGVhZDogYW4gYXN5bmMgaXRlcmFibGUgdGhhdCB5aWVsZHMgd2hlbmV2ZXJcbiAgICogYGJ1ZmZlcmAgaG9sZHMgYSBjaHVuaydzIHdvcnRoIChgV3JpdGFibGVUcmFja2luZ0J1ZmZlci5DSFVOS19TSVpFYCkgb3JcbiAgICogbW9yZSwgc28gdGhhdCB0aGUgY2FsbGVyIGNhbiBoYW5kIHRob3NlIGJ5dGVzIG9uIGJlZm9yZSB0aGUgcmVzdCBvZiB0aGVcbiAgICogdmFsdWUgaXMgcmVhZC4gTm90aGluZyBvZiB0aGF0IHJlc3QgcnVucyBiZWZvcmUgaXRzIGZpcnN0IGBuZXh0KClgLlxuICAgKi9cbiAgd3JpdGVWYWx1ZShidWZmZXI6IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIsIHBhcmFtZXRlcjogUGFyYW1ldGVyRGF0YSwgb3B0aW9uczogSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyk6IHZvaWQgfCBBc3luY0l0ZXJhYmxlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEEgcGFyYW1ldGVyIHdob3NlIHZhbHVlIGhhcyBiZWVuIHZhbGlkYXRlZCBhbmQgd2hvc2UgZGVjbGFyYXRpb24gZmFjdHNcbiAqIGhhdmUgYmVlbiByZXNvbHZlZDogZXZlcnl0aGluZyBzZXJpYWxpemF0aW9uIG5lZWRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUGFyYW1ldGVyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBvdXRwdXQ6IGJvb2xlYW47XG4gIHR5cGU6IERhdGFUeXBlO1xuICBkYXRhOiBQYXJhbWV0ZXJEYXRhO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHBhcmFtZXRlcidzIHZhbHVlIGFuZCByZXNvbHZlcyBpdHMgZGVjbGFyYXRpb24gZmFjdHMuIFRoaXMgaXNcbiAqIHRoZSBzaW5nbGUgcGxhY2Ugd2hlcmUgYSBwYXJhbWV0ZXIncyBsZW5ndGgsIHByZWNpc2lvbiwgc2NhbGUgYW5kXG4gKiBjb2xsYXRpb24gYXJlIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGFyYW1ldGVyKHBhcmFtZXRlcjogUGFyYW1ldGVyLCBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZCwgb3B0aW9uczogSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucyk6IFJlc29sdmVkUGFyYW1ldGVyIHtcbiAgY29uc3QgdHlwZSA9IHBhcmFtZXRlci50eXBlO1xuXG4gIGlmICh0eXBlLnJlc29sdmUpIHtcbiAgICByZXR1cm4geyBuYW1lOiBwYXJhbWV0ZXIubmFtZSwgb3V0cHV0OiBwYXJhbWV0ZXIub3V0cHV0LCB0eXBlLCBkYXRhOiB0eXBlLnJlc29sdmUocGFyYW1ldGVyLCBjb2xsYXRpb24sIG9wdGlvbnMpIH07XG4gIH1cblxuICAvLyBgdmFsaWRhdGVgIGlzIGRlbGliZXJhdGVseSBub3QgZ2l2ZW4gdGhlIGNvbm5lY3Rpb24gb3B0aW9uczogbm8gY2FsbGVyXG4gIC8vIGV2ZXIgcGFzc2VkIHRoZW0sIHNvIHRoZSBgdXNlVVRDYC1kZXBlbmRlbnQgcmFuZ2UgY2hlY2tzIGluIHRoZSBkYXRlIGFuZFxuICAvLyB0aW1lIHR5cGVzIGhhdmUgbmV2ZXIgYmVlbiBhY3RpdmUuIEVuYWJsaW5nIHRoZW0gaXMgYSBiZWhhdmlvdXIgY2hhbmdlXG4gIC8vIHRvIG1ha2Ugb24gaXRzIG93bi5cbiAgY29uc3QgdmFsdWUgPSB0eXBlLnZhbGlkYXRlKHBhcmFtZXRlci52YWx1ZSwgY29sbGF0aW9uKTtcbiAgY29uc3QgdmFsaWRhdGVkOiBQYXJhbWV0ZXIgPSB7IC4uLnBhcmFtZXRlciwgdmFsdWUgfTtcbiAgY29uc3QgZGF0YTogUGFyYW1ldGVyRGF0YSA9IHsgdmFsdWUgfTtcblxuICAvLyBBbiBleHBsaWNpdGx5IHNwZWNpZmllZCBkZWNsYXJhdGlvbiBmYWN0IHdpbnMsIGluY2x1ZGluZyBhbiBleHBsaWNpdFxuICAvLyB6ZXJvOyBvdGhlcndpc2UgdGhlIHR5cGUgcmVzb2x2ZXMgaXQgZnJvbSB0aGUgdmFsdWUuXG4gIGlmIChwYXJhbWV0ZXIubGVuZ3RoICE9IG51bGwpIHtcbiAgICBkYXRhLmxlbmd0aCA9IHBhcmFtZXRlci5sZW5ndGg7XG4gIH0gZWxzZSBpZiAodHlwZS5yZXNvbHZlTGVuZ3RoKSB7XG4gICAgZGF0YS5sZW5ndGggPSB0eXBlLnJlc29sdmVMZW5ndGgodmFsaWRhdGVkKTtcbiAgfVxuXG4gIGlmIChwYXJhbWV0ZXIucHJlY2lzaW9uICE9IG51bGwpIHtcbiAgICBkYXRhLnByZWNpc2lvbiA9IHBhcmFtZXRlci5wcmVjaXNpb247XG4gIH0gZWxzZSBpZiAodHlwZS5yZXNvbHZlUHJlY2lzaW9uKSB7XG4gICAgZGF0YS5wcmVjaXNpb24gPSB0eXBlLnJlc29sdmVQcmVjaXNpb24odmFsaWRhdGVkKTtcbiAgfVxuXG4gIGlmIChwYXJhbWV0ZXIuc2NhbGUgIT0gbnVsbCkge1xuICAgIGRhdGEuc2NhbGUgPSBwYXJhbWV0ZXIuc2NhbGU7XG4gIH0gZWxzZSBpZiAodHlwZS5yZXNvbHZlU2NhbGUpIHtcbiAgICBkYXRhLnNjYWxlID0gdHlwZS5yZXNvbHZlU2NhbGUodmFsaWRhdGVkKTtcbiAgfVxuXG4gIGlmIChjb2xsYXRpb24pIHtcbiAgICBkYXRhLmNvbGxhdGlvbiA9IGNvbGxhdGlvbjtcbiAgfVxuXG4gIHJldHVybiB7IG5hbWU6IHBhcmFtZXRlci5uYW1lLCBvdXRwdXQ6IHBhcmFtZXRlci5vdXRwdXQsIHR5cGUsIGRhdGEgfTtcbn1cblxuLyoqXG4gKiBEcml2ZXMgdGhlIHJlc3Qgb2YgYSB3cml0ZSByZXR1cm5lZCBieSBgd3JpdGVWYWx1ZWAsIHlpZWxkaW5nIGF0IGVhY2ggb2ZcbiAqIGl0cyB5aWVsZHMuIEFuIGVycm9yIHRoZSByZXN0IHRocm93cyBpcyBwYXNzZWQgdGhyb3VnaCBgd3JhcGAgKGUuZy4gdG9cbiAqIG5hbWUgdGhlIHBhcmFtZXRlciBpdCBiZWxvbmdzIHRvKTsgYW4gZXJyb3IgdGhyb3duIGludG8gdGhpcyBnZW5lcmF0b3IgYnlcbiAqIGl0cyBjb25zdW1lciBrZWVwcyBpdHMgaWRlbnRpdHksIGFuZCBhIGNvbnN1bWVyIHRoYXQgc3RvcHMgZWFybHkgY2xvc2VzXG4gKiB0aGUgcmVzdCwgYW5kIHdpdGggaXQgdGhlIHZhbHVlJ3Mgc291cmNlLCBhcyBgZm9yIGF3YWl0YCB3b3VsZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICogd3JpdGVSZXN0KHJlc3Q6IEFzeW5jSXRlcmFibGU8dm9pZD4sIHdyYXA6IChlcnJvcjogdW5rbm93bikgPT4gRXJyb3IpOiBBc3luY0dlbmVyYXRvcjx2b2lkLCB2b2lkPiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gcmVzdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGV0IHJlc3VsdDogSXRlcmF0b3JSZXN1bHQ8dm9pZD47XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBBIGdlbmVyYXRvciB0aGF0IHRocmV3IGlzIGZpbmlzaGVkOyB0aGVyZSBpcyBub3RoaW5nIHRvIGNsb3NlLlxuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgd3JhcHBlZCA9IHdyYXAoZXJyb3IpO1xuICAgICAgICB0aHJvdyB3cmFwcGVkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB5aWVsZDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQW4gZXJyb3IgdGhyb3duIGludG8gdGhpcyBnZW5lcmF0b3IgYXQgYSB5aWVsZCBjbG9zZXMgdGhlIHJlc3QuIEFcbiAgICAvLyBjbG9zZSB0aGF0IGZhaWxzIG11c3Qgbm90IHJlcGxhY2UgdGhlIGVycm9yIHRoYXQgaXMgcHJvcGFnYXRpbmcuXG4gICAgaWYgKCFkb25lICYmIHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIHByb3BhZ2F0aW5nIGVycm9yIGlzIHdoYXQgc3VyZmFjZXMuXG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFRoZSBjb25zdW1lciBzdG9wcGVkIHB1bGxpbmcuXG4gICAgaWYgKCFkb25lICYmIHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVFlQRSA9IHtcbiAgW051bGwuaWRdOiBOdWxsLFxuICBbVGlueUludC5pZF06IFRpbnlJbnQsXG4gIFtCaXQuaWRdOiBCaXQsXG4gIFtTbWFsbEludC5pZF06IFNtYWxsSW50LFxuICBbSW50LmlkXTogSW50LFxuICBbU21hbGxEYXRlVGltZS5pZF06IFNtYWxsRGF0ZVRpbWUsXG4gIFtSZWFsLmlkXTogUmVhbCxcbiAgW01vbmV5LmlkXTogTW9uZXksXG4gIFtEYXRlVGltZS5pZF06IERhdGVUaW1lLFxuICBbRmxvYXQuaWRdOiBGbG9hdCxcbiAgW0RlY2ltYWwuaWRdOiBEZWNpbWFsLFxuICBbTnVtZXJpYy5pZF06IE51bWVyaWMsXG4gIFtTbWFsbE1vbmV5LmlkXTogU21hbGxNb25leSxcbiAgW0JpZ0ludC5pZF06IEJpZ0ludCxcbiAgW0ltYWdlLmlkXTogSW1hZ2UsXG4gIFtUZXh0LmlkXTogVGV4dCxcbiAgW1VuaXF1ZUlkZW50aWZpZXIuaWRdOiBVbmlxdWVJZGVudGlmaWVyLFxuICBbSW50Ti5pZF06IEludE4sXG4gIFtOVGV4dC5pZF06IE5UZXh0LFxuICBbQml0Ti5pZF06IEJpdE4sXG4gIFtEZWNpbWFsTi5pZF06IERlY2ltYWxOLFxuICBbTnVtZXJpY04uaWRdOiBOdW1lcmljTixcbiAgW0Zsb2F0Ti5pZF06IEZsb2F0TixcbiAgW01vbmV5Ti5pZF06IE1vbmV5TixcbiAgW0RhdGVUaW1lTi5pZF06IERhdGVUaW1lTixcbiAgW1ZhckJpbmFyeS5pZF06IFZhckJpbmFyeSxcbiAgW1ZhckNoYXIuaWRdOiBWYXJDaGFyLFxuICBbQmluYXJ5LmlkXTogQmluYXJ5LFxuICBbQ2hhci5pZF06IENoYXIsXG4gIFtOVmFyQ2hhci5pZF06IE5WYXJDaGFyLFxuICBbTkNoYXIuaWRdOiBOQ2hhcixcbiAgW1htbC5pZF06IFhtbCxcbiAgW1RpbWUuaWRdOiBUaW1lLFxuICBbRGF0ZS5pZF06IERhdGUsXG4gIFtEYXRlVGltZTIuaWRdOiBEYXRlVGltZTIsXG4gIFtEYXRlVGltZU9mZnNldC5pZF06IERhdGVUaW1lT2Zmc2V0LFxuICBbVURULmlkXTogVURULFxuICBbVFZQLmlkXTogVFZQLFxuICBbVmFyaWFudC5pZF06IFZhcmlhbnQsXG59O1xuXG4vKipcbiAqIDx0YWJsZT5cbiAqIDx0aGVhZD5cbiAqICAgPHRyPlxuICogICAgIDx0aD5UeXBlPC90aD5cbiAqICAgICA8dGg+Q29uc3RhbnQ8L3RoPlxuICogICAgIDx0aD5KYXZhU2NyaXB0PC90aD5cbiAqICAgICA8dGg+UmVzdWx0IHNldDwvdGg+XG4gKiAgICAgPHRoPlBhcmFtZXRlcjwvdGg+XG4gKiAgIDwvdHI+XG4gKiA8L3RoZWFkPlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNVwiPkV4YWN0IG51bWVyaWNzPC90aD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5iaXQ8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5CaXRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5ib29sZWFuPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+dGlueWludDwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlRpbnlJbnRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5udW1iZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5zbWFsbGludDwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlNtYWxsSW50XV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+bnVtYmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+aW50PC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuSW50XV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+bnVtYmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+YmlnaW50PC9jb2RlPjxzdXA+MTwvc3VwPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuQmlnSW50XV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+c3RyaW5nPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+bnVtZXJpYzwvY29kZT48c3VwPjI8L3N1cD48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLk51bWVyaWNdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5udW1iZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5kZWNpbWFsPC9jb2RlPjxzdXA+Mjwvc3VwPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuRGVjaW1hbF1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPm51bWJlcjwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPnNtYWxsbW9uZXk8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5TbWFsbE1vbmV5XV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+bnVtYmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+bW9uZXk8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5Nb25leV1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPm51bWJlcjwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogPC90Ym9keT5cbiAqXG4gKiA8dGJvZHk+XG4gKiAgIDx0ciBjbGFzcz1cImdyb3VwLWhlYWRpbmdcIj5cbiAqICAgICA8dGggY29sc3Bhbj1cIjVcIj5BcHByb3hpbWF0ZSBudW1lcmljczwvdGg+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+ZmxvYXQ8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5GbG9hdF1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPm51bWJlcjwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPnJlYWw8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5SZWFsXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+bnVtYmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNVwiPkRhdGUgYW5kIFRpbWU8L3RoPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPnNtYWxsZGF0ZXRpbWU8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5TbWFsbERhdGVUaW1lXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+RGF0ZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPmRhdGV0aW1lPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuRGF0ZVRpbWVdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5EYXRlPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+ZGF0ZXRpbWUyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuRGF0ZVRpbWUyXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+RGF0ZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPmRhdGV0aW1lb2Zmc2V0PC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuRGF0ZVRpbWVPZmZzZXRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5EYXRlPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+dGltZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlRpbWVdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5EYXRlPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+ZGF0ZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLkRhdGVdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5EYXRlPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNVwiPkNoYXJhY3RlciBTdHJpbmdzPC90aD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5jaGFyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuQ2hhcl1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPnN0cmluZzwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPnZhcmNoYXI8L2NvZGU+PHN1cD4zPC9zdXA+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5WYXJDaGFyXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+c3RyaW5nPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+dGV4dDwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlRleHRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5zdHJpbmc8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqIDwvdGJvZHk+XG4gKlxuICogPHRib2R5PlxuICogICA8dHIgY2xhc3M9XCJncm91cC1oZWFkaW5nXCI+XG4gKiAgICAgPHRoIGNvbHNwYW49XCI1XCI+VW5pY29kZSBTdHJpbmdzPC90aD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5uY2hhcjwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLk5DaGFyXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+c3RyaW5nPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+bnZhcmNoYXI8L2NvZGU+PHN1cD4zPC9zdXA+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5OVmFyQ2hhcl1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPnN0cmluZzwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPm50ZXh0PC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuTlRleHRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5zdHJpbmc8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+LTwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNVwiPkJpbmFyeSBTdHJpbmdzPHN1cD40PC9zdXA+PC90aD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5iaW5hcnk8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5CaW5hcnldXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5CdWZmZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT52YXJiaW5hcnk8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5WYXJCaW5hcnldXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5CdWZmZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5pbWFnZTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLkltYWdlXV08L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+QnVmZmVyPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgICAgPHRkPuKckzwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICpcbiAqIDx0Ym9keT5cbiAqICAgPHRyIGNsYXNzPVwiZ3JvdXAtaGVhZGluZ1wiPlxuICogICAgIDx0aCBjb2xzcGFuPVwiNVwiPk90aGVyIERhdGEgVHlwZXM8L3RoPlxuICogICA8L3RyPlxuICogICA8dHI+XG4gKiAgICAgPHRkPjxjb2RlPlRWUDwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlRWUF1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPk9iamVjdDwvY29kZT48L3RkPlxuICogICAgIDx0ZD4tPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT5VRFQ8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5VRFRdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5CdWZmZXI8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+LTwvdGQ+XG4gKiAgIDwvdHI+XG4gKiAgIDx0cj5cbiAqICAgICA8dGQ+PGNvZGU+dW5pcXVlaWRlbnRpZmllcjwvY29kZT48c3VwPjQ8L3N1cD48L3RkPlxuICogICAgIDx0ZD48Y29kZT5bW1RZUEVTLlVuaXF1ZUlkZW50aWZpZXJdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5zdHJpbmc8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT52YXJpYW50PC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPltbVFlQRVMuVmFyaWFudF1dPC9jb2RlPjwvdGQ+XG4gKiAgICAgPHRkPjxjb2RlPmFueTwvY29kZT48L3RkPlxuICogICAgIDx0ZD7inJM8L3RkPlxuICogICAgIDx0ZD4tPC90ZD5cbiAqICAgPC90cj5cbiAqICAgPHRyPlxuICogICAgIDx0ZD48Y29kZT54bWw8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+PGNvZGU+W1tUWVBFUy5YbWxdXTwvY29kZT48L3RkPlxuICogICAgIDx0ZD48Y29kZT5zdHJpbmc8L2NvZGU+PC90ZD5cbiAqICAgICA8dGQ+4pyTPC90ZD5cbiAqICAgICA8dGQ+LTwvdGQ+XG4gKiAgIDwvdHI+XG4gKiA8L3Rib2R5PlxuICogPC90YWJsZT5cbiAqXG4gKiA8b2w+XG4gKiAgIDxsaT5cbiAqICAgICA8aDQ+QmlnSW50PC9oND5cbiAqICAgICA8cD5cbiAqICAgICAgIFZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgYSBzdHJpbmcuIFRoaXMgaXMgYmVjYXVzZSB2YWx1ZXMgY2FuIGV4Y2VlZCA1MyBiaXRzIG9mIHNpZ25pZmljYW50IGRhdGEsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBhXG4gKiAgICAgICBKYXZhc2NyaXB0IDxjb2RlPm51bWJlcjwvY29kZT4gdHlwZSBjYW4gcmVwcmVzZW50IGFzIGFuIGludGVnZXIuXG4gKiAgICAgPC9wPlxuICogICA8L2xpPlxuICogICA8bGk+XG4gKiAgICAgPGg0Pk51bWVyaWNhbCwgRGVjaW1hbDwvaDQ+XG4gKiAgICAgPHA+XG4gKiAgICAgICBGb3IgaW5wdXQgcGFyYW1ldGVycywgZGVmYXVsdCBwcmVjaXNpb24gaXMgMTggYW5kIGRlZmF1bHQgc2NhbGUgaXMgMC4gTWF4aW11bSBzdXBwb3J0ZWQgcHJlY2lzaW9uIGlzIDE5LlxuICogICAgIDwvcD5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIDxoND5WYXJDaGFyLCBOVmFyQ2hhcjwvaDQ+XG4gKiAgICAgPHA+XG4gKiAgICAgICA8Y29kZT52YXJjaGFyKG1heCk8L2NvZGU+IGFuZCA8Y29kZT5udmFyY2hhcihtYXgpPC9jb2RlPiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gKiAgICAgPC9wPlxuICogICA8L2xpPlxuICogICA8bGk+XG4gKiAgICAgPGg0PlVuaXF1ZUlkZW50aWZpZXI8L2g0PlxuICogICAgIDxwPlxuICogICAgICAgVmFsdWVzIGFyZSByZXR1cm5lZCBhcyBhIDE2IGJ5dGUgaGV4YWRlY2ltYWwgc3RyaW5nLlxuICogICAgIDwvcD5cbiAqICAgICA8cD5cbiAqICAgICAgIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgYnl0ZXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjaGFyYWN0ZXIgcmVwcmVzZW50YXRpb24uIFNlZVxuICogICAgICAgPGEgaHJlZj1cImh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE5MDIxNS5hc3B4XCI+VXNpbmcgdW5pcXVlaWRlbnRpZmllciBEYXRhPC9hPlxuICogICAgICAgZm9yIGFuIGV4YW1wbGUgb2YgdGhlIGRpZmZlcmVudCBvcmRlcmluZyBvZiBieXRlcy5cbiAqICAgICA8L3A+XG4gKiAgIDwvbGk+XG4gKiA8L29sPlxuICovXG5leHBvcnQgY29uc3QgVFlQRVMgPSB7XG4gIFRpbnlJbnQsXG4gIEJpdCxcbiAgU21hbGxJbnQsXG4gIEludCxcbiAgU21hbGxEYXRlVGltZSxcbiAgUmVhbCxcbiAgTW9uZXksXG4gIERhdGVUaW1lLFxuICBGbG9hdCxcbiAgRGVjaW1hbCxcbiAgTnVtZXJpYyxcbiAgU21hbGxNb25leSxcbiAgQmlnSW50LFxuICBJbWFnZSxcbiAgVGV4dCxcbiAgVW5pcXVlSWRlbnRpZmllcixcbiAgTlRleHQsXG4gIFZhckJpbmFyeSxcbiAgVmFyQ2hhcixcbiAgQmluYXJ5LFxuICBDaGFyLFxuICBOVmFyQ2hhcixcbiAgTkNoYXIsXG4gIFhtbCxcbiAgVGltZSxcbiAgRGF0ZSxcbiAgRGF0ZVRpbWUyLFxuICBEYXRlVGltZU9mZnNldCxcbiAgVURULFxuICBUVlAsXG4gIFZhcmlhbnRcbn07XG5cbmV4cG9ydCBjb25zdCB0eXBlQnlOYW1lID0gVFlQRVM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLElBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLElBQUEsR0FBQUwsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFLLGNBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLEtBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLE1BQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLFNBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLFFBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLFFBQUEsR0FBQVosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFZLFdBQUEsR0FBQWIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFhLE9BQUEsR0FBQWQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFjLE1BQUEsR0FBQWYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFlLEtBQUEsR0FBQWhCLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBZ0IsaUJBQUEsR0FBQWpCLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBaUIsS0FBQSxHQUFBbEIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFrQixNQUFBLEdBQUFuQixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQW1CLEtBQUEsR0FBQXBC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QyxFQUFFLEdBQUdrQyxrQkFBUztFQUN6QixDQUFDQyx1QkFBYyxDQUFDbkMsRUFBRSxHQUFHbUMsdUJBQWM7RUFDbkMsQ0FBQ0MsWUFBRyxDQUFDcEMsRUFBRSxHQUFHb0MsWUFBRztFQUNiLENBQUNDLFlBQUcsQ0FBQ3JDLEVBQUUsR0FBR3FDLFlBQUc7RUFDYixDQUFDQyxtQkFBTyxDQUFDdEMsRUFBRSxHQUFHc0M7QUFDaEIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUMsS0FBSyxHQUFBekMsT0FBQSxDQUFBeUMsS0FBQSxHQUFHO0VBQ25CdEMsT0FBTyxFQUFQQSxnQkFBTztFQUNQQyxHQUFHLEVBQUhBLFlBQUc7RUFDSEMsUUFBUSxFQUFSQSxpQkFBUTtFQUNSQyxHQUFHLEVBQUhBLFlBQUc7RUFDSEMsYUFBYSxFQUFiQSxzQkFBYTtFQUNiQyxJQUFJLEVBQUpBLGFBQUk7RUFDSkMsS0FBSyxFQUFMQSxjQUFLO0VBQ0xDLFFBQVEsRUFBUkEsaUJBQVE7RUFDUkMsS0FBSyxFQUFMQSxjQUFLO0VBQ0xDLE9BQU8sRUFBUEEsZ0JBQU87RUFDUEMsT0FBTyxFQUFQQSxnQkFBTztFQUNQQyxVQUFVLEVBQVZBLG1CQUFVO0VBQ1ZDLE1BQU0sRUFBTkEsZUFBTTtFQUNOQyxLQUFLLEVBQUxBLGNBQUs7RUFDTEMsSUFBSSxFQUFKQSxhQUFJO0VBQ0pDLGdCQUFnQixFQUFoQkEseUJBQWdCO0VBQ2hCRSxLQUFLLEVBQUxBLGNBQUs7RUFDTE8sU0FBUyxFQUFUQSxrQkFBUztFQUNUQyxPQUFPLEVBQVBBLGdCQUFPO0VBQ1BDLE1BQU0sRUFBTkEsZUFBTTtFQUNOQyxJQUFJLEVBQUpBLGFBQUk7RUFDSkMsUUFBUSxFQUFSQSxpQkFBUTtFQUNSQyxLQUFLLEVBQUxBLGNBQUs7RUFDTEMsR0FBRyxFQUFIQSxZQUFHO0VBQ0hDLElBQUksRUFBSkEsYUFBSTtFQUNKQyxJQUFJLEVBQUpBLGFBQUk7RUFDSkMsU0FBUyxFQUFUQSxrQkFBUztFQUNUQyxjQUFjLEVBQWRBLHVCQUFjO0VBQ2RDLEdBQUcsRUFBSEEsWUFBRztFQUNIQyxHQUFHLEVBQUhBLFlBQUc7RUFDSEMsT0FBTyxFQUFQQTtBQUNGLENBQUM7QUFFTSxNQUFNRSxVQUFVLEdBQUExQyxPQUFBLENBQUEwQyxVQUFBLEdBQUdELEtBQUsiLCJpZ25vcmVMaXN0IjpbXX0=