UNPKG

js-angusj-clipper

Version:

Polygon and line clipping and offsetting library for Javascript / Typescript - a port of Angus Johnson's clipper to WebAssembly / Asm.JS

146 lines 16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PolyNode = void 0; var PathToNativePath_1 = require("./native/PathToNativePath"); /** * PolyNodes are encapsulated within a PolyTree container, and together provide a data structure representing the parent-child relationships of polygon * contours returned by clipping/ofsetting methods. * * A PolyNode object represents a single polygon. It's isHole property indicates whether it's an outer or a hole. PolyNodes may own any number of PolyNode * children (childs), where children of outer polygons are holes, and children of holes are (nested) outer polygons. */ var PolyNode = /** @class */ (function () { function PolyNode() { this._childs = []; this._contour = []; this._isOpen = false; this._index = 0; } Object.defineProperty(PolyNode.prototype, "parent", { /** * Returns the parent PolyNode. * * The PolyTree object (which is also a PolyNode) does not have a parent and will return undefined. */ get: function () { return this._parent; }, enumerable: false, configurable: true }); Object.defineProperty(PolyNode.prototype, "childs", { /** * A read-only list of PolyNode. * Outer PolyNode childs contain hole PolyNodes, and hole PolyNode childs contain nested outer PolyNodes. */ get: function () { return this._childs; }, enumerable: false, configurable: true }); Object.defineProperty(PolyNode.prototype, "contour", { /** * Returns a path list which contains any number of vertices. */ get: function () { return this._contour; }, enumerable: false, configurable: true }); Object.defineProperty(PolyNode.prototype, "isOpen", { /** * Returns true when the PolyNode's Contour results from a clipping operation on an open contour (path). Only top-level PolyNodes can contain open contours. */ get: function () { return this._isOpen; }, enumerable: false, configurable: true }); Object.defineProperty(PolyNode.prototype, "index", { /** * Index in the parent's child list, or 0 if no parent. */ get: function () { return this._index; }, enumerable: false, configurable: true }); Object.defineProperty(PolyNode.prototype, "isHole", { /** * Returns true when the PolyNode's polygon (Contour) is a hole. * * Children of outer polygons are always holes, and children of holes are always (nested) outer polygons. * The isHole property of a PolyTree object is undefined but its children are always top-level outer polygons. * * @return {boolean} */ get: function () { if (this._isHole === undefined) { var result = true; var node = this._parent; while (node !== undefined) { result = !result; node = node._parent; } this._isHole = result; } return this._isHole; }, enumerable: false, configurable: true }); /** * The returned PolyNode will be the first child if any, otherwise the next sibling, otherwise the next sibling of the Parent etc. * * A PolyTree can be traversed very easily by calling GetFirst() followed by GetNext() in a loop until the returned object is undefined. * * @return {PolyNode | undefined} */ PolyNode.prototype.getNext = function () { if (this._childs.length > 0) { return this._childs[0]; } else { return this.getNextSiblingUp(); } }; PolyNode.prototype.getNextSiblingUp = function () { if (this._parent === undefined) { return undefined; } else if (this._index === this._parent._childs.length - 1) { //noinspection TailRecursionJS return this._parent.getNextSiblingUp(); } else { return this._parent._childs[this._index + 1]; } }; PolyNode.fillFromNativePolyNode = function (pn, nativeLib, nativePolyNode, parent, childIndex, freeNativePolyNode) { pn._parent = parent; var childs = nativePolyNode.childs; for (var i = 0, max = childs.size(); i < max; i++) { var newChild = PolyNode.fromNativePolyNode(nativeLib, childs.get(i), pn, i, freeNativePolyNode); pn._childs.push(newChild); } // do we need to clear the object ourselves? for now let's assume so (seems to work) pn._contour = PathToNativePath_1.nativePathToPath(nativeLib, nativePolyNode.contour, true); pn._isOpen = nativePolyNode.isOpen(); pn._index = childIndex; if (freeNativePolyNode) { nativePolyNode.delete(); } }; PolyNode.fromNativePolyNode = function (nativeLib, nativePolyNode, parent, childIndex, freeNativePolyNode) { var pn = new PolyNode(); PolyNode.fillFromNativePolyNode(pn, nativeLib, nativePolyNode, parent, childIndex, freeNativePolyNode); return pn; }; return PolyNode; }()); exports.PolyNode = PolyNode; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9seU5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUG9seU5vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsOERBQTZEO0FBRzdEOzs7Ozs7R0FNRztBQUNIO0lBOEZFO1FBbEZVLFlBQU8sR0FBZSxFQUFFLENBQUM7UUFTekIsYUFBUSxHQUFpQixFQUFFLENBQUM7UUFRNUIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQVF6QixXQUFNLEdBQVcsQ0FBQyxDQUFDO0lBeURKLENBQUM7SUF0RjFCLHNCQUFJLDRCQUFNO1FBTFY7Ozs7V0FJRzthQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7OztPQUFBO0lBT0Qsc0JBQUksNEJBQU07UUFKVjs7O1dBR0c7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQU1ELHNCQUFJLDZCQUFPO1FBSFg7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN2QixDQUFDOzs7T0FBQTtJQU1ELHNCQUFJLDRCQUFNO1FBSFY7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQU1ELHNCQUFJLDJCQUFLO1FBSFQ7O1dBRUc7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDOzs7T0FBQTtJQVdELHNCQUFJLDRCQUFNO1FBUlY7Ozs7Ozs7V0FPRzthQUNIO1lBQ0UsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtnQkFDOUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNsQixJQUFJLElBQUksR0FBeUIsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDOUMsT0FBTyxJQUFJLEtBQUssU0FBUyxFQUFFO29CQUN6QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7b0JBQ2pCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2lCQUNyQjtnQkFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzthQUN2QjtZQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQUVEOzs7Ozs7T0FNRztJQUNILDBCQUFPLEdBQVA7UUFDRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRVMsbUNBQWdCLEdBQTFCO1FBQ0UsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUM5QixPQUFPLFNBQVMsQ0FBQztTQUNsQjthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFELDhCQUE4QjtZQUM5QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN4QzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzlDO0lBQ0gsQ0FBQztJQUlnQiwrQkFBc0IsR0FBdkMsVUFDRSxFQUFZLEVBQ1osU0FBbUMsRUFDbkMsY0FBOEIsRUFDOUIsTUFBNEIsRUFDNUIsVUFBa0IsRUFDbEIsa0JBQTJCO1FBRTNCLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXBCLElBQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pELElBQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FDMUMsU0FBUyxFQUNULE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQ2IsRUFBRSxFQUNGLENBQUMsRUFDRCxrQkFBa0IsQ0FDbkIsQ0FBQztZQUNGLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzNCO1FBRUQsb0ZBQW9GO1FBQ3BGLEVBQUUsQ0FBQyxRQUFRLEdBQUcsbUNBQWdCLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEUsRUFBRSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckMsRUFBRSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFFdkIsSUFBSSxrQkFBa0IsRUFBRTtZQUN0QixjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRWdCLDJCQUFrQixHQUFuQyxVQUNFLFNBQW1DLEVBQ25DLGNBQThCLEVBQzlCLE1BQTRCLEVBQzVCLFVBQWtCLEVBQ2xCLGtCQUEyQjtRQUUzQixJQUFNLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzFCLFFBQVEsQ0FBQyxzQkFBc0IsQ0FDN0IsRUFBRSxFQUNGLFNBQVMsRUFDVCxjQUFjLEVBQ2QsTUFBTSxFQUNOLFVBQVUsRUFDVixrQkFBa0IsQ0FDbkIsQ0FBQztRQUNGLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNILGVBQUM7QUFBRCxDQUFDLEFBbEpELElBa0pDO0FBbEpZLDRCQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmF0aXZlQ2xpcHBlckxpYkluc3RhbmNlIH0gZnJvbSBcIi4vbmF0aXZlL05hdGl2ZUNsaXBwZXJMaWJJbnN0YW5jZVwiO1xyXG5pbXBvcnQgeyBOYXRpdmVQb2x5Tm9kZSB9IGZyb20gXCIuL25hdGl2ZS9OYXRpdmVQb2x5Tm9kZVwiO1xyXG5pbXBvcnQgeyBuYXRpdmVQYXRoVG9QYXRoIH0gZnJvbSBcIi4vbmF0aXZlL1BhdGhUb05hdGl2ZVBhdGhcIjtcclxuaW1wb3J0IHsgUmVhZG9ubHlQYXRoIH0gZnJvbSBcIi4vUGF0aFwiO1xyXG5cclxuLyoqXHJcbiAqIFBvbHlOb2RlcyBhcmUgZW5jYXBzdWxhdGVkIHdpdGhpbiBhIFBvbHlUcmVlIGNvbnRhaW5lciwgYW5kIHRvZ2V0aGVyIHByb3ZpZGUgYSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIG9mIHBvbHlnb25cclxuICogY29udG91cnMgcmV0dXJuZWQgYnkgY2xpcHBpbmcvb2ZzZXR0aW5nIG1ldGhvZHMuXHJcbiAqXHJcbiAqIEEgUG9seU5vZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBzaW5nbGUgcG9seWdvbi4gSXQncyBpc0hvbGUgcHJvcGVydHkgaW5kaWNhdGVzIHdoZXRoZXIgaXQncyBhbiBvdXRlciBvciBhIGhvbGUuIFBvbHlOb2RlcyBtYXkgb3duIGFueSBudW1iZXIgb2YgUG9seU5vZGVcclxuICogY2hpbGRyZW4gKGNoaWxkcyksIHdoZXJlIGNoaWxkcmVuIG9mIG91dGVyIHBvbHlnb25zIGFyZSBob2xlcywgYW5kIGNoaWxkcmVuIG9mIGhvbGVzIGFyZSAobmVzdGVkKSBvdXRlciBwb2x5Z29ucy5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBQb2x5Tm9kZSB7XHJcbiAgcHJvdGVjdGVkIF9wYXJlbnQ/OiBQb2x5Tm9kZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgcGFyZW50IFBvbHlOb2RlLlxyXG4gICAqXHJcbiAgICogVGhlIFBvbHlUcmVlIG9iamVjdCAod2hpY2ggaXMgYWxzbyBhIFBvbHlOb2RlKSBkb2VzIG5vdCBoYXZlIGEgcGFyZW50IGFuZCB3aWxsIHJldHVybiB1bmRlZmluZWQuXHJcbiAgICovXHJcbiAgZ2V0IHBhcmVudCgpOiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jaGlsZHM6IFBvbHlOb2RlW10gPSBbXTtcclxuICAvKipcclxuICAgKiBBIHJlYWQtb25seSBsaXN0IG9mIFBvbHlOb2RlLlxyXG4gICAqIE91dGVyIFBvbHlOb2RlIGNoaWxkcyBjb250YWluIGhvbGUgUG9seU5vZGVzLCBhbmQgaG9sZSBQb2x5Tm9kZSBjaGlsZHMgY29udGFpbiBuZXN0ZWQgb3V0ZXIgUG9seU5vZGVzLlxyXG4gICAqL1xyXG4gIGdldCBjaGlsZHMoKTogUG9seU5vZGVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9jb250b3VyOiBSZWFkb25seVBhdGggPSBbXTtcclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgcGF0aCBsaXN0IHdoaWNoIGNvbnRhaW5zIGFueSBudW1iZXIgb2YgdmVydGljZXMuXHJcbiAgICovXHJcbiAgZ2V0IGNvbnRvdXIoKTogUmVhZG9ubHlQYXRoIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250b3VyO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9pc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgUG9seU5vZGUncyBDb250b3VyIHJlc3VsdHMgZnJvbSBhIGNsaXBwaW5nIG9wZXJhdGlvbiBvbiBhbiBvcGVuIGNvbnRvdXIgKHBhdGgpLiBPbmx5IHRvcC1sZXZlbCBQb2x5Tm9kZXMgY2FuIGNvbnRhaW4gb3BlbiBjb250b3Vycy5cclxuICAgKi9cclxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfaW5kZXg6IG51bWJlciA9IDA7XHJcbiAgLyoqXHJcbiAgICogSW5kZXggaW4gdGhlIHBhcmVudCdzIGNoaWxkIGxpc3QsIG9yIDAgaWYgbm8gcGFyZW50LlxyXG4gICAqL1xyXG4gIGdldCBpbmRleCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9pc0hvbGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBQb2x5Tm9kZSdzIHBvbHlnb24gKENvbnRvdXIpIGlzIGEgaG9sZS5cclxuICAgKlxyXG4gICAqIENoaWxkcmVuIG9mIG91dGVyIHBvbHlnb25zIGFyZSBhbHdheXMgaG9sZXMsIGFuZCBjaGlsZHJlbiBvZiBob2xlcyBhcmUgYWx3YXlzIChuZXN0ZWQpIG91dGVyIHBvbHlnb25zLlxyXG4gICAqIFRoZSBpc0hvbGUgcHJvcGVydHkgb2YgYSBQb2x5VHJlZSBvYmplY3QgaXMgdW5kZWZpbmVkIGJ1dCBpdHMgY2hpbGRyZW4gYXJlIGFsd2F5cyB0b3AtbGV2ZWwgb3V0ZXIgcG9seWdvbnMuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xyXG4gIGdldCBpc0hvbGUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5faXNIb2xlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHRydWU7XHJcbiAgICAgIGxldCBub2RlOiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCA9IHRoaXMuX3BhcmVudDtcclxuICAgICAgd2hpbGUgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJlc3VsdCA9ICFyZXN1bHQ7XHJcbiAgICAgICAgbm9kZSA9IG5vZGUuX3BhcmVudDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pc0hvbGUgPSByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2lzSG9sZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSByZXR1cm5lZCBQb2x5Tm9kZSB3aWxsIGJlIHRoZSBmaXJzdCBjaGlsZCBpZiBhbnksIG90aGVyd2lzZSB0aGUgbmV4dCBzaWJsaW5nLCBvdGhlcndpc2UgdGhlIG5leHQgc2libGluZyBvZiB0aGUgUGFyZW50IGV0Yy5cclxuICAgKlxyXG4gICAqIEEgUG9seVRyZWUgY2FuIGJlIHRyYXZlcnNlZCB2ZXJ5IGVhc2lseSBieSBjYWxsaW5nIEdldEZpcnN0KCkgZm9sbG93ZWQgYnkgR2V0TmV4dCgpIGluIGEgbG9vcCB1bnRpbCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIHVuZGVmaW5lZC5cclxuICAgKlxyXG4gICAqIEByZXR1cm4ge1BvbHlOb2RlIHwgdW5kZWZpbmVkfVxyXG4gICAqL1xyXG4gIGdldE5leHQoKTogUG9seU5vZGUgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuX2NoaWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jaGlsZHNbMF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXROZXh0U2libGluZ1VwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0TmV4dFNpYmxpbmdVcCgpOiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5fcGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5faW5kZXggPT09IHRoaXMuX3BhcmVudC5fY2hpbGRzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgLy9ub2luc3BlY3Rpb24gVGFpbFJlY3Vyc2lvbkpTXHJcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuZ2V0TmV4dFNpYmxpbmdVcCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudC5fY2hpbGRzW3RoaXMuX2luZGV4ICsgMV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICBwcm90ZWN0ZWQgc3RhdGljIGZpbGxGcm9tTmF0aXZlUG9seU5vZGUoXHJcbiAgICBwbjogUG9seU5vZGUsXHJcbiAgICBuYXRpdmVMaWI6IE5hdGl2ZUNsaXBwZXJMaWJJbnN0YW5jZSxcclxuICAgIG5hdGl2ZVBvbHlOb2RlOiBOYXRpdmVQb2x5Tm9kZSxcclxuICAgIHBhcmVudDogUG9seU5vZGUgfCB1bmRlZmluZWQsXHJcbiAgICBjaGlsZEluZGV4OiBudW1iZXIsXHJcbiAgICBmcmVlTmF0aXZlUG9seU5vZGU6IGJvb2xlYW5cclxuICApOiB2b2lkIHtcclxuICAgIHBuLl9wYXJlbnQgPSBwYXJlbnQ7XHJcblxyXG4gICAgY29uc3QgY2hpbGRzID0gbmF0aXZlUG9seU5vZGUuY2hpbGRzO1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIG1heCA9IGNoaWxkcy5zaXplKCk7IGkgPCBtYXg7IGkrKykge1xyXG4gICAgICBjb25zdCBuZXdDaGlsZCA9IFBvbHlOb2RlLmZyb21OYXRpdmVQb2x5Tm9kZShcclxuICAgICAgICBuYXRpdmVMaWIsXHJcbiAgICAgICAgY2hpbGRzLmdldChpKSxcclxuICAgICAgICBwbixcclxuICAgICAgICBpLFxyXG4gICAgICAgIGZyZWVOYXRpdmVQb2x5Tm9kZVxyXG4gICAgICApO1xyXG4gICAgICBwbi5fY2hpbGRzLnB1c2gobmV3Q2hpbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGRvIHdlIG5lZWQgdG8gY2xlYXIgdGhlIG9iamVjdCBvdXJzZWx2ZXM/IGZvciBub3cgbGV0J3MgYXNzdW1lIHNvIChzZWVtcyB0byB3b3JrKVxyXG4gICAgcG4uX2NvbnRvdXIgPSBuYXRpdmVQYXRoVG9QYXRoKG5hdGl2ZUxpYiwgbmF0aXZlUG9seU5vZGUuY29udG91ciwgdHJ1ZSk7XHJcbiAgICBwbi5faXNPcGVuID0gbmF0aXZlUG9seU5vZGUuaXNPcGVuKCk7XHJcbiAgICBwbi5faW5kZXggPSBjaGlsZEluZGV4O1xyXG5cclxuICAgIGlmIChmcmVlTmF0aXZlUG9seU5vZGUpIHtcclxuICAgICAgbmF0aXZlUG9seU5vZGUuZGVsZXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3RhdGljIGZyb21OYXRpdmVQb2x5Tm9kZShcclxuICAgIG5hdGl2ZUxpYjogTmF0aXZlQ2xpcHBlckxpYkluc3RhbmNlLFxyXG4gICAgbmF0aXZlUG9seU5vZGU6IE5hdGl2ZVBvbHlOb2RlLFxyXG4gICAgcGFyZW50OiBQb2x5Tm9kZSB8IHVuZGVmaW5lZCxcclxuICAgIGNoaWxkSW5kZXg6IG51bWJlcixcclxuICAgIGZyZWVOYXRpdmVQb2x5Tm9kZTogYm9vbGVhblxyXG4gICk6IFBvbHlOb2RlIHtcclxuICAgIGNvbnN0IHBuID0gbmV3IFBvbHlOb2RlKCk7XHJcbiAgICBQb2x5Tm9kZS5maWxsRnJvbU5hdGl2ZVBvbHlOb2RlKFxyXG4gICAgICBwbixcclxuICAgICAgbmF0aXZlTGliLFxyXG4gICAgICBuYXRpdmVQb2x5Tm9kZSxcclxuICAgICAgcGFyZW50LFxyXG4gICAgICBjaGlsZEluZGV4LFxyXG4gICAgICBmcmVlTmF0aXZlUG9seU5vZGVcclxuICAgICk7XHJcbiAgICByZXR1cm4gcG47XHJcbiAgfVxyXG59XHJcbiJdfQ==