streakapi
Version:
wrapper for the Streak API
617 lines (554 loc) • 49.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Streak = undefined;
var _taggedTemplateLiteral2 = require('babel-runtime/helpers/taggedTemplateLiteral');
var _taggedTemplateLiteral3 = _interopRequireDefault(_taggedTemplateLiteral2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _templateObject = (0, _taggedTemplateLiteral3.default)(['pipelines/', ''], ['pipelines/', '']),
_templateObject2 = (0, _taggedTemplateLiteral3.default)(['pipelines/', '/boxes'], ['pipelines/', '/boxes']),
_templateObject3 = (0, _taggedTemplateLiteral3.default)(['pipelines/', '/boxes?stageKey=', ''], ['pipelines/', '/boxes?stageKey=', '']),
_templateObject4 = (0, _taggedTemplateLiteral3.default)(['pipelines/', '/newsfeed'], ['pipelines/', '/newsfeed']),
_templateObject5 = (0, _taggedTemplateLiteral3.default)(['pipelines/', '/stages'], ['pipelines/', '/stages']),
_templateObject6 = (0, _taggedTemplateLiteral3.default)(['pipelines/', '/stages/', ''], ['pipelines/', '/stages/', '']),
_templateObject7 = (0, _taggedTemplateLiteral3.default)(['pipelines/', '/fields'], ['pipelines/', '/fields']),
_templateObject8 = (0, _taggedTemplateLiteral3.default)(['pipelines/', '/fields/', ''], ['pipelines/', '/fields/', '']),
_templateObject9 = (0, _taggedTemplateLiteral3.default)(['boxes/', ''], ['boxes/', '']),
_templateObject10 = (0, _taggedTemplateLiteral3.default)(['boxes/', '/fields'], ['boxes/', '/fields']),
_templateObject11 = (0, _taggedTemplateLiteral3.default)(['boxes/', '/reminders'], ['boxes/', '/reminders']),
_templateObject12 = (0, _taggedTemplateLiteral3.default)(['boxes/', '/comments'], ['boxes/', '/comments']),
_templateObject13 = (0, _taggedTemplateLiteral3.default)(['boxes/', '/files'], ['boxes/', '/files']),
_templateObject14 = (0, _taggedTemplateLiteral3.default)(['boxes/', '/threads'], ['boxes/', '/threads']),
_templateObject15 = (0, _taggedTemplateLiteral3.default)(['boxes/', '/newsfeed'], ['boxes/', '/newsfeed']),
_templateObject16 = (0, _taggedTemplateLiteral3.default)(['boxes/', '/tasks'], ['boxes/', '/tasks']),
_templateObject17 = (0, _taggedTemplateLiteral3.default)(['boxes/', '/fields/', ''], ['boxes/', '/fields/', '']),
_templateObject18 = (0, _taggedTemplateLiteral3.default)(['files/', ''], ['files/', '']),
_templateObject19 = (0, _taggedTemplateLiteral3.default)(['files/', '/contents'], ['files/', '/contents']),
_templateObject20 = (0, _taggedTemplateLiteral3.default)(['threads/', ''], ['threads/', '']),
_templateObject21 = (0, _taggedTemplateLiteral3.default)(['tasks/', ''], ['tasks/', '']),
_templateObject22 = (0, _taggedTemplateLiteral3.default)(['search?query=', ''], ['search?query=', '']);
var _https = require('https');
var _https2 = _interopRequireDefault(_https);
var _querystring = require('querystring');
var _querystring2 = _interopRequireDefault(_querystring);
var _autoEncodeUri = require('./auto-encode-uri');
var _autoEncodeUri2 = _interopRequireDefault(_autoEncodeUri);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ConnHelper = function () {
function ConnHelper(authKey) {
(0, _classCallCheck3.default)(this, ConnHelper);
this._authKey = authKey;
}
(0, _createClass3.default)(ConnHelper, [{
key: '_getRequestOptions',
value: function _getRequestOptions(method, path) {
var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var encoding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'utf8';
// By default we request the V1 of the API
var prefix = '/api/v1/';
// If the requested resource is a Task, then use the V2 of the API
if (path.indexOf('tasks') > -1) prefix = '/api/v2';
return {
method: method, headers: headers, encoding: encoding,
host: 'api.streak.com',
path: prefix + path,
auth: this._authKey
};
}
}, {
key: '_parseResponse',
value: function _parseResponse(response) {
return new _promise2.default(function (resolve, reject) {
var strs = [];
response.on('data', function (chunk) {
strs.push(chunk);
});
response.on('end', function () {
try {
var str = strs.join('');
if (response.statusCode === 200) {
resolve(JSON.parse(str));
} else {
var json = void 0;
var errorMessage = 'Response code ' + response.statusCode;
try {
json = JSON.parse(str);
if (json && json.error) {
errorMessage = json.error;
}
} catch (err) {
// Ignore parse error
}
reject((0, _assign2.default)(new Error(errorMessage), {
str: str, json: json,
statusCode: response.statusCode,
headers: response.headers
}));
}
} catch (err) {
reject(err);
}
});
response.on('error', reject);
});
}
}, {
key: '_plainResponse',
value: function _plainResponse(response) {
return new _promise2.default(function (resolve, reject) {
var chunks = [];
response.on('data', function (chunk) {
chunks.push(chunk);
});
response.on('end', function () {
try {
var buf = Buffer.concat(chunks);
if (response.statusCode === 200) {
resolve(buf);
} else {
var errorMessage = 'Response code ' + response.statusCode;
reject((0, _assign2.default)(new Error(errorMessage), {
buf: buf,
statusCode: response.statusCode,
headers: response.headers
}));
}
} catch (err) {
reject(err);
}
});
response.on('error', reject);
});
}
}, {
key: 'get',
value: function get(path) {
var _this = this;
return new _promise2.default(function (resolve, reject) {
var opts = _this._getRequestOptions('GET', path);
var request = _https2.default.request(opts, function (res) {
resolve(_this._parseResponse(res));
});
request.on('error', reject);
request.end();
});
}
}, {
key: 'getNoParse',
value: function getNoParse(path) {
var _this2 = this;
return new _promise2.default(function (resolve, reject) {
var opts = _this2._getRequestOptions('GET', path, undefined, null);
var request = _https2.default.request(opts, function (res) {
resolve(_this2._plainResponse(res));
});
request.on('error', reject);
request.end();
});
}
}, {
key: 'put',
value: function put(path, data) {
var _this3 = this;
return new _promise2.default(function (resolve, reject) {
var dstr = _querystring2.default.stringify(data);
var opts = _this3._getRequestOptions('PUT', path + '?' + dstr);
var request = _https2.default.request(opts, function (res) {
resolve(_this3._parseResponse(res));
});
request.on('error', reject);
request.end();
});
}
}, {
key: 'delete',
value: function _delete(path) {
var _this4 = this;
return new _promise2.default(function (resolve, reject) {
var opts = _this4._getRequestOptions('DELETE', path);
var request = _https2.default.request(opts, function (res) {
resolve(_this4._parseResponse(res));
});
request.on('error', reject);
request.end();
});
}
}, {
key: 'post',
value: function post(path, data) {
var _this5 = this;
return new _promise2.default(function (resolve, reject) {
var send = _querystring2.default.stringify({ json: (0, _stringify2.default)(data) });
var opts = _this5._getRequestOptions('POST', path, {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': send.length
});
var request = _https2.default.request(opts, function (res) {
resolve(_this5._parseResponse(res));
});
request.write(send);
request.on('error', reject);
request.end();
});
}
}]);
return ConnHelper;
}();
var Me = function () {
function Me(s, c) {
(0, _classCallCheck3.default)(this, Me);
this._s = s;
this._c = c;
}
(0, _createClass3.default)(Me, [{
key: 'get',
value: function get() {
return this._c.get('users/me');
}
}]);
return Me;
}();
var Pipelines = function () {
function Pipelines(s, c) {
(0, _classCallCheck3.default)(this, Pipelines);
this._s = s;
this._c = c;
this.Stages = new PipelineStages(s, c);
this.Fields = new PipelineFields(s, c);
}
(0, _createClass3.default)(Pipelines, [{
key: 'getAll',
value: function getAll() {
return this._c.get('pipelines');
}
}, {
key: 'getOne',
value: function getOne(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject, key));
}
}, {
key: 'getBoxes',
value: function getBoxes(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject2, key));
}
}, {
key: 'getBoxesInStage',
value: function getBoxesInStage(key, stageKey) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject3, key, stageKey));
}
}, {
key: 'create',
value: function create(data) {
return this._c.put('pipelines', data);
}
}, {
key: 'delete',
value: function _delete(key) {
return this._c.delete((0, _autoEncodeUri2.default)(_templateObject, key));
}
}, {
key: 'update',
value: function update(data) {
return this._c.post((0, _autoEncodeUri2.default)(_templateObject, data.key), data);
}
}, {
key: 'getFeed',
value: function getFeed(key, detailLevel) {
var qs = '';
if (detailLevel) {
qs += '?' + _querystring2.default.stringify({ detailLevel: detailLevel });
}
return this._c.get((0, _autoEncodeUri2.default)(_templateObject4, key) + qs);
}
}]);
return Pipelines;
}();
var PipelineStages = function () {
function PipelineStages(s, c) {
(0, _classCallCheck3.default)(this, PipelineStages);
this._s = s;
this._c = c;
}
(0, _createClass3.default)(PipelineStages, [{
key: 'getAll',
value: function getAll(pipeKey) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject5, pipeKey));
}
}, {
key: 'getOne',
value: function getOne(pipeKey, key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject6, pipeKey, key));
}
}, {
key: 'create',
value: function create(pipeKey, data) {
return this._c.put((0, _autoEncodeUri2.default)(_templateObject5, pipeKey), data);
}
}, {
key: 'delete',
value: function _delete(pipeKey, key) {
return this._c.delete((0, _autoEncodeUri2.default)(_templateObject6, pipeKey, key));
}
}, {
key: 'update',
value: function update(pipeKey, data) {
return this._c.post((0, _autoEncodeUri2.default)(_templateObject6, pipeKey, data.key), data);
}
}]);
return PipelineStages;
}();
var PipelineFields = function () {
function PipelineFields(s, c) {
(0, _classCallCheck3.default)(this, PipelineFields);
this._s = s;
this._c = c;
}
(0, _createClass3.default)(PipelineFields, [{
key: 'getAll',
value: function getAll(pipeKey) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject7, pipeKey));
}
}, {
key: 'getOne',
value: function getOne(pipeKey, key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject8, pipeKey, key));
}
}, {
key: 'create',
value: function create(pipeKey, data) {
return this._c.put((0, _autoEncodeUri2.default)(_templateObject7, pipeKey), data);
}
}, {
key: 'delete',
value: function _delete(pipeKey, key) {
return this._c.delete((0, _autoEncodeUri2.default)(_templateObject8, pipeKey, key));
}
}, {
key: 'update',
value: function update(pipeKey, data) {
return this._c.post((0, _autoEncodeUri2.default)(_templateObject8, pipeKey, data.key), data);
}
}]);
return PipelineFields;
}();
var Boxes = function () {
function Boxes(s, c) {
(0, _classCallCheck3.default)(this, Boxes);
this._s = s;
this._c = c;
this.Fields = new BoxFields(s, c);
}
(0, _createClass3.default)(Boxes, [{
key: 'getAll',
value: function getAll() {
return this._c.get('boxes');
}
}, {
key: 'getForPipeline',
value: function getForPipeline(key) {
return this._s.Pipelines.getBoxes(key);
}
}, {
key: 'getOne',
value: function getOne(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject9, key));
}
}, {
key: 'create',
value: function create(pipeKey, data) {
return this._c.put((0, _autoEncodeUri2.default)(_templateObject2, pipeKey), data);
}
}, {
key: 'delete',
value: function _delete(key) {
return this._c.delete((0, _autoEncodeUri2.default)(_templateObject9, key));
}
}, {
key: 'update',
value: function update(data) {
return this._c.post((0, _autoEncodeUri2.default)(_templateObject9, data.key), data);
}
}, {
key: 'getFields',
value: function getFields(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject10, key));
}
}, {
key: 'getReminders',
value: function getReminders(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject11, key));
}
}, {
key: 'getComments',
value: function getComments(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject12, key));
}
// deprecated method
}, {
key: 'createComment',
value: function createComment(key, data) {
return this._c.put((0, _autoEncodeUri2.default)(_templateObject12, key), data);
}
}, {
key: 'postComment',
value: function postComment(key, message) {
return this._c.put((0, _autoEncodeUri2.default)(_templateObject12, key), { message: message });
}
}, {
key: 'getFiles',
value: function getFiles(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject13, key));
}
}, {
key: 'getThreads',
value: function getThreads(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject14, key));
}
}, {
key: 'getFeed',
value: function getFeed(key, detailLevel) {
var qs = '';
if (detailLevel) {
qs += '?' + _querystring2.default.stringify({ detailLevel: detailLevel });
}
return this._c.get((0, _autoEncodeUri2.default)(_templateObject15, key) + qs);
}
}, {
key: 'getTasks',
value: function getTasks(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject16, key));
}
}]);
return Boxes;
}();
var BoxFields = function () {
function BoxFields(s, c) {
(0, _classCallCheck3.default)(this, BoxFields);
this._s = s;
this._c = c;
}
(0, _createClass3.default)(BoxFields, [{
key: 'getForBox',
value: function getForBox(key) {
return this._s.Boxes.getFields(key);
}
}, {
key: 'getOne',
value: function getOne(boxKey, key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject17, boxKey, key));
}
}, {
key: 'update',
value: function update(boxKey, data) {
return this._c.post((0, _autoEncodeUri2.default)(_templateObject17, boxKey, data.key), data);
}
}]);
return BoxFields;
}();
var Files = function () {
function Files(s, c) {
(0, _classCallCheck3.default)(this, Files);
this._s = s;
this._c = c;
}
(0, _createClass3.default)(Files, [{
key: 'getForBox',
value: function getForBox(key) {
return this._s.Boxes.getFiles(key);
}
}, {
key: 'getOne',
value: function getOne(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject18, key));
}
}, {
key: 'getContents',
value: function getContents(key) {
return this._c.getNoParse((0, _autoEncodeUri2.default)(_templateObject19, key));
}
}]);
return Files;
}();
var Threads = function () {
function Threads(s, c) {
(0, _classCallCheck3.default)(this, Threads);
this._s = s;
this._c = c;
}
(0, _createClass3.default)(Threads, [{
key: 'getForBox',
value: function getForBox(boxKey) {
return this._s.Boxes.getThreads(boxKey);
}
}, {
key: 'getOne',
value: function getOne(threadKey) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject20, threadKey));
}
}]);
return Threads;
}();
var Tasks = function () {
function Tasks(s, c) {
(0, _classCallCheck3.default)(this, Tasks);
this._s = s;
this._c = c;
}
(0, _createClass3.default)(Tasks, [{
key: 'getForBox',
value: function getForBox(boxKey) {
return this._s.Boxes.getTasks(boxKey);
}
}, {
key: 'getOne',
value: function getOne(key) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject21, key));
}
}, {
key: 'create',
value: function create(boxKey, data) {
return this._c.post((0, _autoEncodeUri2.default)(_templateObject16, boxKey), data);
}
}, {
key: 'update',
value: function update(key, data) {
return this._c.post((0, _autoEncodeUri2.default)(_templateObject21, key), data);
}
}, {
key: 'delete',
value: function _delete(key) {
return this._c.delete((0, _autoEncodeUri2.default)(_templateObject21, key));
}
}]);
return Tasks;
}();
var Streak = exports.Streak = function () {
function Streak(authKey) {
(0, _classCallCheck3.default)(this, Streak);
this._c = new ConnHelper(authKey);
this.Me = new Me(this, this._c);
this.Pipelines = new Pipelines(this, this._c);
this.Boxes = new Boxes(this, this._c);
this.Files = new Files(this, this._c);
this.Threads = new Threads(this, this._c);
this.Tasks = new Tasks(this, this._c);
}
(0, _createClass3.default)(Streak, [{
key: 'search',
value: function search(query) {
return this._c.get((0, _autoEncodeUri2.default)(_templateObject22, query));
}
}]);
return Streak;
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJDb25uSGVscGVyIiwiYXV0aEtleSIsIl9hdXRoS2V5IiwibWV0aG9kIiwicGF0aCIsImhlYWRlcnMiLCJlbmNvZGluZyIsInByZWZpeCIsImluZGV4T2YiLCJob3N0IiwiYXV0aCIsInJlc3BvbnNlIiwicmVzb2x2ZSIsInJlamVjdCIsInN0cnMiLCJvbiIsImNodW5rIiwicHVzaCIsInN0ciIsImpvaW4iLCJzdGF0dXNDb2RlIiwiSlNPTiIsInBhcnNlIiwianNvbiIsImVycm9yTWVzc2FnZSIsImVycm9yIiwiZXJyIiwiRXJyb3IiLCJjaHVua3MiLCJidWYiLCJCdWZmZXIiLCJjb25jYXQiLCJvcHRzIiwiX2dldFJlcXVlc3RPcHRpb25zIiwicmVxdWVzdCIsImh0dHBzIiwiX3BhcnNlUmVzcG9uc2UiLCJyZXMiLCJlbmQiLCJ1bmRlZmluZWQiLCJfcGxhaW5SZXNwb25zZSIsImRhdGEiLCJkc3RyIiwicXVlcnlzdHJpbmciLCJzdHJpbmdpZnkiLCJzZW5kIiwibGVuZ3RoIiwid3JpdGUiLCJNZSIsInMiLCJjIiwiX3MiLCJfYyIsImdldCIsIlBpcGVsaW5lcyIsIlN0YWdlcyIsIlBpcGVsaW5lU3RhZ2VzIiwiRmllbGRzIiwiUGlwZWxpbmVGaWVsZHMiLCJrZXkiLCJhZXUiLCJzdGFnZUtleSIsInB1dCIsImRlbGV0ZSIsInBvc3QiLCJkZXRhaWxMZXZlbCIsInFzIiwicGlwZUtleSIsIkJveGVzIiwiQm94RmllbGRzIiwiZ2V0Qm94ZXMiLCJtZXNzYWdlIiwiZ2V0RmllbGRzIiwiYm94S2V5IiwiRmlsZXMiLCJnZXRGaWxlcyIsImdldE5vUGFyc2UiLCJUaHJlYWRzIiwiZ2V0VGhyZWFkcyIsInRocmVhZEtleSIsIlRhc2tzIiwiZ2V0VGFza3MiLCJTdHJlYWsiLCJxdWVyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7Ozs7QUFDQTs7OztBQUVBOzs7Ozs7SUFFTUEsVTtBQUdKLHNCQUFZQyxPQUFaLEVBQTZCO0FBQUE7O0FBQzNCLFNBQUtDLFFBQUwsR0FBZ0JELE9BQWhCO0FBQ0Q7Ozs7dUNBRWtCRSxNLEVBQWdCQyxJLEVBQW9FO0FBQUEsVUFBdERDLE9BQXNELHVFQUF0QyxFQUFzQztBQUFBLFVBQWxDQyxRQUFrQyx1RUFBaEIsTUFBZ0I7O0FBQ3JHO0FBQ0EsVUFBSUMsU0FBUyxVQUFiOztBQUVBO0FBQ0EsVUFBSUgsS0FBS0ksT0FBTCxDQUFhLE9BQWIsSUFBd0IsQ0FBQyxDQUE3QixFQUFnQ0QsU0FBUyxTQUFUOztBQUVoQyxhQUFPO0FBQ0xKLHNCQURLLEVBQ0dFLGdCQURILEVBQ1lDLGtCQURaO0FBRUxHLGNBQU0sZ0JBRkQ7QUFHTEwsY0FBTUcsU0FBU0gsSUFIVjtBQUlMTSxjQUFNLEtBQUtSO0FBSk4sT0FBUDtBQU1EOzs7bUNBRWNTLFEsRUFBK0M7QUFDNUQsYUFBTyxzQkFBWSxVQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFBcUI7QUFDdEMsWUFBTUMsT0FBaUIsRUFBdkI7QUFDQUgsaUJBQVNJLEVBQVQsQ0FBWSxNQUFaLEVBQW9CLFVBQUNDLEtBQUQsRUFBbUI7QUFDckNGLGVBQUtHLElBQUwsQ0FBVUQsS0FBVjtBQUNELFNBRkQ7QUFHQUwsaUJBQVNJLEVBQVQsQ0FBWSxLQUFaLEVBQW1CLFlBQU07QUFDdkIsY0FBSTtBQUNGLGdCQUFNRyxNQUFNSixLQUFLSyxJQUFMLENBQVUsRUFBVixDQUFaO0FBQ0EsZ0JBQUlSLFNBQVNTLFVBQVQsS0FBd0IsR0FBNUIsRUFBaUM7QUFDL0JSLHNCQUFRUyxLQUFLQyxLQUFMLENBQVdKLEdBQVgsQ0FBUjtBQUNELGFBRkQsTUFFTztBQUNMLGtCQUFJSyxhQUFKO0FBQ0Esa0JBQUlDLGtDQUFnQ2IsU0FBU1MsVUFBN0M7QUFDQSxrQkFBSTtBQUNGRyx1QkFBT0YsS0FBS0MsS0FBTCxDQUFXSixHQUFYLENBQVA7QUFDQSxvQkFBSUssUUFBUUEsS0FBS0UsS0FBakIsRUFBd0I7QUFDdEJELGlDQUFlRCxLQUFLRSxLQUFwQjtBQUNEO0FBQ0YsZUFMRCxDQUtFLE9BQU9DLEdBQVAsRUFBWTtBQUNaO0FBQ0Q7QUFDRGIscUJBQU8sc0JBQWUsSUFBSWMsS0FBSixDQUFVSCxZQUFWLENBQWYsRUFBaUQ7QUFDdEROLHdCQURzRCxFQUNqREssVUFEaUQ7QUFFdERILDRCQUFZVCxTQUFTUyxVQUZpQztBQUd0RGYseUJBQVNNLFNBQVNOO0FBSG9DLGVBQWpELENBQVA7QUFLRDtBQUNGLFdBckJELENBcUJFLE9BQU9xQixHQUFQLEVBQVk7QUFDWmIsbUJBQU9hLEdBQVA7QUFDRDtBQUNGLFNBekJEO0FBMEJBZixpQkFBU0ksRUFBVCxDQUFZLE9BQVosRUFBcUJGLE1BQXJCO0FBQ0QsT0FoQ00sQ0FBUDtBQWlDRDs7O21DQUVjRixRLEVBQWtEO0FBQy9ELGFBQU8sc0JBQVksVUFBQ0MsT0FBRCxFQUFVQyxNQUFWLEVBQXFCO0FBQ3RDLFlBQU1lLFNBQW1CLEVBQXpCO0FBQ0FqQixpQkFBU0ksRUFBVCxDQUFZLE1BQVosRUFBb0IsVUFBQ0MsS0FBRCxFQUFtQjtBQUNyQ1ksaUJBQU9YLElBQVAsQ0FBWUQsS0FBWjtBQUNELFNBRkQ7QUFHQUwsaUJBQVNJLEVBQVQsQ0FBWSxLQUFaLEVBQW1CLFlBQU07QUFDdkIsY0FBSTtBQUNGLGdCQUFNYyxNQUFNQyxPQUFPQyxNQUFQLENBQWNILE1BQWQsQ0FBWjtBQUNBLGdCQUFJakIsU0FBU1MsVUFBVCxLQUF3QixHQUE1QixFQUFpQztBQUMvQlIsc0JBQVFpQixHQUFSO0FBQ0QsYUFGRCxNQUVPO0FBQ0wsa0JBQU1MLGtDQUFnQ2IsU0FBU1MsVUFBL0M7QUFDQVAscUJBQU8sc0JBQWUsSUFBSWMsS0FBSixDQUFVSCxZQUFWLENBQWYsRUFBaUQ7QUFDdERLLHdCQURzRDtBQUV0RFQsNEJBQVlULFNBQVNTLFVBRmlDO0FBR3REZix5QkFBU00sU0FBU047QUFIb0MsZUFBakQsQ0FBUDtBQUtEO0FBQ0YsV0FaRCxDQVlFLE9BQU9xQixHQUFQLEVBQVk7QUFDWmIsbUJBQU9hLEdBQVA7QUFDRDtBQUNGLFNBaEJEO0FBaUJBZixpQkFBU0ksRUFBVCxDQUFZLE9BQVosRUFBcUJGLE1BQXJCO0FBQ0QsT0F2Qk0sQ0FBUDtBQXdCRDs7O3dCQUVHVCxJLEVBQStCO0FBQUE7O0FBQ2pDLGFBQU8sc0JBQVksVUFBQ1EsT0FBRCxFQUFVQyxNQUFWLEVBQXFCO0FBQ3RDLFlBQU1tQixPQUFPLE1BQUtDLGtCQUFMLENBQXdCLEtBQXhCLEVBQStCN0IsSUFBL0IsQ0FBYjtBQUNBLFlBQU04QixVQUFVQyxnQkFBTUQsT0FBTixDQUFjRixJQUFkLEVBQW9CLGVBQU87QUFDekNwQixrQkFBUSxNQUFLd0IsY0FBTCxDQUFvQkMsR0FBcEIsQ0FBUjtBQUNELFNBRmUsQ0FBaEI7QUFHQUgsZ0JBQVFuQixFQUFSLENBQVcsT0FBWCxFQUFvQkYsTUFBcEI7QUFDQXFCLGdCQUFRSSxHQUFSO0FBQ0QsT0FQTSxDQUFQO0FBUUQ7OzsrQkFFVWxDLEksRUFBK0I7QUFBQTs7QUFDeEMsYUFBTyxzQkFBWSxVQUFDUSxPQUFELEVBQVVDLE1BQVYsRUFBcUI7QUFDdEMsWUFBTW1CLE9BQU8sT0FBS0Msa0JBQUwsQ0FBd0IsS0FBeEIsRUFBK0I3QixJQUEvQixFQUFxQ21DLFNBQXJDLEVBQWdELElBQWhELENBQWI7QUFDQSxZQUFNTCxVQUFVQyxnQkFBTUQsT0FBTixDQUFjRixJQUFkLEVBQW9CLGVBQU87QUFDekNwQixrQkFBUSxPQUFLNEIsY0FBTCxDQUFvQkgsR0FBcEIsQ0FBUjtBQUNELFNBRmUsQ0FBaEI7QUFHQUgsZ0JBQVFuQixFQUFSLENBQVcsT0FBWCxFQUFvQkYsTUFBcEI7QUFDQXFCLGdCQUFRSSxHQUFSO0FBQ0QsT0FQTSxDQUFQO0FBUUQ7Ozt3QkFFR2xDLEksRUFBY3FDLEksRUFBK0I7QUFBQTs7QUFDL0MsYUFBTyxzQkFBWSxVQUFDN0IsT0FBRCxFQUFVQyxNQUFWLEVBQXFCO0FBQ3RDLFlBQU02QixPQUFPQyxzQkFBWUMsU0FBWixDQUFzQkgsSUFBdEIsQ0FBYjtBQUNBLFlBQU1ULE9BQU8sT0FBS0Msa0JBQUwsQ0FBd0IsS0FBeEIsRUFBK0I3QixPQUFPLEdBQVAsR0FBYXNDLElBQTVDLENBQWI7QUFDQSxZQUFNUixVQUFVQyxnQkFBTUQsT0FBTixDQUFjRixJQUFkLEVBQW9CLGVBQU87QUFDekNwQixrQkFBUSxPQUFLd0IsY0FBTCxDQUFvQkMsR0FBcEIsQ0FBUjtBQUNELFNBRmUsQ0FBaEI7QUFHQUgsZ0JBQVFuQixFQUFSLENBQVcsT0FBWCxFQUFvQkYsTUFBcEI7QUFDQXFCLGdCQUFRSSxHQUFSO0FBQ0QsT0FSTSxDQUFQO0FBU0Q7Ozs0QkFFTWxDLEksRUFBNEI7QUFBQTs7QUFDakMsYUFBTyxzQkFBWSxVQUFDUSxPQUFELEVBQVVDLE1BQVYsRUFBcUI7QUFDdEMsWUFBTW1CLE9BQU8sT0FBS0Msa0JBQUwsQ0FBd0IsUUFBeEIsRUFBa0M3QixJQUFsQyxDQUFiO0FBQ0EsWUFBTThCLFVBQVVDLGdCQUFNRCxPQUFOLENBQWNGLElBQWQsRUFBb0IsZUFBTztBQUN6Q3BCLGtCQUFRLE9BQUt3QixjQUFMLENBQW9CQyxHQUFwQixDQUFSO0FBQ0QsU0FGZSxDQUFoQjtBQUdBSCxnQkFBUW5CLEVBQVIsQ0FBVyxPQUFYLEVBQW9CRixNQUFwQjtBQUNBcUIsZ0JBQVFJLEdBQVI7QUFDRCxPQVBNLENBQVA7QUFRRDs7O3lCQUVJbEMsSSxFQUFjcUMsSSxFQUE0QjtBQUFBOztBQUM3QyxhQUFPLHNCQUFZLFVBQUM3QixPQUFELEVBQVVDLE1BQVYsRUFBcUI7QUFDdEMsWUFBTWdDLE9BQU9GLHNCQUFZQyxTQUFaLENBQXNCLEVBQUNyQixNQUFLLHlCQUFla0IsSUFBZixDQUFOLEVBQXRCLENBQWI7QUFDQSxZQUFNVCxPQUFPLE9BQUtDLGtCQUFMLENBQXdCLE1BQXhCLEVBQWdDN0IsSUFBaEMsRUFBc0M7QUFDakQsMEJBQWdCLG1DQURpQztBQUVqRCw0QkFBa0J5QyxLQUFLQztBQUYwQixTQUF0QyxDQUFiO0FBSUEsWUFBTVosVUFBVUMsZ0JBQU1ELE9BQU4sQ0FBY0YsSUFBZCxFQUFvQixlQUFPO0FBQ3pDcEIsa0JBQVEsT0FBS3dCLGNBQUwsQ0FBb0JDLEdBQXBCLENBQVI7QUFDRCxTQUZlLENBQWhCO0FBR0FILGdCQUFRYSxLQUFSLENBQWNGLElBQWQ7QUFDQVgsZ0JBQVFuQixFQUFSLENBQVcsT0FBWCxFQUFvQkYsTUFBcEI7QUFDQXFCLGdCQUFRSSxHQUFSO0FBQ0QsT0FaTSxDQUFQO0FBYUQ7Ozs7O0lBR0dVLEU7QUFHSixjQUFZQyxDQUFaLEVBQXVCQyxDQUF2QixFQUFzQztBQUFBOztBQUNwQyxTQUFLQyxFQUFMLEdBQVVGLENBQVY7QUFDQSxTQUFLRyxFQUFMLEdBQVVGLENBQVY7QUFDRDs7OzswQkFDSztBQUNKLGFBQU8sS0FBS0UsRUFBTCxDQUFRQyxHQUFSLENBQVksVUFBWixDQUFQO0FBQ0Q7Ozs7O0lBR0dDLFM7QUFLSixxQkFBWUwsQ0FBWixFQUF1QkMsQ0FBdkIsRUFBc0M7QUFBQTs7QUFDcEMsU0FBS0MsRUFBTCxHQUFVRixDQUFWO0FBQ0EsU0FBS0csRUFBTCxHQUFVRixDQUFWO0FBQ0EsU0FBS0ssTUFBTCxHQUFjLElBQUlDLGNBQUosQ0FBbUJQLENBQW5CLEVBQXNCQyxDQUF0QixDQUFkO0FBQ0EsU0FBS08sTUFBTCxHQUFjLElBQUlDLGNBQUosQ0FBbUJULENBQW5CLEVBQXNCQyxDQUF0QixDQUFkO0FBQ0Q7Ozs7NkJBQ1E7QUFDUCxhQUFPLEtBQUtFLEVBQUwsQ0FBUUMsR0FBUixDQUFZLFdBQVosQ0FBUDtBQUNEOzs7MkJBQ01NLEcsRUFBYTtBQUNsQixhQUFPLEtBQUtQLEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixtQkFBNkJELEdBQTdCLEVBQVA7QUFDRDs7OzZCQUNRQSxHLEVBQWE7QUFDcEIsYUFBTyxLQUFLUCxFQUFMLENBQVFDLEdBQVIsS0FBWU8sdUJBQVosb0JBQTZCRCxHQUE3QixFQUFQO0FBQ0Q7OztvQ0FDZ0JBLEcsRUFBYUUsUSxFQUFrQjtBQUM5QyxhQUFPLEtBQUtULEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixvQkFBNkJELEdBQTdCLEVBQW1ERSxRQUFuRCxFQUFQO0FBQ0Q7OzsyQkFDTXBCLEksRUFBYztBQUNuQixhQUFPLEtBQUtXLEVBQUwsQ0FBUVUsR0FBUixDQUFZLFdBQVosRUFBeUJyQixJQUF6QixDQUFQO0FBQ0Q7Ozs0QkFDTWtCLEcsRUFBYTtBQUNsQixhQUFPLEtBQUtQLEVBQUwsQ0FBUVcsTUFBUixLQUFlSCx1QkFBZixtQkFBZ0NELEdBQWhDLEVBQVA7QUFDRDs7OzJCQUNNbEIsSSxFQUFjO0FBQ25CLGFBQU8sS0FBS1csRUFBTCxDQUFRWSxJQUFSLEtBQWFKLHVCQUFiLG1CQUE4Qm5CLEtBQUtrQixHQUFuQyxHQUEwQ2xCLElBQTFDLENBQVA7QUFDRDs7OzRCQUNPa0IsRyxFQUFhTSxXLEVBQXNCO0FBQ3pDLFVBQUlDLEtBQUssRUFBVDtBQUNBLFVBQUlELFdBQUosRUFBaUI7QUFDZkMsY0FBTSxNQUFNdkIsc0JBQVlDLFNBQVosQ0FBc0IsRUFBQ3FCLHdCQUFELEVBQXRCLENBQVo7QUFDRDtBQUNELGFBQU8sS0FBS2IsRUFBTCxDQUFRQyxHQUFSLENBQVksK0NBQWlCTSxHQUFqQixJQUFrQ08sRUFBOUMsQ0FBUDtBQUNEOzs7OztJQUdHVixjO0FBR0osMEJBQVlQLENBQVosRUFBdUJDLENBQXZCLEVBQXNDO0FBQUE7O0FBQ3BDLFNBQUtDLEVBQUwsR0FBVUYsQ0FBVjtBQUNBLFNBQUtHLEVBQUwsR0FBVUYsQ0FBVjtBQUNEOzs7OzJCQUNNaUIsTyxFQUFpQjtBQUN0QixhQUFPLEtBQUtmLEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixvQkFBNkJPLE9BQTdCLEVBQVA7QUFDRDs7OzJCQUNNQSxPLEVBQWlCUixHLEVBQWE7QUFDbkMsYUFBTyxLQUFLUCxFQUFMLENBQVFDLEdBQVIsS0FBWU8sdUJBQVosb0JBQTZCTyxPQUE3QixFQUErQ1IsR0FBL0MsRUFBUDtBQUNEOzs7MkJBQ01RLE8sRUFBaUIxQixJLEVBQWM7QUFDcEMsYUFBTyxLQUFLVyxFQUFMLENBQVFVLEdBQVIsS0FBWUYsdUJBQVosb0JBQTZCTyxPQUE3QixHQUErQzFCLElBQS9DLENBQVA7QUFDRDs7OzRCQUNNMEIsTyxFQUFpQlIsRyxFQUFhO0FBQ25DLGFBQU8sS0FBS1AsRUFBTCxDQUFRVyxNQUFSLEtBQWVILHVCQUFmLG9CQUFnQ08sT0FBaEMsRUFBa0RSLEdBQWxELEVBQVA7QUFDRDs7OzJCQUNNUSxPLEVBQWlCMUIsSSxFQUFjO0FBQ3BDLGFBQU8sS0FBS1csRUFBTCxDQUFRWSxJQUFSLEtBQWFKLHVCQUFiLG9CQUE4Qk8sT0FBOUIsRUFBZ0QxQixLQUFLa0IsR0FBckQsR0FBNERsQixJQUE1RCxDQUFQO0FBQ0Q7Ozs7O0lBR0dpQixjO0FBR0osMEJBQVlULENBQVosRUFBdUJDLENBQXZCLEVBQXNDO0FBQUE7O0FBQ3BDLFNBQUtDLEVBQUwsR0FBVUYsQ0FBVjtBQUNBLFNBQUtHLEVBQUwsR0FBVUYsQ0FBVjtBQUNEOzs7OzJCQUNNaUIsTyxFQUFpQjtBQUN0QixhQUFPLEtBQUtmLEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixvQkFBNkJPLE9BQTdCLEVBQVA7QUFDRDs7OzJCQUNNQSxPLEVBQWlCUixHLEVBQWE7QUFDbkMsYUFBTyxLQUFLUCxFQUFMLENBQVFDLEdBQVIsS0FBWU8sdUJBQVosb0JBQTZCTyxPQUE3QixFQUErQ1IsR0FBL0MsRUFBUDtBQUNEOzs7MkJBQ01RLE8sRUFBaUIxQixJLEVBQWM7QUFDcEMsYUFBTyxLQUFLVyxFQUFMLENBQVFVLEdBQVIsS0FBWUYsdUJBQVosb0JBQTZCTyxPQUE3QixHQUErQzFCLElBQS9DLENBQVA7QUFDRDs7OzRCQUNNMEIsTyxFQUFpQlIsRyxFQUFhO0FBQ25DLGFBQU8sS0FBS1AsRUFBTCxDQUFRVyxNQUFSLEtBQWVILHVCQUFmLG9CQUFnQ08sT0FBaEMsRUFBa0RSLEdBQWxELEVBQVA7QUFDRDs7OzJCQUNNUSxPLEVBQWlCMUIsSSxFQUFjO0FBQ3BDLGFBQU8sS0FBS1csRUFBTCxDQUFRWSxJQUFSLEtBQWFKLHVCQUFiLG9CQUE4Qk8sT0FBOUIsRUFBZ0QxQixLQUFLa0IsR0FBckQsR0FBNERsQixJQUE1RCxDQUFQO0FBQ0Q7Ozs7O0lBR0cyQixLO0FBSUosaUJBQVluQixDQUFaLEVBQXVCQyxDQUF2QixFQUFzQztBQUFBOztBQUNwQyxTQUFLQyxFQUFMLEdBQVVGLENBQVY7QUFDQSxTQUFLRyxFQUFMLEdBQVVGLENBQVY7QUFDQSxTQUFLTyxNQUFMLEdBQWMsSUFBSVksU0FBSixDQUFjcEIsQ0FBZCxFQUFpQkMsQ0FBakIsQ0FBZDtBQUNEOzs7OzZCQUNRO0FBQ1AsYUFBTyxLQUFLRSxFQUFMLENBQVFDLEdBQVIsQ0FBWSxPQUFaLENBQVA7QUFDRDs7O21DQUNjTSxHLEVBQWE7QUFDMUIsYUFBTyxLQUFLUixFQUFMLENBQVFHLFNBQVIsQ0FBa0JnQixRQUFsQixDQUEyQlgsR0FBM0IsQ0FBUDtBQUNEOzs7MkJBQ01BLEcsRUFBYTtBQUNsQixhQUFPLEtBQUtQLEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixvQkFBeUJELEdBQXpCLEVBQVA7QUFDRDs7OzJCQUNNUSxPLEVBQVMxQixJLEVBQU07QUFDcEIsYUFBTyxLQUFLVyxFQUFMLENBQVFVLEdBQVIsS0FBWUYsdUJBQVosb0JBQTZCTyxPQUE3QixHQUE4QzFCLElBQTlDLENBQVA7QUFDRDs7OzRCQUNNa0IsRyxFQUFhO0FBQ2xCLGFBQU8sS0FBS1AsRUFBTCxDQUFRVyxNQUFSLEtBQWVILHVCQUFmLG9CQUE0QkQsR0FBNUIsRUFBUDtBQUNEOzs7MkJBQ01sQixJLEVBQWM7QUFDbkIsYUFBTyxLQUFLVyxFQUFMLENBQVFZLElBQVIsS0FBYUosdUJBQWIsb0JBQTBCbkIsS0FBS2tCLEdBQS9CLEdBQXNDbEIsSUFBdEMsQ0FBUDtBQUNEOzs7OEJBQ1NrQixHLEVBQWE7QUFDckIsYUFBTyxLQUFLUCxFQUFMLENBQVFDLEdBQVIsS0FBWU8sdUJBQVoscUJBQXlCRCxHQUF6QixFQUFQO0FBQ0Q7OztpQ0FDWUEsRyxFQUFhO0FBQ3hCLGFBQU8sS0FBS1AsRUFBTCxDQUFRQyxHQUFSLEtBQVlPLHVCQUFaLHFCQUF5QkQsR0FBekIsRUFBUDtBQUNEOzs7Z0NBQ1dBLEcsRUFBYTtBQUN2QixhQUFPLEtBQUtQLEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixxQkFBeUJELEdBQXpCLEVBQVA7QUFDRDtBQUNEOzs7O2tDQUNjQSxHLEVBQWFsQixJLEVBQU07QUFDL0IsYUFBTyxLQUFLVyxFQUFMLENBQVFVLEdBQVIsS0FBWUYsdUJBQVoscUJBQXlCRCxHQUF6QixHQUF5Q2xCLElBQXpDLENBQVA7QUFDRDs7O2dDQUNXa0IsRyxFQUFhWSxPLEVBQWlCO0FBQ3hDLGFBQU8sS0FBS25CLEVBQUwsQ0FBUVUsR0FBUixLQUFZRix1QkFBWixxQkFBeUJELEdBQXpCLEdBQXlDLEVBQUNZLGdCQUFELEVBQXpDLENBQVA7QUFDRDs7OzZCQUNRWixHLEVBQWE7QUFDcEIsYUFBTyxLQUFLUCxFQUFMLENBQVFDLEdBQVIsS0FBWU8sdUJBQVoscUJBQXlCRCxHQUF6QixFQUFQO0FBQ0Q7OzsrQkFDVUEsRyxFQUFhO0FBQ3RCLGFBQU8sS0FBS1AsRUFBTCxDQUFRQyxHQUFSLEtBQVlPLHVCQUFaLHFCQUF5QkQsR0FBekIsRUFBUDtBQUNEOzs7NEJBQ09BLEcsRUFBYU0sVyxFQUFzQjtBQUN6QyxVQUFJQyxLQUFLLEVBQVQ7QUFDQSxVQUFJRCxXQUFKLEVBQWlCO0FBQ2ZDLGNBQU0sTUFBTXZCLHNCQUFZQyxTQUFaLENBQXNCLEVBQUNxQix3QkFBRCxFQUF0QixDQUFaO0FBQ0Q7QUFDRCxhQUFPLEtBQUtiLEVBQUwsQ0FBUUMsR0FBUixDQUFZLGdEQUFhTSxHQUFiLElBQThCTyxFQUExQyxDQUFQO0FBQ0Q7Ozs2QkFDUVAsRyxFQUFhO0FBQ3BCLGFBQU8sS0FBS1AsRUFBTCxDQUFRQyxHQUFSLEtBQVlPLHVCQUFaLHFCQUF5QkQsR0FBekIsRUFBUDtBQUNEOzs7OztJQUdHVSxTO0FBR0oscUJBQVlwQixDQUFaLEVBQXVCQyxDQUF2QixFQUFzQztBQUFBOztBQUNwQyxTQUFLQyxFQUFMLEdBQVVGLENBQVY7QUFDQSxTQUFLRyxFQUFMLEdBQVVGLENBQVY7QUFDRDs7Ozs4QkFDU1MsRyxFQUFhO0FBQ3JCLGFBQU8sS0FBS1IsRUFBTCxDQUFRaUIsS0FBUixDQUFjSSxTQUFkLENBQXdCYixHQUF4QixDQUFQO0FBQ0Q7OzsyQkFDTWMsTSxFQUFnQmQsRyxFQUFhO0FBQ2xDLGFBQU8sS0FBS1AsRUFBTCxDQUFRQyxHQUFSLEtBQVlPLHVCQUFaLHFCQUF5QmEsTUFBekIsRUFBMENkLEdBQTFDLEVBQVA7QUFDRDs7OzJCQUNNYyxNLEVBQWdCaEMsSSxFQUFjO0FBQ25DLGFBQU8sS0FBS1csRUFBTCxDQUFRWSxJQUFSLEtBQWFKLHVCQUFiLHFCQUEwQmEsTUFBMUIsRUFBMkNoQyxLQUFLa0IsR0FBaEQsR0FBdURsQixJQUF2RCxDQUFQO0FBQ0Q7Ozs7O0lBR0dpQyxLO0FBR0osaUJBQVl6QixDQUFaLEVBQXVCQyxDQUF2QixFQUFzQztBQUFBOztBQUNwQyxTQUFLQyxFQUFMLEdBQVVGLENBQVY7QUFDQSxTQUFLRyxFQUFMLEdBQVVGLENBQVY7QUFDRDs7Ozs4QkFDU1MsRyxFQUFhO0FBQ3JCLGFBQU8sS0FBS1IsRUFBTCxDQUFRaUIsS0FBUixDQUFjTyxRQUFkLENBQXVCaEIsR0FBdkIsQ0FBUDtBQUNEOzs7MkJBQ01BLEcsRUFBYTtBQUNsQixhQUFPLEtBQUtQLEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixxQkFBeUJELEdBQXpCLEVBQVA7QUFDRDs7O2dDQUNXQSxHLEVBQWE7QUFDdkIsYUFBTyxLQUFLUCxFQUFMLENBQVF3QixVQUFSLEtBQW1CaEIsdUJBQW5CLHFCQUFnQ0QsR0FBaEMsRUFBUDtBQUNEOzs7OztJQUdHa0IsTztBQUdKLG1CQUFZNUIsQ0FBWixFQUF1QkMsQ0FBdkIsRUFBc0M7QUFBQTs7QUFDcEMsU0FBS0MsRUFBTCxHQUFVRixDQUFWO0FBQ0EsU0FBS0csRUFBTCxHQUFVRixDQUFWO0FBQ0Q7Ozs7OEJBQ1N1QixNLEVBQWdCO0FBQ3hCLGFBQU8sS0FBS3RCLEVBQUwsQ0FBUWlCLEtBQVIsQ0FBY1UsVUFBZCxDQUF5QkwsTUFBekIsQ0FBUDtBQUNEOzs7MkJBQ01NLFMsRUFBbUI7QUFDeEIsYUFBTyxLQUFLM0IsRUFBTCxDQUFRQyxHQUFSLEtBQVlPLHVCQUFaLHFCQUEyQm1CLFNBQTNCLEVBQVA7QUFDRDs7Ozs7SUFHR0MsSztBQUdKLGlCQUFZL0IsQ0FBWixFQUF1QkMsQ0FBdkIsRUFBc0M7QUFBQTs7QUFDcEMsU0FBS0MsRUFBTCxHQUFVRixDQUFWO0FBQ0EsU0FBS0csRUFBTCxHQUFVRixDQUFWO0FBQ0Q7Ozs7OEJBQ1N1QixNLEVBQWdCO0FBQ3hCLGFBQU8sS0FBS3RCLEVBQUwsQ0FBUWlCLEtBQVIsQ0FBY2EsUUFBZCxDQUF1QlIsTUFBdkIsQ0FBUDtBQUNEOzs7MkJBQ01kLEcsRUFBYTtBQUNsQixhQUFPLEtBQUtQLEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixxQkFBeUJELEdBQXpCLEVBQVA7QUFDRDs7OzJCQUNNYyxNLEVBQWdCaEMsSSxFQUFjO0FBQ25DLGFBQU8sS0FBS1csRUFBTCxDQUFRWSxJQUFSLEtBQWFKLHVCQUFiLHFCQUEwQmEsTUFBMUIsR0FBMENoQyxJQUExQyxDQUFQO0FBQ0Q7OzsyQkFDTWtCLEcsRUFBYWxCLEksRUFBYztBQUNoQyxhQUFPLEtBQUtXLEVBQUwsQ0FBUVksSUFBUixLQUFhSix1QkFBYixxQkFBMEJELEdBQTFCLEdBQWlDbEIsSUFBakMsQ0FBUDtBQUNEOzs7NEJBQ01rQixHLEVBQWE7QUFDbEIsYUFBTyxLQUFLUCxFQUFMLENBQVFXLE1BQVIsS0FBZUgsdUJBQWYscUJBQTRCRCxHQUE1QixFQUFQO0FBQ0Q7Ozs7O0lBR1V1QixNLFdBQUFBLE07QUFTWCxrQkFBWWpGLE9BQVosRUFBNkI7QUFBQTs7QUFDM0IsU0FBS21ELEVBQUwsR0FBVSxJQUFJcEQsVUFBSixDQUFlQyxPQUFmLENBQVY7QUFDQSxTQUFLK0MsRUFBTCxHQUFVLElBQUlBLEVBQUosQ0FBTyxJQUFQLEVBQWEsS0FBS0ksRUFBbEIsQ0FBVjtBQUNBLFNBQUtFLFNBQUwsR0FBaUIsSUFBSUEsU0FBSixDQUFjLElBQWQsRUFBb0IsS0FBS0YsRUFBekIsQ0FBakI7QUFDQSxTQUFLZ0IsS0FBTCxHQUFhLElBQUlBLEtBQUosQ0FBVSxJQUFWLEVBQWdCLEtBQUtoQixFQUFyQixDQUFiO0FBQ0EsU0FBS3NCLEtBQUwsR0FBYSxJQUFJQSxLQUFKLENBQVUsSUFBVixFQUFnQixLQUFLdEIsRUFBckIsQ0FBYjtBQUNBLFNBQUt5QixPQUFMLEdBQWUsSUFBSUEsT0FBSixDQUFZLElBQVosRUFBa0IsS0FBS3pCLEVBQXZCLENBQWY7QUFDQSxTQUFLNEIsS0FBTCxHQUFhLElBQUlBLEtBQUosQ0FBVSxJQUFWLEVBQWdCLEtBQUs1QixFQUFyQixDQUFiO0FBQ0Q7Ozs7MkJBRU0rQixLLEVBQWdDO0FBQ3JDLGFBQU8sS0FBSy9CLEVBQUwsQ0FBUUMsR0FBUixLQUFZTyx1QkFBWixxQkFBZ0N1QixLQUFoQyxFQUFQO0FBQ0QiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBAZmxvdyAqL1xuXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5c3RyaW5nJztcblxuaW1wb3J0IGFldSBmcm9tICcuL2F1dG8tZW5jb2RlLXVyaSc7XG5cbmNsYXNzIENvbm5IZWxwZXIge1xuICBfYXV0aEtleTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGF1dGhLZXk6IHN0cmluZykge1xuICAgIHRoaXMuX2F1dGhLZXkgPSBhdXRoS2V5O1xuICB9XG5cbiAgX2dldFJlcXVlc3RPcHRpb25zKG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGhlYWRlcnM6IE9iamVjdD17fSwgZW5jb2Rpbmc6ID9zdHJpbmc9J3V0ZjgnKTogT2JqZWN0IHtcbiAgICAvLyBCeSBkZWZhdWx0IHdlIHJlcXVlc3QgdGhlIFYxIG9mIHRoZSBBUElcbiAgICBsZXQgcHJlZml4ID0gJy9hcGkvdjEvJztcblxuICAgIC8vIElmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgYSBUYXNrLCB0aGVuIHVzZSB0aGUgVjIgb2YgdGhlIEFQSVxuICAgIGlmIChwYXRoLmluZGV4T2YoJ3Rhc2tzJykgPiAtMSkgcHJlZml4ID0gJy9hcGkvdjInO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZCwgaGVhZGVycywgZW5jb2RpbmcsXG4gICAgICBob3N0OiAnYXBpLnN0cmVhay5jb20nLFxuICAgICAgcGF0aDogcHJlZml4ICsgcGF0aCxcbiAgICAgIGF1dGg6IHRoaXMuX2F1dGhLZXlcbiAgICB9O1xuICB9XG5cbiAgX3BhcnNlUmVzcG9uc2UocmVzcG9uc2U6IGh0dHBzLkluY29taW5nTWVzc2FnZSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHN0cnM6IHN0cmluZ1tdID0gW107XG4gICAgICByZXNwb25zZS5vbignZGF0YScsIChjaHVuazogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0cnMucHVzaChjaHVuayk7XG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RyID0gc3Rycy5qb2luKCcnKTtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2Uoc3RyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBqc29uO1xuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGBSZXNwb25zZSBjb2RlICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX1gO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2Uoc3RyKTtcbiAgICAgICAgICAgICAgaWYgKGpzb24gJiYganNvbi5lcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGpzb24uZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgcGFyc2UgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlamVjdChPYmplY3QuYXNzaWduKChuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTogT2JqZWN0KSwge1xuICAgICAgICAgICAgICBzdHIsIGpzb24sXG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICBfcGxhaW5SZXNwb25zZShyZXNwb25zZTogaHR0cHMuSW5jb21pbmdNZXNzYWdlKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCAoY2h1bms6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYnVmID0gQnVmZmVyLmNvbmNhdChjaHVua3MpO1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICAgIHJlc29sdmUoYnVmKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFJlc3BvbnNlIGNvZGUgJHtyZXNwb25zZS5zdGF0dXNDb2RlfWA7XG4gICAgICAgICAgICByZWplY3QoT2JqZWN0LmFzc2lnbigobmV3IEVycm9yKGVycm9yTWVzc2FnZSk6IE9iamVjdCksIHtcbiAgICAgICAgICAgICAgYnVmLFxuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgICBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXNwb25zZS5vbignZXJyb3InLCByZWplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8T2JqZWN0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9nZXRSZXF1ZXN0T3B0aW9ucygnR0VUJywgcGF0aCk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cHMucmVxdWVzdChvcHRzLCByZXMgPT4ge1xuICAgICAgICByZXNvbHZlKHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzKSk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIHJlcXVlc3QuZW5kKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXROb1BhcnNlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9nZXRSZXF1ZXN0T3B0aW9ucygnR0VUJywgcGF0aCwgdW5kZWZpbmVkLCBudWxsKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KG9wdHMsIHJlcyA9PiB7XG4gICAgICAgIHJlc29sdmUodGhpcy5fcGxhaW5SZXNwb25zZShyZXMpKTtcbiAgICAgIH0pO1xuICAgICAgcmVxdWVzdC5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgcmVxdWVzdC5lbmQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1dChwYXRoOiBzdHJpbmcsIGRhdGE6IE9iamVjdCk6IFByb21pc2U8T2JqZWN0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGRzdHIgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICBjb25zdCBvcHRzID0gdGhpcy5fZ2V0UmVxdWVzdE9wdGlvbnMoJ1BVVCcsIHBhdGggKyAnPycgKyBkc3RyKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KG9wdHMsIHJlcyA9PiB7XG4gICAgICAgIHJlc29sdmUodGhpcy5fcGFyc2VSZXNwb25zZShyZXMpKTtcbiAgICAgIH0pO1xuICAgICAgcmVxdWVzdC5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgcmVxdWVzdC5lbmQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gdGhpcy5fZ2V0UmVxdWVzdE9wdGlvbnMoJ0RFTEVURScsIHBhdGgpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3Qob3B0cywgcmVzID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl9wYXJzZVJlc3BvbnNlKHJlcykpO1xuICAgICAgfSk7XG4gICAgICByZXF1ZXN0Lm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICByZXF1ZXN0LmVuZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcG9zdChwYXRoOiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8T2JqZWN0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlbmQgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkoe2pzb246SlNPTi5zdHJpbmdpZnkoZGF0YSl9KTtcbiAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9nZXRSZXF1ZXN0T3B0aW9ucygnUE9TVCcsIHBhdGgsIHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBzZW5kLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cHMucmVxdWVzdChvcHRzLCByZXMgPT4ge1xuICAgICAgICByZXNvbHZlKHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzKSk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qud3JpdGUoc2VuZCk7XG4gICAgICByZXF1ZXN0Lm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICByZXF1ZXN0LmVuZCgpO1xuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIE1lIHtcbiAgX3M6IFN0cmVhaztcbiAgX2M6IENvbm5IZWxwZXI7XG4gIGNvbnN0cnVjdG9yKHM6IFN0cmVhaywgYzogQ29ubkhlbHBlcikge1xuICAgIHRoaXMuX3MgPSBzO1xuICAgIHRoaXMuX2MgPSBjO1xuICB9XG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoJ3VzZXJzL21lJyk7XG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVzIHtcbiAgX3M6IFN0cmVhaztcbiAgX2M6IENvbm5IZWxwZXI7XG4gIFN0YWdlczogUGlwZWxpbmVTdGFnZXM7XG4gIEZpZWxkczogUGlwZWxpbmVGaWVsZHM7XG4gIGNvbnN0cnVjdG9yKHM6IFN0cmVhaywgYzogQ29ubkhlbHBlcikge1xuICAgIHRoaXMuX3MgPSBzO1xuICAgIHRoaXMuX2MgPSBjO1xuICAgIHRoaXMuU3RhZ2VzID0gbmV3IFBpcGVsaW5lU3RhZ2VzKHMsIGMpO1xuICAgIHRoaXMuRmllbGRzID0gbmV3IFBpcGVsaW5lRmllbGRzKHMsIGMpO1xuICB9XG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoJ3BpcGVsaW5lcycpO1xuICB9XG4gIGdldE9uZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYHBpcGVsaW5lcy8ke2tleX1gKTtcbiAgfVxuICBnZXRCb3hlcyhrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYHBpcGVsaW5lcy8ke2tleX0vYm94ZXNgKTtcbiAgfVxuICBnZXRCb3hlc0luU3RhZ2UgKGtleTogc3RyaW5nLCBzdGFnZUtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2MuZ2V0KGFldSBgcGlwZWxpbmVzLyR7a2V5fS9ib3hlcz9zdGFnZUtleT0ke3N0YWdlS2V5fWApO1xuICB9XG4gIGNyZWF0ZShkYXRhOiBPYmplY3QpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5wdXQoJ3BpcGVsaW5lcycsIGRhdGEpO1xuICB9XG4gIGRlbGV0ZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmRlbGV0ZShhZXUgYHBpcGVsaW5lcy8ke2tleX1gKTtcbiAgfVxuICB1cGRhdGUoZGF0YTogT2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2MucG9zdChhZXUgYHBpcGVsaW5lcy8ke2RhdGEua2V5fWAsIGRhdGEpO1xuICB9XG4gIGdldEZlZWQoa2V5OiBzdHJpbmcsIGRldGFpbExldmVsOiA/c3RyaW5nKSB7XG4gICAgbGV0IHFzID0gJyc7XG4gICAgaWYgKGRldGFpbExldmVsKSB7XG4gICAgICBxcyArPSAnPycgKyBxdWVyeXN0cmluZy5zdHJpbmdpZnkoe2RldGFpbExldmVsfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYHBpcGVsaW5lcy8ke2tleX0vbmV3c2ZlZWRgICsgcXMpO1xuICB9XG59XG5cbmNsYXNzIFBpcGVsaW5lU3RhZ2VzIHtcbiAgX3M6IFN0cmVhaztcbiAgX2M6IENvbm5IZWxwZXI7XG4gIGNvbnN0cnVjdG9yKHM6IFN0cmVhaywgYzogQ29ubkhlbHBlcikge1xuICAgIHRoaXMuX3MgPSBzO1xuICAgIHRoaXMuX2MgPSBjO1xuICB9XG4gIGdldEFsbChwaXBlS2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoYWV1IGBwaXBlbGluZXMvJHtwaXBlS2V5fS9zdGFnZXNgKTtcbiAgfVxuICBnZXRPbmUocGlwZUtleTogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYHBpcGVsaW5lcy8ke3BpcGVLZXl9L3N0YWdlcy8ke2tleX1gKTtcbiAgfVxuICBjcmVhdGUocGlwZUtleTogc3RyaW5nLCBkYXRhOiBPYmplY3QpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5wdXQoYWV1IGBwaXBlbGluZXMvJHtwaXBlS2V5fS9zdGFnZXNgLCBkYXRhKTtcbiAgfVxuICBkZWxldGUocGlwZUtleTogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmRlbGV0ZShhZXUgYHBpcGVsaW5lcy8ke3BpcGVLZXl9L3N0YWdlcy8ke2tleX1gKTtcbiAgfVxuICB1cGRhdGUocGlwZUtleTogc3RyaW5nLCBkYXRhOiBPYmplY3QpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5wb3N0KGFldSBgcGlwZWxpbmVzLyR7cGlwZUtleX0vc3RhZ2VzLyR7ZGF0YS5rZXl9YCwgZGF0YSk7XG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVGaWVsZHMge1xuICBfczogU3RyZWFrO1xuICBfYzogQ29ubkhlbHBlcjtcbiAgY29uc3RydWN0b3IoczogU3RyZWFrLCBjOiBDb25uSGVscGVyKSB7XG4gICAgdGhpcy5fcyA9IHM7XG4gICAgdGhpcy5fYyA9IGM7XG4gIH1cbiAgZ2V0QWxsKHBpcGVLZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYHBpcGVsaW5lcy8ke3BpcGVLZXl9L2ZpZWxkc2ApO1xuICB9XG4gIGdldE9uZShwaXBlS2V5OiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2MuZ2V0KGFldSBgcGlwZWxpbmVzLyR7cGlwZUtleX0vZmllbGRzLyR7a2V5fWApO1xuICB9XG4gIGNyZWF0ZShwaXBlS2V5OiBzdHJpbmcsIGRhdGE6IE9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLl9jLnB1dChhZXUgYHBpcGVsaW5lcy8ke3BpcGVLZXl9L2ZpZWxkc2AsIGRhdGEpO1xuICB9XG4gIGRlbGV0ZShwaXBlS2V5OiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2MuZGVsZXRlKGFldSBgcGlwZWxpbmVzLyR7cGlwZUtleX0vZmllbGRzLyR7a2V5fWApO1xuICB9XG4gIHVwZGF0ZShwaXBlS2V5OiBzdHJpbmcsIGRhdGE6IE9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLl9jLnBvc3QoYWV1IGBwaXBlbGluZXMvJHtwaXBlS2V5fS9maWVsZHMvJHtkYXRhLmtleX1gLCBkYXRhKTtcbiAgfVxufVxuXG5jbGFzcyBCb3hlcyB7XG4gIF9zOiBTdHJlYWs7XG4gIF9jOiBDb25uSGVscGVyO1xuICBGaWVsZHM6IEJveEZpZWxkcztcbiAgY29uc3RydWN0b3IoczogU3RyZWFrLCBjOiBDb25uSGVscGVyKSB7XG4gICAgdGhpcy5fcyA9IHM7XG4gICAgdGhpcy5fYyA9IGM7XG4gICAgdGhpcy5GaWVsZHMgPSBuZXcgQm94RmllbGRzKHMsIGMpO1xuICB9XG4gIGdldEFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoJ2JveGVzJyk7XG4gIH1cbiAgZ2V0Rm9yUGlwZWxpbmUoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fcy5QaXBlbGluZXMuZ2V0Qm94ZXMoa2V5KTtcbiAgfVxuICBnZXRPbmUoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoYWV1IGBib3hlcy8ke2tleX1gKTtcbiAgfVxuICBjcmVhdGUocGlwZUtleSwgZGF0YSkge1xuICAgIHJldHVybiB0aGlzLl9jLnB1dChhZXUgYHBpcGVsaW5lcy8ke3BpcGVLZXl9L2JveGVzYCwgZGF0YSk7XG4gIH1cbiAgZGVsZXRlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2MuZGVsZXRlKGFldSBgYm94ZXMvJHtrZXl9YCk7XG4gIH1cbiAgdXBkYXRlKGRhdGE6IE9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLl9jLnBvc3QoYWV1IGBib3hlcy8ke2RhdGEua2V5fWAsIGRhdGEpO1xuICB9XG4gIGdldEZpZWxkcyhrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYGJveGVzLyR7a2V5fS9maWVsZHNgKTtcbiAgfVxuICBnZXRSZW1pbmRlcnMoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoYWV1IGBib3hlcy8ke2tleX0vcmVtaW5kZXJzYCk7XG4gIH1cbiAgZ2V0Q29tbWVudHMoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoYWV1IGBib3hlcy8ke2tleX0vY29tbWVudHNgKTtcbiAgfVxuICAvLyBkZXByZWNhdGVkIG1ldGhvZFxuICBjcmVhdGVDb21tZW50KGtleTogc3RyaW5nLCBkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuX2MucHV0KGFldSBgYm94ZXMvJHtrZXl9L2NvbW1lbnRzYCwgZGF0YSk7XG4gIH1cbiAgcG9zdENvbW1lbnQoa2V5OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLnB1dChhZXUgYGJveGVzLyR7a2V5fS9jb21tZW50c2AsIHttZXNzYWdlfSk7XG4gIH1cbiAgZ2V0RmlsZXMoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoYWV1IGBib3hlcy8ke2tleX0vZmlsZXNgKTtcbiAgfVxuICBnZXRUaHJlYWRzKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2MuZ2V0KGFldSBgYm94ZXMvJHtrZXl9L3RocmVhZHNgKTtcbiAgfVxuICBnZXRGZWVkKGtleTogc3RyaW5nLCBkZXRhaWxMZXZlbDogP3N0cmluZykge1xuICAgIGxldCBxcyA9ICcnO1xuICAgIGlmIChkZXRhaWxMZXZlbCkge1xuICAgICAgcXMgKz0gJz8nICsgcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHtkZXRhaWxMZXZlbH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoYWV1IGBib3hlcy8ke2tleX0vbmV3c2ZlZWRgICsgcXMpO1xuICB9XG4gIGdldFRhc2tzKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2MuZ2V0KGFldSBgYm94ZXMvJHtrZXl9L3Rhc2tzYCk7XG4gIH1cbn1cblxuY2xhc3MgQm94RmllbGRzIHtcbiAgX3M6IFN0cmVhaztcbiAgX2M6IENvbm5IZWxwZXI7XG4gIGNvbnN0cnVjdG9yKHM6IFN0cmVhaywgYzogQ29ubkhlbHBlcikge1xuICAgIHRoaXMuX3MgPSBzO1xuICAgIHRoaXMuX2MgPSBjO1xuICB9XG4gIGdldEZvckJveChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zLkJveGVzLmdldEZpZWxkcyhrZXkpO1xuICB9XG4gIGdldE9uZShib3hLZXk6IHN0cmluZywga2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoYWV1IGBib3hlcy8ke2JveEtleX0vZmllbGRzLyR7a2V5fWApO1xuICB9XG4gIHVwZGF0ZShib3hLZXk6IHN0cmluZywgZGF0YTogT2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2MucG9zdChhZXUgYGJveGVzLyR7Ym94S2V5fS9maWVsZHMvJHtkYXRhLmtleX1gLCBkYXRhKTtcbiAgfVxufVxuXG5jbGFzcyBGaWxlcyB7XG4gIF9zOiBTdHJlYWs7XG4gIF9jOiBDb25uSGVscGVyO1xuICBjb25zdHJ1Y3RvcihzOiBTdHJlYWssIGM6IENvbm5IZWxwZXIpIHtcbiAgICB0aGlzLl9zID0gcztcbiAgICB0aGlzLl9jID0gYztcbiAgfVxuICBnZXRGb3JCb3goa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fcy5Cb3hlcy5nZXRGaWxlcyhrZXkpO1xuICB9XG4gIGdldE9uZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYGZpbGVzLyR7a2V5fWApO1xuICB9XG4gIGdldENvbnRlbnRzKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2MuZ2V0Tm9QYXJzZShhZXUgYGZpbGVzLyR7a2V5fS9jb250ZW50c2ApO1xuICB9XG59XG5cbmNsYXNzIFRocmVhZHMge1xuICBfczogU3RyZWFrO1xuICBfYzogQ29ubkhlbHBlcjtcbiAgY29uc3RydWN0b3IoczogU3RyZWFrLCBjOiBDb25uSGVscGVyKSB7XG4gICAgdGhpcy5fcyA9IHM7XG4gICAgdGhpcy5fYyA9IGM7XG4gIH1cbiAgZ2V0Rm9yQm94KGJveEtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3MuQm94ZXMuZ2V0VGhyZWFkcyhib3hLZXkpO1xuICB9XG4gIGdldE9uZSh0aHJlYWRLZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYHRocmVhZHMvJHt0aHJlYWRLZXl9YCk7XG4gIH1cbn1cblxuY2xhc3MgVGFza3Mge1xuICBfczogU3RyZWFrO1xuICBfYzogQ29ubkhlbHBlcjtcbiAgY29uc3RydWN0b3IoczogU3RyZWFrLCBjOiBDb25uSGVscGVyKSB7XG4gICAgdGhpcy5fcyA9IHM7XG4gICAgdGhpcy5fYyA9IGM7XG4gIH1cbiAgZ2V0Rm9yQm94KGJveEtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3MuQm94ZXMuZ2V0VGFza3MoYm94S2V5KTtcbiAgfVxuICBnZXRPbmUoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5nZXQoYWV1IGB0YXNrcy8ke2tleX1gKTtcbiAgfVxuICBjcmVhdGUoYm94S2V5OiBzdHJpbmcsIGRhdGE6IE9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLl9jLnBvc3QoYWV1IGBib3hlcy8ke2JveEtleX0vdGFza3NgLCBkYXRhKTtcbiAgfVxuICB1cGRhdGUoa2V5OiBzdHJpbmcsIGRhdGE6IE9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLl9jLnBvc3QoYWV1IGB0YXNrcy8ke2tleX1gLCBkYXRhKTtcbiAgfVxuICBkZWxldGUoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYy5kZWxldGUoYWV1IGB0YXNrcy8ke2tleX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RyZWFrIHtcbiAgX2M6IENvbm5IZWxwZXI7XG4gIE1lOiBNZTtcbiAgUGlwZWxpbmVzOiBQaXBlbGluZXM7XG4gIEJveGVzOiBCb3hlcztcbiAgRmlsZXM6IEZpbGVzO1xuICBUaHJlYWRzOiBUaHJlYWRzO1xuICBUYXNrczogVGFza3M7XG5cbiAgY29uc3RydWN0b3IoYXV0aEtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYyA9IG5ldyBDb25uSGVscGVyKGF1dGhLZXkpO1xuICAgIHRoaXMuTWUgPSBuZXcgTWUodGhpcywgdGhpcy5fYyk7XG4gICAgdGhpcy5QaXBlbGluZXMgPSBuZXcgUGlwZWxpbmVzKHRoaXMsIHRoaXMuX2MpO1xuICAgIHRoaXMuQm94ZXMgPSBuZXcgQm94ZXModGhpcywgdGhpcy5fYyk7XG4gICAgdGhpcy5GaWxlcyA9IG5ldyBGaWxlcyh0aGlzLCB0aGlzLl9jKTtcbiAgICB0aGlzLlRocmVhZHMgPSBuZXcgVGhyZWFkcyh0aGlzLCB0aGlzLl9jKTtcbiAgICB0aGlzLlRhc2tzID0gbmV3IFRhc2tzKHRoaXMsIHRoaXMuX2MpO1xuICB9XG5cbiAgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcpOiBQcm9taXNlPE9iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLl9jLmdldChhZXUgYHNlYXJjaD9xdWVyeT0ke3F1ZXJ5fWApO1xuICB9XG59XG4iXX0=