UNPKG

@blare/angular2gridster

Version:

[![npm version](https://badge.fury.io/js/angular2gridster.svg)](https://badge.fury.io/js/angular2gridster)

500 lines 48.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { fromEvent, merge } from 'rxjs'; import { share, map, filter, tap, switchMap, takeUntil, take, skip } from 'rxjs/operators'; import { DraggableEvent } from './DraggableEvent'; import { utils } from './utils'; var Draggable = /** @class */ (function () { function Draggable(element, config) { if (config === void 0) { config = {}; } this.mousemove = merge(fromEvent(document, 'mousemove'), fromEvent(document, 'touchmove', { passive: false })).pipe(share()); this.mouseup = merge(fromEvent(document, 'mouseup'), fromEvent(document, 'touchend'), fromEvent(document, 'touchcancel')).pipe(share()); this.config = { handlerClass: null, scroll: true, scrollEdge: 36, scrollDirection: null }; // reference to auto scrolling listeners this.autoScrollingInterval = []; this.element = element; this.mousedown = merge(fromEvent(element, 'mousedown'), fromEvent(element, 'touchstart')).pipe(share()); this.config = tslib_1.__assign({}, this.config, config); this.dragStart = this.createDragStartObservable().pipe(share()); this.dragMove = this.createDragMoveObservable(this.dragStart); this.dragStop = this.createDragStopObservable(this.dragStart); this.fixProblemWithDnDForIE(element); this.requestAnimationFrame = window.requestAnimationFrame || (function (callback) { return setTimeout(callback, 1000 / 60); }); this.cancelAnimationFrame = window.cancelAnimationFrame || (function (cafID) { return clearTimeout(cafID); }); } /** * @return {?} */ Draggable.prototype.createDragStartObservable = /** * @return {?} */ function () { var _this = this; return this.mousedown.pipe(map(function (md) { return new DraggableEvent(md); }), filter(function (event) { return _this.isDragingByHandler(event); }), tap(function (e) { if (!e.isTouchEvent()) { e.pauseEvent(); } if (document.activeElement) { ((/** @type {?} */ (document.activeElement))).blur(); } // prevents rendering performance issues while dragging item with selection inside utils.clearSelection(); }), switchMap(function (startEvent) { return _this.mousemove.pipe(map(function (mm) { return new DraggableEvent(mm); }), filter(function (moveEvent) { return _this.inRange(startEvent, moveEvent, 5); }), map(function () { return startEvent; }), takeUntil(_this.mouseup), take(1)); })); }; /** * @param {?} dragStart * @return {?} */ Draggable.prototype.createDragMoveObservable = /** * @param {?} dragStart * @return {?} */ function (dragStart) { var _this = this; return dragStart.pipe(tap(function (event) { _this.addTouchActionNone(event.target); }), switchMap(function (startEvent) { return _this.mousemove.pipe(skip(1), map(function (mm) { return new DraggableEvent(mm); }), tap(function (event) { event.pauseEvent(); startEvent.pauseEvent(); }), takeUntil(_this.mouseup)); }), filter(function (val) { return !!val; }), tap(function (event) { if (_this.config.scroll) { _this.startScroll(_this.element, event); } })); }; /** * @param {?} dragStart * @return {?} */ Draggable.prototype.createDragStopObservable = /** * @param {?} dragStart * @return {?} */ function (dragStart) { var _this = this; return dragStart.pipe(switchMap(function () { return _this.mouseup.pipe(take(1)); }), map(function (e) { return new DraggableEvent(e); }), tap(function (e) { if (e.target) { _this.removeTouchActionNone(e.target); } _this.autoScrollingInterval.forEach(function (raf) { return _this.cancelAnimationFrame(raf); }); })); }; /** * @param {?} item * @param {?} event * @return {?} */ Draggable.prototype.startScroll = /** * @param {?} item * @param {?} event * @return {?} */ function (item, event) { var _this = this; /** @type {?} */ var scrollContainer = this.getScrollContainer(item); this.autoScrollingInterval.forEach(function (raf) { return _this.cancelAnimationFrame(raf); }); if (scrollContainer) { this.startScrollForContainer(event, scrollContainer); } else { this.startScrollForWindow(event); } }; /** * @param {?} event * @param {?} scrollContainer * @return {?} */ Draggable.prototype.startScrollForContainer = /** * @param {?} event * @param {?} scrollContainer * @return {?} */ function (event, scrollContainer) { if (!this.config.scrollDirection || this.config.scrollDirection === 'vertical') { this.startScrollVerticallyForContainer(event, scrollContainer); } if (!this.config.scrollDirection || this.config.scrollDirection === 'horizontal') { this.startScrollHorizontallyForContainer(event, scrollContainer); } }; /** * @param {?} event * @param {?} scrollContainer * @return {?} */ Draggable.prototype.startScrollVerticallyForContainer = /** * @param {?} event * @param {?} scrollContainer * @return {?} */ function (event, scrollContainer) { if (event.pageY - this.getOffset(scrollContainer).top < this.config.scrollEdge) { this.startAutoScrolling(scrollContainer, -Draggable.SCROLL_SPEED, 'scrollTop'); } else if (this.getOffset(scrollContainer).top + scrollContainer.getBoundingClientRect().height - event.pageY < this.config.scrollEdge) { this.startAutoScrolling(scrollContainer, Draggable.SCROLL_SPEED, 'scrollTop'); } }; /** * @param {?} event * @param {?} scrollContainer * @return {?} */ Draggable.prototype.startScrollHorizontallyForContainer = /** * @param {?} event * @param {?} scrollContainer * @return {?} */ function (event, scrollContainer) { if (event.pageX - scrollContainer.getBoundingClientRect().left < this.config.scrollEdge) { this.startAutoScrolling(scrollContainer, -Draggable.SCROLL_SPEED, 'scrollLeft'); } else if (this.getOffset(scrollContainer).left + scrollContainer.getBoundingClientRect().width - event.pageX < this.config.scrollEdge) { this.startAutoScrolling(scrollContainer, Draggable.SCROLL_SPEED, 'scrollLeft'); } }; /** * @param {?} event * @return {?} */ Draggable.prototype.startScrollForWindow = /** * @param {?} event * @return {?} */ function (event) { if (!this.config.scrollDirection || this.config.scrollDirection === 'vertical') { this.startScrollVerticallyForWindow(event); } if (!this.config.scrollDirection || this.config.scrollDirection === 'horizontal') { this.startScrollHorizontallyForWindow(event); } }; /** * @param {?} event * @return {?} */ Draggable.prototype.startScrollVerticallyForWindow = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var scrollingElement = document.scrollingElement || document.documentElement || document.body; // NOTE: Using `window.pageYOffset` here because IE doesn't have `window.scrollY`. if (event.pageY - window.pageYOffset < this.config.scrollEdge) { this.startAutoScrolling(scrollingElement, -Draggable.SCROLL_SPEED, 'scrollTop'); } else if (window.innerHeight - (event.pageY - window.pageYOffset) < this.config.scrollEdge) { this.startAutoScrolling(scrollingElement, Draggable.SCROLL_SPEED, 'scrollTop'); } }; /** * @param {?} event * @return {?} */ Draggable.prototype.startScrollHorizontallyForWindow = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var scrollingElement = document.scrollingElement || document.documentElement || document.body; // NOTE: Using `window.pageXOffset` here because IE doesn't have `window.scrollX`. if (event.pageX - window.pageXOffset < this.config.scrollEdge) { this.startAutoScrolling(scrollingElement, -Draggable.SCROLL_SPEED, 'scrollLeft'); } else if (window.innerWidth - (event.pageX - window.pageXOffset) < this.config.scrollEdge) { this.startAutoScrolling(scrollingElement, Draggable.SCROLL_SPEED, 'scrollLeft'); } }; /** * @param {?} node * @return {?} */ Draggable.prototype.getScrollContainer = /** * @param {?} node * @return {?} */ function (node) { /** @type {?} */ var nodeOuterHeight = utils.getElementOuterHeight(node); if (node.scrollHeight > Math.ceil(nodeOuterHeight)) { return node; } if (!new RegExp('(body|html)', 'i').test(node.parentNode.tagName)) { return this.getScrollContainer(node.parentNode); } return null; }; /** * @param {?} node * @param {?} amount * @param {?} direction * @return {?} */ Draggable.prototype.startAutoScrolling = /** * @param {?} node * @param {?} amount * @param {?} direction * @return {?} */ function (node, amount, direction) { this.autoScrollingInterval.push(this.requestAnimationFrame(function () { this.startAutoScrolling(node, amount, direction); }.bind(this))); return (node[direction] += amount * 0.25); }; /** * @param {?} el * @return {?} */ Draggable.prototype.getOffset = /** * @param {?} el * @return {?} */ function (el) { /** @type {?} */ var rect = el.getBoundingClientRect(); return { left: rect.left + this.getScroll('scrollLeft', 'pageXOffset'), top: rect.top + this.getScroll('scrollTop', 'pageYOffset') }; }; /** * @param {?} scrollProp * @param {?} offsetProp * @return {?} */ Draggable.prototype.getScroll = /** * @param {?} scrollProp * @param {?} offsetProp * @return {?} */ function (scrollProp, offsetProp) { if (typeof window[offsetProp] !== 'undefined') { return window[offsetProp]; } if (document.documentElement.clientHeight) { return document.documentElement[scrollProp]; } return document.body[scrollProp]; }; /** * @param {?} event * @return {?} */ Draggable.prototype.isDragingByHandler = /** * @param {?} event * @return {?} */ function (event) { if (!this.isValidDragHandler(event.target)) { return false; } return (!this.config.handlerClass || (this.config.handlerClass && this.hasElementWithClass(this.config.handlerClass, event.target))); }; /** * @param {?} targetEl * @return {?} */ Draggable.prototype.isValidDragHandler = /** * @param {?} targetEl * @return {?} */ function (targetEl) { return ['input', 'textarea'].indexOf(targetEl.tagName.toLowerCase()) === -1; }; /** * @param {?} startEvent * @param {?} moveEvent * @param {?} range * @return {?} */ Draggable.prototype.inRange = /** * @param {?} startEvent * @param {?} moveEvent * @param {?} range * @return {?} */ function (startEvent, moveEvent, range) { return (Math.abs(moveEvent.clientX - startEvent.clientX) > range || Math.abs(moveEvent.clientY - startEvent.clientY) > range); }; /** * @param {?} className * @param {?} target * @return {?} */ Draggable.prototype.hasElementWithClass = /** * @param {?} className * @param {?} target * @return {?} */ function (className, target) { while (target !== this.element) { if (target.classList.contains(className)) { return true; } target = target.parentElement; } return false; }; /** * @param {?} e * @return {?} */ Draggable.prototype.pauseEvent = /** * @param {?} e * @return {?} */ function (e) { if (e.stopPropagation) { e.stopPropagation(); } if (e.preventDefault) { e.preventDefault(); } e.cancelBubble = true; e.returnValue = false; }; /** * @param {?} element * @return {?} */ Draggable.prototype.fixProblemWithDnDForIE = /** * @param {?} element * @return {?} */ function (element) { if (this.isTouchDevice() && this.isIEorEdge() && ((/** @type {?} */ (element))).style) { ((/** @type {?} */ (element))).style['touch-action'] = 'none'; } }; /** * @param {?} element * @return {?} */ Draggable.prototype.removeTouchActionNone = /** * @param {?} element * @return {?} */ function (element) { if (!((/** @type {?} */ (element))).style) { return; } ((/** @type {?} */ (element))).style['touch-action'] = ''; }; /** * @param {?} element * @return {?} */ Draggable.prototype.addTouchActionNone = /** * @param {?} element * @return {?} */ function (element) { if (!((/** @type {?} */ (element))).style) { return; } ((/** @type {?} */ (element))).style['touch-action'] = 'none'; }; /** * @return {?} */ Draggable.prototype.isTouchDevice = /** * @return {?} */ function () { return ('ontouchstart' in window || navigator.maxTouchPoints // works on most browsers ); // works on IE10/11 and Surface }; /** * @return {?} */ Draggable.prototype.isIEorEdge = /** * @return {?} */ function () { /** @type {?} */ var ua = window.navigator.userAgent; /** @type {?} */ var msie = ua.indexOf('MSIE '); if (msie > 0) { // IE 10 or older => return version number return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); } /** @type {?} */ var trident = ua.indexOf('Trident/'); if (trident > 0) { // IE 11 => return version number /** @type {?} */ var rv = ua.indexOf('rv:'); return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); } /** @type {?} */ var edge = ua.indexOf('Edge/'); if (edge > 0) { // Edge (IE 12+) => return version number return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); } // other browser return false; }; Draggable.SCROLL_SPEED = 20; return Draggable; }()); export { Draggable }; if (false) { /** @type {?} */ Draggable.SCROLL_SPEED; /** @type {?} */ Draggable.prototype.element; /** @type {?} */ Draggable.prototype.dragStart; /** @type {?} */ Draggable.prototype.dragMove; /** @type {?} */ Draggable.prototype.dragStop; /** @type {?} */ Draggable.prototype.requestAnimationFrame; /** @type {?} */ Draggable.prototype.cancelAnimationFrame; /** @type {?} */ Draggable.prototype.mousemove; /** @type {?} */ Draggable.prototype.mouseup; /** @type {?} */ Draggable.prototype.mousedown; /** @type {?} */ Draggable.prototype.config; /** @type {?} */ Draggable.prototype.autoScrollingInterval; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvdXRpbHMvZHJhZ2dhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFjLFNBQVMsRUFBRSxLQUFLLEVBQVEsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQztJQTZCSSxtQkFBWSxPQUFnQixFQUFFLE1BQVc7UUFBWCx1QkFBQSxFQUFBLFdBQVc7UUFuQmpDLGNBQVMsR0FBMkIsS0FBSyxDQUM3QyxTQUFTLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxFQUNoQyxTQUFTLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUN2RCxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ1IsWUFBTyxHQUEyQixLQUFLLENBQzNDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQzlCLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQy9CLFNBQVMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQ3JDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFUixXQUFNLEdBQUc7WUFDYixZQUFZLEVBQUUsSUFBSTtZQUNsQixNQUFNLEVBQUUsSUFBSTtZQUNaLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZUFBZSxFQUFFLElBQUk7U0FDeEIsQ0FBQzs7UUFFTSwwQkFB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LGdCQUFDO0NBQUEsQUE3VkQsSUE2VkM7U0E3VlksU0FBUzs7O0lBQ2xCLHVCQUF5Qjs7SUFDekIsNEJBQWlCOztJQUVqQiw4QkFBc0M7O0lBQ3RDLDZCQUFxQzs7SUFDckMsNkJBQXFDOztJQUVyQywwQ0FBd0M7O0lBQ3hDLHlDQUF1Qzs7SUFDdkMsOEJBR2dCOztJQUNoQiw0QkFJZ0I7O0lBQ2hCLDhCQUEwQzs7SUFDMUMsMkJBS0U7O0lBRUYsMENBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbUV2ZW50LCBtZXJnZSwgcGlwZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmUsIG1hcCwgZmlsdGVyLCB0YXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YWtlLCBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJy4vRHJhZ2dhYmxlRXZlbnQnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIERyYWdnYWJsZSB7XG4gICAgc3RhdGljIFNDUk9MTF9TUEVFRCA9IDIwO1xuICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG5cbiAgICBkcmFnU3RhcnQ6IE9ic2VydmFibGU8RHJhZ2dhYmxlRXZlbnQ+O1xuICAgIGRyYWdNb3ZlOiBPYnNlcnZhYmxlPERyYWdnYWJsZUV2ZW50PjtcbiAgICBkcmFnU3RvcDogT2JzZXJ2YWJsZTxEcmFnZ2FibGVFdmVudD47XG4gICAgLy8gQSBzaW1wbGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHBvbHlmaWxsXG4gICAgcHJpdmF0ZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IEZ1bmN0aW9uO1xuICAgIHByaXZhdGUgY2FuY2VsQW5pbWF0aW9uRnJhbWU6IEZ1bmN0aW9uO1xuICAgIHByaXZhdGUgbW91c2Vtb3ZlOiBPYnNlcnZhYmxlPHt9IHwgRXZlbnQ+ID0gbWVyZ2UoXG4gICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNlbW92ZScpLFxuICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB7IHBhc3NpdmU6IGZhbHNlIH0pXG4gICAgKS5waXBlKHNoYXJlKCkpO1xuICAgIHByaXZhdGUgbW91c2V1cDogT2JzZXJ2YWJsZTx7fSB8IEV2ZW50PiA9IG1lcmdlKFxuICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZXVwJyksXG4gICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNoZW5kJyksXG4gICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ3RvdWNoY2FuY2VsJylcbiAgICApLnBpcGUoc2hhcmUoKSk7XG4gICAgcHJpdmF0ZSBtb3VzZWRvd246IE9ic2VydmFibGU8e30gfCBFdmVudD47XG4gICAgcHJpdmF0ZSBjb25maWcgPSB7XG4gICAgICAgIGhhbmRsZXJDbGFzczogbnVsbCxcbiAgICAgICAgc2Nyb2xsOiB0cnVlLFxuICAgICAgICBzY3JvbGxFZGdlOiAzNixcbiAgICAgICAgc2Nyb2xsRGlyZWN0aW9uOiBudWxsXG4gICAgfTtcbiAgICAvLyByZWZlcmVuY2UgdG8gYXV0byBzY3JvbGxpbmcgbGlzdGVuZXJzXG4gICAgcHJpdmF0ZSBhdXRvU2Nyb2xsaW5nSW50ZXJ2YWwgPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnQsIGNvbmZpZyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubW91c2Vkb3duID0gbWVyZ2UoXG4gICAgICAgICAgICBmcm9tRXZlbnQoZWxlbWVudCwgJ21vdXNlZG93bicpLFxuICAgICAgICAgICAgZnJvbUV2ZW50KGVsZW1lbnQsICd0b3VjaHN0YXJ0JylcbiAgICAgICAgKS5waXBlKHNoYXJlKCkpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0geyAuLi50aGlzLmNvbmZpZywgLi4uY29uZmlnIH07XG5cbiAgICAgICAgdGhpcy5kcmFnU3RhcnQgPSB0aGlzLmNyZWF0ZURyYWdTdGFydE9ic2VydmFibGUoKS5waXBlKHNoYXJlKCkpO1xuICAgICAgICB0aGlzLmRyYWdNb3ZlID0gdGhpcy5jcmVhdGVEcmFnTW92ZU9ic2VydmFibGUodGhpcy5kcmFnU3RhcnQpO1xuICAgICAgICB0aGlzLmRyYWdTdG9wID0gdGhpcy5jcmVhdGVEcmFnU3RvcE9ic2VydmFibGUodGhpcy5kcmFnU3RhcnQpO1xuXG4gICAgICAgIHRoaXMuZml4UHJvYmxlbVdpdGhEbkRGb3JJRShlbGVtZW50KTtcblxuICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IChjYWxsYmFjayA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApKTtcbiAgICAgICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCAoY2FmSUQgPT4gY2xlYXJUaW1lb3V0KGNhZklEKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVEcmFnU3RhcnRPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8RHJhZ2dhYmxlRXZlbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW91c2Vkb3duLnBpcGUoXG4gICAgICAgICAgICBtYXAobWQgPT4gbmV3IERyYWdnYWJsZUV2ZW50KG1kKSksXG4gICAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBEcmFnZ2FibGVFdmVudCkgPT4gdGhpcy5pc0RyYWdpbmdCeUhhbmRsZXIoZXZlbnQpKSxcbiAgICAgICAgICAgIHRhcChlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWUuaXNUb3VjaEV2ZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wYXVzZUV2ZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICg8YW55PmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmJsdXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcHJldmVudHMgcmVuZGVyaW5nIHBlcmZvcm1hbmNlIGlzc3VlcyB3aGlsZSBkcmFnZ2luZyBpdGVtIHdpdGggc2VsZWN0aW9uIGluc2lkZVxuICAgICAgICAgICAgICAgIHV0aWxzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoc3RhcnRFdmVudDogRHJhZ2dhYmxlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VzZW1vdmUucGlwZShcbiAgICAgICAgICAgICAgICAgICAgbWFwKG1tID0+IG5ldyBEcmFnZ2FibGVFdmVudChtbSkpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKG1vdmVFdmVudDogRHJhZ2dhYmxlRXZlbnQpID0+IHRoaXMuaW5SYW5nZShzdGFydEV2ZW50LCBtb3ZlRXZlbnQsIDUpKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHN0YXJ0RXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5tb3VzZXVwKSxcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ01vdmVPYnNlcnZhYmxlKFxuICAgICAgICBkcmFnU3RhcnQ6IE9ic2VydmFibGU8RHJhZ2dhYmxlRXZlbnQ+XG4gICAgKTogT2JzZXJ2YWJsZTxEcmFnZ2FibGVFdmVudD4ge1xuICAgICAgICByZXR1cm4gZHJhZ1N0YXJ0LnBpcGUoXG4gICAgICAgICAgICB0YXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG91Y2hBY3Rpb25Ob25lKGV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHN3aXRjaE1hcChzdGFydEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VzZW1vdmUucGlwZShcbiAgICAgICAgICAgICAgICAgICAgc2tpcCgxKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKG1tID0+IG5ldyBEcmFnZ2FibGVFdmVudChtbSkpLFxuICAgICAgICAgICAgICAgICAgICB0YXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucGF1c2VFdmVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRFdmVudC5wYXVzZUV2ZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5tb3VzZXVwKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpbHRlcih2YWwgPT4gISF2YWwpLFxuICAgICAgICAgICAgdGFwKChldmVudDogRHJhZ2dhYmxlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuc2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTY3JvbGwodGhpcy5lbGVtZW50LCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdTdG9wT2JzZXJ2YWJsZShkcmFnU3RhcnQ6IE9ic2VydmFibGU8RHJhZ2dhYmxlRXZlbnQ+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIGRyYWdTdGFydC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tb3VzZXVwLnBpcGUodGFrZSgxKSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcChlID0+IG5ldyBEcmFnZ2FibGVFdmVudChlKSksXG4gICAgICAgICAgICB0YXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVG91Y2hBY3Rpb25Ob25lKGUudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2Nyb2xsaW5nSW50ZXJ2YWwuZm9yRWFjaChyYWYgPT4gdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZShyYWYpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbChpdGVtOiBFbGVtZW50LCBldmVudDogRHJhZ2dhYmxlRXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5nZXRTY3JvbGxDb250YWluZXIoaXRlbSk7XG4gICAgICAgIHRoaXMuYXV0b1Njcm9sbGluZ0ludGVydmFsLmZvckVhY2gocmFmID0+IHRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKSk7XG5cbiAgICAgICAgaWYgKHNjcm9sbENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5zdGFydFNjcm9sbEZvckNvbnRhaW5lcihldmVudCwgc2Nyb2xsQ29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTY3JvbGxGb3JXaW5kb3coZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbEZvckNvbnRhaW5lcihldmVudDogRHJhZ2dhYmxlRXZlbnQsIHNjcm9sbENvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zY3JvbGxEaXJlY3Rpb24gfHwgdGhpcy5jb25maWcuc2Nyb2xsRGlyZWN0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2Nyb2xsVmVydGljYWxseUZvckNvbnRhaW5lcihldmVudCwgc2Nyb2xsQ29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2Nyb2xsRGlyZWN0aW9uIHx8IHRoaXMuY29uZmlnLnNjcm9sbERpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2Nyb2xsSG9yaXpvbnRhbGx5Rm9yQ29udGFpbmVyKGV2ZW50LCBzY3JvbGxDb250YWluZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbFZlcnRpY2FsbHlGb3JDb250YWluZXIoXG4gICAgICAgIGV2ZW50OiBEcmFnZ2FibGVFdmVudCxcbiAgICAgICAgc2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudFxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQucGFnZVkgLSB0aGlzLmdldE9mZnNldChzY3JvbGxDb250YWluZXIpLnRvcCA8IHRoaXMuY29uZmlnLnNjcm9sbEVkZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvU2Nyb2xsaW5nKHNjcm9sbENvbnRhaW5lciwgLURyYWdnYWJsZS5TQ1JPTExfU1BFRUQsICdzY3JvbGxUb3AnKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuZ2V0T2Zmc2V0KHNjcm9sbENvbnRhaW5lcikudG9wICtcbiAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC1cbiAgICAgICAgICAgICAgICBldmVudC5wYWdlWSA8XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zY3JvbGxFZGdlXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGxpbmcoc2Nyb2xsQ29udGFpbmVyLCBEcmFnZ2FibGUuU0NST0xMX1NQRUVELCAnc2Nyb2xsVG9wJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0U2Nyb2xsSG9yaXpvbnRhbGx5Rm9yQ29udGFpbmVyKFxuICAgICAgICBldmVudDogRHJhZ2dhYmxlRXZlbnQsXG4gICAgICAgIHNjcm9sbENvbnRhaW5lcjogSFRNTEVsZW1lbnRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LnBhZ2VYIC0gc2Nyb2xsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgPCB0aGlzLmNvbmZpZy5zY3JvbGxFZGdlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbGluZyhzY3JvbGxDb250YWluZXIsIC1EcmFnZ2FibGUuU0NST0xMX1NQRUVELCAnc2Nyb2xsTGVmdCcpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdGhpcy5nZXRPZmZzZXQoc2Nyb2xsQ29udGFpbmVyKS5sZWZ0ICtcbiAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLVxuICAgICAgICAgICAgICAgIGV2ZW50LnBhZ2VYIDxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjcm9sbEVkZ2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbGluZyhzY3JvbGxDb250YWluZXIsIERyYWdnYWJsZS5TQ1JPTExfU1BFRUQsICdzY3JvbGxMZWZ0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0U2Nyb2xsRm9yV2luZG93KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2Nyb2xsRGlyZWN0aW9uIHx8IHRoaXMuY29uZmlnLnNjcm9sbERpcmVjdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgICAgICAgdGhpcy5zdGFydFNjcm9sbFZlcnRpY2FsbHlGb3JXaW5kb3coZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zY3JvbGxEaXJlY3Rpb24gfHwgdGhpcy5jb25maWcuc2Nyb2xsRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTY3JvbGxIb3Jpem9udGFsbHlGb3JXaW5kb3coZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFNjcm9sbFZlcnRpY2FsbHlGb3JXaW5kb3coZXZlbnQ6IERyYWdnYWJsZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGluZ0VsZW1lbnQgPVxuICAgICAgICAgICAgZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcblxuICAgICAgICAvLyBOT1RFOiBVc2luZyBgd2luZG93LnBhZ2VZT2Zmc2V0YCBoZXJlIGJlY2F1c2UgSUUgZG9lc24ndCBoYXZlIGB3aW5kb3cuc2Nyb2xsWWAuXG4gICAgICAgIGlmIChldmVudC5wYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldCA8IHRoaXMuY29uZmlnLnNjcm9sbEVkZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvU2Nyb2xsaW5nKHNjcm9sbGluZ0VsZW1lbnQsIC1EcmFnZ2FibGUuU0NST0xMX1NQRUVELCAnc2Nyb2xsVG9wJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgLSAoZXZlbnQucGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpIDxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjcm9sbEVkZ2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbGluZyhzY3JvbGxpbmdFbGVtZW50LCBEcmFnZ2FibGUuU0NST0xMX1NQRUVELCAnc2Nyb2xsVG9wJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0U2Nyb2xsSG9yaXpvbnRhbGx5Rm9yV2luZG93KGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxpbmdFbGVtZW50ID1cbiAgICAgICAgICAgIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XG5cbiAgICAgICAgLy8gTk9URTogVXNpbmcgYHdpbmRvdy5wYWdlWE9mZnNldGAgaGVyZSBiZWNhdXNlIElFIGRvZXNuJ3QgaGF2ZSBgd2luZG93LnNjcm9sbFhgLlxuICAgICAgICBpZiAoZXZlbnQucGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQgPCB0aGlzLmNvbmZpZy5zY3JvbGxFZGdlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbGluZyhzY3JvbGxpbmdFbGVtZW50LCAtRHJhZ2dhYmxlLlNDUk9MTF9TUEVFRCwgJ3Njcm9sbExlZnQnKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHdpbmRvdy5pbm5lcldpZHRoIC0gKGV2ZW50LnBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0KSA8XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zY3JvbGxFZGdlXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGxpbmcoc2Nyb2xsaW5nRWxlbWVudCwgRHJhZ2dhYmxlLlNDUk9MTF9TUEVFRCwgJ3Njcm9sbExlZnQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2Nyb2xsQ29udGFpbmVyKG5vZGUpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IG5vZGVPdXRlckhlaWdodCA9IHV0aWxzLmdldEVsZW1lbnRPdXRlckhlaWdodChub2RlKTtcblxuICAgICAgICBpZiAobm9kZS5zY3JvbGxIZWlnaHQgPiBNYXRoLmNlaWwobm9kZU91dGVySGVpZ2h0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ldyBSZWdFeHAoJyhib2R5fGh0bWwpJywgJ2knKS50ZXN0KG5vZGUucGFyZW50Tm9kZS50YWdOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsQ29udGFpbmVyKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0QXV0b1Njcm9sbGluZyhub2RlLCBhbW91bnQsIGRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLmF1dG9TY3JvbGxpbmdJbnRlcnZhbC5wdXNoKFxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvU2Nyb2xsaW5nKG5vZGUsIGFtb3VudCwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gKG5vZGVbZGlyZWN0aW9uXSArPSBhbW91bnQgKiAwLjI1KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9mZnNldChlbCkge1xuICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyB0aGlzLmdldFNjcm9sbCgnc2Nyb2xsTGVmdCcsICdwYWdlWE9mZnNldCcpLFxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCArIHRoaXMuZ2V0U2Nyb2xsKCdzY3JvbGxUb3AnLCAncGFnZVlPZmZzZXQnKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2Nyb2xsKHNjcm9sbFByb3AsIG9mZnNldFByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3dbb2Zmc2V0UHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93W29mZnNldFByb3BdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W3Njcm9sbFByb3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5W3Njcm9sbFByb3BdO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEcmFnaW5nQnlIYW5kbGVyKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZERyYWdIYW5kbGVyKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhdGhpcy5jb25maWcuaGFuZGxlckNsYXNzIHx8XG4gICAgICAgICAgICAodGhpcy5jb25maWcuaGFuZGxlckNsYXNzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNFbGVtZW50V2l0aENsYXNzKHRoaXMuY29uZmlnLmhhbmRsZXJDbGFzcywgZXZlbnQudGFyZ2V0KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWREcmFnSGFuZGxlcih0YXJnZXRFbDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBbJ2lucHV0JywgJ3RleHRhcmVhJ10uaW5kZXhPZih0YXJnZXRFbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpID09PSAtMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluUmFuZ2Uoc3RhcnRFdmVudDogRHJhZ2dhYmxlRXZlbnQsIG1vdmVFdmVudDogRHJhZ2dhYmxlRXZlbnQsIHJhbmdlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIE1hdGguYWJzKG1vdmVFdmVudC5jbGllbnRYIC0gc3RhcnRFdmVudC5jbGllbnRYKSA+IHJhbmdlIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhtb3ZlRXZlbnQuY2xpZW50WSAtIHN0YXJ0RXZlbnQuY2xpZW50WSkgPiByYW5nZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzRWxlbWVudFdpdGhDbGFzcyhjbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgd2hpbGUgKHRhcmdldCAhPT0gdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXVzZUV2ZW50KGU6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZml4UHJvYmxlbVdpdGhEbkRGb3JJRShlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVG91Y2hEZXZpY2UoKSAmJiB0aGlzLmlzSUVvckVkZ2UoKSAmJiAoPEhUTUxFbGVtZW50PmVsZW1lbnQpLnN0eWxlKSB7XG4gICAgICAgICAgICAoPEhUTUxFbGVtZW50PmVsZW1lbnQpLnN0eWxlWyd0b3VjaC1hY3Rpb24nXSA9ICdub25lJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVG91Y2hBY3Rpb25Ob25lKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCEoPEhUTUxFbGVtZW50PmVsZW1lbnQpLnN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgKDxIVE1MRWxlbWVudD5lbGVtZW50KS5zdHlsZVsndG91Y2gtYWN0aW9uJ10gPSAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRvdWNoQWN0aW9uTm9uZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghKDxIVE1MRWxlbWVudD5lbGVtZW50KS5zdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgICg8SFRNTEVsZW1lbnQ+ZWxlbWVudCkuc3R5bGVbJ3RvdWNoLWFjdGlvbiddID0gJ25vbmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUb3VjaERldmljZSgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgLy8gd29ya3Mgb24gbW9zdCBicm93c2Vyc1xuICAgICAgICApOyAvLyB3b3JrcyBvbiBJRTEwLzExIGFuZCBTdXJmYWNlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0lFb3JFZGdlKCkge1xuICAgICAgICBjb25zdCB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuXG4gICAgICAgIGNvbnN0IG1zaWUgPSB1YS5pbmRleE9mKCdNU0lFICcpO1xuICAgICAgICBpZiAobXNpZSA+IDApIHtcbiAgICAgICAgICAgIC8vIElFIDEwIG9yIG9sZGVyID0+IHJldHVybiB2ZXJzaW9uIG51bWJlclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhtc2llICsgNSwgdWEuaW5kZXhPZignLicsIG1zaWUpKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJpZGVudCA9IHVhLmluZGV4T2YoJ1RyaWRlbnQvJyk7XG4gICAgICAgIGlmICh0cmlkZW50ID4gMCkge1xuICAgICAgICAgICAgLy8gSUUgMTEgPT4gcmV0dXJuIHZlcnNpb24gbnVtYmVyXG4gICAgICAgICAgICBjb25zdCBydiA9IHVhLmluZGV4T2YoJ3J2OicpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhydiArIDMsIHVhLmluZGV4T2YoJy4nLCBydikpLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlZGdlID0gdWEuaW5kZXhPZignRWRnZS8nKTtcbiAgICAgICAgaWYgKGVkZ2UgPiAwKSB7XG4gICAgICAgICAgICAvLyBFZGdlIChJRSAxMispID0+IHJldHVybiB2ZXJzaW9uIG51bWJlclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHVhLnN1YnN0cmluZyhlZGdlICsgNSwgdWEuaW5kZXhPZignLicsIGVkZ2UpKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3RoZXIgYnJvd3NlclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIl19