@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
725 lines • 57.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: tree-factory.class.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { forEach, isUndefined, map, omitBy, pickBy, reduce, trim, values } from 'lodash-es';
/**
* @record
*/
export function ITreeNodeData() { }
if (false) {
/** @type {?|undefined} */
ITreeNodeData.prototype.id;
/** @type {?|undefined} */
ITreeNodeData.prototype.parentId;
/** @type {?|undefined} */
ITreeNodeData.prototype.title;
/** @type {?|undefined} */
ITreeNodeData.prototype.isOpen;
/** @type {?|undefined} */
ITreeNodeData.prototype.data;
/** @type {?|undefined} */
ITreeNodeData.prototype.isParent;
/** @type {?|undefined} */
ITreeNodeData.prototype.loading;
/** @type {?|undefined} */
ITreeNodeData.prototype.isMatch;
/** @type {?|undefined} */
ITreeNodeData.prototype.isHide;
/** @type {?|undefined} */
ITreeNodeData.prototype.isActive;
/** @type {?|undefined} */
ITreeNodeData.prototype.isChecked;
/** @type {?|undefined} */
ITreeNodeData.prototype.disabled;
/** @type {?|undefined} */
ITreeNodeData.prototype.children;
/* Skipping unhandled member: [prop: string]: any;*/
}
/**
* @record
*/
export function ITreeMap() { }
/**
* @record
*/
export function ITreeItem() { }
if (false) {
/** @type {?} */
ITreeItem.prototype.title;
/** @type {?|undefined} */
ITreeItem.prototype.open;
/** @type {?|undefined} */
ITreeItem.prototype.loading;
/** @type {?|undefined} */
ITreeItem.prototype.isMatch;
/** @type {?|undefined} */
ITreeItem.prototype.items;
/** @type {?|undefined} */
ITreeItem.prototype.isParent;
/** @type {?|undefined} */
ITreeItem.prototype.data;
/** @type {?|undefined} */
ITreeItem.prototype.id;
/** @type {?|undefined} */
ITreeItem.prototype.isHide;
/** @type {?|undefined} */
ITreeItem.prototype.isActive;
/** @type {?|undefined} */
ITreeItem.prototype.isChecked;
/** @type {?|undefined} */
ITreeItem.prototype.halfChecked;
/** @type {?|undefined} */
ITreeItem.prototype.disabled;
/** @type {?|undefined} */
ITreeItem.prototype.disableAdd;
/** @type {?|undefined} */
ITreeItem.prototype.disableEdit;
/** @type {?|undefined} */
ITreeItem.prototype.disableDelete;
/* Skipping unhandled member: [prop: string]: any;*/
}
/**
* @record
*/
export function ITreeInput() { }
if (false) {
/** @type {?} */
ITreeInput.prototype.treeItems;
/** @type {?|undefined} */
ITreeInput.prototype.parentId;
/** @type {?|undefined} */
ITreeInput.prototype.treeNodeChildrenKey;
/** @type {?|undefined} */
ITreeInput.prototype.treeNodeIdKey;
/** @type {?|undefined} */
ITreeInput.prototype.checkboxDisabledKey;
/** @type {?|undefined} */
ITreeInput.prototype.treeNodeTitleKey;
}
export class TreeNode {
/**
* @param {?} id
* @param {?} parentId
* @param {?} data
*/
constructor(id, parentId, data) {
this.id = id;
this.parentId = parentId;
this.data = data;
}
}
if (false) {
/** @type {?} */
TreeNode.prototype.id;
/** @type {?} */
TreeNode.prototype.parentId;
/** @type {?} */
TreeNode.prototype.data;
}
export class TreeFactory {
constructor() {
this._checked = new Set();
this._treeRoot = [];
this.mapTreeItems = (/**
* @template THIS
* @this {THIS}
* @param {?} __0
* @return {THIS}
*/
({ treeItems, parentId, treeNodeChildrenKey = 'items', treeNodeIdKey = 'id', checkboxDisabledKey = 'disabled', treeNodeTitleKey = 'title' }) => {
forEach(treeItems, (/**
* @param {?} item
* @return {?}
*/
(item) => {
/** @type {?} */
const node = this.addNode({
id: item[treeNodeIdKey],
parentId,
title: item[treeNodeTitleKey],
isOpen: !!item.open,
data: item.data || {},
originItem: item,
isParent: !!item.isParent || !!(item[treeNodeChildrenKey] && item[treeNodeChildrenKey].length > 0),
loading: !!item.loading,
isMatch: !!item.isMatch,
isHide: !!item.isHide,
isChecked: !!item.isChecked,
halfChecked: !!item.halfChecked,
isActive: !!item.isActive,
disabled: !!item[checkboxDisabledKey],
disableAdd: !!item.disableAdd,
disableEdit: !!item.disableEdit,
disableDelete: !!item.disableDelete,
children: []
});
if (!!item.isChecked) {
this._checked.add(node);
}
this.mapTreeItems({
treeItems: item[treeNodeChildrenKey] || [], parentId: node.id, treeNodeChildrenKey, treeNodeIdKey,
checkboxDisabledKey, treeNodeTitleKey
});
}));
return this;
});
this.idx = 0;
this.nodes = {};
}
/**
* @return {?}
*/
static create() {
return new TreeFactory();
}
// tree model with items
/**
* @param {?} __0
* @return {?}
*/
static fromTree({ treeItems, treeNodeChildrenKey = 'items', treeNodeIdKey = 'id', checkboxDisabledKey = 'disabled', treeNodeTitleKey = 'title' }) {
/** @type {?} */
const treeFactory = TreeFactory.create();
treeFactory.mapTreeItems({ treeItems, parentId: undefined, treeNodeChildrenKey, treeNodeIdKey, checkboxDisabledKey, treeNodeTitleKey });
return treeFactory;
}
/**
* @param {?} __0
* @return {?}
*/
addNode(_a) {
var { id, parentId } = _a, data = tslib_1.__rest(_a, ["id", "parentId"]);
if (isUndefined(id)) {
this.idx++;
id = this.idx;
}
/** @type {?} */
const treeNode = new TreeNode(id, parentId, data);
if (this.nodes.hasOwnProperty(treeNode.id)) {
throw new Error(`Duplicated id: ${treeNode.id} detected, please specify unique ids in the tree.`);
}
this.nodes = Object.assign({}, this.nodes, { [treeNode.id]: treeNode });
this.addChildNode(this.nodes[parentId], treeNode);
return treeNode;
}
/**
* @param {?} id
* @return {?}
*/
editNodeTitle(id) {
this.nodes[id].data.editable = true;
}
/**
* @template THIS
* @this {THIS}
* @param {?} id
* @return {THIS}
*/
deleteNodeById(id) {
/** @type {?} */
const node = (/** @type {?} */ (this)).nodes[id];
/** @type {?} */
const parentNode = (/** @type {?} */ (this)).nodes[node.parentId];
(/** @type {?} */ (this)).removeChildNode(parentNode, node);
/** @type {?} */
const deleteItems = (/**
* @param {?} nodeId
* @return {?}
*/
(nodeId) => {
/** @type {?} */
const children = (/** @type {?} */ (this)).getChildrenById(nodeId);
(/** @type {?} */ (this)).nodes = omitBy((/** @type {?} */ (this)).nodes, (/**
* @param {?} _node
* @return {?}
*/
(_node) => {
return _node.id === id;
}));
forEach(children, (/**
* @param {?} child
* @return {?}
*/
(child) => {
deleteItems(child.id);
}));
});
deleteItems(id);
if (parentNode && (!parentNode.data.children || !parentNode.data.children.length)) {
parentNode.data.isParent = false;
}
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} id
* @return {THIS}
*/
toggleNodeById(id) {
(/** @type {?} */ (this)).nodes[id].data.isOpen = !(/** @type {?} */ (this)).nodes[id].data.isOpen;
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} id
* @return {THIS}
*/
openNodesById(id) {
(/** @type {?} */ (this)).nodes[id].data.isOpen = true;
if ((/** @type {?} */ (this)).nodes[id].parentId !== undefined) {
(/** @type {?} */ (this)).openNodesById((/** @type {?} */ (this)).nodes[id].parentId);
}
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} id
* @param {?=} closeChildren
* @return {THIS}
*/
closeNodesById(id, closeChildren = false) {
(/** @type {?} */ (this)).nodes[id].data.isOpen = false;
if (closeChildren) {
if ((/** @type {?} */ (this)).nodes[id] && (/** @type {?} */ (this)).nodes[id].data.children) {
(/** @type {?} */ (this)).nodes[id].data.children.forEach((/**
* @param {?} node
* @return {?}
*/
(node) => {
(/** @type {?} */ (this)).closeNodesById(node.id);
}));
}
}
return (/** @type {?} */ (this));
}
/**
* @template THIS
* @this {THIS}
* @param {?} id
* @return {THIS}
*/
disabledNodesById(id) {
(/** @type {?} */ (this)).nodes[id].data.disabled = true;
/** @type {?} */
const parentId = (/** @type {?} */ (this)).nodes[id].parentId;
(/** @type {?} */ (this))._disabledParentNodes(parentId);
/** @type {?} */
const disabledNodes = (/**
* @param {?} nodeId
* @return {?}
*/
(nodeId) => {
/** @type {?} */
const children = (/** @type {?} */ (this)).getChildrenById(nodeId);
if (children.length > 0) {
children.forEach((/**
* @param {?} child
* @return {?}
*/
(child) => {
(/** @type {?} */ (this)).nodes[child.id].data.disabled = true;
disabledNodes(child.id);
}));
}
});
disabledNodes(id);
return (/** @type {?} */ (this));
}
/**
* @private
* @param {?} parentId
* @return {?}
*/
_disabledParentNodes(parentId) {
/** @type {?} */
const children = this.getChildrenById(parentId);
if (children.length < 1) {
return;
}
/** @type {?} */
const result = reduce(children, (/**
* @param {?} status
* @param {?} child
* @return {?}
*/
(status, child) => {
return status && child.data.disabled;
}), true);
if (this.nodes[parentId]) {
this.nodes[parentId].data.disabled = result;
}
}
/**
* @param {?} id
* @param {?} checked
* @return {?}
*/
checkNodesById(id, checked) {
this.nodes[id].data.halfChecked = false;
this.nodes[id].data.isChecked = checked;
this.checkParentNodes(this.nodes[id]);
this.checkChildNodes(this.nodes[id], checked);
this.maintainCheckedNodeList(this.nodes[id], checked);
return this.getCheckedNodes();
}
/**
* @private
* @param {?} node
* @return {?}
*/
checkParentNodes(node) {
const { parentId } = node;
/** @type {?} */
const parentNode = this.nodes[parentId];
if (parentNode) {
/** @type {?} */
const childrenNode = this.getChildrenById(parentId);
if (childrenNode.every((/**
* @param {?} childNode
* @return {?}
*/
childNode => childNode.data.isChecked && !childNode.data.halfChecked))) {
parentNode.data.isChecked = true;
parentNode.data.halfChecked = false;
}
else if (childrenNode.some((/**
* @param {?} childNode
* @return {?}
*/
childNode => childNode.data.halfChecked || childNode.data.isChecked))) {
parentNode.data.isChecked = true;
parentNode.data.halfChecked = true;
}
else {
parentNode.data.isChecked = false;
parentNode.data.halfChecked = false;
}
this.maintainCheckedNodeList(parentNode, parentNode.data.isChecked);
this.checkParentNodes(parentNode);
}
}
/**
* @private
* @param {?} node
* @param {?} checked
* @return {?}
*/
checkChildNodes(node, checked) {
const { id } = node;
/** @type {?} */
const childrenNode = this.getChildrenById(id);
if (childrenNode.length > 0) {
childrenNode.forEach((/**
* @param {?} childNode
* @return {?}
*/
childNode => {
const { id: childId } = childNode;
const { data: nodeData } = this.nodes[childId];
if (!nodeData.disabled) {
nodeData.isChecked = checked;
nodeData.halfChecked = false;
this.maintainCheckedNodeList(childNode, checked);
}
this.checkChildNodes(childNode, checked);
}));
/** @type {?} */
const childrenFullCheckedCount = childrenNode.filter((/**
* @param {?} __0
* @return {?}
*/
({ data: nodeData }) => nodeData.isChecked)).length;
/** @type {?} */
const childrenCheckedCount = childrenNode
.filter((/**
* @param {?} __0
* @return {?}
*/
({ data: nodeData }) => nodeData.isChecked || nodeData.halfChecked)).length;
node.data.halfChecked = childrenCheckedCount > 0 && childrenNode.length > childrenFullCheckedCount;
}
}
/**
* @return {?}
*/
getCheckedNodes() {
return Array.from(this._checked);
}
/**
* @return {?}
*/
getDisabledNodes() {
/** @type {?} */
const results = pickBy(this.nodes, (/**
* @param {?} node
* @return {?}
*/
(node) => {
return node.data.disabled === true;
}));
return values(results);
}
/**
* @param {?} id
* @return {?}
*/
activeNodeById(id) {
this.deactivateAllNodes();
this.nodes[id].data.isActive = !this.nodes[id].data.isActive;
}
/**
* @param {?} id
* @return {?}
*/
getChildrenById(id) {
if (this.nodes[id]) {
return this.nodes[id].data.children || [];
}
else if (id === undefined) {
return this._treeRoot;
}
return [];
}
/*
* @deprecated
*
*/
/**
* @private
* @return {?}
*/
toTree() {
/** @type {?} */
const patchChildren = (/**
* @param {?} nodes
* @return {?}
*/
(nodes) => {
return map(nodes, (/**
* @param {?} node
* @return {?}
*/
(node) => {
return Object.assign({}, node, { children: patchChildren(this.getChildrenById(node.id)) });
}));
});
return patchChildren(this.getChildrenById(undefined));
}
/**
* @param {?} id
* @return {?}
*/
startLoading(id) {
this.nodes[id].data.loading = true;
}
/**
* @param {?} id
* @return {?}
*/
endLoading(id) {
this.nodes[id].data.loading = false;
}
/*
* @deprecated
*/
/**
* @private
* @param {?} inputValue
* @param {?=} hideUnmatched
* @return {?}
*/
isMatchNode(inputValue, hideUnmatched) {
/** @type {?} */
const target = trim(inputValue);
this.resetSearchResults();
this.dfs(target.toLowerCase(), this._treeRoot, hideUnmatched);
}
/**
* @param {?} id
* @return {?}
*/
getNodeById(id) {
return this.nodes[id].data;
}
/**
* @template THIS
* @this {THIS}
* @param {?} id
* @param {?} hide
* @return {THIS}
*/
hideNodeById(id, hide) {
(/** @type {?} */ (this)).nodes[id].data.isHide = hide;
return (/** @type {?} */ (this));
}
/**
* @private
* @param {?} node
* @param {?} checked
* @return {?}
*/
maintainCheckedNodeList(node, checked) {
if (checked && !node.data.halfChecked) {
this._checked.add(node);
}
else {
this._checked.delete(node);
}
}
/**
* @private
* @param {?} target
* @param {?} tree
* @param {?=} hideUnmatched
* @return {?}
*/
dfs(target, tree, hideUnmatched) {
if (!tree) {
return false;
}
if (!target) {
return false;
}
if (Array.isArray(tree)) {
return tree.map((/**
* @param {?} treeNode
* @return {?}
*/
treeNode => {
return this.dfs(target, treeNode, hideUnmatched);
}));
}
else {
/** @type {?} */
const treeNode = tree;
/** @type {?} */
const treeChildren = this.getChildrenById(treeNode.id);
/** @type {?} */
const selfMatched = treeNode.data.title.toLowerCase().includes(target);
if (selfMatched) {
treeNode.data.isMatch = true;
}
// Test if children matches target recursively, do not hide children if parent is matched.
/** @type {?} */
const childrenMatched = this.dfs(target, treeChildren, hideUnmatched && !selfMatched).some((/**
* @param {?} _
* @return {?}
*/
_ => !!_));
if (selfMatched || childrenMatched) {
if (treeChildren.length > 0) {
this.openNodesById(treeNode.id);
}
return true;
}
else {
treeNode.data.isHide = hideUnmatched;
return false;
}
}
}
/**
* @param {?} parentNode
* @param {?} childNode
* @return {?}
*/
addChildNode(parentNode, childNode) {
if (parentNode) {
Array.isArray(parentNode.data.children) ?
parentNode.data.children.push(childNode) : parentNode.data.children = [childNode];
}
else {
this._treeRoot.push(childNode);
}
}
/**
* @private
* @param {?} parentNode
* @param {?} childNode
* @return {?}
*/
removeChildNode(parentNode, childNode) {
if (parentNode) {
parentNode.data.children = parentNode.data.children.filter((/**
* @param {?} node
* @return {?}
*/
node => node.id !== childNode.id));
}
else {
this._treeRoot = this._treeRoot.filter((/**
* @param {?} node
* @return {?}
*/
node => node.id !== childNode.id));
}
}
/**
* @private
* @return {?}
*/
resetSearchResults() {
Object.keys(this.nodes).forEach((/**
* @param {?} key
* @return {?}
*/
(key) => {
/** @type {?} */
const treeNode = this.nodes[key];
treeNode.data.isMatch = false;
treeNode.data.isHide = false;
}));
}
/**
* @param {?} target
* @param {?=} hideUnmatched
* @return {?}
*/
searchTree(target, hideUnmatched = false) {
target = trim(target);
this.resetSearchResults();
return this.dfs(target.toLowerCase(), this._treeRoot, hideUnmatched);
}
/**
* @return {?}
*/
get treeRoot() {
return this._treeRoot;
}
/**
* @return {?}
*/
deactivateAllNodes() {
for (const id of Object.keys(this.nodes)) {
this.nodes[id].data.isActive = false;
}
}
}
if (false) {
/** @type {?} */
TreeFactory.prototype.nodes;
/**
* @type {?}
* @private
*/
TreeFactory.prototype.idx;
/**
* @type {?}
* @private
*/
TreeFactory.prototype._checked;
/**
* @type {?}
* @private
*/
TreeFactory.prototype._treeRoot;
/** @type {?} */
TreeFactory.prototype.mapTreeItems;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1mYWN0b3J5LmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvdHJlZS8iLCJzb3VyY2VzIjpbInRyZWUtZmFjdG9yeS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBR0wsT0FBTyxFQUNQLFdBQVcsRUFDWCxHQUFHLEVBQ0gsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxFQUNKLE1BQU0sRUFDUCxNQUFNLFdBQVcsQ0FBQzs7OztBQUVuQixtQ0FpQkM7OztJQWhCQywyQkFBWTs7SUFDWixpQ0FBa0I7O0lBQ2xCLDhCQUFlOztJQUNmLCtCQUFpQjs7SUFDakIsNkJBQVc7O0lBQ1gsaUNBQW1COztJQUNuQixnQ0FBa0I7O0lBQ2xCLGdDQUFrQjs7SUFDbEIsK0JBQWlCOztJQUNqQixpQ0FBbUI7O0lBQ25CLGtDQUFvQjs7SUFDcEIsaUNBQW1COztJQUluQixpQ0FBYzs7Ozs7O0FBR2hCLDhCQUVDOzs7O0FBRUQsK0JBb0JDOzs7SUFuQkMsMEJBQWM7O0lBQ2QseUJBQWU7O0lBQ2YsNEJBQWtCOztJQUNsQiw0QkFBa0I7O0lBQ2xCLDBCQUFvQjs7SUFDcEIsNkJBQW1COztJQUNuQix5QkFBVzs7SUFDWCx1QkFBUzs7SUFDVCwyQkFBaUI7O0lBQ2pCLDZCQUFtQjs7SUFDbkIsOEJBQW9COztJQUNwQixnQ0FBc0I7O0lBQ3RCLDZCQUFtQjs7SUFJbkIsK0JBQXFCOztJQUNyQixnQ0FBc0I7O0lBQ3RCLGtDQUF3Qjs7Ozs7O0FBRzFCLGdDQU9DOzs7SUFOQywrQkFBNEI7O0lBQzVCLDhCQUFrQjs7SUFDbEIseUNBQTZCOztJQUM3QixtQ0FBdUI7O0lBQ3ZCLHlDQUE2Qjs7SUFDN0Isc0NBQTBCOztBQUc1QixNQUFNLE9BQU8sUUFBUTs7Ozs7O0lBQ25CLFlBQW1CLEVBQUUsRUFDWixRQUFRLEVBQ1IsSUFBSTtRQUZNLE9BQUUsR0FBRixFQUFFLENBQUE7UUFDWixhQUFRLEdBQVIsUUFBUSxDQUFBO1FBQ1IsU0FBSSxHQUFKLElBQUksQ0FBQTtJQUNiLENBQUM7Q0FDRjs7O0lBSmEsc0JBQVM7O0lBQ25CLDRCQUFlOztJQUNmLHdCQUFXOztBQUlmLE1BQU0sT0FBTyxXQUFXO0lBdUJ0QjtRQXBCUSxhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUM3QixjQUFTLEdBQWUsRUFBRSxDQUFDO1FBd0JuQyxpQkFBWTs7Ozs7O1FBQUcsQ0FBQyxFQUNkLFNBQVMsRUFDVCxRQUFRLEVBQ1IsbUJBQW1CLEdBQUcsT0FBTyxFQUM3QixhQUFhLEdBQUcsSUFBSSxFQUNwQixtQkFBbUIsR0FBRyxVQUFVLEVBQ2hDLGdCQUFnQixHQUFHLE9BQU8sRUFDZixFQUFFLEVBQUU7WUFDZixPQUFPLENBQUMsU0FBUzs7OztZQUFFLENBQUMsSUFBZSxFQUFFLEVBQUU7O3NCQUMvQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDeEIsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUM7b0JBQ3ZCLFFBQVE7b0JBQ1IsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDN0IsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDckIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNsRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPO29CQUN2QixNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNO29CQUNyQixTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO29CQUMzQixXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO29CQUMvQixRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRO29CQUN6QixRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztvQkFDckMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVTtvQkFDN0IsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDL0IsYUFBYSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYTtvQkFDbkMsUUFBUSxFQUFFLEVBQUU7aUJBQ2IsQ0FBQztnQkFFRixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDekI7Z0JBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxhQUFhO29CQUNqRyxtQkFBbUIsRUFBRSxnQkFBZ0I7aUJBQ3RDLENBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLEVBQUE7UUE1Q0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNsQixDQUFDOzs7O0lBcEJELE1BQU0sQ0FBQyxNQUFNO1FBQ1gsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQzNCLENBQUM7Ozs7OztJQUdELE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFDZCxTQUFTLEVBQ1QsbUJBQW1CLEdBQUcsT0FBTyxFQUM3QixhQUFhLEdBQUcsSUFBSSxFQUNwQixtQkFBbUIsR0FBRyxVQUFVLEVBQ2hDLGdCQUFnQixHQUFHLE9BQU8sRUFDZjs7Y0FDTCxXQUFXLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRTtRQUN4QyxXQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUN4SSxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDOzs7OztJQWlERCxPQUFPLENBQUMsRUFBd0M7WUFBeEMsRUFBRSxFQUFFLEVBQUUsUUFBUSxPQUEwQixFQUF4Qiw2Q0FBTztRQUM3QixJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWCxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUNmOztjQUNLLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixRQUFRLENBQUMsRUFBRSxtREFBbUQsQ0FBQyxDQUFDO1NBQ25HO1FBQ0QsSUFBSSxDQUFDLEtBQUsscUJBQ0wsSUFBSSxDQUFDLEtBQUssSUFDYixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEdBQ3hCLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7Ozs7SUFFRCxhQUFhLENBQUMsRUFBVTtRQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLENBQUM7Ozs7Ozs7SUFFRCxjQUFjLENBQUMsRUFBVTs7Y0FDakIsSUFBSSxHQUFHLG1CQUFBLElBQUksRUFBQSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7O2NBQ3JCLFVBQVUsR0FBRyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDOztjQUVqQyxXQUFXOzs7O1FBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRTs7a0JBQ3ZCLFFBQVEsR0FBRyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1lBQzdDLG1CQUFBLElBQUksRUFBQSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQXVCLG1CQUFBLElBQUksRUFBQSxDQUFDLEtBQUs7Ozs7WUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUM5RCxPQUFPLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3pCLENBQUMsRUFBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLFFBQVE7Ozs7WUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxQixXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsRUFBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFBO1FBQ0QsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLElBQUksVUFBVSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pGLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUNsQztRQUNELE9BQU8sbUJBQUEsSUFBSSxFQUFBLENBQUM7SUFDZCxDQUFDOzs7Ozs7O0lBRUQsY0FBYyxDQUFDLEVBQVU7UUFDdkIsbUJBQUEsSUFBSSxFQUFBLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN6RCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7OztJQUVELGFBQWEsQ0FBQyxFQUFVO1FBQ3RCLG1CQUFBLElBQUksRUFBQSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3pDLG1CQUFBLElBQUksRUFBQSxDQUFDLGFBQWEsQ0FBQyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7Ozs7SUFFRCxjQUFjLENBQUMsRUFBVSxFQUFFLGFBQWEsR0FBRyxLQUFLO1FBQzlDLG1CQUFBLElBQUksRUFBQSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLG1CQUFBLElBQUksRUFBQSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDbEQsbUJBQUEsSUFBSSxFQUFBLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTzs7OztnQkFBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUM1QyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQixDQUFDLEVBQUMsQ0FBQzthQUNKO1NBQ0Y7UUFDRCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7OztJQUVELGlCQUFpQixDQUFDLEVBQVU7UUFDMUIsbUJBQUEsSUFBSSxFQUFBLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOztjQUU5QixRQUFRLEdBQUcsbUJBQUEsSUFBSSxFQUFBLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVE7UUFDeEMsbUJBQUEsSUFBSSxFQUFBLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7O2NBRTlCLGFBQWE7Ozs7UUFBRyxDQUFDLE1BQWMsRUFBRSxFQUFFOztrQkFDakMsUUFBUSxHQUFHLG1CQUFBLElBQUksRUFBQSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUM7WUFDN0MsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsUUFBUSxDQUFDLE9BQU87Ozs7Z0JBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDekIsbUJBQUEsSUFBSSxFQUFBLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDMUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDMUIsQ0FBQyxFQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQTtRQUNELGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7O0lBRU8sb0JBQW9CLENBQUMsUUFBNEI7O2NBQ2pELFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUUvQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLE9BQU87U0FDUjs7Y0FDSyxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVE7Ozs7O1FBQUUsQ0FBQyxNQUFlLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDekQsT0FBTyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkMsQ0FBQyxHQUFFLElBQUksQ0FBQztRQUVSLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1NBQzdDO0lBQ0gsQ0FBQzs7Ozs7O0lBRUQsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFnQjtRQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7UUFFeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7Ozs7O0lBRU8sZ0JBQWdCLENBQUMsSUFBYztjQUMvQixFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUk7O2NBQ25CLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUN2QyxJQUFJLFVBQVUsRUFBRTs7a0JBQ1IsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQ25ELElBQUksWUFBWSxDQUFDLEtBQUs7Ozs7WUFBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUMsRUFBRTtnQkFDNUYsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7YUFDckM7aUJBQU0sSUFBSSxZQUFZLENBQUMsSUFBSTs7OztZQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsRUFBRTtnQkFDakcsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDcEM7aUJBQU07Z0JBQ0wsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7YUFDckM7WUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQzs7Ozs7OztJQUVPLGVBQWUsQ0FBQyxJQUFjLEVBQUUsT0FBZ0I7Y0FDaEQsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJOztjQUNiLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUM3QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLFlBQVksQ0FBQyxPQUFPOzs7O1lBQUMsU0FBUyxDQUFDLEVBQUU7c0JBQ3pCLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLFNBQVM7c0JBQzNCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtvQkFDdEIsUUFBUSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7b0JBQzdCLFFBQVEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO29CQUM3QixJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUNsRDtnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUMsQ0FBQzs7a0JBQ0csd0JBQXdCLEdBQUcsWUFBWSxDQUFDLE1BQU07Ozs7WUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFDLENBQUMsTUFBTTs7a0JBQ2pHLG9CQUFvQixHQUFHLFlBQVk7aUJBQ3RDLE1BQU07Ozs7WUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUMsQ0FBQyxNQUFNO1lBQ3BGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLG9CQUFvQixHQUFHLENBQUMsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLHdCQUF3QixDQUFDO1NBQ3BHO0lBQ0gsQ0FBQzs7OztJQUVELGVBQWU7UUFDYixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7Ozs7SUFFRCxnQkFBZ0I7O2NBQ1IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSzs7OztRQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7UUFDckMsQ0FBQyxFQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7Ozs7SUFFRCxjQUFjLENBQUMsRUFBVTtRQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDL0QsQ0FBQzs7Ozs7SUFFRCxlQUFlLENBQUMsRUFBVTtRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1NBQzNDO2FBQU0sSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN2QjtRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7Ozs7Ozs7O0lBTU8sTUFBTTs7Y0FDTixhQUFhOzs7O1FBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNuQyxPQUFPLEdBQUcsQ0FBQyxLQUFLOzs7O1lBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDOUIseUJBQ0ssSUFBSSxJQUNQLFFBQVEsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFDdEQ7WUFDSixDQUFDLEVBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQTtRQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDOzs7OztJQUVELFlBQVksQ0FBQyxFQUFVO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDckMsQ0FBQzs7Ozs7SUFFRCxVQUFVLENBQUMsRUFBVTtRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3RDLENBQUM7Ozs7Ozs7Ozs7SUFNTyxXQUFXLENBQUMsVUFBa0IsRUFBRSxhQUF1Qjs7Y0FDdkQsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNoRSxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxFQUFFO1FBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3QixDQUFDOzs7Ozs7OztJQUVELFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBYTtRQUM1QixtQkFBQSxJQUFJLEVBQUEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEMsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQztJQUNkLENBQUM7Ozs7Ozs7SUFFTyx1QkFBdUIsQ0FBQyxJQUFjLEVBQUUsT0FBZ0I7UUFDOUQsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDOzs7Ozs7OztJQUVPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQXVCO1FBQy9DLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQzVCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztTQUFFO1FBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQyxHQUFHOzs7O1lBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ25ELENBQUMsRUFBQyxDQUFDO1NBQ0o7YUFBTTs7a0JBQ0MsUUFBUSxHQUFHLElBQUk7O2tCQUNmLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7O2tCQUNoRCxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN0RSxJQUFJLFdBQVcsRUFBRTtnQkFDZixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7YUFDOUI7OztrQkFFSyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUk7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUM7WUFDcEcsSUFBSSxXQUFXLElBQUksZUFBZSxFQUFFO2dCQUNsQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDakM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7Z0JBQ3JDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtJQUNILENBQUM7Ozs7OztJQUVNLFlBQVksQ0FBQyxVQUFvQixFQUFFLFNBQW1CO1FBQzNELElBQUksVUFBVSxFQUFFO1lBQ2QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNyRjthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDOzs7Ozs7O0lBRU8sZUFBZSxDQUFDLFVBQW9CLEVBQUUsU0FBbUI7UUFDL0QsSUFBSSxVQUFVLEVBQUU7WUFDZCxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNOzs7O1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxFQUFFLEVBQUMsQ0FBQztTQUM5RjthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07Ozs7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBQyxDQUFDO1NBQzFFO0lBQ0gsQ0FBQzs7Ozs7SUFFTyxrQkFBa0I7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTzs7OztRQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7O2tCQUNoQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUMvQixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7OztJQUVNLFVBQVUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxHQUFHLEtBQUs7UUFDN0MsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkUsQ0FBQzs7OztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDOzs7O0lBQ00sa0JBQWtCO1FBQ3ZCLEtBQUssTUFBTSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN0QztJQUNILENBQUM7Q0FDRjs7O0lBL1dDLDRCQUE0Qjs7Ozs7SUFDNUIsMEJBQW9COzs7OztJQUNwQiwrQkFBcUM7Ozs7O0lBQ3JDLGdDQUFtQzs7SUF3Qm5DLG1DQXdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGljdGlvbmFyeSxcclxuICBmaWx0ZXIsXHJcbiAgZm9yRWFjaCxcclxuICBpc1VuZGVmaW5lZCxcclxuICBtYXAsXHJcbiAgb21pdEJ5LFxyXG4gIHBpY2tCeSxcclxuICByZWR1Y2UsXHJcbiAgdHJpbSxcclxuICB2YWx1ZXNcclxufSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVHJlZU5vZGVEYXRhIHtcclxuICBpZD86IG51bWJlcjtcclxuICBwYXJlbnRJZD86IG51bWJlcjtcclxuICB0aXRsZT86IHN0cmluZztcclxuICBpc09wZW4/OiBib29sZWFuO1xyXG4gIGRhdGE/OiBhbnk7XHJcbiAgaXNQYXJlbnQ/OiBib29sZWFuO1xyXG4gIGxvYWRpbmc/OiBib29sZWFuO1xyXG4gIGlzTWF0Y2g/OiBib29sZWFuO1xyXG4gIGlzSGlkZT86IGJvb2xlYW47XHJcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xyXG4gIGlzQ2hlY2tlZD86IGJvb2xlYW47XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG5cclxuICBbcHJvcDogc3RyaW5nXTogYW55O1xyXG5cclxuICBjaGlsZHJlbj86IFtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUcmVlTWFwIHtcclxuICBbaW5kZXg6IG51bWJlcl06IElUcmVlTm9kZURhdGE7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVJdGVtIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIG9wZW4/OiBib29sZWFuO1xyXG4gIGxvYWRpbmc/OiBib29sZWFuO1xyXG4gIGlzTWF0Y2g/OiBib29sZWFuO1xyXG4gIGl0ZW1zPzogSVRyZWVJdGVtW107XHJcbiAgaXNQYXJlbnQ/OiBib29sZWFuO1xyXG4gIGRhdGE/OiBhbnk7XHJcbiAgaWQ/OiBhbnk7XHJcbiAgaXNIaWRlPzogYm9vbGVhbjtcclxuICBpc0FjdGl2ZT86IGJvb2xlYW47XHJcbiAgaXNDaGVja2VkPzogYm9vbGVhbjtcclxuICBoYWxmQ2hlY2tlZD86IGJvb2xlYW47XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG5cclxuICBbcHJvcDogc3RyaW5nXTogYW55O1xyXG5cclxuICBkaXNhYmxlQWRkPzogYm9vbGVhbjtcclxuICBkaXNhYmxlRWRpdD86IGJvb2xlYW47XHJcbiAgZGlzYWJsZURlbGV0ZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVJbnB1dCB7XHJcbiAgdHJlZUl0ZW1zOiBBcnJheTxJVHJlZUl0ZW0+O1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG4gIHRyZWVOb2RlQ2hpbGRyZW5LZXk/OiBzdHJpbmc7XHJcbiAgdHJlZU5vZGVJZEtleT86IHN0cmluZztcclxuICBjaGVja2JveERpc2FibGVkS2V5Pzogc3RyaW5nO1xyXG4gIHRyZWVOb2RlVGl0bGVLZXk/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBUcmVlTm9kZSBpbXBsZW1lbnRzIElUcmVlTm9kZURhdGEge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZCxcclxuICAgIHB1YmxpYyBwYXJlbnRJZCxcclxuICAgIHB1YmxpYyBkYXRhKSB7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHJlZUZhY3Rvcnkge1xyXG4gIG5vZGVzOiBEaWN0aW9uYXJ5PFRyZWVOb2RlPjtcclxuICBwcml2YXRlIGlkeDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2NoZWNrZWQgPSBuZXcgU2V0PE9iamVjdD4oKTtcclxuICBwcml2YXRlIF90cmVlUm9vdDogVHJlZU5vZGVbXSA9IFtdO1xyXG5cclxuICBzdGF0aWMgY3JlYXRlKCkge1xyXG4gICAgcmV0dXJuIG5ldyBUcmVlRmFjdG9yeSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gdHJlZSBtb2RlbCB3aXRoIGl0ZW1zXHJcbiAgc3RhdGljIGZyb21UcmVlKHtcclxuICAgIHRyZWVJdGVtcyxcclxuICAgIHRyZWVOb2RlQ2hpbGRyZW5LZXkgPSAnaXRlbXMnLFxyXG4gICAgdHJlZU5vZGVJZEtleSA9ICdpZCcsXHJcbiAgICBjaGVja2JveERpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJyxcclxuICAgIHRyZWVOb2RlVGl0bGVLZXkgPSAndGl0bGUnXHJcbiAgfTogSVRyZWVJbnB1dCk6IFRyZWVGYWN0b3J5IHtcclxuICAgIGNvbnN0IHRyZWVGYWN0b3J5ID0gVHJlZUZhY3RvcnkuY3JlYXRlKCk7XHJcbiAgICB0cmVlRmFjdG9yeS5tYXBUcmVlSXRlbXMoeyB0cmVlSXRlbXMsIHBhcmVudElkOiB1bmRlZmluZWQsIHRyZWVOb2RlQ2hpbGRyZW5LZXksIHRyZWVOb2RlSWRLZXksIGNoZWNrYm94RGlzYWJsZWRLZXksIHRyZWVOb2RlVGl0bGVLZXkgfSk7XHJcbiAgICByZXR1cm4gdHJlZUZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuaWR4ID0gMDtcclxuICAgIHRoaXMubm9kZXMgPSB7fTtcclxuICB9XHJcblxyXG4gIG1hcFRyZWVJdGVtcyA9ICh7XHJcbiAgICB0cmVlSXRlbXMsXHJcbiAgICBwYXJlbnRJZCxcclxuICAgIHRyZWVOb2RlQ2hpbGRyZW5LZXkgPSAnaXRlbXMnLFxyXG4gICAgdHJlZU5vZGVJZEtleSA9ICdpZCcsXHJcbiAgICBjaGVja2JveERpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJyxcclxuICAgIHRyZWVOb2RlVGl0bGVLZXkgPSAndGl0bGUnXHJcbiAgfTogSVRyZWVJbnB1dCkgPT4ge1xyXG4gICAgZm9yRWFjaCh0cmVlSXRlbXMsIChpdGVtOiBJVHJlZUl0ZW0pID0+IHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuYWRkTm9kZSh7XHJcbiAgICAgICAgaWQ6IGl0ZW1bdHJlZU5vZGVJZEtleV0sXHJcbiAgICAgICAgcGFyZW50SWQsXHJcbiAgICAgICAgdGl0bGU6IGl0ZW1bdHJlZU5vZGVUaXRsZUtleV0sXHJcbiAgICAgICAgaXNPcGVuOiAhIWl0ZW0ub3BlbixcclxuICAgICAgICBkYXRhOiBpdGVtLmRhdGEgfHwge30sXHJcbiAgICAgICAgb3JpZ2luSXRlbTogaXRlbSxcclxuICAgICAgICBpc1BhcmVudDogISFpdGVtLmlzUGFyZW50IHx8ICEhKGl0ZW1bdHJlZU5vZGVDaGlsZHJlbktleV0gJiYgaXRlbVt0cmVlTm9kZUNoaWxkcmVuS2V5XS5sZW5ndGggPiAwKSxcclxuICAgICAgICBsb2FkaW5nOiAhIWl0ZW0ubG9hZGluZyxcclxuICAgICAgICBpc01hdGNoOiAhIWl0ZW0uaXNNYXRjaCxcclxuICAgICAgICBpc0hpZGU6ICEhaXRlbS5pc0hpZGUsXHJcbiAgICAgICAgaXNDaGVja2VkOiAhIWl0ZW0uaXNDaGVja2VkLFxyXG4gICAgICAgIGhhbGZDaGVja2VkOiAhIWl0ZW0uaGFsZkNoZWNrZWQsXHJcbiAgICAgICAgaXNBY3RpdmU6ICEhaXRlbS5pc0FjdGl2ZSxcclxuICAgICAgICBkaXNhYmxlZDogISFpdGVtW2NoZWNrYm94RGlzYWJsZWRLZXldLFxyXG4gICAgICAgIGRpc2FibGVBZGQ6ICEhaXRlbS5kaXNhYmxlQWRkLFxyXG4gICAgICAgIGRpc2FibGVFZGl0OiAhIWl0ZW0uZGlzYWJsZUVkaXQsXHJcbiAgICAgICAgZGlzYWJsZURlbGV0ZTogISFpdGVtLmRpc2FibGVEZWxldGUsXHJcbiAgICAgICAgY2hpbGRyZW46IFtdXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKCEhaXRlbS5pc0NoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLl9jaGVja2VkLmFkZChub2RlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5tYXBUcmVlSXRlbXMoe1xyXG4gICAgICAgIHRyZWVJdGVtczogaXRlbVt0cmVlTm9kZUNoaWxkcmVuS2V5XSB8fCBbXSwgcGFyZW50SWQ6IG5vZGUuaWQsIHRyZWVOb2RlQ2hpbGRyZW5LZXksIHRyZWVOb2RlSWRLZXksXHJcbiAgICAgICAgY2hlY2tib3hEaXNhYmxlZEtleSwgdHJlZU5vZGVUaXRsZUtleVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBhZGROb2RlKHsgaWQsIHBhcmVudElkLCAuLi5kYXRhIH06IElUcmVlTm9kZURhdGEpOiBUcmVlTm9kZSB7XHJcbiAgICBpZiAoaXNVbmRlZmluZWQoaWQpKSB7XHJcbiAgICAgIHRoaXMuaWR4Kys7XHJcbiAgICAgIGlkID0gdGhpcy5pZHg7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmVlTm9kZSA9IG5ldyBUcmVlTm9kZShpZCwgcGFyZW50SWQsIGRhdGEpO1xyXG4gICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkodHJlZU5vZGUuaWQpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlZCBpZDogJHt0cmVlTm9kZS5pZH0gZGV0ZWN0ZWQsIHBsZWFzZSBzcGVjaWZ5IHVuaXF1ZSBpZHMgaW4gdGhlIHRyZWUuYCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vZGVzID0ge1xyXG4gICAgICAuLi50aGlzLm5vZGVzLFxyXG4gICAgICBbdHJlZU5vZGUuaWRdOiB0cmVlTm9kZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFkZENoaWxkTm9kZSh0aGlzLm5vZGVzW3BhcmVudElkXSwgdHJlZU5vZGUpO1xyXG4gICAgcmV0dXJuIHRyZWVOb2RlO1xyXG4gIH1cclxuXHJcbiAgZWRpdE5vZGVUaXRsZShpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm5vZGVzW2lkXS5kYXRhLmVkaXRhYmxlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZU5vZGVCeUlkKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW2lkXTtcclxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLm5vZGVzW25vZGUucGFyZW50SWRdO1xyXG4gICAgdGhpcy5yZW1vdmVDaGlsZE5vZGUocGFyZW50Tm9kZSwgbm9kZSk7XHJcblxyXG4gICAgY29uc3QgZGVsZXRlSXRlbXMgPSAobm9kZUlkKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbkJ5SWQobm9kZUlkKTtcclxuICAgICAgdGhpcy5ub2RlcyA9IG9taXRCeTxEaWN0aW9uYXJ5PFRyZWVOb2RlPj4odGhpcy5ub2RlcywgKF9ub2RlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIF9ub2RlLmlkID09PSBpZDtcclxuICAgICAgfSk7XHJcbiAgICAgIGZvckVhY2goY2hpbGRyZW4sIChjaGlsZCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZUl0ZW1zKGNoaWxkLmlkKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgZGVsZXRlSXRlbXMoaWQpO1xyXG4gICAgaWYgKHBhcmVudE5vZGUgJiYgKCFwYXJlbnROb2RlLmRhdGEuY2hpbGRyZW4gfHwgIXBhcmVudE5vZGUuZGF0YS5jaGlsZHJlbi5sZW5ndGgpKSB7XHJcbiAgICAgIHBhcmVudE5vZGUuZGF0YS5pc1BhcmVudCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVOb2RlQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm5vZGVzW2lkXS5kYXRhLmlzT3BlbiA9ICF0aGlzLm5vZGVzW2lkXS5kYXRhLmlzT3BlbjtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgb3Blbk5vZGVzQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm5vZGVzW2lkXS5kYXRhLmlzT3BlbiA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5ub2Rlc1tpZF0ucGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLm9wZW5Ob2Rlc0J5SWQodGhpcy5ub2Rlc1tpZF0ucGFyZW50SWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBjbG9zZU5vZGVzQnlJZChpZDogbnVtYmVyLCBjbG9zZUNoaWxkcmVuID0gZmFsc2UpIHtcclxuICAgIHRoaXMubm9kZXNbaWRdLmRhdGEuaXNPcGVuID0gZmFsc2U7XHJcbiAgICBpZiAoY2xvc2VDaGlsZHJlbikge1xyXG4gICAgICBpZiAodGhpcy5ub2Rlc1tpZF0gJiYgdGhpcy5ub2Rlc1tpZF0uZGF0YS5jaGlsZHJlbikge1xyXG4gICAgICAgIHRoaXMubm9kZXNbaWRdLmRhdGEuY2hpbGRyZW4uZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jbG9zZU5vZGVzQnlJZChub2RlLmlkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlZE5vZGVzQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLm5vZGVzW2lkXS5kYXRhLmRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMubm9kZXNbaWRdLnBhcmVudElkO1xyXG4gICAgdGhpcy5fZGlzYWJsZWRQYXJlbnROb2RlcyhwYXJlbnRJZCk7XHJcblxyXG4gICAgY29uc3QgZGlzYWJsZWROb2RlcyA9IChub2RlSWQ6IG51bWJlcikgPT4ge1xyXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5CeUlkKG5vZGVJZCk7XHJcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgIHRoaXMubm9kZXNbY2hpbGQuaWRdLmRhdGEuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgZGlzYWJsZWROb2RlcyhjaGlsZC5pZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBkaXNhYmxlZE5vZGVzKGlkKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWRQYXJlbnROb2RlcyhwYXJlbnRJZDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5CeUlkKHBhcmVudElkKTtcclxuXHJcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXN1bHQgPSByZWR1Y2UoY2hpbGRyZW4sIChzdGF0dXM6IGJvb2xlYW4sIGNoaWxkKSA9PiB7XHJcbiAgICAgIHJldHVybiBzdGF0dXMgJiYgY2hpbGQuZGF0YS5kaXNhYmxlZDtcclxuICAgIH0sIHRydWUpO1xyXG5cclxuICAgIGlmICh0aGlzLm5vZGVzW3BhcmVudElkXSkge1xyXG4gICAgICB0aGlzLm5vZGVzW3BhcmVudElkXS5kYXRhLmRpc2FibGVkID0gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tOb2Rlc0J5SWQoaWQ6IG51bWJlciwgY2hlY2tlZDogYm9vbGVhbik6IEFycmF5PE9iamVjdD4ge1xyXG4gICAgdGhpcy5ub2Rlc1tpZF0uZGF0YS5oYWxmQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5ub2Rlc1tpZF0uZGF0YS5pc0NoZWNrZWQgPSBjaGVja2VkO1xyXG5cclxuICAgIHRoaXMuY2hlY2tQYXJlbnROb2Rlcyh0aGlzLm5vZGVzW2lkXSk7XHJcbiAgICB0aGlzLmNoZWNrQ2hpbGROb2Rlcyh0aGlzLm5vZGVzW2lkXSwgY2hlY2tlZCk7XHJcbiAgICB0aGlzLm1haW50YWluQ2hlY2tlZE5vZGVMaXN0KHRoaXMubm9kZXNbaWRdLCBjaGVja2VkKTtcclxuICAgIHJldHVybiB0aGlzLmdldENoZWNrZWROb2RlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1BhcmVudE5vZGVzKG5vZGU6IFRyZWVOb2RlKSB7XHJcbiAgICBjb25zdCB7IHBhcmVudElkIH0gPSBub2RlO1xyXG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMubm9kZXNbcGFyZW50SWRdO1xyXG4gICAgaWYgKHBhcmVudE5vZGUpIHtcclxuICAgICAgY29uc3QgY2hpbGRyZW5Ob2RlID0gdGhpcy5nZXRDaGlsZHJlbkJ5SWQocGFyZW50SWQpO1xyXG4gICAgICBpZiAoY2hpbGRyZW5Ob2RlLmV2ZXJ5KGNoaWxkTm9kZSA9PiBjaGlsZE5vZGUuZGF0YS5pc0NoZWNrZWQgJiYgIWNoaWxkTm9kZS5kYXRhLmhhbGZDaGVja2VkKSkge1xyXG4gICAgICAgIHBhcmVudE5vZGUuZGF0YS5pc0NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIHBhcmVudE5vZGUuZGF0YS5oYWxmQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuTm9kZS5zb21lKGNoaWxkTm9kZSA9PiBjaGlsZE5vZGUuZGF0YS5oYWxmQ2hlY2tlZCB8fCBjaGlsZE5vZGUuZGF0YS5pc0NoZWNrZWQpKSB7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5kYXRhLmlzQ2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5kYXRhLmhhbGZDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJlbnROb2RlLmRhdGEuaXNDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgcGFyZW50Tm9kZS5kYXRhLmhhbGZDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYWludGFpbkNoZWNrZWROb2RlTGlzdChwYXJlbnROb2RlLCBwYXJlbnROb2RlLmRhd