diff --git a/.gitignore b/.gitignore
index a49e4a2..31d760f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,20 @@
-.idea/
+# Compile time directories
+node_modules
+/temp
+/coverage
+/dist
+/typings
+
+# Editor configuration
+.vscode
+.settings
+.idea
+
+# Logs and compressed files
+*.log
+*.tgz
+
+# Demos
collections.js.map
demo/CollectionsDemo/app.js.map
demo/packages/
@@ -71,14 +87,3 @@ coverage
# node-waf configuration
.lock-wscript
-
-.vscode/
-.settings/
-coverage/
-node_modules
-temp/
-/typings
-*.log
-*.tgz
-
-./dist
\ No newline at end of file
diff --git a/dist/lib/BSTree.d.ts b/dist/lib/BSTree.d.ts
deleted file mode 100644
index 168977d..0000000
--- a/dist/lib/BSTree.d.ts
+++ /dev/null
@@ -1,175 +0,0 @@
-import * as util from './util';
-export default class BSTree {
- private root;
- private compare;
- private nElements;
- /**
- * Creates an empty binary search tree.
- * @class A binary search tree is a binary tree in which each
- * internal node stores an element such that the elements stored in the
- * left subtree are less than it and the elements
- * stored in the right subtree are greater.
- * Formally, a binary search tree is a node-based binary tree data structure which
- * has the following properties:
- *
- * The left subtree of a node contains only nodes with elements less
- * than the node's element
- * The right subtree of a node contains only nodes with elements greater
- * than the node's element
- * Both the left and right subtrees must also be binary search trees.
- *
- * If the inserted elements are custom objects a compare function must
- * be provided at construction time, otherwise the <=, === and >= operators are
- * used to compare elements. Example:
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two elements. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- constructor(compareFunction?: util.ICompareFunction);
- /**
- * Adds the specified element to this tree if it is not already present.
- * @param {Object} element the element to insert.
- * @return {boolean} true if this tree did not already contain the specified element.
- */
- add(element: T): boolean;
- /**
- * Removes all of the elements from this tree.
- */
- clear(): void;
- /**
- * Returns true if this tree contains no elements.
- * @return {boolean} true if this tree contains no elements.
- */
- isEmpty(): boolean;
- /**
- * Returns the number of elements in this tree.
- * @return {number} the number of elements in this tree.
- */
- size(): number;
- /**
- * Returns true if this tree contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this tree contains the specified element,
- * false otherwise.
- */
- contains(element: T): boolean;
- /**
- * Removes the specified element from this tree if it is present.
- * @return {boolean} true if this tree contained the specified element.
- */
- remove(element: T): boolean;
- /**
- * Executes the provided function once for each element present in this tree in
- * in-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- inorderTraversal(callback: util.ILoopFunction): void;
- /**
- * Executes the provided function once for each element present in this tree in pre-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- preorderTraversal(callback: util.ILoopFunction): void;
- /**
- * Executes the provided function once for each element present in this tree in post-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- postorderTraversal(callback: util.ILoopFunction): void;
- /**
- * Executes the provided function once for each element present in this tree in
- * level-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- levelTraversal(callback: util.ILoopFunction): void;
- /**
- * Returns the minimum element of this tree.
- * @return {*} the minimum element of this tree or undefined if this tree is
- * is empty.
- */
- minimum(): T;
- /**
- * Returns the maximum element of this tree.
- * @return {*} the maximum element of this tree or undefined if this tree is
- * is empty.
- */
- maximum(): T;
- /**
- * Executes the provided function once for each element present in this tree in inorder.
- * Equivalent to inorderTraversal.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- forEach(callback: util.ILoopFunction): void;
- /**
- * Returns an array containing all of the elements in this tree in in-order.
- * @return {Array} an array containing all of the elements in this tree in in-order.
- */
- toArray(): T[];
- /**
- * Returns the height of this tree.
- * @return {number} the height of this tree or -1 if is empty.
- */
- height(): number;
- /**
- * @private
- */
- private searchNode(node, element);
- /**
- * @private
- */
- private transplant(n1, n2);
- /**
- * @private
- */
- private removeNode(node);
- /**
- * @private
- */
- private inorderTraversalAux(node, callback, signal);
- /**
- * @private
- */
- private levelTraversalAux(node, callback);
- /**
- * @private
- */
- private preorderTraversalAux(node, callback, signal);
- /**
- * @private
- */
- private postorderTraversalAux(node, callback, signal);
- /**
- * @private
- */
- private minimumAux(node);
- /**
- * @private
- */
- private maximumAux(node);
- /**
- * @private
- */
- private heightAux(node);
- private insertNode(node);
- /**
- * @private
- */
- private createNode(element);
-}
diff --git a/dist/lib/BSTree.js b/dist/lib/BSTree.js
deleted file mode 100644
index ff5072d..0000000
--- a/dist/lib/BSTree.js
+++ /dev/null
@@ -1,400 +0,0 @@
-"use strict";
-var util = require('./util');
-var Queue_1 = require('./Queue');
-var BSTree = (function () {
- /**
- * Creates an empty binary search tree.
- * @class A binary search tree is a binary tree in which each
- * internal node stores an element such that the elements stored in the
- * left subtree are less than it and the elements
- * stored in the right subtree are greater.
- * Formally, a binary search tree is a node-based binary tree data structure which
- * has the following properties:
- *
- * The left subtree of a node contains only nodes with elements less
- * than the node's element
- * The right subtree of a node contains only nodes with elements greater
- * than the node's element
- * Both the left and right subtrees must also be binary search trees.
- *
- * If the inserted elements are custom objects a compare function must
- * be provided at construction time, otherwise the <=, === and >= operators are
- * used to compare elements. Example:
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two elements. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- function BSTree(compareFunction) {
- this.root = null;
- this.compare = compareFunction || util.defaultCompare;
- this.nElements = 0;
- }
- /**
- * Adds the specified element to this tree if it is not already present.
- * @param {Object} element the element to insert.
- * @return {boolean} true if this tree did not already contain the specified element.
- */
- BSTree.prototype.add = function (element) {
- if (util.isUndefined(element)) {
- return false;
- }
- if (this.insertNode(this.createNode(element)) !== null) {
- this.nElements++;
- return true;
- }
- return false;
- };
- /**
- * Removes all of the elements from this tree.
- */
- BSTree.prototype.clear = function () {
- this.root = null;
- this.nElements = 0;
- };
- /**
- * Returns true if this tree contains no elements.
- * @return {boolean} true if this tree contains no elements.
- */
- BSTree.prototype.isEmpty = function () {
- return this.nElements === 0;
- };
- /**
- * Returns the number of elements in this tree.
- * @return {number} the number of elements in this tree.
- */
- BSTree.prototype.size = function () {
- return this.nElements;
- };
- /**
- * Returns true if this tree contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this tree contains the specified element,
- * false otherwise.
- */
- BSTree.prototype.contains = function (element) {
- if (util.isUndefined(element)) {
- return false;
- }
- return this.searchNode(this.root, element) !== null;
- };
- /**
- * Removes the specified element from this tree if it is present.
- * @return {boolean} true if this tree contained the specified element.
- */
- BSTree.prototype.remove = function (element) {
- var node = this.searchNode(this.root, element);
- if (node === null) {
- return false;
- }
- this.removeNode(node);
- this.nElements--;
- return true;
- };
- /**
- * Executes the provided function once for each element present in this tree in
- * in-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- BSTree.prototype.inorderTraversal = function (callback) {
- this.inorderTraversalAux(this.root, callback, {
- stop: false
- });
- };
- /**
- * Executes the provided function once for each element present in this tree in pre-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- BSTree.prototype.preorderTraversal = function (callback) {
- this.preorderTraversalAux(this.root, callback, {
- stop: false
- });
- };
- /**
- * Executes the provided function once for each element present in this tree in post-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- BSTree.prototype.postorderTraversal = function (callback) {
- this.postorderTraversalAux(this.root, callback, {
- stop: false
- });
- };
- /**
- * Executes the provided function once for each element present in this tree in
- * level-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- BSTree.prototype.levelTraversal = function (callback) {
- this.levelTraversalAux(this.root, callback);
- };
- /**
- * Returns the minimum element of this tree.
- * @return {*} the minimum element of this tree or undefined if this tree is
- * is empty.
- */
- BSTree.prototype.minimum = function () {
- if (this.isEmpty()) {
- return undefined;
- }
- return this.minimumAux(this.root).element;
- };
- /**
- * Returns the maximum element of this tree.
- * @return {*} the maximum element of this tree or undefined if this tree is
- * is empty.
- */
- BSTree.prototype.maximum = function () {
- if (this.isEmpty()) {
- return undefined;
- }
- return this.maximumAux(this.root).element;
- };
- /**
- * Executes the provided function once for each element present in this tree in inorder.
- * Equivalent to inorderTraversal.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- BSTree.prototype.forEach = function (callback) {
- this.inorderTraversal(callback);
- };
- /**
- * Returns an array containing all of the elements in this tree in in-order.
- * @return {Array} an array containing all of the elements in this tree in in-order.
- */
- BSTree.prototype.toArray = function () {
- var array = [];
- this.inorderTraversal(function (element) {
- array.push(element);
- return true;
- });
- return array;
- };
- /**
- * Returns the height of this tree.
- * @return {number} the height of this tree or -1 if is empty.
- */
- BSTree.prototype.height = function () {
- return this.heightAux(this.root);
- };
- /**
- * @private
- */
- BSTree.prototype.searchNode = function (node, element) {
- var cmp = null;
- while (node !== null && cmp !== 0) {
- cmp = this.compare(element, node.element);
- if (cmp < 0) {
- node = node.leftCh;
- }
- else if (cmp > 0) {
- node = node.rightCh;
- }
- }
- return node;
- };
- /**
- * @private
- */
- BSTree.prototype.transplant = function (n1, n2) {
- if (n1.parent === null) {
- this.root = n2;
- }
- else if (n1 === n1.parent.leftCh) {
- n1.parent.leftCh = n2;
- }
- else {
- n1.parent.rightCh = n2;
- }
- if (n2 !== null) {
- n2.parent = n1.parent;
- }
- };
- /**
- * @private
- */
- BSTree.prototype.removeNode = function (node) {
- if (node.leftCh === null) {
- this.transplant(node, node.rightCh);
- }
- else if (node.rightCh === null) {
- this.transplant(node, node.leftCh);
- }
- else {
- var y = this.minimumAux(node.rightCh);
- if (y.parent !== node) {
- this.transplant(y, y.rightCh);
- y.rightCh = node.rightCh;
- y.rightCh.parent = y;
- }
- this.transplant(node, y);
- y.leftCh = node.leftCh;
- y.leftCh.parent = y;
- }
- };
- /**
- * @private
- */
- BSTree.prototype.inorderTraversalAux = function (node, callback, signal) {
- if (node === null || signal.stop) {
- return;
- }
- this.inorderTraversalAux(node.leftCh, callback, signal);
- if (signal.stop) {
- return;
- }
- signal.stop = callback(node.element) === false;
- if (signal.stop) {
- return;
- }
- this.inorderTraversalAux(node.rightCh, callback, signal);
- };
- /**
- * @private
- */
- BSTree.prototype.levelTraversalAux = function (node, callback) {
- var queue = new Queue_1.default();
- if (node !== null) {
- queue.enqueue(node);
- }
- while (!queue.isEmpty()) {
- node = queue.dequeue();
- if (callback(node.element) === false) {
- return;
- }
- if (node.leftCh !== null) {
- queue.enqueue(node.leftCh);
- }
- if (node.rightCh !== null) {
- queue.enqueue(node.rightCh);
- }
- }
- };
- /**
- * @private
- */
- BSTree.prototype.preorderTraversalAux = function (node, callback, signal) {
- if (node === null || signal.stop) {
- return;
- }
- signal.stop = callback(node.element) === false;
- if (signal.stop) {
- return;
- }
- this.preorderTraversalAux(node.leftCh, callback, signal);
- if (signal.stop) {
- return;
- }
- this.preorderTraversalAux(node.rightCh, callback, signal);
- };
- /**
- * @private
- */
- BSTree.prototype.postorderTraversalAux = function (node, callback, signal) {
- if (node === null || signal.stop) {
- return;
- }
- this.postorderTraversalAux(node.leftCh, callback, signal);
- if (signal.stop) {
- return;
- }
- this.postorderTraversalAux(node.rightCh, callback, signal);
- if (signal.stop) {
- return;
- }
- signal.stop = callback(node.element) === false;
- };
- /**
- * @private
- */
- BSTree.prototype.minimumAux = function (node) {
- while (node.leftCh !== null) {
- node = node.leftCh;
- }
- return node;
- };
- /**
- * @private
- */
- BSTree.prototype.maximumAux = function (node) {
- while (node.rightCh !== null) {
- node = node.rightCh;
- }
- return node;
- };
- /**
- * @private
- */
- BSTree.prototype.heightAux = function (node) {
- if (node === null) {
- return -1;
- }
- return Math.max(this.heightAux(node.leftCh), this.heightAux(node.rightCh)) + 1;
- };
- /*
- * @private
- */
- BSTree.prototype.insertNode = function (node) {
- var parent = null;
- var position = this.root;
- var cmp = null;
- while (position !== null) {
- cmp = this.compare(node.element, position.element);
- if (cmp === 0) {
- return null;
- }
- else if (cmp < 0) {
- parent = position;
- position = position.leftCh;
- }
- else {
- parent = position;
- position = position.rightCh;
- }
- }
- node.parent = parent;
- if (parent === null) {
- // tree is empty
- this.root = node;
- }
- else if (this.compare(node.element, parent.element) < 0) {
- parent.leftCh = node;
- }
- else {
- parent.rightCh = node;
- }
- return node;
- };
- /**
- * @private
- */
- BSTree.prototype.createNode = function (element) {
- return {
- element: element,
- leftCh: null,
- rightCh: null,
- parent: null
- };
- };
- return BSTree;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = BSTree;
-//# sourceMappingURL=BSTree.js.map
\ No newline at end of file
diff --git a/dist/lib/BSTree.js.map b/dist/lib/BSTree.js.map
deleted file mode 100644
index 5897a3b..0000000
--- a/dist/lib/BSTree.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BSTree.js","sourceRoot":"","sources":["../../src/lib/BSTree.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/Bag.d.ts b/dist/lib/Bag.d.ts
deleted file mode 100644
index 9229dce..0000000
--- a/dist/lib/Bag.d.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import * as util from './util';
-import Set from './Set';
-export default class Bag {
- private toStrF;
- private dictionary;
- private nElements;
- /**
- * Creates an empty bag.
- * @class A bag is a special kind of set in which members are
- * allowed to appear more than once.
- * If the inserted elements are custom objects a function
- * which converts elements to unique strings must be provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert elements to strings. If the elements aren't strings or if toString()
- * is not appropriate, a custom function which receives an object and returns a
- * unique string must be provided.
- */
- constructor(toStrFunction?: (item: T) => string);
- /**
- * Adds nCopies of the specified object to this bag.
- * @param {Object} element element to add.
- * @param {number=} nCopies the number of copies to add, if this argument is
- * undefined 1 copy is added.
- * @return {boolean} true unless element is undefined.
- */
- add(element: T, nCopies?: number): boolean;
- /**
- * Counts the number of copies of the specified object in this bag.
- * @param {Object} element the object to search for..
- * @return {number} the number of copies of the object, 0 if not found
- */
- count(element: T): number;
- /**
- * Returns true if this bag contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this bag contains the specified element,
- * false otherwise.
- */
- contains(element: T): boolean;
- /**
- * Removes nCopies of the specified object to this bag.
- * If the number of copies to remove is greater than the actual number
- * of copies in the Bag, all copies are removed.
- * @param {Object} element element to remove.
- * @param {number=} nCopies the number of copies to remove, if this argument is
- * undefined 1 copy is removed.
- * @return {boolean} true if at least 1 element was removed.
- */
- remove(element: T, nCopies?: number): boolean;
- /**
- * Returns an array containing all of the elements in this big in arbitrary order,
- * including multiple copies.
- * @return {Array} an array containing all of the elements in this bag.
- */
- toArray(): T[];
- /**
- * Returns a set of unique elements in this bag.
- * @return {collections.Set} a set of unique elements in this bag.
- */
- toSet(): Set;
- /**
- * Executes the provided function once for each element
- * present in this bag, including multiple copies.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element. To break the iteration you can
- * optionally return false.
- */
- forEach(callback: util.ILoopFunction): void;
- /**
- * Returns the number of elements in this bag.
- * @return {number} the number of elements in this bag.
- */
- size(): number;
- /**
- * Returns true if this bag contains no elements.
- * @return {boolean} true if this bag contains no elements.
- */
- isEmpty(): boolean;
- /**
- * Removes all of the elements from this bag.
- */
- clear(): void;
-}
diff --git a/dist/lib/Bag.js b/dist/lib/Bag.js
deleted file mode 100644
index 2b904b3..0000000
--- a/dist/lib/Bag.js
+++ /dev/null
@@ -1,185 +0,0 @@
-"use strict";
-var util = require('./util');
-var Dictionary_1 = require('./Dictionary');
-var Set_1 = require('./Set');
-var Bag = (function () {
- /**
- * Creates an empty bag.
- * @class A bag is a special kind of set in which members are
- * allowed to appear more than once.
- * If the inserted elements are custom objects a function
- * which converts elements to unique strings must be provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert elements to strings. If the elements aren't strings or if toString()
- * is not appropriate, a custom function which receives an object and returns a
- * unique string must be provided.
- */
- function Bag(toStrFunction) {
- this.toStrF = toStrFunction || util.defaultToString;
- this.dictionary = new Dictionary_1.default(this.toStrF);
- this.nElements = 0;
- }
- /**
- * Adds nCopies of the specified object to this bag.
- * @param {Object} element element to add.
- * @param {number=} nCopies the number of copies to add, if this argument is
- * undefined 1 copy is added.
- * @return {boolean} true unless element is undefined.
- */
- Bag.prototype.add = function (element, nCopies) {
- if (nCopies === void 0) { nCopies = 1; }
- if (util.isUndefined(element) || nCopies <= 0) {
- return false;
- }
- if (!this.contains(element)) {
- var node = {
- value: element,
- copies: nCopies
- };
- this.dictionary.setValue(element, node);
- }
- else {
- this.dictionary.getValue(element).copies += nCopies;
- }
- this.nElements += nCopies;
- return true;
- };
- /**
- * Counts the number of copies of the specified object in this bag.
- * @param {Object} element the object to search for..
- * @return {number} the number of copies of the object, 0 if not found
- */
- Bag.prototype.count = function (element) {
- if (!this.contains(element)) {
- return 0;
- }
- else {
- return this.dictionary.getValue(element).copies;
- }
- };
- /**
- * Returns true if this bag contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this bag contains the specified element,
- * false otherwise.
- */
- Bag.prototype.contains = function (element) {
- return this.dictionary.containsKey(element);
- };
- /**
- * Removes nCopies of the specified object to this bag.
- * If the number of copies to remove is greater than the actual number
- * of copies in the Bag, all copies are removed.
- * @param {Object} element element to remove.
- * @param {number=} nCopies the number of copies to remove, if this argument is
- * undefined 1 copy is removed.
- * @return {boolean} true if at least 1 element was removed.
- */
- Bag.prototype.remove = function (element, nCopies) {
- if (nCopies === void 0) { nCopies = 1; }
- if (util.isUndefined(element) || nCopies <= 0) {
- return false;
- }
- if (!this.contains(element)) {
- return false;
- }
- else {
- var node = this.dictionary.getValue(element);
- if (nCopies > node.copies) {
- this.nElements -= node.copies;
- }
- else {
- this.nElements -= nCopies;
- }
- node.copies -= nCopies;
- if (node.copies <= 0) {
- this.dictionary.remove(element);
- }
- return true;
- }
- };
- /**
- * Returns an array containing all of the elements in this big in arbitrary order,
- * including multiple copies.
- * @return {Array} an array containing all of the elements in this bag.
- */
- Bag.prototype.toArray = function () {
- var a = [];
- var values = this.dictionary.values();
- for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
- var node = values_1[_i];
- var element = node.value;
- var copies = node.copies;
- for (var j = 0; j < copies; j++) {
- a.push(element);
- }
- }
- return a;
- };
- /**
- * Returns a set of unique elements in this bag.
- * @return {collections.Set} a set of unique elements in this bag.
- */
- Bag.prototype.toSet = function () {
- var toret = new Set_1.default(this.toStrF);
- var elements = this.dictionary.values();
- for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) {
- var ele = elements_1[_i];
- var value = ele.value;
- toret.add(value);
- }
- return toret;
- };
- /**
- * Executes the provided function once for each element
- * present in this bag, including multiple copies.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element. To break the iteration you can
- * optionally return false.
- */
- Bag.prototype.forEach = function (callback) {
- this.dictionary.forEach(function (k, v) {
- var value = v.value;
- var copies = v.copies;
- for (var i = 0; i < copies; i++) {
- if (callback(value) === false) {
- return false;
- }
- }
- return true;
- });
- };
- /**
- * Returns the number of elements in this bag.
- * @return {number} the number of elements in this bag.
- */
- Bag.prototype.size = function () {
- return this.nElements;
- };
- /**
- * Returns true if this bag contains no elements.
- * @return {boolean} true if this bag contains no elements.
- */
- Bag.prototype.isEmpty = function () {
- return this.nElements === 0;
- };
- /**
- * Removes all of the elements from this bag.
- */
- Bag.prototype.clear = function () {
- this.nElements = 0;
- this.dictionary.clear();
- };
- return Bag;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Bag; // End of bag
-//# sourceMappingURL=Bag.js.map
\ No newline at end of file
diff --git a/dist/lib/Bag.js.map b/dist/lib/Bag.js.map
deleted file mode 100644
index 728157b..0000000
--- a/dist/lib/Bag.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Bag.js","sourceRoot":"","sources":["../../src/lib/Bag.ts"],"names":[],"mappings":";AAAA,IAAY,IAAI,WAAM,QAAQ,CAAC,CAAA;AAC/B,2BAAuB,cAAc,CAAC,CAAA;AACtC,oBAAgB,OAAO,CAAC,CAAA;AAExB;IAMI;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAAY,aAAmC;QAC3C,IAAI,CAAC,MAAM,GAAG,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAU,CAAS,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACvB,CAAC;IAGD;;;;;;MAME;IACF,iBAAG,GAAH,UAAI,OAAU,EAAE,OAAmB;QAAnB,uBAAmB,GAAnB,WAAmB;QAE/B,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAM,IAAI,GAAG;gBACT,KAAK,EAAE,OAAO;gBACd,MAAM,EAAE,OAAO;aAClB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC;IAChB,CAAC;IAED;;;;MAIE;IACF,mBAAK,GAAL,UAAM,OAAU;QAEZ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC;QACb,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QACpD,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,sBAAQ,GAAR,UAAS,OAAU;QACf,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;MAQE;IACF,oBAAM,GAAN,UAAO,OAAU,EAAE,OAAmB;QAAnB,uBAAmB,GAAnB,WAAmB;QAElC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,IAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/C,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;YAClC,CAAC;YAAC,IAAI,CAAC,CAAC;gBACJ,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;YACvB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,qBAAO,GAAP;QACI,IAAM,CAAC,GAAa,EAAE,CAAC;QACvB,IAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACxC,GAAG,CAAC,CAAe,UAAM,EAAN,iBAAM,EAAN,oBAAM,EAAN,IAAM,CAAC;YAArB,IAAM,IAAI,eAAA;YACX,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YAC3B,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;SACJ;QACD,MAAM,CAAC,CAAC,CAAC;IACb,CAAC;IAED;;;OAGG;IACH,mBAAK,GAAL;QACI,IAAM,KAAK,GAAG,IAAI,aAAG,CAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC1C,GAAG,CAAC,CAAc,UAAQ,EAAR,qBAAQ,EAAR,sBAAQ,EAAR,IAAQ,CAAC;YAAtB,IAAM,GAAG,iBAAA;YACV,IAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACpB;QACD,MAAM,CAAC,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,qBAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAS,CAAC,EAAE,CAAC;YACjC,IAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACtB,IAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACxB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;oBAC5B,MAAM,CAAC,KAAK,CAAC;gBACjB,CAAC;YACL,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IACD;;;OAGG;IACH,kBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,qBAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,mBAAK,GAAL;QACI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEL,UAAC;AAAD,CAAC,AA7LD,IA6LC;AA7LD;qBA6LC,CAAA,CAAA,aAAa"}
\ No newline at end of file
diff --git a/dist/lib/Dictionary.d.ts b/dist/lib/Dictionary.d.ts
deleted file mode 100644
index 84e446e..0000000
--- a/dist/lib/Dictionary.d.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-export interface IDictionaryPair {
- key: K;
- value: V;
-}
-export default class Dictionary {
- /**
- * Object holding the key-value pairs.
- * @type {Object}
- * @private
- */
- protected table: {
- [key: string]: IDictionaryPair;
- };
- /**
- * Number of elements in the list.
- * @type {number}
- * @private
- */
- protected nElements: number;
- /**
- * Function used to convert keys to strings.
- * @type {function(Object):string}
- * @protected
- */
- protected toStr: (key: K) => string;
- /**
- * Creates an empty dictionary.
- * @class Dictionaries map keys to values; each key can map to at most one value.
- * This implementation accepts any kind of objects as keys.
- *
- * If the keys are custom objects a function which converts keys to unique
- * strings must be provided. Example:
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- */
- constructor(toStrFunction?: (key: K) => string);
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns undefined if this dictionary contains no mapping for this key.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * undefined if the map contains no mapping for this key.
- */
- getValue(key: K): V;
- /**
- * Associates the specified value with the specified key in this dictionary.
- * If the dictionary previously contained a mapping for this key, the old
- * value is replaced by the specified value.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or undefined if
- * there was no mapping for the key or if the key/value are undefined.
- */
- setValue(key: K, value: V): V;
- /**
- * Removes the mapping for this key from this dictionary if it is present.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @return {*} previous value associated with specified key, or undefined if
- * there was no mapping for key.
- */
- remove(key: K): V;
- /**
- * Returns an array containing all of the keys in this dictionary.
- * @return {Array} an array containing all of the keys in this dictionary.
- */
- keys(): K[];
- /**
- * Returns an array containing all of the values in this dictionary.
- * @return {Array} an array containing all of the values in this dictionary.
- */
- values(): V[];
- /**
- * Executes the provided function once for each key-value pair
- * present in this dictionary.
- * @param {function(Object,Object):*} callback function to execute, it is
- * invoked with two arguments: key and value. To break the iteration you can
- * optionally return false.
- */
- forEach(callback: (key: K, value: V) => any): void;
- /**
- * Returns true if this dictionary contains a mapping for the specified key.
- * @param {Object} key key whose presence in this dictionary is to be
- * tested.
- * @return {boolean} true if this dictionary contains a mapping for the
- * specified key.
- */
- containsKey(key: K): boolean;
- /**
- * Removes all mappings from this dictionary.
- * @this {collections.Dictionary}
- */
- clear(): void;
- /**
- * Returns the number of keys in this dictionary.
- * @return {number} the number of key-value mappings in this dictionary.
- */
- size(): number;
- /**
- * Returns true if this dictionary contains no mappings.
- * @return {boolean} true if this dictionary contains no mappings.
- */
- isEmpty(): boolean;
- toString(): string;
-}
diff --git a/dist/lib/Dictionary.js b/dist/lib/Dictionary.js
deleted file mode 100644
index 21a0895..0000000
--- a/dist/lib/Dictionary.js
+++ /dev/null
@@ -1,177 +0,0 @@
-"use strict";
-var util = require('./util');
-var Dictionary = (function () {
- /**
- * Creates an empty dictionary.
- * @class Dictionaries map keys to values; each key can map to at most one value.
- * This implementation accepts any kind of objects as keys.
- *
- * If the keys are custom objects a function which converts keys to unique
- * strings must be provided. Example:
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- */
- function Dictionary(toStrFunction) {
- this.table = {};
- this.nElements = 0;
- this.toStr = toStrFunction || util.defaultToString;
- }
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns undefined if this dictionary contains no mapping for this key.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * undefined if the map contains no mapping for this key.
- */
- Dictionary.prototype.getValue = function (key) {
- var pair = this.table['$' + this.toStr(key)];
- if (util.isUndefined(pair)) {
- return undefined;
- }
- return pair.value;
- };
- /**
- * Associates the specified value with the specified key in this dictionary.
- * If the dictionary previously contained a mapping for this key, the old
- * value is replaced by the specified value.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or undefined if
- * there was no mapping for the key or if the key/value are undefined.
- */
- Dictionary.prototype.setValue = function (key, value) {
- if (util.isUndefined(key) || util.isUndefined(value)) {
- return undefined;
- }
- var ret;
- var k = '$' + this.toStr(key);
- var previousElement = this.table[k];
- if (util.isUndefined(previousElement)) {
- this.nElements++;
- ret = undefined;
- }
- else {
- ret = previousElement.value;
- }
- this.table[k] = {
- key: key,
- value: value
- };
- return ret;
- };
- /**
- * Removes the mapping for this key from this dictionary if it is present.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @return {*} previous value associated with specified key, or undefined if
- * there was no mapping for key.
- */
- Dictionary.prototype.remove = function (key) {
- var k = '$' + this.toStr(key);
- var previousElement = this.table[k];
- if (!util.isUndefined(previousElement)) {
- delete this.table[k];
- this.nElements--;
- return previousElement.value;
- }
- return undefined;
- };
- /**
- * Returns an array containing all of the keys in this dictionary.
- * @return {Array} an array containing all of the keys in this dictionary.
- */
- Dictionary.prototype.keys = function () {
- var array = [];
- for (var name_1 in this.table) {
- if (util.has(this.table, name_1)) {
- var pair = this.table[name_1];
- array.push(pair.key);
- }
- }
- return array;
- };
- /**
- * Returns an array containing all of the values in this dictionary.
- * @return {Array} an array containing all of the values in this dictionary.
- */
- Dictionary.prototype.values = function () {
- var array = [];
- for (var name_2 in this.table) {
- if (util.has(this.table, name_2)) {
- var pair = this.table[name_2];
- array.push(pair.value);
- }
- }
- return array;
- };
- /**
- * Executes the provided function once for each key-value pair
- * present in this dictionary.
- * @param {function(Object,Object):*} callback function to execute, it is
- * invoked with two arguments: key and value. To break the iteration you can
- * optionally return false.
- */
- Dictionary.prototype.forEach = function (callback) {
- for (var name_3 in this.table) {
- if (util.has(this.table, name_3)) {
- var pair = this.table[name_3];
- var ret = callback(pair.key, pair.value);
- if (ret === false) {
- return;
- }
- }
- }
- };
- /**
- * Returns true if this dictionary contains a mapping for the specified key.
- * @param {Object} key key whose presence in this dictionary is to be
- * tested.
- * @return {boolean} true if this dictionary contains a mapping for the
- * specified key.
- */
- Dictionary.prototype.containsKey = function (key) {
- return !util.isUndefined(this.getValue(key));
- };
- /**
- * Removes all mappings from this dictionary.
- * @this {collections.Dictionary}
- */
- Dictionary.prototype.clear = function () {
- this.table = {};
- this.nElements = 0;
- };
- /**
- * Returns the number of keys in this dictionary.
- * @return {number} the number of key-value mappings in this dictionary.
- */
- Dictionary.prototype.size = function () {
- return this.nElements;
- };
- /**
- * Returns true if this dictionary contains no mappings.
- * @return {boolean} true if this dictionary contains no mappings.
- */
- Dictionary.prototype.isEmpty = function () {
- return this.nElements <= 0;
- };
- Dictionary.prototype.toString = function () {
- var toret = '{';
- this.forEach(function (k, v) {
- toret += "\n\t" + k + " : " + v;
- });
- return toret + '\n}';
- };
- return Dictionary;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Dictionary; // End of dictionary
-//# sourceMappingURL=Dictionary.js.map
\ No newline at end of file
diff --git a/dist/lib/Dictionary.js.map b/dist/lib/Dictionary.js.map
deleted file mode 100644
index 064192d..0000000
--- a/dist/lib/Dictionary.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Dictionary.js","sourceRoot":"","sources":["../../src/lib/Dictionary.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/FactoryDictionary.d.ts b/dist/lib/FactoryDictionary.d.ts
deleted file mode 100644
index 9ddeac2..0000000
--- a/dist/lib/FactoryDictionary.d.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import Dictionary from './Dictionary';
-export default class FactoryDictionary extends Dictionary {
- /**
- * Factory to create default values.
- * @type {function(Object):string}
- * @protected
- */
- protected defaultFactoryFunction: () => V;
- /**
- * Creates an empty dictionary.
- * @class Dictionaries map keys to values; each key can map to at most one value.
- * This implementation accepts any kind of objects as keys.
- *
- * The default factory function should return a new object of the provided
- * type. Example:
- *
- * function petFactory() {
- * return new Pet();
- * }
- *
- *
- * If the keys are custom objects a function which converts keys to unique
- * strings must be provided. Example:
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * @constructor
- * @param {function():V=} defaultFactoryFunction function used to create a
- * default object.
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- */
- constructor(defaultFactoryFunction: () => V, toStrFunction?: (key: K) => string);
- /**
- * Associates the specified default value with the specified key in this dictionary,
- * if it didn't contain the key yet. If the key existed, the existing value will be used.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} defaultValue default value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or the default value,
- * if the key didn't exist yet.
- */
- setDefault(key: K, defaultValue: V): V;
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns a default value created by the factory passed in the constructor,
- * if this dictionary contains no mapping for this key. The missing key will
- * automatically be added to the dictionary.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * a default value if the map contains no mapping for this key.
- */
- getValue(key: K): V;
-}
diff --git a/dist/lib/FactoryDictionary.js b/dist/lib/FactoryDictionary.js
deleted file mode 100644
index f78a533..0000000
--- a/dist/lib/FactoryDictionary.js
+++ /dev/null
@@ -1,76 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Dictionary_1 = require('./Dictionary');
-var util = require('./util');
-var FactoryDictionary = (function (_super) {
- __extends(FactoryDictionary, _super);
- /**
- * Creates an empty dictionary.
- * @class Dictionaries map keys to values; each key can map to at most one value.
- * This implementation accepts any kind of objects as keys.
- *
- * The default factory function should return a new object of the provided
- * type. Example:
- *
- * function petFactory() {
- * return new Pet();
- * }
- *
- *
- * If the keys are custom objects a function which converts keys to unique
- * strings must be provided. Example:
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * @constructor
- * @param {function():V=} defaultFactoryFunction function used to create a
- * default object.
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- */
- function FactoryDictionary(defaultFactoryFunction, toStrFunction) {
- _super.call(this, toStrFunction);
- this.defaultFactoryFunction = defaultFactoryFunction;
- }
- /**
- * Associates the specified default value with the specified key in this dictionary,
- * if it didn't contain the key yet. If the key existed, the existing value will be used.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} defaultValue default value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or the default value,
- * if the key didn't exist yet.
- */
- FactoryDictionary.prototype.setDefault = function (key, defaultValue) {
- var currentValue = _super.prototype.getValue.call(this, key);
- if (util.isUndefined(currentValue)) {
- this.setValue(key, defaultValue);
- return defaultValue;
- }
- return currentValue;
- };
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns a default value created by the factory passed in the constructor,
- * if this dictionary contains no mapping for this key. The missing key will
- * automatically be added to the dictionary.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * a default value if the map contains no mapping for this key.
- */
- FactoryDictionary.prototype.getValue = function (key) {
- return this.setDefault(key, this.defaultFactoryFunction());
- };
- return FactoryDictionary;
-}(Dictionary_1.default));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = FactoryDictionary;
-//# sourceMappingURL=FactoryDictionary.js.map
\ No newline at end of file
diff --git a/dist/lib/FactoryDictionary.js.map b/dist/lib/FactoryDictionary.js.map
deleted file mode 100644
index 20ba3f9..0000000
--- a/dist/lib/FactoryDictionary.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"FactoryDictionary.js","sourceRoot":"","sources":["../../src/lib/FactoryDictionary.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAuB,cAAc,CAAC,CAAA;AACtC,IAAY,IAAI,WAAM,QAAQ,CAAC,CAAA;AAE/B;IAAqD,qCAAgB;IASjE;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,2BAAY,sBAA+B,EAAE,aAAkC;QAC3E,kBAAM,aAAa,CAAC,CAAC;QAErB,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACzD,CAAC;IAGD;;;;;;;;OAQG;IACH,sCAAU,GAAV,UAAW,GAAM,EAAE,YAAe;QAC9B,IAAM,YAAY,GAAM,gBAAK,CAAC,QAAQ,YAAC,GAAG,CAAC,CAAC;QAE5C,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAEjC,MAAM,CAAC,YAAY,CAAC;QACxB,CAAC;QAED,MAAM,CAAC,YAAY,CAAC;IACxB,CAAC;IAED;;;;;;;;OAQG;IACH,oCAAQ,GAAR,UAAS,GAAM;QACX,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC/D,CAAC;IACL,wBAAC;AAAD,CAAC,AA7ED,CAAqD,oBAAU,GA6E9D;AA7ED;mCA6EC,CAAA"}
\ No newline at end of file
diff --git a/dist/lib/Heap.d.ts b/dist/lib/Heap.d.ts
deleted file mode 100644
index f2c7632..0000000
--- a/dist/lib/Heap.d.ts
+++ /dev/null
@@ -1,151 +0,0 @@
-import * as collections from './util';
-export default class Heap {
- /**
- * Array used to store the elements od the heap.
- * @type {Array.}
- * @private
- */
- private data;
- /**
- * Function used to compare elements.
- * @type {function(Object,Object):number}
- * @private
- */
- private compare;
- /**
- * Creates an empty Heap.
- * @class
- * A heap is a binary tree, where the nodes maintain the heap property:
- * each node is smaller than each of its children and therefore a MinHeap
- * This implementation uses an array to store elements.
- * If the inserted elements are custom objects a compare function must be provided,
- * at construction time, otherwise the <=, === and >= operators are
- * used to compare elements. Example:
- *
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- *
- * If a Max-Heap is wanted (greater elements on top) you can a provide a
- * reverse compare function to accomplish that behavior. Example:
- *
- *
- * function reverseCompare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return 1;
- * } if (a is greater than b by the ordering criterion) {
- * return -1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two elements. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- constructor(compareFunction?: collections.ICompareFunction);
- /**
- * Returns the index of the left child of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the left child
- * for.
- * @return {number} The index of the left child.
- * @private
- */
- private leftChildIndex(nodeIndex);
- /**
- * Returns the index of the right child of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the right child
- * for.
- * @return {number} The index of the right child.
- * @private
- */
- private rightChildIndex(nodeIndex);
- /**
- * Returns the index of the parent of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the parent for.
- * @return {number} The index of the parent.
- * @private
- */
- private parentIndex(nodeIndex);
- /**
- * Returns the index of the smaller child node (if it exists).
- * @param {number} leftChild left child index.
- * @param {number} rightChild right child index.
- * @return {number} the index with the minimum value or -1 if it doesn't
- * exists.
- * @private
- */
- private minIndex(leftChild, rightChild);
- /**
- * Moves the node at the given index up to its proper place in the heap.
- * @param {number} index The index of the node to move up.
- * @private
- */
- private siftUp(index);
- /**
- * Moves the node at the given index down to its proper place in the heap.
- * @param {number} nodeIndex The index of the node to move down.
- * @private
- */
- private siftDown(nodeIndex);
- /**
- * Retrieves but does not remove the root element of this heap.
- * @return {*} The value at the root of the heap. Returns undefined if the
- * heap is empty.
- */
- peek(): T;
- /**
- * Adds the given element into the heap.
- * @param {*} element the element.
- * @return true if the element was added or fals if it is undefined.
- */
- add(element: T): boolean;
- /**
- * Retrieves and removes the root element of this heap.
- * @return {*} The value removed from the root of the heap. Returns
- * undefined if the heap is empty.
- */
- removeRoot(): T;
- /**
- * Returns true if this heap contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this Heap contains the specified element, false
- * otherwise.
- */
- contains(element: T): boolean;
- /**
- * Returns the number of elements in this heap.
- * @return {number} the number of elements in this heap.
- */
- size(): number;
- /**
- * Checks if this heap is empty.
- * @return {boolean} true if and only if this heap contains no items; false
- * otherwise.
- */
- isEmpty(): boolean;
- /**
- * Removes all of the elements from this heap.
- */
- clear(): void;
- /**
- * Executes the provided function once for each element present in this heap in
- * no particular order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- forEach(callback: collections.ILoopFunction): void;
-}
diff --git a/dist/lib/Heap.js b/dist/lib/Heap.js
deleted file mode 100644
index 7202daa..0000000
--- a/dist/lib/Heap.js
+++ /dev/null
@@ -1,227 +0,0 @@
-"use strict";
-var collections = require('./util');
-var arrays = require('./arrays');
-var Heap = (function () {
- /**
- * Creates an empty Heap.
- * @class
- * A heap is a binary tree, where the nodes maintain the heap property:
- * each node is smaller than each of its children and therefore a MinHeap
- * This implementation uses an array to store elements.
- * If the inserted elements are custom objects a compare function must be provided,
- * at construction time, otherwise the <=, === and >= operators are
- * used to compare elements. Example:
- *
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- *
- * If a Max-Heap is wanted (greater elements on top) you can a provide a
- * reverse compare function to accomplish that behavior. Example:
- *
- *
- * function reverseCompare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return 1;
- * } if (a is greater than b by the ordering criterion) {
- * return -1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two elements. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- function Heap(compareFunction) {
- /**
- * Array used to store the elements od the heap.
- * @type {Array.}
- * @private
- */
- this.data = [];
- this.compare = compareFunction || collections.defaultCompare;
- }
- /**
- * Returns the index of the left child of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the left child
- * for.
- * @return {number} The index of the left child.
- * @private
- */
- Heap.prototype.leftChildIndex = function (nodeIndex) {
- return (2 * nodeIndex) + 1;
- };
- /**
- * Returns the index of the right child of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the right child
- * for.
- * @return {number} The index of the right child.
- * @private
- */
- Heap.prototype.rightChildIndex = function (nodeIndex) {
- return (2 * nodeIndex) + 2;
- };
- /**
- * Returns the index of the parent of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the parent for.
- * @return {number} The index of the parent.
- * @private
- */
- Heap.prototype.parentIndex = function (nodeIndex) {
- return Math.floor((nodeIndex - 1) / 2);
- };
- /**
- * Returns the index of the smaller child node (if it exists).
- * @param {number} leftChild left child index.
- * @param {number} rightChild right child index.
- * @return {number} the index with the minimum value or -1 if it doesn't
- * exists.
- * @private
- */
- Heap.prototype.minIndex = function (leftChild, rightChild) {
- if (rightChild >= this.data.length) {
- if (leftChild >= this.data.length) {
- return -1;
- }
- else {
- return leftChild;
- }
- }
- else {
- if (this.compare(this.data[leftChild], this.data[rightChild]) <= 0) {
- return leftChild;
- }
- else {
- return rightChild;
- }
- }
- };
- /**
- * Moves the node at the given index up to its proper place in the heap.
- * @param {number} index The index of the node to move up.
- * @private
- */
- Heap.prototype.siftUp = function (index) {
- var parent = this.parentIndex(index);
- while (index > 0 && this.compare(this.data[parent], this.data[index]) > 0) {
- arrays.swap(this.data, parent, index);
- index = parent;
- parent = this.parentIndex(index);
- }
- };
- /**
- * Moves the node at the given index down to its proper place in the heap.
- * @param {number} nodeIndex The index of the node to move down.
- * @private
- */
- Heap.prototype.siftDown = function (nodeIndex) {
- //smaller child index
- var min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex));
- while (min >= 0 && this.compare(this.data[nodeIndex], this.data[min]) > 0) {
- arrays.swap(this.data, min, nodeIndex);
- nodeIndex = min;
- min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex));
- }
- };
- /**
- * Retrieves but does not remove the root element of this heap.
- * @return {*} The value at the root of the heap. Returns undefined if the
- * heap is empty.
- */
- Heap.prototype.peek = function () {
- if (this.data.length > 0) {
- return this.data[0];
- }
- else {
- return undefined;
- }
- };
- /**
- * Adds the given element into the heap.
- * @param {*} element the element.
- * @return true if the element was added or fals if it is undefined.
- */
- Heap.prototype.add = function (element) {
- if (collections.isUndefined(element)) {
- return undefined;
- }
- this.data.push(element);
- this.siftUp(this.data.length - 1);
- return true;
- };
- /**
- * Retrieves and removes the root element of this heap.
- * @return {*} The value removed from the root of the heap. Returns
- * undefined if the heap is empty.
- */
- Heap.prototype.removeRoot = function () {
- if (this.data.length > 0) {
- var obj = this.data[0];
- this.data[0] = this.data[this.data.length - 1];
- this.data.splice(this.data.length - 1, 1);
- if (this.data.length > 0) {
- this.siftDown(0);
- }
- return obj;
- }
- return undefined;
- };
- /**
- * Returns true if this heap contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this Heap contains the specified element, false
- * otherwise.
- */
- Heap.prototype.contains = function (element) {
- var equF = collections.compareToEquals(this.compare);
- return arrays.contains(this.data, element, equF);
- };
- /**
- * Returns the number of elements in this heap.
- * @return {number} the number of elements in this heap.
- */
- Heap.prototype.size = function () {
- return this.data.length;
- };
- /**
- * Checks if this heap is empty.
- * @return {boolean} true if and only if this heap contains no items; false
- * otherwise.
- */
- Heap.prototype.isEmpty = function () {
- return this.data.length <= 0;
- };
- /**
- * Removes all of the elements from this heap.
- */
- Heap.prototype.clear = function () {
- this.data.length = 0;
- };
- /**
- * Executes the provided function once for each element present in this heap in
- * no particular order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- Heap.prototype.forEach = function (callback) {
- arrays.forEach(this.data, callback);
- };
- return Heap;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Heap;
-//# sourceMappingURL=Heap.js.map
\ No newline at end of file
diff --git a/dist/lib/Heap.js.map b/dist/lib/Heap.js.map
deleted file mode 100644
index 3b155e7..0000000
--- a/dist/lib/Heap.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Heap.js","sourceRoot":"","sources":["../../src/lib/Heap.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/LinkedDictionary.d.ts b/dist/lib/LinkedDictionary.d.ts
deleted file mode 100644
index 299a571..0000000
--- a/dist/lib/LinkedDictionary.d.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { default as Dictionary } from './Dictionary';
-export default class LinkedDictionary extends Dictionary {
- private head;
- private tail;
- constructor(toStrFunction?: (key: K) => string);
- /**
- * Inserts the new node to the 'tail' of the list, updating the
- * neighbors, and moving 'this.tail' (the End of List indicator) that
- * to the end.
- */
- private appendToTail(entry);
- /**
- * Retrieves a linked dictionary from the table internally
- */
- private getLinkedDictionaryPair(key);
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns undefined if this dictionary contains no mapping for this key.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * undefined if the map contains no mapping for this key.
- */
- getValue(key: K): V;
- /**
- * Removes the mapping for this key from this dictionary if it is present.
- * Also, if a value is present for this key, the entry is removed from the
- * insertion ordering.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @return {*} previous value associated with specified key, or undefined if
- * there was no mapping for key.
- */
- remove(key: K): V;
- /**
- * Removes all mappings from this LinkedDictionary.
- * @this {collections.LinkedDictionary}
- */
- clear(): void;
- /**
- * Internal function used when updating an existing KeyValue pair.
- * It places the new value indexed by key into the table, but maintains
- * its place in the linked ordering.
- */
- private replace(oldPair, newPair);
- /**
- * Associates the specified value with the specified key in this dictionary.
- * If the dictionary previously contained a mapping for this key, the old
- * value is replaced by the specified value.
- * Updating of a key that already exists maintains its place in the
- * insertion order into the map.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or undefined if
- * there was no mapping for the key or if the key/value are undefined.
- */
- setValue(key: K, value: V): V;
- /**
- * Returns an array containing all of the keys in this LinkedDictionary, ordered
- * by insertion order.
- * @return {Array} an array containing all of the keys in this LinkedDictionary,
- * ordered by insertion order.
- */
- keys(): K[];
- /**
- * Returns an array containing all of the values in this LinkedDictionary, ordered by
- * insertion order.
- * @return {Array} an array containing all of the values in this LinkedDictionary,
- * ordered by insertion order.
- */
- values(): V[];
- /**
- * Executes the provided function once for each key-value pair
- * present in this LinkedDictionary. It is done in the order of insertion
- * into the LinkedDictionary
- * @param {function(Object,Object):*} callback function to execute, it is
- * invoked with two arguments: key and value. To break the iteration you can
- * optionally return false.
- */
- forEach(callback: (key: K, value: V) => any): void;
-}
diff --git a/dist/lib/LinkedDictionary.js b/dist/lib/LinkedDictionary.js
deleted file mode 100644
index 29efb5b..0000000
--- a/dist/lib/LinkedDictionary.js
+++ /dev/null
@@ -1,218 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Dictionary_1 = require('./Dictionary');
-var util = require('./util');
-/**
- * This class is used by the LinkedDictionary Internally
- * Has to be a class, not an interface, because it needs to have
- * the 'unlink' function defined.
- */
-var LinkedDictionaryPair = (function () {
- function LinkedDictionaryPair(key, value) {
- this.key = key;
- this.value = value;
- }
- LinkedDictionaryPair.prototype.unlink = function () {
- this.prev.next = this.next;
- this.next.prev = this.prev;
- };
- return LinkedDictionaryPair;
-}());
-var LinkedDictionary = (function (_super) {
- __extends(LinkedDictionary, _super);
- function LinkedDictionary(toStrFunction) {
- _super.call(this, toStrFunction);
- this.head = new LinkedDictionaryPair(null, null);
- this.tail = new LinkedDictionaryPair(null, null);
- this.head.next = this.tail;
- this.tail.prev = this.head;
- }
- /**
- * Inserts the new node to the 'tail' of the list, updating the
- * neighbors, and moving 'this.tail' (the End of List indicator) that
- * to the end.
- */
- LinkedDictionary.prototype.appendToTail = function (entry) {
- var lastNode = this.tail.prev;
- lastNode.next = entry;
- entry.prev = lastNode;
- entry.next = this.tail;
- this.tail.prev = entry;
- };
- /**
- * Retrieves a linked dictionary from the table internally
- */
- LinkedDictionary.prototype.getLinkedDictionaryPair = function (key) {
- if (util.isUndefined(key)) {
- return undefined;
- }
- var k = '$' + this.toStr(key);
- var pair = (this.table[k]);
- return pair;
- };
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns undefined if this dictionary contains no mapping for this key.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * undefined if the map contains no mapping for this key.
- */
- LinkedDictionary.prototype.getValue = function (key) {
- var pair = this.getLinkedDictionaryPair(key);
- if (!util.isUndefined(pair)) {
- return pair.value;
- }
- return undefined;
- };
- /**
- * Removes the mapping for this key from this dictionary if it is present.
- * Also, if a value is present for this key, the entry is removed from the
- * insertion ordering.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @return {*} previous value associated with specified key, or undefined if
- * there was no mapping for key.
- */
- LinkedDictionary.prototype.remove = function (key) {
- var pair = this.getLinkedDictionaryPair(key);
- if (!util.isUndefined(pair)) {
- _super.prototype.remove.call(this, key); // This will remove it from the table
- pair.unlink(); // This will unlink it from the chain
- return pair.value;
- }
- return undefined;
- };
- /**
- * Removes all mappings from this LinkedDictionary.
- * @this {collections.LinkedDictionary}
- */
- LinkedDictionary.prototype.clear = function () {
- _super.prototype.clear.call(this);
- this.head.next = this.tail;
- this.tail.prev = this.head;
- };
- /**
- * Internal function used when updating an existing KeyValue pair.
- * It places the new value indexed by key into the table, but maintains
- * its place in the linked ordering.
- */
- LinkedDictionary.prototype.replace = function (oldPair, newPair) {
- var k = '$' + this.toStr(newPair.key);
- // set the new Pair's links to existingPair's links
- newPair.next = oldPair.next;
- newPair.prev = oldPair.prev;
- // Delete Existing Pair from the table, unlink it from chain.
- // As a result, the nElements gets decremented by this operation
- this.remove(oldPair.key);
- // Link new Pair in place of where oldPair was,
- // by pointing the old pair's neighbors to it.
- newPair.prev.next = newPair;
- newPair.next.prev = newPair;
- this.table[k] = newPair;
- // To make up for the fact that the number of elements was decremented,
- // We need to increase it by one.
- ++this.nElements;
- };
- /**
- * Associates the specified value with the specified key in this dictionary.
- * If the dictionary previously contained a mapping for this key, the old
- * value is replaced by the specified value.
- * Updating of a key that already exists maintains its place in the
- * insertion order into the map.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or undefined if
- * there was no mapping for the key or if the key/value are undefined.
- */
- LinkedDictionary.prototype.setValue = function (key, value) {
- if (util.isUndefined(key) || util.isUndefined(value)) {
- return undefined;
- }
- var existingPair = this.getLinkedDictionaryPair(key);
- var newPair = new LinkedDictionaryPair(key, value);
- var k = '$' + this.toStr(key);
- // If there is already an element for that key, we
- // keep it's place in the LinkedList
- if (!util.isUndefined(existingPair)) {
- this.replace(existingPair, newPair);
- return existingPair.value;
- }
- else {
- this.appendToTail(newPair);
- this.table[k] = newPair;
- ++this.nElements;
- return undefined;
- }
- };
- /**
- * Returns an array containing all of the keys in this LinkedDictionary, ordered
- * by insertion order.
- * @return {Array} an array containing all of the keys in this LinkedDictionary,
- * ordered by insertion order.
- */
- LinkedDictionary.prototype.keys = function () {
- var array = [];
- this.forEach(function (key, value) {
- array.push(key);
- });
- return array;
- };
- /**
- * Returns an array containing all of the values in this LinkedDictionary, ordered by
- * insertion order.
- * @return {Array} an array containing all of the values in this LinkedDictionary,
- * ordered by insertion order.
- */
- LinkedDictionary.prototype.values = function () {
- var array = [];
- this.forEach(function (key, value) {
- array.push(value);
- });
- return array;
- };
- /**
- * Executes the provided function once for each key-value pair
- * present in this LinkedDictionary. It is done in the order of insertion
- * into the LinkedDictionary
- * @param {function(Object,Object):*} callback function to execute, it is
- * invoked with two arguments: key and value. To break the iteration you can
- * optionally return false.
- */
- LinkedDictionary.prototype.forEach = function (callback) {
- var crawlNode = this.head.next;
- while (crawlNode.next != null) {
- var ret = callback(crawlNode.key, crawlNode.value);
- if (ret === false) {
- return;
- }
- crawlNode = crawlNode.next;
- }
- };
- return LinkedDictionary;
-}(Dictionary_1.default));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = LinkedDictionary; // End of LinkedDictionary
-// /**
-// * Returns true if this dictionary is equal to the given dictionary.
-// * Two dictionaries are equal if they contain the same mappings.
-// * @param {collections.Dictionary} other the other dictionary.
-// * @param {function(Object,Object):boolean=} valuesEqualFunction optional
-// * function used to check if two values are equal.
-// * @return {boolean} true if this dictionary is equal to the given dictionary.
-// */
-// collections.Dictionary.prototype.equals = function(other,valuesEqualFunction) {
-// const eqF = valuesEqualFunction || collections.defaultEquals;
-// if(!(other instanceof collections.Dictionary)){
-// return false;
-// }
-// if(this.size() !== other.size()){
-// return false;
-// }
-// return this.equalsAux(this.firstNode,other.firstNode,eqF);
-// }
-//# sourceMappingURL=LinkedDictionary.js.map
\ No newline at end of file
diff --git a/dist/lib/LinkedDictionary.js.map b/dist/lib/LinkedDictionary.js.map
deleted file mode 100644
index 004af19..0000000
--- a/dist/lib/LinkedDictionary.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"LinkedDictionary.js","sourceRoot":"","sources":["../../src/lib/LinkedDictionary.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/LinkedList.d.ts b/dist/lib/LinkedList.d.ts
deleted file mode 100644
index 6888940..0000000
--- a/dist/lib/LinkedList.d.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-import * as util from './util';
-export interface ILinkedListNode {
- element: T;
- next: ILinkedListNode;
-}
-export default class LinkedList {
- /**
- * First node in the list
- * @type {Object}
- * @private
- */
- firstNode: ILinkedListNode;
- /**
- * Last node in the list
- * @type {Object}
- * @private
- */
- private lastNode;
- /**
- * Number of elements in the list
- * @type {number}
- * @private
- */
- private nElements;
- /**
- * Creates an empty Linked List.
- * @class A linked list is a data structure consisting of a group of nodes
- * which together represent a sequence.
- * @constructor
- */
- constructor();
- /**
- * Adds an element to this list.
- * @param {Object} item element to be added.
- * @param {number=} index optional index to add the element. If no index is specified
- * the element is added to the end of this list.
- * @return {boolean} true if the element was added or false if the index is invalid
- * or if the element is undefined.
- */
- add(item: T, index?: number): boolean;
- /**
- * Returns the first element in this list.
- * @return {*} the first element of the list or undefined if the list is
- * empty.
- */
- first(): T;
- /**
- * Returns the last element in this list.
- * @return {*} the last element in the list or undefined if the list is
- * empty.
- */
- last(): T;
- /**
- * Returns the element at the specified position in this list.
- * @param {number} index desired index.
- * @return {*} the element at the given index or undefined if the index is
- * out of bounds.
- */
- elementAtIndex(index: number): T;
- /**
- * Returns the index in this list of the first occurrence of the
- * specified element, or -1 if the List does not contain this element.
- * If the elements inside this list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction Optional
- * function used to check if two elements are equal.
- * @return {number} the index in this list of the first occurrence
- * of the specified element, or -1 if this list does not contain the
- * element.
- */
- indexOf(item: T, equalsFunction?: util.IEqualsFunction): number;
- /**
- * Returns true if this list contains the specified element.
- * If the elements inside the list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction Optional
- * function used to check if two elements are equal.
- * @return {boolean} true if this list contains the specified element, false
- * otherwise.
- */
- contains(item: T, equalsFunction?: util.IEqualsFunction): boolean;
- /**
- * Removes the first occurrence of the specified element in this list.
- * If the elements inside the list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to be removed from this list, if present.
- * @return {boolean} true if the list contained the specified element.
- */
- remove(item: T, equalsFunction?: util.IEqualsFunction): boolean;
- /**
- * Removes all of the elements from this list.
- */
- clear(): void;
- /**
- * Returns true if this list is equal to the given list.
- * Two lists are equal if they have the same elements in the same order.
- * @param {LinkedList} other the other list.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function used to check if two elements are equal. If the elements in the lists
- * are custom objects you should provide a function, otherwise
- * the === operator is used to check equality between elements.
- * @return {boolean} true if this list is equal to the given list.
- */
- equals(other: LinkedList, equalsFunction?: util.IEqualsFunction): boolean;
- /**
- * @private
- */
- private equalsAux(n1, n2, eqF);
- /**
- * Removes the element at the specified position in this list.
- * @param {number} index given index.
- * @return {*} removed element or undefined if the index is out of bounds.
- */
- removeElementAtIndex(index: number): T;
- /**
- * Executes the provided function once for each element present in this list in order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- forEach(callback: util.ILoopFunction): void;
- /**
- * Reverses the order of the elements in this linked list (makes the last
- * element first, and the first element last).
- */
- reverse(): void;
- /**
- * Returns an array containing all of the elements in this list in proper
- * sequence.
- * @return {Array.<*>} an array containing all of the elements in this list,
- * in proper sequence.
- */
- toArray(): T[];
- /**
- * Returns the number of elements in this list.
- * @return {number} the number of elements in this list.
- */
- size(): number;
- /**
- * Returns true if this list contains no elements.
- * @return {boolean} true if this list contains no elements.
- */
- isEmpty(): boolean;
- toString(): string;
- /**
- * @private
- */
- private nodeAtIndex(index);
- /**
- * @private
- */
- private createNode(item);
-}
diff --git a/dist/lib/LinkedList.js b/dist/lib/LinkedList.js
deleted file mode 100644
index 27923df..0000000
--- a/dist/lib/LinkedList.js
+++ /dev/null
@@ -1,378 +0,0 @@
-"use strict";
-var util = require('./util');
-var arrays = require('./arrays');
-var LinkedList = (function () {
- /**
- * Creates an empty Linked List.
- * @class A linked list is a data structure consisting of a group of nodes
- * which together represent a sequence.
- * @constructor
- */
- function LinkedList() {
- /**
- * First node in the list
- * @type {Object}
- * @private
- */
- this.firstNode = null;
- /**
- * Last node in the list
- * @type {Object}
- * @private
- */
- this.lastNode = null;
- /**
- * Number of elements in the list
- * @type {number}
- * @private
- */
- this.nElements = 0;
- }
- /**
- * Adds an element to this list.
- * @param {Object} item element to be added.
- * @param {number=} index optional index to add the element. If no index is specified
- * the element is added to the end of this list.
- * @return {boolean} true if the element was added or false if the index is invalid
- * or if the element is undefined.
- */
- LinkedList.prototype.add = function (item, index) {
- if (util.isUndefined(index)) {
- index = this.nElements;
- }
- if (index < 0 || index > this.nElements || util.isUndefined(item)) {
- return false;
- }
- var newNode = this.createNode(item);
- if (this.nElements === 0) {
- // First node in the list.
- this.firstNode = newNode;
- this.lastNode = newNode;
- }
- else if (index === this.nElements) {
- // Insert at the end.
- this.lastNode.next = newNode;
- this.lastNode = newNode;
- }
- else if (index === 0) {
- // Change first node.
- newNode.next = this.firstNode;
- this.firstNode = newNode;
- }
- else {
- var prev = this.nodeAtIndex(index - 1);
- newNode.next = prev.next;
- prev.next = newNode;
- }
- this.nElements++;
- return true;
- };
- /**
- * Returns the first element in this list.
- * @return {*} the first element of the list or undefined if the list is
- * empty.
- */
- LinkedList.prototype.first = function () {
- if (this.firstNode !== null) {
- return this.firstNode.element;
- }
- return undefined;
- };
- /**
- * Returns the last element in this list.
- * @return {*} the last element in the list or undefined if the list is
- * empty.
- */
- LinkedList.prototype.last = function () {
- if (this.lastNode !== null) {
- return this.lastNode.element;
- }
- return undefined;
- };
- /**
- * Returns the element at the specified position in this list.
- * @param {number} index desired index.
- * @return {*} the element at the given index or undefined if the index is
- * out of bounds.
- */
- LinkedList.prototype.elementAtIndex = function (index) {
- var node = this.nodeAtIndex(index);
- if (node === null) {
- return undefined;
- }
- return node.element;
- };
- /**
- * Returns the index in this list of the first occurrence of the
- * specified element, or -1 if the List does not contain this element.
- * If the elements inside this list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction Optional
- * function used to check if two elements are equal.
- * @return {number} the index in this list of the first occurrence
- * of the specified element, or -1 if this list does not contain the
- * element.
- */
- LinkedList.prototype.indexOf = function (item, equalsFunction) {
- var equalsF = equalsFunction || util.defaultEquals;
- if (util.isUndefined(item)) {
- return -1;
- }
- var currentNode = this.firstNode;
- var index = 0;
- while (currentNode !== null) {
- if (equalsF(currentNode.element, item)) {
- return index;
- }
- index++;
- currentNode = currentNode.next;
- }
- return -1;
- };
- /**
- * Returns true if this list contains the specified element.
- * If the elements inside the list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction Optional
- * function used to check if two elements are equal.
- * @return {boolean} true if this list contains the specified element, false
- * otherwise.
- */
- LinkedList.prototype.contains = function (item, equalsFunction) {
- return (this.indexOf(item, equalsFunction) >= 0);
- };
- /**
- * Removes the first occurrence of the specified element in this list.
- * If the elements inside the list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to be removed from this list, if present.
- * @return {boolean} true if the list contained the specified element.
- */
- LinkedList.prototype.remove = function (item, equalsFunction) {
- var equalsF = equalsFunction || util.defaultEquals;
- if (this.nElements < 1 || util.isUndefined(item)) {
- return false;
- }
- var previous = null;
- var currentNode = this.firstNode;
- while (currentNode !== null) {
- if (equalsF(currentNode.element, item)) {
- if (currentNode === this.firstNode) {
- this.firstNode = this.firstNode.next;
- if (currentNode === this.lastNode) {
- this.lastNode = null;
- }
- }
- else if (currentNode === this.lastNode) {
- this.lastNode = previous;
- previous.next = currentNode.next;
- currentNode.next = null;
- }
- else {
- previous.next = currentNode.next;
- currentNode.next = null;
- }
- this.nElements--;
- return true;
- }
- previous = currentNode;
- currentNode = currentNode.next;
- }
- return false;
- };
- /**
- * Removes all of the elements from this list.
- */
- LinkedList.prototype.clear = function () {
- this.firstNode = null;
- this.lastNode = null;
- this.nElements = 0;
- };
- /**
- * Returns true if this list is equal to the given list.
- * Two lists are equal if they have the same elements in the same order.
- * @param {LinkedList} other the other list.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function used to check if two elements are equal. If the elements in the lists
- * are custom objects you should provide a function, otherwise
- * the === operator is used to check equality between elements.
- * @return {boolean} true if this list is equal to the given list.
- */
- LinkedList.prototype.equals = function (other, equalsFunction) {
- var eqF = equalsFunction || util.defaultEquals;
- if (!(other instanceof LinkedList)) {
- return false;
- }
- if (this.size() !== other.size()) {
- return false;
- }
- return this.equalsAux(this.firstNode, other.firstNode, eqF);
- };
- /**
- * @private
- */
- LinkedList.prototype.equalsAux = function (n1, n2, eqF) {
- while (n1 !== null) {
- if (!eqF(n1.element, n2.element)) {
- return false;
- }
- n1 = n1.next;
- n2 = n2.next;
- }
- return true;
- };
- /**
- * Removes the element at the specified position in this list.
- * @param {number} index given index.
- * @return {*} removed element or undefined if the index is out of bounds.
- */
- LinkedList.prototype.removeElementAtIndex = function (index) {
- if (index < 0 || index >= this.nElements) {
- return undefined;
- }
- var element;
- if (this.nElements === 1) {
- //First node in the list.
- element = this.firstNode.element;
- this.firstNode = null;
- this.lastNode = null;
- }
- else {
- var previous = this.nodeAtIndex(index - 1);
- if (previous === null) {
- element = this.firstNode.element;
- this.firstNode = this.firstNode.next;
- }
- else if (previous.next === this.lastNode) {
- element = this.lastNode.element;
- this.lastNode = previous;
- }
- if (previous !== null) {
- element = previous.next.element;
- previous.next = previous.next.next;
- }
- }
- this.nElements--;
- return element;
- };
- /**
- * Executes the provided function once for each element present in this list in order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- LinkedList.prototype.forEach = function (callback) {
- var currentNode = this.firstNode;
- while (currentNode !== null) {
- if (callback(currentNode.element) === false) {
- break;
- }
- currentNode = currentNode.next;
- }
- };
- /**
- * Reverses the order of the elements in this linked list (makes the last
- * element first, and the first element last).
- */
- LinkedList.prototype.reverse = function () {
- var previous = null;
- var current = this.firstNode;
- var temp = null;
- while (current !== null) {
- temp = current.next;
- current.next = previous;
- previous = current;
- current = temp;
- }
- temp = this.firstNode;
- this.firstNode = this.lastNode;
- this.lastNode = temp;
- };
- /**
- * Returns an array containing all of the elements in this list in proper
- * sequence.
- * @return {Array.<*>} an array containing all of the elements in this list,
- * in proper sequence.
- */
- LinkedList.prototype.toArray = function () {
- var array = [];
- var currentNode = this.firstNode;
- while (currentNode !== null) {
- array.push(currentNode.element);
- currentNode = currentNode.next;
- }
- return array;
- };
- /**
- * Returns the number of elements in this list.
- * @return {number} the number of elements in this list.
- */
- LinkedList.prototype.size = function () {
- return this.nElements;
- };
- /**
- * Returns true if this list contains no elements.
- * @return {boolean} true if this list contains no elements.
- */
- LinkedList.prototype.isEmpty = function () {
- return this.nElements <= 0;
- };
- LinkedList.prototype.toString = function () {
- return arrays.toString(this.toArray());
- };
- /**
- * @private
- */
- LinkedList.prototype.nodeAtIndex = function (index) {
- if (index < 0 || index >= this.nElements) {
- return null;
- }
- if (index === (this.nElements - 1)) {
- return this.lastNode;
- }
- var node = this.firstNode;
- for (var i = 0; i < index; i++) {
- node = node.next;
- }
- return node;
- };
- /**
- * @private
- */
- LinkedList.prototype.createNode = function (item) {
- return {
- element: item,
- next: null
- };
- };
- return LinkedList;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = LinkedList; // End of linked list
-//# sourceMappingURL=LinkedList.js.map
\ No newline at end of file
diff --git a/dist/lib/LinkedList.js.map b/dist/lib/LinkedList.js.map
deleted file mode 100644
index 0a604f3..0000000
--- a/dist/lib/LinkedList.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"LinkedList.js","sourceRoot":"","sources":["../../src/lib/LinkedList.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/MultiDictionary.d.ts b/dist/lib/MultiDictionary.d.ts
deleted file mode 100644
index 93f8bb6..0000000
--- a/dist/lib/MultiDictionary.d.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import * as util from './util';
-export default class MultiDictionary {
- private dict;
- private equalsF;
- private allowDuplicate;
- /**
- * Creates an empty multi dictionary.
- * @class A multi dictionary is a special kind of dictionary that holds
- * multiple values against each key. Setting a value into the dictionary will
- * add the value to an array at that key. Getting a key will return an array,
- * holding all the values set to that key.
- * You can configure to allow duplicates in the values.
- * This implementation accepts any kind of objects as keys.
- *
- * If the keys are custom objects a function which converts keys to strings must be
- * provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * If the values are custom objects a function to check equality between values
- * must be provided. Example:
- *
- *
- * function petsAreEqualByAge(pet1,pet2) {
- * return pet1.age===pet2.age;
- * }
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- * @param {function(Object,Object):boolean=} valuesEqualsFunction optional
- * function to check if two values are equal.
- *
- * @param allowDuplicateValues
- */
- constructor(toStrFunction?: (key: K) => string, valuesEqualsFunction?: util.IEqualsFunction, allowDuplicateValues?: boolean);
- /**
- * Returns an array holding the values to which this dictionary maps
- * the specified key.
- * Returns an empty array if this dictionary contains no mappings for this key.
- * @param {Object} key key whose associated values are to be returned.
- * @return {Array} an array holding the values to which this dictionary maps
- * the specified key.
- */
- getValue(key: K): V[];
- /**
- * Adds the value to the array associated with the specified key, if
- * it is not already present.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value the value to add to the array at the key
- * @return {boolean} true if the value was not already associated with that key.
- */
- setValue(key: K, value: V): boolean;
- /**
- * Removes the specified values from the array of values associated with the
- * specified key. If a value isn't given, all values associated with the specified
- * key are removed.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @param {Object=} value optional argument to specify the value to remove
- * from the array associated with the specified key.
- * @return {*} true if the dictionary changed, false if the key doesn't exist or
- * if the specified value isn't associated with the specified key.
- */
- remove(key: K, value?: V): boolean;
- /**
- * Returns an array containing all of the keys in this dictionary.
- * @return {Array} an array containing all of the keys in this dictionary.
- */
- keys(): K[];
- /**
- * Returns an array containing all of the values in this dictionary.
- * @return {Array} an array containing all of the values in this dictionary.
- */
- values(): V[];
- /**
- * Returns true if this dictionary at least one value associatted the specified key.
- * @param {Object} key key whose presence in this dictionary is to be
- * tested.
- * @return {boolean} true if this dictionary at least one value associatted
- * the specified key.
- */
- containsKey(key: K): boolean;
- /**
- * Removes all mappings from this dictionary.
- */
- clear(): void;
- /**
- * Returns the number of keys in this dictionary.
- * @return {number} the number of key-value mappings in this dictionary.
- */
- size(): number;
- /**
- * Returns true if this dictionary contains no mappings.
- * @return {boolean} true if this dictionary contains no mappings.
- */
- isEmpty(): boolean;
-}
diff --git a/dist/lib/MultiDictionary.js b/dist/lib/MultiDictionary.js
deleted file mode 100644
index 38d16cb..0000000
--- a/dist/lib/MultiDictionary.js
+++ /dev/null
@@ -1,169 +0,0 @@
-"use strict";
-var util = require('./util');
-var Dictionary_1 = require('./Dictionary');
-var arrays = require('./arrays');
-var MultiDictionary = (function () {
- /**
- * Creates an empty multi dictionary.
- * @class A multi dictionary is a special kind of dictionary that holds
- * multiple values against each key. Setting a value into the dictionary will
- * add the value to an array at that key. Getting a key will return an array,
- * holding all the values set to that key.
- * You can configure to allow duplicates in the values.
- * This implementation accepts any kind of objects as keys.
- *
- * If the keys are custom objects a function which converts keys to strings must be
- * provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * If the values are custom objects a function to check equality between values
- * must be provided. Example:
- *
- *
- * function petsAreEqualByAge(pet1,pet2) {
- * return pet1.age===pet2.age;
- * }
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- * @param {function(Object,Object):boolean=} valuesEqualsFunction optional
- * function to check if two values are equal.
- *
- * @param allowDuplicateValues
- */
- function MultiDictionary(toStrFunction, valuesEqualsFunction, allowDuplicateValues) {
- if (allowDuplicateValues === void 0) { allowDuplicateValues = false; }
- this.dict = new Dictionary_1.default(toStrFunction);
- this.equalsF = valuesEqualsFunction || util.defaultEquals;
- this.allowDuplicate = allowDuplicateValues;
- }
- /**
- * Returns an array holding the values to which this dictionary maps
- * the specified key.
- * Returns an empty array if this dictionary contains no mappings for this key.
- * @param {Object} key key whose associated values are to be returned.
- * @return {Array} an array holding the values to which this dictionary maps
- * the specified key.
- */
- MultiDictionary.prototype.getValue = function (key) {
- var values = this.dict.getValue(key);
- if (util.isUndefined(values)) {
- return [];
- }
- return arrays.copy(values);
- };
- /**
- * Adds the value to the array associated with the specified key, if
- * it is not already present.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value the value to add to the array at the key
- * @return {boolean} true if the value was not already associated with that key.
- */
- MultiDictionary.prototype.setValue = function (key, value) {
- if (util.isUndefined(key) || util.isUndefined(value)) {
- return false;
- }
- if (!this.containsKey(key)) {
- this.dict.setValue(key, [value]);
- return true;
- }
- var array = this.dict.getValue(key);
- if (!this.allowDuplicate) {
- if (arrays.contains(array, value, this.equalsF)) {
- return false;
- }
- }
- array.push(value);
- return true;
- };
- /**
- * Removes the specified values from the array of values associated with the
- * specified key. If a value isn't given, all values associated with the specified
- * key are removed.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @param {Object=} value optional argument to specify the value to remove
- * from the array associated with the specified key.
- * @return {*} true if the dictionary changed, false if the key doesn't exist or
- * if the specified value isn't associated with the specified key.
- */
- MultiDictionary.prototype.remove = function (key, value) {
- if (util.isUndefined(value)) {
- var v = this.dict.remove(key);
- return !util.isUndefined(v);
- }
- var array = this.dict.getValue(key);
- if (arrays.remove(array, value, this.equalsF)) {
- if (array.length === 0) {
- this.dict.remove(key);
- }
- return true;
- }
- return false;
- };
- /**
- * Returns an array containing all of the keys in this dictionary.
- * @return {Array} an array containing all of the keys in this dictionary.
- */
- MultiDictionary.prototype.keys = function () {
- return this.dict.keys();
- };
- /**
- * Returns an array containing all of the values in this dictionary.
- * @return {Array} an array containing all of the values in this dictionary.
- */
- MultiDictionary.prototype.values = function () {
- var values = this.dict.values();
- var array = [];
- for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
- var v = values_1[_i];
- for (var _a = 0, v_1 = v; _a < v_1.length; _a++) {
- var w = v_1[_a];
- array.push(w);
- }
- }
- return array;
- };
- /**
- * Returns true if this dictionary at least one value associatted the specified key.
- * @param {Object} key key whose presence in this dictionary is to be
- * tested.
- * @return {boolean} true if this dictionary at least one value associatted
- * the specified key.
- */
- MultiDictionary.prototype.containsKey = function (key) {
- return this.dict.containsKey(key);
- };
- /**
- * Removes all mappings from this dictionary.
- */
- MultiDictionary.prototype.clear = function () {
- this.dict.clear();
- };
- /**
- * Returns the number of keys in this dictionary.
- * @return {number} the number of key-value mappings in this dictionary.
- */
- MultiDictionary.prototype.size = function () {
- return this.dict.size();
- };
- /**
- * Returns true if this dictionary contains no mappings.
- * @return {boolean} true if this dictionary contains no mappings.
- */
- MultiDictionary.prototype.isEmpty = function () {
- return this.dict.isEmpty();
- };
- return MultiDictionary;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MultiDictionary; // end of multi dictionary
-//# sourceMappingURL=MultiDictionary.js.map
\ No newline at end of file
diff --git a/dist/lib/MultiDictionary.js.map b/dist/lib/MultiDictionary.js.map
deleted file mode 100644
index b0dbe9f..0000000
--- a/dist/lib/MultiDictionary.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"MultiDictionary.js","sourceRoot":"","sources":["../../src/lib/MultiDictionary.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/MultiRootTree.d.ts b/dist/lib/MultiRootTree.d.ts
deleted file mode 100644
index 751200e..0000000
--- a/dist/lib/MultiRootTree.d.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-export declare enum Direction {
- BEFORE = 0,
- AFTER = 1,
- INSIDE_AT_END = 2,
- INSIDE_AT_START = 3,
-}
-export default class MultiRootTree {
- rootIds: Array;
- nodes: {
- [id: string]: Array;
- };
- constructor(rootIds?: Array, nodes?: {
- [id: string]: Array;
- });
- getRootIds(): string[];
- getNodes(): {
- [id: string]: string[];
- };
- getObject(): {
- rootIds: string[];
- nodes: {
- [id: string]: string[];
- };
- };
- moveIdBeforeId(moveId: string, beforeId: string): void;
- moveIdAfterId(moveId: string, afterId: string): void;
- moveIdIntoId(moveId: string, insideId: string, atStart?: boolean): void;
- deleteId(id: string): void;
- insertIdBeforeId(beforeId: string, insertId: string): void;
- insertIdAfterId(belowId: string, insertId: string): void;
- insertIdIntoId(insideId: string, insertId: string): void;
- insertIdIntoRoot(id: string, position?: number): void;
- insertIdIntoNode(nodeKey: string, id: string, position?: number): void;
- private moveId(moveId, beforeId, direction);
- private swapArrayElements(arr, indexA, indexB);
- private rootDeleteId(id);
- private nodeAndSubNodesDelete(nodeKey);
- private nodeRefrencesDelete(id);
- private nodeDelete(nodeKey);
- private findRootId(id);
- private findNodeId(nodeKey, id);
- private findNode(nodeKey);
- private nodeInsertAtStart(nodeKey, id);
- private nodeInsertAtEnd(nodeKey, id);
- private rootDelete(index);
- private nodeDeleteAtIndex(nodeKey, index);
- private rootInsertAtStart(id);
- private rootInsertAtEnd(id);
-}
diff --git a/dist/lib/MultiRootTree.js b/dist/lib/MultiRootTree.js
deleted file mode 100644
index 806a5ff..0000000
--- a/dist/lib/MultiRootTree.js
+++ /dev/null
@@ -1,330 +0,0 @@
-"use strict";
-(function (Direction) {
- Direction[Direction["BEFORE"] = 0] = "BEFORE";
- Direction[Direction["AFTER"] = 1] = "AFTER";
- Direction[Direction["INSIDE_AT_END"] = 2] = "INSIDE_AT_END";
- Direction[Direction["INSIDE_AT_START"] = 3] = "INSIDE_AT_START";
-})(exports.Direction || (exports.Direction = {}));
-var Direction = exports.Direction;
-var MultiRootTree = (function () {
- function MultiRootTree(rootIds, nodes) {
- if (rootIds === void 0) { rootIds = []; }
- if (nodes === void 0) { nodes = {}; }
- this.rootIds = rootIds;
- this.nodes = nodes;
- }
- MultiRootTree.prototype.getRootIds = function () {
- var clone = this.rootIds.slice();
- return clone;
- };
- MultiRootTree.prototype.getNodes = function () {
- var clone = {};
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- clone[nodeKey] = this.nodes[nodeKey].slice();
- }
- }
- return clone;
- };
- MultiRootTree.prototype.getObject = function () {
- return {
- rootIds: this.getRootIds(),
- nodes: this.getNodes(),
- };
- };
- MultiRootTree.prototype.moveIdBeforeId = function (moveId, beforeId) {
- return this.moveId(moveId, beforeId, Direction.BEFORE);
- };
- MultiRootTree.prototype.moveIdAfterId = function (moveId, afterId) {
- return this.moveId(moveId, afterId, Direction.AFTER);
- };
- MultiRootTree.prototype.moveIdIntoId = function (moveId, insideId, atStart) {
- if (atStart === void 0) { atStart = true; }
- if (atStart) {
- return this.moveId(moveId, insideId, Direction.INSIDE_AT_START);
- }
- else {
- return this.moveId(moveId, insideId, Direction.INSIDE_AT_END);
- }
- };
- MultiRootTree.prototype.deleteId = function (id) {
- this.rootDeleteId(id);
- this.nodeAndSubNodesDelete(id);
- this.nodeRefrencesDelete(id);
- };
- MultiRootTree.prototype.insertIdBeforeId = function (beforeId, insertId) {
- var foundRootIdIndex = this.findRootId(beforeId);
- if (foundRootIdIndex > -1) {
- this.insertIdIntoRoot(insertId, foundRootIdIndex);
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var foundNodeIdIndex = this.findNodeId(nodeKey, beforeId);
- if (foundNodeIdIndex > -1) {
- this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex);
- }
- }
- }
- };
- MultiRootTree.prototype.insertIdAfterId = function (belowId, insertId) {
- var foundRootIdIndex = this.findRootId(belowId);
- if (foundRootIdIndex > -1) {
- this.insertIdIntoRoot(insertId, foundRootIdIndex + 1);
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var foundNodeIdIndex = this.findNodeId(nodeKey, belowId);
- if (foundNodeIdIndex > -1) {
- this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex + 1);
- }
- }
- }
- };
- MultiRootTree.prototype.insertIdIntoId = function (insideId, insertId) {
- this.nodeInsertAtEnd(insideId, insertId);
- this.nodes[insertId] = [];
- };
- MultiRootTree.prototype.insertIdIntoRoot = function (id, position) {
- if (position === undefined) {
- this.rootInsertAtEnd(id);
- }
- else {
- if (position < 0) {
- var length_1 = this.rootIds.length;
- this.rootIds.splice((position + length_1 + 1), 0, id);
- }
- else {
- this.rootIds.splice(position, 0, id);
- }
- }
- this.nodes[id] = this.nodes[id] || [];
- };
- MultiRootTree.prototype.insertIdIntoNode = function (nodeKey, id, position) {
- this.nodes[nodeKey] = this.nodes[nodeKey] || [];
- this.nodes[id] = this.nodes[id] || [];
- if (position === undefined) {
- this.nodeInsertAtEnd(nodeKey, id);
- }
- else {
- if (position < 0) {
- var length_2 = this.nodes[nodeKey].length;
- this.nodes[nodeKey].splice((position + length_2 + 1), 0, id);
- }
- else {
- this.nodes[nodeKey].splice(position, 0, id);
- }
- }
- };
- MultiRootTree.prototype.moveId = function (moveId, beforeId, direction) {
- var sourceId = moveId;
- var sourceRootIndex = this.findRootId(sourceId);
- var sourceNodeKey;
- var sourceNodeIdIndex;
- if (this.nodes[beforeId]) {
- sourceNodeKey = beforeId;
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- sourceNodeIdIndex = this.findNodeId(nodeKey, beforeId);
- break;
- }
- }
- // got all
- var targetId = beforeId;
- var targetRootIndex = this.findRootId(targetId);
- var targetNodeKey;
- var targetNodeIdIndex;
- if (this.nodes[beforeId]) {
- targetNodeKey = beforeId;
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- targetNodeIdIndex = this.findNodeId(nodeKey, beforeId);
- break;
- }
- }
- // got all
- if (sourceRootIndex > -1) {
- if (targetRootIndex > -1) {
- this.rootDelete(sourceRootIndex);
- switch (direction) {
- case Direction.BEFORE:
- this.insertIdIntoRoot(sourceId, targetRootIndex);
- break;
- case Direction.AFTER:
- this.insertIdIntoRoot(sourceId, targetRootIndex + 1);
- break;
- case Direction.INSIDE_AT_START:
- this.nodeInsertAtStart(targetId, sourceId);
- break;
- case Direction.INSIDE_AT_END:
- this.nodeInsertAtEnd(targetId, sourceId);
- break;
- }
- }
- else {
- // moving root (source) ABOVE node (target)
- // will remove one entry from roots
- this.rootDelete(sourceRootIndex);
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var index = this.findNodeId(nodeKey, targetId);
- if (index > -1) {
- switch (direction) {
- case Direction.BEFORE:
- this.insertIdIntoNode(nodeKey, sourceId, index);
- break;
- case Direction.AFTER:
- this.insertIdIntoNode(nodeKey, sourceId, index + 1);
- break;
- case Direction.INSIDE_AT_START:
- this.nodeInsertAtStart(targetId, sourceId);
- break;
- case Direction.INSIDE_AT_END:
- this.nodeInsertAtEnd(targetId, sourceId);
- break;
- }
- break;
- }
- }
- }
- }
- }
- else {
- if (targetRootIndex > -1) {
- // moving node (source) ABOVE root (target)
- // delete source id from each node
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var index = this.findNodeId(nodeKey, sourceId);
- if (index > -1) {
- // this.nodeInsertId(nodeKey, sourceId, index);
- this.nodeDeleteAtIndex(nodeKey, index);
- break;
- }
- }
- }
- switch (direction) {
- case Direction.BEFORE:
- this.insertIdIntoRoot(sourceId, targetRootIndex);
- break;
- case Direction.AFTER:
- this.insertIdIntoRoot(sourceId, targetRootIndex + 1);
- break;
- case Direction.INSIDE_AT_START:
- this.nodeInsertAtStart(targetId, sourceId);
- break;
- case Direction.INSIDE_AT_END:
- this.nodeInsertAtEnd(targetId, sourceId);
- break;
- }
- }
- else {
- // moving node (source) ABOVE node (target)
- // delete source id from each node
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var index = this.findNodeId(nodeKey, sourceId);
- if (index > -1) {
- this.nodeDeleteAtIndex(nodeKey, index);
- break;
- }
- }
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var index = this.findNodeId(nodeKey, targetId);
- if (index > -1) {
- switch (direction) {
- case Direction.BEFORE:
- this.insertIdIntoNode(nodeKey, sourceId, index);
- break;
- case Direction.AFTER:
- this.insertIdIntoNode(nodeKey, sourceId, index + 1);
- break;
- case Direction.INSIDE_AT_START:
- this.nodeInsertAtStart(targetId, sourceId);
- break;
- case Direction.INSIDE_AT_END:
- this.nodeInsertAtEnd(targetId, sourceId);
- break;
- }
- break;
- }
- }
- }
- }
- }
- };
- MultiRootTree.prototype.swapArrayElements = function (arr, indexA, indexB) {
- var temp = arr[indexA];
- arr[indexA] = arr[indexB];
- arr[indexB] = temp;
- return arr;
- };
- ;
- MultiRootTree.prototype.rootDeleteId = function (id) {
- var index = this.findRootId(id);
- if (index > -1) {
- this.rootDelete(index);
- }
- };
- MultiRootTree.prototype.nodeAndSubNodesDelete = function (nodeKey) {
- var toDeleteLater = [];
- for (var i = 0; i < this.nodes[nodeKey].length; i++) {
- var id = this.nodes[nodeKey][i];
- this.nodeAndSubNodesDelete(id);
- toDeleteLater.push(nodeKey);
- }
- this.nodeDelete(nodeKey);
- for (var i = 0; i < toDeleteLater.length; i++) {
- this.nodeDelete(toDeleteLater[i]);
- }
- };
- MultiRootTree.prototype.nodeRefrencesDelete = function (id) {
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- for (var i = 0; i < this.nodes[nodeKey].length; i++) {
- var targetId = this.nodes[nodeKey][i];
- if (targetId === id) {
- this.nodeDeleteAtIndex(nodeKey, i);
- }
- }
- }
- }
- };
- MultiRootTree.prototype.nodeDelete = function (nodeKey) {
- delete this.nodes[nodeKey];
- };
- MultiRootTree.prototype.findRootId = function (id) {
- return this.rootIds.indexOf(id);
- };
- MultiRootTree.prototype.findNodeId = function (nodeKey, id) {
- return this.nodes[nodeKey].indexOf(id);
- };
- MultiRootTree.prototype.findNode = function (nodeKey) {
- return this.nodes[nodeKey];
- };
- MultiRootTree.prototype.nodeInsertAtStart = function (nodeKey, id) {
- this.nodes[nodeKey].unshift(id);
- };
- MultiRootTree.prototype.nodeInsertAtEnd = function (nodeKey, id) {
- this.nodes[nodeKey].push(id);
- };
- MultiRootTree.prototype.rootDelete = function (index) {
- this.rootIds.splice(index, 1);
- };
- MultiRootTree.prototype.nodeDeleteAtIndex = function (nodeKey, index) {
- this.nodes[nodeKey].splice(index, 1);
- };
- MultiRootTree.prototype.rootInsertAtStart = function (id) {
- this.rootIds.unshift(id);
- };
- MultiRootTree.prototype.rootInsertAtEnd = function (id) {
- this.rootIds.push(id);
- };
- return MultiRootTree;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MultiRootTree;
-//# sourceMappingURL=MultiRootTree.js.map
\ No newline at end of file
diff --git a/dist/lib/MultiRootTree.js.map b/dist/lib/MultiRootTree.js.map
deleted file mode 100644
index 1ed138d..0000000
--- a/dist/lib/MultiRootTree.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"MultiRootTree.js","sourceRoot":"","sources":["../../src/lib/MultiRootTree.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/PriorityQueue.d.ts b/dist/lib/PriorityQueue.d.ts
deleted file mode 100644
index 5427c52..0000000
--- a/dist/lib/PriorityQueue.d.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import * as util from './util';
-export default class PriorityQueue {
- private heap;
- /**
- * Creates an empty priority queue.
- * @class In a priority queue each element is associated with a "priority",
- * elements are dequeued in highest-priority-first order (the elements with the
- * highest priority are dequeued first). Priority Queues are implemented as heaps.
- * If the inserted elements are custom objects a compare function must be provided,
- * otherwise the <=, === and >= operators are used to compare object priority.
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two element priorities. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- constructor(compareFunction?: util.ICompareFunction);
- /**
- * Inserts the specified element into this priority queue.
- * @param {Object} element the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- enqueue(element: T): boolean;
- /**
- * Inserts the specified element into this priority queue.
- * @param {Object} element the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- add(element: T): boolean;
- /**
- * Retrieves and removes the highest priority element of this queue.
- * @return {*} the the highest priority element of this queue,
- * or undefined if this queue is empty.
- */
- dequeue(): T;
- /**
- * Retrieves, but does not remove, the highest priority element of this queue.
- * @return {*} the highest priority element of this queue, or undefined if this queue is empty.
- */
- peek(): T;
- /**
- * Returns true if this priority queue contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this priority queue contains the specified element,
- * false otherwise.
- */
- contains(element: T): boolean;
- /**
- * Checks if this priority queue is empty.
- * @return {boolean} true if and only if this priority queue contains no items; false
- * otherwise.
- */
- isEmpty(): boolean;
- /**
- * Returns the number of elements in this priority queue.
- * @return {number} the number of elements in this priority queue.
- */
- size(): number;
- /**
- * Removes all of the elements from this priority queue.
- */
- clear(): void;
- /**
- * Executes the provided function once for each element present in this queue in
- * no particular order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- forEach(callback: util.ILoopFunction): void;
-}
diff --git a/dist/lib/PriorityQueue.js b/dist/lib/PriorityQueue.js
deleted file mode 100644
index 8dc57a3..0000000
--- a/dist/lib/PriorityQueue.js
+++ /dev/null
@@ -1,112 +0,0 @@
-"use strict";
-var util = require('./util');
-var Heap_1 = require('./Heap');
-var PriorityQueue = (function () {
- /**
- * Creates an empty priority queue.
- * @class In a priority queue each element is associated with a "priority",
- * elements are dequeued in highest-priority-first order (the elements with the
- * highest priority are dequeued first). Priority Queues are implemented as heaps.
- * If the inserted elements are custom objects a compare function must be provided,
- * otherwise the <=, === and >= operators are used to compare object priority.
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two element priorities. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- function PriorityQueue(compareFunction) {
- this.heap = new Heap_1.default(util.reverseCompareFunction(compareFunction));
- }
- /**
- * Inserts the specified element into this priority queue.
- * @param {Object} element the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- PriorityQueue.prototype.enqueue = function (element) {
- return this.heap.add(element);
- };
- /**
- * Inserts the specified element into this priority queue.
- * @param {Object} element the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- PriorityQueue.prototype.add = function (element) {
- return this.heap.add(element);
- };
- /**
- * Retrieves and removes the highest priority element of this queue.
- * @return {*} the the highest priority element of this queue,
- * or undefined if this queue is empty.
- */
- PriorityQueue.prototype.dequeue = function () {
- if (this.heap.size() !== 0) {
- var el = this.heap.peek();
- this.heap.removeRoot();
- return el;
- }
- return undefined;
- };
- /**
- * Retrieves, but does not remove, the highest priority element of this queue.
- * @return {*} the highest priority element of this queue, or undefined if this queue is empty.
- */
- PriorityQueue.prototype.peek = function () {
- return this.heap.peek();
- };
- /**
- * Returns true if this priority queue contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this priority queue contains the specified element,
- * false otherwise.
- */
- PriorityQueue.prototype.contains = function (element) {
- return this.heap.contains(element);
- };
- /**
- * Checks if this priority queue is empty.
- * @return {boolean} true if and only if this priority queue contains no items; false
- * otherwise.
- */
- PriorityQueue.prototype.isEmpty = function () {
- return this.heap.isEmpty();
- };
- /**
- * Returns the number of elements in this priority queue.
- * @return {number} the number of elements in this priority queue.
- */
- PriorityQueue.prototype.size = function () {
- return this.heap.size();
- };
- /**
- * Removes all of the elements from this priority queue.
- */
- PriorityQueue.prototype.clear = function () {
- this.heap.clear();
- };
- /**
- * Executes the provided function once for each element present in this queue in
- * no particular order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- PriorityQueue.prototype.forEach = function (callback) {
- this.heap.forEach(callback);
- };
- return PriorityQueue;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = PriorityQueue; // end of priority queue
-//# sourceMappingURL=PriorityQueue.js.map
\ No newline at end of file
diff --git a/dist/lib/PriorityQueue.js.map b/dist/lib/PriorityQueue.js.map
deleted file mode 100644
index 853d65b..0000000
--- a/dist/lib/PriorityQueue.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"PriorityQueue.js","sourceRoot":"","sources":["../../src/lib/PriorityQueue.ts"],"names":[],"mappings":";AAAA,IAAY,IAAI,WAAM,QAAQ,CAAC,CAAA;AAC/B,qBAAiB,QAAQ,CAAC,CAAA;AAE1B;IAGI;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,uBAAY,eAA0C;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,cAAI,CAAI,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,+BAAO,GAAP,UAAQ,OAAU;QACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,2BAAG,GAAH,UAAI,OAAU;QACV,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,+BAAO,GAAP;QACI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,CAAC,EAAE,CAAC;QACd,CAAC;QACD,MAAM,CAAC,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,4BAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;OAKG;IACH,gCAAQ,GAAR,UAAS,OAAU;QACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,+BAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,4BAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,6BAAK,GAAL;QACI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,+BAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEL,oBAAC;AAAD,CAAC,AApHD,IAoHC;AApHD;+BAoHC,CAAA,CAAC,wBAAwB"}
\ No newline at end of file
diff --git a/dist/lib/Queue.d.ts b/dist/lib/Queue.d.ts
deleted file mode 100644
index 827b9f2..0000000
--- a/dist/lib/Queue.d.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import * as util from './util';
-export default class Queue {
- /**
- * List containing the elements.
- * @type collections.LinkedList
- * @private
- */
- private list;
- /**
- * Creates an empty queue.
- * @class A queue is a First-In-First-Out (FIFO) data structure, the first
- * element added to the queue will be the first one to be removed. This
- * implementation uses a linked list as a container.
- * @constructor
- */
- constructor();
- /**
- * Inserts the specified element into the end of this queue.
- * @param {Object} elem the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- enqueue(elem: T): boolean;
- /**
- * Inserts the specified element into the end of this queue.
- * @param {Object} elem the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- add(elem: T): boolean;
- /**
- * Retrieves and removes the head of this queue.
- * @return {*} the head of this queue, or undefined if this queue is empty.
- */
- dequeue(): T;
- /**
- * Retrieves, but does not remove, the head of this queue.
- * @return {*} the head of this queue, or undefined if this queue is empty.
- */
- peek(): T;
- /**
- * Returns the number of elements in this queue.
- * @return {number} the number of elements in this queue.
- */
- size(): number;
- /**
- * Returns true if this queue contains the specified element.
- * If the elements inside this stack are
- * not comparable with the === operator, a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName (pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} elem element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function to check if two elements are equal.
- * @return {boolean} true if this queue contains the specified element,
- * false otherwise.
- */
- contains(elem: T, equalsFunction?: util.IEqualsFunction): boolean;
- /**
- * Checks if this queue is empty.
- * @return {boolean} true if and only if this queue contains no items; false
- * otherwise.
- */
- isEmpty(): boolean;
- /**
- * Removes all of the elements from this queue.
- */
- clear(): void;
- /**
- * Executes the provided function once for each element present in this queue in
- * FIFO order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- forEach(callback: util.ILoopFunction): void;
-}
diff --git a/dist/lib/Queue.js b/dist/lib/Queue.js
deleted file mode 100644
index e24d87a..0000000
--- a/dist/lib/Queue.js
+++ /dev/null
@@ -1,108 +0,0 @@
-"use strict";
-var LinkedList_1 = require('./LinkedList');
-var Queue = (function () {
- /**
- * Creates an empty queue.
- * @class A queue is a First-In-First-Out (FIFO) data structure, the first
- * element added to the queue will be the first one to be removed. This
- * implementation uses a linked list as a container.
- * @constructor
- */
- function Queue() {
- this.list = new LinkedList_1.default();
- }
- /**
- * Inserts the specified element into the end of this queue.
- * @param {Object} elem the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- Queue.prototype.enqueue = function (elem) {
- return this.list.add(elem);
- };
- /**
- * Inserts the specified element into the end of this queue.
- * @param {Object} elem the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- Queue.prototype.add = function (elem) {
- return this.list.add(elem);
- };
- /**
- * Retrieves and removes the head of this queue.
- * @return {*} the head of this queue, or undefined if this queue is empty.
- */
- Queue.prototype.dequeue = function () {
- if (this.list.size() !== 0) {
- var el = this.list.first();
- this.list.removeElementAtIndex(0);
- return el;
- }
- return undefined;
- };
- /**
- * Retrieves, but does not remove, the head of this queue.
- * @return {*} the head of this queue, or undefined if this queue is empty.
- */
- Queue.prototype.peek = function () {
- if (this.list.size() !== 0) {
- return this.list.first();
- }
- return undefined;
- };
- /**
- * Returns the number of elements in this queue.
- * @return {number} the number of elements in this queue.
- */
- Queue.prototype.size = function () {
- return this.list.size();
- };
- /**
- * Returns true if this queue contains the specified element.
- * If the elements inside this stack are
- * not comparable with the === operator, a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName (pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} elem element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function to check if two elements are equal.
- * @return {boolean} true if this queue contains the specified element,
- * false otherwise.
- */
- Queue.prototype.contains = function (elem, equalsFunction) {
- return this.list.contains(elem, equalsFunction);
- };
- /**
- * Checks if this queue is empty.
- * @return {boolean} true if and only if this queue contains no items; false
- * otherwise.
- */
- Queue.prototype.isEmpty = function () {
- return this.list.size() <= 0;
- };
- /**
- * Removes all of the elements from this queue.
- */
- Queue.prototype.clear = function () {
- this.list.clear();
- };
- /**
- * Executes the provided function once for each element present in this queue in
- * FIFO order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- Queue.prototype.forEach = function (callback) {
- this.list.forEach(callback);
- };
- return Queue;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Queue; // End of queue
-//# sourceMappingURL=Queue.js.map
\ No newline at end of file
diff --git a/dist/lib/Queue.js.map b/dist/lib/Queue.js.map
deleted file mode 100644
index 610e9a9..0000000
--- a/dist/lib/Queue.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../src/lib/Queue.ts"],"names":[],"mappings":";AACA,2BAAuB,cAAc,CAAC,CAAA;AAGtC;IASI;;;;;;OAMG;IACH;QACI,IAAI,CAAC,IAAI,GAAG,IAAI,oBAAU,EAAK,CAAC;IACpC,CAAC;IAGD;;;;OAIG;IACH,uBAAO,GAAP,UAAQ,IAAO;QACX,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD;;;;OAIG;IACH,mBAAG,GAAH,UAAI,IAAO;QACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD;;;OAGG;IACH,uBAAO,GAAP;QACI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,EAAE,CAAC;QACd,CAAC;QACD,MAAM,CAAC,SAAS,CAAC;IACrB,CAAC;IACD;;;OAGG;IACH,oBAAI,GAAJ;QAEI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,oBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,wBAAQ,GAAR,UAAS,IAAO,EAAE,cAAwC;QACtD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,uBAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,qBAAK,GAAL;QACI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,uBAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEL,YAAC;AAAD,CAAC,AAtHD,IAsHC;AAtHD;uBAsHC,CAAA,CAAC,eAAe"}
\ No newline at end of file
diff --git a/dist/lib/Set.d.ts b/dist/lib/Set.d.ts
deleted file mode 100644
index c6e87d7..0000000
--- a/dist/lib/Set.d.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-import * as util from './util';
-export default class Set {
- private dictionary;
- /**
- * Creates an empty set.
- * @class A set is a data structure that contains no duplicate items.
- * If the inserted elements are custom objects a function
- * which converts elements to strings must be provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- *
- * @constructor
- * @param {function(Object):string=} toStringFunction optional function used
- * to convert elements to strings. If the elements aren't strings or if toString()
- * is not appropriate, a custom function which receives a onject and returns a
- * unique string must be provided.
- */
- constructor(toStringFunction?: (item: T) => string);
- /**
- * Returns true if this set contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this set contains the specified element,
- * false otherwise.
- */
- contains(element: T): boolean;
- /**
- * Adds the specified element to this set if it is not already present.
- * @param {Object} element the element to insert.
- * @return {boolean} true if this set did not already contain the specified element.
- */
- add(element: T): boolean;
- /**
- * Performs an intersecion between this an another set.
- * Removes all values that are not present this set and the given set.
- * @param {collections.Set} otherSet other set.
- */
- intersection(otherSet: Set): void;
- /**
- * Performs a union between this an another set.
- * Adds all values from the given set to this set.
- * @param {collections.Set} otherSet other set.
- */
- union(otherSet: Set): void;
- /**
- * Performs a difference between this an another set.
- * Removes from this set all the values that are present in the given set.
- * @param {collections.Set} otherSet other set.
- */
- difference(otherSet: Set): void;
- /**
- * Checks whether the given set contains all the elements in this set.
- * @param {collections.Set} otherSet other set.
- * @return {boolean} true if this set is a subset of the given set.
- */
- isSubsetOf(otherSet: Set): boolean;
- /**
- * Removes the specified element from this set if it is present.
- * @return {boolean} true if this set contained the specified element.
- */
- remove(element: T): boolean;
- /**
- * Executes the provided function once for each element
- * present in this set.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one arguments: the element. To break the iteration you can
- * optionally return false.
- */
- forEach(callback: util.ILoopFunction): void;
- /**
- * Returns an array containing all of the elements in this set in arbitrary order.
- * @return {Array} an array containing all of the elements in this set.
- */
- toArray(): T[];
- /**
- * Returns true if this set contains no elements.
- * @return {boolean} true if this set contains no elements.
- */
- isEmpty(): boolean;
- /**
- * Returns the number of elements in this set.
- * @return {number} the number of elements in this set.
- */
- size(): number;
- /**
- * Removes all of the elements from this set.
- */
- clear(): void;
- toString(): string;
-}
diff --git a/dist/lib/Set.js b/dist/lib/Set.js
deleted file mode 100644
index 1ca81a1..0000000
--- a/dist/lib/Set.js
+++ /dev/null
@@ -1,169 +0,0 @@
-"use strict";
-var util = require('./util');
-var arrays = require('./arrays');
-var Dictionary_1 = require('./Dictionary');
-var Set = (function () {
- /**
- * Creates an empty set.
- * @class A set is a data structure that contains no duplicate items.
- * If the inserted elements are custom objects a function
- * which converts elements to strings must be provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- *
- * @constructor
- * @param {function(Object):string=} toStringFunction optional function used
- * to convert elements to strings. If the elements aren't strings or if toString()
- * is not appropriate, a custom function which receives a onject and returns a
- * unique string must be provided.
- */
- function Set(toStringFunction) {
- this.dictionary = new Dictionary_1.default(toStringFunction);
- }
- /**
- * Returns true if this set contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this set contains the specified element,
- * false otherwise.
- */
- Set.prototype.contains = function (element) {
- return this.dictionary.containsKey(element);
- };
- /**
- * Adds the specified element to this set if it is not already present.
- * @param {Object} element the element to insert.
- * @return {boolean} true if this set did not already contain the specified element.
- */
- Set.prototype.add = function (element) {
- if (this.contains(element) || util.isUndefined(element)) {
- return false;
- }
- else {
- this.dictionary.setValue(element, element);
- return true;
- }
- };
- /**
- * Performs an intersecion between this an another set.
- * Removes all values that are not present this set and the given set.
- * @param {collections.Set} otherSet other set.
- */
- Set.prototype.intersection = function (otherSet) {
- var set = this;
- this.forEach(function (element) {
- if (!otherSet.contains(element)) {
- set.remove(element);
- }
- return true;
- });
- };
- /**
- * Performs a union between this an another set.
- * Adds all values from the given set to this set.
- * @param {collections.Set} otherSet other set.
- */
- Set.prototype.union = function (otherSet) {
- var set = this;
- otherSet.forEach(function (element) {
- set.add(element);
- return true;
- });
- };
- /**
- * Performs a difference between this an another set.
- * Removes from this set all the values that are present in the given set.
- * @param {collections.Set} otherSet other set.
- */
- Set.prototype.difference = function (otherSet) {
- var set = this;
- otherSet.forEach(function (element) {
- set.remove(element);
- return true;
- });
- };
- /**
- * Checks whether the given set contains all the elements in this set.
- * @param {collections.Set} otherSet other set.
- * @return {boolean} true if this set is a subset of the given set.
- */
- Set.prototype.isSubsetOf = function (otherSet) {
- if (this.size() > otherSet.size()) {
- return false;
- }
- var isSub = true;
- this.forEach(function (element) {
- if (!otherSet.contains(element)) {
- isSub = false;
- return false;
- }
- return true;
- });
- return isSub;
- };
- /**
- * Removes the specified element from this set if it is present.
- * @return {boolean} true if this set contained the specified element.
- */
- Set.prototype.remove = function (element) {
- if (!this.contains(element)) {
- return false;
- }
- else {
- this.dictionary.remove(element);
- return true;
- }
- };
- /**
- * Executes the provided function once for each element
- * present in this set.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one arguments: the element. To break the iteration you can
- * optionally return false.
- */
- Set.prototype.forEach = function (callback) {
- this.dictionary.forEach(function (k, v) {
- return callback(v);
- });
- };
- /**
- * Returns an array containing all of the elements in this set in arbitrary order.
- * @return {Array} an array containing all of the elements in this set.
- */
- Set.prototype.toArray = function () {
- return this.dictionary.values();
- };
- /**
- * Returns true if this set contains no elements.
- * @return {boolean} true if this set contains no elements.
- */
- Set.prototype.isEmpty = function () {
- return this.dictionary.isEmpty();
- };
- /**
- * Returns the number of elements in this set.
- * @return {number} the number of elements in this set.
- */
- Set.prototype.size = function () {
- return this.dictionary.size();
- };
- /**
- * Removes all of the elements from this set.
- */
- Set.prototype.clear = function () {
- this.dictionary.clear();
- };
- /*
- * Provides a string representation for display
- */
- Set.prototype.toString = function () {
- return arrays.toString(this.toArray());
- };
- return Set;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Set; // end of Set
-//# sourceMappingURL=Set.js.map
\ No newline at end of file
diff --git a/dist/lib/Set.js.map b/dist/lib/Set.js.map
deleted file mode 100644
index 4ccceb8..0000000
--- a/dist/lib/Set.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Set.js","sourceRoot":"","sources":["../../src/lib/Set.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/Stack.d.ts b/dist/lib/Stack.d.ts
deleted file mode 100644
index 9e5e0d6..0000000
--- a/dist/lib/Stack.d.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-import * as util from './util';
-export default class Stack {
- /**
- * List containing the elements.
- * @type collections.LinkedList
- * @private
- */
- private list;
- /**
- * Creates an empty Stack.
- * @class A Stack is a Last-In-First-Out (LIFO) data structure, the last
- * element added to the stack will be the first one to be removed. This
- * implementation uses a linked list as a container.
- * @constructor
- */
- constructor();
- /**
- * Pushes an item onto the top of this stack.
- * @param {Object} elem the element to be pushed onto this stack.
- * @return {boolean} true if the element was pushed or false if it is undefined.
- */
- push(elem: T): boolean;
- /**
- * Pushes an item onto the top of this stack.
- * @param {Object} elem the element to be pushed onto this stack.
- * @return {boolean} true if the element was pushed or false if it is undefined.
- */
- add(elem: T): boolean;
- /**
- * Removes the object at the top of this stack and returns that object.
- * @return {*} the object at the top of this stack or undefined if the
- * stack is empty.
- */
- pop(): T;
- /**
- * Looks at the object at the top of this stack without removing it from the
- * stack.
- * @return {*} the object at the top of this stack or undefined if the
- * stack is empty.
- */
- peek(): T;
- /**
- * Returns the number of elements in this stack.
- * @return {number} the number of elements in this stack.
- */
- size(): number;
- /**
- * Returns true if this stack contains the specified element.
- * If the elements inside this stack are
- * not comparable with the === operator, a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName (pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} elem element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function to check if two elements are equal.
- * @return {boolean} true if this stack contains the specified element,
- * false otherwise.
- */
- contains(elem: T, equalsFunction?: util.IEqualsFunction): boolean;
- /**
- * Checks if this stack is empty.
- * @return {boolean} true if and only if this stack contains no items; false
- * otherwise.
- */
- isEmpty(): boolean;
- /**
- * Removes all of the elements from this stack.
- */
- clear(): void;
- /**
- * Executes the provided function once for each element present in this stack in
- * LIFO order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- forEach(callback: util.ILoopFunction): void;
-}
diff --git a/dist/lib/Stack.js b/dist/lib/Stack.js
deleted file mode 100644
index 5dc9772..0000000
--- a/dist/lib/Stack.js
+++ /dev/null
@@ -1,103 +0,0 @@
-"use strict";
-var LinkedList_1 = require('./LinkedList');
-var Stack = (function () {
- /**
- * Creates an empty Stack.
- * @class A Stack is a Last-In-First-Out (LIFO) data structure, the last
- * element added to the stack will be the first one to be removed. This
- * implementation uses a linked list as a container.
- * @constructor
- */
- function Stack() {
- this.list = new LinkedList_1.default();
- }
- /**
- * Pushes an item onto the top of this stack.
- * @param {Object} elem the element to be pushed onto this stack.
- * @return {boolean} true if the element was pushed or false if it is undefined.
- */
- Stack.prototype.push = function (elem) {
- return this.list.add(elem, 0);
- };
- /**
- * Pushes an item onto the top of this stack.
- * @param {Object} elem the element to be pushed onto this stack.
- * @return {boolean} true if the element was pushed or false if it is undefined.
- */
- Stack.prototype.add = function (elem) {
- return this.list.add(elem, 0);
- };
- /**
- * Removes the object at the top of this stack and returns that object.
- * @return {*} the object at the top of this stack or undefined if the
- * stack is empty.
- */
- Stack.prototype.pop = function () {
- return this.list.removeElementAtIndex(0);
- };
- /**
- * Looks at the object at the top of this stack without removing it from the
- * stack.
- * @return {*} the object at the top of this stack or undefined if the
- * stack is empty.
- */
- Stack.prototype.peek = function () {
- return this.list.first();
- };
- /**
- * Returns the number of elements in this stack.
- * @return {number} the number of elements in this stack.
- */
- Stack.prototype.size = function () {
- return this.list.size();
- };
- /**
- * Returns true if this stack contains the specified element.
- * If the elements inside this stack are
- * not comparable with the === operator, a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName (pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} elem element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function to check if two elements are equal.
- * @return {boolean} true if this stack contains the specified element,
- * false otherwise.
- */
- Stack.prototype.contains = function (elem, equalsFunction) {
- return this.list.contains(elem, equalsFunction);
- };
- /**
- * Checks if this stack is empty.
- * @return {boolean} true if and only if this stack contains no items; false
- * otherwise.
- */
- Stack.prototype.isEmpty = function () {
- return this.list.isEmpty();
- };
- /**
- * Removes all of the elements from this stack.
- */
- Stack.prototype.clear = function () {
- this.list.clear();
- };
- /**
- * Executes the provided function once for each element present in this stack in
- * LIFO order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- Stack.prototype.forEach = function (callback) {
- this.list.forEach(callback);
- };
- return Stack;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Stack; // End of stack
-//# sourceMappingURL=Stack.js.map
\ No newline at end of file
diff --git a/dist/lib/Stack.js.map b/dist/lib/Stack.js.map
deleted file mode 100644
index 0fc6f22..0000000
--- a/dist/lib/Stack.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"Stack.js","sourceRoot":"","sources":["../../src/lib/Stack.ts"],"names":[],"mappings":";AAAA,2BAAuB,cAAc,CAAC,CAAA;AAGtC;IAOI;;;;;;OAMG;IACH;QACI,IAAI,CAAC,IAAI,GAAG,IAAI,oBAAU,EAAK,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,oBAAI,GAAJ,UAAK,IAAO;QACR,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD;;;;OAIG;IACH,mBAAG,GAAH,UAAI,IAAO;QACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD;;;;OAIG;IACH,mBAAG,GAAH;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD;;;;;OAKG;IACH,oBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD;;;OAGG;IACH,oBAAI,GAAJ;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,wBAAQ,GAAR,UAAS,IAAO,EAAE,cAAwC;QACtD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACpD,CAAC;IACD;;;;OAIG;IACH,uBAAO,GAAP;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IACD;;OAEG;IACH,qBAAK,GAAL;QACI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,uBAAO,GAAP,UAAQ,QAA+B;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IACL,YAAC;AAAD,CAAC,AAzGD,IAyGC;AAzGD;uBAyGC,CAAA,CAAC,eAAe"}
\ No newline at end of file
diff --git a/dist/lib/arrays.d.ts b/dist/lib/arrays.d.ts
deleted file mode 100644
index 5c402ee..0000000
--- a/dist/lib/arrays.d.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import * as util from './util';
-/**
- * Returns the position of the first occurrence of the specified item
- * within the specified array.4
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the position of the first occurrence of the specified element
- * within the specified array, or -1 if not found.
- */
-export declare function indexOf(array: T[], item: T, equalsFunction?: util.IEqualsFunction): number;
-/**
- * Returns the position of the last occurrence of the specified element
- * within the specified array.
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the position of the last occurrence of the specified element
- * within the specified array or -1 if not found.
- */
-export declare function lastIndexOf(array: T[], item: T, equalsFunction?: util.IEqualsFunction): number;
-/**
- * Returns true if the specified array contains the specified element.
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function to
- * check equality between 2 elements.
- * @return {boolean} true if the specified array contains the specified element.
- */
-export declare function contains(array: T[], item: T, equalsFunction?: util.IEqualsFunction): boolean;
-/**
- * Removes the first ocurrence of the specified element from the specified array.
- * @param {*} array the array in which to search element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function to
- * check equality between 2 elements.
- * @return {boolean} true if the array changed after this call.
- */
-export declare function remove(array: T[], item: T, equalsFunction?: util.IEqualsFunction): boolean;
-/**
- * Returns the number of elements in the specified array equal
- * to the specified object.
- * @param {Array} array the array in which to determine the frequency of the element.
- * @param {Object} item the element whose frequency is to be determined.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the number of elements in the specified array
- * equal to the specified object.
- */
-export declare function frequency(array: T[], item: T, equalsFunction?: util.IEqualsFunction): number;
-/**
- * Returns true if the two specified arrays are equal to one another.
- * Two arrays are considered equal if both arrays contain the same number
- * of elements, and all corresponding pairs of elements in the two
- * arrays are equal and are in the same order.
- * @param {Array} array1 one array to be tested for equality.
- * @param {Array} array2 the other array to be tested for equality.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between elemements in the arrays.
- * @return {boolean} true if the two arrays are equal
- */
-export declare function equals(array1: T[], array2: T[], equalsFunction?: util.IEqualsFunction): boolean;
-/**
- * Returns shallow a copy of the specified array.
- * @param {*} array the array to copy.
- * @return {Array} a copy of the specified array
- */
-export declare function copy(array: T[]): T[];
-/**
- * Swaps the elements at the specified positions in the specified array.
- * @param {Array} array The array in which to swap elements.
- * @param {number} i the index of one element to be swapped.
- * @param {number} j the index of the other element to be swapped.
- * @return {boolean} true if the array is defined and the indexes are valid.
- */
-export declare function swap(array: T[], i: number, j: number): boolean;
-export declare function toString(array: T[]): string;
-/**
- * Executes the provided function once for each element present in this array
- * starting from index 0 to length - 1.
- * @param {Array} array The array in which to iterate.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
-export declare function forEach(array: T[], callback: util.ILoopFunction): void;
diff --git a/dist/lib/arrays.js b/dist/lib/arrays.js
deleted file mode 100644
index 09866ff..0000000
--- a/dist/lib/arrays.js
+++ /dev/null
@@ -1,168 +0,0 @@
-"use strict";
-var util = require('./util');
-/**
- * Returns the position of the first occurrence of the specified item
- * within the specified array.4
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the position of the first occurrence of the specified element
- * within the specified array, or -1 if not found.
- */
-function indexOf(array, item, equalsFunction) {
- var equals = equalsFunction || util.defaultEquals;
- var length = array.length;
- for (var i = 0; i < length; i++) {
- if (equals(array[i], item)) {
- return i;
- }
- }
- return -1;
-}
-exports.indexOf = indexOf;
-/**
- * Returns the position of the last occurrence of the specified element
- * within the specified array.
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the position of the last occurrence of the specified element
- * within the specified array or -1 if not found.
- */
-function lastIndexOf(array, item, equalsFunction) {
- var equals = equalsFunction || util.defaultEquals;
- var length = array.length;
- for (var i = length - 1; i >= 0; i--) {
- if (equals(array[i], item)) {
- return i;
- }
- }
- return -1;
-}
-exports.lastIndexOf = lastIndexOf;
-/**
- * Returns true if the specified array contains the specified element.
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function to
- * check equality between 2 elements.
- * @return {boolean} true if the specified array contains the specified element.
- */
-function contains(array, item, equalsFunction) {
- return indexOf(array, item, equalsFunction) >= 0;
-}
-exports.contains = contains;
-/**
- * Removes the first ocurrence of the specified element from the specified array.
- * @param {*} array the array in which to search element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function to
- * check equality between 2 elements.
- * @return {boolean} true if the array changed after this call.
- */
-function remove(array, item, equalsFunction) {
- var index = indexOf(array, item, equalsFunction);
- if (index < 0) {
- return false;
- }
- array.splice(index, 1);
- return true;
-}
-exports.remove = remove;
-/**
- * Returns the number of elements in the specified array equal
- * to the specified object.
- * @param {Array} array the array in which to determine the frequency of the element.
- * @param {Object} item the element whose frequency is to be determined.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the number of elements in the specified array
- * equal to the specified object.
- */
-function frequency(array, item, equalsFunction) {
- var equals = equalsFunction || util.defaultEquals;
- var length = array.length;
- var freq = 0;
- for (var i = 0; i < length; i++) {
- if (equals(array[i], item)) {
- freq++;
- }
- }
- return freq;
-}
-exports.frequency = frequency;
-/**
- * Returns true if the two specified arrays are equal to one another.
- * Two arrays are considered equal if both arrays contain the same number
- * of elements, and all corresponding pairs of elements in the two
- * arrays are equal and are in the same order.
- * @param {Array} array1 one array to be tested for equality.
- * @param {Array} array2 the other array to be tested for equality.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between elemements in the arrays.
- * @return {boolean} true if the two arrays are equal
- */
-function equals(array1, array2, equalsFunction) {
- var equals = equalsFunction || util.defaultEquals;
- if (array1.length !== array2.length) {
- return false;
- }
- var length = array1.length;
- for (var i = 0; i < length; i++) {
- if (!equals(array1[i], array2[i])) {
- return false;
- }
- }
- return true;
-}
-exports.equals = equals;
-/**
- * Returns shallow a copy of the specified array.
- * @param {*} array the array to copy.
- * @return {Array} a copy of the specified array
- */
-function copy(array) {
- return array.concat();
-}
-exports.copy = copy;
-/**
- * Swaps the elements at the specified positions in the specified array.
- * @param {Array} array The array in which to swap elements.
- * @param {number} i the index of one element to be swapped.
- * @param {number} j the index of the other element to be swapped.
- * @return {boolean} true if the array is defined and the indexes are valid.
- */
-function swap(array, i, j) {
- if (i < 0 || i >= array.length || j < 0 || j >= array.length) {
- return false;
- }
- var temp = array[i];
- array[i] = array[j];
- array[j] = temp;
- return true;
-}
-exports.swap = swap;
-function toString(array) {
- return '[' + array.toString() + ']';
-}
-exports.toString = toString;
-/**
- * Executes the provided function once for each element present in this array
- * starting from index 0 to length - 1.
- * @param {Array} array The array in which to iterate.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
-function forEach(array, callback) {
- for (var _i = 0, array_1 = array; _i < array_1.length; _i++) {
- var ele = array_1[_i];
- if (callback(ele) === false) {
- return;
- }
- }
-}
-exports.forEach = forEach;
-//# sourceMappingURL=arrays.js.map
\ No newline at end of file
diff --git a/dist/lib/arrays.js.map b/dist/lib/arrays.js.map
deleted file mode 100644
index 6baed1e..0000000
--- a/dist/lib/arrays.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../../src/lib/arrays.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/lib/index.d.ts b/dist/lib/index.d.ts
deleted file mode 100644
index f9a7292..0000000
--- a/dist/lib/index.d.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import * as _arrays from './arrays';
-export declare var arrays: typeof _arrays;
-export { default as Bag } from './Bag';
-export { default as BSTree } from './BSTree';
-export { default as Dictionary } from './Dictionary';
-export { default as Heap } from './Heap';
-export { default as LinkedDictionary } from './LinkedDictionary';
-export { default as LinkedList } from './LinkedList';
-export { default as MultiDictionary } from './MultiDictionary';
-export { default as FactoryDictionary } from './FactoryDictionary';
-export { default as DefaultDictionary } from './FactoryDictionary';
-export { default as Queue } from './Queue';
-export { default as PriorityQueue } from './PriorityQueue';
-export { default as Set } from './Set';
-export { default as Stack } from './Stack';
-export { default as MultiRootTree } from './MultiRootTree';
-import * as _util from './util';
-export declare var util: typeof _util;
diff --git a/dist/lib/index.js b/dist/lib/index.js
deleted file mode 100644
index cdcee04..0000000
--- a/dist/lib/index.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-// Copyright 2013 Basarat Ali Syed. All Rights Reserved.
-//
-// Licensed under MIT open source license http://opensource.org/licenses/MIT
-//
-// Orginal javascript code was by Mauricio Santos
-//
-var _arrays = require('./arrays');
-exports.arrays = _arrays;
-var Bag_1 = require('./Bag');
-exports.Bag = Bag_1.default;
-var BSTree_1 = require('./BSTree');
-exports.BSTree = BSTree_1.default;
-var Dictionary_1 = require('./Dictionary');
-exports.Dictionary = Dictionary_1.default;
-var Heap_1 = require('./Heap');
-exports.Heap = Heap_1.default;
-var LinkedDictionary_1 = require('./LinkedDictionary');
-exports.LinkedDictionary = LinkedDictionary_1.default;
-var LinkedList_1 = require('./LinkedList');
-exports.LinkedList = LinkedList_1.default;
-var MultiDictionary_1 = require('./MultiDictionary');
-exports.MultiDictionary = MultiDictionary_1.default;
-var FactoryDictionary_1 = require('./FactoryDictionary');
-exports.FactoryDictionary = FactoryDictionary_1.default;
-var FactoryDictionary_2 = require('./FactoryDictionary');
-exports.DefaultDictionary = FactoryDictionary_2.default;
-var Queue_1 = require('./Queue');
-exports.Queue = Queue_1.default;
-var PriorityQueue_1 = require('./PriorityQueue');
-exports.PriorityQueue = PriorityQueue_1.default;
-var Set_1 = require('./Set');
-exports.Set = Set_1.default;
-var Stack_1 = require('./Stack');
-exports.Stack = Stack_1.default;
-var MultiRootTree_1 = require('./MultiRootTree');
-exports.MultiRootTree = MultiRootTree_1.default;
-var _util = require('./util');
-exports.util = _util;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/dist/lib/index.js.map b/dist/lib/index.js.map
deleted file mode 100644
index f083d56..0000000
--- a/dist/lib/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":";AAAA,wDAAwD;AACxD,EAAE;AACF,4EAA4E;AAC5E,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,IAAY,OAAO,WAAM,UAAU,CAAC,CAAA;AACzB,cAAM,GAAG,OAAO,CAAC;AAC5B,oBAA6B,OAAO,CAAC;AAA7B,4BAA6B;AACrC,uBAAgC,UAAU,CAAC;AAAnC,kCAAmC;AAC3C,2BAAoC,cAAc,CAAC;AAA3C,0CAA2C;AACnD,qBAA8B,QAAQ,CAAC;AAA/B,8BAA+B;AACvC,iCAA0C,oBAAoB,CAAC;AAAvD,sDAAuD;AAC/D,2BAAoC,cAAc,CAAC;AAA3C,0CAA2C;AACnD,gCAAyC,mBAAmB,CAAC;AAArD,oDAAqD;AAC7D,kCAA2C,qBAAqB,CAAC;AAAzD,wDAAyD;AACjE,kCAA2C,qBAAqB,CAAC;AAAzD,wDAAyD;AACjE,sBAA+B,SAAS,CAAC;AAAjC,gCAAiC;AACzC,8BAAuC,iBAAiB,CAAC;AAAjD,gDAAiD;AACzD,oBAA6B,OAAO,CAAC;AAA7B,4BAA6B;AACrC,sBAA+B,SAAS,CAAC;AAAjC,gCAAiC;AACzC,8BAAuC,iBAAiB,CAAC;AAAjD,gDAAiD;AACzD,IAAY,KAAK,WAAM,QAAQ,CAAC,CAAA;AACrB,YAAI,GAAG,KAAK,CAAC"}
\ No newline at end of file
diff --git a/dist/lib/umd.js b/dist/lib/umd.js
deleted file mode 100644
index 386521c..0000000
--- a/dist/lib/umd.js
+++ /dev/null
@@ -1,3040 +0,0 @@
-(function(f) {
- if (typeof exports === "object" && typeof module !== "undefined") {
- module.exports = f()
- } else if (typeof define === "function" && define.amd) {
- define([], f)
- } else {
- var g;
- if (typeof window !== "undefined") {
- g = window
- } else if (typeof global !== "undefined") {
- g = global
- } else if (typeof self !== "undefined") {
- g = self
- } else {
- g = this
- }
- g.listComponent = f()
- }
-})(function() {
- var define, module, exports;
-require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oA binary search tree is a binary tree in which each
- * internal node stores an element such that the elements stored in the
- * left subtree are less than it and the elements
- * stored in the right subtree are greater.
- * Formally, a binary search tree is a node-based binary tree data structure which
- * has the following properties:
- *
- * The left subtree of a node contains only nodes with elements less
- * than the node's element
- * The right subtree of a node contains only nodes with elements greater
- * than the node's element
- * Both the left and right subtrees must also be binary search trees.
- *
- * If the inserted elements are custom objects a compare function must
- * be provided at construction time, otherwise the <=, === and >= operators are
- * used to compare elements. Example:
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two elements. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- function BSTree(compareFunction) {
- this.root = null;
- this.compare = compareFunction || util.defaultCompare;
- this.nElements = 0;
- }
- /**
- * Adds the specified element to this tree if it is not already present.
- * @param {Object} element the element to insert.
- * @return {boolean} true if this tree did not already contain the specified element.
- */
- BSTree.prototype.add = function (element) {
- if (util.isUndefined(element)) {
- return false;
- }
- if (this.insertNode(this.createNode(element)) !== null) {
- this.nElements++;
- return true;
- }
- return false;
- };
- /**
- * Removes all of the elements from this tree.
- */
- BSTree.prototype.clear = function () {
- this.root = null;
- this.nElements = 0;
- };
- /**
- * Returns true if this tree contains no elements.
- * @return {boolean} true if this tree contains no elements.
- */
- BSTree.prototype.isEmpty = function () {
- return this.nElements === 0;
- };
- /**
- * Returns the number of elements in this tree.
- * @return {number} the number of elements in this tree.
- */
- BSTree.prototype.size = function () {
- return this.nElements;
- };
- /**
- * Returns true if this tree contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this tree contains the specified element,
- * false otherwise.
- */
- BSTree.prototype.contains = function (element) {
- if (util.isUndefined(element)) {
- return false;
- }
- return this.searchNode(this.root, element) !== null;
- };
- /**
- * Removes the specified element from this tree if it is present.
- * @return {boolean} true if this tree contained the specified element.
- */
- BSTree.prototype.remove = function (element) {
- var node = this.searchNode(this.root, element);
- if (node === null) {
- return false;
- }
- this.removeNode(node);
- this.nElements--;
- return true;
- };
- /**
- * Executes the provided function once for each element present in this tree in
- * in-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- BSTree.prototype.inorderTraversal = function (callback) {
- this.inorderTraversalAux(this.root, callback, {
- stop: false
- });
- };
- /**
- * Executes the provided function once for each element present in this tree in pre-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- BSTree.prototype.preorderTraversal = function (callback) {
- this.preorderTraversalAux(this.root, callback, {
- stop: false
- });
- };
- /**
- * Executes the provided function once for each element present in this tree in post-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- BSTree.prototype.postorderTraversal = function (callback) {
- this.postorderTraversalAux(this.root, callback, {
- stop: false
- });
- };
- /**
- * Executes the provided function once for each element present in this tree in
- * level-order.
- * @param {function(Object):*} callback function to execute, it is invoked with one
- * argument: the element value, to break the iteration you can optionally return false.
- */
- BSTree.prototype.levelTraversal = function (callback) {
- this.levelTraversalAux(this.root, callback);
- };
- /**
- * Returns the minimum element of this tree.
- * @return {*} the minimum element of this tree or undefined if this tree is
- * is empty.
- */
- BSTree.prototype.minimum = function () {
- if (this.isEmpty()) {
- return undefined;
- }
- return this.minimumAux(this.root).element;
- };
- /**
- * Returns the maximum element of this tree.
- * @return {*} the maximum element of this tree or undefined if this tree is
- * is empty.
- */
- BSTree.prototype.maximum = function () {
- if (this.isEmpty()) {
- return undefined;
- }
- return this.maximumAux(this.root).element;
- };
- /**
- * Executes the provided function once for each element present in this tree in inorder.
- * Equivalent to inorderTraversal.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- BSTree.prototype.forEach = function (callback) {
- this.inorderTraversal(callback);
- };
- /**
- * Returns an array containing all of the elements in this tree in in-order.
- * @return {Array} an array containing all of the elements in this tree in in-order.
- */
- BSTree.prototype.toArray = function () {
- var array = [];
- this.inorderTraversal(function (element) {
- array.push(element);
- return true;
- });
- return array;
- };
- /**
- * Returns the height of this tree.
- * @return {number} the height of this tree or -1 if is empty.
- */
- BSTree.prototype.height = function () {
- return this.heightAux(this.root);
- };
- /**
- * @private
- */
- BSTree.prototype.searchNode = function (node, element) {
- var cmp = null;
- while (node !== null && cmp !== 0) {
- cmp = this.compare(element, node.element);
- if (cmp < 0) {
- node = node.leftCh;
- }
- else if (cmp > 0) {
- node = node.rightCh;
- }
- }
- return node;
- };
- /**
- * @private
- */
- BSTree.prototype.transplant = function (n1, n2) {
- if (n1.parent === null) {
- this.root = n2;
- }
- else if (n1 === n1.parent.leftCh) {
- n1.parent.leftCh = n2;
- }
- else {
- n1.parent.rightCh = n2;
- }
- if (n2 !== null) {
- n2.parent = n1.parent;
- }
- };
- /**
- * @private
- */
- BSTree.prototype.removeNode = function (node) {
- if (node.leftCh === null) {
- this.transplant(node, node.rightCh);
- }
- else if (node.rightCh === null) {
- this.transplant(node, node.leftCh);
- }
- else {
- var y = this.minimumAux(node.rightCh);
- if (y.parent !== node) {
- this.transplant(y, y.rightCh);
- y.rightCh = node.rightCh;
- y.rightCh.parent = y;
- }
- this.transplant(node, y);
- y.leftCh = node.leftCh;
- y.leftCh.parent = y;
- }
- };
- /**
- * @private
- */
- BSTree.prototype.inorderTraversalAux = function (node, callback, signal) {
- if (node === null || signal.stop) {
- return;
- }
- this.inorderTraversalAux(node.leftCh, callback, signal);
- if (signal.stop) {
- return;
- }
- signal.stop = callback(node.element) === false;
- if (signal.stop) {
- return;
- }
- this.inorderTraversalAux(node.rightCh, callback, signal);
- };
- /**
- * @private
- */
- BSTree.prototype.levelTraversalAux = function (node, callback) {
- var queue = new Queue_1.default();
- if (node !== null) {
- queue.enqueue(node);
- }
- while (!queue.isEmpty()) {
- node = queue.dequeue();
- if (callback(node.element) === false) {
- return;
- }
- if (node.leftCh !== null) {
- queue.enqueue(node.leftCh);
- }
- if (node.rightCh !== null) {
- queue.enqueue(node.rightCh);
- }
- }
- };
- /**
- * @private
- */
- BSTree.prototype.preorderTraversalAux = function (node, callback, signal) {
- if (node === null || signal.stop) {
- return;
- }
- signal.stop = callback(node.element) === false;
- if (signal.stop) {
- return;
- }
- this.preorderTraversalAux(node.leftCh, callback, signal);
- if (signal.stop) {
- return;
- }
- this.preorderTraversalAux(node.rightCh, callback, signal);
- };
- /**
- * @private
- */
- BSTree.prototype.postorderTraversalAux = function (node, callback, signal) {
- if (node === null || signal.stop) {
- return;
- }
- this.postorderTraversalAux(node.leftCh, callback, signal);
- if (signal.stop) {
- return;
- }
- this.postorderTraversalAux(node.rightCh, callback, signal);
- if (signal.stop) {
- return;
- }
- signal.stop = callback(node.element) === false;
- };
- /**
- * @private
- */
- BSTree.prototype.minimumAux = function (node) {
- while (node.leftCh !== null) {
- node = node.leftCh;
- }
- return node;
- };
- /**
- * @private
- */
- BSTree.prototype.maximumAux = function (node) {
- while (node.rightCh !== null) {
- node = node.rightCh;
- }
- return node;
- };
- /**
- * @private
- */
- BSTree.prototype.heightAux = function (node) {
- if (node === null) {
- return -1;
- }
- return Math.max(this.heightAux(node.leftCh), this.heightAux(node.rightCh)) + 1;
- };
- /*
- * @private
- */
- BSTree.prototype.insertNode = function (node) {
- var parent = null;
- var position = this.root;
- var cmp = null;
- while (position !== null) {
- cmp = this.compare(node.element, position.element);
- if (cmp === 0) {
- return null;
- }
- else if (cmp < 0) {
- parent = position;
- position = position.leftCh;
- }
- else {
- parent = position;
- position = position.rightCh;
- }
- }
- node.parent = parent;
- if (parent === null) {
- // tree is empty
- this.root = node;
- }
- else if (this.compare(node.element, parent.element) < 0) {
- parent.leftCh = node;
- }
- else {
- parent.rightCh = node;
- }
- return node;
- };
- /**
- * @private
- */
- BSTree.prototype.createNode = function (element) {
- return {
- element: element,
- leftCh: null,
- rightCh: null,
- parent: null
- };
- };
- return BSTree;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = BSTree;
-
-},{"./Queue":11,"./util":15}],2:[function(require,module,exports){
-"use strict";
-var util = require('./util');
-var Dictionary_1 = require('./Dictionary');
-var Set_1 = require('./Set');
-var Bag = (function () {
- /**
- * Creates an empty bag.
- * @class A bag is a special kind of set in which members are
- * allowed to appear more than once.
- * If the inserted elements are custom objects a function
- * which converts elements to unique strings must be provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert elements to strings. If the elements aren't strings or if toString()
- * is not appropriate, a custom function which receives an object and returns a
- * unique string must be provided.
- */
- function Bag(toStrFunction) {
- this.toStrF = toStrFunction || util.defaultToString;
- this.dictionary = new Dictionary_1.default(this.toStrF);
- this.nElements = 0;
- }
- /**
- * Adds nCopies of the specified object to this bag.
- * @param {Object} element element to add.
- * @param {number=} nCopies the number of copies to add, if this argument is
- * undefined 1 copy is added.
- * @return {boolean} true unless element is undefined.
- */
- Bag.prototype.add = function (element, nCopies) {
- if (nCopies === void 0) { nCopies = 1; }
- if (util.isUndefined(element) || nCopies <= 0) {
- return false;
- }
- if (!this.contains(element)) {
- var node = {
- value: element,
- copies: nCopies
- };
- this.dictionary.setValue(element, node);
- }
- else {
- this.dictionary.getValue(element).copies += nCopies;
- }
- this.nElements += nCopies;
- return true;
- };
- /**
- * Counts the number of copies of the specified object in this bag.
- * @param {Object} element the object to search for..
- * @return {number} the number of copies of the object, 0 if not found
- */
- Bag.prototype.count = function (element) {
- if (!this.contains(element)) {
- return 0;
- }
- else {
- return this.dictionary.getValue(element).copies;
- }
- };
- /**
- * Returns true if this bag contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this bag contains the specified element,
- * false otherwise.
- */
- Bag.prototype.contains = function (element) {
- return this.dictionary.containsKey(element);
- };
- /**
- * Removes nCopies of the specified object to this bag.
- * If the number of copies to remove is greater than the actual number
- * of copies in the Bag, all copies are removed.
- * @param {Object} element element to remove.
- * @param {number=} nCopies the number of copies to remove, if this argument is
- * undefined 1 copy is removed.
- * @return {boolean} true if at least 1 element was removed.
- */
- Bag.prototype.remove = function (element, nCopies) {
- if (nCopies === void 0) { nCopies = 1; }
- if (util.isUndefined(element) || nCopies <= 0) {
- return false;
- }
- if (!this.contains(element)) {
- return false;
- }
- else {
- var node = this.dictionary.getValue(element);
- if (nCopies > node.copies) {
- this.nElements -= node.copies;
- }
- else {
- this.nElements -= nCopies;
- }
- node.copies -= nCopies;
- if (node.copies <= 0) {
- this.dictionary.remove(element);
- }
- return true;
- }
- };
- /**
- * Returns an array containing all of the elements in this big in arbitrary order,
- * including multiple copies.
- * @return {Array} an array containing all of the elements in this bag.
- */
- Bag.prototype.toArray = function () {
- var a = [];
- var values = this.dictionary.values();
- for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
- var node = values_1[_i];
- var element = node.value;
- var copies = node.copies;
- for (var j = 0; j < copies; j++) {
- a.push(element);
- }
- }
- return a;
- };
- /**
- * Returns a set of unique elements in this bag.
- * @return {collections.Set} a set of unique elements in this bag.
- */
- Bag.prototype.toSet = function () {
- var toret = new Set_1.default(this.toStrF);
- var elements = this.dictionary.values();
- for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) {
- var ele = elements_1[_i];
- var value = ele.value;
- toret.add(value);
- }
- return toret;
- };
- /**
- * Executes the provided function once for each element
- * present in this bag, including multiple copies.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element. To break the iteration you can
- * optionally return false.
- */
- Bag.prototype.forEach = function (callback) {
- this.dictionary.forEach(function (k, v) {
- var value = v.value;
- var copies = v.copies;
- for (var i = 0; i < copies; i++) {
- if (callback(value) === false) {
- return false;
- }
- }
- return true;
- });
- };
- /**
- * Returns the number of elements in this bag.
- * @return {number} the number of elements in this bag.
- */
- Bag.prototype.size = function () {
- return this.nElements;
- };
- /**
- * Returns true if this bag contains no elements.
- * @return {boolean} true if this bag contains no elements.
- */
- Bag.prototype.isEmpty = function () {
- return this.nElements === 0;
- };
- /**
- * Removes all of the elements from this bag.
- */
- Bag.prototype.clear = function () {
- this.nElements = 0;
- this.dictionary.clear();
- };
- return Bag;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Bag; // End of bag
-
-},{"./Dictionary":3,"./Set":12,"./util":15}],3:[function(require,module,exports){
-"use strict";
-var util = require('./util');
-var Dictionary = (function () {
- /**
- * Creates an empty dictionary.
- * @class Dictionaries map keys to values; each key can map to at most one value.
- * This implementation accepts any kind of objects as keys.
- *
- * If the keys are custom objects a function which converts keys to unique
- * strings must be provided. Example:
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- */
- function Dictionary(toStrFunction) {
- this.table = {};
- this.nElements = 0;
- this.toStr = toStrFunction || util.defaultToString;
- }
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns undefined if this dictionary contains no mapping for this key.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * undefined if the map contains no mapping for this key.
- */
- Dictionary.prototype.getValue = function (key) {
- var pair = this.table['$' + this.toStr(key)];
- if (util.isUndefined(pair)) {
- return undefined;
- }
- return pair.value;
- };
- /**
- * Associates the specified value with the specified key in this dictionary.
- * If the dictionary previously contained a mapping for this key, the old
- * value is replaced by the specified value.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or undefined if
- * there was no mapping for the key or if the key/value are undefined.
- */
- Dictionary.prototype.setValue = function (key, value) {
- if (util.isUndefined(key) || util.isUndefined(value)) {
- return undefined;
- }
- var ret;
- var k = '$' + this.toStr(key);
- var previousElement = this.table[k];
- if (util.isUndefined(previousElement)) {
- this.nElements++;
- ret = undefined;
- }
- else {
- ret = previousElement.value;
- }
- this.table[k] = {
- key: key,
- value: value
- };
- return ret;
- };
- /**
- * Removes the mapping for this key from this dictionary if it is present.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @return {*} previous value associated with specified key, or undefined if
- * there was no mapping for key.
- */
- Dictionary.prototype.remove = function (key) {
- var k = '$' + this.toStr(key);
- var previousElement = this.table[k];
- if (!util.isUndefined(previousElement)) {
- delete this.table[k];
- this.nElements--;
- return previousElement.value;
- }
- return undefined;
- };
- /**
- * Returns an array containing all of the keys in this dictionary.
- * @return {Array} an array containing all of the keys in this dictionary.
- */
- Dictionary.prototype.keys = function () {
- var array = [];
- for (var name_1 in this.table) {
- if (util.has(this.table, name_1)) {
- var pair = this.table[name_1];
- array.push(pair.key);
- }
- }
- return array;
- };
- /**
- * Returns an array containing all of the values in this dictionary.
- * @return {Array} an array containing all of the values in this dictionary.
- */
- Dictionary.prototype.values = function () {
- var array = [];
- for (var name_2 in this.table) {
- if (util.has(this.table, name_2)) {
- var pair = this.table[name_2];
- array.push(pair.value);
- }
- }
- return array;
- };
- /**
- * Executes the provided function once for each key-value pair
- * present in this dictionary.
- * @param {function(Object,Object):*} callback function to execute, it is
- * invoked with two arguments: key and value. To break the iteration you can
- * optionally return false.
- */
- Dictionary.prototype.forEach = function (callback) {
- for (var name_3 in this.table) {
- if (util.has(this.table, name_3)) {
- var pair = this.table[name_3];
- var ret = callback(pair.key, pair.value);
- if (ret === false) {
- return;
- }
- }
- }
- };
- /**
- * Returns true if this dictionary contains a mapping for the specified key.
- * @param {Object} key key whose presence in this dictionary is to be
- * tested.
- * @return {boolean} true if this dictionary contains a mapping for the
- * specified key.
- */
- Dictionary.prototype.containsKey = function (key) {
- return !util.isUndefined(this.getValue(key));
- };
- /**
- * Removes all mappings from this dictionary.
- * @this {collections.Dictionary}
- */
- Dictionary.prototype.clear = function () {
- this.table = {};
- this.nElements = 0;
- };
- /**
- * Returns the number of keys in this dictionary.
- * @return {number} the number of key-value mappings in this dictionary.
- */
- Dictionary.prototype.size = function () {
- return this.nElements;
- };
- /**
- * Returns true if this dictionary contains no mappings.
- * @return {boolean} true if this dictionary contains no mappings.
- */
- Dictionary.prototype.isEmpty = function () {
- return this.nElements <= 0;
- };
- Dictionary.prototype.toString = function () {
- var toret = '{';
- this.forEach(function (k, v) {
- toret += "\n\t" + k + " : " + v;
- });
- return toret + '\n}';
- };
- return Dictionary;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Dictionary; // End of dictionary
-
-},{"./util":15}],4:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Dictionary_1 = require('./Dictionary');
-var util = require('./util');
-var FactoryDictionary = (function (_super) {
- __extends(FactoryDictionary, _super);
- /**
- * Creates an empty dictionary.
- * @class Dictionaries map keys to values; each key can map to at most one value.
- * This implementation accepts any kind of objects as keys.
- *
- * The default factory function should return a new object of the provided
- * type. Example:
- *
- * function petFactory() {
- * return new Pet();
- * }
- *
- *
- * If the keys are custom objects a function which converts keys to unique
- * strings must be provided. Example:
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * @constructor
- * @param {function():V=} defaultFactoryFunction function used to create a
- * default object.
- * @param {function(Object):string=} toStrFunction optional function used
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- */
- function FactoryDictionary(defaultFactoryFunction, toStrFunction) {
- _super.call(this, toStrFunction);
- this.defaultFactoryFunction = defaultFactoryFunction;
- }
- /**
- * Associates the specified default value with the specified key in this dictionary,
- * if it didn't contain the key yet. If the key existed, the existing value will be used.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} defaultValue default value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or the default value,
- * if the key didn't exist yet.
- */
- FactoryDictionary.prototype.setDefault = function (key, defaultValue) {
- var currentValue = _super.prototype.getValue.call(this, key);
- if (util.isUndefined(currentValue)) {
- this.setValue(key, defaultValue);
- return defaultValue;
- }
- return currentValue;
- };
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns a default value created by the factory passed in the constructor,
- * if this dictionary contains no mapping for this key. The missing key will
- * automatically be added to the dictionary.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * a default value if the map contains no mapping for this key.
- */
- FactoryDictionary.prototype.getValue = function (key) {
- return this.setDefault(key, this.defaultFactoryFunction());
- };
- return FactoryDictionary;
-}(Dictionary_1.default));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = FactoryDictionary;
-
-},{"./Dictionary":3,"./util":15}],5:[function(require,module,exports){
-"use strict";
-var collections = require('./util');
-var arrays = require('./arrays');
-var Heap = (function () {
- /**
- * Creates an empty Heap.
- * @class
- * A heap is a binary tree, where the nodes maintain the heap property:
- * each node is smaller than each of its children and therefore a MinHeap
- * This implementation uses an array to store elements.
- * If the inserted elements are custom objects a compare function must be provided,
- * at construction time, otherwise the <=, === and >= operators are
- * used to compare elements. Example:
- *
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- *
- * If a Max-Heap is wanted (greater elements on top) you can a provide a
- * reverse compare function to accomplish that behavior. Example:
- *
- *
- * function reverseCompare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return 1;
- * } if (a is greater than b by the ordering criterion) {
- * return -1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two elements. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- function Heap(compareFunction) {
- /**
- * Array used to store the elements od the heap.
- * @type {Array.}
- * @private
- */
- this.data = [];
- this.compare = compareFunction || collections.defaultCompare;
- }
- /**
- * Returns the index of the left child of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the left child
- * for.
- * @return {number} The index of the left child.
- * @private
- */
- Heap.prototype.leftChildIndex = function (nodeIndex) {
- return (2 * nodeIndex) + 1;
- };
- /**
- * Returns the index of the right child of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the right child
- * for.
- * @return {number} The index of the right child.
- * @private
- */
- Heap.prototype.rightChildIndex = function (nodeIndex) {
- return (2 * nodeIndex) + 2;
- };
- /**
- * Returns the index of the parent of the node at the given index.
- * @param {number} nodeIndex The index of the node to get the parent for.
- * @return {number} The index of the parent.
- * @private
- */
- Heap.prototype.parentIndex = function (nodeIndex) {
- return Math.floor((nodeIndex - 1) / 2);
- };
- /**
- * Returns the index of the smaller child node (if it exists).
- * @param {number} leftChild left child index.
- * @param {number} rightChild right child index.
- * @return {number} the index with the minimum value or -1 if it doesn't
- * exists.
- * @private
- */
- Heap.prototype.minIndex = function (leftChild, rightChild) {
- if (rightChild >= this.data.length) {
- if (leftChild >= this.data.length) {
- return -1;
- }
- else {
- return leftChild;
- }
- }
- else {
- if (this.compare(this.data[leftChild], this.data[rightChild]) <= 0) {
- return leftChild;
- }
- else {
- return rightChild;
- }
- }
- };
- /**
- * Moves the node at the given index up to its proper place in the heap.
- * @param {number} index The index of the node to move up.
- * @private
- */
- Heap.prototype.siftUp = function (index) {
- var parent = this.parentIndex(index);
- while (index > 0 && this.compare(this.data[parent], this.data[index]) > 0) {
- arrays.swap(this.data, parent, index);
- index = parent;
- parent = this.parentIndex(index);
- }
- };
- /**
- * Moves the node at the given index down to its proper place in the heap.
- * @param {number} nodeIndex The index of the node to move down.
- * @private
- */
- Heap.prototype.siftDown = function (nodeIndex) {
- //smaller child index
- var min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex));
- while (min >= 0 && this.compare(this.data[nodeIndex], this.data[min]) > 0) {
- arrays.swap(this.data, min, nodeIndex);
- nodeIndex = min;
- min = this.minIndex(this.leftChildIndex(nodeIndex), this.rightChildIndex(nodeIndex));
- }
- };
- /**
- * Retrieves but does not remove the root element of this heap.
- * @return {*} The value at the root of the heap. Returns undefined if the
- * heap is empty.
- */
- Heap.prototype.peek = function () {
- if (this.data.length > 0) {
- return this.data[0];
- }
- else {
- return undefined;
- }
- };
- /**
- * Adds the given element into the heap.
- * @param {*} element the element.
- * @return true if the element was added or fals if it is undefined.
- */
- Heap.prototype.add = function (element) {
- if (collections.isUndefined(element)) {
- return undefined;
- }
- this.data.push(element);
- this.siftUp(this.data.length - 1);
- return true;
- };
- /**
- * Retrieves and removes the root element of this heap.
- * @return {*} The value removed from the root of the heap. Returns
- * undefined if the heap is empty.
- */
- Heap.prototype.removeRoot = function () {
- if (this.data.length > 0) {
- var obj = this.data[0];
- this.data[0] = this.data[this.data.length - 1];
- this.data.splice(this.data.length - 1, 1);
- if (this.data.length > 0) {
- this.siftDown(0);
- }
- return obj;
- }
- return undefined;
- };
- /**
- * Returns true if this heap contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this Heap contains the specified element, false
- * otherwise.
- */
- Heap.prototype.contains = function (element) {
- var equF = collections.compareToEquals(this.compare);
- return arrays.contains(this.data, element, equF);
- };
- /**
- * Returns the number of elements in this heap.
- * @return {number} the number of elements in this heap.
- */
- Heap.prototype.size = function () {
- return this.data.length;
- };
- /**
- * Checks if this heap is empty.
- * @return {boolean} true if and only if this heap contains no items; false
- * otherwise.
- */
- Heap.prototype.isEmpty = function () {
- return this.data.length <= 0;
- };
- /**
- * Removes all of the elements from this heap.
- */
- Heap.prototype.clear = function () {
- this.data.length = 0;
- };
- /**
- * Executes the provided function once for each element present in this heap in
- * no particular order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- Heap.prototype.forEach = function (callback) {
- arrays.forEach(this.data, callback);
- };
- return Heap;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Heap;
-
-},{"./arrays":14,"./util":15}],6:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var Dictionary_1 = require('./Dictionary');
-var util = require('./util');
-/**
- * This class is used by the LinkedDictionary Internally
- * Has to be a class, not an interface, because it needs to have
- * the 'unlink' function defined.
- */
-var LinkedDictionaryPair = (function () {
- function LinkedDictionaryPair(key, value) {
- this.key = key;
- this.value = value;
- }
- LinkedDictionaryPair.prototype.unlink = function () {
- this.prev.next = this.next;
- this.next.prev = this.prev;
- };
- return LinkedDictionaryPair;
-}());
-var LinkedDictionary = (function (_super) {
- __extends(LinkedDictionary, _super);
- function LinkedDictionary(toStrFunction) {
- _super.call(this, toStrFunction);
- this.head = new LinkedDictionaryPair(null, null);
- this.tail = new LinkedDictionaryPair(null, null);
- this.head.next = this.tail;
- this.tail.prev = this.head;
- }
- /**
- * Inserts the new node to the 'tail' of the list, updating the
- * neighbors, and moving 'this.tail' (the End of List indicator) that
- * to the end.
- */
- LinkedDictionary.prototype.appendToTail = function (entry) {
- var lastNode = this.tail.prev;
- lastNode.next = entry;
- entry.prev = lastNode;
- entry.next = this.tail;
- this.tail.prev = entry;
- };
- /**
- * Retrieves a linked dictionary from the table internally
- */
- LinkedDictionary.prototype.getLinkedDictionaryPair = function (key) {
- if (util.isUndefined(key)) {
- return undefined;
- }
- var k = '$' + this.toStr(key);
- var pair = (this.table[k]);
- return pair;
- };
- /**
- * Returns the value to which this dictionary maps the specified key.
- * Returns undefined if this dictionary contains no mapping for this key.
- * @param {Object} key key whose associated value is to be returned.
- * @return {*} the value to which this dictionary maps the specified key or
- * undefined if the map contains no mapping for this key.
- */
- LinkedDictionary.prototype.getValue = function (key) {
- var pair = this.getLinkedDictionaryPair(key);
- if (!util.isUndefined(pair)) {
- return pair.value;
- }
- return undefined;
- };
- /**
- * Removes the mapping for this key from this dictionary if it is present.
- * Also, if a value is present for this key, the entry is removed from the
- * insertion ordering.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @return {*} previous value associated with specified key, or undefined if
- * there was no mapping for key.
- */
- LinkedDictionary.prototype.remove = function (key) {
- var pair = this.getLinkedDictionaryPair(key);
- if (!util.isUndefined(pair)) {
- _super.prototype.remove.call(this, key); // This will remove it from the table
- pair.unlink(); // This will unlink it from the chain
- return pair.value;
- }
- return undefined;
- };
- /**
- * Removes all mappings from this LinkedDictionary.
- * @this {collections.LinkedDictionary}
- */
- LinkedDictionary.prototype.clear = function () {
- _super.prototype.clear.call(this);
- this.head.next = this.tail;
- this.tail.prev = this.head;
- };
- /**
- * Internal function used when updating an existing KeyValue pair.
- * It places the new value indexed by key into the table, but maintains
- * its place in the linked ordering.
- */
- LinkedDictionary.prototype.replace = function (oldPair, newPair) {
- var k = '$' + this.toStr(newPair.key);
- // set the new Pair's links to existingPair's links
- newPair.next = oldPair.next;
- newPair.prev = oldPair.prev;
- // Delete Existing Pair from the table, unlink it from chain.
- // As a result, the nElements gets decremented by this operation
- this.remove(oldPair.key);
- // Link new Pair in place of where oldPair was,
- // by pointing the old pair's neighbors to it.
- newPair.prev.next = newPair;
- newPair.next.prev = newPair;
- this.table[k] = newPair;
- // To make up for the fact that the number of elements was decremented,
- // We need to increase it by one.
- ++this.nElements;
- };
- /**
- * Associates the specified value with the specified key in this dictionary.
- * If the dictionary previously contained a mapping for this key, the old
- * value is replaced by the specified value.
- * Updating of a key that already exists maintains its place in the
- * insertion order into the map.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value value to be associated with the specified key.
- * @return {*} previous value associated with the specified key, or undefined if
- * there was no mapping for the key or if the key/value are undefined.
- */
- LinkedDictionary.prototype.setValue = function (key, value) {
- if (util.isUndefined(key) || util.isUndefined(value)) {
- return undefined;
- }
- var existingPair = this.getLinkedDictionaryPair(key);
- var newPair = new LinkedDictionaryPair(key, value);
- var k = '$' + this.toStr(key);
- // If there is already an element for that key, we
- // keep it's place in the LinkedList
- if (!util.isUndefined(existingPair)) {
- this.replace(existingPair, newPair);
- return existingPair.value;
- }
- else {
- this.appendToTail(newPair);
- this.table[k] = newPair;
- ++this.nElements;
- return undefined;
- }
- };
- /**
- * Returns an array containing all of the keys in this LinkedDictionary, ordered
- * by insertion order.
- * @return {Array} an array containing all of the keys in this LinkedDictionary,
- * ordered by insertion order.
- */
- LinkedDictionary.prototype.keys = function () {
- var array = [];
- this.forEach(function (key, value) {
- array.push(key);
- });
- return array;
- };
- /**
- * Returns an array containing all of the values in this LinkedDictionary, ordered by
- * insertion order.
- * @return {Array} an array containing all of the values in this LinkedDictionary,
- * ordered by insertion order.
- */
- LinkedDictionary.prototype.values = function () {
- var array = [];
- this.forEach(function (key, value) {
- array.push(value);
- });
- return array;
- };
- /**
- * Executes the provided function once for each key-value pair
- * present in this LinkedDictionary. It is done in the order of insertion
- * into the LinkedDictionary
- * @param {function(Object,Object):*} callback function to execute, it is
- * invoked with two arguments: key and value. To break the iteration you can
- * optionally return false.
- */
- LinkedDictionary.prototype.forEach = function (callback) {
- var crawlNode = this.head.next;
- while (crawlNode.next != null) {
- var ret = callback(crawlNode.key, crawlNode.value);
- if (ret === false) {
- return;
- }
- crawlNode = crawlNode.next;
- }
- };
- return LinkedDictionary;
-}(Dictionary_1.default));
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = LinkedDictionary; // End of LinkedDictionary
-// /**
-// * Returns true if this dictionary is equal to the given dictionary.
-// * Two dictionaries are equal if they contain the same mappings.
-// * @param {collections.Dictionary} other the other dictionary.
-// * @param {function(Object,Object):boolean=} valuesEqualFunction optional
-// * function used to check if two values are equal.
-// * @return {boolean} true if this dictionary is equal to the given dictionary.
-// */
-// collections.Dictionary.prototype.equals = function(other,valuesEqualFunction) {
-// const eqF = valuesEqualFunction || collections.defaultEquals;
-// if(!(other instanceof collections.Dictionary)){
-// return false;
-// }
-// if(this.size() !== other.size()){
-// return false;
-// }
-// return this.equalsAux(this.firstNode,other.firstNode,eqF);
-// }
-
-},{"./Dictionary":3,"./util":15}],7:[function(require,module,exports){
-"use strict";
-var util = require('./util');
-var arrays = require('./arrays');
-var LinkedList = (function () {
- /**
- * Creates an empty Linked List.
- * @class A linked list is a data structure consisting of a group of nodes
- * which together represent a sequence.
- * @constructor
- */
- function LinkedList() {
- /**
- * First node in the list
- * @type {Object}
- * @private
- */
- this.firstNode = null;
- /**
- * Last node in the list
- * @type {Object}
- * @private
- */
- this.lastNode = null;
- /**
- * Number of elements in the list
- * @type {number}
- * @private
- */
- this.nElements = 0;
- }
- /**
- * Adds an element to this list.
- * @param {Object} item element to be added.
- * @param {number=} index optional index to add the element. If no index is specified
- * the element is added to the end of this list.
- * @return {boolean} true if the element was added or false if the index is invalid
- * or if the element is undefined.
- */
- LinkedList.prototype.add = function (item, index) {
- if (util.isUndefined(index)) {
- index = this.nElements;
- }
- if (index < 0 || index > this.nElements || util.isUndefined(item)) {
- return false;
- }
- var newNode = this.createNode(item);
- if (this.nElements === 0) {
- // First node in the list.
- this.firstNode = newNode;
- this.lastNode = newNode;
- }
- else if (index === this.nElements) {
- // Insert at the end.
- this.lastNode.next = newNode;
- this.lastNode = newNode;
- }
- else if (index === 0) {
- // Change first node.
- newNode.next = this.firstNode;
- this.firstNode = newNode;
- }
- else {
- var prev = this.nodeAtIndex(index - 1);
- newNode.next = prev.next;
- prev.next = newNode;
- }
- this.nElements++;
- return true;
- };
- /**
- * Returns the first element in this list.
- * @return {*} the first element of the list or undefined if the list is
- * empty.
- */
- LinkedList.prototype.first = function () {
- if (this.firstNode !== null) {
- return this.firstNode.element;
- }
- return undefined;
- };
- /**
- * Returns the last element in this list.
- * @return {*} the last element in the list or undefined if the list is
- * empty.
- */
- LinkedList.prototype.last = function () {
- if (this.lastNode !== null) {
- return this.lastNode.element;
- }
- return undefined;
- };
- /**
- * Returns the element at the specified position in this list.
- * @param {number} index desired index.
- * @return {*} the element at the given index or undefined if the index is
- * out of bounds.
- */
- LinkedList.prototype.elementAtIndex = function (index) {
- var node = this.nodeAtIndex(index);
- if (node === null) {
- return undefined;
- }
- return node.element;
- };
- /**
- * Returns the index in this list of the first occurrence of the
- * specified element, or -1 if the List does not contain this element.
- * If the elements inside this list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction Optional
- * function used to check if two elements are equal.
- * @return {number} the index in this list of the first occurrence
- * of the specified element, or -1 if this list does not contain the
- * element.
- */
- LinkedList.prototype.indexOf = function (item, equalsFunction) {
- var equalsF = equalsFunction || util.defaultEquals;
- if (util.isUndefined(item)) {
- return -1;
- }
- var currentNode = this.firstNode;
- var index = 0;
- while (currentNode !== null) {
- if (equalsF(currentNode.element, item)) {
- return index;
- }
- index++;
- currentNode = currentNode.next;
- }
- return -1;
- };
- /**
- * Returns true if this list contains the specified element.
- * If the elements inside the list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction Optional
- * function used to check if two elements are equal.
- * @return {boolean} true if this list contains the specified element, false
- * otherwise.
- */
- LinkedList.prototype.contains = function (item, equalsFunction) {
- return (this.indexOf(item, equalsFunction) >= 0);
- };
- /**
- * Removes the first occurrence of the specified element in this list.
- * If the elements inside the list are
- * not comparable with the === operator a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName = function(pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} item element to be removed from this list, if present.
- * @return {boolean} true if the list contained the specified element.
- */
- LinkedList.prototype.remove = function (item, equalsFunction) {
- var equalsF = equalsFunction || util.defaultEquals;
- if (this.nElements < 1 || util.isUndefined(item)) {
- return false;
- }
- var previous = null;
- var currentNode = this.firstNode;
- while (currentNode !== null) {
- if (equalsF(currentNode.element, item)) {
- if (currentNode === this.firstNode) {
- this.firstNode = this.firstNode.next;
- if (currentNode === this.lastNode) {
- this.lastNode = null;
- }
- }
- else if (currentNode === this.lastNode) {
- this.lastNode = previous;
- previous.next = currentNode.next;
- currentNode.next = null;
- }
- else {
- previous.next = currentNode.next;
- currentNode.next = null;
- }
- this.nElements--;
- return true;
- }
- previous = currentNode;
- currentNode = currentNode.next;
- }
- return false;
- };
- /**
- * Removes all of the elements from this list.
- */
- LinkedList.prototype.clear = function () {
- this.firstNode = null;
- this.lastNode = null;
- this.nElements = 0;
- };
- /**
- * Returns true if this list is equal to the given list.
- * Two lists are equal if they have the same elements in the same order.
- * @param {LinkedList} other the other list.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function used to check if two elements are equal. If the elements in the lists
- * are custom objects you should provide a function, otherwise
- * the === operator is used to check equality between elements.
- * @return {boolean} true if this list is equal to the given list.
- */
- LinkedList.prototype.equals = function (other, equalsFunction) {
- var eqF = equalsFunction || util.defaultEquals;
- if (!(other instanceof LinkedList)) {
- return false;
- }
- if (this.size() !== other.size()) {
- return false;
- }
- return this.equalsAux(this.firstNode, other.firstNode, eqF);
- };
- /**
- * @private
- */
- LinkedList.prototype.equalsAux = function (n1, n2, eqF) {
- while (n1 !== null) {
- if (!eqF(n1.element, n2.element)) {
- return false;
- }
- n1 = n1.next;
- n2 = n2.next;
- }
- return true;
- };
- /**
- * Removes the element at the specified position in this list.
- * @param {number} index given index.
- * @return {*} removed element or undefined if the index is out of bounds.
- */
- LinkedList.prototype.removeElementAtIndex = function (index) {
- if (index < 0 || index >= this.nElements) {
- return undefined;
- }
- var element;
- if (this.nElements === 1) {
- //First node in the list.
- element = this.firstNode.element;
- this.firstNode = null;
- this.lastNode = null;
- }
- else {
- var previous = this.nodeAtIndex(index - 1);
- if (previous === null) {
- element = this.firstNode.element;
- this.firstNode = this.firstNode.next;
- }
- else if (previous.next === this.lastNode) {
- element = this.lastNode.element;
- this.lastNode = previous;
- }
- if (previous !== null) {
- element = previous.next.element;
- previous.next = previous.next.next;
- }
- }
- this.nElements--;
- return element;
- };
- /**
- * Executes the provided function once for each element present in this list in order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- LinkedList.prototype.forEach = function (callback) {
- var currentNode = this.firstNode;
- while (currentNode !== null) {
- if (callback(currentNode.element) === false) {
- break;
- }
- currentNode = currentNode.next;
- }
- };
- /**
- * Reverses the order of the elements in this linked list (makes the last
- * element first, and the first element last).
- */
- LinkedList.prototype.reverse = function () {
- var previous = null;
- var current = this.firstNode;
- var temp = null;
- while (current !== null) {
- temp = current.next;
- current.next = previous;
- previous = current;
- current = temp;
- }
- temp = this.firstNode;
- this.firstNode = this.lastNode;
- this.lastNode = temp;
- };
- /**
- * Returns an array containing all of the elements in this list in proper
- * sequence.
- * @return {Array.<*>} an array containing all of the elements in this list,
- * in proper sequence.
- */
- LinkedList.prototype.toArray = function () {
- var array = [];
- var currentNode = this.firstNode;
- while (currentNode !== null) {
- array.push(currentNode.element);
- currentNode = currentNode.next;
- }
- return array;
- };
- /**
- * Returns the number of elements in this list.
- * @return {number} the number of elements in this list.
- */
- LinkedList.prototype.size = function () {
- return this.nElements;
- };
- /**
- * Returns true if this list contains no elements.
- * @return {boolean} true if this list contains no elements.
- */
- LinkedList.prototype.isEmpty = function () {
- return this.nElements <= 0;
- };
- LinkedList.prototype.toString = function () {
- return arrays.toString(this.toArray());
- };
- /**
- * @private
- */
- LinkedList.prototype.nodeAtIndex = function (index) {
- if (index < 0 || index >= this.nElements) {
- return null;
- }
- if (index === (this.nElements - 1)) {
- return this.lastNode;
- }
- var node = this.firstNode;
- for (var i = 0; i < index; i++) {
- node = node.next;
- }
- return node;
- };
- /**
- * @private
- */
- LinkedList.prototype.createNode = function (item) {
- return {
- element: item,
- next: null
- };
- };
- return LinkedList;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = LinkedList; // End of linked list
-
-},{"./arrays":14,"./util":15}],8:[function(require,module,exports){
-"use strict";
-var util = require('./util');
-var Dictionary_1 = require('./Dictionary');
-var arrays = require('./arrays');
-var MultiDictionary = (function () {
- /**
- * Creates an empty multi dictionary.
- * @class A multi dictionary is a special kind of dictionary that holds
- * multiple values against each key. Setting a value into the dictionary will
- * add the value to an array at that key. Getting a key will return an array,
- * holding all the values set to that key.
- * You can configure to allow duplicates in the values.
- * This implementation accepts any kind of objects as keys.
- *
- * If the keys are custom objects a function which converts keys to strings must be
- * provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- * If the values are custom objects a function to check equality between values
- * must be provided. Example:
- *
- *
- * function petsAreEqualByAge(pet1,pet2) {
- * return pet1.age===pet2.age;
- * }
- *
- * @constructor
- * @param {function(Object):string=} toStrFunction optional function
- * to convert keys to strings. If the keys aren't strings or if toString()
- * is not appropriate, a custom function which receives a key and returns a
- * unique string must be provided.
- * @param {function(Object,Object):boolean=} valuesEqualsFunction optional
- * function to check if two values are equal.
- *
- * @param allowDuplicateValues
- */
- function MultiDictionary(toStrFunction, valuesEqualsFunction, allowDuplicateValues) {
- if (allowDuplicateValues === void 0) { allowDuplicateValues = false; }
- this.dict = new Dictionary_1.default(toStrFunction);
- this.equalsF = valuesEqualsFunction || util.defaultEquals;
- this.allowDuplicate = allowDuplicateValues;
- }
- /**
- * Returns an array holding the values to which this dictionary maps
- * the specified key.
- * Returns an empty array if this dictionary contains no mappings for this key.
- * @param {Object} key key whose associated values are to be returned.
- * @return {Array} an array holding the values to which this dictionary maps
- * the specified key.
- */
- MultiDictionary.prototype.getValue = function (key) {
- var values = this.dict.getValue(key);
- if (util.isUndefined(values)) {
- return [];
- }
- return arrays.copy(values);
- };
- /**
- * Adds the value to the array associated with the specified key, if
- * it is not already present.
- * @param {Object} key key with which the specified value is to be
- * associated.
- * @param {Object} value the value to add to the array at the key
- * @return {boolean} true if the value was not already associated with that key.
- */
- MultiDictionary.prototype.setValue = function (key, value) {
- if (util.isUndefined(key) || util.isUndefined(value)) {
- return false;
- }
- if (!this.containsKey(key)) {
- this.dict.setValue(key, [value]);
- return true;
- }
- var array = this.dict.getValue(key);
- if (!this.allowDuplicate) {
- if (arrays.contains(array, value, this.equalsF)) {
- return false;
- }
- }
- array.push(value);
- return true;
- };
- /**
- * Removes the specified values from the array of values associated with the
- * specified key. If a value isn't given, all values associated with the specified
- * key are removed.
- * @param {Object} key key whose mapping is to be removed from the
- * dictionary.
- * @param {Object=} value optional argument to specify the value to remove
- * from the array associated with the specified key.
- * @return {*} true if the dictionary changed, false if the key doesn't exist or
- * if the specified value isn't associated with the specified key.
- */
- MultiDictionary.prototype.remove = function (key, value) {
- if (util.isUndefined(value)) {
- var v = this.dict.remove(key);
- return !util.isUndefined(v);
- }
- var array = this.dict.getValue(key);
- if (arrays.remove(array, value, this.equalsF)) {
- if (array.length === 0) {
- this.dict.remove(key);
- }
- return true;
- }
- return false;
- };
- /**
- * Returns an array containing all of the keys in this dictionary.
- * @return {Array} an array containing all of the keys in this dictionary.
- */
- MultiDictionary.prototype.keys = function () {
- return this.dict.keys();
- };
- /**
- * Returns an array containing all of the values in this dictionary.
- * @return {Array} an array containing all of the values in this dictionary.
- */
- MultiDictionary.prototype.values = function () {
- var values = this.dict.values();
- var array = [];
- for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
- var v = values_1[_i];
- for (var _a = 0, v_1 = v; _a < v_1.length; _a++) {
- var w = v_1[_a];
- array.push(w);
- }
- }
- return array;
- };
- /**
- * Returns true if this dictionary at least one value associatted the specified key.
- * @param {Object} key key whose presence in this dictionary is to be
- * tested.
- * @return {boolean} true if this dictionary at least one value associatted
- * the specified key.
- */
- MultiDictionary.prototype.containsKey = function (key) {
- return this.dict.containsKey(key);
- };
- /**
- * Removes all mappings from this dictionary.
- */
- MultiDictionary.prototype.clear = function () {
- this.dict.clear();
- };
- /**
- * Returns the number of keys in this dictionary.
- * @return {number} the number of key-value mappings in this dictionary.
- */
- MultiDictionary.prototype.size = function () {
- return this.dict.size();
- };
- /**
- * Returns true if this dictionary contains no mappings.
- * @return {boolean} true if this dictionary contains no mappings.
- */
- MultiDictionary.prototype.isEmpty = function () {
- return this.dict.isEmpty();
- };
- return MultiDictionary;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MultiDictionary; // end of multi dictionary
-
-},{"./Dictionary":3,"./arrays":14,"./util":15}],9:[function(require,module,exports){
-"use strict";
-(function (Direction) {
- Direction[Direction["BEFORE"] = 0] = "BEFORE";
- Direction[Direction["AFTER"] = 1] = "AFTER";
- Direction[Direction["INSIDE_AT_END"] = 2] = "INSIDE_AT_END";
- Direction[Direction["INSIDE_AT_START"] = 3] = "INSIDE_AT_START";
-})(exports.Direction || (exports.Direction = {}));
-var Direction = exports.Direction;
-var MultiRootTree = (function () {
- function MultiRootTree(rootIds, nodes) {
- if (rootIds === void 0) { rootIds = []; }
- if (nodes === void 0) { nodes = {}; }
- this.rootIds = rootIds;
- this.nodes = nodes;
- }
- MultiRootTree.prototype.getRootIds = function () {
- var clone = this.rootIds.slice();
- return clone;
- };
- MultiRootTree.prototype.getNodes = function () {
- var clone = {};
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- clone[nodeKey] = this.nodes[nodeKey].slice();
- }
- }
- return clone;
- };
- MultiRootTree.prototype.getObject = function () {
- return {
- rootIds: this.getRootIds(),
- nodes: this.getNodes(),
- };
- };
- MultiRootTree.prototype.moveIdBeforeId = function (moveId, beforeId) {
- return this.moveId(moveId, beforeId, Direction.BEFORE);
- };
- MultiRootTree.prototype.moveIdAfterId = function (moveId, afterId) {
- return this.moveId(moveId, afterId, Direction.AFTER);
- };
- MultiRootTree.prototype.moveIdIntoId = function (moveId, insideId, atStart) {
- if (atStart === void 0) { atStart = true; }
- if (atStart) {
- return this.moveId(moveId, insideId, Direction.INSIDE_AT_START);
- }
- else {
- return this.moveId(moveId, insideId, Direction.INSIDE_AT_END);
- }
- };
- MultiRootTree.prototype.deleteId = function (id) {
- this.rootDeleteId(id);
- this.nodeAndSubNodesDelete(id);
- this.nodeRefrencesDelete(id);
- };
- MultiRootTree.prototype.insertIdBeforeId = function (beforeId, insertId) {
- var foundRootIdIndex = this.findRootId(beforeId);
- if (foundRootIdIndex > -1) {
- this.insertIdIntoRoot(insertId, foundRootIdIndex);
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var foundNodeIdIndex = this.findNodeId(nodeKey, beforeId);
- if (foundNodeIdIndex > -1) {
- this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex);
- }
- }
- }
- };
- MultiRootTree.prototype.insertIdAfterId = function (belowId, insertId) {
- var foundRootIdIndex = this.findRootId(belowId);
- if (foundRootIdIndex > -1) {
- this.insertIdIntoRoot(insertId, foundRootIdIndex + 1);
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var foundNodeIdIndex = this.findNodeId(nodeKey, belowId);
- if (foundNodeIdIndex > -1) {
- this.insertIdIntoNode(nodeKey, insertId, foundNodeIdIndex + 1);
- }
- }
- }
- };
- MultiRootTree.prototype.insertIdIntoId = function (insideId, insertId) {
- this.nodeInsertAtEnd(insideId, insertId);
- this.nodes[insertId] = [];
- };
- MultiRootTree.prototype.insertIdIntoRoot = function (id, position) {
- if (position === undefined) {
- this.rootInsertAtEnd(id);
- }
- else {
- if (position < 0) {
- var length_1 = this.rootIds.length;
- this.rootIds.splice((position + length_1 + 1), 0, id);
- }
- else {
- this.rootIds.splice(position, 0, id);
- }
- }
- this.nodes[id] = this.nodes[id] || [];
- };
- MultiRootTree.prototype.insertIdIntoNode = function (nodeKey, id, position) {
- this.nodes[nodeKey] = this.nodes[nodeKey] || [];
- this.nodes[id] = this.nodes[id] || [];
- if (position === undefined) {
- this.nodeInsertAtEnd(nodeKey, id);
- }
- else {
- if (position < 0) {
- var length_2 = this.nodes[nodeKey].length;
- this.nodes[nodeKey].splice((position + length_2 + 1), 0, id);
- }
- else {
- this.nodes[nodeKey].splice(position, 0, id);
- }
- }
- };
- MultiRootTree.prototype.moveId = function (moveId, beforeId, direction) {
- var sourceId = moveId;
- var sourceRootIndex = this.findRootId(sourceId);
- var sourceNodeKey;
- var sourceNodeIdIndex;
- if (this.nodes[beforeId]) {
- sourceNodeKey = beforeId;
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- sourceNodeIdIndex = this.findNodeId(nodeKey, beforeId);
- break;
- }
- }
- // got all
- var targetId = beforeId;
- var targetRootIndex = this.findRootId(targetId);
- var targetNodeKey;
- var targetNodeIdIndex;
- if (this.nodes[beforeId]) {
- targetNodeKey = beforeId;
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- targetNodeIdIndex = this.findNodeId(nodeKey, beforeId);
- break;
- }
- }
- // got all
- if (sourceRootIndex > -1) {
- if (targetRootIndex > -1) {
- this.rootDelete(sourceRootIndex);
- switch (direction) {
- case Direction.BEFORE:
- this.insertIdIntoRoot(sourceId, targetRootIndex);
- break;
- case Direction.AFTER:
- this.insertIdIntoRoot(sourceId, targetRootIndex + 1);
- break;
- case Direction.INSIDE_AT_START:
- this.nodeInsertAtStart(targetId, sourceId);
- break;
- case Direction.INSIDE_AT_END:
- this.nodeInsertAtEnd(targetId, sourceId);
- break;
- }
- }
- else {
- // moving root (source) ABOVE node (target)
- // will remove one entry from roots
- this.rootDelete(sourceRootIndex);
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var index = this.findNodeId(nodeKey, targetId);
- if (index > -1) {
- switch (direction) {
- case Direction.BEFORE:
- this.insertIdIntoNode(nodeKey, sourceId, index);
- break;
- case Direction.AFTER:
- this.insertIdIntoNode(nodeKey, sourceId, index + 1);
- break;
- case Direction.INSIDE_AT_START:
- this.nodeInsertAtStart(targetId, sourceId);
- break;
- case Direction.INSIDE_AT_END:
- this.nodeInsertAtEnd(targetId, sourceId);
- break;
- }
- break;
- }
- }
- }
- }
- }
- else {
- if (targetRootIndex > -1) {
- // moving node (source) ABOVE root (target)
- // delete source id from each node
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var index = this.findNodeId(nodeKey, sourceId);
- if (index > -1) {
- // this.nodeInsertId(nodeKey, sourceId, index);
- this.nodeDeleteAtIndex(nodeKey, index);
- break;
- }
- }
- }
- switch (direction) {
- case Direction.BEFORE:
- this.insertIdIntoRoot(sourceId, targetRootIndex);
- break;
- case Direction.AFTER:
- this.insertIdIntoRoot(sourceId, targetRootIndex + 1);
- break;
- case Direction.INSIDE_AT_START:
- this.nodeInsertAtStart(targetId, sourceId);
- break;
- case Direction.INSIDE_AT_END:
- this.nodeInsertAtEnd(targetId, sourceId);
- break;
- }
- }
- else {
- // moving node (source) ABOVE node (target)
- // delete source id from each node
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var index = this.findNodeId(nodeKey, sourceId);
- if (index > -1) {
- this.nodeDeleteAtIndex(nodeKey, index);
- break;
- }
- }
- }
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- var index = this.findNodeId(nodeKey, targetId);
- if (index > -1) {
- switch (direction) {
- case Direction.BEFORE:
- this.insertIdIntoNode(nodeKey, sourceId, index);
- break;
- case Direction.AFTER:
- this.insertIdIntoNode(nodeKey, sourceId, index + 1);
- break;
- case Direction.INSIDE_AT_START:
- this.nodeInsertAtStart(targetId, sourceId);
- break;
- case Direction.INSIDE_AT_END:
- this.nodeInsertAtEnd(targetId, sourceId);
- break;
- }
- break;
- }
- }
- }
- }
- }
- };
- MultiRootTree.prototype.swapArrayElements = function (arr, indexA, indexB) {
- var temp = arr[indexA];
- arr[indexA] = arr[indexB];
- arr[indexB] = temp;
- return arr;
- };
- ;
- MultiRootTree.prototype.rootDeleteId = function (id) {
- var index = this.findRootId(id);
- if (index > -1) {
- this.rootDelete(index);
- }
- };
- MultiRootTree.prototype.nodeAndSubNodesDelete = function (nodeKey) {
- var toDeleteLater = [];
- for (var i = 0; i < this.nodes[nodeKey].length; i++) {
- var id = this.nodes[nodeKey][i];
- this.nodeAndSubNodesDelete(id);
- toDeleteLater.push(nodeKey);
- }
- this.nodeDelete(nodeKey);
- for (var i = 0; i < toDeleteLater.length; i++) {
- this.nodeDelete(toDeleteLater[i]);
- }
- };
- MultiRootTree.prototype.nodeRefrencesDelete = function (id) {
- for (var nodeKey in this.nodes) {
- if (this.nodes.hasOwnProperty(nodeKey)) {
- for (var i = 0; i < this.nodes[nodeKey].length; i++) {
- var targetId = this.nodes[nodeKey][i];
- if (targetId === id) {
- this.nodeDeleteAtIndex(nodeKey, i);
- }
- }
- }
- }
- };
- MultiRootTree.prototype.nodeDelete = function (nodeKey) {
- delete this.nodes[nodeKey];
- };
- MultiRootTree.prototype.findRootId = function (id) {
- return this.rootIds.indexOf(id);
- };
- MultiRootTree.prototype.findNodeId = function (nodeKey, id) {
- return this.nodes[nodeKey].indexOf(id);
- };
- MultiRootTree.prototype.findNode = function (nodeKey) {
- return this.nodes[nodeKey];
- };
- MultiRootTree.prototype.nodeInsertAtStart = function (nodeKey, id) {
- this.nodes[nodeKey].unshift(id);
- };
- MultiRootTree.prototype.nodeInsertAtEnd = function (nodeKey, id) {
- this.nodes[nodeKey].push(id);
- };
- MultiRootTree.prototype.rootDelete = function (index) {
- this.rootIds.splice(index, 1);
- };
- MultiRootTree.prototype.nodeDeleteAtIndex = function (nodeKey, index) {
- this.nodes[nodeKey].splice(index, 1);
- };
- MultiRootTree.prototype.rootInsertAtStart = function (id) {
- this.rootIds.unshift(id);
- };
- MultiRootTree.prototype.rootInsertAtEnd = function (id) {
- this.rootIds.push(id);
- };
- return MultiRootTree;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = MultiRootTree;
-
-},{}],10:[function(require,module,exports){
-"use strict";
-var util = require('./util');
-var Heap_1 = require('./Heap');
-var PriorityQueue = (function () {
- /**
- * Creates an empty priority queue.
- * @class In a priority queue each element is associated with a "priority",
- * elements are dequeued in highest-priority-first order (the elements with the
- * highest priority are dequeued first). Priority Queues are implemented as heaps.
- * If the inserted elements are custom objects a compare function must be provided,
- * otherwise the <=, === and >= operators are used to compare object priority.
- *
- * function compare(a, b) {
- * if (a is less than b by some ordering criterion) {
- * return -1;
- * } if (a is greater than b by the ordering criterion) {
- * return 1;
- * }
- * // a must be equal to b
- * return 0;
- * }
- *
- * @constructor
- * @param {function(Object,Object):number=} compareFunction optional
- * function used to compare two element priorities. Must return a negative integer,
- * zero, or a positive integer as the first argument is less than, equal to,
- * or greater than the second.
- */
- function PriorityQueue(compareFunction) {
- this.heap = new Heap_1.default(util.reverseCompareFunction(compareFunction));
- }
- /**
- * Inserts the specified element into this priority queue.
- * @param {Object} element the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- PriorityQueue.prototype.enqueue = function (element) {
- return this.heap.add(element);
- };
- /**
- * Inserts the specified element into this priority queue.
- * @param {Object} element the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- PriorityQueue.prototype.add = function (element) {
- return this.heap.add(element);
- };
- /**
- * Retrieves and removes the highest priority element of this queue.
- * @return {*} the the highest priority element of this queue,
- * or undefined if this queue is empty.
- */
- PriorityQueue.prototype.dequeue = function () {
- if (this.heap.size() !== 0) {
- var el = this.heap.peek();
- this.heap.removeRoot();
- return el;
- }
- return undefined;
- };
- /**
- * Retrieves, but does not remove, the highest priority element of this queue.
- * @return {*} the highest priority element of this queue, or undefined if this queue is empty.
- */
- PriorityQueue.prototype.peek = function () {
- return this.heap.peek();
- };
- /**
- * Returns true if this priority queue contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this priority queue contains the specified element,
- * false otherwise.
- */
- PriorityQueue.prototype.contains = function (element) {
- return this.heap.contains(element);
- };
- /**
- * Checks if this priority queue is empty.
- * @return {boolean} true if and only if this priority queue contains no items; false
- * otherwise.
- */
- PriorityQueue.prototype.isEmpty = function () {
- return this.heap.isEmpty();
- };
- /**
- * Returns the number of elements in this priority queue.
- * @return {number} the number of elements in this priority queue.
- */
- PriorityQueue.prototype.size = function () {
- return this.heap.size();
- };
- /**
- * Removes all of the elements from this priority queue.
- */
- PriorityQueue.prototype.clear = function () {
- this.heap.clear();
- };
- /**
- * Executes the provided function once for each element present in this queue in
- * no particular order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- PriorityQueue.prototype.forEach = function (callback) {
- this.heap.forEach(callback);
- };
- return PriorityQueue;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = PriorityQueue; // end of priority queue
-
-},{"./Heap":5,"./util":15}],11:[function(require,module,exports){
-"use strict";
-var LinkedList_1 = require('./LinkedList');
-var Queue = (function () {
- /**
- * Creates an empty queue.
- * @class A queue is a First-In-First-Out (FIFO) data structure, the first
- * element added to the queue will be the first one to be removed. This
- * implementation uses a linked list as a container.
- * @constructor
- */
- function Queue() {
- this.list = new LinkedList_1.default();
- }
- /**
- * Inserts the specified element into the end of this queue.
- * @param {Object} elem the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- Queue.prototype.enqueue = function (elem) {
- return this.list.add(elem);
- };
- /**
- * Inserts the specified element into the end of this queue.
- * @param {Object} elem the element to insert.
- * @return {boolean} true if the element was inserted, or false if it is undefined.
- */
- Queue.prototype.add = function (elem) {
- return this.list.add(elem);
- };
- /**
- * Retrieves and removes the head of this queue.
- * @return {*} the head of this queue, or undefined if this queue is empty.
- */
- Queue.prototype.dequeue = function () {
- if (this.list.size() !== 0) {
- var el = this.list.first();
- this.list.removeElementAtIndex(0);
- return el;
- }
- return undefined;
- };
- /**
- * Retrieves, but does not remove, the head of this queue.
- * @return {*} the head of this queue, or undefined if this queue is empty.
- */
- Queue.prototype.peek = function () {
- if (this.list.size() !== 0) {
- return this.list.first();
- }
- return undefined;
- };
- /**
- * Returns the number of elements in this queue.
- * @return {number} the number of elements in this queue.
- */
- Queue.prototype.size = function () {
- return this.list.size();
- };
- /**
- * Returns true if this queue contains the specified element.
- * If the elements inside this stack are
- * not comparable with the === operator, a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName (pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} elem element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function to check if two elements are equal.
- * @return {boolean} true if this queue contains the specified element,
- * false otherwise.
- */
- Queue.prototype.contains = function (elem, equalsFunction) {
- return this.list.contains(elem, equalsFunction);
- };
- /**
- * Checks if this queue is empty.
- * @return {boolean} true if and only if this queue contains no items; false
- * otherwise.
- */
- Queue.prototype.isEmpty = function () {
- return this.list.size() <= 0;
- };
- /**
- * Removes all of the elements from this queue.
- */
- Queue.prototype.clear = function () {
- this.list.clear();
- };
- /**
- * Executes the provided function once for each element present in this queue in
- * FIFO order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- Queue.prototype.forEach = function (callback) {
- this.list.forEach(callback);
- };
- return Queue;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Queue; // End of queue
-
-},{"./LinkedList":7}],12:[function(require,module,exports){
-"use strict";
-var util = require('./util');
-var arrays = require('./arrays');
-var Dictionary_1 = require('./Dictionary');
-var Set = (function () {
- /**
- * Creates an empty set.
- * @class A set is a data structure that contains no duplicate items.
- * If the inserted elements are custom objects a function
- * which converts elements to strings must be provided. Example:
- *
- *
- * function petToString(pet) {
- * return pet.name;
- * }
- *
- *
- * @constructor
- * @param {function(Object):string=} toStringFunction optional function used
- * to convert elements to strings. If the elements aren't strings or if toString()
- * is not appropriate, a custom function which receives a onject and returns a
- * unique string must be provided.
- */
- function Set(toStringFunction) {
- this.dictionary = new Dictionary_1.default(toStringFunction);
- }
- /**
- * Returns true if this set contains the specified element.
- * @param {Object} element element to search for.
- * @return {boolean} true if this set contains the specified element,
- * false otherwise.
- */
- Set.prototype.contains = function (element) {
- return this.dictionary.containsKey(element);
- };
- /**
- * Adds the specified element to this set if it is not already present.
- * @param {Object} element the element to insert.
- * @return {boolean} true if this set did not already contain the specified element.
- */
- Set.prototype.add = function (element) {
- if (this.contains(element) || util.isUndefined(element)) {
- return false;
- }
- else {
- this.dictionary.setValue(element, element);
- return true;
- }
- };
- /**
- * Performs an intersecion between this an another set.
- * Removes all values that are not present this set and the given set.
- * @param {collections.Set} otherSet other set.
- */
- Set.prototype.intersection = function (otherSet) {
- var set = this;
- this.forEach(function (element) {
- if (!otherSet.contains(element)) {
- set.remove(element);
- }
- return true;
- });
- };
- /**
- * Performs a union between this an another set.
- * Adds all values from the given set to this set.
- * @param {collections.Set} otherSet other set.
- */
- Set.prototype.union = function (otherSet) {
- var set = this;
- otherSet.forEach(function (element) {
- set.add(element);
- return true;
- });
- };
- /**
- * Performs a difference between this an another set.
- * Removes from this set all the values that are present in the given set.
- * @param {collections.Set} otherSet other set.
- */
- Set.prototype.difference = function (otherSet) {
- var set = this;
- otherSet.forEach(function (element) {
- set.remove(element);
- return true;
- });
- };
- /**
- * Checks whether the given set contains all the elements in this set.
- * @param {collections.Set} otherSet other set.
- * @return {boolean} true if this set is a subset of the given set.
- */
- Set.prototype.isSubsetOf = function (otherSet) {
- if (this.size() > otherSet.size()) {
- return false;
- }
- var isSub = true;
- this.forEach(function (element) {
- if (!otherSet.contains(element)) {
- isSub = false;
- return false;
- }
- return true;
- });
- return isSub;
- };
- /**
- * Removes the specified element from this set if it is present.
- * @return {boolean} true if this set contained the specified element.
- */
- Set.prototype.remove = function (element) {
- if (!this.contains(element)) {
- return false;
- }
- else {
- this.dictionary.remove(element);
- return true;
- }
- };
- /**
- * Executes the provided function once for each element
- * present in this set.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one arguments: the element. To break the iteration you can
- * optionally return false.
- */
- Set.prototype.forEach = function (callback) {
- this.dictionary.forEach(function (k, v) {
- return callback(v);
- });
- };
- /**
- * Returns an array containing all of the elements in this set in arbitrary order.
- * @return {Array} an array containing all of the elements in this set.
- */
- Set.prototype.toArray = function () {
- return this.dictionary.values();
- };
- /**
- * Returns true if this set contains no elements.
- * @return {boolean} true if this set contains no elements.
- */
- Set.prototype.isEmpty = function () {
- return this.dictionary.isEmpty();
- };
- /**
- * Returns the number of elements in this set.
- * @return {number} the number of elements in this set.
- */
- Set.prototype.size = function () {
- return this.dictionary.size();
- };
- /**
- * Removes all of the elements from this set.
- */
- Set.prototype.clear = function () {
- this.dictionary.clear();
- };
- /*
- * Provides a string representation for display
- */
- Set.prototype.toString = function () {
- return arrays.toString(this.toArray());
- };
- return Set;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Set; // end of Set
-
-},{"./Dictionary":3,"./arrays":14,"./util":15}],13:[function(require,module,exports){
-"use strict";
-var LinkedList_1 = require('./LinkedList');
-var Stack = (function () {
- /**
- * Creates an empty Stack.
- * @class A Stack is a Last-In-First-Out (LIFO) data structure, the last
- * element added to the stack will be the first one to be removed. This
- * implementation uses a linked list as a container.
- * @constructor
- */
- function Stack() {
- this.list = new LinkedList_1.default();
- }
- /**
- * Pushes an item onto the top of this stack.
- * @param {Object} elem the element to be pushed onto this stack.
- * @return {boolean} true if the element was pushed or false if it is undefined.
- */
- Stack.prototype.push = function (elem) {
- return this.list.add(elem, 0);
- };
- /**
- * Pushes an item onto the top of this stack.
- * @param {Object} elem the element to be pushed onto this stack.
- * @return {boolean} true if the element was pushed or false if it is undefined.
- */
- Stack.prototype.add = function (elem) {
- return this.list.add(elem, 0);
- };
- /**
- * Removes the object at the top of this stack and returns that object.
- * @return {*} the object at the top of this stack or undefined if the
- * stack is empty.
- */
- Stack.prototype.pop = function () {
- return this.list.removeElementAtIndex(0);
- };
- /**
- * Looks at the object at the top of this stack without removing it from the
- * stack.
- * @return {*} the object at the top of this stack or undefined if the
- * stack is empty.
- */
- Stack.prototype.peek = function () {
- return this.list.first();
- };
- /**
- * Returns the number of elements in this stack.
- * @return {number} the number of elements in this stack.
- */
- Stack.prototype.size = function () {
- return this.list.size();
- };
- /**
- * Returns true if this stack contains the specified element.
- * If the elements inside this stack are
- * not comparable with the === operator, a custom equals function should be
- * provided to perform searches, the function must receive two arguments and
- * return true if they are equal, false otherwise. Example:
- *
- *
- * const petsAreEqualByName (pet1, pet2) {
- * return pet1.name === pet2.name;
- * }
- *
- * @param {Object} elem element to search for.
- * @param {function(Object,Object):boolean=} equalsFunction optional
- * function to check if two elements are equal.
- * @return {boolean} true if this stack contains the specified element,
- * false otherwise.
- */
- Stack.prototype.contains = function (elem, equalsFunction) {
- return this.list.contains(elem, equalsFunction);
- };
- /**
- * Checks if this stack is empty.
- * @return {boolean} true if and only if this stack contains no items; false
- * otherwise.
- */
- Stack.prototype.isEmpty = function () {
- return this.list.isEmpty();
- };
- /**
- * Removes all of the elements from this stack.
- */
- Stack.prototype.clear = function () {
- this.list.clear();
- };
- /**
- * Executes the provided function once for each element present in this stack in
- * LIFO order.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
- Stack.prototype.forEach = function (callback) {
- this.list.forEach(callback);
- };
- return Stack;
-}());
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = Stack; // End of stack
-
-},{"./LinkedList":7}],14:[function(require,module,exports){
-"use strict";
-var util = require('./util');
-/**
- * Returns the position of the first occurrence of the specified item
- * within the specified array.4
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the position of the first occurrence of the specified element
- * within the specified array, or -1 if not found.
- */
-function indexOf(array, item, equalsFunction) {
- var equals = equalsFunction || util.defaultEquals;
- var length = array.length;
- for (var i = 0; i < length; i++) {
- if (equals(array[i], item)) {
- return i;
- }
- }
- return -1;
-}
-exports.indexOf = indexOf;
-/**
- * Returns the position of the last occurrence of the specified element
- * within the specified array.
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the position of the last occurrence of the specified element
- * within the specified array or -1 if not found.
- */
-function lastIndexOf(array, item, equalsFunction) {
- var equals = equalsFunction || util.defaultEquals;
- var length = array.length;
- for (var i = length - 1; i >= 0; i--) {
- if (equals(array[i], item)) {
- return i;
- }
- }
- return -1;
-}
-exports.lastIndexOf = lastIndexOf;
-/**
- * Returns true if the specified array contains the specified element.
- * @param {*} array the array in which to search the element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function to
- * check equality between 2 elements.
- * @return {boolean} true if the specified array contains the specified element.
- */
-function contains(array, item, equalsFunction) {
- return indexOf(array, item, equalsFunction) >= 0;
-}
-exports.contains = contains;
-/**
- * Removes the first ocurrence of the specified element from the specified array.
- * @param {*} array the array in which to search element.
- * @param {Object} item the element to search.
- * @param {function(Object,Object):boolean=} equalsFunction optional function to
- * check equality between 2 elements.
- * @return {boolean} true if the array changed after this call.
- */
-function remove(array, item, equalsFunction) {
- var index = indexOf(array, item, equalsFunction);
- if (index < 0) {
- return false;
- }
- array.splice(index, 1);
- return true;
-}
-exports.remove = remove;
-/**
- * Returns the number of elements in the specified array equal
- * to the specified object.
- * @param {Array} array the array in which to determine the frequency of the element.
- * @param {Object} item the element whose frequency is to be determined.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between 2 elements.
- * @return {number} the number of elements in the specified array
- * equal to the specified object.
- */
-function frequency(array, item, equalsFunction) {
- var equals = equalsFunction || util.defaultEquals;
- var length = array.length;
- var freq = 0;
- for (var i = 0; i < length; i++) {
- if (equals(array[i], item)) {
- freq++;
- }
- }
- return freq;
-}
-exports.frequency = frequency;
-/**
- * Returns true if the two specified arrays are equal to one another.
- * Two arrays are considered equal if both arrays contain the same number
- * of elements, and all corresponding pairs of elements in the two
- * arrays are equal and are in the same order.
- * @param {Array} array1 one array to be tested for equality.
- * @param {Array} array2 the other array to be tested for equality.
- * @param {function(Object,Object):boolean=} equalsFunction optional function used to
- * check equality between elemements in the arrays.
- * @return {boolean} true if the two arrays are equal
- */
-function equals(array1, array2, equalsFunction) {
- var equals = equalsFunction || util.defaultEquals;
- if (array1.length !== array2.length) {
- return false;
- }
- var length = array1.length;
- for (var i = 0; i < length; i++) {
- if (!equals(array1[i], array2[i])) {
- return false;
- }
- }
- return true;
-}
-exports.equals = equals;
-/**
- * Returns shallow a copy of the specified array.
- * @param {*} array the array to copy.
- * @return {Array} a copy of the specified array
- */
-function copy(array) {
- return array.concat();
-}
-exports.copy = copy;
-/**
- * Swaps the elements at the specified positions in the specified array.
- * @param {Array} array The array in which to swap elements.
- * @param {number} i the index of one element to be swapped.
- * @param {number} j the index of the other element to be swapped.
- * @return {boolean} true if the array is defined and the indexes are valid.
- */
-function swap(array, i, j) {
- if (i < 0 || i >= array.length || j < 0 || j >= array.length) {
- return false;
- }
- var temp = array[i];
- array[i] = array[j];
- array[j] = temp;
- return true;
-}
-exports.swap = swap;
-function toString(array) {
- return '[' + array.toString() + ']';
-}
-exports.toString = toString;
-/**
- * Executes the provided function once for each element present in this array
- * starting from index 0 to length - 1.
- * @param {Array} array The array in which to iterate.
- * @param {function(Object):*} callback function to execute, it is
- * invoked with one argument: the element value, to break the iteration you can
- * optionally return false.
- */
-function forEach(array, callback) {
- for (var _i = 0, array_1 = array; _i < array_1.length; _i++) {
- var ele = array_1[_i];
- if (callback(ele) === false) {
- return;
- }
- }
-}
-exports.forEach = forEach;
-
-},{"./util":15}],15:[function(require,module,exports){
-"use strict";
-var _hasOwnProperty = Object.prototype.hasOwnProperty;
-exports.has = function (obj, prop) {
- return _hasOwnProperty.call(obj, prop);
-};
-/**
- * Default function to compare element order.
- * @function
- */
-function defaultCompare(a, b) {
- if (a < b) {
- return -1;
- }
- else if (a === b) {
- return 0;
- }
- else {
- return 1;
- }
-}
-exports.defaultCompare = defaultCompare;
-/**
- * Default function to test equality.
- * @function
- */
-function defaultEquals(a, b) {
- return a === b;
-}
-exports.defaultEquals = defaultEquals;
-/**
- * Default function to convert an object to a string.
- * @function
- */
-function defaultToString(item) {
- if (item === null) {
- return 'COLLECTION_NULL';
- }
- else if (isUndefined(item)) {
- return 'COLLECTION_UNDEFINED';
- }
- else if (isString(item)) {
- return '$s' + item;
- }
- else {
- return '$o' + item.toString();
- }
-}
-exports.defaultToString = defaultToString;
-/**
-* Joins all the properies of the object using the provided join string
-*/
-function makeString(item, join) {
- if (join === void 0) { join = ','; }
- if (item === null) {
- return 'COLLECTION_NULL';
- }
- else if (isUndefined(item)) {
- return 'COLLECTION_UNDEFINED';
- }
- else if (isString(item)) {
- return item.toString();
- }
- else {
- var toret = '{';
- var first = true;
- for (var prop in item) {
- if (exports.has(item, prop)) {
- if (first) {
- first = false;
- }
- else {
- toret = toret + join;
- }
- toret = toret + prop + ':' + item[prop];
- }
- }
- return toret + '}';
- }
-}
-exports.makeString = makeString;
-/**
- * Checks if the given argument is a function.
- * @function
- */
-function isFunction(func) {
- return (typeof func) === 'function';
-}
-exports.isFunction = isFunction;
-/**
- * Checks if the given argument is undefined.
- * @function
- */
-function isUndefined(obj) {
- return (typeof obj) === 'undefined';
-}
-exports.isUndefined = isUndefined;
-/**
- * Checks if the given argument is a string.
- * @function
- */
-function isString(obj) {
- return Object.prototype.toString.call(obj) === '[object String]';
-}
-exports.isString = isString;
-/**
- * Reverses a compare function.
- * @function
- */
-function reverseCompareFunction(compareFunction) {
- if (!isFunction(compareFunction)) {
- return function (a, b) {
- if (a < b) {
- return 1;
- }
- else if (a === b) {
- return 0;
- }
- else {
- return -1;
- }
- };
- }
- else {
- return function (d, v) {
- return compareFunction(d, v) * -1;
- };
- }
-}
-exports.reverseCompareFunction = reverseCompareFunction;
-/**
- * Returns an equal function given a compare function.
- * @function
- */
-function compareToEquals(compareFunction) {
- return function (a, b) {
- return compareFunction(a, b) === 0;
- };
-}
-exports.compareToEquals = compareToEquals;
-
-},{}],"typescript-collections":[function(require,module,exports){
-"use strict";
-// Copyright 2013 Basarat Ali Syed. All Rights Reserved.
-//
-// Licensed under MIT open source license http://opensource.org/licenses/MIT
-//
-// Orginal javascript code was by Mauricio Santos
-//
-var _arrays = require('./arrays');
-exports.arrays = _arrays;
-var Bag_1 = require('./Bag');
-exports.Bag = Bag_1.default;
-var BSTree_1 = require('./BSTree');
-exports.BSTree = BSTree_1.default;
-var Dictionary_1 = require('./Dictionary');
-exports.Dictionary = Dictionary_1.default;
-var Heap_1 = require('./Heap');
-exports.Heap = Heap_1.default;
-var LinkedDictionary_1 = require('./LinkedDictionary');
-exports.LinkedDictionary = LinkedDictionary_1.default;
-var LinkedList_1 = require('./LinkedList');
-exports.LinkedList = LinkedList_1.default;
-var MultiDictionary_1 = require('./MultiDictionary');
-exports.MultiDictionary = MultiDictionary_1.default;
-var FactoryDictionary_1 = require('./FactoryDictionary');
-exports.FactoryDictionary = FactoryDictionary_1.default;
-var FactoryDictionary_2 = require('./FactoryDictionary');
-exports.DefaultDictionary = FactoryDictionary_2.default;
-var Queue_1 = require('./Queue');
-exports.Queue = Queue_1.default;
-var PriorityQueue_1 = require('./PriorityQueue');
-exports.PriorityQueue = PriorityQueue_1.default;
-var Set_1 = require('./Set');
-exports.Set = Set_1.default;
-var Stack_1 = require('./Stack');
-exports.Stack = Stack_1.default;
-var MultiRootTree_1 = require('./MultiRootTree');
-exports.MultiRootTree = MultiRootTree_1.default;
-var _util = require('./util');
-exports.util = _util;
-
-},{"./BSTree":1,"./Bag":2,"./Dictionary":3,"./FactoryDictionary":4,"./Heap":5,"./LinkedDictionary":6,"./LinkedList":7,"./MultiDictionary":8,"./MultiRootTree":9,"./PriorityQueue":10,"./Queue":11,"./Set":12,"./Stack":13,"./arrays":14,"./util":15}]},{},[])
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L2xpYi9CU1RyZWUuanMiLCJkaXN0L2xpYi9CYWcuanMiLCJkaXN0L2xpYi9EaWN0aW9uYXJ5LmpzIiwiZGlzdC9saWIvRmFjdG9yeURpY3Rpb25hcnkuanMiLCJkaXN0L2xpYi9IZWFwLmpzIiwiZGlzdC9saWIvTGlua2VkRGljdGlvbmFyeS5qcyIsImRpc3QvbGliL0xpbmtlZExpc3QuanMiLCJkaXN0L2xpYi9NdWx0aURpY3Rpb25hcnkuanMiLCJkaXN0L2xpYi9NdWx0aVJvb3RUcmVlLmpzIiwiZGlzdC9saWIvUHJpb3JpdHlRdWV1ZS5qcyIsImRpc3QvbGliL1F1ZXVlLmpzIiwiZGlzdC9saWIvU2V0LmpzIiwiZGlzdC9saWIvU3RhY2suanMiLCJkaXN0L2xpYi9hcnJheXMuanMiLCJkaXN0L2xpYi91dGlsLmpzIiwiZGlzdC9saWIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIFF1ZXVlXzEgPSByZXF1aXJlKCcuL1F1ZXVlJyk7XG52YXIgQlNUcmVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGJpbmFyeSBzZWFyY2ggdHJlZS5cbiAgICAgKiBAY2xhc3MgPHA+QSBiaW5hcnkgc2VhcmNoIHRyZWUgaXMgYSBiaW5hcnkgdHJlZSBpbiB3aGljaCBlYWNoXG4gICAgICogaW50ZXJuYWwgbm9kZSBzdG9yZXMgYW4gZWxlbWVudCBzdWNoIHRoYXQgdGhlIGVsZW1lbnRzIHN0b3JlZCBpbiB0aGVcbiAgICAgKiBsZWZ0IHN1YnRyZWUgYXJlIGxlc3MgdGhhbiBpdCBhbmQgdGhlIGVsZW1lbnRzXG4gICAgICogc3RvcmVkIGluIHRoZSByaWdodCBzdWJ0cmVlIGFyZSBncmVhdGVyLjwvcD5cbiAgICAgKiA8cD5Gb3JtYWxseSwgYSBiaW5hcnkgc2VhcmNoIHRyZWUgaXMgYSBub2RlLWJhc2VkIGJpbmFyeSB0cmVlIGRhdGEgc3RydWN0dXJlIHdoaWNoXG4gICAgICogaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczo8L3A+XG4gICAgICogPHVsPlxuICAgICAqIDxsaT5UaGUgbGVmdCBzdWJ0cmVlIG9mIGEgbm9kZSBjb250YWlucyBvbmx5IG5vZGVzIHdpdGggZWxlbWVudHMgbGVzc1xuICAgICAqIHRoYW4gdGhlIG5vZGUncyBlbGVtZW50PC9saT5cbiAgICAgKiA8bGk+VGhlIHJpZ2h0IHN1YnRyZWUgb2YgYSBub2RlIGNvbnRhaW5zIG9ubHkgbm9kZXMgd2l0aCBlbGVtZW50cyBncmVhdGVyXG4gICAgICogdGhhbiB0aGUgbm9kZSdzIGVsZW1lbnQ8L2xpPlxuICAgICAqIDxsaT5Cb3RoIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlcyBtdXN0IGFsc28gYmUgYmluYXJ5IHNlYXJjaCB0cmVlcy48L2xpPlxuICAgICAqIDwvdWw+XG4gICAgICogPHA+SWYgdGhlIGluc2VydGVkIGVsZW1lbnRzIGFyZSBjdXN0b20gb2JqZWN0cyBhIGNvbXBhcmUgZnVuY3Rpb24gbXVzdFxuICAgICAqIGJlIHByb3ZpZGVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lLCBvdGhlcndpc2UgdGhlIDw9LCA9PT0gYW5kID49IG9wZXJhdG9ycyBhcmVcbiAgICAgKiB1c2VkIHRvIGNvbXBhcmUgZWxlbWVudHMuIEV4YW1wbGU6PC9wPlxuICAgICAqIDxwcmU+XG4gICAgICogZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgICogIGlmIChhIGlzIGxlc3MgdGhhbiBiIGJ5IHNvbWUgb3JkZXJpbmcgY3JpdGVyaW9uKSB7XG4gICAgICogICAgIHJldHVybiAtMTtcbiAgICAgKiAgfSBpZiAoYSBpcyBncmVhdGVyIHRoYW4gYiBieSB0aGUgb3JkZXJpbmcgY3JpdGVyaW9uKSB7XG4gICAgICogICAgIHJldHVybiAxO1xuICAgICAqICB9XG4gICAgICogIC8vIGEgbXVzdCBiZSBlcXVhbCB0byBiXG4gICAgICogIHJldHVybiAwO1xuICAgICAqIH1cbiAgICAgKiA8L3ByZT5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOm51bWJlcj19IGNvbXBhcmVGdW5jdGlvbiBvcHRpb25hbFxuICAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSB0d28gZWxlbWVudHMuIE11c3QgcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlcixcbiAgICAgKiB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sXG4gICAgICogb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gQlNUcmVlKGNvbXBhcmVGdW5jdGlvbikge1xuICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlRnVuY3Rpb24gfHwgdXRpbC5kZWZhdWx0Q29tcGFyZTtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGlzIHRyZWUgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBpbnNlcnQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIHRyZWUgZGlkIG5vdCBhbHJlYWR5IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbnNlcnROb2RlKHRoaXMuY3JlYXRlTm9kZShlbGVtZW50KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubkVsZW1lbnRzKys7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIHRyZWUuXG4gICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJlZSBjb250YWlucyBubyBlbGVtZW50cy5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgdHJlZSBjb250YWlucyBubyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50cyA9PT0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHRyZWUuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgdHJlZS5cbiAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50cztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyZWUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IGVsZW1lbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgdHJlZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaE5vZGUodGhpcy5yb290LCBlbGVtZW50KSAhPT0gbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhpcyB0cmVlIGlmIGl0IGlzIHByZXNlbnQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIHRyZWUgY29udGFpbmVkIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5zZWFyY2hOb2RlKHRoaXMucm9vdCwgZWxlbWVudCk7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVOb2RlKG5vZGUpO1xuICAgICAgICB0aGlzLm5FbGVtZW50cy0tO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHRyZWUgaW5cbiAgICAgKiBpbi1vcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuaW5vcmRlclRyYXZlcnNhbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmlub3JkZXJUcmF2ZXJzYWxBdXgodGhpcy5yb290LCBjYWxsYmFjaywge1xuICAgICAgICAgICAgc3RvcDogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBlbGVtZW50IHByZXNlbnQgaW4gdGhpcyB0cmVlIGluIHByZS1vcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUucHJlb3JkZXJUcmF2ZXJzYWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wcmVvcmRlclRyYXZlcnNhbEF1eCh0aGlzLnJvb3QsIGNhbGxiYWNrLCB7XG4gICAgICAgICAgICBzdG9wOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHRyZWUgaW4gcG9zdC1vcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXMgaW52b2tlZCB3aXRoIG9uZVxuICAgICAqIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUucG9zdG9yZGVyVHJhdmVyc2FsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucG9zdG9yZGVyVHJhdmVyc2FsQXV4KHRoaXMucm9vdCwgY2FsbGJhY2ssIHtcbiAgICAgICAgICAgIHN0b3A6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBwcmVzZW50IGluIHRoaXMgdHJlZSBpblxuICAgICAqIGxldmVsLW9yZGVyLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6IHRoZSBlbGVtZW50IHZhbHVlLCB0byBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW4gb3B0aW9uYWxseSByZXR1cm4gZmFsc2UuXG4gICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5sZXZlbFRyYXZlcnNhbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmxldmVsVHJhdmVyc2FsQXV4KHRoaXMucm9vdCwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWluaW11bSBlbGVtZW50IG9mIHRoaXMgdHJlZS5cbiAgICAgKiBAcmV0dXJuIHsqfSB0aGUgbWluaW11bSBlbGVtZW50IG9mIHRoaXMgdHJlZSBvciB1bmRlZmluZWQgaWYgdGhpcyB0cmVlIGlzXG4gICAgICogaXMgZW1wdHkuXG4gICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5taW5pbXVtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWluaW11bUF1eCh0aGlzLnJvb3QpLmVsZW1lbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGVsZW1lbnQgb2YgdGhpcyB0cmVlLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSBtYXhpbXVtIGVsZW1lbnQgb2YgdGhpcyB0cmVlIG9yIHVuZGVmaW5lZCBpZiB0aGlzIHRyZWUgaXNcbiAgICAgKiBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLm1heGltdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tYXhpbXVtQXV4KHRoaXMucm9vdCkuZWxlbWVudDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHRyZWUgaW4gaW5vcmRlci5cbiAgICAgKiBFcXVpdmFsZW50IHRvIGlub3JkZXJUcmF2ZXJzYWwuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogdGhlIGVsZW1lbnQgdmFsdWUsIHRvIGJyZWFrIHRoZSBpdGVyYXRpb24geW91IGNhblxuICAgICAqIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmlub3JkZXJUcmF2ZXJzYWwoY2FsbGJhY2spO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyB0cmVlIGluIGluLW9yZGVyLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyB0cmVlIGluIGluLW9yZGVyLlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIHRoaXMuaW5vcmRlclRyYXZlcnNhbChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgYXJyYXkucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoaXMgdHJlZS5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBoZWlnaHQgb2YgdGhpcyB0cmVlIG9yIC0xIGlmIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuaGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWlnaHRBdXgodGhpcy5yb290KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuc2VhcmNoTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBjbXAgPSBudWxsO1xuICAgICAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCAmJiBjbXAgIT09IDApIHtcbiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShlbGVtZW50LCBub2RlLmVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGNtcCA8IDApIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5sZWZ0Q2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucmlnaHRDaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUudHJhbnNwbGFudCA9IGZ1bmN0aW9uIChuMSwgbjIpIHtcbiAgICAgICAgaWYgKG4xLnBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gbjI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobjEgPT09IG4xLnBhcmVudC5sZWZ0Q2gpIHtcbiAgICAgICAgICAgIG4xLnBhcmVudC5sZWZ0Q2ggPSBuMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG4xLnBhcmVudC5yaWdodENoID0gbjI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBuMi5wYXJlbnQgPSBuMS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUucmVtb3ZlTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmxlZnRDaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc3BsYW50KG5vZGUsIG5vZGUucmlnaHRDaCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5yaWdodENoID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcGxhbnQobm9kZSwgbm9kZS5sZWZ0Q2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHkgPSB0aGlzLm1pbmltdW1BdXgobm9kZS5yaWdodENoKTtcbiAgICAgICAgICAgIGlmICh5LnBhcmVudCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNwbGFudCh5LCB5LnJpZ2h0Q2gpO1xuICAgICAgICAgICAgICAgIHkucmlnaHRDaCA9IG5vZGUucmlnaHRDaDtcbiAgICAgICAgICAgICAgICB5LnJpZ2h0Q2gucGFyZW50ID0geTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJhbnNwbGFudChub2RlLCB5KTtcbiAgICAgICAgICAgIHkubGVmdENoID0gbm9kZS5sZWZ0Q2g7XG4gICAgICAgICAgICB5LmxlZnRDaC5wYXJlbnQgPSB5O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLmlub3JkZXJUcmF2ZXJzYWxBdXggPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2ssIHNpZ25hbCkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBzaWduYWwuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5vcmRlclRyYXZlcnNhbEF1eChub2RlLmxlZnRDaCwgY2FsbGJhY2ssIHNpZ25hbCk7XG4gICAgICAgIGlmIChzaWduYWwuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbC5zdG9wID0gY2FsbGJhY2sobm9kZS5lbGVtZW50KSA9PT0gZmFsc2U7XG4gICAgICAgIGlmIChzaWduYWwuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5vcmRlclRyYXZlcnNhbEF1eChub2RlLnJpZ2h0Q2gsIGNhbGxiYWNrLCBzaWduYWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5sZXZlbFRyYXZlcnNhbEF1eCA9IGZ1bmN0aW9uIChub2RlLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcXVldWUgPSBuZXcgUXVldWVfMS5kZWZhdWx0KCk7XG4gICAgICAgIGlmIChub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZS5lbnF1ZXVlKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICBub2RlID0gcXVldWUuZGVxdWV1ZSgpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKG5vZGUuZWxlbWVudCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUubGVmdENoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcXVldWUuZW5xdWV1ZShub2RlLmxlZnRDaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5yaWdodENoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcXVldWUuZW5xdWV1ZShub2RlLnJpZ2h0Q2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLnByZW9yZGVyVHJhdmVyc2FsQXV4ID0gZnVuY3Rpb24gKG5vZGUsIGNhbGxiYWNrLCBzaWduYWwpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwgfHwgc2lnbmFsLnN0b3ApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWwuc3RvcCA9IGNhbGxiYWNrKG5vZGUuZWxlbWVudCkgPT09IGZhbHNlO1xuICAgICAgICBpZiAoc2lnbmFsLnN0b3ApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZW9yZGVyVHJhdmVyc2FsQXV4KG5vZGUubGVmdENoLCBjYWxsYmFjaywgc2lnbmFsKTtcbiAgICAgICAgaWYgKHNpZ25hbC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVvcmRlclRyYXZlcnNhbEF1eChub2RlLnJpZ2h0Q2gsIGNhbGxiYWNrLCBzaWduYWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5wb3N0b3JkZXJUcmF2ZXJzYWxBdXggPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2ssIHNpZ25hbCkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBzaWduYWwuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zdG9yZGVyVHJhdmVyc2FsQXV4KG5vZGUubGVmdENoLCBjYWxsYmFjaywgc2lnbmFsKTtcbiAgICAgICAgaWYgKHNpZ25hbC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3N0b3JkZXJUcmF2ZXJzYWxBdXgobm9kZS5yaWdodENoLCBjYWxsYmFjaywgc2lnbmFsKTtcbiAgICAgICAgaWYgKHNpZ25hbC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsLnN0b3AgPSBjYWxsYmFjayhub2RlLmVsZW1lbnQpID09PSBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUubWluaW11bUF1eCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHdoaWxlIChub2RlLmxlZnRDaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubGVmdENoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgQlNUcmVlLnByb3RvdHlwZS5tYXhpbXVtQXV4ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgd2hpbGUgKG5vZGUucmlnaHRDaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUucmlnaHRDaDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAgKiBAcHJpdmF0ZVxuICAgICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLmhlaWdodEF1eCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuaGVpZ2h0QXV4KG5vZGUubGVmdENoKSwgdGhpcy5oZWlnaHRBdXgobm9kZS5yaWdodENoKSkgKyAxO1xuICAgIH07XG4gICAgLypcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBCU1RyZWUucHJvdG90eXBlLmluc2VydE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgcGFyZW50ID0gbnVsbDtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gdGhpcy5yb290O1xuICAgICAgICB2YXIgY21wID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUobm9kZS5lbGVtZW50LCBwb3NpdGlvbi5lbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChjbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLmxlZnRDaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24ucmlnaHRDaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdHJlZSBpcyBlbXB0eVxuICAgICAgICAgICAgdGhpcy5yb290ID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbXBhcmUobm9kZS5lbGVtZW50LCBwYXJlbnQuZWxlbWVudCkgPCAwKSB7XG4gICAgICAgICAgICBwYXJlbnQubGVmdENoID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5yaWdodENoID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIEJTVHJlZS5wcm90b3R5cGUuY3JlYXRlTm9kZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgICAgbGVmdENoOiBudWxsLFxuICAgICAgICAgICAgcmlnaHRDaDogbnVsbCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbFxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIEJTVHJlZTtcbn0oKSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBCU1RyZWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CU1RyZWUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIERpY3Rpb25hcnlfMSA9IHJlcXVpcmUoJy4vRGljdGlvbmFyeScpO1xudmFyIFNldF8xID0gcmVxdWlyZSgnLi9TZXQnKTtcbnZhciBCYWcgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgYmFnLlxuICAgICAqIEBjbGFzcyA8cD5BIGJhZyBpcyBhIHNwZWNpYWwga2luZCBvZiBzZXQgaW4gd2hpY2ggbWVtYmVycyBhcmVcbiAgICAgKiBhbGxvd2VkIHRvIGFwcGVhciBtb3JlIHRoYW4gb25jZS48L3A+XG4gICAgICogPHA+SWYgdGhlIGluc2VydGVkIGVsZW1lbnRzIGFyZSBjdXN0b20gb2JqZWN0cyBhIGZ1bmN0aW9uXG4gICAgICogd2hpY2ggY29udmVydHMgZWxlbWVudHMgdG8gdW5pcXVlIHN0cmluZ3MgbXVzdCBiZSBwcm92aWRlZC4gRXhhbXBsZTo8L3A+XG4gICAgICpcbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIHBldFRvU3RyaW5nKHBldCkge1xuICAgICAqICByZXR1cm4gcGV0Lm5hbWU7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOnN0cmluZz19IHRvU3RyRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZFxuICAgICAqIHRvIGNvbnZlcnQgZWxlbWVudHMgdG8gc3RyaW5ncy4gSWYgdGhlIGVsZW1lbnRzIGFyZW4ndCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKClcbiAgICAgKiBpcyBub3QgYXBwcm9wcmlhdGUsIGEgY3VzdG9tIGZ1bmN0aW9uIHdoaWNoIHJlY2VpdmVzIGFuIG9iamVjdCBhbmQgcmV0dXJucyBhXG4gICAgICogdW5pcXVlIHN0cmluZyBtdXN0IGJlIHByb3ZpZGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJhZyh0b1N0ckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMudG9TdHJGID0gdG9TdHJGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRUb1N0cmluZztcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnlfMS5kZWZhdWx0KHRoaXMudG9TdHJGKTtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEFkZHMgbkNvcGllcyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIGJhZy5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IGVsZW1lbnQgdG8gYWRkLlxuICAgICogQHBhcmFtIHtudW1iZXI9fSBuQ29waWVzIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIGFkZCwgaWYgdGhpcyBhcmd1bWVudCBpc1xuICAgICogdW5kZWZpbmVkIDEgY29weSBpcyBhZGRlZC5cbiAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgdW5sZXNzIGVsZW1lbnQgaXMgdW5kZWZpbmVkLlxuICAgICovXG4gICAgQmFnLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbWVudCwgbkNvcGllcykge1xuICAgICAgICBpZiAobkNvcGllcyA9PT0gdm9pZCAwKSB7IG5Db3BpZXMgPSAxOyB9XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKGVsZW1lbnQpIHx8IG5Db3BpZXMgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250YWlucyhlbGVtZW50KSkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgY29waWVzOiBuQ29waWVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LnNldFZhbHVlKGVsZW1lbnQsIG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmdldFZhbHVlKGVsZW1lbnQpLmNvcGllcyArPSBuQ29waWVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubkVsZW1lbnRzICs9IG5Db3BpZXM7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBDb3VudHMgdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgaW4gdGhpcyBiYWcuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCB0aGUgb2JqZWN0IHRvIHNlYXJjaCBmb3IuLlxuICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUgb2JqZWN0LCAwIGlmIG5vdCBmb3VuZFxuICAgICovXG4gICAgQmFnLnByb3RvdHlwZS5jb3VudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb250YWlucyhlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LmdldFZhbHVlKGVsZW1lbnQpLmNvcGllcztcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYmFnIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCBlbGVtZW50IHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGJhZyBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIEJhZy5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5LmNvbnRhaW5zS2V5KGVsZW1lbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBSZW1vdmVzIG5Db3BpZXMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBiYWcuXG4gICAgKiBJZiB0aGUgbnVtYmVyIG9mIGNvcGllcyB0byByZW1vdmUgaXMgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyXG4gICAgKiBvZiBjb3BpZXMgaW4gdGhlIEJhZywgYWxsIGNvcGllcyBhcmUgcmVtb3ZlZC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IGVsZW1lbnQgdG8gcmVtb3ZlLlxuICAgICogQHBhcmFtIHtudW1iZXI9fSBuQ29waWVzIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIHJlbW92ZSwgaWYgdGhpcyBhcmd1bWVudCBpc1xuICAgICogdW5kZWZpbmVkIDEgY29weSBpcyByZW1vdmVkLlxuICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBhdCBsZWFzdCAxIGVsZW1lbnQgd2FzIHJlbW92ZWQuXG4gICAgKi9cbiAgICBCYWcucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBuQ29waWVzKSB7XG4gICAgICAgIGlmIChuQ29waWVzID09PSB2b2lkIDApIHsgbkNvcGllcyA9IDE7IH1cbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQoZWxlbWVudCkgfHwgbkNvcGllcyA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZGljdGlvbmFyeS5nZXRWYWx1ZShlbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChuQ29waWVzID4gbm9kZS5jb3BpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5FbGVtZW50cyAtPSBub2RlLmNvcGllcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubkVsZW1lbnRzIC09IG5Db3BpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlLmNvcGllcyAtPSBuQ29waWVzO1xuICAgICAgICAgICAgaWYgKG5vZGUuY29waWVzIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnkucmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgYmlnIGluIGFyYml0cmFyeSBvcmRlcixcbiAgICAgKiBpbmNsdWRpbmcgbXVsdGlwbGUgY29waWVzLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhpcyBiYWcuXG4gICAgICovXG4gICAgQmFnLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYSA9IFtdO1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5kaWN0aW9uYXJ5LnZhbHVlcygpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHZhbHVlc18xID0gdmFsdWVzOyBfaSA8IHZhbHVlc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSB2YWx1ZXNfMVtfaV07XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgICB2YXIgY29waWVzID0gbm9kZS5jb3BpZXM7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvcGllczsgaisrKSB7XG4gICAgICAgICAgICAgICAgYS5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHNldCBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhpcyBiYWcuXG4gICAgICogQHJldHVybiB7Y29sbGVjdGlvbnMuU2V0PFQ+fSBhIHNldCBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhpcyBiYWcuXG4gICAgICovXG4gICAgQmFnLnByb3RvdHlwZS50b1NldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRvcmV0ID0gbmV3IFNldF8xLmRlZmF1bHQodGhpcy50b1N0ckYpO1xuICAgICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmRpY3Rpb25hcnkudmFsdWVzKCk7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgZWxlbWVudHNfMSA9IGVsZW1lbnRzOyBfaSA8IGVsZW1lbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgZWxlID0gZWxlbWVudHNfMVtfaV07XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbGUudmFsdWU7XG4gICAgICAgICAgICB0b3JldC5hZGQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b3JldDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnRcbiAgICAgKiBwcmVzZW50IGluIHRoaXMgYmFnLCBpbmNsdWRpbmcgbXVsdGlwbGUgY29waWVzLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpc1xuICAgICAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6IHRoZSBlbGVtZW50LiBUbyBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAgICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAgKi9cbiAgICBCYWcucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmZvckVhY2goZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHYudmFsdWU7XG4gICAgICAgICAgICB2YXIgY29waWVzID0gdi5jb3BpZXM7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcGllczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKHZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGJhZy5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBiYWcuXG4gICAgICovXG4gICAgQmFnLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uRWxlbWVudHM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBiYWcgY29udGFpbnMgbm8gZWxlbWVudHMuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGJhZyBjb250YWlucyBubyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBCYWcucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50cyA9PT0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgYmFnLlxuICAgICAqL1xuICAgIEJhZy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubkVsZW1lbnRzID0gMDtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmNsZWFyKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFnO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IEJhZzsgLy8gRW5kIG9mIGJhZ1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmFnLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBEaWN0aW9uYXJ5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGRpY3Rpb25hcnkuXG4gICAgICogQGNsYXNzIDxwPkRpY3Rpb25hcmllcyBtYXAga2V5cyB0byB2YWx1ZXM7IGVhY2gga2V5IGNhbiBtYXAgdG8gYXQgbW9zdCBvbmUgdmFsdWUuXG4gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhY2NlcHRzIGFueSBraW5kIG9mIG9iamVjdHMgYXMga2V5cy48L3A+XG4gICAgICpcbiAgICAgKiA8cD5JZiB0aGUga2V5cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBrZXlzIHRvIHVuaXF1ZVxuICAgICAqIHN0cmluZ3MgbXVzdCBiZSBwcm92aWRlZC4gRXhhbXBsZTo8L3A+XG4gICAgICogPHByZT5cbiAgICAgKiBmdW5jdGlvbiBwZXRUb1N0cmluZyhwZXQpIHtcbiAgICAgKiAgcmV0dXJuIHBldC5uYW1lO1xuICAgICAqIH1cbiAgICAgKiA8L3ByZT5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6c3RyaW5nPX0gdG9TdHJGdW5jdGlvbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkXG4gICAgICogdG8gY29udmVydCBrZXlzIHRvIHN0cmluZ3MuIElmIHRoZSBrZXlzIGFyZW4ndCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKClcbiAgICAgKiBpcyBub3QgYXBwcm9wcmlhdGUsIGEgY3VzdG9tIGZ1bmN0aW9uIHdoaWNoIHJlY2VpdmVzIGEga2V5IGFuZCByZXR1cm5zIGFcbiAgICAgKiB1bmlxdWUgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gRGljdGlvbmFyeSh0b1N0ckZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMudGFibGUgPSB7fTtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgICAgICB0aGlzLnRvU3RyID0gdG9TdHJGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRUb1N0cmluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhpcyBkaWN0aW9uYXJ5IG1hcHMgdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBrZXkga2V5IHdob3NlIGFzc29jaWF0ZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQuXG4gICAgICogQHJldHVybiB7Kn0gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZGljdGlvbmFyeSBtYXBzIHRoZSBzcGVjaWZpZWQga2V5IG9yXG4gICAgICogdW5kZWZpbmVkIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuXG4gICAgICovXG4gICAgRGljdGlvbmFyeS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBwYWlyID0gdGhpcy50YWJsZVsnJCcgKyB0aGlzLnRvU3RyKGtleSldO1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChwYWlyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFpci52YWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFzc29jaWF0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgZGljdGlvbmFyeS5cbiAgICAgKiBJZiB0aGUgZGljdGlvbmFyeSBwcmV2aW91c2x5IGNvbnRhaW5lZCBhIG1hcHBpbmcgZm9yIHRoaXMga2V5LCB0aGUgb2xkXG4gICAgICogdmFsdWUgaXMgcmVwbGFjZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmVcbiAgICAgKiBhc3NvY2lhdGVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogQHJldHVybiB7Kn0gcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3IgdGhlIGtleSBvciBpZiB0aGUga2V5L3ZhbHVlIGFyZSB1bmRlZmluZWQuXG4gICAgICovXG4gICAgRGljdGlvbmFyeS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChrZXkpIHx8IHV0aWwuaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXQ7XG4gICAgICAgIHZhciBrID0gJyQnICsgdGhpcy50b1N0cihrZXkpO1xuICAgICAgICB2YXIgcHJldmlvdXNFbGVtZW50ID0gdGhpcy50YWJsZVtrXTtcbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQocHJldmlvdXNFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5uRWxlbWVudHMrKztcbiAgICAgICAgICAgIHJldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldCA9IHByZXZpb3VzRWxlbWVudC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlW2tdID0ge1xuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgZm9yIHRoaXMga2V5IGZyb20gdGhpcyBkaWN0aW9uYXJ5IGlmIGl0IGlzIHByZXNlbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2hvc2UgbWFwcGluZyBpcyB0byBiZSByZW1vdmVkIGZyb20gdGhlXG4gICAgICogZGljdGlvbmFyeS5cbiAgICAgKiBAcmV0dXJuIHsqfSBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIGtleSwgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIGtleS5cbiAgICAgKi9cbiAgICBEaWN0aW9uYXJ5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBrID0gJyQnICsgdGhpcy50b1N0cihrZXkpO1xuICAgICAgICB2YXIgcHJldmlvdXNFbGVtZW50ID0gdGhpcy50YWJsZVtrXTtcbiAgICAgICAgaWYgKCF1dGlsLmlzVW5kZWZpbmVkKHByZXZpb3VzRWxlbWVudCkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhYmxlW2tdO1xuICAgICAgICAgICAgdGhpcy5uRWxlbWVudHMtLTtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c0VsZW1lbnQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGtleXMgaW4gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgRGljdGlvbmFyeS5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIG5hbWVfMSBpbiB0aGlzLnRhYmxlKSB7XG4gICAgICAgICAgICBpZiAodXRpbC5oYXModGhpcy50YWJsZSwgbmFtZV8xKSkge1xuICAgICAgICAgICAgICAgIHZhciBwYWlyID0gdGhpcy50YWJsZVtuYW1lXzFdO1xuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gocGFpci5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICAqL1xuICAgIERpY3Rpb25hcnkucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIG5hbWVfMiBpbiB0aGlzLnRhYmxlKSB7XG4gICAgICAgICAgICBpZiAodXRpbC5oYXModGhpcy50YWJsZSwgbmFtZV8yKSkge1xuICAgICAgICAgICAgICAgIHZhciBwYWlyID0gdGhpcy50YWJsZVtuYW1lXzJdO1xuICAgICAgICAgICAgICAgIGFycmF5LnB1c2gocGFpci52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb25jZSBmb3IgZWFjaCBrZXktdmFsdWUgcGFpclxuICAgICogcHJlc2VudCBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czoga2V5IGFuZCB2YWx1ZS4gVG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuXG4gICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAqL1xuICAgIERpY3Rpb25hcnkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZV8zIGluIHRoaXMudGFibGUpIHtcbiAgICAgICAgICAgIGlmICh1dGlsLmhhcyh0aGlzLnRhYmxlLCBuYW1lXzMpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhaXIgPSB0aGlzLnRhYmxlW25hbWVfM107XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IGNhbGxiYWNrKHBhaXIua2V5LCBwYWlyLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBkaWN0aW9uYXJ5IGlzIHRvIGJlXG4gICAgICogdGVzdGVkLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlXG4gICAgICogc3BlY2lmaWVkIGtleS5cbiAgICAgKi9cbiAgICBEaWN0aW9uYXJ5LnByb3RvdHlwZS5jb250YWluc0tleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuICF1dGlsLmlzVW5kZWZpbmVkKHRoaXMuZ2V0VmFsdWUoa2V5KSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICogQHRoaXMge2NvbGxlY3Rpb25zLkRpY3Rpb25hcnl9XG4gICAgKi9cbiAgICBEaWN0aW9uYXJ5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50YWJsZSA9IHt9O1xuICAgICAgICB0aGlzLm5FbGVtZW50cyA9IDA7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgRGljdGlvbmFyeS5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubkVsZW1lbnRzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGljdGlvbmFyeSBjb250YWlucyBubyBtYXBwaW5ncy5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgZGljdGlvbmFyeSBjb250YWlucyBubyBtYXBwaW5ncy5cbiAgICAgKi9cbiAgICBEaWN0aW9uYXJ5LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uRWxlbWVudHMgPD0gMDtcbiAgICB9O1xuICAgIERpY3Rpb25hcnkucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdG9yZXQgPSAneyc7XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoaywgdikge1xuICAgICAgICAgICAgdG9yZXQgKz0gXCJcXG5cXHRcIiArIGsgKyBcIiA6IFwiICsgdjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0b3JldCArICdcXG59JztcbiAgICB9O1xuICAgIHJldHVybiBEaWN0aW9uYXJ5O1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IERpY3Rpb25hcnk7IC8vIEVuZCBvZiBkaWN0aW9uYXJ5XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EaWN0aW9uYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCBmdW5jdGlvbiAoZCwgYikge1xuICAgIGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn07XG52YXIgRGljdGlvbmFyeV8xID0gcmVxdWlyZSgnLi9EaWN0aW9uYXJ5Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIEZhY3RvcnlEaWN0aW9uYXJ5ID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRmFjdG9yeURpY3Rpb25hcnksIF9zdXBlcik7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBkaWN0aW9uYXJ5LlxuICAgICAqIEBjbGFzcyA8cD5EaWN0aW9uYXJpZXMgbWFwIGtleXMgdG8gdmFsdWVzOyBlYWNoIGtleSBjYW4gbWFwIHRvIGF0IG1vc3Qgb25lIHZhbHVlLlxuICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWNjZXB0cyBhbnkga2luZCBvZiBvYmplY3RzIGFzIGtleXMuPC9wPlxuICAgICAqXG4gICAgICogPHA+VGhlIGRlZmF1bHQgZmFjdG9yeSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgbmV3IG9iamVjdCBvZiB0aGUgcHJvdmlkZWRcbiAgICAgKiB0eXBlLiBFeGFtcGxlOjwvcD5cbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIHBldEZhY3RvcnkoKSB7XG4gICAgICogIHJldHVybiBuZXcgUGV0KCk7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogPHA+SWYgdGhlIGtleXMgYXJlIGN1c3RvbSBvYmplY3RzIGEgZnVuY3Rpb24gd2hpY2ggY29udmVydHMga2V5cyB0byB1bmlxdWVcbiAgICAgKiBzdHJpbmdzIG11c3QgYmUgcHJvdmlkZWQuIEV4YW1wbGU6PC9wPlxuICAgICAqIDxwcmU+XG4gICAgICogZnVuY3Rpb24gcGV0VG9TdHJpbmcocGV0KSB7XG4gICAgICogIHJldHVybiBwZXQubmFtZTtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbigpOlY9fSBkZWZhdWx0RmFjdG9yeUZ1bmN0aW9uIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGFcbiAgICAgKiBkZWZhdWx0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6c3RyaW5nPX0gdG9TdHJGdW5jdGlvbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkXG4gICAgICogdG8gY29udmVydCBrZXlzIHRvIHN0cmluZ3MuIElmIHRoZSBrZXlzIGFyZW4ndCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKClcbiAgICAgKiBpcyBub3QgYXBwcm9wcmlhdGUsIGEgY3VzdG9tIGZ1bmN0aW9uIHdoaWNoIHJlY2VpdmVzIGEga2V5IGFuZCByZXR1cm5zIGFcbiAgICAgKiB1bmlxdWUgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gRmFjdG9yeURpY3Rpb25hcnkoZGVmYXVsdEZhY3RvcnlGdW5jdGlvbiwgdG9TdHJGdW5jdGlvbikge1xuICAgICAgICBfc3VwZXIuY2FsbCh0aGlzLCB0b1N0ckZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0RmFjdG9yeUZ1bmN0aW9uID0gZGVmYXVsdEZhY3RvcnlGdW5jdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIGRpY3Rpb25hcnksXG4gICAgICogaWYgaXQgZGlkbid0IGNvbnRhaW4gdGhlIGtleSB5ZXQuIElmIHRoZSBrZXkgZXhpc3RlZCwgdGhlIGV4aXN0aW5nIHZhbHVlIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmVcbiAgICAgKiBhc3NvY2lhdGVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0VmFsdWUgZGVmYXVsdCB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogQHJldHVybiB7Kn0gcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciB0aGUgZGVmYXVsdCB2YWx1ZSxcbiAgICAgKiBpZiB0aGUga2V5IGRpZG4ndCBleGlzdCB5ZXQuXG4gICAgICovXG4gICAgRmFjdG9yeURpY3Rpb25hcnkucHJvdG90eXBlLnNldERlZmF1bHQgPSBmdW5jdGlvbiAoa2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IF9zdXBlci5wcm90b3R5cGUuZ2V0VmFsdWUuY2FsbCh0aGlzLCBrZXkpO1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChjdXJyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZGljdGlvbmFyeSBtYXBzIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqIFJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGNyZWF0ZWQgYnkgdGhlIGZhY3RvcnkgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvcixcbiAgICAgKiBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhpcyBrZXkuIFRoZSBtaXNzaW5nIGtleSB3aWxsXG4gICAgICogYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIGRpY3Rpb25hcnkgbWFwcyB0aGUgc3BlY2lmaWVkIGtleSBvclxuICAgICAqIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LlxuICAgICAqL1xuICAgIEZhY3RvcnlEaWN0aW9uYXJ5LnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RGVmYXVsdChrZXksIHRoaXMuZGVmYXVsdEZhY3RvcnlGdW5jdGlvbigpKTtcbiAgICB9O1xuICAgIHJldHVybiBGYWN0b3J5RGljdGlvbmFyeTtcbn0oRGljdGlvbmFyeV8xLmRlZmF1bHQpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IEZhY3RvcnlEaWN0aW9uYXJ5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmFjdG9yeURpY3Rpb25hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgY29sbGVjdGlvbnMgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBhcnJheXMgPSByZXF1aXJlKCcuL2FycmF5cycpO1xudmFyIEhlYXAgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgSGVhcC5cbiAgICAgKiBAY2xhc3NcbiAgICAgKiA8cD5BIGhlYXAgaXMgYSBiaW5hcnkgdHJlZSwgd2hlcmUgdGhlIG5vZGVzIG1haW50YWluIHRoZSBoZWFwIHByb3BlcnR5OlxuICAgICAqIGVhY2ggbm9kZSBpcyBzbWFsbGVyIHRoYW4gZWFjaCBvZiBpdHMgY2hpbGRyZW4gYW5kIHRoZXJlZm9yZSBhIE1pbkhlYXBcbiAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYW4gYXJyYXkgdG8gc3RvcmUgZWxlbWVudHMuPC9wPlxuICAgICAqIDxwPklmIHRoZSBpbnNlcnRlZCBlbGVtZW50cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBjb21wYXJlIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQsXG4gICAgICogIGF0IGNvbnN0cnVjdGlvbiB0aW1lLCBvdGhlcndpc2UgdGhlIDw9LCA9PT0gYW5kID49IG9wZXJhdG9ycyBhcmVcbiAgICAgKiB1c2VkIHRvIGNvbXBhcmUgZWxlbWVudHMuIEV4YW1wbGU6PC9wPlxuICAgICAqXG4gICAgICogPHByZT5cbiAgICAgKiBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICAgKiAgaWYgKGEgaXMgbGVzcyB0aGFuIGIgYnkgc29tZSBvcmRlcmluZyBjcml0ZXJpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIC0xO1xuICAgICAqICB9IGlmIChhIGlzIGdyZWF0ZXIgdGhhbiBiIGJ5IHRoZSBvcmRlcmluZyBjcml0ZXJpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIDE7XG4gICAgICogIH1cbiAgICAgKiAgLy8gYSBtdXN0IGJlIGVxdWFsIHRvIGJcbiAgICAgKiAgcmV0dXJuIDA7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogPHA+SWYgYSBNYXgtSGVhcCBpcyB3YW50ZWQgKGdyZWF0ZXIgZWxlbWVudHMgb24gdG9wKSB5b3UgY2FuIGEgcHJvdmlkZSBhXG4gICAgICogcmV2ZXJzZSBjb21wYXJlIGZ1bmN0aW9uIHRvIGFjY29tcGxpc2ggdGhhdCBiZWhhdmlvci4gRXhhbXBsZTo8L3A+XG4gICAgICpcbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIHJldmVyc2VDb21wYXJlKGEsIGIpIHtcbiAgICAgKiAgaWYgKGEgaXMgbGVzcyB0aGFuIGIgYnkgc29tZSBvcmRlcmluZyBjcml0ZXJpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIDE7XG4gICAgICogIH0gaWYgKGEgaXMgZ3JlYXRlciB0aGFuIGIgYnkgdGhlIG9yZGVyaW5nIGNyaXRlcmlvbikge1xuICAgICAqICAgICByZXR1cm4gLTE7XG4gICAgICogIH1cbiAgICAgKiAgLy8gYSBtdXN0IGJlIGVxdWFsIHRvIGJcbiAgICAgKiAgcmV0dXJuIDA7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpudW1iZXI9fSBjb21wYXJlRnVuY3Rpb24gb3B0aW9uYWxcbiAgICAgKiBmdW5jdGlvbiB1c2VkIHRvIGNvbXBhcmUgdHdvIGVsZW1lbnRzLiBNdXN0IHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsXG4gICAgICogemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLFxuICAgICAqIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEhlYXAoY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcnJheSB1c2VkIHRvIHN0b3JlIHRoZSBlbGVtZW50cyBvZCB0aGUgaGVhcC5cbiAgICAgICAgICogQHR5cGUge0FycmF5LjxPYmplY3Q+fVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmVGdW5jdGlvbiB8fCBjb2xsZWN0aW9ucy5kZWZhdWx0Q29tcGFyZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxlZnQgY2hpbGQgb2YgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSW5kZXggVGhlIGluZGV4IG9mIHRoZSBub2RlIHRvIGdldCB0aGUgbGVmdCBjaGlsZFxuICAgICAqIGZvci5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBjaGlsZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEhlYXAucHJvdG90eXBlLmxlZnRDaGlsZEluZGV4ID0gZnVuY3Rpb24gKG5vZGVJbmRleCkge1xuICAgICAgICByZXR1cm4gKDIgKiBub2RlSW5kZXgpICsgMTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSByaWdodCBjaGlsZCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJbmRleCBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gZ2V0IHRoZSByaWdodCBjaGlsZFxuICAgICAqIGZvci5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgY2hpbGQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5yaWdodENoaWxkSW5kZXggPSBmdW5jdGlvbiAobm9kZUluZGV4KSB7XG4gICAgICAgIHJldHVybiAoMiAqIG5vZGVJbmRleCkgKyAyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHBhcmVudCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJbmRleCBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gZ2V0IHRoZSBwYXJlbnQgZm9yLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBwYXJlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5wYXJlbnRJbmRleCA9IGZ1bmN0aW9uIChub2RlSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKG5vZGVJbmRleCAtIDEpIC8gMik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc21hbGxlciBjaGlsZCBub2RlIChpZiBpdCBleGlzdHMpLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0Q2hpbGQgbGVmdCBjaGlsZCBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmlnaHRDaGlsZCByaWdodCBjaGlsZCBpbmRleC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRleCB3aXRoIHRoZSBtaW5pbXVtIHZhbHVlIG9yIC0xIGlmIGl0IGRvZXNuJ3RcbiAgICAgKiBleGlzdHMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5taW5JbmRleCA9IGZ1bmN0aW9uIChsZWZ0Q2hpbGQsIHJpZ2h0Q2hpbGQpIHtcbiAgICAgICAgaWYgKHJpZ2h0Q2hpbGQgPj0gdGhpcy5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGxlZnRDaGlsZCA+PSB0aGlzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRDaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmUodGhpcy5kYXRhW2xlZnRDaGlsZF0sIHRoaXMuZGF0YVtyaWdodENoaWxkXSkgPD0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0Q2hpbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmlnaHRDaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4IHVwIHRvIGl0cyBwcm9wZXIgcGxhY2UgaW4gdGhlIGhlYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgbm9kZSB0byBtb3ZlIHVwLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSGVhcC5wcm90b3R5cGUuc2lmdFVwID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudEluZGV4KGluZGV4KTtcbiAgICAgICAgd2hpbGUgKGluZGV4ID4gMCAmJiB0aGlzLmNvbXBhcmUodGhpcy5kYXRhW3BhcmVudF0sIHRoaXMuZGF0YVtpbmRleF0pID4gMCkge1xuICAgICAgICAgICAgYXJyYXlzLnN3YXAodGhpcy5kYXRhLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50O1xuICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnRJbmRleChpbmRleCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCBkb3duIHRvIGl0cyBwcm9wZXIgcGxhY2UgaW4gdGhlIGhlYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJbmRleCBUaGUgaW5kZXggb2YgdGhlIG5vZGUgdG8gbW92ZSBkb3duLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgSGVhcC5wcm90b3R5cGUuc2lmdERvd24gPSBmdW5jdGlvbiAobm9kZUluZGV4KSB7XG4gICAgICAgIC8vc21hbGxlciBjaGlsZCBpbmRleFxuICAgICAgICB2YXIgbWluID0gdGhpcy5taW5JbmRleCh0aGlzLmxlZnRDaGlsZEluZGV4KG5vZGVJbmRleCksIHRoaXMucmlnaHRDaGlsZEluZGV4KG5vZGVJbmRleCkpO1xuICAgICAgICB3aGlsZSAobWluID49IDAgJiYgdGhpcy5jb21wYXJlKHRoaXMuZGF0YVtub2RlSW5kZXhdLCB0aGlzLmRhdGFbbWluXSkgPiAwKSB7XG4gICAgICAgICAgICBhcnJheXMuc3dhcCh0aGlzLmRhdGEsIG1pbiwgbm9kZUluZGV4KTtcbiAgICAgICAgICAgIG5vZGVJbmRleCA9IG1pbjtcbiAgICAgICAgICAgIG1pbiA9IHRoaXMubWluSW5kZXgodGhpcy5sZWZ0Q2hpbGRJbmRleChub2RlSW5kZXgpLCB0aGlzLnJpZ2h0Q2hpbGRJbmRleChub2RlSW5kZXgpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGJ1dCBkb2VzIG5vdCByZW1vdmUgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIGhlYXAuXG4gICAgICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIGF0IHRoZSByb290IG9mIHRoZSBoZWFwLiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGVcbiAgICAgKiBoZWFwIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEhlYXAucHJvdG90eXBlLnBlZWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVswXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgaW50byB0aGUgaGVhcC5cbiAgICAgKiBAcGFyYW0geyp9IGVsZW1lbnQgdGhlIGVsZW1lbnQuXG4gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBhZGRlZCBvciBmYWxzIGlmIGl0IGlzIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbnMuaXNVbmRlZmluZWQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhLnB1c2goZWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2lmdFVwKHRoaXMuZGF0YS5sZW5ndGggLSAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYW5kIHJlbW92ZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIGhlYXAuXG4gICAgICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIHJlbW92ZWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgaGVhcC4gUmV0dXJuc1xuICAgICAqIHVuZGVmaW5lZCBpZiB0aGUgaGVhcCBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5yZW1vdmVSb290ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLmRhdGFbMF07XG4gICAgICAgICAgICB0aGlzLmRhdGFbMF0gPSB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNwbGljZSh0aGlzLmRhdGEubGVuZ3RoIC0gMSwgMSk7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZnREb3duKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaGVhcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBIZWFwIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgZmFsc2VcbiAgICAgKiBvdGhlcndpc2UuXG4gICAgICovXG4gICAgSGVhcC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgZXF1RiA9IGNvbGxlY3Rpb25zLmNvbXBhcmVUb0VxdWFscyh0aGlzLmNvbXBhcmUpO1xuICAgICAgICByZXR1cm4gYXJyYXlzLmNvbnRhaW5zKHRoaXMuZGF0YSwgZWxlbWVudCwgZXF1Rik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBoZWFwLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGhlYXAuXG4gICAgICovXG4gICAgSGVhcC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBoZWFwIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBoZWFwIGNvbnRhaW5zIG5vIGl0ZW1zOyBmYWxzZVxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA8PSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBoZWFwLlxuICAgICAqL1xuICAgIEhlYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRhdGEubGVuZ3RoID0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIGhlYXAgaW5cbiAgICAgKiBubyBwYXJ0aWN1bGFyIG9yZGVyLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpc1xuICAgICAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6IHRoZSBlbGVtZW50IHZhbHVlLCB0byBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAgICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAgKi9cbiAgICBIZWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGFycmF5cy5mb3JFYWNoKHRoaXMuZGF0YSwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgcmV0dXJuIEhlYXA7XG59KCkpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gSGVhcDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhlYXAuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07XG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufTtcbnZhciBEaWN0aW9uYXJ5XzEgPSByZXF1aXJlKCcuL0RpY3Rpb25hcnknKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgTGlua2VkRGljdGlvbmFyeSBJbnRlcm5hbGx5XG4gKiBIYXMgdG8gYmUgYSBjbGFzcywgbm90IGFuIGludGVyZmFjZSwgYmVjYXVzZSBpdCBuZWVkcyB0byBoYXZlXG4gKiB0aGUgJ3VubGluaycgZnVuY3Rpb24gZGVmaW5lZC5cbiAqL1xudmFyIExpbmtlZERpY3Rpb25hcnlQYWlyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMaW5rZWREaWN0aW9uYXJ5UGFpcihrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIExpbmtlZERpY3Rpb25hcnlQYWlyLnByb3RvdHlwZS51bmxpbmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJldi5uZXh0ID0gdGhpcy5uZXh0O1xuICAgICAgICB0aGlzLm5leHQucHJldiA9IHRoaXMucHJldjtcbiAgICB9O1xuICAgIHJldHVybiBMaW5rZWREaWN0aW9uYXJ5UGFpcjtcbn0oKSk7XG52YXIgTGlua2VkRGljdGlvbmFyeSA9IChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKExpbmtlZERpY3Rpb25hcnksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGlua2VkRGljdGlvbmFyeSh0b1N0ckZ1bmN0aW9uKSB7XG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMsIHRvU3RyRnVuY3Rpb24pO1xuICAgICAgICB0aGlzLmhlYWQgPSBuZXcgTGlua2VkRGljdGlvbmFyeVBhaXIobnVsbCwgbnVsbCk7XG4gICAgICAgIHRoaXMudGFpbCA9IG5ldyBMaW5rZWREaWN0aW9uYXJ5UGFpcihudWxsLCBudWxsKTtcbiAgICAgICAgdGhpcy5oZWFkLm5leHQgPSB0aGlzLnRhaWw7XG4gICAgICAgIHRoaXMudGFpbC5wcmV2ID0gdGhpcy5oZWFkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSBuZXcgbm9kZSB0byB0aGUgJ3RhaWwnIG9mIHRoZSBsaXN0LCB1cGRhdGluZyB0aGVcbiAgICAgKiBuZWlnaGJvcnMsIGFuZCBtb3ZpbmcgJ3RoaXMudGFpbCcgKHRoZSBFbmQgb2YgTGlzdCBpbmRpY2F0b3IpIHRoYXRcbiAgICAgKiB0byB0aGUgZW5kLlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLmFwcGVuZFRvVGFpbCA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICB2YXIgbGFzdE5vZGUgPSB0aGlzLnRhaWwucHJldjtcbiAgICAgICAgbGFzdE5vZGUubmV4dCA9IGVudHJ5O1xuICAgICAgICBlbnRyeS5wcmV2ID0gbGFzdE5vZGU7XG4gICAgICAgIGVudHJ5Lm5leHQgPSB0aGlzLnRhaWw7XG4gICAgICAgIHRoaXMudGFpbC5wcmV2ID0gZW50cnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSBsaW5rZWQgZGljdGlvbmFyeSBmcm9tIHRoZSB0YWJsZSBpbnRlcm5hbGx5XG4gICAgICovXG4gICAgTGlua2VkRGljdGlvbmFyeS5wcm90b3R5cGUuZ2V0TGlua2VkRGljdGlvbmFyeVBhaXIgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGsgPSAnJCcgKyB0aGlzLnRvU3RyKGtleSk7XG4gICAgICAgIHZhciBwYWlyID0gKHRoaXMudGFibGVba10pO1xuICAgICAgICByZXR1cm4gcGFpcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgZGljdGlvbmFyeSBtYXBzIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoaXMgZGljdGlvbmFyeSBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGlzIGtleS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSB2YWx1ZSB0byB3aGljaCB0aGlzIGRpY3Rpb25hcnkgbWFwcyB0aGUgc3BlY2lmaWVkIGtleSBvclxuICAgICAqIHVuZGVmaW5lZCBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgcGFpciA9IHRoaXMuZ2V0TGlua2VkRGljdGlvbmFyeVBhaXIoa2V5KTtcbiAgICAgICAgaWYgKCF1dGlsLmlzVW5kZWZpbmVkKHBhaXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFpci52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbWFwcGluZyBmb3IgdGhpcyBrZXkgZnJvbSB0aGlzIGRpY3Rpb25hcnkgaWYgaXQgaXMgcHJlc2VudC5cbiAgICAgKiBBbHNvLCBpZiBhIHZhbHVlIGlzIHByZXNlbnQgZm9yIHRoaXMga2V5LCB0aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZVxuICAgICAqIGluc2VydGlvbiBvcmRlcmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBtYXBwaW5nIGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LlxuICAgICAqIEByZXR1cm4geyp9IHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5LCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHBhaXIgPSB0aGlzLmdldExpbmtlZERpY3Rpb25hcnlQYWlyKGtleSk7XG4gICAgICAgIGlmICghdXRpbC5pc1VuZGVmaW5lZChwYWlyKSkge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzLCBrZXkpOyAvLyBUaGlzIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIHRhYmxlXG4gICAgICAgICAgICBwYWlyLnVubGluaygpOyAvLyBUaGlzIHdpbGwgdW5saW5rIGl0IGZyb20gdGhlIGNoYWluXG4gICAgICAgICAgICByZXR1cm4gcGFpci52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgTGlua2VkRGljdGlvbmFyeS5cbiAgICAqIEB0aGlzIHtjb2xsZWN0aW9ucy5MaW5rZWREaWN0aW9uYXJ5fVxuICAgICovXG4gICAgTGlua2VkRGljdGlvbmFyeS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuY2xlYXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5oZWFkLm5leHQgPSB0aGlzLnRhaWw7XG4gICAgICAgIHRoaXMudGFpbC5wcmV2ID0gdGhpcy5oZWFkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIEtleVZhbHVlIHBhaXIuXG4gICAgICogSXQgcGxhY2VzIHRoZSBuZXcgdmFsdWUgaW5kZXhlZCBieSBrZXkgaW50byB0aGUgdGFibGUsIGJ1dCBtYWludGFpbnNcbiAgICAgKiBpdHMgcGxhY2UgaW4gdGhlIGxpbmtlZCBvcmRlcmluZy5cbiAgICAgKi9cbiAgICBMaW5rZWREaWN0aW9uYXJ5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKG9sZFBhaXIsIG5ld1BhaXIpIHtcbiAgICAgICAgdmFyIGsgPSAnJCcgKyB0aGlzLnRvU3RyKG5ld1BhaXIua2V5KTtcbiAgICAgICAgLy8gc2V0IHRoZSBuZXcgUGFpcidzIGxpbmtzIHRvIGV4aXN0aW5nUGFpcidzIGxpbmtzXG4gICAgICAgIG5ld1BhaXIubmV4dCA9IG9sZFBhaXIubmV4dDtcbiAgICAgICAgbmV3UGFpci5wcmV2ID0gb2xkUGFpci5wcmV2O1xuICAgICAgICAvLyBEZWxldGUgRXhpc3RpbmcgUGFpciBmcm9tIHRoZSB0YWJsZSwgdW5saW5rIGl0IGZyb20gY2hhaW4uXG4gICAgICAgIC8vIEFzIGEgcmVzdWx0LCB0aGUgbkVsZW1lbnRzIGdldHMgZGVjcmVtZW50ZWQgYnkgdGhpcyBvcGVyYXRpb25cbiAgICAgICAgdGhpcy5yZW1vdmUob2xkUGFpci5rZXkpO1xuICAgICAgICAvLyBMaW5rIG5ldyBQYWlyIGluIHBsYWNlIG9mIHdoZXJlIG9sZFBhaXIgd2FzLFxuICAgICAgICAvLyBieSBwb2ludGluZyB0aGUgb2xkIHBhaXIncyBuZWlnaGJvcnMgdG8gaXQuXG4gICAgICAgIG5ld1BhaXIucHJldi5uZXh0ID0gbmV3UGFpcjtcbiAgICAgICAgbmV3UGFpci5uZXh0LnByZXYgPSBuZXdQYWlyO1xuICAgICAgICB0aGlzLnRhYmxlW2tdID0gbmV3UGFpcjtcbiAgICAgICAgLy8gVG8gbWFrZSB1cCBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdhcyBkZWNyZW1lbnRlZCxcbiAgICAgICAgLy8gV2UgbmVlZCB0byBpbmNyZWFzZSBpdCBieSBvbmUuXG4gICAgICAgICsrdGhpcy5uRWxlbWVudHM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogSWYgdGhlIGRpY3Rpb25hcnkgcHJldmlvdXNseSBjb250YWluZWQgYSBtYXBwaW5nIGZvciB0aGlzIGtleSwgdGhlIG9sZFxuICAgICAqIHZhbHVlIGlzIHJlcGxhY2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuXG4gICAgICogVXBkYXRpbmcgb2YgYSBrZXkgdGhhdCBhbHJlYWR5IGV4aXN0cyBtYWludGFpbnMgaXRzIHBsYWNlIGluIHRoZVxuICAgICAqIGluc2VydGlvbiBvcmRlciBpbnRvIHRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlXG4gICAgICogYXNzb2NpYXRlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqIEByZXR1cm4geyp9IHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIHRoZSBrZXkgb3IgaWYgdGhlIGtleS92YWx1ZSBhcmUgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQoa2V5KSB8fCB1dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXhpc3RpbmdQYWlyID0gdGhpcy5nZXRMaW5rZWREaWN0aW9uYXJ5UGFpcihrZXkpO1xuICAgICAgICB2YXIgbmV3UGFpciA9IG5ldyBMaW5rZWREaWN0aW9uYXJ5UGFpcihrZXksIHZhbHVlKTtcbiAgICAgICAgdmFyIGsgPSAnJCcgKyB0aGlzLnRvU3RyKGtleSk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gZWxlbWVudCBmb3IgdGhhdCBrZXksIHdlXG4gICAgICAgIC8vIGtlZXAgaXQncyBwbGFjZSBpbiB0aGUgTGlua2VkTGlzdFxuICAgICAgICBpZiAoIXV0aWwuaXNVbmRlZmluZWQoZXhpc3RpbmdQYWlyKSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKGV4aXN0aW5nUGFpciwgbmV3UGFpcik7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdQYWlyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRUb1RhaWwobmV3UGFpcik7XG4gICAgICAgICAgICB0aGlzLnRhYmxlW2tdID0gbmV3UGFpcjtcbiAgICAgICAgICAgICsrdGhpcy5uRWxlbWVudHM7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBrZXlzIGluIHRoaXMgTGlua2VkRGljdGlvbmFyeSwgb3JkZXJlZFxuICAgICAqIGJ5IGluc2VydGlvbiBvcmRlci5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGtleXMgaW4gdGhpcyBMaW5rZWREaWN0aW9uYXJ5LFxuICAgICAqIG9yZGVyZWQgYnkgaW5zZXJ0aW9uIG9yZGVyLlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGFycmF5LnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGlzIExpbmtlZERpY3Rpb25hcnksIG9yZGVyZWQgYnlcbiAgICAgKiBpbnNlcnRpb24gb3JkZXIuXG4gICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gdGhpcyBMaW5rZWREaWN0aW9uYXJ5LFxuICAgICAqIG9yZGVyZWQgYnkgaW5zZXJ0aW9uIG9yZGVyLlxuICAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyXG4gICAgKiBwcmVzZW50IGluIHRoaXMgTGlua2VkRGljdGlvbmFyeS4gSXQgaXMgZG9uZSBpbiB0aGUgb3JkZXIgb2YgaW5zZXJ0aW9uXG4gICAgKiBpbnRvIHRoZSBMaW5rZWREaWN0aW9uYXJ5XG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgKiBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50czoga2V5IGFuZCB2YWx1ZS4gVG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuXG4gICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAqL1xuICAgIExpbmtlZERpY3Rpb25hcnkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNyYXdsTm9kZSA9IHRoaXMuaGVhZC5uZXh0O1xuICAgICAgICB3aGlsZSAoY3Jhd2xOb2RlLm5leHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHJldCA9IGNhbGxiYWNrKGNyYXdsTm9kZS5rZXksIGNyYXdsTm9kZS52YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNyYXdsTm9kZSA9IGNyYXdsTm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTGlua2VkRGljdGlvbmFyeTtcbn0oRGljdGlvbmFyeV8xLmRlZmF1bHQpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IExpbmtlZERpY3Rpb25hcnk7IC8vIEVuZCBvZiBMaW5rZWREaWN0aW9uYXJ5XG4vLyAvKipcbi8vICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIGRpY3Rpb25hcnkuXG4vLyAgKiBUd28gZGljdGlvbmFyaWVzIGFyZSBlcXVhbCBpZiB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgbWFwcGluZ3MuXG4vLyAgKiBAcGFyYW0ge2NvbGxlY3Rpb25zLkRpY3Rpb25hcnl9IG90aGVyIHRoZSBvdGhlciBkaWN0aW9uYXJ5LlxuLy8gICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpib29sZWFuPX0gdmFsdWVzRXF1YWxGdW5jdGlvbiBvcHRpb25hbFxuLy8gICogZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0d28gdmFsdWVzIGFyZSBlcXVhbC5cbi8vICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBkaWN0aW9uYXJ5LlxuLy8gICovXG4vLyBjb2xsZWN0aW9ucy5EaWN0aW9uYXJ5LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcix2YWx1ZXNFcXVhbEZ1bmN0aW9uKSB7XG4vLyBcdGNvbnN0IGVxRiA9IHZhbHVlc0VxdWFsRnVuY3Rpb24gfHwgY29sbGVjdGlvbnMuZGVmYXVsdEVxdWFscztcbi8vIFx0aWYoIShvdGhlciBpbnN0YW5jZW9mIGNvbGxlY3Rpb25zLkRpY3Rpb25hcnkpKXtcbi8vIFx0XHRyZXR1cm4gZmFsc2U7XG4vLyBcdH1cbi8vIFx0aWYodGhpcy5zaXplKCkgIT09IG90aGVyLnNpemUoKSl7XG4vLyBcdFx0cmV0dXJuIGZhbHNlO1xuLy8gXHR9XG4vLyBcdHJldHVybiB0aGlzLmVxdWFsc0F1eCh0aGlzLmZpcnN0Tm9kZSxvdGhlci5maXJzdE5vZGUsZXFGKTtcbi8vIH1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxpbmtlZERpY3Rpb25hcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGFycmF5cyA9IHJlcXVpcmUoJy4vYXJyYXlzJyk7XG52YXIgTGlua2VkTGlzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIGFuIGVtcHR5IExpbmtlZCBMaXN0LlxuICAgICogQGNsYXNzIEEgbGlua2VkIGxpc3QgaXMgYSBkYXRhIHN0cnVjdHVyZSBjb25zaXN0aW5nIG9mIGEgZ3JvdXAgb2Ygbm9kZXNcbiAgICAqIHdoaWNoIHRvZ2V0aGVyIHJlcHJlc2VudCBhIHNlcXVlbmNlLlxuICAgICogQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBmdW5jdGlvbiBMaW5rZWRMaXN0KCkge1xuICAgICAgICAvKipcbiAgICAgICAgKiBGaXJzdCBub2RlIGluIHRoZSBsaXN0XG4gICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpcnN0Tm9kZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAqIExhc3Qgbm9kZSBpbiB0aGUgbGlzdFxuICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICogQHByaXZhdGVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sYXN0Tm9kZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAqIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICogQHByaXZhdGVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEFkZHMgYW4gZWxlbWVudCB0byB0aGlzIGxpc3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbSBlbGVtZW50IHRvIGJlIGFkZGVkLlxuICAgICogQHBhcmFtIHtudW1iZXI9fSBpbmRleCBvcHRpb25hbCBpbmRleCB0byBhZGQgdGhlIGVsZW1lbnQuIElmIG5vIGluZGV4IGlzIHNwZWNpZmllZFxuICAgICogdGhlIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGlzIGxpc3QuXG4gICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBhZGRlZCBvciBmYWxzZSBpZiB0aGUgaW5kZXggaXMgaW52YWxpZFxuICAgICogb3IgaWYgdGhlIGVsZW1lbnQgaXMgdW5kZWZpbmVkLlxuICAgICovXG4gICAgTGlua2VkTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKGluZGV4KSkge1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLm5FbGVtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy5uRWxlbWVudHMgfHwgdXRpbC5pc1VuZGVmaW5lZChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZXdOb2RlID0gdGhpcy5jcmVhdGVOb2RlKGl0ZW0pO1xuICAgICAgICBpZiAodGhpcy5uRWxlbWVudHMgPT09IDApIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IG5vZGUgaW4gdGhlIGxpc3QuXG4gICAgICAgICAgICB0aGlzLmZpcnN0Tm9kZSA9IG5ld05vZGU7XG4gICAgICAgICAgICB0aGlzLmxhc3ROb2RlID0gbmV3Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gdGhpcy5uRWxlbWVudHMpIHtcbiAgICAgICAgICAgIC8vIEluc2VydCBhdCB0aGUgZW5kLlxuICAgICAgICAgICAgdGhpcy5sYXN0Tm9kZS5uZXh0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIHRoaXMubGFzdE5vZGUgPSBuZXdOb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAvLyBDaGFuZ2UgZmlyc3Qgbm9kZS5cbiAgICAgICAgICAgIG5ld05vZGUubmV4dCA9IHRoaXMuZmlyc3ROb2RlO1xuICAgICAgICAgICAgdGhpcy5maXJzdE5vZGUgPSBuZXdOb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZXYgPSB0aGlzLm5vZGVBdEluZGV4KGluZGV4IC0gMSk7XG4gICAgICAgICAgICBuZXdOb2RlLm5leHQgPSBwcmV2Lm5leHQ7XG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubkVsZW1lbnRzKys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoaXMgbGlzdC5cbiAgICAqIEByZXR1cm4geyp9IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0IG9yIHVuZGVmaW5lZCBpZiB0aGUgbGlzdCBpc1xuICAgICogZW1wdHkuXG4gICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5maXJzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlyc3ROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJzdE5vZGUuZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhpcyBsaXN0LlxuICAgICogQHJldHVybiB7Kn0gdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgbGlzdCBvciB1bmRlZmluZWQgaWYgdGhlIGxpc3QgaXNcbiAgICAqIGVtcHR5LlxuICAgICovXG4gICAgTGlua2VkTGlzdC5wcm90b3R5cGUubGFzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhc3ROb2RlLmVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IGRlc2lyZWQgaW5kZXguXG4gICAgICogQHJldHVybiB7Kn0gdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4IG9yIHVuZGVmaW5lZCBpZiB0aGUgaW5kZXggaXNcbiAgICAgKiBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmVsZW1lbnRBdEluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlQXRJbmRleChpbmRleCk7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlLmVsZW1lbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiB0aGlzIGxpc3Qgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlXG4gICAgICogc3BlY2lmaWVkIGVsZW1lbnQsIG9yIC0xIGlmIHRoZSBMaXN0IGRvZXMgbm90IGNvbnRhaW4gdGhpcyBlbGVtZW50LlxuICAgICAqIDxwPklmIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhpcyBsaXN0IGFyZVxuICAgICAqIG5vdCBjb21wYXJhYmxlIHdpdGggdGhlID09PSBvcGVyYXRvciBhIGN1c3RvbSBlcXVhbHMgZnVuY3Rpb24gc2hvdWxkIGJlXG4gICAgICogcHJvdmlkZWQgdG8gcGVyZm9ybSBzZWFyY2hlcywgdGhlIGZ1bmN0aW9uIG11c3QgcmVjZWl2ZSB0d28gYXJndW1lbnRzIGFuZFxuICAgICAqIHJldHVybiB0cnVlIGlmIHRoZXkgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuIEV4YW1wbGU6PC9wPlxuICAgICAqXG4gICAgICogPHByZT5cbiAgICAgKiBjb25zdCBwZXRzQXJlRXF1YWxCeU5hbWUgPSBmdW5jdGlvbihwZXQxLCBwZXQyKSB7XG4gICAgICogIHJldHVybiBwZXQxLm5hbWUgPT09IHBldDIubmFtZTtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIE9wdGlvbmFsXG4gICAgICogZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0d28gZWxlbWVudHMgYXJlIGVxdWFsLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGluZGV4IGluIHRoaXMgbGlzdCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZVxuICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgb3IgLTEgaWYgdGhpcyBsaXN0IGRvZXMgbm90IGNvbnRhaW4gdGhlXG4gICAgICogZWxlbWVudC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gKGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgICAgIHZhciBlcXVhbHNGID0gZXF1YWxzRnVuY3Rpb24gfHwgdXRpbC5kZWZhdWx0RXF1YWxzO1xuICAgICAgICBpZiAodXRpbC5pc1VuZGVmaW5lZChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHRoaXMuZmlyc3ROb2RlO1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlcXVhbHNGKGN1cnJlbnROb2RlLmVsZW1lbnQsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgICAvKipcbiAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxpc3QgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAgICogPHA+SWYgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUgbGlzdCBhcmVcbiAgICAgICAqIG5vdCBjb21wYXJhYmxlIHdpdGggdGhlID09PSBvcGVyYXRvciBhIGN1c3RvbSBlcXVhbHMgZnVuY3Rpb24gc2hvdWxkIGJlXG4gICAgICAgKiBwcm92aWRlZCB0byBwZXJmb3JtIHNlYXJjaGVzLCB0aGUgZnVuY3Rpb24gbXVzdCByZWNlaXZlIHR3byBhcmd1bWVudHMgYW5kXG4gICAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGV5IGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBFeGFtcGxlOjwvcD5cbiAgICAgICAqXG4gICAgICAgKiA8cHJlPlxuICAgICAgICogY29uc3QgcGV0c0FyZUVxdWFsQnlOYW1lID0gZnVuY3Rpb24ocGV0MSwgcGV0Mikge1xuICAgICAgICogIHJldHVybiBwZXQxLm5hbWUgPT09IHBldDIubmFtZTtcbiAgICAgICAqIH1cbiAgICAgICAqIDwvcHJlPlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpib29sZWFuPX0gZXF1YWxzRnVuY3Rpb24gT3B0aW9uYWxcbiAgICAgICAqIGZ1bmN0aW9uIHVzZWQgdG8gY2hlY2sgaWYgdHdvIGVsZW1lbnRzIGFyZSBlcXVhbC5cbiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBsaXN0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgZmFsc2VcbiAgICAgICAqIG90aGVyd2lzZS5cbiAgICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pbmRleE9mKGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKSA+PSAwKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoaXMgbGlzdC5cbiAgICAgKiA8cD5JZiB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSBsaXN0IGFyZVxuICAgICAqIG5vdCBjb21wYXJhYmxlIHdpdGggdGhlID09PSBvcGVyYXRvciBhIGN1c3RvbSBlcXVhbHMgZnVuY3Rpb24gc2hvdWxkIGJlXG4gICAgICogcHJvdmlkZWQgdG8gcGVyZm9ybSBzZWFyY2hlcywgdGhlIGZ1bmN0aW9uIG11c3QgcmVjZWl2ZSB0d28gYXJndW1lbnRzIGFuZFxuICAgICAqIHJldHVybiB0cnVlIGlmIHRoZXkgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuIEV4YW1wbGU6PC9wPlxuICAgICAqXG4gICAgICogPHByZT5cbiAgICAgKiBjb25zdCBwZXRzQXJlRXF1YWxCeU5hbWUgPSBmdW5jdGlvbihwZXQxLCBwZXQyKSB7XG4gICAgICogIHJldHVybiBwZXQxLm5hbWUgPT09IHBldDIubmFtZTtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gZWxlbWVudCB0byBiZSByZW1vdmVkIGZyb20gdGhpcyBsaXN0LCBpZiBwcmVzZW50LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGxpc3QgY29udGFpbmVkIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSwgZXF1YWxzRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIGVxdWFsc0YgPSBlcXVhbHNGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRFcXVhbHM7XG4gICAgICAgIGlmICh0aGlzLm5FbGVtZW50cyA8IDEgfHwgdXRpbC5pc1VuZGVmaW5lZChpdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2aW91cyA9IG51bGw7XG4gICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHRoaXMuZmlyc3ROb2RlO1xuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlcXVhbHNGKGN1cnJlbnROb2RlLmVsZW1lbnQsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlID09PSB0aGlzLmZpcnN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0Tm9kZSA9IHRoaXMuZmlyc3ROb2RlLm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PT0gdGhpcy5sYXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0Tm9kZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudE5vZGUgPT09IHRoaXMubGFzdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0Tm9kZSA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubmV4dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gY3VycmVudE5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubmV4dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubkVsZW1lbnRzLS07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnROb2RlO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgbGlzdC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maXJzdE5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3ROb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5uRWxlbWVudHMgPSAwO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlzdCBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gbGlzdC5cbiAgICAgKiBUd28gbGlzdHMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICAgKiBAcGFyYW0ge0xpbmtlZExpc3R9IG90aGVyIHRoZSBvdGhlciBsaXN0LlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsXG4gICAgICogZnVuY3Rpb24gdXNlZCB0byBjaGVjayBpZiB0d28gZWxlbWVudHMgYXJlIGVxdWFsLiBJZiB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3RzXG4gICAgICogYXJlIGN1c3RvbSBvYmplY3RzIHlvdSBzaG91bGQgcHJvdmlkZSBhIGZ1bmN0aW9uLCBvdGhlcndpc2VcbiAgICAgKiB0aGUgPT09IG9wZXJhdG9yIGlzIHVzZWQgdG8gY2hlY2sgZXF1YWxpdHkgYmV0d2VlbiBlbGVtZW50cy5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgbGlzdCBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gbGlzdC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAob3RoZXIsIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgICAgIHZhciBlcUYgPSBlcXVhbHNGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRFcXVhbHM7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgTGlua2VkTGlzdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaXplKCkgIT09IG90aGVyLnNpemUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVxdWFsc0F1eCh0aGlzLmZpcnN0Tm9kZSwgb3RoZXIuZmlyc3ROb2RlLCBlcUYpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgTGlua2VkTGlzdC5wcm90b3R5cGUuZXF1YWxzQXV4ID0gZnVuY3Rpb24gKG4xLCBuMiwgZXFGKSB7XG4gICAgICAgIHdoaWxlIChuMSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFlcUYobjEuZWxlbWVudCwgbjIuZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuMSA9IG4xLm5leHQ7XG4gICAgICAgICAgICBuMiA9IG4yLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBnaXZlbiBpbmRleC5cbiAgICAgKiBAcmV0dXJuIHsqfSByZW1vdmVkIGVsZW1lbnQgb3IgdW5kZWZpbmVkIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLnJlbW92ZUVsZW1lbnRBdEluZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5uRWxlbWVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLm5FbGVtZW50cyA9PT0gMSkge1xuICAgICAgICAgICAgLy9GaXJzdCBub2RlIGluIHRoZSBsaXN0LlxuICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZmlyc3ROb2RlLmVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmZpcnN0Tm9kZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxhc3ROb2RlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMubm9kZUF0SW5kZXgoaW5kZXggLSAxKTtcbiAgICAgICAgICAgIGlmIChwcmV2aW91cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmZpcnN0Tm9kZS5lbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3ROb2RlID0gdGhpcy5maXJzdE5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByZXZpb3VzLm5leHQgPT09IHRoaXMubGFzdE5vZGUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5sYXN0Tm9kZS5lbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdE5vZGUgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2aW91cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBwcmV2aW91cy5uZXh0LmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcHJldmlvdXMubmV4dCA9IHByZXZpb3VzLm5leHQubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5FbGVtZW50cy0tO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIGxpc3QgaW4gb3JkZXIuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogdGhlIGVsZW1lbnQgdmFsdWUsIHRvIGJyZWFrIHRoZSBpdGVyYXRpb24geW91IGNhblxuICAgICAqIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGN1cnJlbnROb2RlID0gdGhpcy5maXJzdE5vZGU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGN1cnJlbnROb2RlLmVsZW1lbnQpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlua2VkIGxpc3QgKG1ha2VzIHRoZSBsYXN0XG4gICAgICogZWxlbWVudCBmaXJzdCwgYW5kIHRoZSBmaXJzdCBlbGVtZW50IGxhc3QpLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcmV2aW91cyA9IG51bGw7XG4gICAgICAgIHZhciBjdXJyZW50ID0gdGhpcy5maXJzdE5vZGU7XG4gICAgICAgIHZhciB0ZW1wID0gbnVsbDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRlbXAgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICBjdXJyZW50Lm5leHQgPSBwcmV2aW91cztcbiAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICAgICAgICAgIGN1cnJlbnQgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIHRlbXAgPSB0aGlzLmZpcnN0Tm9kZTtcbiAgICAgICAgdGhpcy5maXJzdE5vZGUgPSB0aGlzLmxhc3ROb2RlO1xuICAgICAgICB0aGlzLmxhc3ROb2RlID0gdGVtcDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIHRoaXMgbGlzdCBpbiBwcm9wZXJcbiAgICAgKiBzZXF1ZW5jZS5cbiAgICAgKiBAcmV0dXJuIHtBcnJheS48Kj59IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIGxpc3QsXG4gICAgICogaW4gcHJvcGVyIHNlcXVlbmNlLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IFtdO1xuICAgICAgICB2YXIgY3VycmVudE5vZGUgPSB0aGlzLmZpcnN0Tm9kZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhcnJheS5wdXNoKGN1cnJlbnROb2RlLmVsZW1lbnQpO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGxpc3QuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbGlzdC5cbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uRWxlbWVudHM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBsaXN0IGNvbnRhaW5zIG5vIGVsZW1lbnRzLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBsaXN0IGNvbnRhaW5zIG5vIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5FbGVtZW50cyA8PSAwO1xuICAgIH07XG4gICAgTGlua2VkTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcnJheXMudG9TdHJpbmcodGhpcy50b0FycmF5KCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBMaW5rZWRMaXN0LnByb3RvdHlwZS5ub2RlQXRJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubkVsZW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09ICh0aGlzLm5FbGVtZW50cyAtIDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZmlyc3ROb2RlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIExpbmtlZExpc3QucHJvdG90eXBlLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZWxlbWVudDogaXRlbSxcbiAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBMaW5rZWRMaXN0O1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IExpbmtlZExpc3Q7IC8vIEVuZCBvZiBsaW5rZWQgbGlzdFxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGlua2VkTGlzdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG52YXIgRGljdGlvbmFyeV8xID0gcmVxdWlyZSgnLi9EaWN0aW9uYXJ5Jyk7XG52YXIgYXJyYXlzID0gcmVxdWlyZSgnLi9hcnJheXMnKTtcbnZhciBNdWx0aURpY3Rpb25hcnkgPSAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbXVsdGkgZGljdGlvbmFyeS5cbiAgICAgKiBAY2xhc3MgPHA+QSBtdWx0aSBkaWN0aW9uYXJ5IGlzIGEgc3BlY2lhbCBraW5kIG9mIGRpY3Rpb25hcnkgdGhhdCBob2xkc1xuICAgICAqIG11bHRpcGxlIHZhbHVlcyBhZ2FpbnN0IGVhY2gga2V5LiBTZXR0aW5nIGEgdmFsdWUgaW50byB0aGUgZGljdGlvbmFyeSB3aWxsXG4gICAgICogYWRkIHRoZSB2YWx1ZSB0byBhbiBhcnJheSBhdCB0aGF0IGtleS4gR2V0dGluZyBhIGtleSB3aWxsIHJldHVybiBhbiBhcnJheSxcbiAgICAgKiBob2xkaW5nIGFsbCB0aGUgdmFsdWVzIHNldCB0byB0aGF0IGtleS5cbiAgICAgKiBZb3UgY2FuIGNvbmZpZ3VyZSB0byBhbGxvdyBkdXBsaWNhdGVzIGluIHRoZSB2YWx1ZXMuXG4gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhY2NlcHRzIGFueSBraW5kIG9mIG9iamVjdHMgYXMga2V5cy48L3A+XG4gICAgICpcbiAgICAgKiA8cD5JZiB0aGUga2V5cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBrZXlzIHRvIHN0cmluZ3MgbXVzdCBiZVxuICAgICAqIHByb3ZpZGVkLiBFeGFtcGxlOjwvcD5cbiAgICAgKlxuICAgICAqIDxwcmU+XG4gICAgICogZnVuY3Rpb24gcGV0VG9TdHJpbmcocGV0KSB7XG4gICAgICAgKiAgcmV0dXJuIHBldC5uYW1lO1xuICAgICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqIDxwPklmIHRoZSB2YWx1ZXMgYXJlIGN1c3RvbSBvYmplY3RzIGEgZnVuY3Rpb24gdG8gY2hlY2sgZXF1YWxpdHkgYmV0d2VlbiB2YWx1ZXNcbiAgICAgKiBtdXN0IGJlIHByb3ZpZGVkLiBFeGFtcGxlOjwvcD5cbiAgICAgKlxuICAgICAqIDxwcmU+XG4gICAgICogZnVuY3Rpb24gcGV0c0FyZUVxdWFsQnlBZ2UocGV0MSxwZXQyKSB7XG4gICAgICAgKiAgcmV0dXJuIHBldDEuYWdlPT09cGV0Mi5hZ2U7XG4gICAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOnN0cmluZz19IHRvU3RyRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb25cbiAgICAgKiB0byBjb252ZXJ0IGtleXMgdG8gc3RyaW5ncy4gSWYgdGhlIGtleXMgYXJlbid0IHN0cmluZ3Mgb3IgaWYgdG9TdHJpbmcoKVxuICAgICAqIGlzIG5vdCBhcHByb3ByaWF0ZSwgYSBjdXN0b20gZnVuY3Rpb24gd2hpY2ggcmVjZWl2ZXMgYSBrZXkgYW5kIHJldHVybnMgYVxuICAgICAqIHVuaXF1ZSBzdHJpbmcgbXVzdCBiZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOmJvb2xlYW49fSB2YWx1ZXNFcXVhbHNGdW5jdGlvbiBvcHRpb25hbFxuICAgICAqIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFsbG93RHVwbGljYXRlVmFsdWVzXG4gICAgICovXG4gICAgZnVuY3Rpb24gTXVsdGlEaWN0aW9uYXJ5KHRvU3RyRnVuY3Rpb24sIHZhbHVlc0VxdWFsc0Z1bmN0aW9uLCBhbGxvd0R1cGxpY2F0ZVZhbHVlcykge1xuICAgICAgICBpZiAoYWxsb3dEdXBsaWNhdGVWYWx1ZXMgPT09IHZvaWQgMCkgeyBhbGxvd0R1cGxpY2F0ZVZhbHVlcyA9IGZhbHNlOyB9XG4gICAgICAgIHRoaXMuZGljdCA9IG5ldyBEaWN0aW9uYXJ5XzEuZGVmYXVsdCh0b1N0ckZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5lcXVhbHNGID0gdmFsdWVzRXF1YWxzRnVuY3Rpb24gfHwgdXRpbC5kZWZhdWx0RXF1YWxzO1xuICAgICAgICB0aGlzLmFsbG93RHVwbGljYXRlID0gYWxsb3dEdXBsaWNhdGVWYWx1ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICogUmV0dXJucyBhbiBhcnJheSBob2xkaW5nIHRoZSB2YWx1ZXMgdG8gd2hpY2ggdGhpcyBkaWN0aW9uYXJ5IG1hcHNcbiAgICAqIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZ3MgZm9yIHRoaXMga2V5LlxuICAgICogQHBhcmFtIHtPYmplY3R9IGtleSBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZXMgYXJlIHRvIGJlIHJldHVybmVkLlxuICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGhvbGRpbmcgdGhlIHZhbHVlcyB0byB3aGljaCB0aGlzIGRpY3Rpb25hcnkgbWFwc1xuICAgICogdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgKi9cbiAgICBNdWx0aURpY3Rpb25hcnkucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5kaWN0LmdldFZhbHVlKGtleSk7XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKHZhbHVlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlzLmNvcHkodmFsdWVzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIHZhbHVlIHRvIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIGlmXG4gICAgICogaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmVcbiAgICAgKiBhc3NvY2lhdGVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBhcnJheSBhdCB0aGUga2V5XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIG5vdCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleS5cbiAgICAgKi9cbiAgICBNdWx0aURpY3Rpb25hcnkucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHV0aWwuaXNVbmRlZmluZWQoa2V5KSB8fCB1dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250YWluc0tleShrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmRpY3Quc2V0VmFsdWUoa2V5LCBbdmFsdWVdKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcnJheSA9IHRoaXMuZGljdC5nZXRWYWx1ZShrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuYWxsb3dEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgIGlmIChhcnJheXMuY29udGFpbnMoYXJyYXksIHZhbHVlLCB0aGlzLmVxdWFsc0YpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZXMgZnJvbSB0aGUgYXJyYXkgb2YgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICAgKiBzcGVjaWZpZWQga2V5LiBJZiBhIHZhbHVlIGlzbid0IGdpdmVuLCBhbGwgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkXG4gICAgICoga2V5IGFyZSByZW1vdmVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBrZXkga2V5IHdob3NlIG1hcHBpbmcgaXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZVxuICAgICAqIGRpY3Rpb25hcnkuXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZSBvcHRpb25hbCBhcmd1bWVudCB0byBzcGVjaWZ5IHRoZSB2YWx1ZSB0byByZW1vdmVcbiAgICAgKiBmcm9tIHRoZSBhcnJheSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICogQHJldHVybiB7Kn0gdHJ1ZSBpZiB0aGUgZGljdGlvbmFyeSBjaGFuZ2VkLCBmYWxzZSBpZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3JcbiAgICAgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzbid0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKi9cbiAgICBNdWx0aURpY3Rpb25hcnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh1dGlsLmlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmRpY3QucmVtb3ZlKGtleSk7XG4gICAgICAgICAgICByZXR1cm4gIXV0aWwuaXNVbmRlZmluZWQodik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFycmF5ID0gdGhpcy5kaWN0LmdldFZhbHVlKGtleSk7XG4gICAgICAgIGlmIChhcnJheXMucmVtb3ZlKGFycmF5LCB2YWx1ZSwgdGhpcy5lcXVhbHNGKSkge1xuICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGljdC5yZW1vdmUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGtleXMgaW4gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmtleXMoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbHVlcyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gdGhpcyBkaWN0aW9uYXJ5LlxuICAgICAqL1xuICAgIE11bHRpRGljdGlvbmFyeS5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5kaWN0LnZhbHVlcygpO1xuICAgICAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCB2YWx1ZXNfMSA9IHZhbHVlczsgX2kgPCB2YWx1ZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciB2ID0gdmFsdWVzXzFbX2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCB2XzEgPSB2OyBfYSA8IHZfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdyA9IHZfMVtfYV07XG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaCh3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkaWN0aW9uYXJ5IGF0IGxlYXN0IG9uZSB2YWx1ZSBhc3NvY2lhdHRlZCB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0ga2V5IGtleSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIGRpY3Rpb25hcnkgaXMgdG8gYmVcbiAgICAgKiB0ZXN0ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgYXQgbGVhc3Qgb25lIHZhbHVlIGFzc29jaWF0dGVkXG4gICAgICogdGhlIHNwZWNpZmllZCBrZXkuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5jb250YWluc0tleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGljdC5jb250YWluc0tleShrZXkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaWN0LmNsZWFyKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIGRpY3Rpb25hcnkuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LnNpemUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZ3MuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGRpY3Rpb25hcnkgY29udGFpbnMgbm8gbWFwcGluZ3MuXG4gICAgICovXG4gICAgTXVsdGlEaWN0aW9uYXJ5LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWN0LmlzRW1wdHkoKTtcbiAgICB9O1xuICAgIHJldHVybiBNdWx0aURpY3Rpb25hcnk7XG59KCkpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gTXVsdGlEaWN0aW9uYXJ5OyAvLyBlbmQgb2YgbXVsdGkgZGljdGlvbmFyeVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXVsdGlEaWN0aW9uYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuKGZ1bmN0aW9uIChEaXJlY3Rpb24pIHtcbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiQkVGT1JFXCJdID0gMF0gPSBcIkJFRk9SRVwiO1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJBRlRFUlwiXSA9IDFdID0gXCJBRlRFUlwiO1xuICAgIERpcmVjdGlvbltEaXJlY3Rpb25bXCJJTlNJREVfQVRfRU5EXCJdID0gMl0gPSBcIklOU0lERV9BVF9FTkRcIjtcbiAgICBEaXJlY3Rpb25bRGlyZWN0aW9uW1wiSU5TSURFX0FUX1NUQVJUXCJdID0gM10gPSBcIklOU0lERV9BVF9TVEFSVFwiO1xufSkoZXhwb3J0cy5EaXJlY3Rpb24gfHwgKGV4cG9ydHMuRGlyZWN0aW9uID0ge30pKTtcbnZhciBEaXJlY3Rpb24gPSBleHBvcnRzLkRpcmVjdGlvbjtcbnZhciBNdWx0aVJvb3RUcmVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNdWx0aVJvb3RUcmVlKHJvb3RJZHMsIG5vZGVzKSB7XG4gICAgICAgIGlmIChyb290SWRzID09PSB2b2lkIDApIHsgcm9vdElkcyA9IFtdOyB9XG4gICAgICAgIGlmIChub2RlcyA9PT0gdm9pZCAwKSB7IG5vZGVzID0ge307IH1cbiAgICAgICAgdGhpcy5yb290SWRzID0gcm9vdElkcztcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgIH1cbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5nZXRSb290SWRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xvbmUgPSB0aGlzLnJvb3RJZHMuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZ2V0Tm9kZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBub2RlS2V5IGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzLmhhc093blByb3BlcnR5KG5vZGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgY2xvbmVbbm9kZUtleV0gPSB0aGlzLm5vZGVzW25vZGVLZXldLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZ2V0T2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm9vdElkczogdGhpcy5nZXRSb290SWRzKCksXG4gICAgICAgICAgICBub2RlczogdGhpcy5nZXROb2RlcygpLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubW92ZUlkQmVmb3JlSWQgPSBmdW5jdGlvbiAobW92ZUlkLCBiZWZvcmVJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlSWQobW92ZUlkLCBiZWZvcmVJZCwgRGlyZWN0aW9uLkJFRk9SRSk7XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5tb3ZlSWRBZnRlcklkID0gZnVuY3Rpb24gKG1vdmVJZCwgYWZ0ZXJJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3ZlSWQobW92ZUlkLCBhZnRlcklkLCBEaXJlY3Rpb24uQUZURVIpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubW92ZUlkSW50b0lkID0gZnVuY3Rpb24gKG1vdmVJZCwgaW5zaWRlSWQsIGF0U3RhcnQpIHtcbiAgICAgICAgaWYgKGF0U3RhcnQgPT09IHZvaWQgMCkgeyBhdFN0YXJ0ID0gdHJ1ZTsgfVxuICAgICAgICBpZiAoYXRTdGFydCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW92ZUlkKG1vdmVJZCwgaW5zaWRlSWQsIERpcmVjdGlvbi5JTlNJREVfQVRfU1RBUlQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW92ZUlkKG1vdmVJZCwgaW5zaWRlSWQsIERpcmVjdGlvbi5JTlNJREVfQVRfRU5EKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZGVsZXRlSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdGhpcy5yb290RGVsZXRlSWQoaWQpO1xuICAgICAgICB0aGlzLm5vZGVBbmRTdWJOb2Rlc0RlbGV0ZShpZCk7XG4gICAgICAgIHRoaXMubm9kZVJlZnJlbmNlc0RlbGV0ZShpZCk7XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5pbnNlcnRJZEJlZm9yZUlkID0gZnVuY3Rpb24gKGJlZm9yZUlkLCBpbnNlcnRJZCkge1xuICAgICAgICB2YXIgZm91bmRSb290SWRJbmRleCA9IHRoaXMuZmluZFJvb3RJZChiZWZvcmVJZCk7XG4gICAgICAgIGlmIChmb3VuZFJvb3RJZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvUm9vdChpbnNlcnRJZCwgZm91bmRSb290SWRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgbm9kZUtleSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlS2V5KSkge1xuICAgICAgICAgICAgICAgIHZhciBmb3VuZE5vZGVJZEluZGV4ID0gdGhpcy5maW5kTm9kZUlkKG5vZGVLZXksIGJlZm9yZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmROb2RlSWRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvTm9kZShub2RlS2V5LCBpbnNlcnRJZCwgZm91bmROb2RlSWRJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5pbnNlcnRJZEFmdGVySWQgPSBmdW5jdGlvbiAoYmVsb3dJZCwgaW5zZXJ0SWQpIHtcbiAgICAgICAgdmFyIGZvdW5kUm9vdElkSW5kZXggPSB0aGlzLmZpbmRSb290SWQoYmVsb3dJZCk7XG4gICAgICAgIGlmIChmb3VuZFJvb3RJZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvUm9vdChpbnNlcnRJZCwgZm91bmRSb290SWRJbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIG5vZGVLZXkgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUtleSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmROb2RlSWRJbmRleCA9IHRoaXMuZmluZE5vZGVJZChub2RlS2V5LCBiZWxvd0lkKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmROb2RlSWRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvTm9kZShub2RlS2V5LCBpbnNlcnRJZCwgZm91bmROb2RlSWRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuaW5zZXJ0SWRJbnRvSWQgPSBmdW5jdGlvbiAoaW5zaWRlSWQsIGluc2VydElkKSB7XG4gICAgICAgIHRoaXMubm9kZUluc2VydEF0RW5kKGluc2lkZUlkLCBpbnNlcnRJZCk7XG4gICAgICAgIHRoaXMubm9kZXNbaW5zZXJ0SWRdID0gW107XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5pbnNlcnRJZEludG9Sb290ID0gZnVuY3Rpb24gKGlkLCBwb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yb290SW5zZXJ0QXRFbmQoaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMSA9IHRoaXMucm9vdElkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290SWRzLnNwbGljZSgocG9zaXRpb24gKyBsZW5ndGhfMSArIDEpLCAwLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3RJZHMuc3BsaWNlKHBvc2l0aW9uLCAwLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2Rlc1tpZF0gPSB0aGlzLm5vZGVzW2lkXSB8fCBbXTtcbiAgICB9O1xuICAgIE11bHRpUm9vdFRyZWUucHJvdG90eXBlLmluc2VydElkSW50b05vZGUgPSBmdW5jdGlvbiAobm9kZUtleSwgaWQsIHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZUtleV0gPSB0aGlzLm5vZGVzW25vZGVLZXldIHx8IFtdO1xuICAgICAgICB0aGlzLm5vZGVzW2lkXSA9IHRoaXMubm9kZXNbaWRdIHx8IFtdO1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5ub2RlSW5zZXJ0QXRFbmQobm9kZUtleSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMiA9IHRoaXMubm9kZXNbbm9kZUtleV0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZUtleV0uc3BsaWNlKChwb3NpdGlvbiArIGxlbmd0aF8yICsgMSksIDAsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZUtleV0uc3BsaWNlKHBvc2l0aW9uLCAwLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpUm9vdFRyZWUucHJvdG90eXBlLm1vdmVJZCA9IGZ1bmN0aW9uIChtb3ZlSWQsIGJlZm9yZUlkLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIHNvdXJjZUlkID0gbW92ZUlkO1xuICAgICAgICB2YXIgc291cmNlUm9vdEluZGV4ID0gdGhpcy5maW5kUm9vdElkKHNvdXJjZUlkKTtcbiAgICAgICAgdmFyIHNvdXJjZU5vZGVLZXk7XG4gICAgICAgIHZhciBzb3VyY2VOb2RlSWRJbmRleDtcbiAgICAgICAgaWYgKHRoaXMubm9kZXNbYmVmb3JlSWRdKSB7XG4gICAgICAgICAgICBzb3VyY2VOb2RlS2V5ID0gYmVmb3JlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgbm9kZUtleSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlS2V5KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZU5vZGVJZEluZGV4ID0gdGhpcy5maW5kTm9kZUlkKG5vZGVLZXksIGJlZm9yZUlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBnb3QgYWxsXG4gICAgICAgIHZhciB0YXJnZXRJZCA9IGJlZm9yZUlkO1xuICAgICAgICB2YXIgdGFyZ2V0Um9vdEluZGV4ID0gdGhpcy5maW5kUm9vdElkKHRhcmdldElkKTtcbiAgICAgICAgdmFyIHRhcmdldE5vZGVLZXk7XG4gICAgICAgIHZhciB0YXJnZXROb2RlSWRJbmRleDtcbiAgICAgICAgaWYgKHRoaXMubm9kZXNbYmVmb3JlSWRdKSB7XG4gICAgICAgICAgICB0YXJnZXROb2RlS2V5ID0gYmVmb3JlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgbm9kZUtleSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlS2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldE5vZGVJZEluZGV4ID0gdGhpcy5maW5kTm9kZUlkKG5vZGVLZXksIGJlZm9yZUlkKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBnb3QgYWxsXG4gICAgICAgIGlmIChzb3VyY2VSb290SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgaWYgKHRhcmdldFJvb3RJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290RGVsZXRlKHNvdXJjZVJvb3RJbmRleCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uQkVGT1JFOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJZEludG9Sb290KHNvdXJjZUlkLCB0YXJnZXRSb290SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLkFGVEVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJZEludG9Sb290KHNvdXJjZUlkLCB0YXJnZXRSb290SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5JTlNJREVfQVRfU1RBUlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVJbnNlcnRBdFN0YXJ0KHRhcmdldElkLCBzb3VyY2VJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uSU5TSURFX0FUX0VORDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZUluc2VydEF0RW5kKHRhcmdldElkLCBzb3VyY2VJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBtb3Zpbmcgcm9vdCAoc291cmNlKSBBQk9WRSBub2RlICh0YXJnZXQpXG4gICAgICAgICAgICAgICAgLy8gd2lsbCByZW1vdmUgb25lIGVudHJ5IGZyb20gcm9vdHNcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3REZWxldGUoc291cmNlUm9vdEluZGV4KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBub2RlS2V5IGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuZmluZE5vZGVJZChub2RlS2V5LCB0YXJnZXRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLkJFRk9SRTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvTm9kZShub2RlS2V5LCBzb3VyY2VJZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLkFGVEVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJZEludG9Ob2RlKG5vZGVLZXksIHNvdXJjZUlkLCBpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLklOU0lERV9BVF9TVEFSVDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZUluc2VydEF0U3RhcnQodGFyZ2V0SWQsIHNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5JTlNJREVfQVRfRU5EOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlSW5zZXJ0QXRFbmQodGFyZ2V0SWQsIHNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXRSb290SW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIC8vIG1vdmluZyBub2RlIChzb3VyY2UpIEFCT1ZFIHJvb3QgKHRhcmdldClcbiAgICAgICAgICAgICAgICAvLyBkZWxldGUgc291cmNlIGlkIGZyb20gZWFjaCBub2RlXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbm9kZUtleSBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzLmhhc093blByb3BlcnR5KG5vZGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmZpbmROb2RlSWQobm9kZUtleSwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLm5vZGVJbnNlcnRJZChub2RlS2V5LCBzb3VyY2VJZCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZURlbGV0ZUF0SW5kZXgobm9kZUtleSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLkJFRk9SRTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvUm9vdChzb3VyY2VJZCwgdGFyZ2V0Um9vdEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5BRlRFUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SWRJbnRvUm9vdChzb3VyY2VJZCwgdGFyZ2V0Um9vdEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uSU5TSURFX0FUX1NUQVJUOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlSW5zZXJ0QXRTdGFydCh0YXJnZXRJZCwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLklOU0lERV9BVF9FTkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVJbnNlcnRBdEVuZCh0YXJnZXRJZCwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbW92aW5nIG5vZGUgKHNvdXJjZSkgQUJPVkUgbm9kZSAodGFyZ2V0KVxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBzb3VyY2UgaWQgZnJvbSBlYWNoIG5vZGVcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBub2RlS2V5IGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuZmluZE5vZGVJZChub2RlS2V5LCBzb3VyY2VJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZURlbGV0ZUF0SW5kZXgobm9kZUtleSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG5vZGVLZXkgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShub2RlS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5maW5kTm9kZUlkKG5vZGVLZXksIHRhcmdldElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uQkVGT1JFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRJZEludG9Ob2RlKG5vZGVLZXksIHNvdXJjZUlkLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uQUZURVI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydElkSW50b05vZGUobm9kZUtleSwgc291cmNlSWQsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uSU5TSURFX0FUX1NUQVJUOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlSW5zZXJ0QXRTdGFydCh0YXJnZXRJZCwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLklOU0lERV9BVF9FTkQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVJbnNlcnRBdEVuZCh0YXJnZXRJZCwgc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5zd2FwQXJyYXlFbGVtZW50cyA9IGZ1bmN0aW9uIChhcnIsIGluZGV4QSwgaW5kZXhCKSB7XG4gICAgICAgIHZhciB0ZW1wID0gYXJyW2luZGV4QV07XG4gICAgICAgIGFycltpbmRleEFdID0gYXJyW2luZGV4Ql07XG4gICAgICAgIGFycltpbmRleEJdID0gdGVtcDtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9O1xuICAgIDtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5yb290RGVsZXRlSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5maW5kUm9vdElkKGlkKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdERlbGV0ZShpbmRleCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpUm9vdFRyZWUucHJvdG90eXBlLm5vZGVBbmRTdWJOb2Rlc0RlbGV0ZSA9IGZ1bmN0aW9uIChub2RlS2V5KSB7XG4gICAgICAgIHZhciB0b0RlbGV0ZUxhdGVyID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ub2Rlc1tub2RlS2V5XS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5ub2Rlc1tub2RlS2V5XVtpXTtcbiAgICAgICAgICAgIHRoaXMubm9kZUFuZFN1Yk5vZGVzRGVsZXRlKGlkKTtcbiAgICAgICAgICAgIHRvRGVsZXRlTGF0ZXIucHVzaChub2RlS2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVEZWxldGUobm9kZUtleSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9EZWxldGVMYXRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ub2RlRGVsZXRlKHRvRGVsZXRlTGF0ZXJbaV0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5ub2RlUmVmcmVuY2VzRGVsZXRlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGZvciAodmFyIG5vZGVLZXkgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMubm9kZXMuaGFzT3duUHJvcGVydHkobm9kZUtleSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXNbbm9kZUtleV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldElkID0gdGhpcy5ub2Rlc1tub2RlS2V5XVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldElkID09PSBpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlRGVsZXRlQXRJbmRleChub2RlS2V5LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubm9kZURlbGV0ZSA9IGZ1bmN0aW9uIChub2RlS2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzW25vZGVLZXldO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZmluZFJvb3RJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290SWRzLmluZGV4T2YoaWQpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUuZmluZE5vZGVJZCA9IGZ1bmN0aW9uIChub2RlS2V5LCBpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1tub2RlS2V5XS5pbmRleE9mKGlkKTtcbiAgICB9O1xuICAgIE11bHRpUm9vdFRyZWUucHJvdG90eXBlLmZpbmROb2RlID0gZnVuY3Rpb24gKG5vZGVLZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNbbm9kZUtleV07XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5ub2RlSW5zZXJ0QXRTdGFydCA9IGZ1bmN0aW9uIChub2RlS2V5LCBpZCkge1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVLZXldLnVuc2hpZnQoaWQpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubm9kZUluc2VydEF0RW5kID0gZnVuY3Rpb24gKG5vZGVLZXksIGlkKSB7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZUtleV0ucHVzaChpZCk7XG4gICAgfTtcbiAgICBNdWx0aVJvb3RUcmVlLnByb3RvdHlwZS5yb290RGVsZXRlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHRoaXMucm9vdElkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUubm9kZURlbGV0ZUF0SW5kZXggPSBmdW5jdGlvbiAobm9kZUtleSwgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlS2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUucm9vdEluc2VydEF0U3RhcnQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdGhpcy5yb290SWRzLnVuc2hpZnQoaWQpO1xuICAgIH07XG4gICAgTXVsdGlSb290VHJlZS5wcm90b3R5cGUucm9vdEluc2VydEF0RW5kID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHRoaXMucm9vdElkcy5wdXNoKGlkKTtcbiAgICB9O1xuICAgIHJldHVybiBNdWx0aVJvb3RUcmVlO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IE11bHRpUm9vdFRyZWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NdWx0aVJvb3RUcmVlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBIZWFwXzEgPSByZXF1aXJlKCcuL0hlYXAnKTtcbnZhciBQcmlvcml0eVF1ZXVlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHByaW9yaXR5IHF1ZXVlLlxuICAgICAqIEBjbGFzcyA8cD5JbiBhIHByaW9yaXR5IHF1ZXVlIGVhY2ggZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSBcInByaW9yaXR5XCIsXG4gICAgICogZWxlbWVudHMgYXJlIGRlcXVldWVkIGluIGhpZ2hlc3QtcHJpb3JpdHktZmlyc3Qgb3JkZXIgKHRoZSBlbGVtZW50cyB3aXRoIHRoZVxuICAgICAqIGhpZ2hlc3QgcHJpb3JpdHkgYXJlIGRlcXVldWVkIGZpcnN0KS4gUHJpb3JpdHkgUXVldWVzIGFyZSBpbXBsZW1lbnRlZCBhcyBoZWFwcy5cbiAgICAgKiBJZiB0aGUgaW5zZXJ0ZWQgZWxlbWVudHMgYXJlIGN1c3RvbSBvYmplY3RzIGEgY29tcGFyZSBmdW5jdGlvbiBtdXN0IGJlIHByb3ZpZGVkLFxuICAgICAqIG90aGVyd2lzZSB0aGUgPD0sID09PSBhbmQgPj0gb3BlcmF0b3JzIGFyZSB1c2VkIHRvIGNvbXBhcmUgb2JqZWN0IHByaW9yaXR5LjwvcD5cbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAgICAqICBpZiAoYSBpcyBsZXNzIHRoYW4gYiBieSBzb21lIG9yZGVyaW5nIGNyaXRlcmlvbikge1xuICAgICAqICAgICByZXR1cm4gLTE7XG4gICAgICogIH0gaWYgKGEgaXMgZ3JlYXRlciB0aGFuIGIgYnkgdGhlIG9yZGVyaW5nIGNyaXRlcmlvbikge1xuICAgICAqICAgICByZXR1cm4gMTtcbiAgICAgKiAgfVxuICAgICAqICAvLyBhIG11c3QgYmUgZXF1YWwgdG8gYlxuICAgICAqICByZXR1cm4gMDtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpudW1iZXI9fSBjb21wYXJlRnVuY3Rpb24gb3B0aW9uYWxcbiAgICAgKiBmdW5jdGlvbiB1c2VkIHRvIGNvbXBhcmUgdHdvIGVsZW1lbnQgcHJpb3JpdGllcy4gTXVzdCByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLFxuICAgICAqIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0byxcbiAgICAgKiBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBQcmlvcml0eVF1ZXVlKGNvbXBhcmVGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmhlYXAgPSBuZXcgSGVhcF8xLmRlZmF1bHQodXRpbC5yZXZlcnNlQ29tcGFyZUZ1bmN0aW9uKGNvbXBhcmVGdW5jdGlvbikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoaXMgcHJpb3JpdHkgcXVldWUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGluc2VydGVkLCBvciBmYWxzZSBpZiBpdCBpcyB1bmRlZmluZWQuXG4gICAgICovXG4gICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXAuYWRkKGVsZW1lbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGlzIHByaW9yaXR5IHF1ZXVlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBpbnNlcnRlZCwgb3IgZmFsc2UgaWYgaXQgaXMgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIFByaW9yaXR5UXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXAuYWRkKGVsZW1lbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFuZCByZW1vdmVzIHRoZSBoaWdoZXN0IHByaW9yaXR5IGVsZW1lbnQgb2YgdGhpcyBxdWV1ZS5cbiAgICAgKiBAcmV0dXJuIHsqfSB0aGUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZWxlbWVudCBvZiB0aGlzIHF1ZXVlLFxuICAgICAqICBvciB1bmRlZmluZWQgaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5kZXF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5oZWFwLnNpemUoKSAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5oZWFwLnBlZWsoKTtcbiAgICAgICAgICAgIHRoaXMuaGVhcC5yZW1vdmVSb290KCk7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcywgYnV0IGRvZXMgbm90IHJlbW92ZSwgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZWxlbWVudCBvZiB0aGlzIHF1ZXVlLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSBoaWdoZXN0IHByaW9yaXR5IGVsZW1lbnQgb2YgdGhpcyBxdWV1ZSwgb3IgdW5kZWZpbmVkIGlmIHRoaXMgcXVldWUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5wZWVrKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcmlvcml0eSBxdWV1ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW1lbnQgZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBwcmlvcml0eSBxdWV1ZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIFByaW9yaXR5UXVldWUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5jb250YWlucyhlbGVtZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGlzIHByaW9yaXR5IHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBwcmlvcml0eSBxdWV1ZSBjb250YWlucyBubyBpdGVtczsgZmFsc2VcbiAgICAgKiBvdGhlcndpc2UuXG4gICAgICovXG4gICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5pc0VtcHR5KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBwcmlvcml0eSBxdWV1ZS5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBwcmlvcml0eSBxdWV1ZS5cbiAgICAgKi9cbiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oZWFwLnNpemUoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgcHJpb3JpdHkgcXVldWUuXG4gICAgICovXG4gICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGVhcC5jbGVhcigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBwcmVzZW50IGluIHRoaXMgcXVldWUgaW5cbiAgICAgKiBubyBwYXJ0aWN1bGFyIG9yZGVyLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0KToqfSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlLCBpdCBpc1xuICAgICAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6IHRoZSBlbGVtZW50IHZhbHVlLCB0byBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAgICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAgKi9cbiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuaGVhcC5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIHJldHVybiBQcmlvcml0eVF1ZXVlO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IFByaW9yaXR5UXVldWU7IC8vIGVuZCBvZiBwcmlvcml0eSBxdWV1ZVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJpb3JpdHlRdWV1ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBMaW5rZWRMaXN0XzEgPSByZXF1aXJlKCcuL0xpbmtlZExpc3QnKTtcbnZhciBRdWV1ZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBxdWV1ZS5cbiAgICAgKiBAY2xhc3MgQSBxdWV1ZSBpcyBhIEZpcnN0LUluLUZpcnN0LU91dCAoRklGTykgZGF0YSBzdHJ1Y3R1cmUsIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYWRkZWQgdG8gdGhlIHF1ZXVlIHdpbGwgYmUgdGhlIGZpcnN0IG9uZSB0byBiZSByZW1vdmVkLiBUaGlzXG4gICAgICogaW1wbGVtZW50YXRpb24gdXNlcyBhIGxpbmtlZCBsaXN0IGFzIGEgY29udGFpbmVyLlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFF1ZXVlKCkge1xuICAgICAgICB0aGlzLmxpc3QgPSBuZXcgTGlua2VkTGlzdF8xLmRlZmF1bHQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgZW5kIG9mIHRoaXMgcXVldWUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW0gdGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGluc2VydGVkLCBvciBmYWxzZSBpZiBpdCBpcyB1bmRlZmluZWQuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLmVucXVldWUgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmFkZChlbGVtKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIGVuZCBvZiB0aGlzIHF1ZXVlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtIHRoZSBlbGVtZW50IHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBpbnNlcnRlZCwgb3IgZmFsc2UgaWYgaXQgaXMgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIFF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmFkZChlbGVtKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbmQgcmVtb3ZlcyB0aGUgaGVhZCBvZiB0aGlzIHF1ZXVlLlxuICAgICAqIEByZXR1cm4geyp9IHRoZSBoZWFkIG9mIHRoaXMgcXVldWUsIG9yIHVuZGVmaW5lZCBpZiB0aGlzIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIFF1ZXVlLnByb3RvdHlwZS5kZXF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5saXN0LnNpemUoKSAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5saXN0LmZpcnN0KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3QucmVtb3ZlRWxlbWVudEF0SW5kZXgoMCk7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcywgYnV0IGRvZXMgbm90IHJlbW92ZSwgdGhlIGhlYWQgb2YgdGhpcyBxdWV1ZS5cbiAgICAgKiBAcmV0dXJuIHsqfSB0aGUgaGVhZCBvZiB0aGlzIHF1ZXVlLCBvciB1bmRlZmluZWQgaWYgdGhpcyBxdWV1ZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBRdWV1ZS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdC5zaXplKCkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3QuZmlyc3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcXVldWUuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcXVldWUuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3Quc2l6ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcXVldWUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAqIDxwPklmIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhpcyBzdGFjayBhcmVcbiAgICAgKiBub3QgY29tcGFyYWJsZSB3aXRoIHRoZSA9PT0gb3BlcmF0b3IsIGEgY3VzdG9tIGVxdWFscyBmdW5jdGlvbiBzaG91bGQgYmVcbiAgICAgKiBwcm92aWRlZCB0byBwZXJmb3JtIHNlYXJjaGVzLCB0aGUgZnVuY3Rpb24gbXVzdCByZWNlaXZlIHR3byBhcmd1bWVudHMgYW5kXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhleSBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4gRXhhbXBsZTo8L3A+XG4gICAgICpcbiAgICAgKiA8cHJlPlxuICAgICAqIGNvbnN0IHBldHNBcmVFcXVhbEJ5TmFtZSAocGV0MSwgcGV0Mikge1xuICAgICAqICByZXR1cm4gcGV0MS5uYW1lID09PSBwZXQyLm5hbWU7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtIGVsZW1lbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOmJvb2xlYW49fSBlcXVhbHNGdW5jdGlvbiBvcHRpb25hbFxuICAgICAqIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHR3byBlbGVtZW50cyBhcmUgZXF1YWwuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCxcbiAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKGVsZW0sIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QuY29udGFpbnMoZWxlbSwgZXF1YWxzRnVuY3Rpb24pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgcXVldWUgaXMgZW1wdHkuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIG5vIGl0ZW1zOyBmYWxzZVxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBRdWV1ZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5zaXplKCkgPD0gMDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgcXVldWUuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxpc3QuY2xlYXIoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHF1ZXVlIGluXG4gICAgICogRklGTyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuXG4gICAgICogb3B0aW9uYWxseSByZXR1cm4gZmFsc2UuXG4gICAgICovXG4gICAgUXVldWUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goY2FsbGJhY2spO1xuICAgIH07XG4gICAgcmV0dXJuIFF1ZXVlO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IFF1ZXVlOyAvLyBFbmQgb2YgcXVldWVcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXVlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBhcnJheXMgPSByZXF1aXJlKCcuL2FycmF5cycpO1xudmFyIERpY3Rpb25hcnlfMSA9IHJlcXVpcmUoJy4vRGljdGlvbmFyeScpO1xudmFyIFNldCA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBzZXQuXG4gICAgICogQGNsYXNzIDxwPkEgc2V0IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBubyBkdXBsaWNhdGUgaXRlbXMuPC9wPlxuICAgICAqIDxwPklmIHRoZSBpbnNlcnRlZCBlbGVtZW50cyBhcmUgY3VzdG9tIG9iamVjdHMgYSBmdW5jdGlvblxuICAgICAqIHdoaWNoIGNvbnZlcnRzIGVsZW1lbnRzIHRvIHN0cmluZ3MgbXVzdCBiZSBwcm92aWRlZC4gRXhhbXBsZTo8L3A+XG4gICAgICpcbiAgICAgKiA8cHJlPlxuICAgICAqIGZ1bmN0aW9uIHBldFRvU3RyaW5nKHBldCkge1xuICAgICAqICByZXR1cm4gcGV0Lm5hbWU7XG4gICAgICogfVxuICAgICAqIDwvcHJlPlxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOnN0cmluZz19IHRvU3RyaW5nRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZFxuICAgICAqIHRvIGNvbnZlcnQgZWxlbWVudHMgdG8gc3RyaW5ncy4gSWYgdGhlIGVsZW1lbnRzIGFyZW4ndCBzdHJpbmdzIG9yIGlmIHRvU3RyaW5nKClcbiAgICAgKiBpcyBub3QgYXBwcm9wcmlhdGUsIGEgY3VzdG9tIGZ1bmN0aW9uIHdoaWNoIHJlY2VpdmVzIGEgb25qZWN0IGFuZCByZXR1cm5zIGFcbiAgICAgKiB1bmlxdWUgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2V0KHRvU3RyaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnlfMS5kZWZhdWx0KHRvU3RyaW5nRnVuY3Rpb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IGVsZW1lbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCxcbiAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkuY29udGFpbnNLZXkoZWxlbWVudCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGlzIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGluc2VydC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgc2V0IGRpZCBub3QgYWxyZWFkeSBjb250YWluIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5zKGVsZW1lbnQpIHx8IHV0aWwuaXNVbmRlZmluZWQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeS5zZXRWYWx1ZShlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbiBpbnRlcnNlY2lvbiBiZXR3ZWVuIHRoaXMgYW4gYW5vdGhlciBzZXQuXG4gICAgICogUmVtb3ZlcyBhbGwgdmFsdWVzIHRoYXQgYXJlIG5vdCBwcmVzZW50IHRoaXMgc2V0IGFuZCB0aGUgZ2l2ZW4gc2V0LlxuICAgICAqIEBwYXJhbSB7Y29sbGVjdGlvbnMuU2V0fSBvdGhlclNldCBvdGhlciBzZXQuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAob3RoZXJTZXQpIHtcbiAgICAgICAgdmFyIHNldCA9IHRoaXM7XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKCFvdGhlclNldC5jb250YWlucyhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHNldC5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHVuaW9uIGJldHdlZW4gdGhpcyBhbiBhbm90aGVyIHNldC5cbiAgICAgKiBBZGRzIGFsbCB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gc2V0IHRvIHRoaXMgc2V0LlxuICAgICAqIEBwYXJhbSB7Y29sbGVjdGlvbnMuU2V0fSBvdGhlclNldCBvdGhlciBzZXQuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS51bmlvbiA9IGZ1bmN0aW9uIChvdGhlclNldCkge1xuICAgICAgICB2YXIgc2V0ID0gdGhpcztcbiAgICAgICAgb3RoZXJTZXQuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgc2V0LmFkZChlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW4gYW5vdGhlciBzZXQuXG4gICAgICogUmVtb3ZlcyBmcm9tIHRoaXMgc2V0IGFsbCB0aGUgdmFsdWVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGdpdmVuIHNldC5cbiAgICAgKiBAcGFyYW0ge2NvbGxlY3Rpb25zLlNldH0gb3RoZXJTZXQgb3RoZXIgc2V0LlxuICAgICAqL1xuICAgIFNldC5wcm90b3R5cGUuZGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChvdGhlclNldCkge1xuICAgICAgICB2YXIgc2V0ID0gdGhpcztcbiAgICAgICAgb3RoZXJTZXQuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgc2V0LnJlbW92ZShlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBzZXQgY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldC5cbiAgICAgKiBAcGFyYW0ge2NvbGxlY3Rpb25zLlNldH0gb3RoZXJTZXQgb3RoZXIgc2V0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhpcyBzZXQgaXMgYSBzdWJzZXQgb2YgdGhlIGdpdmVuIHNldC5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLmlzU3Vic2V0T2YgPSBmdW5jdGlvbiAob3RoZXJTZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZSgpID4gb3RoZXJTZXQuc2l6ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzU3ViID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoIW90aGVyU2V0LmNvbnRhaW5zKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaXNTdWIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpc1N1YjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhpcyBzZXQgaWYgaXQgaXMgcHJlc2VudC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5lZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnMoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGljdGlvbmFyeS5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggZWxlbWVudFxuICAgICAqIHByZXNlbnQgaW4gdGhpcyBzZXQuXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpOip9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIGl0IGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudHM6IHRoZSBlbGVtZW50LiBUbyBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAgICAgKiBvcHRpb25hbGx5IHJldHVybiBmYWxzZS5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmZvckVhY2goZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh2KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldCBpbiBhcmJpdHJhcnkgb3JkZXIuXG4gICAgICogQHJldHVybiB7QXJyYXl9IGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGlzIHNldC5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkudmFsdWVzKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXQgY29udGFpbnMgbm8gZWxlbWVudHMuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGlzIHNldCBjb250YWlucyBubyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkuaXNFbXB0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgc2V0LlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIHNldC5cbiAgICAgKi9cbiAgICBTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25hcnkuc2l6ZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQuXG4gICAgICovXG4gICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5LmNsZWFyKCk7XG4gICAgfTtcbiAgICAvKlxuICAgICogUHJvdmlkZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIGRpc3BsYXlcbiAgICAqL1xuICAgIFNldC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcnJheXMudG9TdHJpbmcodGhpcy50b0FycmF5KCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFNldDtcbn0oKSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBTZXQ7IC8vIGVuZCBvZiBTZXRcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBMaW5rZWRMaXN0XzEgPSByZXF1aXJlKCcuL0xpbmtlZExpc3QnKTtcbnZhciBTdGFjayA9IChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBTdGFjay5cbiAgICAgKiBAY2xhc3MgQSBTdGFjayBpcyBhIExhc3QtSW4tRmlyc3QtT3V0IChMSUZPKSBkYXRhIHN0cnVjdHVyZSwgdGhlIGxhc3RcbiAgICAgKiBlbGVtZW50IGFkZGVkIHRvIHRoZSBzdGFjayB3aWxsIGJlIHRoZSBmaXJzdCBvbmUgdG8gYmUgcmVtb3ZlZC4gVGhpc1xuICAgICAqIGltcGxlbWVudGF0aW9uIHVzZXMgYSBsaW5rZWQgbGlzdCBhcyBhIGNvbnRhaW5lci5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTdGFjaygpIHtcbiAgICAgICAgdGhpcy5saXN0ID0gbmV3IExpbmtlZExpc3RfMS5kZWZhdWx0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtIHRoZSBlbGVtZW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZWxlbWVudCB3YXMgcHVzaGVkIG9yIGZhbHNlIGlmIGl0IGlzIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICBTdGFjay5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QuYWRkKGVsZW0sIDApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW0gdGhlIGVsZW1lbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBwdXNoZWQgb3IgZmFsc2UgaWYgaXQgaXMgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIFN0YWNrLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmFkZChlbGVtLCAwKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgYW5kIHJldHVybnMgdGhhdCBvYmplY3QuXG4gICAgICogQHJldHVybiB7Kn0gdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgb3IgdW5kZWZpbmVkIGlmIHRoZVxuICAgICAqIHN0YWNrIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIFN0YWNrLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QucmVtb3ZlRWxlbWVudEF0SW5kZXgoMCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMb29rcyBhdCB0aGUgb2JqZWN0IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlXG4gICAgICogc3RhY2suXG4gICAgICogQHJldHVybiB7Kn0gdGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2sgb3IgdW5kZWZpbmVkIGlmIHRoZVxuICAgICAqIHN0YWNrIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIFN0YWNrLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmZpcnN0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzdGFjay5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzdGFjay5cbiAgICAgKi9cbiAgICBTdGFjay5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdGFjayBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAgICogPHA+SWYgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGlzIHN0YWNrIGFyZVxuICAgICAqIG5vdCBjb21wYXJhYmxlIHdpdGggdGhlID09PSBvcGVyYXRvciwgYSBjdXN0b20gZXF1YWxzIGZ1bmN0aW9uIHNob3VsZCBiZVxuICAgICAqIHByb3ZpZGVkIHRvIHBlcmZvcm0gc2VhcmNoZXMsIHRoZSBmdW5jdGlvbiBtdXN0IHJlY2VpdmUgdHdvIGFyZ3VtZW50cyBhbmRcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGV5IGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBFeGFtcGxlOjwvcD5cbiAgICAgKlxuICAgICAqIDxwcmU+XG4gICAgICogY29uc3QgcGV0c0FyZUVxdWFsQnlOYW1lIChwZXQxLCBwZXQyKSB7XG4gICAgICogIHJldHVybiBwZXQxLm5hbWUgPT09IHBldDIubmFtZTtcbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVsZW0gZWxlbWVudCB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsXG4gICAgICogZnVuY3Rpb24gdG8gY2hlY2sgaWYgdHdvIGVsZW1lbnRzIGFyZSBlcXVhbC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoaXMgc3RhY2sgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LFxuICAgICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBTdGFjay5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZWxlbSwgZXF1YWxzRnVuY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdC5jb250YWlucyhlbGVtLCBlcXVhbHNGdW5jdGlvbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBzdGFjayBpcyBlbXB0eS5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgc3RhY2sgY29udGFpbnMgbm8gaXRlbXM7IGZhbHNlXG4gICAgICogb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIFN0YWNrLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0LmlzRW1wdHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgc3RhY2suXG4gICAgICovXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxpc3QuY2xlYXIoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGlzIHN0YWNrIGluXG4gICAgICogTElGTyBvcmRlci5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB2YWx1ZSwgdG8gYnJlYWsgdGhlIGl0ZXJhdGlvbiB5b3UgY2FuXG4gICAgICogb3B0aW9uYWxseSByZXR1cm4gZmFsc2UuXG4gICAgICovXG4gICAgU3RhY2sucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5saXN0LmZvckVhY2goY2FsbGJhY2spO1xuICAgIH07XG4gICAgcmV0dXJuIFN0YWNrO1xufSgpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IFN0YWNrOyAvLyBFbmQgb2Ygc3RhY2tcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YWNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbi8qKlxuICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBpdGVtXG4gKiB3aXRoaW4gdGhlIHNwZWNpZmllZCBhcnJheS40XG4gKiBAcGFyYW0geyp9IGFycmF5IHRoZSBhcnJheSBpbiB3aGljaCB0byBzZWFyY2ggdGhlIGVsZW1lbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSB0aGUgZWxlbWVudCB0byBzZWFyY2guXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOmJvb2xlYW49fSBlcXVhbHNGdW5jdGlvbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvXG4gKiBjaGVjayBlcXVhbGl0eSBiZXR3ZWVuIDIgZWxlbWVudHMuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBvciAtMSBpZiBub3QgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKSB7XG4gICAgdmFyIGVxdWFscyA9IGVxdWFsc0Z1bmN0aW9uIHx8IHV0aWwuZGVmYXVsdEVxdWFscztcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGVxdWFscyhhcnJheVtpXSwgaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmV4cG9ydHMuaW5kZXhPZiA9IGluZGV4T2Y7XG4vKipcbiAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gKiB3aXRoaW4gdGhlIHNwZWNpZmllZCBhcnJheS5cbiAqIEBwYXJhbSB7Kn0gYXJyYXkgdGhlIGFycmF5IGluIHdoaWNoIHRvIHNlYXJjaCB0aGUgZWxlbWVudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIHRoZSBlbGVtZW50IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsIGZ1bmN0aW9uIHVzZWQgdG9cbiAqIGNoZWNrIGVxdWFsaXR5IGJldHdlZW4gMiBlbGVtZW50cy5cbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50XG4gKiB3aXRoaW4gdGhlIHNwZWNpZmllZCBhcnJheSBvciAtMSBpZiBub3QgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGxhc3RJbmRleE9mKGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikge1xuICAgIHZhciBlcXVhbHMgPSBlcXVhbHNGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRFcXVhbHM7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGVxdWFscyhhcnJheVtpXSwgaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmV4cG9ydHMubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LlxuICogQHBhcmFtIHsqfSBhcnJheSB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gc2VhcmNoIHRoZSBlbGVtZW50LlxuICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gdGhlIGVsZW1lbnQgdG8gc2VhcmNoLlxuICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QsT2JqZWN0KTpib29sZWFuPX0gZXF1YWxzRnVuY3Rpb24gb3B0aW9uYWwgZnVuY3Rpb24gdG9cbiAqIGNoZWNrIGVxdWFsaXR5IGJldHdlZW4gMiBlbGVtZW50cy5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zKGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikge1xuICAgIHJldHVybiBpbmRleE9mKGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikgPj0gMDtcbn1cbmV4cG9ydHMuY29udGFpbnMgPSBjb250YWlucztcbi8qKlxuICogUmVtb3ZlcyB0aGUgZmlyc3Qgb2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkuXG4gKiBAcGFyYW0geyp9IGFycmF5IHRoZSBhcnJheSBpbiB3aGljaCB0byBzZWFyY2ggZWxlbWVudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIHRoZSBlbGVtZW50IHRvIHNlYXJjaC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsIGZ1bmN0aW9uIHRvXG4gKiBjaGVjayBlcXVhbGl0eSBiZXR3ZWVuIDIgZWxlbWVudHMuXG4gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBhcnJheSBjaGFuZ2VkIGFmdGVyIHRoaXMgY2FsbC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikge1xuICAgIHZhciBpbmRleCA9IGluZGV4T2YoYXJyYXksIGl0ZW0sIGVxdWFsc0Z1bmN0aW9uKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydHMucmVtb3ZlID0gcmVtb3ZlO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSBlcXVhbFxuICogdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSB0aGUgYXJyYXkgaW4gd2hpY2ggdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSB0aGUgZWxlbWVudCB3aG9zZSBmcmVxdWVuY3kgaXMgdG8gYmUgZGV0ZXJtaW5lZC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oT2JqZWN0LE9iamVjdCk6Ym9vbGVhbj19IGVxdWFsc0Z1bmN0aW9uIG9wdGlvbmFsIGZ1bmN0aW9uIHVzZWQgdG9cbiAqIGNoZWNrIGVxdWFsaXR5IGJldHdlZW4gMiBlbGVtZW50cy5cbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5XG4gKiBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZnJlcXVlbmN5KGFycmF5LCBpdGVtLCBlcXVhbHNGdW5jdGlvbikge1xuICAgIHZhciBlcXVhbHMgPSBlcXVhbHNGdW5jdGlvbiB8fCB1dGlsLmRlZmF1bHRFcXVhbHM7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICB2YXIgZnJlcSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZXF1YWxzKGFycmF5W2ldLCBpdGVtKSkge1xuICAgICAgICAgICAgZnJlcSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmVxO1xufVxuZXhwb3J0cy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIHNwZWNpZmllZCBhcnJheXMgYXJlIGVxdWFsIHRvIG9uZSBhbm90aGVyLlxuICogVHdvIGFycmF5cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiBib3RoIGFycmF5cyBjb250YWluIHRoZSBzYW1lIG51bWJlclxuICogb2YgZWxlbWVudHMsIGFuZCBhbGwgY29ycmVzcG9uZGluZyBwYWlycyBvZiBlbGVtZW50cyBpbiB0aGUgdHdvXG4gKiBhcnJheXMgYXJlIGVxdWFsIGFuZCBhcmUgaW4gdGhlIHNhbWUgb3JkZXIuXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheTEgb25lIGFycmF5IHRvIGJlIHRlc3RlZCBmb3IgZXF1YWxpdHkuXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheTIgdGhlIG90aGVyIGFycmF5IHRvIGJlIHRlc3RlZCBmb3IgZXF1YWxpdHkuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCxPYmplY3QpOmJvb2xlYW49fSBlcXVhbHNGdW5jdGlvbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvXG4gKiBjaGVjayBlcXVhbGl0eSBiZXR3ZWVuIGVsZW1lbWVudHMgaW4gdGhlIGFycmF5cy5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsXG4gKi9cbmZ1bmN0aW9uIGVxdWFscyhhcnJheTEsIGFycmF5MiwgZXF1YWxzRnVuY3Rpb24pIHtcbiAgICB2YXIgZXF1YWxzID0gZXF1YWxzRnVuY3Rpb24gfHwgdXRpbC5kZWZhdWx0RXF1YWxzO1xuICAgIGlmIChhcnJheTEubGVuZ3RoICE9PSBhcnJheTIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5MS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWVxdWFscyhhcnJheTFbaV0sIGFycmF5MltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydHMuZXF1YWxzID0gZXF1YWxzO1xuLyoqXG4gKiBSZXR1cm5zIHNoYWxsb3cgYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuXG4gKiBAcGFyYW0geyp9IGFycmF5IHRoZSBhcnJheSB0byBjb3B5LlxuICogQHJldHVybiB7QXJyYXl9IGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGNvcHkoYXJyYXkpIHtcbiAgICByZXR1cm4gYXJyYXkuY29uY2F0KCk7XG59XG5leHBvcnRzLmNvcHkgPSBjb3B5O1xuLyoqXG4gKiBTd2FwcyB0aGUgZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBpbiB3aGljaCB0byBzd2FwIGVsZW1lbnRzLlxuICogQHBhcmFtIHtudW1iZXJ9IGkgdGhlIGluZGV4IG9mIG9uZSBlbGVtZW50IHRvIGJlIHN3YXBwZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gaiB0aGUgaW5kZXggb2YgdGhlIG90aGVyIGVsZW1lbnQgdG8gYmUgc3dhcHBlZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGFycmF5IGlzIGRlZmluZWQgYW5kIHRoZSBpbmRleGVzIGFyZSB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikge1xuICAgIGlmIChpIDwgMCB8fCBpID49IGFycmF5Lmxlbmd0aCB8fCBqIDwgMCB8fCBqID49IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB0ZW1wID0gYXJyYXlbaV07XG4gICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICBhcnJheVtqXSA9IHRlbXA7XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnRzLnN3YXAgPSBzd2FwO1xuZnVuY3Rpb24gdG9TdHJpbmcoYXJyYXkpIHtcbiAgICByZXR1cm4gJ1snICsgYXJyYXkudG9TdHJpbmcoKSArICddJztcbn1cbmV4cG9ydHMudG9TdHJpbmcgPSB0b1N0cmluZztcbi8qKlxuICogRXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBwcmVzZW50IGluIHRoaXMgYXJyYXlcbiAqIHN0YXJ0aW5nIGZyb20gaW5kZXggMCB0byBsZW5ndGggLSAxLlxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IGluIHdoaWNoIHRvIGl0ZXJhdGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKE9iamVjdCk6Kn0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZXhlY3V0ZSwgaXQgaXNcbiAqIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6IHRoZSBlbGVtZW50IHZhbHVlLCB0byBicmVhayB0aGUgaXRlcmF0aW9uIHlvdSBjYW5cbiAqIG9wdGlvbmFsbHkgcmV0dXJuIGZhbHNlLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoKGFycmF5LCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIF9pID0gMCwgYXJyYXlfMSA9IGFycmF5OyBfaSA8IGFycmF5XzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBlbGUgPSBhcnJheV8xW19pXTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKGVsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLmZvckVhY2ggPSBmb3JFYWNoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXlzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5leHBvcnRzLmhhcyA9IGZ1bmN0aW9uIChvYmosIHByb3ApIHtcbiAgICByZXR1cm4gX2hhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn07XG4vKipcbiAqIERlZmF1bHQgZnVuY3Rpb24gdG8gY29tcGFyZSBlbGVtZW50IG9yZGVyLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlKGEsIGIpIHtcbiAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0Q29tcGFyZSA9IGRlZmF1bHRDb21wYXJlO1xuLyoqXG4gKiBEZWZhdWx0IGZ1bmN0aW9uIHRvIHRlc3QgZXF1YWxpdHkuXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVxdWFscyhhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG5leHBvcnRzLmRlZmF1bHRFcXVhbHMgPSBkZWZhdWx0RXF1YWxzO1xuLyoqXG4gKiBEZWZhdWx0IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYW4gb2JqZWN0IHRvIGEgc3RyaW5nLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRUb1N0cmluZyhpdGVtKSB7XG4gICAgaWYgKGl0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdDT0xMRUNUSU9OX05VTEwnO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1VuZGVmaW5lZChpdGVtKSkge1xuICAgICAgICByZXR1cm4gJ0NPTExFQ1RJT05fVU5ERUZJTkVEJztcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdHJpbmcoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuICckcycgKyBpdGVtO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuICckbycgKyBpdGVtLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0VG9TdHJpbmcgPSBkZWZhdWx0VG9TdHJpbmc7XG4vKipcbiogSm9pbnMgYWxsIHRoZSBwcm9wZXJpZXMgb2YgdGhlIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQgam9pbiBzdHJpbmdcbiovXG5mdW5jdGlvbiBtYWtlU3RyaW5nKGl0ZW0sIGpvaW4pIHtcbiAgICBpZiAoam9pbiA9PT0gdm9pZCAwKSB7IGpvaW4gPSAnLCc7IH1cbiAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ0NPTExFQ1RJT05fTlVMTCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzVW5kZWZpbmVkKGl0ZW0pKSB7XG4gICAgICAgIHJldHVybiAnQ09MTEVDVElPTl9VTkRFRklORUQnO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1N0cmluZyhpdGVtKSkge1xuICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHRvcmV0ID0gJ3snO1xuICAgICAgICB2YXIgZmlyc3QgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIGl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChleHBvcnRzLmhhcyhpdGVtLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9yZXQgPSB0b3JldCArIGpvaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvcmV0ID0gdG9yZXQgKyBwcm9wICsgJzonICsgaXRlbVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9yZXQgKyAnfSc7XG4gICAgfVxufVxuZXhwb3J0cy5tYWtlU3RyaW5nID0gbWFrZVN0cmluZztcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuYykge1xuICAgIHJldHVybiAodHlwZW9mIGZ1bmMpID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudCBpcyB1bmRlZmluZWQuXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqKSA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYSBzdHJpbmcuXG4gKiBAZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBTdHJpbmddJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcbi8qKlxuICogUmV2ZXJzZXMgYSBjb21wYXJlIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2VDb21wYXJlRnVuY3Rpb24oY29tcGFyZUZ1bmN0aW9uKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNvbXBhcmVGdW5jdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCwgdikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVGdW5jdGlvbihkLCB2KSAqIC0xO1xuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMucmV2ZXJzZUNvbXBhcmVGdW5jdGlvbiA9IHJldmVyc2VDb21wYXJlRnVuY3Rpb247XG4vKipcbiAqIFJldHVybnMgYW4gZXF1YWwgZnVuY3Rpb24gZ2l2ZW4gYSBjb21wYXJlIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVUb0VxdWFscyhjb21wYXJlRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVGdW5jdGlvbihhLCBiKSA9PT0gMDtcbiAgICB9O1xufVxuZXhwb3J0cy5jb21wYXJlVG9FcXVhbHMgPSBjb21wYXJlVG9FcXVhbHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IDIwMTMgQmFzYXJhdCBBbGkgU3llZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG4vLyBMaWNlbnNlZCB1bmRlciBNSVQgb3BlbiBzb3VyY2UgbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4vL1xuLy8gT3JnaW5hbCBqYXZhc2NyaXB0IGNvZGUgd2FzIGJ5IE1hdXJpY2lvIFNhbnRvc1xuLy9cbnZhciBfYXJyYXlzID0gcmVxdWlyZSgnLi9hcnJheXMnKTtcbmV4cG9ydHMuYXJyYXlzID0gX2FycmF5cztcbnZhciBCYWdfMSA9IHJlcXVpcmUoJy4vQmFnJyk7XG5leHBvcnRzLkJhZyA9IEJhZ18xLmRlZmF1bHQ7XG52YXIgQlNUcmVlXzEgPSByZXF1aXJlKCcuL0JTVHJlZScpO1xuZXhwb3J0cy5CU1RyZWUgPSBCU1RyZWVfMS5kZWZhdWx0O1xudmFyIERpY3Rpb25hcnlfMSA9IHJlcXVpcmUoJy4vRGljdGlvbmFyeScpO1xuZXhwb3J0cy5EaWN0aW9uYXJ5ID0gRGljdGlvbmFyeV8xLmRlZmF1bHQ7XG52YXIgSGVhcF8xID0gcmVxdWlyZSgnLi9IZWFwJyk7XG5leHBvcnRzLkhlYXAgPSBIZWFwXzEuZGVmYXVsdDtcbnZhciBMaW5rZWREaWN0aW9uYXJ5XzEgPSByZXF1aXJlKCcuL0xpbmtlZERpY3Rpb25hcnknKTtcbmV4cG9ydHMuTGlua2VkRGljdGlvbmFyeSA9IExpbmtlZERpY3Rpb25hcnlfMS5kZWZhdWx0O1xudmFyIExpbmtlZExpc3RfMSA9IHJlcXVpcmUoJy4vTGlua2VkTGlzdCcpO1xuZXhwb3J0cy5MaW5rZWRMaXN0ID0gTGlua2VkTGlzdF8xLmRlZmF1bHQ7XG52YXIgTXVsdGlEaWN0aW9uYXJ5XzEgPSByZXF1aXJlKCcuL011bHRpRGljdGlvbmFyeScpO1xuZXhwb3J0cy5NdWx0aURpY3Rpb25hcnkgPSBNdWx0aURpY3Rpb25hcnlfMS5kZWZhdWx0O1xudmFyIEZhY3RvcnlEaWN0aW9uYXJ5XzEgPSByZXF1aXJlKCcuL0ZhY3RvcnlEaWN0aW9uYXJ5Jyk7XG5leHBvcnRzLkZhY3RvcnlEaWN0aW9uYXJ5ID0gRmFjdG9yeURpY3Rpb25hcnlfMS5kZWZhdWx0O1xudmFyIEZhY3RvcnlEaWN0aW9uYXJ5XzIgPSByZXF1aXJlKCcuL0ZhY3RvcnlEaWN0aW9uYXJ5Jyk7XG5leHBvcnRzLkRlZmF1bHREaWN0aW9uYXJ5ID0gRmFjdG9yeURpY3Rpb25hcnlfMi5kZWZhdWx0O1xudmFyIFF1ZXVlXzEgPSByZXF1aXJlKCcuL1F1ZXVlJyk7XG5leHBvcnRzLlF1ZXVlID0gUXVldWVfMS5kZWZhdWx0O1xudmFyIFByaW9yaXR5UXVldWVfMSA9IHJlcXVpcmUoJy4vUHJpb3JpdHlRdWV1ZScpO1xuZXhwb3J0cy5Qcmlvcml0eVF1ZXVlID0gUHJpb3JpdHlRdWV1ZV8xLmRlZmF1bHQ7XG52YXIgU2V0XzEgPSByZXF1aXJlKCcuL1NldCcpO1xuZXhwb3J0cy5TZXQgPSBTZXRfMS5kZWZhdWx0O1xudmFyIFN0YWNrXzEgPSByZXF1aXJlKCcuL1N0YWNrJyk7XG5leHBvcnRzLlN0YWNrID0gU3RhY2tfMS5kZWZhdWx0O1xudmFyIE11bHRpUm9vdFRyZWVfMSA9IHJlcXVpcmUoJy4vTXVsdGlSb290VHJlZScpO1xuZXhwb3J0cy5NdWx0aVJvb3RUcmVlID0gTXVsdGlSb290VHJlZV8xLmRlZmF1bHQ7XG52YXIgX3V0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbmV4cG9ydHMudXRpbCA9IF91dGlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl19
-return require('typescript-collections');
-});
\ No newline at end of file
diff --git a/dist/lib/umd.min.js b/dist/lib/umd.min.js
deleted file mode 100644
index cdb1e48..0000000
--- a/dist/lib/umd.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.listComponent=t()}}(function(){return require=function t(e,n,i){function r(s,u){if(!n[s]){if(!e[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(o)return o(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var l=n[s]={exports:{}};e[s][0].call(l.exports,function(t){var n=e[s][1][t];return r(n?n:t)},l,l.exports,t,e,n,i)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s0&&(t=t.rightCh);return t},t.prototype.transplant=function(t,e){null===t.parent?this.root=e:t===t.parent.leftCh?t.parent.leftCh=e:t.parent.rightCh=e,null!==e&&(e.parent=t.parent)},t.prototype.removeNode=function(t){if(null===t.leftCh)this.transplant(t,t.rightCh);else if(null===t.rightCh)this.transplant(t,t.leftCh);else{var e=this.minimumAux(t.rightCh);e.parent!==t&&(this.transplant(e,e.rightCh),e.rightCh=t.rightCh,e.rightCh.parent=e),this.transplant(t,e),e.leftCh=t.leftCh,e.leftCh.parent=e}},t.prototype.inorderTraversalAux=function(t,e,n){null===t||n.stop||(this.inorderTraversalAux(t.leftCh,e,n),n.stop||(n.stop=e(t.element)===!1,n.stop||this.inorderTraversalAux(t.rightCh,e,n)))},t.prototype.levelTraversalAux=function(t,e){var n=new r.default;for(null!==t&&n.enqueue(t);!n.isEmpty();){if(t=n.dequeue(),e(t.element)===!1)return;null!==t.leftCh&&n.enqueue(t.leftCh),null!==t.rightCh&&n.enqueue(t.rightCh)}},t.prototype.preorderTraversalAux=function(t,e,n){null===t||n.stop||(n.stop=e(t.element)===!1,n.stop||(this.preorderTraversalAux(t.leftCh,e,n),n.stop||this.preorderTraversalAux(t.rightCh,e,n)))},t.prototype.postorderTraversalAux=function(t,e,n){null===t||n.stop||(this.postorderTraversalAux(t.leftCh,e,n),n.stop||(this.postorderTraversalAux(t.rightCh,e,n),n.stop||(n.stop=e(t.element)===!1)))},t.prototype.minimumAux=function(t){for(;null!==t.leftCh;)t=t.leftCh;return t},t.prototype.maximumAux=function(t){for(;null!==t.rightCh;)t=t.rightCh;return t},t.prototype.heightAux=function(t){return null===t?-1:Math.max(this.heightAux(t.leftCh),this.heightAux(t.rightCh))+1},t.prototype.insertNode=function(t){for(var e=null,n=this.root,i=null;null!==n;){if(i=this.compare(t.element,n.element),0===i)return null;i<0?(e=n,n=n.leftCh):(e=n,n=n.rightCh)}return t.parent=e,null===e?this.root=t:this.compare(t.element,e.element)<0?e.leftCh=t:e.rightCh=t,t},t.prototype.createNode=function(t){return{element:t,leftCh:null,rightCh:null,parent:null}},t}();Object.defineProperty(n,"__esModule",{value:!0}),n.default=o},{"./Queue":11,"./util":15}],2:[function(t,e,n){"use strict";var i=t("./util"),r=t("./Dictionary"),o=t("./Set"),s=function(){function t(t){this.toStrF=t||i.defaultToString,this.dictionary=new r.default(this.toStrF),this.nElements=0}return t.prototype.add=function(t,e){if(void 0===e&&(e=1),i.isUndefined(t)||e<=0)return!1;if(this.contains(t))this.dictionary.getValue(t).copies+=e;else{var n={value:t,copies:e};this.dictionary.setValue(t,n)}return this.nElements+=e,!0},t.prototype.count=function(t){return this.contains(t)?this.dictionary.getValue(t).copies:0},t.prototype.contains=function(t){return this.dictionary.containsKey(t)},t.prototype.remove=function(t,e){if(void 0===e&&(e=1),i.isUndefined(t)||e<=0)return!1;if(this.contains(t)){var n=this.dictionary.getValue(t);return e>n.copies?this.nElements-=n.copies:this.nElements-=e,n.copies-=e,n.copies<=0&&this.dictionary.remove(t),!0}return!1},t.prototype.toArray=function(){for(var t=[],e=this.dictionary.values(),n=0,i=e;n=this.data.length?t>=this.data.length?-1:t:this.compare(this.data[t],this.data[e])<=0?t:e},t.prototype.siftUp=function(t){for(var e=this.parentIndex(t);t>0&&this.compare(this.data[e],this.data[t])>0;)r.swap(this.data,e,t),t=e,e=this.parentIndex(t)},t.prototype.siftDown=function(t){for(var e=this.minIndex(this.leftChildIndex(t),this.rightChildIndex(t));e>=0&&this.compare(this.data[t],this.data[e])>0;)r.swap(this.data,e,t),t=e,e=this.minIndex(this.leftChildIndex(t),this.rightChildIndex(t))},t.prototype.peek=function(){return this.data.length>0?this.data[0]:void 0},t.prototype.add=function(t){if(!i.isUndefined(t))return this.data.push(t),this.siftUp(this.data.length-1),!0},t.prototype.removeRoot=function(){if(this.data.length>0){var t=this.data[0];return this.data[0]=this.data[this.data.length-1],this.data.splice(this.data.length-1,1),this.data.length>0&&this.siftDown(0),t}},t.prototype.contains=function(t){var e=i.compareToEquals(this.compare);return r.contains(this.data,t,e)},t.prototype.size=function(){return this.data.length},t.prototype.isEmpty=function(){return this.data.length<=0},t.prototype.clear=function(){this.data.length=0},t.prototype.forEach=function(t){r.forEach(this.data,t)},t}();Object.defineProperty(n,"__esModule",{value:!0}),n.default=o},{"./arrays":14,"./util":15}],6:[function(t,e,n){"use strict";var i=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},r=t("./Dictionary"),o=t("./util"),s=function(){function t(t,e){this.key=t,this.value=e}return t.prototype.unlink=function(){this.prev.next=this.next,this.next.prev=this.prev},t}(),u=function(t){function e(e){t.call(this,e),this.head=new s(null,null),this.tail=new s(null,null),this.head.next=this.tail,this.tail.prev=this.head}return i(e,t),e.prototype.appendToTail=function(t){var e=this.tail.prev;e.next=t,t.prev=e,t.next=this.tail,this.tail.prev=t},e.prototype.getLinkedDictionaryPair=function(t){if(!o.isUndefined(t)){var e="$"+this.toStr(t),n=this.table[e];return n}},e.prototype.getValue=function(t){var e=this.getLinkedDictionaryPair(t);if(!o.isUndefined(e))return e.value},e.prototype.remove=function(e){var n=this.getLinkedDictionaryPair(e);if(!o.isUndefined(n))return t.prototype.remove.call(this,e),n.unlink(),n.value},e.prototype.clear=function(){t.prototype.clear.call(this),this.head.next=this.tail,this.tail.prev=this.head},e.prototype.replace=function(t,e){var n="$"+this.toStr(e.key);e.next=t.next,e.prev=t.prev,this.remove(t.key),e.prev.next=e,e.next.prev=e,this.table[n]=e,++this.nElements},e.prototype.setValue=function(t,e){if(!o.isUndefined(t)&&!o.isUndefined(e)){var n=this.getLinkedDictionaryPair(t),i=new s(t,e),r="$"+this.toStr(t);return o.isUndefined(n)?(this.appendToTail(i),this.table[r]=i,void++this.nElements):(this.replace(n,i),n.value)}},e.prototype.keys=function(){var t=[];return this.forEach(function(e,n){t.push(e)}),t},e.prototype.values=function(){var t=[];return this.forEach(function(e,n){t.push(n)}),t},e.prototype.forEach=function(t){for(var e=this.head.next;null!=e.next;){var n=t(e.key,e.value);if(n===!1)return;e=e.next}},e}(r.default);Object.defineProperty(n,"__esModule",{value:!0}),n.default=u},{"./Dictionary":3,"./util":15}],7:[function(t,e,n){"use strict";var i=t("./util"),r=t("./arrays"),o=function(){function t(){this.firstNode=null,this.lastNode=null,this.nElements=0}return t.prototype.add=function(t,e){if(i.isUndefined(e)&&(e=this.nElements),e<0||e>this.nElements||i.isUndefined(t))return!1;var n=this.createNode(t);if(0===this.nElements)this.firstNode=n,this.lastNode=n;else if(e===this.nElements)this.lastNode.next=n,this.lastNode=n;else if(0===e)n.next=this.firstNode,this.firstNode=n;else{var r=this.nodeAtIndex(e-1);n.next=r.next,r.next=n}return this.nElements++,!0},t.prototype.first=function(){if(null!==this.firstNode)return this.firstNode.element},t.prototype.last=function(){if(null!==this.lastNode)return this.lastNode.element},t.prototype.elementAtIndex=function(t){var e=this.nodeAtIndex(t);if(null!==e)return e.element},t.prototype.indexOf=function(t,e){var n=e||i.defaultEquals;if(i.isUndefined(t))return-1;for(var r=this.firstNode,o=0;null!==r;){if(n(r.element,t))return o;o++,r=r.next}return-1},t.prototype.contains=function(t,e){return this.indexOf(t,e)>=0},t.prototype.remove=function(t,e){var n=e||i.defaultEquals;if(this.nElements<1||i.isUndefined(t))return!1;for(var r=null,o=this.firstNode;null!==o;){if(n(o.element,t))return o===this.firstNode?(this.firstNode=this.firstNode.next,o===this.lastNode&&(this.lastNode=null)):o===this.lastNode?(this.lastNode=r,r.next=o.next,o.next=null):(r.next=o.next,o.next=null),this.nElements--,!0;r=o,o=o.next}return!1},t.prototype.clear=function(){this.firstNode=null,this.lastNode=null,this.nElements=0},t.prototype.equals=function(e,n){var r=n||i.defaultEquals;return e instanceof t&&(this.size()===e.size()&&this.equalsAux(this.firstNode,e.firstNode,r))},t.prototype.equalsAux=function(t,e,n){for(;null!==t;){if(!n(t.element,e.element))return!1;t=t.next,e=e.next}return!0},t.prototype.removeElementAtIndex=function(t){if(!(t<0||t>=this.nElements)){var e;if(1===this.nElements)e=this.firstNode.element,this.firstNode=null,this.lastNode=null;else{var n=this.nodeAtIndex(t-1);null===n?(e=this.firstNode.element,this.firstNode=this.firstNode.next):n.next===this.lastNode&&(e=this.lastNode.element,this.lastNode=n),null!==n&&(e=n.next.element,n.next=n.next.next)}return this.nElements--,e}},t.prototype.forEach=function(t){for(var e=this.firstNode;null!==e&&t(e.element)!==!1;)e=e.next},t.prototype.reverse=function(){for(var t=null,e=this.firstNode,n=null;null!==e;)n=e.next,e.next=t,t=e,e=n;n=this.firstNode,this.firstNode=this.lastNode,this.lastNode=n},t.prototype.toArray=function(){for(var t=[],e=this.firstNode;null!==e;)t.push(e.element),e=e.next;return t},t.prototype.size=function(){return this.nElements},t.prototype.isEmpty=function(){return this.nElements<=0},t.prototype.toString=function(){return r.toString(this.toArray())},t.prototype.nodeAtIndex=function(t){if(t<0||t>=this.nElements)return null;if(t===this.nElements-1)return this.lastNode;for(var e=this.firstNode,n=0;n-1&&this.insertIdIntoRoot(e,n);for(var i in this.nodes)if(this.nodes.hasOwnProperty(i)){var r=this.findNodeId(i,t);r>-1&&this.insertIdIntoNode(i,e,r)}},t.prototype.insertIdAfterId=function(t,e){var n=this.findRootId(t);n>-1&&this.insertIdIntoRoot(e,n+1);for(var i in this.nodes)if(this.nodes.hasOwnProperty(i)){var r=this.findNodeId(i,t);r>-1&&this.insertIdIntoNode(i,e,r+1)}},t.prototype.insertIdIntoId=function(t,e){this.nodeInsertAtEnd(t,e),this.nodes[e]=[]},t.prototype.insertIdIntoRoot=function(t,e){if(void 0===e)this.rootInsertAtEnd(t);else if(e<0){var n=this.rootIds.length;this.rootIds.splice(e+n+1,0,t)}else this.rootIds.splice(e,0,t);this.nodes[t]=this.nodes[t]||[]},t.prototype.insertIdIntoNode=function(t,e,n){if(this.nodes[t]=this.nodes[t]||[],this.nodes[e]=this.nodes[e]||[],void 0===n)this.nodeInsertAtEnd(t,e);else if(n<0){var i=this.nodes[t].length;this.nodes[t].splice(n+i+1,0,e)}else this.nodes[t].splice(n,0,e)},t.prototype.moveId=function(t,e,n){var r,o,s=t,u=this.findRootId(s);this.nodes[e]&&(r=e);for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){o=this.findNodeId(a,e);break}var h,l,f=e,d=this.findRootId(f);this.nodes[e]&&(h=e);for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){l=this.findNodeId(a,e);break}if(u>-1)if(d>-1)switch(this.rootDelete(u),n){case i.BEFORE:this.insertIdIntoRoot(s,d);break;case i.AFTER:this.insertIdIntoRoot(s,d+1);break;case i.INSIDE_AT_START:this.nodeInsertAtStart(f,s);break;case i.INSIDE_AT_END:this.nodeInsertAtEnd(f,s)}else{this.rootDelete(u);for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){var p=this.findNodeId(a,f);if(p>-1){switch(n){case i.BEFORE:this.insertIdIntoNode(a,s,p);break;case i.AFTER:this.insertIdIntoNode(a,s,p+1);break;case i.INSIDE_AT_START:this.nodeInsertAtStart(f,s);break;case i.INSIDE_AT_END:this.nodeInsertAtEnd(f,s)}break}}}else if(d>-1){for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){var p=this.findNodeId(a,s);if(p>-1){this.nodeDeleteAtIndex(a,p);break}}switch(n){case i.BEFORE:this.insertIdIntoRoot(s,d);break;case i.AFTER:this.insertIdIntoRoot(s,d+1);break;case i.INSIDE_AT_START:this.nodeInsertAtStart(f,s);break;case i.INSIDE_AT_END:this.nodeInsertAtEnd(f,s)}}else{for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){var p=this.findNodeId(a,s);if(p>-1){this.nodeDeleteAtIndex(a,p);break}}for(var a in this.nodes)if(this.nodes.hasOwnProperty(a)){var p=this.findNodeId(a,f);if(p>-1){switch(n){case i.BEFORE:this.insertIdIntoNode(a,s,p);break;case i.AFTER:this.insertIdIntoNode(a,s,p+1);break;case i.INSIDE_AT_START:this.nodeInsertAtStart(f,s);break;case i.INSIDE_AT_END:this.nodeInsertAtEnd(f,s)}break}}}},t.prototype.swapArrayElements=function(t,e,n){var i=t[e];return t[e]=t[n],t[n]=i,t},t.prototype.rootDeleteId=function(t){var e=this.findRootId(t);e>-1&&this.rootDelete(e)},t.prototype.nodeAndSubNodesDelete=function(t){for(var e=[],n=0;nt.size())return!1;var e=!0;return this.forEach(function(n){return!!t.contains(n)||(e=!1,!1)}),e},t.prototype.remove=function(t){return!!this.contains(t)&&(this.dictionary.remove(t),!0)},t.prototype.forEach=function(t){this.dictionary.forEach(function(e,n){return t(n)})},t.prototype.toArray=function(){return this.dictionary.values()},t.prototype.isEmpty=function(){return this.dictionary.isEmpty()},t.prototype.size=function(){return this.dictionary.size()},t.prototype.clear=function(){this.dictionary.clear()},t.prototype.toString=function(){return r.toString(this.toArray())},t}();Object.defineProperty(n,"__esModule",{value:!0}),n.default=s},{"./Dictionary":3,"./arrays":14,"./util":15}],13:[function(t,e,n){"use strict";var i=t("./LinkedList"),r=function(){function t(){this.list=new i.default}return t.prototype.push=function(t){return this.list.add(t,0)},t.prototype.add=function(t){return this.list.add(t,0)},t.prototype.pop=function(){return this.list.removeElementAtIndex(0)},t.prototype.peek=function(){return this.list.first()},t.prototype.size=function(){return this.list.size()},t.prototype.contains=function(t,e){return this.list.contains(t,e)},t.prototype.isEmpty=function(){return this.list.isEmpty()},t.prototype.clear=function(){this.list.clear()},t.prototype.forEach=function(t){this.list.forEach(t)},t}();Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{"./LinkedList":7}],14:[function(t,e,n){"use strict";function i(t,e,n){for(var i=n||p.defaultEquals,r=t.length,o=0;o=0;o--)if(i(t[o],e))return o;return-1}function o(t,e,n){return i(t,e,n)>=0}function s(t,e,n){var r=i(t,e,n);return!(r<0)&&(t.splice(r,1),!0)}function u(t,e,n){for(var i=n||p.defaultEquals,r=t.length,o=0,s=0;s=t.length||n<0||n>=t.length)return!1;var i=t[e];return t[e]=t[n],t[n]=i,!0}function f(t){return"["+t.toString()+"]"}function d(t,e){for(var n=0,i=t;n any;
-/**
-* Function signature for comparing
-* <0 means a is smaller
-* = 0 means they are equal
-* >0 means a is larger
-*/
-export interface ICompareFunction {
- (a: T, b: T): number;
-}
-/**
-* Function signature for checking equality
-*/
-export interface IEqualsFunction {
- (a: T, b: T): boolean;
-}
-/**
-* Function signature for Iterations. Return false to break from loop
-*/
-export interface ILoopFunction {
- (a: T): boolean | void;
-}
-/**
- * Default function to compare element order.
- * @function
- */
-export declare function defaultCompare(a: T, b: T): number;
-/**
- * Default function to test equality.
- * @function
- */
-export declare function defaultEquals(a: T, b: T): boolean;
-/**
- * Default function to convert an object to a string.
- * @function
- */
-export declare function defaultToString(item: any): string;
-/**
-* Joins all the properies of the object using the provided join string
-*/
-export declare function makeString(item: T, join?: string): string;
-/**
- * Checks if the given argument is a function.
- * @function
- */
-export declare function isFunction(func: any): boolean;
-/**
- * Checks if the given argument is undefined.
- * @function
- */
-export declare function isUndefined(obj: any): boolean;
-/**
- * Checks if the given argument is a string.
- * @function
- */
-export declare function isString(obj: any): boolean;
-/**
- * Reverses a compare function.
- * @function
- */
-export declare function reverseCompareFunction(compareFunction: ICompareFunction): ICompareFunction;
-/**
- * Returns an equal function given a compare function.
- * @function
- */
-export declare function compareToEquals(compareFunction: ICompareFunction): IEqualsFunction;
diff --git a/dist/lib/util.js b/dist/lib/util.js
deleted file mode 100644
index 4c17215..0000000
--- a/dist/lib/util.js
+++ /dev/null
@@ -1,140 +0,0 @@
-"use strict";
-var _hasOwnProperty = Object.prototype.hasOwnProperty;
-exports.has = function (obj, prop) {
- return _hasOwnProperty.call(obj, prop);
-};
-/**
- * Default function to compare element order.
- * @function
- */
-function defaultCompare(a, b) {
- if (a < b) {
- return -1;
- }
- else if (a === b) {
- return 0;
- }
- else {
- return 1;
- }
-}
-exports.defaultCompare = defaultCompare;
-/**
- * Default function to test equality.
- * @function
- */
-function defaultEquals(a, b) {
- return a === b;
-}
-exports.defaultEquals = defaultEquals;
-/**
- * Default function to convert an object to a string.
- * @function
- */
-function defaultToString(item) {
- if (item === null) {
- return 'COLLECTION_NULL';
- }
- else if (isUndefined(item)) {
- return 'COLLECTION_UNDEFINED';
- }
- else if (isString(item)) {
- return '$s' + item;
- }
- else {
- return '$o' + item.toString();
- }
-}
-exports.defaultToString = defaultToString;
-/**
-* Joins all the properies of the object using the provided join string
-*/
-function makeString(item, join) {
- if (join === void 0) { join = ','; }
- if (item === null) {
- return 'COLLECTION_NULL';
- }
- else if (isUndefined(item)) {
- return 'COLLECTION_UNDEFINED';
- }
- else if (isString(item)) {
- return item.toString();
- }
- else {
- var toret = '{';
- var first = true;
- for (var prop in item) {
- if (exports.has(item, prop)) {
- if (first) {
- first = false;
- }
- else {
- toret = toret + join;
- }
- toret = toret + prop + ':' + item[prop];
- }
- }
- return toret + '}';
- }
-}
-exports.makeString = makeString;
-/**
- * Checks if the given argument is a function.
- * @function
- */
-function isFunction(func) {
- return (typeof func) === 'function';
-}
-exports.isFunction = isFunction;
-/**
- * Checks if the given argument is undefined.
- * @function
- */
-function isUndefined(obj) {
- return (typeof obj) === 'undefined';
-}
-exports.isUndefined = isUndefined;
-/**
- * Checks if the given argument is a string.
- * @function
- */
-function isString(obj) {
- return Object.prototype.toString.call(obj) === '[object String]';
-}
-exports.isString = isString;
-/**
- * Reverses a compare function.
- * @function
- */
-function reverseCompareFunction(compareFunction) {
- if (!isFunction(compareFunction)) {
- return function (a, b) {
- if (a < b) {
- return 1;
- }
- else if (a === b) {
- return 0;
- }
- else {
- return -1;
- }
- };
- }
- else {
- return function (d, v) {
- return compareFunction(d, v) * -1;
- };
- }
-}
-exports.reverseCompareFunction = reverseCompareFunction;
-/**
- * Returns an equal function given a compare function.
- * @function
- */
-function compareToEquals(compareFunction) {
- return function (a, b) {
- return compareFunction(a, b) === 0;
- };
-}
-exports.compareToEquals = compareToEquals;
-//# sourceMappingURL=util.js.map
\ No newline at end of file
diff --git a/dist/lib/util.js.map b/dist/lib/util.js.map
deleted file mode 100644
index 92f9206..0000000
--- a/dist/lib/util.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/arraysTest.d.ts b/dist/test/arraysTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/arraysTest.js b/dist/test/arraysTest.js
deleted file mode 100644
index e46e458..0000000
--- a/dist/test/arraysTest.js
+++ /dev/null
@@ -1,253 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Arrays', function () {
- it('IndexOf returns the right position', function () {
- var a = [1, 8, 10];
- chai_1.expect(collections.arrays.indexOf(a, 1)).equals(0);
- chai_1.expect(collections.arrays.indexOf(a, 8)).equals(1);
- chai_1.expect(collections.arrays.indexOf(a, 10)).equals(2);
- chai_1.expect(collections.arrays.indexOf(a, 11)).equals(-1);
- chai_1.expect(collections.arrays.indexOf([], 8)).equals(-1);
- });
- it('IndexOf with custom equals function returns the right position', function () {
- var b = {
- val: 1
- };
- var c = {
- val: 8
- };
- var d = {
- val: 10
- };
- var e = {
- val: 11
- };
- var a = [b, c, d];
- var eq = function (arg1, arg2) {
- return arg1.val === arg2.val;
- };
- chai_1.expect(collections.arrays.indexOf(a, {
- val: 1
- })).equals(-1);
- chai_1.expect(collections.arrays.indexOf(a, {
- val: 1
- }, eq)).equals(0);
- chai_1.expect(collections.arrays.indexOf(a, c, eq)).equals(1);
- chai_1.expect(collections.arrays.indexOf(a, {
- val: 10
- }, eq)).equals(2);
- chai_1.expect(collections.arrays.indexOf(a, e, eq)).equals(-1);
- chai_1.expect(collections.arrays.indexOf([], b)).equals(-1);
- });
- it('lastIndexOf returns the right position', function () {
- var a = [1, 8, 8, 8, 10, 10];
- chai_1.expect(collections.arrays.lastIndexOf(a, 1)).equals(0);
- chai_1.expect(collections.arrays.lastIndexOf(a, 8)).equals(3);
- chai_1.expect(collections.arrays.lastIndexOf(a, 10)).equals(5);
- chai_1.expect(collections.arrays.lastIndexOf(a, 11)).equals(-1);
- chai_1.expect(collections.arrays.lastIndexOf([], 8)).equals(-1);
- });
- it('lastIndexOf with custom equals function returns the right position', function () {
- var b = {
- val: 1
- };
- var c = {
- val: 8
- };
- var d = {
- val: 10
- };
- var e = {
- val: 11
- };
- var a = [b, b, c, d];
- var eq = function (arg1, arg2) {
- return arg1.val === arg2.val;
- };
- chai_1.expect(collections.arrays.lastIndexOf(a, {
- val: 1
- })).equals(-1);
- chai_1.expect(collections.arrays.lastIndexOf(a, {
- val: 1
- }, eq)).equals(1);
- });
- it('Contains existing elements', function () {
- var a = [1, 8, 8, 8, 10, 10];
- chai_1.expect(collections.arrays.contains(a, 1)).equals(true);
- chai_1.expect(collections.arrays.contains(a, 8)).equals(true);
- chai_1.expect(collections.arrays.contains(a, 10)).equals(true);
- chai_1.expect(collections.arrays.contains(a, 11)).equals(false);
- chai_1.expect(collections.arrays.contains([], 8)).equals(false);
- });
- it('Contains existing elements with custom equals function', function () {
- var b = {
- val: 1
- };
- var c = {
- val: 8
- };
- var d = {
- val: 10
- };
- var e = {
- val: 11
- };
- var a = [b, b, c, d];
- var eq = function (arg1, arg2) {
- return arg1.val === arg2.val;
- };
- chai_1.expect(collections.arrays.contains(a, {
- val: 1
- })).equals(false);
- chai_1.expect(collections.arrays.contains(a, {
- val: 1
- }, eq)).equals(true);
- chai_1.expect(collections.arrays.contains(a, {
- val: 8
- }, eq)).equals(true);
- chai_1.expect(collections.arrays.contains(a, {
- val: 10
- }, eq)).equals(true);
- chai_1.expect(collections.arrays.contains(a, {
- val: 11
- }, eq)).equals(false);
- chai_1.expect(collections.arrays.contains([], {
- val: 11
- }, eq)).equals(false);
- });
- it('Gives the right frequency', function () {
- var a = [1, 8, 8, 8, 10, 10];
- chai_1.expect(collections.arrays.frequency(a, 1)).equals(1);
- chai_1.expect(collections.arrays.frequency(a, 8)).equals(3);
- chai_1.expect(collections.arrays.frequency(a, 10)).equals(2);
- chai_1.expect(collections.arrays.frequency(a, 11)).equals(0);
- });
- it('Gives the right frequency with custom equals', function () {
- var b = {
- val: 1
- };
- var c = {
- val: 8
- };
- var d = {
- val: 10
- };
- var e = {
- val: 11
- };
- var a = [b, b, c, d];
- var eq = function (arg1, arg2) {
- return arg1.val === arg2.val;
- };
- chai_1.expect(collections.arrays.frequency(a, {
- val: 1
- })).equals(0);
- chai_1.expect(collections.arrays.frequency(a, {
- val: 1
- }, eq)).equals(2);
- chai_1.expect(collections.arrays.frequency(a, {
- val: 8
- }, eq)).equals(1);
- });
- it('Equal arrays are equal', function () {
- var a = [1, 8, 8, 8, 10, 10];
- var b = [1, 8, 8, 8, 10, 10];
- var c = [1, 8, 5, 8, 10, 10];
- var d = [1, 8, 8, 8, 10];
- chai_1.expect(collections.arrays.equals(a, a)).equals(true);
- chai_1.expect(collections.arrays.equals(a, b)).equals(true);
- chai_1.expect(collections.arrays.equals(a, [])).equals(false);
- chai_1.expect(collections.arrays.equals(a, c)).equals(false);
- chai_1.expect(collections.arrays.equals(a, d)).equals(false);
- chai_1.expect(collections.arrays.equals(a, [])).equals(false);
- });
- it('Equal arrays are equal with custom equals function', function () {
- var a = [{
- val: 8
- }];
- var b = [{
- val: 8
- }];
- var eq = function (arg1, arg2) {
- return arg1.val === arg2.val;
- };
- chai_1.expect(collections.arrays.equals(a, a)).equals(true);
- chai_1.expect(collections.arrays.equals(a, a, eq)).equals(true);
- chai_1.expect(collections.arrays.equals(a, b, eq)).equals(true);
- chai_1.expect(collections.arrays.equals(a, b)).equals(false);
- });
- it('Removes elements', function () {
- var a = [];
- chai_1.expect(collections.arrays.remove(a, 1)).equals(false);
- a = [4, 9, 9, 10];
- chai_1.expect(collections.arrays.remove(a, 9)).equals(true);
- chai_1.expect(collections.arrays.indexOf(a, 9)).equals(1);
- chai_1.expect(collections.arrays.indexOf(a, 10)).equals(2);
- chai_1.expect(collections.arrays.remove(a, 9)).equals(true);
- chai_1.expect(collections.arrays.remove(a, 9)).equals(false);
- chai_1.expect(collections.arrays.remove(a, 9)).equals(false);
- });
- it('Removes elements with custom equals function', function () {
- var c = {
- val: 8
- };
- var d = {
- val: 10
- };
- var eq = function (arg1, arg2) {
- return arg1.val === arg2.val;
- };
- var a = [c, d];
- chai_1.expect(collections.arrays.remove(a, {
- val: 10
- })).equals(false);
- chai_1.expect(collections.arrays.remove(a, {
- val: 10
- }, eq)).equals(true);
- });
- it('For each gives the right ordering', function () {
- var a = [];
- collections.arrays.forEach(a, function (e) {
- chai_1.expect(true).equals(false); // should not enter here
- });
- for (var i = 0; i < 10; i++) {
- a.push(i);
- }
- var i = 0;
- collections.arrays.forEach(a, function (e) {
- chai_1.expect(e).equals(i);
- i++;
- });
- });
- it('For each can be interrupted', function () {
- var a = [];
- var b = [];
- for (var i = 0; i < 5; i++) {
- a.push(i);
- }
- collections.arrays.forEach(a, function (e) {
- b.push(e);
- if (e === 3) {
- return false;
- }
- });
- chai_1.expect([0, 1, 2, 3]).to.deep.equal(b);
- });
- it('Copies existing arrays', function () {
- var a = [1, 8, 8, 8, 10, 10];
- var b = collections.arrays.copy(a);
- chai_1.expect(collections.arrays.equals(a, b)).equals(true);
- chai_1.expect(a === b).equals(false);
- });
- it('Swaps elements', function () {
- var a = [1, 8, 8, 8, 10, 10];
- chai_1.expect(collections.arrays.swap(a, 0, 5)).equals(true);
- chai_1.expect(a[0]).equals(10);
- chai_1.expect(a[5]).equals(1);
- chai_1.expect(collections.arrays.swap(a, 0, 6)).equals(false);
- chai_1.expect(collections.arrays.swap(a, 7, 2)).equals(false);
- chai_1.expect(collections.arrays.swap(a, -1, 9)).equals(false);
- });
-});
-//# sourceMappingURL=arraysTest.js.map
\ No newline at end of file
diff --git a/dist/test/arraysTest.js.map b/dist/test/arraysTest.js.map
deleted file mode 100644
index 992d4b3..0000000
--- a/dist/test/arraysTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"arraysTest.js","sourceRoot":"","sources":["../../src/test/arraysTest.ts"],"names":[],"mappings":";AAAA,IAAY,WAAW,WAAM,cAAc,CAAC,CAAA;AAG5C,qBAAqB,MAAM,CAAC,CAAA;AAE5B,QAAQ,CAAC,QAAQ,EACb;IAEI,EAAE,CAAC,oCAAoC,EACnC;QACI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC,CAAC;QACtD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,gEAAgE,EAC/D;QACI,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAElB,IAAI,EAAE,GAAG,UAAS,IAAS,EAAE,IAAS;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;QACjC,CAAC,CAAC;QAEF,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YACjC,GAAG,EAAE,CAAC;SACT,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC,CAAC;QAChB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YACjC,GAAG,EAAE,CAAC;SACT,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YACjC,GAAG,EAAE,EAAE;SACV,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC,CAAC;QACzD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,wCAAwC,EACvC;QACI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC,CAAC;QAC1D,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,oEAAoE,EACnE;QACI,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAErB,IAAI,EAAE,GAAG,UAAS,IAAS,EAAE,IAAS;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;QACjC,CAAC,CAAC;QAEF,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE;YACrC,GAAG,EAAE,CAAC;SACT,CAAC,CAAC,CAAC,MAAM,CAAC,CAAE,CAAC,CAAC,CAAC;QAChB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE;YACrC,GAAG,EAAE,CAAC;SACT,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,4BAA4B,EAC3B;QACI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,wDAAwD,EACvD;QACI,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAErB,IAAI,EAAE,GAAG,UAAS,IAAS,EAAE,IAAS;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;QACjC,CAAC,CAAC;QAEF,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE;YAClC,GAAG,EAAE,CAAC;SACT,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE;YAClC,GAAG,EAAE,CAAC;SACT,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE;YAClC,GAAG,EAAE,CAAC;SACT,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE;YAClC,GAAG,EAAE,EAAE;SACV,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE;YAClC,GAAG,EAAE,EAAE;SACV,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;YACnC,GAAG,EAAE,EAAE;SACV,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,2BAA2B,EAC1B;QACI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,8CAA8C,EAC7C;QACI,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAErB,IAAI,EAAE,GAAG,UAAS,IAAS,EAAE,IAAS;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;QACjC,CAAC,CAAC;QACF,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;YACnC,GAAG,EAAE,CAAC;SACT,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;YACnC,GAAG,EAAE,CAAC;SACT,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE;YACnC,GAAG,EAAE,CAAC;SACT,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,wBAAwB,EACvB;QACI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAEzB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,oDAAoD,EACnD;QACI,IAAI,CAAC,GAAG,CAAC;gBACL,GAAG,EAAE,CAAC;aACT,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC;gBACL,GAAG,EAAE,CAAC;aACT,CAAC,CAAC;QAEH,IAAI,EAAE,GAAG,UAAS,IAAS,EAAE,IAAS;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;QACjC,CAAC,CAAC;QAEF,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,kBAAkB,EACjB;QACI,IAAI,CAAC,GAAQ,EAAE,CAAC;QAChB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,8CAA8C,EAC7C;QACI,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,CAAC;SACT,CAAC;QACF,IAAI,CAAC,GAAG;YACJ,GAAG,EAAE,EAAE;SACV,CAAC;QACF,IAAI,EAAE,GAAG,UAAS,IAAS,EAAE,IAAS;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;QACjC,CAAC,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACf,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;YAChC,GAAG,EAAE,EAAE;SACV,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;YAChC,GAAG,EAAE,EAAE;SACV,EACG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,mCAAmC,EAClC;QACI,IAAI,CAAC,GAAQ,EAAE,CAAC;QAChB,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,UAAS,CAAC;YACpC,aAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB;QACxD,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,UAAS,CAAC;YACpC,aAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC,EAAE,CAAC;QACR,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,6BAA6B,EAC5B;QACI,IAAI,CAAC,GAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,GAAQ,EAAE,CAAC;QAChB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;QACD,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,UAAS,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACV,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC;YACjB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,aAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,wBAAwB,EACvB;QACI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,aAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,gBAAgB,EACf;QACI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7B,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtD,aAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,aAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,aAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AAEX,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/dist/test/bagTest.d.ts b/dist/test/bagTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/bagTest.js b/dist/test/bagTest.js
deleted file mode 100644
index 71f1432..0000000
--- a/dist/test/bagTest.js
+++ /dev/null
@@ -1,214 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Bag', function () {
- var bag;
- beforeEach(function () {
- bag = new collections.Bag();
- });
- var toStringF = function (f) {
- return f.description;
- };
- it('Gives the right size', function () {
- bag.add('a');
- bag.add('b');
- bag.add('c');
- chai_1.expect(bag.size()).equals(3);
- bag.add('d');
- chai_1.expect(bag.size()).equals(4);
- bag.remove('d');
- chai_1.expect(bag.size()).equals(3);
- bag.clear();
- bag.add('a');
- bag.add('b');
- bag.add('c');
- chai_1.expect(bag.size()).equals(3);
- bag.add('d');
- chai_1.expect(bag.size()).equals(4);
- bag.remove('d');
- chai_1.expect(bag.size()).equals(3);
- });
- it('Gives the right size with duplicated elements', function () {
- bag.add('a');
- bag.add('a');
- bag.add('b');
- bag.add('b');
- bag.add('c');
- chai_1.expect(bag.size()).equals(5);
- bag.remove('b');
- bag.remove('a');
- chai_1.expect(bag.size()).equals(3);
- bag.remove('a');
- bag.remove('b');
- bag.remove('c');
- chai_1.expect(bag.size()).equals(0);
- });
- it('Contains existing elements', function () {
- bag.add('a');
- bag.add('b');
- bag.add('c');
- bag.add('c');
- bag.add('d');
- chai_1.expect(bag.contains('a')).equals(true);
- chai_1.expect(bag.contains('b')).equals(true);
- chai_1.expect(bag.contains('c')).equals(true);
- chai_1.expect(bag.contains('d')).equals(true);
- chai_1.expect(bag.contains('e')).equals(false);
- bag.remove('c');
- chai_1.expect(bag.contains('c')).equals(true);
- bag.remove('c');
- chai_1.expect(bag.contains('c')).equals(false);
- bag.clear();
- bag.add(1);
- bag.add(2);
- chai_1.expect(bag.contains(1)).equals(true);
- chai_1.expect(bag.contains(2)).equals(true);
- chai_1.expect(bag.contains(3)).equals(false);
- });
- it('Contains existing elements with custom toString function', function () {
- bag = new collections.Bag(toStringF);
- var fn1 = function () { };
- fn1.description = 'fn1';
- chai_1.expect(bag.contains(fn1)).equals(false);
- bag.add(fn1);
- chai_1.expect(bag.contains(fn1)).equals(true);
- var fn2 = function () { };
- fn2.description = 'fn2';
- chai_1.expect(bag.contains(fn2)).equals(false);
- bag.add(fn2);
- bag.add(fn2);
- chai_1.expect(bag.contains(fn2)).equals(true);
- chai_1.expect(bag.size()).equals(3);
- bag.remove(fn2);
- chai_1.expect(bag.contains(fn2)).equals(true);
- bag.remove(fn2);
- chai_1.expect(bag.contains(fn2)).equals(false);
- });
- it('An empty bag is empty', function () {
- chai_1.expect(bag.isEmpty()).equals(true);
- bag.add(1);
- bag.add(1);
- chai_1.expect(bag.isEmpty()).equals(false);
- bag.remove(1);
- chai_1.expect(bag.isEmpty()).equals(false);
- bag.remove(1);
- chai_1.expect(bag.isEmpty()).equals(true);
- });
- it('Adds', function () {
- chai_1.expect(bag.add('a')).equals(true);
- chai_1.expect(bag.add('b')).equals(true);
- chai_1.expect(bag.contains('a')).equals(true);
- chai_1.expect(bag.contains('b')).equals(true);
- chai_1.expect(bag.add('b')).equals(true);
- chai_1.expect(bag.contains('b')).equals(true);
- chai_1.expect(bag.add(null)).equals(true);
- chai_1.expect(bag.contains(null)).equals(true);
- chai_1.expect(bag.add(null)).equals(true);
- chai_1.expect(bag.contains(undefined)).equals(false);
- chai_1.expect(bag.add(undefined)).equals(false);
- chai_1.expect(bag.contains(undefined)).equals(false);
- });
- it('Adds multiple copies', function () {
- chai_1.expect(bag.add('a', 1)).equals(true);
- chai_1.expect(bag.add('a')).equals(true);
- chai_1.expect(bag.add('b', 3)).equals(true);
- chai_1.expect(bag.contains('a')).equals(true);
- chai_1.expect(bag.contains('b')).equals(true);
- chai_1.expect(bag.add('b')).equals(true);
- chai_1.expect(bag.count('a')).equals(2);
- chai_1.expect(bag.count('b')).equals(4);
- bag.remove('a');
- bag.remove('a');
- chai_1.expect(bag.count('a')).equals(0);
- });
- it('Removes', function () {
- chai_1.expect(bag.add('a')).equals(true);
- chai_1.expect(bag.add('a')).equals(true);
- chai_1.expect(bag.add('b')).equals(true);
- chai_1.expect(bag.remove('a')).equals(true);
- chai_1.expect(bag.remove('a')).equals(true);
- chai_1.expect(bag.size()).equals(1);
- chai_1.expect(bag.remove('b')).equals(true);
- chai_1.expect(bag.size()).equals(0);
- });
- it('Removes multiple copies', function () {
- chai_1.expect(bag.add('a', 1)).equals(true);
- chai_1.expect(bag.add('a')).equals(true);
- chai_1.expect(bag.add('b', 3)).equals(true);
- chai_1.expect(bag.remove('b', 2)).equals(true);
- chai_1.expect(bag.count('b')).equals(1);
- chai_1.expect(bag.remove('b', 1)).equals(true);
- chai_1.expect(bag.count('b')).equals(0);
- chai_1.expect(bag.remove('a', 2)).equals(true);
- chai_1.expect(bag.count('a')).equals(0);
- chai_1.expect(bag.add('c', 3)).equals(true);
- chai_1.expect(bag.remove('c', 5)).equals(true);
- chai_1.expect(bag.count('a')).equals(0);
- chai_1.expect(bag.size()).equals(0);
- });
- it('Clear removes all elements', function () {
- chai_1.expect(bag.add('b', 3)).equals(true);
- bag.clear();
- chai_1.expect(bag.count('b')).equals(0);
- chai_1.expect(bag.size()).equals(0);
- });
- it('Converts to an array', function () {
- var arr = bag.toArray();
- chai_1.expect(arr.length).equals(0);
- chai_1.expect(bag.add('b', 3)).equals(true);
- chai_1.expect(bag.add('a', 2)).equals(true);
- chai_1.expect(bag.add('c')).equals(true);
- arr = bag.toArray();
- chai_1.expect(collections.arrays.frequency(arr, 'b')).equals(3);
- chai_1.expect(collections.arrays.frequency(arr, 'a')).equals(2);
- chai_1.expect(collections.arrays.frequency(arr, 'c')).equals(1);
- });
- it('Converts to a set', function () {
- var set = bag.toSet();
- chai_1.expect(set.size()).equals(0);
- chai_1.expect(bag.add('b', 3)).equals(true);
- chai_1.expect(bag.add('a', 2)).equals(true);
- chai_1.expect(bag.add('c')).equals(true);
- set = bag.toSet();
- chai_1.expect(set.contains('b')).equals(true);
- chai_1.expect(set.contains('a')).equals(true);
- chai_1.expect(set.contains('c')).equals(true);
- });
- it('For each gives all the elements', function () {
- bag.forEach(function (e) {
- chai_1.expect(false).equals(true);
- });
- var a = [1, 5, 5, 6];
- bag.add(1);
- bag.add(5);
- bag.add(5);
- bag.add(6);
- bag.forEach(function (e) {
- chai_1.expect(collections.arrays.contains(a, e)).equals(true);
- });
- var count = 0;
- bag.forEach(function (e) {
- chai_1.expect(collections.arrays.contains(a, e)).equals(true);
- if (e === 5) {
- count++;
- bag.remove(e);
- }
- });
- chai_1.expect(count).equals(2);
- chai_1.expect(bag.contains(5)).equals(false);
- chai_1.expect(bag.contains(1)).equals(true);
- chai_1.expect(bag.contains(6)).equals(true);
- });
- it('For each can be interrupted', function () {
- for (var i = 0; i < 5; i++) {
- bag.add(i);
- }
- var t = 0;
- bag.forEach(function (e) {
- t++;
- return false;
- });
- chai_1.expect(t).equals(1);
- });
-});
-//# sourceMappingURL=bagTest.js.map
\ No newline at end of file
diff --git a/dist/test/bagTest.js.map b/dist/test/bagTest.js.map
deleted file mode 100644
index 00d83e5..0000000
--- a/dist/test/bagTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bagTest.js","sourceRoot":"","sources":["../../src/test/bagTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/bsTreeTest.d.ts b/dist/test/bsTreeTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/bsTreeTest.js b/dist/test/bsTreeTest.js
deleted file mode 100644
index 35672b0..0000000
--- a/dist/test/bsTreeTest.js
+++ /dev/null
@@ -1,288 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Binary Search Tree', function () {
- var tree = null;
- beforeEach(function () {
- tree = new collections.BSTree();
- });
- var createTree1 = function () {
- tree.add('b');
- tree.add('a');
- tree.add('c');
- };
- var createTree2 = function () {
- tree.add('f');
- tree.add('b');
- tree.add('a');
- tree.add('d');
- tree.add('c');
- tree.add('e');
- tree.add('g');
- tree.add('i');
- tree.add('h');
- };
- it('Gives the right size', function () {
- createTree1();
- chai_1.expect(tree.size()).equals(3);
- tree.add('d');
- chai_1.expect(tree.size()).equals(4);
- tree.remove('d');
- tree.remove('d');
- chai_1.expect(tree.size()).equals(3);
- tree.remove('b');
- tree.remove('b');
- chai_1.expect(tree.size()).equals(2);
- tree.remove('c');
- tree.remove('c');
- chai_1.expect(tree.size()).equals(1);
- tree.remove('a');
- tree.remove('a');
- chai_1.expect(tree.size()).equals(0);
- tree.clear();
- chai_1.expect(tree.size()).equals(0);
- createTree1();
- chai_1.expect(tree.size()).equals(3);
- tree.add('d');
- chai_1.expect(tree.size()).equals(4);
- tree.remove('d');
- chai_1.expect(tree.size()).equals(3);
- tree.add('c');
- chai_1.expect(tree.size()).equals(3);
- });
- it('Clears removes all elements', function () {
- createTree1();
- tree.clear();
- chai_1.expect(tree.contains('a')).equals(false);
- });
- it('Gives the right height', function () {
- createTree1();
- chai_1.expect(tree.height()).equals(1);
- });
- it('Gives the right height 2', function () {
- createTree2();
- chai_1.expect(tree.height()).equals(3);
- });
- it('Gives the right height on empty tree', function () {
- chai_1.expect(tree.height()).equals(-1);
- });
- it('Gives the maximum element 1', function () {
- createTree1();
- chai_1.expect(tree.maximum()).equals('c');
- });
- it('Gives the maximum element 2', function () {
- createTree2();
- chai_1.expect(tree.maximum()).equals('i');
- });
- it('Gives the maximum element on empty tree', function () {
- chai_1.expect(tree.maximum()).equals(undefined);
- });
- it('Gives the minimum element 1', function () {
- createTree1();
- chai_1.expect(tree.minimum()).equals('a');
- });
- it('Gives the minimum element 2', function () {
- createTree2();
- chai_1.expect(tree.minimum()).equals('a');
- });
- it('Gives the minimum element on empty tree', function () {
- chai_1.expect(tree.minimum()).equals(undefined);
- });
- it('Contains existing elements', function () {
- createTree1();
- chai_1.expect(tree.contains('a')).equals(true);
- chai_1.expect(tree.contains('b')).equals(true);
- chai_1.expect(tree.contains('c')).equals(true);
- chai_1.expect(tree.contains('e')).equals(false);
- tree.remove('a');
- chai_1.expect(tree.contains('a')).equals(false);
- chai_1.expect(tree.contains('b')).equals(true);
- chai_1.expect(tree.contains('c')).equals(true);
- tree.clear();
- tree.add(3);
- tree.add(2);
- tree.add(4);
- tree.add(1);
- chai_1.expect(tree.contains(1)).equals(true);
- chai_1.expect(tree.contains(2)).equals(true);
- chai_1.expect(tree.contains(3)).equals(true);
- chai_1.expect(tree.contains(4)).equals(true);
- chai_1.expect(tree.contains(5)).equals(false);
- });
- it('An empty tree is empty', function () {
- chai_1.expect(tree.isEmpty()).equals(true);
- tree.add(1);
- chai_1.expect(tree.isEmpty()).equals(false);
- tree.remove(1);
- chai_1.expect(tree.isEmpty()).equals(true);
- });
- it('Adds', function () {
- chai_1.expect(tree.add('b')).equals(true);
- chai_1.expect(tree.add('a')).equals(true);
- chai_1.expect(tree.contains('a')).equals(true);
- chai_1.expect(tree.contains('b')).equals(true);
- chai_1.expect(tree.add('b')).equals(false);
- chai_1.expect(tree.contains('b')).equals(true);
- chai_1.expect(tree.add(null)).equals(true);
- chai_1.expect(tree.contains(null)).equals(true);
- chai_1.expect(tree.add(null)).equals(false);
- chai_1.expect(tree.contains(undefined)).equals(false);
- chai_1.expect(tree.add(undefined)).equals(false);
- chai_1.expect(tree.contains(undefined)).equals(false);
- });
- it('Removes a leaf', function () {
- createTree2();
- tree.remove('c');
- var array = ['a', 'b', 'd', 'e', 'f', 'g', 'h', 'i'];
- var b = [];
- tree.inorderTraversal(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Removes a node with one children', function () {
- createTree2();
- tree.remove('i');
- var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
- var b = [];
- tree.inorderTraversal(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Removes a node with two children', function () {
- createTree2();
- tree.remove('b');
- var array = ['a', 'c', 'd', 'e', 'f', 'g', 'h', 'i'];
- var b = [];
- tree.inorderTraversal(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Removes root', function () {
- createTree2();
- tree.remove('f');
- var array = ['a', 'b', 'c', 'd', 'e', 'g', 'h', 'i'];
- var b = [];
- tree.inorderTraversal(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Inorder traversal gives the right ordering', function () {
- createTree2();
- var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'];
- var b = [];
- tree.inorderTraversal(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Inorder traversal cen be interrupted', function () {
- createTree2();
- var array = ['a', 'b', 'c', 'd'];
- var b = [];
- tree.inorderTraversal(function (element) {
- b.push(element);
- if (element === 'd') {
- return false;
- }
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Preorder traversal gives the right ordering', function () {
- createTree2();
- var array = ['f', 'b', 'a', 'd', 'c', 'e', 'g', 'i', 'h'];
- var b = [];
- tree.preorderTraversal(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Preorder traversal can be interrupted', function () {
- createTree2();
- var array = ['f', 'b', 'a'];
- var b = [];
- tree.preorderTraversal(function (element) {
- b.push(element);
- if (element === 'a') {
- return false;
- }
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Level traversal gives the right ordering', function () {
- createTree2();
- var array = ['f', 'b', 'g', 'a', 'd', 'i', 'c', 'e', 'h'];
- var b = [];
- tree.levelTraversal(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Level traversal can be interrupted', function () {
- createTree2();
- var array = ['f', 'b', 'g', 'a', 'd', 'i'];
- var b = [];
- tree.levelTraversal(function (element) {
- b.push(element);
- if (element === 'i') {
- return false;
- }
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Postorter traversal gives the right ordering', function () {
- createTree2();
- var array = ['a', 'c', 'e', 'd', 'b', 'h', 'i', 'g', 'f'];
- var b = [];
- tree.postorderTraversal(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Postorter traversal can be interrupted', function () {
- createTree2();
- var array = ['a', 'c', 'e', 'd', 'b'];
- var b = [];
- tree.postorderTraversal(function (element) {
- b.push(element);
- if (element === 'b') {
- return false;
- }
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('For each gives the right ordering', function () {
- createTree2();
- var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'];
- var b = [];
- tree.forEach(function (element) {
- b.push(element);
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('For each can be interrupted', function () {
- createTree2();
- var array = ['a', 'b', 'c', 'd'];
- var b = [];
- tree.forEach(function (element) {
- b.push(element);
- if (element === 'd') {
- return false;
- }
- });
- chai_1.expect(array).to.deep.equal(b);
- });
- it('toArray gives the right ordering', function () {
- createTree2();
- var array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'];
- var b = tree.toArray();
- chai_1.expect(array).to.deep.equal(b);
- });
- it('Empty tree returns an empty array', function () {
- chai_1.expect(tree.toArray()).to.deep.equal([]);
- });
-});
-//# sourceMappingURL=bsTreeTest.js.map
\ No newline at end of file
diff --git a/dist/test/bsTreeTest.js.map b/dist/test/bsTreeTest.js.map
deleted file mode 100644
index 751341d..0000000
--- a/dist/test/bsTreeTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"bsTreeTest.js","sourceRoot":"","sources":["../../src/test/bsTreeTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/dictionaryTest.d.ts b/dist/test/dictionaryTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/dictionaryTest.js b/dist/test/dictionaryTest.js
deleted file mode 100644
index 1955259..0000000
--- a/dist/test/dictionaryTest.js
+++ /dev/null
@@ -1,155 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Dictionary', function () {
- var dict = null;
- var elems = 100;
- var elemKeys = [];
- for (var i = 0; i < elems; i++) {
- elemKeys[i] = '' + i;
- }
- // Test with some potentially problematic keys
- elemKeys[2] = 'hasOwnProperty';
- elemKeys[4] = '__proto__';
- elemKeys[6] = '';
- beforeEach(function () {
- dict = new collections.Dictionary();
- });
- it('Maps keys to values with string keys', function () {
- chai_1.expect(dict.getValue('sd')).equals(undefined);
- // test with string keys
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.setValue(elemKeys[i], i + 1)).equals(undefined);
- }
- chai_1.expect(dict.size()).equals(elems);
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.getValue(elemKeys[i])).equals(i + 1);
- }
- dict.setValue('a', 5);
- chai_1.expect(dict.getValue('a')).equals(5);
- chai_1.expect(dict.setValue('a', 21)).equals(5);
- chai_1.expect(dict.size()).equals(elems + 1);
- chai_1.expect(dict.getValue('a')).equals(21);
- });
- it('Maps keys to values with number keys', function () {
- // test with number keys
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.setValue(i, i + 1)).equals(undefined);
- }
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.getValue(i)).equals(i + 1);
- }
- });
- it('Maps keys to values with custom keys', function () {
- var ts = function (obj) {
- return obj.s;
- };
- dict = new collections.Dictionary(ts);
- chai_1.expect(dict.getValue('sd')).equals(undefined);
- for (var i = 0; i < elems; i++) {
- var o = {};
- o.s = elemKeys[i];
- chai_1.expect(dict.setValue(o, i + 1)).equals(undefined);
- }
- for (var i = 0; i < elems; i++) {
- var d = {};
- d.s = elemKeys[i];
- chai_1.expect(dict.getValue(d)).equals(i + 1);
- }
- });
- it('Removes existing elements from the dictionary', function () {
- chai_1.expect(dict.remove('1')).equals(undefined);
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.setValue(elemKeys[i], i + 1)).equals(undefined);
- }
- chai_1.expect(dict.size()).equals(elems);
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.remove(elemKeys[i])).equals(i + 1);
- chai_1.expect(dict.getValue(elemKeys[i])).equals(undefined);
- chai_1.expect(dict.remove(elemKeys[i])).equals(undefined);
- }
- chai_1.expect(dict.size()).equals(0);
- });
- it('An empty dictionary is empty', function () {
- chai_1.expect(dict.isEmpty()).equals(true);
- dict.setValue('1', 1);
- chai_1.expect(dict.isEmpty()).equals(false);
- dict.remove('1');
- chai_1.expect(dict.isEmpty()).equals(true);
- });
- it('Clear removes all elements', function () {
- dict.clear();
- dict.setValue(1, 1);
- dict.clear();
- chai_1.expect(dict.isEmpty()).equals(true);
- chai_1.expect(dict.getValue(1)).equals(undefined);
- });
- it('Contains existing keys', function () {
- chai_1.expect(dict.containsKey(0)).equals(false);
- for (var i = 0; i < 10; i++) {
- dict.setValue(elemKeys[i], i);
- chai_1.expect(dict.containsKey(elemKeys[i])).equals(true);
- }
- ;
- for (var i = 0; i < 10; i++) {
- dict.remove(elemKeys[i]);
- chai_1.expect(dict.containsKey(elemKeys[i])).equals(false);
- }
- ;
- });
- it('Gives the right size', function () {
- chai_1.expect(dict.size()).equals(0);
- for (var i = 0; i < 10; i++) {
- dict.setValue(elemKeys[i], i);
- chai_1.expect(dict.size()).equals(i + 1);
- }
- ;
- });
- it('Gives all the stored keys', function () {
- var k = [];
- for (var i = 0; i < elems; i++) {
- var keys = dict.keys();
- k.sort();
- keys.sort();
- chai_1.expect(collections.arrays.equals(k, keys)).equals(true);
- dict.setValue(elemKeys[i], i);
- k.push(elemKeys[i]);
- }
- });
- it('Gives all the stored values', function () {
- var v = [];
- for (var i = 0; i < elems; i++) {
- var values = dict.values();
- v.sort();
- values.sort();
- chai_1.expect(collections.arrays.equals(v, values)).equals(true);
- dict.setValue(elemKeys[i], i);
- v.push(i);
- }
- });
- it('For each gives all the pairs', function () {
- for (var i = 0; i < elems; i++) {
- dict.setValue(elemKeys[i], i);
- }
- var keys = dict.keys();
- var values = dict.values();
- dict.forEach(function (k, v) {
- chai_1.expect(collections.arrays.remove(keys, k)).equals(true);
- chai_1.expect(collections.arrays.remove(values, v)).equals(true);
- });
- chai_1.expect(keys.length).equals(0);
- chai_1.expect(values.length).equals(0);
- });
- it('For each can be interrupted', function () {
- for (var i = 0; i < elems; i++) {
- dict.setValue(elemKeys[i], i);
- }
- var t = 0;
- dict.forEach(function (k, v) {
- t++;
- return false;
- });
- chai_1.expect(t).equals(1);
- });
-});
-//# sourceMappingURL=dictionaryTest.js.map
\ No newline at end of file
diff --git a/dist/test/dictionaryTest.js.map b/dist/test/dictionaryTest.js.map
deleted file mode 100644
index f6cdecd..0000000
--- a/dist/test/dictionaryTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"dictionaryTest.js","sourceRoot":"","sources":["../../src/test/dictionaryTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/factoryDictionaryTest.d.ts b/dist/test/factoryDictionaryTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/factoryDictionaryTest.js b/dist/test/factoryDictionaryTest.js
deleted file mode 100644
index 2ff862f..0000000
--- a/dist/test/factoryDictionaryTest.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Factory Dictionary', function () {
- var dict = null;
- var defaultValue = [];
- beforeEach(function () {
- dict = new collections.FactoryDictionary(function () { return []; });
- });
- it('Uses the default value only when necessary', function () {
- chai_1.expect(dict.setDefault('a', defaultValue)).to.deep.equal(defaultValue);
- var key = 'b';
- dict.setValue(key, []);
- chai_1.expect(dict.setDefault(key, defaultValue)).to.not.equal(defaultValue);
- });
- it('Automatically creates a key with a default value if it doesn\'t exist', function () {
- var key = 'a';
- chai_1.expect(dict.getValue(key)).to.deep.equal(defaultValue);
- chai_1.expect(dict.containsKey(key)).equals(true);
- });
-});
-//# sourceMappingURL=factoryDictionaryTest.js.map
\ No newline at end of file
diff --git a/dist/test/factoryDictionaryTest.js.map b/dist/test/factoryDictionaryTest.js.map
deleted file mode 100644
index e2c9f78..0000000
--- a/dist/test/factoryDictionaryTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"factoryDictionaryTest.js","sourceRoot":"","sources":["../../src/test/factoryDictionaryTest.ts"],"names":[],"mappings":";AAAA,IAAY,WAAW,WAAM,cAAc,CAAC,CAAA;AAG5C,qBAAqB,MAAM,CAAC,CAAA;AAE5B,QAAQ,CAAC,oBAAoB,EACzB;IAEI,IAAI,IAAI,GAAQ,IAAI,CAAC;IACrB,IAAI,YAAY,GAAe,EAAE,CAAC;IAElC,UAAU,CAAC;QACP,IAAI,GAAG,IAAI,WAAW,CAAC,iBAAiB,CAAC,cAAM,OAAA,EAAE,EAAF,CAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAC3C;QACI,aAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEvE,IAAI,GAAG,GAAW,GAAG,CAAC;QAEtB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvB,aAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,uEAAuE,EACtE;QACI,IAAI,GAAG,GAAW,GAAG,CAAC;QAEtB,aAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvD,aAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AAEX,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/dist/test/heapTest.d.ts b/dist/test/heapTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/heapTest.js b/dist/test/heapTest.js
deleted file mode 100644
index 860aab1..0000000
--- a/dist/test/heapTest.js
+++ /dev/null
@@ -1,186 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Heap', function () {
- var heap = null;
- beforeEach(function () {
- heap = new collections.Heap();
- });
- var createHeap1 = function () {
- heap.add(0);
- heap.add(1);
- heap.add(2);
- heap.add(3);
- };
- var createHeap2 = function () {
- heap.add(1);
- heap.add(3);
- heap.add(0);
- heap.add(2);
- };
- var createHeap3 = function () {
- heap.add('a');
- heap.add('b');
- heap.add('c');
- heap.add('d');
- };
- var createHeap4 = function () {
- heap.add('b');
- heap.add('d');
- heap.add('a');
- heap.add('c');
- };
- var createHeap5 = function () {
- heap.add({ val: 'b' });
- heap.add({ val: 'd' });
- heap.add({ val: 'a' });
- heap.add({ val: 'c' });
- };
- function customCompare(a, b) {
- if (a.val < b.val) {
- return -1;
- }
- else if (a.val === b.val) {
- return 0;
- }
- else {
- return 1;
- }
- }
- it('Gives the right size 1', function () {
- createHeap1();
- chai_1.expect(heap.size()).equals(4);
- heap.removeRoot();
- chai_1.expect(heap.size()).equals(3);
- });
- it('Gives the right size 2', function () {
- createHeap1();
- heap.removeRoot();
- heap.removeRoot();
- heap.removeRoot();
- heap.removeRoot();
- chai_1.expect(heap.size()).equals(0);
- });
- it('Gives the right size with strings', function () {
- createHeap3();
- heap.removeRoot();
- heap.removeRoot();
- heap.removeRoot();
- heap.removeRoot();
- chai_1.expect(heap.size()).equals(0);
- });
- it('Peeks the lowest element', function () {
- createHeap1();
- chai_1.expect(heap.peek()).equals(0);
- heap.clear();
- chai_1.expect(heap.peek()).equals(undefined);
- });
- it('Peeks the lowest element 2', function () {
- createHeap2();
- chai_1.expect(heap.peek()).equals(0);
- });
- it('Peeks the lowest element with strings', function () {
- createHeap3();
- chai_1.expect(heap.peek()).equals('a');
- });
- it('Peeks the lowest element with strings 2', function () {
- createHeap4();
- chai_1.expect(heap.peek()).equals('a');
- });
- it('Peeks the lowest element with custom objects', function () {
- heap = new collections.Heap(customCompare);
- createHeap5();
- chai_1.expect(heap.peek().val).equals('a');
- });
- it('Removes root', function () {
- createHeap1();
- chai_1.expect(heap.removeRoot()).equals(0);
- chai_1.expect(heap.removeRoot()).equals(1);
- chai_1.expect(heap.removeRoot()).equals(2);
- chai_1.expect(heap.removeRoot()).equals(3);
- });
- it('Removes root 2', function () {
- createHeap2();
- heap.add(1);
- chai_1.expect(heap.removeRoot()).equals(0);
- chai_1.expect(heap.removeRoot()).equals(1);
- chai_1.expect(heap.removeRoot()).equals(1);
- chai_1.expect(heap.removeRoot()).equals(2);
- chai_1.expect(heap.removeRoot()).equals(3);
- });
- it('Removes root with custom objects', function () {
- heap = new collections.Heap(customCompare);
- createHeap5();
- chai_1.expect(heap.removeRoot().val).equals('a');
- chai_1.expect(heap.removeRoot().val).equals('b');
- chai_1.expect(heap.removeRoot().val).equals('c');
- chai_1.expect(heap.removeRoot().val).equals('d');
- });
- it('Adds and peeks', function () {
- heap.add(3);
- chai_1.expect(heap.peek()).equals(3);
- heap.add(2);
- chai_1.expect(heap.peek()).equals(2);
- heap.add(1);
- chai_1.expect(heap.peek()).equals(1);
- heap.add(0);
- chai_1.expect(heap.peek()).equals(0);
- });
- it('Adds and peeks 2', function () {
- heap.add(1);
- chai_1.expect(heap.peek()).equals(1);
- heap.add(3);
- chai_1.expect(heap.peek()).equals(1);
- heap.add(0);
- chai_1.expect(heap.peek()).equals(0);
- heap.add(2);
- chai_1.expect(heap.peek()).equals(0);
- });
- it('An empty heap is empty', function () {
- chai_1.expect(heap.isEmpty()).equals(true);
- createHeap1();
- for (var i = 0; i < heap.size(); i++) {
- chai_1.expect(heap.isEmpty()).equals(false);
- heap.removeRoot();
- }
- });
- it('Clear removes all elements', function () {
- heap.clear();
- createHeap1();
- heap.clear();
- chai_1.expect(heap.isEmpty()).equals(true);
- chai_1.expect(heap.peek()).equals(undefined);
- });
- it('Contains inserted elements', function () {
- createHeap1();
- for (var i = 0; i < 4; i++) {
- chai_1.expect(heap.contains(i)).equals(true);
- }
- chai_1.expect(heap.contains(i)).equals(false);
- });
- it('For each gives the right elements', function () {
- heap.forEach(function (e) {
- chai_1.expect(true).equals(false); // should not enter here
- });
- createHeap1();
- var elements = [];
- heap.forEach(function (e) {
- elements.push(e);
- });
- chai_1.expect(collections.arrays.contains(elements, 0)).equals(true);
- chai_1.expect(collections.arrays.contains(elements, 1)).equals(true);
- chai_1.expect(collections.arrays.contains(elements, 2)).equals(true);
- chai_1.expect(collections.arrays.contains(elements, 3)).equals(true);
- chai_1.expect(collections.arrays.contains(elements, 4)).equals(false);
- });
- it('For each can be interrupted', function () {
- createHeap1();
- var elements = [];
- heap.forEach(function (e) {
- elements.push(e);
- return false;
- });
- chai_1.expect(elements.length).equals(1);
- });
-});
-//# sourceMappingURL=heapTest.js.map
\ No newline at end of file
diff --git a/dist/test/heapTest.js.map b/dist/test/heapTest.js.map
deleted file mode 100644
index dfcb9b4..0000000
--- a/dist/test/heapTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"heapTest.js","sourceRoot":"","sources":["../../src/test/heapTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/linkedListTest.d.ts b/dist/test/linkedListTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/linkedListTest.js b/dist/test/linkedListTest.js
deleted file mode 100644
index b3f8a04..0000000
--- a/dist/test/linkedListTest.js
+++ /dev/null
@@ -1,328 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Linked List', function () {
- var list = null;
- var elems = 100;
- var equals = function (a, b) {
- return a.el === b.el;
- };
- beforeEach(function () {
- list = new collections.LinkedList();
- });
- it('Inserts elements', function () {
- chai_1.expect(list.first()).equals(undefined);
- chai_1.expect(list.last()).equals(undefined);
- chai_1.expect(list.size()).equals(0);
- for (var i = 0; i < elems; i++) {
- list.add(i);
- chai_1.expect(list.first()).equals(0);
- chai_1.expect(list.last()).equals(i);
- if (i === 0) {
- chai_1.expect(list.first()).equals(list.last());
- }
- chai_1.expect(list.size()).equals(i + 1);
- }
- });
- it('Reverses the list 1', function () {
- list.add(1);
- list.add(2);
- list.add(3);
- list.reverse();
- chai_1.expect(list.elementAtIndex(0)).equals(3);
- chai_1.expect(list.elementAtIndex(1)).equals(2);
- chai_1.expect(list.elementAtIndex(2)).equals(1);
- });
- it('Reverses the list 2', function () {
- list.add(1);
- list.add(2);
- list.reverse();
- chai_1.expect(list.elementAtIndex(0)).equals(2);
- chai_1.expect(list.elementAtIndex(1)).equals(1);
- });
- it('Reverses the list 2', function () {
- list.add(1);
- list.reverse();
- chai_1.expect(list.elementAtIndex(0)).equals(1);
- chai_1.expect(list.elementAtIndex(1)).equals(undefined);
- });
- it('Clear removes all elements', function () {
- for (var i = 0; i < elems; i++) {
- list.add(i);
- }
- list.clear();
- chai_1.expect(list.first()).equals(undefined);
- chai_1.expect(list.last()).equals(undefined);
- chai_1.expect(list.size()).equals(0);
- });
- it('Gives the right size', function () {
- chai_1.expect(list.size()).equals(0);
- list.add(1);
- chai_1.expect(list.size()).equals(1);
- list.add(1);
- chai_1.expect(list.size()).equals(2);
- });
- it('Inserts an element to specified index', function () {
- chai_1.expect(list.elementAtIndex(-1)).equals(undefined);
- chai_1.expect(list.elementAtIndex(0)).equals(undefined);
- chai_1.expect(list.elementAtIndex(1)).equals(undefined);
- for (var i = 0; i < elems; i++) {
- list.add(i);
- chai_1.expect(list.elementAtIndex(list.size() - 1)).equals(i);
- chai_1.expect(list.elementAtIndex(i)).equals(i);
- for (var j = 0; j < i; j++) {
- chai_1.expect(list.elementAtIndex(j)).equals(j);
- }
- }
- });
- it('Two equal lists are equal', function () {
- list.add(1);
- list.add(2);
- var list2 = new collections.LinkedList();
- list2.add(1);
- list2.add(2);
- chai_1.expect(list.equals(list2)).equals(true);
- list2.clear();
- list2.add(2);
- list2.add(1);
- chai_1.expect(list.equals(list2)).equals(false);
- chai_1.expect(list.equals([1, 2])).equals(false);
- });
- it('Doesn\'t insert elements to invalid indexes', function () {
- chai_1.expect(list.add(0, 1)).equals(false);
- chai_1.expect(list.size() === 0).equals(true);
- chai_1.expect(list.first()).equals(undefined);
- chai_1.expect(list.last()).equals(undefined);
- });
- it('Inserts elements to the last index', function () {
- for (var i = 0; i < elems; i++) {
- chai_1.expect(list.add(i, i)).equals(true);
- chai_1.expect(list.elementAtIndex(i)).equals(i);
- chai_1.expect(list.first()).equals(0);
- chai_1.expect(list.last()).equals(i);
- if (i === 0) {
- chai_1.expect(list.first()).equals(list.last());
- }
- chai_1.expect(list.size()).equals(i + 1);
- }
- });
- it('Inserts elements at the first index', function () {
- for (var j = 0; j < elems; j++) {
- for (var i = 0; i < j; i++) {
- list.add(i);
- }
- list.add(-i, 0);
- chai_1.expect(list.elementAtIndex(0)).equals(-i);
- chai_1.expect(list.first()).equals(-i);
- }
- });
- it('Inserts elements to custom index', function () {
- for (var j = 0; j < elems; j++) {
- list.add(j);
- }
- list.add(-100, elems / 2);
- chai_1.expect(list.elementAtIndex(elems / 2)).equals(-100);
- });
- it('Finds elements with indexOf', function () {
- chai_1.expect(list.indexOf(0)).equals(-1);
- for (var j = 0; j < elems; j++) {
- list.add(j + 1);
- chai_1.expect(list.indexOf(j + 1)).equals(j);
- chai_1.expect(list.indexOf(-100)).equals(-1);
- }
- for (var j = 0; j < elems; j++) {
- chai_1.expect(list.indexOf(j + 1)).equals(j);
- chai_1.expect(list.indexOf(-100)).equals(-1);
- }
- });
- it('Finds elements with indexOf and custom equals function', function () {
- chai_1.expect(list.indexOf({
- el: 1
- }, equals)).equals(-1);
- for (var j = 0; j < elems; j++) {
- list.add({
- el: j + 1
- });
- chai_1.expect(list.indexOf({
- el: j + 1
- }, equals)).equals(j);
- chai_1.expect(list.indexOf({
- el: -200
- }, equals)).equals(-1);
- }
- for (var j = 0; j < elems; j++) {
- chai_1.expect(list.indexOf({
- el: j + 1
- }, equals)).equals(j);
- chai_1.expect(list.indexOf({
- el: -200
- }, equals)).equals(-1);
- }
- });
- it('Removes elements', function () {
- chai_1.expect(list.remove(1)).equals(false);
- chai_1.expect(list.size() === 0).equals(true);
- chai_1.expect(list.last()).equals(undefined);
- chai_1.expect(list.first()).equals(undefined);
- for (var i = 0; i < elems; i++) {
- list.add(i);
- chai_1.expect(list.remove(i)).equals(true);
- chai_1.expect(list.size() === 0).equals(true);
- chai_1.expect(list.last()).equals(undefined);
- chai_1.expect(list.first()).equals(undefined);
- }
- list.add(1);
- list.add(2);
- chai_1.expect(list.remove(1)).equals(true);
- chai_1.expect(list.size() === 1).equals(true);
- chai_1.expect(list.first()).equals(2);
- chai_1.expect(list.last()).equals(2);
- list.clear();
- list.add(1);
- list.add(2);
- list.add(3);
- list.add(4);
- chai_1.expect(list.remove(2)).equals(true);
- chai_1.expect(list.size() === 3).equals(true);
- chai_1.expect(list.first()).equals(1);
- chai_1.expect(list.last()).equals(4);
- chai_1.expect(list.elementAtIndex(0)).equals(1);
- chai_1.expect(list.elementAtIndex(1)).equals(3);
- chai_1.expect(list.elementAtIndex(2)).equals(4);
- chai_1.expect(list.elementAtIndex(3)).equals(undefined);
- list.clear();
- for (var i = 0; i < elems; i++) {
- list.add(i);
- }
- var half = elems / 2;
- list.remove(elems / 2);
- for (var i = 0; i < elems; i++) {
- if (i === (half)) {
- chai_1.expect(list.indexOf(i)).equals(-1);
- }
- else if (i < half) {
- chai_1.expect(list.indexOf(i)).equals(i);
- }
- else if (i > half) {
- chai_1.expect(list.indexOf(i)).equals(i - 1);
- }
- }
- chai_1.expect(list.size() === (elems - 1)).equals(true);
- });
- it('Doesn\'t remove non existing elements', function () {
- chai_1.expect(list.remove(5)).equals(false);
- chai_1.expect(list.size()).equals(0);
- list.add(1);
- list.add(2);
- list.add(3);
- list.add(4);
- chai_1.expect(list.remove(5)).equals(false);
- chai_1.expect(list.size()).equals(4);
- });
- it('Removes elements with custom equals', function () {
- chai_1.expect(list.remove({ el: 1 })).equals(false);
- for (var i = 0; i < elems; i++) {
- list.add({ el: i });
- }
- for (var i = 0; i < elems; i++) {
- chai_1.expect(list.remove({ el: i })).equals(false);
- chai_1.expect(list.remove({ el: i }, equals)).equals(true);
- }
- });
- it('Removes elements at specified index', function () {
- chai_1.expect(list.removeElementAtIndex(0)).equals(undefined);
- chai_1.expect(list.removeElementAtIndex(-1)).equals(undefined);
- chai_1.expect(list.removeElementAtIndex(1)).equals(undefined);
- chai_1.expect(list.size() === 0).equals(true);
- list.add(1);
- chai_1.expect(list.removeElementAtIndex(-1)).equals(undefined);
- chai_1.expect(list.removeElementAtIndex(1)).equals(undefined);
- chai_1.expect(list.size() === 1).equals(true);
- chai_1.expect(list.removeElementAtIndex(0)).equals(1);
- chai_1.expect(list.size() === 0).equals(true);
- chai_1.expect(list.first()).equals(undefined);
- chai_1.expect(list.last()).equals(undefined);
- chai_1.expect(list.elementAtIndex(0)).equals(undefined);
- list.add(1);
- list.add(2);
- chai_1.expect(list.removeElementAtIndex(0)).equals(1);
- chai_1.expect(list.size() === 1).equals(true);
- chai_1.expect(list.first()).equals(2);
- list.clear();
- list.add(1);
- list.add(2);
- list.add(3);
- chai_1.expect(list.removeElementAtIndex(2)).equals(3);
- chai_1.expect(list.size() === 2).equals(true);
- chai_1.expect(list.first()).equals(1);
- chai_1.expect(list.last()).equals(2);
- list.clear();
- list.add(1);
- list.add(2);
- list.add(3);
- list.add(4);
- list.add(5);
- chai_1.expect(list.removeElementAtIndex(2)).equals(3);
- chai_1.expect(list.size() === 4).equals(true);
- chai_1.expect(list.first()).equals(1);
- chai_1.expect(list.last()).equals(5);
- chai_1.expect(list.elementAtIndex(0)).equals(1);
- chai_1.expect(list.elementAtIndex(1)).equals(2);
- chai_1.expect(list.elementAtIndex(2)).equals(4);
- chai_1.expect(list.elementAtIndex(3)).equals(5);
- });
- it('Converts the list to an array', function () {
- chai_1.expect(list.toArray().length).equals(0);
- list.add(5);
- var arr = list.toArray();
- chai_1.expect(arr[0]).equals(5);
- chai_1.expect(arr.length).equals(1);
- list.add(8);
- arr = list.toArray();
- chai_1.expect(arr[0]).equals(5);
- chai_1.expect(arr[1]).equals(8);
- chai_1.expect(arr.length).equals(2);
- });
- it('Two identical linked lists are equal', function () {
- var list2 = new collections.LinkedList();
- chai_1.expect(list.equals(list2)).equals(true);
- list.add(1);
- list.add(2);
- chai_1.expect(list.equals(list2)).equals(false);
- list2.add(2);
- list2.add(1);
- chai_1.expect(list.equals(list2)).equals(false);
- list2.clear();
- list2.add(1);
- list2.add(2);
- chai_1.expect(list.equals(list2)).equals(true);
- });
- it('For each gives the right ordering', function () {
- list.forEach(function (e) {
- chai_1.expect(true).equals(false); // should not enter here
- });
- for (var i = 0; i < elems; i++) {
- list.add(i);
- }
- var i = 0;
- list.forEach(function (e) {
- chai_1.expect(e).equals(i);
- i++;
- });
- });
- it('For each can be interrupted', function () {
- var array = [0, 1, 2, 3, 4];
- var b = [];
- for (var i = 0; i < elems; i++) {
- list.add(i);
- }
- list.forEach(function (e) {
- b.push(e);
- if (e === 4) {
- return false;
- }
- });
- chai_1.expect(array).to.deep.equal(b);
- });
-});
-//# sourceMappingURL=linkedListTest.js.map
\ No newline at end of file
diff --git a/dist/test/linkedListTest.js.map b/dist/test/linkedListTest.js.map
deleted file mode 100644
index fb13871..0000000
--- a/dist/test/linkedListTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"linkedListTest.js","sourceRoot":"","sources":["../../src/test/linkedListTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/multiDictionaryTest.d.ts b/dist/test/multiDictionaryTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/multiDictionaryTest.js b/dist/test/multiDictionaryTest.js
deleted file mode 100644
index 9221d7e..0000000
--- a/dist/test/multiDictionaryTest.js
+++ /dev/null
@@ -1,157 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Multi Dictionary', function () {
- var dict = null;
- var elems = 100;
- beforeEach(function () {
- dict = new collections.MultiDictionary();
- });
- it('Maps keys to values with string keys', function () {
- chai_1.expect(dict.getValue('sd')).to.deep.equal([]);
- // test with string keys
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.setValue('' + i, i + 1)).equals(true);
- }
- chai_1.expect(dict.size()).equals(elems);
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.getValue('' + i)).to.deep.equal([i + 1]);
- }
- dict.setValue('a', 5);
- chai_1.expect(dict.getValue('a')).to.deep.equal([5]);
- chai_1.expect(dict.setValue('a', 21)).equals(true);
- chai_1.expect(dict.size()).equals(elems + 1);
- chai_1.expect(dict.getValue('a')).to.deep.equal([5, 21]);
- });
- it('Maps keys to values with number keys', function () {
- // test with number keys
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.setValue(i, i + 1)).equals(true);
- }
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.getValue(i)).to.deep.equal([i + 1]);
- }
- });
- it('Maps keys to values with custom keys', function () {
- var ts = function (obj) {
- return obj.s;
- };
- dict = new collections.MultiDictionary(ts);
- chai_1.expect(dict.getValue('sd')).to.deep.equal([]);
- for (var i = 0; i < elems; i++) {
- var o = {};
- o.s = '' + i;
- chai_1.expect(dict.setValue(o, i + 1)).equals(true);
- }
- for (var i = 0; i < elems; i++) {
- var d = {};
- d.s = '' + i;
- chai_1.expect(dict.getValue(d)).to.deep.equal([i + 1]);
- }
- });
- it('Maps multiple values', function () {
- dict.setValue('a', 5);
- chai_1.expect(dict.getValue('a')).to.deep.equal([5]);
- chai_1.expect(dict.setValue('a', 21)).equals(true);
- chai_1.expect(dict.size()).equals(1);
- chai_1.expect(dict.getValue('a')).to.deep.equal([5, 21]);
- chai_1.expect(dict.size()).equals(1);
- chai_1.expect(dict.setValue('a', 31)).equals(true);
- chai_1.expect(dict.size()).equals(1);
- chai_1.expect(dict.getValue('a')).to.deep.equal([5, 21, 31]);
- chai_1.expect(dict.size()).equals(1);
- });
- it('Removes existing elements from the dictionary', function () {
- chai_1.expect(dict.remove('1')).equals(false);
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.setValue('' + i, i + 1)).equals(true);
- }
- chai_1.expect(dict.size()).equals(elems);
- for (var i = 0; i < elems; i++) {
- chai_1.expect(dict.remove('' + i)).equals(true);
- chai_1.expect(dict.getValue('' + i)).to.deep.equal([]);
- chai_1.expect(dict.remove('' + i)).equals(false);
- }
- chai_1.expect(dict.size()).equals(0);
- });
- it('Removes all values from a key', function () {
- dict.setValue('a', 1);
- dict.remove('a');
- chai_1.expect(dict.containsKey('a')).equals(false);
- chai_1.expect(dict.getValue('a')).to.deep.equal([]);
- dict.setValue('a', 2);
- dict.setValue('a', 3);
- dict.remove('a');
- chai_1.expect(dict.containsKey('a')).equals(false);
- chai_1.expect(dict.getValue('a')).to.deep.equal([]);
- });
- it('Removes a single value from a key', function () {
- dict.setValue('a', 1);
- dict.remove('a', 1);
- chai_1.expect(dict.containsKey('a')).equals(false);
- chai_1.expect(dict.getValue('a')).to.deep.equal([]);
- dict.setValue('a', 2);
- dict.setValue('a', 3);
- dict.remove('a', 3);
- chai_1.expect(dict.containsKey('a')).equals(true);
- chai_1.expect(dict.getValue('a')).to.deep.equal([2]);
- dict.remove('a', 2);
- chai_1.expect(dict.containsKey('a')).equals(false);
- chai_1.expect(dict.getValue('a')).to.deep.equal([]);
- });
- it('An empty dictionary is empty', function () {
- chai_1.expect(dict.isEmpty()).equals(true);
- dict.setValue('1', 1);
- chai_1.expect(dict.isEmpty()).equals(false);
- dict.remove('1');
- chai_1.expect(dict.isEmpty()).equals(true);
- });
- it('Clear removes all elements', function () {
- dict.clear();
- dict.setValue(1, 1);
- dict.clear();
- chai_1.expect(dict.isEmpty()).equals(true);
- chai_1.expect(dict.getValue(1)).to.deep.equal([]);
- });
- it('Contains existing keys', function () {
- chai_1.expect(dict.containsKey(0)).equals(false);
- for (var i = 0; i < 10; i++) {
- dict.setValue(i, i);
- chai_1.expect(dict.containsKey(i)).equals(true);
- }
- for (var i = 0; i < 10; i++) {
- dict.remove(i);
- chai_1.expect(dict.containsKey(i)).equals(false);
- }
- });
- it('Gives the right size', function () {
- chai_1.expect(dict.size()).equals(0);
- for (var i = 0; i < 10; i++) {
- dict.setValue(i, i);
- chai_1.expect(dict.size()).equals(i + 1);
- }
- });
- it('Gives all the stored keys', function () {
- var k = [];
- for (var i = 0; i < elems; i++) {
- var keys = dict.keys();
- k.sort();
- keys.sort();
- chai_1.expect(k).to.deep.equal(keys);
- dict.setValue('' + i, i);
- k.push('' + i);
- }
- });
- it('Gives all the stored values', function () {
- var v = [];
- for (var i = 0; i < elems; i++) {
- var values = dict.values();
- v.sort();
- values.sort();
- chai_1.expect(v).to.deep.equal(values);
- dict.setValue('' + i, i);
- v.push(i);
- }
- });
-});
-//# sourceMappingURL=multiDictionaryTest.js.map
\ No newline at end of file
diff --git a/dist/test/multiDictionaryTest.js.map b/dist/test/multiDictionaryTest.js.map
deleted file mode 100644
index b2ec484..0000000
--- a/dist/test/multiDictionaryTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"multiDictionaryTest.js","sourceRoot":"","sources":["../../src/test/multiDictionaryTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/multiRootTreeTest.d.ts b/dist/test/multiRootTreeTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/multiRootTreeTest.js b/dist/test/multiRootTreeTest.js
deleted file mode 100644
index 15b3b62..0000000
--- a/dist/test/multiRootTreeTest.js
+++ /dev/null
@@ -1,531 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Multi Root Tree', function () {
- var tree;
- beforeEach(function () {
- tree = new collections.MultiRootTree();
- });
- it('Constructs', function () {
- chai_1.expect(tree.getRootIds()).to.deep.equal([]);
- chai_1.expect(tree.getNodes()).to.deep.equal({});
- });
- it('Can insert one root key', function () {
- tree.insertIdIntoRoot('1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '1': [] });
- });
- it('Can insert 2 root keys', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '1': [], '2': [] });
- });
- it('Can insert root key with +1 position', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoRoot('3');
- tree.insertIdIntoRoot('0', 1);
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '0', '2', '3']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '0': [], '1': [], '2': [], '3': [] });
- });
- it('Can insert root key with -1 position', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoRoot('3');
- tree.insertIdIntoRoot('0', -1);
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '3', '0']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '0': [], '1': [], '2': [], '3': [] });
- });
- it('Can insert root key with -2 position', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoRoot('3');
- tree.insertIdIntoRoot('0', -2);
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '0', '3']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '0': [], '1': [], '2': [], '3': [] });
- });
- it('Can insert a node', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoNode('1', '1.1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '1': ['1.1'], '1.1': [] });
- });
- it('Can insert two nodes', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoNode('1', '1.1');
- tree.insertIdIntoNode('1', '1.2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '1': ['1.1', '1.2'], '1.1': [], '1.2': [] });
- });
- it('Can insert a root key before a root key', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('3');
- tree.insertIdBeforeId('3', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '3']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '1': [], '2': [], '3': [] });
- });
- it('Can insert a node before a node key v1', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoNode('1', '1.1');
- tree.insertIdIntoNode('1', '1.2');
- tree.insertIdBeforeId('1.2', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['1.1', 'A', '1.2'],
- '1.1': [], '1.2': [], 'A': []
- });
- });
- it('Can insert a node before a node key v2 ', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoNode('1', '1.1');
- tree.insertIdIntoNode('1', '1.2');
- tree.insertIdIntoNode('1.2', '1.2.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.2');
- tree.insertIdIntoNode('1.2.1', '1.2.1.3');
- tree.insertIdBeforeId('1.2.1.1', 'A');
- tree.insertIdBeforeId('1.2.1.3', 'B');
- tree.insertIdBeforeId('1.2.1.3', 'C');
- tree.insertIdBeforeId('1', 'D');
- tree.insertIdBeforeId('C', 'E');
- tree.insertIdBeforeId('1.2', 'F');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['D', '1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['1.1', 'F', '1.2'],
- '1.1': [], '1.2': ['1.2.1'],
- '1.2.1': ['A', '1.2.1.1', '1.2.1.2', 'B', 'E', 'C', '1.2.1.3'],
- '1.2.1.1': [], '1.2.1.2': [], '1.2.1.3': [],
- 'A': [], 'B': [], 'C': [], 'D': [], 'E': [], 'F': [],
- });
- });
- it('Can insert a root key after a root key', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('3');
- tree.insertIdAfterId('1', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '3']);
- chai_1.expect(tree.getNodes()).to.deep.equal({ '1': [], '2': [], '3': [] });
- });
- it('Can insert a node key after a node key', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoNode('1', '1.1');
- tree.insertIdIntoNode('1', '1.2');
- tree.insertIdIntoNode('1.2', '1.2.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.2');
- tree.insertIdIntoNode('1.2.1', '1.2.1.3');
- tree.insertIdAfterId('1.2.1.1', 'A');
- tree.insertIdAfterId('1.2.1.3', 'B');
- tree.insertIdAfterId('1.2.1.3', 'C');
- tree.insertIdAfterId('1', 'D');
- tree.insertIdAfterId('C', 'E');
- tree.insertIdAfterId('1.2', 'F');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', 'D']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['1.1', '1.2', 'F'],
- '1.1': [], '1.2': ['1.2.1'],
- '1.2.1': ['1.2.1.1', 'A', '1.2.1.2', '1.2.1.3', 'C', 'E', 'B'],
- '1.2.1.1': [], '1.2.1.2': [], '1.2.1.3': [],
- 'A': [], 'B': [], 'C': [], 'D': [], 'E': [], 'F': [],
- });
- });
- it('Can delete a key from root', function () {
- tree.insertIdIntoRoot('1');
- tree.deleteId('1');
- chai_1.expect(tree.getRootIds()).to.deep.equal([]);
- chai_1.expect(tree.getNodes()).to.deep.equal({});
- });
- it('Can delete a nested key', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('1', '1.1');
- tree.insertIdIntoNode('1', '1.2');
- tree.insertIdIntoNode('1.2', '1.2.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.2');
- tree.insertIdIntoNode('1.2.1', '1.2.1.3');
- tree.deleteId('1.2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['1.1'], '2': [],
- '1.1': [],
- });
- });
- it('Can delete a nested key v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('1', '1.1');
- tree.insertIdIntoNode('1.1', '1.1.1');
- tree.insertIdIntoNode('1', '1.2');
- tree.insertIdIntoNode('1.2', '1.2.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.2');
- tree.insertIdIntoNode('1.2.1', '1.2.1.3');
- tree.deleteId('1.2');
- tree.deleteId('1.1.1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['1.1'], '2': [],
- '1.1': [],
- });
- });
- it('Can delete a nested key v3', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('1', '1.1');
- tree.insertIdIntoNode('1.1', '1.1.1');
- tree.insertIdIntoNode('1', '1.2');
- tree.insertIdIntoNode('1.2', '1.2.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.2');
- tree.insertIdIntoNode('1.2.1', '1.2.1.3');
- tree.deleteId('1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '2': [],
- });
- });
- it('Can insert id inside id v1', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoId('1', '1.1');
- tree.insertIdIntoId('1', '1.2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['1.1', '1.2'],
- '1.1': [], '1.2': []
- });
- });
- it('Can insert id inside id v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoNode('1', '1.1');
- tree.insertIdIntoNode('1', '1.2');
- tree.insertIdIntoNode('1.2', '1.2.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.1');
- tree.insertIdIntoNode('1.2.1', '1.2.1.2');
- tree.insertIdIntoNode('1.2.1', '1.2.1.3');
- tree.insertIdAfterId('1.2.1.1', 'A');
- tree.insertIdAfterId('1.2.1.3', 'B');
- tree.insertIdAfterId('1.2.1.3', 'C');
- tree.insertIdAfterId('1', 'D');
- tree.insertIdAfterId('C', 'E');
- tree.insertIdAfterId('1.2', 'F');
- tree.insertIdIntoId('C', 'Z');
- tree.insertIdIntoId('Z', 'X');
- tree.insertIdIntoId('1.2', 'Y');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', 'D']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['1.1', '1.2', 'F'],
- '1.1': [], '1.2': ['1.2.1', 'Y'],
- '1.2.1': ['1.2.1.1', 'A', '1.2.1.2', '1.2.1.3', 'C', 'E', 'B'],
- '1.2.1.1': [], '1.2.1.2': [], '1.2.1.3': [],
- 'A': [], 'B': [], 'C': ['Z'], 'D': [], 'E': [], 'F': [], 'Z': ['X'], 'X': [], 'Y': []
- });
- });
- it('Can move id before id (root to root)', function () {
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoRoot('3');
- tree.insertIdIntoRoot('1');
- tree.moveIdBeforeId('1', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '3']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': [], '2': [], '3': []
- });
- });
- it('Can move id before id (root to node)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('1', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': [],
- 'A': []
- });
- tree.moveIdBeforeId('2', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['2', 'A'], '2': [],
- 'A': []
- });
- });
- it('Can move id before id (root to node) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdBeforeId('2', 'B');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': ['2.1'],
- '2.1': [],
- 'A': ['2', 'B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id before id (node to root)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdBeforeId('A', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', 'A', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': [], '2': ['2.1'],
- '2.1': [],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id before id (node to root) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdBeforeId('2.1', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2.1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': [],
- '2.1': [],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id before id (node to node)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdBeforeId('A', '2.1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': [], '2': ['A', '2.1'],
- '2.1': [],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id before id (node to node) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdBeforeId('C', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['C', 'A'], '2': ['2.1'],
- '2.1': [],
- 'A': ['B'], 'B': [], 'C': []
- });
- });
- // after
- it('Can move id after id (root to root)', function () {
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoRoot('3');
- tree.insertIdIntoRoot('1');
- tree.moveIdAfterId('2', '1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['3', '1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': [], '2': [], '3': []
- });
- });
- it('Can move id after id (root to node)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('1', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': [],
- 'A': []
- });
- tree.moveIdAfterId('2', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A', '2'], '2': [],
- 'A': []
- });
- });
- it('Can move id after id (root to node) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdAfterId('2', 'B');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': ['2.1'],
- '2.1': [],
- 'A': ['B', '2', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id after id (node to root)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdAfterId('A', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', 'A']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': [], '2': ['2.1'],
- '2.1': [],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id after id (node to root) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdAfterId('2.1', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2', '2.1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': [],
- '2.1': [],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id after id (node to node)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdAfterId('A', '2.1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': [], '2': ['2.1', 'A'],
- '2.1': [],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id after id (node to node) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdAfterId('C', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A', 'C'], '2': ['2.1'],
- '2.1': [],
- 'A': ['B'], 'B': [], 'C': []
- });
- });
- // inside
- it('Can move id inside id (root to root)', function () {
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoRoot('3');
- tree.insertIdIntoRoot('1');
- tree.moveIdIntoId('2', '1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['3', '1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['2'], '2': [], '3': []
- });
- });
- //
- it('Can move id inside id (root to node)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('1', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': [],
- 'A': []
- });
- tree.moveIdIntoId('2', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': [],
- 'A': ['2']
- });
- });
- it('Can move id inside id (root to node) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdIntoId('2', 'B');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': ['2.1'],
- '2.1': [],
- 'A': ['B', 'C'], 'B': ['2'], 'C': []
- });
- });
- it('Can move id inside id (node to root)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdIntoId('A', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': [], '2': ['A', '2.1'],
- '2.1': [],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id inside id (node to root) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdIntoId('2.1', '2');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': ['2.1'],
- '2.1': [],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id inside id (node to node)', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdIntoId('A', '2.1');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': [], '2': ['2.1'],
- '2.1': ['A'],
- 'A': ['B', 'C'], 'B': [], 'C': []
- });
- });
- it('Can move id inside id (node to node) v2', function () {
- tree.insertIdIntoRoot('1');
- tree.insertIdIntoRoot('2');
- tree.insertIdIntoNode('2', '2.1');
- tree.insertIdIntoNode('1', 'A');
- tree.insertIdIntoNode('A', 'B');
- tree.insertIdIntoNode('A', 'C');
- tree.moveIdIntoId('C', 'A');
- chai_1.expect(tree.getRootIds()).to.deep.equal(['1', '2']);
- chai_1.expect(tree.getNodes()).to.deep.equal({
- '1': ['A'], '2': ['2.1'],
- '2.1': [],
- 'A': ['C', 'B'], 'B': [], 'C': []
- });
- });
-});
-//# sourceMappingURL=multiRootTreeTest.js.map
\ No newline at end of file
diff --git a/dist/test/multiRootTreeTest.js.map b/dist/test/multiRootTreeTest.js.map
deleted file mode 100644
index 6af6ffb..0000000
--- a/dist/test/multiRootTreeTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"multiRootTreeTest.js","sourceRoot":"","sources":["../../src/test/multiRootTreeTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/priorityQueueTest.d.ts b/dist/test/priorityQueueTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/priorityQueueTest.js b/dist/test/priorityQueueTest.js
deleted file mode 100644
index c08f392..0000000
--- a/dist/test/priorityQueueTest.js
+++ /dev/null
@@ -1,132 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Priority Queue', function () {
- var queue = null;
- beforeEach(function () {
- queue = new collections.PriorityQueue();
- });
- var createPriorityQueue1 = function () {
- queue.enqueue(0);
- queue.enqueue(1);
- queue.enqueue(2);
- queue.enqueue(3);
- return queue;
- };
- var createPriorityQueue2 = function () {
- queue.enqueue(1);
- queue.enqueue(3);
- queue.enqueue(0);
- queue.enqueue(2);
- return queue;
- };
- it('Gives the right size', function () {
- createPriorityQueue1();
- chai_1.expect(queue.size()).equals(4);
- queue.dequeue();
- chai_1.expect(queue.size()).equals(3);
- });
- it('Gives the right size 2', function () {
- createPriorityQueue2();
- chai_1.expect(queue.size()).equals(4);
- queue.dequeue();
- chai_1.expect(queue.size()).equals(3);
- });
- it('Gives the right size 3', function () {
- createPriorityQueue1();
- queue.dequeue();
- queue.dequeue();
- queue.dequeue();
- queue.dequeue();
- chai_1.expect(queue.size()).equals(0);
- });
- it('Contains inserted elements', function () {
- createPriorityQueue1();
- for (var i = 0; i < 4; i++) {
- chai_1.expect(queue.contains(i)).equals(true);
- }
- chai_1.expect(queue.contains(5)).equals(false);
- });
- it('An empty queue is empty', function () {
- createPriorityQueue1();
- chai_1.expect(queue.isEmpty()).equals(false);
- queue.dequeue();
- queue.dequeue();
- queue.dequeue();
- chai_1.expect(queue.isEmpty()).equals(false);
- queue.dequeue();
- chai_1.expect(queue.isEmpty()).equals(true);
- });
- it('Peeks the highest priority item', function () {
- createPriorityQueue1();
- chai_1.expect(queue.peek()).equals(3);
- });
- it('Peeks the highest priority item 2', function () {
- createPriorityQueue2();
- chai_1.expect(queue.peek()).equals(3);
- });
- it('Peeking an empty queue returns undefined', function () {
- createPriorityQueue1();
- queue.clear();
- chai_1.expect(queue.peek()).equals(undefined);
- });
- it('Dequeues the highest priority item', function () {
- createPriorityQueue1();
- chai_1.expect(queue.dequeue()).equals(3);
- chai_1.expect(queue.dequeue()).equals(2);
- chai_1.expect(queue.dequeue()).equals(1);
- chai_1.expect(queue.dequeue()).equals(0);
- });
- it('Dequeues the highest priority item 2', function () {
- createPriorityQueue2();
- chai_1.expect(queue.dequeue()).equals(3);
- chai_1.expect(queue.dequeue()).equals(2);
- chai_1.expect(queue.dequeue()).equals(1);
- chai_1.expect(queue.dequeue()).equals(0);
- });
- it('Peek and enqueue are consistent', function () {
- queue.enqueue(0);
- chai_1.expect(queue.peek()).equals(0);
- queue.enqueue(1);
- chai_1.expect(queue.peek()).equals(1);
- queue.enqueue(2);
- chai_1.expect(queue.peek()).equals(2);
- queue.enqueue(3);
- chai_1.expect(queue.peek()).equals(3);
- });
- it('Peek and enqueue are consistent 2', function () {
- queue.enqueue(1);
- chai_1.expect(queue.peek()).equals(1);
- queue.enqueue(3);
- chai_1.expect(queue.peek()).equals(3);
- queue.enqueue(0);
- chai_1.expect(queue.peek()).equals(3);
- queue.enqueue(2);
- chai_1.expect(queue.peek()).equals(3);
- });
- it('For each gives the right elements', function () {
- queue.forEach(function (e) {
- chai_1.expect(true).equals(false); // should not enter here
- });
- createPriorityQueue1();
- var elements = [];
- queue.forEach(function (e) {
- elements.push(e);
- });
- chai_1.expect(collections.arrays.contains(elements, 0)).equals(true);
- chai_1.expect(collections.arrays.contains(elements, 1)).equals(true);
- chai_1.expect(collections.arrays.contains(elements, 2)).equals(true);
- chai_1.expect(collections.arrays.contains(elements, 3)).equals(true);
- chai_1.expect(collections.arrays.contains(elements, 4)).equals(false);
- });
- it('For each can be interrupted', function () {
- createPriorityQueue1();
- var elements = [];
- queue.forEach(function (e) {
- elements.push(e);
- return false;
- });
- chai_1.expect(elements.length).equals(1);
- });
-});
-//# sourceMappingURL=priorityQueueTest.js.map
\ No newline at end of file
diff --git a/dist/test/priorityQueueTest.js.map b/dist/test/priorityQueueTest.js.map
deleted file mode 100644
index fa00fa1..0000000
--- a/dist/test/priorityQueueTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"priorityQueueTest.js","sourceRoot":"","sources":["../../src/test/priorityQueueTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/queueTest.d.ts b/dist/test/queueTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/queueTest.js b/dist/test/queueTest.js
deleted file mode 100644
index 7f03e87..0000000
--- a/dist/test/queueTest.js
+++ /dev/null
@@ -1,82 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Queue', function () {
- var queue = null;
- beforeEach(function () {
- queue = new collections.Queue();
- });
- function createQueue() {
- queue.enqueue('a');
- queue.enqueue('b');
- queue.enqueue('c');
- }
- it('Gives the right size', function () {
- chai_1.expect(queue.size()).equals(0);
- createQueue();
- chai_1.expect(queue.size()).equals(3);
- queue.enqueue('d');
- chai_1.expect(queue.size()).equals(4);
- queue.dequeue();
- chai_1.expect(queue.size()).equals(3);
- queue.clear();
- chai_1.expect(queue.size()).equals(0);
- });
- it('Enqueues', function () {
- createQueue();
- var head = queue.dequeue();
- chai_1.expect(head).equals('a');
- queue.dequeue();
- head = queue.dequeue();
- chai_1.expect(head).equals('c');
- chai_1.expect(queue.isEmpty()).equals(true);
- head = queue.dequeue();
- chai_1.expect(head).equals(undefined);
- });
- it('Peeks', function () {
- createQueue();
- var head = queue.peek();
- chai_1.expect(head).equals('a');
- var head2 = queue.dequeue();
- chai_1.expect(head).equals(head2);
- head = queue.peek();
- chai_1.expect(head).equals('b');
- queue.clear();
- head = queue.peek();
- chai_1.expect(head).equals(undefined);
- });
- it('For each gives the right ordering', function () {
- queue.forEach(function (e) {
- chai_1.expect(true).equals(false); // should not enter here
- });
- for (var i = 0; i < 10; i++) {
- queue.add(i);
- }
- var i = 0;
- queue.forEach(function (e) {
- chai_1.expect(e).equals(i);
- i++;
- });
- });
- it('For each can be interrupted', function () {
- var array = [0, 1, 2, 3, 4];
- var b = [];
- for (var i = 0; i < 5; i++) {
- queue.add(i);
- }
- queue.forEach(function (e) {
- b.push(e);
- if (e === 3) {
- return false;
- }
- });
- chai_1.expect([0, 1, 2, 3]).to.deep.equal(b);
- });
- it('Contains previously added items', function () {
- createQueue();
- chai_1.expect(queue.contains('a')).equals(true);
- chai_1.expect(queue.contains('z')).equals(false);
- chai_1.expect(queue.contains(undefined)).equals(false);
- });
-});
-//# sourceMappingURL=queueTest.js.map
\ No newline at end of file
diff --git a/dist/test/queueTest.js.map b/dist/test/queueTest.js.map
deleted file mode 100644
index 7e180e2..0000000
--- a/dist/test/queueTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"queueTest.js","sourceRoot":"","sources":["../../src/test/queueTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/setTest.d.ts b/dist/test/setTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/setTest.js b/dist/test/setTest.js
deleted file mode 100644
index dacd008..0000000
--- a/dist/test/setTest.js
+++ /dev/null
@@ -1,265 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Set', function () {
- var set = null;
- it('Gives the right size', function () {
- set = new collections.Set();
- set.add('a');
- set.add('b');
- set.add('c');
- chai_1.expect(set.size()).equals(3);
- set.add('d');
- chai_1.expect(set.size()).equals(4);
- set.remove('d');
- chai_1.expect(set.size()).equals(3);
- set.clear();
- set.add('a');
- set.add('b');
- set.add('c');
- chai_1.expect(set.size()).equals(3);
- set.add('d');
- chai_1.expect(set.size()).equals(4);
- set.remove('d');
- chai_1.expect(set.size()).equals(3);
- set.add('c');
- chai_1.expect(set.size()).equals(3);
- });
- it('Contains existing elements', function () {
- set = new collections.Set();
- set.add('a');
- set.add('b');
- set.add('c');
- set.add('d');
- chai_1.expect(set.contains('a')).equals(true);
- chai_1.expect(set.contains('b')).equals(true);
- chai_1.expect(set.contains('c')).equals(true);
- chai_1.expect(set.contains('d')).equals(true);
- chai_1.expect(set.contains('e')).equals(false);
- set.clear();
- set.add(1);
- set.add(2);
- set.add(3);
- set.add(4);
- chai_1.expect(set.contains(1)).equals(true);
- chai_1.expect(set.contains(2)).equals(true);
- chai_1.expect(set.contains(3)).equals(true);
- chai_1.expect(set.contains(4)).equals(true);
- chai_1.expect(set.contains(5)).equals(false);
- var toStringF = function (f) {
- return f.description;
- };
- set = new collections.Set(toStringF);
- var fn1 = function () { };
- fn1.description = 'fn1';
- chai_1.expect(set.contains(fn1)).equals(false);
- set.add(fn1);
- chai_1.expect(set.contains(fn1)).equals(true);
- var fn2 = function () { };
- fn2.description = 'fn2';
- chai_1.expect(set.contains(fn2)).equals(false);
- set.add(fn2);
- chai_1.expect(set.contains(fn2)).equals(true);
- chai_1.expect(set.size()).equals(2);
- });
- it('An empty set is empty', function () {
- set = new collections.Set();
- chai_1.expect(set.isEmpty()).equals(true);
- set.add(1);
- chai_1.expect(set.isEmpty()).equals(false);
- });
- it('Intersection is commutative', function () {
- //Two empty sets
- set = new collections.Set();
- var set2 = new collections.Set();
- set.intersection(set2);
- chai_1.expect(set.isEmpty()).equals(true);
- set2.intersection(set);
- chai_1.expect(set2.isEmpty()).equals(true);
- // non empty with empty
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set.add(3);
- set.intersection(set2);
- chai_1.expect(set.isEmpty()).equals(true);
- set2.intersection(set);
- chai_1.expect(set2.isEmpty()).equals(true);
- // non empty sets with common elements
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set2.add(1);
- set2.add(2);
- set2.add(3);
- set.intersection(set2);
- var s1 = set.toArray().sort();
- chai_1.expect(s1).to.deep.equal([1, 2]);
- set = new collections.Set();
- set.add(1);
- set.add(2);
- set2.intersection(set);
- var s2 = set2.toArray().sort();
- chai_1.expect(s2).to.deep.equal([1, 2]);
- // non empty sets with no common elements
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set2.add(3);
- set2.add(4);
- set2.add(5);
- set.intersection(set2);
- chai_1.expect(set.isEmpty()).equals(true);
- set.add(1);
- set.add(2);
- set2.intersection(set);
- chai_1.expect(set2.isEmpty()).equals(true);
- });
- it('Union is commutative', function () {
- set = new collections.Set();
- var set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set2.add(2);
- set2.add(4);
- set2.add(5);
- set.union(set2);
- var s1 = set.toArray().sort();
- chai_1.expect(s1).to.deep.equal([1, 2, 4, 5]);
- set.clear();
- set.add(1);
- set.add(2);
- set2.union(set);
- var s2 = set2.toArray().sort();
- chai_1.expect(s2).to.deep.equal([1, 2, 4, 5]);
- });
- it('Difference works as expected', function () {
- //Two empty sets
- set = new collections.Set();
- var set2 = new collections.Set();
- set.difference(set2);
- chai_1.expect(set.isEmpty()).equals(true);
- //Non empty and empty set
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set.difference(set2);
- var s1 = set.toArray().sort();
- chai_1.expect(s1).to.deep.equal([1, 2]);
- //Non empty sets with common elements
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set.add(3);
- set.add(4);
- set2.add(2);
- set2.add(3);
- set.difference(set2);
- s1 = set.toArray().sort();
- chai_1.expect(s1).to.deep.equal([1, 4]);
- // Two equal sets
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set.add(3);
- set2.add(1);
- set2.add(3);
- set2.add(2);
- set.difference(set2);
- chai_1.expect(set.isEmpty()).equals(true);
- //Non empty sets with no common elements
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set.add(3);
- set.add(4);
- set2.add(6);
- set2.add(9);
- set.difference(set2);
- s1 = set.toArray().sort();
- chai_1.expect(s1).to.deep.equal([1, 2, 3, 4]);
- });
- it('isSubsetOf works as expected', function () {
- //Two empty sets
- set = new collections.Set();
- var set2 = new collections.Set();
- chai_1.expect(set.isSubsetOf(set2)).equals(true);
- // Two equal sets
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set2.add(2);
- set2.add(1);
- chai_1.expect(set.isSubsetOf(set2)).equals(true);
- chai_1.expect(set2.isSubsetOf(set)).equals(true);
- //Non empty sets with common elements
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(1);
- set.add(2);
- set.add(3);
- set.add(4);
- set2.add(2);
- set2.add(3);
- chai_1.expect(set2.isSubsetOf(set)).equals(true);
- chai_1.expect(set.isSubsetOf(set2)).equals(false);
- //Non empty sets with no common elements
- set = new collections.Set();
- set2 = new collections.Set();
- set.add(3);
- set2.add(4);
- chai_1.expect(set.isSubsetOf(set2)).equals(false);
- chai_1.expect(set2.isSubsetOf(set)).equals(false);
- });
- it('Adds', function () {
- set = new collections.Set();
- chai_1.expect(set.add('a')).equals(true);
- chai_1.expect(set.add('b')).equals(true);
- chai_1.expect(set.contains('a')).equals(true);
- chai_1.expect(set.contains('b')).equals(true);
- chai_1.expect(set.add('b')).equals(false);
- chai_1.expect(set.contains('b')).equals(true);
- chai_1.expect(set.add(null)).equals(true);
- chai_1.expect(set.contains(null)).equals(true);
- chai_1.expect(set.add(null)).equals(false);
- chai_1.expect(set.contains(undefined)).equals(false);
- chai_1.expect(set.add(undefined)).equals(false);
- chai_1.expect(set.contains(undefined)).equals(false);
- });
- it('For each gives all the elements', function () {
- set = new collections.Set();
- set.forEach(function (e) {
- chai_1.expect(false).equals(true);
- });
- for (var i = 0; i < 100; i++) {
- set.add(i);
- }
- var values = set.toArray();
- chai_1.expect(values.length).equals(100);
- set.forEach(function (e) {
- chai_1.expect(collections.arrays.remove(values, e)).equals(true);
- });
- chai_1.expect(values.length).equals(0);
- });
- it('For each can be interrupted', function () {
- set = new collections.Set();
- for (var i = 0; i < 5; i++) {
- set.add(i);
- }
- var t = 0;
- set.forEach(function (e) {
- t++;
- return false;
- });
- chai_1.expect(t).equals(1);
- });
-});
-//# sourceMappingURL=setTest.js.map
\ No newline at end of file
diff --git a/dist/test/setTest.js.map b/dist/test/setTest.js.map
deleted file mode 100644
index cadf3de..0000000
--- a/dist/test/setTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"setTest.js","sourceRoot":"","sources":["../../src/test/setTest.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/test/stackTest.d.ts b/dist/test/stackTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/stackTest.js b/dist/test/stackTest.js
deleted file mode 100644
index 9781559..0000000
--- a/dist/test/stackTest.js
+++ /dev/null
@@ -1,90 +0,0 @@
-"use strict";
-var collections = require('../lib/index');
-var chai_1 = require('chai');
-describe('Stack', function () {
- var stack = null;
- beforeEach(function () {
- stack = new collections.Stack();
- });
- it('Pops', function () {
- chai_1.expect(stack.pop()).equals(undefined);
- stack.push(1);
- stack.push(2);
- stack.push(3);
- chai_1.expect(stack.pop()).equals(3);
- chai_1.expect(stack.pop()).equals(2);
- chai_1.expect(stack.pop()).equals(1);
- chai_1.expect(stack.pop()).equals(undefined);
- });
- it('Pushes and pops', function () {
- stack.push(1);
- chai_1.expect(stack.pop()).equals(1);
- stack.push(2);
- chai_1.expect(stack.pop()).equals(2);
- stack.push(3);
- chai_1.expect(stack.pop()).equals(3);
- chai_1.expect(stack.pop()).equals(undefined);
- });
- it('Peeks', function () {
- stack.push(1);
- stack.push(2);
- stack.push(3);
- chai_1.expect(stack.peek()).equals(3);
- stack.pop();
- chai_1.expect(stack.peek()).equals(2);
- stack.pop();
- chai_1.expect(stack.peek()).equals(1);
- stack.pop();
- chai_1.expect(stack.peek()).equals(undefined);
- });
- it('Pushes and peeks', function () {
- chai_1.expect(stack.peek()).equals(undefined);
- stack.push(1);
- chai_1.expect(stack.peek()).equals(1);
- stack.push(2);
- chai_1.expect(stack.peek()).equals(2);
- stack.push(3);
- chai_1.expect(stack.peek()).equals(3);
- });
- it('Gives the right size', function () {
- chai_1.expect(stack.size()).equals(0);
- stack.push(1);
- stack.push(2);
- stack.push(3);
- chai_1.expect(stack.size()).equals(3);
- stack.peek();
- chai_1.expect(stack.size()).equals(3);
- stack.pop();
- stack.pop();
- stack.pop();
- chai_1.expect(stack.size()).equals(0);
- });
- it('For each gives the right ordering', function () {
- stack.forEach(function (e) {
- chai_1.expect(true).equals(false); // should not enter here
- });
- for (var i = 0; i < 10; i++) {
- stack.add(i);
- }
- var i = 10 - 1;
- stack.forEach(function (e) {
- chai_1.expect(e).equals(i);
- i--;
- });
- });
- it('For each can be interrupted', function () {
- var array = [0, 1, 2, 3, 4];
- var b = [];
- for (var i = 0; i < 5; i++) {
- stack.add(i);
- }
- stack.forEach(function (e) {
- b.push(e);
- if (e === 4) {
- return false;
- }
- });
- chai_1.expect([4]).to.deep.equal(b);
- });
-});
-//# sourceMappingURL=stackTest.js.map
\ No newline at end of file
diff --git a/dist/test/stackTest.js.map b/dist/test/stackTest.js.map
deleted file mode 100644
index eb018e0..0000000
--- a/dist/test/stackTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"stackTest.js","sourceRoot":"","sources":["../../src/test/stackTest.ts"],"names":[],"mappings":";AAAA,IAAY,WAAW,WAAM,cAAc,CAAC,CAAA;AAG5C,qBAAqB,MAAM,CAAC,CAAA;AAE5B,QAAQ,CAAC,OAAO,EACZ;IAEI,IAAI,KAAK,GAAQ,IAAI,CAAC;IAEtB,UAAU,CAAC;QACP,KAAK,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,MAAM,EACL;QACI,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE1C,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,iBAAiB,EAChB;QACI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,aAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,OAAO,EACN;QACI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,kBAAkB,EACjB;QACI,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,sBAAsB,EACrB;QACI,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,CAAC;QACZ,aAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,mCAAmC,EAClC;QAEI,KAAK,CAAC,OAAO,CAAC,UAAS,CAAM;YACzB,aAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB;QACxD,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACf,KAAK,CAAC,OAAO,CAAC,UAAS,CAAM;YACzB,aAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC,EAAE,CAAC;QACR,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEP,EAAE,CAAC,6BAA6B,EAC5B;QACI,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAQ,EAAE,CAAC;QAChB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,UAAS,CAAM;YACzB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACV,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC;YACjB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,aAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AAEX,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/dist/test/utilTest.d.ts b/dist/test/utilTest.d.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/dist/test/utilTest.js b/dist/test/utilTest.js
deleted file mode 100644
index 2697193..0000000
--- a/dist/test/utilTest.js
+++ /dev/null
@@ -1,22 +0,0 @@
-"use strict";
-var Collections = require('../lib/index');
-var assert = require('assert');
-describe('util', function () {
- var Car = (function () {
- function Car(company, type, year) {
- this.company = company;
- this.type = type;
- this.year = year;
- }
- Car.prototype.toString = function () {
- // Short hand. Adds each own property
- return Collections.util.makeString(this);
- };
- return Car;
- }());
- it('makeString function works', function () {
- var carStringified = new Car('BMW', 'A', 2016).toString();
- assert.equal(carStringified, '{company:BMW,type:A,year:2016}');
- });
-});
-//# sourceMappingURL=utilTest.js.map
\ No newline at end of file
diff --git a/dist/test/utilTest.js.map b/dist/test/utilTest.js.map
deleted file mode 100644
index 37db05e..0000000
--- a/dist/test/utilTest.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"utilTest.js","sourceRoot":"","sources":["../../src/test/utilTest.ts"],"names":[],"mappings":";AAAA,IAAY,WAAW,WAAM,cAAc,CAAC,CAAA;AAE5C,IAAO,MAAM,WAAW,QAAQ,CAAC,CAAC;AAGlC,QAAQ,CAAC,MAAM,EACX;IAEI;QACI,aAAmB,OAAe,EAAS,IAAY,EAAS,IAAY;YAAzD,YAAO,GAAP,OAAO,CAAQ;YAAS,SAAI,GAAJ,IAAI,CAAQ;YAAS,SAAI,GAAJ,IAAI,CAAQ;QAC5E,CAAC;QACD,sBAAQ,GAAR;YACI,sCAAsC;YACtC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QACL,UAAC;IAAD,CAAC,AAPD,IAOC;IAED,EAAE,CAAC,2BAA2B,EAC1B;QACI,IAAI,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE1D,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACX,CAAC,CAAC,CAAC"}
\ No newline at end of file
diff --git a/package.json b/package.json
index 55d8f47..ced4105 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "typescript-collections",
- "version": "1.1.9",
+ "version": "1.2.0",
"description": "A complete, fully tested data structure library written in TypeScript.",
"main": "./dist/lib/umd.js",
"jsnext:main": "dist/lib/index.js",
diff --git a/src/lib/MultiRootTree.ts b/src/lib/MultiRootTree.ts
index 7661f9b..5059bb3 100644
--- a/src/lib/MultiRootTree.ts
+++ b/src/lib/MultiRootTree.ts
@@ -1,11 +1,18 @@
-export enum Direction {
+enum Direction {
BEFORE,
AFTER,
INSIDE_AT_END,
INSIDE_AT_START,
}
+export interface FlatTreeNode {
+ id: string;
+ level: number;
+ hasParent: boolean;
+ childrenCount: number;
+}
+
export default class MultiRootTree {
rootIds: Array;
@@ -14,8 +21,34 @@ export default class MultiRootTree {
constructor(rootIds: Array = [], nodes: { [id: string]: Array } = {}) {
this.rootIds = rootIds;
this.nodes = nodes;
+
+ this.initRootIds();
+ this.initNodes();
+ }
+
+ initRootIds() {
+ for (let rootId of this.rootIds) {
+ this.createEmptyNodeIfNotExist(rootId);
+ }
}
+ initNodes() {
+ for (let nodeKey in this.nodes) {
+ if (this.nodes.hasOwnProperty(nodeKey)) {
+ for (let nodeListItem of this.nodes[nodeKey]) {
+ this.createEmptyNodeIfNotExist(nodeListItem);
+ }
+ }
+ }
+ }
+
+ createEmptyNodeIfNotExist(nodeKey: string) {
+ if (!this.nodes[nodeKey]) {
+ this.nodes[nodeKey] = [];
+ }
+ }
+
+
getRootIds() {
let clone = this.rootIds.slice();
return clone;
@@ -39,6 +72,59 @@ export default class MultiRootTree {
};
}
+ toObject() {
+ return this.getObject();
+ }
+
+ flatten(): Array {
+ const _this = this;
+ let extraPropsObject: Array = [];
+
+ for (let i = 0; i < this.rootIds.length; i++) {
+ const rootId = this.rootIds[i];
+ extraPropsObject.push({
+ id: rootId,
+ level: 0,
+ hasParent: false,
+ childrenCount: undefined,
+ });
+
+ traverse(rootId, this.nodes, extraPropsObject, 0);
+ }
+
+ for (let o of extraPropsObject) {
+ o.childrenCount = countChildren(o.id);
+ }
+
+ return extraPropsObject;
+
+ function countChildren(id: string) {
+ if (!_this.nodes[id]) {
+ return 0;
+ } else {
+ const childrenCount = _this.nodes[id].length;
+ return childrenCount;
+ }
+ }
+
+ function traverse(startId: string, nodes: { [id: string]: Array }, returnArray: Array, level = 0) {
+ if (!startId || !nodes || !returnArray || !nodes[startId]) {
+ return;
+ }
+
+ level++;
+
+ let idsList = nodes[startId];
+ for (let i = 0; i < idsList.length; i++) {
+ let id = idsList[i];
+ returnArray.push({ id, level, hasParent: true });
+ traverse(id, nodes, returnArray, level);
+ }
+
+ level--;
+ }
+ }
+
moveIdBeforeId(moveId: string, beforeId: string) {
return this.moveId(moveId, beforeId, Direction.BEFORE);
}
diff --git a/src/test/multiRootTreeTest.ts b/src/test/multiRootTreeTest.ts
index e0e86a9..95484c8 100644
--- a/src/test/multiRootTreeTest.ts
+++ b/src/test/multiRootTreeTest.ts
@@ -654,6 +654,51 @@ describe('Multi Root Tree', function () {
});
});
+
+ it('Can flatten a tree', function () {
+ tree.insertIdIntoRoot('1');
+ tree.insertIdIntoRoot('2');
+
+ tree.insertIdIntoNode('1', '1.1');
+ tree.insertIdIntoNode('1.1', '1.1.1');
+ tree.insertIdIntoNode('1.1', '1.1.2');
+
+ const nodes = tree.flatten();
+
+ expect(nodes).to.deep.equal([
+ {
+ id: '1',
+ level: 0,
+ hasParent: false,
+ childrenCount: 1,
+ },
+ {
+ id: '1.1',
+ level: 1,
+ hasParent: true,
+ childrenCount: 2,
+ },
+ {
+ id: '1.1.1',
+ level: 2,
+ hasParent: true,
+ childrenCount: 0,
+ }, {
+ id: '1.1.2',
+ level: 2,
+ hasParent: true,
+ childrenCount: 0,
+ },
+ {
+ id: '2',
+ level: 0,
+ hasParent: false,
+ childrenCount: 0,
+ },
+ ]);
+ });
+
+
});