gridstack 8.2.1 → 8.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/angular/README.md +21 -21
- package/angular/package.json +1 -1
- package/angular/projects/demo/src/app/app.component.ts +2 -3
- package/angular/projects/lib/package.json +1 -1
- package/angular/projects/lib/src/lib/base-widget.ts +1 -1
- package/angular/projects/lib/src/lib/gridstack-item.component.ts +1 -1
- package/angular/projects/lib/src/lib/gridstack.component.ts +1 -1
- package/angular/projects/lib/src/lib/gridstack.module.ts +1 -1
- package/dist/angular/README.md +21 -21
- package/dist/angular/esm2020/lib/base-widget.mjs +2 -2
- package/dist/angular/esm2020/lib/gridstack-item.component.mjs +2 -2
- package/dist/angular/esm2020/lib/gridstack.component.mjs +2 -2
- package/dist/angular/esm2020/lib/gridstack.module.mjs +2 -2
- package/dist/angular/fesm2015/gridstack-angular.mjs +4 -4
- package/dist/angular/fesm2015/gridstack-angular.mjs.map +1 -1
- package/dist/angular/fesm2020/gridstack-angular.mjs +4 -4
- package/dist/angular/fesm2020/gridstack-angular.mjs.map +1 -1
- package/dist/angular/lib/gridstack-item.component.d.ts +1 -1
- package/dist/angular/lib/gridstack.component.d.ts +1 -1
- package/dist/angular/package.json +1 -1
- package/dist/angular/src/base-widget.ts +1 -1
- package/dist/angular/src/gridstack-item.component.ts +1 -1
- package/dist/angular/src/gridstack.component.ts +1 -1
- package/dist/angular/src/gridstack.module.ts +1 -1
- package/dist/dd-base-impl.d.ts +1 -1
- package/dist/dd-base-impl.js +1 -1
- package/dist/dd-base-impl.js.map +1 -1
- package/dist/dd-draggable.d.ts +1 -1
- package/dist/dd-draggable.js +1 -2
- package/dist/dd-draggable.js.map +1 -1
- package/dist/dd-droppable.d.ts +1 -1
- package/dist/dd-droppable.js +1 -1
- package/dist/dd-droppable.js.map +1 -1
- package/dist/dd-element.d.ts +1 -1
- package/dist/dd-element.js +1 -1
- package/dist/dd-element.js.map +1 -1
- package/dist/dd-gridstack.d.ts +1 -1
- package/dist/dd-gridstack.js +1 -1
- package/dist/dd-gridstack.js.map +1 -1
- package/dist/dd-manager.d.ts +1 -1
- package/dist/dd-manager.js +1 -1
- package/dist/dd-manager.js.map +1 -1
- package/dist/dd-resizable-handle.d.ts +1 -1
- package/dist/dd-resizable-handle.js +1 -1
- package/dist/dd-resizable-handle.js.map +1 -1
- package/dist/dd-resizable.d.ts +1 -1
- package/dist/dd-resizable.js +1 -1
- package/dist/dd-resizable.js.map +1 -1
- package/dist/dd-touch.d.ts +1 -1
- package/dist/dd-touch.js +1 -1
- package/dist/dd-touch.js.map +1 -1
- package/dist/es5/dd-base-impl.d.ts +1 -1
- package/dist/es5/dd-base-impl.js +1 -1
- package/dist/es5/dd-base-impl.js.map +1 -1
- package/dist/es5/dd-draggable.d.ts +1 -1
- package/dist/es5/dd-draggable.js +1 -2
- package/dist/es5/dd-draggable.js.map +1 -1
- package/dist/es5/dd-droppable.d.ts +1 -1
- package/dist/es5/dd-droppable.js +1 -1
- package/dist/es5/dd-droppable.js.map +1 -1
- package/dist/es5/dd-element.d.ts +1 -1
- package/dist/es5/dd-element.js +1 -1
- package/dist/es5/dd-element.js.map +1 -1
- package/dist/es5/dd-gridstack.d.ts +1 -1
- package/dist/es5/dd-gridstack.js +1 -1
- package/dist/es5/dd-gridstack.js.map +1 -1
- package/dist/es5/dd-manager.d.ts +1 -1
- package/dist/es5/dd-manager.js +1 -1
- package/dist/es5/dd-manager.js.map +1 -1
- package/dist/es5/dd-resizable-handle.d.ts +1 -1
- package/dist/es5/dd-resizable-handle.js +1 -1
- package/dist/es5/dd-resizable-handle.js.map +1 -1
- package/dist/es5/dd-resizable.d.ts +1 -1
- package/dist/es5/dd-resizable.js +1 -1
- package/dist/es5/dd-resizable.js.map +1 -1
- package/dist/es5/dd-touch.d.ts +1 -1
- package/dist/es5/dd-touch.js +1 -1
- package/dist/es5/dd-touch.js.map +1 -1
- package/dist/es5/gridstack-all.js +1 -3
- package/dist/es5/gridstack-all.js.LICENSE.txt +1 -1
- package/dist/es5/gridstack-all.js.map +1 -1
- package/dist/es5/gridstack-engine.d.ts +1 -1
- package/dist/es5/gridstack-engine.js +1 -1
- package/dist/es5/gridstack-engine.js.map +1 -1
- package/dist/es5/gridstack-poly.js +1 -1
- package/dist/es5/gridstack.d.ts +4 -4
- package/dist/es5/gridstack.js +41 -43
- package/dist/es5/gridstack.js.map +1 -1
- package/dist/es5/types.d.ts +1 -1
- package/dist/es5/types.js +1 -1
- package/dist/es5/types.js.map +1 -1
- package/dist/es5/utils.d.ts +1 -1
- package/dist/es5/utils.js +3 -3
- package/dist/es5/utils.js.map +1 -1
- package/dist/gridstack-all.js +1 -3
- package/dist/gridstack-all.js.LICENSE.txt +1 -1
- package/dist/gridstack-all.js.map +1 -1
- package/dist/gridstack-engine.d.ts +1 -1
- package/dist/gridstack-engine.js +1 -1
- package/dist/gridstack-engine.js.map +1 -1
- package/dist/gridstack.css +11 -8
- package/dist/gridstack.d.ts +4 -4
- package/dist/gridstack.js +40 -43
- package/dist/gridstack.js.map +1 -1
- package/dist/gridstack.min.css +1 -1
- package/dist/src/gridstack.scss +12 -11
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +3 -3
- package/dist/utils.js.map +1 -1
- package/doc/CHANGES.md +7 -0
- package/package.json +1 -1
|
@@ -1,3 +1 @@
|
|
|
1
|
-
/*! For license information please see gridstack-all.js.LICENSE.txt */
|
|
2
|
-
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.GridStack=e():t.GridStack=e()}(self,(function(){return function(){"use strict";var t={74:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.DDBaseImplement=void 0;var i=function(){function t(){this._eventRegister={}}return Object.defineProperty(t.prototype,"disabled",{get:function(){return this._disabled},enumerable:!1,configurable:!0}),t.prototype.on=function(t,e){this._eventRegister[t]=e},t.prototype.off=function(t){delete this._eventRegister[t]},t.prototype.enable=function(){this._disabled=!1},t.prototype.disable=function(){this._disabled=!0},t.prototype.destroy=function(){delete this._eventRegister},t.prototype.triggerEvent=function(t,e){if(!this.disabled&&this._eventRegister&&this._eventRegister[t])return this._eventRegister[t](e)},t}();e.DDBaseImplement=i},366:function(t,e,i){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function i(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)});Object.defineProperty(e,"__esModule",{value:!0}),e.DDDraggable=void 0;var r=i(839),s=i(867),a=i(74),l=i(537);e.DDDraggable=function(t){function e(e,i){void 0===i&&(i={});var o=t.call(this)||this;o.el=e,o.option=i;var n=i.handle.substring(1);return o.dragEl=e.classList.contains(n)?e:e.querySelector(i.handle)||e,o._mouseDown=o._mouseDown.bind(o),o._mouseMove=o._mouseMove.bind(o),o._mouseUp=o._mouseUp.bind(o),o.enable(),o}return n(e,t),e.prototype.on=function(e,i){t.prototype.on.call(this,e,i)},e.prototype.off=function(e){t.prototype.off.call(this,e)},e.prototype.enable=function(){!1!==this.disabled&&(t.prototype.enable.call(this),this.dragEl.addEventListener("mousedown",this._mouseDown),l.isTouch&&(this.dragEl.addEventListener("touchstart",l.touchstart),this.dragEl.addEventListener("pointerdown",l.pointerdown)),this.el.classList.remove("ui-draggable-disabled"))},e.prototype.disable=function(e){void 0===e&&(e=!1),!0!==this.disabled&&(t.prototype.disable.call(this),this.dragEl.removeEventListener("mousedown",this._mouseDown),l.isTouch&&(this.dragEl.removeEventListener("touchstart",l.touchstart),this.dragEl.removeEventListener("pointerdown",l.pointerdown)),e||this.el.classList.add("ui-draggable-disabled"))},e.prototype.destroy=function(){this.dragTimeout&&window.clearTimeout(this.dragTimeout),delete this.dragTimeout,this.dragging&&this._mouseUp(this.mouseDownEvent),this.disable(!0),delete this.el,delete this.helper,delete this.option,t.prototype.destroy.call(this)},e.prototype.updateOption=function(t){var e=this;return Object.keys(t).forEach((function(i){return e.option[i]=t[i]})),this},e.prototype._mouseDown=function(t){if(!r.DDManager.mouseHandled)return 0!==t.button||t.target.closest('input,textarea,button,select,option,[contenteditable="true"],.ui-resizable-handle')||this.option.cancel&&t.target.closest(this.option.cancel)||(this.mouseDownEvent=t,delete this.dragging,delete r.DDManager.dragElement,delete r.DDManager.dropElement,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp,!0),l.isTouch&&(this.dragEl.addEventListener("touchmove",l.touchmove),this.dragEl.addEventListener("touchend",l.touchend)),t.preventDefault(),document.activeElement&&document.activeElement.blur(),r.DDManager.mouseHandled=!0),!0},e.prototype._callDrag=function(t){if(this.dragging){var e=s.Utils.initEvent(t,{target:this.el,type:"drag"});this.option.drag&&this.option.drag(e,this.ui()),this.triggerEvent("drag",e)}},e.prototype._mouseMove=function(t){var e,i=this,o=this.mouseDownEvent;if(this.dragging)if(this._dragFollow(t),r.DDManager.pauseDrag){var n=Number.isInteger(r.DDManager.pauseDrag)?r.DDManager.pauseDrag:100;this.dragTimeout&&window.clearTimeout(this.dragTimeout),this.dragTimeout=window.setTimeout((function(){return i._callDrag(t)}),n)}else this._callDrag(t);else if(Math.abs(t.x-o.x)+Math.abs(t.y-o.y)>3){this.dragging=!0,r.DDManager.dragElement=this;var a=null===(e=this.el.gridstackNode)||void 0===e?void 0:e.grid;a?r.DDManager.dropElement=a.el.ddElement.ddDroppable:delete r.DDManager.dropElement,this.helper=this._createHelper(t),this._setupHelperContainmentStyle(),this.dragOffset=this._getDragOffset(t,this.el,this.helperContainment);var l=s.Utils.initEvent(t,{target:this.el,type:"dragstart"});this._setupHelperStyle(t),this.option.start&&this.option.start(l,this.ui()),this.triggerEvent("dragstart",l)}return t.preventDefault(),!0},e.prototype._mouseUp=function(t){var e;if(document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),l.isTouch&&(this.dragEl.removeEventListener("touchmove",l.touchmove,!0),this.dragEl.removeEventListener("touchend",l.touchend,!0)),this.dragging){delete this.dragging,(null===(e=r.DDManager.dropElement)||void 0===e?void 0:e.el)===this.el.parentElement&&delete r.DDManager.dropElement,this.helperContainment.style.position=this.parentOriginStylePosition||null,this.helper===this.el?this._removeHelperStyle():this.helper.remove();var i=s.Utils.initEvent(t,{target:this.el,type:"dragstop"});this.option.stop&&this.option.stop(i),this.triggerEvent("dragstop",i),r.DDManager.dropElement&&r.DDManager.dropElement.drop(t)}delete this.helper,delete this.mouseDownEvent,delete r.DDManager.dragElement,delete r.DDManager.dropElement,delete r.DDManager.mouseHandled,t.preventDefault()},e.prototype._createHelper=function(t){var i=this,o=this.el;return"function"==typeof this.option.helper?o=this.option.helper(t):"clone"===this.option.helper&&(o=s.Utils.cloneNode(this.el)),document.body.contains(o)||s.Utils.appendTo(o,"parent"===this.option.appendTo?this.el.parentElement:this.option.appendTo),o===this.el&&(this.dragElementOriginStyle=e.originStyleProp.map((function(t){return i.el.style[t]}))),o},e.prototype._setupHelperStyle=function(t){var e=this;this.helper.classList.add("ui-draggable-dragging");var i=this.helper.style;return i.pointerEvents="none",i["min-width"]=0,i.width=this.dragOffset.width+"px",i.height=this.dragOffset.height+"px",i.willChange="left, top",i.position="fixed",this._dragFollow(t),i.transition="none",setTimeout((function(){e.helper&&(i.transition=null)}),0),this},e.prototype._removeHelperStyle=function(){var t,i=this;this.helper.classList.remove("ui-draggable-dragging");var o=null===(t=this.helper)||void 0===t?void 0:t.gridstackNode;if(!(null==o?void 0:o._isAboutToRemove)&&this.dragElementOriginStyle){var n=this.helper,r=this.dragElementOriginStyle.transition||null;n.style.transition=this.dragElementOriginStyle.transition="none",e.originStyleProp.forEach((function(t){return n.style[t]=i.dragElementOriginStyle[t]||null})),setTimeout((function(){return n.style.transition=r}),50)}return delete this.dragElementOriginStyle,this},e.prototype._dragFollow=function(t){var e=this.helper.style,i=this.dragOffset;e.left=t.clientX+i.offsetLeft-0+"px",e.top=t.clientY+i.offsetTop-0+"px"},e.prototype._setupHelperContainmentStyle=function(){return this.helperContainment=this.helper.parentElement,"fixed"!==this.helper.style.position&&(this.parentOriginStylePosition=this.helperContainment.style.position,window.getComputedStyle(this.helperContainment).position.match(/static/)&&(this.helperContainment.style.position="relative")),this},e.prototype._getDragOffset=function(t,e,i){var o=0,n=0;if(i){var r=document.createElement("div");s.Utils.addElStyles(r,{opacity:"0",position:"fixed",top:"0px",left:"0px",width:"1px",height:"1px",zIndex:"-999999"}),i.appendChild(r);var a=r.getBoundingClientRect();i.removeChild(r),o=a.left,n=a.top}var l=e.getBoundingClientRect();return{left:l.left,top:l.top,offsetLeft:-t.clientX+l.left-o,offsetTop:-t.clientY+l.top-n,width:l.width,height:l.height}},e.prototype.ui=function(){var t=this.el.parentElement.getBoundingClientRect(),e=this.helper.getBoundingClientRect();return{position:{top:e.top-t.top,left:e.left-t.left}}},e.originStyleProp=["transition","pointerEvents","position","left","top","minWidth","willChange"],e}(a.DDBaseImplement)},677:function(t,e,i){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function i(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}),r=this&&this.__assign||function(){return r=Object.assign||function(t){for(var e,i=1,o=arguments.length;i<o;i++)for(var n in e=arguments[i])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},r.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.DDDroppable=void 0;var s=i(839),a=i(74),l=i(867),d=i(537),h=function(t){function e(e,i){void 0===i&&(i={});var o=t.call(this)||this;return o.el=e,o.option=i,o._mouseEnter=o._mouseEnter.bind(o),o._mouseLeave=o._mouseLeave.bind(o),o.enable(),o._setupAccept(),o}return n(e,t),e.prototype.on=function(e,i){t.prototype.on.call(this,e,i)},e.prototype.off=function(e){t.prototype.off.call(this,e)},e.prototype.enable=function(){!1!==this.disabled&&(t.prototype.enable.call(this),this.el.classList.add("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),this.el.addEventListener("mouseenter",this._mouseEnter),this.el.addEventListener("mouseleave",this._mouseLeave),d.isTouch&&(this.el.addEventListener("pointerenter",d.pointerenter),this.el.addEventListener("pointerleave",d.pointerleave)))},e.prototype.disable=function(e){void 0===e&&(e=!1),!0!==this.disabled&&(t.prototype.disable.call(this),this.el.classList.remove("ui-droppable"),e||this.el.classList.add("ui-droppable-disabled"),this.el.removeEventListener("mouseenter",this._mouseEnter),this.el.removeEventListener("mouseleave",this._mouseLeave),d.isTouch&&(this.el.removeEventListener("pointerenter",d.pointerenter),this.el.removeEventListener("pointerleave",d.pointerleave)))},e.prototype.destroy=function(){this.disable(!0),this.el.classList.remove("ui-droppable"),this.el.classList.remove("ui-droppable-disabled"),t.prototype.destroy.call(this)},e.prototype.updateOption=function(t){var e=this;return Object.keys(t).forEach((function(i){return e.option[i]=t[i]})),this._setupAccept(),this},e.prototype._mouseEnter=function(t){if(s.DDManager.dragElement&&this._canDrop(s.DDManager.dragElement.el)){t.preventDefault(),t.stopPropagation(),s.DDManager.dropElement&&s.DDManager.dropElement!==this&&s.DDManager.dropElement._mouseLeave(t),s.DDManager.dropElement=this;var e=l.Utils.initEvent(t,{target:this.el,type:"dropover"});this.option.over&&this.option.over(e,this._ui(s.DDManager.dragElement)),this.triggerEvent("dropover",e),this.el.classList.add("ui-droppable-over")}},e.prototype._mouseLeave=function(t){var e;if(s.DDManager.dragElement&&s.DDManager.dropElement===this){t.preventDefault(),t.stopPropagation();var i=l.Utils.initEvent(t,{target:this.el,type:"dropout"});if(this.option.out&&this.option.out(i,this._ui(s.DDManager.dragElement)),this.triggerEvent("dropout",i),s.DDManager.dropElement===this){delete s.DDManager.dropElement;for(var o=void 0,n=this.el.parentElement;!o&&n;)o=null===(e=n.ddElement)||void 0===e?void 0:e.ddDroppable,n=n.parentElement;o&&o._mouseEnter(t)}}},e.prototype.drop=function(t){t.preventDefault();var e=l.Utils.initEvent(t,{target:this.el,type:"drop"});this.option.drop&&this.option.drop(e,this._ui(s.DDManager.dragElement)),this.triggerEvent("drop",e)},e.prototype._canDrop=function(t){return t&&(!this.accept||this.accept(t))},e.prototype._setupAccept=function(){var t=this;return this.option.accept?("string"==typeof this.option.accept?this.accept=function(e){return e.matches(t.option.accept)}:this.accept=this.option.accept,this):this},e.prototype._ui=function(t){return r({draggable:t.el},t.ui())},e}(a.DDBaseImplement);e.DDDroppable=h},259:function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.DDElement=void 0;var o=i(904),n=i(366),r=i(677),s=function(){function t(t){this.el=t}return t.init=function(e){return e.ddElement||(e.ddElement=new t(e)),e.ddElement},t.prototype.on=function(t,e){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(t)>-1?this.ddDraggable.on(t,e):this.ddDroppable&&["drop","dropover","dropout"].indexOf(t)>-1?this.ddDroppable.on(t,e):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(t)>-1&&this.ddResizable.on(t,e),this},t.prototype.off=function(t){return this.ddDraggable&&["drag","dragstart","dragstop"].indexOf(t)>-1?this.ddDraggable.off(t):this.ddDroppable&&["drop","dropover","dropout"].indexOf(t)>-1?this.ddDroppable.off(t):this.ddResizable&&["resizestart","resize","resizestop"].indexOf(t)>-1&&this.ddResizable.off(t),this},t.prototype.setupDraggable=function(t){return this.ddDraggable?this.ddDraggable.updateOption(t):this.ddDraggable=new n.DDDraggable(this.el,t),this},t.prototype.cleanDraggable=function(){return this.ddDraggable&&(this.ddDraggable.destroy(),delete this.ddDraggable),this},t.prototype.setupResizable=function(t){return this.ddResizable?this.ddResizable.updateOption(t):this.ddResizable=new o.DDResizable(this.el,t),this},t.prototype.cleanResizable=function(){return this.ddResizable&&(this.ddResizable.destroy(),delete this.ddResizable),this},t.prototype.setupDroppable=function(t){return this.ddDroppable?this.ddDroppable.updateOption(t):this.ddDroppable=new r.DDDroppable(this.el,t),this},t.prototype.cleanDroppable=function(){return this.ddDroppable&&(this.ddDroppable.destroy(),delete this.ddDroppable),this},t}();e.DDElement=s},502:function(t,e,i){var o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,i=1,o=arguments.length;i<o;i++)for(var n in e=arguments[i])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},o.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.DDGridStack=void 0;var n=i(867),r=i(839),s=i(259),a=function(){function t(){}return t.prototype.resizable=function(t,e,i,n){return this._getDDElements(t).forEach((function(t){var r;if("disable"===e||"enable"===e)t.ddResizable&&t.ddResizable[e]();else if("destroy"===e)t.ddResizable&&t.cleanResizable();else if("option"===e)t.setupResizable(((r={})[i]=n,r));else{var s=t.el.gridstackNode.grid,a=t.el.getAttribute("gs-resize-handles")?t.el.getAttribute("gs-resize-handles"):s.opts.resizable.handles,l=!s.opts.alwaysShowResizeHandle;t.setupResizable(o(o(o({},s.opts.resizable),{handles:a,autoHide:l}),{start:e.start,stop:e.stop,resize:e.resize}))}})),this},t.prototype.draggable=function(t,e,i,n){return this._getDDElements(t).forEach((function(t){var r;if("disable"===e||"enable"===e)t.ddDraggable&&t.ddDraggable[e]();else if("destroy"===e)t.ddDraggable&&t.cleanDraggable();else if("option"===e)t.setupDraggable(((r={})[i]=n,r));else{var s=t.el.gridstackNode.grid;t.setupDraggable(o(o({},s.opts.draggable),{start:e.start,stop:e.stop,drag:e.drag}))}})),this},t.prototype.dragIn=function(t,e){return this._getDDElements(t).forEach((function(t){return t.setupDraggable(e)})),this},t.prototype.droppable=function(t,e,i,o){return"function"!=typeof e.accept||e._accept||(e._accept=e.accept,e.accept=function(t){return e._accept(t)}),this._getDDElements(t).forEach((function(t){var n;"disable"===e||"enable"===e?t.ddDroppable&&t.ddDroppable[e]():"destroy"===e?t.ddDroppable&&t.cleanDroppable():"option"===e?t.setupDroppable(((n={})[i]=o,n)):t.setupDroppable(e)})),this},t.prototype.isDroppable=function(t){return!(!(t&&t.ddElement&&t.ddElement.ddDroppable)||t.ddElement.ddDroppable.disabled)},t.prototype.isDraggable=function(t){return!(!(t&&t.ddElement&&t.ddElement.ddDraggable)||t.ddElement.ddDraggable.disabled)},t.prototype.isResizable=function(t){return!(!(t&&t.ddElement&&t.ddElement.ddResizable)||t.ddElement.ddResizable.disabled)},t.prototype.on=function(t,e,i){return this._getDDElements(t).forEach((function(t){return t.on(e,(function(t){i(t,r.DDManager.dragElement?r.DDManager.dragElement.el:t.target,r.DDManager.dragElement?r.DDManager.dragElement.helper:null)}))})),this},t.prototype.off=function(t,e){return this._getDDElements(t).forEach((function(t){return t.off(e)})),this},t.prototype._getDDElements=function(t,e){void 0===e&&(e=!0);var i=n.Utils.getElements(t);if(!i.length)return[];var o=i.map((function(t){return t.ddElement||(e?s.DDElement.init(t):null)}));return e||o.filter((function(t){return t})),o},t}();e.DDGridStack=a},839:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.DDManager=void 0;e.DDManager=function(){}},664:function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.DDResizableHandle=void 0;var o=i(537);e.DDResizableHandle=function(){function t(t,e,i){this.moving=!1,this.host=t,this.dir=e,this.option=i,this._mouseDown=this._mouseDown.bind(this),this._mouseMove=this._mouseMove.bind(this),this._mouseUp=this._mouseUp.bind(this),this._init()}return t.prototype._init=function(){var e=document.createElement("div");return e.classList.add("ui-resizable-handle"),e.classList.add("".concat(t.prefix).concat(this.dir)),e.style.zIndex="100",e.style.userSelect="none",this.el=e,this.host.appendChild(this.el),this.el.addEventListener("mousedown",this._mouseDown),o.isTouch&&(this.el.addEventListener("touchstart",o.touchstart),this.el.addEventListener("pointerdown",o.pointerdown)),this},t.prototype.destroy=function(){return this.moving&&this._mouseUp(this.mouseDownEvent),this.el.removeEventListener("mousedown",this._mouseDown),o.isTouch&&(this.el.removeEventListener("touchstart",o.touchstart),this.el.removeEventListener("pointerdown",o.pointerdown)),this.host.removeChild(this.el),delete this.el,delete this.host,this},t.prototype._mouseDown=function(t){this.mouseDownEvent=t,document.addEventListener("mousemove",this._mouseMove,!0),document.addEventListener("mouseup",this._mouseUp,!0),o.isTouch&&(this.el.addEventListener("touchmove",o.touchmove),this.el.addEventListener("touchend",o.touchend)),t.stopPropagation(),t.preventDefault()},t.prototype._mouseMove=function(t){var e=this.mouseDownEvent;this.moving?this._triggerEvent("move",t):Math.abs(t.x-e.x)+Math.abs(t.y-e.y)>2&&(this.moving=!0,this._triggerEvent("start",this.mouseDownEvent),this._triggerEvent("move",t)),t.stopPropagation(),t.preventDefault()},t.prototype._mouseUp=function(t){this.moving&&this._triggerEvent("stop",t),document.removeEventListener("mousemove",this._mouseMove,!0),document.removeEventListener("mouseup",this._mouseUp,!0),o.isTouch&&(this.el.removeEventListener("touchmove",o.touchmove),this.el.removeEventListener("touchend",o.touchend)),delete this.moving,delete this.mouseDownEvent,t.stopPropagation(),t.preventDefault()},t.prototype._triggerEvent=function(t,e){return this.option[t]&&this.option[t](e),this},t.prefix="ui-resizable-",t}()},904:function(t,e,i){var o,n=this&&this.__extends||(o=function(t,e){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i])},o(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function i(){this.constructor=t}o(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)});Object.defineProperty(e,"__esModule",{value:!0}),e.DDResizable=void 0;var r=i(664),s=i(74),a=i(867),l=i(839);e.DDResizable=function(t){function e(e,i){void 0===i&&(i={});var o=t.call(this)||this;return o._ui=function(){var t=o.el.parentElement.getBoundingClientRect(),e={width:o.originalRect.width,height:o.originalRect.height+o.scrolled,left:o.originalRect.left,top:o.originalRect.top-o.scrolled},i=o.temporalRect||e;return{position:{left:i.left-t.left,top:i.top-t.top},size:{width:i.width,height:i.height}}},o.el=e,o.option=i,o._mouseOver=o._mouseOver.bind(o),o._mouseOut=o._mouseOut.bind(o),o.enable(),o._setupAutoHide(o.option.autoHide),o._setupHandlers(),o}return n(e,t),e.prototype.on=function(e,i){t.prototype.on.call(this,e,i)},e.prototype.off=function(e){t.prototype.off.call(this,e)},e.prototype.enable=function(){t.prototype.enable.call(this),this.el.classList.remove("ui-resizable-disabled"),this._setupAutoHide(this.option.autoHide)},e.prototype.disable=function(){t.prototype.disable.call(this),this.el.classList.add("ui-resizable-disabled"),this._setupAutoHide(!1)},e.prototype.destroy=function(){this._removeHandlers(),this._setupAutoHide(!1),delete this.el,t.prototype.destroy.call(this)},e.prototype.updateOption=function(t){var e=this,i=t.handles&&t.handles!==this.option.handles,o=t.autoHide&&t.autoHide!==this.option.autoHide;return Object.keys(t).forEach((function(i){return e.option[i]=t[i]})),i&&(this._removeHandlers(),this._setupHandlers()),o&&this._setupAutoHide(this.option.autoHide),this},e.prototype._setupAutoHide=function(t){return t?(this.el.classList.add("ui-resizable-autohide"),this.el.addEventListener("mouseover",this._mouseOver),this.el.addEventListener("mouseout",this._mouseOut)):(this.el.classList.remove("ui-resizable-autohide"),this.el.removeEventListener("mouseover",this._mouseOver),this.el.removeEventListener("mouseout",this._mouseOut),l.DDManager.overResizeElement===this&&delete l.DDManager.overResizeElement),this},e.prototype._mouseOver=function(t){l.DDManager.overResizeElement||l.DDManager.dragElement||(l.DDManager.overResizeElement=this,this.el.classList.remove("ui-resizable-autohide"))},e.prototype._mouseOut=function(t){l.DDManager.overResizeElement===this&&(delete l.DDManager.overResizeElement,this.el.classList.add("ui-resizable-autohide"))},e.prototype._setupHandlers=function(){var t=this,e=this.option.handles||"e,s,se";return"all"===e&&(e="n,e,s,w,se,sw,ne,nw"),this.handlers=e.split(",").map((function(t){return t.trim()})).map((function(e){return new r.DDResizableHandle(t.el,e,{start:function(e){t._resizeStart(e)},stop:function(e){t._resizeStop(e)},move:function(i){t._resizing(i,e)}})})),this},e.prototype._resizeStart=function(t){this.originalRect=this.el.getBoundingClientRect(),this.scrollEl=a.Utils.getScrollElement(this.el),this.scrollY=this.scrollEl.scrollTop,this.scrolled=0,this.startEvent=t,this._setupHelper(),this._applyChange();var e=a.Utils.initEvent(t,{type:"resizestart",target:this.el});return this.option.start&&this.option.start(e,this._ui()),this.el.classList.add("ui-resizable-resizing"),this.triggerEvent("resizestart",e),this},e.prototype._resizing=function(t,e){this.scrolled=this.scrollEl.scrollTop-this.scrollY,this.temporalRect=this._getChange(t,e),this._applyChange();var i=a.Utils.initEvent(t,{type:"resize",target:this.el});return this.option.resize&&this.option.resize(i,this._ui()),this.triggerEvent("resize",i),this},e.prototype._resizeStop=function(t){var e=a.Utils.initEvent(t,{type:"resizestop",target:this.el});return this.option.stop&&this.option.stop(e),this.el.classList.remove("ui-resizable-resizing"),this.triggerEvent("resizestop",e),this._cleanHelper(),delete this.startEvent,delete this.originalRect,delete this.temporalRect,delete this.scrollY,delete this.scrolled,this},e.prototype._setupHelper=function(){var t=this;return this.elOriginStyleVal=e._originStyleProp.map((function(e){return t.el.style[e]})),this.parentOriginStylePosition=this.el.parentElement.style.position,window.getComputedStyle(this.el.parentElement).position.match(/static/)&&(this.el.parentElement.style.position="relative"),this.el.style.position="absolute",this.el.style.opacity="0.8",this},e.prototype._cleanHelper=function(){var t=this;return e._originStyleProp.forEach((function(e,i){t.el.style[e]=t.elOriginStyleVal[i]||null})),this.el.parentElement.style.position=this.parentOriginStylePosition||null,this},e.prototype._getChange=function(t,e){var i=this.startEvent,o={width:this.originalRect.width,height:this.originalRect.height+this.scrolled,left:this.originalRect.left,top:this.originalRect.top-this.scrolled},n=t.clientX-i.clientX,r=t.clientY-i.clientY;e.indexOf("e")>-1?o.width+=n:e.indexOf("w")>-1&&(o.width-=n,o.left+=n),e.indexOf("s")>-1?o.height+=r:e.indexOf("n")>-1&&(o.height-=r,o.top+=r);var s=this._constrainSize(o.width,o.height);return Math.round(o.width)!==Math.round(s.width)&&(e.indexOf("w")>-1&&(o.left+=o.width-s.width),o.width=s.width),Math.round(o.height)!==Math.round(s.height)&&(e.indexOf("n")>-1&&(o.top+=o.height-s.height),o.height=s.height),o},e.prototype._constrainSize=function(t,e){var i=this.option.maxWidth||Number.MAX_SAFE_INTEGER,o=this.option.minWidth||t,n=this.option.maxHeight||Number.MAX_SAFE_INTEGER,r=this.option.minHeight||e;return{width:Math.min(i,Math.max(o,t)),height:Math.min(n,Math.max(r,e))}},e.prototype._applyChange=function(){var t,e=this,i={left:0,top:0,width:0,height:0};if("absolute"===this.el.style.position){var o=(t=this.el.parentElement.getBoundingClientRect()).left,n=t.top;i={left:o,top:n,width:0,height:0}}return this.temporalRect?(Object.keys(this.temporalRect).forEach((function(t){var o=e.temporalRect[t];e.el.style[t]=o-i[t]+"px"})),this):this},e.prototype._removeHandlers=function(){return this.handlers.forEach((function(t){return t.destroy()})),delete this.handlers,this},e._originStyleProp=["width","height","position","left","top","opacity","zIndex"],e}(s.DDBaseImplement)},537:function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0}),e.pointerleave=e.pointerenter=e.pointerdown=e.touchend=e.touchmove=e.touchstart=e.isTouch=void 0;var o=i(839);e.isTouch="undefined"!=typeof window&&"undefined"!=typeof document&&("ontouchstart"in document||"ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0);var n=function(){};function r(t,e){if(!(t.touches.length>1)){t.cancelable&&t.preventDefault();var i=t.changedTouches[0],o=document.createEvent("MouseEvents");o.initMouseEvent(e,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(o)}}function s(t,e){t.cancelable&&t.preventDefault();var i=document.createEvent("MouseEvents");i.initMouseEvent(e,!0,!0,window,1,t.screenX,t.screenY,t.clientX,t.clientY,!1,!1,!1,!1,0,null),t.target.dispatchEvent(i)}e.touchstart=function(t){n.touchHandled||(n.touchHandled=!0,r(t,"mousedown"))},e.touchmove=function(t){n.touchHandled&&r(t,"mousemove")},e.touchend=function(t){if(n.touchHandled){n.pointerLeaveTimeout&&(window.clearTimeout(n.pointerLeaveTimeout),delete n.pointerLeaveTimeout);var e=!!o.DDManager.dragElement;r(t,"mouseup"),e||r(t,"click"),n.touchHandled=!1}},e.pointerdown=function(t){t.target.releasePointerCapture(t.pointerId)},e.pointerenter=function(t){o.DDManager.dragElement&&s(t,"mouseenter")},e.pointerleave=function(t){o.DDManager.dragElement&&(n.pointerLeaveTimeout=window.setTimeout((function(){delete n.pointerLeaveTimeout,s(t,"mouseleave")}),10))}},506:function(t,e,i){var o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,i=1,o=arguments.length;i<o;i++)for(var n in e=arguments[i])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},o.apply(this,arguments)};Object.defineProperty(e,"__esModule",{value:!0}),e.GridStackEngine=void 0;var n=i(867);e.GridStackEngine=function(){function t(t){void 0===t&&(t={}),this.addedNodes=[],this.removedNodes=[],this.column=t.column||12,this.maxRow=t.maxRow,this._float=t.float,this.nodes=t.nodes||[],this.onChange=t.onChange}return t.prototype.batchUpdate=function(t){return void 0===t&&(t=!0),!!this.batchMode===t||(this.batchMode=t,t?(this._prevFloat=this._float,this._float=!0,this.saveInitial()):(this._float=this._prevFloat,delete this._prevFloat,this._packNodes()._notify())),this},t.prototype._useEntireRowArea=function(t,e){return(!this.float||this.batchMode&&!this._prevFloat)&&!this._hasLocked&&(!t._moving||t._skipDown||e.y<=t.y)},t.prototype._fixCollisions=function(t,e,i,r){if(void 0===e&&(e=t),void 0===r&&(r={}),this.sortNodes(-1),!(i=i||this.collide(t,e)))return!1;if(t._moving&&!r.nested&&!this.float&&this.swap(t,i))return!0;var s=e;this._useEntireRowArea(t,e)&&(s={x:0,w:this.column,y:e.y,h:e.h},i=this.collide(t,s,r.skip));for(var a=!1,l={nested:!0,pack:!1};i=i||this.collide(t,s,r.skip);){var d=void 0;if(i.locked||t._moving&&!t._skipDown&&e.y>t.y&&!this.float&&(!this.collide(i,o(o({},i),{y:t.y}),t)||!this.collide(i,o(o({},i),{y:e.y-i.h}),t))?(t._skipDown=t._skipDown||e.y>t.y,d=this.moveNode(t,o(o(o({},e),{y:i.y+i.h}),l)),i.locked&&d?n.Utils.copyPos(e,t):!i.locked&&d&&r.pack&&(this._packNodes(),e.y=i.y+i.h,n.Utils.copyPos(t,e)),a=a||d):d=this.moveNode(i,o(o(o({},i),{y:e.y+e.h,skip:t}),l)),!d)return a;i=void 0}return a},t.prototype.collide=function(t,e,i){void 0===e&&(e=t);var o=t._id,r=null==i?void 0:i._id;return this.nodes.find((function(t){return t._id!==o&&t._id!==r&&n.Utils.isIntercepted(t,e)}))},t.prototype.collideAll=function(t,e,i){void 0===e&&(e=t);var o=t._id,r=null==i?void 0:i._id;return this.nodes.filter((function(t){return t._id!==o&&t._id!==r&&n.Utils.isIntercepted(t,e)}))},t.prototype.directionCollideCoverage=function(t,e,i){if(e.rect&&t._rect){var n,r=t._rect,s=o({},e.rect);return s.y>r.y?(s.h+=s.y-r.y,s.y=r.y):s.h+=r.y-s.y,s.x>r.x?(s.w+=s.x-r.x,s.x=r.x):s.w+=r.x-s.x,i.forEach((function(t){if(!t.locked&&t._rect){var e=t._rect,i=Number.MAX_VALUE,o=Number.MAX_VALUE,a=.5;r.y<e.y?i=(s.y+s.h-e.y)/e.h:r.y+r.h>e.y+e.h&&(i=(e.y+e.h-s.y)/e.h),r.x<e.x?o=(s.x+s.w-e.x)/e.w:r.x+r.w>e.x+e.w&&(o=(e.x+e.w-s.x)/e.w);var l=Math.min(o,i);l>a&&(a=l,n=t)}})),e.collide=n,n}},t.prototype.cacheRects=function(t,e,i,o,n,r){return this.nodes.forEach((function(s){return s._rect={y:s.y*e+i,x:s.x*t+r,w:s.w*t-r-o,h:s.h*e-i-n}})),this},t.prototype.swap=function(t,e){if(!e||e.locked||!t||t.locked)return!1;function i(){var i=e.x,o=e.y;return e.x=t.x,e.y=t.y,t.h!=e.h?(t.x=i,t.y=e.y+e.h):t.w!=e.w?(t.x=e.x+e.w,t.y=o):(t.x=i,t.y=o),t._dirty=e._dirty=!0,!0}var o;if(t.w===e.w&&t.h===e.h&&(t.x===e.x||t.y===e.y)&&(o=n.Utils.isTouching(t,e)))return i();if(!1!==o){if(t.w===e.w&&t.x===e.x&&(o||(o=n.Utils.isTouching(t,e)))){if(e.y<t.y){var r=t;t=e,e=r}return i()}if(!1!==o)return!(t.h!==e.h||t.y!==e.y||!o&&!(o=n.Utils.isTouching(t,e)))&&(e.x<t.x&&(r=t,t=e,e=r),i())}},t.prototype.isAreaEmpty=function(t,e,i,o){var n={x:t||0,y:e||0,w:i||1,h:o||1};return!this.collide(n)},t.prototype.compact=function(){var t=this;if(0===this.nodes.length)return this;this.batchUpdate().sortNodes();var e=this.nodes;return this.nodes=[],e.forEach((function(e){e.locked||(e.autoPosition=!0),t.addNode(e,!1),e._dirty=!0})),this.batchUpdate(!1)},Object.defineProperty(t.prototype,"float",{get:function(){return this._float||!1},set:function(t){this._float!==t&&(this._float=t||!1,t||this._packNodes()._notify())},enumerable:!1,configurable:!0}),t.prototype.sortNodes=function(t){return this.nodes=n.Utils.sort(this.nodes,t,this.column),this},t.prototype._packNodes=function(){var t=this;return this.batchMode||(this.sortNodes(),this.float?this.nodes.forEach((function(e){if(!e._updating&&void 0!==e._orig&&e.y!==e._orig.y)for(var i=e.y;i>e._orig.y;)--i,t.collide(e,{x:e.x,y:i,w:e.w,h:e.h})||(e._dirty=!0,e.y=i)})):this.nodes.forEach((function(e,i){if(!e.locked)for(;e.y>0;){var o=0===i?0:e.y-1;if(0!==i&&t.collide(e,{x:e.x,y:o,w:e.w,h:e.h}))break;e._dirty=e.y!==o,e.y=o}}))),this},t.prototype.prepareNode=function(e,i){var o;(e=e||{})._id=null!==(o=e._id)&&void 0!==o?o:t._idSeq++,void 0!==e.x&&void 0!==e.y&&null!==e.x&&null!==e.y||(e.autoPosition=!0);var r={x:0,y:0,w:1,h:1};return n.Utils.defaults(e,r),e.autoPosition||delete e.autoPosition,e.noResize||delete e.noResize,e.noMove||delete e.noMove,n.Utils.sanitizeMinMax(e),"string"==typeof e.x&&(e.x=Number(e.x)),"string"==typeof e.y&&(e.y=Number(e.y)),"string"==typeof e.w&&(e.w=Number(e.w)),"string"==typeof e.h&&(e.h=Number(e.h)),isNaN(e.x)&&(e.x=r.x,e.autoPosition=!0),isNaN(e.y)&&(e.y=r.y,e.autoPosition=!0),isNaN(e.w)&&(e.w=r.w),isNaN(e.h)&&(e.h=r.h),this.nodeBoundFix(e,i)},t.prototype.nodeBoundFix=function(t,e){var i=t._orig||n.Utils.copyPos({},t);if(t.maxW&&(t.w=Math.min(t.w,t.maxW)),t.maxH&&(t.h=Math.min(t.h,t.maxH)),t.minW&&t.minW<=this.column&&(t.w=Math.max(t.w,t.minW)),t.minH&&(t.h=Math.max(t.h,t.minH)),(1===this.column||t.x+t.w>this.column)&&this.column<12&&!this._inColumnResize&&t._id&&-1===this.findCacheLayout(t,12)){var r=o({},t);r.autoPosition?(delete r.x,delete r.y):r.x=Math.min(11,r.x),r.w=Math.min(12,r.w),this.cacheOneLayout(r,12)}return t.w>this.column?t.w=this.column:t.w<1&&(t.w=1),this.maxRow&&t.h>this.maxRow?t.h=this.maxRow:t.h<1&&(t.h=1),t.x<0&&(t.x=0),t.y<0&&(t.y=0),t.x+t.w>this.column&&(e?t.w=this.column-t.x:t.x=this.column-t.w),this.maxRow&&t.y+t.h>this.maxRow&&(e?t.h=this.maxRow-t.y:t.y=this.maxRow-t.h),n.Utils.samePos(t,i)||(t._dirty=!0),t},t.prototype.getDirtyNodes=function(t){return t?this.nodes.filter((function(t){return t._dirty&&!n.Utils.samePos(t,t._orig)})):this.nodes.filter((function(t){return t._dirty}))},t.prototype._notify=function(t){if(this.batchMode||!this.onChange)return this;var e=(t||[]).concat(this.getDirtyNodes());return this.onChange(e),this},t.prototype.cleanNodes=function(){return this.batchMode||this.nodes.forEach((function(t){delete t._dirty,delete t._lastTried})),this},t.prototype.saveInitial=function(){return this.nodes.forEach((function(t){t._orig=n.Utils.copyPos({},t),delete t._dirty})),this._hasLocked=this.nodes.some((function(t){return t.locked})),this},t.prototype.restoreInitial=function(){return this.nodes.forEach((function(t){n.Utils.samePos(t,t._orig)||(n.Utils.copyPos(t,t._orig),t._dirty=!0)})),this._notify(),this},t.prototype.findEmptyPosition=function(t,e,i){void 0===e&&(e=this.nodes),void 0===i&&(i=this.column),e=n.Utils.sort(e,-1,i);for(var o=!1,r=function(r){var s=r%i,a=Math.floor(r/i);if(s+t.w>i)return"continue";var l={x:s,y:a,w:t.w,h:t.h};e.find((function(t){return n.Utils.isIntercepted(l,t)}))||(t.x=s,t.y=a,delete t.autoPosition,o=!0)},s=0;!o;++s)r(s);return o},t.prototype.addNode=function(t,e){return void 0===e&&(e=!1),this.nodes.find((function(e){return e._id===t._id}))||(delete(t=this._inColumnResize?this.nodeBoundFix(t):this.prepareNode(t))._temporaryRemoved,delete t._removeDOM,t.autoPosition&&this.findEmptyPosition(t)&&delete t.autoPosition,this.nodes.push(t),e&&this.addedNodes.push(t),this._fixCollisions(t),this.batchMode||this._packNodes()._notify(),t)},t.prototype.removeNode=function(t,e,i){return void 0===e&&(e=!0),void 0===i&&(i=!1),this.nodes.find((function(e){return e._id===t._id}))?(i&&this.removedNodes.push(t),e&&(t._removeDOM=!0),this.nodes=this.nodes.filter((function(e){return e._id!==t._id})),this._packNodes()._notify([t])):this},t.prototype.removeAll=function(t){return void 0===t&&(t=!0),delete this._layouts,this.nodes.length?(t&&this.nodes.forEach((function(t){return t._removeDOM=!0})),this.removedNodes=this.nodes,this.nodes=[],this._notify(this.removedNodes)):this},t.prototype.moveNodeCheck=function(e,i){var r,s=this;if(!this.changedPosConstrain(e,i))return!1;if(i.pack=!0,!this.maxRow)return this.moveNode(e,i);var a=new t({column:this.column,float:this.float,nodes:this.nodes.map((function(t){return t._id===e._id?r=o({},t):o({},t)}))});if(!r)return!1;var l=a.moveNode(r,i)&&a.getRow()<=this.maxRow;if(!l&&!i.resizing&&i.collide){var d=i.collide.el.gridstackNode;if(this.swap(e,d))return this._notify(),!0}return!!l&&(a.nodes.filter((function(t){return t._dirty})).forEach((function(t){var e=s.nodes.find((function(e){return e._id===t._id}));e&&(n.Utils.copyPos(e,t),e._dirty=!0)})),this._notify(),!0)},t.prototype.willItFit=function(e){if(delete e._willFitPos,!this.maxRow)return!0;var i=new t({column:this.column,float:this.float,nodes:this.nodes.map((function(t){return o({},t)}))}),r=o({},e);return this.cleanupNode(r),delete r.el,delete r._id,delete r.content,delete r.grid,i.addNode(r),i.getRow()<=this.maxRow&&(e._willFitPos=n.Utils.copyPos({},r),!0)},t.prototype.changedPosConstrain=function(t,e){return e.w=e.w||t.w,e.h=e.h||t.h,t.x!==e.x||t.y!==e.y||(t.maxW&&(e.w=Math.min(e.w,t.maxW)),t.maxH&&(e.h=Math.min(e.h,t.maxH)),t.minW&&(e.w=Math.max(e.w,t.minW)),t.minH&&(e.h=Math.max(e.h,t.minH)),t.w!==e.w||t.h!==e.h)},t.prototype.moveNode=function(t,e){var i,o,r;if(!t||!e)return!1;void 0===e.pack&&(r=e.pack=!0),"number"!=typeof e.x&&(e.x=t.x),"number"!=typeof e.y&&(e.y=t.y),"number"!=typeof e.w&&(e.w=t.w),"number"!=typeof e.h&&(e.h=t.h);var s=t.w!==e.w||t.h!==e.h,a=n.Utils.copyPos({},t,!0);if(n.Utils.copyPos(a,e),a=this.nodeBoundFix(a,s),n.Utils.copyPos(e,a),n.Utils.samePos(t,e))return!1;var l=n.Utils.copyPos({},t),d=this.collideAll(t,a,e.skip),h=!0;if(d.length){var u=t._moving&&!e.nested,p=u?this.directionCollideCoverage(t,e,d):d[0];if(u&&p&&(null===(o=null===(i=t.grid)||void 0===i?void 0:i.opts)||void 0===o?void 0:o.subGridDynamic)&&!t.grid._isTemp){var c=n.Utils.areaIntercept(e.rect,p._rect),g=n.Utils.area(e.rect),m=n.Utils.area(p._rect);c/(g<m?g:m)>.8&&(p.grid.makeSubGrid(p.el,void 0,t),p=void 0)}p?h=!this._fixCollisions(t,a,p,e):(h=!1,r&&delete e.pack)}return h&&(t._dirty=!0,n.Utils.copyPos(t,a)),e.pack&&this._packNodes()._notify(),!n.Utils.samePos(t,l)},t.prototype.getRow=function(){return this.nodes.reduce((function(t,e){return Math.max(t,e.y+e.h)}),0)},t.prototype.beginUpdate=function(t){return t._updating||(t._updating=!0,delete t._skipDown,this.batchMode||this.saveInitial()),this},t.prototype.endUpdate=function(){var t=this.nodes.find((function(t){return t._updating}));return t&&(delete t._updating,delete t._skipDown),this},t.prototype.save=function(t,e){var i;void 0===t&&(t=!0);var r=null===(i=this._layouts)||void 0===i?void 0:i.length,s=r&&this.column!==r-1?this._layouts[r-1]:null,a=[];return this.sortNodes(),this.nodes.forEach((function(i){var r=null==s?void 0:s.find((function(t){return t._id===i._id})),l=o({},i);r&&(l.x=r.x,l.y=r.y,l.w=r.w),n.Utils.removeInternalForSave(l,!t),e&&e(i,l),a.push(l)})),a},t.prototype.layoutsNodesChange=function(t){var e=this;return!this._layouts||this._inColumnResize||this._layouts.forEach((function(i,o){if(!i||o===e.column)return e;if(o<e.column)e._layouts[o]=void 0;else{var n=o/e.column;t.forEach((function(t){if(t._orig){var e=i.find((function(e){return e._id===t._id}));e&&(t.y!==t._orig.y&&(e.y+=t.y-t._orig.y),t.x!==t._orig.x&&(e.x=Math.round(t.x*n)),t.w!==t._orig.w&&(e.w=Math.round(t.w*n)))}}))}})),this},t.prototype.updateNodeWidths=function(t,e,i,o){var r,s=this;if(void 0===o&&(o="moveScale"),!this.nodes.length||!e||t===e)return this;this.cacheLayout(this.nodes,t),this.batchUpdate();var a=[],l=!1;if(1===e&&(null==i?void 0:i.length)){l=!0;var d=0;i.forEach((function(t){t.x=0,t.w=1,t.y=Math.max(t.y,d),d=t.y+t.h})),a=i,i=[]}else i=n.Utils.sort(this.nodes,-1,t);var h=[];if(e>t){h=this._layouts[e]||[];var u=this._layouts.length-1;!h.length&&t!==u&&(null===(r=this._layouts[u])||void 0===r?void 0:r.length)&&(t=u,this._layouts[u].forEach((function(t){var e=i.find((function(e){return e._id===t._id}));e&&(e.x=t.x,e.y=t.y,e.w=t.w)})))}if(h.forEach((function(t){var e=i.findIndex((function(e){return e._id===t._id}));-1!==e&&((t.autoPosition||isNaN(t.x)||isNaN(t.y))&&s.findEmptyPosition(t,a),t.autoPosition||(i[e].x=t.x,i[e].y=t.y,i[e].w=t.w,a.push(i[e])),i.splice(e,1))})),i.length)if("function"==typeof o)o(e,t,a,i);else if(!l){var p=e/t,c="move"===o||"moveScale"===o,g="scale"===o||"moveScale"===o;i.forEach((function(i){i.x=1===e?0:c?Math.round(i.x*p):Math.min(i.x,e-1),i.w=1===e||1===t?1:g?Math.round(i.w*p)||1:Math.min(i.w,e),a.push(i)})),i=[]}return l||(a=n.Utils.sort(a,-1,e)),this._inColumnResize=!0,this.nodes=[],a.forEach((function(t){s.addNode(t,!1),delete t._orig})),this.batchUpdate(!1),delete this._inColumnResize,this},t.prototype.cacheLayout=function(e,i,o){void 0===o&&(o=!1);var n=[];return e.forEach((function(e,i){var o;e._id=null!==(o=e._id)&&void 0!==o?o:t._idSeq++,n[i]={x:e.x,y:e.y,w:e.w,_id:e._id}})),this._layouts=o?[]:this._layouts||[],this._layouts[i]=n,this},t.prototype.cacheOneLayout=function(e,i){var o;e._id=null!==(o=e._id)&&void 0!==o?o:t._idSeq++;var n={x:e.x,y:e.y,w:e.w,_id:e._id};e.autoPosition&&(delete n.x,delete n.y,n.autoPosition=!0),this._layouts=this._layouts||[],this._layouts[i]=this._layouts[i]||[];var r=this.findCacheLayout(e,i);return-1===r?this._layouts[i].push(n):this._layouts[i][r]=n,this},t.prototype.findCacheLayout=function(t,e){var i,o,n;return null!==(n=null===(o=null===(i=this._layouts)||void 0===i?void 0:i[e])||void 0===o?void 0:o.findIndex((function(e){return e._id===t._id})))&&void 0!==n?n:-1},t.prototype.cleanupNode=function(t){for(var e in t)"_"===e[0]&&"_id"!==e&&delete t[e];return this},t._idSeq=0,t}()},324:function(t,e,i){var o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,i=1,o=arguments.length;i<o;i++)for(var n in e=arguments[i])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},o.apply(this,arguments)},n=this&&this.__createBinding||(Object.create?function(t,e,i,o){void 0===o&&(o=i);var n=Object.getOwnPropertyDescriptor(e,i);n&&!("get"in n?!e.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return e[i]}}),Object.defineProperty(t,o,n)}:function(t,e,i,o){void 0===o&&(o=i),t[o]=e[i]}),r=this&&this.__exportStar||function(t,e){for(var i in t)"default"===i||Object.prototype.hasOwnProperty.call(e,i)||n(e,t,i)},s=this&&this.__spreadArray||function(t,e,i){if(i||2===arguments.length)for(var o,n=0,r=e.length;n<r;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.GridStack=void 0;var a=i(506),l=i(867),d=i(855),h=i(502),u=i(537),p=i(839),c=new h.DDGridStack;r(i(855),e),r(i(867),e),r(i(506),e),r(i(502),e),e.GridStack=function(){function t(e,i){void 0===i&&(i={});var n,r,s=this;this._gsEventHandler={},this._extraDragRow=0,this.el=e,i=i||{},e.classList.contains("grid-stack")||this.el.classList.add("grid-stack"),i.row&&(i.minRow=i.maxRow=i.row,delete i.row);var h=l.Utils.toNumber(e.getAttribute("gs-row"));"auto"===i.column&&delete i.column,void 0!==i.alwaysShowResizeHandle&&(i._alwaysShowResizeHandle=i.alwaysShowResizeHandle);var c=o(o({},l.Utils.cloneDeep(d.gridDefaults)),{column:l.Utils.toNumber(e.getAttribute("gs-column"))||d.gridDefaults.column,minRow:h||l.Utils.toNumber(e.getAttribute("gs-min-row"))||d.gridDefaults.minRow,maxRow:h||l.Utils.toNumber(e.getAttribute("gs-max-row"))||d.gridDefaults.maxRow,staticGrid:l.Utils.toBool(e.getAttribute("gs-static"))||d.gridDefaults.staticGrid,draggable:{handle:(i.handleClass?"."+i.handleClass:i.handle?i.handle:"")||d.gridDefaults.draggable.handle},removableOptions:{accept:i.itemClass?"."+i.itemClass:d.gridDefaults.removableOptions.accept}});e.getAttribute("gs-animate")&&(c.animate=l.Utils.toBool(e.getAttribute("gs-animate"))),this.opts=l.Utils.defaults(i,c),i=null,this._initMargin(),1!==this.opts.column&&!this.opts.disableOneColumnMode&&this._widthOrContainer()<=this.opts.oneColumnSize&&(this._prevColumn=this.getColumn(),this.opts.column=1),"auto"===this.opts.rtl&&(this.opts.rtl="rtl"===e.style.direction),this.opts.rtl&&this.el.classList.add("grid-stack-rtl");var g=null===(n=l.Utils.closestUpByClass(this.el,d.gridDefaults.itemClass))||void 0===n?void 0:n.gridstackNode;g&&(g.subGrid=this,this.parentGridItem=g,this.el.classList.add("grid-stack-nested"),g.el.classList.add("grid-stack-sub-grid")),this._isAutoCellHeight="auto"===this.opts.cellHeight,this._isAutoCellHeight||"initial"===this.opts.cellHeight?this.cellHeight(void 0,!1):("number"==typeof this.opts.cellHeight&&this.opts.cellHeightUnit&&this.opts.cellHeightUnit!==d.gridDefaults.cellHeightUnit&&(this.opts.cellHeight=this.opts.cellHeight+this.opts.cellHeightUnit,delete this.opts.cellHeightUnit),this.cellHeight(this.opts.cellHeight,!1)),"mobile"===this.opts.alwaysShowResizeHandle&&(this.opts.alwaysShowResizeHandle=u.isTouch),this._styleSheetClass="gs-id-"+a.GridStackEngine._idSeq++,this.el.classList.add(this._styleSheetClass),this._setStaticClass();var m=this.opts.engineClass||t.engineClass||a.GridStackEngine;if(this.engine=new m({column:this.getColumn(),float:this.opts.float,maxRow:this.opts.maxRow,onChange:function(t){var e=0;s.engine.nodes.forEach((function(t){e=Math.max(e,t.y+t.h)})),t.forEach((function(t){var e=t.el;e&&(t._removeDOM?(e&&e.remove(),delete t._removeDOM):s._writePosAttr(e,t))})),s._updateStyles(!1,e)}}),this.opts.auto&&(this.batchUpdate(),this.getGridItems().forEach((function(t){return s._prepareElement(t)})),this.batchUpdate(!1)),this.opts.children){var f=this.opts.children;delete this.opts.children,f.length&&this.load(f)}this.setAnimation(this.opts.animate),this._updateStyles(),this.el.classList.add("gs-"+this.opts.column),this.opts.subGridDynamic&&!p.DDManager.pauseDrag&&(p.DDManager.pauseDrag=!0),void 0!==(null===(r=this.opts.draggable)||void 0===r?void 0:r.pause)&&(p.DDManager.pauseDrag=this.opts.draggable.pause),this._setupRemoveDrop(),this._setupAcceptWidget(),this._updateWindowResizeEvent()}return t.init=function(e,i){void 0===e&&(e={}),void 0===i&&(i=".grid-stack");var o=t.getGridElement(i);return o?(o.gridstack||(o.gridstack=new t(o,l.Utils.cloneDeep(e))),o.gridstack):("string"==typeof i?console.error('GridStack.initAll() no grid was found with selector "'+i+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'):console.error("GridStack.init() no grid element was passed."),null)},t.initAll=function(e,i){void 0===e&&(e={}),void 0===i&&(i=".grid-stack");var o=[];return t.getGridElements(i).forEach((function(i){i.gridstack||(i.gridstack=new t(i,l.Utils.cloneDeep(e))),o.push(i.gridstack)})),0===o.length&&console.error('GridStack.initAll() no grid was found with selector "'+i+'" - element missing or wrong selector ?\nNote: ".grid-stack" is required for proper CSS styling and drag/drop, and is the default selector.'),o},t.addGrid=function(e,i){if(void 0===i&&(i={}),!e)return null;var n=e;if(n.gridstack){var r=n.gridstack;return i&&(r.opts=o(o({},r.opts),i)),void 0!==i.children&&r.load(i.children),r}if(!e.classList.contains("grid-stack")||t.addRemoveCB)if(t.addRemoveCB)n=t.addRemoveCB(e,i,!0,!0);else{var s=document.implementation.createHTMLDocument("");s.body.innerHTML='<div class="grid-stack '.concat(i.class||"",'"></div>'),n=s.body.children[0],e.appendChild(n)}return t.init(i,n)},t.registerEngine=function(e){t.engineClass=e},Object.defineProperty(t.prototype,"placeholder",{get:function(){if(!this._placeholder){var t=document.createElement("div");t.className="placeholder-content",this.opts.placeholderText&&(t.innerHTML=this.opts.placeholderText),this._placeholder=document.createElement("div"),this._placeholder.classList.add(this.opts.placeholderClass,d.gridDefaults.itemClass,this.opts.itemClass),this.placeholder.appendChild(t)}return this._placeholder},enumerable:!1,configurable:!0}),t.prototype.addWidget=function(e,i){var o,n,r;if("string"==typeof e)(s=document.implementation.createHTMLDocument("")).body.innerHTML=e,o=s.body.children[0];else if(0===arguments.length||1===arguments.length&&(void 0!==(r=e).el||void 0!==r.x||void 0!==r.y||void 0!==r.w||void 0!==r.h||void 0!==r.content))if(null==(n=i=e)?void 0:n.el)o=n.el;else if(t.addRemoveCB)o=t.addRemoveCB(this.el,i,!0,!1);else{var s,a=(null==i?void 0:i.content)||"";(s=document.implementation.createHTMLDocument("")).body.innerHTML='<div class="grid-stack-item '.concat(this.opts.itemClass||"",'"><div class="grid-stack-item-content">').concat(a,"</div></div>"),o=s.body.children[0]}else o=e;if(o){if((n=o.gridstackNode)&&o.parentElement===this.el&&this.engine.nodes.find((function(t){return t._id===n._id})))return o;var d=this._readAttr(o);return i=l.Utils.cloneDeep(i)||{},l.Utils.defaults(i,d),n=this.engine.prepareNode(i),this._writeAttr(o,i),this._insertNotAppend?this.el.prepend(o):this.el.appendChild(o),this.makeWidget(o,i),o}},t.prototype.makeSubGrid=function(e,i,n,r){var s,a,d;void 0===r&&(r=!0);var h,u=e.gridstackNode;if(u||(u=this.makeWidget(e).gridstackNode),null===(s=u.subGrid)||void 0===s?void 0:s.el)return u.subGrid;for(var p,c=this;c&&!h;)h=null===(a=c.opts)||void 0===a?void 0:a.subGridOpts,c=null===(d=c.parentGridItem)||void 0===d?void 0:d.grid;i=l.Utils.cloneDeep(o(o(o({},h||{}),{children:void 0}),i||u.subGridOpts)),u.subGridOpts=i,"auto"===i.column&&(p=!0,i.column=Math.max(u.w||1,(null==n?void 0:n.w)||1),i.disableOneColumnMode=!0);var g,m,f=u.el.querySelector(".grid-stack-item-content");if(r){if(this._removeDD(u.el),m=o(o({},u),{x:0,y:0}),l.Utils.removeInternalForSave(m),delete m.subGridOpts,u.content&&(m.content=u.content,delete u.content),t.addRemoveCB)g=t.addRemoveCB(this.el,m,!0,!1);else{var v=document.implementation.createHTMLDocument("");v.body.innerHTML='<div class="grid-stack-item"></div>',(g=v.body.children[0]).appendChild(f),v.body.innerHTML='<div class="grid-stack-item-content"></div>',f=v.body.children[0],u.el.appendChild(f)}this._prepareDragDropByNode(u)}if(n){var y=p?i.column:u.w,_=u.h+n.h,b=u.el.style;b.transition="none",this.update(u.el,{w:y,h:_}),setTimeout((function(){return b.transition=null}))}var w=u.subGrid=t.addGrid(f,i);return(null==n?void 0:n._moving)&&(w._isTemp=!0),p&&(w._autoColumn=!0),r&&w.addWidget(g,m),n&&(n._moving?window.setTimeout((function(){return l.Utils.simulateMouseEvent(n._event,"mouseenter",w.el)}),0):w.addWidget(u.el,u)),w},t.prototype.removeAsSubGrid=function(t){var e,i=this,o=null===(e=this.parentGridItem)||void 0===e?void 0:e.grid;o&&(o.batchUpdate(),o.removeWidget(this.parentGridItem.el,!0,!0),this.engine.nodes.forEach((function(t){t.x+=i.parentGridItem.x,t.y+=i.parentGridItem.y,o.addWidget(t.el,t)})),o.batchUpdate(!1),this.parentGridItem&&delete this.parentGridItem.subGrid,delete this.parentGridItem,t&&window.setTimeout((function(){return l.Utils.simulateMouseEvent(t._event,"mouseenter",o.el)}),0))},t.prototype.save=function(e,i,o){void 0===e&&(e=!0),void 0===i&&(i=!1),void 0===o&&(o=t.saveCB);var n=this.engine.save(e,o);if(n.forEach((function(t){var n;if(e&&t.el&&!t.subGrid&&!o){var r=t.el.querySelector(".grid-stack-item-content");t.content=r?r.innerHTML:void 0,t.content||delete t.content}else if(e||o||delete t.content,null===(n=t.subGrid)||void 0===n?void 0:n.el){var s=t.subGrid.save(e,i,o);t.subGridOpts=i?s:{children:s},delete t.subGrid}delete t.el})),i){var r=l.Utils.cloneDeep(this.opts);r.marginBottom===r.marginTop&&r.marginRight===r.marginLeft&&r.marginTop===r.marginRight&&(r.margin=r.marginTop,delete r.marginTop,delete r.marginRight,delete r.marginBottom,delete r.marginLeft),r.rtl===("rtl"===this.el.style.direction)&&(r.rtl="auto"),this._isAutoCellHeight&&(r.cellHeight="auto"),this._autoColumn&&(r.column="auto",delete r.disableOneColumnMode);var s=r._alwaysShowResizeHandle;return delete r._alwaysShowResizeHandle,void 0!==s?r.alwaysShowResizeHandle=s:delete r.alwaysShowResizeHandle,l.Utils.removeInternalAndSame(r,d.gridDefaults),r.children=n,r}return n},t.prototype.load=function(e,i){var o=this;void 0===i&&(i=t.addRemoveCB||!0);var n=t.Utils.sort(s([],e,!0),-1,this._prevColumn||this.getColumn());this._insertNotAppend=!0,this._prevColumn&&this._prevColumn!==this.opts.column&&n.some((function(t){return t.x+t.w>o.opts.column}))&&(this._ignoreLayoutsNodeChange=!0,this.engine.cacheLayout(n,this._prevColumn,!0));var r=t.addRemoveCB;"function"==typeof i&&(t.addRemoveCB=i);var a=[];return this.batchUpdate(),i&&s([],this.engine.nodes,!0).forEach((function(e){n.find((function(t){return e.id===t.id}))||(t.addRemoveCB&&t.addRemoveCB(o.el,e,!1,!1),a.push(e),o.removeWidget(e.el,!0,!1))})),n.forEach((function(t){var e,n=void 0!==t.id?o.engine.nodes.find((function(e){return e.id===t.id})):void 0;if(n){if(o.update(n.el,t),null===(e=t.subGridOpts)||void 0===e?void 0:e.children){var r=n.el.querySelector(".grid-stack");r&&r.gridstack&&(r.gridstack.load(t.subGridOpts.children),o._insertNotAppend=!0)}}else i&&o.addWidget(t)})),this.engine.removedNodes=a,this.batchUpdate(!1),delete this._ignoreLayoutsNodeChange,delete this._insertNotAppend,r?t.addRemoveCB=r:delete t.addRemoveCB,this},t.prototype.batchUpdate=function(t){return void 0===t&&(t=!0),this.engine.batchUpdate(t),t||(this._triggerRemoveEvent(),this._triggerAddEvent(),this._triggerChangeEvent()),this},t.prototype.getCellHeight=function(t){if(void 0===t&&(t=!1),this.opts.cellHeight&&"auto"!==this.opts.cellHeight&&(!t||!this.opts.cellHeightUnit||"px"===this.opts.cellHeightUnit))return this.opts.cellHeight;var e=this.el.querySelector("."+this.opts.itemClass);if(e){var i=l.Utils.toNumber(e.getAttribute("gs-h"));return Math.round(e.offsetHeight/i)}var o=parseInt(this.el.getAttribute("gs-current-row"));return o?Math.round(this.el.getBoundingClientRect().height/o):this.opts.cellHeight},t.prototype.cellHeight=function(t,e){if(void 0===e&&(e=!0),e&&void 0!==t&&this._isAutoCellHeight!==("auto"===t)&&(this._isAutoCellHeight="auto"===t,this._updateWindowResizeEvent()),"initial"!==t&&"auto"!==t||(t=void 0),void 0===t){var i=-this.opts.marginRight-this.opts.marginLeft+this.opts.marginTop+this.opts.marginBottom;t=this.cellWidth()+i}var o=l.Utils.parseHeight(t);return this.opts.cellHeightUnit===o.unit&&this.opts.cellHeight===o.h||(this.opts.cellHeightUnit=o.unit,this.opts.cellHeight=o.h,e&&this._updateStyles(!0)),this},t.prototype.cellWidth=function(){return this._widthOrContainer()/this.getColumn()},t.prototype._widthOrContainer=function(){return this.el.clientWidth||this.el.parentElement.clientWidth||window.innerWidth},t.prototype.compact=function(){return this.engine.compact(),this._triggerChangeEvent(),this},t.prototype.column=function(t,e){if(void 0===e&&(e="moveScale"),t<1||this.opts.column===t)return this;var i,o=this.getColumn();return 1===t?this._prevColumn=o:delete this._prevColumn,this.el.classList.remove("gs-"+o),this.el.classList.add("gs-"+t),this.opts.column=this.engine.column=t,1===t&&this.opts.oneColumnModeDomSort&&(i=[],this.getGridItems().forEach((function(t){t.gridstackNode&&i.push(t.gridstackNode)})),i.length||(i=void 0)),this.engine.updateNodeWidths(o,t,i,e),this._isAutoCellHeight&&this.cellHeight(),this._ignoreLayoutsNodeChange=!0,this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,this},t.prototype.getColumn=function(){return this.opts.column},t.prototype.getGridItems=function(){var t=this;return Array.from(this.el.children).filter((function(e){return e.matches("."+t.opts.itemClass)&&!e.matches("."+t.opts.placeholderClass)}))},t.prototype.destroy=function(t){if(void 0===t&&(t=!0),this.el)return this.offAll(),this._updateWindowResizeEvent(!0),this.setStatic(!0,!1),this.setAnimation(!1),t?this.el.parentNode.removeChild(this.el):(this.removeAll(t),this.el.classList.remove(this._styleSheetClass),this.el.removeAttribute("gs-current-row")),this._removeStylesheet(),this.parentGridItem&&delete this.parentGridItem.subGrid,delete this.parentGridItem,delete this.opts,delete this._placeholder,delete this.engine,delete this.el.gridstack,delete this.el,this},t.prototype.float=function(t){return this.opts.float!==t&&(this.opts.float=this.engine.float=t,this._triggerChangeEvent()),this},t.prototype.getFloat=function(){return this.engine.float},t.prototype.getCellFromPixel=function(t,e){void 0===e&&(e=!1);var i,o=this.el.getBoundingClientRect();i=e?{top:o.top+document.documentElement.scrollTop,left:o.left}:{top:this.el.offsetTop,left:this.el.offsetLeft};var n=t.left-i.left,r=t.top-i.top,s=o.width/this.getColumn(),a=o.height/parseInt(this.el.getAttribute("gs-current-row"));return{x:Math.floor(n/s),y:Math.floor(r/a)}},t.prototype.getRow=function(){return Math.max(this.engine.getRow(),this.opts.minRow)},t.prototype.isAreaEmpty=function(t,e,i,o){return this.engine.isAreaEmpty(t,e,i,o)},t.prototype.makeWidget=function(e,i){var o=t.getElement(e);this._prepareElement(o,!0,i),this._updateContainerHeight();var n=o.gridstackNode;return n.subGridOpts&&this.makeSubGrid(o,n.subGridOpts,void 0,!1),this._prevColumn&&1===this.opts.column&&(this._ignoreLayoutsNodeChange=!0),this._triggerAddEvent(),this._triggerChangeEvent(),delete this._ignoreLayoutsNodeChange,o},t.prototype.on=function(t,e){var i=this;if(-1!==t.indexOf(" "))return t.split(" ").forEach((function(t){return i.on(t,e)})),this;if("change"===t||"added"===t||"removed"===t||"enable"===t||"disable"===t){var o="enable"===t||"disable"===t;this._gsEventHandler[t]=o?function(t){return e(t)}:function(t){return e(t,t.detail)},this.el.addEventListener(t,this._gsEventHandler[t])}else"drag"===t||"dragstart"===t||"dragstop"===t||"resizestart"===t||"resize"===t||"resizestop"===t||"dropped"===t?this._gsEventHandler[t]=e:console.log("GridStack.on("+t+') event not supported, but you can still use $(".grid-stack").on(...) while jquery-ui is still used internally.');return this},t.prototype.off=function(t){var e=this;return-1!==t.indexOf(" ")?(t.split(" ").forEach((function(t){return e.off(t)})),this):("change"!==t&&"added"!==t&&"removed"!==t&&"enable"!==t&&"disable"!==t||this._gsEventHandler[t]&&this.el.removeEventListener(t,this._gsEventHandler[t]),delete this._gsEventHandler[t],this)},t.prototype.offAll=function(){var t=this;return Object.keys(this._gsEventHandler).forEach((function(e){return t.off(e)})),this},t.prototype.removeWidget=function(e,i,o){var n=this;return void 0===i&&(i=!0),void 0===o&&(o=!0),t.getElements(e).forEach((function(e){if(!e.parentElement||e.parentElement===n.el){var r=e.gridstackNode;r||(r=n.engine.nodes.find((function(t){return e===t.el}))),r&&(t.addRemoveCB&&t.addRemoveCB(n.el,r,!1,!1),delete e.gridstackNode,n._removeDD(e),n.engine.removeNode(r,i,o),i&&e.parentElement&&e.remove())}})),o&&(this._triggerRemoveEvent(),this._triggerChangeEvent()),this},t.prototype.removeAll=function(t){var e=this;return void 0===t&&(t=!0),this.engine.nodes.forEach((function(t){delete t.el.gridstackNode,e._removeDD(t.el)})),this.engine.removeAll(t),this._triggerRemoveEvent(),this},t.prototype.setAnimation=function(t){return t?this.el.classList.add("grid-stack-animate"):this.el.classList.remove("grid-stack-animate"),this},t.prototype.setStatic=function(t,e,i){var o=this;return void 0===e&&(e=!0),void 0===i&&(i=!0),this.opts.staticGrid===t||(this.opts.staticGrid=t,this._setupRemoveDrop(),this._setupAcceptWidget(),this.engine.nodes.forEach((function(n){o._prepareDragDropByNode(n),n.subGrid&&i&&n.subGrid.setStatic(t,e,i)})),e&&this._setStaticClass()),this},t.prototype.update=function(e,i){var o=this;if(arguments.length>2){console.warn("gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update(el, {x, w, content, ...})`. It will be removed soon");var n=arguments,r=1;return i={x:n[r++],y:n[r++],w:n[r++],h:n[r++]},this.update(e,i)}return t.getElements(e).forEach((function(t){if(t&&t.gridstackNode){var e=t.gridstackNode,n=l.Utils.cloneDeep(i);delete n.autoPosition;var r,s=["x","y","w","h"];if(s.some((function(t){return void 0!==n[t]&&n[t]!==e[t]}))&&(r={},s.forEach((function(t){r[t]=void 0!==n[t]?n[t]:e[t],delete n[t]}))),!r&&(n.minW||n.minH||n.maxW||n.maxH)&&(r={}),n.content){var a=t.querySelector(".grid-stack-item-content");a&&a.innerHTML!==n.content&&(a.innerHTML=n.content),delete n.content}var d=!1,h=!1;for(var u in n)"_"!==u[0]&&e[u]!==n[u]&&(e[u]=n[u],d=!0,h=h||!o.opts.staticGrid&&("noResize"===u||"noMove"===u||"locked"===u));l.Utils.sanitizeMinMax(e),r&&(o.engine.cleanNodes().beginUpdate(e).moveNode(e,r),o._updateContainerHeight(),o._triggerChangeEvent(),o.engine.endUpdate()),d&&o._writeAttr(t,e),h&&o._prepareDragDropByNode(e)}})),this},t.prototype.margin=function(t){if(!("string"==typeof t&&t.split(" ").length>1)){var e=l.Utils.parseHeight(t);if(this.opts.marginUnit===e.unit&&this.opts.margin===e.h)return}return this.opts.margin=t,this.opts.marginTop=this.opts.marginBottom=this.opts.marginLeft=this.opts.marginRight=void 0,this._initMargin(),this._updateStyles(!0),this},t.prototype.getMargin=function(){return this.opts.margin},t.prototype.willItFit=function(t){if(arguments.length>1){console.warn("gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon");var e=arguments,i=0,o={x:e[i++],y:e[i++],w:e[i++],h:e[i++],autoPosition:e[i++]};return this.willItFit(o)}return this.engine.willItFit(t)},t.prototype._triggerChangeEvent=function(){if(this.engine.batchMode)return this;var t=this.engine.getDirtyNodes(!0);return t&&t.length&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(t),this._triggerEvent("change",t)),this.engine.saveInitial(),this},t.prototype._triggerAddEvent=function(){var t;return this.engine.batchMode||(null===(t=this.engine.addedNodes)||void 0===t?void 0:t.length)&&(this._ignoreLayoutsNodeChange||this.engine.layoutsNodesChange(this.engine.addedNodes),this.engine.addedNodes.forEach((function(t){delete t._dirty})),this._triggerEvent("added",this.engine.addedNodes),this.engine.addedNodes=[]),this},t.prototype._triggerRemoveEvent=function(){var t;return this.engine.batchMode||(null===(t=this.engine.removedNodes)||void 0===t?void 0:t.length)&&(this._triggerEvent("removed",this.engine.removedNodes),this.engine.removedNodes=[]),this},t.prototype._triggerEvent=function(t,e){var i=e?new CustomEvent(t,{bubbles:!1,detail:e}):new Event(t);return this.el.dispatchEvent(i),this},t.prototype._removeStylesheet=function(){return this._styles&&(l.Utils.removeStylesheet(this._styleSheetClass),delete this._styles),this},t.prototype._updateStyles=function(t,e){if(void 0===t&&(t=!1),t&&this._removeStylesheet(),e||(e=this.getRow()),this._updateContainerHeight(),0===this.opts.cellHeight)return this;var i=this.opts.cellHeight,o=this.opts.cellHeightUnit,n=".".concat(this._styleSheetClass," > .").concat(this.opts.itemClass);if(!this._styles){var r=this.opts.styleInHead?void 0:this.el.parentNode;if(this._styles=l.Utils.createStylesheet(this._styleSheetClass,r,{nonce:this.opts.nonce}),!this._styles)return this;this._styles._max=0,l.Utils.addCSSRule(this._styles,n,"height: ".concat(i).concat(o));var s=this.opts.marginTop+this.opts.marginUnit,a=this.opts.marginBottom+this.opts.marginUnit,d=this.opts.marginRight+this.opts.marginUnit,h=this.opts.marginLeft+this.opts.marginUnit,u="".concat(n," > .grid-stack-item-content"),p=".".concat(this._styleSheetClass," > .grid-stack-placeholder > .placeholder-content");l.Utils.addCSSRule(this._styles,u,"top: ".concat(s,"; right: ").concat(d,"; bottom: ").concat(a,"; left: ").concat(h,";")),l.Utils.addCSSRule(this._styles,p,"top: ".concat(s,"; right: ").concat(d,"; bottom: ").concat(a,"; left: ").concat(h,";")),l.Utils.addCSSRule(this._styles,"".concat(n," > .ui-resizable-ne"),"right: ".concat(d)),l.Utils.addCSSRule(this._styles,"".concat(n," > .ui-resizable-e"),"right: ".concat(d)),l.Utils.addCSSRule(this._styles,"".concat(n," > .ui-resizable-se"),"right: ".concat(d,"; bottom: ").concat(a)),l.Utils.addCSSRule(this._styles,"".concat(n," > .ui-resizable-nw"),"left: ".concat(h)),l.Utils.addCSSRule(this._styles,"".concat(n," > .ui-resizable-w"),"left: ".concat(h)),l.Utils.addCSSRule(this._styles,"".concat(n," > .ui-resizable-sw"),"left: ".concat(h,"; bottom: ").concat(a))}if((e=e||this._styles._max)>this._styles._max){for(var c=function(t){return i*t+o},g=this._styles._max+1;g<=e;g++)l.Utils.addCSSRule(this._styles,"".concat(n,'[gs-y="').concat(g,'"]'),"top: ".concat(c(g))),l.Utils.addCSSRule(this._styles,"".concat(n,'[gs-h="').concat(g+1,'"]'),"height: ".concat(c(g+1)));this._styles._max=e}return this},t.prototype._updateContainerHeight=function(){if(!this.engine||this.engine.batchMode)return this;var t=this.getRow()+this._extraDragRow;if(this.el.setAttribute("gs-current-row",String(t)),0===t)return this.el.style.removeProperty("min-height"),this;var e=this.opts.cellHeight,i=this.opts.cellHeightUnit;return e?(this.el.style.minHeight=t*e+i,this):this},t.prototype._prepareElement=function(t,e,i){void 0===e&&(e=!1),t.classList.add(this.opts.itemClass),i=i||this._readAttr(t),t.gridstackNode=i,i.el=t,i.grid=this;var n=o({},i);return i=this.engine.addNode(i,e),l.Utils.same(i,n)||this._writeAttr(t,i),this._prepareDragDropByNode(i),this},t.prototype._writePosAttr=function(t,e){return void 0!==e.x&&null!==e.x&&t.setAttribute("gs-x",String(e.x)),void 0!==e.y&&null!==e.y&&t.setAttribute("gs-y",String(e.y)),e.w>1?t.setAttribute("gs-w",String(e.w)):t.removeAttribute("gs-w"),e.h>1?t.setAttribute("gs-h",String(e.h)):t.removeAttribute("gs-h"),this},t.prototype._writeAttr=function(t,e){if(!e)return this;this._writePosAttr(t,e);var i={autoPosition:"gs-auto-position",noResize:"gs-no-resize",noMove:"gs-no-move",locked:"gs-locked",id:"gs-id"};for(var o in i)e[o]?t.setAttribute(i[o],String(e[o])):t.removeAttribute(i[o]);return this},t.prototype._readAttr=function(t){var e={};for(var i in e.x=l.Utils.toNumber(t.getAttribute("gs-x")),e.y=l.Utils.toNumber(t.getAttribute("gs-y")),e.w=l.Utils.toNumber(t.getAttribute("gs-w")),e.h=l.Utils.toNumber(t.getAttribute("gs-h")),e.w>1||t.removeAttribute("gs-w"),e.h>1||t.removeAttribute("gs-h"),e.autoPosition=l.Utils.toBool(t.getAttribute("gs-auto-position")),e.noResize=l.Utils.toBool(t.getAttribute("gs-no-resize")),e.noMove=l.Utils.toBool(t.getAttribute("gs-no-move")),e.locked=l.Utils.toBool(t.getAttribute("gs-locked")),e.id=t.getAttribute("gs-id"),e.maxW=l.Utils.toNumber(t.getAttribute("gs-max-w")),e.maxW&&t.removeAttribute("gs-max-w"),e.minW=l.Utils.toNumber(t.getAttribute("gs-min-w")),e.minW&&t.removeAttribute("gs-min-w"),e.maxH=l.Utils.toNumber(t.getAttribute("gs-max-h")),e.maxH&&t.removeAttribute("gs-max-h"),e.minH=l.Utils.toNumber(t.getAttribute("gs-min-h")),e.minH&&t.removeAttribute("gs-min-h"),e){if(!e.hasOwnProperty(i))return;e[i]||0===e[i]||delete e[i]}return e},t.prototype._setStaticClass=function(){var t,e,i=["grid-stack-static"];return this.opts.staticGrid?((t=this.el.classList).add.apply(t,i),this.el.setAttribute("gs-static","true")):((e=this.el.classList).remove.apply(e,i),this.el.removeAttribute("gs-static")),this},t.prototype.onParentResize=function(){var t=this;if(this.el&&this.el.clientWidth){var e=!1;if(this._autoColumn&&this.parentGridItem)this.opts.column!==this.parentGridItem.w&&(e=!0,this.column(this.parentGridItem.w,"none"));else{var i=!this.opts.disableOneColumnMode&&this.el.clientWidth<=this.opts.oneColumnSize;1===this.opts.column!==i&&(e=!0,this.opts.animate&&this.setAnimation(!1),this.column(i?1:this._prevColumn),this.opts.animate&&this.setAnimation(!0))}return this._isAutoCellHeight&&(!e&&this.opts.cellHeightThrottle?(this._cellHeightThrottle||(this._cellHeightThrottle=l.Utils.throttle((function(){return t.cellHeight()}),this.opts.cellHeightThrottle)),this._cellHeightThrottle()):this.cellHeight()),this.engine.nodes.forEach((function(t){t.subGrid&&t.subGrid.onParentResize()})),this}},t.prototype._updateWindowResizeEvent=function(t){void 0===t&&(t=!1);var e=(this._isAutoCellHeight||!this.opts.disableOneColumnMode)&&!this.parentGridItem;return t||!e||this._windowResizeBind?!t&&e||!this._windowResizeBind||(window.removeEventListener("resize",this._windowResizeBind),delete this._windowResizeBind):(this._windowResizeBind=this.onParentResize.bind(this),window.addEventListener("resize",this._windowResizeBind)),this},t.getElement=function(t){return void 0===t&&(t=".grid-stack-item"),l.Utils.getElement(t)},t.getElements=function(t){return void 0===t&&(t=".grid-stack-item"),l.Utils.getElements(t)},t.getGridElement=function(e){return t.getElement(e)},t.getGridElements=function(t){return l.Utils.getElements(t)},t.prototype._initMargin=function(){var t,e=0,i=[];return"string"==typeof this.opts.margin&&(i=this.opts.margin.split(" ")),2===i.length?(this.opts.marginTop=this.opts.marginBottom=i[0],this.opts.marginLeft=this.opts.marginRight=i[1]):4===i.length?(this.opts.marginTop=i[0],this.opts.marginRight=i[1],this.opts.marginBottom=i[2],this.opts.marginLeft=i[3]):(t=l.Utils.parseHeight(this.opts.margin),this.opts.marginUnit=t.unit,e=this.opts.margin=t.h),void 0===this.opts.marginTop?this.opts.marginTop=e:(t=l.Utils.parseHeight(this.opts.marginTop),this.opts.marginTop=t.h,delete this.opts.margin),void 0===this.opts.marginBottom?this.opts.marginBottom=e:(t=l.Utils.parseHeight(this.opts.marginBottom),this.opts.marginBottom=t.h,delete this.opts.margin),void 0===this.opts.marginRight?this.opts.marginRight=e:(t=l.Utils.parseHeight(this.opts.marginRight),this.opts.marginRight=t.h,delete this.opts.margin),void 0===this.opts.marginLeft?this.opts.marginLeft=e:(t=l.Utils.parseHeight(this.opts.marginLeft),this.opts.marginLeft=t.h,delete this.opts.margin),this.opts.marginUnit=t.unit,this.opts.marginTop===this.opts.marginBottom&&this.opts.marginLeft===this.opts.marginRight&&this.opts.marginTop===this.opts.marginRight&&(this.opts.margin=this.opts.marginTop),this},t.getDD=function(){return c},t.setupDragIn=function(t,e,i){void 0===i&&(i=document),void 0!==(null==e?void 0:e.pause)&&(p.DDManager.pauseDrag=e.pause),e=o(o({},d.dragInDefaultOptions),e||{});var n="string"==typeof t?l.Utils.getElements(t,i):t;n.length&&(null==n||n.forEach((function(t){c.isDraggable(t)||c.dragIn(t,e)})))},t.prototype.movable=function(e,i){var o=this;return this.opts.staticGrid||t.getElements(e).forEach((function(t){var e=t.gridstackNode;e&&(i?delete e.noMove:e.noMove=!0,o._prepareDragDropByNode(e))})),this},t.prototype.resizable=function(e,i){var o=this;return this.opts.staticGrid||t.getElements(e).forEach((function(t){var e=t.gridstackNode;e&&(i?delete e.noResize:e.noResize=!0,o._prepareDragDropByNode(e))})),this},t.prototype.disable=function(t){if(void 0===t&&(t=!0),!this.opts.staticGrid)return this.enableMove(!1,t),this.enableResize(!1,t),this._triggerEvent("disable"),this},t.prototype.enable=function(t){if(void 0===t&&(t=!0),!this.opts.staticGrid)return this.enableMove(!0,t),this.enableResize(!0,t),this._triggerEvent("enable"),this},t.prototype.enableMove=function(t,e){var i=this;return void 0===e&&(e=!0),this.opts.staticGrid||(this.opts.disableDrag=!t,this.engine.nodes.forEach((function(o){i.movable(o.el,t),o.subGrid&&e&&o.subGrid.enableMove(t,e)}))),this},t.prototype.enableResize=function(t,e){var i=this;return void 0===e&&(e=!0),this.opts.staticGrid||(this.opts.disableResize=!t,this.engine.nodes.forEach((function(o){i.resizable(o.el,t),o.subGrid&&e&&o.subGrid.enableResize(t,e)}))),this},t.prototype._removeDD=function(t){return c.draggable(t,"destroy").resizable(t,"destroy"),t.gridstackNode&&delete t.gridstackNode._initDD,delete t.ddElement,this},t.prototype._setupAcceptWidget=function(){var t,e,i=this;if(this.opts.staticGrid||!this.opts.acceptWidgets&&!this.opts.removable)return c.droppable(this.el,"destroy"),this;var n=function(o,n,r){var s,a=n.gridstackNode;if(a){r=r||n;var d=i.el.getBoundingClientRect(),h=(s=r.getBoundingClientRect()).top,u=s.left;u-=d.left;var p={position:{top:h-=d.top,left:u}};if(a._temporaryRemoved){if(a.x=Math.max(0,Math.round(u/e)),a.y=Math.max(0,Math.round(h/t)),delete a.autoPosition,i.engine.nodeBoundFix(a),!i.engine.willItFit(a)){if(a.autoPosition=!0,!i.engine.willItFit(a))return void c.off(n,"drag");a._willFitPos&&(l.Utils.copyPos(a,a._willFitPos),delete a._willFitPos)}i._onStartMoving(r,o,p,a,e,t)}else i._dragOrResize(r,o,p,a,e,t)}};return c.droppable(this.el,{accept:function(t){var e=t.gridstackNode;if((null==e?void 0:e.grid)===i)return!0;if(!i.opts.acceptWidgets)return!1;var o=!0;if("function"==typeof i.opts.acceptWidgets)o=i.opts.acceptWidgets(t);else{var n=!0===i.opts.acceptWidgets?".grid-stack-item":i.opts.acceptWidgets;o=t.matches(n)}if(o&&e&&i.opts.maxRow){var r={w:e.w,h:e.h,minW:e.minW,minH:e.minH};o=i.engine.willItFit(r)}return o}}).on(this.el,"dropover",(function(r,s,a){var l=s.gridstackNode;if((null==l?void 0:l.grid)===i&&!l._temporaryRemoved)return!1;(null==l?void 0:l.grid)&&l.grid!==i&&!l._temporaryRemoved&&l.grid._leave(s,a),e=i.cellWidth(),t=i.getCellHeight(!0),l||(l=i._readAttr(s)),l.grid||(l._isExternal=!0,s.gridstackNode=l),a=a||s;var d=l.w||Math.round(a.offsetWidth/e)||1,h=l.h||Math.round(a.offsetHeight/t)||1;return l.grid&&l.grid!==i?(s._gridstackNodeOrig||(s._gridstackNodeOrig=l),s.gridstackNode=l=o(o({},l),{w:d,h:h,grid:i}),i.engine.cleanupNode(l).nodeBoundFix(l),l._initDD=l._isExternal=l._temporaryRemoved=!0):(l.w=d,l.h=h,l._temporaryRemoved=!0),i._itemRemoving(l.el,!1),c.on(s,"drag",n),n(r,s,a),!1})).on(this.el,"dropout",(function(t,e,o){var n=e.gridstackNode;return!!n&&(n.grid&&n.grid!==i||(i._leave(e,o),i._isTemp&&i.removeAsSubGrid(n)),!1)})).on(this.el,"drop",(function(t,e,n){var r,s,a=e.gridstackNode;if((null==a?void 0:a.grid)===i&&!a._isExternal)return!1;var h=!!i.placeholder.parentElement;i.placeholder.remove();var u=e._gridstackNodeOrig;if(delete e._gridstackNodeOrig,h&&(null==u?void 0:u.grid)&&u.grid!==i){var p=u.grid;p.engine.removedNodes.push(u),p._triggerRemoveEvent()._triggerChangeEvent(),p.parentGridItem&&!p.engine.nodes.length&&p.opts.subGridDynamic&&p.removeAsSubGrid()}if(!a)return!1;if(h&&(i.engine.cleanupNode(a),a.grid=i),c.off(e,"drag"),n!==e?(n.remove(),e.gridstackNode=u,h&&(e=e.cloneNode(!0))):(e.remove(),i._removeDD(e)),!h)return!1;e.gridstackNode=a,a.el=e;var g=null===(s=null===(r=a.subGrid)||void 0===r?void 0:r.el)||void 0===s?void 0:s.gridstack;return l.Utils.copyPos(a,i._readAttr(i.placeholder)),l.Utils.removePositioningStyles(e),i._writeAttr(e,a),e.classList.add(d.gridDefaults.itemClass,i.opts.itemClass),i.el.appendChild(e),g&&(g.parentGridItem=a,g.opts.styleInHead||g._updateStyles(!0)),i._updateContainerHeight(),i.engine.addedNodes.push(a),i._triggerAddEvent(),i._triggerChangeEvent(),i.engine.endUpdate(),i._gsEventHandler.dropped&&i._gsEventHandler.dropped(o(o({},t),{type:"dropped"}),u&&u.grid?u:void 0,a),window.setTimeout((function(){a.el&&a.el.parentElement?i._prepareDragDropByNode(a):i.engine.removeNode(a),delete a.grid._isTemp})),!1})),this},t.prototype._itemRemoving=function(t,e){var i=t?t.gridstackNode:void 0;i&&i.grid&&(e?i._isAboutToRemove=!0:delete i._isAboutToRemove,e?t.classList.add("grid-stack-item-removing"):t.classList.remove("grid-stack-item-removing"))},t.prototype._setupRemoveDrop=function(){var t=this;if(!this.opts.staticGrid&&"string"==typeof this.opts.removable){var e=document.querySelector(this.opts.removable);if(!e)return this;c.isDroppable(e)||c.droppable(e,this.opts.removableOptions).on(e,"dropover",(function(e,i){return t._itemRemoving(i,!0)})).on(e,"dropout",(function(e,i){return t._itemRemoving(i,!1)}))}return this},t.prototype._prepareDragDropByNode=function(t){var e=this,i=t.el,o=t.noMove||this.opts.disableDrag,n=t.noResize||this.opts.disableResize;if(this.opts.staticGrid||o&&n)return t._initDD&&(this._removeDD(i),delete t._initDD),i.classList.add("ui-draggable-disabled","ui-resizable-disabled"),this;if(!t._initDD){var r,s,a=function(o,n){e._gsEventHandler[o.type]&&e._gsEventHandler[o.type](o,o.target),r=e.cellWidth(),s=e.getCellHeight(!0),e._onStartMoving(i,o,n,t,r,s)},d=function(o,n){e._dragOrResize(i,o,n,t,r,s)},h=function(o){e.placeholder.remove(),delete t._moving,delete t._event,delete t._lastTried;var n=o.target;if(n.gridstackNode&&n.gridstackNode.grid===e){if(t.el=n,t._isAboutToRemove){var r=i.gridstackNode.grid;r._gsEventHandler[o.type]&&r._gsEventHandler[o.type](o,n),e._removeDD(i),r.engine.removedNodes.push(t),r._triggerRemoveEvent(),delete i.gridstackNode,delete t.el,i.remove()}else l.Utils.removePositioningStyles(n),t._temporaryRemoved?(l.Utils.copyPos(t,t._orig),e._writePosAttr(n,t),e.engine.addNode(t)):e._writePosAttr(n,t),e._gsEventHandler[o.type]&&e._gsEventHandler[o.type](o,n);e._extraDragRow=0,e._updateContainerHeight(),e._triggerChangeEvent(),e.engine.endUpdate()}};c.draggable(i,{start:a,stop:h,drag:d}).resizable(i,{start:a,stop:h,resize:d}),t._initDD=!0}return c.draggable(i,o?"disable":"enable").resizable(i,n?"disable":"enable"),this},t.prototype._onStartMoving=function(t,e,i,o,n,r){this.engine.cleanNodes().beginUpdate(o),this._writePosAttr(this.placeholder,o),this.el.appendChild(this.placeholder),o.el=this.placeholder,o._lastUiPosition=i.position,o._prevYPix=i.position.top,o._moving="dragstart"===e.type,delete o._lastTried,"dropover"===e.type&&o._temporaryRemoved&&(this.engine.addNode(o),o._moving=!0),this.engine.cacheRects(n,r,this.opts.marginTop,this.opts.marginRight,this.opts.marginBottom,this.opts.marginLeft),"resizestart"===e.type&&(c.resizable(t,"option","minWidth",n*(o.minW||1)).resizable(t,"option","minHeight",r*(o.minH||1)),o.maxW&&c.resizable(t,"option","maxWidth",n*o.maxW),o.maxH&&c.resizable(t,"option","maxHeight",r*o.maxH))},t.prototype._dragOrResize=function(t,e,i,n,r,s){var a,d=o({},n._orig),h=this.opts.marginLeft,u=this.opts.marginRight,p=this.opts.marginTop,c=this.opts.marginBottom,g=Math.round(.1*s),m=Math.round(.1*r);if(h=Math.min(h,m),u=Math.min(u,m),p=Math.min(p,g),c=Math.min(c,g),"drag"===e.type){if(n._temporaryRemoved)return;var f=i.position.top-n._prevYPix;n._prevYPix=i.position.top,!1!==this.opts.draggable.scroll&&l.Utils.updateScrollPosition(t,i.position,f);var v=i.position.left+(i.position.left>n._lastUiPosition.left?-u:h),y=i.position.top+(i.position.top>n._lastUiPosition.top?-c:p);d.x=Math.round(v/r),d.y=Math.round(y/s);var _=this._extraDragRow;if(this.engine.collide(n,d)){var b=this.getRow(),w=Math.max(0,d.y+n.h-b);this.opts.maxRow&&b+w>this.opts.maxRow&&(w=Math.max(0,this.opts.maxRow-b)),this._extraDragRow=w}else this._extraDragRow=0;if(this._extraDragRow!==_&&this._updateContainerHeight(),n.x===d.x&&n.y===d.y)return}else if("resize"===e.type){if(d.x<0)return;if(l.Utils.updateScrollResize(e,t,s),d.w=Math.round((i.size.width-h)/r),d.h=Math.round((i.size.height-p)/s),n.w===d.w&&n.h===d.h)return;if(n._lastTried&&n._lastTried.w===d.w&&n._lastTried.h===d.h)return;v=i.position.left+h;var E=i.position.top+p;d.x=Math.round(v/r),d.y=Math.round(E/s),a=!0}n._event=e,n._lastTried=d;var D={x:i.position.left+h,y:i.position.top+p,w:(i.size?i.size.width:n.w*r)-h-u,h:(i.size?i.size.height:n.h*s)-p-c};if(this.engine.moveNodeCheck(n,o(o({},d),{cellWidth:r,cellHeight:s,rect:D,resizing:a}))){n._lastUiPosition=i.position,this.engine.cacheRects(r,s,p,u,c,h),delete n._skipDown,a&&n.subGrid&&n.subGrid.onParentResize(),this._extraDragRow=0,this._updateContainerHeight();var x=e.target;this._writePosAttr(x,n),this._gsEventHandler[e.type]&&this._gsEventHandler[e.type](e,x)}},t.prototype._leave=function(t,e){var i=t.gridstackNode;i&&(c.off(t,"drag"),i._temporaryRemoved||(i._temporaryRemoved=!0,this.engine.removeNode(i),i.el=i._isExternal&&e?e:t,!0===this.opts.removable&&this._itemRemoving(t,!0),t._gridstackNodeOrig?(t.gridstackNode=t._gridstackNodeOrig,delete t._gridstackNodeOrig):i._isExternal&&(delete i.el,delete t.gridstackNode,this.engine.restoreInitial())))},t.prototype.commit=function(){return(0,l.obsolete)(this,this.batchUpdate(!1),"commit","batchUpdate","5.2"),this},t.Utils=l.Utils,t.Engine=a.GridStackEngine,t.GDRev="8.2.1",t}()},855:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.dragInDefaultOptions=e.gridDefaults=void 0,e.gridDefaults={alwaysShowResizeHandle:"mobile",animate:!0,auto:!0,cellHeight:"auto",cellHeightThrottle:100,cellHeightUnit:"px",column:12,draggable:{handle:".grid-stack-item-content",appendTo:"body",scroll:!0},handle:".grid-stack-item-content",itemClass:"grid-stack-item",margin:10,marginUnit:"px",maxRow:0,minRow:0,oneColumnSize:768,placeholderClass:"grid-stack-placeholder",placeholderText:"",removableOptions:{accept:".grid-stack-item"},resizable:{handles:"se"},rtl:"auto"},e.dragInDefaultOptions={handle:".grid-stack-item-content",appendTo:"body"}},867:function(t,e){var i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,i=1,o=arguments.length;i<o;i++)for(var n in e=arguments[i])Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},i.apply(this,arguments)},o=this&&this.__spreadArray||function(t,e,i){if(i||2===arguments.length)for(var o,n=0,r=e.length;n<r;n++)!o&&n in e||(o||(o=Array.prototype.slice.call(e,0,n)),o[n]=e[n]);return t.concat(o||Array.prototype.slice.call(e))};Object.defineProperty(e,"__esModule",{value:!0}),e.Utils=e.obsoleteAttr=e.obsoleteOptsDel=e.obsoleteOpts=e.obsolete=void 0,e.obsolete=function(t,e,i,o,n){var r=function(){for(var r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];return console.warn("gridstack.js: Function `"+i+"` is deprecated in "+n+" and has been replaced with `"+o+"`. It will be **removed** in a future release"),e.apply(t,r)};return r.prototype=e.prototype,r},e.obsoleteOpts=function(t,e,i,o){void 0!==t[e]&&(t[i]=t[e],console.warn("gridstack.js: Option `"+e+"` is deprecated in "+o+" and has been replaced with `"+i+"`. It will be **removed** in a future release"))},e.obsoleteOptsDel=function(t,e,i,o){void 0!==t[e]&&console.warn("gridstack.js: Option `"+e+"` is deprecated in "+i+o)},e.obsoleteAttr=function(t,e,i,o){var n=t.getAttribute(e);null!==n&&(t.setAttribute(i,n),console.warn("gridstack.js: attribute `"+e+"`="+n+" is deprecated on this object in "+o+" and has been replaced with `"+i+"`. It will be **removed** in a future release"))};var n=function(){function t(){}return t.getElements=function(t,e){void 0===e&&(e=document);var i="getElementById"in e?e:void 0;if("string"==typeof t){if(i&&!isNaN(+t[0])){var o=i.getElementById(t);return o?[o]:[]}var n=e.querySelectorAll(t);return n.length||"."===t[0]||"#"===t[0]||(n=e.querySelectorAll("."+t)).length||(n=e.querySelectorAll("#"+t)),Array.from(n)}return[t]},t.getElement=function(t,e){void 0===e&&(e=document);var i="getElementById"in e?e:void 0;if("string"==typeof t){if(!t.length)return null;if(i&&"#"===t[0])return i.getElementById(t.substring(1));if("#"===t[0]||"."===t[0]||"["===t[0])return e.querySelector(t);if(i&&!isNaN(+t[0]))return i.getElementById(t);var o=e.querySelector(t);return i&&!o&&(o=i.getElementById(t)),o||(o=e.querySelector("."+t)),o}return t},t.isIntercepted=function(t,e){return!(t.y>=e.y+e.h||t.y+t.h<=e.y||t.x+t.w<=e.x||t.x>=e.x+e.w)},t.isTouching=function(e,i){return t.isIntercepted(e,{x:i.x-.5,y:i.y-.5,w:i.w+1,h:i.h+1})},t.areaIntercept=function(t,e){var i=t.x>e.x?t.x:e.x,o=t.x+t.w<e.x+e.w?t.x+t.w:e.x+e.w;if(o<=i)return 0;var n=t.y>e.y?t.y:e.y,r=t.y+t.h<e.y+e.h?t.y+t.h:e.y+e.h;return r<=n?0:(o-i)*(r-n)},t.area=function(t){return t.w*t.h},t.sort=function(t,e,i){return i=i||t.reduce((function(t,e){return Math.max(e.x+e.w,t)}),0)||12,-1===e?t.sort((function(t,e){return e.x+e.y*i-(t.x+t.y*i)})):t.sort((function(t,e){return t.x+t.y*i-(e.x+e.y*i)}))},t.createStylesheet=function(t,e,i){var o=document.createElement("style"),n=null==i?void 0:i.nonce;return n&&(o.nonce=n),o.setAttribute("type","text/css"),o.setAttribute("gs-style-id",t),o.styleSheet?o.styleSheet.cssText="":o.appendChild(document.createTextNode("")),e?e.insertBefore(o,e.firstChild):(e=document.getElementsByTagName("head")[0]).appendChild(o),o.sheet},t.removeStylesheet=function(t){var e=document.querySelector("STYLE[gs-style-id="+t+"]");e&&e.parentNode&&e.remove()},t.addCSSRule=function(t,e,i){"function"==typeof t.addRule?t.addRule(e,i):"function"==typeof t.insertRule&&t.insertRule("".concat(e,"{").concat(i,"}"))},t.toBool=function(t){return"boolean"==typeof t?t:"string"==typeof t?!(""===(t=t.toLowerCase())||"no"===t||"false"===t||"0"===t):Boolean(t)},t.toNumber=function(t){return null===t||0===t.length?void 0:Number(t)},t.parseHeight=function(t){var e,i="px";if("string"==typeof t){var o=t.match(/^(-[0-9]+\.[0-9]+|[0-9]*\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);if(!o)throw new Error("Invalid height");i=o[2]||"px",e=parseFloat(o[1])}else e=t;return{h:e,unit:i}},t.defaults=function(t){for(var e=this,i=[],o=1;o<arguments.length;o++)i[o-1]=arguments[o];return i.forEach((function(i){for(var o in i){if(!i.hasOwnProperty(o))return;null===t[o]||void 0===t[o]?t[o]=i[o]:"object"==typeof i[o]&&"object"==typeof t[o]&&e.defaults(t[o],i[o])}})),t},t.same=function(t,e){if("object"!=typeof t)return t==e;if(typeof t!=typeof e)return!1;if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var i in t)if(t[i]!==e[i])return!1;return!0},t.copyPos=function(t,e,i){return void 0===i&&(i=!1),void 0!==e.x&&(t.x=e.x),void 0!==e.y&&(t.y=e.y),void 0!==e.w&&(t.w=e.w),void 0!==e.h&&(t.h=e.h),i&&(e.minW&&(t.minW=e.minW),e.minH&&(t.minH=e.minH),e.maxW&&(t.maxW=e.maxW),e.maxH&&(t.maxH=e.maxH)),t},t.samePos=function(t,e){return t&&e&&t.x===e.x&&t.y===e.y&&t.w===e.w&&t.h===e.h},t.sanitizeMinMax=function(t){t.minW||delete t.minW,t.minH||delete t.minH,t.maxW||delete t.maxW,t.maxH||delete t.maxH},t.removeInternalAndSame=function(t,e){if("object"==typeof t&&"object"==typeof e)for(var i in t){var o=t[i];if("_"===i[0]||o===e[i])delete t[i];else if(o&&"object"==typeof o&&void 0!==e[i]){for(var n in o)o[n]!==e[i][n]&&"_"!==n[0]||delete o[n];Object.keys(o).length||delete t[i]}}},t.removeInternalForSave=function(t,e){for(var i in void 0===e&&(e=!0),t)"_"!==i[0]&&null!==t[i]&&void 0!==t[i]||delete t[i];delete t.grid,e&&delete t.el,t.autoPosition||delete t.autoPosition,t.noResize||delete t.noResize,t.noMove||delete t.noMove,t.locked||delete t.locked,1!==t.w&&t.w!==t.minW||delete t.w,1!==t.h&&t.h!==t.minH||delete t.h},t.closestUpByClass=function(t,e){for(;t;){if(t.classList.contains(e))return t;t=t.parentElement}return null},t.throttle=function(t,e){var i=!1;return function(){for(var o=[],n=0;n<arguments.length;n++)o[n]=arguments[n];i||(i=!0,setTimeout((function(){t.apply(void 0,o),i=!1}),e))}},t.removePositioningStyles=function(t){var e=t.style;e.position&&e.removeProperty("position"),e.left&&e.removeProperty("left"),e.top&&e.removeProperty("top"),e.width&&e.removeProperty("width"),e.height&&e.removeProperty("height")},t.getScrollElement=function(t){if(!t)return document.scrollingElement||document.documentElement;var e=getComputedStyle(t);return/(auto|scroll)/.test(e.overflow+e.overflowY)?t:this.getScrollElement(t.parentElement)},t.updateScrollPosition=function(t,e,i){var o=t.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight;if(o.top<0||o.bottom>n){var r=o.bottom-n,s=o.top,a=this.getScrollElement(t);if(null!==a){var l=a.scrollTop;o.top<0&&i<0?t.offsetHeight>n?a.scrollTop+=i:a.scrollTop+=Math.abs(s)>Math.abs(i)?i:s:i>0&&(t.offsetHeight>n?a.scrollTop+=i:a.scrollTop+=r>i?i:r),e.top+=a.scrollTop-l}}},t.updateScrollResize=function(t,e,i){var o=this.getScrollElement(e),n=o.clientHeight,r=o===this.getScrollElement()?0:o.getBoundingClientRect().top,s=t.clientY-r,a=s>n-i;s<i?o.scrollBy({behavior:"smooth",top:s-i}):a&&o.scrollBy({behavior:"smooth",top:i-(n-s)})},t.clone=function(t){return null==t||"object"!=typeof t?t:t instanceof Array?o([],t,!0):i({},t)},t.cloneDeep=function(e){var i=["parentGrid","el","grid","subGrid","engine"],o=t.clone(e),n=function(n){o.hasOwnProperty(n)&&"object"==typeof o[n]&&"__"!==n.substring(0,2)&&!i.find((function(t){return t===n}))&&(o[n]=t.cloneDeep(e[n]))};for(var r in o)n(r);return o},t.cloneNode=function(t){var e=t.cloneNode(!0);return e.removeAttribute("id"),e},t.appendTo=function(e,i){var o;(o="string"==typeof i?t.getElement(i):i)&&o.appendChild(e)},t.addElStyles=function(t,e){if(e instanceof Object){var i=function(i){e.hasOwnProperty(i)&&(Array.isArray(e[i])?e[i].forEach((function(e){t.style[i]=e})):t.style[i]=e[i])};for(var o in e)i(o)}},t.initEvent=function(t,e){var o={type:e.type},n={button:0,which:0,buttons:1,bubbles:!0,cancelable:!0,target:e.target?e.target:t.target};return t.dataTransfer&&(o.dataTransfer=t.dataTransfer),["altKey","ctrlKey","metaKey","shiftKey"].forEach((function(e){return o[e]=t[e]})),["pageX","pageY","clientX","clientY","screenX","screenY"].forEach((function(e){return o[e]=t[e]})),i(i({},o),n)},t.simulateMouseEvent=function(t,e,i){var o=document.createEvent("MouseEvents");o.initMouseEvent(e,!0,!0,window,1,t.screenX,t.screenY,t.clientX,t.clientY,t.ctrlKey,t.altKey,t.shiftKey,t.metaKey,0,t.target),(i||t.target).dispatchEvent(o)},t}();e.Utils=n}},e={},i=function i(o){var n=e[o];if(void 0!==n)return n.exports;var r=e[o]={exports:{}};return t[o].call(r.exports,r,r.exports,i),r.exports}(324);return i.GridStack}()}));
|
|
3
|
-
//# sourceMappingURL=gridstack-all.js.map
|
|
1
|
+
!function(Q,B){"object"==typeof exports&&"object"==typeof module?module.exports=B():"function"==typeof define&&define.amd?define([],B):"object"==typeof exports?exports.GridStack=B():Q.GridStack=B()}(self,(function(){return function(){"use strict";var __webpack_modules__={74:function(__unused_webpack_module,exports){eval('\n/**\n * dd-base-impl.ts 8.2.2\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.DDBaseImplement = void 0;\nvar DDBaseImplement = /** @class */ (function () {\n function DDBaseImplement() {\n /** @internal */\n this._eventRegister = {};\n }\n Object.defineProperty(DDBaseImplement.prototype, "disabled", {\n /** returns the enable state, but you have to call enable()/disable() to change (as other things need to happen) */\n get: function () { return this._disabled; },\n enumerable: false,\n configurable: true\n });\n DDBaseImplement.prototype.on = function (event, callback) {\n this._eventRegister[event] = callback;\n };\n DDBaseImplement.prototype.off = function (event) {\n delete this._eventRegister[event];\n };\n DDBaseImplement.prototype.enable = function () {\n this._disabled = false;\n };\n DDBaseImplement.prototype.disable = function () {\n this._disabled = true;\n };\n DDBaseImplement.prototype.destroy = function () {\n delete this._eventRegister;\n };\n DDBaseImplement.prototype.triggerEvent = function (eventName, event) {\n if (!this.disabled && this._eventRegister && this._eventRegister[eventName])\n return this._eventRegister[eventName](event);\n };\n return DDBaseImplement;\n}());\nexports.DDBaseImplement = DDBaseImplement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBR0g7SUFBQTtRQU1FLGdCQUFnQjtRQUNOLG1CQUFjLEdBRXBCLEVBQUUsQ0FBQztJQTBCVCxDQUFDO0lBakNDLHNCQUFXLHFDQUFRO1FBRG5CLG1IQUFtSDthQUNuSCxjQUFtQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOzs7T0FBQTtJQVNwRCw0QkFBRSxHQUFULFVBQVUsS0FBYSxFQUFFLFFBQXVCO1FBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQ3hDLENBQUM7SUFFTSw2QkFBRyxHQUFWLFVBQVcsS0FBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVNLGdDQUFNLEdBQWI7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRU0saUNBQU8sR0FBZDtRQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxpQ0FBTyxHQUFkO1FBQ0UsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFTSxzQ0FBWSxHQUFuQixVQUFvQixTQUFpQixFQUFFLEtBQVk7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUN6RSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQztBQW5DcUIsMENBQWUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmlkU3RhY2svLi9zcmMvZGQtYmFzZS1pbXBsLnRzP2Q3YzkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZC1iYXNlLWltcGwudHMgOC4yLjJcbiAqIENvcHlyaWdodCAoYykgMjAyMS0yMDIyIEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxuICovXG5cbmV4cG9ydCB0eXBlIEV2ZW50Q2FsbGJhY2sgPSAoZXZlbnQ6IEV2ZW50KSA9PiBib29sZWFufHZvaWQ7XG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRERCYXNlSW1wbGVtZW50IHtcbiAgLyoqIHJldHVybnMgdGhlIGVuYWJsZSBzdGF0ZSwgYnV0IHlvdSBoYXZlIHRvIGNhbGwgZW5hYmxlKCkvZGlzYWJsZSgpIHRvIGNoYW5nZSAoYXMgb3RoZXIgdGhpbmdzIG5lZWQgdG8gaGFwcGVuKSAqL1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4gICB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9kaXNhYmxlZDogYm9vbGVhbjsgLy8gaW5pdGlhbCBzdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGZyb20gZmFsc2VcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX2V2ZW50UmVnaXN0ZXI6IHtcbiAgICBbZXZlbnROYW1lOiBzdHJpbmddOiBFdmVudENhbGxiYWNrO1xuICB9ID0ge307XG5cbiAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBFdmVudENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRSZWdpc3RlcltldmVudF0gPSBjYWxsYmFjaztcbiAgfVxuXG4gIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudFJlZ2lzdGVyW2V2ZW50XTtcbiAgfVxuXG4gIHB1YmxpYyBlbmFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudFJlZ2lzdGVyO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJFdmVudChldmVudE5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogYm9vbGVhbnx2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5fZXZlbnRSZWdpc3RlciAmJiB0aGlzLl9ldmVudFJlZ2lzdGVyW2V2ZW50TmFtZV0pXG4gICAgICByZXR1cm4gdGhpcy5fZXZlbnRSZWdpc3RlcltldmVudE5hbWVdKGV2ZW50KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhUTUxFbGVtZW50RXh0ZW5kT3B0PFQ+IHtcbiAgZWw6IEhUTUxFbGVtZW50O1xuICBvcHRpb246IFQ7XG4gIHVwZGF0ZU9wdGlvbihUKTogRERCYXNlSW1wbGVtZW50O1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///74\n')},366:function(__unused_webpack_module,exports,__webpack_require__){eval("\n/**\n * dd-draggable.ts 8.2.2\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.DDDraggable = void 0;\nvar dd_manager_1 = __webpack_require__(839);\nvar utils_1 = __webpack_require__(867);\nvar dd_base_impl_1 = __webpack_require__(74);\nvar dd_touch_1 = __webpack_require__(537);\n// make sure we are not clicking on known object that handles mouseDown\nvar skipMouseDown = 'input,textarea,button,select,option,[contenteditable=\"true\"],.ui-resizable-handle';\n// let count = 0; // TEST\nvar DDDraggable = exports.DDDraggable = /** @class */ (function (_super) {\n __extends(DDDraggable, _super);\n function DDDraggable(el, option) {\n if (option === void 0) { option = {}; }\n var _this = _super.call(this) || this;\n _this.el = el;\n _this.option = option;\n // get the element that is actually supposed to be dragged by\n var handleName = option.handle.substring(1);\n _this.dragEl = el.classList.contains(handleName) ? el : el.querySelector(option.handle) || el;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n _this._mouseDown = _this._mouseDown.bind(_this);\n _this._mouseMove = _this._mouseMove.bind(_this);\n _this._mouseUp = _this._mouseUp.bind(_this);\n _this.enable();\n return _this;\n }\n DDDraggable.prototype.on = function (event, callback) {\n _super.prototype.on.call(this, event, callback);\n };\n DDDraggable.prototype.off = function (event) {\n _super.prototype.off.call(this, event);\n };\n DDDraggable.prototype.enable = function () {\n if (this.disabled === false)\n return;\n _super.prototype.enable.call(this);\n this.dragEl.addEventListener('mousedown', this._mouseDown);\n if (dd_touch_1.isTouch) {\n this.dragEl.addEventListener('touchstart', dd_touch_1.touchstart);\n this.dragEl.addEventListener('pointerdown', dd_touch_1.pointerdown);\n // this.dragEl.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n this.el.classList.remove('ui-draggable-disabled');\n };\n DDDraggable.prototype.disable = function (forDestroy) {\n if (forDestroy === void 0) { forDestroy = false; }\n if (this.disabled === true)\n return;\n _super.prototype.disable.call(this);\n this.dragEl.removeEventListener('mousedown', this._mouseDown);\n if (dd_touch_1.isTouch) {\n this.dragEl.removeEventListener('touchstart', dd_touch_1.touchstart);\n this.dragEl.removeEventListener('pointerdown', dd_touch_1.pointerdown);\n }\n if (!forDestroy)\n this.el.classList.add('ui-draggable-disabled');\n };\n DDDraggable.prototype.destroy = function () {\n if (this.dragTimeout)\n window.clearTimeout(this.dragTimeout);\n delete this.dragTimeout;\n if (this.dragging)\n this._mouseUp(this.mouseDownEvent);\n this.disable(true);\n delete this.el;\n delete this.helper;\n delete this.option;\n _super.prototype.destroy.call(this);\n };\n DDDraggable.prototype.updateOption = function (opts) {\n var _this = this;\n Object.keys(opts).forEach(function (key) { return _this.option[key] = opts[key]; });\n return this;\n };\n /** @internal call when mouse goes down before a dragstart happens */\n DDDraggable.prototype._mouseDown = function (e) {\n // don't let more than one widget handle mouseStart\n if (dd_manager_1.DDManager.mouseHandled)\n return;\n if (e.button !== 0)\n return true; // only left click\n // make sure we are not clicking on known object that handles mouseDown, or ones supplied by the user\n if (e.target.closest(skipMouseDown))\n return true;\n if (this.option.cancel) {\n if (e.target.closest(this.option.cancel))\n return true;\n }\n // REMOVE: why would we get the event if it wasn't for us or child ?\n // make sure we are clicking on a drag handle or child of it...\n // Note: we don't need to check that's handle is an immediate child, as mouseHandled will prevent parents from also handling it (lowest wins)\n // let className = this.option.handle.substring(1);\n // let el = e.target as HTMLElement;\n // while (el && !el.classList.contains(className)) { el = el.parentElement; }\n // if (!el) return;\n this.mouseDownEvent = e;\n delete this.dragging;\n delete dd_manager_1.DDManager.dragElement;\n delete dd_manager_1.DDManager.dropElement;\n // document handler so we can continue receiving moves as the item is 'fixed' position, and capture=true so WE get a first crack\n document.addEventListener('mousemove', this._mouseMove, true); // true=capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (dd_touch_1.isTouch) {\n this.dragEl.addEventListener('touchmove', dd_touch_1.touchmove);\n this.dragEl.addEventListener('touchend', dd_touch_1.touchend);\n }\n e.preventDefault();\n // preventDefault() prevents blur event which occurs just after mousedown event.\n // if an editable content has focus, then blur must be call\n if (document.activeElement)\n document.activeElement.blur();\n dd_manager_1.DDManager.mouseHandled = true;\n return true;\n };\n /** @internal method to call actual drag event */\n DDDraggable.prototype._callDrag = function (e) {\n if (!this.dragging)\n return;\n var ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'drag' });\n if (this.option.drag) {\n this.option.drag(ev, this.ui());\n }\n this.triggerEvent('drag', ev);\n };\n /** @internal called when the main page (after successful mousedown) receives a move event to drag the item around the screen */\n DDDraggable.prototype._mouseMove = function (e) {\n var _this = this;\n var _a;\n // console.log(`${count++} move ${e.x},${e.y}`)\n var s = this.mouseDownEvent;\n if (this.dragging) {\n this._dragFollow(e);\n // delay actual grid handling drag until we pause for a while if set\n if (dd_manager_1.DDManager.pauseDrag) {\n var pause = Number.isInteger(dd_manager_1.DDManager.pauseDrag) ? dd_manager_1.DDManager.pauseDrag : 100;\n if (this.dragTimeout)\n window.clearTimeout(this.dragTimeout);\n this.dragTimeout = window.setTimeout(function () { return _this._callDrag(e); }, pause);\n }\n else {\n this._callDrag(e);\n }\n }\n else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 3) {\n /**\n * don't start unless we've moved at least 3 pixels\n */\n this.dragging = true;\n dd_manager_1.DDManager.dragElement = this;\n // if we're dragging an actual grid item, set the current drop as the grid (to detect enter/leave)\n var grid = (_a = this.el.gridstackNode) === null || _a === void 0 ? void 0 : _a.grid;\n if (grid) {\n dd_manager_1.DDManager.dropElement = grid.el.ddElement.ddDroppable;\n }\n else {\n delete dd_manager_1.DDManager.dropElement;\n }\n this.helper = this._createHelper(e);\n this._setupHelperContainmentStyle();\n this.dragOffset = this._getDragOffset(e, this.el, this.helperContainment);\n var ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'dragstart' });\n this._setupHelperStyle(e);\n if (this.option.start) {\n this.option.start(ev, this.ui());\n }\n this.triggerEvent('dragstart', ev);\n }\n e.preventDefault(); // needed otherwise we get text sweep text selection as we drag around\n return true;\n };\n /** @internal call when the mouse gets released to drop the item at current location */\n DDDraggable.prototype._mouseUp = function (e) {\n var _a;\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (dd_touch_1.isTouch) {\n this.dragEl.removeEventListener('touchmove', dd_touch_1.touchmove, true);\n this.dragEl.removeEventListener('touchend', dd_touch_1.touchend, true);\n }\n if (this.dragging) {\n delete this.dragging;\n // reset the drop target if dragging over ourself (already parented, just moving during stop callback below)\n if (((_a = dd_manager_1.DDManager.dropElement) === null || _a === void 0 ? void 0 : _a.el) === this.el.parentElement) {\n delete dd_manager_1.DDManager.dropElement;\n }\n this.helperContainment.style.position = this.parentOriginStylePosition || null;\n if (this.helper === this.el) {\n this._removeHelperStyle();\n }\n else {\n this.helper.remove();\n }\n var ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'dragstop' });\n if (this.option.stop) {\n this.option.stop(ev); // NOTE: destroy() will be called when removing item, so expect NULL ptr after!\n }\n this.triggerEvent('dragstop', ev);\n // call the droppable method to receive the item\n if (dd_manager_1.DDManager.dropElement) {\n dd_manager_1.DDManager.dropElement.drop(e);\n }\n }\n delete this.helper;\n delete this.mouseDownEvent;\n delete dd_manager_1.DDManager.dragElement;\n delete dd_manager_1.DDManager.dropElement;\n delete dd_manager_1.DDManager.mouseHandled;\n e.preventDefault();\n };\n /** @internal create a clone copy (or user defined method) of the original drag item if set */\n DDDraggable.prototype._createHelper = function (event) {\n var _this = this;\n var helper = this.el;\n if (typeof this.option.helper === 'function') {\n helper = this.option.helper(event);\n }\n else if (this.option.helper === 'clone') {\n helper = utils_1.Utils.cloneNode(this.el);\n }\n if (!document.body.contains(helper)) {\n utils_1.Utils.appendTo(helper, this.option.appendTo === 'parent' ? this.el.parentElement : this.option.appendTo);\n }\n if (helper === this.el) {\n this.dragElementOriginStyle = DDDraggable.originStyleProp.map(function (prop) { return _this.el.style[prop]; });\n }\n return helper;\n };\n /** @internal set the fix position of the dragged item */\n DDDraggable.prototype._setupHelperStyle = function (e) {\n var _this = this;\n this.helper.classList.add('ui-draggable-dragging');\n // TODO: set all at once with style.cssText += ... ? https://stackoverflow.com/questions/3968593\n var style = this.helper.style;\n style.pointerEvents = 'none'; // needed for over items to get enter/leave\n // style.cursor = 'move'; // TODO: can't set with pointerEvents=none ! (done in CSS as well)\n style.width = this.dragOffset.width + 'px';\n style.height = this.dragOffset.height + 'px';\n style.willChange = 'left, top';\n style.position = 'fixed'; // let us drag between grids by not clipping as parent .grid-stack is position: 'relative'\n this._dragFollow(e); // now position it\n style.transition = 'none'; // show up instantly\n setTimeout(function () {\n if (_this.helper) {\n style.transition = null; // recover animation\n }\n }, 0);\n return this;\n };\n /** @internal restore back the original style before dragging */\n DDDraggable.prototype._removeHelperStyle = function () {\n var _this = this;\n var _a;\n this.helper.classList.remove('ui-draggable-dragging');\n var node = (_a = this.helper) === null || _a === void 0 ? void 0 : _a.gridstackNode;\n // don't bother restoring styles if we're gonna remove anyway...\n if (!(node === null || node === void 0 ? void 0 : node._isAboutToRemove) && this.dragElementOriginStyle) {\n var helper_1 = this.helper;\n // don't animate, otherwise we animate offseted when switching back to 'absolute' from 'fixed'.\n // TODO: this also removes resizing animation which doesn't have this issue, but others.\n // Ideally both would animate ('move' would immediately restore 'absolute' and adjust coordinate to match,\n // then trigger a delay (repaint) to restore to final dest with animate) but then we need to make sure 'resizestop'\n // is called AFTER 'transitionend' event is received (see https://github.com/gridstack/gridstack.js/issues/2033)\n var transition_1 = this.dragElementOriginStyle['transition'] || null;\n helper_1.style.transition = this.dragElementOriginStyle['transition'] = 'none'; // can't be NULL #1973\n DDDraggable.originStyleProp.forEach(function (prop) { return helper_1.style[prop] = _this.dragElementOriginStyle[prop] || null; });\n setTimeout(function () { return helper_1.style.transition = transition_1; }, 50); // recover animation from saved vars after a pause (0 isn't enough #1973)\n }\n delete this.dragElementOriginStyle;\n return this;\n };\n /** @internal updates the top/left position to follow the mouse */\n DDDraggable.prototype._dragFollow = function (e) {\n var containmentRect = { left: 0, top: 0 };\n // if (this.helper.style.position === 'absolute') { // we use 'fixed'\n // const { left, top } = this.helperContainment.getBoundingClientRect();\n // containmentRect = { left, top };\n // }\n var style = this.helper.style;\n var offset = this.dragOffset;\n style.left = e.clientX + offset.offsetLeft - containmentRect.left + 'px';\n style.top = e.clientY + offset.offsetTop - containmentRect.top + 'px';\n };\n /** @internal */\n DDDraggable.prototype._setupHelperContainmentStyle = function () {\n this.helperContainment = this.helper.parentElement;\n if (this.helper.style.position !== 'fixed') {\n this.parentOriginStylePosition = this.helperContainment.style.position;\n if (window.getComputedStyle(this.helperContainment).position.match(/static/)) {\n this.helperContainment.style.position = 'relative';\n }\n }\n return this;\n };\n /** @internal */\n DDDraggable.prototype._getDragOffset = function (event, el, parent) {\n // in case ancestor has transform/perspective css properties that change the viewpoint\n var xformOffsetX = 0;\n var xformOffsetY = 0;\n if (parent) {\n var testEl = document.createElement('div');\n utils_1.Utils.addElStyles(testEl, {\n opacity: '0',\n position: 'fixed',\n top: 0 + 'px',\n left: 0 + 'px',\n width: '1px',\n height: '1px',\n zIndex: '-999999',\n });\n parent.appendChild(testEl);\n var testElPosition = testEl.getBoundingClientRect();\n parent.removeChild(testEl);\n xformOffsetX = testElPosition.left;\n xformOffsetY = testElPosition.top;\n // TODO: scale ?\n }\n var targetOffset = el.getBoundingClientRect();\n return {\n left: targetOffset.left,\n top: targetOffset.top,\n offsetLeft: -event.clientX + targetOffset.left - xformOffsetX,\n offsetTop: -event.clientY + targetOffset.top - xformOffsetY,\n width: targetOffset.width,\n height: targetOffset.height\n };\n };\n /** @internal TODO: set to public as called by DDDroppable! */\n DDDraggable.prototype.ui = function () {\n var containmentEl = this.el.parentElement;\n var containmentRect = containmentEl.getBoundingClientRect();\n var offset = this.helper.getBoundingClientRect();\n return {\n position: {\n top: offset.top - containmentRect.top,\n left: offset.left - containmentRect.left\n }\n /* not used by GridStack for now...\n helper: [this.helper], //The object arr representing the helper that's being dragged.\n offset: { top: offset.top, left: offset.left } // Current offset position of the helper as { top, left } object.\n */\n };\n };\n /** @internal properties we change during dragging, and restore back */\n DDDraggable.originStyleProp = ['transition', 'pointerEvents', 'position', 'left', 'top', 'minWidth', 'willChange'];\n return DDDraggable;\n}(dd_base_impl_1.DDBaseImplement));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUVELElBQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2hELE9BQU87WUFDTCxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUk7WUFDdkIsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHO1lBQ3JCLFVBQVUsRUFBRSxDQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUksR0FBRyxZQUFZO1lBQzlELFNBQVMsRUFBRSxDQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLEdBQUcsR0FBRyxZQUFZO1lBQzVELEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSztZQUN6QixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRCw4REFBOEQ7SUFDdkQsd0JBQUUsR0FBVDtRQUNFLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQzVDLElBQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzlELElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRCxPQUFPO1lBQ0wsUUFBUSxFQUFFO2dCQUNSLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQyxHQUFHO2dCQUNyQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSTthQUN6QztZQUNEOzs7Y0FHRTtTQUNILENBQUM7SUFDSixDQUFDO0lBalZELHVFQUF1RTtJQUN0RCwyQkFBZSxHQUFHLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFpVjFILGtCQUFDO0NBQUEsQ0FyV2dDLDhCQUFlLEdBcVcvQyIsInNvdXJjZXMiOlsid2VicGFjazovL0dyaWRTdGFjay8uL3NyYy9kZC1kcmFnZ2FibGUudHM/ZjM2NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRkLWRyYWdnYWJsZS50cyA4LjIuMlxuICogQ29weXJpZ2h0IChjKSAyMDIxLTIwMjIgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgRERNYW5hZ2VyIH0gZnJvbSAnLi9kZC1tYW5hZ2VyJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEREJhc2VJbXBsZW1lbnQsIEhUTUxFbGVtZW50RXh0ZW5kT3B0IH0gZnJvbSAnLi9kZC1iYXNlLWltcGwnO1xuaW1wb3J0IHsgR3JpZEl0ZW1IVE1MRWxlbWVudCwgRERVSURhdGEgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IERERWxlbWVudEhvc3QgfSBmcm9tICcuL2RkLWVsZW1lbnQnO1xuaW1wb3J0IHsgaXNUb3VjaCwgdG91Y2hlbmQsIHRvdWNobW92ZSwgdG91Y2hzdGFydCwgcG9pbnRlcmRvd24gfSBmcm9tICcuL2RkLXRvdWNoJztcblxuLy8gVE9ETzogbWVyZ2Ugd2l0aCBERERyYWdPcHQgP1xuZXhwb3J0IGludGVyZmFjZSBERERyYWdnYWJsZU9wdCB7XG4gIGFwcGVuZFRvPzogc3RyaW5nIHwgSFRNTEVsZW1lbnQ7XG4gIGhhbmRsZT86IHN0cmluZztcbiAgaGVscGVyPzogJ2Nsb25lJyB8IEhUTUxFbGVtZW50IHwgKChldmVudDogRXZlbnQpID0+IEhUTUxFbGVtZW50KTtcbiAgY2FuY2VsPzogc3RyaW5nO1xuICAvLyBjb250YWlubWVudD86IHN0cmluZyB8IEhUTUxFbGVtZW50OyAvLyBUT0RPOiBub3QgaW1wbGVtZW50ZWQgeWV0XG4gIC8vIHJldmVydD86IHN0cmluZyB8IGJvb2xlYW4gfCB1bmtub3duOyAvLyBUT0RPOiBub3QgaW1wbGVtZW50ZWQgeWV0XG4gIC8vIHNjcm9sbD86IGJvb2xlYW47XG4gIHN0YXJ0PzogKGV2ZW50OiBFdmVudCwgdWk6IEREVUlEYXRhKSA9PiB2b2lkO1xuICBzdG9wPzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgZHJhZz86IChldmVudDogRXZlbnQsIHVpOiBERFVJRGF0YSkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIERyYWdPZmZzZXQge1xuICBsZWZ0OiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICBvZmZzZXRUb3A6IG51bWJlcjtcbn1cblxudHlwZSBERERyYWdFdmVudCA9ICdkcmFnJyB8ICdkcmFnc3RhcnQnIHwgJ2RyYWdzdG9wJztcblxuLy8gbWFrZSBzdXJlIHdlIGFyZSBub3QgY2xpY2tpbmcgb24ga25vd24gb2JqZWN0IHRoYXQgaGFuZGxlcyBtb3VzZURvd25cbmNvbnN0IHNraXBNb3VzZURvd24gPSAnaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNlbGVjdCxvcHRpb24sW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0sLnVpLXJlc2l6YWJsZS1oYW5kbGUnO1xuXG4vLyBsZXQgY291bnQgPSAwOyAvLyBURVNUXG5cbmV4cG9ydCBjbGFzcyBERERyYWdnYWJsZSBleHRlbmRzIEREQmFzZUltcGxlbWVudCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RXh0ZW5kT3B0PERERHJhZ2dhYmxlT3B0PiB7XG4gIHB1YmxpYyBlbDogSFRNTEVsZW1lbnQ7XG4gIHB1YmxpYyBvcHRpb246IERERHJhZ2dhYmxlT3B0O1xuICBwdWJsaWMgaGVscGVyOiBIVE1MRWxlbWVudDsgLy8gdXNlZCBieSBHcmlkU3RhY2tERE5hdGl2ZVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIG1vdXNlRG93bkV2ZW50OiBNb3VzZUV2ZW50O1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBkcmFnT2Zmc2V0OiBEcmFnT2Zmc2V0O1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBkcmFnRWxlbWVudE9yaWdpblN0eWxlOiBBcnJheTxzdHJpbmc+O1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBkcmFnRWw6IEhUTUxFbGVtZW50O1xuICAvKiogQGludGVybmFsIHRydWUgd2hpbGUgd2UgYXJlIGRyYWdnaW5nIGFuIGl0ZW0gYXJvdW5kICovXG4gIHByb3RlY3RlZCBkcmFnZ2luZzogYm9vbGVhbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgcGFyZW50T3JpZ2luU3R5bGVQb3NpdGlvbjogc3RyaW5nO1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBoZWxwZXJDb250YWlubWVudDogSFRNTEVsZW1lbnQ7XG4gIC8qKiBAaW50ZXJuYWwgcHJvcGVydGllcyB3ZSBjaGFuZ2UgZHVyaW5nIGRyYWdnaW5nLCBhbmQgcmVzdG9yZSBiYWNrICovXG4gIHByb3RlY3RlZCBzdGF0aWMgb3JpZ2luU3R5bGVQcm9wID0gWyd0cmFuc2l0aW9uJywgJ3BvaW50ZXJFdmVudHMnLCAncG9zaXRpb24nLCAnbGVmdCcsICd0b3AnLCAnbWluV2lkdGgnLCAnd2lsbENoYW5nZSddO1xuICAvKiogQGludGVybmFsIHBhdXNlIGJlZm9yZSB3ZSBjYWxsIHRoZSBhY3R1YWwgZHJhZyBoaXQgY29sbGlzaW9uIGNvZGUgKi9cbiAgcHJvdGVjdGVkIGRyYWdUaW1lb3V0OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZWw6IEhUTUxFbGVtZW50LCBvcHRpb246IERERHJhZ2dhYmxlT3B0ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjtcblxuICAgIC8vIGdldCB0aGUgZWxlbWVudCB0aGF0IGlzIGFjdHVhbGx5IHN1cHBvc2VkIHRvIGJlIGRyYWdnZWQgYnlcbiAgICBsZXQgaGFuZGxlTmFtZSA9IG9wdGlvbi5oYW5kbGUuc3Vic3RyaW5nKDEpO1xuICAgIHRoaXMuZHJhZ0VsID0gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGhhbmRsZU5hbWUpID8gZWwgOiBlbC5xdWVyeVNlbGVjdG9yKG9wdGlvbi5oYW5kbGUpIHx8IGVsO1xuICAgIC8vIGNyZWF0ZSB2YXIgZXZlbnQgYmluZGluZyBzbyB3ZSBjYW4gZWFzaWx5IHJlbW92ZSBhbmQgc3RpbGwgbG9vayBsaWtlIFRTIG1ldGhvZHMgKHVubGlrZSBhbm9ueW1vdXMgZnVuY3Rpb25zKVxuICAgIHRoaXMuX21vdXNlRG93biA9IHRoaXMuX21vdXNlRG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX21vdXNlTW92ZSA9IHRoaXMuX21vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX21vdXNlVXAgPSB0aGlzLl9tb3VzZVVwLmJpbmQodGhpcyk7XG4gICAgdGhpcy5lbmFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbihldmVudDogREREcmFnRXZlbnQsIGNhbGxiYWNrOiAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHN1cGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgb2ZmKGV2ZW50OiBERERyYWdFdmVudCk6IHZvaWQge1xuICAgIHN1cGVyLm9mZihldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuICAgIHN1cGVyLmVuYWJsZSgpO1xuICAgIHRoaXMuZHJhZ0VsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX21vdXNlRG93bik7XG4gICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgIHRoaXMuZHJhZ0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0b3VjaHN0YXJ0KTtcbiAgICAgIHRoaXMuZHJhZ0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgcG9pbnRlcmRvd24pO1xuICAgICAgLy8gdGhpcy5kcmFnRWwuc3R5bGUudG91Y2hBY3Rpb24gPSAnbm9uZSc7IC8vIG5vdCBuZWVkZWQgdW5saWtlIHBvaW50ZXJkb3duIGRvYyBjb21tZW50XG4gICAgfVxuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndWktZHJhZ2dhYmxlLWRpc2FibGVkJyk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmb3JEZXN0cm95ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xuICAgIHN1cGVyLmRpc2FibGUoKTtcbiAgICB0aGlzLmRyYWdFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9tb3VzZURvd24pO1xuICAgIGlmIChpc1RvdWNoKSB7XG4gICAgICB0aGlzLmRyYWdFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdG91Y2hzdGFydCk7XG4gICAgICB0aGlzLmRyYWdFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHBvaW50ZXJkb3duKTtcbiAgICB9XG4gICAgaWYgKCFmb3JEZXN0cm95KSB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3VpLWRyYWdnYWJsZS1kaXNhYmxlZCcpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHJhZ1RpbWVvdXQpIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5kcmFnVGltZW91dCk7XG4gICAgZGVsZXRlIHRoaXMuZHJhZ1RpbWVvdXQ7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmcpIHRoaXMuX21vdXNlVXAodGhpcy5tb3VzZURvd25FdmVudCk7XG4gICAgdGhpcy5kaXNhYmxlKHRydWUpO1xuICAgIGRlbGV0ZSB0aGlzLmVsO1xuICAgIGRlbGV0ZSB0aGlzLmhlbHBlcjtcbiAgICBkZWxldGUgdGhpcy5vcHRpb247XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZU9wdGlvbihvcHRzOiBERERyYWdnYWJsZU9wdCk6IERERHJhZ2dhYmxlIHtcbiAgICBPYmplY3Qua2V5cyhvcHRzKS5mb3JFYWNoKGtleSA9PiB0aGlzLm9wdGlvbltrZXldID0gb3B0c1trZXldKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgY2FsbCB3aGVuIG1vdXNlIGdvZXMgZG93biBiZWZvcmUgYSBkcmFnc3RhcnQgaGFwcGVucyAqL1xuICBwcm90ZWN0ZWQgX21vdXNlRG93bihlOiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgLy8gZG9uJ3QgbGV0IG1vcmUgdGhhbiBvbmUgd2lkZ2V0IGhhbmRsZSBtb3VzZVN0YXJ0XG4gICAgaWYgKERETWFuYWdlci5tb3VzZUhhbmRsZWQpIHJldHVybjtcbiAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybiB0cnVlOyAvLyBvbmx5IGxlZnQgY2xpY2tcblxuICAgIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGNsaWNraW5nIG9uIGtub3duIG9iamVjdCB0aGF0IGhhbmRsZXMgbW91c2VEb3duLCBvciBvbmVzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyXG4gICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChza2lwTW91c2VEb3duKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMub3B0aW9uLmNhbmNlbCkge1xuICAgICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCh0aGlzLm9wdGlvbi5jYW5jZWwpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSRU1PVkU6IHdoeSB3b3VsZCB3ZSBnZXQgdGhlIGV2ZW50IGlmIGl0IHdhc24ndCBmb3IgdXMgb3IgY2hpbGQgP1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgY2xpY2tpbmcgb24gYSBkcmFnIGhhbmRsZSBvciBjaGlsZCBvZiBpdC4uLlxuICAgIC8vIE5vdGU6IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhhdCdzIGhhbmRsZSBpcyBhbiBpbW1lZGlhdGUgY2hpbGQsIGFzIG1vdXNlSGFuZGxlZCB3aWxsIHByZXZlbnQgcGFyZW50cyBmcm9tIGFsc28gaGFuZGxpbmcgaXQgKGxvd2VzdCB3aW5zKVxuICAgIC8vIGxldCBjbGFzc05hbWUgPSB0aGlzLm9wdGlvbi5oYW5kbGUuc3Vic3RyaW5nKDEpO1xuICAgIC8vIGxldCBlbCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIC8vIHdoaWxlIChlbCAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHsgZWwgPSBlbC5wYXJlbnRFbGVtZW50OyB9XG4gICAgLy8gaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgdGhpcy5tb3VzZURvd25FdmVudCA9IGU7XG4gICAgZGVsZXRlIHRoaXMuZHJhZ2dpbmc7XG4gICAgZGVsZXRlIERETWFuYWdlci5kcmFnRWxlbWVudDtcbiAgICBkZWxldGUgRERNYW5hZ2VyLmRyb3BFbGVtZW50O1xuICAgIC8vIGRvY3VtZW50IGhhbmRsZXIgc28gd2UgY2FuIGNvbnRpbnVlIHJlY2VpdmluZyBtb3ZlcyBhcyB0aGUgaXRlbSBpcyAnZml4ZWQnIHBvc2l0aW9uLCBhbmQgY2FwdHVyZT10cnVlIHNvIFdFIGdldCBhIGZpcnN0IGNyYWNrXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fbW91c2VNb3ZlLCB0cnVlKTsgLy8gdHJ1ZT1jYXB0dXJlLCBub3QgYnViYmxlXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXAsIHRydWUpO1xuICAgIGlmIChpc1RvdWNoKSB7XG4gICAgICB0aGlzLmRyYWdFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0b3VjaG1vdmUpO1xuICAgICAgdGhpcy5kcmFnRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZCk7XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIC8vIHByZXZlbnREZWZhdWx0KCkgcHJldmVudHMgYmx1ciBldmVudCB3aGljaCBvY2N1cnMganVzdCBhZnRlciBtb3VzZWRvd24gZXZlbnQuXG4gICAgLy8gaWYgYW4gZWRpdGFibGUgY29udGVudCBoYXMgZm9jdXMsIHRoZW4gYmx1ciBtdXN0IGJlIGNhbGxcbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKTtcblxuICAgIERETWFuYWdlci5tb3VzZUhhbmRsZWQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBtZXRob2QgdG8gY2FsbCBhY3R1YWwgZHJhZyBldmVudCAqL1xuICBwcm90ZWN0ZWQgX2NhbGxEcmFnKGU6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnZ2luZykgcmV0dXJuO1xuICAgIGNvbnN0IGV2ID0gVXRpbHMuaW5pdEV2ZW50PERyYWdFdmVudD4oZSwgeyB0YXJnZXQ6IHRoaXMuZWwsIHR5cGU6ICdkcmFnJyB9KTtcbiAgICBpZiAodGhpcy5vcHRpb24uZHJhZykge1xuICAgICAgdGhpcy5vcHRpb24uZHJhZyhldiwgdGhpcy51aSgpKTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2RyYWcnLCBldik7XG4gIH1cblxuICAvKiogQGludGVybmFsIGNhbGxlZCB3aGVuIHRoZSBtYWluIHBhZ2UgKGFmdGVyIHN1Y2Nlc3NmdWwgbW91c2Vkb3duKSByZWNlaXZlcyBhIG1vdmUgZXZlbnQgdG8gZHJhZyB0aGUgaXRlbSBhcm91bmQgdGhlIHNjcmVlbiAqL1xuICBwcm90ZWN0ZWQgX21vdXNlTW92ZShlOiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyBjb25zb2xlLmxvZyhgJHtjb3VudCsrfSBtb3ZlICR7ZS54fSwke2UueX1gKVxuICAgIGxldCBzID0gdGhpcy5tb3VzZURvd25FdmVudDtcblxuICAgIGlmICh0aGlzLmRyYWdnaW5nKSB7XG4gICAgICB0aGlzLl9kcmFnRm9sbG93KGUpO1xuICAgICAgLy8gZGVsYXkgYWN0dWFsIGdyaWQgaGFuZGxpbmcgZHJhZyB1bnRpbCB3ZSBwYXVzZSBmb3IgYSB3aGlsZSBpZiBzZXRcbiAgICAgIGlmIChERE1hbmFnZXIucGF1c2VEcmFnKSB7XG4gICAgICAgIGNvbnN0IHBhdXNlID0gTnVtYmVyLmlzSW50ZWdlcihERE1hbmFnZXIucGF1c2VEcmFnKSA/IERETWFuYWdlci5wYXVzZURyYWcgYXMgbnVtYmVyIDogMTAwO1xuICAgICAgICBpZiAodGhpcy5kcmFnVGltZW91dCkgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmRyYWdUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5kcmFnVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuX2NhbGxEcmFnKGUpLCBwYXVzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jYWxsRHJhZyhlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGUueCAtIHMueCkgKyBNYXRoLmFicyhlLnkgLSBzLnkpID4gMykge1xuICAgICAgLyoqXG4gICAgICAgKiBkb24ndCBzdGFydCB1bmxlc3Mgd2UndmUgbW92ZWQgYXQgbGVhc3QgMyBwaXhlbHNcbiAgICAgICAqL1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICBERE1hbmFnZXIuZHJhZ0VsZW1lbnQgPSB0aGlzO1xuICAgICAgLy8gaWYgd2UncmUgZHJhZ2dpbmcgYW4gYWN0dWFsIGdyaWQgaXRlbSwgc2V0IHRoZSBjdXJyZW50IGRyb3AgYXMgdGhlIGdyaWQgKHRvIGRldGVjdCBlbnRlci9sZWF2ZSlcbiAgICAgIGxldCBncmlkID0gKHRoaXMuZWwgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudCkuZ3JpZHN0YWNrTm9kZT8uZ3JpZDtcbiAgICAgIGlmIChncmlkKSB7XG4gICAgICAgIERETWFuYWdlci5kcm9wRWxlbWVudCA9IChncmlkLmVsIGFzIERERWxlbWVudEhvc3QpLmRkRWxlbWVudC5kZERyb3BwYWJsZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBERE1hbmFnZXIuZHJvcEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICB0aGlzLmhlbHBlciA9IHRoaXMuX2NyZWF0ZUhlbHBlcihlKTtcbiAgICAgIHRoaXMuX3NldHVwSGVscGVyQ29udGFpbm1lbnRTdHlsZSgpO1xuICAgICAgdGhpcy5kcmFnT2Zmc2V0ID0gdGhpcy5fZ2V0RHJhZ09mZnNldChlLCB0aGlzLmVsLCB0aGlzLmhlbHBlckNvbnRhaW5tZW50KTtcbiAgICAgIGNvbnN0IGV2ID0gVXRpbHMuaW5pdEV2ZW50PERyYWdFdmVudD4oZSwgeyB0YXJnZXQ6IHRoaXMuZWwsIHR5cGU6ICdkcmFnc3RhcnQnIH0pO1xuXG4gICAgICB0aGlzLl9zZXR1cEhlbHBlclN0eWxlKGUpO1xuICAgICAgaWYgKHRoaXMub3B0aW9uLnN0YXJ0KSB7XG4gICAgICAgIHRoaXMub3B0aW9uLnN0YXJ0KGV2LCB0aGlzLnVpKCkpO1xuICAgICAgfVxuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2RyYWdzdGFydCcsIGV2KTtcbiAgICB9XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpOyAvLyBuZWVkZWQgb3RoZXJ3aXNlIHdlIGdldCB0ZXh0IHN3ZWVwIHRleHQgc2VsZWN0aW9uIGFzIHdlIGRyYWcgYXJvdW5kXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGludGVybmFsIGNhbGwgd2hlbiB0aGUgbW91c2UgZ2V0cyByZWxlYXNlZCB0byBkcm9wIHRoZSBpdGVtIGF0IGN1cnJlbnQgbG9jYXRpb24gKi9cbiAgcHJvdGVjdGVkIF9tb3VzZVVwKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9tb3VzZU1vdmUsIHRydWUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9tb3VzZVVwLCB0cnVlKTtcbiAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgdGhpcy5kcmFnRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdG91Y2htb3ZlLCB0cnVlKTtcbiAgICAgIHRoaXMuZHJhZ0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hlbmQsIHRydWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kcmFnZ2luZykge1xuICAgICAgZGVsZXRlIHRoaXMuZHJhZ2dpbmc7XG5cbiAgICAgIC8vIHJlc2V0IHRoZSBkcm9wIHRhcmdldCBpZiBkcmFnZ2luZyBvdmVyIG91cnNlbGYgKGFscmVhZHkgcGFyZW50ZWQsIGp1c3QgbW92aW5nIGR1cmluZyBzdG9wIGNhbGxiYWNrIGJlbG93KVxuICAgICAgaWYgKERETWFuYWdlci5kcm9wRWxlbWVudD8uZWwgPT09IHRoaXMuZWwucGFyZW50RWxlbWVudCkge1xuICAgICAgICBkZWxldGUgRERNYW5hZ2VyLmRyb3BFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhlbHBlckNvbnRhaW5tZW50LnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wYXJlbnRPcmlnaW5TdHlsZVBvc2l0aW9uIHx8IG51bGw7XG4gICAgICBpZiAodGhpcy5oZWxwZXIgPT09IHRoaXMuZWwpIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlSGVscGVyU3R5bGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGVscGVyLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgZXYgPSBVdGlscy5pbml0RXZlbnQ8RHJhZ0V2ZW50PihlLCB7IHRhcmdldDogdGhpcy5lbCwgdHlwZTogJ2RyYWdzdG9wJyB9KTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbi5zdG9wKSB7XG4gICAgICAgIHRoaXMub3B0aW9uLnN0b3AoZXYpOyAvLyBOT1RFOiBkZXN0cm95KCkgd2lsbCBiZSBjYWxsZWQgd2hlbiByZW1vdmluZyBpdGVtLCBzbyBleHBlY3QgTlVMTCBwdHIgYWZ0ZXIhXG4gICAgICB9XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudCgnZHJhZ3N0b3AnLCBldik7XG5cbiAgICAgIC8vIGNhbGwgdGhlIGRyb3BwYWJsZSBtZXRob2QgdG8gcmVjZWl2ZSB0aGUgaXRlbVxuICAgICAgaWYgKERETWFuYWdlci5kcm9wRWxlbWVudCkge1xuICAgICAgICBERE1hbmFnZXIuZHJvcEVsZW1lbnQuZHJvcChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuaGVscGVyO1xuICAgIGRlbGV0ZSB0aGlzLm1vdXNlRG93bkV2ZW50O1xuICAgIGRlbGV0ZSBERE1hbmFnZXIuZHJhZ0VsZW1lbnQ7XG4gICAgZGVsZXRlIERETWFuYWdlci5kcm9wRWxlbWVudDtcbiAgICBkZWxldGUgRERNYW5hZ2VyLm1vdXNlSGFuZGxlZDtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsIGNyZWF0ZSBhIGNsb25lIGNvcHkgKG9yIHVzZXIgZGVmaW5lZCBtZXRob2QpIG9mIHRoZSBvcmlnaW5hbCBkcmFnIGl0ZW0gaWYgc2V0ICovXG4gIHByb3RlY3RlZCBfY3JlYXRlSGVscGVyKGV2ZW50OiBEcmFnRXZlbnQpOiBIVE1MRWxlbWVudCB7XG4gICAgbGV0IGhlbHBlciA9IHRoaXMuZWw7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbi5oZWxwZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhlbHBlciA9IHRoaXMub3B0aW9uLmhlbHBlcihldmVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbi5oZWxwZXIgPT09ICdjbG9uZScpIHtcbiAgICAgIGhlbHBlciA9IFV0aWxzLmNsb25lTm9kZSh0aGlzLmVsKTtcbiAgICB9XG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGhlbHBlcikpIHtcbiAgICAgIFV0aWxzLmFwcGVuZFRvKGhlbHBlciwgdGhpcy5vcHRpb24uYXBwZW5kVG8gPT09ICdwYXJlbnQnID8gdGhpcy5lbC5wYXJlbnRFbGVtZW50IDogdGhpcy5vcHRpb24uYXBwZW5kVG8pO1xuICAgIH1cbiAgICBpZiAoaGVscGVyID09PSB0aGlzLmVsKSB7XG4gICAgICB0aGlzLmRyYWdFbGVtZW50T3JpZ2luU3R5bGUgPSBERERyYWdnYWJsZS5vcmlnaW5TdHlsZVByb3AubWFwKHByb3AgPT4gdGhpcy5lbC5zdHlsZVtwcm9wXSk7XG4gICAgfVxuICAgIHJldHVybiBoZWxwZXI7XG4gIH1cblxuICAvKiogQGludGVybmFsIHNldCB0aGUgZml4IHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2VkIGl0ZW0gKi9cbiAgcHJvdGVjdGVkIF9zZXR1cEhlbHBlclN0eWxlKGU6IERyYWdFdmVudCk6IERERHJhZ2dhYmxlIHtcbiAgICB0aGlzLmhlbHBlci5jbGFzc0xpc3QuYWRkKCd1aS1kcmFnZ2FibGUtZHJhZ2dpbmcnKTtcbiAgICAvLyBUT0RPOiBzZXQgYWxsIGF0IG9uY2Ugd2l0aCBzdHlsZS5jc3NUZXh0ICs9IC4uLiA/IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM5Njg1OTNcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuaGVscGVyLnN0eWxlO1xuICAgIHN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIG5lZWRlZCBmb3Igb3ZlciBpdGVtcyB0byBnZXQgZW50ZXIvbGVhdmVcbiAgICAvLyBzdHlsZS5jdXJzb3IgPSAnbW92ZSc7IC8vICBUT0RPOiBjYW4ndCBzZXQgd2l0aCBwb2ludGVyRXZlbnRzPW5vbmUgISAoZG9uZSBpbiBDU1MgYXMgd2VsbClcbiAgICBzdHlsZS53aWR0aCA9IHRoaXMuZHJhZ09mZnNldC53aWR0aCArICdweCc7XG4gICAgc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcmFnT2Zmc2V0LmhlaWdodCArICdweCc7XG4gICAgc3R5bGUud2lsbENoYW5nZSA9ICdsZWZ0LCB0b3AnO1xuICAgIHN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsgLy8gbGV0IHVzIGRyYWcgYmV0d2VlbiBncmlkcyBieSBub3QgY2xpcHBpbmcgYXMgcGFyZW50IC5ncmlkLXN0YWNrIGlzIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgdGhpcy5fZHJhZ0ZvbGxvdyhlKTsgLy8gbm93IHBvc2l0aW9uIGl0XG4gICAgc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJzsgLy8gc2hvdyB1cCBpbnN0YW50bHlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhlbHBlcikge1xuICAgICAgICBzdHlsZS50cmFuc2l0aW9uID0gbnVsbDsgLy8gcmVjb3ZlciBhbmltYXRpb25cbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgcmVzdG9yZSBiYWNrIHRoZSBvcmlnaW5hbCBzdHlsZSBiZWZvcmUgZHJhZ2dpbmcgKi9cbiAgcHJvdGVjdGVkIF9yZW1vdmVIZWxwZXJTdHlsZSgpOiBERERyYWdnYWJsZSB7XG4gICAgdGhpcy5oZWxwZXIuY2xhc3NMaXN0LnJlbW92ZSgndWktZHJhZ2dhYmxlLWRyYWdnaW5nJyk7XG4gICAgbGV0IG5vZGUgPSAodGhpcy5oZWxwZXIgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudCk/LmdyaWRzdGFja05vZGU7XG4gICAgLy8gZG9uJ3QgYm90aGVyIHJlc3RvcmluZyBzdHlsZXMgaWYgd2UncmUgZ29ubmEgcmVtb3ZlIGFueXdheS4uLlxuICAgIGlmICghbm9kZT8uX2lzQWJvdXRUb1JlbW92ZSAmJiB0aGlzLmRyYWdFbGVtZW50T3JpZ2luU3R5bGUpIHtcbiAgICAgIGxldCBoZWxwZXIgPSB0aGlzLmhlbHBlcjtcbiAgICAgIC8vIGRvbid0IGFuaW1hdGUsIG90aGVyd2lzZSB3ZSBhbmltYXRlIG9mZnNldGVkIHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gJ2Fic29sdXRlJyBmcm9tICdmaXhlZCcuXG4gICAgICAvLyBUT0RPOiB0aGlzIGFsc28gcmVtb3ZlcyByZXNpemluZyBhbmltYXRpb24gd2hpY2ggZG9lc24ndCBoYXZlIHRoaXMgaXNzdWUsIGJ1dCBvdGhlcnMuXG4gICAgICAvLyBJZGVhbGx5IGJvdGggd291bGQgYW5pbWF0ZSAoJ21vdmUnIHdvdWxkIGltbWVkaWF0ZWx5IHJlc3RvcmUgJ2Fic29sdXRlJyBhbmQgYWRqdXN0IGNvb3JkaW5hdGUgdG8gbWF0Y2gsXG4gICAgICAvLyB0aGVuIHRyaWdnZXIgYSBkZWxheSAocmVwYWludCkgdG8gcmVzdG9yZSB0byBmaW5hbCBkZXN0IHdpdGggYW5pbWF0ZSkgYnV0IHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgJ3Jlc2l6ZXN0b3AnXG4gICAgICAvLyBpcyBjYWxsZWQgQUZURVIgJ3RyYW5zaXRpb25lbmQnIGV2ZW50IGlzIHJlY2VpdmVkIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dyaWRzdGFjay9ncmlkc3RhY2suanMvaXNzdWVzLzIwMzMpXG4gICAgICBsZXQgdHJhbnNpdGlvbiA9IHRoaXMuZHJhZ0VsZW1lbnRPcmlnaW5TdHlsZVsndHJhbnNpdGlvbiddIHx8IG51bGw7XG4gICAgICBoZWxwZXIuc3R5bGUudHJhbnNpdGlvbiA9IHRoaXMuZHJhZ0VsZW1lbnRPcmlnaW5TdHlsZVsndHJhbnNpdGlvbiddID0gJ25vbmUnOyAvLyBjYW4ndCBiZSBOVUxMICMxOTczXG4gICAgICBERERyYWdnYWJsZS5vcmlnaW5TdHlsZVByb3AuZm9yRWFjaChwcm9wID0+IGhlbHBlci5zdHlsZVtwcm9wXSA9IHRoaXMuZHJhZ0VsZW1lbnRPcmlnaW5TdHlsZVtwcm9wXSB8fCBudWxsKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gaGVscGVyLnN0eWxlLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uLCA1MCk7IC8vIHJlY292ZXIgYW5pbWF0aW9uIGZyb20gc2F2ZWQgdmFycyBhZnRlciBhIHBhdXNlICgwIGlzbid0IGVub3VnaCAjMTk3MylcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuZHJhZ0VsZW1lbnRPcmlnaW5TdHlsZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgdXBkYXRlcyB0aGUgdG9wL2xlZnQgcG9zaXRpb24gdG8gZm9sbG93IHRoZSBtb3VzZSAqL1xuICBwcm90ZWN0ZWQgX2RyYWdGb2xsb3coZTogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgbGV0IGNvbnRhaW5tZW50UmVjdCA9IHsgbGVmdDogMCwgdG9wOiAwIH07XG4gICAgLy8gaWYgKHRoaXMuaGVscGVyLnN0eWxlLnBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7IC8vIHdlIHVzZSAnZml4ZWQnXG4gICAgLy8gICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gdGhpcy5oZWxwZXJDb250YWlubWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgIGNvbnRhaW5tZW50UmVjdCA9IHsgbGVmdCwgdG9wIH07XG4gICAgLy8gfVxuICAgIGNvbnN0IHN0eWxlID0gdGhpcy5oZWxwZXIuc3R5bGU7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5kcmFnT2Zmc2V0O1xuICAgIHN0eWxlLmxlZnQgPSBlLmNsaWVudFggKyBvZmZzZXQub2Zmc2V0TGVmdCAtIGNvbnRhaW5tZW50UmVjdC5sZWZ0ICsgJ3B4JztcbiAgICBzdHlsZS50b3AgPSBlLmNsaWVudFkgKyBvZmZzZXQub2Zmc2V0VG9wIC0gY29udGFpbm1lbnRSZWN0LnRvcCArICdweCc7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBfc2V0dXBIZWxwZXJDb250YWlubWVudFN0eWxlKCk6IERERHJhZ2dhYmxlIHtcbiAgICB0aGlzLmhlbHBlckNvbnRhaW5tZW50ID0gdGhpcy5oZWxwZXIucGFyZW50RWxlbWVudDtcbiAgICBpZiAodGhpcy5oZWxwZXIuc3R5bGUucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgIHRoaXMucGFyZW50T3JpZ2luU3R5bGVQb3NpdGlvbiA9IHRoaXMuaGVscGVyQ29udGFpbm1lbnQuc3R5bGUucG9zaXRpb247XG4gICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5oZWxwZXJDb250YWlubWVudCkucG9zaXRpb24ubWF0Y2goL3N0YXRpYy8pKSB7XG4gICAgICAgIHRoaXMuaGVscGVyQ29udGFpbm1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9nZXREcmFnT2Zmc2V0KGV2ZW50OiBEcmFnRXZlbnQsIGVsOiBIVE1MRWxlbWVudCwgcGFyZW50OiBIVE1MRWxlbWVudCk6IERyYWdPZmZzZXQge1xuXG4gICAgLy8gaW4gY2FzZSBhbmNlc3RvciBoYXMgdHJhbnNmb3JtL3BlcnNwZWN0aXZlIGNzcyBwcm9wZXJ0aWVzIHRoYXQgY2hhbmdlIHRoZSB2aWV3cG9pbnRcbiAgICBsZXQgeGZvcm1PZmZzZXRYID0gMDtcbiAgICBsZXQgeGZvcm1PZmZzZXRZID0gMDtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBjb25zdCB0ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIFV0aWxzLmFkZEVsU3R5bGVzKHRlc3RFbCwge1xuICAgICAgICBvcGFjaXR5OiAnMCcsXG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB0b3A6IDAgKyAncHgnLFxuICAgICAgICBsZWZ0OiAwICsgJ3B4JyxcbiAgICAgICAgd2lkdGg6ICcxcHgnLFxuICAgICAgICBoZWlnaHQ6ICcxcHgnLFxuICAgICAgICB6SW5kZXg6ICctOTk5OTk5JyxcbiAgICAgIH0pO1xuICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRlc3RFbCk7XG4gICAgICBjb25zdCB0ZXN0RWxQb3NpdGlvbiA9IHRlc3RFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZCh0ZXN0RWwpO1xuICAgICAgeGZvcm1PZmZzZXRYID0gdGVzdEVsUG9zaXRpb24ubGVmdDtcbiAgICAgIHhmb3JtT2Zmc2V0WSA9IHRlc3RFbFBvc2l0aW9uLnRvcDtcbiAgICAgIC8vIFRPRE86IHNjYWxlID9cbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRPZmZzZXQgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogdGFyZ2V0T2Zmc2V0LmxlZnQsXG4gICAgICB0b3A6IHRhcmdldE9mZnNldC50b3AsXG4gICAgICBvZmZzZXRMZWZ0OiAtIGV2ZW50LmNsaWVudFggKyB0YXJnZXRPZmZzZXQubGVmdCAtIHhmb3JtT2Zmc2V0WCxcbiAgICAgIG9mZnNldFRvcDogLSBldmVudC5jbGllbnRZICsgdGFyZ2V0T2Zmc2V0LnRvcCAtIHhmb3JtT2Zmc2V0WSxcbiAgICAgIHdpZHRoOiB0YXJnZXRPZmZzZXQud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRhcmdldE9mZnNldC5oZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBUT0RPOiBzZXQgdG8gcHVibGljIGFzIGNhbGxlZCBieSBERERyb3BwYWJsZSEgKi9cbiAgcHVibGljIHVpKCk6IEREVUlEYXRhIHtcbiAgICBjb25zdCBjb250YWlubWVudEVsID0gdGhpcy5lbC5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnN0IGNvbnRhaW5tZW50UmVjdCA9IGNvbnRhaW5tZW50RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5oZWxwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiB7IC8vQ3VycmVudCBDU1MgcG9zaXRpb24gb2YgdGhlIGhlbHBlciBhcyB7IHRvcCwgbGVmdCB9IG9iamVjdFxuICAgICAgICB0b3A6IG9mZnNldC50b3AgLSBjb250YWlubWVudFJlY3QudG9wLFxuICAgICAgICBsZWZ0OiBvZmZzZXQubGVmdCAtIGNvbnRhaW5tZW50UmVjdC5sZWZ0XG4gICAgICB9XG4gICAgICAvKiBub3QgdXNlZCBieSBHcmlkU3RhY2sgZm9yIG5vdy4uLlxuICAgICAgaGVscGVyOiBbdGhpcy5oZWxwZXJdLCAvL1RoZSBvYmplY3QgYXJyIHJlcHJlc2VudGluZyB0aGUgaGVscGVyIHRoYXQncyBiZWluZyBkcmFnZ2VkLlxuICAgICAgb2Zmc2V0OiB7IHRvcDogb2Zmc2V0LnRvcCwgbGVmdDogb2Zmc2V0LmxlZnQgfSAvLyBDdXJyZW50IG9mZnNldCBwb3NpdGlvbiBvZiB0aGUgaGVscGVyIGFzIHsgdG9wLCBsZWZ0IH0gb2JqZWN0LlxuICAgICAgKi9cbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///366\n")},677:function(__unused_webpack_module,exports,__webpack_require__){eval("\n/**\n * dd-droppable.ts 8.2.2\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.DDDroppable = void 0;\nvar dd_manager_1 = __webpack_require__(839);\nvar dd_base_impl_1 = __webpack_require__(74);\nvar utils_1 = __webpack_require__(867);\nvar dd_touch_1 = __webpack_require__(537);\n// let count = 0; // TEST\nvar DDDroppable = /** @class */ (function (_super) {\n __extends(DDDroppable, _super);\n function DDDroppable(el, opts) {\n if (opts === void 0) { opts = {}; }\n var _this = _super.call(this) || this;\n _this.el = el;\n _this.option = opts;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n _this._mouseEnter = _this._mouseEnter.bind(_this);\n _this._mouseLeave = _this._mouseLeave.bind(_this);\n _this.enable();\n _this._setupAccept();\n return _this;\n }\n DDDroppable.prototype.on = function (event, callback) {\n _super.prototype.on.call(this, event, callback);\n };\n DDDroppable.prototype.off = function (event) {\n _super.prototype.off.call(this, event);\n };\n DDDroppable.prototype.enable = function () {\n if (this.disabled === false)\n return;\n _super.prototype.enable.call(this);\n this.el.classList.add('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n this.el.addEventListener('mouseenter', this._mouseEnter);\n this.el.addEventListener('mouseleave', this._mouseLeave);\n if (dd_touch_1.isTouch) {\n this.el.addEventListener('pointerenter', dd_touch_1.pointerenter);\n this.el.addEventListener('pointerleave', dd_touch_1.pointerleave);\n }\n };\n DDDroppable.prototype.disable = function (forDestroy) {\n if (forDestroy === void 0) { forDestroy = false; }\n if (this.disabled === true)\n return;\n _super.prototype.disable.call(this);\n this.el.classList.remove('ui-droppable');\n if (!forDestroy)\n this.el.classList.add('ui-droppable-disabled');\n this.el.removeEventListener('mouseenter', this._mouseEnter);\n this.el.removeEventListener('mouseleave', this._mouseLeave);\n if (dd_touch_1.isTouch) {\n this.el.removeEventListener('pointerenter', dd_touch_1.pointerenter);\n this.el.removeEventListener('pointerleave', dd_touch_1.pointerleave);\n }\n };\n DDDroppable.prototype.destroy = function () {\n this.disable(true);\n this.el.classList.remove('ui-droppable');\n this.el.classList.remove('ui-droppable-disabled');\n _super.prototype.destroy.call(this);\n };\n DDDroppable.prototype.updateOption = function (opts) {\n var _this = this;\n Object.keys(opts).forEach(function (key) { return _this.option[key] = opts[key]; });\n this._setupAccept();\n return this;\n };\n /** @internal called when the cursor enters our area - prepare for a possible drop and track leaving */\n DDDroppable.prototype._mouseEnter = function (e) {\n // console.log(`${count++} Enter ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!dd_manager_1.DDManager.dragElement)\n return;\n if (!this._canDrop(dd_manager_1.DDManager.dragElement.el))\n return;\n e.preventDefault();\n e.stopPropagation();\n // make sure when we enter this, that the last one gets a leave FIRST to correctly cleanup as we don't always do\n if (dd_manager_1.DDManager.dropElement && dd_manager_1.DDManager.dropElement !== this) {\n dd_manager_1.DDManager.dropElement._mouseLeave(e);\n }\n dd_manager_1.DDManager.dropElement = this;\n var ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'dropover' });\n if (this.option.over) {\n this.option.over(ev, this._ui(dd_manager_1.DDManager.dragElement));\n }\n this.triggerEvent('dropover', ev);\n this.el.classList.add('ui-droppable-over');\n // console.log('tracking'); // TEST\n };\n /** @internal called when the item is leaving our area, stop tracking if we had moving item */\n DDDroppable.prototype._mouseLeave = function (e) {\n var _a;\n // console.log(`${count++} Leave ${this.el.id || (this.el as GridHTMLElement).gridstack.opts.id}`); // TEST\n if (!dd_manager_1.DDManager.dragElement || dd_manager_1.DDManager.dropElement !== this)\n return;\n e.preventDefault();\n e.stopPropagation();\n var ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'dropout' });\n if (this.option.out) {\n this.option.out(ev, this._ui(dd_manager_1.DDManager.dragElement));\n }\n this.triggerEvent('dropout', ev);\n if (dd_manager_1.DDManager.dropElement === this) {\n delete dd_manager_1.DDManager.dropElement;\n // console.log('not tracking'); // TEST\n // if we're still over a parent droppable, send it an enter as we don't get one from leaving nested children\n var parentDrop = void 0;\n var parent_1 = this.el.parentElement;\n while (!parentDrop && parent_1) {\n parentDrop = (_a = parent_1.ddElement) === null || _a === void 0 ? void 0 : _a.ddDroppable;\n parent_1 = parent_1.parentElement;\n }\n if (parentDrop) {\n parentDrop._mouseEnter(e);\n }\n }\n };\n /** item is being dropped on us - called by the drag mouseup handler - this calls the client drop event */\n DDDroppable.prototype.drop = function (e) {\n e.preventDefault();\n var ev = utils_1.Utils.initEvent(e, { target: this.el, type: 'drop' });\n if (this.option.drop) {\n this.option.drop(ev, this._ui(dd_manager_1.DDManager.dragElement));\n }\n this.triggerEvent('drop', ev);\n };\n /** @internal true if element matches the string/method accept option */\n DDDroppable.prototype._canDrop = function (el) {\n return el && (!this.accept || this.accept(el));\n };\n /** @internal */\n DDDroppable.prototype._setupAccept = function () {\n var _this = this;\n if (!this.option.accept)\n return this;\n if (typeof this.option.accept === 'string') {\n this.accept = function (el) { return el.matches(_this.option.accept); };\n }\n else {\n this.accept = this.option.accept;\n }\n return this;\n };\n /** @internal */\n DDDroppable.prototype._ui = function (drag) {\n return __assign({ draggable: drag.el }, drag.ui());\n };\n return DDDroppable;\n}(dd_base_impl_1.DDBaseImplement));\nexports.DDDroppable = DDDroppable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JDLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFDLEVBQWUsSUFBSyxTQUFFLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxNQUFNLENBQUMsTUFBZ0IsQ0FBQyxFQUF4QyxDQUF3QyxDQUFDO1NBQzdFO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ04seUJBQUcsR0FBYixVQUFjLElBQWlCO1FBQzdCLGtCQUNFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxJQUNmLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFDWjtJQUNKLENBQUM7SUFDSCxrQkFBQztBQUFELENBQUMsQ0F0SmdDLDhCQUFlLEdBc0ovQztBQXRKWSxrQ0FBVyIsInNvdXJjZXMiOlsid2VicGFjazovL0dyaWRTdGFjay8uL3NyYy9kZC1kcm9wcGFibGUudHM/ZmQ1YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRkLWRyb3BwYWJsZS50cyA4LjIuMlxuICogQ29weXJpZ2h0IChjKSAyMDIxLTIwMjIgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgREREcmFnZ2FibGUgfSBmcm9tICcuL2RkLWRyYWdnYWJsZSc7XG5pbXBvcnQgeyBERE1hbmFnZXIgfSBmcm9tICcuL2RkLW1hbmFnZXInO1xuaW1wb3J0IHsgRERCYXNlSW1wbGVtZW50LCBIVE1MRWxlbWVudEV4dGVuZE9wdCB9IGZyb20gJy4vZGQtYmFzZS1pbXBsJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEREVsZW1lbnRIb3N0IH0gZnJvbSAnLi9kZC1lbGVtZW50JztcbmltcG9ydCB7IGlzVG91Y2gsIHBvaW50ZXJlbnRlciwgcG9pbnRlcmxlYXZlIH0gZnJvbSAnLi9kZC10b3VjaCc7XG5pbXBvcnQgeyBERFVJRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERERHJvcHBhYmxlT3B0IHtcbiAgYWNjZXB0Pzogc3RyaW5nIHwgKChlbDogSFRNTEVsZW1lbnQpID0+IGJvb2xlYW4pO1xuICBkcm9wPzogKGV2ZW50OiBEcmFnRXZlbnQsIHVpOiBERFVJRGF0YSkgPT4gdm9pZDtcbiAgb3Zlcj86IChldmVudDogRHJhZ0V2ZW50LCB1aTogRERVSURhdGEpID0+IHZvaWQ7XG4gIG91dD86IChldmVudDogRHJhZ0V2ZW50LCB1aTogRERVSURhdGEpID0+IHZvaWQ7XG59XG5cbi8vIGxldCBjb3VudCA9IDA7IC8vIFRFU1RcblxuZXhwb3J0IGNsYXNzIERERHJvcHBhYmxlIGV4dGVuZHMgRERCYXNlSW1wbGVtZW50IGltcGxlbWVudHMgSFRNTEVsZW1lbnRFeHRlbmRPcHQ8REREcm9wcGFibGVPcHQ+IHtcblxuICBwdWJsaWMgYWNjZXB0OiAoZWw6IEhUTUxFbGVtZW50KSA9PiBib29sZWFuO1xuICBwdWJsaWMgZWw6IEhUTUxFbGVtZW50O1xuICBwdWJsaWMgb3B0aW9uOiBERERyb3BwYWJsZU9wdDtcblxuICBjb25zdHJ1Y3RvcihlbDogSFRNTEVsZW1lbnQsIG9wdHM6IERERHJvcHBhYmxlT3B0ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLm9wdGlvbiA9IG9wdHM7XG4gICAgLy8gY3JlYXRlIHZhciBldmVudCBiaW5kaW5nIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlIGFuZCBzdGlsbCBsb29rIGxpa2UgVFMgbWV0aG9kcyAodW5saWtlIGFub255bW91cyBmdW5jdGlvbnMpXG4gICAgdGhpcy5fbW91c2VFbnRlciA9IHRoaXMuX21vdXNlRW50ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9tb3VzZUxlYXZlID0gdGhpcy5fbW91c2VMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgdGhpcy5fc2V0dXBBY2NlcHQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbihldmVudDogJ2Ryb3AnIHwgJ2Ryb3BvdmVyJyB8ICdkcm9wb3V0JywgY2FsbGJhY2s6IChldmVudDogRHJhZ0V2ZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgc3VwZXIub24oZXZlbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHB1YmxpYyBvZmYoZXZlbnQ6ICdkcm9wJyB8ICdkcm9wb3ZlcicgfCAnZHJvcG91dCcpOiB2b2lkIHtcbiAgICBzdXBlci5vZmYoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcbiAgICBzdXBlci5lbmFibGUoKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3VpLWRyb3BwYWJsZScpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndWktZHJvcHBhYmxlLWRpc2FibGVkJyk7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5fbW91c2VFbnRlcik7XG4gICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5fbW91c2VMZWF2ZSk7XG4gICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJywgcG9pbnRlcmVudGVyKTtcbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgcG9pbnRlcmxlYXZlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmb3JEZXN0cm95ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xuICAgIHN1cGVyLmRpc2FibGUoKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3VpLWRyb3BwYWJsZScpO1xuICAgIGlmICghZm9yRGVzdHJveSkgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCd1aS1kcm9wcGFibGUtZGlzYWJsZWQnKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLl9tb3VzZUVudGVyKTtcbiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLl9tb3VzZUxlYXZlKTtcbiAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLCBwb2ludGVyZW50ZXIpO1xuICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybGVhdmUnLCBwb2ludGVybGVhdmUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZSh0cnVlKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3VpLWRyb3BwYWJsZScpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndWktZHJvcHBhYmxlLWRpc2FibGVkJyk7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZU9wdGlvbihvcHRzOiBERERyb3BwYWJsZU9wdCk6IERERHJvcHBhYmxlIHtcbiAgICBPYmplY3Qua2V5cyhvcHRzKS5mb3JFYWNoKGtleSA9PiB0aGlzLm9wdGlvbltrZXldID0gb3B0c1trZXldKTtcbiAgICB0aGlzLl9zZXR1cEFjY2VwdCgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBjYWxsZWQgd2hlbiB0aGUgY3Vyc29yIGVudGVycyBvdXIgYXJlYSAtIHByZXBhcmUgZm9yIGEgcG9zc2libGUgZHJvcCBhbmQgdHJhY2sgbGVhdmluZyAqL1xuICBwcm90ZWN0ZWQgX21vdXNlRW50ZXIoZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUubG9nKGAke2NvdW50Kyt9IEVudGVyICR7dGhpcy5lbC5pZCB8fCAodGhpcy5lbCBhcyBHcmlkSFRNTEVsZW1lbnQpLmdyaWRzdGFjay5vcHRzLmlkfWApOyAvLyBURVNUXG4gICAgaWYgKCFERE1hbmFnZXIuZHJhZ0VsZW1lbnQpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuX2NhbkRyb3AoRERNYW5hZ2VyLmRyYWdFbGVtZW50LmVsKSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gbWFrZSBzdXJlIHdoZW4gd2UgZW50ZXIgdGhpcywgdGhhdCB0aGUgbGFzdCBvbmUgZ2V0cyBhIGxlYXZlIEZJUlNUIHRvIGNvcnJlY3RseSBjbGVhbnVwIGFzIHdlIGRvbid0IGFsd2F5cyBkb1xuICAgIGlmIChERE1hbmFnZXIuZHJvcEVsZW1lbnQgJiYgRERNYW5hZ2VyLmRyb3BFbGVtZW50ICE9PSB0aGlzKSB7XG4gICAgICBERE1hbmFnZXIuZHJvcEVsZW1lbnQuX21vdXNlTGVhdmUoZSBhcyBEcmFnRXZlbnQpO1xuICAgIH1cbiAgICBERE1hbmFnZXIuZHJvcEVsZW1lbnQgPSB0aGlzO1xuXG4gICAgY29uc3QgZXYgPSBVdGlscy5pbml0RXZlbnQ8RHJhZ0V2ZW50PihlLCB7IHRhcmdldDogdGhpcy5lbCwgdHlwZTogJ2Ryb3BvdmVyJyB9KTtcbiAgICBpZiAodGhpcy5vcHRpb24ub3Zlcikge1xuICAgICAgdGhpcy5vcHRpb24ub3ZlcihldiwgdGhpcy5fdWkoRERNYW5hZ2VyLmRyYWdFbGVtZW50KSlcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2Ryb3BvdmVyJywgZXYpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndWktZHJvcHBhYmxlLW92ZXInKTtcbiAgICAvLyBjb25zb2xlLmxvZygndHJhY2tpbmcnKTsgLy8gVEVTVFxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBjYWxsZWQgd2hlbiB0aGUgaXRlbSBpcyBsZWF2aW5nIG91ciBhcmVhLCBzdG9wIHRyYWNraW5nIGlmIHdlIGhhZCBtb3ZpbmcgaXRlbSAqL1xuICBwcm90ZWN0ZWQgX21vdXNlTGVhdmUoZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUubG9nKGAke2NvdW50Kyt9IExlYXZlICR7dGhpcy5lbC5pZCB8fCAodGhpcy5lbCBhcyBHcmlkSFRNTEVsZW1lbnQpLmdyaWRzdGFjay5vcHRzLmlkfWApOyAvLyBURVNUXG4gICAgaWYgKCFERE1hbmFnZXIuZHJhZ0VsZW1lbnQgfHwgRERNYW5hZ2VyLmRyb3BFbGVtZW50ICE9PSB0aGlzKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBldiA9IFV0aWxzLmluaXRFdmVudDxEcmFnRXZlbnQ+KGUsIHsgdGFyZ2V0OiB0aGlzLmVsLCB0eXBlOiAnZHJvcG91dCcgfSk7XG4gICAgaWYgKHRoaXMub3B0aW9uLm91dCkge1xuICAgICAgdGhpcy5vcHRpb24ub3V0KGV2LCB0aGlzLl91aShERE1hbmFnZXIuZHJhZ0VsZW1lbnQpKVxuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudCgnZHJvcG91dCcsIGV2KTtcblxuICAgIGlmIChERE1hbmFnZXIuZHJvcEVsZW1lbnQgPT09IHRoaXMpIHtcbiAgICAgIGRlbGV0ZSBERE1hbmFnZXIuZHJvcEVsZW1lbnQ7XG4gICAgICAvLyBjb25zb2xlLmxvZygnbm90IHRyYWNraW5nJyk7IC8vIFRFU1RcblxuICAgICAgLy8gaWYgd2UncmUgc3RpbGwgb3ZlciBhIHBhcmVudCBkcm9wcGFibGUsIHNlbmQgaXQgYW4gZW50ZXIgYXMgd2UgZG9uJ3QgZ2V0IG9uZSBmcm9tIGxlYXZpbmcgbmVzdGVkIGNoaWxkcmVuXG4gICAgICBsZXQgcGFyZW50RHJvcDogREREcm9wcGFibGU7XG4gICAgICBsZXQgcGFyZW50OiBEREVsZW1lbnRIb3N0ID0gdGhpcy5lbC5wYXJlbnRFbGVtZW50O1xuICAgICAgd2hpbGUgKCFwYXJlbnREcm9wICYmIHBhcmVudCkge1xuICAgICAgICBwYXJlbnREcm9wID0gcGFyZW50LmRkRWxlbWVudD8uZGREcm9wcGFibGU7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudERyb3ApIHtcbiAgICAgICAgcGFyZW50RHJvcC5fbW91c2VFbnRlcihlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogaXRlbSBpcyBiZWluZyBkcm9wcGVkIG9uIHVzIC0gY2FsbGVkIGJ5IHRoZSBkcmFnIG1vdXNldXAgaGFuZGxlciAtIHRoaXMgY2FsbHMgdGhlIGNsaWVudCBkcm9wIGV2ZW50ICovXG4gIHB1YmxpYyBkcm9wKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZXYgPSBVdGlscy5pbml0RXZlbnQ8RHJhZ0V2ZW50PihlLCB7IHRhcmdldDogdGhpcy5lbCwgdHlwZTogJ2Ryb3AnIH0pO1xuICAgIGlmICh0aGlzLm9wdGlvbi5kcm9wKSB7XG4gICAgICB0aGlzLm9wdGlvbi5kcm9wKGV2LCB0aGlzLl91aShERE1hbmFnZXIuZHJhZ0VsZW1lbnQpKVxuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudCgnZHJvcCcsIGV2KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgdHJ1ZSBpZiBlbGVtZW50IG1hdGNoZXMgdGhlIHN0cmluZy9tZXRob2QgYWNjZXB0IG9wdGlvbiAqL1xuICBwcm90ZWN0ZWQgX2NhbkRyb3AoZWw6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVsICYmICghdGhpcy5hY2NlcHQgfHwgdGhpcy5hY2NlcHQoZWwpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9zZXR1cEFjY2VwdCgpOiBERERyb3BwYWJsZSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbi5hY2NlcHQpIHJldHVybiB0aGlzO1xuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb24uYWNjZXB0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5hY2NlcHQgPSAoZWw6IEhUTUxFbGVtZW50KSA9PiBlbC5tYXRjaGVzKHRoaXMub3B0aW9uLmFjY2VwdCBhcyBzdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjY2VwdCA9IHRoaXMub3B0aW9uLmFjY2VwdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBfdWkoZHJhZzogREREcmFnZ2FibGUpOiBERFVJRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRyYWdnYWJsZTogZHJhZy5lbCxcbiAgICAgIC4uLmRyYWcudWkoKVxuICAgIH07XG4gIH1cbn1cblxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///677\n")},259:function(__unused_webpack_module,exports,__webpack_require__){eval("\n/**\n * dd-elements.ts 8.2.2\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.DDElement = void 0;\nvar dd_resizable_1 = __webpack_require__(904);\nvar dd_draggable_1 = __webpack_require__(366);\nvar dd_droppable_1 = __webpack_require__(677);\nvar DDElement = /** @class */ (function () {\n function DDElement(el) {\n this.el = el;\n }\n DDElement.init = function (el) {\n if (!el.ddElement) {\n el.ddElement = new DDElement(el);\n }\n return el.ddElement;\n };\n DDElement.prototype.on = function (eventName, callback) {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.on(eventName, callback);\n }\n else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.on(eventName, callback);\n }\n else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.on(eventName, callback);\n }\n return this;\n };\n DDElement.prototype.off = function (eventName) {\n if (this.ddDraggable && ['drag', 'dragstart', 'dragstop'].indexOf(eventName) > -1) {\n this.ddDraggable.off(eventName);\n }\n else if (this.ddDroppable && ['drop', 'dropover', 'dropout'].indexOf(eventName) > -1) {\n this.ddDroppable.off(eventName);\n }\n else if (this.ddResizable && ['resizestart', 'resize', 'resizestop'].indexOf(eventName) > -1) {\n this.ddResizable.off(eventName);\n }\n return this;\n };\n DDElement.prototype.setupDraggable = function (opts) {\n if (!this.ddDraggable) {\n this.ddDraggable = new dd_draggable_1.DDDraggable(this.el, opts);\n }\n else {\n this.ddDraggable.updateOption(opts);\n }\n return this;\n };\n DDElement.prototype.cleanDraggable = function () {\n if (this.ddDraggable) {\n this.ddDraggable.destroy();\n delete this.ddDraggable;\n }\n return this;\n };\n DDElement.prototype.setupResizable = function (opts) {\n if (!this.ddResizable) {\n this.ddResizable = new dd_resizable_1.DDResizable(this.el, opts);\n }\n else {\n this.ddResizable.updateOption(opts);\n }\n return this;\n };\n DDElement.prototype.cleanResizable = function () {\n if (this.ddResizable) {\n this.ddResizable.destroy();\n delete this.ddResizable;\n }\n return this;\n };\n DDElement.prototype.setupDroppable = function (opts) {\n if (!this.ddDroppable) {\n this.ddDroppable = new dd_droppable_1.DDDroppable(this.el, opts);\n }\n else {\n this.ddDroppable.updateOption(opts);\n }\n return this;\n };\n DDElement.prototype.cleanDroppable = function () {\n if (this.ddDroppable) {\n this.ddDroppable.destroy();\n delete this.ddDroppable;\n }\n return this;\n };\n return DDElement;\n}());\nexports.DDElement = DDElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LDhCQUFTIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vR3JpZFN0YWNrLy4vc3JjL2RkLWVsZW1lbnQudHM/MDU5NiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRkLWVsZW1lbnRzLnRzIDguMi4yXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgRERSZXNpemFibGUsIEREUmVzaXphYmxlT3B0IH0gZnJvbSAnLi9kZC1yZXNpemFibGUnO1xuaW1wb3J0IHsgR3JpZEl0ZW1IVE1MRWxlbWVudCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgREREcmFnZ2FibGUsIERERHJhZ2dhYmxlT3B0IH0gZnJvbSAnLi9kZC1kcmFnZ2FibGUnO1xuaW1wb3J0IHsgREREcm9wcGFibGUsIERERHJvcHBhYmxlT3B0IH0gZnJvbSAnLi9kZC1kcm9wcGFibGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERERWxlbWVudEhvc3QgZXh0ZW5kcyBHcmlkSXRlbUhUTUxFbGVtZW50IHtcbiAgZGRFbGVtZW50PzogRERFbGVtZW50O1xufVxuXG5leHBvcnQgY2xhc3MgRERFbGVtZW50IHtcblxuICBzdGF0aWMgaW5pdChlbDogRERFbGVtZW50SG9zdCk6IERERWxlbWVudCB7XG4gICAgaWYgKCFlbC5kZEVsZW1lbnQpIHsgZWwuZGRFbGVtZW50ID0gbmV3IERERWxlbWVudChlbCk7IH1cbiAgICByZXR1cm4gZWwuZGRFbGVtZW50O1xuICB9XG5cbiAgcHVibGljIGVsOiBEREVsZW1lbnRIb3N0O1xuICBwdWJsaWMgZGREcmFnZ2FibGU/OiBERERyYWdnYWJsZTtcbiAgcHVibGljIGRkRHJvcHBhYmxlPzogREREcm9wcGFibGU7XG4gIHB1YmxpYyBkZFJlc2l6YWJsZT86IEREUmVzaXphYmxlO1xuXG4gIGNvbnN0cnVjdG9yKGVsOiBEREVsZW1lbnRIb3N0KSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICB9XG5cbiAgcHVibGljIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkKTogRERFbGVtZW50IHtcbiAgICBpZiAodGhpcy5kZERyYWdnYWJsZSAmJiBbJ2RyYWcnLCAnZHJhZ3N0YXJ0JywgJ2RyYWdzdG9wJ10uaW5kZXhPZihldmVudE5hbWUpID4gLTEpIHtcbiAgICAgIHRoaXMuZGREcmFnZ2FibGUub24oZXZlbnROYW1lIGFzICdkcmFnJyB8ICdkcmFnc3RhcnQnIHwgJ2RyYWdzdG9wJywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kZERyb3BwYWJsZSAmJiBbJ2Ryb3AnLCAnZHJvcG92ZXInLCAnZHJvcG91dCddLmluZGV4T2YoZXZlbnROYW1lKSA+IC0xKSB7XG4gICAgICB0aGlzLmRkRHJvcHBhYmxlLm9uKGV2ZW50TmFtZSBhcyAnZHJvcCcgfCAnZHJvcG92ZXInIHwgJ2Ryb3BvdXQnLCBjYWxsYmFjayk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRkUmVzaXphYmxlICYmIFsncmVzaXplc3RhcnQnLCAncmVzaXplJywgJ3Jlc2l6ZXN0b3AnXS5pbmRleE9mKGV2ZW50TmFtZSkgPiAtMSkge1xuICAgICAgdGhpcy5kZFJlc2l6YWJsZS5vbihldmVudE5hbWUgYXMgJ3Jlc2l6ZXN0YXJ0JyB8ICdyZXNpemUnIHwgJ3Jlc2l6ZXN0b3AnLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIG9mZihldmVudE5hbWU6IHN0cmluZyk6IERERWxlbWVudCB7XG4gICAgaWYgKHRoaXMuZGREcmFnZ2FibGUgJiYgWydkcmFnJywgJ2RyYWdzdGFydCcsICdkcmFnc3RvcCddLmluZGV4T2YoZXZlbnROYW1lKSA+IC0xKSB7XG4gICAgICB0aGlzLmRkRHJhZ2dhYmxlLm9mZihldmVudE5hbWUgYXMgJ2RyYWcnIHwgJ2RyYWdzdGFydCcgfCAnZHJhZ3N0b3AnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGREcm9wcGFibGUgJiYgWydkcm9wJywgJ2Ryb3BvdmVyJywgJ2Ryb3BvdXQnXS5pbmRleE9mKGV2ZW50TmFtZSkgPiAtMSkge1xuICAgICAgdGhpcy5kZERyb3BwYWJsZS5vZmYoZXZlbnROYW1lIGFzICdkcm9wJyB8ICdkcm9wb3ZlcicgfCAnZHJvcG91dCcpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kZFJlc2l6YWJsZSAmJiBbJ3Jlc2l6ZXN0YXJ0JywgJ3Jlc2l6ZScsICdyZXNpemVzdG9wJ10uaW5kZXhPZihldmVudE5hbWUpID4gLTEpIHtcbiAgICAgIHRoaXMuZGRSZXNpemFibGUub2ZmKGV2ZW50TmFtZSBhcyAncmVzaXplc3RhcnQnIHwgJ3Jlc2l6ZScgfCAncmVzaXplc3RvcCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXR1cERyYWdnYWJsZShvcHRzOiBERERyYWdnYWJsZU9wdCk6IERERWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLmRkRHJhZ2dhYmxlKSB7XG4gICAgICB0aGlzLmRkRHJhZ2dhYmxlID0gbmV3IERERHJhZ2dhYmxlKHRoaXMuZWwsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRkRHJhZ2dhYmxlLnVwZGF0ZU9wdGlvbihvcHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgY2xlYW5EcmFnZ2FibGUoKTogRERFbGVtZW50IHtcbiAgICBpZiAodGhpcy5kZERyYWdnYWJsZSkge1xuICAgICAgdGhpcy5kZERyYWdnYWJsZS5kZXN0cm95KCk7XG4gICAgICBkZWxldGUgdGhpcy5kZERyYWdnYWJsZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0dXBSZXNpemFibGUob3B0czogRERSZXNpemFibGVPcHQpOiBEREVsZW1lbnQge1xuICAgIGlmICghdGhpcy5kZFJlc2l6YWJsZSkge1xuICAgICAgdGhpcy5kZFJlc2l6YWJsZSA9IG5ldyBERFJlc2l6YWJsZSh0aGlzLmVsLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZFJlc2l6YWJsZS51cGRhdGVPcHRpb24ob3B0cyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGNsZWFuUmVzaXphYmxlKCk6IERERWxlbWVudCB7XG4gICAgaWYgKHRoaXMuZGRSZXNpemFibGUpIHtcbiAgICAgIHRoaXMuZGRSZXNpemFibGUuZGVzdHJveSgpO1xuICAgICAgZGVsZXRlIHRoaXMuZGRSZXNpemFibGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldHVwRHJvcHBhYmxlKG9wdHM6IERERHJvcHBhYmxlT3B0KTogRERFbGVtZW50IHtcbiAgICBpZiAoIXRoaXMuZGREcm9wcGFibGUpIHtcbiAgICAgIHRoaXMuZGREcm9wcGFibGUgPSBuZXcgREREcm9wcGFibGUodGhpcy5lbCwgb3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGREcm9wcGFibGUudXBkYXRlT3B0aW9uKG9wdHMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBjbGVhbkRyb3BwYWJsZSgpOiBEREVsZW1lbnQge1xuICAgIGlmICh0aGlzLmRkRHJvcHBhYmxlKSB7XG4gICAgICB0aGlzLmRkRHJvcHBhYmxlLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmRkRHJvcHBhYmxlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///259\n")},502:function(__unused_webpack_module,exports,__webpack_require__){eval("\n/**\n * dd-gridstack.ts 8.2.2\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.DDGridStack = void 0;\nvar utils_1 = __webpack_require__(867);\nvar dd_manager_1 = __webpack_require__(839);\nvar dd_element_1 = __webpack_require__(259);\n// let count = 0; // TEST\n/**\n * HTML Native Mouse and Touch Events Drag and Drop functionality.\n */\nvar DDGridStack = /** @class */ (function () {\n function DDGridStack() {\n }\n DDGridStack.prototype.resizable = function (el, opts, key, value) {\n this._getDDElements(el).forEach(function (dEl) {\n var _a;\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddResizable && dEl.ddResizable[opts](); // can't create DD as it requires options for setupResizable()\n }\n else if (opts === 'destroy') {\n dEl.ddResizable && dEl.cleanResizable();\n }\n else if (opts === 'option') {\n dEl.setupResizable((_a = {}, _a[key] = value, _a));\n }\n else {\n var grid = dEl.el.gridstackNode.grid;\n var handles = dEl.el.getAttribute('gs-resize-handles') ? dEl.el.getAttribute('gs-resize-handles') : grid.opts.resizable.handles;\n var autoHide = !grid.opts.alwaysShowResizeHandle;\n dEl.setupResizable(__assign(__assign(__assign({}, grid.opts.resizable), { handles: handles, autoHide: autoHide }), {\n start: opts.start,\n stop: opts.stop,\n resize: opts.resize\n }));\n }\n });\n return this;\n };\n DDGridStack.prototype.draggable = function (el, opts, key, value) {\n this._getDDElements(el).forEach(function (dEl) {\n var _a;\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDraggable && dEl.ddDraggable[opts](); // can't create DD as it requires options for setupDraggable()\n }\n else if (opts === 'destroy') {\n dEl.ddDraggable && dEl.cleanDraggable();\n }\n else if (opts === 'option') {\n dEl.setupDraggable((_a = {}, _a[key] = value, _a));\n }\n else {\n var grid = dEl.el.gridstackNode.grid;\n dEl.setupDraggable(__assign(__assign({}, grid.opts.draggable), {\n // containment: (grid.parentGridItem && !grid.opts.dragOut) ? grid.el.parentElement : (grid.opts.draggable.containment || null),\n start: opts.start,\n stop: opts.stop,\n drag: opts.drag\n }));\n }\n });\n return this;\n };\n DDGridStack.prototype.dragIn = function (el, opts) {\n this._getDDElements(el).forEach(function (dEl) { return dEl.setupDraggable(opts); });\n return this;\n };\n DDGridStack.prototype.droppable = function (el, opts, key, value) {\n if (typeof opts.accept === 'function' && !opts._accept) {\n opts._accept = opts.accept;\n opts.accept = function (el) { return opts._accept(el); };\n }\n this._getDDElements(el).forEach(function (dEl) {\n var _a;\n if (opts === 'disable' || opts === 'enable') {\n dEl.ddDroppable && dEl.ddDroppable[opts]();\n }\n else if (opts === 'destroy') {\n if (dEl.ddDroppable) { // error to call destroy if not there\n dEl.cleanDroppable();\n }\n }\n else if (opts === 'option') {\n dEl.setupDroppable((_a = {}, _a[key] = value, _a));\n }\n else {\n dEl.setupDroppable(opts);\n }\n });\n return this;\n };\n /** true if element is droppable */\n DDGridStack.prototype.isDroppable = function (el) {\n return !!(el && el.ddElement && el.ddElement.ddDroppable && !el.ddElement.ddDroppable.disabled);\n };\n /** true if element is draggable */\n DDGridStack.prototype.isDraggable = function (el) {\n return !!(el && el.ddElement && el.ddElement.ddDraggable && !el.ddElement.ddDraggable.disabled);\n };\n /** true if element is draggable */\n DDGridStack.prototype.isResizable = function (el) {\n return !!(el && el.ddElement && el.ddElement.ddResizable && !el.ddElement.ddResizable.disabled);\n };\n DDGridStack.prototype.on = function (el, name, callback) {\n this._getDDElements(el).forEach(function (dEl) {\n return dEl.on(name, function (event) {\n callback(event, dd_manager_1.DDManager.dragElement ? dd_manager_1.DDManager.dragElement.el : event.target, dd_manager_1.DDManager.dragElement ? dd_manager_1.DDManager.dragElement.helper : null);\n });\n });\n return this;\n };\n DDGridStack.prototype.off = function (el, name) {\n this._getDDElements(el).forEach(function (dEl) { return dEl.off(name); });\n return this;\n };\n /** @internal returns a list of DD elements, creating them on the fly by default */\n DDGridStack.prototype._getDDElements = function (els, create) {\n if (create === void 0) { create = true; }\n var hosts = utils_1.Utils.getElements(els);\n if (!hosts.length)\n return [];\n var list = hosts.map(function (e) { return e.ddElement || (create ? dd_element_1.DDElement.init(e) : null); });\n if (!create) {\n list.filter(function (d) { return d; });\n } // remove nulls\n return list;\n };\n return DDGridStack;\n}());\nexports.DDGridStack = DDGridStack;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QXRIWSxrQ0FBVyIsInNvdXJjZXMiOlsid2VicGFjazovL0dyaWRTdGFjay8uL3NyYy9kZC1ncmlkc3RhY2sudHM/MmMzMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogZGQtZ3JpZHN0YWNrLnRzIDguMi4yXHJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cclxuaW1wb3J0IHsgR3JpZEl0ZW1IVE1MRWxlbWVudCwgR3JpZFN0YWNrRWxlbWVudCwgREREcmFnSW5PcHQgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgRERNYW5hZ2VyIH0gZnJvbSAnLi9kZC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRERFbGVtZW50LCBEREVsZW1lbnRIb3N0IH0gZnJvbSAnLi9kZC1lbGVtZW50JztcclxuXHJcbi8qKiBEcmFnJkRyb3AgZHJvcCBvcHRpb25zICovXHJcbmV4cG9ydCB0eXBlIERERHJvcE9wdCA9IHtcclxuICAvKiogZnVuY3Rpb24gb3IgY2xhc3MgdHlwZSB0aGF0IHRoaXMgZ3JpZCB3aWxsIGFjY2VwdCBhcyBkcm9wcGVkIGl0ZW1zIChzZWUgR3JpZFN0YWNrT3B0aW9ucy5hY2NlcHRXaWRnZXRzKSAqL1xyXG4gIGFjY2VwdD86IChlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCkgPT4gYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIGRyYWcmZHJvcCBvcHRpb25zIGN1cnJlbnRseSBjYWxsZWQgZnJvbSB0aGUgbWFpbiBjb2RlLCBidXQgb3RoZXJzIGNhbiBiZSBwYXNzZWQgaW4gZ3JpZCBvcHRpb25zICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbmV4cG9ydCB0eXBlIERET3B0cyA9ICdlbmFibGUnIHwgJ2Rpc2FibGUnIHwgJ2Rlc3Ryb3knIHwgJ29wdGlvbicgfCBzdHJpbmcgfCBhbnk7XHJcbmV4cG9ydCB0eXBlIERES2V5ID0gJ21pbldpZHRoJyB8ICdtaW5IZWlnaHQnIHwgJ21heFdpZHRoJyB8ICdtYXhIZWlnaHQnO1xyXG5leHBvcnQgdHlwZSBERFZhbHVlID0gbnVtYmVyIHwgc3RyaW5nO1xyXG5cclxuLyoqIGRyYWcmZHJvcCBldmVudHMgY2FsbGJhY2tzICovXHJcbmV4cG9ydCB0eXBlIEREQ2FsbGJhY2sgPSAoZXZlbnQ6IEV2ZW50LCBhcmcyOiBHcmlkSXRlbUhUTUxFbGVtZW50LCBoZWxwZXI/OiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB2b2lkO1xyXG5cclxuLy8gbGV0IGNvdW50ID0gMDsgLy8gVEVTVFxyXG5cclxuLyoqXHJcbiAqIEhUTUwgTmF0aXZlIE1vdXNlIGFuZCBUb3VjaCBFdmVudHMgRHJhZyBhbmQgRHJvcCBmdW5jdGlvbmFsaXR5LlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERER3JpZFN0YWNrIHtcclxuXHJcbiAgcHVibGljIHJlc2l6YWJsZShlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCwgb3B0czogRERPcHRzLCBrZXk/OiBEREtleSwgdmFsdWU/OiBERFZhbHVlKTogRERHcmlkU3RhY2sge1xyXG4gICAgdGhpcy5fZ2V0RERFbGVtZW50cyhlbCkuZm9yRWFjaChkRWwgPT4ge1xyXG4gICAgICBpZiAob3B0cyA9PT0gJ2Rpc2FibGUnIHx8IG9wdHMgPT09ICdlbmFibGUnKSB7XHJcbiAgICAgICAgZEVsLmRkUmVzaXphYmxlICYmIGRFbC5kZFJlc2l6YWJsZVtvcHRzXSgpOyAvLyBjYW4ndCBjcmVhdGUgREQgYXMgaXQgcmVxdWlyZXMgb3B0aW9ucyBmb3Igc2V0dXBSZXNpemFibGUoKVxyXG4gICAgICB9IGVsc2UgaWYgKG9wdHMgPT09ICdkZXN0cm95Jykge1xyXG4gICAgICAgIGRFbC5kZFJlc2l6YWJsZSAmJiBkRWwuY2xlYW5SZXNpemFibGUoKTtcclxuICAgICAgfSBlbHNlIGlmIChvcHRzID09PSAnb3B0aW9uJykge1xyXG4gICAgICAgIGRFbC5zZXR1cFJlc2l6YWJsZSh7IFtrZXldOiB2YWx1ZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBncmlkID0gZEVsLmVsLmdyaWRzdGFja05vZGUuZ3JpZDtcclxuICAgICAgICBsZXQgaGFuZGxlcyA9IGRFbC5lbC5nZXRBdHRyaWJ1dGUoJ2dzLXJlc2l6ZS1oYW5kbGVzJykgPyBkRWwuZWwuZ2V0QXR0cmlidXRlKCdncy1yZXNpemUtaGFuZGxlcycpIDogZ3JpZC5vcHRzLnJlc2l6YWJsZS5oYW5kbGVzO1xyXG4gICAgICAgIGxldCBhdXRvSGlkZSA9ICFncmlkLm9wdHMuYWx3YXlzU2hvd1Jlc2l6ZUhhbmRsZTtcclxuICAgICAgICBkRWwuc2V0dXBSZXNpemFibGUoe1xyXG4gICAgICAgICAgLi4uZ3JpZC5vcHRzLnJlc2l6YWJsZSxcclxuICAgICAgICAgIC4uLnsgaGFuZGxlcywgYXV0b0hpZGUgfSxcclxuICAgICAgICAgIC4uLntcclxuICAgICAgICAgICAgc3RhcnQ6IG9wdHMuc3RhcnQsXHJcbiAgICAgICAgICAgIHN0b3A6IG9wdHMuc3RvcCxcclxuICAgICAgICAgICAgcmVzaXplOiBvcHRzLnJlc2l6ZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRyYWdnYWJsZShlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCwgb3B0czogRERPcHRzLCBrZXk/OiBEREtleSwgdmFsdWU/OiBERFZhbHVlKTogRERHcmlkU3RhY2sge1xyXG4gICAgdGhpcy5fZ2V0RERFbGVtZW50cyhlbCkuZm9yRWFjaChkRWwgPT4ge1xyXG4gICAgICBpZiAob3B0cyA9PT0gJ2Rpc2FibGUnIHx8IG9wdHMgPT09ICdlbmFibGUnKSB7XHJcbiAgICAgICAgZEVsLmRkRHJhZ2dhYmxlICYmIGRFbC5kZERyYWdnYWJsZVtvcHRzXSgpOyAvLyBjYW4ndCBjcmVhdGUgREQgYXMgaXQgcmVxdWlyZXMgb3B0aW9ucyBmb3Igc2V0dXBEcmFnZ2FibGUoKVxyXG4gICAgICB9IGVsc2UgaWYgKG9wdHMgPT09ICdkZXN0cm95Jykge1xyXG4gICAgICAgIGRFbC5kZERyYWdnYWJsZSAmJiBkRWwuY2xlYW5EcmFnZ2FibGUoKTtcclxuICAgICAgfSBlbHNlIGlmIChvcHRzID09PSAnb3B0aW9uJykge1xyXG4gICAgICAgIGRFbC5zZXR1cERyYWdnYWJsZSh7IFtrZXldOiB2YWx1ZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBncmlkID0gZEVsLmVsLmdyaWRzdGFja05vZGUuZ3JpZDtcclxuICAgICAgICBkRWwuc2V0dXBEcmFnZ2FibGUoe1xyXG4gICAgICAgICAgLi4uZ3JpZC5vcHRzLmRyYWdnYWJsZSxcclxuICAgICAgICAgIC4uLntcclxuICAgICAgICAgICAgLy8gY29udGFpbm1lbnQ6IChncmlkLnBhcmVudEdyaWRJdGVtICYmICFncmlkLm9wdHMuZHJhZ091dCkgPyBncmlkLmVsLnBhcmVudEVsZW1lbnQgOiAoZ3JpZC5vcHRzLmRyYWdnYWJsZS5jb250YWlubWVudCB8fCBudWxsKSxcclxuICAgICAgICAgICAgc3RhcnQ6IG9wdHMuc3RhcnQsXHJcbiAgICAgICAgICAgIHN0b3A6IG9wdHMuc3RvcCxcclxuICAgICAgICAgICAgZHJhZzogb3B0cy5kcmFnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZHJhZ0luKGVsOiBHcmlkU3RhY2tFbGVtZW50LCBvcHRzOiBERERyYWdJbk9wdCk6IERER3JpZFN0YWNrIHtcclxuICAgIHRoaXMuX2dldERERWxlbWVudHMoZWwpLmZvckVhY2goZEVsID0+IGRFbC5zZXR1cERyYWdnYWJsZShvcHRzKSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkcm9wcGFibGUoZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQsIG9wdHM6IERET3B0cyB8IERERHJvcE9wdCwga2V5PzogRERLZXksIHZhbHVlPzogRERWYWx1ZSk6IERER3JpZFN0YWNrIHtcclxuICAgIGlmICh0eXBlb2Ygb3B0cy5hY2NlcHQgPT09ICdmdW5jdGlvbicgJiYgIW9wdHMuX2FjY2VwdCkge1xyXG4gICAgICBvcHRzLl9hY2NlcHQgPSBvcHRzLmFjY2VwdDtcclxuICAgICAgb3B0cy5hY2NlcHQgPSAoZWwpID0+IG9wdHMuX2FjY2VwdChlbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9nZXREREVsZW1lbnRzKGVsKS5mb3JFYWNoKGRFbCA9PiB7XHJcbiAgICAgIGlmIChvcHRzID09PSAnZGlzYWJsZScgfHwgb3B0cyA9PT0gJ2VuYWJsZScpIHtcclxuICAgICAgICBkRWwuZGREcm9wcGFibGUgJiYgZEVsLmRkRHJvcHBhYmxlW29wdHNdKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAob3B0cyA9PT0gJ2Rlc3Ryb3knKSB7XHJcbiAgICAgICAgaWYgKGRFbC5kZERyb3BwYWJsZSkgeyAvLyBlcnJvciB0byBjYWxsIGRlc3Ryb3kgaWYgbm90IHRoZXJlXHJcbiAgICAgICAgICBkRWwuY2xlYW5Ecm9wcGFibGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAob3B0cyA9PT0gJ29wdGlvbicpIHtcclxuICAgICAgICBkRWwuc2V0dXBEcm9wcGFibGUoeyBba2V5XTogdmFsdWUgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZEVsLnNldHVwRHJvcHBhYmxlKG9wdHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIHRydWUgaWYgZWxlbWVudCBpcyBkcm9wcGFibGUgKi9cclxuICBwdWJsaWMgaXNEcm9wcGFibGUoZWw6IERERWxlbWVudEhvc3QpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIShlbCAmJiBlbC5kZEVsZW1lbnQgJiYgZWwuZGRFbGVtZW50LmRkRHJvcHBhYmxlICYmICFlbC5kZEVsZW1lbnQuZGREcm9wcGFibGUuZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIHRydWUgaWYgZWxlbWVudCBpcyBkcmFnZ2FibGUgKi9cclxuICBwdWJsaWMgaXNEcmFnZ2FibGUoZWw6IERERWxlbWVudEhvc3QpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIShlbCAmJiBlbC5kZEVsZW1lbnQgJiYgZWwuZGRFbGVtZW50LmRkRHJhZ2dhYmxlICYmICFlbC5kZEVsZW1lbnQuZGREcmFnZ2FibGUuZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIHRydWUgaWYgZWxlbWVudCBpcyBkcmFnZ2FibGUgKi9cclxuICBwdWJsaWMgaXNSZXNpemFibGUoZWw6IERERWxlbWVudEhvc3QpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIShlbCAmJiBlbC5kZEVsZW1lbnQgJiYgZWwuZGRFbGVtZW50LmRkUmVzaXphYmxlICYmICFlbC5kZEVsZW1lbnQuZGRSZXNpemFibGUuZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uKGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBERENhbGxiYWNrKTogRERHcmlkU3RhY2sge1xyXG4gICAgdGhpcy5fZ2V0RERFbGVtZW50cyhlbCkuZm9yRWFjaChkRWwgPT5cclxuICAgICAgZEVsLm9uKG5hbWUsIChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgICBjYWxsYmFjayhcclxuICAgICAgICAgIGV2ZW50LFxyXG4gICAgICAgICAgRERNYW5hZ2VyLmRyYWdFbGVtZW50ID8gRERNYW5hZ2VyLmRyYWdFbGVtZW50LmVsIDogZXZlbnQudGFyZ2V0IGFzIEdyaWRJdGVtSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgICBERE1hbmFnZXIuZHJhZ0VsZW1lbnQgPyBERE1hbmFnZXIuZHJhZ0VsZW1lbnQuaGVscGVyIDogbnVsbClcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvZmYoZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IERER3JpZFN0YWNrIHtcclxuICAgIHRoaXMuX2dldERERWxlbWVudHMoZWwpLmZvckVhY2goZEVsID0+IGRFbC5vZmYobmFtZSkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIHJldHVybnMgYSBsaXN0IG9mIEREIGVsZW1lbnRzLCBjcmVhdGluZyB0aGVtIG9uIHRoZSBmbHkgYnkgZGVmYXVsdCAqL1xyXG4gIHByb3RlY3RlZCBfZ2V0RERFbGVtZW50cyhlbHM6IEdyaWRTdGFja0VsZW1lbnQsIGNyZWF0ZSA9IHRydWUpOiBEREVsZW1lbnRbXSB7XHJcbiAgICBsZXQgaG9zdHMgPSBVdGlscy5nZXRFbGVtZW50cyhlbHMpIGFzIERERWxlbWVudEhvc3RbXTtcclxuICAgIGlmICghaG9zdHMubGVuZ3RoKSByZXR1cm4gW107XHJcbiAgICBsZXQgbGlzdCA9IGhvc3RzLm1hcChlID0+IGUuZGRFbGVtZW50IHx8IChjcmVhdGUgPyBEREVsZW1lbnQuaW5pdChlKSA6IG51bGwpKTtcclxuICAgIGlmICghY3JlYXRlKSB7IGxpc3QuZmlsdGVyKGQgPT4gZCk7IH0gLy8gcmVtb3ZlIG51bGxzXHJcbiAgICByZXR1cm4gbGlzdDtcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///502\n")},839:function(__unused_webpack_module,exports){eval('\n/**\n * dd-manager.ts 8.2.2\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\nObject.defineProperty(exports, "__esModule", ({ value: true }));\nexports.DDManager = void 0;\n/**\n * globals that are shared across Drag & Drop instances\n */\nvar DDManager = /** @class */ (function () {\n function DDManager() {\n }\n return DDManager;\n}());\nexports.DDManager = DDManager;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODM5LmpzIiwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQU1IOztHQUVHO0FBQ0g7SUFBQTtJQWdCQSxDQUFDO0lBQUQsZ0JBQUM7QUFBRCxDQUFDO0FBaEJZLDhCQUFTIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vR3JpZFN0YWNrLy4vc3JjL2RkLW1hbmFnZXIudHM/M2ZlMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGRkLW1hbmFnZXIudHMgOC4yLjJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBERERyYWdnYWJsZSB9IGZyb20gJy4vZGQtZHJhZ2dhYmxlJztcbmltcG9ydCB7IERERHJvcHBhYmxlIH0gZnJvbSAnLi9kZC1kcm9wcGFibGUnO1xuaW1wb3J0IHsgRERSZXNpemFibGUgfSBmcm9tICcuL2RkLXJlc2l6YWJsZSc7XG5cbi8qKlxuICogZ2xvYmFscyB0aGF0IGFyZSBzaGFyZWQgYWNyb3NzIERyYWcgJiBEcm9wIGluc3RhbmNlc1xuICovXG5leHBvcnQgY2xhc3MgRERNYW5hZ2VyIHtcbiAgLyoqIGlmIHNldCAodHJ1ZSB8IGluIG1zZWMpLCBkcmFnZ2luZyBwbGFjZW1lbnQgKGNvbGxpc2lvbikgd2lsbCBvbmx5IGhhcHBlbiBhZnRlciBhIHBhdXNlIGJ5IHRoZSB1c2VyKi9cbiAgcHVibGljIHN0YXRpYyBwYXVzZURyYWc6IGJvb2xlYW4gfCBudW1iZXI7XG5cbiAgLyoqIHRydWUgaWYgYSBtb3VzZSBkb3duIGV2ZW50IHdhcyBoYW5kbGVkICovXG4gIHB1YmxpYyBzdGF0aWMgbW91c2VIYW5kbGVkOiBib29sZWFuO1xuXG4gIC8qKiBpdGVtIGJlaW5nIGRyYWdnZWQgKi9cbiAgcHVibGljIHN0YXRpYyBkcmFnRWxlbWVudDogREREcmFnZ2FibGU7XG5cbiAgLyoqIGl0ZW0gd2UgYXJlIGN1cnJlbnRseSBvdmVyIGFzIGRyb3AgdGFyZ2V0ICovXG4gIHB1YmxpYyBzdGF0aWMgZHJvcEVsZW1lbnQ6IERERHJvcHBhYmxlO1xuXG4gIC8qKiBjdXJyZW50IGl0ZW0gd2UncmUgb3ZlciBmb3IgcmVzaXppbmcgcHVycG9zZSAoaWdub3JlIG5lc3RlZCBncmlkIHJlc2l6ZSBoYW5kbGVzKSAqL1xuICBwdWJsaWMgc3RhdGljIG92ZXJSZXNpemVFbGVtZW50OiBERFJlc2l6YWJsZTtcblxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///839\n')},664:function(__unused_webpack_module,exports,__webpack_require__){eval("\n/**\n * dd-resizable-handle.ts 8.2.2\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.DDResizableHandle = void 0;\nvar dd_touch_1 = __webpack_require__(537);\nvar DDResizableHandle = exports.DDResizableHandle = /** @class */ (function () {\n function DDResizableHandle(host, direction, option) {\n /** @internal true after we've moved enough pixels to start a resize */\n this.moving = false;\n this.host = host;\n this.dir = direction;\n this.option = option;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this._init();\n }\n /** @internal */\n DDResizableHandle.prototype._init = function () {\n var el = document.createElement('div');\n el.classList.add('ui-resizable-handle');\n el.classList.add(\"\".concat(DDResizableHandle.prefix).concat(this.dir));\n el.style.zIndex = '100';\n el.style.userSelect = 'none';\n this.el = el;\n this.host.appendChild(this.el);\n this.el.addEventListener('mousedown', this._mouseDown);\n if (dd_touch_1.isTouch) {\n this.el.addEventListener('touchstart', dd_touch_1.touchstart);\n this.el.addEventListener('pointerdown', dd_touch_1.pointerdown);\n // this.el.style.touchAction = 'none'; // not needed unlike pointerdown doc comment\n }\n return this;\n };\n /** call this when resize handle needs to be removed and cleaned up */\n DDResizableHandle.prototype.destroy = function () {\n if (this.moving)\n this._mouseUp(this.mouseDownEvent);\n this.el.removeEventListener('mousedown', this._mouseDown);\n if (dd_touch_1.isTouch) {\n this.el.removeEventListener('touchstart', dd_touch_1.touchstart);\n this.el.removeEventListener('pointerdown', dd_touch_1.pointerdown);\n }\n this.host.removeChild(this.el);\n delete this.el;\n delete this.host;\n return this;\n };\n /** @internal called on mouse down on us: capture move on the entire document (mouse might not stay on us) until we release the mouse */\n DDResizableHandle.prototype._mouseDown = function (e) {\n this.mouseDownEvent = e;\n document.addEventListener('mousemove', this._mouseMove, true); // capture, not bubble\n document.addEventListener('mouseup', this._mouseUp, true);\n if (dd_touch_1.isTouch) {\n this.el.addEventListener('touchmove', dd_touch_1.touchmove);\n this.el.addEventListener('touchend', dd_touch_1.touchend);\n }\n e.stopPropagation();\n e.preventDefault();\n };\n /** @internal */\n DDResizableHandle.prototype._mouseMove = function (e) {\n var s = this.mouseDownEvent;\n if (this.moving) {\n this._triggerEvent('move', e);\n }\n else if (Math.abs(e.x - s.x) + Math.abs(e.y - s.y) > 2) {\n // don't start unless we've moved at least 3 pixels\n this.moving = true;\n this._triggerEvent('start', this.mouseDownEvent);\n this._triggerEvent('move', e);\n }\n e.stopPropagation();\n e.preventDefault();\n };\n /** @internal */\n DDResizableHandle.prototype._mouseUp = function (e) {\n if (this.moving) {\n this._triggerEvent('stop', e);\n }\n document.removeEventListener('mousemove', this._mouseMove, true);\n document.removeEventListener('mouseup', this._mouseUp, true);\n if (dd_touch_1.isTouch) {\n this.el.removeEventListener('touchmove', dd_touch_1.touchmove);\n this.el.removeEventListener('touchend', dd_touch_1.touchend);\n }\n delete this.moving;\n delete this.mouseDownEvent;\n e.stopPropagation();\n e.preventDefault();\n };\n /** @internal */\n DDResizableHandle.prototype._triggerEvent = function (name, event) {\n if (this.option[name])\n this.option[name](event);\n return this;\n };\n /** @internal */\n DDResizableHandle.prefix = 'ui-resizable-';\n return DDResizableHandle;\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ04sb0NBQVEsR0FBbEIsVUFBbUIsQ0FBYTtRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvQjtRQUNELFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0QsSUFBSSxrQkFBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsb0JBQVMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLG1CQUFRLENBQUMsQ0FBQztTQUNuRDtRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDM0IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ04seUNBQWEsR0FBdkIsVUFBd0IsSUFBWSxFQUFFLEtBQWlCO1FBQ3JELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQWhHRCxnQkFBZ0I7SUFDQyx3QkFBTSxHQUFHLGVBQWUsQ0FBQztJQWdHNUMsd0JBQUM7Q0FBQSIsInNvdXJjZXMiOlsid2VicGFjazovL0dyaWRTdGFjay8uL3NyYy9kZC1yZXNpemFibGUtaGFuZGxlLnRzP2YzZTUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZC1yZXNpemFibGUtaGFuZGxlLnRzIDguMi4yXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtMjAyMiBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBpc1RvdWNoLCBwb2ludGVyZG93biwgdG91Y2hlbmQsIHRvdWNobW92ZSwgdG91Y2hzdGFydCB9IGZyb20gJy4vZGQtdG91Y2gnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEREUmVzaXphYmxlSGFuZGxlT3B0IHtcbiAgc3RhcnQ/OiAoZXZlbnQpID0+IHZvaWQ7XG4gIG1vdmU/OiAoZXZlbnQpID0+IHZvaWQ7XG4gIHN0b3A/OiAoZXZlbnQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBERFJlc2l6YWJsZUhhbmRsZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGVsOiBIVE1MRWxlbWVudDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgaG9zdDogSFRNTEVsZW1lbnQ7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIG9wdGlvbjogRERSZXNpemFibGVIYW5kbGVPcHQ7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGRpcjogc3RyaW5nO1xuICAvKiogQGludGVybmFsIHRydWUgYWZ0ZXIgd2UndmUgbW92ZWQgZW5vdWdoIHBpeGVscyB0byBzdGFydCBhIHJlc2l6ZSAqL1xuICBwcm90ZWN0ZWQgbW92aW5nID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIG1vdXNlRG93bkV2ZW50OiBNb3VzZUV2ZW50O1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBzdGF0aWMgcHJlZml4ID0gJ3VpLXJlc2l6YWJsZS0nO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb246IHN0cmluZywgb3B0aW9uOiBERFJlc2l6YWJsZUhhbmRsZU9wdCkge1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5kaXIgPSBkaXJlY3Rpb247XG4gICAgdGhpcy5vcHRpb24gPSBvcHRpb247XG4gICAgLy8gY3JlYXRlIHZhciBldmVudCBiaW5kaW5nIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlIGFuZCBzdGlsbCBsb29rIGxpa2UgVFMgbWV0aG9kcyAodW5saWtlIGFub255bW91cyBmdW5jdGlvbnMpXG4gICAgdGhpcy5fbW91c2VEb3duID0gdGhpcy5fbW91c2VEb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbW91c2VNb3ZlID0gdGhpcy5fbW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbW91c2VVcCA9IHRoaXMuX21vdXNlVXAuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9pbml0KCk6IEREUmVzaXphYmxlSGFuZGxlIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3VpLXJlc2l6YWJsZS1oYW5kbGUnKTtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKGAke0REUmVzaXphYmxlSGFuZGxlLnByZWZpeH0ke3RoaXMuZGlyfWApO1xuICAgIGVsLnN0eWxlLnpJbmRleCA9ICcxMDAnO1xuICAgIGVsLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMuaG9zdC5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcbiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX21vdXNlRG93bik7XG4gICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRvdWNoc3RhcnQpO1xuICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHBvaW50ZXJkb3duKTtcbiAgICAgIC8vIHRoaXMuZWwuc3R5bGUudG91Y2hBY3Rpb24gPSAnbm9uZSc7IC8vIG5vdCBuZWVkZWQgdW5saWtlIHBvaW50ZXJkb3duIGRvYyBjb21tZW50XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIGNhbGwgdGhpcyB3aGVuIHJlc2l6ZSBoYW5kbGUgbmVlZHMgdG8gYmUgcmVtb3ZlZCBhbmQgY2xlYW5lZCB1cCAqL1xuICBwdWJsaWMgZGVzdHJveSgpOiBERFJlc2l6YWJsZUhhbmRsZSB7XG4gICAgaWYgKHRoaXMubW92aW5nKSB0aGlzLl9tb3VzZVVwKHRoaXMubW91c2VEb3duRXZlbnQpO1xuICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fbW91c2VEb3duKTtcbiAgICBpZiAoaXNUb3VjaCkge1xuICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdG91Y2hzdGFydCk7XG4gICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgcG9pbnRlcmRvd24pO1xuICAgIH1cbiAgICB0aGlzLmhvc3QucmVtb3ZlQ2hpbGQodGhpcy5lbCk7XG4gICAgZGVsZXRlIHRoaXMuZWw7XG4gICAgZGVsZXRlIHRoaXMuaG9zdDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgY2FsbGVkIG9uIG1vdXNlIGRvd24gb24gdXM6IGNhcHR1cmUgbW92ZSBvbiB0aGUgZW50aXJlIGRvY3VtZW50IChtb3VzZSBtaWdodCBub3Qgc3RheSBvbiB1cykgdW50aWwgd2UgcmVsZWFzZSB0aGUgbW91c2UgKi9cbiAgcHJvdGVjdGVkIF9tb3VzZURvd24oZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubW91c2VEb3duRXZlbnQgPSBlO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZSwgdHJ1ZSk7IC8vIGNhcHR1cmUsIG5vdCBidWJibGVcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fbW91c2VVcCwgdHJ1ZSk7XG4gICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdG91Y2htb3ZlKTtcbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZCk7XG4gICAgfVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX21vdXNlTW92ZShlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgbGV0IHMgPSB0aGlzLm1vdXNlRG93bkV2ZW50O1xuICAgIGlmICh0aGlzLm1vdmluZykge1xuICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdtb3ZlJywgZSk7XG4gICAgfSBlbHNlIGlmIChNYXRoLmFicyhlLnggLSBzLngpICsgTWF0aC5hYnMoZS55IC0gcy55KSA+IDIpIHtcbiAgICAgIC8vIGRvbid0IHN0YXJ0IHVubGVzcyB3ZSd2ZSBtb3ZlZCBhdCBsZWFzdCAzIHBpeGVsc1xuICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdzdGFydCcsIHRoaXMubW91c2VEb3duRXZlbnQpO1xuICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdtb3ZlJywgZSk7XG4gICAgfVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX21vdXNlVXAoZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdmluZykge1xuICAgICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdzdG9wJywgZSk7XG4gICAgfVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXAsIHRydWUpO1xuICAgIGlmIChpc1RvdWNoKSB7XG4gICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRvdWNobW92ZSk7XG4gICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hlbmQpO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5tb3Zpbmc7XG4gICAgZGVsZXRlIHRoaXMubW91c2VEb3duRXZlbnQ7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBfdHJpZ2dlckV2ZW50KG5hbWU6IHN0cmluZywgZXZlbnQ6IE1vdXNlRXZlbnQpOiBERFJlc2l6YWJsZUhhbmRsZSB7XG4gICAgaWYgKHRoaXMub3B0aW9uW25hbWVdKSB0aGlzLm9wdGlvbltuYW1lXShldmVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///664\n")},904:function(__unused_webpack_module,exports,__webpack_require__){eval("\n/**\n * dd-resizable.ts 8.2.2\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.DDResizable = void 0;\nvar dd_resizable_handle_1 = __webpack_require__(664);\nvar dd_base_impl_1 = __webpack_require__(74);\nvar utils_1 = __webpack_require__(867);\nvar dd_manager_1 = __webpack_require__(839);\nvar DDResizable = exports.DDResizable = /** @class */ (function (_super) {\n __extends(DDResizable, _super);\n function DDResizable(el, opts) {\n if (opts === void 0) { opts = {}; }\n var _this = _super.call(this) || this;\n /** @internal */\n _this._ui = function () {\n var containmentEl = _this.el.parentElement;\n var containmentRect = containmentEl.getBoundingClientRect();\n var newRect = {\n width: _this.originalRect.width,\n height: _this.originalRect.height + _this.scrolled,\n left: _this.originalRect.left,\n top: _this.originalRect.top - _this.scrolled\n };\n var rect = _this.temporalRect || newRect;\n return {\n position: {\n left: rect.left - containmentRect.left,\n top: rect.top - containmentRect.top\n },\n size: {\n width: rect.width,\n height: rect.height\n }\n /* Gridstack ONLY needs position set above... keep around in case.\n element: [this.el], // The object representing the element to be resized\n helper: [], // TODO: not support yet - The object representing the helper that's being resized\n originalElement: [this.el],// we don't wrap here, so simplify as this.el //The object representing the original element before it is wrapped\n originalPosition: { // The position represented as { left, top } before the resizable is resized\n left: this.originalRect.left - containmentRect.left,\n top: this.originalRect.top - containmentRect.top\n },\n originalSize: { // The size represented as { width, height } before the resizable is resized\n width: this.originalRect.width,\n height: this.originalRect.height\n }\n */\n };\n };\n _this.el = el;\n _this.option = opts;\n // create var event binding so we can easily remove and still look like TS methods (unlike anonymous functions)\n _this._mouseOver = _this._mouseOver.bind(_this);\n _this._mouseOut = _this._mouseOut.bind(_this);\n _this.enable();\n _this._setupAutoHide(_this.option.autoHide);\n _this._setupHandlers();\n return _this;\n }\n DDResizable.prototype.on = function (event, callback) {\n _super.prototype.on.call(this, event, callback);\n };\n DDResizable.prototype.off = function (event) {\n _super.prototype.off.call(this, event);\n };\n DDResizable.prototype.enable = function () {\n _super.prototype.enable.call(this);\n this.el.classList.remove('ui-resizable-disabled');\n this._setupAutoHide(this.option.autoHide);\n };\n DDResizable.prototype.disable = function () {\n _super.prototype.disable.call(this);\n this.el.classList.add('ui-resizable-disabled');\n this._setupAutoHide(false);\n };\n DDResizable.prototype.destroy = function () {\n this._removeHandlers();\n this._setupAutoHide(false);\n delete this.el;\n _super.prototype.destroy.call(this);\n };\n DDResizable.prototype.updateOption = function (opts) {\n var _this = this;\n var updateHandles = (opts.handles && opts.handles !== this.option.handles);\n var updateAutoHide = (opts.autoHide && opts.autoHide !== this.option.autoHide);\n Object.keys(opts).forEach(function (key) { return _this.option[key] = opts[key]; });\n if (updateHandles) {\n this._removeHandlers();\n this._setupHandlers();\n }\n if (updateAutoHide) {\n this._setupAutoHide(this.option.autoHide);\n }\n return this;\n };\n /** @internal turns auto hide on/off */\n DDResizable.prototype._setupAutoHide = function (auto) {\n if (auto) {\n this.el.classList.add('ui-resizable-autohide');\n // use mouseover and not mouseenter to get better performance and track for nested cases\n this.el.addEventListener('mouseover', this._mouseOver);\n this.el.addEventListener('mouseout', this._mouseOut);\n }\n else {\n this.el.classList.remove('ui-resizable-autohide');\n this.el.removeEventListener('mouseover', this._mouseOver);\n this.el.removeEventListener('mouseout', this._mouseOut);\n if (dd_manager_1.DDManager.overResizeElement === this) {\n delete dd_manager_1.DDManager.overResizeElement;\n }\n }\n return this;\n };\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n DDResizable.prototype._mouseOver = function (e) {\n // console.log(`${count++} pre-enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n // already over a child, ignore. Ideally we just call e.stopPropagation() but see https://github.com/gridstack/gridstack.js/issues/2018\n if (dd_manager_1.DDManager.overResizeElement || dd_manager_1.DDManager.dragElement)\n return;\n dd_manager_1.DDManager.overResizeElement = this;\n // console.log(`${count++} enter ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.remove('ui-resizable-autohide');\n };\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n DDResizable.prototype._mouseOut = function (e) {\n // console.log(`${count++} pre-leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n if (dd_manager_1.DDManager.overResizeElement !== this)\n return;\n delete dd_manager_1.DDManager.overResizeElement;\n // console.log(`${count++} leave ${(this.el as GridItemHTMLElement).gridstackNode._id}`)\n this.el.classList.add('ui-resizable-autohide');\n };\n /** @internal */\n DDResizable.prototype._setupHandlers = function () {\n var _this = this;\n var handlerDirection = this.option.handles || 'e,s,se';\n if (handlerDirection === 'all') {\n handlerDirection = 'n,e,s,w,se,sw,ne,nw';\n }\n this.handlers = handlerDirection.split(',')\n .map(function (dir) { return dir.trim(); })\n .map(function (dir) { return new dd_resizable_handle_1.DDResizableHandle(_this.el, dir, {\n start: function (event) {\n _this._resizeStart(event);\n },\n stop: function (event) {\n _this._resizeStop(event);\n },\n move: function (event) {\n _this._resizing(event, dir);\n }\n }); });\n return this;\n };\n /** @internal */\n DDResizable.prototype._resizeStart = function (event) {\n this.originalRect = this.el.getBoundingClientRect();\n this.scrollEl = utils_1.Utils.getScrollElement(this.el);\n this.scrollY = this.scrollEl.scrollTop;\n this.scrolled = 0;\n this.startEvent = event;\n this._setupHelper();\n this._applyChange();\n var ev = utils_1.Utils.initEvent(event, { type: 'resizestart', target: this.el });\n if (this.option.start) {\n this.option.start(ev, this._ui());\n }\n this.el.classList.add('ui-resizable-resizing');\n this.triggerEvent('resizestart', ev);\n return this;\n };\n /** @internal */\n DDResizable.prototype._resizing = function (event, dir) {\n this.scrolled = this.scrollEl.scrollTop - this.scrollY;\n this.temporalRect = this._getChange(event, dir);\n this._applyChange();\n var ev = utils_1.Utils.initEvent(event, { type: 'resize', target: this.el });\n if (this.option.resize) {\n this.option.resize(ev, this._ui());\n }\n this.triggerEvent('resize', ev);\n return this;\n };\n /** @internal */\n DDResizable.prototype._resizeStop = function (event) {\n var ev = utils_1.Utils.initEvent(event, { type: 'resizestop', target: this.el });\n if (this.option.stop) {\n this.option.stop(ev); // Note: ui() not used by gridstack so don't pass\n }\n this.el.classList.remove('ui-resizable-resizing');\n this.triggerEvent('resizestop', ev);\n this._cleanHelper();\n delete this.startEvent;\n delete this.originalRect;\n delete this.temporalRect;\n delete this.scrollY;\n delete this.scrolled;\n return this;\n };\n /** @internal */\n DDResizable.prototype._setupHelper = function () {\n var _this = this;\n this.elOriginStyleVal = DDResizable._originStyleProp.map(function (prop) { return _this.el.style[prop]; });\n this.parentOriginStylePosition = this.el.parentElement.style.position;\n if (window.getComputedStyle(this.el.parentElement).position.match(/static/)) {\n this.el.parentElement.style.position = 'relative';\n }\n this.el.style.position = 'absolute';\n this.el.style.opacity = '0.8';\n return this;\n };\n /** @internal */\n DDResizable.prototype._cleanHelper = function () {\n var _this = this;\n DDResizable._originStyleProp.forEach(function (prop, i) {\n _this.el.style[prop] = _this.elOriginStyleVal[i] || null;\n });\n this.el.parentElement.style.position = this.parentOriginStylePosition || null;\n return this;\n };\n /** @internal */\n DDResizable.prototype._getChange = function (event, dir) {\n var oEvent = this.startEvent;\n var newRect = {\n width: this.originalRect.width,\n height: this.originalRect.height + this.scrolled,\n left: this.originalRect.left,\n top: this.originalRect.top - this.scrolled\n };\n var offsetX = event.clientX - oEvent.clientX;\n var offsetY = event.clientY - oEvent.clientY;\n if (dir.indexOf('e') > -1) {\n newRect.width += offsetX;\n }\n else if (dir.indexOf('w') > -1) {\n newRect.width -= offsetX;\n newRect.left += offsetX;\n }\n if (dir.indexOf('s') > -1) {\n newRect.height += offsetY;\n }\n else if (dir.indexOf('n') > -1) {\n newRect.height -= offsetY;\n newRect.top += offsetY;\n }\n var constrain = this._constrainSize(newRect.width, newRect.height);\n if (Math.round(newRect.width) !== Math.round(constrain.width)) { // round to ignore slight round-off errors\n if (dir.indexOf('w') > -1) {\n newRect.left += newRect.width - constrain.width;\n }\n newRect.width = constrain.width;\n }\n if (Math.round(newRect.height) !== Math.round(constrain.height)) {\n if (dir.indexOf('n') > -1) {\n newRect.top += newRect.height - constrain.height;\n }\n newRect.height = constrain.height;\n }\n return newRect;\n };\n /** @internal constrain the size to the set min/max values */\n DDResizable.prototype._constrainSize = function (oWidth, oHeight) {\n var maxWidth = this.option.maxWidth || Number.MAX_SAFE_INTEGER;\n var minWidth = this.option.minWidth || oWidth;\n var maxHeight = this.option.maxHeight || Number.MAX_SAFE_INTEGER;\n var minHeight = this.option.minHeight || oHeight;\n var width = Math.min(maxWidth, Math.max(minWidth, oWidth));\n var height = Math.min(maxHeight, Math.max(minHeight, oHeight));\n return { width: width, height: height };\n };\n /** @internal */\n DDResizable.prototype._applyChange = function () {\n var _a;\n var _this = this;\n var containmentRect = { left: 0, top: 0, width: 0, height: 0 };\n if (this.el.style.position === 'absolute') {\n var containmentEl = this.el.parentElement;\n var left = (_a = containmentEl.getBoundingClientRect(), _a.left), top_1 = _a.top;\n containmentRect = { left: left, top: top_1, width: 0, height: 0 };\n }\n if (!this.temporalRect)\n return this;\n Object.keys(this.temporalRect).forEach(function (key) {\n var value = _this.temporalRect[key];\n _this.el.style[key] = value - containmentRect[key] + 'px';\n });\n return this;\n };\n /** @internal */\n DDResizable.prototype._removeHandlers = function () {\n this.handlers.forEach(function (handle) { return handle.destroy(); });\n delete this.handlers;\n return this;\n };\n /** @internal */\n DDResizable._originStyleProp = ['width', 'height', 'position', 'left', 'top', 'opacity', 'zIndex'];\n return DDResizable;\n}(dd_base_impl_1.DDBaseImplement));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnQkFBZ0I7SUFDTixxQ0FBZSxHQUF6QjtRQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFNLElBQUksYUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFoQixDQUFnQixDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQW5RRCxnQkFBZ0I7SUFDQyw0QkFBZ0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBdVMxRyxrQkFBQztDQUFBLENBaFVnQyw4QkFBZSxHQWdVL0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmlkU3RhY2svLi9zcmMvZGQtcmVzaXphYmxlLnRzPzQyNDQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZC1yZXNpemFibGUudHMgOC4yLjJcbiAqIENvcHlyaWdodCAoYykgMjAyMS0yMDIyIEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxuICovXG5cbmltcG9ydCB7IEREUmVzaXphYmxlSGFuZGxlIH0gZnJvbSAnLi9kZC1yZXNpemFibGUtaGFuZGxlJztcbmltcG9ydCB7IEREQmFzZUltcGxlbWVudCwgSFRNTEVsZW1lbnRFeHRlbmRPcHQgfSBmcm9tICcuL2RkLWJhc2UtaW1wbCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRERVSURhdGEsIFJlY3QsIFNpemUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IERETWFuYWdlciB9IGZyb20gJy4vZGQtbWFuYWdlcic7XG5cbi8vIGltcG9ydCB7IEdyaWRJdGVtSFRNTEVsZW1lbnQgfSBmcm9tICcuL3R5cGVzJzsgbGV0IGNvdW50ID0gMDsgLy8gVEVTVFxuXG4vLyBUT0RPOiBtZXJnZSB3aXRoIERERHJhZ09wdFxuZXhwb3J0IGludGVyZmFjZSBERFJlc2l6YWJsZU9wdCB7XG4gIGF1dG9IaWRlPzogYm9vbGVhbjtcbiAgaGFuZGxlcz86IHN0cmluZztcbiAgbWF4SGVpZ2h0PzogbnVtYmVyO1xuICBtYXhXaWR0aD86IG51bWJlcjtcbiAgbWluSGVpZ2h0PzogbnVtYmVyO1xuICBtaW5XaWR0aD86IG51bWJlcjtcbiAgc3RhcnQ/OiAoZXZlbnQ6IEV2ZW50LCB1aTogRERVSURhdGEpID0+IHZvaWQ7XG4gIHN0b3A/OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuICByZXNpemU/OiAoZXZlbnQ6IEV2ZW50LCB1aTogRERVSURhdGEpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBERFJlc2l6YWJsZSBleHRlbmRzIEREQmFzZUltcGxlbWVudCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RXh0ZW5kT3B0PEREUmVzaXphYmxlT3B0PiB7XG5cbiAgLy8gaGF2ZSB0byBiZSBwdWJsaWMgZWxzZSBjb21wbGFpbnMgZm9yIEhUTUxFbGVtZW50RXh0ZW5kT3B0ID9cbiAgcHVibGljIGVsOiBIVE1MRWxlbWVudDtcbiAgcHVibGljIG9wdGlvbjogRERSZXNpemFibGVPcHQ7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlcnM6IEREUmVzaXphYmxlSGFuZGxlW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIG9yaWdpbmFsUmVjdDogUmVjdDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgdGVtcG9yYWxSZWN0OiBSZWN0O1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBzY3JvbGxZOiBudW1iZXI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIHNjcm9sbGVkOiBudW1iZXI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIHNjcm9sbEVsOiBIVE1MRWxlbWVudDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgc3RhcnRFdmVudDogTW91c2VFdmVudDtcbiAgLyoqIEBpbnRlcm5hbCB2YWx1ZSBzYXZlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBfb3JpZ2luU3R5bGVQcm9wW10gKi9cbiAgcHJvdGVjdGVkIGVsT3JpZ2luU3R5bGVWYWw6IHN0cmluZ1tdO1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBwYXJlbnRPcmlnaW5TdHlsZVBvc2l0aW9uOiBzdHJpbmc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBfb3JpZ2luU3R5bGVQcm9wID0gWyd3aWR0aCcsICdoZWlnaHQnLCAncG9zaXRpb24nLCAnbGVmdCcsICd0b3AnLCAnb3BhY2l0eScsICd6SW5kZXgnXTtcblxuICBjb25zdHJ1Y3RvcihlbDogSFRNTEVsZW1lbnQsIG9wdHM6IEREUmVzaXphYmxlT3B0ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLm9wdGlvbiA9IG9wdHM7XG4gICAgLy8gY3JlYXRlIHZhciBldmVudCBiaW5kaW5nIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlIGFuZCBzdGlsbCBsb29rIGxpa2UgVFMgbWV0aG9kcyAodW5saWtlIGFub255bW91cyBmdW5jdGlvbnMpXG4gICAgdGhpcy5fbW91c2VPdmVyID0gdGhpcy5fbW91c2VPdmVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbW91c2VPdXQgPSB0aGlzLl9tb3VzZU91dC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgdGhpcy5fc2V0dXBBdXRvSGlkZSh0aGlzLm9wdGlvbi5hdXRvSGlkZSk7XG4gICAgdGhpcy5fc2V0dXBIYW5kbGVycygpO1xuICB9XG5cbiAgcHVibGljIG9uKGV2ZW50OiAncmVzaXplc3RhcnQnIHwgJ3Jlc2l6ZScgfCAncmVzaXplc3RvcCcsIGNhbGxiYWNrOiAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHN1cGVyLm9uKGV2ZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgb2ZmKGV2ZW50OiAncmVzaXplc3RhcnQnIHwgJ3Jlc2l6ZScgfCAncmVzaXplc3RvcCcpOiB2b2lkIHtcbiAgICBzdXBlci5vZmYoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICBzdXBlci5lbmFibGUoKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3VpLXJlc2l6YWJsZS1kaXNhYmxlZCcpO1xuICAgIHRoaXMuX3NldHVwQXV0b0hpZGUodGhpcy5vcHRpb24uYXV0b0hpZGUpO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGUoKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzYWJsZSgpO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndWktcmVzaXphYmxlLWRpc2FibGVkJyk7XG4gICAgdGhpcy5fc2V0dXBBdXRvSGlkZShmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW1vdmVIYW5kbGVycygpO1xuICAgIHRoaXMuX3NldHVwQXV0b0hpZGUoZmFsc2UpO1xuICAgIGRlbGV0ZSB0aGlzLmVsO1xuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVPcHRpb24ob3B0czogRERSZXNpemFibGVPcHQpOiBERFJlc2l6YWJsZSB7XG4gICAgbGV0IHVwZGF0ZUhhbmRsZXMgPSAob3B0cy5oYW5kbGVzICYmIG9wdHMuaGFuZGxlcyAhPT0gdGhpcy5vcHRpb24uaGFuZGxlcyk7XG4gICAgbGV0IHVwZGF0ZUF1dG9IaWRlID0gKG9wdHMuYXV0b0hpZGUgJiYgb3B0cy5hdXRvSGlkZSAhPT0gdGhpcy5vcHRpb24uYXV0b0hpZGUpO1xuICAgIE9iamVjdC5rZXlzKG9wdHMpLmZvckVhY2goa2V5ID0+IHRoaXMub3B0aW9uW2tleV0gPSBvcHRzW2tleV0pO1xuICAgIGlmICh1cGRhdGVIYW5kbGVzKSB7XG4gICAgICB0aGlzLl9yZW1vdmVIYW5kbGVycygpO1xuICAgICAgdGhpcy5fc2V0dXBIYW5kbGVycygpO1xuICAgIH1cbiAgICBpZiAodXBkYXRlQXV0b0hpZGUpIHtcbiAgICAgIHRoaXMuX3NldHVwQXV0b0hpZGUodGhpcy5vcHRpb24uYXV0b0hpZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgdHVybnMgYXV0byBoaWRlIG9uL29mZiAqL1xuICBwcm90ZWN0ZWQgX3NldHVwQXV0b0hpZGUoYXV0bzogYm9vbGVhbik6IEREUmVzaXphYmxlIHtcbiAgICBpZiAoYXV0bykge1xuICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCd1aS1yZXNpemFibGUtYXV0b2hpZGUnKTtcbiAgICAgIC8vIHVzZSBtb3VzZW92ZXIgYW5kIG5vdCBtb3VzZWVudGVyIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIHRyYWNrIGZvciBuZXN0ZWQgY2FzZXNcbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5fbW91c2VPdmVyKTtcbiAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLl9tb3VzZU91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndWktcmVzaXphYmxlLWF1dG9oaWRlJyk7XG4gICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMuX21vdXNlT3Zlcik7XG4gICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5fbW91c2VPdXQpO1xuICAgICAgaWYgKERETWFuYWdlci5vdmVyUmVzaXplRWxlbWVudCA9PT0gdGhpcykge1xuICAgICAgICBkZWxldGUgRERNYW5hZ2VyLm92ZXJSZXNpemVFbGVtZW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgX21vdXNlT3ZlcihlOiBFdmVudCk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUubG9nKGAke2NvdW50Kyt9IHByZS1lbnRlciAkeyh0aGlzLmVsIGFzIEdyaWRJdGVtSFRNTEVsZW1lbnQpLmdyaWRzdGFja05vZGUuX2lkfWApXG4gICAgLy8gYWxyZWFkeSBvdmVyIGEgY2hpbGQsIGlnbm9yZS4gSWRlYWxseSB3ZSBqdXN0IGNhbGwgZS5zdG9wUHJvcGFnYXRpb24oKSBidXQgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkc3RhY2svZ3JpZHN0YWNrLmpzL2lzc3Vlcy8yMDE4XG4gICAgaWYgKERETWFuYWdlci5vdmVyUmVzaXplRWxlbWVudCB8fCBERE1hbmFnZXIuZHJhZ0VsZW1lbnQpIHJldHVybjtcbiAgICBERE1hbmFnZXIub3ZlclJlc2l6ZUVsZW1lbnQgPSB0aGlzO1xuICAgIC8vIGNvbnNvbGUubG9nKGAke2NvdW50Kyt9IGVudGVyICR7KHRoaXMuZWwgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudCkuZ3JpZHN0YWNrTm9kZS5faWR9YClcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3VpLXJlc2l6YWJsZS1hdXRvaGlkZScpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBfbW91c2VPdXQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmxvZyhgJHtjb3VudCsrfSBwcmUtbGVhdmUgJHsodGhpcy5lbCBhcyBHcmlkSXRlbUhUTUxFbGVtZW50KS5ncmlkc3RhY2tOb2RlLl9pZH1gKVxuICAgIGlmIChERE1hbmFnZXIub3ZlclJlc2l6ZUVsZW1lbnQgIT09IHRoaXMpIHJldHVybjtcbiAgICBkZWxldGUgRERNYW5hZ2VyLm92ZXJSZXNpemVFbGVtZW50O1xuICAgIC8vIGNvbnNvbGUubG9nKGAke2NvdW50Kyt9IGxlYXZlICR7KHRoaXMuZWwgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudCkuZ3JpZHN0YWNrTm9kZS5faWR9YClcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3VpLXJlc2l6YWJsZS1hdXRvaGlkZScpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX3NldHVwSGFuZGxlcnMoKTogRERSZXNpemFibGUge1xuICAgIGxldCBoYW5kbGVyRGlyZWN0aW9uID0gdGhpcy5vcHRpb24uaGFuZGxlcyB8fCAnZSxzLHNlJztcbiAgICBpZiAoaGFuZGxlckRpcmVjdGlvbiA9PT0gJ2FsbCcpIHtcbiAgICAgIGhhbmRsZXJEaXJlY3Rpb24gPSAnbixlLHMsdyxzZSxzdyxuZSxudyc7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVyRGlyZWN0aW9uLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoZGlyID0+IGRpci50cmltKCkpXG4gICAgICAubWFwKGRpciA9PiBuZXcgRERSZXNpemFibGVIYW5kbGUodGhpcy5lbCwgZGlyLCB7XG4gICAgICAgIHN0YXJ0OiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZXNpemVTdGFydChldmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3A6IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2l6ZVN0b3AoZXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgICBtb3ZlOiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZXNpemluZyhldmVudCwgZGlyKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX3Jlc2l6ZVN0YXJ0KGV2ZW50OiBNb3VzZUV2ZW50KTogRERSZXNpemFibGUge1xuICAgIHRoaXMub3JpZ2luYWxSZWN0ID0gdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLnNjcm9sbEVsID0gVXRpbHMuZ2V0U2Nyb2xsRWxlbWVudCh0aGlzLmVsKTtcbiAgICB0aGlzLnNjcm9sbFkgPSB0aGlzLnNjcm9sbEVsLnNjcm9sbFRvcDtcbiAgICB0aGlzLnNjcm9sbGVkID0gMDtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBldmVudDtcbiAgICB0aGlzLl9zZXR1cEhlbHBlcigpO1xuICAgIHRoaXMuX2FwcGx5Q2hhbmdlKCk7XG4gICAgY29uc3QgZXYgPSBVdGlscy5pbml0RXZlbnQ8TW91c2VFdmVudD4oZXZlbnQsIHsgdHlwZTogJ3Jlc2l6ZXN0YXJ0JywgdGFyZ2V0OiB0aGlzLmVsIH0pO1xuICAgIGlmICh0aGlzLm9wdGlvbi5zdGFydCkge1xuICAgICAgdGhpcy5vcHRpb24uc3RhcnQoZXYsIHRoaXMuX3VpKCkpO1xuICAgIH1cbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3VpLXJlc2l6YWJsZS1yZXNpemluZycpO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KCdyZXNpemVzdGFydCcsIGV2KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9yZXNpemluZyhldmVudDogTW91c2VFdmVudCwgZGlyOiBzdHJpbmcpOiBERFJlc2l6YWJsZSB7XG4gICAgdGhpcy5zY3JvbGxlZCA9IHRoaXMuc2Nyb2xsRWwuc2Nyb2xsVG9wIC0gdGhpcy5zY3JvbGxZO1xuICAgIHRoaXMudGVtcG9yYWxSZWN0ID0gdGhpcy5fZ2V0Q2hhbmdlKGV2ZW50LCBkaXIpO1xuICAgIHRoaXMuX2FwcGx5Q2hhbmdlKCk7XG4gICAgY29uc3QgZXYgPSBVdGlscy5pbml0RXZlbnQ8TW91c2VFdmVudD4oZXZlbnQsIHsgdHlwZTogJ3Jlc2l6ZScsIHRhcmdldDogdGhpcy5lbCB9KTtcbiAgICBpZiAodGhpcy5vcHRpb24ucmVzaXplKSB7XG4gICAgICB0aGlzLm9wdGlvbi5yZXNpemUoZXYsIHRoaXMuX3VpKCkpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudCgncmVzaXplJywgZXYpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX3Jlc2l6ZVN0b3AoZXZlbnQ6IE1vdXNlRXZlbnQpOiBERFJlc2l6YWJsZSB7XG4gICAgY29uc3QgZXYgPSBVdGlscy5pbml0RXZlbnQ8TW91c2VFdmVudD4oZXZlbnQsIHsgdHlwZTogJ3Jlc2l6ZXN0b3AnLCB0YXJnZXQ6IHRoaXMuZWwgfSk7XG4gICAgaWYgKHRoaXMub3B0aW9uLnN0b3ApIHtcbiAgICAgIHRoaXMub3B0aW9uLnN0b3AoZXYpOyAvLyBOb3RlOiB1aSgpIG5vdCB1c2VkIGJ5IGdyaWRzdGFjayBzbyBkb24ndCBwYXNzXG4gICAgfVxuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndWktcmVzaXphYmxlLXJlc2l6aW5nJyk7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoJ3Jlc2l6ZXN0b3AnLCBldik7XG4gICAgdGhpcy5fY2xlYW5IZWxwZXIoKTtcbiAgICBkZWxldGUgdGhpcy5zdGFydEV2ZW50O1xuICAgIGRlbGV0ZSB0aGlzLm9yaWdpbmFsUmVjdDtcbiAgICBkZWxldGUgdGhpcy50ZW1wb3JhbFJlY3Q7XG4gICAgZGVsZXRlIHRoaXMuc2Nyb2xsWTtcbiAgICBkZWxldGUgdGhpcy5zY3JvbGxlZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9zZXR1cEhlbHBlcigpOiBERFJlc2l6YWJsZSB7XG4gICAgdGhpcy5lbE9yaWdpblN0eWxlVmFsID0gRERSZXNpemFibGUuX29yaWdpblN0eWxlUHJvcC5tYXAocHJvcCA9PiB0aGlzLmVsLnN0eWxlW3Byb3BdKTtcbiAgICB0aGlzLnBhcmVudE9yaWdpblN0eWxlUG9zaXRpb24gPSB0aGlzLmVsLnBhcmVudEVsZW1lbnQuc3R5bGUucG9zaXRpb247XG4gICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwucGFyZW50RWxlbWVudCkucG9zaXRpb24ubWF0Y2goL3N0YXRpYy8pKSB7XG4gICAgICB0aGlzLmVsLnBhcmVudEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIH1cbiAgICB0aGlzLmVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICB0aGlzLmVsLnN0eWxlLm9wYWNpdHkgPSAnMC44JztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9jbGVhbkhlbHBlcigpOiBERFJlc2l6YWJsZSB7XG4gICAgRERSZXNpemFibGUuX29yaWdpblN0eWxlUHJvcC5mb3JFYWNoKChwcm9wLCBpKSA9PiB7XG4gICAgICB0aGlzLmVsLnN0eWxlW3Byb3BdID0gdGhpcy5lbE9yaWdpblN0eWxlVmFsW2ldIHx8IG51bGw7XG4gICAgfSk7XG4gICAgdGhpcy5lbC5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gdGhpcy5wYXJlbnRPcmlnaW5TdHlsZVBvc2l0aW9uIHx8IG51bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBfZ2V0Q2hhbmdlKGV2ZW50OiBNb3VzZUV2ZW50LCBkaXI6IHN0cmluZyk6IFJlY3Qge1xuICAgIGNvbnN0IG9FdmVudCA9IHRoaXMuc3RhcnRFdmVudDtcbiAgICBjb25zdCBuZXdSZWN0ID0geyAvLyBOb3RlOiBvcmlnaW5hbFJlY3QgaXMgYSBjb21wbGV4IG9iamVjdCwgbm90IGEgc2ltcGxlIFJlY3QsIHNvIGNvcHkgb3V0LlxuICAgICAgd2lkdGg6IHRoaXMub3JpZ2luYWxSZWN0LndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLm9yaWdpbmFsUmVjdC5oZWlnaHQgKyB0aGlzLnNjcm9sbGVkLFxuICAgICAgbGVmdDogdGhpcy5vcmlnaW5hbFJlY3QubGVmdCxcbiAgICAgIHRvcDogdGhpcy5vcmlnaW5hbFJlY3QudG9wIC0gdGhpcy5zY3JvbGxlZFxuICAgIH07XG5cbiAgICBjb25zdCBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIG9FdmVudC5jbGllbnRYO1xuICAgIGNvbnN0IG9mZnNldFkgPSBldmVudC5jbGllbnRZIC0gb0V2ZW50LmNsaWVudFk7XG5cbiAgICBpZiAoZGlyLmluZGV4T2YoJ2UnKSA+IC0xKSB7XG4gICAgICBuZXdSZWN0LndpZHRoICs9IG9mZnNldFg7XG4gICAgfSBlbHNlIGlmIChkaXIuaW5kZXhPZigndycpID4gLTEpIHtcbiAgICAgIG5ld1JlY3Qud2lkdGggLT0gb2Zmc2V0WDtcbiAgICAgIG5ld1JlY3QubGVmdCArPSBvZmZzZXRYO1xuICAgIH1cbiAgICBpZiAoZGlyLmluZGV4T2YoJ3MnKSA+IC0xKSB7XG4gICAgICBuZXdSZWN0LmhlaWdodCArPSBvZmZzZXRZO1xuICAgIH0gZWxzZSBpZiAoZGlyLmluZGV4T2YoJ24nKSA+IC0xKSB7XG4gICAgICBuZXdSZWN0LmhlaWdodCAtPSBvZmZzZXRZO1xuICAgICAgbmV3UmVjdC50b3AgKz0gb2Zmc2V0WVxuICAgIH1cbiAgICBjb25zdCBjb25zdHJhaW4gPSB0aGlzLl9jb25zdHJhaW5TaXplKG5ld1JlY3Qud2lkdGgsIG5ld1JlY3QuaGVpZ2h0KTtcbiAgICBpZiAoTWF0aC5yb3VuZChuZXdSZWN0LndpZHRoKSAhPT0gTWF0aC5yb3VuZChjb25zdHJhaW4ud2lkdGgpKSB7IC8vIHJvdW5kIHRvIGlnbm9yZSBzbGlnaHQgcm91bmQtb2ZmIGVycm9yc1xuICAgICAgaWYgKGRpci5pbmRleE9mKCd3JykgPiAtMSkge1xuICAgICAgICBuZXdSZWN0LmxlZnQgKz0gbmV3UmVjdC53aWR0aCAtIGNvbnN0cmFpbi53aWR0aDtcbiAgICAgIH1cbiAgICAgIG5ld1JlY3Qud2lkdGggPSBjb25zdHJhaW4ud2lkdGg7XG4gICAgfVxuICAgIGlmIChNYXRoLnJvdW5kKG5ld1JlY3QuaGVpZ2h0KSAhPT0gTWF0aC5yb3VuZChjb25zdHJhaW4uaGVpZ2h0KSkge1xuICAgICAgaWYgKGRpci5pbmRleE9mKCduJykgPiAtMSkge1xuICAgICAgICBuZXdSZWN0LnRvcCArPSBuZXdSZWN0LmhlaWdodCAtIGNvbnN0cmFpbi5oZWlnaHQ7XG4gICAgICB9XG4gICAgICBuZXdSZWN0LmhlaWdodCA9IGNvbnN0cmFpbi5oZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBuZXdSZWN0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBjb25zdHJhaW4gdGhlIHNpemUgdG8gdGhlIHNldCBtaW4vbWF4IHZhbHVlcyAqL1xuICBwcm90ZWN0ZWQgX2NvbnN0cmFpblNpemUob1dpZHRoOiBudW1iZXIsIG9IZWlnaHQ6IG51bWJlcik6IFNpemUge1xuICAgIGNvbnN0IG1heFdpZHRoID0gdGhpcy5vcHRpb24ubWF4V2lkdGggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgY29uc3QgbWluV2lkdGggPSB0aGlzLm9wdGlvbi5taW5XaWR0aCB8fCBvV2lkdGg7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5vcHRpb24ubWF4SGVpZ2h0IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIGNvbnN0IG1pbkhlaWdodCA9IHRoaXMub3B0aW9uLm1pbkhlaWdodCB8fCBvSGVpZ2h0O1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5taW4obWF4V2lkdGgsIE1hdGgubWF4KG1pbldpZHRoLCBvV2lkdGgpKTtcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihtYXhIZWlnaHQsIE1hdGgubWF4KG1pbkhlaWdodCwgb0hlaWdodCkpO1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9hcHBseUNoYW5nZSgpOiBERFJlc2l6YWJsZSB7XG4gICAgbGV0IGNvbnRhaW5tZW50UmVjdCA9IHsgbGVmdDogMCwgdG9wOiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgaWYgKHRoaXMuZWwuc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5tZW50RWwgPSB0aGlzLmVsLnBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gY29udGFpbm1lbnRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnRhaW5tZW50UmVjdCA9IHsgbGVmdCwgdG9wLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgfVxuICAgIGlmICghdGhpcy50ZW1wb3JhbFJlY3QpIHJldHVybiB0aGlzO1xuICAgIE9iamVjdC5rZXlzKHRoaXMudGVtcG9yYWxSZWN0KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGVtcG9yYWxSZWN0W2tleV07XG4gICAgICB0aGlzLmVsLnN0eWxlW2tleV0gPSB2YWx1ZSAtIGNvbnRhaW5tZW50UmVjdFtrZXldICsgJ3B4JztcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF9yZW1vdmVIYW5kbGVycygpOiBERFJlc2l6YWJsZSB7XG4gICAgdGhpcy5oYW5kbGVycy5mb3JFYWNoKGhhbmRsZSA9PiBoYW5kbGUuZGVzdHJveSgpKTtcbiAgICBkZWxldGUgdGhpcy5oYW5kbGVycztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIF91aSA9ICgpOiBERFVJRGF0YSA9PiB7XG4gICAgY29uc3QgY29udGFpbm1lbnRFbCA9IHRoaXMuZWwucGFyZW50RWxlbWVudDtcbiAgICBjb25zdCBjb250YWlubWVudFJlY3QgPSBjb250YWlubWVudEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG5ld1JlY3QgPSB7IC8vIE5vdGU6IG9yaWdpbmFsUmVjdCBpcyBhIGNvbXBsZXggb2JqZWN0LCBub3QgYSBzaW1wbGUgUmVjdCwgc28gY29weSBvdXQuXG4gICAgICB3aWR0aDogdGhpcy5vcmlnaW5hbFJlY3Qud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMub3JpZ2luYWxSZWN0LmhlaWdodCArIHRoaXMuc2Nyb2xsZWQsXG4gICAgICBsZWZ0OiB0aGlzLm9yaWdpbmFsUmVjdC5sZWZ0LFxuICAgICAgdG9wOiB0aGlzLm9yaWdpbmFsUmVjdC50b3AgLSB0aGlzLnNjcm9sbGVkXG4gICAgfTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy50ZW1wb3JhbFJlY3QgfHwgbmV3UmVjdDtcbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgbGVmdDogcmVjdC5sZWZ0IC0gY29udGFpbm1lbnRSZWN0LmxlZnQsXG4gICAgICAgIHRvcDogcmVjdC50b3AgLSBjb250YWlubWVudFJlY3QudG9wXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICAgICAgfVxuICAgICAgLyogR3JpZHN0YWNrIE9OTFkgbmVlZHMgcG9zaXRpb24gc2V0IGFib3ZlLi4uIGtlZXAgYXJvdW5kIGluIGNhc2UuXG4gICAgICBlbGVtZW50OiBbdGhpcy5lbF0sIC8vIFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlbGVtZW50IHRvIGJlIHJlc2l6ZWRcbiAgICAgIGhlbHBlcjogW10sIC8vIFRPRE86IG5vdCBzdXBwb3J0IHlldCAtIFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBoZWxwZXIgdGhhdCdzIGJlaW5nIHJlc2l6ZWRcbiAgICAgIG9yaWdpbmFsRWxlbWVudDogW3RoaXMuZWxdLC8vIHdlIGRvbid0IHdyYXAgaGVyZSwgc28gc2ltcGxpZnkgYXMgdGhpcy5lbCAvL1RoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50IGJlZm9yZSBpdCBpcyB3cmFwcGVkXG4gICAgICBvcmlnaW5hbFBvc2l0aW9uOiB7IC8vIFRoZSBwb3NpdGlvbiByZXByZXNlbnRlZCBhcyB7IGxlZnQsIHRvcCB9IGJlZm9yZSB0aGUgcmVzaXphYmxlIGlzIHJlc2l6ZWRcbiAgICAgICAgbGVmdDogdGhpcy5vcmlnaW5hbFJlY3QubGVmdCAtIGNvbnRhaW5tZW50UmVjdC5sZWZ0LFxuICAgICAgICB0b3A6IHRoaXMub3JpZ2luYWxSZWN0LnRvcCAtIGNvbnRhaW5tZW50UmVjdC50b3BcbiAgICAgIH0sXG4gICAgICBvcmlnaW5hbFNpemU6IHsgLy8gVGhlIHNpemUgcmVwcmVzZW50ZWQgYXMgeyB3aWR0aCwgaGVpZ2h0IH0gYmVmb3JlIHRoZSByZXNpemFibGUgaXMgcmVzaXplZFxuICAgICAgICB3aWR0aDogdGhpcy5vcmlnaW5hbFJlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5vcmlnaW5hbFJlY3QuaGVpZ2h0XG4gICAgICB9XG4gICAgICAqL1xuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///904\n")},537:function(__unused_webpack_module,exports,__webpack_require__){eval("\n/**\n * touch.ts 8.2.2\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.pointerleave = exports.pointerenter = exports.pointerdown = exports.touchend = exports.touchmove = exports.touchstart = exports.isTouch = void 0;\nvar dd_manager_1 = __webpack_require__(839);\n/**\n * Detect touch support - Windows Surface devices and other touch devices\n * should we use this instead ? (what we had for always showing resize handles)\n * /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)\n */\nexports.isTouch = typeof window !== 'undefined' && typeof document !== 'undefined' &&\n ('ontouchstart' in document\n || 'ontouchstart' in window\n // || !!window.TouchEvent // true on Windows 10 Chrome desktop so don't use this\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || (window.DocumentTouch && document instanceof window.DocumentTouch)\n || navigator.maxTouchPoints > 0\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n || navigator.msMaxTouchPoints > 0);\n// interface TouchCoord {x: number, y: number};\nvar DDTouch = /** @class */ (function () {\n function DDTouch() {\n }\n return DDTouch;\n}());\n/**\n* Get the x,y position of a touch event\n*/\n// function getTouchCoords(e: TouchEvent): TouchCoord {\n// return {\n// x: e.changedTouches[0].pageX,\n// y: e.changedTouches[0].pageY\n// };\n// }\n/**\n * Simulate a mouse event based on a corresponding touch event\n * @param {Object} e A touch event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulateMouseEvent(e, simulatedType) {\n // Ignore multi-touch events\n if (e.touches.length > 1)\n return;\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable)\n e.preventDefault();\n var touch = e.changedTouches[0], simulatedEvent = document.createEvent('MouseEvents');\n // Initialize the simulated mouse event using the touch event's coordinates\n simulatedEvent.initMouseEvent(simulatedType, // type\n true, // bubbles\n true, // cancelable\n window, // view\n 1, // detail\n touch.screenX, // screenX\n touch.screenY, // screenY\n touch.clientX, // clientX\n touch.clientY, // clientY\n false, // ctrlKey\n false, // altKey\n false, // shiftKey\n false, // metaKey\n 0, // button\n null // relatedTarget\n );\n // Dispatch the simulated event to the target element\n e.target.dispatchEvent(simulatedEvent);\n}\n/**\n * Simulate a mouse event based on a corresponding Pointer event\n * @param {Object} e A pointer event\n * @param {String} simulatedType The corresponding mouse event\n */\nfunction simulatePointerMouseEvent(e, simulatedType) {\n // Prevent \"Ignored attempt to cancel a touchmove event with cancelable=false\" errors\n if (e.cancelable)\n e.preventDefault();\n var simulatedEvent = document.createEvent('MouseEvents');\n // Initialize the simulated mouse event using the touch event's coordinates\n simulatedEvent.initMouseEvent(simulatedType, // type\n true, // bubbles\n true, // cancelable\n window, // view\n 1, // detail\n e.screenX, // screenX\n e.screenY, // screenY\n e.clientX, // clientX\n e.clientY, // clientY\n false, // ctrlKey\n false, // altKey\n false, // shiftKey\n false, // metaKey\n 0, // button\n null // relatedTarget\n );\n // Dispatch the simulated event to the target element\n e.target.dispatchEvent(simulatedEvent);\n}\n/**\n * Handle the touchstart events\n * @param {Object} e The widget element's touchstart event\n */\nfunction touchstart(e) {\n // Ignore the event if another widget is already being handled\n if (DDTouch.touchHandled)\n return;\n DDTouch.touchHandled = true;\n // Simulate the mouse events\n // simulateMouseEvent(e, 'mouseover');\n // simulateMouseEvent(e, 'mousemove');\n simulateMouseEvent(e, 'mousedown');\n}\nexports.touchstart = touchstart;\n/**\n * Handle the touchmove events\n * @param {Object} e The document's touchmove event\n */\nfunction touchmove(e) {\n // Ignore event if not handled by us\n if (!DDTouch.touchHandled)\n return;\n simulateMouseEvent(e, 'mousemove');\n}\nexports.touchmove = touchmove;\n/**\n * Handle the touchend events\n * @param {Object} e The document's touchend event\n */\nfunction touchend(e) {\n // Ignore event if not handled\n if (!DDTouch.touchHandled)\n return;\n // cancel delayed leave event when we release on ourself which happens BEFORE we get this!\n if (DDTouch.pointerLeaveTimeout) {\n window.clearTimeout(DDTouch.pointerLeaveTimeout);\n delete DDTouch.pointerLeaveTimeout;\n }\n var wasDragging = !!dd_manager_1.DDManager.dragElement;\n // Simulate the mouseup event\n simulateMouseEvent(e, 'mouseup');\n // simulateMouseEvent(event, 'mouseout');\n // If the touch interaction did not move, it should trigger a click\n if (!wasDragging) {\n simulateMouseEvent(e, 'click');\n }\n // Unset the flag to allow other widgets to inherit the touch event\n DDTouch.touchHandled = false;\n}\nexports.touchend = touchend;\n/**\n * Note we don't get touchenter/touchleave (which are deprecated)\n * see https://stackoverflow.com/questions/27908339/js-touch-equivalent-for-mouseenter\n * so instead of PointerEvent to still get enter/leave and send the matching mouse event.\n */\nfunction pointerdown(e) {\n // console.log(\"pointer down\")\n e.target.releasePointerCapture(e.pointerId); // <- Important!\n}\nexports.pointerdown = pointerdown;\nfunction pointerenter(e) {\n // ignore the initial one we get on pointerdown on ourself\n if (!dd_manager_1.DDManager.dragElement) {\n // console.log('pointerenter ignored');\n return;\n }\n // console.log('pointerenter');\n simulatePointerMouseEvent(e, 'mouseenter');\n}\nexports.pointerenter = pointerenter;\nfunction pointerleave(e) {\n // ignore the leave on ourself we get before releasing the mouse over ourself\n // by delaying sending the event and having the up event cancel us\n if (!dd_manager_1.DDManager.dragElement) {\n // console.log('pointerleave ignored');\n return;\n }\n DDTouch.pointerLeaveTimeout = window.setTimeout(function () {\n delete DDTouch.pointerLeaveTimeout;\n // console.log('pointerleave delayed');\n simulatePointerMouseEvent(e, 'mouseleave');\n }, 10);\n}\nexports.pointerleave = pointerleave;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QkFBa0IsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDaEM7SUFFRCxtRUFBbUU7SUFDbkUsT0FBTyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDL0IsQ0FBQztBQXhCRCw0QkF3QkM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLENBQWU7SUFDekMsOEJBQThCO0lBQzdCLENBQUMsQ0FBQyxNQUFzQixDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBQyxnQkFBZ0I7QUFDL0UsQ0FBQztBQUhELGtDQUdDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLENBQWU7SUFDMUMsMERBQTBEO0lBQzFELElBQUksQ0FBQyxzQkFBUyxDQUFDLFdBQVcsRUFBRTtRQUMxQix1Q0FBdUM7UUFDdkMsT0FBTztLQUNSO0lBQ0QsK0JBQStCO0lBQy9CLHlCQUF5QixDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBUkQsb0NBUUM7QUFFRCxTQUFnQixZQUFZLENBQUMsQ0FBZTtJQUMxQyw2RUFBNkU7SUFDN0Usa0VBQWtFO0lBQ2xFLElBQUksQ0FBQyxzQkFBUyxDQUFDLFdBQVcsRUFBRTtRQUMxQix1Q0FBdUM7UUFDdkMsT0FBTztLQUNSO0lBQ0QsT0FBTyxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDOUMsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUM7UUFDbkMsdUNBQXVDO1FBQ3ZDLHlCQUF5QixDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM3QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBWkQsb0NBWUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmlkU3RhY2svLi9zcmMvZGQtdG91Y2gudHM/MGNjOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHRvdWNoLnRzIDguMi4yXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgRERNYW5hZ2VyIH0gZnJvbSAnLi9kZC1tYW5hZ2VyJztcblxuLyoqXG4gKiBEZXRlY3QgdG91Y2ggc3VwcG9ydCAtIFdpbmRvd3MgU3VyZmFjZSBkZXZpY2VzIGFuZCBvdGhlciB0b3VjaCBkZXZpY2VzXG4gKiBzaG91bGQgd2UgdXNlIHRoaXMgaW5zdGVhZCA/ICh3aGF0IHdlIGhhZCBmb3IgYWx3YXlzIHNob3dpbmcgcmVzaXplIGhhbmRsZXMpXG4gKiAvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudClcbiAqL1xuZXhwb3J0IGNvbnN0IGlzVG91Y2g6IGJvb2xlYW4gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmXG4oICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50XG4gIHx8ICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvd1xuICAvLyB8fCAhIXdpbmRvdy5Ub3VjaEV2ZW50IC8vIHRydWUgb24gV2luZG93cyAxMCBDaHJvbWUgZGVza3RvcCBzbyBkb24ndCB1c2UgdGhpc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICB8fCAoKHdpbmRvdyBhcyBhbnkpLkRvY3VtZW50VG91Y2ggJiYgZG9jdW1lbnQgaW5zdGFuY2VvZiAod2luZG93IGFzIGFueSkuRG9jdW1lbnRUb3VjaClcbiAgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICB8fCAobmF2aWdhdG9yIGFzIGFueSkubXNNYXhUb3VjaFBvaW50cyA+IDBcbik7XG5cbi8vIGludGVyZmFjZSBUb3VjaENvb3JkIHt4OiBudW1iZXIsIHk6IG51bWJlcn07XG5cbmNsYXNzIEREVG91Y2gge1xuICBwdWJsaWMgc3RhdGljIHRvdWNoSGFuZGxlZDogYm9vbGVhbjtcbiAgcHVibGljIHN0YXRpYyBwb2ludGVyTGVhdmVUaW1lb3V0OiBudW1iZXI7XG59XG5cbi8qKlxuKiBHZXQgdGhlIHgseSBwb3NpdGlvbiBvZiBhIHRvdWNoIGV2ZW50XG4qL1xuLy8gZnVuY3Rpb24gZ2V0VG91Y2hDb29yZHMoZTogVG91Y2hFdmVudCk6IFRvdWNoQ29vcmQge1xuLy8gICByZXR1cm4ge1xuLy8gICAgIHg6IGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVgsXG4vLyAgICAgeTogZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWVxuLy8gICB9O1xuLy8gfVxuXG4vKipcbiAqIFNpbXVsYXRlIGEgbW91c2UgZXZlbnQgYmFzZWQgb24gYSBjb3JyZXNwb25kaW5nIHRvdWNoIGV2ZW50XG4gKiBAcGFyYW0ge09iamVjdH0gZSBBIHRvdWNoIGV2ZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2ltdWxhdGVkVHlwZSBUaGUgY29ycmVzcG9uZGluZyBtb3VzZSBldmVudFxuICovXG5mdW5jdGlvbiBzaW11bGF0ZU1vdXNlRXZlbnQoZTogVG91Y2hFdmVudCwgc2ltdWxhdGVkVHlwZTogc3RyaW5nKSB7XG5cbiAgLy8gSWdub3JlIG11bHRpLXRvdWNoIGV2ZW50c1xuICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVybjtcblxuICAvLyBQcmV2ZW50IFwiSWdub3JlZCBhdHRlbXB0IHRvIGNhbmNlbCBhIHRvdWNobW92ZSBldmVudCB3aXRoIGNhbmNlbGFibGU9ZmFsc2VcIiBlcnJvcnNcbiAgaWYgKGUuY2FuY2VsYWJsZSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGNvbnN0IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSwgc2ltdWxhdGVkRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzaW11bGF0ZWQgbW91c2UgZXZlbnQgdXNpbmcgdGhlIHRvdWNoIGV2ZW50J3MgY29vcmRpbmF0ZXNcbiAgc2ltdWxhdGVkRXZlbnQuaW5pdE1vdXNlRXZlbnQoXG4gICAgc2ltdWxhdGVkVHlwZSwgICAgLy8gdHlwZVxuICAgIHRydWUsICAgICAgICAgICAgIC8vIGJ1YmJsZXNcbiAgICB0cnVlLCAgICAgICAgICAgICAvLyBjYW5jZWxhYmxlXG4gICAgd2luZG93LCAgICAgICAgICAgLy8gdmlld1xuICAgIDEsICAgICAgICAgICAgICAgIC8vIGRldGFpbFxuICAgIHRvdWNoLnNjcmVlblgsICAgIC8vIHNjcmVlblhcbiAgICB0b3VjaC5zY3JlZW5ZLCAgICAvLyBzY3JlZW5ZXG4gICAgdG91Y2guY2xpZW50WCwgICAgLy8gY2xpZW50WFxuICAgIHRvdWNoLmNsaWVudFksICAgIC8vIGNsaWVudFlcbiAgICBmYWxzZSwgICAgICAgICAgICAvLyBjdHJsS2V5XG4gICAgZmFsc2UsICAgICAgICAgICAgLy8gYWx0S2V5XG4gICAgZmFsc2UsICAgICAgICAgICAgLy8gc2hpZnRLZXlcbiAgICBmYWxzZSwgICAgICAgICAgICAvLyBtZXRhS2V5XG4gICAgMCwgICAgICAgICAgICAgICAgLy8gYnV0dG9uXG4gICAgbnVsbCAgICAgICAgICAgICAgLy8gcmVsYXRlZFRhcmdldFxuICApO1xuXG4gIC8vIERpc3BhdGNoIHRoZSBzaW11bGF0ZWQgZXZlbnQgdG8gdGhlIHRhcmdldCBlbGVtZW50XG4gIGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQoc2ltdWxhdGVkRXZlbnQpO1xufVxuXG4vKipcbiAqIFNpbXVsYXRlIGEgbW91c2UgZXZlbnQgYmFzZWQgb24gYSBjb3JyZXNwb25kaW5nIFBvaW50ZXIgZXZlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBlIEEgcG9pbnRlciBldmVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNpbXVsYXRlZFR5cGUgVGhlIGNvcnJlc3BvbmRpbmcgbW91c2UgZXZlbnRcbiAqL1xuZnVuY3Rpb24gc2ltdWxhdGVQb2ludGVyTW91c2VFdmVudChlOiBQb2ludGVyRXZlbnQsIHNpbXVsYXRlZFR5cGU6IHN0cmluZykge1xuXG4gIC8vIFByZXZlbnQgXCJJZ25vcmVkIGF0dGVtcHQgdG8gY2FuY2VsIGEgdG91Y2htb3ZlIGV2ZW50IHdpdGggY2FuY2VsYWJsZT1mYWxzZVwiIGVycm9yc1xuICBpZiAoZS5jYW5jZWxhYmxlKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgY29uc3Qgc2ltdWxhdGVkRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzaW11bGF0ZWQgbW91c2UgZXZlbnQgdXNpbmcgdGhlIHRvdWNoIGV2ZW50J3MgY29vcmRpbmF0ZXNcbiAgc2ltdWxhdGVkRXZlbnQuaW5pdE1vdXNlRXZlbnQoXG4gICAgc2ltdWxhdGVkVHlwZSwgICAgLy8gdHlwZVxuICAgIHRydWUsICAgICAgICAgICAgIC8vIGJ1YmJsZXNcbiAgICB0cnVlLCAgICAgICAgICAgICAvLyBjYW5jZWxhYmxlXG4gICAgd2luZG93LCAgICAgICAgICAgLy8gdmlld1xuICAgIDEsICAgICAgICAgICAgICAgIC8vIGRldGFpbFxuICAgIGUuc2NyZWVuWCwgICAgLy8gc2NyZWVuWFxuICAgIGUuc2NyZWVuWSwgICAgLy8gc2NyZWVuWVxuICAgIGUuY2xpZW50WCwgICAgLy8gY2xpZW50WFxuICAgIGUuY2xpZW50WSwgICAgLy8gY2xpZW50WVxuICAgIGZhbHNlLCAgICAgICAgICAgIC8vIGN0cmxLZXlcbiAgICBmYWxzZSwgICAgICAgICAgICAvLyBhbHRLZXlcbiAgICBmYWxzZSwgICAgICAgICAgICAvLyBzaGlmdEtleVxuICAgIGZhbHNlLCAgICAgICAgICAgIC8vIG1ldGFLZXlcbiAgICAwLCAgICAgICAgICAgICAgICAvLyBidXR0b25cbiAgICBudWxsICAgICAgICAgICAgICAvLyByZWxhdGVkVGFyZ2V0XG4gICk7XG5cbiAgLy8gRGlzcGF0Y2ggdGhlIHNpbXVsYXRlZCBldmVudCB0byB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgZS50YXJnZXQuZGlzcGF0Y2hFdmVudChzaW11bGF0ZWRFdmVudCk7XG59XG5cblxuLyoqXG4gKiBIYW5kbGUgdGhlIHRvdWNoc3RhcnQgZXZlbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZSBUaGUgd2lkZ2V0IGVsZW1lbnQncyB0b3VjaHN0YXJ0IGV2ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgLy8gSWdub3JlIHRoZSBldmVudCBpZiBhbm90aGVyIHdpZGdldCBpcyBhbHJlYWR5IGJlaW5nIGhhbmRsZWRcbiAgaWYgKEREVG91Y2gudG91Y2hIYW5kbGVkKSByZXR1cm47XG4gIEREVG91Y2gudG91Y2hIYW5kbGVkID0gdHJ1ZTtcblxuICAvLyBTaW11bGF0ZSB0aGUgbW91c2UgZXZlbnRzXG4gIC8vIHNpbXVsYXRlTW91c2VFdmVudChlLCAnbW91c2VvdmVyJyk7XG4gIC8vIHNpbXVsYXRlTW91c2VFdmVudChlLCAnbW91c2Vtb3ZlJyk7XG4gIHNpbXVsYXRlTW91c2VFdmVudChlLCAnbW91c2Vkb3duJyk7XG59XG5cbi8qKlxuICogSGFuZGxlIHRoZSB0b3VjaG1vdmUgZXZlbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZSBUaGUgZG9jdW1lbnQncyB0b3VjaG1vdmUgZXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gIC8vIElnbm9yZSBldmVudCBpZiBub3QgaGFuZGxlZCBieSB1c1xuICBpZiAoIUREVG91Y2gudG91Y2hIYW5kbGVkKSByZXR1cm47XG5cbiAgc2ltdWxhdGVNb3VzZUV2ZW50KGUsICdtb3VzZW1vdmUnKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgdGhlIHRvdWNoZW5kIGV2ZW50c1xuICogQHBhcmFtIHtPYmplY3R9IGUgVGhlIGRvY3VtZW50J3MgdG91Y2hlbmQgZXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoZW5kKGU6IFRvdWNoRXZlbnQpOiB2b2lkIHtcblxuICAvLyBJZ25vcmUgZXZlbnQgaWYgbm90IGhhbmRsZWRcbiAgaWYgKCFERFRvdWNoLnRvdWNoSGFuZGxlZCkgcmV0dXJuO1xuXG4gIC8vIGNhbmNlbCBkZWxheWVkIGxlYXZlIGV2ZW50IHdoZW4gd2UgcmVsZWFzZSBvbiBvdXJzZWxmIHdoaWNoIGhhcHBlbnMgQkVGT1JFIHdlIGdldCB0aGlzIVxuICBpZiAoRERUb3VjaC5wb2ludGVyTGVhdmVUaW1lb3V0KSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dChERFRvdWNoLnBvaW50ZXJMZWF2ZVRpbWVvdXQpO1xuICAgIGRlbGV0ZSBERFRvdWNoLnBvaW50ZXJMZWF2ZVRpbWVvdXQ7XG4gIH1cblxuICBjb25zdCB3YXNEcmFnZ2luZyA9ICEhRERNYW5hZ2VyLmRyYWdFbGVtZW50O1xuXG4gIC8vIFNpbXVsYXRlIHRoZSBtb3VzZXVwIGV2ZW50XG4gIHNpbXVsYXRlTW91c2VFdmVudChlLCAnbW91c2V1cCcpO1xuICAvLyBzaW11bGF0ZU1vdXNlRXZlbnQoZXZlbnQsICdtb3VzZW91dCcpO1xuXG4gIC8vIElmIHRoZSB0b3VjaCBpbnRlcmFjdGlvbiBkaWQgbm90IG1vdmUsIGl0IHNob3VsZCB0cmlnZ2VyIGEgY2xpY2tcbiAgaWYgKCF3YXNEcmFnZ2luZykge1xuICAgIHNpbXVsYXRlTW91c2VFdmVudChlLCAnY2xpY2snKTtcbiAgfVxuXG4gIC8vIFVuc2V0IHRoZSBmbGFnIHRvIGFsbG93IG90aGVyIHdpZGdldHMgdG8gaW5oZXJpdCB0aGUgdG91Y2ggZXZlbnRcbiAgRERUb3VjaC50b3VjaEhhbmRsZWQgPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBOb3RlIHdlIGRvbid0IGdldCB0b3VjaGVudGVyL3RvdWNobGVhdmUgKHdoaWNoIGFyZSBkZXByZWNhdGVkKVxuICogc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI3OTA4MzM5L2pzLXRvdWNoLWVxdWl2YWxlbnQtZm9yLW1vdXNlZW50ZXJcbiAqIHNvIGluc3RlYWQgb2YgUG9pbnRlckV2ZW50IHRvIHN0aWxsIGdldCBlbnRlci9sZWF2ZSBhbmQgc2VuZCB0aGUgbWF0Y2hpbmcgbW91c2UgZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2ludGVyZG93bihlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgLy8gY29uc29sZS5sb2coXCJwb2ludGVyIGRvd25cIilcbiAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpIC8vIDwtIEltcG9ydGFudCFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJlbnRlcihlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgLy8gaWdub3JlIHRoZSBpbml0aWFsIG9uZSB3ZSBnZXQgb24gcG9pbnRlcmRvd24gb24gb3Vyc2VsZlxuICBpZiAoIURETWFuYWdlci5kcmFnRWxlbWVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdwb2ludGVyZW50ZXIgaWdub3JlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBjb25zb2xlLmxvZygncG9pbnRlcmVudGVyJyk7XG4gIHNpbXVsYXRlUG9pbnRlck1vdXNlRXZlbnQoZSwgJ21vdXNlZW50ZXInKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50ZXJsZWF2ZShlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgLy8gaWdub3JlIHRoZSBsZWF2ZSBvbiBvdXJzZWxmIHdlIGdldCBiZWZvcmUgcmVsZWFzaW5nIHRoZSBtb3VzZSBvdmVyIG91cnNlbGZcbiAgLy8gYnkgZGVsYXlpbmcgc2VuZGluZyB0aGUgZXZlbnQgYW5kIGhhdmluZyB0aGUgdXAgZXZlbnQgY2FuY2VsIHVzXG4gIGlmICghRERNYW5hZ2VyLmRyYWdFbGVtZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3BvaW50ZXJsZWF2ZSBpZ25vcmVkJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIEREVG91Y2gucG9pbnRlckxlYXZlVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICBkZWxldGUgRERUb3VjaC5wb2ludGVyTGVhdmVUaW1lb3V0O1xuICAgIC8vIGNvbnNvbGUubG9nKCdwb2ludGVybGVhdmUgZGVsYXllZCcpO1xuICAgIHNpbXVsYXRlUG9pbnRlck1vdXNlRXZlbnQoZSwgJ21vdXNlbGVhdmUnKTtcbiAgfSwgMTApO1xufVxuXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///537\n")},506:function(__unused_webpack_module,exports,__webpack_require__){eval("\n/**\n * gridstack-engine.ts 8.2.2\n * Copyright (c) 2021-2022 Alain Dumesny - see GridStack root license\n */\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.GridStackEngine = void 0;\nvar utils_1 = __webpack_require__(867);\n/**\n * Defines the GridStack engine that does most no DOM grid manipulation.\n * See GridStack methods and vars for descriptions.\n *\n * NOTE: values should not be modified directly - call the main GridStack API instead\n */\nvar GridStackEngine = exports.GridStackEngine = /** @class */ (function () {\n function GridStackEngine(opts) {\n if (opts === void 0) { opts = {}; }\n this.addedNodes = [];\n this.removedNodes = [];\n this.column = opts.column || 12;\n this.maxRow = opts.maxRow;\n this._float = opts.float;\n this.nodes = opts.nodes || [];\n this.onChange = opts.onChange;\n }\n GridStackEngine.prototype.batchUpdate = function (flag) {\n if (flag === void 0) { flag = true; }\n if (!!this.batchMode === flag)\n return this;\n this.batchMode = flag;\n if (flag) {\n this._prevFloat = this._float;\n this._float = true; // let things go anywhere for now... will restore and possibly reposition later\n this.saveInitial(); // since begin update (which is called multiple times) won't do this\n }\n else {\n this._float = this._prevFloat;\n delete this._prevFloat;\n this._packNodes()._notify();\n }\n return this;\n };\n // use entire row for hitting area (will use bottom reverse sorted first) if we not actively moving DOWN and didn't already skip\n GridStackEngine.prototype._useEntireRowArea = function (node, nn) {\n return (!this.float || this.batchMode && !this._prevFloat) && !this._hasLocked && (!node._moving || node._skipDown || nn.y <= node.y);\n };\n /** @internal fix collision on given 'node', going to given new location 'nn', with optional 'collide' node already found.\n * return true if we moved. */\n GridStackEngine.prototype._fixCollisions = function (node, nn, collide, opt) {\n if (nn === void 0) { nn = node; }\n if (opt === void 0) { opt = {}; }\n this.sortNodes(-1); // from last to first, so recursive collision move items in the right order\n collide = collide || this.collide(node, nn); // REAL area collide for swap and skip if none...\n if (!collide)\n return false;\n // swap check: if we're actively moving in gravity mode, see if we collide with an object the same size\n if (node._moving && !opt.nested && !this.float) {\n if (this.swap(node, collide))\n return true;\n }\n // during while() collisions MAKE SURE to check entire row so larger items don't leap frog small ones (push them all down starting last in grid)\n var area = nn;\n if (this._useEntireRowArea(node, nn)) {\n area = { x: 0, w: this.column, y: nn.y, h: nn.h };\n collide = this.collide(node, area, opt.skip); // force new hit\n }\n var didMove = false;\n var newOpt = { nested: true, pack: false };\n while (collide = collide || this.collide(node, area, opt.skip)) { // could collide with more than 1 item... so repeat for each\n var moved = void 0;\n // if colliding with a locked item OR moving down with top gravity (and collide could move up) -> skip past the collide,\n // but remember that skip down so we only do this once (and push others otherwise).\n if (collide.locked || node._moving && !node._skipDown && nn.y > node.y && !this.float &&\n // can take space we had, or before where we're going\n (!this.collide(collide, __assign(__assign({}, collide), { y: node.y }), node) || !this.collide(collide, __assign(__assign({}, collide), { y: nn.y - collide.h }), node))) {\n node._skipDown = (node._skipDown || nn.y > node.y);\n moved = this.moveNode(node, __assign(__assign(__assign({}, nn), { y: collide.y + collide.h }), newOpt));\n if (collide.locked && moved) {\n utils_1.Utils.copyPos(nn, node); // moving after lock become our new desired location\n }\n else if (!collide.locked && moved && opt.pack) {\n // we moved after and will pack: do it now and keep the original drop location, but past the old collide to see what else we might push way\n this._packNodes();\n nn.y = collide.y + collide.h;\n utils_1.Utils.copyPos(node, nn);\n }\n didMove = didMove || moved;\n }\n else {\n // move collide down *after* where we will be, ignoring where we are now (don't collide with us)\n moved = this.moveNode(collide, __assign(__assign(__assign({}, collide), { y: nn.y + nn.h, skip: node }), newOpt));\n }\n if (!moved) {\n return didMove;\n } // break inf loop if we couldn't move after all (ex: maxRow, fixed)\n collide = undefined;\n }\n return didMove;\n };\n /** return the nodes that intercept the given node. Optionally a different area can be used, as well as a second node to skip */\n GridStackEngine.prototype.collide = function (skip, area, skip2) {\n if (area === void 0) { area = skip; }\n var skipId = skip._id;\n var skip2Id = skip2 === null || skip2 === void 0 ? void 0 : skip2._id;\n return this.nodes.find(function (n) { return n._id !== skipId && n._id !== skip2Id && utils_1.Utils.isIntercepted(n, area); });\n };\n GridStackEngine.prototype.collideAll = function (skip, area, skip2) {\n if (area === void 0) { area = skip; }\n var skipId = skip._id;\n var skip2Id = skip2 === null || skip2 === void 0 ? void 0 : skip2._id;\n return this.nodes.filter(function (n) { return n._id !== skipId && n._id !== skip2Id && utils_1.Utils.isIntercepted(n, area); });\n };\n /** does a pixel coverage collision based on where we started, returning the node that has the most coverage that is >50% mid line */\n GridStackEngine.prototype.directionCollideCoverage = function (node, o, collides) {\n if (!o.rect || !node._rect)\n return;\n var r0 = node._rect; // where started\n var r = __assign({}, o.rect); // where we are\n // update dragged rect to show where it's coming from (above or below, etc...)\n if (r.y > r0.y) {\n r.h += r.y - r0.y;\n r.y = r0.y;\n }\n else {\n r.h += r0.y - r.y;\n }\n if (r.x > r0.x) {\n r.w += r.x - r0.x;\n r.x = r0.x;\n }\n else {\n r.w += r0.x - r.x;\n }\n var collide;\n collides.forEach(function (n) {\n if (n.locked || !n._rect)\n return;\n var r2 = n._rect; // overlapping target\n var yOver = Number.MAX_VALUE, xOver = Number.MAX_VALUE, overMax = 0.5; // need >50%\n // depending on which side we started from, compute the overlap % of coverage\n // (ex: from above/below we only compute the max horizontal line coverage)\n if (r0.y < r2.y) { // from above\n yOver = ((r.y + r.h) - r2.y) / r2.h;\n }\n else if (r0.y + r0.h > r2.y + r2.h) { // from below\n yOver = ((r2.y + r2.h) - r.y) / r2.h;\n }\n if (r0.x < r2.x) { // from the left\n xOver = ((r.x + r.w) - r2.x) / r2.w;\n }\n else if (r0.x + r0.w > r2.x + r2.w) { // from the right\n xOver = ((r2.x + r2.w) - r.x) / r2.w;\n }\n var over = Math.min(xOver, yOver);\n if (over > overMax) {\n overMax = over;\n collide = n;\n }\n });\n o.collide = collide; // save it so we don't have to find it again\n return collide;\n };\n /** does a pixel coverage returning the node that has the most coverage by area */\n /*\n protected collideCoverage(r: GridStackPosition, collides: GridStackNode[]): {collide: GridStackNode, over: number} {\n let collide: GridStackNode;\n let overMax = 0;\n collides.forEach(n => {\n if (n.locked || !n._rect) return;\n let over = Utils.areaIntercept(r, n._rect);\n if (over > overMax) {\n overMax = over;\n collide = n;\n }\n });\n return {collide, over: overMax};\n }\n */\n /** called to cache the nodes pixel rectangles used for collision detection during drag */\n GridStackEngine.prototype.cacheRects = function (w, h, top, right, bottom, left) {\n this.nodes.forEach(function (n) {\n return n._rect = {\n y: n.y * h + top,\n x: n.x * w + left,\n w: n.w * w - left - right,\n h: n.h * h - top - bottom\n };\n });\n return this;\n };\n /** called to possibly swap between 2 nodes (same size or column, not locked, touching), returning true if successful */\n GridStackEngine.prototype.swap = function (a, b) {\n if (!b || b.locked || !a || a.locked)\n return false;\n function _doSwap() {\n var x = b.x, y = b.y;\n b.x = a.x;\n b.y = a.y; // b -> a position\n if (a.h != b.h) {\n a.x = x;\n a.y = b.y + b.h; // a -> goes after b\n }\n else if (a.w != b.w) {\n a.x = b.x + b.w;\n a.y = y; // a -> goes after b\n }\n else {\n a.x = x;\n a.y = y; // a -> old b position\n }\n a._dirty = b._dirty = true;\n return true;\n }\n var touching; // remember if we called it (vs undefined)\n // same size and same row or column, and touching\n if (a.w === b.w && a.h === b.h && (a.x === b.x || a.y === b.y) && (touching = utils_1.Utils.isTouching(a, b)))\n return _doSwap();\n if (touching === false)\n return; // IFF ran test and fail, bail out\n // check for taking same columns (but different height) and touching\n if (a.w === b.w && a.x === b.x && (touching || (touching = utils_1.Utils.isTouching(a, b)))) {\n if (b.y < a.y) {\n var t = a;\n a = b;\n b = t;\n } // swap a <-> b vars so a is first\n return _doSwap();\n }\n if (touching === false)\n return;\n // check if taking same row (but different width) and touching\n if (a.h === b.h && a.y === b.y && (touching || (touching = utils_1.Utils.isTouching(a, b)))) {\n if (b.x < a.x) {\n var t = a;\n a = b;\n b = t;\n } // swap a <-> b vars so a is first\n return _doSwap();\n }\n return false;\n };\n GridStackEngine.prototype.isAreaEmpty = function (x, y, w, h) {\n var nn = { x: x || 0, y: y || 0, w: w || 1, h: h || 1 };\n return !this.collide(nn);\n };\n /** re-layout grid items to reclaim any empty space */\n GridStackEngine.prototype.compact = function () {\n var _this = this;\n if (this.nodes.length === 0)\n return this;\n this.batchUpdate()\n .sortNodes();\n var copyNodes = this.nodes;\n this.nodes = []; // pretend we have no nodes to conflict layout to start with...\n copyNodes.forEach(function (node) {\n if (!node.locked) {\n node.autoPosition = true;\n }\n _this.addNode(node, false); // 'false' for add event trigger\n node._dirty = true; // will force attr update\n });\n return this.batchUpdate(false);\n };\n Object.defineProperty(GridStackEngine.prototype, \"float\", {\n /** float getter method */\n get: function () { return this._float || false; },\n /** enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html) */\n set: function (val) {\n if (this._float === val)\n return;\n this._float = val || false;\n if (!val) {\n this._packNodes()._notify();\n }\n },\n enumerable: false,\n configurable: true\n });\n /** sort the nodes array from first to last, or reverse. Called during collision/placement to force an order */\n GridStackEngine.prototype.sortNodes = function (dir) {\n this.nodes = utils_1.Utils.sort(this.nodes, dir, this.column);\n return this;\n };\n /** @internal called to top gravity pack the items back OR revert back to original Y positions when floating */\n GridStackEngine.prototype._packNodes = function () {\n var _this = this;\n if (this.batchMode) {\n return this;\n }\n this.sortNodes(); // first to last\n if (this.float) {\n // restore original Y pos\n this.nodes.forEach(function (n) {\n if (n._updating || n._orig === undefined || n.y === n._orig.y)\n return;\n var newY = n.y;\n while (newY > n._orig.y) {\n --newY;\n var collide = _this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });\n if (!collide) {\n n._dirty = true;\n n.y = newY;\n }\n }\n });\n }\n else {\n // top gravity pack\n this.nodes.forEach(function (n, i) {\n if (n.locked)\n return;\n while (n.y > 0) {\n var newY = i === 0 ? 0 : n.y - 1;\n var canBeMoved = i === 0 || !_this.collide(n, { x: n.x, y: newY, w: n.w, h: n.h });\n if (!canBeMoved)\n break;\n // Note: must be dirty (from last position) for GridStack::OnChange CB to update positions\n // and move items back. The user 'change' CB should detect changes from the original\n // starting position instead.\n n._dirty = (n.y !== newY);\n n.y = newY;\n }\n });\n }\n return this;\n };\n /**\n * given a random node, makes sure it's coordinates/values are valid in the current grid\n * @param node to adjust\n * @param resizing if out of bound, resize down or move into the grid to fit ?\n */\n GridStackEngine.prototype.prepareNode = function (node, resizing) {\n var _a;\n node = node || {};\n node._id = (_a = node._id) !== null && _a !== void 0 ? _a : GridStackEngine._idSeq++;\n // if we're missing position, have the grid position us automatically (before we set them to 0,0)\n if (node.x === undefined || node.y === undefined || node.x === null || node.y === null) {\n node.autoPosition = true;\n }\n // assign defaults for missing required fields\n var defaults = { x: 0, y: 0, w: 1, h: 1 };\n utils_1.Utils.defaults(node, defaults);\n if (!node.autoPosition) {\n delete node.autoPosition;\n }\n if (!node.noResize) {\n delete node.noResize;\n }\n if (!node.noMove) {\n delete node.noMove;\n }\n utils_1.Utils.sanitizeMinMax(node);\n // check for NaN (in case messed up strings were passed. can't do parseInt() || defaults.x above as 0 is valid #)\n if (typeof node.x == 'string') {\n node.x = Number(node.x);\n }\n if (typeof node.y == 'string') {\n node.y = Number(node.y);\n }\n if (typeof node.w == 'string') {\n node.w = Number(node.w);\n }\n if (typeof node.h == 'string') {\n node.h = Number(node.h);\n }\n if (isNaN(node.x)) {\n node.x = defaults.x;\n node.autoPosition = true;\n }\n if (isNaN(node.y)) {\n node.y = defaults.y;\n node.autoPosition = true;\n }\n if (isNaN(node.w)) {\n node.w = defaults.w;\n }\n if (isNaN(node.h)) {\n node.h = defaults.h;\n }\n return this.nodeBoundFix(node, resizing);\n };\n /** part2 of preparing a node to fit inside our grid - checks for x,y,w from grid dimensions */\n GridStackEngine.prototype.nodeBoundFix = function (node, resizing) {\n var before = node._orig || utils_1.Utils.copyPos({}, node);\n if (node.maxW) {\n node.w = Math.min(node.w, node.maxW);\n }\n if (node.maxH) {\n node.h = Math.min(node.h, node.maxH);\n }\n if (node.minW && node.minW <= this.column) {\n node.w = Math.max(node.w, node.minW);\n }\n if (node.minH) {\n node.h = Math.max(node.h, node.minH);\n }\n // if user loaded a larger than allowed widget for current # of columns (or force 1 column mode),\n // remember it's position & width so we can restore back (1 -> 12 column) #1655 #1985\n // IFF we're not in the middle of column resizing!\n var saveOrig = this.column === 1 || node.x + node.w > this.column;\n if (saveOrig && this.column < 12 && !this._inColumnResize && node._id && this.findCacheLayout(node, 12) === -1) {\n var copy = __assign({}, node); // need _id + positions\n if (copy.autoPosition) {\n delete copy.x;\n delete copy.y;\n }\n else\n copy.x = Math.min(11, copy.x);\n copy.w = Math.min(12, copy.w);\n this.cacheOneLayout(copy, 12);\n }\n if (node.w > this.column) {\n node.w = this.column;\n }\n else if (node.w < 1) {\n node.w = 1;\n }\n if (this.maxRow && node.h > this.maxRow) {\n node.h = this.maxRow;\n }\n else if (node.h < 1) {\n node.h = 1;\n }\n if (node.x < 0) {\n node.x = 0;\n }\n if (node.y < 0) {\n node.y = 0;\n }\n if (node.x + node.w > this.column) {\n if (resizing) {\n node.w = this.column - node.x;\n }\n else {\n node.x = this.column - node.w;\n }\n }\n if (this.maxRow && node.y + node.h > this.maxRow) {\n if (resizing) {\n node.h = this.maxRow - node.y;\n }\n else {\n node.y = this.maxRow - node.h;\n }\n }\n if (!utils_1.Utils.samePos(node, before)) {\n node._dirty = true;\n }\n return node;\n };\n /** returns a list of modified nodes from their original values */\n GridStackEngine.prototype.getDirtyNodes = function (verify) {\n // compare original x,y,w,h instead as _dirty can be a temporary state\n if (verify) {\n return this.nodes.filter(function (n) { return n._dirty && !utils_1.Utils.samePos(n, n._orig); });\n }\n return this.nodes.filter(function (n) { return n._dirty; });\n };\n /** @internal call this to call onChange callback with dirty nodes so DOM can be updated */\n GridStackEngine.prototype._notify = function (removedNodes) {\n if (this.batchMode || !this.onChange)\n return this;\n var dirtyNodes = (removedNodes || []).concat(this.getDirtyNodes());\n this.onChange(dirtyNodes);\n return this;\n };\n /** @internal remove dirty and last tried info */\n GridStackEngine.prototype.cleanNodes = function () {\n if (this.batchMode)\n return this;\n this.nodes.forEach(function (n) {\n delete n._dirty;\n delete n._lastTried;\n });\n return this;\n };\n /** @internal called to save initial position/size to track real dirty state.\n * Note: should be called right after we call change event (so next API is can detect changes)\n * as well as right before we start move/resize/enter (so we can restore items to prev values) */\n GridStackEngine.prototype.saveInitial = function () {\n this.nodes.forEach(function (n) {\n n._orig = utils_1.Utils.copyPos({}, n);\n delete n._dirty;\n });\n this._hasLocked = this.nodes.some(function (n) { return n.locked; });\n return this;\n };\n /** @internal restore all the nodes back to initial values (called when we leave) */\n GridStackEngine.prototype.restoreInitial = function () {\n this.nodes.forEach(function (n) {\n if (utils_1.Utils.samePos(n, n._orig))\n return;\n utils_1.Utils.copyPos(n, n._orig);\n n._dirty = true;\n });\n this._notify();\n return this;\n };\n /** find the first available empty spot for the given node width/height, updating the x,y attributes. return true if found.\n * optionally you can pass your own existing node list and column count, otherwise defaults to that engine data.\n */\n GridStackEngine.prototype.findEmptyPosition = function (node, nodeList, column) {\n if (nodeList === void 0) { nodeList = this.nodes; }\n if (column === void 0) { column = this.column; }\n nodeList = utils_1.Utils.sort(nodeList, -1, column);\n var found = false;\n var _loop_1 = function (i) {\n var x = i % column;\n var y = Math.floor(i / column);\n if (x + node.w > column) {\n return \"continue\";\n }\n var box = { x: x, y: y, w: node.w, h: node.h };\n if (!nodeList.find(function (n) { return utils_1.Utils.isIntercepted(box, n); })) {\n node.x = x;\n node.y = y;\n delete node.autoPosition;\n found = true;\n }\n };\n for (var i = 0; !found; ++i) {\n _loop_1(i);\n }\n return found;\n };\n /** call to add the given node to our list, fixing collision and re-packing */\n GridStackEngine.prototype.addNode = function (node, triggerAddEvent) {\n if (triggerAddEvent === void 0) { triggerAddEvent = false; }\n var dup = this.nodes.find(function (n) { return n._id === node._id; });\n if (dup)\n return dup; // prevent inserting twice! return it instead.\n // skip prepareNode if we're in middle of column resize (not new) but do check for bounds!\n node = this._inColumnResize ? this.nodeBoundFix(node) : this.prepareNode(node);\n delete node._temporaryRemoved;\n delete node._removeDOM;\n if (node.autoPosition && this.findEmptyPosition(node)) {\n delete node.autoPosition; // found our slot\n }\n this.nodes.push(node);\n if (triggerAddEvent) {\n this.addedNodes.push(node);\n }\n this._fixCollisions(node);\n if (!this.batchMode) {\n this._packNodes()._notify();\n }\n return node;\n };\n GridStackEngine.prototype.removeNode = function (node, removeDOM, triggerEvent) {\n if (removeDOM === void 0) { removeDOM = true; }\n if (triggerEvent === void 0) { triggerEvent = false; }\n if (!this.nodes.find(function (n) { return n._id === node._id; })) {\n // TEST console.log(`Error: GridStackEngine.removeNode() node._id=${node._id} not found!`)\n return this;\n }\n if (triggerEvent) { // we wait until final drop to manually track removed items (rather than during drag)\n this.removedNodes.push(node);\n }\n if (removeDOM)\n node._removeDOM = true; // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\n // don't use 'faster' .splice(findIndex(),1) in case node isn't in our list, or in multiple times.\n this.nodes = this.nodes.filter(function (n) { return n._id !== node._id; });\n return this._packNodes()\n ._notify([node]);\n };\n GridStackEngine.prototype.removeAll = function (removeDOM) {\n if (removeDOM === void 0) { removeDOM = true; }\n delete this._layouts;\n if (!this.nodes.length)\n return this;\n removeDOM && this.nodes.forEach(function (n) { return n._removeDOM = true; }); // let CB remove actual HTML (used to set _id to null, but then we loose layout info)\n this.removedNodes = this.nodes;\n this.nodes = [];\n return this._notify(this.removedNodes);\n };\n /** checks if item can be moved (layout constrain) vs moveNode(), returning true if was able to move.\n * In more complicated cases (maxRow) it will attempt at moving the item and fixing\n * others in a clone first, then apply those changes if still within specs. */\n GridStackEngine.prototype.moveNodeCheck = function (node, o) {\n var _this = this;\n // if (node.locked) return false;\n if (!this.changedPosConstrain(node, o))\n return false;\n o.pack = true;\n // simpler case: move item directly...\n if (!this.maxRow) {\n return this.moveNode(node, o);\n }\n // complex case: create a clone with NO maxRow (will check for out of bounds at the end)\n var clonedNode;\n var clone = new GridStackEngine({\n column: this.column,\n float: this.float,\n nodes: this.nodes.map(function (n) {\n if (n._id === node._id) {\n clonedNode = __assign({}, n);\n return clonedNode;\n }\n return __assign({}, n);\n })\n });\n if (!clonedNode)\n return false;\n // check if we're covering 50% collision and could move\n var canMove = clone.moveNode(clonedNode, o) && clone.getRow() <= this.maxRow;\n // else check if we can force a swap (float=true, or different shapes) on non-resize\n if (!canMove && !o.resizing && o.collide) {\n var collide = o.collide.el.gridstackNode; // find the source node the clone collided with at 50%\n if (this.swap(node, collide)) { // swaps and mark dirty\n this._notify();\n return true;\n }\n }\n if (!canMove)\n return false;\n // if clone was able to move, copy those mods over to us now instead of caller trying to do this all over!\n // Note: we can't use the list directly as elements and other parts point to actual node, so copy content\n clone.nodes.filter(function (n) { return n._dirty; }).forEach(function (c) {\n var n = _this.nodes.find(function (a) { return a._id === c._id; });\n if (!n)\n return;\n utils_1.Utils.copyPos(n, c);\n n._dirty = true;\n });\n this._notify();\n return true;\n };\n /** return true if can fit in grid height constrain only (always true if no maxRow) */\n GridStackEngine.prototype.willItFit = function (node) {\n delete node._willFitPos;\n if (!this.maxRow)\n return true;\n // create a clone with NO maxRow and check if still within size\n var clone = new GridStackEngine({\n column: this.column,\n float: this.float,\n nodes: this.nodes.map(function (n) { return __assign({}, n); })\n });\n var n = __assign({}, node); // clone node so we don't mod any settings on it but have full autoPosition and min/max as well! #1687\n this.cleanupNode(n);\n delete n.el;\n delete n._id;\n delete n.content;\n delete n.grid;\n clone.addNode(n);\n if (clone.getRow() <= this.maxRow) {\n node._willFitPos = utils_1.Utils.copyPos({}, n);\n return true;\n }\n return false;\n };\n /** true if x,y or w,h are different after clamping to min/max */\n GridStackEngine.prototype.changedPosConstrain = function (node, p) {\n // first make sure w,h are set for caller\n p.w = p.w || node.w;\n p.h = p.h || node.h;\n if (node.x !== p.x || node.y !== p.y)\n return true;\n // check constrained w,h\n if (node.maxW) {\n p.w = Math.min(p.w, node.maxW);\n }\n if (node.maxH) {\n p.h = Math.min(p.h, node.maxH);\n }\n if (node.minW) {\n p.w = Math.max(p.w, node.minW);\n }\n if (node.minH) {\n p.h = Math.max(p.h, node.minH);\n }\n return (node.w !== p.w || node.h !== p.h);\n };\n /** return true if the passed in node was actually moved (checks for no-op and locked) */\n GridStackEngine.prototype.moveNode = function (node, o) {\n var _a, _b;\n if (!node || /*node.locked ||*/ !o)\n return false;\n var wasUndefinedPack;\n if (o.pack === undefined) {\n wasUndefinedPack = o.pack = true;\n }\n // constrain the passed in values and check if we're still changing our node\n if (typeof o.x !== 'number') {\n o.x = node.x;\n }\n if (typeof o.y !== 'number') {\n o.y = node.y;\n }\n if (typeof o.w !== 'number') {\n o.w = node.w;\n }\n if (typeof o.h !== 'number') {\n o.h = node.h;\n }\n var resizing = (node.w !== o.w || node.h !== o.h);\n var nn = utils_1.Utils.copyPos({}, node, true); // get min/max out first, then opt positions next\n utils_1.Utils.copyPos(nn, o);\n nn = this.nodeBoundFix(nn, resizing);\n utils_1.Utils.copyPos(o, nn);\n if (utils_1.Utils.samePos(node, o))\n return false;\n var prevPos = utils_1.Utils.copyPos({}, node);\n // check if we will need to fix collision at our new location\n var collides = this.collideAll(node, nn, o.skip);\n var needToMove = true;\n if (collides.length) {\n var activeDrag = node._moving && !o.nested;\n // check to make sure we actually collided over 50% surface area while dragging\n var collide = activeDrag ? this.directionCollideCoverage(node, o, collides) : collides[0];\n // if we're enabling creation of sub-grids on the fly, see if we're covering 80% of either one, if we didn't already do that\n if (activeDrag && collide && ((_b = (_a = node.grid) === null || _a === void 0 ? void 0 : _a.opts) === null || _b === void 0 ? void 0 : _b.subGridDynamic) && !node.grid._isTemp) {\n var over = utils_1.Utils.areaIntercept(o.rect, collide._rect);\n var a1 = utils_1.Utils.area(o.rect);\n var a2 = utils_1.Utils.area(collide._rect);\n var perc = over / (a1 < a2 ? a1 : a2);\n if (perc > .8) {\n collide.grid.makeSubGrid(collide.el, undefined, node);\n collide = undefined;\n }\n }\n if (collide) {\n needToMove = !this._fixCollisions(node, nn, collide, o); // check if already moved...\n }\n else {\n needToMove = false; // we didn't cover >50% for a move, skip...\n if (wasUndefinedPack)\n delete o.pack;\n }\n }\n // now move (to the original ask vs the collision version which might differ) and repack things\n if (needToMove) {\n node._dirty = true;\n utils_1.Utils.copyPos(node, nn);\n }\n if (o.pack) {\n this._packNodes()\n ._notify();\n }\n return !utils_1.Utils.samePos(node, prevPos); // pack might have moved things back\n };\n GridStackEngine.prototype.getRow = function () {\n return this.nodes.reduce(function (row, n) { return Math.max(row, n.y + n.h); }, 0);\n };\n GridStackEngine.prototype.beginUpdate = function (node) {\n if (!node._updating) {\n node._updating = true;\n delete node._skipDown;\n if (!this.batchMode)\n this.saveInitial();\n }\n return this;\n };\n GridStackEngine.prototype.endUpdate = function () {\n var n = this.nodes.find(function (n) { return n._updating; });\n if (n) {\n delete n._updating;\n delete n._skipDown;\n }\n return this;\n };\n /** saves a copy of the largest column layout (eg 12 even when rendering oneColumnMode) so we don't loose orig layout,\n * returning a list of widgets for serialization */\n GridStackEngine.prototype.save = function (saveElement, saveCB) {\n var _a;\n if (saveElement === void 0) { saveElement = true; }\n // use the highest layout for any saved info so we can have full detail on reload #1849\n var len = (_a = this._layouts) === null || _a === void 0 ? void 0 : _a.length;\n var layout = len && this.column !== (len - 1) ? this._layouts[len - 1] : null;\n var list = [];\n this.sortNodes();\n this.nodes.forEach(function (n) {\n var wl = layout === null || layout === void 0 ? void 0 : layout.find(function (l) { return l._id === n._id; });\n var w = __assign({}, n);\n // use layout info instead if set\n if (wl) {\n w.x = wl.x;\n w.y = wl.y;\n w.w = wl.w;\n }\n utils_1.Utils.removeInternalForSave(w, !saveElement);\n if (saveCB)\n saveCB(n, w);\n list.push(w);\n });\n return list;\n };\n /** @internal called whenever a node is added or moved - updates the cached layouts */\n GridStackEngine.prototype.layoutsNodesChange = function (nodes) {\n var _this = this;\n if (!this._layouts || this._inColumnResize)\n return this;\n // remove smaller layouts - we will re-generate those on the fly... larger ones need to update\n this._layouts.forEach(function (layout, column) {\n if (!layout || column === _this.column)\n return _this;\n if (column < _this.column) {\n _this._layouts[column] = undefined;\n }\n else {\n // we save the original x,y,w (h isn't cached) to see what actually changed to propagate better.\n // NOTE: we don't need to check against out of bound scaling/moving as that will be done when using those cache values. #1785\n var ratio_1 = column / _this.column;\n nodes.forEach(function (node) {\n if (!node._orig)\n return; // didn't change (newly added ?)\n var n = layout.find(function (l) { return l._id === node._id; });\n if (!n)\n return; // no cache for new nodes. Will use those values.\n // Y changed, push down same amount\n // TODO: detect doing item 'swaps' will help instead of move (especially in 1 column mode)\n if (node.y !== node._orig.y) {\n n.y += (node.y - node._orig.y);\n }\n // X changed, scale from new position\n if (node.x !== node._orig.x) {\n n.x = Math.round(node.x * ratio_1);\n }\n // width changed, scale from new width\n if (node.w !== node._orig.w) {\n n.w = Math.round(node.w * ratio_1);\n }\n // ...height always carries over from cache\n });\n }\n });\n return this;\n };\n /**\n * @internal Called to scale the widget width & position up/down based on the column change.\n * Note we store previous layouts (especially original ones) to make it possible to go\n * from say 12 -> 1 -> 12 and get back to where we were.\n *\n * @param prevColumn previous number of columns\n * @param column new column number\n * @param nodes different sorted list (ex: DOM order) instead of current list\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\n */\n GridStackEngine.prototype.updateNodeWidths = function (prevColumn, column, nodes, layout) {\n var _this = this;\n var _a;\n if (layout === void 0) { layout = 'moveScale'; }\n if (!this.nodes.length || !column || prevColumn === column)\n return this;\n // cache the current layout in case they want to go back (like 12 -> 1 -> 12) as it requires original data\n this.cacheLayout(this.nodes, prevColumn);\n this.batchUpdate(); // do this EARLY as it will call saveInitial() so we can detect where we started for _dirty and collision\n var newNodes = [];\n // if we're going to 1 column and using DOM order rather than default sorting, then generate that layout\n var domOrder = false;\n if (column === 1 && (nodes === null || nodes === void 0 ? void 0 : nodes.length)) {\n domOrder = true;\n var top_1 = 0;\n nodes.forEach(function (n) {\n n.x = 0;\n n.w = 1;\n n.y = Math.max(n.y, top_1);\n top_1 = n.y + n.h;\n });\n newNodes = nodes;\n nodes = [];\n }\n else {\n nodes = utils_1.Utils.sort(this.nodes, -1, prevColumn); // current column reverse sorting so we can insert last to front (limit collision)\n }\n // see if we have cached previous layout IFF we are going up in size (restore) otherwise always\n // generate next size down from where we are (looks more natural as you gradually size down).\n var cacheNodes = [];\n if (column > prevColumn) {\n cacheNodes = this._layouts[column] || [];\n // ...if not, start with the largest layout (if not already there) as down-scaling is more accurate\n // by pretending we came from that larger column by assigning those values as starting point\n var lastIndex = this._layouts.length - 1;\n if (!cacheNodes.length && prevColumn !== lastIndex && ((_a = this._layouts[lastIndex]) === null || _a === void 0 ? void 0 : _a.length)) {\n prevColumn = lastIndex;\n this._layouts[lastIndex].forEach(function (cacheNode) {\n var n = nodes.find(function (n) { return n._id === cacheNode._id; });\n if (n) {\n // still current, use cache info positions\n n.x = cacheNode.x;\n n.y = cacheNode.y;\n n.w = cacheNode.w;\n }\n });\n }\n }\n // if we found cache re-use those nodes that are still current\n cacheNodes.forEach(function (cacheNode) {\n var j = nodes.findIndex(function (n) { return n._id === cacheNode._id; });\n if (j !== -1) {\n // still current, use cache info positions\n if (cacheNode.autoPosition || isNaN(cacheNode.x) || isNaN(cacheNode.y)) {\n _this.findEmptyPosition(cacheNode, newNodes);\n }\n if (!cacheNode.autoPosition) {\n nodes[j].x = cacheNode.x;\n nodes[j].y = cacheNode.y;\n nodes[j].w = cacheNode.w;\n newNodes.push(nodes[j]);\n }\n nodes.splice(j, 1);\n }\n });\n // ...and add any extra non-cached ones\n if (nodes.length) {\n if (typeof layout === 'function') {\n layout(column, prevColumn, newNodes, nodes);\n }\n else if (!domOrder) {\n var ratio_2 = column / prevColumn;\n var move_1 = (layout === 'move' || layout === 'moveScale');\n var scale_1 = (layout === 'scale' || layout === 'moveScale');\n nodes.forEach(function (node) {\n // NOTE: x + w could be outside of the grid, but addNode() below will handle that\n node.x = (column === 1 ? 0 : (move_1 ? Math.round(node.x * ratio_2) : Math.min(node.x, column - 1)));\n node.w = ((column === 1 || prevColumn === 1) ? 1 :\n scale_1 ? (Math.round(node.w * ratio_2) || 1) : (Math.min(node.w, column)));\n newNodes.push(node);\n });\n nodes = [];\n }\n }\n // finally re-layout them in reverse order (to get correct placement)\n if (!domOrder)\n newNodes = utils_1.Utils.sort(newNodes, -1, column);\n this._inColumnResize = true; // prevent cache update\n this.nodes = []; // pretend we have no nodes to start with (add() will use same structures) to simplify layout\n newNodes.forEach(function (node) {\n _this.addNode(node, false); // 'false' for add event trigger\n delete node._orig; // make sure the commit doesn't try to restore things back to original\n });\n this.batchUpdate(false);\n delete this._inColumnResize;\n return this;\n };\n /**\n * call to cache the given layout internally to the given location so we can restore back when column changes size\n * @param nodes list of nodes\n * @param column corresponding column index to save it under\n * @param clear if true, will force other caches to be removed (default false)\n */\n GridStackEngine.prototype.cacheLayout = function (nodes, column, clear) {\n if (clear === void 0) { clear = false; }\n var copy = [];\n nodes.forEach(function (n, i) {\n var _a;\n n._id = (_a = n._id) !== null && _a !== void 0 ? _a : GridStackEngine._idSeq++; // make sure we have an id in case this is new layout, else re-use id already set\n copy[i] = { x: n.x, y: n.y, w: n.w, _id: n._id }; // only thing we change is x,y,w and id to find it back\n });\n this._layouts = clear ? [] : this._layouts || []; // use array to find larger quick\n this._layouts[column] = copy;\n return this;\n };\n /**\n * call to cache the given node layout internally to the given location so we can restore back when column changes size\n * @param node single node to cache\n * @param column corresponding column index to save it under\n */\n GridStackEngine.prototype.cacheOneLayout = function (n, column) {\n var _a;\n n._id = (_a = n._id) !== null && _a !== void 0 ? _a : GridStackEngine._idSeq++;\n var l = { x: n.x, y: n.y, w: n.w, _id: n._id };\n if (n.autoPosition) {\n delete l.x;\n delete l.y;\n l.autoPosition = true;\n }\n this._layouts = this._layouts || [];\n this._layouts[column] = this._layouts[column] || [];\n var index = this.findCacheLayout(n, column);\n if (index === -1)\n this._layouts[column].push(l);\n else\n this._layouts[column][index] = l;\n return this;\n };\n GridStackEngine.prototype.findCacheLayout = function (n, column) {\n var _a, _b, _c;\n return (_c = (_b = (_a = this._layouts) === null || _a === void 0 ? void 0 : _a[column]) === null || _b === void 0 ? void 0 : _b.findIndex(function (l) { return l._id === n._id; })) !== null && _c !== void 0 ? _c : -1;\n };\n /** called to remove all internal values but the _id */\n GridStackEngine.prototype.cleanupNode = function (node) {\n for (var prop in node) {\n if (prop[0] === '_' && prop !== '_id')\n delete node[prop];\n }\n return this;\n };\n /** @internal unique global internal _id counter */\n GridStackEngine._idSeq = 0;\n return GridStackEngine;\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUM7SUFFUyx5Q0FBZSxHQUF6QixVQUEwQixDQUFnQixFQUFFLE1BQWM7O1FBQ3hELE9BQU8sc0JBQUksQ0FBQyxRQUFRLDBDQUFHLE1BQU0sQ0FBQywwQ0FBRSxTQUFTLENBQUMsV0FBQyxJQUFJLFFBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBZixDQUFlLENBQUMsbUNBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUdELHVEQUF1RDtJQUNoRCxxQ0FBVyxHQUFsQixVQUFtQixJQUFtQjtRQUNwQyxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtZQUNyQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUQ7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUF2M0JELG1EQUFtRDtJQUNyQyxzQkFBTSxHQUFHLENBQUMsQ0FBQztJQXUzQjNCLHNCQUFDO0NBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmlkU3RhY2svLi9zcmMvZ3JpZHN0YWNrLWVuZ2luZS50cz8wNzBlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ3JpZHN0YWNrLWVuZ2luZS50cyA4LjIuMlxuICogQ29weXJpZ2h0IChjKSAyMDIxLTIwMjIgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEdyaWRTdGFja05vZGUsIENvbHVtbk9wdGlvbnMsIEdyaWRTdGFja1Bvc2l0aW9uLCBHcmlkU3RhY2tNb3ZlT3B0cywgU2F2ZUZjbiB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogY2FsbGJhY2sgdG8gdXBkYXRlIHRoZSBET00gYXR0cmlidXRlcyBzaW5jZSB0aGlzIGNsYXNzIGlzIGdlbmVyaWMgKG5vIEhUTUwgb3Igb3RoZXIgaW5mbykgZm9yIGl0ZW1zIHRoYXQgY2hhbmdlZCAtIHNlZSBfbm90aWZ5KCkgKi9cbnR5cGUgT25DaGFuZ2VDQiA9IChub2RlczogR3JpZFN0YWNrTm9kZVtdKSA9PiB2b2lkO1xuXG4vKiogb3B0aW9ucyB1c2VkIGR1cmluZyBjcmVhdGlvbiAtIHNpbWlsYXIgdG8gR3JpZFN0YWNrT3B0aW9ucyAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmlkU3RhY2tFbmdpbmVPcHRpb25zIHtcbiAgY29sdW1uPzogbnVtYmVyO1xuICBtYXhSb3c/OiBudW1iZXI7XG4gIGZsb2F0PzogYm9vbGVhbjtcbiAgbm9kZXM/OiBHcmlkU3RhY2tOb2RlW107XG4gIG9uQ2hhbmdlPzogT25DaGFuZ2VDQjtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBHcmlkU3RhY2sgZW5naW5lIHRoYXQgZG9lcyBtb3N0IG5vIERPTSBncmlkIG1hbmlwdWxhdGlvbi5cbiAqIFNlZSBHcmlkU3RhY2sgbWV0aG9kcyBhbmQgdmFycyBmb3IgZGVzY3JpcHRpb25zLlxuICpcbiAqIE5PVEU6IHZhbHVlcyBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGRpcmVjdGx5IC0gY2FsbCB0aGUgbWFpbiBHcmlkU3RhY2sgQVBJIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNsYXNzIEdyaWRTdGFja0VuZ2luZSB7XG4gIHB1YmxpYyBjb2x1bW46IG51bWJlcjtcbiAgcHVibGljIG1heFJvdzogbnVtYmVyO1xuICBwdWJsaWMgbm9kZXM6IEdyaWRTdGFja05vZGVbXTtcbiAgcHVibGljIGFkZGVkTm9kZXM6IEdyaWRTdGFja05vZGVbXSA9IFtdO1xuICBwdWJsaWMgcmVtb3ZlZE5vZGVzOiBHcmlkU3RhY2tOb2RlW10gPSBbXTtcbiAgcHVibGljIGJhdGNoTW9kZTogYm9vbGVhbjtcbiAgLyoqIEBpbnRlcm5hbCBjYWxsYmFjayB0byB1cGRhdGUgdGhlIERPTSBhdHRyaWJ1dGVzICovXG4gIHByb3RlY3RlZCBvbkNoYW5nZTogT25DaGFuZ2VDQjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX2Zsb2F0OiBib29sZWFuO1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBfcHJldkZsb2F0OiBib29sZWFuO1xuICAvKiogQGludGVybmFsIGNhY2hlZCBsYXlvdXRzIG9mIGRpZmZlcmVuY2UgY29sdW1uIGNvdW50IHNvIHdlIGNhbiByZXN0b3JlIGJhY2sgKGVnIDEyIC0+IDEgLT4gMTIpICovXG4gIHByb3RlY3RlZCBfbGF5b3V0cz86IEdyaWRTdGFja05vZGVbXVtdOyAvLyBtYXBzIGNvbHVtbiAjIHRvIGFycmF5IG9mIHZhbHVlcyBub2Rlc1xuICAvKiogQGludGVybmFsIHRydWUgd2hpbGUgd2UgYXJlIHJlc2l6aW5nIHdpZGdldHMgZHVyaW5nIGNvbHVtbiByZXNpemUgdG8gc2tpcCBjZXJ0YWluIHBhcnRzICovXG4gIHByb3RlY3RlZCBfaW5Db2x1bW5SZXNpemU6IGJvb2xlYW47XG4gIC8qKiBAaW50ZXJuYWwgdHJ1ZSBpZiB3ZSBoYXZlIHNvbWUgaXRlbXMgbG9ja2VkICovXG4gIHByb3RlY3RlZCBfaGFzTG9ja2VkOiBib29sZWFuO1xuICAvKiogQGludGVybmFsIHVuaXF1ZSBnbG9iYWwgaW50ZXJuYWwgX2lkIGNvdW50ZXIgKi9cbiAgcHVibGljIHN0YXRpYyBfaWRTZXEgPSAwO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRzOiBHcmlkU3RhY2tFbmdpbmVPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmNvbHVtbiA9IG9wdHMuY29sdW1uIHx8IDEyO1xuICAgIHRoaXMubWF4Um93ID0gb3B0cy5tYXhSb3c7XG4gICAgdGhpcy5fZmxvYXQgPSBvcHRzLmZsb2F0O1xuICAgIHRoaXMubm9kZXMgPSBvcHRzLm5vZGVzIHx8IFtdO1xuICAgIHRoaXMub25DaGFuZ2UgPSBvcHRzLm9uQ2hhbmdlO1xuICB9XG5cbiAgcHVibGljIGJhdGNoVXBkYXRlKGZsYWcgPSB0cnVlKTogR3JpZFN0YWNrRW5naW5lIHtcbiAgICBpZiAoISF0aGlzLmJhdGNoTW9kZSA9PT0gZmxhZykgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5iYXRjaE1vZGUgPSBmbGFnO1xuICAgIGlmIChmbGFnKSB7XG4gICAgICB0aGlzLl9wcmV2RmxvYXQgPSB0aGlzLl9mbG9hdDtcbiAgICAgIHRoaXMuX2Zsb2F0ID0gdHJ1ZTsgLy8gbGV0IHRoaW5ncyBnbyBhbnl3aGVyZSBmb3Igbm93Li4uIHdpbGwgcmVzdG9yZSBhbmQgcG9zc2libHkgcmVwb3NpdGlvbiBsYXRlclxuICAgICAgdGhpcy5zYXZlSW5pdGlhbCgpOyAvLyBzaW5jZSBiZWdpbiB1cGRhdGUgKHdoaWNoIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcykgd29uJ3QgZG8gdGhpc1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9mbG9hdCA9IHRoaXMuX3ByZXZGbG9hdDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9wcmV2RmxvYXQ7XG4gICAgICB0aGlzLl9wYWNrTm9kZXMoKS5fbm90aWZ5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdXNlIGVudGlyZSByb3cgZm9yIGhpdHRpbmcgYXJlYSAod2lsbCB1c2UgYm90dG9tIHJldmVyc2Ugc29ydGVkIGZpcnN0KSBpZiB3ZSBub3QgYWN0aXZlbHkgbW92aW5nIERPV04gYW5kIGRpZG4ndCBhbHJlYWR5IHNraXBcbiAgcHJvdGVjdGVkIF91c2VFbnRpcmVSb3dBcmVhKG5vZGU6IEdyaWRTdGFja05vZGUsIG5uOiBHcmlkU3RhY2tQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoIXRoaXMuZmxvYXQgfHwgdGhpcy5iYXRjaE1vZGUgJiYgIXRoaXMuX3ByZXZGbG9hdCkgJiYgIXRoaXMuX2hhc0xvY2tlZCAmJiAoIW5vZGUuX21vdmluZyB8fCBub2RlLl9za2lwRG93biB8fCBubi55IDw9IG5vZGUueSk7XG4gIH1cblxuICAvKiogQGludGVybmFsIGZpeCBjb2xsaXNpb24gb24gZ2l2ZW4gJ25vZGUnLCBnb2luZyB0byBnaXZlbiBuZXcgbG9jYXRpb24gJ25uJywgd2l0aCBvcHRpb25hbCAnY29sbGlkZScgbm9kZSBhbHJlYWR5IGZvdW5kLlxuICAgKiByZXR1cm4gdHJ1ZSBpZiB3ZSBtb3ZlZC4gKi9cbiAgcHJvdGVjdGVkIF9maXhDb2xsaXNpb25zKG5vZGU6IEdyaWRTdGFja05vZGUsIG5uID0gbm9kZSwgY29sbGlkZT86IEdyaWRTdGFja05vZGUsIG9wdDogR3JpZFN0YWNrTW92ZU9wdHMgPSB7fSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuc29ydE5vZGVzKC0xKTsgLy8gZnJvbSBsYXN0IHRvIGZpcnN0LCBzbyByZWN1cnNpdmUgY29sbGlzaW9uIG1vdmUgaXRlbXMgaW4gdGhlIHJpZ2h0IG9yZGVyXG5cbiAgICBjb2xsaWRlID0gY29sbGlkZSB8fCB0aGlzLmNvbGxpZGUobm9kZSwgbm4pOyAvLyBSRUFMIGFyZWEgY29sbGlkZSBmb3Igc3dhcCBhbmQgc2tpcCBpZiBub25lLi4uXG4gICAgaWYgKCFjb2xsaWRlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBzd2FwIGNoZWNrOiBpZiB3ZSdyZSBhY3RpdmVseSBtb3ZpbmcgaW4gZ3Jhdml0eSBtb2RlLCBzZWUgaWYgd2UgY29sbGlkZSB3aXRoIGFuIG9iamVjdCB0aGUgc2FtZSBzaXplXG4gICAgaWYgKG5vZGUuX21vdmluZyAmJiAhb3B0Lm5lc3RlZCAmJiAhdGhpcy5mbG9hdCkge1xuICAgICAgaWYgKHRoaXMuc3dhcChub2RlLCBjb2xsaWRlKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZHVyaW5nIHdoaWxlKCkgY29sbGlzaW9ucyBNQUtFIFNVUkUgdG8gY2hlY2sgZW50aXJlIHJvdyBzbyBsYXJnZXIgaXRlbXMgZG9uJ3QgbGVhcCBmcm9nIHNtYWxsIG9uZXMgKHB1c2ggdGhlbSBhbGwgZG93biBzdGFydGluZyBsYXN0IGluIGdyaWQpXG4gICAgbGV0IGFyZWEgPSBubjtcbiAgICBpZiAodGhpcy5fdXNlRW50aXJlUm93QXJlYShub2RlLCBubikpIHtcbiAgICAgIGFyZWEgPSB7eDogMCwgdzogdGhpcy5jb2x1bW4sIHk6IG5uLnksIGg6IG5uLmh9O1xuICAgICAgY29sbGlkZSA9IHRoaXMuY29sbGlkZShub2RlLCBhcmVhLCBvcHQuc2tpcCk7IC8vIGZvcmNlIG5ldyBoaXRcbiAgICB9XG5cbiAgICBsZXQgZGlkTW92ZSA9IGZhbHNlO1xuICAgIGxldCBuZXdPcHQ6IEdyaWRTdGFja01vdmVPcHRzID0ge25lc3RlZDogdHJ1ZSwgcGFjazogZmFsc2V9O1xuICAgIHdoaWxlIChjb2xsaWRlID0gY29sbGlkZSB8fCB0aGlzLmNvbGxpZGUobm9kZSwgYXJlYSwgb3B0LnNraXApKSB7IC8vIGNvdWxkIGNvbGxpZGUgd2l0aCBtb3JlIHRoYW4gMSBpdGVtLi4uIHNvIHJlcGVhdCBmb3IgZWFjaFxuICAgICAgbGV0IG1vdmVkOiBib29sZWFuO1xuICAgICAgLy8gaWYgY29sbGlkaW5nIHdpdGggYSBsb2NrZWQgaXRlbSBPUiBtb3ZpbmcgZG93biB3aXRoIHRvcCBncmF2aXR5IChhbmQgY29sbGlkZSBjb3VsZCBtb3ZlIHVwKSAtPiBza2lwIHBhc3QgdGhlIGNvbGxpZGUsXG4gICAgICAvLyBidXQgcmVtZW1iZXIgdGhhdCBza2lwIGRvd24gc28gd2Ugb25seSBkbyB0aGlzIG9uY2UgKGFuZCBwdXNoIG90aGVycyBvdGhlcndpc2UpLlxuICAgICAgaWYgKGNvbGxpZGUubG9ja2VkIHx8IG5vZGUuX21vdmluZyAmJiAhbm9kZS5fc2tpcERvd24gJiYgbm4ueSA+IG5vZGUueSAmJiAhdGhpcy5mbG9hdCAmJlxuICAgICAgICAvLyBjYW4gdGFrZSBzcGFjZSB3ZSBoYWQsIG9yIGJlZm9yZSB3aGVyZSB3ZSdyZSBnb2luZ1xuICAgICAgICAoIXRoaXMuY29sbGlkZShjb2xsaWRlLCB7Li4uY29sbGlkZSwgeTogbm9kZS55fSwgbm9kZSkgfHwgIXRoaXMuY29sbGlkZShjb2xsaWRlLCB7Li4uY29sbGlkZSwgeTogbm4ueSAtIGNvbGxpZGUuaH0sIG5vZGUpKSkge1xuICAgICAgICBub2RlLl9za2lwRG93biA9IChub2RlLl9za2lwRG93biB8fCBubi55ID4gbm9kZS55KTtcbiAgICAgICAgbW92ZWQgPSB0aGlzLm1vdmVOb2RlKG5vZGUsIHsuLi5ubiwgeTogY29sbGlkZS55ICsgY29sbGlkZS5oLCAuLi5uZXdPcHR9KTtcbiAgICAgICAgaWYgKGNvbGxpZGUubG9ja2VkICYmIG1vdmVkKSB7XG4gICAgICAgICAgVXRpbHMuY29weVBvcyhubiwgbm9kZSk7IC8vIG1vdmluZyBhZnRlciBsb2NrIGJlY29tZSBvdXIgbmV3IGRlc2lyZWQgbG9jYXRpb25cbiAgICAgICAgfSBlbHNlIGlmICghY29sbGlkZS5sb2NrZWQgJiYgbW92ZWQgJiYgb3B0LnBhY2spIHtcbiAgICAgICAgICAvLyB3ZSBtb3ZlZCBhZnRlciBhbmQgd2lsbCBwYWNrOiBkbyBpdCBub3cgYW5kIGtlZXAgdGhlIG9yaWdpbmFsIGRyb3AgbG9jYXRpb24sIGJ1dCBwYXN0IHRoZSBvbGQgY29sbGlkZSB0byBzZWUgd2hhdCBlbHNlIHdlIG1pZ2h0IHB1c2ggd2F5XG4gICAgICAgICAgdGhpcy5fcGFja05vZGVzKCk7XG4gICAgICAgICAgbm4ueSA9IGNvbGxpZGUueSArIGNvbGxpZGUuaDtcbiAgICAgICAgICBVdGlscy5jb3B5UG9zKG5vZGUsIG5uKTtcbiAgICAgICAgfVxuICAgICAgICBkaWRNb3ZlID0gZGlkTW92ZSB8fCBtb3ZlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG1vdmUgY29sbGlkZSBkb3duICphZnRlciogd2hlcmUgd2Ugd2lsbCBiZSwgaWdub3Jpbmcgd2hlcmUgd2UgYXJlIG5vdyAoZG9uJ3QgY29sbGlkZSB3aXRoIHVzKVxuICAgICAgICBtb3ZlZCA9IHRoaXMubW92ZU5vZGUoY29sbGlkZSwgey4uLmNvbGxpZGUsIHk6IG5uLnkgKyBubi5oLCBza2lwOiBub2RlLCAuLi5uZXdPcHR9KTtcbiAgICAgIH1cbiAgICAgIGlmICghbW92ZWQpIHsgcmV0dXJuIGRpZE1vdmU7IH0gLy8gYnJlYWsgaW5mIGxvb3AgaWYgd2UgY291bGRuJ3QgbW92ZSBhZnRlciBhbGwgKGV4OiBtYXhSb3csIGZpeGVkKVxuICAgICAgY29sbGlkZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGRpZE1vdmU7XG4gIH1cblxuICAvKiogcmV0dXJuIHRoZSBub2RlcyB0aGF0IGludGVyY2VwdCB0aGUgZ2l2ZW4gbm9kZS4gT3B0aW9uYWxseSBhIGRpZmZlcmVudCBhcmVhIGNhbiBiZSB1c2VkLCBhcyB3ZWxsIGFzIGEgc2Vjb25kIG5vZGUgdG8gc2tpcCAqL1xuICBwdWJsaWMgY29sbGlkZShza2lwOiBHcmlkU3RhY2tOb2RlLCBhcmVhID0gc2tpcCwgc2tpcDI/OiBHcmlkU3RhY2tOb2RlKTogR3JpZFN0YWNrTm9kZSB7XG4gICAgY29uc3Qgc2tpcElkID0gc2tpcC5faWQ7XG4gICAgY29uc3Qgc2tpcDJJZCA9IHNraXAyPy5faWQ7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMuZmluZChuID0+IG4uX2lkICE9PSBza2lwSWQgJiYgbi5faWQgIT09IHNraXAySWQgJiYgVXRpbHMuaXNJbnRlcmNlcHRlZChuLCBhcmVhKSk7XG4gIH1cbiAgcHVibGljIGNvbGxpZGVBbGwoc2tpcDogR3JpZFN0YWNrTm9kZSwgYXJlYSA9IHNraXAsIHNraXAyPzogR3JpZFN0YWNrTm9kZSk6IEdyaWRTdGFja05vZGVbXSB7XG4gICAgY29uc3Qgc2tpcElkID0gc2tpcC5faWQ7XG4gICAgY29uc3Qgc2tpcDJJZCA9IHNraXAyPy5faWQ7XG4gICAgcmV0dXJuIHRoaXMubm9kZXMuZmlsdGVyKG4gPT4gbi5faWQgIT09IHNraXBJZCAmJiBuLl9pZCAhPT0gc2tpcDJJZCAmJiBVdGlscy5pc0ludGVyY2VwdGVkKG4sIGFyZWEpKTtcbiAgfVxuXG4gIC8qKiBkb2VzIGEgcGl4ZWwgY292ZXJhZ2UgY29sbGlzaW9uIGJhc2VkIG9uIHdoZXJlIHdlIHN0YXJ0ZWQsIHJldHVybmluZyB0aGUgbm9kZSB0aGF0IGhhcyB0aGUgbW9zdCBjb3ZlcmFnZSB0aGF0IGlzID41MCUgbWlkIGxpbmUgKi9cbiAgcHJvdGVjdGVkIGRpcmVjdGlvbkNvbGxpZGVDb3ZlcmFnZShub2RlOiBHcmlkU3RhY2tOb2RlLCBvOiBHcmlkU3RhY2tNb3ZlT3B0cywgY29sbGlkZXM6IEdyaWRTdGFja05vZGVbXSk6IEdyaWRTdGFja05vZGUge1xuICAgIGlmICghby5yZWN0IHx8ICFub2RlLl9yZWN0KSByZXR1cm47XG4gICAgbGV0IHIwID0gbm9kZS5fcmVjdDsgLy8gd2hlcmUgc3RhcnRlZFxuICAgIGxldCByID0gey4uLm8ucmVjdH07IC8vIHdoZXJlIHdlIGFyZVxuXG4gICAgLy8gdXBkYXRlIGRyYWdnZWQgcmVjdCB0byBzaG93IHdoZXJlIGl0J3MgY29taW5nIGZyb20gKGFib3ZlIG9yIGJlbG93LCBldGMuLi4pXG4gICAgaWYgKHIueSA+IHIwLnkpIHtcbiAgICAgIHIuaCArPSByLnkgLSByMC55O1xuICAgICAgci55ID0gcjAueTtcbiAgICB9IGVsc2Uge1xuICAgICAgci5oICs9IHIwLnkgLSByLnk7XG4gICAgfVxuICAgIGlmIChyLnggPiByMC54KSB7XG4gICAgICByLncgKz0gci54IC0gcjAueDtcbiAgICAgIHIueCA9IHIwLng7XG4gICAgfSBlbHNlIHtcbiAgICAgIHIudyArPSByMC54IC0gci54O1xuICAgIH1cblxuICAgIGxldCBjb2xsaWRlOiBHcmlkU3RhY2tOb2RlO1xuICAgIGNvbGxpZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICBpZiAobi5sb2NrZWQgfHwgIW4uX3JlY3QpIHJldHVybjtcbiAgICAgIGxldCByMiA9IG4uX3JlY3Q7IC8vIG92ZXJsYXBwaW5nIHRhcmdldFxuICAgICAgbGV0IHlPdmVyID0gTnVtYmVyLk1BWF9WQUxVRSwgeE92ZXIgPSBOdW1iZXIuTUFYX1ZBTFVFLCBvdmVyTWF4ID0gMC41OyAvLyBuZWVkID41MCVcbiAgICAgIC8vIGRlcGVuZGluZyBvbiB3aGljaCBzaWRlIHdlIHN0YXJ0ZWQgZnJvbSwgY29tcHV0ZSB0aGUgb3ZlcmxhcCAlIG9mIGNvdmVyYWdlXG4gICAgICAvLyAoZXg6IGZyb20gYWJvdmUvYmVsb3cgd2Ugb25seSBjb21wdXRlIHRoZSBtYXggaG9yaXpvbnRhbCBsaW5lIGNvdmVyYWdlKVxuICAgICAgaWYgKHIwLnkgPCByMi55KSB7IC8vIGZyb20gYWJvdmVcbiAgICAgICAgeU92ZXIgPSAoKHIueSArIHIuaCkgLSByMi55KSAvIHIyLmg7XG4gICAgICB9IGVsc2UgaWYgKHIwLnkrcjAuaCA+IHIyLnkrcjIuaCkgeyAvLyBmcm9tIGJlbG93XG4gICAgICAgIHlPdmVyID0gKChyMi55ICsgcjIuaCkgLSByLnkpIC8gcjIuaDtcbiAgICAgIH1cbiAgICAgIGlmIChyMC54IDwgcjIueCkgeyAvLyBmcm9tIHRoZSBsZWZ0XG4gICAgICAgIHhPdmVyID0gKChyLnggKyByLncpIC0gcjIueCkgLyByMi53O1xuICAgICAgfSBlbHNlIGlmIChyMC54K3IwLncgPiByMi54K3IyLncpIHsgLy8gZnJvbSB0aGUgcmlnaHRcbiAgICAgICAgeE92ZXIgPSAoKHIyLnggKyByMi53KSAtIHIueCkgLyByMi53O1xuICAgICAgfVxuICAgICAgbGV0IG92ZXIgPSBNYXRoLm1pbih4T3ZlciwgeU92ZXIpO1xuICAgICAgaWYgKG92ZXIgPiBvdmVyTWF4KSB7XG4gICAgICAgIG92ZXJNYXggPSBvdmVyO1xuICAgICAgICBjb2xsaWRlID0gbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvLmNvbGxpZGUgPSBjb2xsaWRlOyAvLyBzYXZlIGl0IHNvIHdlIGRvbid0IGhhdmUgdG8gZmluZCBpdCBhZ2FpblxuICAgIHJldHVybiBjb2xsaWRlO1xuICB9XG5cbiAgLyoqIGRvZXMgYSBwaXhlbCBjb3ZlcmFnZSByZXR1cm5pbmcgdGhlIG5vZGUgdGhhdCBoYXMgdGhlIG1vc3QgY292ZXJhZ2UgYnkgYXJlYSAqL1xuICAvKlxuICBwcm90ZWN0ZWQgY29sbGlkZUNvdmVyYWdlKHI6IEdyaWRTdGFja1Bvc2l0aW9uLCBjb2xsaWRlczogR3JpZFN0YWNrTm9kZVtdKToge2NvbGxpZGU6IEdyaWRTdGFja05vZGUsIG92ZXI6IG51bWJlcn0ge1xuICAgIGxldCBjb2xsaWRlOiBHcmlkU3RhY2tOb2RlO1xuICAgIGxldCBvdmVyTWF4ID0gMDtcbiAgICBjb2xsaWRlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgaWYgKG4ubG9ja2VkIHx8ICFuLl9yZWN0KSByZXR1cm47XG4gICAgICBsZXQgb3ZlciA9IFV0aWxzLmFyZWFJbnRlcmNlcHQociwgbi5fcmVjdCk7XG4gICAgICBpZiAob3ZlciA+IG92ZXJNYXgpIHtcbiAgICAgICAgb3Zlck1heCA9IG92ZXI7XG4gICAgICAgIGNvbGxpZGUgPSBuO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7Y29sbGlkZSwgb3Zlcjogb3Zlck1heH07XG4gIH1cbiAgKi9cblxuICAvKiogY2FsbGVkIHRvIGNhY2hlIHRoZSBub2RlcyBwaXhlbCByZWN0YW5nbGVzIHVzZWQgZm9yIGNvbGxpc2lvbiBkZXRlY3Rpb24gZHVyaW5nIGRyYWcgKi9cbiAgcHVibGljIGNhY2hlUmVjdHModzogbnVtYmVyLCBoOiBudW1iZXIsIHRvcDogbnVtYmVyLCByaWdodDogbnVtYmVyLCBib3R0b206IG51bWJlciwgbGVmdDogbnVtYmVyKTogR3JpZFN0YWNrRW5naW5lXG4gIHtcbiAgICB0aGlzLm5vZGVzLmZvckVhY2gobiA9PlxuICAgICAgbi5fcmVjdCA9IHtcbiAgICAgICAgeTogbi55ICogaCArIHRvcCxcbiAgICAgICAgeDogbi54ICogdyArIGxlZnQsXG4gICAgICAgIHc6IG4udyAqIHcgLSBsZWZ0IC0gcmlnaHQsXG4gICAgICAgIGg6IG4uaCAqIGggLSB0b3AgLSBib3R0b21cbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIGNhbGxlZCB0byBwb3NzaWJseSBzd2FwIGJldHdlZW4gMiBub2RlcyAoc2FtZSBzaXplIG9yIGNvbHVtbiwgbm90IGxvY2tlZCwgdG91Y2hpbmcpLCByZXR1cm5pbmcgdHJ1ZSBpZiBzdWNjZXNzZnVsICovXG4gIHB1YmxpYyBzd2FwKGE6IEdyaWRTdGFja05vZGUsIGI6IEdyaWRTdGFja05vZGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWIgfHwgYi5sb2NrZWQgfHwgIWEgfHwgYS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIF9kb1N3YXAoKTogdHJ1ZSB7IC8vIGFzc3VtZXMgYSBpcyBiZWZvcmUgYiBJRkYgdGhleSBoYXZlIGRpZmZlcmVudCBoZWlnaHQgKHB1dCBhZnRlciByYXRoZXIgdGhhbiBleGFjdCBzd2FwKVxuICAgICAgbGV0IHggPSBiLngsIHkgPSBiLnk7XG4gICAgICBiLnggPSBhLng7IGIueSA9IGEueTsgLy8gYiAtPiBhIHBvc2l0aW9uXG4gICAgICBpZiAoYS5oICE9IGIuaCkge1xuICAgICAgICBhLnggPSB4OyBhLnkgPSBiLnkgKyBiLmg7IC8vIGEgLT4gZ29lcyBhZnRlciBiXG4gICAgICB9IGVsc2UgaWYgKGEudyAhPSBiLncpIHtcbiAgICAgICAgYS54ID0gYi54ICsgYi53OyBhLnkgPSB5OyAvLyBhIC0+IGdvZXMgYWZ0ZXIgYlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYS54ID0geDsgYS55ID0geTsgLy8gYSAtPiBvbGQgYiBwb3NpdGlvblxuICAgICAgfVxuICAgICAgYS5fZGlydHkgPSBiLl9kaXJ0eSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IHRvdWNoaW5nOiBib29sZWFuOyAvLyByZW1lbWJlciBpZiB3ZSBjYWxsZWQgaXQgKHZzIHVuZGVmaW5lZClcblxuICAgIC8vIHNhbWUgc2l6ZSBhbmQgc2FtZSByb3cgb3IgY29sdW1uLCBhbmQgdG91Y2hpbmdcbiAgICBpZiAoYS53ID09PSBiLncgJiYgYS5oID09PSBiLmggJiYgKGEueCA9PT0gYi54IHx8IGEueSA9PT0gYi55KSAmJiAodG91Y2hpbmcgPSBVdGlscy5pc1RvdWNoaW5nKGEsIGIpKSlcbiAgICAgIHJldHVybiBfZG9Td2FwKCk7XG4gICAgaWYgKHRvdWNoaW5nID09PSBmYWxzZSkgcmV0dXJuOyAvLyBJRkYgcmFuIHRlc3QgYW5kIGZhaWwsIGJhaWwgb3V0XG5cbiAgICAvLyBjaGVjayBmb3IgdGFraW5nIHNhbWUgY29sdW1ucyAoYnV0IGRpZmZlcmVudCBoZWlnaHQpIGFuZCB0b3VjaGluZ1xuICAgIGlmIChhLncgPT09IGIudyAmJiBhLnggPT09IGIueCAmJiAodG91Y2hpbmcgfHwgKHRvdWNoaW5nID0gVXRpbHMuaXNUb3VjaGluZyhhLCBiKSkpKSB7XG4gICAgICBpZiAoYi55IDwgYS55KSB7IGxldCB0ID0gYTsgYSA9IGI7IGIgPSB0OyB9IC8vIHN3YXAgYSA8LT4gYiB2YXJzIHNvIGEgaXMgZmlyc3RcbiAgICAgIHJldHVybiBfZG9Td2FwKCk7XG4gICAgfVxuICAgIGlmICh0b3VjaGluZyA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgIC8vIGNoZWNrIGlmIHRha2luZyBzYW1lIHJvdyAoYnV0IGRpZmZlcmVudCB3aWR0aCkgYW5kIHRvdWNoaW5nXG4gICAgaWYgKGEuaCA9PT0gYi5oICYmIGEueSA9PT0gYi55ICYmICh0b3VjaGluZyB8fCAodG91Y2hpbmcgPSBVdGlscy5pc1RvdWNoaW5nKGEsIGIpKSkpIHtcbiAgICAgIGlmIChiLnggPCBhLngpIHsgbGV0IHQgPSBhOyBhID0gYjsgYiA9IHQ7IH0gLy8gc3dhcCBhIDwtPiBiIHZhcnMgc28gYSBpcyBmaXJzdFxuICAgICAgcmV0dXJuIF9kb1N3YXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzQXJlYUVtcHR5KHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGxldCBubjogR3JpZFN0YWNrTm9kZSA9IHt4OiB4IHx8IDAsIHk6IHkgfHwgMCwgdzogdyB8fCAxLCBoOiBoIHx8IDF9O1xuICAgIHJldHVybiAhdGhpcy5jb2xsaWRlKG5uKTtcbiAgfVxuXG4gIC8qKiByZS1sYXlvdXQgZ3JpZCBpdGVtcyB0byByZWNsYWltIGFueSBlbXB0eSBzcGFjZSAqL1xuICBwdWJsaWMgY29tcGFjdCgpOiBHcmlkU3RhY2tFbmdpbmUge1xuICAgIGlmICh0aGlzLm5vZGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgdGhpcy5iYXRjaFVwZGF0ZSgpXG4gICAgICAuc29ydE5vZGVzKCk7XG4gICAgbGV0IGNvcHlOb2RlcyA9IHRoaXMubm9kZXM7XG4gICAgdGhpcy5ub2RlcyA9IFtdOyAvLyBwcmV0ZW5kIHdlIGhhdmUgbm8gbm9kZXMgdG8gY29uZmxpY3QgbGF5b3V0IHRvIHN0YXJ0IHdpdGguLi5cbiAgICBjb3B5Tm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIGlmICghbm9kZS5sb2NrZWQpIHtcbiAgICAgICAgbm9kZS5hdXRvUG9zaXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGROb2RlKG5vZGUsIGZhbHNlKTsgLy8gJ2ZhbHNlJyBmb3IgYWRkIGV2ZW50IHRyaWdnZXJcbiAgICAgIG5vZGUuX2RpcnR5ID0gdHJ1ZTsgLy8gd2lsbCBmb3JjZSBhdHRyIHVwZGF0ZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmJhdGNoVXBkYXRlKGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBlbmFibGUvZGlzYWJsZSBmbG9hdGluZyB3aWRnZXRzIChkZWZhdWx0OiBgZmFsc2VgKSBTZWUgW2V4YW1wbGVdKGh0dHA6Ly9ncmlkc3RhY2tqcy5jb20vZGVtby9mbG9hdC5odG1sKSAqL1xuICBwdWJsaWMgc2V0IGZsb2F0KHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9mbG9hdCA9PT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5fZmxvYXQgPSB2YWwgfHwgZmFsc2U7XG4gICAgaWYgKCF2YWwpIHtcbiAgICAgIHRoaXMuX3BhY2tOb2RlcygpLl9ub3RpZnkoKTtcbiAgICB9XG4gIH1cblxuICAvKiogZmxvYXQgZ2V0dGVyIG1ldGhvZCAqL1xuICBwdWJsaWMgZ2V0IGZsb2F0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fZmxvYXQgfHwgZmFsc2U7IH1cblxuICAvKiogc29ydCB0aGUgbm9kZXMgYXJyYXkgZnJvbSBmaXJzdCB0byBsYXN0LCBvciByZXZlcnNlLiBDYWxsZWQgZHVyaW5nIGNvbGxpc2lvbi9wbGFjZW1lbnQgdG8gZm9yY2UgYW4gb3JkZXIgKi9cbiAgcHVibGljIHNvcnROb2RlcyhkaXI/OiAtMSB8IDEpOiBHcmlkU3RhY2tFbmdpbmUge1xuICAgIHRoaXMubm9kZXMgPSBVdGlscy5zb3J0KHRoaXMubm9kZXMsIGRpciwgdGhpcy5jb2x1bW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBjYWxsZWQgdG8gdG9wIGdyYXZpdHkgcGFjayB0aGUgaXRlbXMgYmFjayBPUiByZXZlcnQgYmFjayB0byBvcmlnaW5hbCBZIHBvc2l0aW9ucyB3aGVuIGZsb2F0aW5nICovXG4gIHByb3RlY3RlZCBfcGFja05vZGVzKCk6IEdyaWRTdGFja0VuZ2luZSB7XG4gICAgaWYgKHRoaXMuYmF0Y2hNb2RlKSB7IHJldHVybiB0aGlzOyB9XG4gICAgdGhpcy5zb3J0Tm9kZXMoKTsgLy8gZmlyc3QgdG8gbGFzdFxuXG4gICAgaWYgKHRoaXMuZmxvYXQpIHtcbiAgICAgIC8vIHJlc3RvcmUgb3JpZ2luYWwgWSBwb3NcbiAgICAgIHRoaXMubm9kZXMuZm9yRWFjaChuID0+IHtcbiAgICAgICAgaWYgKG4uX3VwZGF0aW5nIHx8IG4uX29yaWcgPT09IHVuZGVmaW5lZCB8fCBuLnkgPT09IG4uX29yaWcueSkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3WSA9IG4ueTtcbiAgICAgICAgd2hpbGUgKG5ld1kgPiBuLl9vcmlnLnkpIHtcbiAgICAgICAgICAtLW5ld1k7XG4gICAgICAgICAgbGV0IGNvbGxpZGUgPSB0aGlzLmNvbGxpZGUobiwge3g6IG4ueCwgeTogbmV3WSwgdzogbi53LCBoOiBuLmh9KTtcbiAgICAgICAgICBpZiAoIWNvbGxpZGUpIHtcbiAgICAgICAgICAgIG4uX2RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIG4ueSA9IG5ld1k7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdG9wIGdyYXZpdHkgcGFja1xuICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKChuLCBpKSA9PiB7XG4gICAgICAgIGlmIChuLmxvY2tlZCkgcmV0dXJuO1xuICAgICAgICB3aGlsZSAobi55ID4gMCkge1xuICAgICAgICAgIGxldCBuZXdZID0gaSA9PT0gMCA/IDAgOiBuLnkgLSAxO1xuICAgICAgICAgIGxldCBjYW5CZU1vdmVkID0gaSA9PT0gMCB8fCAhdGhpcy5jb2xsaWRlKG4sIHt4OiBuLngsIHk6IG5ld1ksIHc6IG4udywgaDogbi5ofSk7XG4gICAgICAgICAgaWYgKCFjYW5CZU1vdmVkKSBicmVhaztcbiAgICAgICAgICAvLyBOb3RlOiBtdXN0IGJlIGRpcnR5IChmcm9tIGxhc3QgcG9zaXRpb24pIGZvciBHcmlkU3RhY2s6Ok9uQ2hhbmdlIENCIHRvIHVwZGF0ZSBwb3NpdGlvbnNcbiAgICAgICAgICAvLyBhbmQgbW92ZSBpdGVtcyBiYWNrLiBUaGUgdXNlciAnY2hhbmdlJyBDQiBzaG91bGQgZGV0ZWN0IGNoYW5nZXMgZnJvbSB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAvLyBzdGFydGluZyBwb3NpdGlvbiBpbnN0ZWFkLlxuICAgICAgICAgIG4uX2RpcnR5ID0gKG4ueSAhPT0gbmV3WSk7XG4gICAgICAgICAgbi55ID0gbmV3WTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGdpdmVuIGEgcmFuZG9tIG5vZGUsIG1ha2VzIHN1cmUgaXQncyBjb29yZGluYXRlcy92YWx1ZXMgYXJlIHZhbGlkIGluIHRoZSBjdXJyZW50IGdyaWRcbiAgICogQHBhcmFtIG5vZGUgdG8gYWRqdXN0XG4gICAqIEBwYXJhbSByZXNpemluZyBpZiBvdXQgb2YgYm91bmQsIHJlc2l6ZSBkb3duIG9yIG1vdmUgaW50byB0aGUgZ3JpZCB0byBmaXQgP1xuICAgKi9cbiAgcHVibGljIHByZXBhcmVOb2RlKG5vZGU6IEdyaWRTdGFja05vZGUsIHJlc2l6aW5nPzogYm9vbGVhbik6IEdyaWRTdGFja05vZGUge1xuICAgIG5vZGUgPSBub2RlIHx8IHt9O1xuICAgIG5vZGUuX2lkID0gbm9kZS5faWQgPz8gR3JpZFN0YWNrRW5naW5lLl9pZFNlcSsrO1xuXG4gICAgLy8gaWYgd2UncmUgbWlzc2luZyBwb3NpdGlvbiwgaGF2ZSB0aGUgZ3JpZCBwb3NpdGlvbiB1cyBhdXRvbWF0aWNhbGx5IChiZWZvcmUgd2Ugc2V0IHRoZW0gdG8gMCwwKVxuICAgIGlmIChub2RlLnggPT09IHVuZGVmaW5lZCB8fCBub2RlLnkgPT09IHVuZGVmaW5lZCB8fCBub2RlLnggPT09IG51bGwgfHwgbm9kZS55ID09PSBudWxsKSB7XG4gICAgICBub2RlLmF1dG9Qb3NpdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gYXNzaWduIGRlZmF1bHRzIGZvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkc1xuICAgIGxldCBkZWZhdWx0czogR3JpZFN0YWNrTm9kZSA9IHsgeDogMCwgeTogMCwgdzogMSwgaDogMX07XG4gICAgVXRpbHMuZGVmYXVsdHMobm9kZSwgZGVmYXVsdHMpO1xuXG4gICAgaWYgKCFub2RlLmF1dG9Qb3NpdGlvbikgeyBkZWxldGUgbm9kZS5hdXRvUG9zaXRpb247IH1cbiAgICBpZiAoIW5vZGUubm9SZXNpemUpIHsgZGVsZXRlIG5vZGUubm9SZXNpemU7IH1cbiAgICBpZiAoIW5vZGUubm9Nb3ZlKSB7IGRlbGV0ZSBub2RlLm5vTW92ZTsgfVxuICAgIFV0aWxzLnNhbml0aXplTWluTWF4KG5vZGUpO1xuXG4gICAgLy8gY2hlY2sgZm9yIE5hTiAoaW4gY2FzZSBtZXNzZWQgdXAgc3RyaW5ncyB3ZXJlIHBhc3NlZC4gY2FuJ3QgZG8gcGFyc2VJbnQoKSB8fCBkZWZhdWx0cy54IGFib3ZlIGFzIDAgaXMgdmFsaWQgIylcbiAgICBpZiAodHlwZW9mIG5vZGUueCA9PSAnc3RyaW5nJykgeyBub2RlLnggPSBOdW1iZXIobm9kZS54KTsgfVxuICAgIGlmICh0eXBlb2Ygbm9kZS55ID09ICdzdHJpbmcnKSB7IG5vZGUueSA9IE51bWJlcihub2RlLnkpOyB9XG4gICAgaWYgKHR5cGVvZiBub2RlLncgPT0gJ3N0cmluZycpIHsgbm9kZS53ID0gTnVtYmVyKG5vZGUudyk7IH1cbiAgICBpZiAodHlwZW9mIG5vZGUuaCA9PSAnc3RyaW5nJykgeyBub2RlLmggPSBOdW1iZXIobm9kZS5oKTsgfVxuICAgIGlmIChpc05hTihub2RlLngpKSB7IG5vZGUueCA9IGRlZmF1bHRzLng7IG5vZGUuYXV0b1Bvc2l0aW9uID0gdHJ1ZTsgfVxuICAgIGlmIChpc05hTihub2RlLnkpKSB7IG5vZGUueSA9IGRlZmF1bHRzLnk7IG5vZGUuYXV0b1Bvc2l0aW9uID0gdHJ1ZTsgfVxuICAgIGlmIChpc05hTihub2RlLncpKSB7IG5vZGUudyA9IGRlZmF1bHRzLnc7IH1cbiAgICBpZiAoaXNOYU4obm9kZS5oKSkgeyBub2RlLmggPSBkZWZhdWx0cy5oOyB9XG5cbiAgICByZXR1cm4gdGhpcy5ub2RlQm91bmRGaXgobm9kZSwgcmVzaXppbmcpO1xuICB9XG5cbiAgLyoqIHBhcnQyIG9mIHByZXBhcmluZyBhIG5vZGUgdG8gZml0IGluc2lkZSBvdXIgZ3JpZCAtIGNoZWNrcyBmb3IgeCx5LHcgZnJvbSBncmlkIGRpbWVuc2lvbnMgKi9cbiAgcHVibGljIG5vZGVCb3VuZEZpeChub2RlOiBHcmlkU3RhY2tOb2RlLCByZXNpemluZz86IGJvb2xlYW4pOiBHcmlkU3RhY2tOb2RlIHtcblxuICAgIGxldCBiZWZvcmUgPSBub2RlLl9vcmlnIHx8IFV0aWxzLmNvcHlQb3Moe30sIG5vZGUpO1xuXG4gICAgaWYgKG5vZGUubWF4VykgeyBub2RlLncgPSBNYXRoLm1pbihub2RlLncsIG5vZGUubWF4Vyk7IH1cbiAgICBpZiAobm9kZS5tYXhIKSB7IG5vZGUuaCA9IE1hdGgubWluKG5vZGUuaCwgbm9kZS5tYXhIKTsgfVxuICAgIGlmIChub2RlLm1pblcgJiYgbm9kZS5taW5XIDw9IHRoaXMuY29sdW1uKSB7IG5vZGUudyA9IE1hdGgubWF4KG5vZGUudywgbm9kZS5taW5XKTsgfVxuICAgIGlmIChub2RlLm1pbkgpIHsgbm9kZS5oID0gTWF0aC5tYXgobm9kZS5oLCBub2RlLm1pbkgpOyB9XG5cbiAgICAvLyBpZiB1c2VyIGxvYWRlZCBhIGxhcmdlciB0aGFuIGFsbG93ZWQgd2lkZ2V0IGZvciBjdXJyZW50ICMgb2YgY29sdW1ucyAob3IgZm9yY2UgMSBjb2x1bW4gbW9kZSksXG4gICAgLy8gcmVtZW1iZXIgaXQncyBwb3NpdGlvbiAmIHdpZHRoIHNvIHdlIGNhbiByZXN0b3JlIGJhY2sgKDEgLT4gMTIgY29sdW1uKSAjMTY1NSAjMTk4NVxuICAgIC8vIElGRiB3ZSdyZSBub3QgaW4gdGhlIG1pZGRsZSBvZiBjb2x1bW4gcmVzaXppbmchXG4gICAgY29uc3Qgc2F2ZU9yaWcgPSB0aGlzLmNvbHVtbiA9PT0gMSB8fCBub2RlLnggKyBub2RlLncgPiB0aGlzLmNvbHVtbjtcbiAgICBpZiAoc2F2ZU9yaWcgJiYgdGhpcy5jb2x1bW4gPCAxMiAmJiAhdGhpcy5faW5Db2x1bW5SZXNpemUgJiYgbm9kZS5faWQgJiYgdGhpcy5maW5kQ2FjaGVMYXlvdXQobm9kZSwgMTIpID09PSAtMSkge1xuICAgICAgbGV0IGNvcHkgPSB7Li4ubm9kZX07IC8vIG5lZWQgX2lkICsgcG9zaXRpb25zXG4gICAgICBpZiAoY29weS5hdXRvUG9zaXRpb24pIHsgZGVsZXRlIGNvcHkueDsgZGVsZXRlIGNvcHkueTsgfVxuICAgICAgZWxzZSBjb3B5LnggPSBNYXRoLm1pbigxMSwgY29weS54KTtcbiAgICAgIGNvcHkudyA9IE1hdGgubWluKDEyLCBjb3B5LncpO1xuICAgICAgdGhpcy5jYWNoZU9uZUxheW91dChjb3B5LCAxMik7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudyA+IHRoaXMuY29sdW1uKSB7XG4gICAgICBub2RlLncgPSB0aGlzLmNvbHVtbjtcbiAgICB9IGVsc2UgaWYgKG5vZGUudyA8IDEpIHtcbiAgICAgIG5vZGUudyA9IDE7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF4Um93ICYmIG5vZGUuaCA+IHRoaXMubWF4Um93KSB7XG4gICAgICBub2RlLmggPSB0aGlzLm1heFJvdztcbiAgICB9IGVsc2UgaWYgKG5vZGUuaCA8IDEpIHtcbiAgICAgIG5vZGUuaCA9IDE7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUueCA8IDApIHtcbiAgICAgIG5vZGUueCA9IDA7XG4gICAgfVxuICAgIGlmIChub2RlLnkgPCAwKSB7XG4gICAgICBub2RlLnkgPSAwO1xuICAgIH1cblxuICAgIGlmIChub2RlLnggKyBub2RlLncgPiB0aGlzLmNvbHVtbikge1xuICAgICAgaWYgKHJlc2l6aW5nKSB7XG4gICAgICAgIG5vZGUudyA9IHRoaXMuY29sdW1uIC0gbm9kZS54O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS54ID0gdGhpcy5jb2x1bW4gLSBub2RlLnc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1heFJvdyAmJiBub2RlLnkgKyBub2RlLmggPiB0aGlzLm1heFJvdykge1xuICAgICAgaWYgKHJlc2l6aW5nKSB7XG4gICAgICAgIG5vZGUuaCA9IHRoaXMubWF4Um93IC0gbm9kZS55O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS55ID0gdGhpcy5tYXhSb3cgLSBub2RlLmg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFVdGlscy5zYW1lUG9zKG5vZGUsIGJlZm9yZSkpIHtcbiAgICAgIG5vZGUuX2RpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIC8qKiByZXR1cm5zIGEgbGlzdCBvZiBtb2RpZmllZCBub2RlcyBmcm9tIHRoZWlyIG9yaWdpbmFsIHZhbHVlcyAqL1xuICBwdWJsaWMgZ2V0RGlydHlOb2Rlcyh2ZXJpZnk/OiBib29sZWFuKTogR3JpZFN0YWNrTm9kZVtdIHtcbiAgICAvLyBjb21wYXJlIG9yaWdpbmFsIHgseSx3LGggaW5zdGVhZCBhcyBfZGlydHkgY2FuIGJlIGEgdGVtcG9yYXJ5IHN0YXRlXG4gICAgaWYgKHZlcmlmeSkge1xuICAgICAgcmV0dXJuIHRoaXMubm9kZXMuZmlsdGVyKG4gPT4gbi5fZGlydHkgJiYgIVV0aWxzLnNhbWVQb3Mobiwgbi5fb3JpZykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5maWx0ZXIobiA9PiBuLl9kaXJ0eSk7XG4gIH1cblxuICAvKiogQGludGVybmFsIGNhbGwgdGhpcyB0byBjYWxsIG9uQ2hhbmdlIGNhbGxiYWNrIHdpdGggZGlydHkgbm9kZXMgc28gRE9NIGNhbiBiZSB1cGRhdGVkICovXG4gIHByb3RlY3RlZCBfbm90aWZ5KHJlbW92ZWROb2Rlcz86IEdyaWRTdGFja05vZGVbXSk6IEdyaWRTdGFja0VuZ2luZSB7XG4gICAgaWYgKHRoaXMuYmF0Y2hNb2RlIHx8ICF0aGlzLm9uQ2hhbmdlKSByZXR1cm4gdGhpcztcbiAgICBsZXQgZGlydHlOb2RlcyA9IChyZW1vdmVkTm9kZXMgfHwgW10pLmNvbmNhdCh0aGlzLmdldERpcnR5Tm9kZXMoKSk7XG4gICAgdGhpcy5vbkNoYW5nZShkaXJ0eU5vZGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgcmVtb3ZlIGRpcnR5IGFuZCBsYXN0IHRyaWVkIGluZm8gKi9cbiAgcHVibGljIGNsZWFuTm9kZXMoKTogR3JpZFN0YWNrRW5naW5lIHtcbiAgICBpZiAodGhpcy5iYXRjaE1vZGUpIHJldHVybiB0aGlzO1xuICAgIHRoaXMubm9kZXMuZm9yRWFjaChuID0+IHtcbiAgICAgIGRlbGV0ZSBuLl9kaXJ0eTtcbiAgICAgIGRlbGV0ZSBuLl9sYXN0VHJpZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGludGVybmFsIGNhbGxlZCB0byBzYXZlIGluaXRpYWwgcG9zaXRpb24vc2l6ZSB0byB0cmFjayByZWFsIGRpcnR5IHN0YXRlLlxuICAgKiBOb3RlOiBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIHdlIGNhbGwgY2hhbmdlIGV2ZW50IChzbyBuZXh0IEFQSSBpcyBjYW4gZGV0ZWN0IGNoYW5nZXMpXG4gICAqIGFzIHdlbGwgYXMgcmlnaHQgYmVmb3JlIHdlIHN0YXJ0IG1vdmUvcmVzaXplL2VudGVyIChzbyB3ZSBjYW4gcmVzdG9yZSBpdGVtcyB0byBwcmV2IHZhbHVlcykgKi9cbiAgcHVibGljIHNhdmVJbml0aWFsKCk6IEdyaWRTdGFja0VuZ2luZSB7XG4gICAgdGhpcy5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgbi5fb3JpZyA9IFV0aWxzLmNvcHlQb3Moe30sIG4pO1xuICAgICAgZGVsZXRlIG4uX2RpcnR5O1xuICAgIH0pO1xuICAgIHRoaXMuX2hhc0xvY2tlZCA9IHRoaXMubm9kZXMuc29tZShuID0+IG4ubG9ja2VkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgcmVzdG9yZSBhbGwgdGhlIG5vZGVzIGJhY2sgdG8gaW5pdGlhbCB2YWx1ZXMgKGNhbGxlZCB3aGVuIHdlIGxlYXZlKSAqL1xuICBwdWJsaWMgcmVzdG9yZUluaXRpYWwoKTogR3JpZFN0YWNrRW5naW5lIHtcbiAgICB0aGlzLm5vZGVzLmZvckVhY2gobiA9PiB7XG4gICAgICBpZiAoVXRpbHMuc2FtZVBvcyhuLCBuLl9vcmlnKSkgcmV0dXJuO1xuICAgICAgVXRpbHMuY29weVBvcyhuLCBuLl9vcmlnKTtcbiAgICAgIG4uX2RpcnR5ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLl9ub3RpZnkoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBmaW5kIHRoZSBmaXJzdCBhdmFpbGFibGUgZW1wdHkgc3BvdCBmb3IgdGhlIGdpdmVuIG5vZGUgd2lkdGgvaGVpZ2h0LCB1cGRhdGluZyB0aGUgeCx5IGF0dHJpYnV0ZXMuIHJldHVybiB0cnVlIGlmIGZvdW5kLlxuICAgKiBvcHRpb25hbGx5IHlvdSBjYW4gcGFzcyB5b3VyIG93biBleGlzdGluZyBub2RlIGxpc3QgYW5kIGNvbHVtbiBjb3VudCwgb3RoZXJ3aXNlIGRlZmF1bHRzIHRvIHRoYXQgZW5naW5lIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgZmluZEVtcHR5UG9zaXRpb24obm9kZTogR3JpZFN0YWNrTm9kZSwgbm9kZUxpc3QgPSB0aGlzLm5vZGVzLCBjb2x1bW4gPSB0aGlzLmNvbHVtbik6IGJvb2xlYW4ge1xuICAgIG5vZGVMaXN0ID0gVXRpbHMuc29ydChub2RlTGlzdCwgLTEsIGNvbHVtbik7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7ICFmb3VuZDsgKytpKSB7XG4gICAgICBsZXQgeCA9IGkgJSBjb2x1bW47XG4gICAgICBsZXQgeSA9IE1hdGguZmxvb3IoaSAvIGNvbHVtbik7XG4gICAgICBpZiAoeCArIG5vZGUudyA+IGNvbHVtbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBib3ggPSB7eCwgeSwgdzogbm9kZS53LCBoOiBub2RlLmh9O1xuICAgICAgaWYgKCFub2RlTGlzdC5maW5kKG4gPT4gVXRpbHMuaXNJbnRlcmNlcHRlZChib3gsIG4pKSkge1xuICAgICAgICBub2RlLnggPSB4O1xuICAgICAgICBub2RlLnkgPSB5O1xuICAgICAgICBkZWxldGUgbm9kZS5hdXRvUG9zaXRpb247XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgLyoqIGNhbGwgdG8gYWRkIHRoZSBnaXZlbiBub2RlIHRvIG91ciBsaXN0LCBmaXhpbmcgY29sbGlzaW9uIGFuZCByZS1wYWNraW5nICovXG4gIHB1YmxpYyBhZGROb2RlKG5vZGU6IEdyaWRTdGFja05vZGUsIHRyaWdnZXJBZGRFdmVudCA9IGZhbHNlKTogR3JpZFN0YWNrTm9kZSB7XG4gICAgbGV0IGR1cCA9IHRoaXMubm9kZXMuZmluZChuID0+IG4uX2lkID09PSBub2RlLl9pZCk7XG4gICAgaWYgKGR1cCkgcmV0dXJuIGR1cDsgLy8gcHJldmVudCBpbnNlcnRpbmcgdHdpY2UhIHJldHVybiBpdCBpbnN0ZWFkLlxuXG4gICAgLy8gc2tpcCBwcmVwYXJlTm9kZSBpZiB3ZSdyZSBpbiBtaWRkbGUgb2YgY29sdW1uIHJlc2l6ZSAobm90IG5ldykgYnV0IGRvIGNoZWNrIGZvciBib3VuZHMhXG4gICAgbm9kZSA9IHRoaXMuX2luQ29sdW1uUmVzaXplID8gdGhpcy5ub2RlQm91bmRGaXgobm9kZSkgOiB0aGlzLnByZXBhcmVOb2RlKG5vZGUpO1xuICAgIGRlbGV0ZSBub2RlLl90ZW1wb3JhcnlSZW1vdmVkO1xuICAgIGRlbGV0ZSBub2RlLl9yZW1vdmVET007XG5cbiAgICBpZiAobm9kZS5hdXRvUG9zaXRpb24gJiYgdGhpcy5maW5kRW1wdHlQb3NpdGlvbihub2RlKSkge1xuICAgICAgZGVsZXRlIG5vZGUuYXV0b1Bvc2l0aW9uOyAvLyBmb3VuZCBvdXIgc2xvdFxuICAgIH1cblxuICAgIHRoaXMubm9kZXMucHVzaChub2RlKTtcbiAgICBpZiAodHJpZ2dlckFkZEV2ZW50KSB7IHRoaXMuYWRkZWROb2Rlcy5wdXNoKG5vZGUpOyB9XG5cbiAgICB0aGlzLl9maXhDb2xsaXNpb25zKG5vZGUpO1xuICAgIGlmICghdGhpcy5iYXRjaE1vZGUpIHsgdGhpcy5fcGFja05vZGVzKCkuX25vdGlmeSgpOyB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTm9kZShub2RlOiBHcmlkU3RhY2tOb2RlLCByZW1vdmVET00gPSB0cnVlLCB0cmlnZ2VyRXZlbnQgPSBmYWxzZSk6IEdyaWRTdGFja0VuZ2luZSB7XG4gICAgaWYgKCF0aGlzLm5vZGVzLmZpbmQobiA9PiBuLl9pZCA9PT0gbm9kZS5faWQpKSB7XG4gICAgICAvLyBURVNUIGNvbnNvbGUubG9nKGBFcnJvcjogR3JpZFN0YWNrRW5naW5lLnJlbW92ZU5vZGUoKSBub2RlLl9pZD0ke25vZGUuX2lkfSBub3QgZm91bmQhYClcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAodHJpZ2dlckV2ZW50KSB7IC8vIHdlIHdhaXQgdW50aWwgZmluYWwgZHJvcCB0byBtYW51YWxseSB0cmFjayByZW1vdmVkIGl0ZW1zIChyYXRoZXIgdGhhbiBkdXJpbmcgZHJhZylcbiAgICAgIHRoaXMucmVtb3ZlZE5vZGVzLnB1c2gobm9kZSk7XG4gICAgfVxuICAgIGlmIChyZW1vdmVET00pIG5vZGUuX3JlbW92ZURPTSA9IHRydWU7IC8vIGxldCBDQiByZW1vdmUgYWN0dWFsIEhUTUwgKHVzZWQgdG8gc2V0IF9pZCB0byBudWxsLCBidXQgdGhlbiB3ZSBsb29zZSBsYXlvdXQgaW5mbylcbiAgICAvLyBkb24ndCB1c2UgJ2Zhc3RlcicgLnNwbGljZShmaW5kSW5kZXgoKSwxKSBpbiBjYXNlIG5vZGUgaXNuJ3QgaW4gb3VyIGxpc3QsIG9yIGluIG11bHRpcGxlIHRpbWVzLlxuICAgIHRoaXMubm9kZXMgPSB0aGlzLm5vZGVzLmZpbHRlcihuID0+IG4uX2lkICE9PSBub2RlLl9pZCk7XG4gICAgcmV0dXJuIHRoaXMuX3BhY2tOb2RlcygpXG4gICAgICAuX25vdGlmeShbbm9kZV0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbChyZW1vdmVET00gPSB0cnVlKTogR3JpZFN0YWNrRW5naW5lIHtcbiAgICBkZWxldGUgdGhpcy5fbGF5b3V0cztcbiAgICBpZiAoIXRoaXMubm9kZXMubGVuZ3RoKSByZXR1cm4gdGhpcztcbiAgICByZW1vdmVET00gJiYgdGhpcy5ub2Rlcy5mb3JFYWNoKG4gPT4gbi5fcmVtb3ZlRE9NID0gdHJ1ZSk7IC8vIGxldCBDQiByZW1vdmUgYWN0dWFsIEhUTUwgKHVzZWQgdG8gc2V0IF9pZCB0byBudWxsLCBidXQgdGhlbiB3ZSBsb29zZSBsYXlvdXQgaW5mbylcbiAgICB0aGlzLnJlbW92ZWROb2RlcyA9IHRoaXMubm9kZXM7XG4gICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgIHJldHVybiB0aGlzLl9ub3RpZnkodGhpcy5yZW1vdmVkTm9kZXMpO1xuICB9XG5cbiAgLyoqIGNoZWNrcyBpZiBpdGVtIGNhbiBiZSBtb3ZlZCAobGF5b3V0IGNvbnN0cmFpbikgdnMgbW92ZU5vZGUoKSwgcmV0dXJuaW5nIHRydWUgaWYgd2FzIGFibGUgdG8gbW92ZS5cbiAgICogSW4gbW9yZSBjb21wbGljYXRlZCBjYXNlcyAobWF4Um93KSBpdCB3aWxsIGF0dGVtcHQgYXQgbW92aW5nIHRoZSBpdGVtIGFuZCBmaXhpbmdcbiAgICogb3RoZXJzIGluIGEgY2xvbmUgZmlyc3QsIHRoZW4gYXBwbHkgdGhvc2UgY2hhbmdlcyBpZiBzdGlsbCB3aXRoaW4gc3BlY3MuICovXG4gIHB1YmxpYyBtb3ZlTm9kZUNoZWNrKG5vZGU6IEdyaWRTdGFja05vZGUsIG86IEdyaWRTdGFja01vdmVPcHRzKTogYm9vbGVhbiB7XG4gICAgLy8gaWYgKG5vZGUubG9ja2VkKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmNoYW5nZWRQb3NDb25zdHJhaW4obm9kZSwgbykpIHJldHVybiBmYWxzZTtcbiAgICBvLnBhY2sgPSB0cnVlO1xuXG4gICAgLy8gc2ltcGxlciBjYXNlOiBtb3ZlIGl0ZW0gZGlyZWN0bHkuLi5cbiAgICBpZiAoIXRoaXMubWF4Um93KSB7XG4gICAgICByZXR1cm4gdGhpcy5tb3ZlTm9kZShub2RlLCBvKTtcbiAgICB9XG5cbiAgICAvLyBjb21wbGV4IGNhc2U6IGNyZWF0ZSBhIGNsb25lIHdpdGggTk8gbWF4Um93ICh3aWxsIGNoZWNrIGZvciBvdXQgb2YgYm91bmRzIGF0IHRoZSBlbmQpXG4gICAgbGV0IGNsb25lZE5vZGU6IEdyaWRTdGFja05vZGU7XG4gICAgbGV0IGNsb25lID0gbmV3IEdyaWRTdGFja0VuZ2luZSh7XG4gICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgZmxvYXQ6IHRoaXMuZmxvYXQsXG4gICAgICBub2RlczogdGhpcy5ub2Rlcy5tYXAobiA9PiB7XG4gICAgICAgIGlmIChuLl9pZCA9PT0gbm9kZS5faWQpIHtcbiAgICAgICAgICBjbG9uZWROb2RlID0gey4uLm59O1xuICAgICAgICAgIHJldHVybiBjbG9uZWROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7Li4ubn07XG4gICAgICB9KVxuICAgIH0pO1xuICAgIGlmICghY2xvbmVkTm9kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gY2hlY2sgaWYgd2UncmUgY292ZXJpbmcgNTAlIGNvbGxpc2lvbiBhbmQgY291bGQgbW92ZVxuICAgIGxldCBjYW5Nb3ZlID0gY2xvbmUubW92ZU5vZGUoY2xvbmVkTm9kZSwgbykgJiYgY2xvbmUuZ2V0Um93KCkgPD0gdGhpcy5tYXhSb3c7XG4gICAgLy8gZWxzZSBjaGVjayBpZiB3ZSBjYW4gZm9yY2UgYSBzd2FwIChmbG9hdD10cnVlLCBvciBkaWZmZXJlbnQgc2hhcGVzKSBvbiBub24tcmVzaXplXG4gICAgaWYgKCFjYW5Nb3ZlICYmICFvLnJlc2l6aW5nICYmIG8uY29sbGlkZSkge1xuICAgICAgbGV0IGNvbGxpZGUgPSBvLmNvbGxpZGUuZWwuZ3JpZHN0YWNrTm9kZTsgLy8gZmluZCB0aGUgc291cmNlIG5vZGUgdGhlIGNsb25lIGNvbGxpZGVkIHdpdGggYXQgNTAlXG4gICAgICBpZiAodGhpcy5zd2FwKG5vZGUsIGNvbGxpZGUpKSB7IC8vIHN3YXBzIGFuZCBtYXJrIGRpcnR5XG4gICAgICAgIHRoaXMuX25vdGlmeSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjYW5Nb3ZlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBpZiBjbG9uZSB3YXMgYWJsZSB0byBtb3ZlLCBjb3B5IHRob3NlIG1vZHMgb3ZlciB0byB1cyBub3cgaW5zdGVhZCBvZiBjYWxsZXIgdHJ5aW5nIHRvIGRvIHRoaXMgYWxsIG92ZXIhXG4gICAgLy8gTm90ZTogd2UgY2FuJ3QgdXNlIHRoZSBsaXN0IGRpcmVjdGx5IGFzIGVsZW1lbnRzIGFuZCBvdGhlciBwYXJ0cyBwb2ludCB0byBhY3R1YWwgbm9kZSwgc28gY29weSBjb250ZW50XG4gICAgY2xvbmUubm9kZXMuZmlsdGVyKG4gPT4gbi5fZGlydHkpLmZvckVhY2goYyA9PiB7XG4gICAgICBsZXQgbiA9IHRoaXMubm9kZXMuZmluZChhID0+IGEuX2lkID09PSBjLl9pZCk7XG4gICAgICBpZiAoIW4pIHJldHVybjtcbiAgICAgIFV0aWxzLmNvcHlQb3MobiwgYyk7XG4gICAgICBuLl9kaXJ0eSA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5fbm90aWZ5KCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogcmV0dXJuIHRydWUgaWYgY2FuIGZpdCBpbiBncmlkIGhlaWdodCBjb25zdHJhaW4gb25seSAoYWx3YXlzIHRydWUgaWYgbm8gbWF4Um93KSAqL1xuICBwdWJsaWMgd2lsbEl0Rml0KG5vZGU6IEdyaWRTdGFja05vZGUpOiBib29sZWFuIHtcbiAgICBkZWxldGUgbm9kZS5fd2lsbEZpdFBvcztcbiAgICBpZiAoIXRoaXMubWF4Um93KSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBjcmVhdGUgYSBjbG9uZSB3aXRoIE5PIG1heFJvdyBhbmQgY2hlY2sgaWYgc3RpbGwgd2l0aGluIHNpemVcbiAgICBsZXQgY2xvbmUgPSBuZXcgR3JpZFN0YWNrRW5naW5lKHtcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICBmbG9hdDogdGhpcy5mbG9hdCxcbiAgICAgIG5vZGVzOiB0aGlzLm5vZGVzLm1hcChuID0+IHtyZXR1cm4gey4uLm59fSlcbiAgICB9KTtcbiAgICBsZXQgbiA9IHsuLi5ub2RlfTsgLy8gY2xvbmUgbm9kZSBzbyB3ZSBkb24ndCBtb2QgYW55IHNldHRpbmdzIG9uIGl0IGJ1dCBoYXZlIGZ1bGwgYXV0b1Bvc2l0aW9uIGFuZCBtaW4vbWF4IGFzIHdlbGwhICMxNjg3XG4gICAgdGhpcy5jbGVhbnVwTm9kZShuKTtcbiAgICBkZWxldGUgbi5lbDsgZGVsZXRlIG4uX2lkOyBkZWxldGUgbi5jb250ZW50OyBkZWxldGUgbi5ncmlkO1xuICAgIGNsb25lLmFkZE5vZGUobik7XG4gICAgaWYgKGNsb25lLmdldFJvdygpIDw9IHRoaXMubWF4Um93KSB7XG4gICAgICBub2RlLl93aWxsRml0UG9zID0gVXRpbHMuY29weVBvcyh7fSwgbik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIHRydWUgaWYgeCx5IG9yIHcsaCBhcmUgZGlmZmVyZW50IGFmdGVyIGNsYW1waW5nIHRvIG1pbi9tYXggKi9cbiAgcHVibGljIGNoYW5nZWRQb3NDb25zdHJhaW4obm9kZTogR3JpZFN0YWNrTm9kZSwgcDogR3JpZFN0YWNrUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdyxoIGFyZSBzZXQgZm9yIGNhbGxlclxuICAgIHAudyA9IHAudyB8fCBub2RlLnc7XG4gICAgcC5oID0gcC5oIHx8IG5vZGUuaDtcbiAgICBpZiAobm9kZS54ICE9PSBwLnggfHwgbm9kZS55ICE9PSBwLnkpIHJldHVybiB0cnVlO1xuICAgIC8vIGNoZWNrIGNvbnN0cmFpbmVkIHcsaFxuICAgIGlmIChub2RlLm1heFcpIHsgcC53ID0gTWF0aC5taW4ocC53LCBub2RlLm1heFcpOyB9XG4gICAgaWYgKG5vZGUubWF4SCkgeyBwLmggPSBNYXRoLm1pbihwLmgsIG5vZGUubWF4SCk7IH1cbiAgICBpZiAobm9kZS5taW5XKSB7IHAudyA9IE1hdGgubWF4KHAudywgbm9kZS5taW5XKTsgfVxuICAgIGlmIChub2RlLm1pbkgpIHsgcC5oID0gTWF0aC5tYXgocC5oLCBub2RlLm1pbkgpOyB9XG4gICAgcmV0dXJuIChub2RlLncgIT09IHAudyB8fCBub2RlLmggIT09IHAuaCk7XG4gIH1cblxuICAvKiogcmV0dXJuIHRydWUgaWYgdGhlIHBhc3NlZCBpbiBub2RlIHdhcyBhY3R1YWxseSBtb3ZlZCAoY2hlY2tzIGZvciBuby1vcCBhbmQgbG9ja2VkKSAqL1xuICBwdWJsaWMgbW92ZU5vZGUobm9kZTogR3JpZFN0YWNrTm9kZSwgbzogR3JpZFN0YWNrTW92ZU9wdHMpOiBib29sZWFuIHtcbiAgICBpZiAoIW5vZGUgfHwgLypub2RlLmxvY2tlZCB8fCovICFvKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHdhc1VuZGVmaW5lZFBhY2s6IGJvb2xlYW47XG4gICAgaWYgKG8ucGFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB3YXNVbmRlZmluZWRQYWNrID0gby5wYWNrID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJhaW4gdGhlIHBhc3NlZCBpbiB2YWx1ZXMgYW5kIGNoZWNrIGlmIHdlJ3JlIHN0aWxsIGNoYW5naW5nIG91ciBub2RlXG4gICAgaWYgKHR5cGVvZiBvLnggIT09ICdudW1iZXInKSB7IG8ueCA9IG5vZGUueDsgfVxuICAgIGlmICh0eXBlb2Ygby55ICE9PSAnbnVtYmVyJykgeyBvLnkgPSBub2RlLnk7IH1cbiAgICBpZiAodHlwZW9mIG8udyAhPT0gJ251bWJlcicpIHsgby53ID0gbm9kZS53OyB9XG4gICAgaWYgKHR5cGVvZiBvLmggIT09ICdudW1iZXInKSB7IG8uaCA9IG5vZGUuaDsgfVxuICAgIGxldCByZXNpemluZyA9IChub2RlLncgIT09IG8udyB8fCBub2RlLmggIT09IG8uaCk7XG4gICAgbGV0IG5uOiBHcmlkU3RhY2tOb2RlID0gVXRpbHMuY29weVBvcyh7fSwgbm9kZSwgdHJ1ZSk7IC8vIGdldCBtaW4vbWF4IG91dCBmaXJzdCwgdGhlbiBvcHQgcG9zaXRpb25zIG5leHRcbiAgICBVdGlscy5jb3B5UG9zKG5uLCBvKTtcbiAgICBubiA9IHRoaXMubm9kZUJvdW5kRml4KG5uLCByZXNpemluZyk7XG4gICAgVXRpbHMuY29weVBvcyhvLCBubik7XG5cbiAgICBpZiAoVXRpbHMuc2FtZVBvcyhub2RlLCBvKSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBwcmV2UG9zOiBHcmlkU3RhY2tQb3NpdGlvbiA9IFV0aWxzLmNvcHlQb3Moe30sIG5vZGUpO1xuXG4gICAgLy8gY2hlY2sgaWYgd2Ugd2lsbCBuZWVkIHRvIGZpeCBjb2xsaXNpb24gYXQgb3VyIG5ldyBsb2NhdGlvblxuICAgIGxldCBjb2xsaWRlcyA9IHRoaXMuY29sbGlkZUFsbChub2RlLCBubiwgby5za2lwKTtcbiAgICBsZXQgbmVlZFRvTW92ZSA9IHRydWU7XG4gICAgaWYgKGNvbGxpZGVzLmxlbmd0aCkge1xuICAgICAgbGV0IGFjdGl2ZURyYWcgPSBub2RlLl9tb3ZpbmcgJiYgIW8ubmVzdGVkO1xuICAgICAgLy8gY2hlY2sgdG8gbWFrZSBzdXJlIHdlIGFjdHVhbGx5IGNvbGxpZGVkIG92ZXIgNTAlIHN1cmZhY2UgYXJlYSB3aGlsZSBkcmFnZ2luZ1xuICAgICAgbGV0IGNvbGxpZGUgPSBhY3RpdmVEcmFnID8gdGhpcy5kaXJlY3Rpb25Db2xsaWRlQ292ZXJhZ2Uobm9kZSwgbywgY29sbGlkZXMpIDogY29sbGlkZXNbMF07XG4gICAgICAvLyBpZiB3ZSdyZSBlbmFibGluZyBjcmVhdGlvbiBvZiBzdWItZ3JpZHMgb24gdGhlIGZseSwgc2VlIGlmIHdlJ3JlIGNvdmVyaW5nIDgwJSBvZiBlaXRoZXIgb25lLCBpZiB3ZSBkaWRuJ3QgYWxyZWFkeSBkbyB0aGF0XG4gICAgICBpZiAoYWN0aXZlRHJhZyAmJiBjb2xsaWRlICYmIG5vZGUuZ3JpZD8ub3B0cz8uc3ViR3JpZER5bmFtaWMgJiYgIW5vZGUuZ3JpZC5faXNUZW1wKSB7XG4gICAgICAgIGxldCBvdmVyID0gVXRpbHMuYXJlYUludGVyY2VwdChvLnJlY3QsIGNvbGxpZGUuX3JlY3QpO1xuICAgICAgICBsZXQgYTEgPSBVdGlscy5hcmVhKG8ucmVjdCk7XG4gICAgICAgIGxldCBhMiA9IFV0aWxzLmFyZWEoY29sbGlkZS5fcmVjdCk7XG4gICAgICAgIGxldCBwZXJjID0gb3ZlciAvIChhMSA8IGEyID8gYTEgOiBhMik7XG4gICAgICAgIGlmIChwZXJjID4gLjgpIHtcbiAgICAgICAgICBjb2xsaWRlLmdyaWQubWFrZVN1YkdyaWQoY29sbGlkZS5lbCwgdW5kZWZpbmVkLCBub2RlKTtcbiAgICAgICAgICBjb2xsaWRlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2xsaWRlKSB7XG4gICAgICAgIG5lZWRUb01vdmUgPSAhdGhpcy5fZml4Q29sbGlzaW9ucyhub2RlLCBubiwgY29sbGlkZSwgbyk7IC8vIGNoZWNrIGlmIGFscmVhZHkgbW92ZWQuLi5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lZWRUb01vdmUgPSBmYWxzZTsgLy8gd2UgZGlkbid0IGNvdmVyID41MCUgZm9yIGEgbW92ZSwgc2tpcC4uLlxuICAgICAgICBpZiAod2FzVW5kZWZpbmVkUGFjaykgZGVsZXRlIG8ucGFjaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBub3cgbW92ZSAodG8gdGhlIG9yaWdpbmFsIGFzayB2cyB0aGUgY29sbGlzaW9uIHZlcnNpb24gd2hpY2ggbWlnaHQgZGlmZmVyKSBhbmQgcmVwYWNrIHRoaW5nc1xuICAgIGlmIChuZWVkVG9Nb3ZlKSB7XG4gICAgICBub2RlLl9kaXJ0eSA9IHRydWU7XG4gICAgICBVdGlscy5jb3B5UG9zKG5vZGUsIG5uKTtcbiAgICB9XG4gICAgaWYgKG8ucGFjaykge1xuICAgICAgdGhpcy5fcGFja05vZGVzKClcbiAgICAgICAgLl9ub3RpZnkoKTtcbiAgICB9XG4gICAgcmV0dXJuICFVdGlscy5zYW1lUG9zKG5vZGUsIHByZXZQb3MpOyAvLyBwYWNrIG1pZ2h0IGhhdmUgbW92ZWQgdGhpbmdzIGJhY2tcbiAgfVxuXG4gIHB1YmxpYyBnZXRSb3coKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5ub2Rlcy5yZWR1Y2UoKHJvdywgbikgPT4gTWF0aC5tYXgocm93LCBuLnkgKyBuLmgpLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBiZWdpblVwZGF0ZShub2RlOiBHcmlkU3RhY2tOb2RlKTogR3JpZFN0YWNrRW5naW5lIHtcbiAgICBpZiAoIW5vZGUuX3VwZGF0aW5nKSB7XG4gICAgICBub2RlLl91cGRhdGluZyA9IHRydWU7XG4gICAgICBkZWxldGUgbm9kZS5fc2tpcERvd247XG4gICAgICBpZiAoIXRoaXMuYmF0Y2hNb2RlKSB0aGlzLnNhdmVJbml0aWFsKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGVuZFVwZGF0ZSgpOiBHcmlkU3RhY2tFbmdpbmUge1xuICAgIGxldCBuID0gdGhpcy5ub2Rlcy5maW5kKG4gPT4gbi5fdXBkYXRpbmcpO1xuICAgIGlmIChuKSB7XG4gICAgICBkZWxldGUgbi5fdXBkYXRpbmc7XG4gICAgICBkZWxldGUgbi5fc2tpcERvd247XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIHNhdmVzIGEgY29weSBvZiB0aGUgbGFyZ2VzdCBjb2x1bW4gbGF5b3V0IChlZyAxMiBldmVuIHdoZW4gcmVuZGVyaW5nIG9uZUNvbHVtbk1vZGUpIHNvIHdlIGRvbid0IGxvb3NlIG9yaWcgbGF5b3V0LFxuICAgKiByZXR1cm5pbmcgYSBsaXN0IG9mIHdpZGdldHMgZm9yIHNlcmlhbGl6YXRpb24gKi9cbiAgcHVibGljIHNhdmUoc2F2ZUVsZW1lbnQgPSB0cnVlLCBzYXZlQ0I/OiBTYXZlRmNuKTogR3JpZFN0YWNrTm9kZVtdIHtcbiAgICAvLyB1c2UgdGhlIGhpZ2hlc3QgbGF5b3V0IGZvciBhbnkgc2F2ZWQgaW5mbyBzbyB3ZSBjYW4gaGF2ZSBmdWxsIGRldGFpbCBvbiByZWxvYWQgIzE4NDlcbiAgICBsZXQgbGVuID0gdGhpcy5fbGF5b3V0cz8ubGVuZ3RoO1xuICAgIGxldCBsYXlvdXQgPSBsZW4gJiYgdGhpcy5jb2x1bW4gIT09IChsZW4gLSAxKSA/IHRoaXMuX2xheW91dHNbbGVuIC0gMV0gOiBudWxsO1xuICAgIGxldCBsaXN0OiBHcmlkU3RhY2tOb2RlW10gPSBbXTtcbiAgICB0aGlzLnNvcnROb2RlcygpO1xuICAgIHRoaXMubm9kZXMuZm9yRWFjaChuID0+IHtcbiAgICAgIGxldCB3bCA9IGxheW91dD8uZmluZChsID0+IGwuX2lkID09PSBuLl9pZCk7XG4gICAgICBsZXQgdzogR3JpZFN0YWNrTm9kZSA9IHsuLi5ufTtcbiAgICAgIC8vIHVzZSBsYXlvdXQgaW5mbyBpbnN0ZWFkIGlmIHNldFxuICAgICAgaWYgKHdsKSB7IHcueCA9IHdsLng7IHcueSA9IHdsLnk7IHcudyA9IHdsLnc7IH1cbiAgICAgIFV0aWxzLnJlbW92ZUludGVybmFsRm9yU2F2ZSh3LCAhc2F2ZUVsZW1lbnQpO1xuICAgICAgaWYgKHNhdmVDQikgc2F2ZUNCKG4sIHcpO1xuICAgICAgbGlzdC5wdXNoKHcpO1xuICAgIH0pO1xuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBjYWxsZWQgd2hlbmV2ZXIgYSBub2RlIGlzIGFkZGVkIG9yIG1vdmVkIC0gdXBkYXRlcyB0aGUgY2FjaGVkIGxheW91dHMgKi9cbiAgcHVibGljIGxheW91dHNOb2Rlc0NoYW5nZShub2RlczogR3JpZFN0YWNrTm9kZVtdKTogR3JpZFN0YWNrRW5naW5lIHtcbiAgICBpZiAoIXRoaXMuX2xheW91dHMgfHwgdGhpcy5faW5Db2x1bW5SZXNpemUpIHJldHVybiB0aGlzO1xuICAgIC8vIHJlbW92ZSBzbWFsbGVyIGxheW91dHMgLSB3ZSB3aWxsIHJlLWdlbmVyYXRlIHRob3NlIG9uIHRoZSBmbHkuLi4gbGFyZ2VyIG9uZXMgbmVlZCB0byB1cGRhdGVcbiAgICB0aGlzLl9sYXlvdXRzLmZvckVhY2goKGxheW91dCwgY29sdW1uKSA9PiB7XG4gICAgICBpZiAoIWxheW91dCB8fCBjb2x1bW4gPT09IHRoaXMuY29sdW1uKSByZXR1cm4gdGhpcztcbiAgICAgIGlmIChjb2x1bW4gPCB0aGlzLmNvbHVtbikge1xuICAgICAgICB0aGlzLl9sYXlvdXRzW2NvbHVtbl0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gd2Ugc2F2ZSB0aGUgb3JpZ2luYWwgeCx5LHcgKGggaXNuJ3QgY2FjaGVkKSB0byBzZWUgd2hhdCBhY3R1YWxseSBjaGFuZ2VkIHRvIHByb3BhZ2F0ZSBiZXR0ZXIuXG4gICAgICAgIC8vIE5PVEU6IHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYWdhaW5zdCBvdXQgb2YgYm91bmQgc2NhbGluZy9tb3ZpbmcgYXMgdGhhdCB3aWxsIGJlIGRvbmUgd2hlbiB1c2luZyB0aG9zZSBjYWNoZSB2YWx1ZXMuICMxNzg1XG4gICAgICAgIGxldCByYXRpbyA9IGNvbHVtbiAvIHRoaXMuY29sdW1uO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS5fb3JpZykgcmV0dXJuOyAvLyBkaWRuJ3QgY2hhbmdlIChuZXdseSBhZGRlZCA/KVxuICAgICAgICAgIGxldCBuID0gbGF5b3V0LmZpbmQobCA9PiBsLl9pZCA9PT0gbm9kZS5faWQpO1xuICAgICAgICAgIGlmICghbikgcmV0dXJuOyAvLyBubyBjYWNoZSBmb3IgbmV3IG5vZGVzLiBXaWxsIHVzZSB0aG9zZSB2YWx1ZXMuXG4gICAgICAgICAgLy8gWSBjaGFuZ2VkLCBwdXNoIGRvd24gc2FtZSBhbW91bnRcbiAgICAgICAgICAvLyBUT0RPOiBkZXRlY3QgZG9pbmcgaXRlbSAnc3dhcHMnIHdpbGwgaGVscCBpbnN0ZWFkIG9mIG1vdmUgKGVzcGVjaWFsbHkgaW4gMSBjb2x1bW4gbW9kZSlcbiAgICAgICAgICBpZiAobm9kZS55ICE9PSBub2RlLl9vcmlnLnkpIHtcbiAgICAgICAgICAgIG4ueSArPSAobm9kZS55IC0gbm9kZS5fb3JpZy55KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gWCBjaGFuZ2VkLCBzY2FsZSBmcm9tIG5ldyBwb3NpdGlvblxuICAgICAgICAgIGlmIChub2RlLnggIT09IG5vZGUuX29yaWcueCkge1xuICAgICAgICAgICAgbi54ID0gTWF0aC5yb3VuZChub2RlLnggKiByYXRpbyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHdpZHRoIGNoYW5nZWQsIHNjYWxlIGZyb20gbmV3IHdpZHRoXG4gICAgICAgICAgaWYgKG5vZGUudyAhPT0gbm9kZS5fb3JpZy53KSB7XG4gICAgICAgICAgICBuLncgPSBNYXRoLnJvdW5kKG5vZGUudyAqIHJhdGlvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gLi4uaGVpZ2h0IGFsd2F5cyBjYXJyaWVzIG92ZXIgZnJvbSBjYWNoZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgQ2FsbGVkIHRvIHNjYWxlIHRoZSB3aWRnZXQgd2lkdGggJiBwb3NpdGlvbiB1cC9kb3duIGJhc2VkIG9uIHRoZSBjb2x1bW4gY2hhbmdlLlxuICAgKiBOb3RlIHdlIHN0b3JlIHByZXZpb3VzIGxheW91dHMgKGVzcGVjaWFsbHkgb3JpZ2luYWwgb25lcykgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBnb1xuICAgKiBmcm9tIHNheSAxMiAtPiAxIC0+IDEyIGFuZCBnZXQgYmFjayB0byB3aGVyZSB3ZSB3ZXJlLlxuICAgKlxuICAgKiBAcGFyYW0gcHJldkNvbHVtbiBwcmV2aW91cyBudW1iZXIgb2YgY29sdW1uc1xuICAgKiBAcGFyYW0gY29sdW1uICBuZXcgY29sdW1uIG51bWJlclxuICAgKiBAcGFyYW0gbm9kZXMgZGlmZmVyZW50IHNvcnRlZCBsaXN0IChleDogRE9NIG9yZGVyKSBpbnN0ZWFkIG9mIGN1cnJlbnQgbGlzdFxuICAgKiBAcGFyYW0gbGF5b3V0IHNwZWNpZnkgdGhlIHR5cGUgb2YgcmUtbGF5b3V0IHRoYXQgd2lsbCBoYXBwZW4gKHBvc2l0aW9uLCBzaXplLCBldGMuLi4pLlxuICAgKiBOb3RlOiBpdGVtcyB3aWxsIG5ldmVyIGJlIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgY29sdW1uIGJvdW5kYXJpZXMuIGRlZmF1bHQgKG1vdmVTY2FsZSkuIElnbm9yZWQgZm9yIDEgY29sdW1uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlTm9kZVdpZHRocyhwcmV2Q29sdW1uOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyLCBub2RlczogR3JpZFN0YWNrTm9kZVtdLCBsYXlvdXQ6IENvbHVtbk9wdGlvbnMgPSAnbW92ZVNjYWxlJyk6IEdyaWRTdGFja0VuZ2luZSB7XG4gICAgaWYgKCF0aGlzLm5vZGVzLmxlbmd0aCB8fCAhY29sdW1uIHx8IHByZXZDb2x1bW4gPT09IGNvbHVtbikgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBjYWNoZSB0aGUgY3VycmVudCBsYXlvdXQgaW4gY2FzZSB0aGV5IHdhbnQgdG8gZ28gYmFjayAobGlrZSAxMiAtPiAxIC0+IDEyKSBhcyBpdCByZXF1aXJlcyBvcmlnaW5hbCBkYXRhXG4gICAgdGhpcy5jYWNoZUxheW91dCh0aGlzLm5vZGVzLCBwcmV2Q29sdW1uKTtcbiAgICB0aGlzLmJhdGNoVXBkYXRlKCk7IC8vIGRvIHRoaXMgRUFSTFkgYXMgaXQgd2lsbCBjYWxsIHNhdmVJbml0aWFsKCkgc28gd2UgY2FuIGRldGVjdCB3aGVyZSB3ZSBzdGFydGVkIGZvciBfZGlydHkgYW5kIGNvbGxpc2lvblxuICAgIGxldCBuZXdOb2RlczogR3JpZFN0YWNrTm9kZVtdID0gW107XG5cbiAgICAvLyBpZiB3ZSdyZSBnb2luZyB0byAxIGNvbHVtbiBhbmQgdXNpbmcgRE9NIG9yZGVyIHJhdGhlciB0aGFuIGRlZmF1bHQgc29ydGluZywgdGhlbiBnZW5lcmF0ZSB0aGF0IGxheW91dFxuICAgIGxldCBkb21PcmRlciA9IGZhbHNlO1xuICAgIGlmIChjb2x1bW4gPT09IDEgJiYgbm9kZXM/Lmxlbmd0aCkge1xuICAgICAgZG9tT3JkZXIgPSB0cnVlO1xuICAgICAgbGV0IHRvcCA9IDA7XG4gICAgICBub2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICBuLnggPSAwO1xuICAgICAgICBuLncgPSAxO1xuICAgICAgICBuLnkgPSBNYXRoLm1heChuLnksIHRvcCk7XG4gICAgICAgIHRvcCA9IG4ueSArIG4uaDtcbiAgICAgIH0pO1xuICAgICAgbmV3Tm9kZXMgPSBub2RlcztcbiAgICAgIG5vZGVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzID0gVXRpbHMuc29ydCh0aGlzLm5vZGVzLCAtMSwgcHJldkNvbHVtbik7IC8vIGN1cnJlbnQgY29sdW1uIHJldmVyc2Ugc29ydGluZyBzbyB3ZSBjYW4gaW5zZXJ0IGxhc3QgdG8gZnJvbnQgKGxpbWl0IGNvbGxpc2lvbilcbiAgICB9XG5cbiAgICAvLyBzZWUgaWYgd2UgaGF2ZSBjYWNoZWQgcHJldmlvdXMgbGF5b3V0IElGRiB3ZSBhcmUgZ29pbmcgdXAgaW4gc2l6ZSAocmVzdG9yZSkgb3RoZXJ3aXNlIGFsd2F5c1xuICAgIC8vIGdlbmVyYXRlIG5leHQgc2l6ZSBkb3duIGZyb20gd2hlcmUgd2UgYXJlIChsb29rcyBtb3JlIG5hdHVyYWwgYXMgeW91IGdyYWR1YWxseSBzaXplIGRvd24pLlxuICAgIGxldCBjYWNoZU5vZGVzOiBHcmlkU3RhY2tOb2RlW10gPSBbXTtcbiAgICBpZiAoY29sdW1uID4gcHJldkNvbHVtbikge1xuICAgICAgY2FjaGVOb2RlcyA9IHRoaXMuX2xheW91dHNbY29sdW1uXSB8fCBbXTtcbiAgICAgIC8vIC4uLmlmIG5vdCwgc3RhcnQgd2l0aCB0aGUgbGFyZ2VzdCBsYXlvdXQgKGlmIG5vdCBhbHJlYWR5IHRoZXJlKSBhcyBkb3duLXNjYWxpbmcgaXMgbW9yZSBhY2N1cmF0ZVxuICAgICAgLy8gYnkgcHJldGVuZGluZyB3ZSBjYW1lIGZyb20gdGhhdCBsYXJnZXIgY29sdW1uIGJ5IGFzc2lnbmluZyB0aG9zZSB2YWx1ZXMgYXMgc3RhcnRpbmcgcG9pbnRcbiAgICAgIGxldCBsYXN0SW5kZXggPSB0aGlzLl9sYXlvdXRzLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoIWNhY2hlTm9kZXMubGVuZ3RoICYmIHByZXZDb2x1bW4gIT09IGxhc3RJbmRleCAmJiB0aGlzLl9sYXlvdXRzW2xhc3RJbmRleF0/Lmxlbmd0aCkge1xuICAgICAgICBwcmV2Q29sdW1uID0gbGFzdEluZGV4O1xuICAgICAgICB0aGlzLl9sYXlvdXRzW2xhc3RJbmRleF0uZm9yRWFjaChjYWNoZU5vZGUgPT4ge1xuICAgICAgICAgIGxldCBuID0gbm9kZXMuZmluZChuID0+IG4uX2lkID09PSBjYWNoZU5vZGUuX2lkKTtcbiAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgLy8gc3RpbGwgY3VycmVudCwgdXNlIGNhY2hlIGluZm8gcG9zaXRpb25zXG4gICAgICAgICAgICBuLnggPSBjYWNoZU5vZGUueDtcbiAgICAgICAgICAgIG4ueSA9IGNhY2hlTm9kZS55O1xuICAgICAgICAgICAgbi53ID0gY2FjaGVOb2RlLnc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBjYWNoZSByZS11c2UgdGhvc2Ugbm9kZXMgdGhhdCBhcmUgc3RpbGwgY3VycmVudFxuICAgIGNhY2hlTm9kZXMuZm9yRWFjaChjYWNoZU5vZGUgPT4ge1xuICAgICAgbGV0IGogPSBub2Rlcy5maW5kSW5kZXgobiA9PiBuLl9pZCA9PT0gY2FjaGVOb2RlLl9pZCk7XG4gICAgICBpZiAoaiAhPT0gLTEpIHtcbiAgICAgICAgLy8gc3RpbGwgY3VycmVudCwgdXNlIGNhY2hlIGluZm8gcG9zaXRpb25zXG4gICAgICAgIGlmIChjYWNoZU5vZGUuYXV0b1Bvc2l0aW9uIHx8IGlzTmFOKGNhY2hlTm9kZS54KSB8fCBpc05hTihjYWNoZU5vZGUueSkpIHtcbiAgICAgICAgICB0aGlzLmZpbmRFbXB0eVBvc2l0aW9uKGNhY2hlTm9kZSwgbmV3Tm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2FjaGVOb2RlLmF1dG9Qb3NpdGlvbikge1xuICAgICAgICAgIG5vZGVzW2pdLnggPSBjYWNoZU5vZGUueDtcbiAgICAgICAgICBub2Rlc1tqXS55ID0gY2FjaGVOb2RlLnk7XG4gICAgICAgICAgbm9kZXNbal0udyA9IGNhY2hlTm9kZS53O1xuICAgICAgICAgIG5ld05vZGVzLnB1c2gobm9kZXNbal0pO1xuICAgICAgICB9XG4gICAgICAgIG5vZGVzLnNwbGljZShqLCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyAuLi5hbmQgYWRkIGFueSBleHRyYSBub24tY2FjaGVkIG9uZXNcbiAgICBpZiAobm9kZXMubGVuZ3RoKSB7XG4gICAgICBpZiAodHlwZW9mIGxheW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBsYXlvdXQoY29sdW1uLCBwcmV2Q29sdW1uLCBuZXdOb2Rlcywgbm9kZXMpO1xuICAgICAgfSBlbHNlIGlmICghZG9tT3JkZXIpIHtcbiAgICAgICAgbGV0IHJhdGlvID0gY29sdW1uIC8gcHJldkNvbHVtbjtcbiAgICAgICAgbGV0IG1vdmUgPSAobGF5b3V0ID09PSAnbW92ZScgfHwgbGF5b3V0ID09PSAnbW92ZVNjYWxlJyk7XG4gICAgICAgIGxldCBzY2FsZSA9IChsYXlvdXQgPT09ICdzY2FsZScgfHwgbGF5b3V0ID09PSAnbW92ZVNjYWxlJyk7XG4gICAgICAgIG5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgLy8gTk9URTogeCArIHcgY291bGQgYmUgb3V0c2lkZSBvZiB0aGUgZ3JpZCwgYnV0IGFkZE5vZGUoKSBiZWxvdyB3aWxsIGhhbmRsZSB0aGF0XG4gICAgICAgICAgbm9kZS54ID0gKGNvbHVtbiA9PT0gMSA/IDAgOiAobW92ZSA/IE1hdGgucm91bmQobm9kZS54ICogcmF0aW8pIDogTWF0aC5taW4obm9kZS54LCBjb2x1bW4gLSAxKSkpO1xuICAgICAgICAgIG5vZGUudyA9ICgoY29sdW1uID09PSAxIHx8IHByZXZDb2x1bW4gPT09IDEpID8gMSA6XG4gICAgICAgICAgICBzY2FsZSA/IChNYXRoLnJvdW5kKG5vZGUudyAqIHJhdGlvKSB8fCAxKSA6IChNYXRoLm1pbihub2RlLncsIGNvbHVtbikpKTtcbiAgICAgICAgICBuZXdOb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgbm9kZXMgPSBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmaW5hbGx5IHJlLWxheW91dCB0aGVtIGluIHJldmVyc2Ugb3JkZXIgKHRvIGdldCBjb3JyZWN0IHBsYWNlbWVudClcbiAgICBpZiAoIWRvbU9yZGVyKSBuZXdOb2RlcyA9IFV0aWxzLnNvcnQobmV3Tm9kZXMsIC0xLCBjb2x1bW4pO1xuICAgIHRoaXMuX2luQ29sdW1uUmVzaXplID0gdHJ1ZTsgLy8gcHJldmVudCBjYWNoZSB1cGRhdGVcbiAgICB0aGlzLm5vZGVzID0gW107IC8vIHByZXRlbmQgd2UgaGF2ZSBubyBub2RlcyB0byBzdGFydCB3aXRoIChhZGQoKSB3aWxsIHVzZSBzYW1lIHN0cnVjdHVyZXMpIHRvIHNpbXBsaWZ5IGxheW91dFxuICAgIG5ld05vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICB0aGlzLmFkZE5vZGUobm9kZSwgZmFsc2UpOyAvLyAnZmFsc2UnIGZvciBhZGQgZXZlbnQgdHJpZ2dlclxuICAgICAgZGVsZXRlIG5vZGUuX29yaWc7IC8vIG1ha2Ugc3VyZSB0aGUgY29tbWl0IGRvZXNuJ3QgdHJ5IHRvIHJlc3RvcmUgdGhpbmdzIGJhY2sgdG8gb3JpZ2luYWxcbiAgICB9KTtcbiAgICB0aGlzLmJhdGNoVXBkYXRlKGZhbHNlKTtcbiAgICBkZWxldGUgdGhpcy5faW5Db2x1bW5SZXNpemU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogY2FsbCB0byBjYWNoZSB0aGUgZ2l2ZW4gbGF5b3V0IGludGVybmFsbHkgdG8gdGhlIGdpdmVuIGxvY2F0aW9uIHNvIHdlIGNhbiByZXN0b3JlIGJhY2sgd2hlbiBjb2x1bW4gY2hhbmdlcyBzaXplXG4gICAqIEBwYXJhbSBub2RlcyBsaXN0IG9mIG5vZGVzXG4gICAqIEBwYXJhbSBjb2x1bW4gY29ycmVzcG9uZGluZyBjb2x1bW4gaW5kZXggdG8gc2F2ZSBpdCB1bmRlclxuICAgKiBAcGFyYW0gY2xlYXIgaWYgdHJ1ZSwgd2lsbCBmb3JjZSBvdGhlciBjYWNoZXMgdG8gYmUgcmVtb3ZlZCAoZGVmYXVsdCBmYWxzZSlcbiAgICovXG4gIHB1YmxpYyBjYWNoZUxheW91dChub2RlczogR3JpZFN0YWNrTm9kZVtdLCBjb2x1bW46IG51bWJlciwgY2xlYXIgPSBmYWxzZSk6IEdyaWRTdGFja0VuZ2luZSB7XG4gICAgbGV0IGNvcHk6IEdyaWRTdGFja05vZGVbXSA9IFtdO1xuICAgIG5vZGVzLmZvckVhY2goKG4sIGkpID0+IHtcbiAgICAgIG4uX2lkID0gbi5faWQgPz8gR3JpZFN0YWNrRW5naW5lLl9pZFNlcSsrOyAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBpZCBpbiBjYXNlIHRoaXMgaXMgbmV3IGxheW91dCwgZWxzZSByZS11c2UgaWQgYWxyZWFkeSBzZXRcbiAgICAgIGNvcHlbaV0gPSB7eDogbi54LCB5OiBuLnksIHc6IG4udywgX2lkOiBuLl9pZH0gLy8gb25seSB0aGluZyB3ZSBjaGFuZ2UgaXMgeCx5LHcgYW5kIGlkIHRvIGZpbmQgaXQgYmFja1xuICAgIH0pO1xuICAgIHRoaXMuX2xheW91dHMgPSBjbGVhciA/IFtdIDogdGhpcy5fbGF5b3V0cyB8fCBbXTsgLy8gdXNlIGFycmF5IHRvIGZpbmQgbGFyZ2VyIHF1aWNrXG4gICAgdGhpcy5fbGF5b3V0c1tjb2x1bW5dID0gY29weTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIHRvIGNhY2hlIHRoZSBnaXZlbiBub2RlIGxheW91dCBpbnRlcm5hbGx5IHRvIHRoZSBnaXZlbiBsb2NhdGlvbiBzbyB3ZSBjYW4gcmVzdG9yZSBiYWNrIHdoZW4gY29sdW1uIGNoYW5nZXMgc2l6ZVxuICAgKiBAcGFyYW0gbm9kZSBzaW5nbGUgbm9kZSB0byBjYWNoZVxuICAgKiBAcGFyYW0gY29sdW1uIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluZGV4IHRvIHNhdmUgaXQgdW5kZXJcbiAgICovXG4gIHB1YmxpYyBjYWNoZU9uZUxheW91dChuOiBHcmlkU3RhY2tOb2RlLCBjb2x1bW46IG51bWJlcik6IEdyaWRTdGFja0VuZ2luZSB7XG4gICAgbi5faWQgPSBuLl9pZCA/PyBHcmlkU3RhY2tFbmdpbmUuX2lkU2VxKys7XG4gICAgbGV0IGw6IEdyaWRTdGFja05vZGUgPSB7eDogbi54LCB5OiBuLnksIHc6IG4udywgX2lkOiBuLl9pZH1cbiAgICBpZiAobi5hdXRvUG9zaXRpb24pIHsgZGVsZXRlIGwueDsgZGVsZXRlIGwueTsgbC5hdXRvUG9zaXRpb24gPSB0cnVlOyB9XG4gICAgdGhpcy5fbGF5b3V0cyA9IHRoaXMuX2xheW91dHMgfHwgW107XG4gICAgdGhpcy5fbGF5b3V0c1tjb2x1bW5dID0gdGhpcy5fbGF5b3V0c1tjb2x1bW5dIHx8IFtdO1xuICAgIGxldCBpbmRleCA9IHRoaXMuZmluZENhY2hlTGF5b3V0KG4sIGNvbHVtbik7XG4gICAgaWYgKGluZGV4ID09PSAtMSlcbiAgICAgIHRoaXMuX2xheW91dHNbY29sdW1uXS5wdXNoKGwpO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuX2xheW91dHNbY29sdW1uXVtpbmRleF0gPSBsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpbmRDYWNoZUxheW91dChuOiBHcmlkU3RhY2tOb2RlLCBjb2x1bW46IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dHM/Lltjb2x1bW5dPy5maW5kSW5kZXgobCA9PiBsLl9pZCA9PT0gbi5faWQpID8/IC0xO1xuICB9XG5cblxuICAvKiogY2FsbGVkIHRvIHJlbW92ZSBhbGwgaW50ZXJuYWwgdmFsdWVzIGJ1dCB0aGUgX2lkICovXG4gIHB1YmxpYyBjbGVhbnVwTm9kZShub2RlOiBHcmlkU3RhY2tOb2RlKTogR3JpZFN0YWNrRW5naW5lIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIG5vZGUpIHtcbiAgICAgIGlmIChwcm9wWzBdID09PSAnXycgJiYgcHJvcCAhPT0gJ19pZCcpIGRlbGV0ZSBub2RlW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///506\n")},324:function(__unused_webpack_module,exports,__webpack_require__){eval("\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.GridStack = void 0;\n/*!\n * GridStack 8.2.2\n * https://gridstackjs.com/\n *\n * Copyright (c) 2021-2022 Alain Dumesny\n * see root license https://github.com/gridstack/gridstack.js/tree/master/LICENSE\n */\nvar gridstack_engine_1 = __webpack_require__(506);\nvar utils_1 = __webpack_require__(867);\nvar types_1 = __webpack_require__(855);\n/*\n * and include D&D by default\n * TODO: while we could generate a gridstack-static.js at smaller size - saves about 31k (41k -> 72k)\n * I don't know how to generate the DD only code at the remaining 31k to delay load as code depends on Gridstack.ts\n * also it caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039\n */\nvar dd_gridstack_1 = __webpack_require__(502);\nvar dd_touch_1 = __webpack_require__(537);\nvar dd_manager_1 = __webpack_require__(839);\n/** global instance */\nvar dd = new dd_gridstack_1.DDGridStack;\n// export all dependent file as well to make it easier for users to just import the main file\n__exportStar(__webpack_require__(855), exports);\n__exportStar(__webpack_require__(867), exports);\n__exportStar(__webpack_require__(506), exports);\n__exportStar(__webpack_require__(502), exports);\n/**\n * Main gridstack class - you will need to call `GridStack.init()` first to initialize your grid.\n * Note: your grid elements MUST have the following classes for the CSS layout to work:\n * @example\n * <div class=\"grid-stack\">\n * <div class=\"grid-stack-item\">\n * <div class=\"grid-stack-item-content\">Item 1</div>\n * </div>\n * </div>\n */\nvar GridStack = exports.GridStack = /** @class */ (function () {\n /**\n * Construct a grid item from the given element and options\n * @param el\n * @param opts\n */\n function GridStack(el, opts) {\n if (opts === void 0) { opts = {}; }\n var _this = this;\n var _a, _b;\n /** @internal */\n this._gsEventHandler = {};\n /** @internal extra row added when dragging at the bottom of the grid */\n this._extraDragRow = 0;\n this.el = el; // exposed HTML element to the user\n opts = opts || {}; // handles null/undefined/0\n if (!el.classList.contains('grid-stack')) {\n this.el.classList.add('grid-stack');\n }\n // if row property exists, replace minRow and maxRow instead\n if (opts.row) {\n opts.minRow = opts.maxRow = opts.row;\n delete opts.row;\n }\n var rowAttr = utils_1.Utils.toNumber(el.getAttribute('gs-row'));\n // flag only valid in sub-grids (handled by parent, not here)\n if (opts.column === 'auto') {\n delete opts.column;\n }\n // save original setting so we can restore on save\n if (opts.alwaysShowResizeHandle !== undefined) {\n opts._alwaysShowResizeHandle = opts.alwaysShowResizeHandle;\n }\n // elements DOM attributes override any passed options (like CSS style) - merge the two together\n var defaults = __assign(__assign({}, utils_1.Utils.cloneDeep(types_1.gridDefaults)), { column: utils_1.Utils.toNumber(el.getAttribute('gs-column')) || types_1.gridDefaults.column, minRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute('gs-min-row')) || types_1.gridDefaults.minRow, maxRow: rowAttr ? rowAttr : utils_1.Utils.toNumber(el.getAttribute('gs-max-row')) || types_1.gridDefaults.maxRow, staticGrid: utils_1.Utils.toBool(el.getAttribute('gs-static')) || types_1.gridDefaults.staticGrid, draggable: {\n handle: (opts.handleClass ? '.' + opts.handleClass : (opts.handle ? opts.handle : '')) || types_1.gridDefaults.draggable.handle,\n }, removableOptions: {\n accept: opts.itemClass ? '.' + opts.itemClass : types_1.gridDefaults.removableOptions.accept,\n } });\n if (el.getAttribute('gs-animate')) { // default to true, but if set to false use that instead\n defaults.animate = utils_1.Utils.toBool(el.getAttribute('gs-animate'));\n }\n this.opts = utils_1.Utils.defaults(opts, defaults);\n opts = null; // make sure we use this.opts instead\n this._initMargin(); // part of settings defaults...\n // Now check if we're loading into 1 column mode FIRST so we don't do un-necessary work (like cellHeight = width / 12 then go 1 column)\n if (this.opts.column !== 1 && !this.opts.disableOneColumnMode && this._widthOrContainer() <= this.opts.oneColumnSize) {\n this._prevColumn = this.getColumn();\n this.opts.column = 1;\n }\n if (this.opts.rtl === 'auto') {\n this.opts.rtl = (el.style.direction === 'rtl');\n }\n if (this.opts.rtl) {\n this.el.classList.add('grid-stack-rtl');\n }\n // check if we're been nested, and if so update our style and keep pointer around (used during save)\n var parentGridItem = (_a = utils_1.Utils.closestUpByClass(this.el, types_1.gridDefaults.itemClass)) === null || _a === void 0 ? void 0 : _a.gridstackNode;\n if (parentGridItem) {\n parentGridItem.subGrid = this;\n this.parentGridItem = parentGridItem;\n this.el.classList.add('grid-stack-nested');\n parentGridItem.el.classList.add('grid-stack-sub-grid');\n }\n this._isAutoCellHeight = (this.opts.cellHeight === 'auto');\n if (this._isAutoCellHeight || this.opts.cellHeight === 'initial') {\n // make the cell content square initially (will use resize/column event to keep it square)\n this.cellHeight(undefined, false);\n }\n else {\n // append unit if any are set\n if (typeof this.opts.cellHeight == 'number' && this.opts.cellHeightUnit && this.opts.cellHeightUnit !== types_1.gridDefaults.cellHeightUnit) {\n this.opts.cellHeight = this.opts.cellHeight + this.opts.cellHeightUnit;\n delete this.opts.cellHeightUnit;\n }\n this.cellHeight(this.opts.cellHeight, false);\n }\n // see if we need to adjust auto-hide\n if (this.opts.alwaysShowResizeHandle === 'mobile') {\n this.opts.alwaysShowResizeHandle = dd_touch_1.isTouch;\n }\n this._styleSheetClass = 'gs-id-' + gridstack_engine_1.GridStackEngine._idSeq++;\n this.el.classList.add(this._styleSheetClass);\n this._setStaticClass();\n var engineClass = this.opts.engineClass || GridStack.engineClass || gridstack_engine_1.GridStackEngine;\n this.engine = new engineClass({\n column: this.getColumn(),\n float: this.opts.float,\n maxRow: this.opts.maxRow,\n onChange: function (cbNodes) {\n var maxH = 0;\n _this.engine.nodes.forEach(function (n) { maxH = Math.max(maxH, n.y + n.h); });\n cbNodes.forEach(function (n) {\n var el = n.el;\n if (!el)\n return;\n if (n._removeDOM) {\n if (el)\n el.remove();\n delete n._removeDOM;\n }\n else {\n _this._writePosAttr(el, n);\n }\n });\n _this._updateStyles(false, maxH); // false = don't recreate, just append if need be\n }\n });\n if (this.opts.auto) {\n this.batchUpdate(); // prevent in between re-layout #1535 TODO: this only set float=true, need to prevent collision check...\n this.getGridItems().forEach(function (el) { return _this._prepareElement(el); });\n this.batchUpdate(false);\n }\n // load any passed in children as well, which overrides any DOM layout done above\n if (this.opts.children) {\n var children = this.opts.children;\n delete this.opts.children;\n if (children.length)\n this.load(children); // don't load empty\n }\n this.setAnimation(this.opts.animate);\n this._updateStyles();\n this.el.classList.add('gs-' + this.opts.column);\n // dynamic grids require pausing during drag to detect over to nest vs push\n if (this.opts.subGridDynamic && !dd_manager_1.DDManager.pauseDrag)\n dd_manager_1.DDManager.pauseDrag = true;\n if (((_b = this.opts.draggable) === null || _b === void 0 ? void 0 : _b.pause) !== undefined)\n dd_manager_1.DDManager.pauseDrag = this.opts.draggable.pause;\n this._setupRemoveDrop();\n this._setupAcceptWidget();\n this._updateWindowResizeEvent();\n }\n /**\n * initializing the HTML element, or selector string, into a grid will return the grid. Calling it again will\n * simply return the existing instance (ignore any passed options). There is also an initAll() version that support\n * multiple grids initialization at once. Or you can use addGrid() to create the entire grid from JSON.\n * @param options grid options (optional)\n * @param elOrString element or CSS selector (first one used) to convert to a grid (default to '.grid-stack' class selector)\n *\n * @example\n * let grid = GridStack.init();\n *\n * Note: the HTMLElement (of type GridHTMLElement) will store a `gridstack: GridStack` value that can be retrieve later\n * let grid = document.querySelector('.grid-stack').gridstack;\n */\n GridStack.init = function (options, elOrString) {\n if (options === void 0) { options = {}; }\n if (elOrString === void 0) { elOrString = '.grid-stack'; }\n var el = GridStack.getGridElement(elOrString);\n if (!el) {\n if (typeof elOrString === 'string') {\n console.error('GridStack.initAll() no grid was found with selector \"' + elOrString + '\" - element missing or wrong selector ?' +\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\n }\n else {\n console.error('GridStack.init() no grid element was passed.');\n }\n return null;\n }\n if (!el.gridstack) {\n el.gridstack = new GridStack(el, utils_1.Utils.cloneDeep(options));\n }\n return el.gridstack;\n };\n /**\n * Will initialize a list of elements (given a selector) and return an array of grids.\n * @param options grid options (optional)\n * @param selector elements selector to convert to grids (default to '.grid-stack' class selector)\n *\n * @example\n * let grids = GridStack.initAll();\n * grids.forEach(...)\n */\n GridStack.initAll = function (options, selector) {\n if (options === void 0) { options = {}; }\n if (selector === void 0) { selector = '.grid-stack'; }\n var grids = [];\n GridStack.getGridElements(selector).forEach(function (el) {\n if (!el.gridstack) {\n el.gridstack = new GridStack(el, utils_1.Utils.cloneDeep(options));\n }\n grids.push(el.gridstack);\n });\n if (grids.length === 0) {\n console.error('GridStack.initAll() no grid was found with selector \"' + selector + '\" - element missing or wrong selector ?' +\n '\\nNote: \".grid-stack\" is required for proper CSS styling and drag/drop, and is the default selector.');\n }\n return grids;\n };\n /**\n * call to create a grid with the given options, including loading any children from JSON structure. This will call GridStack.init(), then\n * grid.load() on any passed children (recursively). Great alternative to calling init() if you want entire grid to come from\n * JSON serialized data, including options.\n * @param parent HTML element parent to the grid\n * @param opt grids options used to initialize the grid, and list of children\n */\n GridStack.addGrid = function (parent, opt) {\n if (opt === void 0) { opt = {}; }\n if (!parent)\n return null;\n var el = parent;\n if (el.gridstack) {\n // already a grid - set option and load data\n var grid_1 = el.gridstack;\n if (opt)\n grid_1.opts = __assign(__assign({}, grid_1.opts), opt);\n if (opt.children !== undefined)\n grid_1.load(opt.children);\n return grid_1;\n }\n // create the grid element, but check if the passed 'parent' already has grid styling and should be used instead\n var parentIsGrid = parent.classList.contains('grid-stack');\n if (!parentIsGrid || GridStack.addRemoveCB) {\n if (GridStack.addRemoveCB) {\n el = GridStack.addRemoveCB(parent, opt, true, true);\n }\n else {\n var doc = document.implementation.createHTMLDocument(''); // IE needs a param\n doc.body.innerHTML = \"<div class=\\\"grid-stack \".concat(opt.class || '', \"\\\"></div>\");\n el = doc.body.children[0];\n parent.appendChild(el);\n }\n }\n // create grid class and load any children\n var grid = GridStack.init(opt, el);\n return grid;\n };\n /** call this method to register your engine instead of the default one.\n * See instead `GridStackOptions.engineClass` if you only need to\n * replace just one instance.\n */\n GridStack.registerEngine = function (engineClass) {\n GridStack.engineClass = engineClass;\n };\n Object.defineProperty(GridStack.prototype, \"placeholder\", {\n /** @internal create placeholder DIV as needed */\n get: function () {\n if (!this._placeholder) {\n var placeholderChild = document.createElement('div'); // child so padding match item-content\n placeholderChild.className = 'placeholder-content';\n if (this.opts.placeholderText) {\n placeholderChild.innerHTML = this.opts.placeholderText;\n }\n this._placeholder = document.createElement('div');\n this._placeholder.classList.add(this.opts.placeholderClass, types_1.gridDefaults.itemClass, this.opts.itemClass);\n this.placeholder.appendChild(placeholderChild);\n }\n return this._placeholder;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * add a new widget and returns it.\n *\n * Widget will be always placed even if result height is more than actual grid height.\n * You need to use `willItFit()` before calling addWidget for additional check.\n * See also `makeWidget()`.\n *\n * @example\n * let grid = GridStack.init();\n * grid.addWidget({w: 3, content: 'hello'});\n * grid.addWidget('<div class=\"grid-stack-item\"><div class=\"grid-stack-item-content\">hello</div></div>', {w: 3});\n *\n * @param el GridStackWidget (which can have content string as well), html element, or string definition to add\n * @param options widget position/size options (optional, and ignore if first param is already option) - see GridStackWidget\n */\n GridStack.prototype.addWidget = function (els, options) {\n function isGridStackWidget(w) {\n return w.el !== undefined || w.x !== undefined || w.y !== undefined || w.w !== undefined || w.h !== undefined || w.content !== undefined ? true : false;\n }\n var el;\n var node;\n if (typeof els === 'string') {\n var doc = document.implementation.createHTMLDocument(''); // IE needs a param\n doc.body.innerHTML = els;\n el = doc.body.children[0];\n }\n else if (arguments.length === 0 || arguments.length === 1 && isGridStackWidget(els)) {\n node = options = els;\n if (node === null || node === void 0 ? void 0 : node.el) {\n el = node.el; // re-use element stored in the node\n }\n else if (GridStack.addRemoveCB) {\n el = GridStack.addRemoveCB(this.el, options, true, false);\n }\n else {\n var content = (options === null || options === void 0 ? void 0 : options.content) || '';\n var doc = document.implementation.createHTMLDocument(''); // IE needs a param\n doc.body.innerHTML = \"<div class=\\\"grid-stack-item \".concat(this.opts.itemClass || '', \"\\\"><div class=\\\"grid-stack-item-content\\\">\").concat(content, \"</div></div>\");\n el = doc.body.children[0];\n }\n }\n else {\n el = els;\n }\n if (!el)\n return;\n // if the caller ended up initializing the widget in addRemoveCB, or we stared with one already, skip the rest\n node = el.gridstackNode;\n if (node && el.parentElement === this.el && this.engine.nodes.find(function (n) { return n._id === node._id; }))\n return el;\n // Tempting to initialize the passed in opt with default and valid values, but this break knockout demos\n // as the actual value are filled in when _prepareElement() calls el.getAttribute('gs-xyz') before adding the node.\n // So make sure we load any DOM attributes that are not specified in passed in options (which override)\n var domAttr = this._readAttr(el);\n options = utils_1.Utils.cloneDeep(options) || {}; // make a copy before we modify in case caller re-uses it\n utils_1.Utils.defaults(options, domAttr);\n node = this.engine.prepareNode(options);\n this._writeAttr(el, options);\n if (this._insertNotAppend) {\n this.el.prepend(el);\n }\n else {\n this.el.appendChild(el);\n }\n this.makeWidget(el, options);\n return el;\n };\n /**\n * Convert an existing gridItem element into a sub-grid with the given (optional) options, else inherit them\n * from the parent's subGrid options.\n * @param el gridItem element to convert\n * @param ops (optional) sub-grid options, else default to node, then parent settings, else defaults\n * @param nodeToAdd (optional) node to add to the newly created sub grid (used when dragging over existing regular item)\n * @returns newly created grid\n */\n GridStack.prototype.makeSubGrid = function (el, ops, nodeToAdd, saveContent) {\n var _a, _b, _c;\n if (saveContent === void 0) { saveContent = true; }\n var node = el.gridstackNode;\n if (!node) {\n node = this.makeWidget(el).gridstackNode;\n }\n if ((_a = node.subGrid) === null || _a === void 0 ? void 0 : _a.el)\n return node.subGrid; // already done\n // find the template subGrid stored on a parent as fallback...\n var subGridTemplate; // eslint-disable-next-line @typescript-eslint/no-this-alias\n var grid = this;\n while (grid && !subGridTemplate) {\n subGridTemplate = (_b = grid.opts) === null || _b === void 0 ? void 0 : _b.subGridOpts;\n grid = (_c = grid.parentGridItem) === null || _c === void 0 ? void 0 : _c.grid;\n }\n //... and set the create options\n ops = utils_1.Utils.cloneDeep(__assign(__assign(__assign({}, (subGridTemplate || {})), { children: undefined }), (ops || node.subGridOpts)));\n node.subGridOpts = ops;\n // if column special case it set, remember that flag and set default\n var autoColumn;\n if (ops.column === 'auto') {\n autoColumn = true;\n ops.column = Math.max(node.w || 1, (nodeToAdd === null || nodeToAdd === void 0 ? void 0 : nodeToAdd.w) || 1);\n ops.disableOneColumnMode = true; // driven by parent\n }\n // if we're converting an existing full item, move over the content to be the first sub item in the new grid\n var content = node.el.querySelector('.grid-stack-item-content');\n var newItem;\n var newItemOpt;\n if (saveContent) {\n this._removeDD(node.el); // remove D&D since it's set on content div\n newItemOpt = __assign(__assign({}, node), { x: 0, y: 0 });\n utils_1.Utils.removeInternalForSave(newItemOpt);\n delete newItemOpt.subGridOpts;\n if (node.content) {\n newItemOpt.content = node.content;\n delete node.content;\n }\n if (GridStack.addRemoveCB) {\n newItem = GridStack.addRemoveCB(this.el, newItemOpt, true, false);\n }\n else {\n var doc = document.implementation.createHTMLDocument(''); // IE needs a param\n doc.body.innerHTML = \"<div class=\\\"grid-stack-item\\\"></div>\";\n newItem = doc.body.children[0];\n newItem.appendChild(content);\n doc.body.innerHTML = \"<div class=\\\"grid-stack-item-content\\\"></div>\";\n content = doc.body.children[0];\n node.el.appendChild(content);\n }\n this._prepareDragDropByNode(node); // ... and restore original D&D\n }\n // if we're adding an additional item, make the container large enough to have them both\n if (nodeToAdd) {\n var w = autoColumn ? ops.column : node.w;\n var h = node.h + nodeToAdd.h;\n var style_1 = node.el.style;\n style_1.transition = 'none'; // show up instantly so we don't see scrollbar with nodeToAdd\n this.update(node.el, { w: w, h: h });\n setTimeout(function () { return style_1.transition = null; }); // recover animation\n }\n var subGrid = node.subGrid = GridStack.addGrid(content, ops);\n if (nodeToAdd === null || nodeToAdd === void 0 ? void 0 : nodeToAdd._moving)\n subGrid._isTemp = true; // prevent re-nesting as we add over\n if (autoColumn)\n subGrid._autoColumn = true;\n // add the original content back as a child of hte newly created grid\n if (saveContent) {\n subGrid.addWidget(newItem, newItemOpt);\n }\n // now add any additional node\n if (nodeToAdd) {\n if (nodeToAdd._moving) {\n // create an artificial event even for the just created grid to receive this item\n window.setTimeout(function () { return utils_1.Utils.simulateMouseEvent(nodeToAdd._event, 'mouseenter', subGrid.el); }, 0);\n }\n else {\n subGrid.addWidget(node.el, node);\n }\n }\n return subGrid;\n };\n /**\n * called when an item was converted into a nested grid to accommodate a dragged over item, but then item leaves - return back\n * to the original grid-item. Also called to remove empty sub-grids when last item is dragged out (since re-creating is simple)\n */\n GridStack.prototype.removeAsSubGrid = function (nodeThatRemoved) {\n var _this = this;\n var _a;\n var pGrid = (_a = this.parentGridItem) === null || _a === void 0 ? void 0 : _a.grid;\n if (!pGrid)\n return;\n pGrid.batchUpdate();\n pGrid.removeWidget(this.parentGridItem.el, true, true);\n this.engine.nodes.forEach(function (n) {\n // migrate any children over and offsetting by our location\n n.x += _this.parentGridItem.x;\n n.y += _this.parentGridItem.y;\n pGrid.addWidget(n.el, n);\n });\n pGrid.batchUpdate(false);\n if (this.parentGridItem)\n delete this.parentGridItem.subGrid;\n delete this.parentGridItem;\n // create an artificial event for the original grid now that this one is gone (got a leave, but won't get enter)\n if (nodeThatRemoved) {\n window.setTimeout(function () { return utils_1.Utils.simulateMouseEvent(nodeThatRemoved._event, 'mouseenter', pGrid.el); }, 0);\n }\n };\n /**\n * saves the current layout returning a list of widgets for serialization which might include any nested grids.\n * @param saveContent if true (default) the latest html inside .grid-stack-content will be saved to GridStackWidget.content field, else it will\n * be removed.\n * @param saveGridOpt if true (default false), save the grid options itself, so you can call the new GridStack.addGrid()\n * to recreate everything from scratch. GridStackOptions.children would then contain the widget list instead.\n * @param saveCB callback for each node -> widget, so application can insert additional data to be saved into the widget data structure.\n * @returns list of widgets or full grid option, including .children list of widgets\n */\n GridStack.prototype.save = function (saveContent, saveGridOpt, saveCB) {\n if (saveContent === void 0) { saveContent = true; }\n if (saveGridOpt === void 0) { saveGridOpt = false; }\n if (saveCB === void 0) { saveCB = GridStack.saveCB; }\n // return copied GridStackWidget (with optionally .el) we can modify at will...\n var list = this.engine.save(saveContent, saveCB);\n // check for HTML content and nested grids\n list.forEach(function (n) {\n var _a;\n if (saveContent && n.el && !n.subGrid && !saveCB) { // sub-grid are saved differently, not plain content\n var sub = n.el.querySelector('.grid-stack-item-content');\n n.content = sub ? sub.innerHTML : undefined;\n if (!n.content)\n delete n.content;\n }\n else {\n if (!saveContent && !saveCB) {\n delete n.content;\n }\n // check for nested grid\n if ((_a = n.subGrid) === null || _a === void 0 ? void 0 : _a.el) {\n var listOrOpt = n.subGrid.save(saveContent, saveGridOpt, saveCB);\n n.subGridOpts = (saveGridOpt ? listOrOpt : { children: listOrOpt });\n delete n.subGrid;\n }\n }\n delete n.el;\n });\n // check if save entire grid options (needed for recursive) + children...\n if (saveGridOpt) {\n var o = utils_1.Utils.cloneDeep(this.opts);\n // delete default values that will be recreated on launch\n if (o.marginBottom === o.marginTop && o.marginRight === o.marginLeft && o.marginTop === o.marginRight) {\n o.margin = o.marginTop;\n delete o.marginTop;\n delete o.marginRight;\n delete o.marginBottom;\n delete o.marginLeft;\n }\n if (o.rtl === (this.el.style.direction === 'rtl')) {\n o.rtl = 'auto';\n }\n if (this._isAutoCellHeight) {\n o.cellHeight = 'auto';\n }\n if (this._autoColumn) {\n o.column = 'auto';\n delete o.disableOneColumnMode;\n }\n var origShow = o._alwaysShowResizeHandle;\n delete o._alwaysShowResizeHandle;\n if (origShow !== undefined) {\n o.alwaysShowResizeHandle = origShow;\n }\n else {\n delete o.alwaysShowResizeHandle;\n }\n utils_1.Utils.removeInternalAndSame(o, types_1.gridDefaults);\n o.children = list;\n return o;\n }\n return list;\n };\n /**\n * load the widgets from a list. This will call update() on each (matching by id) or add/remove widgets that are not there.\n *\n * @param layout list of widgets definition to update/create\n * @param addAndRemove boolean (default true) or callback method can be passed to control if and how missing widgets can be added/removed, giving\n * the user control of insertion.\n *\n * @example\n * see http://gridstackjs.com/demo/serialization.html\n **/\n GridStack.prototype.load = function (layout, addRemove) {\n var _this = this;\n if (addRemove === void 0) { addRemove = GridStack.addRemoveCB || true; }\n var items = GridStack.Utils.sort(__spreadArray([], layout, true), -1, this._prevColumn || this.getColumn()); // make copy before we mod/sort\n this._insertNotAppend = true; // since create in reverse order...\n // if we're loading a layout into for example 1 column (_prevColumn is set only when going to 1) and items don't fit, make sure to save\n // the original wanted layout so we can scale back up correctly #1471\n if (this._prevColumn && this._prevColumn !== this.opts.column && items.some(function (n) { return (n.x + n.w) > _this.opts.column; })) {\n this._ignoreLayoutsNodeChange = true; // skip layout update\n this.engine.cacheLayout(items, this._prevColumn, true);\n }\n // if given a different callback, temporally set it as global option so creating will use it\n var prevCB = GridStack.addRemoveCB;\n if (typeof (addRemove) === 'function')\n GridStack.addRemoveCB = addRemove;\n var removed = [];\n this.batchUpdate();\n // see if any items are missing from new layout and need to be removed first\n if (addRemove) {\n var copyNodes = __spreadArray([], this.engine.nodes, true); // don't loop through array you modify\n copyNodes.forEach(function (n) {\n var item = items.find(function (w) { return n.id === w.id; });\n if (!item) {\n if (GridStack.addRemoveCB)\n GridStack.addRemoveCB(_this.el, n, false, false);\n removed.push(n); // batch keep track\n _this.removeWidget(n.el, true, false);\n }\n });\n }\n // now add/update the widgets\n items.forEach(function (w) {\n var _a;\n var item = (w.id !== undefined) ? _this.engine.nodes.find(function (n) { return n.id === w.id; }) : undefined;\n if (item) {\n _this.update(item.el, w);\n if ((_a = w.subGridOpts) === null || _a === void 0 ? void 0 : _a.children) { // update any sub grid as well\n var sub = item.el.querySelector('.grid-stack');\n if (sub && sub.gridstack) {\n sub.gridstack.load(w.subGridOpts.children); // TODO: support updating grid options ?\n _this._insertNotAppend = true; // got reset by above call\n }\n }\n }\n else if (addRemove) {\n _this.addWidget(w);\n }\n });\n this.engine.removedNodes = removed;\n this.batchUpdate(false);\n // after commit, clear that flag\n delete this._ignoreLayoutsNodeChange;\n delete this._insertNotAppend;\n prevCB ? GridStack.addRemoveCB = prevCB : delete GridStack.addRemoveCB;\n return this;\n };\n /**\n * use before calling a bunch of `addWidget()` to prevent un-necessary relayouts in between (more efficient)\n * and get a single event callback. You will see no changes until `batchUpdate(false)` is called.\n */\n GridStack.prototype.batchUpdate = function (flag) {\n if (flag === void 0) { flag = true; }\n this.engine.batchUpdate(flag);\n if (!flag) {\n this._triggerRemoveEvent();\n this._triggerAddEvent();\n this._triggerChangeEvent();\n }\n return this;\n };\n /**\n * Gets current cell height.\n */\n GridStack.prototype.getCellHeight = function (forcePixel) {\n if (forcePixel === void 0) { forcePixel = false; }\n if (this.opts.cellHeight && this.opts.cellHeight !== 'auto' &&\n (!forcePixel || !this.opts.cellHeightUnit || this.opts.cellHeightUnit === 'px')) {\n return this.opts.cellHeight;\n }\n // else get first cell height\n var el = this.el.querySelector('.' + this.opts.itemClass);\n if (el) {\n var height = utils_1.Utils.toNumber(el.getAttribute('gs-h')) || 1; // since we don't write 1 anymore\n return Math.round(el.offsetHeight / height);\n }\n // else do entire grid and # of rows (but doesn't work if min-height is the actual constrain)\n var rows = parseInt(this.el.getAttribute('gs-current-row'));\n return rows ? Math.round(this.el.getBoundingClientRect().height / rows) : this.opts.cellHeight;\n };\n /**\n * Update current cell height - see `GridStackOptions.cellHeight` for format.\n * This method rebuilds an internal CSS style sheet.\n * Note: You can expect performance issues if call this method too often.\n *\n * @param val the cell height. If not passed (undefined), cells content will be made square (match width minus margin),\n * if pass 0 the CSS will be generated by the application instead.\n * @param update (Optional) if false, styles will not be updated\n *\n * @example\n * grid.cellHeight(100); // same as 100px\n * grid.cellHeight('70px');\n * grid.cellHeight(grid.cellWidth() * 1.2);\n */\n GridStack.prototype.cellHeight = function (val, update) {\n if (update === void 0) { update = true; }\n // if not called internally, check if we're changing mode\n if (update && val !== undefined) {\n if (this._isAutoCellHeight !== (val === 'auto')) {\n this._isAutoCellHeight = (val === 'auto');\n this._updateWindowResizeEvent();\n }\n }\n if (val === 'initial' || val === 'auto') {\n val = undefined;\n }\n // make item content be square\n if (val === undefined) {\n var marginDiff = -this.opts.marginRight - this.opts.marginLeft\n + this.opts.marginTop + this.opts.marginBottom;\n val = this.cellWidth() + marginDiff;\n }\n var data = utils_1.Utils.parseHeight(val);\n if (this.opts.cellHeightUnit === data.unit && this.opts.cellHeight === data.h) {\n return this;\n }\n this.opts.cellHeightUnit = data.unit;\n this.opts.cellHeight = data.h;\n if (update) {\n this._updateStyles(true); // true = force re-create for current # of rows\n }\n return this;\n };\n /** Gets current cell width. */\n GridStack.prototype.cellWidth = function () {\n return this._widthOrContainer() / this.getColumn();\n };\n /** return our expected width (or parent) for 1 column check */\n GridStack.prototype._widthOrContainer = function () {\n // use `offsetWidth` or `clientWidth` (no scrollbar) ?\n // https://stackoverflow.com/questions/21064101/understanding-offsetwidth-clientwidth-scrollwidth-and-height-respectively\n return (this.el.clientWidth || this.el.parentElement.clientWidth || window.innerWidth);\n };\n /** re-layout grid items to reclaim any empty space */\n GridStack.prototype.compact = function () {\n this.engine.compact();\n this._triggerChangeEvent();\n return this;\n };\n /**\n * set the number of columns in the grid. Will update existing widgets to conform to new number of columns,\n * as well as cache the original layout so you can revert back to previous positions without loss.\n * Requires `gridstack-extra.css` or `gridstack-extra.min.css` for [2-11],\n * else you will need to generate correct CSS (see https://github.com/gridstack/gridstack.js#change-grid-columns)\n * @param column - Integer > 0 (default 12).\n * @param layout specify the type of re-layout that will happen (position, size, etc...).\n * Note: items will never be outside of the current column boundaries. default (moveScale). Ignored for 1 column\n */\n GridStack.prototype.column = function (column, layout) {\n if (layout === void 0) { layout = 'moveScale'; }\n if (column < 1 || this.opts.column === column)\n return this;\n var oldColumn = this.getColumn();\n // if we go into 1 column mode (which happens if we're sized less than minW unless disableOneColumnMode is on)\n // then remember the original columns so we can restore.\n if (column === 1) {\n this._prevColumn = oldColumn;\n }\n else {\n delete this._prevColumn;\n }\n this.el.classList.remove('gs-' + oldColumn);\n this.el.classList.add('gs-' + column);\n this.opts.column = this.engine.column = column;\n // update the items now - see if the dom order nodes should be passed instead (else default to current list)\n var domNodes;\n if (column === 1 && this.opts.oneColumnModeDomSort) {\n domNodes = [];\n this.getGridItems().forEach(function (el) {\n if (el.gridstackNode) {\n domNodes.push(el.gridstackNode);\n }\n });\n if (!domNodes.length) {\n domNodes = undefined;\n }\n }\n this.engine.updateNodeWidths(oldColumn, column, domNodes, layout);\n if (this._isAutoCellHeight)\n this.cellHeight();\n // and trigger our event last...\n this._ignoreLayoutsNodeChange = true; // skip layout update\n this._triggerChangeEvent();\n delete this._ignoreLayoutsNodeChange;\n return this;\n };\n /**\n * get the number of columns in the grid (default 12)\n */\n GridStack.prototype.getColumn = function () {\n return this.opts.column;\n };\n /** returns an array of grid HTML elements (no placeholder) - used to iterate through our children in DOM order */\n GridStack.prototype.getGridItems = function () {\n var _this = this;\n return Array.from(this.el.children)\n .filter(function (el) { return el.matches('.' + _this.opts.itemClass) && !el.matches('.' + _this.opts.placeholderClass); });\n };\n /**\n * Destroys a grid instance. DO NOT CALL any methods or access any vars after this as it will free up members.\n * @param removeDOM if `false` grid and items HTML elements will not be removed from the DOM (Optional. Default `true`).\n */\n GridStack.prototype.destroy = function (removeDOM) {\n if (removeDOM === void 0) { removeDOM = true; }\n if (!this.el)\n return; // prevent multiple calls\n this.offAll();\n this._updateWindowResizeEvent(true);\n this.setStatic(true, false); // permanently removes DD but don't set CSS class (we're going away)\n this.setAnimation(false);\n if (!removeDOM) {\n this.removeAll(removeDOM);\n this.el.classList.remove(this._styleSheetClass);\n this.el.removeAttribute('gs-current-row');\n }\n else {\n this.el.parentNode.removeChild(this.el);\n }\n this._removeStylesheet();\n if (this.parentGridItem)\n delete this.parentGridItem.subGrid;\n delete this.parentGridItem;\n delete this.opts;\n delete this._placeholder;\n delete this.engine;\n delete this.el.gridstack; // remove circular dependency that would prevent a freeing\n delete this.el;\n return this;\n };\n /**\n * enable/disable floating widgets (default: `false`) See [example](http://gridstackjs.com/demo/float.html)\n */\n GridStack.prototype.float = function (val) {\n if (this.opts.float !== val) {\n this.opts.float = this.engine.float = val;\n this._triggerChangeEvent();\n }\n return this;\n };\n /**\n * get the current float mode\n */\n GridStack.prototype.getFloat = function () {\n return this.engine.float;\n };\n /**\n * Get the position of the cell under a pixel on screen.\n * @param position the position of the pixel to resolve in\n * absolute coordinates, as an object with top and left properties\n * @param useDocRelative if true, value will be based on document position vs parent position (Optional. Default false).\n * Useful when grid is within `position: relative` element\n *\n * Returns an object with properties `x` and `y` i.e. the column and row in the grid.\n */\n GridStack.prototype.getCellFromPixel = function (position, useDocRelative) {\n if (useDocRelative === void 0) { useDocRelative = false; }\n var box = this.el.getBoundingClientRect();\n // console.log(`getBoundingClientRect left: ${box.left} top: ${box.top} w: ${box.w} h: ${box.h}`)\n var containerPos;\n if (useDocRelative) {\n containerPos = { top: box.top + document.documentElement.scrollTop, left: box.left };\n // console.log(`getCellFromPixel scrollTop: ${document.documentElement.scrollTop}`)\n }\n else {\n containerPos = { top: this.el.offsetTop, left: this.el.offsetLeft };\n // console.log(`getCellFromPixel offsetTop: ${containerPos.left} offsetLeft: ${containerPos.top}`)\n }\n var relativeLeft = position.left - containerPos.left;\n var relativeTop = position.top - containerPos.top;\n var columnWidth = (box.width / this.getColumn());\n var rowHeight = (box.height / parseInt(this.el.getAttribute('gs-current-row')));\n return { x: Math.floor(relativeLeft / columnWidth), y: Math.floor(relativeTop / rowHeight) };\n };\n /** returns the current number of rows, which will be at least `minRow` if set */\n GridStack.prototype.getRow = function () {\n return Math.max(this.engine.getRow(), this.opts.minRow);\n };\n /**\n * Checks if specified area is empty.\n * @param x the position x.\n * @param y the position y.\n * @param w the width of to check\n * @param h the height of to check\n */\n GridStack.prototype.isAreaEmpty = function (x, y, w, h) {\n return this.engine.isAreaEmpty(x, y, w, h);\n };\n /**\n * If you add elements to your grid by hand (or have some framework creating DOM), you have to tell gridstack afterwards to make them widgets.\n * If you want gridstack to add the elements for you, use `addWidget()` instead.\n * Makes the given element a widget and returns it.\n * @param els widget or single selector to convert.\n * @param options widget definition to use instead of reading attributes or using default sizing values\n *\n * @example\n * let grid = GridStack.init();\n * grid.el.appendChild('<div id=\"1\" gs-w=\"3\"></div>');\n * grid.el.appendChild('<div id=\"2\"></div>');\n * grid.makeWidget('1');\n * grid.makeWidget('2', {w:2, content: 'hello'});\n */\n GridStack.prototype.makeWidget = function (els, options) {\n var el = GridStack.getElement(els);\n this._prepareElement(el, true, options);\n this._updateContainerHeight();\n // see if there is a sub-grid to create\n var node = el.gridstackNode;\n if (node.subGridOpts) {\n this.makeSubGrid(el, node.subGridOpts, undefined, false); // node.subGrid will be used as option in method, no need to pass\n }\n // if we're adding an item into 1 column (_prevColumn is set only when going to 1) make sure\n // we don't override the larger 12 column layout that was already saved. #1985\n if (this._prevColumn && this.opts.column === 1) {\n this._ignoreLayoutsNodeChange = true;\n }\n this._triggerAddEvent();\n this._triggerChangeEvent();\n delete this._ignoreLayoutsNodeChange;\n return el;\n };\n /**\n * Event handler that extracts our CustomEvent data out automatically for receiving custom\n * notifications (see doc for supported events)\n * @param name of the event (see possible values) or list of names space separated\n * @param callback function called with event and optional second/third param\n * (see README documentation for each signature).\n *\n * @example\n * grid.on('added', function(e, items) { log('added ', items)} );\n * or\n * grid.on('added removed change', function(e, items) { log(e.type, items)} );\n *\n * Note: in some cases it is the same as calling native handler and parsing the event.\n * grid.el.addEventListener('added', function(event) { log('added ', event.detail)} );\n *\n */\n GridStack.prototype.on = function (name, callback) {\n var _this = this;\n // check for array of names being passed instead\n if (name.indexOf(' ') !== -1) {\n var names = name.split(' ');\n names.forEach(function (name) { return _this.on(name, callback); });\n return this;\n }\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\n // native CustomEvent handlers - cash the generic handlers so we can easily remove\n var noData = (name === 'enable' || name === 'disable');\n if (noData) {\n this._gsEventHandler[name] = function (event) { return callback(event); };\n }\n else {\n this._gsEventHandler[name] = function (event) { return callback(event, event.detail); };\n }\n this.el.addEventListener(name, this._gsEventHandler[name]);\n }\n else if (name === 'drag' || name === 'dragstart' || name === 'dragstop' || name === 'resizestart' || name === 'resize' || name === 'resizestop' || name === 'dropped') {\n // drag&drop stop events NEED to be call them AFTER we update node attributes so handle them ourself.\n // do same for start event to make it easier...\n this._gsEventHandler[name] = callback;\n }\n else {\n console.log('GridStack.on(' + name + ') event not supported, but you can still use $(\".grid-stack\").on(...) while jquery-ui is still used internally.');\n }\n return this;\n };\n /**\n * unsubscribe from the 'on' event below\n * @param name of the event (see possible values)\n */\n GridStack.prototype.off = function (name) {\n var _this = this;\n // check for array of names being passed instead\n if (name.indexOf(' ') !== -1) {\n var names = name.split(' ');\n names.forEach(function (name) { return _this.off(name); });\n return this;\n }\n if (name === 'change' || name === 'added' || name === 'removed' || name === 'enable' || name === 'disable') {\n // remove native CustomEvent handlers\n if (this._gsEventHandler[name]) {\n this.el.removeEventListener(name, this._gsEventHandler[name]);\n }\n }\n delete this._gsEventHandler[name];\n return this;\n };\n /** remove all event handlers */\n GridStack.prototype.offAll = function () {\n var _this = this;\n Object.keys(this._gsEventHandler).forEach(function (key) { return _this.off(key); });\n return this;\n };\n /**\n * Removes widget from the grid.\n * @param el widget or selector to modify\n * @param removeDOM if `false` DOM element won't be removed from the tree (Default? true).\n * @param triggerEvent if `false` (quiet mode) element will not be added to removed list and no 'removed' callbacks will be called (Default? true).\n */\n GridStack.prototype.removeWidget = function (els, removeDOM, triggerEvent) {\n var _this = this;\n if (removeDOM === void 0) { removeDOM = true; }\n if (triggerEvent === void 0) { triggerEvent = true; }\n GridStack.getElements(els).forEach(function (el) {\n if (el.parentElement && el.parentElement !== _this.el)\n return; // not our child!\n var node = el.gridstackNode;\n // For Meteor support: https://github.com/gridstack/gridstack.js/pull/272\n if (!node) {\n node = _this.engine.nodes.find(function (n) { return el === n.el; });\n }\n if (!node)\n return;\n if (GridStack.addRemoveCB) {\n GridStack.addRemoveCB(_this.el, node, false, false);\n }\n // remove our DOM data (circular link) and drag&drop permanently\n delete el.gridstackNode;\n _this._removeDD(el);\n _this.engine.removeNode(node, removeDOM, triggerEvent);\n if (removeDOM && el.parentElement) {\n el.remove(); // in batch mode engine.removeNode doesn't call back to remove DOM\n }\n });\n if (triggerEvent) {\n this._triggerRemoveEvent();\n this._triggerChangeEvent();\n }\n return this;\n };\n /**\n * Removes all widgets from the grid.\n * @param removeDOM if `false` DOM elements won't be removed from the tree (Default? `true`).\n */\n GridStack.prototype.removeAll = function (removeDOM) {\n var _this = this;\n if (removeDOM === void 0) { removeDOM = true; }\n // always remove our DOM data (circular link) before list gets emptied and drag&drop permanently\n this.engine.nodes.forEach(function (n) {\n delete n.el.gridstackNode;\n _this._removeDD(n.el);\n });\n this.engine.removeAll(removeDOM);\n this._triggerRemoveEvent();\n return this;\n };\n /**\n * Toggle the grid animation state. Toggles the `grid-stack-animate` class.\n * @param doAnimate if true the grid will animate.\n */\n GridStack.prototype.setAnimation = function (doAnimate) {\n if (doAnimate) {\n this.el.classList.add('grid-stack-animate');\n }\n else {\n this.el.classList.remove('grid-stack-animate');\n }\n return this;\n };\n /**\n * Toggle the grid static state, which permanently removes/add Drag&Drop support, unlike disable()/enable() that just turns it off/on.\n * Also toggle the grid-stack-static class.\n * @param val if true the grid become static.\n * @param updateClass true (default) if css class gets updated\n * @param recurse true (default) if sub-grids also get updated\n */\n GridStack.prototype.setStatic = function (val, updateClass, recurse) {\n var _this = this;\n if (updateClass === void 0) { updateClass = true; }\n if (recurse === void 0) { recurse = true; }\n if (!!this.opts.staticGrid === val)\n return this;\n val ? this.opts.staticGrid = true : delete this.opts.staticGrid;\n this._setupRemoveDrop();\n this._setupAcceptWidget();\n this.engine.nodes.forEach(function (n) {\n _this._prepareDragDropByNode(n); // either delete or init Drag&drop\n if (n.subGrid && recurse)\n n.subGrid.setStatic(val, updateClass, recurse);\n });\n if (updateClass) {\n this._setStaticClass();\n }\n return this;\n };\n /**\n * Updates widget position/size and other info. Note: if you need to call this on all nodes, use load() instead which will update what changed.\n * @param els widget or selector of objects to modify (note: setting the same x,y for multiple items will be indeterministic and likely unwanted)\n * @param opt new widget options (x,y,w,h, etc..). Only those set will be updated.\n */\n GridStack.prototype.update = function (els, opt) {\n var _this = this;\n // support legacy call for now ?\n if (arguments.length > 2) {\n console.warn('gridstack.ts: `update(el, x, y, w, h)` is deprecated. Use `update(el, {x, w, content, ...})`. It will be removed soon');\n // eslint-disable-next-line prefer-rest-params\n var a = arguments, i = 1;\n opt = { x: a[i++], y: a[i++], w: a[i++], h: a[i++] };\n return this.update(els, opt);\n }\n GridStack.getElements(els).forEach(function (el) {\n if (!el || !el.gridstackNode)\n return;\n var n = el.gridstackNode;\n var w = utils_1.Utils.cloneDeep(opt); // make a copy we can modify in case they re-use it or multiple items\n delete w.autoPosition;\n // move/resize widget if anything changed\n var keys = ['x', 'y', 'w', 'h'];\n var m;\n if (keys.some(function (k) { return w[k] !== undefined && w[k] !== n[k]; })) {\n m = {};\n keys.forEach(function (k) {\n m[k] = (w[k] !== undefined) ? w[k] : n[k];\n delete w[k];\n });\n }\n // for a move as well IFF there is any min/max fields set\n if (!m && (w.minW || w.minH || w.maxW || w.maxH)) {\n m = {}; // will use node position but validate values\n }\n // check for content changing\n if (w.content) {\n var sub = el.querySelector('.grid-stack-item-content');\n if (sub && sub.innerHTML !== w.content) {\n sub.innerHTML = w.content;\n }\n delete w.content;\n }\n // any remaining fields are assigned, but check for dragging changes, resize constrain\n var changed = false;\n var ddChanged = false;\n for (var key in w) {\n if (key[0] !== '_' && n[key] !== w[key]) {\n n[key] = w[key];\n changed = true;\n ddChanged = ddChanged || (!_this.opts.staticGrid && (key === 'noResize' || key === 'noMove' || key === 'locked'));\n }\n }\n utils_1.Utils.sanitizeMinMax(n);\n // finally move the widget\n if (m) {\n _this.engine.cleanNodes()\n .beginUpdate(n)\n .moveNode(n, m);\n _this._updateContainerHeight();\n _this._triggerChangeEvent();\n _this.engine.endUpdate();\n }\n if (changed) { // move will only update x,y,w,h so update the rest too\n _this._writeAttr(el, n);\n }\n if (ddChanged) {\n _this._prepareDragDropByNode(n);\n }\n });\n return this;\n };\n /**\n * Updates the margins which will set all 4 sides at once - see `GridStackOptions.margin` for format options (CSS string format of 1,2,4 values or single number).\n * @param value margin value\n */\n GridStack.prototype.margin = function (value) {\n var isMultiValue = (typeof value === 'string' && value.split(' ').length > 1);\n // check if we can skip re-creating our CSS file... won't check if multi values (too much hassle)\n if (!isMultiValue) {\n var data = utils_1.Utils.parseHeight(value);\n if (this.opts.marginUnit === data.unit && this.opts.margin === data.h)\n return;\n }\n // re-use existing margin handling\n this.opts.margin = value;\n this.opts.marginTop = this.opts.marginBottom = this.opts.marginLeft = this.opts.marginRight = undefined;\n this._initMargin();\n this._updateStyles(true); // true = force re-create\n return this;\n };\n /** returns current margin number value (undefined if 4 sides don't match) */\n GridStack.prototype.getMargin = function () { return this.opts.margin; };\n /**\n * Returns true if the height of the grid will be less than the vertical\n * constraint. Always returns true if grid doesn't have height constraint.\n * @param node contains x,y,w,h,auto-position options\n *\n * @example\n * if (grid.willItFit(newWidget)) {\n * grid.addWidget(newWidget);\n * } else {\n * alert('Not enough free space to place the widget');\n * }\n */\n GridStack.prototype.willItFit = function (node) {\n // support legacy call for now\n if (arguments.length > 1) {\n console.warn('gridstack.ts: `willItFit(x,y,w,h,autoPosition)` is deprecated. Use `willItFit({x, y,...})`. It will be removed soon');\n // eslint-disable-next-line prefer-rest-params\n var a = arguments, i = 0, w = { x: a[i++], y: a[i++], w: a[i++], h: a[i++], autoPosition: a[i++] };\n return this.willItFit(w);\n }\n return this.engine.willItFit(node);\n };\n /** @internal */\n GridStack.prototype._triggerChangeEvent = function () {\n if (this.engine.batchMode)\n return this;\n var elements = this.engine.getDirtyNodes(true); // verify they really changed\n if (elements && elements.length) {\n if (!this._ignoreLayoutsNodeChange) {\n this.engine.layoutsNodesChange(elements);\n }\n this._triggerEvent('change', elements);\n }\n this.engine.saveInitial(); // we called, now reset initial values & dirty flags\n return this;\n };\n /** @internal */\n GridStack.prototype._triggerAddEvent = function () {\n var _a;\n if (this.engine.batchMode)\n return this;\n if ((_a = this.engine.addedNodes) === null || _a === void 0 ? void 0 : _a.length) {\n if (!this._ignoreLayoutsNodeChange) {\n this.engine.layoutsNodesChange(this.engine.addedNodes);\n }\n // prevent added nodes from also triggering 'change' event (which is called next)\n this.engine.addedNodes.forEach(function (n) { delete n._dirty; });\n this._triggerEvent('added', this.engine.addedNodes);\n this.engine.addedNodes = [];\n }\n return this;\n };\n /** @internal */\n GridStack.prototype._triggerRemoveEvent = function () {\n var _a;\n if (this.engine.batchMode)\n return this;\n if ((_a = this.engine.removedNodes) === null || _a === void 0 ? void 0 : _a.length) {\n this._triggerEvent('removed', this.engine.removedNodes);\n this.engine.removedNodes = [];\n }\n return this;\n };\n /** @internal */\n GridStack.prototype._triggerEvent = function (type, data) {\n var event = data ? new CustomEvent(type, { bubbles: false, detail: data }) : new Event(type);\n this.el.dispatchEvent(event);\n return this;\n };\n /** @internal called to delete the current dynamic style sheet used for our layout */\n GridStack.prototype._removeStylesheet = function () {\n if (this._styles) {\n utils_1.Utils.removeStylesheet(this._styleSheetClass);\n delete this._styles;\n }\n return this;\n };\n /** @internal updated/create the CSS styles for row based layout and initial margin setting */\n GridStack.prototype._updateStyles = function (forceUpdate, maxH) {\n if (forceUpdate === void 0) { forceUpdate = false; }\n // call to delete existing one if we change cellHeight / margin\n if (forceUpdate) {\n this._removeStylesheet();\n }\n if (!maxH)\n maxH = this.getRow();\n this._updateContainerHeight();\n // if user is telling us they will handle the CSS themselves by setting heights to 0. Do we need this opts really ??\n if (this.opts.cellHeight === 0) {\n return this;\n }\n var cellHeight = this.opts.cellHeight;\n var cellHeightUnit = this.opts.cellHeightUnit;\n var prefix = \".\".concat(this._styleSheetClass, \" > .\").concat(this.opts.itemClass);\n // create one as needed\n if (!this._styles) {\n // insert style to parent (instead of 'head' by default) to support WebComponent\n var styleLocation = this.opts.styleInHead ? undefined : this.el.parentNode;\n this._styles = utils_1.Utils.createStylesheet(this._styleSheetClass, styleLocation, {\n nonce: this.opts.nonce,\n });\n if (!this._styles)\n return this;\n this._styles._max = 0;\n // these are done once only\n utils_1.Utils.addCSSRule(this._styles, prefix, \"height: \".concat(cellHeight).concat(cellHeightUnit));\n // content margins\n var top_1 = this.opts.marginTop + this.opts.marginUnit;\n var bottom = this.opts.marginBottom + this.opts.marginUnit;\n var right = this.opts.marginRight + this.opts.marginUnit;\n var left = this.opts.marginLeft + this.opts.marginUnit;\n var content = \"\".concat(prefix, \" > .grid-stack-item-content\");\n var placeholder = \".\".concat(this._styleSheetClass, \" > .grid-stack-placeholder > .placeholder-content\");\n utils_1.Utils.addCSSRule(this._styles, content, \"top: \".concat(top_1, \"; right: \").concat(right, \"; bottom: \").concat(bottom, \"; left: \").concat(left, \";\"));\n utils_1.Utils.addCSSRule(this._styles, placeholder, \"top: \".concat(top_1, \"; right: \").concat(right, \"; bottom: \").concat(bottom, \"; left: \").concat(left, \";\"));\n // resize handles offset (to match margin)\n utils_1.Utils.addCSSRule(this._styles, \"\".concat(prefix, \" > .ui-resizable-ne\"), \"right: \".concat(right));\n utils_1.Utils.addCSSRule(this._styles, \"\".concat(prefix, \" > .ui-resizable-e\"), \"right: \".concat(right));\n utils_1.Utils.addCSSRule(this._styles, \"\".concat(prefix, \" > .ui-resizable-se\"), \"right: \".concat(right, \"; bottom: \").concat(bottom));\n utils_1.Utils.addCSSRule(this._styles, \"\".concat(prefix, \" > .ui-resizable-nw\"), \"left: \".concat(left));\n utils_1.Utils.addCSSRule(this._styles, \"\".concat(prefix, \" > .ui-resizable-w\"), \"left: \".concat(left));\n utils_1.Utils.addCSSRule(this._styles, \"\".concat(prefix, \" > .ui-resizable-sw\"), \"left: \".concat(left, \"; bottom: \").concat(bottom));\n }\n // now update the height specific fields\n maxH = maxH || this._styles._max;\n if (maxH > this._styles._max) {\n var getHeight = function (rows) { return (cellHeight * rows) + cellHeightUnit; };\n for (var i = this._styles._max + 1; i <= maxH; i++) { // start at 1\n utils_1.Utils.addCSSRule(this._styles, \"\".concat(prefix, \"[gs-y=\\\"\").concat(i, \"\\\"]\"), \"top: \".concat(getHeight(i)));\n utils_1.Utils.addCSSRule(this._styles, \"\".concat(prefix, \"[gs-h=\\\"\").concat(i + 1, \"\\\"]\"), \"height: \".concat(getHeight(i + 1))); // start at 2\n }\n this._styles._max = maxH;\n }\n return this;\n };\n /** @internal */\n GridStack.prototype._updateContainerHeight = function () {\n if (!this.engine || this.engine.batchMode)\n return this;\n var row = this.getRow() + this._extraDragRow; // checks for minRow already\n // check for css min height\n // Note: we don't handle %,rem correctly so comment out, beside we don't need need to create un-necessary\n // rows as the CSS will make us bigger than our set height if needed... not sure why we had this.\n // let cssMinHeight = parseInt(getComputedStyle(this.el)['min-height']);\n // if (cssMinHeight > 0) {\n // let minRow = Math.round(cssMinHeight / this.getCellHeight(true));\n // if (row < minRow) {\n // row = minRow;\n // }\n // }\n this.el.setAttribute('gs-current-row', String(row));\n if (row === 0) {\n this.el.style.removeProperty('min-height');\n return this;\n }\n var cellHeight = this.opts.cellHeight;\n var unit = this.opts.cellHeightUnit;\n if (!cellHeight)\n return this;\n this.el.style.minHeight = row * cellHeight + unit;\n return this;\n };\n /** @internal */\n GridStack.prototype._prepareElement = function (el, triggerAddEvent, node) {\n if (triggerAddEvent === void 0) { triggerAddEvent = false; }\n el.classList.add(this.opts.itemClass);\n node = node || this._readAttr(el);\n el.gridstackNode = node;\n node.el = el;\n node.grid = this;\n var copy = __assign({}, node);\n node = this.engine.addNode(node, triggerAddEvent);\n // write node attr back in case there was collision or we have to fix bad values during addNode()\n if (!utils_1.Utils.same(node, copy)) {\n this._writeAttr(el, node);\n }\n this._prepareDragDropByNode(node);\n return this;\n };\n /** @internal call to write position x,y,w,h attributes back to element */\n GridStack.prototype._writePosAttr = function (el, n) {\n if (n.x !== undefined && n.x !== null) {\n el.setAttribute('gs-x', String(n.x));\n }\n if (n.y !== undefined && n.y !== null) {\n el.setAttribute('gs-y', String(n.y));\n }\n n.w > 1 ? el.setAttribute('gs-w', String(n.w)) : el.removeAttribute('gs-w');\n n.h > 1 ? el.setAttribute('gs-h', String(n.h)) : el.removeAttribute('gs-h');\n return this;\n };\n /** @internal call to write any default attributes back to element */\n GridStack.prototype._writeAttr = function (el, node) {\n if (!node)\n return this;\n this._writePosAttr(el, node);\n var attrs /*: GridStackWidget but strings */ = {\n autoPosition: 'gs-auto-position',\n noResize: 'gs-no-resize',\n noMove: 'gs-no-move',\n locked: 'gs-locked',\n id: 'gs-id',\n };\n for (var key in attrs) {\n if (node[key]) { // 0 is valid for x,y only but done above already and not in list anyway\n el.setAttribute(attrs[key], String(node[key]));\n }\n else {\n el.removeAttribute(attrs[key]);\n }\n }\n return this;\n };\n /** @internal call to read any default attributes from element */\n GridStack.prototype._readAttr = function (el, clearDefaultAttr) {\n if (clearDefaultAttr === void 0) { clearDefaultAttr = true; }\n var n = {};\n n.x = utils_1.Utils.toNumber(el.getAttribute('gs-x'));\n n.y = utils_1.Utils.toNumber(el.getAttribute('gs-y'));\n n.w = utils_1.Utils.toNumber(el.getAttribute('gs-w'));\n n.h = utils_1.Utils.toNumber(el.getAttribute('gs-h'));\n n.autoPosition = utils_1.Utils.toBool(el.getAttribute('gs-auto-position'));\n n.noResize = utils_1.Utils.toBool(el.getAttribute('gs-no-resize'));\n n.noMove = utils_1.Utils.toBool(el.getAttribute('gs-no-move'));\n n.locked = utils_1.Utils.toBool(el.getAttribute('gs-locked'));\n n.id = el.getAttribute('gs-id');\n // read but never written out\n n.maxW = utils_1.Utils.toNumber(el.getAttribute('gs-max-w'));\n n.minW = utils_1.Utils.toNumber(el.getAttribute('gs-min-w'));\n n.maxH = utils_1.Utils.toNumber(el.getAttribute('gs-max-h'));\n n.minH = utils_1.Utils.toNumber(el.getAttribute('gs-min-h'));\n // v8.x optimization to reduce un-needed attr that don't render or are default CSS\n if (clearDefaultAttr) {\n if (n.w === 1)\n el.removeAttribute('gs-w');\n if (n.h === 1)\n el.removeAttribute('gs-h');\n if (n.maxW)\n el.removeAttribute('gs-max-w');\n if (n.minW)\n el.removeAttribute('gs-min-w');\n if (n.maxH)\n el.removeAttribute('gs-max-h');\n if (n.minH)\n el.removeAttribute('gs-min-h');\n }\n // remove any key not found (null or false which is default)\n for (var key in n) {\n if (!n.hasOwnProperty(key))\n return;\n if (!n[key] && n[key] !== 0) { // 0 can be valid value (x,y only really)\n delete n[key];\n }\n }\n return n;\n };\n /** @internal */\n GridStack.prototype._setStaticClass = function () {\n var _a, _b;\n var classes = ['grid-stack-static'];\n if (this.opts.staticGrid) {\n (_a = this.el.classList).add.apply(_a, classes);\n this.el.setAttribute('gs-static', 'true');\n }\n else {\n (_b = this.el.classList).remove.apply(_b, classes);\n this.el.removeAttribute('gs-static');\n }\n return this;\n };\n /**\n * called when we are being resized by the window - check if the one Column Mode needs to be turned on/off\n * and remember the prev columns we used, or get our count from parent, as well as check for auto cell height (square)\n */\n GridStack.prototype.onParentResize = function () {\n var _this = this;\n if (!this.el || !this.el.clientWidth)\n return; // return if we're gone or no size yet (will get called again)\n var changedColumn = false;\n // see if we're nested and take our column count from our parent....\n if (this._autoColumn && this.parentGridItem) {\n if (this.opts.column !== this.parentGridItem.w) {\n changedColumn = true;\n this.column(this.parentGridItem.w, 'none');\n }\n }\n else {\n // else check for 1 column in/out behavior\n var oneColumn = !this.opts.disableOneColumnMode && this.el.clientWidth <= this.opts.oneColumnSize;\n if ((this.opts.column === 1) !== oneColumn) {\n changedColumn = true;\n if (this.opts.animate) {\n this.setAnimation(false);\n } // 1 <-> 12 is too radical, turn off animation\n this.column(oneColumn ? 1 : this._prevColumn);\n if (this.opts.animate) {\n this.setAnimation(true);\n }\n }\n }\n // make the cells content square again\n if (this._isAutoCellHeight) {\n if (!changedColumn && this.opts.cellHeightThrottle) {\n if (!this._cellHeightThrottle) {\n this._cellHeightThrottle = utils_1.Utils.throttle(function () { return _this.cellHeight(); }, this.opts.cellHeightThrottle);\n }\n this._cellHeightThrottle();\n }\n else {\n // immediate update if we've changed column count or have no threshold\n this.cellHeight();\n }\n }\n // finally update any nested grids\n this.engine.nodes.forEach(function (n) {\n if (n.subGrid)\n n.subGrid.onParentResize();\n });\n return this;\n };\n /** add or remove the window size event handler */\n GridStack.prototype._updateWindowResizeEvent = function (forceRemove) {\n if (forceRemove === void 0) { forceRemove = false; }\n // only add event if we're not nested (parent will call us) and we're auto sizing cells or supporting oneColumn (i.e. doing work)\n var workTodo = (this._isAutoCellHeight || !this.opts.disableOneColumnMode) && !this.parentGridItem;\n if (!forceRemove && workTodo && !this._windowResizeBind) {\n this._windowResizeBind = this.onParentResize.bind(this); // so we can properly remove later\n window.addEventListener('resize', this._windowResizeBind);\n }\n else if ((forceRemove || !workTodo) && this._windowResizeBind) {\n window.removeEventListener('resize', this._windowResizeBind);\n delete this._windowResizeBind; // remove link to us so we can free\n }\n return this;\n };\n /** @internal convert a potential selector into actual element */\n GridStack.getElement = function (els) {\n if (els === void 0) { els = '.grid-stack-item'; }\n return utils_1.Utils.getElement(els);\n };\n /** @internal */\n GridStack.getElements = function (els) {\n if (els === void 0) { els = '.grid-stack-item'; }\n return utils_1.Utils.getElements(els);\n };\n /** @internal */\n GridStack.getGridElement = function (els) { return GridStack.getElement(els); };\n /** @internal */\n GridStack.getGridElements = function (els) { return utils_1.Utils.getElements(els); };\n /** @internal initialize margin top/bottom/left/right and units */\n GridStack.prototype._initMargin = function () {\n var data;\n var margin = 0;\n // support passing multiple values like CSS (ex: '5px 10px 0 20px')\n var margins = [];\n if (typeof this.opts.margin === 'string') {\n margins = this.opts.margin.split(' ');\n }\n if (margins.length === 2) { // top/bot, left/right like CSS\n this.opts.marginTop = this.opts.marginBottom = margins[0];\n this.opts.marginLeft = this.opts.marginRight = margins[1];\n }\n else if (margins.length === 4) { // Clockwise like CSS\n this.opts.marginTop = margins[0];\n this.opts.marginRight = margins[1];\n this.opts.marginBottom = margins[2];\n this.opts.marginLeft = margins[3];\n }\n else {\n data = utils_1.Utils.parseHeight(this.opts.margin);\n this.opts.marginUnit = data.unit;\n margin = this.opts.margin = data.h;\n }\n // see if top/bottom/left/right need to be set as well\n if (this.opts.marginTop === undefined) {\n this.opts.marginTop = margin;\n }\n else {\n data = utils_1.Utils.parseHeight(this.opts.marginTop);\n this.opts.marginTop = data.h;\n delete this.opts.margin;\n }\n if (this.opts.marginBottom === undefined) {\n this.opts.marginBottom = margin;\n }\n else {\n data = utils_1.Utils.parseHeight(this.opts.marginBottom);\n this.opts.marginBottom = data.h;\n delete this.opts.margin;\n }\n if (this.opts.marginRight === undefined) {\n this.opts.marginRight = margin;\n }\n else {\n data = utils_1.Utils.parseHeight(this.opts.marginRight);\n this.opts.marginRight = data.h;\n delete this.opts.margin;\n }\n if (this.opts.marginLeft === undefined) {\n this.opts.marginLeft = margin;\n }\n else {\n data = utils_1.Utils.parseHeight(this.opts.marginLeft);\n this.opts.marginLeft = data.h;\n delete this.opts.margin;\n }\n this.opts.marginUnit = data.unit; // in case side were spelled out, use those units instead...\n if (this.opts.marginTop === this.opts.marginBottom && this.opts.marginLeft === this.opts.marginRight && this.opts.marginTop === this.opts.marginRight) {\n this.opts.margin = this.opts.marginTop; // makes it easier to check for no-ops in setMargin()\n }\n return this;\n };\n /* ===========================================================================================\n * drag&drop methods that used to be stubbed out and implemented in dd-gridstack.ts\n * but caused loading issues in prod - see https://github.com/gridstack/gridstack.js/issues/2039\n * ===========================================================================================\n */\n /** get the global (but static to this code) DD implementation */\n GridStack.getDD = function () {\n return dd;\n };\n /**\n * call to setup dragging in from the outside (say toolbar), by specifying the class selection and options.\n * Called during GridStack.init() as options, but can also be called directly (last param are used) in case the toolbar\n * is dynamically create and needs to be set later.\n * @param dragIn string selector (ex: '.sidebar .grid-stack-item') or list of dom elements\n * @param dragInOptions options - see DDDragInOpt. (default: {handle: '.grid-stack-item-content', appendTo: 'body'}\n * @param root optional root which defaults to document (for shadow dom pas the parent HTMLDocument)\n **/\n GridStack.setupDragIn = function (dragIn, dragInOptions, root) {\n if (root === void 0) { root = document; }\n if ((dragInOptions === null || dragInOptions === void 0 ? void 0 : dragInOptions.pause) !== undefined) {\n dd_manager_1.DDManager.pauseDrag = dragInOptions.pause;\n }\n dragInOptions = __assign(__assign({}, types_1.dragInDefaultOptions), (dragInOptions || {}));\n var els = (typeof dragIn === 'string') ? utils_1.Utils.getElements(dragIn, root) : dragIn;\n if (els.length)\n els === null || els === void 0 ? void 0 : els.forEach(function (el) {\n if (!dd.isDraggable(el))\n dd.dragIn(el, dragInOptions);\n });\n };\n /**\n * Enables/Disables dragging by the user of specific grid element. If you want all items, and have it affect future items, use enableMove() instead. No-op for static grids.\n * IF you are looking to prevent an item from moving (due to being pushed around by another during collision) use locked property instead.\n * @param els widget or selector to modify.\n * @param val if true widget will be draggable, assuming the parent grid isn't noMove or static.\n */\n GridStack.prototype.movable = function (els, val) {\n var _this = this;\n if (this.opts.staticGrid)\n return this; // can't move a static grid!\n GridStack.getElements(els).forEach(function (el) {\n var n = el.gridstackNode;\n if (!n)\n return;\n val ? delete n.noMove : n.noMove = true;\n _this._prepareDragDropByNode(n); // init DD if need be, and adjust\n });\n return this;\n };\n /**\n * Enables/Disables user resizing of specific grid element. If you want all items, and have it affect future items, use enableResize() instead. No-op for static grids.\n * @param els widget or selector to modify\n * @param val if true widget will be resizable, assuming the parent grid isn't noResize or static.\n */\n GridStack.prototype.resizable = function (els, val) {\n var _this = this;\n if (this.opts.staticGrid)\n return this; // can't resize a static grid!\n GridStack.getElements(els).forEach(function (el) {\n var n = el.gridstackNode;\n if (!n)\n return;\n val ? delete n.noResize : n.noResize = true;\n _this._prepareDragDropByNode(n); // init DD if need be, and adjust\n });\n return this;\n };\n /**\n * Temporarily disables widgets moving/resizing.\n * If you want a more permanent way (which freezes up resources) use `setStatic(true)` instead.\n * Note: no-op for static grid\n * This is a shortcut for:\n * @example\n * grid.enableMove(false);\n * grid.enableResize(false);\n * @param recurse true (default) if sub-grids also get updated\n */\n GridStack.prototype.disable = function (recurse) {\n if (recurse === void 0) { recurse = true; }\n if (this.opts.staticGrid)\n return;\n this.enableMove(false, recurse);\n this.enableResize(false, recurse);\n this._triggerEvent('disable');\n return this;\n };\n /**\n * Re-enables widgets moving/resizing - see disable().\n * Note: no-op for static grid.\n * This is a shortcut for:\n * @example\n * grid.enableMove(true);\n * grid.enableResize(true);\n * @param recurse true (default) if sub-grids also get updated\n */\n GridStack.prototype.enable = function (recurse) {\n if (recurse === void 0) { recurse = true; }\n if (this.opts.staticGrid)\n return;\n this.enableMove(true, recurse);\n this.enableResize(true, recurse);\n this._triggerEvent('enable');\n return this;\n };\n /**\n * Enables/disables widget moving. No-op for static grids, and locally defined items still overrule\n * @param recurse true (default) if sub-grids also get updated\n */\n GridStack.prototype.enableMove = function (doEnable, recurse) {\n var _this = this;\n if (recurse === void 0) { recurse = true; }\n if (this.opts.staticGrid)\n return this; // can't move a static grid!\n doEnable ? delete this.opts.disableDrag : this.opts.disableDrag = true; // FIRST before we update children as grid overrides #1658\n this.engine.nodes.forEach(function (n) {\n _this._prepareDragDropByNode(n);\n if (n.subGrid && recurse)\n n.subGrid.enableMove(doEnable, recurse);\n });\n return this;\n };\n /**\n * Enables/disables widget resizing. No-op for static grids.\n * @param recurse true (default) if sub-grids also get updated\n */\n GridStack.prototype.enableResize = function (doEnable, recurse) {\n var _this = this;\n if (recurse === void 0) { recurse = true; }\n if (this.opts.staticGrid)\n return this; // can't size a static grid!\n doEnable ? delete this.opts.disableResize : this.opts.disableResize = true; // FIRST before we update children as grid overrides #1658\n this.engine.nodes.forEach(function (n) {\n _this._prepareDragDropByNode(n);\n if (n.subGrid && recurse)\n n.subGrid.enableResize(doEnable, recurse);\n });\n return this;\n };\n /** @internal removes any drag&drop present (called during destroy) */\n GridStack.prototype._removeDD = function (el) {\n dd.draggable(el, 'destroy').resizable(el, 'destroy');\n if (el.gridstackNode) {\n delete el.gridstackNode._initDD; // reset our DD init flag\n }\n delete el.ddElement;\n return this;\n };\n /** @internal called to add drag over to support widgets being added externally */\n GridStack.prototype._setupAcceptWidget = function () {\n var _this = this;\n // check if we need to disable things\n if (this.opts.staticGrid || (!this.opts.acceptWidgets && !this.opts.removable)) {\n dd.droppable(this.el, 'destroy');\n return this;\n }\n // vars shared across all methods\n var cellHeight, cellWidth;\n var onDrag = function (event, el, helper) {\n var _a;\n var node = el.gridstackNode;\n if (!node)\n return;\n helper = helper || el;\n var parent = _this.el.getBoundingClientRect();\n var top = (_a = helper.getBoundingClientRect(), _a.top), left = _a.left;\n left -= parent.left;\n top -= parent.top;\n var ui = { position: { top: top, left: left } };\n if (node._temporaryRemoved) {\n node.x = Math.max(0, Math.round(left / cellWidth));\n node.y = Math.max(0, Math.round(top / cellHeight));\n delete node.autoPosition;\n _this.engine.nodeBoundFix(node);\n // don't accept *initial* location if doesn't fit #1419 (locked drop region, or can't grow), but maybe try if it will go somewhere\n if (!_this.engine.willItFit(node)) {\n node.autoPosition = true; // ignore x,y and try for any slot...\n if (!_this.engine.willItFit(node)) {\n dd.off(el, 'drag'); // stop calling us\n return; // full grid or can't grow\n }\n if (node._willFitPos) {\n // use the auto position instead #1687\n utils_1.Utils.copyPos(node, node._willFitPos);\n delete node._willFitPos;\n }\n }\n // re-use the existing node dragging method\n _this._onStartMoving(helper, event, ui, node, cellWidth, cellHeight);\n }\n else {\n // re-use the existing node dragging that does so much of the collision detection\n _this._dragOrResize(helper, event, ui, node, cellWidth, cellHeight);\n }\n };\n dd.droppable(this.el, {\n accept: function (el) {\n var node = el.gridstackNode;\n // set accept drop to true on ourself (which we ignore) so we don't get \"can't drop\" icon in HTML5 mode while moving\n if ((node === null || node === void 0 ? void 0 : node.grid) === _this)\n return true;\n if (!_this.opts.acceptWidgets)\n return false;\n // check for accept method or class matching\n var canAccept = true;\n if (typeof _this.opts.acceptWidgets === 'function') {\n canAccept = _this.opts.acceptWidgets(el);\n }\n else {\n var selector = (_this.opts.acceptWidgets === true ? '.grid-stack-item' : _this.opts.acceptWidgets);\n canAccept = el.matches(selector);\n }\n // finally check to make sure we actually have space left #1571\n if (canAccept && node && _this.opts.maxRow) {\n var n = { w: node.w, h: node.h, minW: node.minW, minH: node.minH }; // only width/height matters and autoPosition\n canAccept = _this.engine.willItFit(n);\n }\n return canAccept;\n }\n })\n /**\n * entering our grid area\n */\n .on(this.el, 'dropover', function (event, el, helper) {\n // console.log(`over ${this.el.gridstack.opts.id} ${count++}`); // TEST\n var node = el.gridstackNode;\n // ignore drop enter on ourself (unless we temporarily removed) which happens on a simple drag of our item\n if ((node === null || node === void 0 ? void 0 : node.grid) === _this && !node._temporaryRemoved) {\n // delete node._added; // reset this to track placeholder again in case we were over other grid #1484 (dropout doesn't always clear)\n return false; // prevent parent from receiving msg (which may be a grid as well)\n }\n // fix #1578 when dragging fast, we may not get a leave on the previous grid so force one now\n if ((node === null || node === void 0 ? void 0 : node.grid) && node.grid !== _this && !node._temporaryRemoved) {\n // console.log('dropover without leave'); // TEST\n var otherGrid = node.grid;\n otherGrid._leave(el, helper);\n }\n // cache cell dimensions (which don't change), position can animate if we removed an item in otherGrid that affects us...\n cellWidth = _this.cellWidth();\n cellHeight = _this.getCellHeight(true);\n // load any element attributes if we don't have a node\n if (!node) {\n node = _this._readAttr(el, false); // don't wipe external (e.g. drag toolbar) attr #2354\n }\n if (!node.grid) {\n node._isExternal = true;\n el.gridstackNode = node;\n }\n // calculate the grid size based on element outer size\n helper = helper || el;\n var w = node.w || Math.round(helper.offsetWidth / cellWidth) || 1;\n var h = node.h || Math.round(helper.offsetHeight / cellHeight) || 1;\n // if the item came from another grid, make a copy and save the original info in case we go back there\n if (node.grid && node.grid !== _this) {\n // copy the node original values (min/max/id/etc...) but override width/height/other flags which are this grid specific\n // console.log('dropover cloning node'); // TEST\n if (!el._gridstackNodeOrig)\n el._gridstackNodeOrig = node; // shouldn't have multiple nested!\n el.gridstackNode = node = __assign(__assign({}, node), { w: w, h: h, grid: _this });\n _this.engine.cleanupNode(node)\n .nodeBoundFix(node);\n // restore some internal fields we need after clearing them all\n node._initDD =\n node._isExternal = // DOM needs to be re-parented on a drop\n node._temporaryRemoved = true; // so it can be inserted onDrag below\n }\n else {\n node.w = w;\n node.h = h;\n node._temporaryRemoved = true; // so we can insert it\n }\n // clear any marked for complete removal (Note: don't check _isAboutToRemove as that is cleared above - just do it)\n _this._itemRemoving(node.el, false);\n dd.on(el, 'drag', onDrag);\n // make sure this is called at least once when going fast #1578\n onDrag(event, el, helper);\n return false; // prevent parent from receiving msg (which may be a grid as well)\n })\n /**\n * Leaving our grid area...\n */\n .on(this.el, 'dropout', function (event, el, helper) {\n // console.log(`out ${this.el.gridstack.opts.id} ${count++}`); // TEST\n var node = el.gridstackNode;\n if (!node)\n return false;\n // fix #1578 when dragging fast, we might get leave after other grid gets enter (which calls us to clean)\n // so skip this one if we're not the active grid really..\n if (!node.grid || node.grid === _this) {\n _this._leave(el, helper);\n // if we were created as temporary nested grid, go back to before state\n if (_this._isTemp) {\n _this.removeAsSubGrid(node);\n }\n }\n return false; // prevent parent from receiving msg (which may be grid as well)\n })\n /**\n * end - releasing the mouse\n */\n .on(this.el, 'drop', function (event, el, helper) {\n var _a, _b;\n var node = el.gridstackNode;\n // ignore drop on ourself from ourself that didn't come from the outside - dragend will handle the simple move instead\n if ((node === null || node === void 0 ? void 0 : node.grid) === _this && !node._isExternal)\n return false;\n var wasAdded = !!_this.placeholder.parentElement; // skip items not actually added to us because of constrains, but do cleanup #1419\n _this.placeholder.remove();\n // notify previous grid of removal\n // console.log('drop delete _gridstackNodeOrig') // TEST\n var origNode = el._gridstackNodeOrig;\n delete el._gridstackNodeOrig;\n if (wasAdded && (origNode === null || origNode === void 0 ? void 0 : origNode.grid) && origNode.grid !== _this) {\n var oGrid = origNode.grid;\n oGrid.engine.removedNodes.push(origNode);\n oGrid._triggerRemoveEvent()._triggerChangeEvent();\n // if it's an empty sub-grid that got auto-created, nuke it\n if (oGrid.parentGridItem && !oGrid.engine.nodes.length && oGrid.opts.subGridDynamic) {\n oGrid.removeAsSubGrid();\n }\n }\n if (!node)\n return false;\n // use existing placeholder node as it's already in our list with drop location\n if (wasAdded) {\n _this.engine.cleanupNode(node); // removes all internal _xyz values\n node.grid = _this;\n }\n dd.off(el, 'drag');\n // if we made a copy ('helper' which is temp) of the original node then insert a copy, else we move the original node (#1102)\n // as the helper will be nuked by jquery-ui otherwise. TODO: update old code path\n if (helper !== el) {\n helper.remove();\n el.gridstackNode = origNode; // original item (left behind) is re-stored to pre dragging as the node now has drop info\n if (wasAdded) {\n el = el.cloneNode(true);\n }\n }\n else {\n el.remove(); // reduce flicker as we change depth here, and size further down\n _this._removeDD(el);\n }\n if (!wasAdded)\n return false;\n el.gridstackNode = node;\n node.el = el;\n var subGrid = (_b = (_a = node.subGrid) === null || _a === void 0 ? void 0 : _a.el) === null || _b === void 0 ? void 0 : _b.gridstack; // set when actual sub-grid present\n // @ts-ignore\n utils_1.Utils.copyPos(node, _this._readAttr(_this.placeholder)); // placeholder values as moving VERY fast can throw things off #1578\n utils_1.Utils.removePositioningStyles(el); // @ts-ignore\n _this._writeAttr(el, node);\n el.classList.add(types_1.gridDefaults.itemClass, _this.opts.itemClass);\n _this.el.appendChild(el); // @ts-ignore // TODO: now would be ideal time to _removeHelperStyle() overriding floating styles (native only)\n if (subGrid) {\n subGrid.parentGridItem = node;\n if (!subGrid.opts.styleInHead)\n subGrid._updateStyles(true); // re-create sub-grid styles now that we've moved\n }\n _this._updateContainerHeight();\n _this.engine.addedNodes.push(node); // @ts-ignore\n _this._triggerAddEvent(); // @ts-ignore\n _this._triggerChangeEvent();\n _this.engine.endUpdate();\n if (_this._gsEventHandler['dropped']) {\n _this._gsEventHandler['dropped'](__assign(__assign({}, event), { type: 'dropped' }), origNode && origNode.grid ? origNode : undefined, node);\n }\n // wait till we return out of the drag callback to set the new drag&resize handler or they may get messed up\n window.setTimeout(function () {\n // IFF we are still there (some application will use as placeholder and insert their real widget instead and better call makeWidget())\n if (node.el && node.el.parentElement) {\n _this._prepareDragDropByNode(node);\n }\n else {\n _this.engine.removeNode(node);\n }\n delete node.grid._isTemp;\n });\n return false; // prevent parent from receiving msg (which may be grid as well)\n });\n return this;\n };\n /** @internal mark item for removal */\n GridStack.prototype._itemRemoving = function (el, remove) {\n var node = el ? el.gridstackNode : undefined;\n if (!node || !node.grid)\n return;\n remove ? node._isAboutToRemove = true : delete node._isAboutToRemove;\n remove ? el.classList.add('grid-stack-item-removing') : el.classList.remove('grid-stack-item-removing');\n };\n /** @internal called to setup a trash drop zone if the user specifies it */\n GridStack.prototype._setupRemoveDrop = function () {\n var _this = this;\n if (!this.opts.staticGrid && typeof this.opts.removable === 'string') {\n var trashEl = document.querySelector(this.opts.removable);\n if (!trashEl)\n return this;\n // only register ONE drop-over/dropout callback for the 'trash', and it will\n // update the passed in item and parent grid because the 'trash' is a shared resource anyway,\n // and Native DD only has 1 event CB (having a list and technically a per grid removableOptions complicates things greatly)\n if (!dd.isDroppable(trashEl)) {\n dd.droppable(trashEl, this.opts.removableOptions)\n .on(trashEl, 'dropover', function (event, el) { return _this._itemRemoving(el, true); })\n .on(trashEl, 'dropout', function (event, el) { return _this._itemRemoving(el, false); });\n }\n }\n return this;\n };\n /** @internal prepares the element for drag&drop **/\n GridStack.prototype._prepareDragDropByNode = function (node) {\n var _this = this;\n var el = node.el;\n var noMove = node.noMove || this.opts.disableDrag;\n var noResize = node.noResize || this.opts.disableResize;\n // check for disabled grid first\n if (this.opts.staticGrid || (noMove && noResize)) {\n if (node._initDD) {\n this._removeDD(el); // nukes everything instead of just disable, will add some styles back next\n delete node._initDD;\n }\n el.classList.add('ui-draggable-disabled', 'ui-resizable-disabled'); // add styles one might depend on #1435\n return this;\n }\n if (!node._initDD) {\n // variables used/cashed between the 3 start/move/end methods, in addition to node passed above\n var cellWidth_1;\n var cellHeight_1;\n /** called when item starts moving/resizing */\n var onStartMoving = function (event, ui) {\n // trigger any 'dragstart' / 'resizestart' manually\n if (_this._gsEventHandler[event.type]) {\n _this._gsEventHandler[event.type](event, event.target);\n }\n cellWidth_1 = _this.cellWidth();\n cellHeight_1 = _this.getCellHeight(true); // force pixels for calculations\n _this._onStartMoving(el, event, ui, node, cellWidth_1, cellHeight_1);\n };\n /** called when item is being dragged/resized */\n var dragOrResize = function (event, ui) {\n _this._dragOrResize(el, event, ui, node, cellWidth_1, cellHeight_1);\n };\n /** called when the item stops moving/resizing */\n var onEndMoving = function (event) {\n _this.placeholder.remove();\n delete node._moving;\n delete node._event;\n delete node._lastTried;\n // if the item has moved to another grid, we're done here\n var target = event.target;\n if (!target.gridstackNode || target.gridstackNode.grid !== _this)\n return;\n node.el = target;\n if (node._isAboutToRemove) {\n var gridToNotify = el.gridstackNode.grid;\n if (gridToNotify._gsEventHandler[event.type]) {\n gridToNotify._gsEventHandler[event.type](event, target);\n }\n _this._removeDD(el);\n gridToNotify.engine.removedNodes.push(node);\n gridToNotify._triggerRemoveEvent();\n // break circular links and remove DOM\n delete el.gridstackNode;\n delete node.el;\n el.remove();\n }\n else {\n utils_1.Utils.removePositioningStyles(target);\n if (node._temporaryRemoved) {\n // got removed - restore item back to before dragging position\n utils_1.Utils.copyPos(node, node._orig); // @ts-ignore\n _this._writePosAttr(target, node);\n _this.engine.addNode(node);\n }\n else {\n // move to new placeholder location\n _this._writePosAttr(target, node);\n }\n if (_this._gsEventHandler[event.type]) {\n _this._gsEventHandler[event.type](event, target);\n }\n }\n // @ts-ignore\n _this._extraDragRow = 0; // @ts-ignore\n _this._updateContainerHeight(); // @ts-ignore\n _this._triggerChangeEvent();\n _this.engine.endUpdate();\n };\n dd.draggable(el, {\n start: onStartMoving,\n stop: onEndMoving,\n drag: dragOrResize\n }).resizable(el, {\n start: onStartMoving,\n stop: onEndMoving,\n resize: dragOrResize\n });\n node._initDD = true; // we've set DD support now\n }\n // finally fine tune move vs resize by disabling any part...\n dd.draggable(el, noMove ? 'disable' : 'enable')\n .resizable(el, noResize ? 'disable' : 'enable');\n return this;\n };\n /** @internal handles actual drag/resize start **/\n GridStack.prototype._onStartMoving = function (el, event, ui, node, cellWidth, cellHeight) {\n this.engine.cleanNodes()\n .beginUpdate(node);\n // @ts-ignore\n this._writePosAttr(this.placeholder, node);\n this.el.appendChild(this.placeholder);\n // console.log('_onStartMoving placeholder') // TEST\n node.el = this.placeholder;\n node._lastUiPosition = ui.position;\n node._prevYPix = ui.position.top;\n node._moving = (event.type === 'dragstart'); // 'dropover' are not initially moving so they can go exactly where they enter (will push stuff out of the way)\n delete node._lastTried;\n if (event.type === 'dropover' && node._temporaryRemoved) {\n // console.log('engine.addNode x=' + node.x); // TEST\n this.engine.addNode(node); // will add, fix collisions, update attr and clear _temporaryRemoved\n node._moving = true; // AFTER, mark as moving object (wanted fix location before)\n }\n // set the min/max resize info\n this.engine.cacheRects(cellWidth, cellHeight, this.opts.marginTop, this.opts.marginRight, this.opts.marginBottom, this.opts.marginLeft);\n if (event.type === 'resizestart') {\n dd.resizable(el, 'option', 'minWidth', cellWidth * (node.minW || 1))\n .resizable(el, 'option', 'minHeight', cellHeight * (node.minH || 1));\n if (node.maxW) {\n dd.resizable(el, 'option', 'maxWidth', cellWidth * node.maxW);\n }\n if (node.maxH) {\n dd.resizable(el, 'option', 'maxHeight', cellHeight * node.maxH);\n }\n }\n };\n /** @internal handles actual drag/resize **/\n GridStack.prototype._dragOrResize = function (el, event, ui, node, cellWidth, cellHeight) {\n var p = __assign({}, node._orig); // could be undefined (_isExternal) which is ok (drag only set x,y and w,h will default to node value)\n var resizing;\n var mLeft = this.opts.marginLeft, mRight = this.opts.marginRight, mTop = this.opts.marginTop, mBottom = this.opts.marginBottom;\n // if margins (which are used to pass mid point by) are large relative to cell height/width, reduce them down #1855\n var mHeight = Math.round(cellHeight * 0.1), mWidth = Math.round(cellWidth * 0.1);\n mLeft = Math.min(mLeft, mWidth);\n mRight = Math.min(mRight, mWidth);\n mTop = Math.min(mTop, mHeight);\n mBottom = Math.min(mBottom, mHeight);\n if (event.type === 'drag') {\n if (node._temporaryRemoved)\n return; // handled by dropover\n var distance = ui.position.top - node._prevYPix;\n node._prevYPix = ui.position.top;\n if (this.opts.draggable.scroll !== false) {\n utils_1.Utils.updateScrollPosition(el, ui.position, distance);\n }\n // get new position taking into account the margin in the direction we are moving! (need to pass mid point by margin)\n var left = ui.position.left + (ui.position.left > node._lastUiPosition.left ? -mRight : mLeft);\n var top_2 = ui.position.top + (ui.position.top > node._lastUiPosition.top ? -mBottom : mTop);\n p.x = Math.round(left / cellWidth);\n p.y = Math.round(top_2 / cellHeight);\n // @ts-ignore// if we're at the bottom hitting something else, grow the grid so cursor doesn't leave when trying to place below others\n var prev = this._extraDragRow;\n if (this.engine.collide(node, p)) {\n var row = this.getRow();\n var extra = Math.max(0, (p.y + node.h) - row);\n if (this.opts.maxRow && row + extra > this.opts.maxRow) {\n extra = Math.max(0, this.opts.maxRow - row);\n } // @ts-ignore\n this._extraDragRow = extra; // @ts-ignore\n }\n else\n this._extraDragRow = 0; // @ts-ignore\n if (this._extraDragRow !== prev)\n this._updateContainerHeight();\n if (node.x === p.x && node.y === p.y)\n return; // skip same\n // DON'T skip one we tried as we might have failed because of coverage <50% before\n // if (node._lastTried && node._lastTried.x === x && node._lastTried.y === y) return;\n }\n else if (event.type === 'resize') {\n if (p.x < 0)\n return;\n // Scrolling page if needed\n utils_1.Utils.updateScrollResize(event, el, cellHeight);\n // get new size\n p.w = Math.round((ui.size.width - mLeft) / cellWidth);\n p.h = Math.round((ui.size.height - mTop) / cellHeight);\n if (node.w === p.w && node.h === p.h)\n return;\n if (node._lastTried && node._lastTried.w === p.w && node._lastTried.h === p.h)\n return; // skip one we tried (but failed)\n // if we size on left/top side this might move us, so get possible new position as well\n var left = ui.position.left + mLeft;\n var top_3 = ui.position.top + mTop;\n p.x = Math.round(left / cellWidth);\n p.y = Math.round(top_3 / cellHeight);\n resizing = true;\n }\n node._event = event;\n node._lastTried = p; // set as last tried (will nuke if we go there)\n var rect = {\n x: ui.position.left + mLeft,\n y: ui.position.top + mTop,\n w: (ui.size ? ui.size.width : node.w * cellWidth) - mLeft - mRight,\n h: (ui.size ? ui.size.height : node.h * cellHeight) - mTop - mBottom\n };\n if (this.engine.moveNodeCheck(node, __assign(__assign({}, p), { cellWidth: cellWidth, cellHeight: cellHeight, rect: rect, resizing: resizing }))) {\n node._lastUiPosition = ui.position;\n this.engine.cacheRects(cellWidth, cellHeight, mTop, mRight, mBottom, mLeft);\n delete node._skipDown;\n if (resizing && node.subGrid)\n node.subGrid.onParentResize();\n this._extraDragRow = 0; // @ts-ignore\n this._updateContainerHeight();\n var target = event.target; // @ts-ignore\n this._writePosAttr(target, node);\n if (this._gsEventHandler[event.type]) {\n this._gsEventHandler[event.type](event, target);\n }\n }\n };\n /** @internal called when item leaving our area by either cursor dropout event\n * or shape is outside our boundaries. remove it from us, and mark temporary if this was\n * our item to start with else restore prev node values from prev grid it came from.\n **/\n GridStack.prototype._leave = function (el, helper) {\n var node = el.gridstackNode;\n if (!node)\n return;\n dd.off(el, 'drag'); // no need to track while being outside\n // this gets called when cursor leaves and shape is outside, so only do this once\n if (node._temporaryRemoved)\n return;\n node._temporaryRemoved = true;\n this.engine.removeNode(node); // remove placeholder as well, otherwise it's a sign node is not in our list, which is a bigger issue\n node.el = node._isExternal && helper ? helper : el; // point back to real item being dragged\n if (this.opts.removable === true) { // boolean vs a class string\n // item leaving us and we are supposed to remove on leave (no need to drag onto trash) mark it so\n this._itemRemoving(el, true);\n }\n // finally if item originally came from another grid, but left us, restore things back to prev info\n if (el._gridstackNodeOrig) {\n // console.log('leave delete _gridstackNodeOrig') // TEST\n el.gridstackNode = el._gridstackNodeOrig;\n delete el._gridstackNodeOrig;\n }\n else if (node._isExternal) {\n // item came from outside (like a toolbar) so nuke any node info\n delete node.el;\n delete el.gridstackNode;\n // and restore all nodes back to original\n this.engine.restoreInitial();\n }\n };\n // legacy method removed\n GridStack.prototype.commit = function () { (0, utils_1.obsolete)(this, this.batchUpdate(false), 'commit', 'batchUpdate', '5.2'); return this; };\n /** scoping so users can call GridStack.Utils.sort() for example */\n GridStack.Utils = utils_1.Utils;\n /** scoping so users can call new GridStack.Engine(12) for example */\n GridStack.Engine = gridstack_engine_1.GridStackEngine;\n GridStack.GDRev = '8.2.2';\n return GridStack;\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLGtCQUFrQixDQUFDO1NBQzlCO2FBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzNCLGdFQUFnRTtZQUNoRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDeEIseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO0lBQ2pCLDBCQUFNLEdBQWIsY0FBNkIsb0JBQVEsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBcmxFcEgsbUVBQW1FO0lBQ3JELGVBQUssR0FBRyxhQUFLLENBQUM7SUFFNUIscUVBQXFFO0lBQ3ZELGdCQUFNLEdBQUcsa0NBQWUsQ0FBQztJQXk3Q2hDLGVBQUssR0FBRyxPQUFPLENBQUM7SUF5cEJ6QixnQkFBQztDQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vR3JpZFN0YWNrLy4vc3JjL2dyaWRzdGFjay50cz9hNmE4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxyXG4gKiBHcmlkU3RhY2sgOC4yLjJcclxuICogaHR0cHM6Ly9ncmlkc3RhY2tqcy5jb20vXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAyMS0yMDIyIEFsYWluIER1bWVzbnlcclxuICogc2VlIHJvb3QgbGljZW5zZSBodHRwczovL2dpdGh1Yi5jb20vZ3JpZHN0YWNrL2dyaWRzdGFjay5qcy90cmVlL21hc3Rlci9MSUNFTlNFXHJcbiAqL1xyXG5pbXBvcnQgeyBHcmlkU3RhY2tFbmdpbmUgfSBmcm9tICcuL2dyaWRzdGFjay1lbmdpbmUnO1xyXG5pbXBvcnQgeyBVdGlscywgSGVpZ2h0RGF0YSwgb2Jzb2xldGUgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgZ3JpZERlZmF1bHRzLCBDb2x1bW5PcHRpb25zLCBHcmlkSXRlbUhUTUxFbGVtZW50LCBHcmlkU3RhY2tFbGVtZW50LCBHcmlkU3RhY2tFdmVudEhhbmRsZXJDYWxsYmFjayxcclxuICBHcmlkU3RhY2tOb2RlLCBHcmlkU3RhY2tXaWRnZXQsIG51bWJlck9yU3RyaW5nLCBERFVJRGF0YSwgREREcmFnSW5PcHQsIEdyaWRTdGFja1Bvc2l0aW9uLCBHcmlkU3RhY2tPcHRpb25zLFxyXG4gIGRyYWdJbkRlZmF1bHRPcHRpb25zLCBHcmlkU3RhY2tFdmVudEhhbmRsZXIsIEdyaWRTdGFja05vZGVzSGFuZGxlciwgQWRkUmVtb3ZlRmNuLCBTYXZlRmNuIH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG4vKlxyXG4gKiBhbmQgaW5jbHVkZSBEJkQgYnkgZGVmYXVsdFxyXG4gKiBUT0RPOiB3aGlsZSB3ZSBjb3VsZCBnZW5lcmF0ZSBhIGdyaWRzdGFjay1zdGF0aWMuanMgYXQgc21hbGxlciBzaXplIC0gc2F2ZXMgYWJvdXQgMzFrICg0MWsgLT4gNzJrKVxyXG4gKiBJIGRvbid0IGtub3cgaG93IHRvIGdlbmVyYXRlIHRoZSBERCBvbmx5IGNvZGUgYXQgdGhlIHJlbWFpbmluZyAzMWsgdG8gZGVsYXkgbG9hZCBhcyBjb2RlIGRlcGVuZHMgb24gR3JpZHN0YWNrLnRzXHJcbiAqIGFsc28gaXQgY2F1c2VkIGxvYWRpbmcgaXNzdWVzIGluIHByb2QgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dyaWRzdGFjay9ncmlkc3RhY2suanMvaXNzdWVzLzIwMzlcclxuICovXHJcbmltcG9ydCB7IERER3JpZFN0YWNrIH0gZnJvbSAnLi9kZC1ncmlkc3RhY2snO1xyXG5pbXBvcnQgeyBpc1RvdWNoIH0gZnJvbSAnLi9kZC10b3VjaCc7XHJcbmltcG9ydCB7IERETWFuYWdlciB9IGZyb20gJy4vZGQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERERWxlbWVudEhvc3QgfSBmcm9tICcuL2RkLWVsZW1lbnQnO1xyXG4vKiogZ2xvYmFsIGluc3RhbmNlICovXHJcbmNvbnN0IGRkID0gbmV3IERER3JpZFN0YWNrO1xyXG5cclxuLy8gZXhwb3J0IGFsbCBkZXBlbmRlbnQgZmlsZSBhcyB3ZWxsIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB1c2VycyB0byBqdXN0IGltcG9ydCB0aGUgbWFpbiBmaWxlXHJcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcclxuZXhwb3J0ICogZnJvbSAnLi9ncmlkc3RhY2stZW5naW5lJztcclxuZXhwb3J0ICogZnJvbSAnLi9kZC1ncmlkc3RhY2snO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHcmlkSFRNTEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XHJcbiAgZ3JpZHN0YWNrPzogR3JpZFN0YWNrOyAvLyBncmlkJ3MgcGFyZW50IERPTSBlbGVtZW50IHBvaW50cyBiYWNrIHRvIGdyaWQgY2xhc3NcclxufVxyXG4vKiogbGlzdCBvZiBwb3NzaWJsZSBldmVudHMsIG9yIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIHRoZW0gKi9cclxuZXhwb3J0IHR5cGUgR3JpZFN0YWNrRXZlbnQgPSAnYWRkZWQnIHwgJ2NoYW5nZScgfCAnZGlzYWJsZScgfCAnZHJhZycgfCAnZHJhZ3N0YXJ0JyB8ICdkcmFnc3RvcCcgfCAnZHJvcHBlZCcgfFxyXG4gICdlbmFibGUnIHwgJ3JlbW92ZWQnIHwgJ3Jlc2l6ZScgfCAncmVzaXplc3RhcnQnIHwgJ3Jlc2l6ZXN0b3AnIHwgc3RyaW5nO1xyXG5cclxuLyoqIERlZmluZXMgdGhlIGNvb3JkaW5hdGVzIG9mIGFuIG9iamVjdCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1vdXNlUG9zaXRpb24ge1xyXG4gIHRvcDogbnVtYmVyO1xyXG4gIGxlZnQ6IG51bWJlcjtcclxufVxyXG5cclxuLyoqIERlZmluZXMgdGhlIHBvc2l0aW9uIG9mIGEgY2VsbCBpbnNpZGUgdGhlIGdyaWQqL1xyXG5leHBvcnQgaW50ZXJmYWNlIENlbGxQb3NpdGlvbiB7XHJcbiAgeDogbnVtYmVyO1xyXG4gIHk6IG51bWJlcjtcclxufVxyXG5cclxuaW50ZXJmYWNlIEdyaWRDU1NTdHlsZVNoZWV0IGV4dGVuZHMgQ1NTU3R5bGVTaGVldCB7XHJcbiAgX21heD86IG51bWJlcjsgLy8gaW50ZXJuYWwgdHJhY2tlciBvZiB0aGUgbWF4ICMgb2Ygcm93cyB3ZSBjcmVhdGVkXHJcbn1cclxuXHJcbi8vIGV4dGVuZCB3aXRoIGludGVybmFsIGZpZWxkcyB3ZSBuZWVkIC0gVE9ETzogbW92ZSBvdGhlciBpdGVtcyBpbiBoZXJlXHJcbmludGVyZmFjZSBJbnRlcm5hbEdyaWRTdGFja09wdGlvbnMgZXh0ZW5kcyBHcmlkU3RhY2tPcHRpb25zIHtcclxuICBfYWx3YXlzU2hvd1Jlc2l6ZUhhbmRsZT86IHRydWUgfCBmYWxzZSB8ICdtb2JpbGUnOyAvLyBzbyB3ZSBjYW4gcmVzdG9yZSBmb3Igc2F2ZVxyXG59XHJcblxyXG4vKipcclxuICogTWFpbiBncmlkc3RhY2sgY2xhc3MgLSB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgYEdyaWRTdGFjay5pbml0KClgIGZpcnN0IHRvIGluaXRpYWxpemUgeW91ciBncmlkLlxyXG4gKiBOb3RlOiB5b3VyIGdyaWQgZWxlbWVudHMgTVVTVCBoYXZlIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBmb3IgdGhlIENTUyBsYXlvdXQgdG8gd29yazpcclxuICogQGV4YW1wbGVcclxuICogPGRpdiBjbGFzcz1cImdyaWQtc3RhY2tcIj5cclxuICogICA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtXCI+XHJcbiAqICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnRcIj5JdGVtIDE8L2Rpdj5cclxuICogICA8L2Rpdj5cclxuICogPC9kaXY+XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgR3JpZFN0YWNrIHtcclxuXHJcbiAgLyoqXHJcbiAgICogaW5pdGlhbGl6aW5nIHRoZSBIVE1MIGVsZW1lbnQsIG9yIHNlbGVjdG9yIHN0cmluZywgaW50byBhIGdyaWQgd2lsbCByZXR1cm4gdGhlIGdyaWQuIENhbGxpbmcgaXQgYWdhaW4gd2lsbFxyXG4gICAqIHNpbXBseSByZXR1cm4gdGhlIGV4aXN0aW5nIGluc3RhbmNlIChpZ25vcmUgYW55IHBhc3NlZCBvcHRpb25zKS4gVGhlcmUgaXMgYWxzbyBhbiBpbml0QWxsKCkgdmVyc2lvbiB0aGF0IHN1cHBvcnRcclxuICAgKiBtdWx0aXBsZSBncmlkcyBpbml0aWFsaXphdGlvbiBhdCBvbmNlLiBPciB5b3UgY2FuIHVzZSBhZGRHcmlkKCkgdG8gY3JlYXRlIHRoZSBlbnRpcmUgZ3JpZCBmcm9tIEpTT04uXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgZ3JpZCBvcHRpb25zIChvcHRpb25hbClcclxuICAgKiBAcGFyYW0gZWxPclN0cmluZyBlbGVtZW50IG9yIENTUyBzZWxlY3RvciAoZmlyc3Qgb25lIHVzZWQpIHRvIGNvbnZlcnQgdG8gYSBncmlkIChkZWZhdWx0IHRvICcuZ3JpZC1zdGFjaycgY2xhc3Mgc2VsZWN0b3IpXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGxldCBncmlkID0gR3JpZFN0YWNrLmluaXQoKTtcclxuICAgKlxyXG4gICAqIE5vdGU6IHRoZSBIVE1MRWxlbWVudCAob2YgdHlwZSBHcmlkSFRNTEVsZW1lbnQpIHdpbGwgc3RvcmUgYSBgZ3JpZHN0YWNrOiBHcmlkU3RhY2tgIHZhbHVlIHRoYXQgY2FuIGJlIHJldHJpZXZlIGxhdGVyXHJcbiAgICogbGV0IGdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZ3JpZC1zdGFjaycpLmdyaWRzdGFjaztcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGluaXQob3B0aW9uczogR3JpZFN0YWNrT3B0aW9ucyA9IHt9LCBlbE9yU3RyaW5nOiBHcmlkU3RhY2tFbGVtZW50ID0gJy5ncmlkLXN0YWNrJyk6IEdyaWRTdGFjayB7XHJcbiAgICBsZXQgZWwgPSBHcmlkU3RhY2suZ2V0R3JpZEVsZW1lbnQoZWxPclN0cmluZyk7XHJcbiAgICBpZiAoIWVsKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgZWxPclN0cmluZyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdHcmlkU3RhY2suaW5pdEFsbCgpIG5vIGdyaWQgd2FzIGZvdW5kIHdpdGggc2VsZWN0b3IgXCInICsgZWxPclN0cmluZyArICdcIiAtIGVsZW1lbnQgbWlzc2luZyBvciB3cm9uZyBzZWxlY3RvciA/JyArXHJcbiAgICAgICAgJ1xcbk5vdGU6IFwiLmdyaWQtc3RhY2tcIiBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIENTUyBzdHlsaW5nIGFuZCBkcmFnL2Ryb3AsIGFuZCBpcyB0aGUgZGVmYXVsdCBzZWxlY3Rvci4nKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdHcmlkU3RhY2suaW5pdCgpIG5vIGdyaWQgZWxlbWVudCB3YXMgcGFzc2VkLicpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKCFlbC5ncmlkc3RhY2spIHtcclxuICAgICAgZWwuZ3JpZHN0YWNrID0gbmV3IEdyaWRTdGFjayhlbCwgVXRpbHMuY2xvbmVEZWVwKG9wdGlvbnMpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbC5ncmlkc3RhY2tcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdpbGwgaW5pdGlhbGl6ZSBhIGxpc3Qgb2YgZWxlbWVudHMgKGdpdmVuIGEgc2VsZWN0b3IpIGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgZ3JpZHMuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgZ3JpZCBvcHRpb25zIChvcHRpb25hbClcclxuICAgKiBAcGFyYW0gc2VsZWN0b3IgZWxlbWVudHMgc2VsZWN0b3IgdG8gY29udmVydCB0byBncmlkcyAoZGVmYXVsdCB0byAnLmdyaWQtc3RhY2snIGNsYXNzIHNlbGVjdG9yKVxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBsZXQgZ3JpZHMgPSBHcmlkU3RhY2suaW5pdEFsbCgpO1xyXG4gICAqIGdyaWRzLmZvckVhY2goLi4uKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgaW5pdEFsbChvcHRpb25zOiBHcmlkU3RhY2tPcHRpb25zID0ge30sIHNlbGVjdG9yID0gJy5ncmlkLXN0YWNrJyk6IEdyaWRTdGFja1tdIHtcclxuICAgIGxldCBncmlkczogR3JpZFN0YWNrW10gPSBbXTtcclxuICAgIEdyaWRTdGFjay5nZXRHcmlkRWxlbWVudHMoc2VsZWN0b3IpLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICBpZiAoIWVsLmdyaWRzdGFjaykge1xyXG4gICAgICAgIGVsLmdyaWRzdGFjayA9IG5ldyBHcmlkU3RhY2soZWwsIFV0aWxzLmNsb25lRGVlcChvcHRpb25zKSk7XHJcbiAgICAgIH1cclxuICAgICAgZ3JpZHMucHVzaChlbC5ncmlkc3RhY2spO1xyXG4gICAgfSk7XHJcbiAgICBpZiAoZ3JpZHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0dyaWRTdGFjay5pbml0QWxsKCkgbm8gZ3JpZCB3YXMgZm91bmQgd2l0aCBzZWxlY3RvciBcIicgKyBzZWxlY3RvciArICdcIiAtIGVsZW1lbnQgbWlzc2luZyBvciB3cm9uZyBzZWxlY3RvciA/JyArXHJcbiAgICAgICdcXG5Ob3RlOiBcIi5ncmlkLXN0YWNrXCIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciBDU1Mgc3R5bGluZyBhbmQgZHJhZy9kcm9wLCBhbmQgaXMgdGhlIGRlZmF1bHQgc2VsZWN0b3IuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JpZHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjYWxsIHRvIGNyZWF0ZSBhIGdyaWQgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucywgaW5jbHVkaW5nIGxvYWRpbmcgYW55IGNoaWxkcmVuIGZyb20gSlNPTiBzdHJ1Y3R1cmUuIFRoaXMgd2lsbCBjYWxsIEdyaWRTdGFjay5pbml0KCksIHRoZW5cclxuICAgKiBncmlkLmxvYWQoKSBvbiBhbnkgcGFzc2VkIGNoaWxkcmVuIChyZWN1cnNpdmVseSkuIEdyZWF0IGFsdGVybmF0aXZlIHRvIGNhbGxpbmcgaW5pdCgpIGlmIHlvdSB3YW50IGVudGlyZSBncmlkIHRvIGNvbWUgZnJvbVxyXG4gICAqIEpTT04gc2VyaWFsaXplZCBkYXRhLCBpbmNsdWRpbmcgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0gcGFyZW50IEhUTUwgZWxlbWVudCBwYXJlbnQgdG8gdGhlIGdyaWRcclxuICAgKiBAcGFyYW0gb3B0IGdyaWRzIG9wdGlvbnMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBncmlkLCBhbmQgbGlzdCBvZiBjaGlsZHJlblxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgYWRkR3JpZChwYXJlbnQ6IEhUTUxFbGVtZW50LCBvcHQ6IEdyaWRTdGFja09wdGlvbnMgPSB7fSk6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgbGV0IGVsID0gcGFyZW50IGFzIEdyaWRIVE1MRWxlbWVudDtcclxuICAgIGlmIChlbC5ncmlkc3RhY2spIHtcclxuICAgICAgLy8gYWxyZWFkeSBhIGdyaWQgLSBzZXQgb3B0aW9uIGFuZCBsb2FkIGRhdGFcclxuICAgICAgY29uc3QgZ3JpZCA9IGVsLmdyaWRzdGFjaztcclxuICAgICAgaWYgKG9wdCkgZ3JpZC5vcHRzID0gey4uLmdyaWQub3B0cywgLi4ub3B0fTtcclxuICAgICAgaWYgKG9wdC5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSBncmlkLmxvYWQob3B0LmNoaWxkcmVuKTtcclxuICAgICAgcmV0dXJuIGdyaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIHRoZSBncmlkIGVsZW1lbnQsIGJ1dCBjaGVjayBpZiB0aGUgcGFzc2VkICdwYXJlbnQnIGFscmVhZHkgaGFzIGdyaWQgc3R5bGluZyBhbmQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZFxyXG4gICAgY29uc3QgcGFyZW50SXNHcmlkID0gcGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnZ3JpZC1zdGFjaycpO1xyXG4gICAgaWYgKCFwYXJlbnRJc0dyaWQgfHwgR3JpZFN0YWNrLmFkZFJlbW92ZUNCKSB7XHJcbiAgICAgIGlmIChHcmlkU3RhY2suYWRkUmVtb3ZlQ0IpIHtcclxuICAgICAgICBlbCA9IEdyaWRTdGFjay5hZGRSZW1vdmVDQihwYXJlbnQsIG9wdCwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7IC8vIElFIG5lZWRzIGEgcGFyYW1cclxuICAgICAgICBkb2MuYm9keS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cImdyaWQtc3RhY2sgJHtvcHQuY2xhc3MgfHwgJyd9XCI+PC9kaXY+YDtcclxuICAgICAgICBlbCA9IGRvYy5ib2R5LmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBjcmVhdGUgZ3JpZCBjbGFzcyBhbmQgbG9hZCBhbnkgY2hpbGRyZW5cclxuICAgIGxldCBncmlkID0gR3JpZFN0YWNrLmluaXQob3B0LCBlbCk7XHJcbiAgICByZXR1cm4gZ3JpZDtcclxuICB9XHJcblxyXG4gIC8qKiBjYWxsIHRoaXMgbWV0aG9kIHRvIHJlZ2lzdGVyIHlvdXIgZW5naW5lIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lLlxyXG4gICAqIFNlZSBpbnN0ZWFkIGBHcmlkU3RhY2tPcHRpb25zLmVuZ2luZUNsYXNzYCBpZiB5b3Ugb25seSBuZWVkIHRvXHJcbiAgICogcmVwbGFjZSBqdXN0IG9uZSBpbnN0YW5jZS5cclxuICAgKi9cclxuICBzdGF0aWMgcmVnaXN0ZXJFbmdpbmUoZW5naW5lQ2xhc3M6IHR5cGVvZiBHcmlkU3RhY2tFbmdpbmUpOiB2b2lkIHtcclxuICAgIEdyaWRTdGFjay5lbmdpbmVDbGFzcyA9IGVuZ2luZUNsYXNzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY2FsbGJhY2sgbWV0aG9kIHVzZSB3aGVuIG5ldyBpdGVtc3xncmlkcyBuZWVkcyB0byBiZSBjcmVhdGVkIG9yIGRlbGV0ZWQsIGluc3RlYWQgb2YgdGhlIGRlZmF1bHRcclxuICAgKiBpdGVtOiA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtXCI+PGRpdiBjbGFzcz1cImdyaWQtc3RhY2staXRlbS1jb250ZW50XCI+dy5jb250ZW50PC9kaXY+PC9kaXY+XHJcbiAgICogZ3JpZDogPGRpdiBjbGFzcz1cImdyaWQtc3RhY2tcIj5ncmlkIGNvbnRlbnQuLi48L2Rpdj5cclxuICAgKiBhZGQgPSB0cnVlOiB0aGUgcmV0dXJuZWQgRE9NIGVsZW1lbnQgd2lsbCB0aGVuIGJlIGNvbnZlcnRlZCB0byBhIEdyaWRJdGVtSFRNTEVsZW1lbnQgdXNpbmcgbWFrZVdpZGdldCgpfEdyaWRTdGFjazppbml0KCkuXHJcbiAgICogYWRkID0gZmFsc2U6IHRoZSBpdGVtIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSAoaWYgbm90IGFscmVhZHkgZG9uZSlcclxuICAgKiBncmlkID0gdHJ1ZXxmYWxzZSBmb3IgZ3JpZCB2cyBncmlkLWl0ZW1zXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyBhZGRSZW1vdmVDQj86IEFkZFJlbW92ZUZjbjtcclxuXHJcbiAgLyoqXHJcbiAgICogY2FsbGJhY2sgZHVyaW5nIHNhdmluZyB0byBhcHBsaWNhdGlvbiBjYW4gaW5qZWN0IGV4dHJhIGRhdGEgZm9yIGVhY2ggd2lkZ2V0LCBvbiB0b3Agb2YgdGhlIGdyaWQgbGF5b3V0IHByb3BlcnRpZXNcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIHNhdmVDQj86IFNhdmVGY247XHJcblxyXG4gIC8qKiBzY29waW5nIHNvIHVzZXJzIGNhbiBjYWxsIEdyaWRTdGFjay5VdGlscy5zb3J0KCkgZm9yIGV4YW1wbGUgKi9cclxuICBwdWJsaWMgc3RhdGljIFV0aWxzID0gVXRpbHM7XHJcblxyXG4gIC8qKiBzY29waW5nIHNvIHVzZXJzIGNhbiBjYWxsIG5ldyBHcmlkU3RhY2suRW5naW5lKDEyKSBmb3IgZXhhbXBsZSAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgRW5naW5lID0gR3JpZFN0YWNrRW5naW5lO1xyXG5cclxuICAvKiogdGhlIEhUTUwgZWxlbWVudCB0aWVkIHRvIHRoaXMgZ3JpZCBhZnRlciBpdCdzIGJlZW4gaW5pdGlhbGl6ZWQgKi9cclxuICBwdWJsaWMgZWw6IEdyaWRIVE1MRWxlbWVudDtcclxuXHJcbiAgLyoqIGVuZ2luZSB1c2VkIHRvIGltcGxlbWVudCBub24gRE9NIGdyaWQgZnVuY3Rpb25hbGl0eSAqL1xyXG4gIHB1YmxpYyBlbmdpbmU6IEdyaWRTdGFja0VuZ2luZTtcclxuXHJcbiAgLyoqIGdyaWQgb3B0aW9ucyAtIHB1YmxpYyBmb3IgY2xhc3NlcyB0byBhY2Nlc3MsIGJ1dCB1c2UgbWV0aG9kcyB0byBtb2RpZnkhICovXHJcbiAgcHVibGljIG9wdHM6IEdyaWRTdGFja09wdGlvbnM7XHJcblxyXG4gIC8qKiBwb2ludCB0byBhIHBhcmVudCBncmlkIGl0ZW0gaWYgd2UncmUgbmVzdGVkIChpbnNpZGUgYSBncmlkLWl0ZW0gaW4gYmV0d2VlbiAyIEdyaWRzKSAqL1xyXG4gIHB1YmxpYyBwYXJlbnRHcmlkSXRlbT86IEdyaWRTdGFja05vZGU7XHJcblxyXG4gIHByb3RlY3RlZCBzdGF0aWMgZW5naW5lQ2xhc3M6IHR5cGVvZiBHcmlkU3RhY2tFbmdpbmU7XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgdW5pcXVlIGNsYXNzIG5hbWUgZm9yIG91ciBnZW5lcmF0ZWQgQ1NTIHN0eWxlIHNoZWV0ICovXHJcbiAgcHJvdGVjdGVkIF9zdHlsZVNoZWV0Q2xhc3M/OiBzdHJpbmc7XHJcbiAgLyoqIEBpbnRlcm5hbCB0cnVlIGlmIHdlIGdvdCBjcmVhdGVkIGJ5IGRyYWcgb3ZlciBnZXN0dXJlLCBzbyB3ZSBjYW4gcmVtb3ZlZCBvbiBkcmFnIG91dCAodGVtcG9yYXJ5KSAqL1xyXG4gIHB1YmxpYyBfaXNUZW1wPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBjcmVhdGUgcGxhY2Vob2xkZXIgRElWIGFzIG5lZWRlZCAqL1xyXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgaWYgKCF0aGlzLl9wbGFjZWhvbGRlcikge1xyXG4gICAgICBsZXQgcGxhY2Vob2xkZXJDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyAvLyBjaGlsZCBzbyBwYWRkaW5nIG1hdGNoIGl0ZW0tY29udGVudFxyXG4gICAgICBwbGFjZWhvbGRlckNoaWxkLmNsYXNzTmFtZSA9ICdwbGFjZWhvbGRlci1jb250ZW50JztcclxuICAgICAgaWYgKHRoaXMub3B0cy5wbGFjZWhvbGRlclRleHQpIHtcclxuICAgICAgICBwbGFjZWhvbGRlckNoaWxkLmlubmVySFRNTCA9IHRoaXMub3B0cy5wbGFjZWhvbGRlclRleHQ7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZCh0aGlzLm9wdHMucGxhY2Vob2xkZXJDbGFzcywgZ3JpZERlZmF1bHRzLml0ZW1DbGFzcywgdGhpcy5vcHRzLml0ZW1DbGFzcyk7XHJcbiAgICAgIHRoaXMucGxhY2Vob2xkZXIuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJDaGlsZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XHJcbiAgfVxyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBwcm90ZWN0ZWQgX3BsYWNlaG9sZGVyOiBIVE1MRWxlbWVudDtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIF9wcmV2Q29sdW1uOiBudW1iZXI7XHJcbiAgLyoqIEBpbnRlcm5hbCBwcmV2ZW50IGNhY2hlZCBsYXlvdXRzIGZyb20gYmVpbmcgdXBkYXRlZCB3aGVuIGxvYWRpbmcgaW50byBzbWFsbCBjb2x1bW4gbGF5b3V0cyAqL1xyXG4gIHByb3RlY3RlZCBfaWdub3JlTGF5b3V0c05vZGVDaGFuZ2U6IGJvb2xlYW47XHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIHB1YmxpYyBfZ3NFdmVudEhhbmRsZXIgPSB7fTtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIF9zdHlsZXM6IEdyaWRDU1NTdHlsZVNoZWV0O1xyXG4gIC8qKiBAaW50ZXJuYWwgZmxhZyB0byBrZWVwIGNlbGxzIHNxdWFyZSBkdXJpbmcgcmVzaXplICovXHJcbiAgcHJvdGVjdGVkIF9pc0F1dG9DZWxsSGVpZ2h0OiBib29sZWFuO1xyXG4gIC8qKiBAaW50ZXJuYWwgdHJhY2sgZXZlbnQgYmluZGluZyB0byB3aW5kb3cgcmVzaXplIHNvIHdlIGNhbiByZW1vdmUgKi9cclxuICBwcm90ZWN0ZWQgX3dpbmRvd1Jlc2l6ZUJpbmQ6ICgpID0+IHZvaWQ7XHJcbiAgLyoqIEBpbnRlcm5hbCBsaW1pdCBhdXRvIGNlbGwgcmVzaXppbmcgbWV0aG9kICovXHJcbiAgcHJvdGVjdGVkIF9jZWxsSGVpZ2h0VGhyb3R0bGU6ICgpID0+IHZvaWQ7XHJcbiAgLyoqIEBpbnRlcm5hbCB0cnVlIHdoZW4gbG9hZGluZyBpdGVtcyB0byBpbnNlcnQgZmlyc3QgcmF0aGVyIHRoYW4gYXBwZW5kICovXHJcbiAgcHJvdGVjdGVkIF9pbnNlcnROb3RBcHBlbmQ6IGJvb2xlYW47XHJcbiAgLyoqIEBpbnRlcm5hbCBleHRyYSByb3cgYWRkZWQgd2hlbiBkcmFnZ2luZyBhdCB0aGUgYm90dG9tIG9mIHRoZSBncmlkICovXHJcbiAgcHJvdGVjdGVkIF9leHRyYURyYWdSb3cgPSAwO1xyXG4gIC8qKiBAaW50ZXJuYWwgdHJ1ZSBpZiBuZXN0ZWQgZ3JpZCBzaG91bGQgZ2V0IGNvbHVtbiBjb3VudCBmcm9tIG91ciB3aWR0aCAqL1xyXG4gIHByb3RlY3RlZCBfYXV0b0NvbHVtbj86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdCBhIGdyaWQgaXRlbSBmcm9tIHRoZSBnaXZlbiBlbGVtZW50IGFuZCBvcHRpb25zXHJcbiAgICogQHBhcmFtIGVsXHJcbiAgICogQHBhcmFtIG9wdHNcclxuICAgKi9cclxuICBwdWJsaWMgY29uc3RydWN0b3IoZWw6IEdyaWRIVE1MRWxlbWVudCwgb3B0czogR3JpZFN0YWNrT3B0aW9ucyA9IHt9KSB7XHJcbiAgICB0aGlzLmVsID0gZWw7IC8vIGV4cG9zZWQgSFRNTCBlbGVtZW50IHRvIHRoZSB1c2VyXHJcbiAgICBvcHRzID0gb3B0cyB8fCB7fTsgLy8gaGFuZGxlcyBudWxsL3VuZGVmaW5lZC8wXHJcblxyXG4gICAgaWYgKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2dyaWQtc3RhY2snKSkge1xyXG4gICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ2dyaWQtc3RhY2snKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiByb3cgcHJvcGVydHkgZXhpc3RzLCByZXBsYWNlIG1pblJvdyBhbmQgbWF4Um93IGluc3RlYWRcclxuICAgIGlmIChvcHRzLnJvdykge1xyXG4gICAgICBvcHRzLm1pblJvdyA9IG9wdHMubWF4Um93ID0gb3B0cy5yb3c7XHJcbiAgICAgIGRlbGV0ZSBvcHRzLnJvdztcclxuICAgIH1cclxuICAgIGxldCByb3dBdHRyID0gVXRpbHMudG9OdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdncy1yb3cnKSk7XHJcblxyXG4gICAgLy8gZmxhZyBvbmx5IHZhbGlkIGluIHN1Yi1ncmlkcyAoaGFuZGxlZCBieSBwYXJlbnQsIG5vdCBoZXJlKVxyXG4gICAgaWYgKG9wdHMuY29sdW1uID09PSAnYXV0bycpIHtcclxuICAgICAgZGVsZXRlIG9wdHMuY29sdW1uO1xyXG4gICAgfVxyXG4gICAgLy8gc2F2ZSBvcmlnaW5hbCBzZXR0aW5nIHNvIHdlIGNhbiByZXN0b3JlIG9uIHNhdmVcclxuICAgIGlmIChvcHRzLmFsd2F5c1Nob3dSZXNpemVIYW5kbGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAob3B0cyBhcyBJbnRlcm5hbEdyaWRTdGFja09wdGlvbnMpLl9hbHdheXNTaG93UmVzaXplSGFuZGxlID0gb3B0cy5hbHdheXNTaG93UmVzaXplSGFuZGxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVsZW1lbnRzIERPTSBhdHRyaWJ1dGVzIG92ZXJyaWRlIGFueSBwYXNzZWQgb3B0aW9ucyAobGlrZSBDU1Mgc3R5bGUpIC0gbWVyZ2UgdGhlIHR3byB0b2dldGhlclxyXG4gICAgbGV0IGRlZmF1bHRzOiBHcmlkU3RhY2tPcHRpb25zID0gey4uLlV0aWxzLmNsb25lRGVlcChncmlkRGVmYXVsdHMpLFxyXG4gICAgICBjb2x1bW46IFV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtY29sdW1uJykpIHx8IGdyaWREZWZhdWx0cy5jb2x1bW4sXHJcbiAgICAgIG1pblJvdzogcm93QXR0ciA/IHJvd0F0dHIgOiBVdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLW1pbi1yb3cnKSkgfHwgZ3JpZERlZmF1bHRzLm1pblJvdyxcclxuICAgICAgbWF4Um93OiByb3dBdHRyID8gcm93QXR0ciA6IFV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtbWF4LXJvdycpKSB8fCBncmlkRGVmYXVsdHMubWF4Um93LFxyXG4gICAgICBzdGF0aWNHcmlkOiBVdGlscy50b0Jvb2woZWwuZ2V0QXR0cmlidXRlKCdncy1zdGF0aWMnKSkgfHwgZ3JpZERlZmF1bHRzLnN0YXRpY0dyaWQsXHJcbiAgICAgIGRyYWdnYWJsZToge1xyXG4gICAgICAgIGhhbmRsZTogKG9wdHMuaGFuZGxlQ2xhc3MgPyAnLicgKyBvcHRzLmhhbmRsZUNsYXNzIDogKG9wdHMuaGFuZGxlID8gb3B0cy5oYW5kbGUgOiAnJykpIHx8IGdyaWREZWZhdWx0cy5kcmFnZ2FibGUuaGFuZGxlLFxyXG4gICAgICB9LFxyXG4gICAgICByZW1vdmFibGVPcHRpb25zOiB7XHJcbiAgICAgICAgYWNjZXB0OiBvcHRzLml0ZW1DbGFzcyA/ICcuJyArIG9wdHMuaXRlbUNsYXNzIDogZ3JpZERlZmF1bHRzLnJlbW92YWJsZU9wdGlvbnMuYWNjZXB0LFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ2dzLWFuaW1hdGUnKSkgeyAvLyBkZWZhdWx0IHRvIHRydWUsIGJ1dCBpZiBzZXQgdG8gZmFsc2UgdXNlIHRoYXQgaW5zdGVhZFxyXG4gICAgICBkZWZhdWx0cy5hbmltYXRlID0gVXRpbHMudG9Cb29sKGVsLmdldEF0dHJpYnV0ZSgnZ3MtYW5pbWF0ZScpKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0cyA9IFV0aWxzLmRlZmF1bHRzKG9wdHMsIGRlZmF1bHRzKTtcclxuICAgIG9wdHMgPSBudWxsOyAvLyBtYWtlIHN1cmUgd2UgdXNlIHRoaXMub3B0cyBpbnN0ZWFkXHJcbiAgICB0aGlzLl9pbml0TWFyZ2luKCk7IC8vIHBhcnQgb2Ygc2V0dGluZ3MgZGVmYXVsdHMuLi5cclxuXHJcbiAgICAvLyBOb3cgY2hlY2sgaWYgd2UncmUgbG9hZGluZyBpbnRvIDEgY29sdW1uIG1vZGUgRklSU1Qgc28gd2UgZG9uJ3QgZG8gdW4tbmVjZXNzYXJ5IHdvcmsgKGxpa2UgY2VsbEhlaWdodCA9IHdpZHRoIC8gMTIgdGhlbiBnbyAxIGNvbHVtbilcclxuICAgIGlmICh0aGlzLm9wdHMuY29sdW1uICE9PSAxICYmICF0aGlzLm9wdHMuZGlzYWJsZU9uZUNvbHVtbk1vZGUgJiYgdGhpcy5fd2lkdGhPckNvbnRhaW5lcigpIDw9IHRoaXMub3B0cy5vbmVDb2x1bW5TaXplKSB7XHJcbiAgICAgIHRoaXMuX3ByZXZDb2x1bW4gPSB0aGlzLmdldENvbHVtbigpO1xyXG4gICAgICB0aGlzLm9wdHMuY29sdW1uID0gMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRzLnJ0bCA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgIHRoaXMub3B0cy5ydGwgPSAoZWwuc3R5bGUuZGlyZWN0aW9uID09PSAncnRsJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRzLnJ0bCkge1xyXG4gICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ2dyaWQtc3RhY2stcnRsJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgaWYgd2UncmUgYmVlbiBuZXN0ZWQsIGFuZCBpZiBzbyB1cGRhdGUgb3VyIHN0eWxlIGFuZCBrZWVwIHBvaW50ZXIgYXJvdW5kICh1c2VkIGR1cmluZyBzYXZlKVxyXG4gICAgbGV0IHBhcmVudEdyaWRJdGVtID0gKFV0aWxzLmNsb3Nlc3RVcEJ5Q2xhc3ModGhpcy5lbCwgZ3JpZERlZmF1bHRzLml0ZW1DbGFzcykgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudCk/LmdyaWRzdGFja05vZGU7XHJcbiAgICBpZiAocGFyZW50R3JpZEl0ZW0pIHtcclxuICAgICAgcGFyZW50R3JpZEl0ZW0uc3ViR3JpZCA9IHRoaXM7XHJcbiAgICAgIHRoaXMucGFyZW50R3JpZEl0ZW0gPSBwYXJlbnRHcmlkSXRlbTtcclxuICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCdncmlkLXN0YWNrLW5lc3RlZCcpO1xyXG4gICAgICBwYXJlbnRHcmlkSXRlbS5lbC5jbGFzc0xpc3QuYWRkKCdncmlkLXN0YWNrLXN1Yi1ncmlkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faXNBdXRvQ2VsbEhlaWdodCA9ICh0aGlzLm9wdHMuY2VsbEhlaWdodCA9PT0gJ2F1dG8nKTtcclxuICAgIGlmICh0aGlzLl9pc0F1dG9DZWxsSGVpZ2h0IHx8IHRoaXMub3B0cy5jZWxsSGVpZ2h0ID09PSAnaW5pdGlhbCcpIHtcclxuICAgICAgLy8gbWFrZSB0aGUgY2VsbCBjb250ZW50IHNxdWFyZSBpbml0aWFsbHkgKHdpbGwgdXNlIHJlc2l6ZS9jb2x1bW4gZXZlbnQgdG8ga2VlcCBpdCBzcXVhcmUpXHJcbiAgICAgIHRoaXMuY2VsbEhlaWdodCh1bmRlZmluZWQsIGZhbHNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGFwcGVuZCB1bml0IGlmIGFueSBhcmUgc2V0XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmNlbGxIZWlnaHQgPT0gJ251bWJlcicgJiYgdGhpcy5vcHRzLmNlbGxIZWlnaHRVbml0ICYmIHRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdCAhPT0gZ3JpZERlZmF1bHRzLmNlbGxIZWlnaHRVbml0KSB7XHJcbiAgICAgICAgdGhpcy5vcHRzLmNlbGxIZWlnaHQgPSB0aGlzLm9wdHMuY2VsbEhlaWdodCArIHRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdDtcclxuICAgICAgICBkZWxldGUgdGhpcy5vcHRzLmNlbGxIZWlnaHRVbml0O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2VsbEhlaWdodCh0aGlzLm9wdHMuY2VsbEhlaWdodCwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIGFkanVzdCBhdXRvLWhpZGVcclxuICAgIGlmICh0aGlzLm9wdHMuYWx3YXlzU2hvd1Jlc2l6ZUhhbmRsZSA9PT0gJ21vYmlsZScpIHtcclxuICAgICAgdGhpcy5vcHRzLmFsd2F5c1Nob3dSZXNpemVIYW5kbGUgPSBpc1RvdWNoO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3N0eWxlU2hlZXRDbGFzcyA9ICdncy1pZC0nICsgR3JpZFN0YWNrRW5naW5lLl9pZFNlcSsrO1xyXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKHRoaXMuX3N0eWxlU2hlZXRDbGFzcyk7XHJcblxyXG4gICAgdGhpcy5fc2V0U3RhdGljQ2xhc3MoKTtcclxuXHJcbiAgICBsZXQgZW5naW5lQ2xhc3MgPSB0aGlzLm9wdHMuZW5naW5lQ2xhc3MgfHwgR3JpZFN0YWNrLmVuZ2luZUNsYXNzIHx8IEdyaWRTdGFja0VuZ2luZTtcclxuICAgIHRoaXMuZW5naW5lID0gbmV3IGVuZ2luZUNsYXNzKHtcclxuICAgICAgY29sdW1uOiB0aGlzLmdldENvbHVtbigpLFxyXG4gICAgICBmbG9hdDogdGhpcy5vcHRzLmZsb2F0LFxyXG4gICAgICBtYXhSb3c6IHRoaXMub3B0cy5tYXhSb3csXHJcbiAgICAgIG9uQ2hhbmdlOiAoY2JOb2RlcykgPT4ge1xyXG4gICAgICAgIGxldCBtYXhIID0gMDtcclxuICAgICAgICB0aGlzLmVuZ2luZS5ub2Rlcy5mb3JFYWNoKG4gPT4geyBtYXhIID0gTWF0aC5tYXgobWF4SCwgbi55ICsgbi5oKSB9KTtcclxuICAgICAgICBjYk5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgICAgICBsZXQgZWwgPSBuLmVsO1xyXG4gICAgICAgICAgaWYgKCFlbCkgcmV0dXJuO1xyXG4gICAgICAgICAgaWYgKG4uX3JlbW92ZURPTSkge1xyXG4gICAgICAgICAgICBpZiAoZWwpIGVsLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICBkZWxldGUgbi5fcmVtb3ZlRE9NO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fd3JpdGVQb3NBdHRyKGVsLCBuKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl91cGRhdGVTdHlsZXMoZmFsc2UsIG1heEgpOyAvLyBmYWxzZSA9IGRvbid0IHJlY3JlYXRlLCBqdXN0IGFwcGVuZCBpZiBuZWVkIGJlXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdHMuYXV0bykge1xyXG4gICAgICB0aGlzLmJhdGNoVXBkYXRlKCk7IC8vIHByZXZlbnQgaW4gYmV0d2VlbiByZS1sYXlvdXQgIzE1MzUgVE9ETzogdGhpcyBvbmx5IHNldCBmbG9hdD10cnVlLCBuZWVkIHRvIHByZXZlbnQgY29sbGlzaW9uIGNoZWNrLi4uXHJcbiAgICAgIHRoaXMuZ2V0R3JpZEl0ZW1zKCkuZm9yRWFjaChlbCA9PiB0aGlzLl9wcmVwYXJlRWxlbWVudChlbCkpO1xyXG4gICAgICB0aGlzLmJhdGNoVXBkYXRlKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsb2FkIGFueSBwYXNzZWQgaW4gY2hpbGRyZW4gYXMgd2VsbCwgd2hpY2ggb3ZlcnJpZGVzIGFueSBET00gbGF5b3V0IGRvbmUgYWJvdmVcclxuICAgIGlmICh0aGlzLm9wdHMuY2hpbGRyZW4pIHtcclxuICAgICAgbGV0IGNoaWxkcmVuID0gdGhpcy5vcHRzLmNoaWxkcmVuO1xyXG4gICAgICBkZWxldGUgdGhpcy5vcHRzLmNoaWxkcmVuO1xyXG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB0aGlzLmxvYWQoY2hpbGRyZW4pOyAvLyBkb24ndCBsb2FkIGVtcHR5XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRBbmltYXRpb24odGhpcy5vcHRzLmFuaW1hdGUpO1xyXG5cclxuICAgIHRoaXMuX3VwZGF0ZVN0eWxlcygpO1xyXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCdncy0nICsgdGhpcy5vcHRzLmNvbHVtbik7XHJcblxyXG4gICAgLy8gZHluYW1pYyBncmlkcyByZXF1aXJlIHBhdXNpbmcgZHVyaW5nIGRyYWcgdG8gZGV0ZWN0IG92ZXIgdG8gbmVzdCB2cyBwdXNoXHJcbiAgICBpZiAodGhpcy5vcHRzLnN1YkdyaWREeW5hbWljICYmICFERE1hbmFnZXIucGF1c2VEcmFnKSBERE1hbmFnZXIucGF1c2VEcmFnID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLm9wdHMuZHJhZ2dhYmxlPy5wYXVzZSAhPT0gdW5kZWZpbmVkKSBERE1hbmFnZXIucGF1c2VEcmFnID0gdGhpcy5vcHRzLmRyYWdnYWJsZS5wYXVzZTtcclxuXHJcbiAgICB0aGlzLl9zZXR1cFJlbW92ZURyb3AoKTtcclxuICAgIHRoaXMuX3NldHVwQWNjZXB0V2lkZ2V0KCk7XHJcbiAgICB0aGlzLl91cGRhdGVXaW5kb3dSZXNpemVFdmVudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogYWRkIGEgbmV3IHdpZGdldCBhbmQgcmV0dXJucyBpdC5cclxuICAgKlxyXG4gICAqIFdpZGdldCB3aWxsIGJlIGFsd2F5cyBwbGFjZWQgZXZlbiBpZiByZXN1bHQgaGVpZ2h0IGlzIG1vcmUgdGhhbiBhY3R1YWwgZ3JpZCBoZWlnaHQuXHJcbiAgICogWW91IG5lZWQgdG8gdXNlIGB3aWxsSXRGaXQoKWAgYmVmb3JlIGNhbGxpbmcgYWRkV2lkZ2V0IGZvciBhZGRpdGlvbmFsIGNoZWNrLlxyXG4gICAqIFNlZSBhbHNvIGBtYWtlV2lkZ2V0KClgLlxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBsZXQgZ3JpZCA9IEdyaWRTdGFjay5pbml0KCk7XHJcbiAgICogZ3JpZC5hZGRXaWRnZXQoe3c6IDMsIGNvbnRlbnQ6ICdoZWxsbyd9KTtcclxuICAgKiBncmlkLmFkZFdpZGdldCgnPGRpdiBjbGFzcz1cImdyaWQtc3RhY2staXRlbVwiPjxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW0tY29udGVudFwiPmhlbGxvPC9kaXY+PC9kaXY+Jywge3c6IDN9KTtcclxuICAgKlxyXG4gICAqIEBwYXJhbSBlbCAgR3JpZFN0YWNrV2lkZ2V0ICh3aGljaCBjYW4gaGF2ZSBjb250ZW50IHN0cmluZyBhcyB3ZWxsKSwgaHRtbCBlbGVtZW50LCBvciBzdHJpbmcgZGVmaW5pdGlvbiB0byBhZGRcclxuICAgKiBAcGFyYW0gb3B0aW9ucyB3aWRnZXQgcG9zaXRpb24vc2l6ZSBvcHRpb25zIChvcHRpb25hbCwgYW5kIGlnbm9yZSBpZiBmaXJzdCBwYXJhbSBpcyBhbHJlYWR5IG9wdGlvbikgLSBzZWUgR3JpZFN0YWNrV2lkZ2V0XHJcbiAgICovXHJcbiAgcHVibGljIGFkZFdpZGdldChlbHM/OiBHcmlkU3RhY2tXaWRnZXQgfCBHcmlkU3RhY2tFbGVtZW50LCBvcHRpb25zPzogR3JpZFN0YWNrV2lkZ2V0KTogR3JpZEl0ZW1IVE1MRWxlbWVudCB7XHJcbiAgICBmdW5jdGlvbiBpc0dyaWRTdGFja1dpZGdldCh3OiBHcmlkU3RhY2tOb2RlKTogdyBpcyBHcmlkU3RhY2tOb2RlIHsgLy8gaHR0cHM6Ly9tZWRpdW0uY29tL292cnNlYS9jaGVja2luZy10aGUtdHlwZS1vZi1hbi1vYmplY3QtaW4tdHlwZXNjcmlwdC10aGUtdHlwZS1ndWFyZHMtMjRkOThkOTExOWIwXHJcbiAgICAgIHJldHVybiB3LmVsICE9PSB1bmRlZmluZWQgfHwgdy54ICE9PSB1bmRlZmluZWQgfHwgdy55ICE9PSB1bmRlZmluZWQgfHwgdy53ICE9PSB1bmRlZmluZWQgfHwgdy5oICE9PSB1bmRlZmluZWQgfHwgdy5jb250ZW50ICE9PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50O1xyXG4gICAgbGV0IG5vZGU6IEdyaWRTdGFja05vZGU7XHJcbiAgICBpZiAodHlwZW9mIGVscyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgbGV0IGRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnJyk7IC8vIElFIG5lZWRzIGEgcGFyYW1cclxuICAgICAgZG9jLmJvZHkuaW5uZXJIVE1MID0gZWxzO1xyXG4gICAgICBlbCA9IGRvYy5ib2R5LmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgaXNHcmlkU3RhY2tXaWRnZXQoZWxzKSkge1xyXG4gICAgICBub2RlID0gb3B0aW9ucyA9IGVscztcclxuICAgICAgaWYgKG5vZGU/LmVsKSB7XHJcbiAgICAgICAgZWwgPSBub2RlLmVsOyAvLyByZS11c2UgZWxlbWVudCBzdG9yZWQgaW4gdGhlIG5vZGVcclxuICAgICAgfSBlbHNlIGlmIChHcmlkU3RhY2suYWRkUmVtb3ZlQ0IpIHtcclxuICAgICAgICBlbCA9IEdyaWRTdGFjay5hZGRSZW1vdmVDQih0aGlzLmVsLCBvcHRpb25zLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBvcHRpb25zPy5jb250ZW50IHx8ICcnO1xyXG4gICAgICAgIGxldCBkb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJycpOyAvLyBJRSBuZWVkcyBhIHBhcmFtXHJcbiAgICAgICAgZG9jLmJvZHkuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW0gJHt0aGlzLm9wdHMuaXRlbUNsYXNzIHx8ICcnfVwiPjxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW0tY29udGVudFwiPiR7Y29udGVudH08L2Rpdj48L2Rpdj5gO1xyXG4gICAgICAgIGVsID0gZG9jLmJvZHkuY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVsID0gZWxzIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZWwpIHJldHVybjtcclxuXHJcbiAgICAvLyBpZiB0aGUgY2FsbGVyIGVuZGVkIHVwIGluaXRpYWxpemluZyB0aGUgd2lkZ2V0IGluIGFkZFJlbW92ZUNCLCBvciB3ZSBzdGFyZWQgd2l0aCBvbmUgYWxyZWFkeSwgc2tpcCB0aGUgcmVzdFxyXG4gICAgbm9kZSA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICBpZiAobm9kZSAmJiBlbC5wYXJlbnRFbGVtZW50ID09PSB0aGlzLmVsICYmIHRoaXMuZW5naW5lLm5vZGVzLmZpbmQobiA9PiBuLl9pZCA9PT0gbm9kZS5faWQpKSByZXR1cm4gZWw7XHJcblxyXG4gICAgLy8gVGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgcGFzc2VkIGluIG9wdCB3aXRoIGRlZmF1bHQgYW5kIHZhbGlkIHZhbHVlcywgYnV0IHRoaXMgYnJlYWsga25vY2tvdXQgZGVtb3NcclxuICAgIC8vIGFzIHRoZSBhY3R1YWwgdmFsdWUgYXJlIGZpbGxlZCBpbiB3aGVuIF9wcmVwYXJlRWxlbWVudCgpIGNhbGxzIGVsLmdldEF0dHJpYnV0ZSgnZ3MteHl6JykgYmVmb3JlIGFkZGluZyB0aGUgbm9kZS5cclxuICAgIC8vIFNvIG1ha2Ugc3VyZSB3ZSBsb2FkIGFueSBET00gYXR0cmlidXRlcyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkIGluIHBhc3NlZCBpbiBvcHRpb25zICh3aGljaCBvdmVycmlkZSlcclxuICAgIGxldCBkb21BdHRyID0gdGhpcy5fcmVhZEF0dHIoZWwpO1xyXG4gICAgb3B0aW9ucyA9IFV0aWxzLmNsb25lRGVlcChvcHRpb25zKSB8fCB7fTsgIC8vIG1ha2UgYSBjb3B5IGJlZm9yZSB3ZSBtb2RpZnkgaW4gY2FzZSBjYWxsZXIgcmUtdXNlcyBpdFxyXG4gICAgVXRpbHMuZGVmYXVsdHMob3B0aW9ucywgZG9tQXR0cik7XHJcbiAgICBub2RlID0gdGhpcy5lbmdpbmUucHJlcGFyZU5vZGUob3B0aW9ucyk7XHJcbiAgICB0aGlzLl93cml0ZUF0dHIoZWwsIG9wdGlvbnMpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pbnNlcnROb3RBcHBlbmQpIHtcclxuICAgICAgdGhpcy5lbC5wcmVwZW5kKGVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQoZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFrZVdpZGdldChlbCwgb3B0aW9ucyk7XHJcblxyXG4gICAgcmV0dXJuIGVsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBhbiBleGlzdGluZyBncmlkSXRlbSBlbGVtZW50IGludG8gYSBzdWItZ3JpZCB3aXRoIHRoZSBnaXZlbiAob3B0aW9uYWwpIG9wdGlvbnMsIGVsc2UgaW5oZXJpdCB0aGVtXHJcbiAgICogZnJvbSB0aGUgcGFyZW50J3Mgc3ViR3JpZCBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSBlbCBncmlkSXRlbSBlbGVtZW50IHRvIGNvbnZlcnRcclxuICAgKiBAcGFyYW0gb3BzIChvcHRpb25hbCkgc3ViLWdyaWQgb3B0aW9ucywgZWxzZSBkZWZhdWx0IHRvIG5vZGUsIHRoZW4gcGFyZW50IHNldHRpbmdzLCBlbHNlIGRlZmF1bHRzXHJcbiAgICogQHBhcmFtIG5vZGVUb0FkZCAob3B0aW9uYWwpIG5vZGUgdG8gYWRkIHRvIHRoZSBuZXdseSBjcmVhdGVkIHN1YiBncmlkICh1c2VkIHdoZW4gZHJhZ2dpbmcgb3ZlciBleGlzdGluZyByZWd1bGFyIGl0ZW0pXHJcbiAgICogQHJldHVybnMgbmV3bHkgY3JlYXRlZCBncmlkXHJcbiAgICovXHJcbiAgcHVibGljIG1ha2VTdWJHcmlkKGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50LCBvcHM/OiBHcmlkU3RhY2tPcHRpb25zLCBub2RlVG9BZGQ/OiBHcmlkU3RhY2tOb2RlLCBzYXZlQ29udGVudCA9IHRydWUpOiBHcmlkU3RhY2sge1xyXG4gICAgbGV0IG5vZGUgPSBlbC5ncmlkc3RhY2tOb2RlO1xyXG4gICAgaWYgKCFub2RlKSB7XHJcbiAgICAgIG5vZGUgPSB0aGlzLm1ha2VXaWRnZXQoZWwpLmdyaWRzdGFja05vZGU7XHJcbiAgICB9XHJcbiAgICBpZiAobm9kZS5zdWJHcmlkPy5lbCkgcmV0dXJuIG5vZGUuc3ViR3JpZDsgLy8gYWxyZWFkeSBkb25lXHJcblxyXG4gICAgLy8gZmluZCB0aGUgdGVtcGxhdGUgc3ViR3JpZCBzdG9yZWQgb24gYSBwYXJlbnQgYXMgZmFsbGJhY2suLi5cclxuICAgIGxldCBzdWJHcmlkVGVtcGxhdGU6IEdyaWRTdGFja09wdGlvbnM7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xyXG4gICAgbGV0IGdyaWQ6IEdyaWRTdGFjayA9IHRoaXM7XHJcbiAgICB3aGlsZSAoZ3JpZCAmJiAhc3ViR3JpZFRlbXBsYXRlKSB7XHJcbiAgICAgIHN1YkdyaWRUZW1wbGF0ZSA9IGdyaWQub3B0cz8uc3ViR3JpZE9wdHM7XHJcbiAgICAgIGdyaWQgPSBncmlkLnBhcmVudEdyaWRJdGVtPy5ncmlkO1xyXG4gICAgfVxyXG4gICAgLy8uLi4gYW5kIHNldCB0aGUgY3JlYXRlIG9wdGlvbnNcclxuICAgIG9wcyA9IFV0aWxzLmNsb25lRGVlcCh7Li4uKHN1YkdyaWRUZW1wbGF0ZSB8fCB7fSksIGNoaWxkcmVuOiB1bmRlZmluZWQsIC4uLihvcHMgfHwgbm9kZS5zdWJHcmlkT3B0cyl9KTtcclxuICAgIG5vZGUuc3ViR3JpZE9wdHMgPSBvcHM7XHJcblxyXG4gICAgLy8gaWYgY29sdW1uIHNwZWNpYWwgY2FzZSBpdCBzZXQsIHJlbWVtYmVyIHRoYXQgZmxhZyBhbmQgc2V0IGRlZmF1bHRcclxuICAgIGxldCBhdXRvQ29sdW1uOiBib29sZWFuO1xyXG4gICAgaWYgKG9wcy5jb2x1bW4gPT09ICdhdXRvJykge1xyXG4gICAgICBhdXRvQ29sdW1uID0gdHJ1ZTtcclxuICAgICAgb3BzLmNvbHVtbiA9IE1hdGgubWF4KG5vZGUudyB8fCAxLCBub2RlVG9BZGQ/LncgfHwgMSk7XHJcbiAgICAgIG9wcy5kaXNhYmxlT25lQ29sdW1uTW9kZSA9IHRydWU7IC8vIGRyaXZlbiBieSBwYXJlbnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiB3ZSdyZSBjb252ZXJ0aW5nIGFuIGV4aXN0aW5nIGZ1bGwgaXRlbSwgbW92ZSBvdmVyIHRoZSBjb250ZW50IHRvIGJlIHRoZSBmaXJzdCBzdWIgaXRlbSBpbiB0aGUgbmV3IGdyaWRcclxuICAgIGxldCBjb250ZW50ID0gbm9kZS5lbC5xdWVyeVNlbGVjdG9yKCcuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGxldCBuZXdJdGVtOiBIVE1MRWxlbWVudDtcclxuICAgIGxldCBuZXdJdGVtT3B0OiBHcmlkU3RhY2tOb2RlO1xyXG4gICAgaWYgKHNhdmVDb250ZW50KSB7XHJcbiAgICAgIHRoaXMuX3JlbW92ZUREKG5vZGUuZWwpOyAvLyByZW1vdmUgRCZEIHNpbmNlIGl0J3Mgc2V0IG9uIGNvbnRlbnQgZGl2XHJcbiAgICAgIG5ld0l0ZW1PcHQgPSB7Li4ubm9kZSwgeDowLCB5OjB9O1xyXG4gICAgICBVdGlscy5yZW1vdmVJbnRlcm5hbEZvclNhdmUobmV3SXRlbU9wdCk7XHJcbiAgICAgIGRlbGV0ZSBuZXdJdGVtT3B0LnN1YkdyaWRPcHRzO1xyXG4gICAgICBpZiAobm9kZS5jb250ZW50KSB7XHJcbiAgICAgICAgbmV3SXRlbU9wdC5jb250ZW50ID0gbm9kZS5jb250ZW50O1xyXG4gICAgICAgIGRlbGV0ZSBub2RlLmNvbnRlbnQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKEdyaWRTdGFjay5hZGRSZW1vdmVDQikge1xyXG4gICAgICAgIG5ld0l0ZW0gPSBHcmlkU3RhY2suYWRkUmVtb3ZlQ0IodGhpcy5lbCwgbmV3SXRlbU9wdCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBkb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJycpOyAvLyBJRSBuZWVkcyBhIHBhcmFtXHJcbiAgICAgICAgZG9jLmJvZHkuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW1cIj48L2Rpdj5gO1xyXG4gICAgICAgIG5ld0l0ZW0gPSBkb2MuYm9keS5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBuZXdJdGVtLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xyXG4gICAgICAgIGRvYy5ib2R5LmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnRcIj48L2Rpdj5gO1xyXG4gICAgICAgIGNvbnRlbnQgPSBkb2MuYm9keS5jaGlsZHJlblswXSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBub2RlLmVsLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3ByZXBhcmVEcmFnRHJvcEJ5Tm9kZShub2RlKTsgLy8gLi4uIGFuZCByZXN0b3JlIG9yaWdpbmFsIEQmRFxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHdlJ3JlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGl0ZW0sIG1ha2UgdGhlIGNvbnRhaW5lciBsYXJnZSBlbm91Z2ggdG8gaGF2ZSB0aGVtIGJvdGhcclxuICAgIGlmIChub2RlVG9BZGQpIHtcclxuICAgICAgbGV0IHcgPSBhdXRvQ29sdW1uID8gb3BzLmNvbHVtbiA6IG5vZGUudztcclxuICAgICAgbGV0IGggPSBub2RlLmggKyBub2RlVG9BZGQuaDtcclxuICAgICAgbGV0IHN0eWxlID0gbm9kZS5lbC5zdHlsZTtcclxuICAgICAgc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJzsgLy8gc2hvdyB1cCBpbnN0YW50bHkgc28gd2UgZG9uJ3Qgc2VlIHNjcm9sbGJhciB3aXRoIG5vZGVUb0FkZFxyXG4gICAgICB0aGlzLnVwZGF0ZShub2RlLmVsLCB7dywgaH0pO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+ICBzdHlsZS50cmFuc2l0aW9uID0gbnVsbCk7IC8vIHJlY292ZXIgYW5pbWF0aW9uXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHN1YkdyaWQgPSBub2RlLnN1YkdyaWQgPSBHcmlkU3RhY2suYWRkR3JpZChjb250ZW50LCBvcHMpO1xyXG4gICAgaWYgKG5vZGVUb0FkZD8uX21vdmluZykgc3ViR3JpZC5faXNUZW1wID0gdHJ1ZTsgLy8gcHJldmVudCByZS1uZXN0aW5nIGFzIHdlIGFkZCBvdmVyXHJcbiAgICBpZiAoYXV0b0NvbHVtbikgc3ViR3JpZC5fYXV0b0NvbHVtbiA9IHRydWU7XHJcblxyXG4gICAgLy8gYWRkIHRoZSBvcmlnaW5hbCBjb250ZW50IGJhY2sgYXMgYSBjaGlsZCBvZiBodGUgbmV3bHkgY3JlYXRlZCBncmlkXHJcbiAgICBpZiAoc2F2ZUNvbnRlbnQpIHtcclxuICAgICAgc3ViR3JpZC5hZGRXaWRnZXQobmV3SXRlbSwgbmV3SXRlbU9wdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbm93IGFkZCBhbnkgYWRkaXRpb25hbCBub2RlXHJcbiAgICBpZiAobm9kZVRvQWRkKSB7XHJcbiAgICAgIGlmIChub2RlVG9BZGQuX21vdmluZykge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBhbiBhcnRpZmljaWFsIGV2ZW50IGV2ZW4gZm9yIHRoZSBqdXN0IGNyZWF0ZWQgZ3JpZCB0byByZWNlaXZlIHRoaXMgaXRlbVxyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IFV0aWxzLnNpbXVsYXRlTW91c2VFdmVudChub2RlVG9BZGQuX2V2ZW50LCAnbW91c2VlbnRlcicsIHN1YkdyaWQuZWwpLCAwKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzdWJHcmlkLmFkZFdpZGdldChub2RlLmVsLCBub2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1YkdyaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBjYWxsZWQgd2hlbiBhbiBpdGVtIHdhcyBjb252ZXJ0ZWQgaW50byBhIG5lc3RlZCBncmlkIHRvIGFjY29tbW9kYXRlIGEgZHJhZ2dlZCBvdmVyIGl0ZW0sIGJ1dCB0aGVuIGl0ZW0gbGVhdmVzIC0gcmV0dXJuIGJhY2tcclxuICAgKiB0byB0aGUgb3JpZ2luYWwgZ3JpZC1pdGVtLiBBbHNvIGNhbGxlZCB0byByZW1vdmUgZW1wdHkgc3ViLWdyaWRzIHdoZW4gbGFzdCBpdGVtIGlzIGRyYWdnZWQgb3V0IChzaW5jZSByZS1jcmVhdGluZyBpcyBzaW1wbGUpXHJcbiAgICovXHJcbiAgcHVibGljIHJlbW92ZUFzU3ViR3JpZChub2RlVGhhdFJlbW92ZWQ/OiBHcmlkU3RhY2tOb2RlKTogdm9pZCB7XHJcbiAgICBsZXQgcEdyaWQgPSB0aGlzLnBhcmVudEdyaWRJdGVtPy5ncmlkO1xyXG4gICAgaWYgKCFwR3JpZCkgcmV0dXJuO1xyXG5cclxuICAgIHBHcmlkLmJhdGNoVXBkYXRlKCk7XHJcbiAgICBwR3JpZC5yZW1vdmVXaWRnZXQodGhpcy5wYXJlbnRHcmlkSXRlbS5lbCwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICB0aGlzLmVuZ2luZS5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICAvLyBtaWdyYXRlIGFueSBjaGlsZHJlbiBvdmVyIGFuZCBvZmZzZXR0aW5nIGJ5IG91ciBsb2NhdGlvblxyXG4gICAgICBuLnggKz0gdGhpcy5wYXJlbnRHcmlkSXRlbS54O1xyXG4gICAgICBuLnkgKz0gdGhpcy5wYXJlbnRHcmlkSXRlbS55O1xyXG4gICAgICBwR3JpZC5hZGRXaWRnZXQobi5lbCwgbik7XHJcbiAgICB9KTtcclxuICAgIHBHcmlkLmJhdGNoVXBkYXRlKGZhbHNlKTtcclxuICAgIGlmICh0aGlzLnBhcmVudEdyaWRJdGVtKSBkZWxldGUgdGhpcy5wYXJlbnRHcmlkSXRlbS5zdWJHcmlkO1xyXG4gICAgZGVsZXRlIHRoaXMucGFyZW50R3JpZEl0ZW07XHJcblxyXG4gICAgLy8gY3JlYXRlIGFuIGFydGlmaWNpYWwgZXZlbnQgZm9yIHRoZSBvcmlnaW5hbCBncmlkIG5vdyB0aGF0IHRoaXMgb25lIGlzIGdvbmUgKGdvdCBhIGxlYXZlLCBidXQgd29uJ3QgZ2V0IGVudGVyKVxyXG4gICAgaWYgKG5vZGVUaGF0UmVtb3ZlZCkge1xyXG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBVdGlscy5zaW11bGF0ZU1vdXNlRXZlbnQobm9kZVRoYXRSZW1vdmVkLl9ldmVudCwgJ21vdXNlZW50ZXInLCBwR3JpZC5lbCksIDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2F2ZXMgdGhlIGN1cnJlbnQgbGF5b3V0IHJldHVybmluZyBhIGxpc3Qgb2Ygd2lkZ2V0cyBmb3Igc2VyaWFsaXphdGlvbiB3aGljaCBtaWdodCBpbmNsdWRlIGFueSBuZXN0ZWQgZ3JpZHMuXHJcbiAgICogQHBhcmFtIHNhdmVDb250ZW50IGlmIHRydWUgKGRlZmF1bHQpIHRoZSBsYXRlc3QgaHRtbCBpbnNpZGUgLmdyaWQtc3RhY2stY29udGVudCB3aWxsIGJlIHNhdmVkIHRvIEdyaWRTdGFja1dpZGdldC5jb250ZW50IGZpZWxkLCBlbHNlIGl0IHdpbGxcclxuICAgKiBiZSByZW1vdmVkLlxyXG4gICAqIEBwYXJhbSBzYXZlR3JpZE9wdCBpZiB0cnVlIChkZWZhdWx0IGZhbHNlKSwgc2F2ZSB0aGUgZ3JpZCBvcHRpb25zIGl0c2VsZiwgc28geW91IGNhbiBjYWxsIHRoZSBuZXcgR3JpZFN0YWNrLmFkZEdyaWQoKVxyXG4gICAqIHRvIHJlY3JlYXRlIGV2ZXJ5dGhpbmcgZnJvbSBzY3JhdGNoLiBHcmlkU3RhY2tPcHRpb25zLmNoaWxkcmVuIHdvdWxkIHRoZW4gY29udGFpbiB0aGUgd2lkZ2V0IGxpc3QgaW5zdGVhZC5cclxuICAgKiBAcGFyYW0gc2F2ZUNCIGNhbGxiYWNrIGZvciBlYWNoIG5vZGUgLT4gd2lkZ2V0LCBzbyBhcHBsaWNhdGlvbiBjYW4gaW5zZXJ0IGFkZGl0aW9uYWwgZGF0YSB0byBiZSBzYXZlZCBpbnRvIHRoZSB3aWRnZXQgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAgICogQHJldHVybnMgbGlzdCBvZiB3aWRnZXRzIG9yIGZ1bGwgZ3JpZCBvcHRpb24sIGluY2x1ZGluZyAuY2hpbGRyZW4gbGlzdCBvZiB3aWRnZXRzXHJcbiAgICovXHJcbiAgcHVibGljIHNhdmUoc2F2ZUNvbnRlbnQgPSB0cnVlLCBzYXZlR3JpZE9wdCA9IGZhbHNlLCBzYXZlQ0IgPSBHcmlkU3RhY2suc2F2ZUNCKTogR3JpZFN0YWNrV2lkZ2V0W10gfCBHcmlkU3RhY2tPcHRpb25zIHtcclxuICAgIC8vIHJldHVybiBjb3BpZWQgR3JpZFN0YWNrV2lkZ2V0ICh3aXRoIG9wdGlvbmFsbHkgLmVsKSB3ZSBjYW4gbW9kaWZ5IGF0IHdpbGwuLi5cclxuICAgIGxldCBsaXN0ID0gdGhpcy5lbmdpbmUuc2F2ZShzYXZlQ29udGVudCwgc2F2ZUNCKTtcclxuXHJcbiAgICAvLyBjaGVjayBmb3IgSFRNTCBjb250ZW50IGFuZCBuZXN0ZWQgZ3JpZHNcclxuICAgIGxpc3QuZm9yRWFjaChuID0+IHtcclxuICAgICAgaWYgKHNhdmVDb250ZW50ICYmIG4uZWwgJiYgIW4uc3ViR3JpZCAmJiAhc2F2ZUNCKSB7IC8vIHN1Yi1ncmlkIGFyZSBzYXZlZCBkaWZmZXJlbnRseSwgbm90IHBsYWluIGNvbnRlbnRcclxuICAgICAgICBsZXQgc3ViID0gbi5lbC5xdWVyeVNlbGVjdG9yKCcuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnKTtcclxuICAgICAgICBuLmNvbnRlbnQgPSBzdWIgPyBzdWIuaW5uZXJIVE1MIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICghbi5jb250ZW50KSBkZWxldGUgbi5jb250ZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghc2F2ZUNvbnRlbnQgJiYgIXNhdmVDQikgeyBkZWxldGUgbi5jb250ZW50OyB9XHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIG5lc3RlZCBncmlkXHJcbiAgICAgICAgaWYgKG4uc3ViR3JpZD8uZWwpIHtcclxuICAgICAgICAgIGNvbnN0IGxpc3RPck9wdCA9IG4uc3ViR3JpZC5zYXZlKHNhdmVDb250ZW50LCBzYXZlR3JpZE9wdCwgc2F2ZUNCKTtcclxuICAgICAgICAgIG4uc3ViR3JpZE9wdHMgPSAoc2F2ZUdyaWRPcHQgPyBsaXN0T3JPcHQgOiB7Y2hpbGRyZW46IGxpc3RPck9wdH0pIGFzIEdyaWRTdGFja09wdGlvbnM7XHJcbiAgICAgICAgICBkZWxldGUgbi5zdWJHcmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBkZWxldGUgbi5lbDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGNoZWNrIGlmIHNhdmUgZW50aXJlIGdyaWQgb3B0aW9ucyAobmVlZGVkIGZvciByZWN1cnNpdmUpICsgY2hpbGRyZW4uLi5cclxuICAgIGlmIChzYXZlR3JpZE9wdCkge1xyXG4gICAgICBsZXQgbzogSW50ZXJuYWxHcmlkU3RhY2tPcHRpb25zID0gVXRpbHMuY2xvbmVEZWVwKHRoaXMub3B0cyk7XHJcbiAgICAgIC8vIGRlbGV0ZSBkZWZhdWx0IHZhbHVlcyB0aGF0IHdpbGwgYmUgcmVjcmVhdGVkIG9uIGxhdW5jaFxyXG4gICAgICBpZiAoby5tYXJnaW5Cb3R0b20gPT09IG8ubWFyZ2luVG9wICYmIG8ubWFyZ2luUmlnaHQgPT09IG8ubWFyZ2luTGVmdCAmJiBvLm1hcmdpblRvcCA9PT0gby5tYXJnaW5SaWdodCkge1xyXG4gICAgICAgIG8ubWFyZ2luID0gby5tYXJnaW5Ub3A7XHJcbiAgICAgICAgZGVsZXRlIG8ubWFyZ2luVG9wOyBkZWxldGUgby5tYXJnaW5SaWdodDsgZGVsZXRlIG8ubWFyZ2luQm90dG9tOyBkZWxldGUgby5tYXJnaW5MZWZ0O1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvLnJ0bCA9PT0gKHRoaXMuZWwuc3R5bGUuZGlyZWN0aW9uID09PSAncnRsJykpIHsgby5ydGwgPSAnYXV0bycgfVxyXG4gICAgICBpZiAodGhpcy5faXNBdXRvQ2VsbEhlaWdodCkge1xyXG4gICAgICAgIG8uY2VsbEhlaWdodCA9ICdhdXRvJ1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9hdXRvQ29sdW1uKSB7XHJcbiAgICAgICAgby5jb2x1bW4gPSAnYXV0byc7XHJcbiAgICAgICAgZGVsZXRlIG8uZGlzYWJsZU9uZUNvbHVtbk1vZGU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgb3JpZ1Nob3cgPSBvLl9hbHdheXNTaG93UmVzaXplSGFuZGxlO1xyXG4gICAgICBkZWxldGUgby5fYWx3YXlzU2hvd1Jlc2l6ZUhhbmRsZTtcclxuICAgICAgaWYgKG9yaWdTaG93ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBvLmFsd2F5c1Nob3dSZXNpemVIYW5kbGUgPSBvcmlnU2hvdztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZWxldGUgby5hbHdheXNTaG93UmVzaXplSGFuZGxlO1xyXG4gICAgICB9XHJcbiAgICAgIFV0aWxzLnJlbW92ZUludGVybmFsQW5kU2FtZShvLCBncmlkRGVmYXVsdHMpO1xyXG4gICAgICBvLmNoaWxkcmVuID0gbGlzdDtcclxuICAgICAgcmV0dXJuIG87XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxpc3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBsb2FkIHRoZSB3aWRnZXRzIGZyb20gYSBsaXN0LiBUaGlzIHdpbGwgY2FsbCB1cGRhdGUoKSBvbiBlYWNoIChtYXRjaGluZyBieSBpZCkgb3IgYWRkL3JlbW92ZSB3aWRnZXRzIHRoYXQgYXJlIG5vdCB0aGVyZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBsYXlvdXQgbGlzdCBvZiB3aWRnZXRzIGRlZmluaXRpb24gdG8gdXBkYXRlL2NyZWF0ZVxyXG4gICAqIEBwYXJhbSBhZGRBbmRSZW1vdmUgYm9vbGVhbiAoZGVmYXVsdCB0cnVlKSBvciBjYWxsYmFjayBtZXRob2QgY2FuIGJlIHBhc3NlZCB0byBjb250cm9sIGlmIGFuZCBob3cgbWlzc2luZyB3aWRnZXRzIGNhbiBiZSBhZGRlZC9yZW1vdmVkLCBnaXZpbmdcclxuICAgKiB0aGUgdXNlciBjb250cm9sIG9mIGluc2VydGlvbi5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogc2VlIGh0dHA6Ly9ncmlkc3RhY2tqcy5jb20vZGVtby9zZXJpYWxpemF0aW9uLmh0bWxcclxuICAgKiovXHJcbiAgcHVibGljIGxvYWQobGF5b3V0OiBHcmlkU3RhY2tXaWRnZXRbXSwgYWRkUmVtb3ZlOiBib29sZWFuIHwgQWRkUmVtb3ZlRmNuID0gR3JpZFN0YWNrLmFkZFJlbW92ZUNCIHx8IHRydWUpOiBHcmlkU3RhY2sge1xyXG4gICAgbGV0IGl0ZW1zID0gR3JpZFN0YWNrLlV0aWxzLnNvcnQoWy4uLmxheW91dF0sIC0xLCB0aGlzLl9wcmV2Q29sdW1uIHx8IHRoaXMuZ2V0Q29sdW1uKCkpOyAvLyBtYWtlIGNvcHkgYmVmb3JlIHdlIG1vZC9zb3J0XHJcbiAgICB0aGlzLl9pbnNlcnROb3RBcHBlbmQgPSB0cnVlOyAvLyBzaW5jZSBjcmVhdGUgaW4gcmV2ZXJzZSBvcmRlci4uLlxyXG5cclxuICAgIC8vIGlmIHdlJ3JlIGxvYWRpbmcgYSBsYXlvdXQgaW50byBmb3IgZXhhbXBsZSAxIGNvbHVtbiAoX3ByZXZDb2x1bW4gaXMgc2V0IG9ubHkgd2hlbiBnb2luZyB0byAxKSBhbmQgaXRlbXMgZG9uJ3QgZml0LCBtYWtlIHN1cmUgdG8gc2F2ZVxyXG4gICAgLy8gdGhlIG9yaWdpbmFsIHdhbnRlZCBsYXlvdXQgc28gd2UgY2FuIHNjYWxlIGJhY2sgdXAgY29ycmVjdGx5ICMxNDcxXHJcbiAgICBpZiAodGhpcy5fcHJldkNvbHVtbiAmJiB0aGlzLl9wcmV2Q29sdW1uICE9PSB0aGlzLm9wdHMuY29sdW1uICYmIGl0ZW1zLnNvbWUobiA9PiAobi54ICsgbi53KSA+ICh0aGlzLm9wdHMuY29sdW1uIGFzIG51bWJlcikpKSB7XHJcbiAgICAgIHRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlID0gdHJ1ZTsgLy8gc2tpcCBsYXlvdXQgdXBkYXRlXHJcbiAgICAgIHRoaXMuZW5naW5lLmNhY2hlTGF5b3V0KGl0ZW1zLCB0aGlzLl9wcmV2Q29sdW1uLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBnaXZlbiBhIGRpZmZlcmVudCBjYWxsYmFjaywgdGVtcG9yYWxseSBzZXQgaXQgYXMgZ2xvYmFsIG9wdGlvbiBzbyBjcmVhdGluZyB3aWxsIHVzZSBpdFxyXG4gICAgY29uc3QgcHJldkNCID0gR3JpZFN0YWNrLmFkZFJlbW92ZUNCO1xyXG4gICAgaWYgKHR5cGVvZihhZGRSZW1vdmUpID09PSAnZnVuY3Rpb24nKSBHcmlkU3RhY2suYWRkUmVtb3ZlQ0IgPSBhZGRSZW1vdmUgYXMgQWRkUmVtb3ZlRmNuO1xyXG5cclxuICAgIGxldCByZW1vdmVkOiBHcmlkU3RhY2tOb2RlW10gPSBbXTtcclxuICAgIHRoaXMuYmF0Y2hVcGRhdGUoKTtcclxuXHJcbiAgICAvLyBzZWUgaWYgYW55IGl0ZW1zIGFyZSBtaXNzaW5nIGZyb20gbmV3IGxheW91dCBhbmQgbmVlZCB0byBiZSByZW1vdmVkIGZpcnN0XHJcbiAgICBpZiAoYWRkUmVtb3ZlKSB7XHJcbiAgICAgIGxldCBjb3B5Tm9kZXMgPSBbLi4udGhpcy5lbmdpbmUubm9kZXNdOyAvLyBkb24ndCBsb29wIHRocm91Z2ggYXJyYXkgeW91IG1vZGlmeVxyXG4gICAgICBjb3B5Tm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zLmZpbmQodyA9PiBuLmlkID09PSB3LmlkKTtcclxuICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgIGlmIChHcmlkU3RhY2suYWRkUmVtb3ZlQ0IpXHJcbiAgICAgICAgICAgIEdyaWRTdGFjay5hZGRSZW1vdmVDQih0aGlzLmVsLCBuLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgcmVtb3ZlZC5wdXNoKG4pOyAvLyBiYXRjaCBrZWVwIHRyYWNrXHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVdpZGdldChuLmVsLCB0cnVlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBub3cgYWRkL3VwZGF0ZSB0aGUgd2lkZ2V0c1xyXG4gICAgaXRlbXMuZm9yRWFjaCh3ID0+IHtcclxuICAgICAgbGV0IGl0ZW0gPSAody5pZCAhPT0gdW5kZWZpbmVkKSA/IHRoaXMuZW5naW5lLm5vZGVzLmZpbmQobiA9PiBuLmlkID09PSB3LmlkKSA6IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZShpdGVtLmVsLCB3KTtcclxuICAgICAgICBpZiAody5zdWJHcmlkT3B0cz8uY2hpbGRyZW4pIHsgLy8gdXBkYXRlIGFueSBzdWIgZ3JpZCBhcyB3ZWxsXHJcbiAgICAgICAgICBsZXQgc3ViID0gaXRlbS5lbC5xdWVyeVNlbGVjdG9yKCcuZ3JpZC1zdGFjaycpIGFzIEdyaWRIVE1MRWxlbWVudDtcclxuICAgICAgICAgIGlmIChzdWIgJiYgc3ViLmdyaWRzdGFjaykge1xyXG4gICAgICAgICAgICBzdWIuZ3JpZHN0YWNrLmxvYWQody5zdWJHcmlkT3B0cy5jaGlsZHJlbik7IC8vIFRPRE86IHN1cHBvcnQgdXBkYXRpbmcgZ3JpZCBvcHRpb25zID9cclxuICAgICAgICAgICAgdGhpcy5faW5zZXJ0Tm90QXBwZW5kID0gdHJ1ZTsgLy8gZ290IHJlc2V0IGJ5IGFib3ZlIGNhbGxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoYWRkUmVtb3ZlKSB7XHJcbiAgICAgICAgdGhpcy5hZGRXaWRnZXQodyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZW5naW5lLnJlbW92ZWROb2RlcyA9IHJlbW92ZWQ7XHJcbiAgICB0aGlzLmJhdGNoVXBkYXRlKGZhbHNlKTtcclxuXHJcbiAgICAvLyBhZnRlciBjb21taXQsIGNsZWFyIHRoYXQgZmxhZ1xyXG4gICAgZGVsZXRlIHRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlO1xyXG4gICAgZGVsZXRlIHRoaXMuX2luc2VydE5vdEFwcGVuZDtcclxuICAgIHByZXZDQiA/IEdyaWRTdGFjay5hZGRSZW1vdmVDQiA9IHByZXZDQiA6IGRlbGV0ZSBHcmlkU3RhY2suYWRkUmVtb3ZlQ0I7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHVzZSBiZWZvcmUgY2FsbGluZyBhIGJ1bmNoIG9mIGBhZGRXaWRnZXQoKWAgdG8gcHJldmVudCB1bi1uZWNlc3NhcnkgcmVsYXlvdXRzIGluIGJldHdlZW4gKG1vcmUgZWZmaWNpZW50KVxyXG4gICAqIGFuZCBnZXQgYSBzaW5nbGUgZXZlbnQgY2FsbGJhY2suIFlvdSB3aWxsIHNlZSBubyBjaGFuZ2VzIHVudGlsIGBiYXRjaFVwZGF0ZShmYWxzZSlgIGlzIGNhbGxlZC5cclxuICAgKi9cclxuICBwdWJsaWMgYmF0Y2hVcGRhdGUoZmxhZyA9IHRydWUpOiBHcmlkU3RhY2sge1xyXG4gICAgdGhpcy5lbmdpbmUuYmF0Y2hVcGRhdGUoZmxhZyk7XHJcbiAgICBpZiAoIWZsYWcpIHtcclxuICAgICAgdGhpcy5fdHJpZ2dlclJlbW92ZUV2ZW50KCk7XHJcbiAgICAgIHRoaXMuX3RyaWdnZXJBZGRFdmVudCgpO1xyXG4gICAgICB0aGlzLl90cmlnZ2VyQ2hhbmdlRXZlbnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBjdXJyZW50IGNlbGwgaGVpZ2h0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRDZWxsSGVpZ2h0KGZvcmNlUGl4ZWwgPSBmYWxzZSk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5vcHRzLmNlbGxIZWlnaHQgJiYgdGhpcy5vcHRzLmNlbGxIZWlnaHQgIT09ICdhdXRvJyAmJlxyXG4gICAgICAgKCFmb3JjZVBpeGVsIHx8ICF0aGlzLm9wdHMuY2VsbEhlaWdodFVuaXQgfHwgdGhpcy5vcHRzLmNlbGxIZWlnaHRVbml0ID09PSAncHgnKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5vcHRzLmNlbGxIZWlnaHQgYXMgbnVtYmVyO1xyXG4gICAgfVxyXG4gICAgLy8gZWxzZSBnZXQgZmlyc3QgY2VsbCBoZWlnaHRcclxuICAgIGxldCBlbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLicgKyB0aGlzLm9wdHMuaXRlbUNsYXNzKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChlbCkge1xyXG4gICAgICBsZXQgaGVpZ2h0ID0gVXRpbHMudG9OdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdncy1oJykpIHx8IDE7IC8vIHNpbmNlIHdlIGRvbid0IHdyaXRlIDEgYW55bW9yZVxyXG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChlbC5vZmZzZXRIZWlnaHQgLyBoZWlnaHQpO1xyXG4gICAgfVxyXG4gICAgLy8gZWxzZSBkbyBlbnRpcmUgZ3JpZCBhbmQgIyBvZiByb3dzIChidXQgZG9lc24ndCB3b3JrIGlmIG1pbi1oZWlnaHQgaXMgdGhlIGFjdHVhbCBjb25zdHJhaW4pXHJcbiAgICBsZXQgcm93cyA9IHBhcnNlSW50KHRoaXMuZWwuZ2V0QXR0cmlidXRlKCdncy1jdXJyZW50LXJvdycpKTtcclxuICAgIHJldHVybiByb3dzID8gTWF0aC5yb3VuZCh0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAvIHJvd3MpIDogdGhpcy5vcHRzLmNlbGxIZWlnaHQgYXMgbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGN1cnJlbnQgY2VsbCBoZWlnaHQgLSBzZWUgYEdyaWRTdGFja09wdGlvbnMuY2VsbEhlaWdodGAgZm9yIGZvcm1hdC5cclxuICAgKiBUaGlzIG1ldGhvZCByZWJ1aWxkcyBhbiBpbnRlcm5hbCBDU1Mgc3R5bGUgc2hlZXQuXHJcbiAgICogTm90ZTogWW91IGNhbiBleHBlY3QgcGVyZm9ybWFuY2UgaXNzdWVzIGlmIGNhbGwgdGhpcyBtZXRob2QgdG9vIG9mdGVuLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHZhbCB0aGUgY2VsbCBoZWlnaHQuIElmIG5vdCBwYXNzZWQgKHVuZGVmaW5lZCksIGNlbGxzIGNvbnRlbnQgd2lsbCBiZSBtYWRlIHNxdWFyZSAobWF0Y2ggd2lkdGggbWludXMgbWFyZ2luKSxcclxuICAgKiBpZiBwYXNzIDAgdGhlIENTUyB3aWxsIGJlIGdlbmVyYXRlZCBieSB0aGUgYXBwbGljYXRpb24gaW5zdGVhZC5cclxuICAgKiBAcGFyYW0gdXBkYXRlIChPcHRpb25hbCkgaWYgZmFsc2UsIHN0eWxlcyB3aWxsIG5vdCBiZSB1cGRhdGVkXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGdyaWQuY2VsbEhlaWdodCgxMDApOyAvLyBzYW1lIGFzIDEwMHB4XHJcbiAgICogZ3JpZC5jZWxsSGVpZ2h0KCc3MHB4Jyk7XHJcbiAgICogZ3JpZC5jZWxsSGVpZ2h0KGdyaWQuY2VsbFdpZHRoKCkgKiAxLjIpO1xyXG4gICAqL1xyXG4gIHB1YmxpYyBjZWxsSGVpZ2h0KHZhbD86IG51bWJlck9yU3RyaW5nLCB1cGRhdGUgPSB0cnVlKTogR3JpZFN0YWNrIHtcclxuXHJcbiAgICAvLyBpZiBub3QgY2FsbGVkIGludGVybmFsbHksIGNoZWNrIGlmIHdlJ3JlIGNoYW5naW5nIG1vZGVcclxuICAgIGlmICh1cGRhdGUgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHRoaXMuX2lzQXV0b0NlbGxIZWlnaHQgIT09ICh2YWwgPT09ICdhdXRvJykpIHtcclxuICAgICAgICB0aGlzLl9pc0F1dG9DZWxsSGVpZ2h0ID0gKHZhbCA9PT0gJ2F1dG8nKTtcclxuICAgICAgICB0aGlzLl91cGRhdGVXaW5kb3dSZXNpemVFdmVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodmFsID09PSAnaW5pdGlhbCcgfHwgdmFsID09PSAnYXV0bycpIHsgdmFsID0gdW5kZWZpbmVkOyB9XHJcblxyXG4gICAgLy8gbWFrZSBpdGVtIGNvbnRlbnQgYmUgc3F1YXJlXHJcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IG1hcmdpbkRpZmYgPSAtICh0aGlzLm9wdHMubWFyZ2luUmlnaHQgYXMgbnVtYmVyKSAtICh0aGlzLm9wdHMubWFyZ2luTGVmdCBhcyBudW1iZXIpXHJcbiAgICAgICAgKyAodGhpcy5vcHRzLm1hcmdpblRvcCBhcyBudW1iZXIpICsgKHRoaXMub3B0cy5tYXJnaW5Cb3R0b20gYXMgbnVtYmVyKTtcclxuICAgICAgdmFsID0gdGhpcy5jZWxsV2lkdGgoKSArIG1hcmdpbkRpZmY7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRhdGEgPSBVdGlscy5wYXJzZUhlaWdodCh2YWwpO1xyXG4gICAgaWYgKHRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdCA9PT0gZGF0YS51bml0ICYmIHRoaXMub3B0cy5jZWxsSGVpZ2h0ID09PSBkYXRhLmgpIHtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wdHMuY2VsbEhlaWdodFVuaXQgPSBkYXRhLnVuaXQ7XHJcbiAgICB0aGlzLm9wdHMuY2VsbEhlaWdodCA9IGRhdGEuaDtcclxuXHJcbiAgICBpZiAodXBkYXRlKSB7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZVN0eWxlcyh0cnVlKTsgLy8gdHJ1ZSA9IGZvcmNlIHJlLWNyZWF0ZSBmb3IgY3VycmVudCAjIG9mIHJvd3NcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdldHMgY3VycmVudCBjZWxsIHdpZHRoLiAqL1xyXG4gIHB1YmxpYyBjZWxsV2lkdGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl93aWR0aE9yQ29udGFpbmVyKCkgLyB0aGlzLmdldENvbHVtbigpO1xyXG4gIH1cclxuICAvKiogcmV0dXJuIG91ciBleHBlY3RlZCB3aWR0aCAob3IgcGFyZW50KSBmb3IgMSBjb2x1bW4gY2hlY2sgKi9cclxuICBwcm90ZWN0ZWQgX3dpZHRoT3JDb250YWluZXIoKTogbnVtYmVyIHtcclxuICAgIC8vIHVzZSBgb2Zmc2V0V2lkdGhgIG9yIGBjbGllbnRXaWR0aGAgKG5vIHNjcm9sbGJhcikgP1xyXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjEwNjQxMDEvdW5kZXJzdGFuZGluZy1vZmZzZXR3aWR0aC1jbGllbnR3aWR0aC1zY3JvbGx3aWR0aC1hbmQtaGVpZ2h0LXJlc3BlY3RpdmVseVxyXG4gICAgcmV0dXJuICh0aGlzLmVsLmNsaWVudFdpZHRoIHx8IHRoaXMuZWwucGFyZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aCk7XHJcbiAgfVxyXG5cclxuICAvKiogcmUtbGF5b3V0IGdyaWQgaXRlbXMgdG8gcmVjbGFpbSBhbnkgZW1wdHkgc3BhY2UgKi9cclxuICBwdWJsaWMgY29tcGFjdCgpOiBHcmlkU3RhY2sge1xyXG4gICAgdGhpcy5lbmdpbmUuY29tcGFjdCgpO1xyXG4gICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHNldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQuIFdpbGwgdXBkYXRlIGV4aXN0aW5nIHdpZGdldHMgdG8gY29uZm9ybSB0byBuZXcgbnVtYmVyIG9mIGNvbHVtbnMsXHJcbiAgICogYXMgd2VsbCBhcyBjYWNoZSB0aGUgb3JpZ2luYWwgbGF5b3V0IHNvIHlvdSBjYW4gcmV2ZXJ0IGJhY2sgdG8gcHJldmlvdXMgcG9zaXRpb25zIHdpdGhvdXQgbG9zcy5cclxuICAgKiBSZXF1aXJlcyBgZ3JpZHN0YWNrLWV4dHJhLmNzc2Agb3IgYGdyaWRzdGFjay1leHRyYS5taW4uY3NzYCBmb3IgWzItMTFdLFxyXG4gICAqIGVsc2UgeW91IHdpbGwgbmVlZCB0byBnZW5lcmF0ZSBjb3JyZWN0IENTUyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkc3RhY2svZ3JpZHN0YWNrLmpzI2NoYW5nZS1ncmlkLWNvbHVtbnMpXHJcbiAgICogQHBhcmFtIGNvbHVtbiAtIEludGVnZXIgPiAwIChkZWZhdWx0IDEyKS5cclxuICAgKiBAcGFyYW0gbGF5b3V0IHNwZWNpZnkgdGhlIHR5cGUgb2YgcmUtbGF5b3V0IHRoYXQgd2lsbCBoYXBwZW4gKHBvc2l0aW9uLCBzaXplLCBldGMuLi4pLlxyXG4gICAqIE5vdGU6IGl0ZW1zIHdpbGwgbmV2ZXIgYmUgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBjb2x1bW4gYm91bmRhcmllcy4gZGVmYXVsdCAobW92ZVNjYWxlKS4gSWdub3JlZCBmb3IgMSBjb2x1bW5cclxuICAgKi9cclxuICBwdWJsaWMgY29sdW1uKGNvbHVtbjogbnVtYmVyLCBsYXlvdXQ6IENvbHVtbk9wdGlvbnMgPSAnbW92ZVNjYWxlJyk6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAoY29sdW1uIDwgMSB8fCB0aGlzLm9wdHMuY29sdW1uID09PSBjb2x1bW4pIHJldHVybiB0aGlzO1xyXG4gICAgbGV0IG9sZENvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uKCk7XHJcblxyXG4gICAgLy8gaWYgd2UgZ28gaW50byAxIGNvbHVtbiBtb2RlICh3aGljaCBoYXBwZW5zIGlmIHdlJ3JlIHNpemVkIGxlc3MgdGhhbiBtaW5XIHVubGVzcyBkaXNhYmxlT25lQ29sdW1uTW9kZSBpcyBvbilcclxuICAgIC8vIHRoZW4gcmVtZW1iZXIgdGhlIG9yaWdpbmFsIGNvbHVtbnMgc28gd2UgY2FuIHJlc3RvcmUuXHJcbiAgICBpZiAoY29sdW1uID09PSAxKSB7XHJcbiAgICAgIHRoaXMuX3ByZXZDb2x1bW4gPSBvbGRDb2x1bW47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkZWxldGUgdGhpcy5fcHJldkNvbHVtbjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ2dzLScgKyBvbGRDb2x1bW4pO1xyXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCdncy0nICsgY29sdW1uKTtcclxuICAgIHRoaXMub3B0cy5jb2x1bW4gPSB0aGlzLmVuZ2luZS5jb2x1bW4gPSBjb2x1bW47XHJcblxyXG4gICAgLy8gdXBkYXRlIHRoZSBpdGVtcyBub3cgLSBzZWUgaWYgdGhlIGRvbSBvcmRlciBub2RlcyBzaG91bGQgYmUgcGFzc2VkIGluc3RlYWQgKGVsc2UgZGVmYXVsdCB0byBjdXJyZW50IGxpc3QpXHJcbiAgICBsZXQgZG9tTm9kZXM6IEdyaWRTdGFja05vZGVbXTtcclxuICAgIGlmIChjb2x1bW4gPT09IDEgJiYgdGhpcy5vcHRzLm9uZUNvbHVtbk1vZGVEb21Tb3J0KSB7XHJcbiAgICAgIGRvbU5vZGVzID0gW107XHJcbiAgICAgIHRoaXMuZ2V0R3JpZEl0ZW1zKCkuZm9yRWFjaChlbCA9PiB7IC8vIGdldCBkb20gZWxlbWVudHMgaW4gb3JkZXJcclxuICAgICAgICBpZiAoZWwuZ3JpZHN0YWNrTm9kZSkgeyBkb21Ob2Rlcy5wdXNoKGVsLmdyaWRzdGFja05vZGUpOyB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoIWRvbU5vZGVzLmxlbmd0aCkgeyBkb21Ob2RlcyA9IHVuZGVmaW5lZDsgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbmdpbmUudXBkYXRlTm9kZVdpZHRocyhvbGRDb2x1bW4sIGNvbHVtbiwgZG9tTm9kZXMsIGxheW91dCk7XHJcbiAgICBpZiAodGhpcy5faXNBdXRvQ2VsbEhlaWdodCkgdGhpcy5jZWxsSGVpZ2h0KCk7XHJcblxyXG4gICAgLy8gYW5kIHRyaWdnZXIgb3VyIGV2ZW50IGxhc3QuLi5cclxuICAgIHRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlID0gdHJ1ZTsgLy8gc2tpcCBsYXlvdXQgdXBkYXRlXHJcbiAgICB0aGlzLl90cmlnZ2VyQ2hhbmdlRXZlbnQoKTtcclxuICAgIGRlbGV0ZSB0aGlzLl9pZ25vcmVMYXlvdXRzTm9kZUNoYW5nZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGdyaWQgKGRlZmF1bHQgMTIpXHJcbiAgICovXHJcbiAgcHVibGljIGdldENvbHVtbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0cy5jb2x1bW4gYXMgbnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgLyoqIHJldHVybnMgYW4gYXJyYXkgb2YgZ3JpZCBIVE1MIGVsZW1lbnRzIChubyBwbGFjZWhvbGRlcikgLSB1c2VkIHRvIGl0ZXJhdGUgdGhyb3VnaCBvdXIgY2hpbGRyZW4gaW4gRE9NIG9yZGVyICovXHJcbiAgcHVibGljIGdldEdyaWRJdGVtcygpOiBHcmlkSXRlbUhUTUxFbGVtZW50W10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbC5jaGlsZHJlbilcclxuICAgICAgLmZpbHRlcigoZWw6IEhUTUxFbGVtZW50KSA9PiBlbC5tYXRjaGVzKCcuJyArIHRoaXMub3B0cy5pdGVtQ2xhc3MpICYmICFlbC5tYXRjaGVzKCcuJyArIHRoaXMub3B0cy5wbGFjZWhvbGRlckNsYXNzKSkgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzdHJveXMgYSBncmlkIGluc3RhbmNlLiBETyBOT1QgQ0FMTCBhbnkgbWV0aG9kcyBvciBhY2Nlc3MgYW55IHZhcnMgYWZ0ZXIgdGhpcyBhcyBpdCB3aWxsIGZyZWUgdXAgbWVtYmVycy5cclxuICAgKiBAcGFyYW0gcmVtb3ZlRE9NIGlmIGBmYWxzZWAgZ3JpZCBhbmQgaXRlbXMgSFRNTCBlbGVtZW50cyB3aWxsIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIERPTSAoT3B0aW9uYWwuIERlZmF1bHQgYHRydWVgKS5cclxuICAgKi9cclxuICBwdWJsaWMgZGVzdHJveShyZW1vdmVET00gPSB0cnVlKTogR3JpZFN0YWNrIHtcclxuICAgIGlmICghdGhpcy5lbCkgcmV0dXJuOyAvLyBwcmV2ZW50IG11bHRpcGxlIGNhbGxzXHJcbiAgICB0aGlzLm9mZkFsbCgpO1xyXG4gICAgdGhpcy5fdXBkYXRlV2luZG93UmVzaXplRXZlbnQodHJ1ZSk7XHJcbiAgICB0aGlzLnNldFN0YXRpYyh0cnVlLCBmYWxzZSk7IC8vIHBlcm1hbmVudGx5IHJlbW92ZXMgREQgYnV0IGRvbid0IHNldCBDU1MgY2xhc3MgKHdlJ3JlIGdvaW5nIGF3YXkpXHJcbiAgICB0aGlzLnNldEFuaW1hdGlvbihmYWxzZSk7XHJcbiAgICBpZiAoIXJlbW92ZURPTSkge1xyXG4gICAgICB0aGlzLnJlbW92ZUFsbChyZW1vdmVET00pO1xyXG4gICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fc3R5bGVTaGVldENsYXNzKTtcclxuICAgICAgdGhpcy5lbC5yZW1vdmVBdHRyaWJ1dGUoJ2dzLWN1cnJlbnQtcm93Jyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZW1vdmVTdHlsZXNoZWV0KCk7XHJcbiAgICBpZiAodGhpcy5wYXJlbnRHcmlkSXRlbSkgZGVsZXRlIHRoaXMucGFyZW50R3JpZEl0ZW0uc3ViR3JpZDtcclxuICAgIGRlbGV0ZSB0aGlzLnBhcmVudEdyaWRJdGVtO1xyXG4gICAgZGVsZXRlIHRoaXMub3B0cztcclxuICAgIGRlbGV0ZSB0aGlzLl9wbGFjZWhvbGRlcjtcclxuICAgIGRlbGV0ZSB0aGlzLmVuZ2luZTtcclxuICAgIGRlbGV0ZSB0aGlzLmVsLmdyaWRzdGFjazsgLy8gcmVtb3ZlIGNpcmN1bGFyIGRlcGVuZGVuY3kgdGhhdCB3b3VsZCBwcmV2ZW50IGEgZnJlZWluZ1xyXG4gICAgZGVsZXRlIHRoaXMuZWw7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGVuYWJsZS9kaXNhYmxlIGZsb2F0aW5nIHdpZGdldHMgKGRlZmF1bHQ6IGBmYWxzZWApIFNlZSBbZXhhbXBsZV0oaHR0cDovL2dyaWRzdGFja2pzLmNvbS9kZW1vL2Zsb2F0Lmh0bWwpXHJcbiAgICovXHJcbiAgcHVibGljIGZsb2F0KHZhbDogYm9vbGVhbik6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAodGhpcy5vcHRzLmZsb2F0ICE9PSB2YWwpIHtcclxuICAgICAgdGhpcy5vcHRzLmZsb2F0ID0gdGhpcy5lbmdpbmUuZmxvYXQgPSB2YWw7XHJcbiAgICAgIHRoaXMuX3RyaWdnZXJDaGFuZ2VFdmVudCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgdGhlIGN1cnJlbnQgZmxvYXQgbW9kZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGbG9hdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmVuZ2luZS5mbG9hdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNlbGwgdW5kZXIgYSBwaXhlbCBvbiBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gcmVzb2x2ZSBpblxyXG4gICAqIGFic29sdXRlIGNvb3JkaW5hdGVzLCBhcyBhbiBvYmplY3Qgd2l0aCB0b3AgYW5kIGxlZnQgcHJvcGVydGllc1xyXG4gICAqIEBwYXJhbSB1c2VEb2NSZWxhdGl2ZSBpZiB0cnVlLCB2YWx1ZSB3aWxsIGJlIGJhc2VkIG9uIGRvY3VtZW50IHBvc2l0aW9uIHZzIHBhcmVudCBwb3NpdGlvbiAoT3B0aW9uYWwuIERlZmF1bHQgZmFsc2UpLlxyXG4gICAqIFVzZWZ1bCB3aGVuIGdyaWQgaXMgd2l0aGluIGBwb3NpdGlvbjogcmVsYXRpdmVgIGVsZW1lbnRcclxuICAgKlxyXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyBgeGAgYW5kIGB5YCBpLmUuIHRoZSBjb2x1bW4gYW5kIHJvdyBpbiB0aGUgZ3JpZC5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Q2VsbEZyb21QaXhlbChwb3NpdGlvbjogTW91c2VQb3NpdGlvbiwgdXNlRG9jUmVsYXRpdmUgPSBmYWxzZSk6IENlbGxQb3NpdGlvbiB7XHJcbiAgICBsZXQgYm94ID0gdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKGBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbGVmdDogJHtib3gubGVmdH0gdG9wOiAke2JveC50b3B9IHc6ICR7Ym94Lnd9IGg6ICR7Ym94Lmh9YClcclxuICAgIGxldCBjb250YWluZXJQb3M6IHt0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfTtcclxuICAgIGlmICh1c2VEb2NSZWxhdGl2ZSkge1xyXG4gICAgICBjb250YWluZXJQb3MgPSB7dG9wOiBib3gudG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgbGVmdDogYm94LmxlZnR9O1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgZ2V0Q2VsbEZyb21QaXhlbCBzY3JvbGxUb3A6ICR7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcH1gKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29udGFpbmVyUG9zID0ge3RvcDogdGhpcy5lbC5vZmZzZXRUb3AsIGxlZnQ6IHRoaXMuZWwub2Zmc2V0TGVmdH1cclxuICAgICAgLy8gY29uc29sZS5sb2coYGdldENlbGxGcm9tUGl4ZWwgb2Zmc2V0VG9wOiAke2NvbnRhaW5lclBvcy5sZWZ0fSBvZmZzZXRMZWZ0OiAke2NvbnRhaW5lclBvcy50b3B9YClcclxuICAgIH1cclxuICAgIGxldCByZWxhdGl2ZUxlZnQgPSBwb3NpdGlvbi5sZWZ0IC0gY29udGFpbmVyUG9zLmxlZnQ7XHJcbiAgICBsZXQgcmVsYXRpdmVUb3AgPSBwb3NpdGlvbi50b3AgLSBjb250YWluZXJQb3MudG9wO1xyXG5cclxuICAgIGxldCBjb2x1bW5XaWR0aCA9IChib3gud2lkdGggLyB0aGlzLmdldENvbHVtbigpKTtcclxuICAgIGxldCByb3dIZWlnaHQgPSAoYm94LmhlaWdodCAvIHBhcnNlSW50KHRoaXMuZWwuZ2V0QXR0cmlidXRlKCdncy1jdXJyZW50LXJvdycpKSk7XHJcblxyXG4gICAgcmV0dXJuIHt4OiBNYXRoLmZsb29yKHJlbGF0aXZlTGVmdCAvIGNvbHVtbldpZHRoKSwgeTogTWF0aC5mbG9vcihyZWxhdGl2ZVRvcCAvIHJvd0hlaWdodCl9O1xyXG4gIH1cclxuXHJcbiAgLyoqIHJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHJvd3MsIHdoaWNoIHdpbGwgYmUgYXQgbGVhc3QgYG1pblJvd2AgaWYgc2V0ICovXHJcbiAgcHVibGljIGdldFJvdygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuZW5naW5lLmdldFJvdygpLCB0aGlzLm9wdHMubWluUm93KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBzcGVjaWZpZWQgYXJlYSBpcyBlbXB0eS5cclxuICAgKiBAcGFyYW0geCB0aGUgcG9zaXRpb24geC5cclxuICAgKiBAcGFyYW0geSB0aGUgcG9zaXRpb24geS5cclxuICAgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdG8gY2hlY2tcclxuICAgKiBAcGFyYW0gaCB0aGUgaGVpZ2h0IG9mIHRvIGNoZWNrXHJcbiAgICovXHJcbiAgcHVibGljIGlzQXJlYUVtcHR5KHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLmlzQXJlYUVtcHR5KHgsIHksIHcsIGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWYgeW91IGFkZCBlbGVtZW50cyB0byB5b3VyIGdyaWQgYnkgaGFuZCAob3IgaGF2ZSBzb21lIGZyYW1ld29yayBjcmVhdGluZyBET00pLCB5b3UgaGF2ZSB0byB0ZWxsIGdyaWRzdGFjayBhZnRlcndhcmRzIHRvIG1ha2UgdGhlbSB3aWRnZXRzLlxyXG4gICAqIElmIHlvdSB3YW50IGdyaWRzdGFjayB0byBhZGQgdGhlIGVsZW1lbnRzIGZvciB5b3UsIHVzZSBgYWRkV2lkZ2V0KClgIGluc3RlYWQuXHJcbiAgICogTWFrZXMgdGhlIGdpdmVuIGVsZW1lbnQgYSB3aWRnZXQgYW5kIHJldHVybnMgaXQuXHJcbiAgICogQHBhcmFtIGVscyB3aWRnZXQgb3Igc2luZ2xlIHNlbGVjdG9yIHRvIGNvbnZlcnQuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgd2lkZ2V0IGRlZmluaXRpb24gdG8gdXNlIGluc3RlYWQgb2YgcmVhZGluZyBhdHRyaWJ1dGVzIG9yIHVzaW5nIGRlZmF1bHQgc2l6aW5nIHZhbHVlc1xyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBsZXQgZ3JpZCA9IEdyaWRTdGFjay5pbml0KCk7XHJcbiAgICogZ3JpZC5lbC5hcHBlbmRDaGlsZCgnPGRpdiBpZD1cIjFcIiBncy13PVwiM1wiPjwvZGl2PicpO1xyXG4gICAqIGdyaWQuZWwuYXBwZW5kQ2hpbGQoJzxkaXYgaWQ9XCIyXCI+PC9kaXY+Jyk7XHJcbiAgICogZ3JpZC5tYWtlV2lkZ2V0KCcxJyk7XHJcbiAgICogZ3JpZC5tYWtlV2lkZ2V0KCcyJywge3c6MiwgY29udGVudDogJ2hlbGxvJ30pO1xyXG4gICAqL1xyXG4gIHB1YmxpYyBtYWtlV2lkZ2V0KGVsczogR3JpZFN0YWNrRWxlbWVudCwgb3B0aW9ucz86IEdyaWRTdGFja1dpZGdldCk6IEdyaWRJdGVtSFRNTEVsZW1lbnQge1xyXG4gICAgbGV0IGVsID0gR3JpZFN0YWNrLmdldEVsZW1lbnQoZWxzKTtcclxuICAgIHRoaXMuX3ByZXBhcmVFbGVtZW50KGVsLCB0cnVlLCBvcHRpb25zKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRhaW5lckhlaWdodCgpO1xyXG5cclxuICAgIC8vIHNlZSBpZiB0aGVyZSBpcyBhIHN1Yi1ncmlkIHRvIGNyZWF0ZVxyXG4gICAgY29uc3Qgbm9kZSA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICBpZiAobm9kZS5zdWJHcmlkT3B0cykge1xyXG4gICAgICB0aGlzLm1ha2VTdWJHcmlkKGVsLCBub2RlLnN1YkdyaWRPcHRzLCB1bmRlZmluZWQsIGZhbHNlKTsgLy8gbm9kZS5zdWJHcmlkIHdpbGwgYmUgdXNlZCBhcyBvcHRpb24gaW4gbWV0aG9kLCBubyBuZWVkIHRvIHBhc3NcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiB3ZSdyZSBhZGRpbmcgYW4gaXRlbSBpbnRvIDEgY29sdW1uIChfcHJldkNvbHVtbiBpcyBzZXQgb25seSB3aGVuIGdvaW5nIHRvIDEpIG1ha2Ugc3VyZVxyXG4gICAgLy8gd2UgZG9uJ3Qgb3ZlcnJpZGUgdGhlIGxhcmdlciAxMiBjb2x1bW4gbGF5b3V0IHRoYXQgd2FzIGFscmVhZHkgc2F2ZWQuICMxOTg1XHJcbiAgICBpZiAodGhpcy5fcHJldkNvbHVtbiAmJiB0aGlzLm9wdHMuY29sdW1uID09PSAxKSB7XHJcbiAgICAgIHRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuX3RyaWdnZXJBZGRFdmVudCgpO1xyXG4gICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcbiAgICBkZWxldGUgdGhpcy5faWdub3JlTGF5b3V0c05vZGVDaGFuZ2U7XHJcblxyXG4gICAgcmV0dXJuIGVsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgaGFuZGxlciB0aGF0IGV4dHJhY3RzIG91ciBDdXN0b21FdmVudCBkYXRhIG91dCBhdXRvbWF0aWNhbGx5IGZvciByZWNlaXZpbmcgY3VzdG9tXHJcbiAgICogbm90aWZpY2F0aW9ucyAoc2VlIGRvYyBmb3Igc3VwcG9ydGVkIGV2ZW50cylcclxuICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZXZlbnQgKHNlZSBwb3NzaWJsZSB2YWx1ZXMpIG9yIGxpc3Qgb2YgbmFtZXMgc3BhY2Ugc2VwYXJhdGVkXHJcbiAgICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aXRoIGV2ZW50IGFuZCBvcHRpb25hbCBzZWNvbmQvdGhpcmQgcGFyYW1cclxuICAgKiAoc2VlIFJFQURNRSBkb2N1bWVudGF0aW9uIGZvciBlYWNoIHNpZ25hdHVyZSkuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGdyaWQub24oJ2FkZGVkJywgZnVuY3Rpb24oZSwgaXRlbXMpIHsgbG9nKCdhZGRlZCAnLCBpdGVtcyl9ICk7XHJcbiAgICogb3JcclxuICAgKiBncmlkLm9uKCdhZGRlZCByZW1vdmVkIGNoYW5nZScsIGZ1bmN0aW9uKGUsIGl0ZW1zKSB7IGxvZyhlLnR5cGUsIGl0ZW1zKX0gKTtcclxuICAgKlxyXG4gICAqIE5vdGU6IGluIHNvbWUgY2FzZXMgaXQgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBuYXRpdmUgaGFuZGxlciBhbmQgcGFyc2luZyB0aGUgZXZlbnQuXHJcbiAgICogZ3JpZC5lbC5hZGRFdmVudExpc3RlbmVyKCdhZGRlZCcsIGZ1bmN0aW9uKGV2ZW50KSB7IGxvZygnYWRkZWQgJywgZXZlbnQuZGV0YWlsKX0gKTtcclxuICAgKlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbihuYW1lOiBHcmlkU3RhY2tFdmVudCwgY2FsbGJhY2s6IEdyaWRTdGFja0V2ZW50SGFuZGxlckNhbGxiYWNrKTogR3JpZFN0YWNrIHtcclxuICAgIC8vIGNoZWNrIGZvciBhcnJheSBvZiBuYW1lcyBiZWluZyBwYXNzZWQgaW5zdGVhZFxyXG4gICAgaWYgKG5hbWUuaW5kZXhPZignICcpICE9PSAtMSkge1xyXG4gICAgICBsZXQgbmFtZXMgPSBuYW1lLnNwbGl0KCcgJykgYXMgR3JpZFN0YWNrRXZlbnRbXTtcclxuICAgICAgbmFtZXMuZm9yRWFjaChuYW1lID0+IHRoaXMub24obmFtZSwgY2FsbGJhY2spKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5hbWUgPT09ICdjaGFuZ2UnIHx8IG5hbWUgPT09ICdhZGRlZCcgfHwgbmFtZSA9PT0gJ3JlbW92ZWQnIHx8IG5hbWUgPT09ICdlbmFibGUnIHx8IG5hbWUgPT09ICdkaXNhYmxlJykge1xyXG4gICAgICAvLyBuYXRpdmUgQ3VzdG9tRXZlbnQgaGFuZGxlcnMgLSBjYXNoIHRoZSBnZW5lcmljIGhhbmRsZXJzIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlXHJcbiAgICAgIGxldCBub0RhdGEgPSAobmFtZSA9PT0gJ2VuYWJsZScgfHwgbmFtZSA9PT0gJ2Rpc2FibGUnKTtcclxuICAgICAgaWYgKG5vRGF0YSkge1xyXG4gICAgICAgIHRoaXMuX2dzRXZlbnRIYW5kbGVyW25hbWVdID0gKGV2ZW50OiBFdmVudCkgPT4gKGNhbGxiYWNrIGFzIEdyaWRTdGFja0V2ZW50SGFuZGxlcikoZXZlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2dzRXZlbnRIYW5kbGVyW25hbWVdID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4gKGNhbGxiYWNrIGFzIEdyaWRTdGFja05vZGVzSGFuZGxlcikoZXZlbnQsIGV2ZW50LmRldGFpbCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIHRoaXMuX2dzRXZlbnRIYW5kbGVyW25hbWVdKTtcclxuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2RyYWcnIHx8IG5hbWUgPT09ICdkcmFnc3RhcnQnIHx8IG5hbWUgPT09ICdkcmFnc3RvcCcgfHwgbmFtZSA9PT0gJ3Jlc2l6ZXN0YXJ0JyB8fCBuYW1lID09PSAncmVzaXplJyB8fCBuYW1lID09PSAncmVzaXplc3RvcCcgfHwgbmFtZSA9PT0gJ2Ryb3BwZWQnKSB7XHJcbiAgICAgIC8vIGRyYWcmZHJvcCBzdG9wIGV2ZW50cyBORUVEIHRvIGJlIGNhbGwgdGhlbSBBRlRFUiB3ZSB1cGRhdGUgbm9kZSBhdHRyaWJ1dGVzIHNvIGhhbmRsZSB0aGVtIG91cnNlbGYuXHJcbiAgICAgIC8vIGRvIHNhbWUgZm9yIHN0YXJ0IGV2ZW50IHRvIG1ha2UgaXQgZWFzaWVyLi4uXHJcbiAgICAgIHRoaXMuX2dzRXZlbnRIYW5kbGVyW25hbWVdID0gY2FsbGJhY2s7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmxvZygnR3JpZFN0YWNrLm9uKCcgKyBuYW1lICsgJykgZXZlbnQgbm90IHN1cHBvcnRlZCwgYnV0IHlvdSBjYW4gc3RpbGwgdXNlICQoXCIuZ3JpZC1zdGFja1wiKS5vbiguLi4pIHdoaWxlIGpxdWVyeS11aSBpcyBzdGlsbCB1c2VkIGludGVybmFsbHkuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHVuc3Vic2NyaWJlIGZyb20gdGhlICdvbicgZXZlbnQgYmVsb3dcclxuICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZXZlbnQgKHNlZSBwb3NzaWJsZSB2YWx1ZXMpXHJcbiAgICovXHJcbiAgcHVibGljIG9mZihuYW1lOiBHcmlkU3RhY2tFdmVudCk6IEdyaWRTdGFjayB7XHJcbiAgICAvLyBjaGVjayBmb3IgYXJyYXkgb2YgbmFtZXMgYmVpbmcgcGFzc2VkIGluc3RlYWRcclxuICAgIGlmIChuYW1lLmluZGV4T2YoJyAnKSAhPT0gLTEpIHtcclxuICAgICAgbGV0IG5hbWVzID0gbmFtZS5zcGxpdCgnICcpIGFzIEdyaWRTdGFja0V2ZW50W107XHJcbiAgICAgIG5hbWVzLmZvckVhY2gobmFtZSA9PiB0aGlzLm9mZihuYW1lKSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChuYW1lID09PSAnY2hhbmdlJyB8fCBuYW1lID09PSAnYWRkZWQnIHx8IG5hbWUgPT09ICdyZW1vdmVkJyB8fCBuYW1lID09PSAnZW5hYmxlJyB8fCBuYW1lID09PSAnZGlzYWJsZScpIHtcclxuICAgICAgLy8gcmVtb3ZlIG5hdGl2ZSBDdXN0b21FdmVudCBoYW5kbGVyc1xyXG4gICAgICBpZiAodGhpcy5fZ3NFdmVudEhhbmRsZXJbbmFtZV0pIHtcclxuICAgICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgdGhpcy5fZ3NFdmVudEhhbmRsZXJbbmFtZV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBkZWxldGUgdGhpcy5fZ3NFdmVudEhhbmRsZXJbbmFtZV07XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogcmVtb3ZlIGFsbCBldmVudCBoYW5kbGVycyAqL1xyXG4gIHB1YmxpYyBvZmZBbGwoKTogR3JpZFN0YWNrIHtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuX2dzRXZlbnRIYW5kbGVyKS5mb3JFYWNoKGtleSA9PiB0aGlzLm9mZihrZXkpKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyB3aWRnZXQgZnJvbSB0aGUgZ3JpZC5cclxuICAgKiBAcGFyYW0gZWwgIHdpZGdldCBvciBzZWxlY3RvciB0byBtb2RpZnlcclxuICAgKiBAcGFyYW0gcmVtb3ZlRE9NIGlmIGBmYWxzZWAgRE9NIGVsZW1lbnQgd29uJ3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIChEZWZhdWx0PyB0cnVlKS5cclxuICAgKiBAcGFyYW0gdHJpZ2dlckV2ZW50IGlmIGBmYWxzZWAgKHF1aWV0IG1vZGUpIGVsZW1lbnQgd2lsbCBub3QgYmUgYWRkZWQgdG8gcmVtb3ZlZCBsaXN0IGFuZCBubyAncmVtb3ZlZCcgY2FsbGJhY2tzIHdpbGwgYmUgY2FsbGVkIChEZWZhdWx0PyB0cnVlKS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVtb3ZlV2lkZ2V0KGVsczogR3JpZFN0YWNrRWxlbWVudCwgcmVtb3ZlRE9NID0gdHJ1ZSwgdHJpZ2dlckV2ZW50ID0gdHJ1ZSk6IEdyaWRTdGFjayB7XHJcbiAgICBHcmlkU3RhY2suZ2V0RWxlbWVudHMoZWxzKS5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgaWYgKGVsLnBhcmVudEVsZW1lbnQgJiYgZWwucGFyZW50RWxlbWVudCAhPT0gdGhpcy5lbCkgcmV0dXJuOyAvLyBub3Qgb3VyIGNoaWxkIVxyXG4gICAgICBsZXQgbm9kZSA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgIC8vIEZvciBNZXRlb3Igc3VwcG9ydDogaHR0cHM6Ly9naXRodWIuY29tL2dyaWRzdGFjay9ncmlkc3RhY2suanMvcHVsbC8yNzJcclxuICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgbm9kZSA9IHRoaXMuZW5naW5lLm5vZGVzLmZpbmQobiA9PiBlbCA9PT0gbi5lbCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFub2RlKSByZXR1cm47XHJcblxyXG4gICAgICBpZiAoR3JpZFN0YWNrLmFkZFJlbW92ZUNCKSB7XHJcbiAgICAgICAgR3JpZFN0YWNrLmFkZFJlbW92ZUNCKHRoaXMuZWwsIG5vZGUsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSBvdXIgRE9NIGRhdGEgKGNpcmN1bGFyIGxpbmspIGFuZCBkcmFnJmRyb3AgcGVybWFuZW50bHlcclxuICAgICAgZGVsZXRlIGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgIHRoaXMuX3JlbW92ZUREKGVsKTtcclxuXHJcbiAgICAgIHRoaXMuZW5naW5lLnJlbW92ZU5vZGUobm9kZSwgcmVtb3ZlRE9NLCB0cmlnZ2VyRXZlbnQpO1xyXG5cclxuICAgICAgaWYgKHJlbW92ZURPTSAmJiBlbC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgZWwucmVtb3ZlKCk7IC8vIGluIGJhdGNoIG1vZGUgZW5naW5lLnJlbW92ZU5vZGUgZG9lc24ndCBjYWxsIGJhY2sgdG8gcmVtb3ZlIERPTVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICh0cmlnZ2VyRXZlbnQpIHtcclxuICAgICAgdGhpcy5fdHJpZ2dlclJlbW92ZUV2ZW50KCk7XHJcbiAgICAgIHRoaXMuX3RyaWdnZXJDaGFuZ2VFdmVudCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGFsbCB3aWRnZXRzIGZyb20gdGhlIGdyaWQuXHJcbiAgICogQHBhcmFtIHJlbW92ZURPTSBpZiBgZmFsc2VgIERPTSBlbGVtZW50cyB3b24ndCBiZSByZW1vdmVkIGZyb20gdGhlIHRyZWUgKERlZmF1bHQ/IGB0cnVlYCkuXHJcbiAgICovXHJcbiAgcHVibGljIHJlbW92ZUFsbChyZW1vdmVET00gPSB0cnVlKTogR3JpZFN0YWNrIHtcclxuICAgIC8vIGFsd2F5cyByZW1vdmUgb3VyIERPTSBkYXRhIChjaXJjdWxhciBsaW5rKSBiZWZvcmUgbGlzdCBnZXRzIGVtcHRpZWQgYW5kIGRyYWcmZHJvcCBwZXJtYW5lbnRseVxyXG4gICAgdGhpcy5lbmdpbmUubm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgZGVsZXRlIG4uZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgdGhpcy5fcmVtb3ZlREQobi5lbCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZW5naW5lLnJlbW92ZUFsbChyZW1vdmVET00pO1xyXG4gICAgdGhpcy5fdHJpZ2dlclJlbW92ZUV2ZW50KCk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSB0aGUgZ3JpZCBhbmltYXRpb24gc3RhdGUuICBUb2dnbGVzIHRoZSBgZ3JpZC1zdGFjay1hbmltYXRlYCBjbGFzcy5cclxuICAgKiBAcGFyYW0gZG9BbmltYXRlIGlmIHRydWUgdGhlIGdyaWQgd2lsbCBhbmltYXRlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRBbmltYXRpb24oZG9BbmltYXRlOiBib29sZWFuKTogR3JpZFN0YWNrIHtcclxuICAgIGlmIChkb0FuaW1hdGUpIHtcclxuICAgICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKCdncmlkLXN0YWNrLWFuaW1hdGUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgnZ3JpZC1zdGFjay1hbmltYXRlJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSB0aGUgZ3JpZCBzdGF0aWMgc3RhdGUsIHdoaWNoIHBlcm1hbmVudGx5IHJlbW92ZXMvYWRkIERyYWcmRHJvcCBzdXBwb3J0LCB1bmxpa2UgZGlzYWJsZSgpL2VuYWJsZSgpIHRoYXQganVzdCB0dXJucyBpdCBvZmYvb24uXHJcbiAgICogQWxzbyB0b2dnbGUgdGhlIGdyaWQtc3RhY2stc3RhdGljIGNsYXNzLlxyXG4gICAqIEBwYXJhbSB2YWwgaWYgdHJ1ZSB0aGUgZ3JpZCBiZWNvbWUgc3RhdGljLlxyXG4gICAqIEBwYXJhbSB1cGRhdGVDbGFzcyB0cnVlIChkZWZhdWx0KSBpZiBjc3MgY2xhc3MgZ2V0cyB1cGRhdGVkXHJcbiAgICogQHBhcmFtIHJlY3Vyc2UgdHJ1ZSAoZGVmYXVsdCkgaWYgc3ViLWdyaWRzIGFsc28gZ2V0IHVwZGF0ZWRcclxuICAgKi9cclxuICBwdWJsaWMgc2V0U3RhdGljKHZhbDogYm9vbGVhbiwgdXBkYXRlQ2xhc3MgPSB0cnVlLCByZWN1cnNlID0gdHJ1ZSk6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAoISF0aGlzLm9wdHMuc3RhdGljR3JpZCA9PT0gdmFsKSByZXR1cm4gdGhpcztcclxuICAgIHZhbCA/IHRoaXMub3B0cy5zdGF0aWNHcmlkID0gdHJ1ZSA6IGRlbGV0ZSB0aGlzLm9wdHMuc3RhdGljR3JpZDtcclxuICAgIHRoaXMuX3NldHVwUmVtb3ZlRHJvcCgpO1xyXG4gICAgdGhpcy5fc2V0dXBBY2NlcHRXaWRnZXQoKTtcclxuICAgIHRoaXMuZW5naW5lLm5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgIHRoaXMuX3ByZXBhcmVEcmFnRHJvcEJ5Tm9kZShuKTsgLy8gZWl0aGVyIGRlbGV0ZSBvciBpbml0IERyYWcmZHJvcFxyXG4gICAgICBpZiAobi5zdWJHcmlkICYmIHJlY3Vyc2UpIG4uc3ViR3JpZC5zZXRTdGF0aWModmFsLCB1cGRhdGVDbGFzcywgcmVjdXJzZSk7XHJcbiAgICB9KTtcclxuICAgIGlmICh1cGRhdGVDbGFzcykgeyB0aGlzLl9zZXRTdGF0aWNDbGFzcygpOyB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgd2lkZ2V0IHBvc2l0aW9uL3NpemUgYW5kIG90aGVyIGluZm8uIE5vdGU6IGlmIHlvdSBuZWVkIHRvIGNhbGwgdGhpcyBvbiBhbGwgbm9kZXMsIHVzZSBsb2FkKCkgaW5zdGVhZCB3aGljaCB3aWxsIHVwZGF0ZSB3aGF0IGNoYW5nZWQuXHJcbiAgICogQHBhcmFtIGVscyAgd2lkZ2V0IG9yIHNlbGVjdG9yIG9mIG9iamVjdHMgdG8gbW9kaWZ5IChub3RlOiBzZXR0aW5nIHRoZSBzYW1lIHgseSBmb3IgbXVsdGlwbGUgaXRlbXMgd2lsbCBiZSBpbmRldGVybWluaXN0aWMgYW5kIGxpa2VseSB1bndhbnRlZClcclxuICAgKiBAcGFyYW0gb3B0IG5ldyB3aWRnZXQgb3B0aW9ucyAoeCx5LHcsaCwgZXRjLi4pLiBPbmx5IHRob3NlIHNldCB3aWxsIGJlIHVwZGF0ZWQuXHJcbiAgICovXHJcbiAgcHVibGljIHVwZGF0ZShlbHM6IEdyaWRTdGFja0VsZW1lbnQsIG9wdDogR3JpZFN0YWNrV2lkZ2V0KTogR3JpZFN0YWNrIHtcclxuXHJcbiAgICAvLyBzdXBwb3J0IGxlZ2FjeSBjYWxsIGZvciBub3cgP1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignZ3JpZHN0YWNrLnRzOiBgdXBkYXRlKGVsLCB4LCB5LCB3LCBoKWAgaXMgZGVwcmVjYXRlZC4gVXNlIGB1cGRhdGUoZWwsIHt4LCB3LCBjb250ZW50LCAuLi59KWAuIEl0IHdpbGwgYmUgcmVtb3ZlZCBzb29uJyk7XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcclxuICAgICAgbGV0IGEgPSBhcmd1bWVudHMsIGkgPSAxO1xyXG4gICAgICBvcHQgPSB7IHg6YVtpKytdLCB5OmFbaSsrXSwgdzphW2krK10sIGg6YVtpKytdIH07XHJcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShlbHMsIG9wdCk7XHJcbiAgICB9XHJcblxyXG4gICAgR3JpZFN0YWNrLmdldEVsZW1lbnRzKGVscykuZm9yRWFjaChlbCA9PiB7XHJcbiAgICAgIGlmICghZWwgfHwgIWVsLmdyaWRzdGFja05vZGUpIHJldHVybjtcclxuICAgICAgbGV0IG4gPSBlbC5ncmlkc3RhY2tOb2RlO1xyXG4gICAgICBsZXQgdyA9IFV0aWxzLmNsb25lRGVlcChvcHQpOyAvLyBtYWtlIGEgY29weSB3ZSBjYW4gbW9kaWZ5IGluIGNhc2UgdGhleSByZS11c2UgaXQgb3IgbXVsdGlwbGUgaXRlbXNcclxuICAgICAgZGVsZXRlIHcuYXV0b1Bvc2l0aW9uO1xyXG5cclxuICAgICAgLy8gbW92ZS9yZXNpemUgd2lkZ2V0IGlmIGFueXRoaW5nIGNoYW5nZWRcclxuICAgICAgbGV0IGtleXMgPSBbJ3gnLCAneScsICd3JywgJ2gnXTtcclxuICAgICAgbGV0IG06IEdyaWRTdGFja1dpZGdldDtcclxuICAgICAgaWYgKGtleXMuc29tZShrID0+IHdba10gIT09IHVuZGVmaW5lZCAmJiB3W2tdICE9PSBuW2tdKSkge1xyXG4gICAgICAgIG0gPSB7fTtcclxuICAgICAgICBrZXlzLmZvckVhY2goayA9PiB7XHJcbiAgICAgICAgICBtW2tdID0gKHdba10gIT09IHVuZGVmaW5lZCkgPyB3W2tdIDogbltrXTtcclxuICAgICAgICAgIGRlbGV0ZSB3W2tdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGZvciBhIG1vdmUgYXMgd2VsbCBJRkYgdGhlcmUgaXMgYW55IG1pbi9tYXggZmllbGRzIHNldFxyXG4gICAgICBpZiAoIW0gJiYgKHcubWluVyB8fCB3Lm1pbkggfHwgdy5tYXhXIHx8IHcubWF4SCkpIHtcclxuICAgICAgICBtID0ge307IC8vIHdpbGwgdXNlIG5vZGUgcG9zaXRpb24gYnV0IHZhbGlkYXRlIHZhbHVlc1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBmb3IgY29udGVudCBjaGFuZ2luZ1xyXG4gICAgICBpZiAody5jb250ZW50KSB7XHJcbiAgICAgICAgbGV0IHN1YiA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcpO1xyXG4gICAgICAgIGlmIChzdWIgJiYgc3ViLmlubmVySFRNTCAhPT0gdy5jb250ZW50KSB7XHJcbiAgICAgICAgICBzdWIuaW5uZXJIVE1MID0gdy5jb250ZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgdy5jb250ZW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhbnkgcmVtYWluaW5nIGZpZWxkcyBhcmUgYXNzaWduZWQsIGJ1dCBjaGVjayBmb3IgZHJhZ2dpbmcgY2hhbmdlcywgcmVzaXplIGNvbnN0cmFpblxyXG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICBsZXQgZGRDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHcpIHtcclxuICAgICAgICBpZiAoa2V5WzBdICE9PSAnXycgJiYgbltrZXldICE9PSB3W2tleV0pIHtcclxuICAgICAgICAgIG5ba2V5XSA9IHdba2V5XTtcclxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgZGRDaGFuZ2VkID0gZGRDaGFuZ2VkIHx8ICghdGhpcy5vcHRzLnN0YXRpY0dyaWQgJiYgKGtleSA9PT0gJ25vUmVzaXplJyB8fCBrZXkgPT09ICdub01vdmUnIHx8IGtleSA9PT0gJ2xvY2tlZCcpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgVXRpbHMuc2FuaXRpemVNaW5NYXgobik7XHJcblxyXG4gICAgICAvLyBmaW5hbGx5IG1vdmUgdGhlIHdpZGdldFxyXG4gICAgICBpZiAobSkge1xyXG4gICAgICAgIHRoaXMuZW5naW5lLmNsZWFuTm9kZXMoKVxyXG4gICAgICAgICAgLmJlZ2luVXBkYXRlKG4pXHJcbiAgICAgICAgICAubW92ZU5vZGUobiwgbSk7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5lbmdpbmUuZW5kVXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoYW5nZWQpIHsgLy8gbW92ZSB3aWxsIG9ubHkgdXBkYXRlIHgseSx3LGggc28gdXBkYXRlIHRoZSByZXN0IHRvb1xyXG4gICAgICAgIHRoaXMuX3dyaXRlQXR0cihlbCwgbik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRkQ2hhbmdlZCkge1xyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVEcmFnRHJvcEJ5Tm9kZShuKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIG1hcmdpbnMgd2hpY2ggd2lsbCBzZXQgYWxsIDQgc2lkZXMgYXQgb25jZSAtIHNlZSBgR3JpZFN0YWNrT3B0aW9ucy5tYXJnaW5gIGZvciBmb3JtYXQgb3B0aW9ucyAoQ1NTIHN0cmluZyBmb3JtYXQgb2YgMSwyLDQgdmFsdWVzIG9yIHNpbmdsZSBudW1iZXIpLlxyXG4gICAqIEBwYXJhbSB2YWx1ZSBtYXJnaW4gdmFsdWVcclxuICAgKi9cclxuICBwdWJsaWMgbWFyZ2luKHZhbHVlOiBudW1iZXJPclN0cmluZyk6IEdyaWRTdGFjayB7XHJcbiAgICBsZXQgaXNNdWx0aVZhbHVlID0gKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3BsaXQoJyAnKS5sZW5ndGggPiAxKTtcclxuICAgIC8vIGNoZWNrIGlmIHdlIGNhbiBza2lwIHJlLWNyZWF0aW5nIG91ciBDU1MgZmlsZS4uLiB3b24ndCBjaGVjayBpZiBtdWx0aSB2YWx1ZXMgKHRvbyBtdWNoIGhhc3NsZSlcclxuICAgIGlmICghaXNNdWx0aVZhbHVlKSB7XHJcbiAgICAgIGxldCBkYXRhID0gVXRpbHMucGFyc2VIZWlnaHQodmFsdWUpO1xyXG4gICAgICBpZiAodGhpcy5vcHRzLm1hcmdpblVuaXQgPT09IGRhdGEudW5pdCAmJiB0aGlzLm9wdHMubWFyZ2luID09PSBkYXRhLmgpIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIHJlLXVzZSBleGlzdGluZyBtYXJnaW4gaGFuZGxpbmdcclxuICAgIHRoaXMub3B0cy5tYXJnaW4gPSB2YWx1ZTtcclxuICAgIHRoaXMub3B0cy5tYXJnaW5Ub3AgPSB0aGlzLm9wdHMubWFyZ2luQm90dG9tID0gdGhpcy5vcHRzLm1hcmdpbkxlZnQgPSB0aGlzLm9wdHMubWFyZ2luUmlnaHQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9pbml0TWFyZ2luKCk7XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlU3R5bGVzKHRydWUpOyAvLyB0cnVlID0gZm9yY2UgcmUtY3JlYXRlXHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogcmV0dXJucyBjdXJyZW50IG1hcmdpbiBudW1iZXIgdmFsdWUgKHVuZGVmaW5lZCBpZiA0IHNpZGVzIGRvbid0IG1hdGNoKSAqL1xyXG4gIHB1YmxpYyBnZXRNYXJnaW4oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMub3B0cy5tYXJnaW4gYXMgbnVtYmVyOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaGVpZ2h0IG9mIHRoZSBncmlkIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSB2ZXJ0aWNhbFxyXG4gICAqIGNvbnN0cmFpbnQuIEFsd2F5cyByZXR1cm5zIHRydWUgaWYgZ3JpZCBkb2Vzbid0IGhhdmUgaGVpZ2h0IGNvbnN0cmFpbnQuXHJcbiAgICogQHBhcmFtIG5vZGUgY29udGFpbnMgeCx5LHcsaCxhdXRvLXBvc2l0aW9uIG9wdGlvbnNcclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogaWYgKGdyaWQud2lsbEl0Rml0KG5ld1dpZGdldCkpIHtcclxuICAgKiAgIGdyaWQuYWRkV2lkZ2V0KG5ld1dpZGdldCk7XHJcbiAgICogfSBlbHNlIHtcclxuICAgKiAgIGFsZXJ0KCdOb3QgZW5vdWdoIGZyZWUgc3BhY2UgdG8gcGxhY2UgdGhlIHdpZGdldCcpO1xyXG4gICAqIH1cclxuICAgKi9cclxuICBwdWJsaWMgd2lsbEl0Rml0KG5vZGU6IEdyaWRTdGFja1dpZGdldCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gc3VwcG9ydCBsZWdhY3kgY2FsbCBmb3Igbm93XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdncmlkc3RhY2sudHM6IGB3aWxsSXRGaXQoeCx5LHcsaCxhdXRvUG9zaXRpb24pYCBpcyBkZXByZWNhdGVkLiBVc2UgYHdpbGxJdEZpdCh7eCwgeSwuLi59KWAuIEl0IHdpbGwgYmUgcmVtb3ZlZCBzb29uJyk7XHJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcclxuICAgICAgbGV0IGEgPSBhcmd1bWVudHMsIGkgPSAwLFxyXG4gICAgICAgIHc6IEdyaWRTdGFja1dpZGdldCA9IHsgeDphW2krK10sIHk6YVtpKytdLCB3OmFbaSsrXSwgaDphW2krK10sIGF1dG9Qb3NpdGlvbjphW2krK10gfTtcclxuICAgICAgcmV0dXJuIHRoaXMud2lsbEl0Rml0KHcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLndpbGxJdEZpdChub2RlKTtcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBwcm90ZWN0ZWQgX3RyaWdnZXJDaGFuZ2VFdmVudCgpOiBHcmlkU3RhY2sge1xyXG4gICAgaWYgKHRoaXMuZW5naW5lLmJhdGNoTW9kZSkgcmV0dXJuIHRoaXM7XHJcbiAgICBsZXQgZWxlbWVudHMgPSB0aGlzLmVuZ2luZS5nZXREaXJ0eU5vZGVzKHRydWUpOyAvLyB2ZXJpZnkgdGhleSByZWFsbHkgY2hhbmdlZFxyXG4gICAgaWYgKGVsZW1lbnRzICYmIGVsZW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICBpZiAoIXRoaXMuX2lnbm9yZUxheW91dHNOb2RlQ2hhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5lbmdpbmUubGF5b3V0c05vZGVzQ2hhbmdlKGVsZW1lbnRzKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl90cmlnZ2VyRXZlbnQoJ2NoYW5nZScsIGVsZW1lbnRzKTtcclxuICAgIH1cclxuICAgIHRoaXMuZW5naW5lLnNhdmVJbml0aWFsKCk7IC8vIHdlIGNhbGxlZCwgbm93IHJlc2V0IGluaXRpYWwgdmFsdWVzICYgZGlydHkgZmxhZ3NcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIHByb3RlY3RlZCBfdHJpZ2dlckFkZEV2ZW50KCk6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAodGhpcy5lbmdpbmUuYmF0Y2hNb2RlKSByZXR1cm4gdGhpcztcclxuICAgIGlmICh0aGlzLmVuZ2luZS5hZGRlZE5vZGVzPy5sZW5ndGgpIHtcclxuICAgICAgaWYgKCF0aGlzLl9pZ25vcmVMYXlvdXRzTm9kZUNoYW5nZSkge1xyXG4gICAgICAgIHRoaXMuZW5naW5lLmxheW91dHNOb2Rlc0NoYW5nZSh0aGlzLmVuZ2luZS5hZGRlZE5vZGVzKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBwcmV2ZW50IGFkZGVkIG5vZGVzIGZyb20gYWxzbyB0cmlnZ2VyaW5nICdjaGFuZ2UnIGV2ZW50ICh3aGljaCBpcyBjYWxsZWQgbmV4dClcclxuICAgICAgdGhpcy5lbmdpbmUuYWRkZWROb2Rlcy5mb3JFYWNoKG4gPT4geyBkZWxldGUgbi5fZGlydHk7IH0pO1xyXG4gICAgICB0aGlzLl90cmlnZ2VyRXZlbnQoJ2FkZGVkJywgdGhpcy5lbmdpbmUuYWRkZWROb2Rlcyk7XHJcbiAgICAgIHRoaXMuZW5naW5lLmFkZGVkTm9kZXMgPSBbXTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIHB1YmxpYyBfdHJpZ2dlclJlbW92ZUV2ZW50KCk6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAodGhpcy5lbmdpbmUuYmF0Y2hNb2RlKSByZXR1cm4gdGhpcztcclxuICAgIGlmICh0aGlzLmVuZ2luZS5yZW1vdmVkTm9kZXM/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl90cmlnZ2VyRXZlbnQoJ3JlbW92ZWQnLCB0aGlzLmVuZ2luZS5yZW1vdmVkTm9kZXMpO1xyXG4gICAgICB0aGlzLmVuZ2luZS5yZW1vdmVkTm9kZXMgPSBbXTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIHByb3RlY3RlZCBfdHJpZ2dlckV2ZW50KHR5cGU6IHN0cmluZywgZGF0YT86IEdyaWRTdGFja05vZGVbXSk6IEdyaWRTdGFjayB7XHJcbiAgICBsZXQgZXZlbnQgPSBkYXRhID8gbmV3IEN1c3RvbUV2ZW50KHR5cGUsIHtidWJibGVzOiBmYWxzZSwgZGV0YWlsOiBkYXRhfSkgOiBuZXcgRXZlbnQodHlwZSk7XHJcbiAgICB0aGlzLmVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIGNhbGxlZCB0byBkZWxldGUgdGhlIGN1cnJlbnQgZHluYW1pYyBzdHlsZSBzaGVldCB1c2VkIGZvciBvdXIgbGF5b3V0ICovXHJcbiAgcHJvdGVjdGVkIF9yZW1vdmVTdHlsZXNoZWV0KCk6IEdyaWRTdGFjayB7XHJcblxyXG4gICAgaWYgKHRoaXMuX3N0eWxlcykge1xyXG4gICAgICBVdGlscy5yZW1vdmVTdHlsZXNoZWV0KHRoaXMuX3N0eWxlU2hlZXRDbGFzcyk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLl9zdHlsZXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgdXBkYXRlZC9jcmVhdGUgdGhlIENTUyBzdHlsZXMgZm9yIHJvdyBiYXNlZCBsYXlvdXQgYW5kIGluaXRpYWwgbWFyZ2luIHNldHRpbmcgKi9cclxuICBwcm90ZWN0ZWQgX3VwZGF0ZVN0eWxlcyhmb3JjZVVwZGF0ZSA9IGZhbHNlLCBtYXhIPzogbnVtYmVyKTogR3JpZFN0YWNrIHtcclxuICAgIC8vIGNhbGwgdG8gZGVsZXRlIGV4aXN0aW5nIG9uZSBpZiB3ZSBjaGFuZ2UgY2VsbEhlaWdodCAvIG1hcmdpblxyXG4gICAgaWYgKGZvcmNlVXBkYXRlKSB7XHJcbiAgICAgIHRoaXMuX3JlbW92ZVN0eWxlc2hlZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW1heEgpIG1heEggPSB0aGlzLmdldFJvdygpO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XHJcblxyXG4gICAgLy8gaWYgdXNlciBpcyB0ZWxsaW5nIHVzIHRoZXkgd2lsbCBoYW5kbGUgdGhlIENTUyB0aGVtc2VsdmVzIGJ5IHNldHRpbmcgaGVpZ2h0cyB0byAwLiBEbyB3ZSBuZWVkIHRoaXMgb3B0cyByZWFsbHkgPz9cclxuICAgIGlmICh0aGlzLm9wdHMuY2VsbEhlaWdodCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY2VsbEhlaWdodCA9IHRoaXMub3B0cy5jZWxsSGVpZ2h0IGFzIG51bWJlcjtcclxuICAgIGxldCBjZWxsSGVpZ2h0VW5pdCA9IHRoaXMub3B0cy5jZWxsSGVpZ2h0VW5pdDtcclxuICAgIGxldCBwcmVmaXggPSBgLiR7dGhpcy5fc3R5bGVTaGVldENsYXNzfSA+IC4ke3RoaXMub3B0cy5pdGVtQ2xhc3N9YDtcclxuXHJcbiAgICAvLyBjcmVhdGUgb25lIGFzIG5lZWRlZFxyXG4gICAgaWYgKCF0aGlzLl9zdHlsZXMpIHtcclxuICAgICAgLy8gaW5zZXJ0IHN0eWxlIHRvIHBhcmVudCAoaW5zdGVhZCBvZiAnaGVhZCcgYnkgZGVmYXVsdCkgdG8gc3VwcG9ydCBXZWJDb21wb25lbnRcclxuICAgICAgbGV0IHN0eWxlTG9jYXRpb24gPSB0aGlzLm9wdHMuc3R5bGVJbkhlYWQgPyB1bmRlZmluZWQgOiB0aGlzLmVsLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuX3N0eWxlcyA9IFV0aWxzLmNyZWF0ZVN0eWxlc2hlZXQodGhpcy5fc3R5bGVTaGVldENsYXNzLCBzdHlsZUxvY2F0aW9uLCB7XHJcbiAgICAgICAgbm9uY2U6IHRoaXMub3B0cy5ub25jZSxcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICghdGhpcy5fc3R5bGVzKSByZXR1cm4gdGhpcztcclxuICAgICAgdGhpcy5fc3R5bGVzLl9tYXggPSAwO1xyXG5cclxuICAgICAgLy8gdGhlc2UgYXJlIGRvbmUgb25jZSBvbmx5XHJcbiAgICAgIFV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBwcmVmaXgsIGBoZWlnaHQ6ICR7Y2VsbEhlaWdodH0ke2NlbGxIZWlnaHRVbml0fWApO1xyXG4gICAgICAvLyBjb250ZW50IG1hcmdpbnNcclxuICAgICAgbGV0IHRvcDogc3RyaW5nID0gdGhpcy5vcHRzLm1hcmdpblRvcCArIHRoaXMub3B0cy5tYXJnaW5Vbml0O1xyXG4gICAgICBsZXQgYm90dG9tOiBzdHJpbmcgPSB0aGlzLm9wdHMubWFyZ2luQm90dG9tICsgdGhpcy5vcHRzLm1hcmdpblVuaXQ7XHJcbiAgICAgIGxldCByaWdodDogc3RyaW5nID0gdGhpcy5vcHRzLm1hcmdpblJpZ2h0ICsgdGhpcy5vcHRzLm1hcmdpblVuaXQ7XHJcbiAgICAgIGxldCBsZWZ0OiBzdHJpbmcgPSB0aGlzLm9wdHMubWFyZ2luTGVmdCArIHRoaXMub3B0cy5tYXJnaW5Vbml0O1xyXG4gICAgICBsZXQgY29udGVudCA9IGAke3ByZWZpeH0gPiAuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnRgO1xyXG4gICAgICBsZXQgcGxhY2Vob2xkZXIgPSBgLiR7dGhpcy5fc3R5bGVTaGVldENsYXNzfSA+IC5ncmlkLXN0YWNrLXBsYWNlaG9sZGVyID4gLnBsYWNlaG9sZGVyLWNvbnRlbnRgO1xyXG4gICAgICBVdGlscy5hZGRDU1NSdWxlKHRoaXMuX3N0eWxlcywgY29udGVudCwgYHRvcDogJHt0b3B9OyByaWdodDogJHtyaWdodH07IGJvdHRvbTogJHtib3R0b219OyBsZWZ0OiAke2xlZnR9O2ApO1xyXG4gICAgICBVdGlscy5hZGRDU1NSdWxlKHRoaXMuX3N0eWxlcywgcGxhY2Vob2xkZXIsIGB0b3A6ICR7dG9wfTsgcmlnaHQ6ICR7cmlnaHR9OyBib3R0b206ICR7Ym90dG9tfTsgbGVmdDogJHtsZWZ0fTtgKTtcclxuICAgICAgLy8gcmVzaXplIGhhbmRsZXMgb2Zmc2V0ICh0byBtYXRjaCBtYXJnaW4pXHJcbiAgICAgIFV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9ID4gLnVpLXJlc2l6YWJsZS1uZWAsIGByaWdodDogJHtyaWdodH1gKTtcclxuICAgICAgVXRpbHMuYWRkQ1NTUnVsZSh0aGlzLl9zdHlsZXMsIGAke3ByZWZpeH0gPiAudWktcmVzaXphYmxlLWVgLCBgcmlnaHQ6ICR7cmlnaHR9YCk7XHJcbiAgICAgIFV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9ID4gLnVpLXJlc2l6YWJsZS1zZWAsIGByaWdodDogJHtyaWdodH07IGJvdHRvbTogJHtib3R0b219YCk7XHJcbiAgICAgIFV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9ID4gLnVpLXJlc2l6YWJsZS1ud2AsIGBsZWZ0OiAke2xlZnR9YCk7XHJcbiAgICAgIFV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9ID4gLnVpLXJlc2l6YWJsZS13YCwgYGxlZnQ6ICR7bGVmdH1gKTtcclxuICAgICAgVXRpbHMuYWRkQ1NTUnVsZSh0aGlzLl9zdHlsZXMsIGAke3ByZWZpeH0gPiAudWktcmVzaXphYmxlLXN3YCwgYGxlZnQ6ICR7bGVmdH07IGJvdHRvbTogJHtib3R0b219YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbm93IHVwZGF0ZSB0aGUgaGVpZ2h0IHNwZWNpZmljIGZpZWxkc1xyXG4gICAgbWF4SCA9IG1heEggfHwgdGhpcy5fc3R5bGVzLl9tYXg7XHJcbiAgICBpZiAobWF4SCA+IHRoaXMuX3N0eWxlcy5fbWF4KSB7XHJcbiAgICAgIGxldCBnZXRIZWlnaHQgPSAocm93czogbnVtYmVyKTogc3RyaW5nID0+IChjZWxsSGVpZ2h0ICogcm93cykgKyBjZWxsSGVpZ2h0VW5pdDtcclxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3N0eWxlcy5fbWF4ICsgMTsgaSA8PSBtYXhIOyBpKyspIHsgLy8gc3RhcnQgYXQgMVxyXG4gICAgICAgIFV0aWxzLmFkZENTU1J1bGUodGhpcy5fc3R5bGVzLCBgJHtwcmVmaXh9W2dzLXk9XCIke2l9XCJdYCwgYHRvcDogJHtnZXRIZWlnaHQoaSl9YCk7XHJcbiAgICAgICAgVXRpbHMuYWRkQ1NTUnVsZSh0aGlzLl9zdHlsZXMsIGAke3ByZWZpeH1bZ3MtaD1cIiR7aSsxfVwiXWAsIGBoZWlnaHQ6ICR7Z2V0SGVpZ2h0KGkrMSl9YCk7IC8vIHN0YXJ0IGF0IDJcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9zdHlsZXMuX21heCA9IG1heEg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBwcm90ZWN0ZWQgX3VwZGF0ZUNvbnRhaW5lckhlaWdodCgpOiBHcmlkU3RhY2sge1xyXG4gICAgaWYgKCF0aGlzLmVuZ2luZSB8fCB0aGlzLmVuZ2luZS5iYXRjaE1vZGUpIHJldHVybiB0aGlzO1xyXG4gICAgbGV0IHJvdyA9IHRoaXMuZ2V0Um93KCkgKyB0aGlzLl9leHRyYURyYWdSb3c7IC8vIGNoZWNrcyBmb3IgbWluUm93IGFscmVhZHlcclxuICAgIC8vIGNoZWNrIGZvciBjc3MgbWluIGhlaWdodFxyXG4gICAgLy8gTm90ZTogd2UgZG9uJ3QgaGFuZGxlICUscmVtIGNvcnJlY3RseSBzbyBjb21tZW50IG91dCwgYmVzaWRlIHdlIGRvbid0IG5lZWQgbmVlZCB0byBjcmVhdGUgdW4tbmVjZXNzYXJ5XHJcbiAgICAvLyByb3dzIGFzIHRoZSBDU1Mgd2lsbCBtYWtlIHVzIGJpZ2dlciB0aGFuIG91ciBzZXQgaGVpZ2h0IGlmIG5lZWRlZC4uLiBub3Qgc3VyZSB3aHkgd2UgaGFkIHRoaXMuXHJcbiAgICAvLyBsZXQgY3NzTWluSGVpZ2h0ID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsKVsnbWluLWhlaWdodCddKTtcclxuICAgIC8vIGlmIChjc3NNaW5IZWlnaHQgPiAwKSB7XHJcbiAgICAvLyAgIGxldCBtaW5Sb3cgPSBNYXRoLnJvdW5kKGNzc01pbkhlaWdodCAvIHRoaXMuZ2V0Q2VsbEhlaWdodCh0cnVlKSk7XHJcbiAgICAvLyAgIGlmIChyb3cgPCBtaW5Sb3cpIHtcclxuICAgIC8vICAgICByb3cgPSBtaW5Sb3c7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCdncy1jdXJyZW50LXJvdycsIFN0cmluZyhyb3cpKTtcclxuICAgIGlmIChyb3cgPT09IDApIHtcclxuICAgICAgdGhpcy5lbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbWluLWhlaWdodCcpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIGxldCBjZWxsSGVpZ2h0ID0gdGhpcy5vcHRzLmNlbGxIZWlnaHQgYXMgbnVtYmVyO1xyXG4gICAgbGV0IHVuaXQgPSB0aGlzLm9wdHMuY2VsbEhlaWdodFVuaXQ7XHJcbiAgICBpZiAoIWNlbGxIZWlnaHQpIHJldHVybiB0aGlzO1xyXG4gICAgdGhpcy5lbC5zdHlsZS5taW5IZWlnaHQgPSByb3cgKiBjZWxsSGVpZ2h0ICsgdW5pdDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIHByb3RlY3RlZCBfcHJlcGFyZUVsZW1lbnQoZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQsIHRyaWdnZXJBZGRFdmVudCA9IGZhbHNlLCBub2RlPzogR3JpZFN0YWNrTm9kZSk6IEdyaWRTdGFjayB7XHJcbiAgICBlbC5jbGFzc0xpc3QuYWRkKHRoaXMub3B0cy5pdGVtQ2xhc3MpO1xyXG4gICAgbm9kZSA9IG5vZGUgfHwgdGhpcy5fcmVhZEF0dHIoZWwpO1xyXG4gICAgZWwuZ3JpZHN0YWNrTm9kZSA9IG5vZGU7XHJcbiAgICBub2RlLmVsID0gZWw7XHJcbiAgICBub2RlLmdyaWQgPSB0aGlzO1xyXG4gICAgbGV0IGNvcHkgPSB7Li4ubm9kZX07XHJcbiAgICBub2RlID0gdGhpcy5lbmdpbmUuYWRkTm9kZShub2RlLCB0cmlnZ2VyQWRkRXZlbnQpO1xyXG4gICAgLy8gd3JpdGUgbm9kZSBhdHRyIGJhY2sgaW4gY2FzZSB0aGVyZSB3YXMgY29sbGlzaW9uIG9yIHdlIGhhdmUgdG8gZml4IGJhZCB2YWx1ZXMgZHVyaW5nIGFkZE5vZGUoKVxyXG4gICAgaWYgKCFVdGlscy5zYW1lKG5vZGUsIGNvcHkpKSB7XHJcbiAgICAgIHRoaXMuX3dyaXRlQXR0cihlbCwgbm9kZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcmVwYXJlRHJhZ0Ryb3BCeU5vZGUobm9kZSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgY2FsbCB0byB3cml0ZSBwb3NpdGlvbiB4LHksdyxoIGF0dHJpYnV0ZXMgYmFjayB0byBlbGVtZW50ICovXHJcbiAgcHJvdGVjdGVkIF93cml0ZVBvc0F0dHIoZWw6IEhUTUxFbGVtZW50LCBuOiBHcmlkU3RhY2tQb3NpdGlvbik6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAobi54ICE9PSB1bmRlZmluZWQgJiYgbi54ICE9PSBudWxsKSB7IGVsLnNldEF0dHJpYnV0ZSgnZ3MteCcsIFN0cmluZyhuLngpKTsgfVxyXG4gICAgaWYgKG4ueSAhPT0gdW5kZWZpbmVkICYmIG4ueSAhPT0gbnVsbCkgeyBlbC5zZXRBdHRyaWJ1dGUoJ2dzLXknLCBTdHJpbmcobi55KSk7IH1cclxuICAgIG4udyA+IDEgPyBlbC5zZXRBdHRyaWJ1dGUoJ2dzLXcnLCBTdHJpbmcobi53KSkgOiBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2dzLXcnKTtcclxuICAgIG4uaCA+IDEgPyBlbC5zZXRBdHRyaWJ1dGUoJ2dzLWgnLCBTdHJpbmcobi5oKSkgOiBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2dzLWgnKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBjYWxsIHRvIHdyaXRlIGFueSBkZWZhdWx0IGF0dHJpYnV0ZXMgYmFjayB0byBlbGVtZW50ICovXHJcbiAgcHJvdGVjdGVkIF93cml0ZUF0dHIoZWw6IEhUTUxFbGVtZW50LCBub2RlOiBHcmlkU3RhY2tXaWRnZXQpOiBHcmlkU3RhY2sge1xyXG4gICAgaWYgKCFub2RlKSByZXR1cm4gdGhpcztcclxuICAgIHRoaXMuX3dyaXRlUG9zQXR0cihlbCwgbm9kZSk7XHJcblxyXG4gICAgbGV0IGF0dHJzIC8qOiBHcmlkU3RhY2tXaWRnZXQgYnV0IHN0cmluZ3MgKi8gPSB7IC8vIHJlbWFpbmluZyBhdHRyaWJ1dGVzXHJcbiAgICAgIGF1dG9Qb3NpdGlvbjogJ2dzLWF1dG8tcG9zaXRpb24nLFxyXG4gICAgICBub1Jlc2l6ZTogJ2dzLW5vLXJlc2l6ZScsXHJcbiAgICAgIG5vTW92ZTogJ2dzLW5vLW1vdmUnLFxyXG4gICAgICBsb2NrZWQ6ICdncy1sb2NrZWQnLFxyXG4gICAgICBpZDogJ2dzLWlkJyxcclxuICAgIH07XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xyXG4gICAgICBpZiAobm9kZVtrZXldKSB7IC8vIDAgaXMgdmFsaWQgZm9yIHgseSBvbmx5IGJ1dCBkb25lIGFib3ZlIGFscmVhZHkgYW5kIG5vdCBpbiBsaXN0IGFueXdheVxyXG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyc1trZXldLCBTdHJpbmcobm9kZVtrZXldKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHJzW2tleV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgY2FsbCB0byByZWFkIGFueSBkZWZhdWx0IGF0dHJpYnV0ZXMgZnJvbSBlbGVtZW50ICovXHJcbiAgcHJvdGVjdGVkIF9yZWFkQXR0cihlbDogSFRNTEVsZW1lbnQsIGNsZWFyRGVmYXVsdEF0dHIgPSB0cnVlKTogR3JpZFN0YWNrV2lkZ2V0IHtcclxuICAgIGxldCBuOiBHcmlkU3RhY2tOb2RlID0ge307XHJcbiAgICBuLnggPSBVdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLXgnKSk7XHJcbiAgICBuLnkgPSBVdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLXknKSk7XHJcbiAgICBuLncgPSBVdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLXcnKSk7XHJcbiAgICBuLmggPSBVdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLWgnKSk7XHJcbiAgICBuLmF1dG9Qb3NpdGlvbiA9IFV0aWxzLnRvQm9vbChlbC5nZXRBdHRyaWJ1dGUoJ2dzLWF1dG8tcG9zaXRpb24nKSk7XHJcbiAgICBuLm5vUmVzaXplID0gVXRpbHMudG9Cb29sKGVsLmdldEF0dHJpYnV0ZSgnZ3Mtbm8tcmVzaXplJykpO1xyXG4gICAgbi5ub01vdmUgPSBVdGlscy50b0Jvb2woZWwuZ2V0QXR0cmlidXRlKCdncy1uby1tb3ZlJykpO1xyXG4gICAgbi5sb2NrZWQgPSBVdGlscy50b0Jvb2woZWwuZ2V0QXR0cmlidXRlKCdncy1sb2NrZWQnKSk7XHJcbiAgICBuLmlkID0gZWwuZ2V0QXR0cmlidXRlKCdncy1pZCcpO1xyXG5cclxuICAgIC8vIHJlYWQgYnV0IG5ldmVyIHdyaXR0ZW4gb3V0XHJcbiAgICBuLm1heFcgPSBVdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLW1heC13JykpO1xyXG4gICAgbi5taW5XID0gVXRpbHMudG9OdW1iZXIoZWwuZ2V0QXR0cmlidXRlKCdncy1taW4tdycpKTtcclxuICAgIG4ubWF4SCA9IFV0aWxzLnRvTnVtYmVyKGVsLmdldEF0dHJpYnV0ZSgnZ3MtbWF4LWgnKSk7XHJcbiAgICBuLm1pbkggPSBVdGlscy50b051bWJlcihlbC5nZXRBdHRyaWJ1dGUoJ2dzLW1pbi1oJykpO1xyXG5cclxuICAgIC8vIHY4Lnggb3B0aW1pemF0aW9uIHRvIHJlZHVjZSB1bi1uZWVkZWQgYXR0ciB0aGF0IGRvbid0IHJlbmRlciBvciBhcmUgZGVmYXVsdCBDU1NcclxuICAgIGlmIChjbGVhckRlZmF1bHRBdHRyKSB7XHJcbiAgICAgIGlmIChuLncgPT09IDEpIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZ3MtdycpO1xyXG4gICAgICBpZiAobi5oID09PSAxKSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2dzLWgnKTtcclxuICAgICAgaWYgKG4ubWF4VykgZWwucmVtb3ZlQXR0cmlidXRlKCdncy1tYXgtdycpO1xyXG4gICAgICBpZiAobi5taW5XKSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2dzLW1pbi13Jyk7XHJcbiAgICAgIGlmIChuLm1heEgpIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZ3MtbWF4LWgnKTtcclxuICAgICAgaWYgKG4ubWluSCkgZWwucmVtb3ZlQXR0cmlidXRlKCdncy1taW4taCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlbW92ZSBhbnkga2V5IG5vdCBmb3VuZCAobnVsbCBvciBmYWxzZSB3aGljaCBpcyBkZWZhdWx0KVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gbikge1xyXG4gICAgICBpZiAoIW4uaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuO1xyXG4gICAgICBpZiAoIW5ba2V5XSAmJiBuW2tleV0gIT09IDApIHsgLy8gMCBjYW4gYmUgdmFsaWQgdmFsdWUgKHgseSBvbmx5IHJlYWxseSlcclxuICAgICAgICBkZWxldGUgbltrZXldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG47XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIF9zZXRTdGF0aWNDbGFzcygpOiBHcmlkU3RhY2sge1xyXG4gICAgbGV0IGNsYXNzZXMgPSBbJ2dyaWQtc3RhY2stc3RhdGljJ107XHJcblxyXG4gICAgaWYgKHRoaXMub3B0cy5zdGF0aWNHcmlkKSB7XHJcbiAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcclxuICAgICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2dzLXN0YXRpYycsICd0cnVlJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3Nlcyk7XHJcbiAgICAgIHRoaXMuZWwucmVtb3ZlQXR0cmlidXRlKCdncy1zdGF0aWMnKTtcclxuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNhbGxlZCB3aGVuIHdlIGFyZSBiZWluZyByZXNpemVkIGJ5IHRoZSB3aW5kb3cgLSBjaGVjayBpZiB0aGUgb25lIENvbHVtbiBNb2RlIG5lZWRzIHRvIGJlIHR1cm5lZCBvbi9vZmZcclxuICAgKiBhbmQgcmVtZW1iZXIgdGhlIHByZXYgY29sdW1ucyB3ZSB1c2VkLCBvciBnZXQgb3VyIGNvdW50IGZyb20gcGFyZW50LCBhcyB3ZWxsIGFzIGNoZWNrIGZvciBhdXRvIGNlbGwgaGVpZ2h0IChzcXVhcmUpXHJcbiAgICovXHJcbiAgcHVibGljIG9uUGFyZW50UmVzaXplKCk6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAoIXRoaXMuZWwgfHwgIXRoaXMuZWwuY2xpZW50V2lkdGgpIHJldHVybjsgLy8gcmV0dXJuIGlmIHdlJ3JlIGdvbmUgb3Igbm8gc2l6ZSB5ZXQgKHdpbGwgZ2V0IGNhbGxlZCBhZ2FpbilcclxuICAgIGxldCBjaGFuZ2VkQ29sdW1uID0gZmFsc2U7XHJcblxyXG4gICAgLy8gc2VlIGlmIHdlJ3JlIG5lc3RlZCBhbmQgdGFrZSBvdXIgY29sdW1uIGNvdW50IGZyb20gb3VyIHBhcmVudC4uLi5cclxuICAgIGlmICh0aGlzLl9hdXRvQ29sdW1uICYmIHRoaXMucGFyZW50R3JpZEl0ZW0pIHtcclxuICAgICAgaWYgKHRoaXMub3B0cy5jb2x1bW4gIT09IHRoaXMucGFyZW50R3JpZEl0ZW0udykge1xyXG4gICAgICAgIGNoYW5nZWRDb2x1bW4gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY29sdW1uKHRoaXMucGFyZW50R3JpZEl0ZW0udywgJ25vbmUnKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gZWxzZSBjaGVjayBmb3IgMSBjb2x1bW4gaW4vb3V0IGJlaGF2aW9yXHJcbiAgICAgIGxldCBvbmVDb2x1bW4gPSAhdGhpcy5vcHRzLmRpc2FibGVPbmVDb2x1bW5Nb2RlICYmIHRoaXMuZWwuY2xpZW50V2lkdGggPD0gdGhpcy5vcHRzLm9uZUNvbHVtblNpemU7XHJcbiAgICAgIGlmICgodGhpcy5vcHRzLmNvbHVtbiA9PT0gMSkgIT09IG9uZUNvbHVtbikge1xyXG4gICAgICAgIGNoYW5nZWRDb2x1bW4gPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdHMuYW5pbWF0ZSkgeyB0aGlzLnNldEFuaW1hdGlvbihmYWxzZSk7IH0gLy8gMSA8LT4gMTIgaXMgdG9vIHJhZGljYWwsIHR1cm4gb2ZmIGFuaW1hdGlvblxyXG4gICAgICAgIHRoaXMuY29sdW1uKG9uZUNvbHVtbiA/IDEgOiB0aGlzLl9wcmV2Q29sdW1uKTtcclxuICAgICAgICBpZiAodGhpcy5vcHRzLmFuaW1hdGUpIHsgdGhpcy5zZXRBbmltYXRpb24odHJ1ZSk7IH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIG1ha2UgdGhlIGNlbGxzIGNvbnRlbnQgc3F1YXJlIGFnYWluXHJcbiAgICBpZiAodGhpcy5faXNBdXRvQ2VsbEhlaWdodCkge1xyXG4gICAgICBpZiAoIWNoYW5nZWRDb2x1bW4gJiYgdGhpcy5vcHRzLmNlbGxIZWlnaHRUaHJvdHRsZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2VsbEhlaWdodFRocm90dGxlKSB7XHJcbiAgICAgICAgICB0aGlzLl9jZWxsSGVpZ2h0VGhyb3R0bGUgPSBVdGlscy50aHJvdHRsZSgoKSA9PiB0aGlzLmNlbGxIZWlnaHQoKSwgdGhpcy5vcHRzLmNlbGxIZWlnaHRUaHJvdHRsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NlbGxIZWlnaHRUaHJvdHRsZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGltbWVkaWF0ZSB1cGRhdGUgaWYgd2UndmUgY2hhbmdlZCBjb2x1bW4gY291bnQgb3IgaGF2ZSBubyB0aHJlc2hvbGRcclxuICAgICAgICB0aGlzLmNlbGxIZWlnaHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpbmFsbHkgdXBkYXRlIGFueSBuZXN0ZWQgZ3JpZHNcclxuICAgIHRoaXMuZW5naW5lLm5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgIGlmIChuLnN1YkdyaWQpIG4uc3ViR3JpZC5vblBhcmVudFJlc2l6ZSgpXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBhZGQgb3IgcmVtb3ZlIHRoZSB3aW5kb3cgc2l6ZSBldmVudCBoYW5kbGVyICovXHJcbiAgcHJvdGVjdGVkIF91cGRhdGVXaW5kb3dSZXNpemVFdmVudChmb3JjZVJlbW92ZSA9IGZhbHNlKTogR3JpZFN0YWNrIHtcclxuICAgIC8vIG9ubHkgYWRkIGV2ZW50IGlmIHdlJ3JlIG5vdCBuZXN0ZWQgKHBhcmVudCB3aWxsIGNhbGwgdXMpIGFuZCB3ZSdyZSBhdXRvIHNpemluZyBjZWxscyBvciBzdXBwb3J0aW5nIG9uZUNvbHVtbiAoaS5lLiBkb2luZyB3b3JrKVxyXG4gICAgY29uc3Qgd29ya1RvZG8gPSAodGhpcy5faXNBdXRvQ2VsbEhlaWdodCB8fCAhdGhpcy5vcHRzLmRpc2FibGVPbmVDb2x1bW5Nb2RlKSAmJiAhdGhpcy5wYXJlbnRHcmlkSXRlbTtcclxuXHJcbiAgICBpZiAoIWZvcmNlUmVtb3ZlICYmIHdvcmtUb2RvICYmICF0aGlzLl93aW5kb3dSZXNpemVCaW5kKSB7XHJcbiAgICAgIHRoaXMuX3dpbmRvd1Jlc2l6ZUJpbmQgPSB0aGlzLm9uUGFyZW50UmVzaXplLmJpbmQodGhpcyk7IC8vIHNvIHdlIGNhbiBwcm9wZXJseSByZW1vdmUgbGF0ZXJcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX3dpbmRvd1Jlc2l6ZUJpbmQpO1xyXG4gICAgfSBlbHNlIGlmICgoZm9yY2VSZW1vdmUgfHwgIXdvcmtUb2RvKSAmJiB0aGlzLl93aW5kb3dSZXNpemVCaW5kKSB7XHJcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl93aW5kb3dSZXNpemVCaW5kKTtcclxuICAgICAgZGVsZXRlIHRoaXMuX3dpbmRvd1Jlc2l6ZUJpbmQ7IC8vIHJlbW92ZSBsaW5rIHRvIHVzIHNvIHdlIGNhbiBmcmVlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIGNvbnZlcnQgYSBwb3RlbnRpYWwgc2VsZWN0b3IgaW50byBhY3R1YWwgZWxlbWVudCAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudChlbHM6IEdyaWRTdGFja0VsZW1lbnQgPSAnLmdyaWQtc3RhY2staXRlbScpOiBHcmlkSXRlbUhUTUxFbGVtZW50IHsgcmV0dXJuIFV0aWxzLmdldEVsZW1lbnQoZWxzKSB9XHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHMoZWxzOiBHcmlkU3RhY2tFbGVtZW50ID0gJy5ncmlkLXN0YWNrLWl0ZW0nKTogR3JpZEl0ZW1IVE1MRWxlbWVudFtdIHsgcmV0dXJuIFV0aWxzLmdldEVsZW1lbnRzKGVscykgfVxyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBwdWJsaWMgc3RhdGljIGdldEdyaWRFbGVtZW50KGVsczogR3JpZFN0YWNrRWxlbWVudCk6IEdyaWRIVE1MRWxlbWVudCB7IHJldHVybiBHcmlkU3RhY2suZ2V0RWxlbWVudChlbHMpIH1cclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHVibGljIHN0YXRpYyBnZXRHcmlkRWxlbWVudHMoZWxzOiBzdHJpbmcpOiBHcmlkSFRNTEVsZW1lbnRbXSB7IHJldHVybiBVdGlscy5nZXRFbGVtZW50cyhlbHMpIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBpbml0aWFsaXplIG1hcmdpbiB0b3AvYm90dG9tL2xlZnQvcmlnaHQgYW5kIHVuaXRzICovXHJcbiAgcHJvdGVjdGVkIF9pbml0TWFyZ2luKCk6IEdyaWRTdGFjayB7XHJcblxyXG4gICAgbGV0IGRhdGE6IEhlaWdodERhdGE7XHJcbiAgICBsZXQgbWFyZ2luID0gMDtcclxuXHJcbiAgICAvLyBzdXBwb3J0IHBhc3NpbmcgbXVsdGlwbGUgdmFsdWVzIGxpa2UgQ1NTIChleDogJzVweCAxMHB4IDAgMjBweCcpXHJcbiAgICBsZXQgbWFyZ2luczogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLm1hcmdpbiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgbWFyZ2lucyA9IHRoaXMub3B0cy5tYXJnaW4uc3BsaXQoJyAnKVxyXG4gICAgfVxyXG4gICAgaWYgKG1hcmdpbnMubGVuZ3RoID09PSAyKSB7IC8vIHRvcC9ib3QsIGxlZnQvcmlnaHQgbGlrZSBDU1NcclxuICAgICAgdGhpcy5vcHRzLm1hcmdpblRvcCA9IHRoaXMub3B0cy5tYXJnaW5Cb3R0b20gPSBtYXJnaW5zWzBdO1xyXG4gICAgICB0aGlzLm9wdHMubWFyZ2luTGVmdCA9IHRoaXMub3B0cy5tYXJnaW5SaWdodCA9IG1hcmdpbnNbMV07XHJcbiAgICB9IGVsc2UgaWYgKG1hcmdpbnMubGVuZ3RoID09PSA0KSB7IC8vIENsb2Nrd2lzZSBsaWtlIENTU1xyXG4gICAgICB0aGlzLm9wdHMubWFyZ2luVG9wID0gbWFyZ2luc1swXTtcclxuICAgICAgdGhpcy5vcHRzLm1hcmdpblJpZ2h0ID0gbWFyZ2luc1sxXTtcclxuICAgICAgdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSA9IG1hcmdpbnNbMl07XHJcbiAgICAgIHRoaXMub3B0cy5tYXJnaW5MZWZ0ID0gbWFyZ2luc1szXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGEgPSBVdGlscy5wYXJzZUhlaWdodCh0aGlzLm9wdHMubWFyZ2luKTtcclxuICAgICAgdGhpcy5vcHRzLm1hcmdpblVuaXQgPSBkYXRhLnVuaXQ7XHJcbiAgICAgIG1hcmdpbiA9IHRoaXMub3B0cy5tYXJnaW4gPSBkYXRhLmg7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2VlIGlmIHRvcC9ib3R0b20vbGVmdC9yaWdodCBuZWVkIHRvIGJlIHNldCBhcyB3ZWxsXHJcbiAgICBpZiAodGhpcy5vcHRzLm1hcmdpblRvcCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMub3B0cy5tYXJnaW5Ub3AgPSBtYXJnaW47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkYXRhID0gVXRpbHMucGFyc2VIZWlnaHQodGhpcy5vcHRzLm1hcmdpblRvcCk7XHJcbiAgICAgIHRoaXMub3B0cy5tYXJnaW5Ub3AgPSBkYXRhLmg7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdHMubWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdHMubWFyZ2luQm90dG9tID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSA9IG1hcmdpbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGEgPSBVdGlscy5wYXJzZUhlaWdodCh0aGlzLm9wdHMubWFyZ2luQm90dG9tKTtcclxuICAgICAgdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSA9IGRhdGEuaDtcclxuICAgICAgZGVsZXRlIHRoaXMub3B0cy5tYXJnaW47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0cy5tYXJnaW5SaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMub3B0cy5tYXJnaW5SaWdodCA9IG1hcmdpbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGEgPSBVdGlscy5wYXJzZUhlaWdodCh0aGlzLm9wdHMubWFyZ2luUmlnaHQpO1xyXG4gICAgICB0aGlzLm9wdHMubWFyZ2luUmlnaHQgPSBkYXRhLmg7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdHMubWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdHMubWFyZ2luTGVmdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMub3B0cy5tYXJnaW5MZWZ0ID0gbWFyZ2luO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGF0YSA9IFV0aWxzLnBhcnNlSGVpZ2h0KHRoaXMub3B0cy5tYXJnaW5MZWZ0KTtcclxuICAgICAgdGhpcy5vcHRzLm1hcmdpbkxlZnQgPSBkYXRhLmg7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdHMubWFyZ2luO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRzLm1hcmdpblVuaXQgPSBkYXRhLnVuaXQ7IC8vIGluIGNhc2Ugc2lkZSB3ZXJlIHNwZWxsZWQgb3V0LCB1c2UgdGhvc2UgdW5pdHMgaW5zdGVhZC4uLlxyXG4gICAgaWYgKHRoaXMub3B0cy5tYXJnaW5Ub3AgPT09IHRoaXMub3B0cy5tYXJnaW5Cb3R0b20gJiYgdGhpcy5vcHRzLm1hcmdpbkxlZnQgPT09IHRoaXMub3B0cy5tYXJnaW5SaWdodCAmJiB0aGlzLm9wdHMubWFyZ2luVG9wID09PSB0aGlzLm9wdHMubWFyZ2luUmlnaHQpIHtcclxuICAgICAgdGhpcy5vcHRzLm1hcmdpbiA9IHRoaXMub3B0cy5tYXJnaW5Ub3A7IC8vIG1ha2VzIGl0IGVhc2llciB0byBjaGVjayBmb3Igbm8tb3BzIGluIHNldE1hcmdpbigpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBHRFJldiA9ICc4LjIuMic7XHJcblxyXG4gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKiBkcmFnJmRyb3AgbWV0aG9kcyB0aGF0IHVzZWQgdG8gYmUgc3R1YmJlZCBvdXQgYW5kIGltcGxlbWVudGVkIGluIGRkLWdyaWRzdGFjay50c1xyXG4gICAqIGJ1dCBjYXVzZWQgbG9hZGluZyBpc3N1ZXMgaW4gcHJvZCAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ3JpZHN0YWNrL2dyaWRzdGFjay5qcy9pc3N1ZXMvMjAzOVxyXG4gICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgKi9cclxuXHJcbiAgLyoqIGdldCB0aGUgZ2xvYmFsIChidXQgc3RhdGljIHRvIHRoaXMgY29kZSkgREQgaW1wbGVtZW50YXRpb24gKi9cclxuICBwdWJsaWMgc3RhdGljIGdldEREKCk6IERER3JpZFN0YWNrIHtcclxuICAgIHJldHVybiBkZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNhbGwgdG8gc2V0dXAgZHJhZ2dpbmcgaW4gZnJvbSB0aGUgb3V0c2lkZSAoc2F5IHRvb2xiYXIpLCBieSBzcGVjaWZ5aW5nIHRoZSBjbGFzcyBzZWxlY3Rpb24gYW5kIG9wdGlvbnMuXHJcbiAgICogQ2FsbGVkIGR1cmluZyBHcmlkU3RhY2suaW5pdCgpIGFzIG9wdGlvbnMsIGJ1dCBjYW4gYWxzbyBiZSBjYWxsZWQgZGlyZWN0bHkgKGxhc3QgcGFyYW0gYXJlIHVzZWQpIGluIGNhc2UgdGhlIHRvb2xiYXJcclxuICAgKiBpcyBkeW5hbWljYWxseSBjcmVhdGUgYW5kIG5lZWRzIHRvIGJlIHNldCBsYXRlci5cclxuICAgKiBAcGFyYW0gZHJhZ0luIHN0cmluZyBzZWxlY3RvciAoZXg6ICcuc2lkZWJhciAuZ3JpZC1zdGFjay1pdGVtJykgb3IgbGlzdCBvZiBkb20gZWxlbWVudHNcclxuICAgKiBAcGFyYW0gZHJhZ0luT3B0aW9ucyBvcHRpb25zIC0gc2VlIERERHJhZ0luT3B0LiAoZGVmYXVsdDoge2hhbmRsZTogJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcsIGFwcGVuZFRvOiAnYm9keSd9XHJcbiAgICogQHBhcmFtIHJvb3Qgb3B0aW9uYWwgcm9vdCB3aGljaCBkZWZhdWx0cyB0byBkb2N1bWVudCAoZm9yIHNoYWRvdyBkb20gcGFzIHRoZSBwYXJlbnQgSFRNTERvY3VtZW50KVxyXG4gICAqKi9cclxuICBwdWJsaWMgc3RhdGljIHNldHVwRHJhZ0luKGRyYWdJbj86IHN0cmluZyB8IEhUTUxFbGVtZW50W10sIGRyYWdJbk9wdGlvbnM/OiBERERyYWdJbk9wdCwgcm9vdDogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCA9IGRvY3VtZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZHJhZ0luT3B0aW9ucz8ucGF1c2UgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBERE1hbmFnZXIucGF1c2VEcmFnID0gZHJhZ0luT3B0aW9ucy5wYXVzZTtcclxuICAgIH1cclxuXHJcbiAgICBkcmFnSW5PcHRpb25zID0gey4uLmRyYWdJbkRlZmF1bHRPcHRpb25zLCAuLi4oZHJhZ0luT3B0aW9ucyB8fCB7fSl9O1xyXG4gICAgbGV0IGVsczogSFRNTEVsZW1lbnRbXSA9ICh0eXBlb2YgZHJhZ0luID09PSAnc3RyaW5nJykgPyBVdGlscy5nZXRFbGVtZW50cyhkcmFnSW4sIHJvb3QpIDogZHJhZ0luO1xyXG4gICAgaWYgKGVscy5sZW5ndGgpIGVscz8uZm9yRWFjaChlbCA9PiB7XHJcbiAgICAgIGlmICghZGQuaXNEcmFnZ2FibGUoZWwpKSBkZC5kcmFnSW4oZWwsIGRyYWdJbk9wdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbmFibGVzL0Rpc2FibGVzIGRyYWdnaW5nIGJ5IHRoZSB1c2VyIG9mIHNwZWNpZmljIGdyaWQgZWxlbWVudC4gSWYgeW91IHdhbnQgYWxsIGl0ZW1zLCBhbmQgaGF2ZSBpdCBhZmZlY3QgZnV0dXJlIGl0ZW1zLCB1c2UgZW5hYmxlTW92ZSgpIGluc3RlYWQuIE5vLW9wIGZvciBzdGF0aWMgZ3JpZHMuXHJcbiAgICogSUYgeW91IGFyZSBsb29raW5nIHRvIHByZXZlbnQgYW4gaXRlbSBmcm9tIG1vdmluZyAoZHVlIHRvIGJlaW5nIHB1c2hlZCBhcm91bmQgYnkgYW5vdGhlciBkdXJpbmcgY29sbGlzaW9uKSB1c2UgbG9ja2VkIHByb3BlcnR5IGluc3RlYWQuXHJcbiAgICogQHBhcmFtIGVscyB3aWRnZXQgb3Igc2VsZWN0b3IgdG8gbW9kaWZ5LlxyXG4gICAqIEBwYXJhbSB2YWwgaWYgdHJ1ZSB3aWRnZXQgd2lsbCBiZSBkcmFnZ2FibGUsIGFzc3VtaW5nIHRoZSBwYXJlbnQgZ3JpZCBpc24ndCBub01vdmUgb3Igc3RhdGljLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBtb3ZhYmxlKGVsczogR3JpZFN0YWNrRWxlbWVudCwgdmFsOiBib29sZWFuKTogR3JpZFN0YWNrIHtcclxuICAgIGlmICh0aGlzLm9wdHMuc3RhdGljR3JpZCkgcmV0dXJuIHRoaXM7IC8vIGNhbid0IG1vdmUgYSBzdGF0aWMgZ3JpZCFcclxuICAgIEdyaWRTdGFjay5nZXRFbGVtZW50cyhlbHMpLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICBsZXQgbiA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgIGlmICghbikgcmV0dXJuO1xyXG4gICAgICB2YWwgPyBkZWxldGUgbi5ub01vdmUgOiBuLm5vTW92ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuX3ByZXBhcmVEcmFnRHJvcEJ5Tm9kZShuKTsgLy8gaW5pdCBERCBpZiBuZWVkIGJlLCBhbmQgYWRqdXN0XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcy9EaXNhYmxlcyB1c2VyIHJlc2l6aW5nIG9mIHNwZWNpZmljIGdyaWQgZWxlbWVudC4gSWYgeW91IHdhbnQgYWxsIGl0ZW1zLCBhbmQgaGF2ZSBpdCBhZmZlY3QgZnV0dXJlIGl0ZW1zLCB1c2UgZW5hYmxlUmVzaXplKCkgaW5zdGVhZC4gTm8tb3AgZm9yIHN0YXRpYyBncmlkcy5cclxuICAgKiBAcGFyYW0gZWxzICB3aWRnZXQgb3Igc2VsZWN0b3IgdG8gbW9kaWZ5XHJcbiAgICogQHBhcmFtIHZhbCAgaWYgdHJ1ZSB3aWRnZXQgd2lsbCBiZSByZXNpemFibGUsIGFzc3VtaW5nIHRoZSBwYXJlbnQgZ3JpZCBpc24ndCBub1Jlc2l6ZSBvciBzdGF0aWMuXHJcbiAgICovXHJcbiAgcHVibGljIHJlc2l6YWJsZShlbHM6IEdyaWRTdGFja0VsZW1lbnQsIHZhbDogYm9vbGVhbik6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAodGhpcy5vcHRzLnN0YXRpY0dyaWQpIHJldHVybiB0aGlzOyAvLyBjYW4ndCByZXNpemUgYSBzdGF0aWMgZ3JpZCFcclxuICAgIEdyaWRTdGFjay5nZXRFbGVtZW50cyhlbHMpLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICBsZXQgbiA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgIGlmICghbikgcmV0dXJuO1xyXG4gICAgICB2YWwgPyBkZWxldGUgbi5ub1Jlc2l6ZSA6IG4ubm9SZXNpemUgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9wcmVwYXJlRHJhZ0Ryb3BCeU5vZGUobik7IC8vIGluaXQgREQgaWYgbmVlZCBiZSwgYW5kIGFkanVzdFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlbXBvcmFyaWx5IGRpc2FibGVzIHdpZGdldHMgbW92aW5nL3Jlc2l6aW5nLlxyXG4gICAqIElmIHlvdSB3YW50IGEgbW9yZSBwZXJtYW5lbnQgd2F5ICh3aGljaCBmcmVlemVzIHVwIHJlc291cmNlcykgdXNlIGBzZXRTdGF0aWModHJ1ZSlgIGluc3RlYWQuXHJcbiAgICogTm90ZTogbm8tb3AgZm9yIHN0YXRpYyBncmlkXHJcbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvcjpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqICBncmlkLmVuYWJsZU1vdmUoZmFsc2UpO1xyXG4gICAqICBncmlkLmVuYWJsZVJlc2l6ZShmYWxzZSk7XHJcbiAgICogQHBhcmFtIHJlY3Vyc2UgdHJ1ZSAoZGVmYXVsdCkgaWYgc3ViLWdyaWRzIGFsc28gZ2V0IHVwZGF0ZWRcclxuICAgKi9cclxuICBwdWJsaWMgZGlzYWJsZShyZWN1cnNlID0gdHJ1ZSk6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAodGhpcy5vcHRzLnN0YXRpY0dyaWQpIHJldHVybjtcclxuICAgIHRoaXMuZW5hYmxlTW92ZShmYWxzZSwgcmVjdXJzZSk7XHJcbiAgICB0aGlzLmVuYWJsZVJlc2l6ZShmYWxzZSwgcmVjdXJzZSk7XHJcbiAgICB0aGlzLl90cmlnZ2VyRXZlbnQoJ2Rpc2FibGUnKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZS1lbmFibGVzIHdpZGdldHMgbW92aW5nL3Jlc2l6aW5nIC0gc2VlIGRpc2FibGUoKS5cclxuICAgKiBOb3RlOiBuby1vcCBmb3Igc3RhdGljIGdyaWQuXHJcbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvcjpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqICBncmlkLmVuYWJsZU1vdmUodHJ1ZSk7XHJcbiAgICogIGdyaWQuZW5hYmxlUmVzaXplKHRydWUpO1xyXG4gICAqIEBwYXJhbSByZWN1cnNlIHRydWUgKGRlZmF1bHQpIGlmIHN1Yi1ncmlkcyBhbHNvIGdldCB1cGRhdGVkXHJcbiAgICovXHJcbiAgcHVibGljIGVuYWJsZShyZWN1cnNlID0gdHJ1ZSk6IEdyaWRTdGFjayB7XHJcbiAgICBpZiAodGhpcy5vcHRzLnN0YXRpY0dyaWQpIHJldHVybjtcclxuICAgIHRoaXMuZW5hYmxlTW92ZSh0cnVlLCByZWN1cnNlKTtcclxuICAgIHRoaXMuZW5hYmxlUmVzaXplKHRydWUsIHJlY3Vyc2UpO1xyXG4gICAgdGhpcy5fdHJpZ2dlckV2ZW50KCdlbmFibGUnKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcy9kaXNhYmxlcyB3aWRnZXQgbW92aW5nLiBOby1vcCBmb3Igc3RhdGljIGdyaWRzLCBhbmQgbG9jYWxseSBkZWZpbmVkIGl0ZW1zIHN0aWxsIG92ZXJydWxlXHJcbiAgICogQHBhcmFtIHJlY3Vyc2UgdHJ1ZSAoZGVmYXVsdCkgaWYgc3ViLWdyaWRzIGFsc28gZ2V0IHVwZGF0ZWRcclxuICAgKi9cclxuICBwdWJsaWMgZW5hYmxlTW92ZShkb0VuYWJsZTogYm9vbGVhbiwgcmVjdXJzZSA9IHRydWUpOiBHcmlkU3RhY2sge1xyXG4gICAgaWYgKHRoaXMub3B0cy5zdGF0aWNHcmlkKSByZXR1cm4gdGhpczsgLy8gY2FuJ3QgbW92ZSBhIHN0YXRpYyBncmlkIVxyXG4gICAgZG9FbmFibGUgPyBkZWxldGUgdGhpcy5vcHRzLmRpc2FibGVEcmFnIDogdGhpcy5vcHRzLmRpc2FibGVEcmFnID0gdHJ1ZTsgLy8gRklSU1QgYmVmb3JlIHdlIHVwZGF0ZSBjaGlsZHJlbiBhcyBncmlkIG92ZXJyaWRlcyAjMTY1OFxyXG4gICAgdGhpcy5lbmdpbmUubm9kZXMuZm9yRWFjaChuID0+IHtcclxuICAgICAgdGhpcy5fcHJlcGFyZURyYWdEcm9wQnlOb2RlKG4pO1xyXG4gICAgICBpZiAobi5zdWJHcmlkICYmIHJlY3Vyc2UpIG4uc3ViR3JpZC5lbmFibGVNb3ZlKGRvRW5hYmxlLCByZWN1cnNlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbmFibGVzL2Rpc2FibGVzIHdpZGdldCByZXNpemluZy4gTm8tb3AgZm9yIHN0YXRpYyBncmlkcy5cclxuICAgKiBAcGFyYW0gcmVjdXJzZSB0cnVlIChkZWZhdWx0KSBpZiBzdWItZ3JpZHMgYWxzbyBnZXQgdXBkYXRlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBlbmFibGVSZXNpemUoZG9FbmFibGU6IGJvb2xlYW4sIHJlY3Vyc2UgPSB0cnVlKTogR3JpZFN0YWNrIHtcclxuICAgIGlmICh0aGlzLm9wdHMuc3RhdGljR3JpZCkgcmV0dXJuIHRoaXM7IC8vIGNhbid0IHNpemUgYSBzdGF0aWMgZ3JpZCFcclxuICAgIGRvRW5hYmxlID8gZGVsZXRlIHRoaXMub3B0cy5kaXNhYmxlUmVzaXplIDogdGhpcy5vcHRzLmRpc2FibGVSZXNpemUgPSB0cnVlOyAvLyBGSVJTVCBiZWZvcmUgd2UgdXBkYXRlIGNoaWxkcmVuIGFzIGdyaWQgb3ZlcnJpZGVzICMxNjU4XHJcbiAgICB0aGlzLmVuZ2luZS5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICB0aGlzLl9wcmVwYXJlRHJhZ0Ryb3BCeU5vZGUobik7XHJcbiAgICAgIGlmIChuLnN1YkdyaWQgJiYgcmVjdXJzZSkgbi5zdWJHcmlkLmVuYWJsZVJlc2l6ZShkb0VuYWJsZSwgcmVjdXJzZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCByZW1vdmVzIGFueSBkcmFnJmRyb3AgcHJlc2VudCAoY2FsbGVkIGR1cmluZyBkZXN0cm95KSAqL1xyXG4gIHByb3RlY3RlZCBfcmVtb3ZlREQoZWw6IERERWxlbWVudEhvc3QpOiBHcmlkU3RhY2sge1xyXG4gICAgZGQuZHJhZ2dhYmxlKGVsLCAnZGVzdHJveScpLnJlc2l6YWJsZShlbCwgJ2Rlc3Ryb3knKTtcclxuICAgIGlmIChlbC5ncmlkc3RhY2tOb2RlKSB7XHJcbiAgICAgIGRlbGV0ZSBlbC5ncmlkc3RhY2tOb2RlLl9pbml0REQ7IC8vIHJlc2V0IG91ciBERCBpbml0IGZsYWdcclxuICAgIH1cclxuICAgIGRlbGV0ZSBlbC5kZEVsZW1lbnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgY2FsbGVkIHRvIGFkZCBkcmFnIG92ZXIgdG8gc3VwcG9ydCB3aWRnZXRzIGJlaW5nIGFkZGVkIGV4dGVybmFsbHkgKi9cclxuICBwcm90ZWN0ZWQgX3NldHVwQWNjZXB0V2lkZ2V0KCk6IEdyaWRTdGFjayB7XHJcblxyXG4gICAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBkaXNhYmxlIHRoaW5nc1xyXG4gICAgaWYgKHRoaXMub3B0cy5zdGF0aWNHcmlkIHx8ICghdGhpcy5vcHRzLmFjY2VwdFdpZGdldHMgJiYgIXRoaXMub3B0cy5yZW1vdmFibGUpKSB7XHJcbiAgICAgIGRkLmRyb3BwYWJsZSh0aGlzLmVsLCAnZGVzdHJveScpO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyB2YXJzIHNoYXJlZCBhY3Jvc3MgYWxsIG1ldGhvZHNcclxuICAgIGxldCBjZWxsSGVpZ2h0OiBudW1iZXIsIGNlbGxXaWR0aDogbnVtYmVyO1xyXG5cclxuICAgIGxldCBvbkRyYWcgPSAoZXZlbnQ6IERyYWdFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQsIGhlbHBlcjogR3JpZEl0ZW1IVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgICBsZXQgbm9kZSA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xyXG5cclxuICAgICAgaGVscGVyID0gaGVscGVyIHx8IGVsO1xyXG4gICAgICBsZXQgcGFyZW50ID0gdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgbGV0IHt0b3AsIGxlZnR9ID0gaGVscGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBsZWZ0IC09IHBhcmVudC5sZWZ0O1xyXG4gICAgICB0b3AgLT0gcGFyZW50LnRvcDtcclxuICAgICAgbGV0IHVpOiBERFVJRGF0YSA9IHtwb3NpdGlvbjoge3RvcCwgbGVmdH19O1xyXG5cclxuICAgICAgaWYgKG5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpIHtcclxuICAgICAgICBub2RlLnggPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGxlZnQgLyBjZWxsV2lkdGgpKTtcclxuICAgICAgICBub2RlLnkgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHRvcCAvIGNlbGxIZWlnaHQpKTtcclxuICAgICAgICBkZWxldGUgbm9kZS5hdXRvUG9zaXRpb247XHJcbiAgICAgICAgdGhpcy5lbmdpbmUubm9kZUJvdW5kRml4KG5vZGUpO1xyXG5cclxuICAgICAgICAvLyBkb24ndCBhY2NlcHQgKmluaXRpYWwqIGxvY2F0aW9uIGlmIGRvZXNuJ3QgZml0ICMxNDE5IChsb2NrZWQgZHJvcCByZWdpb24sIG9yIGNhbid0IGdyb3cpLCBidXQgbWF5YmUgdHJ5IGlmIGl0IHdpbGwgZ28gc29tZXdoZXJlXHJcbiAgICAgICAgaWYgKCF0aGlzLmVuZ2luZS53aWxsSXRGaXQobm9kZSkpIHtcclxuICAgICAgICAgIG5vZGUuYXV0b1Bvc2l0aW9uID0gdHJ1ZTsgLy8gaWdub3JlIHgseSBhbmQgdHJ5IGZvciBhbnkgc2xvdC4uLlxyXG4gICAgICAgICAgaWYgKCF0aGlzLmVuZ2luZS53aWxsSXRGaXQobm9kZSkpIHtcclxuICAgICAgICAgICAgZGQub2ZmKGVsLCAnZHJhZycpOyAvLyBzdG9wIGNhbGxpbmcgdXNcclxuICAgICAgICAgICAgcmV0dXJuOyAvLyBmdWxsIGdyaWQgb3IgY2FuJ3QgZ3Jvd1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG5vZGUuX3dpbGxGaXRQb3MpIHtcclxuICAgICAgICAgICAgLy8gdXNlIHRoZSBhdXRvIHBvc2l0aW9uIGluc3RlYWQgIzE2ODdcclxuICAgICAgICAgICAgVXRpbHMuY29weVBvcyhub2RlLCBub2RlLl93aWxsRml0UG9zKTtcclxuICAgICAgICAgICAgZGVsZXRlIG5vZGUuX3dpbGxGaXRQb3M7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZS11c2UgdGhlIGV4aXN0aW5nIG5vZGUgZHJhZ2dpbmcgbWV0aG9kXHJcbiAgICAgICAgdGhpcy5fb25TdGFydE1vdmluZyhoZWxwZXIsIGV2ZW50LCB1aSwgbm9kZSwgY2VsbFdpZHRoLCBjZWxsSGVpZ2h0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyByZS11c2UgdGhlIGV4aXN0aW5nIG5vZGUgZHJhZ2dpbmcgdGhhdCBkb2VzIHNvIG11Y2ggb2YgdGhlIGNvbGxpc2lvbiBkZXRlY3Rpb25cclxuICAgICAgICB0aGlzLl9kcmFnT3JSZXNpemUoaGVscGVyLCBldmVudCwgdWksIG5vZGUsIGNlbGxXaWR0aCwgY2VsbEhlaWdodCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZC5kcm9wcGFibGUodGhpcy5lbCwge1xyXG4gICAgICBhY2NlcHQ6IChlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGxldCBub2RlOiBHcmlkU3RhY2tOb2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAvLyBzZXQgYWNjZXB0IGRyb3AgdG8gdHJ1ZSBvbiBvdXJzZWxmICh3aGljaCB3ZSBpZ25vcmUpIHNvIHdlIGRvbid0IGdldCBcImNhbid0IGRyb3BcIiBpY29uIGluIEhUTUw1IG1vZGUgd2hpbGUgbW92aW5nXHJcbiAgICAgICAgaWYgKG5vZGU/LmdyaWQgPT09IHRoaXMpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5vcHRzLmFjY2VwdFdpZGdldHMpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAvLyBjaGVjayBmb3IgYWNjZXB0IG1ldGhvZCBvciBjbGFzcyBtYXRjaGluZ1xyXG4gICAgICAgIGxldCBjYW5BY2NlcHQgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRzLmFjY2VwdFdpZGdldHMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIGNhbkFjY2VwdCA9IHRoaXMub3B0cy5hY2NlcHRXaWRnZXRzKGVsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHNlbGVjdG9yID0gKHRoaXMub3B0cy5hY2NlcHRXaWRnZXRzID09PSB0cnVlID8gJy5ncmlkLXN0YWNrLWl0ZW0nIDogdGhpcy5vcHRzLmFjY2VwdFdpZGdldHMgYXMgc3RyaW5nKTtcclxuICAgICAgICAgIGNhbkFjY2VwdCA9IGVsLm1hdGNoZXMoc2VsZWN0b3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBmaW5hbGx5IGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhY3R1YWxseSBoYXZlIHNwYWNlIGxlZnQgIzE1NzFcclxuICAgICAgICBpZiAoY2FuQWNjZXB0ICYmIG5vZGUgJiYgdGhpcy5vcHRzLm1heFJvdykge1xyXG4gICAgICAgICAgbGV0IG4gPSB7dzogbm9kZS53LCBoOiBub2RlLmgsIG1pblc6IG5vZGUubWluVywgbWluSDogbm9kZS5taW5IfTsgLy8gb25seSB3aWR0aC9oZWlnaHQgbWF0dGVycyBhbmQgYXV0b1Bvc2l0aW9uXHJcbiAgICAgICAgICBjYW5BY2NlcHQgPSB0aGlzLmVuZ2luZS53aWxsSXRGaXQobik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjYW5BY2NlcHQ7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAvKipcclxuICAgICAqIGVudGVyaW5nIG91ciBncmlkIGFyZWFcclxuICAgICAqL1xyXG4gICAgICAub24odGhpcy5lbCwgJ2Ryb3BvdmVyJywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQsIGhlbHBlcjogR3JpZEl0ZW1IVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhgb3ZlciAke3RoaXMuZWwuZ3JpZHN0YWNrLm9wdHMuaWR9ICR7Y291bnQrK31gKTsgLy8gVEVTVFxyXG4gICAgICAgIGxldCBub2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICAvLyBpZ25vcmUgZHJvcCBlbnRlciBvbiBvdXJzZWxmICh1bmxlc3Mgd2UgdGVtcG9yYXJpbHkgcmVtb3ZlZCkgd2hpY2ggaGFwcGVucyBvbiBhIHNpbXBsZSBkcmFnIG9mIG91ciBpdGVtXHJcbiAgICAgICAgaWYgKG5vZGU/LmdyaWQgPT09IHRoaXMgJiYgIW5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpIHtcclxuICAgICAgICAvLyBkZWxldGUgbm9kZS5fYWRkZWQ7IC8vIHJlc2V0IHRoaXMgdG8gdHJhY2sgcGxhY2Vob2xkZXIgYWdhaW4gaW4gY2FzZSB3ZSB3ZXJlIG92ZXIgb3RoZXIgZ3JpZCAjMTQ4NCAoZHJvcG91dCBkb2Vzbid0IGFsd2F5cyBjbGVhcilcclxuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gcHJldmVudCBwYXJlbnQgZnJvbSByZWNlaXZpbmcgbXNnICh3aGljaCBtYXkgYmUgYSBncmlkIGFzIHdlbGwpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmaXggIzE1Nzggd2hlbiBkcmFnZ2luZyBmYXN0LCB3ZSBtYXkgbm90IGdldCBhIGxlYXZlIG9uIHRoZSBwcmV2aW91cyBncmlkIHNvIGZvcmNlIG9uZSBub3dcclxuICAgICAgICBpZiAobm9kZT8uZ3JpZCAmJiBub2RlLmdyaWQgIT09IHRoaXMgJiYgIW5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnZHJvcG92ZXIgd2l0aG91dCBsZWF2ZScpOyAvLyBURVNUXHJcbiAgICAgICAgICBsZXQgb3RoZXJHcmlkID0gbm9kZS5ncmlkO1xyXG4gICAgICAgICAgb3RoZXJHcmlkLl9sZWF2ZShlbCwgaGVscGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNhY2hlIGNlbGwgZGltZW5zaW9ucyAod2hpY2ggZG9uJ3QgY2hhbmdlKSwgcG9zaXRpb24gY2FuIGFuaW1hdGUgaWYgd2UgcmVtb3ZlZCBhbiBpdGVtIGluIG90aGVyR3JpZCB0aGF0IGFmZmVjdHMgdXMuLi5cclxuICAgICAgICBjZWxsV2lkdGggPSB0aGlzLmNlbGxXaWR0aCgpO1xyXG4gICAgICAgIGNlbGxIZWlnaHQgPSB0aGlzLmdldENlbGxIZWlnaHQodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIGxvYWQgYW55IGVsZW1lbnQgYXR0cmlidXRlcyBpZiB3ZSBkb24ndCBoYXZlIGEgbm9kZVxyXG4gICAgICAgIGlmICghbm9kZSkge1xyXG4gICAgICAgICAgbm9kZSA9IHRoaXMuX3JlYWRBdHRyKGVsLCBmYWxzZSk7IC8vIGRvbid0IHdpcGUgZXh0ZXJuYWwgKGUuZy4gZHJhZyB0b29sYmFyKSBhdHRyICMyMzU0XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbm9kZS5ncmlkKSB7XHJcbiAgICAgICAgICBub2RlLl9pc0V4dGVybmFsID0gdHJ1ZTtcclxuICAgICAgICAgIGVsLmdyaWRzdGFja05vZGUgPSBub2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBncmlkIHNpemUgYmFzZWQgb24gZWxlbWVudCBvdXRlciBzaXplXHJcbiAgICAgICAgaGVscGVyID0gaGVscGVyIHx8IGVsO1xyXG4gICAgICAgIGxldCB3ID0gbm9kZS53IHx8IE1hdGgucm91bmQoaGVscGVyLm9mZnNldFdpZHRoIC8gY2VsbFdpZHRoKSB8fCAxO1xyXG4gICAgICAgIGxldCBoID0gbm9kZS5oIHx8IE1hdGgucm91bmQoaGVscGVyLm9mZnNldEhlaWdodCAvIGNlbGxIZWlnaHQpIHx8IDE7XHJcblxyXG4gICAgICAgIC8vIGlmIHRoZSBpdGVtIGNhbWUgZnJvbSBhbm90aGVyIGdyaWQsIG1ha2UgYSBjb3B5IGFuZCBzYXZlIHRoZSBvcmlnaW5hbCBpbmZvIGluIGNhc2Ugd2UgZ28gYmFjayB0aGVyZVxyXG4gICAgICAgIGlmIChub2RlLmdyaWQgJiYgbm9kZS5ncmlkICE9PSB0aGlzKSB7XHJcbiAgICAgICAgLy8gY29weSB0aGUgbm9kZSBvcmlnaW5hbCB2YWx1ZXMgKG1pbi9tYXgvaWQvZXRjLi4uKSBidXQgb3ZlcnJpZGUgd2lkdGgvaGVpZ2h0L290aGVyIGZsYWdzIHdoaWNoIGFyZSB0aGlzIGdyaWQgc3BlY2lmaWNcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnZHJvcG92ZXIgY2xvbmluZyBub2RlJyk7IC8vIFRFU1RcclxuICAgICAgICAgIGlmICghZWwuX2dyaWRzdGFja05vZGVPcmlnKSBlbC5fZ3JpZHN0YWNrTm9kZU9yaWcgPSBub2RlOyAvLyBzaG91bGRuJ3QgaGF2ZSBtdWx0aXBsZSBuZXN0ZWQhXHJcbiAgICAgICAgICBlbC5ncmlkc3RhY2tOb2RlID0gbm9kZSA9IHsuLi5ub2RlLCB3LCBoLCBncmlkOiB0aGlzfTtcclxuICAgICAgICAgIHRoaXMuZW5naW5lLmNsZWFudXBOb2RlKG5vZGUpXHJcbiAgICAgICAgICAgIC5ub2RlQm91bmRGaXgobm9kZSk7XHJcbiAgICAgICAgICAvLyByZXN0b3JlIHNvbWUgaW50ZXJuYWwgZmllbGRzIHdlIG5lZWQgYWZ0ZXIgY2xlYXJpbmcgdGhlbSBhbGxcclxuICAgICAgICAgIG5vZGUuX2luaXRERCA9XHJcbiAgICAgICAgbm9kZS5faXNFeHRlcm5hbCA9ICAvLyBET00gbmVlZHMgdG8gYmUgcmUtcGFyZW50ZWQgb24gYSBkcm9wXHJcbiAgICAgICAgbm9kZS5fdGVtcG9yYXJ5UmVtb3ZlZCA9IHRydWU7IC8vIHNvIGl0IGNhbiBiZSBpbnNlcnRlZCBvbkRyYWcgYmVsb3dcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbm9kZS53ID0gdzsgbm9kZS5oID0gaDtcclxuICAgICAgICAgIG5vZGUuX3RlbXBvcmFyeVJlbW92ZWQgPSB0cnVlOyAvLyBzbyB3ZSBjYW4gaW5zZXJ0IGl0XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjbGVhciBhbnkgbWFya2VkIGZvciBjb21wbGV0ZSByZW1vdmFsIChOb3RlOiBkb24ndCBjaGVjayBfaXNBYm91dFRvUmVtb3ZlIGFzIHRoYXQgaXMgY2xlYXJlZCBhYm92ZSAtIGp1c3QgZG8gaXQpXHJcbiAgICAgICAgdGhpcy5faXRlbVJlbW92aW5nKG5vZGUuZWwsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgZGQub24oZWwsICdkcmFnJywgb25EcmFnKTtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyBpcyBjYWxsZWQgYXQgbGVhc3Qgb25jZSB3aGVuIGdvaW5nIGZhc3QgIzE1NzhcclxuICAgICAgICBvbkRyYWcoZXZlbnQgYXMgRHJhZ0V2ZW50LCBlbCwgaGVscGVyKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHByZXZlbnQgcGFyZW50IGZyb20gcmVjZWl2aW5nIG1zZyAod2hpY2ggbWF5IGJlIGEgZ3JpZCBhcyB3ZWxsKVxyXG4gICAgICB9KVxyXG4gICAgLyoqXHJcbiAgICAgKiBMZWF2aW5nIG91ciBncmlkIGFyZWEuLi5cclxuICAgICAqL1xyXG4gICAgICAub24odGhpcy5lbCwgJ2Ryb3BvdXQnLCAoZXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50LCBoZWxwZXI6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHtcclxuICAgICAgLy8gY29uc29sZS5sb2coYG91dCAke3RoaXMuZWwuZ3JpZHN0YWNrLm9wdHMuaWR9ICR7Y291bnQrK31gKTsgLy8gVEVTVFxyXG4gICAgICAgIGxldCBub2RlID0gZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAvLyBmaXggIzE1Nzggd2hlbiBkcmFnZ2luZyBmYXN0LCB3ZSBtaWdodCBnZXQgbGVhdmUgYWZ0ZXIgb3RoZXIgZ3JpZCBnZXRzIGVudGVyICh3aGljaCBjYWxscyB1cyB0byBjbGVhbilcclxuICAgICAgICAvLyBzbyBza2lwIHRoaXMgb25lIGlmIHdlJ3JlIG5vdCB0aGUgYWN0aXZlIGdyaWQgcmVhbGx5Li5cclxuICAgICAgICBpZiAoIW5vZGUuZ3JpZCB8fCBub2RlLmdyaWQgPT09IHRoaXMpIHtcclxuICAgICAgICAgIHRoaXMuX2xlYXZlKGVsLCBoZWxwZXIpO1xyXG4gICAgICAgICAgLy8gaWYgd2Ugd2VyZSBjcmVhdGVkIGFzIHRlbXBvcmFyeSBuZXN0ZWQgZ3JpZCwgZ28gYmFjayB0byBiZWZvcmUgc3RhdGVcclxuICAgICAgICAgIGlmICh0aGlzLl9pc1RlbXApIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVBc1N1YkdyaWQobm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gcHJldmVudCBwYXJlbnQgZnJvbSByZWNlaXZpbmcgbXNnICh3aGljaCBtYXkgYmUgZ3JpZCBhcyB3ZWxsKVxyXG4gICAgICB9KVxyXG4gICAgLyoqXHJcbiAgICAgKiBlbmQgLSByZWxlYXNpbmcgdGhlIG1vdXNlXHJcbiAgICAgKi9cclxuICAgICAgLm9uKHRoaXMuZWwsICdkcm9wJywgKGV2ZW50LCBlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCwgaGVscGVyOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgbGV0IG5vZGUgPSBlbC5ncmlkc3RhY2tOb2RlO1xyXG4gICAgICAgIC8vIGlnbm9yZSBkcm9wIG9uIG91cnNlbGYgZnJvbSBvdXJzZWxmIHRoYXQgZGlkbid0IGNvbWUgZnJvbSB0aGUgb3V0c2lkZSAtIGRyYWdlbmQgd2lsbCBoYW5kbGUgdGhlIHNpbXBsZSBtb3ZlIGluc3RlYWRcclxuICAgICAgICBpZiAobm9kZT8uZ3JpZCA9PT0gdGhpcyAmJiAhbm9kZS5faXNFeHRlcm5hbCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgd2FzQWRkZWQgPSAhIXRoaXMucGxhY2Vob2xkZXIucGFyZW50RWxlbWVudDsgLy8gc2tpcCBpdGVtcyBub3QgYWN0dWFsbHkgYWRkZWQgdG8gdXMgYmVjYXVzZSBvZiBjb25zdHJhaW5zLCBidXQgZG8gY2xlYW51cCAjMTQxOVxyXG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIC8vIG5vdGlmeSBwcmV2aW91cyBncmlkIG9mIHJlbW92YWxcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnZHJvcCBkZWxldGUgX2dyaWRzdGFja05vZGVPcmlnJykgLy8gVEVTVFxyXG4gICAgICAgIGxldCBvcmlnTm9kZSA9IGVsLl9ncmlkc3RhY2tOb2RlT3JpZztcclxuICAgICAgICBkZWxldGUgZWwuX2dyaWRzdGFja05vZGVPcmlnO1xyXG4gICAgICAgIGlmICh3YXNBZGRlZCAmJiBvcmlnTm9kZT8uZ3JpZCAmJiBvcmlnTm9kZS5ncmlkICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICBsZXQgb0dyaWQgPSBvcmlnTm9kZS5ncmlkO1xyXG4gICAgICAgICAgb0dyaWQuZW5naW5lLnJlbW92ZWROb2Rlcy5wdXNoKG9yaWdOb2RlKTtcclxuICAgICAgICAgIG9HcmlkLl90cmlnZ2VyUmVtb3ZlRXZlbnQoKS5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcbiAgICAgICAgICAvLyBpZiBpdCdzIGFuIGVtcHR5IHN1Yi1ncmlkIHRoYXQgZ290IGF1dG8tY3JlYXRlZCwgbnVrZSBpdFxyXG4gICAgICAgICAgaWYgKG9HcmlkLnBhcmVudEdyaWRJdGVtICYmICFvR3JpZC5lbmdpbmUubm9kZXMubGVuZ3RoICYmIG9HcmlkLm9wdHMuc3ViR3JpZER5bmFtaWMpIHtcclxuICAgICAgICAgICAgb0dyaWQucmVtb3ZlQXNTdWJHcmlkKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gdXNlIGV4aXN0aW5nIHBsYWNlaG9sZGVyIG5vZGUgYXMgaXQncyBhbHJlYWR5IGluIG91ciBsaXN0IHdpdGggZHJvcCBsb2NhdGlvblxyXG4gICAgICAgIGlmICh3YXNBZGRlZCkge1xyXG4gICAgICAgICAgdGhpcy5lbmdpbmUuY2xlYW51cE5vZGUobm9kZSk7IC8vIHJlbW92ZXMgYWxsIGludGVybmFsIF94eXogdmFsdWVzXHJcbiAgICAgICAgICBub2RlLmdyaWQgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZC5vZmYoZWwsICdkcmFnJyk7XHJcbiAgICAgICAgLy8gaWYgd2UgbWFkZSBhIGNvcHkgKCdoZWxwZXInIHdoaWNoIGlzIHRlbXApIG9mIHRoZSBvcmlnaW5hbCBub2RlIHRoZW4gaW5zZXJ0IGEgY29weSwgZWxzZSB3ZSBtb3ZlIHRoZSBvcmlnaW5hbCBub2RlICgjMTEwMilcclxuICAgICAgICAvLyBhcyB0aGUgaGVscGVyIHdpbGwgYmUgbnVrZWQgYnkganF1ZXJ5LXVpIG90aGVyd2lzZS4gVE9ETzogdXBkYXRlIG9sZCBjb2RlIHBhdGhcclxuICAgICAgICBpZiAoaGVscGVyICE9PSBlbCkge1xyXG4gICAgICAgICAgaGVscGVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgZWwuZ3JpZHN0YWNrTm9kZSA9IG9yaWdOb2RlOyAvLyBvcmlnaW5hbCBpdGVtIChsZWZ0IGJlaGluZCkgaXMgcmUtc3RvcmVkIHRvIHByZSBkcmFnZ2luZyBhcyB0aGUgbm9kZSBub3cgaGFzIGRyb3AgaW5mb1xyXG4gICAgICAgICAgaWYgKHdhc0FkZGVkKSB7XHJcbiAgICAgICAgICAgIGVsID0gZWwuY2xvbmVOb2RlKHRydWUpIGFzIEdyaWRJdGVtSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGVsLnJlbW92ZSgpOyAvLyByZWR1Y2UgZmxpY2tlciBhcyB3ZSBjaGFuZ2UgZGVwdGggaGVyZSwgYW5kIHNpemUgZnVydGhlciBkb3duXHJcbiAgICAgICAgICB0aGlzLl9yZW1vdmVERChlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghd2FzQWRkZWQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBlbC5ncmlkc3RhY2tOb2RlID0gbm9kZTtcclxuICAgICAgICBub2RlLmVsID0gZWw7XHJcbiAgICAgICAgbGV0IHN1YkdyaWQgPSBub2RlLnN1YkdyaWQ/LmVsPy5ncmlkc3RhY2s7IC8vIHNldCB3aGVuIGFjdHVhbCBzdWItZ3JpZCBwcmVzZW50XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIFV0aWxzLmNvcHlQb3Mobm9kZSwgdGhpcy5fcmVhZEF0dHIodGhpcy5wbGFjZWhvbGRlcikpOyAvLyBwbGFjZWhvbGRlciB2YWx1ZXMgYXMgbW92aW5nIFZFUlkgZmFzdCBjYW4gdGhyb3cgdGhpbmdzIG9mZiAjMTU3OFxyXG4gICAgICAgIFV0aWxzLnJlbW92ZVBvc2l0aW9uaW5nU3R5bGVzKGVsKTsvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fd3JpdGVBdHRyKGVsLCBub2RlKTtcclxuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGdyaWREZWZhdWx0cy5pdGVtQ2xhc3MsIHRoaXMub3B0cy5pdGVtQ2xhc3MpO1xyXG4gICAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQoZWwpOy8vIEB0cy1pZ25vcmUgLy8gVE9ETzogbm93IHdvdWxkIGJlIGlkZWFsIHRpbWUgdG8gX3JlbW92ZUhlbHBlclN0eWxlKCkgb3ZlcnJpZGluZyBmbG9hdGluZyBzdHlsZXMgKG5hdGl2ZSBvbmx5KVxyXG4gICAgICAgIGlmIChzdWJHcmlkKSB7XHJcbiAgICAgICAgICBzdWJHcmlkLnBhcmVudEdyaWRJdGVtID0gbm9kZTtcclxuICAgICAgICAgIGlmICghc3ViR3JpZC5vcHRzLnN0eWxlSW5IZWFkKSBzdWJHcmlkLl91cGRhdGVTdHlsZXModHJ1ZSk7IC8vIHJlLWNyZWF0ZSBzdWItZ3JpZCBzdHlsZXMgbm93IHRoYXQgd2UndmUgbW92ZWRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udGFpbmVySGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5lbmdpbmUuYWRkZWROb2Rlcy5wdXNoKG5vZGUpOy8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLl90cmlnZ2VyQWRkRXZlbnQoKTsvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcblxyXG4gICAgICAgIHRoaXMuZW5naW5lLmVuZFVwZGF0ZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9nc0V2ZW50SGFuZGxlclsnZHJvcHBlZCddKSB7XHJcbiAgICAgICAgICB0aGlzLl9nc0V2ZW50SGFuZGxlclsnZHJvcHBlZCddKHsuLi5ldmVudCwgdHlwZTogJ2Ryb3BwZWQnfSwgb3JpZ05vZGUgJiYgb3JpZ05vZGUuZ3JpZCA/IG9yaWdOb2RlIDogdW5kZWZpbmVkLCBub2RlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHdhaXQgdGlsbCB3ZSByZXR1cm4gb3V0IG9mIHRoZSBkcmFnIGNhbGxiYWNrIHRvIHNldCB0aGUgbmV3IGRyYWcmcmVzaXplIGhhbmRsZXIgb3IgdGhleSBtYXkgZ2V0IG1lc3NlZCB1cFxyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIC8vIElGRiB3ZSBhcmUgc3RpbGwgdGhlcmUgKHNvbWUgYXBwbGljYXRpb24gd2lsbCB1c2UgYXMgcGxhY2Vob2xkZXIgYW5kIGluc2VydCB0aGVpciByZWFsIHdpZGdldCBpbnN0ZWFkIGFuZCBiZXR0ZXIgY2FsbCBtYWtlV2lkZ2V0KCkpXHJcbiAgICAgICAgICBpZiAobm9kZS5lbCAmJiBub2RlLmVsLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZURyYWdEcm9wQnlOb2RlKG5vZGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbmdpbmUucmVtb3ZlTm9kZShub2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRlbGV0ZSBub2RlLmdyaWQuX2lzVGVtcDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBwcmV2ZW50IHBhcmVudCBmcm9tIHJlY2VpdmluZyBtc2cgKHdoaWNoIG1heSBiZSBncmlkIGFzIHdlbGwpXHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIG1hcmsgaXRlbSBmb3IgcmVtb3ZhbCAqL1xyXG4gIHByaXZhdGUgX2l0ZW1SZW1vdmluZyhlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCwgcmVtb3ZlOiBib29sZWFuKSB7XHJcbiAgICBsZXQgbm9kZSA9IGVsID8gZWwuZ3JpZHN0YWNrTm9kZSA6IHVuZGVmaW5lZDtcclxuICAgIGlmICghbm9kZSB8fCAhbm9kZS5ncmlkKSByZXR1cm47XHJcbiAgICByZW1vdmUgPyBub2RlLl9pc0Fib3V0VG9SZW1vdmUgPSB0cnVlIDogZGVsZXRlIG5vZGUuX2lzQWJvdXRUb1JlbW92ZTtcclxuICAgIHJlbW92ZSA/IGVsLmNsYXNzTGlzdC5hZGQoJ2dyaWQtc3RhY2staXRlbS1yZW1vdmluZycpIDogZWwuY2xhc3NMaXN0LnJlbW92ZSgnZ3JpZC1zdGFjay1pdGVtLXJlbW92aW5nJyk7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIGNhbGxlZCB0byBzZXR1cCBhIHRyYXNoIGRyb3Agem9uZSBpZiB0aGUgdXNlciBzcGVjaWZpZXMgaXQgKi9cclxuICBwcm90ZWN0ZWQgX3NldHVwUmVtb3ZlRHJvcCgpOiBHcmlkU3RhY2sge1xyXG4gICAgaWYgKCF0aGlzLm9wdHMuc3RhdGljR3JpZCAmJiB0eXBlb2YgdGhpcy5vcHRzLnJlbW92YWJsZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgbGV0IHRyYXNoRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMub3B0cy5yZW1vdmFibGUpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAoIXRyYXNoRWwpIHJldHVybiB0aGlzO1xyXG4gICAgICAvLyBvbmx5IHJlZ2lzdGVyIE9ORSBkcm9wLW92ZXIvZHJvcG91dCBjYWxsYmFjayBmb3IgdGhlICd0cmFzaCcsIGFuZCBpdCB3aWxsXHJcbiAgICAgIC8vIHVwZGF0ZSB0aGUgcGFzc2VkIGluIGl0ZW0gYW5kIHBhcmVudCBncmlkIGJlY2F1c2UgdGhlICd0cmFzaCcgaXMgYSBzaGFyZWQgcmVzb3VyY2UgYW55d2F5LFxyXG4gICAgICAvLyBhbmQgTmF0aXZlIEREIG9ubHkgaGFzIDEgZXZlbnQgQ0IgKGhhdmluZyBhIGxpc3QgYW5kIHRlY2huaWNhbGx5IGEgcGVyIGdyaWQgcmVtb3ZhYmxlT3B0aW9ucyBjb21wbGljYXRlcyB0aGluZ3MgZ3JlYXRseSlcclxuICAgICAgaWYgKCFkZC5pc0Ryb3BwYWJsZSh0cmFzaEVsKSkge1xyXG4gICAgICAgIGRkLmRyb3BwYWJsZSh0cmFzaEVsLCB0aGlzLm9wdHMucmVtb3ZhYmxlT3B0aW9ucylcclxuICAgICAgICAgIC5vbih0cmFzaEVsLCAnZHJvcG92ZXInLCAoZXZlbnQsIGVsKSA9PiB0aGlzLl9pdGVtUmVtb3ZpbmcoZWwsIHRydWUpKVxyXG4gICAgICAgICAgLm9uKHRyYXNoRWwsICdkcm9wb3V0JywgIChldmVudCwgZWwpID0+IHRoaXMuX2l0ZW1SZW1vdmluZyhlbCwgZmFsc2UpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIHByZXBhcmVzIHRoZSBlbGVtZW50IGZvciBkcmFnJmRyb3AgKiovXHJcbiAgcHJvdGVjdGVkIF9wcmVwYXJlRHJhZ0Ryb3BCeU5vZGUobm9kZTogR3JpZFN0YWNrTm9kZSk6IEdyaWRTdGFjayB7XHJcbiAgICBsZXQgZWwgPSBub2RlLmVsO1xyXG4gICAgY29uc3Qgbm9Nb3ZlID0gbm9kZS5ub01vdmUgfHwgdGhpcy5vcHRzLmRpc2FibGVEcmFnO1xyXG4gICAgY29uc3Qgbm9SZXNpemUgPSBub2RlLm5vUmVzaXplIHx8IHRoaXMub3B0cy5kaXNhYmxlUmVzaXplO1xyXG5cclxuICAgIC8vIGNoZWNrIGZvciBkaXNhYmxlZCBncmlkIGZpcnN0XHJcbiAgICBpZiAodGhpcy5vcHRzLnN0YXRpY0dyaWQgfHwgKG5vTW92ZSAmJiBub1Jlc2l6ZSkpIHtcclxuICAgICAgaWYgKG5vZGUuX2luaXRERCkge1xyXG4gICAgICAgIHRoaXMuX3JlbW92ZUREKGVsKTsgLy8gbnVrZXMgZXZlcnl0aGluZyBpbnN0ZWFkIG9mIGp1c3QgZGlzYWJsZSwgd2lsbCBhZGQgc29tZSBzdHlsZXMgYmFjayBuZXh0XHJcbiAgICAgICAgZGVsZXRlIG5vZGUuX2luaXRERDtcclxuICAgICAgfVxyXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCd1aS1kcmFnZ2FibGUtZGlzYWJsZWQnLCAndWktcmVzaXphYmxlLWRpc2FibGVkJyk7IC8vIGFkZCBzdHlsZXMgb25lIG1pZ2h0IGRlcGVuZCBvbiAjMTQzNVxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW5vZGUuX2luaXRERCkge1xyXG4gICAgICAvLyB2YXJpYWJsZXMgdXNlZC9jYXNoZWQgYmV0d2VlbiB0aGUgMyBzdGFydC9tb3ZlL2VuZCBtZXRob2RzLCBpbiBhZGRpdGlvbiB0byBub2RlIHBhc3NlZCBhYm92ZVxyXG4gICAgICBsZXQgY2VsbFdpZHRoOiBudW1iZXI7XHJcbiAgICAgIGxldCBjZWxsSGVpZ2h0OiBudW1iZXI7XHJcblxyXG4gICAgICAvKiogY2FsbGVkIHdoZW4gaXRlbSBzdGFydHMgbW92aW5nL3Jlc2l6aW5nICovXHJcbiAgICAgIGxldCBvblN0YXJ0TW92aW5nID0gKGV2ZW50OiBFdmVudCwgdWk6IEREVUlEYXRhKSA9PiB7XHJcbiAgICAgICAgLy8gdHJpZ2dlciBhbnkgJ2RyYWdzdGFydCcgLyAncmVzaXplc3RhcnQnIG1hbnVhbGx5XHJcbiAgICAgICAgaWYgKHRoaXMuX2dzRXZlbnRIYW5kbGVyW2V2ZW50LnR5cGVdKSB7XHJcbiAgICAgICAgICB0aGlzLl9nc0V2ZW50SGFuZGxlcltldmVudC50eXBlXShldmVudCwgZXZlbnQudGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2VsbFdpZHRoID0gdGhpcy5jZWxsV2lkdGgoKTtcclxuICAgICAgICBjZWxsSGVpZ2h0ID0gdGhpcy5nZXRDZWxsSGVpZ2h0KHRydWUpOyAvLyBmb3JjZSBwaXhlbHMgZm9yIGNhbGN1bGF0aW9uc1xyXG5cclxuICAgICAgICB0aGlzLl9vblN0YXJ0TW92aW5nKGVsLCBldmVudCwgdWksIG5vZGUsIGNlbGxXaWR0aCwgY2VsbEhlaWdodCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qKiBjYWxsZWQgd2hlbiBpdGVtIGlzIGJlaW5nIGRyYWdnZWQvcmVzaXplZCAqL1xyXG4gICAgICBsZXQgZHJhZ09yUmVzaXplID0gKGV2ZW50OiBNb3VzZUV2ZW50LCB1aTogRERVSURhdGEpID0+IHtcclxuICAgICAgICB0aGlzLl9kcmFnT3JSZXNpemUoZWwsIGV2ZW50LCB1aSwgbm9kZSwgY2VsbFdpZHRoLCBjZWxsSGVpZ2h0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyoqIGNhbGxlZCB3aGVuIHRoZSBpdGVtIHN0b3BzIG1vdmluZy9yZXNpemluZyAqL1xyXG4gICAgICBsZXQgb25FbmRNb3ZpbmcgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICBkZWxldGUgbm9kZS5fbW92aW5nO1xyXG4gICAgICAgIGRlbGV0ZSBub2RlLl9ldmVudDtcclxuICAgICAgICBkZWxldGUgbm9kZS5fbGFzdFRyaWVkO1xyXG5cclxuICAgICAgICAvLyBpZiB0aGUgaXRlbSBoYXMgbW92ZWQgdG8gYW5vdGhlciBncmlkLCB3ZSdyZSBkb25lIGhlcmVcclxuICAgICAgICBsZXQgdGFyZ2V0OiBHcmlkSXRlbUhUTUxFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEdyaWRJdGVtSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCF0YXJnZXQuZ3JpZHN0YWNrTm9kZSB8fCB0YXJnZXQuZ3JpZHN0YWNrTm9kZS5ncmlkICE9PSB0aGlzKSByZXR1cm47XHJcblxyXG4gICAgICAgIG5vZGUuZWwgPSB0YXJnZXQ7XHJcblxyXG4gICAgICAgIGlmIChub2RlLl9pc0Fib3V0VG9SZW1vdmUpIHtcclxuICAgICAgICAgIGxldCBncmlkVG9Ob3RpZnkgPSBlbC5ncmlkc3RhY2tOb2RlLmdyaWQ7XHJcbiAgICAgICAgICBpZiAoZ3JpZFRvTm90aWZ5Ll9nc0V2ZW50SGFuZGxlcltldmVudC50eXBlXSkge1xyXG4gICAgICAgICAgICBncmlkVG9Ob3RpZnkuX2dzRXZlbnRIYW5kbGVyW2V2ZW50LnR5cGVdKGV2ZW50LCB0YXJnZXQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fcmVtb3ZlREQoZWwpO1xyXG4gICAgICAgICAgZ3JpZFRvTm90aWZ5LmVuZ2luZS5yZW1vdmVkTm9kZXMucHVzaChub2RlKTtcclxuICAgICAgICAgIGdyaWRUb05vdGlmeS5fdHJpZ2dlclJlbW92ZUV2ZW50KCk7XHJcbiAgICAgICAgICAvLyBicmVhayBjaXJjdWxhciBsaW5rcyBhbmQgcmVtb3ZlIERPTVxyXG4gICAgICAgICAgZGVsZXRlIGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICAgICAgICBkZWxldGUgbm9kZS5lbDtcclxuICAgICAgICAgIGVsLnJlbW92ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBVdGlscy5yZW1vdmVQb3NpdGlvbmluZ1N0eWxlcyh0YXJnZXQpO1xyXG4gICAgICAgICAgaWYgKG5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpIHtcclxuICAgICAgICAgICAgLy8gZ290IHJlbW92ZWQgLSByZXN0b3JlIGl0ZW0gYmFjayB0byBiZWZvcmUgZHJhZ2dpbmcgcG9zaXRpb25cclxuICAgICAgICAgICAgVXRpbHMuY29weVBvcyhub2RlLCBub2RlLl9vcmlnKTsvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHRoaXMuX3dyaXRlUG9zQXR0cih0YXJnZXQsIG5vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2luZS5hZGROb2RlKG5vZGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gbW92ZSB0byBuZXcgcGxhY2Vob2xkZXIgbG9jYXRpb25cclxuICAgICAgICAgICAgdGhpcy5fd3JpdGVQb3NBdHRyKHRhcmdldCwgbm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5fZ3NFdmVudEhhbmRsZXJbZXZlbnQudHlwZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3NFdmVudEhhbmRsZXJbZXZlbnQudHlwZV0oZXZlbnQsIHRhcmdldCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLl9leHRyYURyYWdSb3cgPSAwOy8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJIZWlnaHQoKTsvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgdGhpcy5fdHJpZ2dlckNoYW5nZUV2ZW50KCk7XHJcblxyXG4gICAgICAgIHRoaXMuZW5naW5lLmVuZFVwZGF0ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkZC5kcmFnZ2FibGUoZWwsIHtcclxuICAgICAgICBzdGFydDogb25TdGFydE1vdmluZyxcclxuICAgICAgICBzdG9wOiBvbkVuZE1vdmluZyxcclxuICAgICAgICBkcmFnOiBkcmFnT3JSZXNpemVcclxuICAgICAgfSkucmVzaXphYmxlKGVsLCB7XHJcbiAgICAgICAgc3RhcnQ6IG9uU3RhcnRNb3ZpbmcsXHJcbiAgICAgICAgc3RvcDogb25FbmRNb3ZpbmcsXHJcbiAgICAgICAgcmVzaXplOiBkcmFnT3JSZXNpemVcclxuICAgICAgfSk7XHJcbiAgICAgIG5vZGUuX2luaXRERCA9IHRydWU7IC8vIHdlJ3ZlIHNldCBERCBzdXBwb3J0IG5vd1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpbmFsbHkgZmluZSB0dW5lIG1vdmUgdnMgcmVzaXplIGJ5IGRpc2FibGluZyBhbnkgcGFydC4uLlxyXG4gICAgZGQuZHJhZ2dhYmxlKGVsLCBub01vdmUgPyAnZGlzYWJsZScgOiAnZW5hYmxlJylcclxuICAgICAgLnJlc2l6YWJsZShlbCwgbm9SZXNpemUgPyAnZGlzYWJsZScgOiAnZW5hYmxlJyk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIGhhbmRsZXMgYWN0dWFsIGRyYWcvcmVzaXplIHN0YXJ0ICoqL1xyXG4gIHByb3RlY3RlZCBfb25TdGFydE1vdmluZyhlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCwgZXZlbnQ6IEV2ZW50LCB1aTogRERVSURhdGEsIG5vZGU6IEdyaWRTdGFja05vZGUsIGNlbGxXaWR0aDogbnVtYmVyLCBjZWxsSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZW5naW5lLmNsZWFuTm9kZXMoKVxyXG4gICAgICAuYmVnaW5VcGRhdGUobm9kZSk7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICB0aGlzLl93cml0ZVBvc0F0dHIodGhpcy5wbGFjZWhvbGRlciwgbm9kZSlcclxuICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlcik7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnX29uU3RhcnRNb3ZpbmcgcGxhY2Vob2xkZXInKSAvLyBURVNUXHJcblxyXG4gICAgbm9kZS5lbCA9IHRoaXMucGxhY2Vob2xkZXI7XHJcbiAgICBub2RlLl9sYXN0VWlQb3NpdGlvbiA9IHVpLnBvc2l0aW9uO1xyXG4gICAgbm9kZS5fcHJldllQaXggPSB1aS5wb3NpdGlvbi50b3A7XHJcbiAgICBub2RlLl9tb3ZpbmcgPSAoZXZlbnQudHlwZSA9PT0gJ2RyYWdzdGFydCcpOyAvLyAnZHJvcG92ZXInIGFyZSBub3QgaW5pdGlhbGx5IG1vdmluZyBzbyB0aGV5IGNhbiBnbyBleGFjdGx5IHdoZXJlIHRoZXkgZW50ZXIgKHdpbGwgcHVzaCBzdHVmZiBvdXQgb2YgdGhlIHdheSlcclxuICAgIGRlbGV0ZSBub2RlLl9sYXN0VHJpZWQ7XHJcblxyXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkcm9wb3ZlcicgJiYgbm9kZS5fdGVtcG9yYXJ5UmVtb3ZlZCkge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnZW5naW5lLmFkZE5vZGUgeD0nICsgbm9kZS54KTsgLy8gVEVTVFxyXG4gICAgICB0aGlzLmVuZ2luZS5hZGROb2RlKG5vZGUpOyAvLyB3aWxsIGFkZCwgZml4IGNvbGxpc2lvbnMsIHVwZGF0ZSBhdHRyIGFuZCBjbGVhciBfdGVtcG9yYXJ5UmVtb3ZlZFxyXG4gICAgICBub2RlLl9tb3ZpbmcgPSB0cnVlOyAvLyBBRlRFUiwgbWFyayBhcyBtb3Zpbmcgb2JqZWN0ICh3YW50ZWQgZml4IGxvY2F0aW9uIGJlZm9yZSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBzZXQgdGhlIG1pbi9tYXggcmVzaXplIGluZm9cclxuICAgIHRoaXMuZW5naW5lLmNhY2hlUmVjdHMoY2VsbFdpZHRoLCBjZWxsSGVpZ2h0LCB0aGlzLm9wdHMubWFyZ2luVG9wIGFzIG51bWJlciwgdGhpcy5vcHRzLm1hcmdpblJpZ2h0IGFzIG51bWJlciwgdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSBhcyBudW1iZXIsIHRoaXMub3B0cy5tYXJnaW5MZWZ0IGFzIG51bWJlcik7XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3Jlc2l6ZXN0YXJ0Jykge1xyXG4gICAgICBkZC5yZXNpemFibGUoZWwsICdvcHRpb24nLCAnbWluV2lkdGgnLCBjZWxsV2lkdGggKiAobm9kZS5taW5XIHx8IDEpKVxyXG4gICAgICAgIC5yZXNpemFibGUoZWwsICdvcHRpb24nLCAnbWluSGVpZ2h0JywgY2VsbEhlaWdodCAqIChub2RlLm1pbkggfHwgMSkpO1xyXG4gICAgICBpZiAobm9kZS5tYXhXKSB7IGRkLnJlc2l6YWJsZShlbCwgJ29wdGlvbicsICdtYXhXaWR0aCcsIGNlbGxXaWR0aCAqIG5vZGUubWF4Vyk7IH1cclxuICAgICAgaWYgKG5vZGUubWF4SCkgeyBkZC5yZXNpemFibGUoZWwsICdvcHRpb24nLCAnbWF4SGVpZ2h0JywgY2VsbEhlaWdodCAqIG5vZGUubWF4SCk7IH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgaGFuZGxlcyBhY3R1YWwgZHJhZy9yZXNpemUgKiovXHJcbiAgcHJvdGVjdGVkIF9kcmFnT3JSZXNpemUoZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50LCB1aTogRERVSURhdGEsIG5vZGU6IEdyaWRTdGFja05vZGUsIGNlbGxXaWR0aDogbnVtYmVyLCBjZWxsSGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBwID0gey4uLm5vZGUuX29yaWd9OyAvLyBjb3VsZCBiZSB1bmRlZmluZWQgKF9pc0V4dGVybmFsKSB3aGljaCBpcyBvayAoZHJhZyBvbmx5IHNldCB4LHkgYW5kIHcsaCB3aWxsIGRlZmF1bHQgdG8gbm9kZSB2YWx1ZSlcclxuICAgIGxldCByZXNpemluZzogYm9vbGVhbjtcclxuICAgIGxldCBtTGVmdCA9IHRoaXMub3B0cy5tYXJnaW5MZWZ0IGFzIG51bWJlcixcclxuICAgICAgbVJpZ2h0ID0gdGhpcy5vcHRzLm1hcmdpblJpZ2h0IGFzIG51bWJlcixcclxuICAgICAgbVRvcCA9IHRoaXMub3B0cy5tYXJnaW5Ub3AgYXMgbnVtYmVyLFxyXG4gICAgICBtQm90dG9tID0gdGhpcy5vcHRzLm1hcmdpbkJvdHRvbSBhcyBudW1iZXI7XHJcblxyXG4gICAgLy8gaWYgbWFyZ2lucyAod2hpY2ggYXJlIHVzZWQgdG8gcGFzcyBtaWQgcG9pbnQgYnkpIGFyZSBsYXJnZSByZWxhdGl2ZSB0byBjZWxsIGhlaWdodC93aWR0aCwgcmVkdWNlIHRoZW0gZG93biAjMTg1NVxyXG4gICAgbGV0IG1IZWlnaHQgPSBNYXRoLnJvdW5kKGNlbGxIZWlnaHQgKiAwLjEpLFxyXG4gICAgICBtV2lkdGggPSBNYXRoLnJvdW5kKGNlbGxXaWR0aCAqIDAuMSk7XHJcbiAgICBtTGVmdCA9IE1hdGgubWluKG1MZWZ0LCBtV2lkdGgpO1xyXG4gICAgbVJpZ2h0ID0gTWF0aC5taW4obVJpZ2h0LCBtV2lkdGgpO1xyXG4gICAgbVRvcCA9IE1hdGgubWluKG1Ub3AsIG1IZWlnaHQpO1xyXG4gICAgbUJvdHRvbSA9IE1hdGgubWluKG1Cb3R0b20sIG1IZWlnaHQpO1xyXG5cclxuICAgIGlmIChldmVudC50eXBlID09PSAnZHJhZycpIHtcclxuICAgICAgaWYgKG5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpIHJldHVybjsgLy8gaGFuZGxlZCBieSBkcm9wb3ZlclxyXG4gICAgICBsZXQgZGlzdGFuY2UgPSB1aS5wb3NpdGlvbi50b3AgLSBub2RlLl9wcmV2WVBpeDtcclxuICAgICAgbm9kZS5fcHJldllQaXggPSB1aS5wb3NpdGlvbi50b3A7XHJcbiAgICAgIGlmICh0aGlzLm9wdHMuZHJhZ2dhYmxlLnNjcm9sbCAhPT0gZmFsc2UpIHtcclxuICAgICAgICBVdGlscy51cGRhdGVTY3JvbGxQb3NpdGlvbihlbCwgdWkucG9zaXRpb24sIGRpc3RhbmNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZ2V0IG5ldyBwb3NpdGlvbiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBtYXJnaW4gaW4gdGhlIGRpcmVjdGlvbiB3ZSBhcmUgbW92aW5nISAobmVlZCB0byBwYXNzIG1pZCBwb2ludCBieSBtYXJnaW4pXHJcbiAgICAgIGxldCBsZWZ0ID0gdWkucG9zaXRpb24ubGVmdCArICh1aS5wb3NpdGlvbi5sZWZ0ID4gbm9kZS5fbGFzdFVpUG9zaXRpb24ubGVmdCAgPyAtbVJpZ2h0IDogbUxlZnQpO1xyXG4gICAgICBsZXQgdG9wID0gdWkucG9zaXRpb24udG9wICsgKHVpLnBvc2l0aW9uLnRvcCA+IG5vZGUuX2xhc3RVaVBvc2l0aW9uLnRvcCAgPyAtbUJvdHRvbSA6IG1Ub3ApO1xyXG4gICAgICBwLnggPSBNYXRoLnJvdW5kKGxlZnQgLyBjZWxsV2lkdGgpO1xyXG4gICAgICBwLnkgPSBNYXRoLnJvdW5kKHRvcCAvIGNlbGxIZWlnaHQpO1xyXG5cclxuICAgICAgLy8gQHRzLWlnbm9yZS8vIGlmIHdlJ3JlIGF0IHRoZSBib3R0b20gaGl0dGluZyBzb21ldGhpbmcgZWxzZSwgZ3JvdyB0aGUgZ3JpZCBzbyBjdXJzb3IgZG9lc24ndCBsZWF2ZSB3aGVuIHRyeWluZyB0byBwbGFjZSBiZWxvdyBvdGhlcnNcclxuICAgICAgbGV0IHByZXYgPSB0aGlzLl9leHRyYURyYWdSb3c7XHJcbiAgICAgIGlmICh0aGlzLmVuZ2luZS5jb2xsaWRlKG5vZGUsIHApKSB7XHJcbiAgICAgICAgbGV0IHJvdyA9IHRoaXMuZ2V0Um93KCk7XHJcbiAgICAgICAgbGV0IGV4dHJhID0gTWF0aC5tYXgoMCwgKHAueSArIG5vZGUuaCkgLSByb3cpO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdHMubWF4Um93ICYmIHJvdyArIGV4dHJhID4gdGhpcy5vcHRzLm1heFJvdykge1xyXG4gICAgICAgICAgZXh0cmEgPSBNYXRoLm1heCgwLCB0aGlzLm9wdHMubWF4Um93IC0gcm93KTtcclxuICAgICAgICB9Ly8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHRoaXMuX2V4dHJhRHJhZ1JvdyA9IGV4dHJhOy8vIEB0cy1pZ25vcmVcclxuICAgICAgfSBlbHNlIHRoaXMuX2V4dHJhRHJhZ1JvdyA9IDA7Ly8gQHRzLWlnbm9yZVxyXG4gICAgICBpZiAodGhpcy5fZXh0cmFEcmFnUm93ICE9PSBwcmV2KSB0aGlzLl91cGRhdGVDb250YWluZXJIZWlnaHQoKTtcclxuXHJcbiAgICAgIGlmIChub2RlLnggPT09IHAueCAmJiBub2RlLnkgPT09IHAueSkgcmV0dXJuOyAvLyBza2lwIHNhbWVcclxuICAgICAgLy8gRE9OJ1Qgc2tpcCBvbmUgd2UgdHJpZWQgYXMgd2UgbWlnaHQgaGF2ZSBmYWlsZWQgYmVjYXVzZSBvZiBjb3ZlcmFnZSA8NTAlIGJlZm9yZVxyXG4gICAgICAvLyBpZiAobm9kZS5fbGFzdFRyaWVkICYmIG5vZGUuX2xhc3RUcmllZC54ID09PSB4ICYmIG5vZGUuX2xhc3RUcmllZC55ID09PSB5KSByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09ICdyZXNpemUnKSAge1xyXG4gICAgICBpZiAocC54IDwgMCkgcmV0dXJuO1xyXG4gICAgICAvLyBTY3JvbGxpbmcgcGFnZSBpZiBuZWVkZWRcclxuICAgICAgVXRpbHMudXBkYXRlU2Nyb2xsUmVzaXplKGV2ZW50LCBlbCwgY2VsbEhlaWdodCk7XHJcblxyXG4gICAgICAvLyBnZXQgbmV3IHNpemVcclxuICAgICAgcC53ID0gTWF0aC5yb3VuZCgodWkuc2l6ZS53aWR0aCAtIG1MZWZ0KSAvIGNlbGxXaWR0aCk7XHJcbiAgICAgIHAuaCA9IE1hdGgucm91bmQoKHVpLnNpemUuaGVpZ2h0IC0gbVRvcCkgLyBjZWxsSGVpZ2h0KTtcclxuICAgICAgaWYgKG5vZGUudyA9PT0gcC53ICYmIG5vZGUuaCA9PT0gcC5oKSByZXR1cm47XHJcbiAgICAgIGlmIChub2RlLl9sYXN0VHJpZWQgJiYgbm9kZS5fbGFzdFRyaWVkLncgPT09IHAudyAmJiBub2RlLl9sYXN0VHJpZWQuaCA9PT0gcC5oKSByZXR1cm47IC8vIHNraXAgb25lIHdlIHRyaWVkIChidXQgZmFpbGVkKVxyXG5cclxuICAgICAgLy8gaWYgd2Ugc2l6ZSBvbiBsZWZ0L3RvcCBzaWRlIHRoaXMgbWlnaHQgbW92ZSB1cywgc28gZ2V0IHBvc3NpYmxlIG5ldyBwb3NpdGlvbiBhcyB3ZWxsXHJcbiAgICAgIGxldCBsZWZ0ID0gdWkucG9zaXRpb24ubGVmdCArIG1MZWZ0O1xyXG4gICAgICBsZXQgdG9wID0gdWkucG9zaXRpb24udG9wICsgbVRvcDtcclxuICAgICAgcC54ID0gTWF0aC5yb3VuZChsZWZ0IC8gY2VsbFdpZHRoKTtcclxuICAgICAgcC55ID0gTWF0aC5yb3VuZCh0b3AgLyBjZWxsSGVpZ2h0KTtcclxuXHJcbiAgICAgIHJlc2l6aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBub2RlLl9ldmVudCA9IGV2ZW50O1xyXG4gICAgbm9kZS5fbGFzdFRyaWVkID0gcDsgLy8gc2V0IGFzIGxhc3QgdHJpZWQgKHdpbGwgbnVrZSBpZiB3ZSBnbyB0aGVyZSlcclxuICAgIGxldCByZWN0OiBHcmlkU3RhY2tQb3NpdGlvbiA9IHsgLy8gc2NyZWVuIHBpeCBvZiB0aGUgZHJhZ2dlZCBib3hcclxuICAgICAgeDogdWkucG9zaXRpb24ubGVmdCArIG1MZWZ0LFxyXG4gICAgICB5OiB1aS5wb3NpdGlvbi50b3AgKyBtVG9wLFxyXG4gICAgICB3OiAodWkuc2l6ZSA/IHVpLnNpemUud2lkdGggOiBub2RlLncgKiBjZWxsV2lkdGgpIC0gbUxlZnQgLSBtUmlnaHQsXHJcbiAgICAgIGg6ICh1aS5zaXplID8gdWkuc2l6ZS5oZWlnaHQgOiBub2RlLmggKiBjZWxsSGVpZ2h0KSAtIG1Ub3AgLSBtQm90dG9tXHJcbiAgICB9O1xyXG4gICAgaWYgKHRoaXMuZW5naW5lLm1vdmVOb2RlQ2hlY2sobm9kZSwgey4uLnAsIGNlbGxXaWR0aCwgY2VsbEhlaWdodCwgcmVjdCwgcmVzaXppbmd9KSkge1xyXG4gICAgICBub2RlLl9sYXN0VWlQb3NpdGlvbiA9IHVpLnBvc2l0aW9uO1xyXG4gICAgICB0aGlzLmVuZ2luZS5jYWNoZVJlY3RzKGNlbGxXaWR0aCwgY2VsbEhlaWdodCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tLCBtTGVmdCk7XHJcbiAgICAgIGRlbGV0ZSBub2RlLl9za2lwRG93bjtcclxuICAgICAgaWYgKHJlc2l6aW5nICYmIG5vZGUuc3ViR3JpZCkgbm9kZS5zdWJHcmlkLm9uUGFyZW50UmVzaXplKCk7XHJcbiAgICAgIHRoaXMuX2V4dHJhRHJhZ1JvdyA9IDA7Ly8gQHRzLWlnbm9yZVxyXG4gICAgICB0aGlzLl91cGRhdGVDb250YWluZXJIZWlnaHQoKTtcclxuXHJcbiAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgR3JpZEl0ZW1IVE1MRWxlbWVudDsvLyBAdHMtaWdub3JlXHJcbiAgICAgIHRoaXMuX3dyaXRlUG9zQXR0cih0YXJnZXQsIG5vZGUpO1xyXG4gICAgICBpZiAodGhpcy5fZ3NFdmVudEhhbmRsZXJbZXZlbnQudHlwZV0pIHtcclxuICAgICAgICB0aGlzLl9nc0V2ZW50SGFuZGxlcltldmVudC50eXBlXShldmVudCwgdGFyZ2V0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBjYWxsZWQgd2hlbiBpdGVtIGxlYXZpbmcgb3VyIGFyZWEgYnkgZWl0aGVyIGN1cnNvciBkcm9wb3V0IGV2ZW50XHJcbiAgICogb3Igc2hhcGUgaXMgb3V0c2lkZSBvdXIgYm91bmRhcmllcy4gcmVtb3ZlIGl0IGZyb20gdXMsIGFuZCBtYXJrIHRlbXBvcmFyeSBpZiB0aGlzIHdhc1xyXG4gICAqIG91ciBpdGVtIHRvIHN0YXJ0IHdpdGggZWxzZSByZXN0b3JlIHByZXYgbm9kZSB2YWx1ZXMgZnJvbSBwcmV2IGdyaWQgaXQgY2FtZSBmcm9tLlxyXG4gICAqKi9cclxuICBwcm90ZWN0ZWQgX2xlYXZlKGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50LCBoZWxwZXI/OiBHcmlkSXRlbUhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBsZXQgbm9kZSA9IGVsLmdyaWRzdGFja05vZGU7XHJcbiAgICBpZiAoIW5vZGUpIHJldHVybjtcclxuXHJcbiAgICBkZC5vZmYoZWwsICdkcmFnJyk7IC8vIG5vIG5lZWQgdG8gdHJhY2sgd2hpbGUgYmVpbmcgb3V0c2lkZVxyXG5cclxuICAgIC8vIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBjdXJzb3IgbGVhdmVzIGFuZCBzaGFwZSBpcyBvdXRzaWRlLCBzbyBvbmx5IGRvIHRoaXMgb25jZVxyXG4gICAgaWYgKG5vZGUuX3RlbXBvcmFyeVJlbW92ZWQpIHJldHVybjtcclxuICAgIG5vZGUuX3RlbXBvcmFyeVJlbW92ZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuZW5naW5lLnJlbW92ZU5vZGUobm9kZSk7IC8vIHJlbW92ZSBwbGFjZWhvbGRlciBhcyB3ZWxsLCBvdGhlcndpc2UgaXQncyBhIHNpZ24gbm9kZSBpcyBub3QgaW4gb3VyIGxpc3QsIHdoaWNoIGlzIGEgYmlnZ2VyIGlzc3VlXHJcbiAgICBub2RlLmVsID0gbm9kZS5faXNFeHRlcm5hbCAmJiBoZWxwZXIgPyBoZWxwZXIgOiBlbDsgLy8gcG9pbnQgYmFjayB0byByZWFsIGl0ZW0gYmVpbmcgZHJhZ2dlZFxyXG5cclxuICAgIGlmICh0aGlzLm9wdHMucmVtb3ZhYmxlID09PSB0cnVlKSB7IC8vIGJvb2xlYW4gdnMgYSBjbGFzcyBzdHJpbmdcclxuICAgICAgLy8gaXRlbSBsZWF2aW5nIHVzIGFuZCB3ZSBhcmUgc3VwcG9zZWQgdG8gcmVtb3ZlIG9uIGxlYXZlIChubyBuZWVkIHRvIGRyYWcgb250byB0cmFzaCkgbWFyayBpdCBzb1xyXG4gICAgICB0aGlzLl9pdGVtUmVtb3ZpbmcoZWwsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZpbmFsbHkgaWYgaXRlbSBvcmlnaW5hbGx5IGNhbWUgZnJvbSBhbm90aGVyIGdyaWQsIGJ1dCBsZWZ0IHVzLCByZXN0b3JlIHRoaW5ncyBiYWNrIHRvIHByZXYgaW5mb1xyXG4gICAgaWYgKGVsLl9ncmlkc3RhY2tOb2RlT3JpZykge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnbGVhdmUgZGVsZXRlIF9ncmlkc3RhY2tOb2RlT3JpZycpIC8vIFRFU1RcclxuICAgICAgZWwuZ3JpZHN0YWNrTm9kZSA9IGVsLl9ncmlkc3RhY2tOb2RlT3JpZztcclxuICAgICAgZGVsZXRlIGVsLl9ncmlkc3RhY2tOb2RlT3JpZztcclxuICAgIH0gZWxzZSBpZiAobm9kZS5faXNFeHRlcm5hbCkge1xyXG4gICAgICAvLyBpdGVtIGNhbWUgZnJvbSBvdXRzaWRlIChsaWtlIGEgdG9vbGJhcikgc28gbnVrZSBhbnkgbm9kZSBpbmZvXHJcbiAgICAgIGRlbGV0ZSBub2RlLmVsO1xyXG4gICAgICBkZWxldGUgZWwuZ3JpZHN0YWNrTm9kZTtcclxuICAgICAgLy8gYW5kIHJlc3RvcmUgYWxsIG5vZGVzIGJhY2sgdG8gb3JpZ2luYWxcclxuICAgICAgdGhpcy5lbmdpbmUucmVzdG9yZUluaXRpYWwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGxlZ2FjeSBtZXRob2QgcmVtb3ZlZFxyXG4gIHB1YmxpYyBjb21taXQoKTogR3JpZFN0YWNrIHsgb2Jzb2xldGUodGhpcywgdGhpcy5iYXRjaFVwZGF0ZShmYWxzZSksICdjb21taXQnLCAnYmF0Y2hVcGRhdGUnLCAnNS4yJyk7IHJldHVybiB0aGlzOyB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///324\n")},855:function(__unused_webpack_module,exports){eval("\n/**\n * types.ts 8.2.2\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.dragInDefaultOptions = exports.gridDefaults = void 0;\n// default values for grid options - used during init and when saving out\nexports.gridDefaults = {\n alwaysShowResizeHandle: 'mobile',\n animate: true,\n auto: true,\n cellHeight: 'auto',\n cellHeightThrottle: 100,\n cellHeightUnit: 'px',\n column: 12,\n draggable: { handle: '.grid-stack-item-content', appendTo: 'body', scroll: true },\n handle: '.grid-stack-item-content',\n itemClass: 'grid-stack-item',\n margin: 10,\n marginUnit: 'px',\n maxRow: 0,\n minRow: 0,\n oneColumnSize: 768,\n placeholderClass: 'grid-stack-placeholder',\n placeholderText: '',\n removableOptions: { accept: '.grid-stack-item' },\n resizable: { handles: 'se' },\n rtl: 'auto',\n // **** same as not being set ****\n // disableDrag: false,\n // disableOneColumnMode: false,\n // disableResize: false,\n // float: false,\n // handleClass: null,\n // oneColumnModeDomSort: false,\n // removable: false,\n // staticGrid: false,\n // styleInHead: false,\n};\n/** default dragIn options */\nexports.dragInDefaultOptions = {\n handle: '.grid-stack-item-content',\n appendTo: 'body',\n // revert: 'invalid',\n // scroll: false,\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODU1LmpzIiwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUtILHlFQUF5RTtBQUM1RCxvQkFBWSxHQUFxQjtJQUM1QyxzQkFBc0IsRUFBRSxRQUFRO0lBQ2hDLE9BQU8sRUFBRSxJQUFJO0lBQ2IsSUFBSSxFQUFFLElBQUk7SUFDVixVQUFVLEVBQUUsTUFBTTtJQUNsQixrQkFBa0IsRUFBRSxHQUFHO0lBQ3ZCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLE1BQU0sRUFBRSxFQUFFO0lBQ1YsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLDBCQUEwQixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtJQUNqRixNQUFNLEVBQUUsMEJBQTBCO0lBQ2xDLFNBQVMsRUFBRSxpQkFBaUI7SUFDNUIsTUFBTSxFQUFFLEVBQUU7SUFDVixVQUFVLEVBQUUsSUFBSTtJQUNoQixNQUFNLEVBQUUsQ0FBQztJQUNULE1BQU0sRUFBRSxDQUFDO0lBQ1QsYUFBYSxFQUFFLEdBQUc7SUFDbEIsZ0JBQWdCLEVBQUUsd0JBQXdCO0lBQzFDLGVBQWUsRUFBRSxFQUFFO0lBQ25CLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFO0lBQ2hELFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDNUIsR0FBRyxFQUFFLE1BQU07SUFFWCxrQ0FBa0M7SUFDbEMsc0JBQXNCO0lBQ3RCLCtCQUErQjtJQUMvQix3QkFBd0I7SUFDeEIsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQiwrQkFBK0I7SUFDL0Isb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixzQkFBc0I7Q0FDdkIsQ0FBQztBQUVGLDZCQUE2QjtBQUNoQiw0QkFBb0IsR0FBZ0I7SUFDL0MsTUFBTSxFQUFFLDBCQUEwQjtJQUNsQyxRQUFRLEVBQUUsTUFBTTtJQUNoQixxQkFBcUI7SUFDckIsaUJBQWlCO0NBQ2xCLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmlkU3RhY2svLi9zcmMvdHlwZXMudHM/YTc2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogdHlwZXMudHMgOC4yLjJcclxuICogQ29weXJpZ2h0IChjKSAyMDIxIEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEdyaWRTdGFjayB9IGZyb20gJy4vZ3JpZHN0YWNrJztcclxuaW1wb3J0IHsgR3JpZFN0YWNrRW5naW5lIH0gZnJvbSAnLi9ncmlkc3RhY2stZW5naW5lJztcclxuXHJcbi8vIGRlZmF1bHQgdmFsdWVzIGZvciBncmlkIG9wdGlvbnMgLSB1c2VkIGR1cmluZyBpbml0IGFuZCB3aGVuIHNhdmluZyBvdXRcclxuZXhwb3J0IGNvbnN0IGdyaWREZWZhdWx0czogR3JpZFN0YWNrT3B0aW9ucyA9IHtcclxuICBhbHdheXNTaG93UmVzaXplSGFuZGxlOiAnbW9iaWxlJyxcclxuICBhbmltYXRlOiB0cnVlLFxyXG4gIGF1dG86IHRydWUsXHJcbiAgY2VsbEhlaWdodDogJ2F1dG8nLFxyXG4gIGNlbGxIZWlnaHRUaHJvdHRsZTogMTAwLFxyXG4gIGNlbGxIZWlnaHRVbml0OiAncHgnLFxyXG4gIGNvbHVtbjogMTIsXHJcbiAgZHJhZ2dhYmxlOiB7IGhhbmRsZTogJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcsIGFwcGVuZFRvOiAnYm9keScsIHNjcm9sbDogdHJ1ZSB9LFxyXG4gIGhhbmRsZTogJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcsXHJcbiAgaXRlbUNsYXNzOiAnZ3JpZC1zdGFjay1pdGVtJyxcclxuICBtYXJnaW46IDEwLFxyXG4gIG1hcmdpblVuaXQ6ICdweCcsXHJcbiAgbWF4Um93OiAwLFxyXG4gIG1pblJvdzogMCxcclxuICBvbmVDb2x1bW5TaXplOiA3NjgsXHJcbiAgcGxhY2Vob2xkZXJDbGFzczogJ2dyaWQtc3RhY2stcGxhY2Vob2xkZXInLFxyXG4gIHBsYWNlaG9sZGVyVGV4dDogJycsXHJcbiAgcmVtb3ZhYmxlT3B0aW9uczogeyBhY2NlcHQ6ICcuZ3JpZC1zdGFjay1pdGVtJyB9LFxyXG4gIHJlc2l6YWJsZTogeyBoYW5kbGVzOiAnc2UnIH0sXHJcbiAgcnRsOiAnYXV0bycsXHJcblxyXG4gIC8vICoqKiogc2FtZSBhcyBub3QgYmVpbmcgc2V0ICoqKipcclxuICAvLyBkaXNhYmxlRHJhZzogZmFsc2UsXHJcbiAgLy8gZGlzYWJsZU9uZUNvbHVtbk1vZGU6IGZhbHNlLFxyXG4gIC8vIGRpc2FibGVSZXNpemU6IGZhbHNlLFxyXG4gIC8vIGZsb2F0OiBmYWxzZSxcclxuICAvLyBoYW5kbGVDbGFzczogbnVsbCxcclxuICAvLyBvbmVDb2x1bW5Nb2RlRG9tU29ydDogZmFsc2UsXHJcbiAgLy8gcmVtb3ZhYmxlOiBmYWxzZSxcclxuICAvLyBzdGF0aWNHcmlkOiBmYWxzZSxcclxuICAvLyBzdHlsZUluSGVhZDogZmFsc2UsXHJcbn07XHJcblxyXG4vKiogZGVmYXVsdCBkcmFnSW4gb3B0aW9ucyAqL1xyXG5leHBvcnQgY29uc3QgZHJhZ0luRGVmYXVsdE9wdGlvbnM6IERERHJhZ0luT3B0ID0ge1xyXG4gIGhhbmRsZTogJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcsXHJcbiAgYXBwZW5kVG86ICdib2R5JyxcclxuICAvLyByZXZlcnQ6ICdpbnZhbGlkJyxcclxuICAvLyBzY3JvbGw6IGZhbHNlLFxyXG59O1xyXG5cclxuLyoqIGRpZmZlcmVudCBsYXlvdXQgb3B0aW9ucyB3aGVuIGNoYW5naW5nICMgb2YgY29sdW1ucyxcclxuICogaW5jbHVkaW5nIGEgY3VzdG9tIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbmV3L29sZCBjb2x1bW4gY291bnQsIGFuZCBhcnJheSBvZiBuZXcvb2xkIHBvc2l0aW9uc1xyXG4gKiBOb3RlOiBuZXcgbGlzdCBtYXkgYmUgcGFydGlhbGx5IGFscmVhZHkgZmlsbGVkIGlmIHdlIGhhdmUgYSBjYWNoZSBvZiB0aGUgbGF5b3V0IGF0IHRoYXQgc2l6ZSBhbmQgbmV3IGl0ZW1zIHdlcmUgYWRkZWQgbGF0ZXIuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBDb2x1bW5PcHRpb25zID0gJ21vdmVTY2FsZScgfCAnbW92ZScgfCAnc2NhbGUnIHwgJ25vbmUnIHxcclxuICAoKGNvbHVtbjogbnVtYmVyLCBvbGRDb2x1bW46IG51bWJlciwgbm9kZXM6IEdyaWRTdGFja05vZGVbXSwgb2xkTm9kZXM6IEdyaWRTdGFja05vZGVbXSkgPT4gdm9pZCk7XHJcblxyXG5leHBvcnQgdHlwZSBudW1iZXJPclN0cmluZyA9IG51bWJlciB8IHN0cmluZztcclxuZXhwb3J0IGludGVyZmFjZSBHcmlkSXRlbUhUTUxFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xyXG4gIC8qKiBwb2ludGVyIHRvIGdyaWQgbm9kZSBpbnN0YW5jZSAqL1xyXG4gIGdyaWRzdGFja05vZGU/OiBHcmlkU3RhY2tOb2RlO1xyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBfZ3JpZHN0YWNrTm9kZU9yaWc/OiBHcmlkU3RhY2tOb2RlO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBHcmlkU3RhY2tFbGVtZW50ID0gc3RyaW5nIHwgSFRNTEVsZW1lbnQgfCBHcmlkSXRlbUhUTUxFbGVtZW50O1xyXG5cclxuLyoqIHNwZWNpZmljIGFuZCBnZW5lcmFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgLm9uKCkgbWV0aG9kICovXHJcbmV4cG9ydCB0eXBlIEdyaWRTdGFja0V2ZW50SGFuZGxlciA9IChldmVudDogRXZlbnQpID0+IHZvaWQ7XHJcbmV4cG9ydCB0eXBlIEdyaWRTdGFja0VsZW1lbnRIYW5kbGVyID0gKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHZvaWQ7XHJcbmV4cG9ydCB0eXBlIEdyaWRTdGFja05vZGVzSGFuZGxlciA9IChldmVudDogRXZlbnQsIG5vZGVzOiBHcmlkU3RhY2tOb2RlW10pID0+IHZvaWQ7XHJcbmV4cG9ydCB0eXBlIEdyaWRTdGFja0Ryb3BwZWRIYW5kbGVyID0gKGV2ZW50OiBFdmVudCwgcHJldmlvdXNOb2RlOiBHcmlkU3RhY2tOb2RlLCBuZXdOb2RlOiBHcmlkU3RhY2tOb2RlKSA9PiB2b2lkO1xyXG5leHBvcnQgdHlwZSBHcmlkU3RhY2tFdmVudEhhbmRsZXJDYWxsYmFjayA9IEdyaWRTdGFja0V2ZW50SGFuZGxlciB8IEdyaWRTdGFja0VsZW1lbnRIYW5kbGVyIHwgR3JpZFN0YWNrTm9kZXNIYW5kbGVyIHwgR3JpZFN0YWNrRHJvcHBlZEhhbmRsZXI7XHJcblxyXG4vKiogb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGVkIGR1cmluZyBsb2FkKCkgdG8gY2FsbGJhY2sgdGhlIHVzZXIgb24gbmV3IGFkZGVkL3JlbW92ZSBncmlkIGl0ZW1zIHwgZ3JpZHMgKi9cclxuZXhwb3J0IHR5cGUgQWRkUmVtb3ZlRmNuID0gKHBhcmVudDogSFRNTEVsZW1lbnQsIHc6IEdyaWRTdGFja1dpZGdldCwgYWRkOiBib29sZWFuLCBncmlkOiBib29sZWFuKSA9PiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuXHJcbi8qKiBvcHRpb25hbCBmdW5jdGlvbiBjYWxsZWQgZHVyaW5nIHNhdmUoKSB0byBsZXQgdGhlIGNhbGxlciBhZGQgYWRkaXRpb25hbCBjdXN0b20gZGF0YSB0byB0aGUgR3JpZFN0YWNrV2lkZ2V0IHN0cnVjdHVyZSB0aGF0IHdpbGwgZ2V0IHJldHVybmVkICovXHJcbmV4cG9ydCB0eXBlIFNhdmVGY24gPSAobm9kZTogR3JpZFN0YWNrTm9kZSwgdzogR3JpZFN0YWNrV2lkZ2V0KSA9PiB2b2lkO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBEZWZpbmVzIHRoZSBvcHRpb25zIGZvciBhIEdyaWRcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JpZFN0YWNrT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogYWNjZXB0IHdpZGdldHMgZHJhZ2dlZCBmcm9tIG90aGVyIGdyaWRzIG9yIGZyb20gb3V0c2lkZSAoZGVmYXVsdDogYGZhbHNlYCkuIENhbiBiZTpcclxuICAgKiBgdHJ1ZWAgKHVzZXMgYCcuZ3JpZC1zdGFjay1pdGVtJ2AgY2xhc3MgZmlsdGVyKSBvciBgZmFsc2VgLFxyXG4gICAqIHN0cmluZyBmb3IgZXhwbGljaXQgY2xhc3MgbmFtZSxcclxuICAgKiBmdW5jdGlvbiByZXR1cm5pbmcgYSBib29sZWFuLiBTZWUgW2V4YW1wbGVdKGh0dHA6Ly9ncmlkc3RhY2suZ2l0aHViLmlvL2dyaWRzdGFjay5qcy9kZW1vL3R3by5odG1sKVxyXG4gICAqL1xyXG4gIGFjY2VwdFdpZGdldHM/OiBib29sZWFuIHwgc3RyaW5nIHwgKChlbGVtZW50OiBFbGVtZW50KSA9PiBib29sZWFuKTtcclxuXHJcbiAgLyoqIHBvc3NpYmxlIHZhbHVlcyAoZGVmYXVsdDogYG1vYmlsZWApIC0gZG9lcyBub3QgYXBwbHkgdG8gbm9uLXJlc2l6YWJsZSB3aWRnZXRzXHJcbiAgICAqIGBmYWxzZWAgdGhlIHJlc2l6aW5nIGhhbmRsZXMgYXJlIG9ubHkgc2hvd24gd2hpbGUgaG92ZXJpbmcgb3ZlciBhIHdpZGdldFxyXG4gICAgKiBgdHJ1ZWAgdGhlIHJlc2l6aW5nIGhhbmRsZXMgYXJlIGFsd2F5cyBzaG93blxyXG4gICAgKiAnbW9iaWxlJyBpZiBydW5uaW5nIG9uIGEgbW9iaWxlIGRldmljZSwgZGVmYXVsdCB0byBgdHJ1ZWAgKHNpbmNlIHRoZXJlIGlzIG5vIGhvdmVyaW5nIHBlciBzYXkpLCBlbHNlIGBmYWxzZWAuXHJcbiAgICBTZWUgW2V4YW1wbGVdKGh0dHA6Ly9ncmlkc3RhY2suZ2l0aHViLmlvL2dyaWRzdGFjay5qcy9kZW1vL21vYmlsZS5odG1sKSAqL1xyXG4gIGFsd2F5c1Nob3dSZXNpemVIYW5kbGU/OiB0cnVlIHwgZmFsc2UgfCAnbW9iaWxlJztcclxuXHJcbiAgLyoqIHR1cm5zIGFuaW1hdGlvbiBvbiAoZGVmYXVsdD86IHRydWUpICovXHJcbiAgYW5pbWF0ZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBpZiBmYWxzZSBncmlkc3RhY2sgd2lsbCBub3QgaW5pdGlhbGl6ZSBleGlzdGluZyBpdGVtcyAoZGVmYXVsdD86IHRydWUpICovXHJcbiAgYXV0bz86IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIG9uZSBjZWxsIGhlaWdodCAoZGVmYXVsdD86ICdhdXRvJykuIENhbiBiZTpcclxuICAgKiAgYW4gaW50ZWdlciAocHgpXHJcbiAgICogIGEgc3RyaW5nIChleDogJzEwMHB4JywgJzEwZW0nLCAnMTByZW0nKS4gTm90ZTogJSBkb2Vzbid0IHJpZ2h0IC0gc2VlIGRlbW8vY2VsbC1oZWlnaHQuaHRtbFxyXG4gICAqICAwLCBpbiB3aGljaCBjYXNlIHRoZSBsaWJyYXJ5IHdpbGwgbm90IGdlbmVyYXRlIHN0eWxlcyBmb3Igcm93cy4gRXZlcnl0aGluZyBtdXN0IGJlIGRlZmluZWQgaW4geW91ciBvd24gQ1NTIGZpbGVzLlxyXG4gICAqICAnYXV0bycgLSBoZWlnaHQgd2lsbCBiZSBjYWxjdWxhdGVkIGZvciBzcXVhcmUgY2VsbHMgKHdpZHRoIC8gY29sdW1uKSBhbmQgdXBkYXRlZCBsaXZlIGFzIHlvdSByZXNpemUgdGhlIHdpbmRvdyAtIGFsc28gc2VlIGBjZWxsSGVpZ2h0VGhyb3R0bGVgXHJcbiAgICogICdpbml0aWFsJyAtIHNpbWlsYXIgdG8gJ2F1dG8nIChzdGFydCBhdCBzcXVhcmUgY2VsbHMpIGJ1dCBzdGF5IHRoYXQgc2l6ZSBkdXJpbmcgd2luZG93IHJlc2l6aW5nLlxyXG4gICAqL1xyXG4gIGNlbGxIZWlnaHQ/OiBudW1iZXJPclN0cmluZztcclxuXHJcbiAgLyoqIHRocm90dGxlIHRpbWUgZGVsYXkgKGluIG1zKSB1c2VkIHdoZW4gY2VsbEhlaWdodD0nYXV0bycgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSB2cyB1c2FiaWxpdHkgKGRlZmF1bHQ/OiAxMDApLlxyXG4gICAqIEEgdmFsdWUgb2YgMCB3aWxsIG1ha2UgaXQgaW5zdGFudCBhdCBhIGNvc3Qgb2YgcmUtY3JlYXRpbmcgdGhlIENTUyBmaWxlIGF0IGV2ZXIgd2luZG93IHJlc2l6ZSBldmVudCFcclxuICAgKiAqL1xyXG4gIGNlbGxIZWlnaHRUaHJvdHRsZT86IG51bWJlcjtcclxuXHJcbiAgLyoqIChpbnRlcm5hbCkgdW5pdCBmb3IgY2VsbEhlaWdodCAoZGVmYXVsdD8gJ3B4Jykgd2hpY2ggaXMgc2V0IHdoZW4gYSBzdHJpbmcgY2VsbEhlaWdodCB3aXRoIGEgdW5pdCBpcyBwYXNzZWQgKGV4OiAnMTByZW0nKSAqL1xyXG4gIGNlbGxIZWlnaHRVbml0Pzogc3RyaW5nO1xyXG5cclxuICAvKiogbGlzdCBvZiBjaGlsZHJlbiBpdGVtIHRvIGNyZWF0ZSB3aGVuIGNhbGxpbmcgbG9hZCgpIG9yIGFkZEdyaWQoKSAqL1xyXG4gIGNoaWxkcmVuPzogR3JpZFN0YWNrV2lkZ2V0W107XHJcblxyXG4gIC8qKiBudW1iZXIgb2YgY29sdW1ucyAoZGVmYXVsdD86IDEyKS4gTm90ZTogSUYgeW91IGNoYW5nZSB0aGlzLCBDU1MgYWxzbyBoYXZlIHRvIGNoYW5nZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkc3RhY2svZ3JpZHN0YWNrLmpzI2NoYW5nZS1ncmlkLWNvbHVtbnMuXHJcbiAgICogTm90ZTogZm9yIG5lc3RlZCBncmlkcywgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlICdhdXRvJyB3aGljaCB3aWxsIGFsd2F5cyBtYXRjaCB0aGUgY29udGFpbmVyIGdyaWQtaXRlbSBjdXJyZW50IHdpZHRoIChpbiBjb2x1bW4pIHRvIGtlZXAgaW5zaWRlIGFuZCBvdXRzaWRlXHJcbiAgICogaXRlbXMgYWx3YXlzIHRvIHNhbWUuIGZsYWcgaXMgbm90IHN1cHBvcnRlZCBmb3IgcmVndWxhciBub24tbmVzdGVkIGdyaWRzLlxyXG4gICAqL1xyXG4gIGNvbHVtbj86IG51bWJlciB8ICdhdXRvJztcclxuXHJcbiAgLyoqIGFkZGl0aW9uYWwgY2xhc3Mgb24gdG9wIG9mICcuZ3JpZC1zdGFjaycgKHdoaWNoIGlzIHJlcXVpcmVkIGZvciBvdXIgQ1NTKSB0byBkaWZmZXJlbnRpYXRlIHRoaXMgaW5zdGFuY2UuXHJcbiAgTm90ZTogb25seSB1c2VkIGJ5IGFkZEdyaWQoKSwgZWxzZSB5b3VyIGVsZW1lbnQgc2hvdWxkIGhhdmUgdGhlIG5lZWRlZCBjbGFzcyAqL1xyXG4gIGNsYXNzPzogc3RyaW5nO1xyXG5cclxuICAvKiogZGlzYWxsb3dzIGRyYWdnaW5nIG9mIHdpZGdldHMgKGRlZmF1bHQ/OiBmYWxzZSkgKi9cclxuICBkaXNhYmxlRHJhZz86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBkaXNhYmxlcyB0aGUgb25Db2x1bW5Nb2RlIHdoZW4gdGhlIGdyaWQgd2lkdGggaXMgbGVzcyB0aGFuIG9uZUNvbHVtblNpemUgKGRlZmF1bHQ/OiBmYWxzZSkgKi9cclxuICBkaXNhYmxlT25lQ29sdW1uTW9kZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBkaXNhbGxvd3MgcmVzaXppbmcgb2Ygd2lkZ2V0cyAoZGVmYXVsdD86IGZhbHNlKS4gKi9cclxuICBkaXNhYmxlUmVzaXplPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIGFsbG93cyB0byBvdmVycmlkZSBVSSBkcmFnZ2FibGUgb3B0aW9ucy4gKGRlZmF1bHQ/OiB7IGhhbmRsZT86ICcuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnLCBhcHBlbmRUbz86ICdib2R5JyB9KSAqL1xyXG4gIGRyYWdnYWJsZT86IERERHJhZ09wdDtcclxuXHJcbiAgLyoqIGxldCB1c2VyIGRyYWcgbmVzdGVkIGdyaWQgaXRlbXMgb3V0IG9mIGEgcGFyZW50IG9yIG5vdCAoZGVmYXVsdCB0cnVlIC0gbm90IHN1cHBvcnRlZCB5ZXQpICovXHJcbiAgLy9kcmFnT3V0PzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIHRoZSB0eXBlIG9mIGVuZ2luZSB0byBjcmVhdGUgKHNvIHlvdSBjYW4gc3ViY2xhc3MpIGRlZmF1bHQgdG8gR3JpZFN0YWNrRW5naW5lICovXHJcbiAgZW5naW5lQ2xhc3M/OiB0eXBlb2YgR3JpZFN0YWNrRW5naW5lO1xyXG5cclxuICAvKiogZW5hYmxlIGZsb2F0aW5nIHdpZGdldHMgKGRlZmF1bHQ/OiBmYWxzZSkgU2VlIGV4YW1wbGUgKGh0dHA6Ly9ncmlkc3RhY2suZ2l0aHViLmlvL2dyaWRzdGFjay5qcy9kZW1vL2Zsb2F0Lmh0bWwpICovXHJcbiAgZmxvYXQ/OiBib29sZWFuO1xyXG5cclxuICAvKiogZHJhZ2dhYmxlIGhhbmRsZSBzZWxlY3RvciAoZGVmYXVsdD86ICcuZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnKSAqL1xyXG4gIGhhbmRsZT86IHN0cmluZztcclxuXHJcbiAgLyoqIGRyYWdnYWJsZSBoYW5kbGUgY2xhc3MgKGUuZy4gJ2dyaWQtc3RhY2staXRlbS1jb250ZW50JykuIElmIHNldCAnaGFuZGxlJyBpcyBpZ25vcmVkIChkZWZhdWx0PzogbnVsbCkgKi9cclxuICBoYW5kbGVDbGFzcz86IHN0cmluZztcclxuXHJcbiAgLyoqIGFkZGl0aW9uYWwgd2lkZ2V0IGNsYXNzIChkZWZhdWx0PzogJ2dyaWQtc3RhY2staXRlbScpICovXHJcbiAgaXRlbUNsYXNzPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBnYXAgYmV0d2VlbiBncmlkIGl0ZW0gYW5kIGNvbnRlbnQgKGRlZmF1bHQ/OiAxMCkuIFRoaXMgd2lsbCBzZXQgYWxsIDQgc2lkZXMgYW5kIHN1cHBvcnQgdGhlIENTUyBmb3JtYXRzIGJlbG93XHJcbiAgICogIGFuIGludGVnZXIgKHB4KVxyXG4gICAqICBhIHN0cmluZyB3aXRoIHBvc3NpYmxlIHVuaXRzIChleDogJzJlbScsICcyMHB4JywgJzJyZW0nKVxyXG4gICAqICBzdHJpbmcgd2l0aCBzcGFjZSBzZXBhcmF0ZWQgdmFsdWVzIChleDogJzVweCAxMHB4IDAgMjBweCcgZm9yIGFsbCA0IHNpZGVzLCBvciAnNWVtIDEwZW0nIGZvciB0b3AvYm90dG9tIGFuZCBsZWZ0L3JpZ2h0IHBhaXJzIGxpa2UgQ1NTKS5cclxuICAgKiBOb3RlOiBhbGwgc2lkZXMgbXVzdCBoYXZlIHNhbWUgdW5pdHMgKGxhc3Qgb25lIHdpbnMsIGRlZmF1bHQgcHgpXHJcbiAgICovXHJcbiAgbWFyZ2luPzogbnVtYmVyT3JTdHJpbmc7XHJcblxyXG4gIC8qKiBPTEQgd2F5IHRvIG9wdGlvbmFsbHkgc2V0IGVhY2ggc2lkZSAtIHVzZSBtYXJnaW46ICc1cHggMTBweCAwIDIwcHgnIGluc3RlYWQuIFVzZWQgaW50ZXJuYWxseSB0byBzdG9yZSBlYWNoIHNpZGUuICovXHJcbiAgbWFyZ2luVG9wPzogbnVtYmVyT3JTdHJpbmc7XHJcbiAgbWFyZ2luUmlnaHQ/OiBudW1iZXJPclN0cmluZztcclxuICBtYXJnaW5Cb3R0b20/OiBudW1iZXJPclN0cmluZztcclxuICBtYXJnaW5MZWZ0PzogbnVtYmVyT3JTdHJpbmc7XHJcblxyXG4gIC8qKiAoaW50ZXJuYWwpIHVuaXQgZm9yIG1hcmdpbiAoZGVmYXVsdD8gJ3B4Jykgc2V0IHdoZW4gYG1hcmdpbmAgaXMgc2V0IGFzIHN0cmluZyB3aXRoIHVuaXQgKGV4OiAycmVtJykgKi9cclxuICBtYXJnaW5Vbml0Pzogc3RyaW5nO1xyXG5cclxuICAvKiogbWF4aW11bSByb3dzIGFtb3VudC4gRGVmYXVsdD8gaXMgMCB3aGljaCBtZWFucyBubyBtYXhpbXVtIHJvd3MgKi9cclxuICBtYXhSb3c/OiBudW1iZXI7XHJcblxyXG4gIC8qKiBtaW5pbXVtIHJvd3MgYW1vdW50LiBEZWZhdWx0IGlzIGAwYC4gWW91IGNhbiBhbHNvIGRvIHRoaXMgd2l0aCBgbWluLWhlaWdodGAgQ1NTIGF0dHJpYnV0ZVxyXG4gICAqIG9uIHRoZSBncmlkIGRpdiBpbiBwaXhlbHMsIHdoaWNoIHdpbGwgcm91bmQgdG8gdGhlIGNsb3Nlc3Qgcm93LlxyXG4gICAqL1xyXG4gIG1pblJvdz86IG51bWJlcjtcclxuXHJcbiAgLyoqIElmIHlvdSBhcmUgdXNpbmcgYSBub25jZS1iYXNlZCBDb250ZW50IFNlY3VyaXR5IFBvbGljeSwgcGFzcyB5b3VyIG5vbmNlIGhlcmUgYW5kXHJcbiAgICogR3JpZFN0YWNrIHdpbGwgYWRkIGl0IHRvIHRoZSA8c3R5bGU+IGVsZW1lbnRzIGl0IGNyZWF0ZXMuICovXHJcbiAgbm9uY2U/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBtaW5pbWFsIHdpZHRoIGJlZm9yZSBncmlkIHdpbGwgYmUgc2hvd24gaW4gb25lIGNvbHVtbiBtb2RlIChkZWZhdWx0PzogNzY4KSAqL1xyXG4gIG9uZUNvbHVtblNpemU/OiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIHNldCB0byB0cnVlIGlmIHlvdSB3YW50IG9uZUNvbHVtbk1vZGUgdG8gdXNlIHRoZSBET00gb3JkZXIgYW5kIGlnbm9yZSB4LHkgZnJvbSBub3JtYWwgbXVsdGkgY29sdW1uXHJcbiAgICogbGF5b3V0cyBkdXJpbmcgc29ydGluZy4gVGhpcyBlbmFibGVzIHlvdSB0byBoYXZlIGN1c3RvbSAxIGNvbHVtbiBsYXlvdXQgdGhhdCBkaWZmZXIgZnJvbSB0aGUgcmVzdC4gKGRlZmF1bHQ/OiBmYWxzZSlcclxuICAgKi9cclxuICBvbmVDb2x1bW5Nb2RlRG9tU29ydD86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBjbGFzcyBmb3IgcGxhY2Vob2xkZXIgKGRlZmF1bHQ/OiAnZ3JpZC1zdGFjay1wbGFjZWhvbGRlcicpICovXHJcbiAgcGxhY2Vob2xkZXJDbGFzcz86IHN0cmluZztcclxuXHJcbiAgLyoqIHBsYWNlaG9sZGVyIGRlZmF1bHQgY29udGVudCAoZGVmYXVsdD86ICcnKSAqL1xyXG4gIHBsYWNlaG9sZGVyVGV4dD86IHN0cmluZztcclxuXHJcbiAgLyoqIGFsbG93cyB0byBvdmVycmlkZSBVSSByZXNpemFibGUgb3B0aW9ucy4gKGRlZmF1bHQ/OiB7IGhhbmRsZXM6ICdzZScgfSkgKi9cclxuICByZXNpemFibGU/OiBERFJlc2l6ZU9wdDtcclxuXHJcbiAgLyoqXHJcbiAgICogaWYgdHJ1ZSB3aWRnZXRzIGNvdWxkIGJlIHJlbW92ZWQgYnkgZHJhZ2dpbmcgb3V0c2lkZSBvZiB0aGUgZ3JpZC4gSXQgY291bGQgYWxzbyBiZSBhIHNlbGVjdG9yIHN0cmluZyAoZXg6IFwiLnRyYXNoXCIpLFxyXG4gICAqIGluIHRoaXMgY2FzZSB3aWRnZXRzIHdpbGwgYmUgcmVtb3ZlZCBieSBkcm9wcGluZyB0aGVtIHRoZXJlIChkZWZhdWx0PzogZmFsc2UpXHJcbiAgICogU2VlIGV4YW1wbGUgKGh0dHA6Ly9ncmlkc3RhY2suZ2l0aHViLmlvL2dyaWRzdGFjay5qcy9kZW1vL3R3by5odG1sKVxyXG4gICAqL1xyXG4gIHJlbW92YWJsZT86IGJvb2xlYW4gfCBzdHJpbmc7XHJcblxyXG4gIC8qKiBhbGxvd3MgdG8gb3ZlcnJpZGUgVUkgcmVtb3ZhYmxlIG9wdGlvbnMuIChkZWZhdWx0PzogeyBhY2NlcHQ6ICcuZ3JpZC1zdGFjay1pdGVtJyB9KSAqL1xyXG4gIHJlbW92YWJsZU9wdGlvbnM/OiBERFJlbW92ZU9wdDtcclxuXHJcbiAgLyoqIGZpeCBncmlkIG51bWJlciBvZiByb3dzLiBUaGlzIGlzIGEgc2hvcnRjdXQgb2Ygd3JpdGluZyBgbWluUm93Ok4sIG1heFJvdzpOYC4gKGRlZmF1bHQgYDBgIG5vIGNvbnN0cmFpbikgKi9cclxuICByb3c/OiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIGlmIHRydWUgdHVybnMgZ3JpZCB0byBSVEwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgdHJ1ZSwgZmFsc2UsICdhdXRvJyAoZGVmYXVsdD86ICdhdXRvJylcclxuICAgKiBTZWUgW2V4YW1wbGVdKGh0dHA6Ly9ncmlkc3RhY2suZ2l0aHViLmlvL2dyaWRzdGFjay5qcy9kZW1vL3J0bC5odG1sKVxyXG4gICAqL1xyXG4gIHJ0bD86IGJvb2xlYW4gfCAnYXV0byc7XHJcblxyXG4gIC8qKlxyXG4gICAqIG1ha2VzIGdyaWQgc3RhdGljIChkZWZhdWx0PzogZmFsc2UpLiBJZiBgdHJ1ZWAgd2lkZ2V0cyBhcmUgbm90IG1vdmFibGUvcmVzaXphYmxlLlxyXG4gICAqIFlvdSBkb24ndCBldmVuIG5lZWQgZHJhZ2dhYmxlL3Jlc2l6YWJsZS4gQSBDU1MgY2xhc3NcclxuICAgKiAnZ3JpZC1zdGFjay1zdGF0aWMnIGlzIGFsc28gYWRkZWQgdG8gdGhlIGVsZW1lbnQuXHJcbiAgICovXHJcbiAgc3RhdGljR3JpZD86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBpZiBgdHJ1ZWAgd2lsbCBhZGQgc3R5bGUgZWxlbWVudCB0byBgPGhlYWQ+YCBvdGhlcndpc2Ugd2lsbCBhZGQgaXQgdG8gZWxlbWVudCdzIHBhcmVudCBub2RlIChkZWZhdWx0IGBmYWxzZWApLiAqL1xyXG4gIHN0eWxlSW5IZWFkPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIGxpc3Qgb2YgZGlmZmVyZW5jZXMgaW4gb3B0aW9ucyBmb3IgYXV0b21hdGljYWxseSBjcmVhdGVkIHN1Yi1ncmlkcyB1bmRlciB1cyAoaW5zaWRlIG91ciBncmlkLWl0ZW1zKSAqL1xyXG4gIHN1YkdyaWRPcHRzPzogR3JpZFN0YWNrT3B0aW9ucztcclxuXHJcbiAgLyoqIGVuYWJsZS9kaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiBzdWItZ3JpZHMgb24gdGhlIGZseSBieSBkcmFnZ2luZyBpdGVtcyBjb21wbGV0ZWx5XHJcbiAgICogb3ZlciBvdGhlcnMgKG5lc3QpIHZzIHBhcnRpYWxseSAocHVzaCkuIEZvcmNlcyBgREREcmFnT3B0LnBhdXNlPXRydWVgIHRvIGFjY29tcGxpc2ggdGhhdC4gKi9cclxuICBzdWJHcmlkRHluYW1pYz86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKiBvcHRpb25zIHVzZWQgZHVyaW5nIEdyaWRTdGFja0VuZ2luZS5tb3ZlTm9kZSgpICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JpZFN0YWNrTW92ZU9wdHMgZXh0ZW5kcyBHcmlkU3RhY2tQb3NpdGlvbiB7XHJcbiAgLyoqIG5vZGUgdG8gc2tpcCBjb2xsaXNpb24gKi9cclxuICBza2lwPzogR3JpZFN0YWNrTm9kZTtcclxuICAvKiogZG8gd2UgcGFjayAoZGVmYXVsdCB0cnVlKSAqL1xyXG4gIHBhY2s/OiBib29sZWFuO1xyXG4gIC8qKiB0cnVlIGlmIHdlIGFyZSBjYWxsaW5nIHRoaXMgcmVjdXJzaXZlbHkgdG8gcHJldmVudCBzaW1wbGUgc3dhcCBvciBjb3ZlcmFnZSBjb2xsaXNpb24gLSBkZWZhdWx0IGZhbHNlKi9cclxuICBuZXN0ZWQ/OiBib29sZWFuO1xyXG4gIC8qKiB2YXJzIHRvIGNhbGN1bGF0ZSBvdGhlciBjZWxscyBjb29yZGluYXRlcyAqL1xyXG4gIGNlbGxXaWR0aD86IG51bWJlcjtcclxuICBjZWxsSGVpZ2h0PzogbnVtYmVyO1xyXG4gIG1hcmdpblRvcD86IG51bWJlcjtcclxuICBtYXJnaW5Cb3R0b20/OiBudW1iZXI7XHJcbiAgbWFyZ2luTGVmdD86IG51bWJlcjtcclxuICBtYXJnaW5SaWdodD86IG51bWJlcjtcclxuICAvKiogcG9zaXRpb24gaW4gcGl4ZWxzIG9mIHRoZSBjdXJyZW50bHkgZHJhZ2dlZCBpdGVtcyAoZm9yIG92ZXJsYXAgY2hlY2spICovXHJcbiAgcmVjdD86IEdyaWRTdGFja1Bvc2l0aW9uO1xyXG4gIC8qKiB0cnVlIGlmIHdlJ3JlIGxpdmUgcmVzaXppbmcgKi9cclxuICByZXNpemluZz86IGJvb2xlYW47XHJcbiAgLyoqIGJlc3Qgbm9kZSAobW9zdCBjb3ZlcmFnZSkgd2UgY29sbGllZCB3aXRoICovXHJcbiAgY29sbGlkZT86IEdyaWRTdGFja05vZGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JpZFN0YWNrUG9zaXRpb24ge1xyXG4gIC8qKiB3aWRnZXQgcG9zaXRpb24geCAoZGVmYXVsdD86IDApICovXHJcbiAgeD86IG51bWJlcjtcclxuICAvKiogd2lkZ2V0IHBvc2l0aW9uIHkgKGRlZmF1bHQ/OiAwKSAqL1xyXG4gIHk/OiBudW1iZXI7XHJcbiAgLyoqIHdpZGdldCBkaW1lbnNpb24gd2lkdGggKGRlZmF1bHQ/OiAxKSAqL1xyXG4gIHc/OiBudW1iZXI7XHJcbiAgLyoqIHdpZGdldCBkaW1lbnNpb24gaGVpZ2h0IChkZWZhdWx0PzogMSkgKi9cclxuICBoPzogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogR3JpZFN0YWNrIFdpZGdldCBjcmVhdGlvbiBvcHRpb25zXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRTdGFja1dpZGdldCBleHRlbmRzIEdyaWRTdGFja1Bvc2l0aW9uIHtcclxuICAvKiogaWYgdHJ1ZSB0aGVuIHgsIHkgcGFyYW1ldGVycyB3aWxsIGJlIGlnbm9yZWQgYW5kIHdpZGdldCB3aWxsIGJlIHBsYWNlcyBvbiB0aGUgZmlyc3QgYXZhaWxhYmxlIHBvc2l0aW9uIChkZWZhdWx0PzogZmFsc2UpICovXHJcbiAgYXV0b1Bvc2l0aW9uPzogYm9vbGVhbjtcclxuICAvKiogbWluaW11bSB3aWR0aCBhbGxvd2VkIGR1cmluZyByZXNpemUvY3JlYXRpb24gKGRlZmF1bHQ/OiB1bmRlZmluZWQgPSB1bi1jb25zdHJhaW5lZCkgKi9cclxuICBtaW5XPzogbnVtYmVyO1xyXG4gIC8qKiBtYXhpbXVtIHdpZHRoIGFsbG93ZWQgZHVyaW5nIHJlc2l6ZS9jcmVhdGlvbiAoZGVmYXVsdD86IHVuZGVmaW5lZCA9IHVuLWNvbnN0cmFpbmVkKSAqL1xyXG4gIG1heFc/OiBudW1iZXI7XHJcbiAgLyoqIG1pbmltdW0gaGVpZ2h0IGFsbG93ZWQgZHVyaW5nIHJlc2l6ZS9jcmVhdGlvbiAoZGVmYXVsdD86IHVuZGVmaW5lZCA9IHVuLWNvbnN0cmFpbmVkKSAqL1xyXG4gIG1pbkg/OiBudW1iZXI7XHJcbiAgLyoqIG1heGltdW0gaGVpZ2h0IGFsbG93ZWQgZHVyaW5nIHJlc2l6ZS9jcmVhdGlvbiAoZGVmYXVsdD86IHVuZGVmaW5lZCA9IHVuLWNvbnN0cmFpbmVkKSAqL1xyXG4gIG1heEg/OiBudW1iZXI7XHJcbiAgLyoqIHByZXZlbnQgcmVzaXppbmcgKGRlZmF1bHQ/OiB1bmRlZmluZWQgPSB1bi1jb25zdHJhaW5lZCkgKi9cclxuICBub1Jlc2l6ZT86IGJvb2xlYW47XHJcbiAgLyoqIHByZXZlbnRzIG1vdmluZyAoZGVmYXVsdD86IHVuZGVmaW5lZCA9IHVuLWNvbnN0cmFpbmVkKSAqL1xyXG4gIG5vTW92ZT86IGJvb2xlYW47XHJcbiAgLyoqIHByZXZlbnRzIGJlaW5nIG1vdmVkIGJ5IG90aGVycyBkdXJpbmcgdGhlaXIgKGRlZmF1bHQ/OiB1bmRlZmluZWQgPSB1bi1jb25zdHJhaW5lZCkgKi9cclxuICBsb2NrZWQ/OiBib29sZWFuO1xyXG4gIC8qKiB2YWx1ZSBmb3IgYGdzLWlkYCBzdG9yZWQgb24gdGhlIHdpZGdldCAoZGVmYXVsdD86IHVuZGVmaW5lZCkgKi9cclxuICBpZD86IHN0cmluZztcclxuICAvKiogaHRtbCB0byBhcHBlbmQgaW5zaWRlIGFzIGNvbnRlbnQgKi9cclxuICBjb250ZW50Pzogc3RyaW5nO1xyXG4gIC8qKiBvcHRpb25hbCBuZXN0ZWQgZ3JpZCBvcHRpb25zIGFuZCBsaXN0IG9mIGNoaWxkcmVuLCB3aGljaCB0aGVuIHR1cm5zIGludG8gYWN0dWFsIGluc3RhbmNlIGF0IHJ1bnRpbWUgdG8gZ2V0IG9wdGlvbnMgZnJvbSAqL1xyXG4gIHN1YkdyaWRPcHRzPzogR3JpZFN0YWNrT3B0aW9ucztcclxufVxyXG5cclxuLyoqIERyYWcmRHJvcCByZXNpemUgb3B0aW9ucyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEREUmVzaXplT3B0IHtcclxuICAvKiogZG8gcmVzaXplIGhhbmRsZSBoaWRlIGJ5IGRlZmF1bHQgdW50aWwgbW91c2Ugb3ZlciA/IC0gZGVmYXVsdDogdHJ1ZSBvbiBkZXNrdG9wLCBmYWxzZSBvbiBtb2JpbGUqL1xyXG4gIGF1dG9IaWRlPzogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBzaWRlcyB3aGVyZSB5b3UgY2FuIHJlc2l6ZSBmcm9tIChleDogJ2UsIHNlLCBzLCBzdywgdycpIC0gZGVmYXVsdCAnc2UnIChzb3V0aC1lYXN0KVxyXG4gICAqIE5vdGU6IGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byByZXNpemUgZnJvbSB0aGUgdG9wIHNpZGVzIGFzIHdlaXJkIHNpZGUgZWZmZWN0IG1heSBvY2N1ci5cclxuICAqL1xyXG4gIGhhbmRsZXM/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBEcmFnJkRyb3AgcmVtb3ZlIG9wdGlvbnMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBERFJlbW92ZU9wdCB7XHJcbiAgLyoqIGNsYXNzIHRoYXQgY2FuIGJlIHJlbW92ZWQgKGRlZmF1bHQ/OiAnLicgKyBvcHRzLml0ZW1DbGFzcykgKi9cclxuICBhY2NlcHQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBEcmFnJkRyb3AgZHJhZ2dpbmcgb3B0aW9ucyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIERERHJhZ09wdCB7XHJcbiAgLyoqIGNsYXNzIHNlbGVjdG9yIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIGRyYWdnZWQuIGRlZmF1bHQgdG8gJy5ncmlkLXN0YWNrLWl0ZW0tY29udGVudCcgKi9cclxuICBoYW5kbGU/OiBzdHJpbmc7XHJcbiAgLyoqIGRlZmF1bHQgdG8gJ2JvZHknICovXHJcbiAgYXBwZW5kVG8/OiBzdHJpbmc7XHJcbiAgLyoqIGlmIHNldCAodHJ1ZSB8IG1zZWMpLCBkcmFnZ2luZyBwbGFjZW1lbnQgKGNvbGxpc2lvbikgd2lsbCBvbmx5IGhhcHBlbiBhZnRlciBhIHBhdXNlIGJ5IHRoZSB1c2VyLiBOb3RlOiB0aGlzIGlzIEdsb2JhbCAqL1xyXG4gIHBhdXNlPzogYm9vbGVhbiB8IG51bWJlcjtcclxuICAvKiogZGVmYXVsdCB0byBgdHJ1ZWAgKi9cclxuICBzY3JvbGw/OiBib29sZWFuO1xyXG4gIC8qKiBwcmV2ZW50cyBkcmFnZ2luZyBmcm9tIHN0YXJ0aW5nIG9uIHNwZWNpZmllZCBlbGVtZW50cywgbGlzdGVkIGFzIGNvbW1hIHNlcGFyYXRlZCBzZWxlY3RvcnMgKGVnOiAnLm5vLWRyYWcnKS4gZGVmYXVsdCBidWlsdCBpbiBpcyAnaW5wdXQsdGV4dGFyZWEsYnV0dG9uLHNlbGVjdCxvcHRpb24nICovXHJcbiAgY2FuY2VsPzogc3RyaW5nO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgREREcmFnSW5PcHQgZXh0ZW5kcyBERERyYWdPcHQge1xyXG4gIC8qKiBoZWxwZXIgZnVuY3Rpb24gd2hlbiBkcm9wcGluZzogJ2Nsb25lJyBvciB5b3VyIG93biBtZXRob2QgKi9cclxuICBoZWxwZXI/OiAnY2xvbmUnIHwgKChldmVudDogRXZlbnQpID0+IEhUTUxFbGVtZW50KTtcclxuICAvKiogdXNlZCB3aGVuIGRyYWdnaW5nIGl0ZW0gZnJvbSB0aGUgb3V0c2lkZSwgYW5kIGNhbmNlbGluZyAoZXg6ICdpbnZhbGlkJyBvciB5b3VyIG93biBtZXRob2QpKi9cclxuICAvLyByZXZlcnQ/OiBzdHJpbmcgfCAoKGV2ZW50OiBFdmVudCkgPT4gSFRNTEVsZW1lbnQpO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBQb3NpdGlvbiB7XHJcbiAgdG9wOiBudW1iZXI7XHJcbiAgbGVmdDogbnVtYmVyO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjdCBleHRlbmRzIFNpemUsIFBvc2l0aW9uIHt9XHJcblxyXG4vKiogZGF0YSB0aGF0IGlzIHBhc3NlZCBkdXJpbmcgZHJhZyBhbmQgcmVzaXppbmcgY2FsbGJhY2tzICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRERVSURhdGEge1xyXG4gIHBvc2l0aW9uPzogUG9zaXRpb247XHJcbiAgc2l6ZT86IFNpemU7XHJcbiAgZHJhZ2dhYmxlPzogSFRNTEVsZW1lbnQ7XHJcbiAgLyogZmllbGRzIG5vdCB1c2VkIGJ5IEdyaWRTdGFjayBidXQgc2VudCBieSBqcSA/IGxlYXZlIGluIGNhc2Ugd2UgZ28gYmFjayB0byB0aGVtLi4uXHJcbiAgb3JpZ2luYWxQb3NpdGlvbj8gOiBQb3NpdGlvbjtcclxuICBvZmZzZXQ/OiBQb3NpdGlvbjtcclxuICBvcmlnaW5hbFNpemU/OiBTaXplO1xyXG4gIGVsZW1lbnQ/OiBIVE1MRWxlbWVudFtdO1xyXG4gIGhlbHBlcj86IEhUTUxFbGVtZW50W107XHJcbiAgb3JpZ2luYWxFbGVtZW50PzogSFRNTEVsZW1lbnRbXTtcclxuICAqL1xyXG59XHJcblxyXG4vKipcclxuICogaW50ZXJuYWwgZGVzY3JpcHRpb25zIGRlc2NyaWJpbmcgdGhlIGl0ZW1zIGluIHRoZSBncmlkXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRTdGFja05vZGUgZXh0ZW5kcyBHcmlkU3RhY2tXaWRnZXQge1xyXG4gIC8qKiBwb2ludGVyIGJhY2sgdG8gSFRNTCBlbGVtZW50ICovXHJcbiAgZWw/OiBHcmlkSXRlbUhUTUxFbGVtZW50O1xyXG4gIC8qKiBwb2ludGVyIGJhY2sgdG8gcGFyZW50IEdyaWQgaW5zdGFuY2UgKi9cclxuICBncmlkPzogR3JpZFN0YWNrO1xyXG4gIC8qKiBhY3R1YWwgc3ViLWdyaWQgaW5zdGFuY2UgKi9cclxuICBzdWJHcmlkPzogR3JpZFN0YWNrO1xyXG4gIC8qKiBAaW50ZXJuYWwgaW50ZXJuYWwgaWQgdXNlZCB0byBtYXRjaCB3aGVuIGNsb25pbmcgZW5naW5lcyBvciBzYXZpbmcgY29sdW1uIGxheW91dHMgKi9cclxuICBfaWQ/OiBudW1iZXI7XHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIF9kaXJ0eT86IGJvb2xlYW47XHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIF91cGRhdGluZz86IGJvb2xlYW47XHJcbiAgLyoqIEBpbnRlcm5hbCB0cnVlIHdoZW4gb3ZlciB0cmFzaC9hbm90aGVyIGdyaWQgc28gd2UgZG9uJ3QgYm90aGVyIHJlbW92aW5nIGRyYWcgQ1NTIHN0eWxlIHRoYXQgd291bGQgYW5pbWF0ZSBiYWNrIHRvIG9sZCBwb3NpdGlvbiAqL1xyXG4gIF9pc0Fib3V0VG9SZW1vdmU/OiBib29sZWFuO1xyXG4gIC8qKiBAaW50ZXJuYWwgdHJ1ZSBpZiBpdGVtIGNhbWUgZnJvbSBvdXRzaWRlIG9mIHRoZSBncmlkIC0+IGFjdHVhbCBpdGVtIG5lZWQgdG8gYmUgbW92ZWQgb3ZlciAqL1xyXG4gIF9pc0V4dGVybmFsPzogYm9vbGVhbjtcclxuICAvKiogQGludGVybmFsIE1vdXNlIGV2ZW50IHRoYXQncyBjYXVzaW5nIG1vdmluZ3xyZXNpemluZyAqL1xyXG4gIF9ldmVudD86IE1vdXNlRXZlbnQ7XHJcbiAgLyoqIEBpbnRlcm5hbCBtb3ZpbmcgdnMgcmVzaXppbmcgKi9cclxuICBfbW92aW5nPzogYm9vbGVhbjtcclxuICAvKiogQGludGVybmFsIHRydWUgaWYgd2UganVtcGVkIGRvd24gcGFzdCBpdGVtIGJlbG93IChvbmUgdGltZSBqdW1wIHNvIHdlIGRvbid0IGhhdmUgdG8gdG90YWxseSBwYXNzIGl0KSAqL1xyXG4gIF9za2lwRG93bj86IGJvb2xlYW47XHJcbiAgLyoqIEBpbnRlcm5hbCBvcmlnaW5hbCB2YWx1ZXMgYmVmb3JlIGEgZHJhZy9zaXplICovXHJcbiAgX29yaWc/OiBHcmlkU3RhY2tQb3NpdGlvbjtcclxuICAvKiogQGludGVybmFsIHBvc2l0aW9uIGluIHBpeGVscyB1c2VkIGR1cmluZyBjb2xsaXNpb24gY2hlY2sgICovXHJcbiAgX3JlY3Q/OiBHcmlkU3RhY2tQb3NpdGlvbjtcclxuICAvKiogQGludGVybmFsIHRvcC9sZWZ0IHBpeGVsIGxvY2F0aW9uIGJlZm9yZSBhIGRyYWcgc28gd2UgY2FuIGRldGVjdCBkaXJlY3Rpb24gb2YgbW92ZSBmcm9tIGxhc3QgcG9zaXRpb24qL1xyXG4gIF9sYXN0VWlQb3NpdGlvbj86IFBvc2l0aW9uO1xyXG4gIC8qKiBAaW50ZXJuYWwgc2V0IG9uIHRoZSBpdGVtIGJlaW5nIGRyYWdnZWQvcmVzaXplZCByZW1lbWJlciB0aGUgbGFzdCBwb3NpdGlvbnMgd2UndmUgdHJpZWQgKGJ1dCBmYWlsZWQpIHNvIHdlIGRvbid0IHRyeSBhZ2FpbiBkdXJpbmcgZHJhZy9yZXNpemUgKi9cclxuICBfbGFzdFRyaWVkPzogR3JpZFN0YWNrUG9zaXRpb247XHJcbiAgLyoqIEBpbnRlcm5hbCBwb3NpdGlvbiB3aWxsSXRGaXQoKSB3aWxsIHVzZSB0byBwb3NpdGlvbiB0aGUgaXRlbSAqL1xyXG4gIF93aWxsRml0UG9zPzogR3JpZFN0YWNrUG9zaXRpb247XHJcbiAgLyoqIEBpbnRlcm5hbCBsYXN0IGRyYWcgWSBwaXhlbCBwb3NpdGlvbiB1c2VkIHRvIGluY3JlbWVudGFsbHkgdXBkYXRlIFYgc2Nyb2xsIGJhciAqL1xyXG4gIF9wcmV2WVBpeD86IG51bWJlcjtcclxuICAvKiogQGludGVybmFsIHRydWUgaWYgd2UndmUgcmVtb3ZlIHRoZSBpdGVtIGZyb20gb3Vyc2VsZiAoZHJhZ2dpbmcgb3V0KSBidXQgbWlnaHQgcmV2ZXJ0IGl0IGJhY2sgKHJlbGVhc2Ugb24gbm90aGluZyAtPiBnb2VzIGJhY2spICovXHJcbiAgX3RlbXBvcmFyeVJlbW92ZWQ/OiBib29sZWFuO1xyXG4gIC8qKiBAaW50ZXJuYWwgdHJ1ZSBpZiB3ZSBzaG91bGQgcmVtb3ZlIERPTSBlbGVtZW50IG9uIF9ub3RpZnkoKSByYXRoZXIgdGhhbiBjbGVhcmluZyBfaWQgKG9sZCB3YXkpICovXHJcbiAgX3JlbW92ZURPTT86IGJvb2xlYW47XHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIF9pbml0REQ/OiBib29sZWFuO1xyXG59XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///855\n")},867:function(__unused_webpack_module,exports){eval("\n/**\n * utils.ts 8.2.2\n * Copyright (c) 2021 Alain Dumesny - see GridStack root license\n */\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.Utils = exports.obsoleteAttr = exports.obsoleteOptsDel = exports.obsoleteOpts = exports.obsolete = void 0;\n/** checks for obsolete method names */\n// eslint-disable-next-line\nfunction obsolete(self, f, oldName, newName, rev) {\n var wrapper = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n console.warn('gridstack.js: Function `' + oldName + '` is deprecated in ' + rev + ' and has been replaced ' +\n 'with `' + newName + '`. It will be **removed** in a future release');\n return f.apply(self, args);\n };\n wrapper.prototype = f.prototype;\n return wrapper;\n}\nexports.obsolete = obsolete;\n/** checks for obsolete grid options (can be used for any fields, but msg is about options) */\nfunction obsoleteOpts(opts, oldName, newName, rev) {\n if (opts[oldName] !== undefined) {\n opts[newName] = opts[oldName];\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + ' and has been replaced with `' +\n newName + '`. It will be **removed** in a future release');\n }\n}\nexports.obsoleteOpts = obsoleteOpts;\n/** checks for obsolete grid options which are gone */\nfunction obsoleteOptsDel(opts, oldName, rev, info) {\n if (opts[oldName] !== undefined) {\n console.warn('gridstack.js: Option `' + oldName + '` is deprecated in ' + rev + info);\n }\n}\nexports.obsoleteOptsDel = obsoleteOptsDel;\n/** checks for obsolete Jquery element attributes */\nfunction obsoleteAttr(el, oldName, newName, rev) {\n var oldAttr = el.getAttribute(oldName);\n if (oldAttr !== null) {\n el.setAttribute(newName, oldAttr);\n console.warn('gridstack.js: attribute `' + oldName + '`=' + oldAttr + ' is deprecated on this object in ' + rev + ' and has been replaced with `' +\n newName + '`. It will be **removed** in a future release');\n }\n}\nexports.obsoleteAttr = obsoleteAttr;\n/**\n * Utility methods\n */\nvar Utils = /** @class */ (function () {\n function Utils() {\n }\n /** convert a potential selector into actual list of html elements. optional root which defaults to document (for shadow dom) */\n Utils.getElements = function (els, root) {\n if (root === void 0) { root = document; }\n if (typeof els === 'string') {\n var doc = ('getElementById' in root) ? root : undefined;\n // Note: very common for people use to id='1,2,3' which is only legal as HTML5 id, but not CSS selectors\n // so if we start with a number, assume it's an id and just return that one item...\n // see https://github.com/gridstack/gridstack.js/issues/2234#issuecomment-1523796562\n if (doc && !isNaN(+els[0])) { // start with digit\n var el = doc.getElementById(els);\n return el ? [el] : [];\n }\n var list = root.querySelectorAll(els);\n if (!list.length && els[0] !== '.' && els[0] !== '#') {\n list = root.querySelectorAll('.' + els);\n if (!list.length) {\n list = root.querySelectorAll('#' + els);\n }\n }\n return Array.from(list);\n }\n return [els];\n };\n /** convert a potential selector into actual single element. optional root which defaults to document (for shadow dom) */\n Utils.getElement = function (els, root) {\n if (root === void 0) { root = document; }\n if (typeof els === 'string') {\n var doc = ('getElementById' in root) ? root : undefined;\n if (!els.length)\n return null;\n if (doc && els[0] === '#') {\n return doc.getElementById(els.substring(1));\n }\n if (els[0] === '#' || els[0] === '.' || els[0] === '[') {\n return root.querySelector(els);\n }\n // if we start with a digit, assume it's an id (error calling querySelector('#1')) as class are not valid CSS\n if (doc && !isNaN(+els[0])) { // start with digit\n return doc.getElementById(els);\n }\n // finally try string, then id, then class\n var el = root.querySelector(els);\n if (doc && !el) {\n el = doc.getElementById(els);\n }\n if (!el) {\n el = root.querySelector('.' + els);\n }\n return el;\n }\n return els;\n };\n /** returns true if a and b overlap */\n Utils.isIntercepted = function (a, b) {\n return !(a.y >= b.y + b.h || a.y + a.h <= b.y || a.x + a.w <= b.x || a.x >= b.x + b.w);\n };\n /** returns true if a and b touch edges or corners */\n Utils.isTouching = function (a, b) {\n return Utils.isIntercepted(a, { x: b.x - 0.5, y: b.y - 0.5, w: b.w + 1, h: b.h + 1 });\n };\n /** returns the area a and b overlap */\n Utils.areaIntercept = function (a, b) {\n var x0 = (a.x > b.x) ? a.x : b.x;\n var x1 = (a.x + a.w < b.x + b.w) ? a.x + a.w : b.x + b.w;\n if (x1 <= x0)\n return 0; // no overlap\n var y0 = (a.y > b.y) ? a.y : b.y;\n var y1 = (a.y + a.h < b.y + b.h) ? a.y + a.h : b.y + b.h;\n if (y1 <= y0)\n return 0; // no overlap\n return (x1 - x0) * (y1 - y0);\n };\n /** returns the area */\n Utils.area = function (a) {\n return a.w * a.h;\n };\n /**\n * Sorts array of nodes\n * @param nodes array to sort\n * @param dir 1 for asc, -1 for desc (optional)\n * @param width width of the grid. If undefined the width will be calculated automatically (optional).\n **/\n Utils.sort = function (nodes, dir, column) {\n column = column || nodes.reduce(function (col, n) { return Math.max(n.x + n.w, col); }, 0) || 12;\n if (dir === -1)\n return nodes.sort(function (a, b) { return (b.x + b.y * column) - (a.x + a.y * column); });\n else\n return nodes.sort(function (b, a) { return (b.x + b.y * column) - (a.x + a.y * column); });\n };\n /**\n * creates a style sheet with style id under given parent\n * @param id will set the 'gs-style-id' attribute to that id\n * @param parent to insert the stylesheet as first child,\n * if none supplied it will be appended to the document head instead.\n */\n Utils.createStylesheet = function (id, parent, options) {\n var style = document.createElement('style');\n var nonce = options === null || options === void 0 ? void 0 : options.nonce;\n if (nonce)\n style.nonce = nonce;\n style.setAttribute('type', 'text/css');\n style.setAttribute('gs-style-id', id);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (style.styleSheet) { // TODO: only CSSImportRule have that and different beast ??\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n style.styleSheet.cssText = '';\n }\n else {\n style.appendChild(document.createTextNode('')); // WebKit hack\n }\n if (!parent) {\n // default to head\n parent = document.getElementsByTagName('head')[0];\n parent.appendChild(style);\n }\n else {\n parent.insertBefore(style, parent.firstChild);\n }\n return style.sheet;\n };\n /** removed the given stylesheet id */\n Utils.removeStylesheet = function (id) {\n var el = document.querySelector('STYLE[gs-style-id=' + id + ']');\n if (el && el.parentNode)\n el.remove();\n };\n /** inserts a CSS rule */\n Utils.addCSSRule = function (sheet, selector, rules) {\n if (typeof sheet.addRule === 'function') {\n sheet.addRule(selector, rules);\n }\n else if (typeof sheet.insertRule === 'function') {\n sheet.insertRule(\"\".concat(selector, \"{\").concat(rules, \"}\"));\n }\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Utils.toBool = function (v) {\n if (typeof v === 'boolean') {\n return v;\n }\n if (typeof v === 'string') {\n v = v.toLowerCase();\n return !(v === '' || v === 'no' || v === 'false' || v === '0');\n }\n return Boolean(v);\n };\n Utils.toNumber = function (value) {\n return (value === null || value.length === 0) ? undefined : Number(value);\n };\n Utils.parseHeight = function (val) {\n var h;\n var unit = 'px';\n if (typeof val === 'string') {\n var match = val.match(/^(-[0-9]+\\.[0-9]+|[0-9]*\\.[0-9]+|-[0-9]+|[0-9]+)(px|em|rem|vh|vw|%)?$/);\n if (!match) {\n throw new Error('Invalid height');\n }\n unit = match[2] || 'px';\n h = parseFloat(match[1]);\n }\n else {\n h = val;\n }\n return { h: h, unit: unit };\n };\n /** copies unset fields in target to use the given default sources values */\n // eslint-disable-next-line\n Utils.defaults = function (target) {\n var _this = this;\n var sources = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n sources[_i - 1] = arguments[_i];\n }\n sources.forEach(function (source) {\n for (var key in source) {\n if (!source.hasOwnProperty(key))\n return;\n if (target[key] === null || target[key] === undefined) {\n target[key] = source[key];\n }\n else if (typeof source[key] === 'object' && typeof target[key] === 'object') {\n // property is an object, recursively add it's field over... #1373\n _this.defaults(target[key], source[key]);\n }\n }\n });\n return target;\n };\n /** given 2 objects return true if they have the same values. Checks for Object {} having same fields and values (just 1 level down) */\n Utils.same = function (a, b) {\n if (typeof a !== 'object')\n return a == b;\n if (typeof a !== typeof b)\n return false;\n // else we have object, check just 1 level deep for being same things...\n if (Object.keys(a).length !== Object.keys(b).length)\n return false;\n for (var key in a) {\n if (a[key] !== b[key])\n return false;\n }\n return true;\n };\n /** copies over b size & position (GridStackPosition), and optionally min/max as well */\n Utils.copyPos = function (a, b, doMinMax) {\n if (doMinMax === void 0) { doMinMax = false; }\n if (b.x !== undefined)\n a.x = b.x;\n if (b.y !== undefined)\n a.y = b.y;\n if (b.w !== undefined)\n a.w = b.w;\n if (b.h !== undefined)\n a.h = b.h;\n if (doMinMax) {\n if (b.minW)\n a.minW = b.minW;\n if (b.minH)\n a.minH = b.minH;\n if (b.maxW)\n a.maxW = b.maxW;\n if (b.maxH)\n a.maxH = b.maxH;\n }\n return a;\n };\n /** true if a and b has same size & position */\n Utils.samePos = function (a, b) {\n return a && b && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n };\n /** given a node, makes sure it's min/max are valid */\n Utils.sanitizeMinMax = function (node) {\n // remove 0, undefine, null\n if (!node.minW) {\n delete node.minW;\n }\n if (!node.minH) {\n delete node.minH;\n }\n if (!node.maxW) {\n delete node.maxW;\n }\n if (!node.maxH) {\n delete node.maxH;\n }\n };\n /** removes field from the first object if same as the second objects (like diffing) and internal '_' for saving */\n Utils.removeInternalAndSame = function (a, b) {\n if (typeof a !== 'object' || typeof b !== 'object')\n return;\n for (var key in a) {\n var val = a[key];\n if (key[0] === '_' || val === b[key]) {\n delete a[key];\n }\n else if (val && typeof val === 'object' && b[key] !== undefined) {\n for (var i in val) {\n if (val[i] === b[key][i] || i[0] === '_') {\n delete val[i];\n }\n }\n if (!Object.keys(val).length) {\n delete a[key];\n }\n }\n }\n };\n /** removes internal fields '_' and default values for saving */\n Utils.removeInternalForSave = function (n, removeEl) {\n if (removeEl === void 0) { removeEl = true; }\n for (var key in n) {\n if (key[0] === '_' || n[key] === null || n[key] === undefined)\n delete n[key];\n }\n delete n.grid;\n if (removeEl)\n delete n.el;\n // delete default values (will be re-created on read)\n if (!n.autoPosition)\n delete n.autoPosition;\n if (!n.noResize)\n delete n.noResize;\n if (!n.noMove)\n delete n.noMove;\n if (!n.locked)\n delete n.locked;\n if (n.w === 1 || n.w === n.minW)\n delete n.w;\n if (n.h === 1 || n.h === n.minH)\n delete n.h;\n };\n /** return the closest parent (or itself) matching the given class */\n Utils.closestUpByClass = function (el, name) {\n while (el) {\n if (el.classList.contains(name))\n return el;\n el = el.parentElement;\n }\n return null;\n };\n /** delay calling the given function for given delay, preventing new calls from happening while waiting */\n Utils.throttle = function (func, delay) {\n var isWaiting = false;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!isWaiting) {\n isWaiting = true;\n setTimeout(function () { func.apply(void 0, args); isWaiting = false; }, delay);\n }\n };\n };\n Utils.removePositioningStyles = function (el) {\n var style = el.style;\n if (style.position) {\n style.removeProperty('position');\n }\n if (style.left) {\n style.removeProperty('left');\n }\n if (style.top) {\n style.removeProperty('top');\n }\n if (style.width) {\n style.removeProperty('width');\n }\n if (style.height) {\n style.removeProperty('height');\n }\n };\n /** @internal returns the passed element if scrollable, else the closest parent that will, up to the entire document scrolling element */\n Utils.getScrollElement = function (el) {\n if (!el)\n return document.scrollingElement || document.documentElement; // IE support\n var style = getComputedStyle(el);\n var overflowRegex = /(auto|scroll)/;\n if (overflowRegex.test(style.overflow + style.overflowY)) {\n return el;\n }\n else {\n return this.getScrollElement(el.parentElement);\n }\n };\n /** @internal */\n Utils.updateScrollPosition = function (el, position, distance) {\n // is widget in view?\n var rect = el.getBoundingClientRect();\n var innerHeightOrClientHeight = (window.innerHeight || document.documentElement.clientHeight);\n if (rect.top < 0 ||\n rect.bottom > innerHeightOrClientHeight) {\n // set scrollTop of first parent that scrolls\n // if parent is larger than el, set as low as possible\n // to get entire widget on screen\n var offsetDiffDown = rect.bottom - innerHeightOrClientHeight;\n var offsetDiffUp = rect.top;\n var scrollEl = this.getScrollElement(el);\n if (scrollEl !== null) {\n var prevScroll = scrollEl.scrollTop;\n if (rect.top < 0 && distance < 0) {\n // moving up\n if (el.offsetHeight > innerHeightOrClientHeight) {\n scrollEl.scrollTop += distance;\n }\n else {\n scrollEl.scrollTop += Math.abs(offsetDiffUp) > Math.abs(distance) ? distance : offsetDiffUp;\n }\n }\n else if (distance > 0) {\n // moving down\n if (el.offsetHeight > innerHeightOrClientHeight) {\n scrollEl.scrollTop += distance;\n }\n else {\n scrollEl.scrollTop += offsetDiffDown > distance ? distance : offsetDiffDown;\n }\n }\n // move widget y by amount scrolled\n position.top += scrollEl.scrollTop - prevScroll;\n }\n }\n };\n /**\n * @internal Function used to scroll the page.\n *\n * @param event `MouseEvent` that triggers the resize\n * @param el `HTMLElement` that's being resized\n * @param distance Distance from the V edges to start scrolling\n */\n Utils.updateScrollResize = function (event, el, distance) {\n var scrollEl = this.getScrollElement(el);\n var height = scrollEl.clientHeight;\n // #1727 event.clientY is relative to viewport, so must compare this against position of scrollEl getBoundingClientRect().top\n // #1745 Special situation if scrollEl is document 'html': here browser spec states that\n // clientHeight is height of viewport, but getBoundingClientRect() is rectangle of html element;\n // this discrepancy arises because in reality scrollbar is attached to viewport, not html element itself.\n var offsetTop = (scrollEl === this.getScrollElement()) ? 0 : scrollEl.getBoundingClientRect().top;\n var pointerPosY = event.clientY - offsetTop;\n var top = pointerPosY < distance;\n var bottom = pointerPosY > height - distance;\n if (top) {\n // This also can be done with a timeout to keep scrolling while the mouse is\n // in the scrolling zone. (will have smoother behavior)\n scrollEl.scrollBy({ behavior: 'smooth', top: pointerPosY - distance });\n }\n else if (bottom) {\n scrollEl.scrollBy({ behavior: 'smooth', top: distance - (height - pointerPosY) });\n }\n };\n /** single level clone, returning a new object with same top fields. This will share sub objects and arrays */\n Utils.clone = function (obj) {\n if (obj === null || obj === undefined || typeof (obj) !== 'object') {\n return obj;\n }\n // return Object.assign({}, obj);\n if (obj instanceof Array) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return __spreadArray([], obj, true);\n }\n return __assign({}, obj);\n };\n /**\n * Recursive clone version that returns a full copy, checking for nested objects and arrays ONLY.\n * Note: this will use as-is any key starting with double __ (and not copy inside) some lib have circular dependencies.\n */\n Utils.cloneDeep = function (obj) {\n // list of fields we will skip during cloneDeep (nested objects, other internal)\n var skipFields = ['parentGrid', 'el', 'grid', 'subGrid', 'engine'];\n // return JSON.parse(JSON.stringify(obj)); // doesn't work with date format ?\n var ret = Utils.clone(obj);\n var _loop_1 = function (key) {\n // NOTE: we don't support function/circular dependencies so skip those properties for now...\n if (ret.hasOwnProperty(key) && typeof (ret[key]) === 'object' && key.substring(0, 2) !== '__' && !skipFields.find(function (k) { return k === key; })) {\n ret[key] = Utils.cloneDeep(obj[key]);\n }\n };\n for (var key in ret) {\n _loop_1(key);\n }\n return ret;\n };\n /** deep clone the given HTML node, removing teh unique id field */\n Utils.cloneNode = function (el) {\n var node = el.cloneNode(true);\n node.removeAttribute('id');\n return node;\n };\n Utils.appendTo = function (el, parent) {\n var parentNode;\n if (typeof parent === 'string') {\n parentNode = Utils.getElement(parent);\n }\n else {\n parentNode = parent;\n }\n if (parentNode) {\n parentNode.appendChild(el);\n }\n };\n // public static setPositionRelative(el: HTMLElement): void {\n // if (!(/^(?:r|a|f)/).test(window.getComputedStyle(el).position)) {\n // el.style.position = \"relative\";\n // }\n // }\n Utils.addElStyles = function (el, styles) {\n if (styles instanceof Object) {\n var _loop_2 = function (s) {\n if (styles.hasOwnProperty(s)) {\n if (Array.isArray(styles[s])) {\n // support fallback value\n styles[s].forEach(function (val) {\n el.style[s] = val;\n });\n }\n else {\n el.style[s] = styles[s];\n }\n }\n };\n for (var s in styles) {\n _loop_2(s);\n }\n }\n };\n Utils.initEvent = function (e, info) {\n var evt = { type: info.type };\n var obj = {\n button: 0,\n which: 0,\n buttons: 1,\n bubbles: true,\n cancelable: true,\n target: info.target ? info.target : e.target\n };\n // don't check for `instanceof DragEvent` as Safari use MouseEvent #1540\n if (e.dataTransfer) {\n evt['dataTransfer'] = e.dataTransfer; // workaround 'readonly' field.\n }\n ['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].forEach(function (p) { return evt[p] = e[p]; }); // keys\n ['pageX', 'pageY', 'clientX', 'clientY', 'screenX', 'screenY'].forEach(function (p) { return evt[p] = e[p]; }); // point info\n return __assign(__assign({}, evt), obj);\n };\n /** copies the MouseEvent properties and sends it as another event to the given target */\n Utils.simulateMouseEvent = function (e, simulatedType, target) {\n var simulatedEvent = document.createEvent('MouseEvents');\n simulatedEvent.initMouseEvent(simulatedType, // type\n true, // bubbles\n true, // cancelable\n window, // view\n 1, // detail\n e.screenX, // screenX\n e.screenY, // screenY\n e.clientX, // clientX\n e.clientY, // clientY\n e.ctrlKey, // ctrlKey\n e.altKey, // altKey\n e.shiftKey, // shiftKey\n e.metaKey, // metaKey\n 0, // button\n e.target // relatedTarget\n );\n (target || e.target).dispatchEvent(simulatedEvent);\n };\n return Utils;\n}());\nexports.Utils = Utils;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SUFBSSxFQUFVLFVBQVU7UUFDeEIsSUFBSSxFQUFVLGFBQWE7UUFDM0IsTUFBTSxFQUFRLE9BQU87UUFDckIsQ0FBQyxFQUFhLFNBQVM7UUFDdkIsQ0FBQyxDQUFDLE9BQU8sRUFBSyxVQUFVO1FBQ3hCLENBQUMsQ0FBQyxPQUFPLEVBQUssVUFBVTtRQUN4QixDQUFDLENBQUMsT0FBTyxFQUFLLFVBQVU7UUFDeEIsQ0FBQyxDQUFDLE9BQU8sRUFBSyxVQUFVO1FBQ3hCLENBQUMsQ0FBQyxPQUFPLEVBQUssVUFBVTtRQUN4QixDQUFDLENBQUMsTUFBTSxFQUFNLFNBQVM7UUFDdkIsQ0FBQyxDQUFDLFFBQVEsRUFBSSxXQUFXO1FBQ3pCLENBQUMsQ0FBQyxPQUFPLEVBQUssVUFBVTtRQUN4QixDQUFDLEVBQWEsU0FBUztRQUN2QixDQUFDLENBQUMsTUFBTSxDQUFNLGdCQUFnQjtTQUMvQixDQUFDO1FBQ0YsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBY0gsWUFBQztBQUFELENBQUM7QUFyZlksc0JBQUsiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9HcmlkU3RhY2svLi9zcmMvdXRpbHMudHM/N2RkYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogdXRpbHMudHMgOC4yLjJcclxuICogQ29weXJpZ2h0IChjKSAyMDIxIEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEdyaWRTdGFja0VsZW1lbnQsIEdyaWRTdGFja05vZGUsIEdyaWRTdGFja09wdGlvbnMsIG51bWJlck9yU3RyaW5nLCBHcmlkU3RhY2tQb3NpdGlvbiwgR3JpZFN0YWNrV2lkZ2V0IH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEhlaWdodERhdGEge1xyXG4gIGg6IG51bWJlcjtcclxuICB1bml0OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBjaGVja3MgZm9yIG9ic29sZXRlIG1ldGhvZCBuYW1lcyAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuZXhwb3J0IGZ1bmN0aW9uIG9ic29sZXRlKHNlbGYsIGYsIG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nLCByZXY6IHN0cmluZyk6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55IHtcclxuICBsZXQgd3JhcHBlciA9ICguLi5hcmdzKSA9PiB7XHJcbiAgICBjb25zb2xlLndhcm4oJ2dyaWRzdGFjay5qczogRnVuY3Rpb24gYCcgKyBvbGROYW1lICsgJ2AgaXMgZGVwcmVjYXRlZCBpbiAnICsgcmV2ICsgJyBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgJyArXHJcbiAgICAnd2l0aCBgJyArIG5ld05hbWUgKyAnYC4gSXQgd2lsbCBiZSAqKnJlbW92ZWQqKiBpbiBhIGZ1dHVyZSByZWxlYXNlJyk7XHJcbiAgICByZXR1cm4gZi5hcHBseShzZWxmLCBhcmdzKTtcclxuICB9XHJcbiAgd3JhcHBlci5wcm90b3R5cGUgPSBmLnByb3RvdHlwZTtcclxuICByZXR1cm4gd3JhcHBlcjtcclxufVxyXG5cclxuLyoqIGNoZWNrcyBmb3Igb2Jzb2xldGUgZ3JpZCBvcHRpb25zIChjYW4gYmUgdXNlZCBmb3IgYW55IGZpZWxkcywgYnV0IG1zZyBpcyBhYm91dCBvcHRpb25zKSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb2Jzb2xldGVPcHRzKG9wdHM6IEdyaWRTdGFja09wdGlvbnMsIG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nLCByZXY6IHN0cmluZyk6IHZvaWQge1xyXG4gIGlmIChvcHRzW29sZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgIG9wdHNbbmV3TmFtZV0gPSBvcHRzW29sZE5hbWVdO1xyXG4gICAgY29uc29sZS53YXJuKCdncmlkc3RhY2suanM6IE9wdGlvbiBgJyArIG9sZE5hbWUgKyAnYCBpcyBkZXByZWNhdGVkIGluICcgKyByZXYgKyAnIGFuZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGAnICtcclxuICAgICAgbmV3TmFtZSArICdgLiBJdCB3aWxsIGJlICoqcmVtb3ZlZCoqIGluIGEgZnV0dXJlIHJlbGVhc2UnKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBjaGVja3MgZm9yIG9ic29sZXRlIGdyaWQgb3B0aW9ucyB3aGljaCBhcmUgZ29uZSAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb2Jzb2xldGVPcHRzRGVsKG9wdHM6IEdyaWRTdGFja09wdGlvbnMsIG9sZE5hbWU6IHN0cmluZywgcmV2OiBzdHJpbmcsIGluZm86IHN0cmluZyk6IHZvaWQge1xyXG4gIGlmIChvcHRzW29sZE5hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgIGNvbnNvbGUud2FybignZ3JpZHN0YWNrLmpzOiBPcHRpb24gYCcgKyBvbGROYW1lICsgJ2AgaXMgZGVwcmVjYXRlZCBpbiAnICsgcmV2ICsgaW5mbyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKiogY2hlY2tzIGZvciBvYnNvbGV0ZSBKcXVlcnkgZWxlbWVudCBhdHRyaWJ1dGVzICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvYnNvbGV0ZUF0dHIoZWw6IEhUTUxFbGVtZW50LCBvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgcmV2OiBzdHJpbmcpOiB2b2lkIHtcclxuICBsZXQgb2xkQXR0ciA9IGVsLmdldEF0dHJpYnV0ZShvbGROYW1lKTtcclxuICBpZiAob2xkQXR0ciAhPT0gbnVsbCkge1xyXG4gICAgZWwuc2V0QXR0cmlidXRlKG5ld05hbWUsIG9sZEF0dHIpO1xyXG4gICAgY29uc29sZS53YXJuKCdncmlkc3RhY2suanM6IGF0dHJpYnV0ZSBgJyArIG9sZE5hbWUgKyAnYD0nICsgb2xkQXR0ciArICcgaXMgZGVwcmVjYXRlZCBvbiB0aGlzIG9iamVjdCBpbiAnICsgcmV2ICsgJyBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBgJyArXHJcbiAgICAgIG5ld05hbWUgKyAnYC4gSXQgd2lsbCBiZSAqKnJlbW92ZWQqKiBpbiBhIGZ1dHVyZSByZWxlYXNlJyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogVXRpbGl0eSBtZXRob2RzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVXRpbHMge1xyXG5cclxuICAvKiogY29udmVydCBhIHBvdGVudGlhbCBzZWxlY3RvciBpbnRvIGFjdHVhbCBsaXN0IG9mIGh0bWwgZWxlbWVudHMuIG9wdGlvbmFsIHJvb3Qgd2hpY2ggZGVmYXVsdHMgdG8gZG9jdW1lbnQgKGZvciBzaGFkb3cgZG9tKSAqL1xyXG4gIHN0YXRpYyBnZXRFbGVtZW50cyhlbHM6IEdyaWRTdGFja0VsZW1lbnQsIHJvb3Q6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPSBkb2N1bWVudCk6IEhUTUxFbGVtZW50W10ge1xyXG4gICAgaWYgKHR5cGVvZiBlbHMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnN0IGRvYyA9ICgnZ2V0RWxlbWVudEJ5SWQnIGluIHJvb3QpID8gcm9vdCBhcyBEb2N1bWVudCA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIC8vIE5vdGU6IHZlcnkgY29tbW9uIGZvciBwZW9wbGUgdXNlIHRvIGlkPScxLDIsMycgd2hpY2ggaXMgb25seSBsZWdhbCBhcyBIVE1MNSBpZCwgYnV0IG5vdCBDU1Mgc2VsZWN0b3JzXHJcbiAgICAgIC8vIHNvIGlmIHdlIHN0YXJ0IHdpdGggYSBudW1iZXIsIGFzc3VtZSBpdCdzIGFuIGlkIGFuZCBqdXN0IHJldHVybiB0aGF0IG9uZSBpdGVtLi4uXHJcbiAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ3JpZHN0YWNrL2dyaWRzdGFjay5qcy9pc3N1ZXMvMjIzNCNpc3N1ZWNvbW1lbnQtMTUyMzc5NjU2MlxyXG4gICAgICBpZiAoZG9jICYmICFpc05hTigrZWxzWzBdKSkgeyAvLyBzdGFydCB3aXRoIGRpZ2l0XHJcbiAgICAgICAgY29uc3QgZWwgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoZWxzKTtcclxuICAgICAgICByZXR1cm4gZWwgPyBbZWxdIDogW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBsaXN0ID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGVscyk7XHJcbiAgICAgIGlmICghbGlzdC5sZW5ndGggJiYgZWxzWzBdICE9PSAnLicgJiYgZWxzWzBdICE9PSAnIycpIHtcclxuICAgICAgICBsaXN0ID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcuJyArIGVscyk7XHJcbiAgICAgICAgaWYgKCFsaXN0Lmxlbmd0aCkgeyBsaXN0ID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcjJyArIGVscykgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGxpc3QpIGFzIEhUTUxFbGVtZW50W107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW2Vsc107XHJcbiAgfVxyXG5cclxuICAvKiogY29udmVydCBhIHBvdGVudGlhbCBzZWxlY3RvciBpbnRvIGFjdHVhbCBzaW5nbGUgZWxlbWVudC4gb3B0aW9uYWwgcm9vdCB3aGljaCBkZWZhdWx0cyB0byBkb2N1bWVudCAoZm9yIHNoYWRvdyBkb20pICovXHJcbiAgc3RhdGljIGdldEVsZW1lbnQoZWxzOiBHcmlkU3RhY2tFbGVtZW50LCByb290OiBIVE1MRWxlbWVudCB8IERvY3VtZW50ID0gZG9jdW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICBpZiAodHlwZW9mIGVscyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgZG9jID0gKCdnZXRFbGVtZW50QnlJZCcgaW4gcm9vdCkgPyByb290IGFzIERvY3VtZW50IDogdW5kZWZpbmVkO1xyXG4gICAgICBpZiAoIWVscy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgICBpZiAoZG9jICYmIGVsc1swXSA9PT0gJyMnKSB7XHJcbiAgICAgICAgcmV0dXJuIGRvYy5nZXRFbGVtZW50QnlJZChlbHMuc3Vic3RyaW5nKDEpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZWxzWzBdID09PSAnIycgfHwgZWxzWzBdID09PSAnLicgfHwgZWxzWzBdID09PSAnWycpIHtcclxuICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKGVscyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmIHdlIHN0YXJ0IHdpdGggYSBkaWdpdCwgYXNzdW1lIGl0J3MgYW4gaWQgKGVycm9yIGNhbGxpbmcgcXVlcnlTZWxlY3RvcignIzEnKSkgYXMgY2xhc3MgYXJlIG5vdCB2YWxpZCBDU1NcclxuICAgICAgaWYgKGRvYyAmJiAhaXNOYU4oK2Vsc1swXSkpIHsgLy8gc3RhcnQgd2l0aCBkaWdpdFxyXG4gICAgICAgIHJldHVybiBkb2MuZ2V0RWxlbWVudEJ5SWQoZWxzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZmluYWxseSB0cnkgc3RyaW5nLCB0aGVuIGlkLCB0aGVuIGNsYXNzXHJcbiAgICAgIGxldCBlbCA9IHJvb3QucXVlcnlTZWxlY3RvcihlbHMpO1xyXG4gICAgICBpZiAoZG9jICYmICFlbCkgeyBlbCA9IGRvYy5nZXRFbGVtZW50QnlJZChlbHMpIH1cclxuICAgICAgaWYgKCFlbCkgeyBlbCA9IHJvb3QucXVlcnlTZWxlY3RvcignLicgKyBlbHMpIH1cclxuICAgICAgcmV0dXJuIGVsIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVscztcclxuICB9XHJcblxyXG4gIC8qKiByZXR1cm5zIHRydWUgaWYgYSBhbmQgYiBvdmVybGFwICovXHJcbiAgc3RhdGljIGlzSW50ZXJjZXB0ZWQoYTogR3JpZFN0YWNrUG9zaXRpb24sIGI6IEdyaWRTdGFja1Bvc2l0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIShhLnkgPj0gYi55ICsgYi5oIHx8IGEueSArIGEuaCA8PSBiLnkgfHwgYS54ICsgYS53IDw9IGIueCB8fCBhLnggPj0gYi54ICsgYi53KTtcclxuICB9XHJcblxyXG4gIC8qKiByZXR1cm5zIHRydWUgaWYgYSBhbmQgYiB0b3VjaCBlZGdlcyBvciBjb3JuZXJzICovXHJcbiAgc3RhdGljIGlzVG91Y2hpbmcoYTogR3JpZFN0YWNrUG9zaXRpb24sIGI6IEdyaWRTdGFja1Bvc2l0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gVXRpbHMuaXNJbnRlcmNlcHRlZChhLCB7eDogYi54LTAuNSwgeTogYi55LTAuNSwgdzogYi53KzEsIGg6IGIuaCsxfSlcclxuICB9XHJcblxyXG4gIC8qKiByZXR1cm5zIHRoZSBhcmVhIGEgYW5kIGIgb3ZlcmxhcCAqL1xyXG4gIHN0YXRpYyBhcmVhSW50ZXJjZXB0KGE6IEdyaWRTdGFja1Bvc2l0aW9uLCBiOiBHcmlkU3RhY2tQb3NpdGlvbik6IG51bWJlciB7XHJcbiAgICBsZXQgeDAgPSAoYS54ID4gYi54KSA/IGEueCA6IGIueDtcclxuICAgIGxldCB4MSA9IChhLngrYS53IDwgYi54K2IudykgPyBhLngrYS53IDogYi54K2IudztcclxuICAgIGlmICh4MSA8PSB4MCkgcmV0dXJuIDA7IC8vIG5vIG92ZXJsYXBcclxuICAgIGxldCB5MCA9IChhLnkgPiBiLnkpID8gYS55IDogYi55O1xyXG4gICAgbGV0IHkxID0gKGEueSthLmggPCBiLnkrYi5oKSA/IGEueSthLmggOiBiLnkrYi5oO1xyXG4gICAgaWYgKHkxIDw9IHkwKSByZXR1cm4gMDsgLy8gbm8gb3ZlcmxhcFxyXG4gICAgcmV0dXJuICh4MS14MCkgKiAoeTEteTApO1xyXG4gIH1cclxuXHJcbiAgLyoqIHJldHVybnMgdGhlIGFyZWEgKi9cclxuICBzdGF0aWMgYXJlYShhOiBHcmlkU3RhY2tQb3NpdGlvbik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gYS53ICogYS5oO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydHMgYXJyYXkgb2Ygbm9kZXNcclxuICAgKiBAcGFyYW0gbm9kZXMgYXJyYXkgdG8gc29ydFxyXG4gICAqIEBwYXJhbSBkaXIgMSBmb3IgYXNjLCAtMSBmb3IgZGVzYyAob3B0aW9uYWwpXHJcbiAgICogQHBhcmFtIHdpZHRoIHdpZHRoIG9mIHRoZSBncmlkLiBJZiB1bmRlZmluZWQgdGhlIHdpZHRoIHdpbGwgYmUgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IChvcHRpb25hbCkuXHJcbiAgICoqL1xyXG4gIHN0YXRpYyBzb3J0KG5vZGVzOiBHcmlkU3RhY2tOb2RlW10sIGRpcj86IC0xIHwgMSwgY29sdW1uPzogbnVtYmVyKTogR3JpZFN0YWNrTm9kZVtdIHtcclxuICAgIGNvbHVtbiA9IGNvbHVtbiB8fCBub2Rlcy5yZWR1Y2UoKGNvbCwgbikgPT4gTWF0aC5tYXgobi54ICsgbi53LCBjb2wpLCAwKSB8fCAxMjtcclxuICAgIGlmIChkaXIgPT09IC0xKVxyXG4gICAgICByZXR1cm4gbm9kZXMuc29ydCgoYSwgYikgPT4gKGIueCArIGIueSAqIGNvbHVtbiktKGEueCArIGEueSAqIGNvbHVtbikpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gbm9kZXMuc29ydCgoYiwgYSkgPT4gKGIueCArIGIueSAqIGNvbHVtbiktKGEueCArIGEueSAqIGNvbHVtbikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY3JlYXRlcyBhIHN0eWxlIHNoZWV0IHdpdGggc3R5bGUgaWQgdW5kZXIgZ2l2ZW4gcGFyZW50XHJcbiAgICogQHBhcmFtIGlkIHdpbGwgc2V0IHRoZSAnZ3Mtc3R5bGUtaWQnIGF0dHJpYnV0ZSB0byB0aGF0IGlkXHJcbiAgICogQHBhcmFtIHBhcmVudCB0byBpbnNlcnQgdGhlIHN0eWxlc2hlZXQgYXMgZmlyc3QgY2hpbGQsXHJcbiAgICogaWYgbm9uZSBzdXBwbGllZCBpdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudCBoZWFkIGluc3RlYWQuXHJcbiAgICovXHJcbiAgc3RhdGljIGNyZWF0ZVN0eWxlc2hlZXQoaWQ6IHN0cmluZywgcGFyZW50PzogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiB7IG5vbmNlPzogc3RyaW5nIH0pOiBDU1NTdHlsZVNoZWV0IHtcclxuICAgIGxldCBzdHlsZTogSFRNTFN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbiAgICBjb25zdCBub25jZSA9IG9wdGlvbnM/Lm5vbmNlXHJcbiAgICBpZiAobm9uY2UpIHN0eWxlLm5vbmNlID0gbm9uY2VcclxuICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpO1xyXG4gICAgc3R5bGUuc2V0QXR0cmlidXRlKCdncy1zdHlsZS1pZCcsIGlkKTtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICBpZiAoKHN0eWxlIGFzIGFueSkuc3R5bGVTaGVldCkgeyAvLyBUT0RPOiBvbmx5IENTU0ltcG9ydFJ1bGUgaGF2ZSB0aGF0IGFuZCBkaWZmZXJlbnQgYmVhc3QgPz9cclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgKHN0eWxlIGFzIGFueSkuc3R5bGVTaGVldC5jc3NUZXh0ID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJykpOyAvLyBXZWJLaXQgaGFja1xyXG4gICAgfVxyXG4gICAgaWYgKCFwYXJlbnQpIHtcclxuICAgICAgLy8gZGVmYXVsdCB0byBoZWFkXHJcbiAgICAgIHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XHJcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChzdHlsZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBwYXJlbnQuZmlyc3RDaGlsZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3R5bGUuc2hlZXQgYXMgQ1NTU3R5bGVTaGVldDtcclxuICB9XHJcblxyXG4gIC8qKiByZW1vdmVkIHRoZSBnaXZlbiBzdHlsZXNoZWV0IGlkICovXHJcbiAgc3RhdGljIHJlbW92ZVN0eWxlc2hlZXQoaWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignU1RZTEVbZ3Mtc3R5bGUtaWQ9JyArIGlkICsgJ10nKTtcclxuICAgIGlmIChlbCAmJiBlbC5wYXJlbnROb2RlKSBlbC5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBpbnNlcnRzIGEgQ1NTIHJ1bGUgKi9cclxuICBzdGF0aWMgYWRkQ1NTUnVsZShzaGVldDogQ1NTU3R5bGVTaGVldCwgc2VsZWN0b3I6IHN0cmluZywgcnVsZXM6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiBzaGVldC5hZGRSdWxlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHNoZWV0LmFkZFJ1bGUoc2VsZWN0b3IsIHJ1bGVzKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNoZWV0Lmluc2VydFJ1bGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgc2hlZXQuaW5zZXJ0UnVsZShgJHtzZWxlY3Rvcn17JHtydWxlc319YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIHN0YXRpYyB0b0Jvb2wodjogdW5rbm93bik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHR5cGVvZiB2ID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIHY7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHYgPSB2LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHJldHVybiAhKHYgPT09ICcnIHx8IHYgPT09ICdubycgfHwgdiA9PT0gJ2ZhbHNlJyB8fCB2ID09PSAnMCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEJvb2xlYW4odik7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgdG9OdW1iZXIodmFsdWU6IG51bGwgfCBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGggPT09IDApID8gdW5kZWZpbmVkIDogTnVtYmVyKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBwYXJzZUhlaWdodCh2YWw6IG51bWJlck9yU3RyaW5nKTogSGVpZ2h0RGF0YSB7XHJcbiAgICBsZXQgaDogbnVtYmVyO1xyXG4gICAgbGV0IHVuaXQgPSAncHgnO1xyXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGxldCBtYXRjaCA9IHZhbC5tYXRjaCgvXigtWzAtOV0rXFwuWzAtOV0rfFswLTldKlxcLlswLTldK3wtWzAtOV0rfFswLTldKykocHh8ZW18cmVtfHZofHZ3fCUpPyQvKTtcclxuICAgICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBoZWlnaHQnKTtcclxuICAgICAgfVxyXG4gICAgICB1bml0ID0gbWF0Y2hbMl0gfHwgJ3B4JztcclxuICAgICAgaCA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaCA9IHZhbDtcclxuICAgIH1cclxuICAgIHJldHVybiB7IGgsIHVuaXQgfTtcclxuICB9XHJcblxyXG4gIC8qKiBjb3BpZXMgdW5zZXQgZmllbGRzIGluIHRhcmdldCB0byB1c2UgdGhlIGdpdmVuIGRlZmF1bHQgc291cmNlcyB2YWx1ZXMgKi9cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcclxuICBzdGF0aWMgZGVmYXVsdHModGFyZ2V0LCAuLi5zb3VyY2VzKToge30ge1xyXG5cclxuICAgIHNvdXJjZXMuZm9yRWFjaChzb3VyY2UgPT4ge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICBpZiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRhcmdldFtrZXldID09PSBudWxsIHx8IHRhcmdldFtrZXldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlW2tleV0gPT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgIC8vIHByb3BlcnR5IGlzIGFuIG9iamVjdCwgcmVjdXJzaXZlbHkgYWRkIGl0J3MgZmllbGQgb3Zlci4uLiAjMTM3M1xyXG4gICAgICAgICAgdGhpcy5kZWZhdWx0cyh0YXJnZXRba2V5XSwgc291cmNlW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxuICB9XHJcblxyXG4gIC8qKiBnaXZlbiAyIG9iamVjdHMgcmV0dXJuIHRydWUgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlcy4gQ2hlY2tzIGZvciBPYmplY3Qge30gaGF2aW5nIHNhbWUgZmllbGRzIGFuZCB2YWx1ZXMgKGp1c3QgMSBsZXZlbCBkb3duKSAqL1xyXG4gIHN0YXRpYyBzYW1lKGE6IHVua25vd24sIGI6IHVua25vd24pOiBib29sZWFuIHtcclxuICAgIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcpICByZXR1cm4gYSA9PSBiO1xyXG4gICAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gZWxzZSB3ZSBoYXZlIG9iamVjdCwgY2hlY2sganVzdCAxIGxldmVsIGRlZXAgZm9yIGJlaW5nIHNhbWUgdGhpbmdzLi4uXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoYSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIGEpIHtcclxuICAgICAgaWYgKGFba2V5XSAhPT0gYltrZXldKSByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBjb3BpZXMgb3ZlciBiIHNpemUgJiBwb3NpdGlvbiAoR3JpZFN0YWNrUG9zaXRpb24pLCBhbmQgb3B0aW9uYWxseSBtaW4vbWF4IGFzIHdlbGwgKi9cclxuICBzdGF0aWMgY29weVBvcyhhOiBHcmlkU3RhY2tXaWRnZXQsIGI6IEdyaWRTdGFja1dpZGdldCwgZG9NaW5NYXggPSBmYWxzZSk6IEdyaWRTdGFja1dpZGdldCB7XHJcbiAgICBpZiAoYi54ICE9PSB1bmRlZmluZWQpIGEueCA9IGIueDtcclxuICAgIGlmIChiLnkgIT09IHVuZGVmaW5lZCkgYS55ID0gYi55O1xyXG4gICAgaWYgKGIudyAhPT0gdW5kZWZpbmVkKSBhLncgPSBiLnc7XHJcbiAgICBpZiAoYi5oICE9PSB1bmRlZmluZWQpIGEuaCA9IGIuaDtcclxuICAgIGlmIChkb01pbk1heCkge1xyXG4gICAgICBpZiAoYi5taW5XKSBhLm1pblcgPSBiLm1pblc7XHJcbiAgICAgIGlmIChiLm1pbkgpIGEubWluSCA9IGIubWluSDtcclxuICAgICAgaWYgKGIubWF4VykgYS5tYXhXID0gYi5tYXhXO1xyXG4gICAgICBpZiAoYi5tYXhIKSBhLm1heEggPSBiLm1heEg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYTtcclxuICB9XHJcblxyXG4gIC8qKiB0cnVlIGlmIGEgYW5kIGIgaGFzIHNhbWUgc2l6ZSAmIHBvc2l0aW9uICovXHJcbiAgc3RhdGljIHNhbWVQb3MoYTogR3JpZFN0YWNrUG9zaXRpb24sIGI6IEdyaWRTdGFja1Bvc2l0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYSAmJiBiICYmIGEueCA9PT0gYi54ICYmIGEueSA9PT0gYi55ICYmIGEudyA9PT0gYi53ICYmIGEuaCA9PT0gYi5oO1xyXG4gIH1cclxuXHJcbiAgLyoqIGdpdmVuIGEgbm9kZSwgbWFrZXMgc3VyZSBpdCdzIG1pbi9tYXggYXJlIHZhbGlkICovXHJcbiAgc3RhdGljIHNhbml0aXplTWluTWF4KG5vZGU6IEdyaWRTdGFja05vZGUpIHtcclxuICAgIC8vIHJlbW92ZSAwLCB1bmRlZmluZSwgbnVsbFxyXG4gICAgaWYgKCFub2RlLm1pblcpIHsgZGVsZXRlIG5vZGUubWluVzsgfVxyXG4gICAgaWYgKCFub2RlLm1pbkgpIHsgZGVsZXRlIG5vZGUubWluSDsgfVxyXG4gICAgaWYgKCFub2RlLm1heFcpIHsgZGVsZXRlIG5vZGUubWF4VzsgfVxyXG4gICAgaWYgKCFub2RlLm1heEgpIHsgZGVsZXRlIG5vZGUubWF4SDsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIHJlbW92ZXMgZmllbGQgZnJvbSB0aGUgZmlyc3Qgb2JqZWN0IGlmIHNhbWUgYXMgdGhlIHNlY29uZCBvYmplY3RzIChsaWtlIGRpZmZpbmcpIGFuZCBpbnRlcm5hbCAnXycgZm9yIHNhdmluZyAqL1xyXG4gIHN0YXRpYyByZW1vdmVJbnRlcm5hbEFuZFNhbWUoYTogdW5rbm93biwgYjogdW5rbm93bik6dm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9PSAnb2JqZWN0JykgcmV0dXJuO1xyXG4gICAgZm9yIChsZXQga2V5IGluIGEpIHtcclxuICAgICAgbGV0IHZhbCA9IGFba2V5XTtcclxuICAgICAgaWYgKGtleVswXSA9PT0gJ18nIHx8IHZhbCA9PT0gYltrZXldKSB7XHJcbiAgICAgICAgZGVsZXRlIGFba2V5XVxyXG4gICAgICB9IGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiBiW2tleV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgaW4gdmFsKSB7XHJcbiAgICAgICAgICBpZiAodmFsW2ldID09PSBiW2tleV1baV0gfHwgaVswXSA9PT0gJ18nKSB7IGRlbGV0ZSB2YWxbaV0gfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHZhbCkubGVuZ3RoKSB7IGRlbGV0ZSBhW2tleV0gfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogcmVtb3ZlcyBpbnRlcm5hbCBmaWVsZHMgJ18nIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3Igc2F2aW5nICovXHJcbiAgc3RhdGljIHJlbW92ZUludGVybmFsRm9yU2F2ZShuOiBHcmlkU3RhY2tOb2RlLCByZW1vdmVFbCA9IHRydWUpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGtleSBpbiBuKSB7IGlmIChrZXlbMF0gPT09ICdfJyB8fCBuW2tleV0gPT09IG51bGwgfHwgbltrZXldID09PSB1bmRlZmluZWQgKSBkZWxldGUgbltrZXldOyB9XHJcbiAgICBkZWxldGUgbi5ncmlkO1xyXG4gICAgaWYgKHJlbW92ZUVsKSBkZWxldGUgbi5lbDtcclxuICAgIC8vIGRlbGV0ZSBkZWZhdWx0IHZhbHVlcyAod2lsbCBiZSByZS1jcmVhdGVkIG9uIHJlYWQpXHJcbiAgICBpZiAoIW4uYXV0b1Bvc2l0aW9uKSBkZWxldGUgbi5hdXRvUG9zaXRpb247XHJcbiAgICBpZiAoIW4ubm9SZXNpemUpIGRlbGV0ZSBuLm5vUmVzaXplO1xyXG4gICAgaWYgKCFuLm5vTW92ZSkgZGVsZXRlIG4ubm9Nb3ZlO1xyXG4gICAgaWYgKCFuLmxvY2tlZCkgZGVsZXRlIG4ubG9ja2VkO1xyXG4gICAgaWYgKG4udyA9PT0gMSB8fCBuLncgPT09IG4ubWluVykgZGVsZXRlIG4udztcclxuICAgIGlmIChuLmggPT09IDEgfHwgbi5oID09PSBuLm1pbkgpIGRlbGV0ZSBuLmg7XHJcbiAgfVxyXG5cclxuICAvKiogcmV0dXJuIHRoZSBjbG9zZXN0IHBhcmVudCAob3IgaXRzZWxmKSBtYXRjaGluZyB0aGUgZ2l2ZW4gY2xhc3MgKi9cclxuICBzdGF0aWMgY2xvc2VzdFVwQnlDbGFzcyhlbDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcclxuICAgIHdoaWxlIChlbCkge1xyXG4gICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKG5hbWUpKSByZXR1cm4gZWw7XHJcbiAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogZGVsYXkgY2FsbGluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGdpdmVuIGRlbGF5LCBwcmV2ZW50aW5nIG5ldyBjYWxscyBmcm9tIGhhcHBlbmluZyB3aGlsZSB3YWl0aW5nICovXHJcbiAgc3RhdGljIHRocm90dGxlKGZ1bmM6ICgpID0+IHZvaWQsIGRlbGF5OiBudW1iZXIpOiAoKSA9PiB2b2lkIHtcclxuICAgIGxldCBpc1dhaXRpbmcgPSBmYWxzZTtcclxuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xyXG4gICAgICBpZiAoIWlzV2FpdGluZykge1xyXG4gICAgICAgIGlzV2FpdGluZyA9IHRydWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGZ1bmMoLi4uYXJncyk7IGlzV2FpdGluZyA9IGZhbHNlOyB9LCBkZWxheSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyByZW1vdmVQb3NpdGlvbmluZ1N0eWxlcyhlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGxldCBzdHlsZSA9IGVsLnN0eWxlO1xyXG4gICAgaWYgKHN0eWxlLnBvc2l0aW9uKSB7XHJcbiAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KCdwb3NpdGlvbicpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0eWxlLmxlZnQpIHtcclxuICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xlZnQnKTtcclxuICAgIH1cclxuICAgIGlmIChzdHlsZS50b3ApIHtcclxuICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RvcCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0eWxlLndpZHRoKSB7XHJcbiAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KCd3aWR0aCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0eWxlLmhlaWdodCkge1xyXG4gICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIHJldHVybnMgdGhlIHBhc3NlZCBlbGVtZW50IGlmIHNjcm9sbGFibGUsIGVsc2UgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgd2lsbCwgdXAgdG8gdGhlIGVudGlyZSBkb2N1bWVudCBzY3JvbGxpbmcgZWxlbWVudCAqL1xyXG4gIHN0YXRpYyBnZXRTY3JvbGxFbGVtZW50KGVsPzogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICBpZiAoIWVsKSByZXR1cm4gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IC8vIElFIHN1cHBvcnRcclxuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XHJcbiAgICBjb25zdCBvdmVyZmxvd1JlZ2V4ID0gLyhhdXRvfHNjcm9sbCkvO1xyXG5cclxuICAgIGlmIChvdmVyZmxvd1JlZ2V4LnRlc3Qoc3R5bGUub3ZlcmZsb3cgKyBzdHlsZS5vdmVyZmxvd1kpKSB7XHJcbiAgICAgIHJldHVybiBlbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFNjcm9sbEVsZW1lbnQoZWwucGFyZW50RWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsICovXHJcbiAgc3RhdGljIHVwZGF0ZVNjcm9sbFBvc2l0aW9uKGVsOiBIVE1MRWxlbWVudCwgcG9zaXRpb246IHt0b3A6IG51bWJlcn0sIGRpc3RhbmNlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIGlzIHdpZGdldCBpbiB2aWV3P1xyXG4gICAgbGV0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGxldCBpbm5lckhlaWdodE9yQ2xpZW50SGVpZ2h0ID0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcclxuICAgIGlmIChyZWN0LnRvcCA8IDAgfHxcclxuICAgICAgcmVjdC5ib3R0b20gPiBpbm5lckhlaWdodE9yQ2xpZW50SGVpZ2h0XHJcbiAgICApIHtcclxuICAgICAgLy8gc2V0IHNjcm9sbFRvcCBvZiBmaXJzdCBwYXJlbnQgdGhhdCBzY3JvbGxzXHJcbiAgICAgIC8vIGlmIHBhcmVudCBpcyBsYXJnZXIgdGhhbiBlbCwgc2V0IGFzIGxvdyBhcyBwb3NzaWJsZVxyXG4gICAgICAvLyB0byBnZXQgZW50aXJlIHdpZGdldCBvbiBzY3JlZW5cclxuICAgICAgbGV0IG9mZnNldERpZmZEb3duID0gcmVjdC5ib3R0b20gLSBpbm5lckhlaWdodE9yQ2xpZW50SGVpZ2h0O1xyXG4gICAgICBsZXQgb2Zmc2V0RGlmZlVwID0gcmVjdC50b3A7XHJcbiAgICAgIGxldCBzY3JvbGxFbCA9IHRoaXMuZ2V0U2Nyb2xsRWxlbWVudChlbCk7XHJcbiAgICAgIGlmIChzY3JvbGxFbCAhPT0gbnVsbCkge1xyXG4gICAgICAgIGxldCBwcmV2U2Nyb2xsID0gc2Nyb2xsRWwuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGlmIChyZWN0LnRvcCA8IDAgJiYgZGlzdGFuY2UgPCAwKSB7XHJcbiAgICAgICAgICAvLyBtb3ZpbmcgdXBcclxuICAgICAgICAgIGlmIChlbC5vZmZzZXRIZWlnaHQgPiBpbm5lckhlaWdodE9yQ2xpZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHNjcm9sbEVsLnNjcm9sbFRvcCArPSBkaXN0YW5jZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNjcm9sbEVsLnNjcm9sbFRvcCArPSBNYXRoLmFicyhvZmZzZXREaWZmVXApID4gTWF0aC5hYnMoZGlzdGFuY2UpID8gZGlzdGFuY2UgOiBvZmZzZXREaWZmVXA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDApIHtcclxuICAgICAgICAgIC8vIG1vdmluZyBkb3duXHJcbiAgICAgICAgICBpZiAoZWwub2Zmc2V0SGVpZ2h0ID4gaW5uZXJIZWlnaHRPckNsaWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICBzY3JvbGxFbC5zY3JvbGxUb3AgKz0gZGlzdGFuY2U7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzY3JvbGxFbC5zY3JvbGxUb3AgKz0gb2Zmc2V0RGlmZkRvd24gPiBkaXN0YW5jZSA/IGRpc3RhbmNlIDogb2Zmc2V0RGlmZkRvd247XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1vdmUgd2lkZ2V0IHkgYnkgYW1vdW50IHNjcm9sbGVkXHJcbiAgICAgICAgcG9zaXRpb24udG9wICs9IHNjcm9sbEVsLnNjcm9sbFRvcCAtIHByZXZTY3JvbGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpbnRlcm5hbCBGdW5jdGlvbiB1c2VkIHRvIHNjcm9sbCB0aGUgcGFnZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBldmVudCBgTW91c2VFdmVudGAgdGhhdCB0cmlnZ2VycyB0aGUgcmVzaXplXHJcbiAgICogQHBhcmFtIGVsIGBIVE1MRWxlbWVudGAgdGhhdCdzIGJlaW5nIHJlc2l6ZWRcclxuICAgKiBAcGFyYW0gZGlzdGFuY2UgRGlzdGFuY2UgZnJvbSB0aGUgViBlZGdlcyB0byBzdGFydCBzY3JvbGxpbmdcclxuICAgKi9cclxuICBzdGF0aWMgdXBkYXRlU2Nyb2xsUmVzaXplKGV2ZW50OiBNb3VzZUV2ZW50LCBlbDogSFRNTEVsZW1lbnQsIGRpc3RhbmNlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNjcm9sbEVsID0gdGhpcy5nZXRTY3JvbGxFbGVtZW50KGVsKTtcclxuICAgIGNvbnN0IGhlaWdodCA9IHNjcm9sbEVsLmNsaWVudEhlaWdodDtcclxuICAgIC8vICMxNzI3IGV2ZW50LmNsaWVudFkgaXMgcmVsYXRpdmUgdG8gdmlld3BvcnQsIHNvIG11c3QgY29tcGFyZSB0aGlzIGFnYWluc3QgcG9zaXRpb24gb2Ygc2Nyb2xsRWwgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXHJcbiAgICAvLyAjMTc0NSBTcGVjaWFsIHNpdHVhdGlvbiBpZiBzY3JvbGxFbCBpcyBkb2N1bWVudCAnaHRtbCc6IGhlcmUgYnJvd3NlciBzcGVjIHN0YXRlcyB0aGF0XHJcbiAgICAvLyBjbGllbnRIZWlnaHQgaXMgaGVpZ2h0IG9mIHZpZXdwb3J0LCBidXQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgaXMgcmVjdGFuZ2xlIG9mIGh0bWwgZWxlbWVudDtcclxuICAgIC8vIHRoaXMgZGlzY3JlcGFuY3kgYXJpc2VzIGJlY2F1c2UgaW4gcmVhbGl0eSBzY3JvbGxiYXIgaXMgYXR0YWNoZWQgdG8gdmlld3BvcnQsIG5vdCBodG1sIGVsZW1lbnQgaXRzZWxmLlxyXG4gICAgY29uc3Qgb2Zmc2V0VG9wID0gKHNjcm9sbEVsID09PSB0aGlzLmdldFNjcm9sbEVsZW1lbnQoKSkgPyAwIDogc2Nyb2xsRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgY29uc3QgcG9pbnRlclBvc1kgPSBldmVudC5jbGllbnRZIC0gb2Zmc2V0VG9wO1xyXG4gICAgY29uc3QgdG9wID0gcG9pbnRlclBvc1kgPCBkaXN0YW5jZTtcclxuICAgIGNvbnN0IGJvdHRvbSA9IHBvaW50ZXJQb3NZID4gaGVpZ2h0IC0gZGlzdGFuY2U7XHJcblxyXG4gICAgaWYgKHRvcCkge1xyXG4gICAgICAvLyBUaGlzIGFsc28gY2FuIGJlIGRvbmUgd2l0aCBhIHRpbWVvdXQgdG8ga2VlcCBzY3JvbGxpbmcgd2hpbGUgdGhlIG1vdXNlIGlzXHJcbiAgICAgIC8vIGluIHRoZSBzY3JvbGxpbmcgem9uZS4gKHdpbGwgaGF2ZSBzbW9vdGhlciBiZWhhdmlvcilcclxuICAgICAgc2Nyb2xsRWwuc2Nyb2xsQnkoeyBiZWhhdmlvcjogJ3Ntb290aCcsIHRvcDogcG9pbnRlclBvc1kgLSBkaXN0YW5jZX0pO1xyXG4gICAgfSBlbHNlIGlmIChib3R0b20pIHtcclxuICAgICAgc2Nyb2xsRWwuc2Nyb2xsQnkoeyBiZWhhdmlvcjogJ3Ntb290aCcsIHRvcDogZGlzdGFuY2UgLSAoaGVpZ2h0IC0gcG9pbnRlclBvc1kpfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogc2luZ2xlIGxldmVsIGNsb25lLCByZXR1cm5pbmcgYSBuZXcgb2JqZWN0IHdpdGggc2FtZSB0b3AgZmllbGRzLiBUaGlzIHdpbGwgc2hhcmUgc3ViIG9iamVjdHMgYW5kIGFycmF5cyAqL1xyXG4gIHN0YXRpYyBjbG9uZTxUPihvYmo6IFQpOiBUIHtcclxuICAgIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQgfHwgdHlwZW9mKG9iaikgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbiAgICAvLyByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcclxuICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICByZXR1cm4gWy4uLm9ial0gYXMgYW55O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsuLi5vYmp9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVjdXJzaXZlIGNsb25lIHZlcnNpb24gdGhhdCByZXR1cm5zIGEgZnVsbCBjb3B5LCBjaGVja2luZyBmb3IgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cyBPTkxZLlxyXG4gICAqIE5vdGU6IHRoaXMgd2lsbCB1c2UgYXMtaXMgYW55IGtleSBzdGFydGluZyB3aXRoIGRvdWJsZSBfXyAoYW5kIG5vdCBjb3B5IGluc2lkZSkgc29tZSBsaWIgaGF2ZSBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXHJcbiAgICovXHJcbiAgc3RhdGljIGNsb25lRGVlcDxUPihvYmo6IFQpOiBUIHtcclxuICAgIC8vIGxpc3Qgb2YgZmllbGRzIHdlIHdpbGwgc2tpcCBkdXJpbmcgY2xvbmVEZWVwIChuZXN0ZWQgb2JqZWN0cywgb3RoZXIgaW50ZXJuYWwpXHJcbiAgICBjb25zdCBza2lwRmllbGRzID0gWydwYXJlbnRHcmlkJywgJ2VsJywgJ2dyaWQnLCAnc3ViR3JpZCcsICdlbmdpbmUnXTtcclxuICAgIC8vIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpOyAvLyBkb2Vzbid0IHdvcmsgd2l0aCBkYXRlIGZvcm1hdCA/XHJcbiAgICBjb25zdCByZXQgPSBVdGlscy5jbG9uZShvYmopO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmV0KSB7XHJcbiAgICAgIC8vIE5PVEU6IHdlIGRvbid0IHN1cHBvcnQgZnVuY3Rpb24vY2lyY3VsYXIgZGVwZW5kZW5jaWVzIHNvIHNraXAgdGhvc2UgcHJvcGVydGllcyBmb3Igbm93Li4uXHJcbiAgICAgIGlmIChyZXQuaGFzT3duUHJvcGVydHkoa2V5KSAmJiB0eXBlb2YocmV0W2tleV0pID09PSAnb2JqZWN0JyAmJiBrZXkuc3Vic3RyaW5nKDAsIDIpICE9PSAnX18nICYmICFza2lwRmllbGRzLmZpbmQoayA9PiBrID09PSBrZXkpKSB7XHJcbiAgICAgICAgcmV0W2tleV0gPSBVdGlscy5jbG9uZURlZXAob2JqW2tleV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG4gIH1cclxuXHJcbiAgLyoqIGRlZXAgY2xvbmUgdGhlIGdpdmVuIEhUTUwgbm9kZSwgcmVtb3ZpbmcgdGVoIHVuaXF1ZSBpZCBmaWVsZCAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgY2xvbmVOb2RlKGVsOiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgIGNvbnN0IG5vZGUgPSBlbC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTtcclxuICAgIHJldHVybiBub2RlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBhcHBlbmRUbyhlbDogSFRNTEVsZW1lbnQsIHBhcmVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGxldCBwYXJlbnROb2RlOiBIVE1MRWxlbWVudDtcclxuICAgIGlmICh0eXBlb2YgcGFyZW50ID09PSAnc3RyaW5nJykge1xyXG4gICAgICBwYXJlbnROb2RlID0gVXRpbHMuZ2V0RWxlbWVudChwYXJlbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudDtcclxuICAgIH1cclxuICAgIGlmIChwYXJlbnROb2RlKSB7XHJcbiAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHN0YXRpYyBzZXRQb3NpdGlvblJlbGF0aXZlKGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gIC8vICAgaWYgKCEoL14oPzpyfGF8ZikvKS50ZXN0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5wb3NpdGlvbikpIHtcclxuICAvLyAgICAgZWwuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGFkZEVsU3R5bGVzKGVsOiBIVE1MRWxlbWVudCwgc3R5bGVzOiB7IFtwcm9wOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9KTogdm9pZCB7XHJcbiAgICBpZiAoc3R5bGVzIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgIGZvciAoY29uc3QgcyBpbiBzdHlsZXMpIHtcclxuICAgICAgICBpZiAoc3R5bGVzLmhhc093blByb3BlcnR5KHMpKSB7XHJcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZXNbc10pKSB7XHJcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgZmFsbGJhY2sgdmFsdWVcclxuICAgICAgICAgICAgKHN0eWxlc1tzXSBhcyBzdHJpbmdbXSkuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgIGVsLnN0eWxlW3NdID0gdmFsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsLnN0eWxlW3NdID0gc3R5bGVzW3NdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBpbml0RXZlbnQ8VD4oZTogRHJhZ0V2ZW50IHwgTW91c2VFdmVudCwgaW5mbzogeyB0eXBlOiBzdHJpbmc7IHRhcmdldD86IEV2ZW50VGFyZ2V0IH0pOiBUIHtcclxuICAgIGNvbnN0IGV2dCA9IHsgdHlwZTogaW5mby50eXBlIH07XHJcbiAgICBjb25zdCBvYmogPSB7XHJcbiAgICAgIGJ1dHRvbjogMCxcclxuICAgICAgd2hpY2g6IDAsXHJcbiAgICAgIGJ1dHRvbnM6IDEsXHJcbiAgICAgIGJ1YmJsZXM6IHRydWUsXHJcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXHJcbiAgICAgIHRhcmdldDogaW5mby50YXJnZXQgPyBpbmZvLnRhcmdldCA6IGUudGFyZ2V0XHJcbiAgICB9O1xyXG4gICAgLy8gZG9uJ3QgY2hlY2sgZm9yIGBpbnN0YW5jZW9mIERyYWdFdmVudGAgYXMgU2FmYXJpIHVzZSBNb3VzZUV2ZW50ICMxNTQwXHJcbiAgICBpZiAoKGUgYXMgRHJhZ0V2ZW50KS5kYXRhVHJhbnNmZXIpIHtcclxuICAgICAgZXZ0WydkYXRhVHJhbnNmZXInXSA9IChlIGFzIERyYWdFdmVudCkuZGF0YVRyYW5zZmVyOyAvLyB3b3JrYXJvdW5kICdyZWFkb25seScgZmllbGQuXHJcbiAgICB9XHJcbiAgICBbJ2FsdEtleScsJ2N0cmxLZXknLCdtZXRhS2V5Jywnc2hpZnRLZXknXS5mb3JFYWNoKHAgPT4gZXZ0W3BdID0gZVtwXSk7IC8vIGtleXNcclxuICAgIFsncGFnZVgnLCdwYWdlWScsJ2NsaWVudFgnLCdjbGllbnRZJywnc2NyZWVuWCcsJ3NjcmVlblknXS5mb3JFYWNoKHAgPT4gZXZ0W3BdID0gZVtwXSk7IC8vIHBvaW50IGluZm9cclxuICAgIHJldHVybiB7Li4uZXZ0LCAuLi5vYmp9IGFzIHVua25vd24gYXMgVDtcclxuICB9XHJcblxyXG4gIC8qKiBjb3BpZXMgdGhlIE1vdXNlRXZlbnQgcHJvcGVydGllcyBhbmQgc2VuZHMgaXQgYXMgYW5vdGhlciBldmVudCB0byB0aGUgZ2l2ZW4gdGFyZ2V0ICovXHJcbiAgcHVibGljIHN0YXRpYyBzaW11bGF0ZU1vdXNlRXZlbnQoZTogTW91c2VFdmVudCwgc2ltdWxhdGVkVHlwZTogc3RyaW5nLCB0YXJnZXQ/OiBFdmVudFRhcmdldCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2ltdWxhdGVkRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcclxuICAgIHNpbXVsYXRlZEV2ZW50LmluaXRNb3VzZUV2ZW50KFxyXG4gICAgICBzaW11bGF0ZWRUeXBlLCAvLyB0eXBlXHJcbiAgICAgIHRydWUsICAgICAgICAgLy8gYnViYmxlc1xyXG4gICAgICB0cnVlLCAgICAgICAgIC8vIGNhbmNlbGFibGVcclxuICAgICAgd2luZG93LCAgICAgICAvLyB2aWV3XHJcbiAgICAgIDEsICAgICAgICAgICAgLy8gZGV0YWlsXHJcbiAgICAgIGUuc2NyZWVuWCwgICAgLy8gc2NyZWVuWFxyXG4gICAgICBlLnNjcmVlblksICAgIC8vIHNjcmVlbllcclxuICAgICAgZS5jbGllbnRYLCAgICAvLyBjbGllbnRYXHJcbiAgICAgIGUuY2xpZW50WSwgICAgLy8gY2xpZW50WVxyXG4gICAgICBlLmN0cmxLZXksICAgIC8vIGN0cmxLZXlcclxuICAgICAgZS5hbHRLZXksICAgICAvLyBhbHRLZXlcclxuICAgICAgZS5zaGlmdEtleSwgICAvLyBzaGlmdEtleVxyXG4gICAgICBlLm1ldGFLZXksICAgIC8vIG1ldGFLZXlcclxuICAgICAgMCwgICAgICAgICAgICAvLyBidXR0b25cclxuICAgICAgZS50YXJnZXQgICAgICAvLyByZWxhdGVkVGFyZ2V0XHJcbiAgICApO1xyXG4gICAgKHRhcmdldCB8fCBlLnRhcmdldCkuZGlzcGF0Y2hFdmVudChzaW11bGF0ZWRFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKiogcmV0dXJucyB0cnVlIGlmIGV2ZW50IGlzIGluc2lkZSB0aGUgZ2l2ZW4gZWxlbWVudCByZWN0YW5nbGUgKi9cclxuICAvLyBOb3RlOiBTYWZhcmkgTWFjIGhhcyBudWxsIGV2ZW50LnJlbGF0ZWRUYXJnZXQgd2hpY2ggY2F1c2VzICMxNjg0IHNvIGNoZWNrIGlmIERyYWdFdmVudCBpcyBpbnNpZGUgdGhlIGNvb3JkaW5hdGVzIGluc3RlYWRcclxuICAvLyAgICB0aGlzLmVsLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpXHJcbiAgLy8gcHVibGljIHN0YXRpYyBpbnNpZGUoZTogTW91c2VFdmVudCwgZWw6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgLy8gICAvLyBzcmNFbGVtZW50LCB0b0VsZW1lbnQsIHRhcmdldDogYWxsIHNldCB0byBwbGFjZWhvbGRlciB3aGVuIGxlYXZpbmcgc2ltcGxlIGdyaWQsIHNvIHdlIGNhbid0IHVzZSB0aGF0IChDaHJvbWUpXHJcbiAgLy8gICBsZXQgdGFyZ2V0OiBIVE1MRWxlbWVudCA9IGUucmVsYXRlZFRhcmdldCB8fCAoZSBhcyBhbnkpLmZyb21FbGVtZW50O1xyXG4gIC8vICAgaWYgKCF0YXJnZXQpIHtcclxuICAvLyAgICAgY29uc3QgeyBib3R0b20sIGxlZnQsIHJpZ2h0LCB0b3AgfSA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gIC8vICAgICByZXR1cm4gKGUueCA8IHJpZ2h0ICYmIGUueCA+IGxlZnQgJiYgZS55IDwgYm90dG9tICYmIGUueSA+IHRvcCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZWwuY29udGFpbnModGFyZ2V0KTtcclxuICAvLyB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///867\n")}},__webpack_module_cache__={};function __webpack_require__(Q){var B=__webpack_module_cache__[Q];if(void 0!==B)return B.exports;var U=__webpack_module_cache__[Q]={exports:{}};return __webpack_modules__[Q].call(U.exports,U,U.exports,__webpack_require__),U.exports}var __webpack_exports__=__webpack_require__(324);return __webpack_exports__=__webpack_exports__.GridStack,__webpack_exports__}()}));
|