react-modalx
Version:
React modal component
247 lines (225 loc) • 30.7 kB
JavaScript
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Modal=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"./src/index.js":[function(require,module,exports){
var Portal = require('./Portal.js');
module.exports = React.createClass({displayName: "exports",
getInitialState: function () {
return {
portalElementPrefix: 'ReactModal',
isOpen: false
};
},
getDefaultProps: function() {
return {
title: 'Modal window',
showTitle: false,
titleTag: 'h1',
description: '',
showDescription: false,
descriptionTag: 'p'
};
},
componentDidMount: function () {
if (typeof this.portalElement === 'undefined') {
this.portalElement = document.createElement('div');
this.portalElement.className = "ReactModalContainer";
document.body.appendChild(this.portalElement);
}
this.renderPortal(this.props, this.state);
},
componentWillReceiveProps: function(props) {
this.renderPortal(props, this.state);
},
componentWillUnmount: function () {
document.body.removeChild(this.portalElement);
},
componentDidUpdate: function() {
this.renderPortal(this.props, this.state)
},
close: function() {
this.setState({isOpen: false});
},
open: function() {
this.setState({isOpen: true});
},
renderPortal: function (props, state) {
this.modal = React.render(React.createElement(Portal, React.__spread({}, props, state, {close: this.close, open: this.open})), this.portalElement);
},
render: function () {
return null;
}
});
},{"./Portal.js":"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\Portal.js"}],"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\ClassHelper.js":[function(require,module,exports){
function addClass( classname, element ) {
var cn = element.className;
//test for existance
if( cn.indexOf( classname ) != -1 ) {
return;
}
//add a space if the element already has class
if( cn != '' ) {
classname = ' '+classname;
}
element.className = cn+classname;
}
function removeClass( classname, element ) {
var cn = element.className;
var rxp = new RegExp( "\\s?\\b"+classname+"\\b", "g" );
cn = cn.replace( rxp, '' );
element.className = cn;
}
module.exports = {
addClass: addClass,
removeClass: removeClass
};
},{}],"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\IdHelper.js":[function(require,module,exports){
module.exports = {
generateId: function (prefix) {
return (prefix || 'GEN_ID-') + new Date().getTime() + '-' + Math.random();
}
};
},{}],"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\Portal.js":[function(require,module,exports){
var FocusHelper = require('./focusHelper.js');
var ClassHelper = require('./ClassHelper.js');
var IdGenerator = require('./IdHelper.js');
module.exports = React.createClass({displayName: "exports",
focusAfterClose: undefined,
componentDidMount: function () {
if (this.props.isOpen === true) {
this.focusFirst();
}
},
componentDidUpdate: function () {
if (this.props.isOpen) {
ClassHelper.addClass('modal-open', document.body);
this.focusFirst();
} else {
this.restoreFocus();
ClassHelper.removeClass('modal-open', document.body);
}
},
keyHandler: function (event) {
switch (event.keyCode) {
case 27: //ESC
this.props.close();
event.stopPropagation();
event.preventDefault();
break;
case 9: //Tab
if (this.handleTabbing(event.shiftKey)) {
event.stopPropagation();
event.preventDefault();
}
break;
}
},
handleTabbing: function (shiftKey) {
var tabbables = FocusHelper.findTabbables(this.refs.content.getDOMNode());
if (tabbables.length === 0) {
return;
}
var lastValidTabbable = shiftKey ? tabbables[0] : tabbables[tabbables.length - 1];
var currentFocus = document.activeElement;
if (currentFocus === lastValidTabbable) {
var newFocusElement = shiftKey ? tabbables[tabbables.length - 1] : tabbables[0];
newFocusElement.focus();
return true;
}
return false;
},
focusFirst: function () {
this.focusAfterClose = document.activeElement;
var tabbables = FocusHelper.findTabbables(this.refs.content.getDOMNode());
if (tabbables.length > 0) {
tabbables[0].focus();
}
},
restoreFocus: function () {
if (this.focusAfterClose) {
this.focusAfterClose.focus();
this.focusAfterClose = undefined;
}
},
render: function () {
if (!this.props.isOpen) {
return null;
}
var children = this.props.children;
if (!children.hasOwnProperty('length')) {
children = [children];
}
children = children.map(function (child) {
child.props.open = this.props.open;
child.props.close = this.props.close;
return child;
}.bind(this));
var title = createAriaOptional('title', this.props.title, this.props.showTitle, this.props.titleTag);
var description = createAriaOptional('description', this.props.description, this.props.showDescription, this.props.descriptionTag);
console.log('title', title);
return (
React.createElement("div", {tabIndex: "-1", onKeyDown: this.keyHandler, role: "dialog", "aria-labelledby": title.id, "aria-describedby": description.id},
React.createElement("div", {className: "backdrop", onClick: this.props.close}),
React.createElement("div", {className: "centering"},
title.hidden,
description.hidden,
React.createElement("div", {className: "content", ref: "content"},
title.visible,
description.visible,
children
)
)
)
);
}
});
function createAriaOptional(idPrefix, content, visibility, tag) {
var id = IdGenerator.generateId('react-modalx-' + idPrefix + '-');
var tagComponents = tag.split('.');
var tagType = tagComponents[0];
var className = '';
if (tagComponents.length === 2) {
var className = tagComponents[1];
}
var element = React.createElement(tagType, {id: id, className: className}, content);
return {
id: id,
hidden: visibility ? null : element,
visible: visibility ? element : null
};
}
},{"./ClassHelper.js":"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\ClassHelper.js","./IdHelper.js":"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\IdHelper.js","./focusHelper.js":"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\focusHelper.js"}],"C:\\Users\\Nicklas\\IdeaProjects\\ReactModal\\src\\focusHelper.js":[function(require,module,exports){
function focusable(element, isTabIndexNotNaN) {
var nodeName = element.nodeName.toLowerCase();
return (/input|select|textarea|button|object/.test(nodeName) ?
!element.disabled :
"a" === nodeName ?
element.href || isTabIndexNotNaN :
isTabIndexNotNaN) && visible(element);
}
function hidden(el) {
return (el.offsetWidth <= 0 && el.offsetHeight <= 0) ||
el.style.display === 'none';
}
function visible(element) {
while (element) {
if (element === document.body) break;
if (hidden(element)) return false;
element = element.parentNode;
}
return true;
}
function tabbable(element) {
var tabIndex = element.getAttribute('tabindex');
if (tabIndex === null) tabIndex = undefined;
var isTabIndexNaN = isNaN(tabIndex);
return (isTabIndexNaN || tabIndex >= 0) && focusable(element, !isTabIndexNaN);
}
function findTabbables(container) {
return [].slice.call(container.querySelectorAll('*'), 0).filter(function (element) {
return tabbable(element)
});
}
module.exports = {
findTabbables: findTabbables
};
},{}]},{},["./src/index.js"])("./src/index.js")
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlc1xcYnJvd3NlcmlmeVxcbm9kZV9tb2R1bGVzXFxicm93c2VyLXBhY2tcXF9wcmVsdWRlLmpzIiwiQzpcXFVzZXJzXFxOaWNrbGFzXFxJZGVhUHJvamVjdHNcXFJlYWN0TW9kYWxcXHNyY1xcaW5kZXguanMiLCJDOlxcVXNlcnNcXE5pY2tsYXNcXElkZWFQcm9qZWN0c1xcUmVhY3RNb2RhbFxcc3JjXFxDbGFzc0hlbHBlci5qcyIsIkM6XFxVc2Vyc1xcTmlja2xhc1xcSWRlYVByb2plY3RzXFxSZWFjdE1vZGFsXFxzcmNcXElkSGVscGVyLmpzIiwiQzpcXFVzZXJzXFxOaWNrbGFzXFxJZGVhUHJvamVjdHNcXFJlYWN0TW9kYWxcXHNyY1xcUG9ydGFsLmpzIiwiQzpcXFVzZXJzXFxOaWNrbGFzXFxJZGVhUHJvamVjdHNcXFJlYWN0TW9kYWxcXHNyY1xcZm9jdXNIZWxwZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQSxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7O0FBRXBDLG9DQUFvQyx1QkFBQTtJQUNoQyxlQUFlLEVBQUUsWUFBWTtRQUN6QixPQUFPO1lBQ0gsbUJBQW1CLEVBQUUsWUFBWTtZQUNqQyxNQUFNLEVBQUUsS0FBSztTQUNoQixDQUFDO0tBQ0w7SUFDRCxlQUFlLEVBQUUsV0FBVztRQUN4QixPQUFPO1lBQ0gsS0FBSyxFQUFFLGNBQWM7WUFDckIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsRUFBRTtZQUNmLGVBQWUsRUFBRSxLQUFLO0FBQ2xDLFlBQVksY0FBYyxFQUFFLEdBQUc7O1NBRXRCLENBQUM7S0FDTDtJQUNELGlCQUFpQixFQUFFLFlBQVk7UUFDM0IsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssV0FBVyxFQUFFO1lBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENB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LEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNO1FBQ3JDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xDLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0tBQ2hDO0lBQ0QsT0FBTyxJQUFJLENBQUM7Q0FDZjtBQUNELFNBQVMsUUFBUSxDQUFDLE9BQU8sRUFBRTtJQUN2QixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hELElBQUksUUFBUSxLQUFLLElBQUksRUFBRSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQzVDLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxPQUFPLENBQUMsYUFBYSxJQUFJLFFBQVEsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0NBQ2pGO0FBQ0QsU0FBUyxhQUFhLENBQUMsU0FBUyxFQUFFO0lBQzlCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLE9BQU8sRUFBRTtRQUMvRSxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7S0FDM0IsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEOztBQUVBLE1BQU0sQ0FBQyxPQUFPLEdBQUc7SUFDYixhQUFhLEVBQUUsYUFBYTtDQUMvQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgUG9ydGFsID0gcmVxdWlyZSgnLi9Qb3J0YWwuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwb3J0YWxFbGVtZW50UHJlZml4OiAnUmVhY3RNb2RhbCcsXG4gICAgICAgICAgICBpc09wZW46IGZhbHNlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGl0bGU6ICdNb2RhbCB3aW5kb3cnLFxuICAgICAgICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcbiAgICAgICAgICAgIHRpdGxlVGFnOiAnaDEnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgc2hvd0Rlc2NyaXB0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uVGFnOiAncCdcblxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvcnRhbEVsZW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnBvcnRhbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMucG9ydGFsRWxlbWVudC5jbGFzc05hbWUgPSBcIlJlYWN0TW9kYWxDb250YWluZXJcIjtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5wb3J0YWxFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlclBvcnRhbCh0aGlzLnByb3BzLCB0aGlzLnN0YXRlKTtcbiAgICB9LFxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUG9ydGFsKHByb3BzLCB0aGlzLnN0YXRlKTtcbiAgICB9LFxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5wb3J0YWxFbGVtZW50KTtcbiAgICB9LFxuICAgIGNvbXBvbmVudERpZFVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUG9ydGFsKHRoaXMucHJvcHMsIHRoaXMuc3RhdGUpXG4gICAgfSxcbiAgICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzT3BlbjogZmFsc2V9KTtcbiAgICB9LFxuICAgIG9wZW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpc09wZW46IHRydWV9KTtcbiAgICB9LFxuICAgIHJlbmRlclBvcnRhbDogZnVuY3Rpb24gKHByb3BzLCBzdGF0ZSkge1xuICAgICAgICB0aGlzLm1vZGFsID0gUmVhY3QucmVuZGVyKDxQb3J0YWwgey4uLnByb3BzfSB7Li4uc3RhdGV9IGNsb3NlPXt0aGlzLmNsb3NlfSBvcGVuPXt0aGlzLm9wZW59Lz4sIHRoaXMucG9ydGFsRWxlbWVudCk7XG4gICAgfSxcbiAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSk7IiwiZnVuY3Rpb24gYWRkQ2xhc3MoIGNsYXNzbmFtZSwgZWxlbWVudCApIHtcclxuICAgIHZhciBjbiA9IGVsZW1lbnQuY2xhc3NOYW1lO1xyXG4gICAgLy90ZXN0IGZvciBleGlzdGFuY2VcclxuICAgIGlmKCBjbi5pbmRleE9mKCBjbGFzc25hbWUgKSAhPSAtMSApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL2FkZCBhIHNwYWNlIGlmIHRoZSBlbGVtZW50IGFscmVhZHkgaGFzIGNsYXNzXHJcbiAgICBpZiggY24gIT0gJycgKSB7XHJcbiAgICAgICAgY2xhc3NuYW1lID0gJyAnK2NsYXNzbmFtZTtcclxuICAgIH1cclxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gY24rY2xhc3NuYW1lO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVDbGFzcyggY2xhc3NuYW1lLCBlbGVtZW50ICkge1xyXG4gICAgdmFyIGNuID0gZWxlbWVudC5jbGFzc05hbWU7XHJcbiAgICB2YXIgcnhwID0gbmV3IFJlZ0V4cCggXCJcXFxccz9cXFxcYlwiK2NsYXNzbmFtZStcIlxcXFxiXCIsIFwiZ1wiICk7XHJcbiAgICBjbiA9IGNuLnJlcGxhY2UoIHJ4cCwgJycgKTtcclxuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gY247XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gICAgYWRkQ2xhc3M6IGFkZENsYXNzLFxyXG4gICAgcmVtb3ZlQ2xhc3M6IHJlbW92ZUNsYXNzXHJcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgICBnZW5lcmF0ZUlkOiBmdW5jdGlvbiAocHJlZml4KSB7XHJcbiAgICAgICAgcmV0dXJuIChwcmVmaXggfHwgJ0dFTl9JRC0nKSArIG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgJy0nICsgTWF0aC5yYW5kb20oKTtcclxuICAgIH1cclxufTsiLCJ2YXIgRm9jdXNIZWxwZXIgPSByZXF1aXJlKCcuL2ZvY3VzSGVscGVyLmpzJyk7XG52YXIgQ2xhc3NIZWxwZXIgPSByZXF1aXJlKCcuL0NsYXNzSGVscGVyLmpzJyk7XG52YXIgSWRHZW5lcmF0b3IgPSByZXF1aXJlKCcuL0lkSGVscGVyLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgIGZvY3VzQWZ0ZXJDbG9zZTogdW5kZWZpbmVkLFxuICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmlzT3BlbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0KCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNvbXBvbmVudERpZFVwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5pc09wZW4pIHtcbiAgICAgICAgICAgIENsYXNzSGVscGVyLmFkZENsYXNzKCdtb2RhbC1vcGVuJywgZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzRmlyc3QoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZUZvY3VzKCk7XG4gICAgICAgICAgICBDbGFzc0hlbHBlci5yZW1vdmVDbGFzcygnbW9kYWwtb3BlbicsIGRvY3VtZW50LmJvZHkpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBrZXlIYW5kbGVyOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgICAgICBjYXNlIDI3OiAvL0VTQ1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA5OiAvL1RhYlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhbmRsZVRhYmJpbmcoZXZlbnQuc2hpZnRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGFuZGxlVGFiYmluZzogZnVuY3Rpb24gKHNoaWZ0S2V5KSB7XG4gICAgICAgIHZhciB0YWJiYWJsZXMgPSBGb2N1c0hlbHBlci5maW5kVGFiYmFibGVzKHRoaXMucmVmcy5jb250ZW50LmdldERPTU5vZGUoKSk7XG4gICAgICAgIGlmICh0YWJiYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGFzdFZhbGlkVGFiYmFibGUgPSBzaGlmdEtleSA/IHRhYmJhYmxlc1swXSA6IHRhYmJhYmxlc1t0YWJiYWJsZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHZhciBjdXJyZW50Rm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmIChjdXJyZW50Rm9jdXMgPT09IGxhc3RWYWxpZFRhYmJhYmxlKSB7XG4gICAgICAgICAgICB2YXIgbmV3Rm9jdXNFbGVtZW50ID0gc2hpZnRLZXkgPyB0YWJiYWJsZXNbdGFiYmFibGVzLmxlbmd0aCAtIDFdIDogdGFiYmFibGVzWzBdO1xuICAgICAgICAgICAgbmV3Rm9jdXNFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBmb2N1c0ZpcnN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgdmFyIHRhYmJhYmxlcyA9IEZvY3VzSGVscGVyLmZpbmRUYWJiYWJsZXModGhpcy5yZWZzLmNvbnRlbnQuZ2V0RE9NTm9kZSgpKTtcbiAgICAgICAgaWYgKHRhYmJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0YWJiYWJsZXNbMF0uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcmVzdG9yZUZvY3VzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzQWZ0ZXJDbG9zZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfSxcbiAgICByZW5kZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmlzT3Blbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgICBpZiAoIWNoaWxkcmVuLmhhc093blByb3BlcnR5KCdsZW5ndGgnKSkge1xuICAgICAgICAgICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5vcGVuID0gdGhpcy5wcm9wcy5vcGVuO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuY2xvc2UgPSB0aGlzLnByb3BzLmNsb3NlO1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHZhciB0aXRsZSA9IGNyZWF0ZUFyaWFPcHRpb25hbCgndGl0bGUnLCB0aGlzLnByb3BzLnRpdGxlLCB0aGlzLnByb3BzLnNob3dUaXRsZSwgdGhpcy5wcm9wcy50aXRsZVRhZyk7XG4gICAgICAgIHZhciBkZXNjcmlwdGlvbiA9IGNyZWF0ZUFyaWFPcHRpb25hbCgnZGVzY3JpcHRpb24nLCB0aGlzLnByb3BzLmRlc2NyaXB0aW9uLCB0aGlzLnByb3BzLnNob3dEZXNjcmlwdGlvbiwgdGhpcy5wcm9wcy5kZXNjcmlwdGlvblRhZyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aXRsZScsIHRpdGxlKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiB0YWJJbmRleD1cIi0xXCIgb25LZXlEb3duPXt0aGlzLmtleUhhbmRsZXJ9IHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9e3RpdGxlLmlkfSBhcmlhLWRlc2NyaWJlZGJ5PXtkZXNjcmlwdGlvbi5pZH0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiYWNrZHJvcFwiIG9uQ2xpY2s9e3RoaXMucHJvcHMuY2xvc2V9PjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2VudGVyaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIHt0aXRsZS5oaWRkZW59XG4gICAgICAgICAgICAgICAgICAgIHtkZXNjcmlwdGlvbi5oaWRkZW59XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29udGVudFwiIHJlZj1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aXRsZS52aXNpYmxlfVxuICAgICAgICAgICAgICAgICAgICAgICAge2Rlc2NyaXB0aW9uLnZpc2libGV9XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufSk7XG5mdW5jdGlvbiBjcmVhdGVBcmlhT3B0aW9uYWwoaWRQcmVmaXgsIGNvbnRlbnQsIHZpc2liaWxpdHksIHRhZykge1xuICAgIHZhciBpZCA9IElkR2VuZXJhdG9yLmdlbmVyYXRlSWQoJ3JlYWN0LW1vZGFseC0nICsgaWRQcmVmaXggKyAnLScpO1xuXG4gICAgdmFyIHRhZ0NvbXBvbmVudHMgPSB0YWcuc3BsaXQoJy4nKTtcbiAgICB2YXIgdGFnVHlwZSA9IHRhZ0NvbXBvbmVudHNbMF07XG4gICAgdmFyIGNsYXNzTmFtZSA9ICcnO1xuXG4gICAgaWYgKHRhZ0NvbXBvbmVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSB0YWdDb21wb25lbnRzWzFdO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudCh0YWdUeXBlLCB7aWQ6IGlkLCBjbGFzc05hbWU6IGNsYXNzTmFtZX0sIGNvbnRlbnQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgaGlkZGVuOiB2aXNpYmlsaXR5ID8gbnVsbCA6IGVsZW1lbnQsXG4gICAgICAgIHZpc2libGU6IHZpc2liaWxpdHkgPyBlbGVtZW50IDogbnVsbFxuICAgIH07XG59IiwiZnVuY3Rpb24gZm9jdXNhYmxlKGVsZW1lbnQsIGlzVGFiSW5kZXhOb3ROYU4pIHtcbiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuICgvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QvLnRlc3Qobm9kZU5hbWUpID9cbiAgICAgICAgICAgICFlbGVtZW50LmRpc2FibGVkIDpcbiAgICAgICAgICAgIFwiYVwiID09PSBub2RlTmFtZSA/XG4gICAgICAgICAgICBlbGVtZW50LmhyZWYgfHwgaXNUYWJJbmRleE5vdE5hTiA6XG4gICAgICAgICAgICAgICAgaXNUYWJJbmRleE5vdE5hTikgJiYgdmlzaWJsZShlbGVtZW50KTtcbn1cbmZ1bmN0aW9uIGhpZGRlbihlbCkge1xuICAgIHJldHVybiAoZWwub2Zmc2V0V2lkdGggPD0gMCAmJiBlbC5vZmZzZXRIZWlnaHQgPD0gMCkgfHxcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnO1xufVxuXG5mdW5jdGlvbiB2aXNpYmxlKGVsZW1lbnQpIHtcbiAgICB3aGlsZSAoZWxlbWVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSkgYnJlYWs7XG4gICAgICAgIGlmIChoaWRkZW4oZWxlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB0YWJiYWJsZShlbGVtZW50KSB7XG4gICAgdmFyIHRhYkluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgaWYgKHRhYkluZGV4ID09PSBudWxsKSB0YWJJbmRleCA9IHVuZGVmaW5lZDtcbiAgICB2YXIgaXNUYWJJbmRleE5hTiA9IGlzTmFOKHRhYkluZGV4KTtcbiAgICByZXR1cm4gKGlzVGFiSW5kZXhOYU4gfHwgdGFiSW5kZXggPj0gMCkgJiYgZm9jdXNhYmxlKGVsZW1lbnQsICFpc1RhYkluZGV4TmFOKTtcbn1cbmZ1bmN0aW9uIGZpbmRUYWJiYWJsZXMoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSwgMCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0YWJiYWJsZShlbGVtZW50KVxuICAgIH0pO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZpbmRUYWJiYWJsZXM6IGZpbmRUYWJiYWJsZXNcbn07Il19