| 1
2 | 12x
| module.exports=function(e){function t(o){Iif(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t){e.exports=require("boundless-typeahead")},function(e,t){e.exports=require("boundless-utils-object-intersection")},function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){Iif("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=n(4),l=n.n(i),p=n(3),c=n.n(p),a=n(0),u=n.n(a),f=n(1),h=n.n(f),d=n(2),k=n.n(d),y=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},v=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),b=function(e){return e[0]},T=function(e){return e[e.length-1]},m=function(e){return"function"==typeof e},C=function(e){function t(){var e,n,s,i;o(this,t);for(var l=arguments.length,p=Array(l),c=0;c<l;c++)p[c]=arguments[c];return n=s=r(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),s.focus=function(){return s.refs.typeahead.focus()},s.getInputNode=function(){return s.refs.typeahead.getInputNode()},s.getSelectedEntityText=function(){return s.refs.typeahead.getSelectedEntityText()},s.getValue=function(){return s.refs.typeahead.getValue()},s.select=function(){return s.refs.typeahead.select()},s.setValue=function(e){return s.refs.typeahead.setValue(e)},s.add=function(e){s.props.tokens.indexOf(e)===-1&&s.props.handleAddToken(e)},s.handleInputClick=function(e){s.clearSelection(),m(s.props.inputProps.onClick)&&s.props.inputProps.onClick(e)},s.handleInputFocus=function(e){s.clearSelection(),m(s.props.inputProps.onFocus)&&s.props.inputProps.onFocus(e)},s.handleKeyDown=function(e){switch(e.which){case 37:s.selectPreviousToken(e.shiftKey);break;case 39:s.selectNextToken(e.shiftKey);break;case 8:s.props.tokensSelected.length&&(s.remove(s.props.tokensSelected),s.focus());break;case 65:e.metaKey&&(e.preventDefault(),s.focus(),s.select(),s._suppressNextTokenSelection=!0,s.props.handleNewSelection(s.props.tokens))}m(s.props.onKeyDown)&&s.props.onKeyDown(e)},i=n,r(s,i)}return s(t,e),v(t,[{key:"componentDidUpdate",value:function(e){var t=e.tokensSelected,n=this.props.tokensSelected;if(this.props.tokens.length>e.tokens.length&&this.setValue(""),this._suppressNextTokenSelection)return void(this._suppressNextTokenSelection=!1);if(t!==n&&0!==n.length){if(1===n.length||n[0]!==t[0])return this.refs["token_"+n[0]].focus();if(T(n)!==T(t))return this.refs["token_"+T(n)].focus();this.refs["token_"+n[0]].focus()}}},{key:"remove",value:function(e){var t=this,n=(Array.isArray(e)?e:[e]).filter(function(e){return t.props.tokens.indexOf(e)!==-1});n.length&&this.props.handleRemoveTokens(n)}},{key:"selectToken",value:function(e){this.props.handleNewSelection([e])}},{key:"selectTokens",value:function(e){this.props.handleNewSelection(e)}},{key:"selectPreviousToken",value:function(e){var t=this.props.tokensSelected,n=this.props.tokens;if(1!==t.length||b(t)!==b(n))if(0===t.length)this.selectToken(T(n));else{var o=n[n.indexOf(b(t))-1];this.selectTokens(e?[o].concat(t):[o])}}},{key:"selectNextToken",value:function(e){var t=this.props.tokensSelected,n=this.props.tokens;if(0!==t.length)if(T(t)===T(n))this.clearSelection(),this.focus();else{var o=n[n.indexOf(T(t))+1];this.selectTokens(e?t.concat(o):[o])}}},{key:"clearSelection",value:function(){this.props.handleNewSelection([])}},{key:"handleTokenCloseClick",value:function(e,t){t.stopPropagation(),this.remove(e),this.focus(),this.props.tokenCloseComponent.props.onClick&&this.props.tokenCloseComponent.props.onClick(t)}},{key:"renderTokenClose",value:function(e){if(this.props.tokenCloseVisible)return l.a.cloneElement(this.props.tokenCloseComponent,{className:c()("b-tokenfield-token-close",this.props.tokenCloseComponent.props.className),onClick:this.handleTokenCloseClick.bind(this,e)})}},{key:"handleTokenKeyDown",value:function(e,t){switch(t.which){case 13:case 32:this.selectToken(e),t.preventDefault();break;case 8:this.remove(e),this.focus(),t.preventDefault()}}},{key:"renderTokens",value:function(){var e=this;return l.a.createElement("div",{className:"b-tokenfield-tokens"},this.props.tokens.map(function(t){return l.a.createElement("div",{ref:"token_"+t,key:t,className:c()("b-tokenfield-token",{"b-tokenfield-token-selected":e.props.tokensSelected.indexOf(t)!==-1}),onClick:e.selectToken.bind(e,t),onKeyDown:e.handleTokenKeyDown.bind(e,t),tabIndex:"0"},e.props.entities[t].text,e.renderTokenClose(t))}))}},{key:"render",value:function(){return l.a.createElement("div",y({},k()(this.props,t.internalKeys),{ref:"wrapper",className:c()("b-tokenfield-wrapper",this.props.className),onKeyDown:this.handleKeyDown}),this.renderTokens(),l.a.createElement(u.a,y({},h()(this.props,u.a.defaultProps),{ref:"typeahead",className:"b-tokenfield",clearOnSelection:!0,inputProps:y({},this.props.inputProps,{onClick:this.handleInputClick,onFocus:this.handleInputFocus}),onEntitySelected:this.add})))}}]),t}(l.a.PureComponent);C.propTypes=y({},u.a.propTypes,{handleAddToken:i.PropTypes.func,handleRemoveTokens:i.PropTypes.func,handleNewSelection:i.PropTypes.func,tokenCloseComponent:i.PropTypes.element,tokenCloseVisible:i.PropTypes.bool,tokens:i.PropTypes.arrayOf(i.PropTypes.number),tokensSelected:i.PropTypes.arrayOf(i.PropTypes.number)}),C.defaultProps=y({},u.a.defaultProps,{handleAddToken:function(){},handleRemoveTokens:function(){},handleNewSelection:function(){},tokenCloseComponent:l.a.createElement("div",null,"X"),tokenCloseVisible:!0,tokens:[],tokensSelected:[]}),C.internalKeys=Object.keys(C.defaultProps),t.default=C}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGE5MWMxMzEzYzJjYjdiNGVjOWQxIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy10eXBlYWhlYWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb25cIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy10b2tlbml6ZWQtaW5wdXQvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc190eXBlYWhlYWRfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdHlwZWFoZWFkX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb2JqZWN0X2ludGVyc2VjdGlvbl9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImtleSIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJmaXJzdCIsImFycmF5IiwibGFzdCIsImlzRnVuY3Rpb24iLCJ4IiwiVG9rZW5pemVkSW5wdXQiLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJmb2N1cyIsInJlZnMiLCJ0eXBlYWhlYWQiLCJnZXRJbnB1dE5vZGUiLCJnZXRTZWxlY3RlZEVudGl0eVRleHQiLCJnZXRWYWx1ZSIsInNlbGVjdCIsInNldFZhbHVlIiwiYWRkIiwiaW5kZXgiLCJ0b2tlbnMiLCJpbmRleE9mIiwiaGFuZGxlQWRkVG9rZW4iLCJoYW5kbGVJbnB1dENsaWNrIiwiZXZlbnQiLCJjbGVhclNlbGVjdGlvbiIsImlucHV0UHJvcHMiLCJvbkNsaWNrIiwiaGFuZGxlSW5wdXRGb2N1cyIsIm9uRm9jdXMiLCJoYW5kbGVLZXlEb3duIiwid2hpY2giLCJzZWxlY3RQcmV2aW91c1Rva2VuIiwic2hpZnRLZXkiLCJzZWxlY3ROZXh0VG9rZW4iLCJ0b2tlbnNTZWxlY3RlZCIsInJlbW92ZSIsIm1ldGFLZXkiLCJwcmV2ZW50RGVmYXVsdCIsIl9zdXBwcmVzc05leHRUb2tlblNlbGVjdGlvbiIsImhhbmRsZU5ld1NlbGVjdGlvbiIsIm9uS2V5RG93biIsInByZXZQcm9wcyIsInByZXZpb3VzU2VsZWN0ZWRJbmRleGVzIiwiY3VycmVudFNlbGVjdGVkSW5kZXhlcyIsIl90aGlzMiIsImluZGV4ZXMiLCJpc0FycmF5IiwiZmlsdGVyIiwiaWR4IiwiaGFuZGxlUmVtb3ZlVG9rZW5zIiwiYXBwZW5kIiwic2VsZWN0ZWQiLCJzZWxlY3RUb2tlbiIsInByZXZpb3VzVG9rZW4iLCJzZWxlY3RUb2tlbnMiLCJuZXh0VG9rZW4iLCJzdG9wUHJvcGFnYXRpb24iLCJ0b2tlbkNsb3NlQ29tcG9uZW50IiwidG9rZW5DbG9zZVZpc2libGUiLCJhIiwiY2xvbmVFbGVtZW50IiwiY2xhc3NOYW1lIiwiaGFuZGxlVG9rZW5DbG9zZUNsaWNrIiwiYmluZCIsIl90aGlzMyIsImNyZWF0ZUVsZW1lbnQiLCJtYXAiLCJyZWYiLCJiLXRva2VuZmllbGQtdG9rZW4tc2VsZWN0ZWQiLCJoYW5kbGVUb2tlbktleURvd24iLCJ0YWJJbmRleCIsImVudGl0aWVzIiwidGV4dCIsInJlbmRlclRva2VuQ2xvc2UiLCJpbnRlcm5hbEtleXMiLCJyZW5kZXJUb2tlbnMiLCJkZWZhdWx0UHJvcHMiLCJjbGVhck9uU2VsZWN0aW9uIiwib25FbnRpdHlTZWxlY3RlZCIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJmdW5jIiwiZWxlbWVudCIsImJvb2wiLCJhcnJheU9mIiwibnVtYmVyIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVFDLEdFdkV4QkQsRUFBQUMsUUFBQTRCLFFBQUEsd0JGNkVNLFNBQVU3QixFQUFRQyxHRzdFeEJELEVBQUFDLFFBQUE0QixRQUFBLHdDSG1GTSxTQUFVN0IsRUFBUUMsR0luRnhCRCxFQUFBQyxRQUFBNEIsUUFBQSw4Qkp5Rk0sU0FBVTdCLEVBQVFDLEdLekZ4QkQsRUFBQUMsUUFBQTRCLFFBQUEsZUwrRk0sU0FBVTdCLEVBQVFDLEdNL0Z4QkQsRUFBQUMsUUFBQTRCLFFBQUEsVU5xR00sU0FBVTdCLEVBQVE4QixFQUFxQjNCLEdBRTdDLFlBWTh0QixTQUFTNEIsR0FBZ0JDLEVBQVNDLEdBQWEsS0FBS0QsWUFBb0JDLElBQWMsS0FBTSxJQUFJQyxXQUFVLHFDQUF1QyxRQUFTQyxHQUEyQkMsRUFBSzVCLEdBQU0sSUFBSTRCLEVBQU0sS0FBTSxJQUFJQyxnQkFBZSw0REFBOEQsUUFBTzdCLEdBQXFCLGdCQUFQQSxJQUErQixrQkFBUEEsR0FBd0I0QixFQUFMNUIsRUFBVyxRQUFTOEIsR0FBVUMsRUFBU0MsR0FBWSxHQUF1QixrQkFBYkEsSUFBc0MsT0FBYkEsRUFBbUIsS0FBTSxJQUFJTixXQUFVLGlFQUFrRU0sR0FBYUQsR0FBU2QsVUFBVVQsT0FBT3lCLE9BQU9ELEdBQVlBLEVBQVdmLFdBQVdpQixhQUFhL0IsTUFBTTRCLEVBQVNwQixZQUFXLEVBQU13QixVQUFTLEVBQUt6QixjQUFhLEtBQVdzQixJQUFXeEIsT0FBTzRCLGVBQWU1QixPQUFPNEIsZUFBZUwsRUFBU0MsR0FBWUQsRUFBU00sVUFBVUwsR0FYaGdEeEIsT0FBT0MsZUFBZWEsRUFBcUIsY0FBZ0JuQixPQUFPLEdBQzdDLElBQUltQyxHQUFzQzNDLEVBQW9CLEdBQzFENEMsRUFBOEM1QyxFQUFvQmtCLEVBQUV5QixHQUNwRUUsRUFBMkM3QyxFQUFvQixHQUMvRDhDLEVBQW1EOUMsRUFBb0JrQixFQUFFMkIsR0FDekVFLEVBQW9EL0MsRUFBb0IsR0FDeEVnRCxFQUE0RGhELEVBQW9Ca0IsRUFBRTZCLEdBQ2xGRSxFQUFvRWpELEVBQW9CLEdBQ3hGa0QsRUFBNEVsRCxFQUFvQmtCLEVBQUUrQixHQUNsR0UsRUFBMERuRCxFQUFvQixHQUM5RW9ELEVBQWtFcEQsRUFBb0JrQixFQUFFaUMsR0FDN0dFLEVBQVN4QyxPQUFPeUMsUUFBUSxTQUFTQyxHQUFRLElBQUksR0FBSXBELEdBQUUsRUFBRUEsRUFBRXFELFVBQVVDLE9BQU90RCxJQUFJLENBQUMsR0FBSXVELEdBQU9GLFVBQVVyRCxFQUFHLEtBQUksR0FBSXdELEtBQU9ELEdBQVc3QyxPQUFPUyxVQUFVQyxlQUFlbEIsS0FBS3FELEVBQU9DLEtBQU1KLEVBQU9JLEdBQUtELEVBQU9DLElBQVEsTUFBT0osSUFBYUssRUFBYSxXQUFXLFFBQVNDLEdBQWlCTixFQUFPTyxHQUFPLElBQUksR0FBSTNELEdBQUUsRUFBRUEsRUFBRTJELEVBQU1MLE9BQU90RCxJQUFJLENBQUMsR0FBSTRELEdBQVdELEVBQU0zRCxFQUFHNEQsR0FBVy9DLFdBQVcrQyxFQUFXL0MsYUFBWSxFQUFNK0MsRUFBV2hELGNBQWEsRUFBUSxTQUFVZ0QsS0FBV0EsRUFBV3ZCLFVBQVMsR0FBSzNCLE9BQU9DLGVBQWV5QyxFQUFPUSxFQUFXSixJQUFJSSxJQUFjLE1BQU8sVUFBU2pDLEVBQVlrQyxFQUFXQyxHQUF1SSxNQUF2SEQsSUFBV0gsRUFBaUIvQixFQUFZUixVQUFVMEMsR0FBZUMsR0FBWUosRUFBaUIvQixFQUFZbUMsR0FBb0JuQyxNTzVHdHNCb0MsRUFBUSxTQUFDQyxHQUFELE1BQVdBLEdBQU0sSUFDekJDLEVBQU8sU0FBQ0QsR0FBRCxNQUFXQSxHQUFNQSxFQUFNVixPQUFTLElBQ3ZDWSxFQUFhLFNBQUNDLEdBQUQsTUFBb0Isa0JBQU5BLElBbUNaQyxFUHVFOHJELFNBQVNDLEdBQXFFLFFBQVNELEtBQWlCLEdBQUlFLEdBQVNDLEVBQU1DLEVBQU1DLENBQUtoRCxHQUFnQmlELEtBQUtOLEVBQWdCLEtBQUksR0FBSU8sR0FBS3RCLFVBQVVDLE9BQU9zQixFQUFLQyxNQUFNRixHQUFNRyxFQUFLLEVBQUVBLEVBQUtILEVBQUtHLElBQVFGLEVBQUtFLEdBQU16QixVQUFVeUIsRUFBTyxPQUFhUCxHQUFPQyxFQUFNM0MsRUFBMkI2QyxNQUFNSixFQUFLRixFQUFlN0IsV0FBVzdCLE9BQU9xRSxlQUFlWCxJQUFpQmxFLEtBQUs4RSxNQUFNVixHQUFNSSxNQUFNTyxPQUFPTCxLQUFlSixFT1U1b0VVLE1BQVEsaUJBQU1WLEdBQUtXLEtBQUtDLFVBQVVGLFNQVnVxRVYsRU9XenNFYSxhQUFlLGlCQUFNYixHQUFLVyxLQUFLQyxVQUFVQyxnQlBYMnVFYixFT1lweEVjLHNCQUF3QixpQkFBTWQsR0FBS1csS0FBS0MsVUFBVUUseUJQWit6RWQsRU9hajNFZSxTQUFXLGlCQUFNZixHQUFLVyxLQUFLQyxVQUFVRyxZUGIrNEVmLEVPY3A3RWdCLE9BQVMsaUJBQU1oQixHQUFLVyxLQUFLQyxVQUFVSSxVUGRnOUVoQixFT2VuL0VpQixTQUFXLFNBQUNwRixHQUFELE1BQVdtRSxHQUFLVyxLQUFLQyxVQUFVSyxTQUFTcEYsSVBmNmdGbUUsRU9pQmhrRmtCLElBQU0sU0FBQ0MsR0FDQ25CLEVBQUtiLE1BQU1pQyxPQUFPQyxRQUFRRixNQUFXLEdBQU1uQixFQUFLYixNQUFNbUMsZUFBZUgsSVBsQjZsRm5CLEVPNEUxcUZ1QixpQkFBbUIsU0FBQ0MsR0FDaEJ4QixFQUFLeUIsaUJBRUQvQixFQUFXTSxFQUFLYixNQUFNdUMsV0FBV0MsVUFDakMzQixFQUFLYixNQUFNdUMsV0FBV0MsUUFBUUgsSVBoRjB4RnhCLEVPb0ZoMEY0QixpQkFBbUIsU0FBQ0osR0FDaEJ4QixFQUFLeUIsaUJBRUQvQixFQUFXTSxFQUFLYixNQUFNdUMsV0FBV0csVUFDakM3QixFQUFLYixNQUFNdUMsV0FBV0csUUFBUUwsSVB4Rmc3RnhCLEVPNEZ0OUY4QixjQUFnQixTQUFDTixHQUNiLE9BQVFBLEVBQU1PLE9BQ2QsSUFBSyxJQUNEL0IsRUFBS2dDLG9CQUFvQlIsRUFBTVMsU0FDL0IsTUFFSixLQUFLLElBQ0RqQyxFQUFLa0MsZ0JBQWdCVixFQUFNUyxTQUMzQixNQUVKLEtBQUssR0FDR2pDLEVBQUtiLE1BQU1nRCxlQUFlckQsU0FDMUJrQixFQUFLb0MsT0FBT3BDLEVBQUtiLE1BQU1nRCxnQkFDdkJuQyxFQUFLVSxRQUdULE1BRUosS0FBSyxJQUNHYyxFQUFNYSxVQUNOYixFQUFNYyxpQkFFTnRDLEVBQUtVLFFBQ0xWLEVBQUtnQixTQUdMaEIsRUFBS3VDLDZCQUE4QixFQUVuQ3ZDLEVBQUtiLE1BQU1xRCxtQkFBbUJ4QyxFQUFLYixNQUFNaUMsU0FJN0MxQixFQUFXTSxFQUFLYixNQUFNc0QsWUFDdEJ6QyxFQUFLYixNQUFNc0QsVUFBVWpCLElQN0h3OER2QixFQUFnL0NGLEVBQU8xQyxFQUEyQjJDLEVBQU1DLEdBQW03SSxNQUFsc016QyxHQUFVb0MsRUFBZUMsR0FBNnZEWixFQUFhVyxJQUFpQlosSUFBSSxxQkFBcUJuRCxNQUFNLFNPbEI5aUg2RyxHQUNmLEdBQU1DLEdBQTBCRCxFQUFVUCxlQUNwQ1MsRUFBeUIxQyxLQUFLZixNQUFNZ0QsY0FNMUMsSUFKSWpDLEtBQUtmLE1BQU1pQyxPQUFPdEMsT0FBUzRELEVBQVV0QixPQUFPdEMsUUFDNUNvQixLQUFLZSxTQUFTLElBR2RmLEtBQUtxQyw0QkFHTCxZQUZBckMsS0FBS3FDLDZCQUE4QixFQUt2QyxJQUFPSSxJQUE0QkMsR0FDTSxJQUFsQ0EsRUFBdUI5RCxPQUFjLENBQ3hDLEdBQXlDLElBQWxDOEQsRUFBdUI5RCxRQUNoQjhELEVBQXVCLEtBQU9ELEVBQXdCLEdBQ2hFLE1BQU96QyxNQUFLUyxLQUFMLFNBQW1CaUMsRUFBdUIsSUFBTWxDLE9BQ3BELElBQUlqQixFQUFLbUQsS0FBNEJuRCxFQUFLa0QsR0FDN0MsTUFBT3pDLE1BQUtTLEtBQUwsU0FBbUJsQixFQUFLbUQsSUFBMkJsQyxPQUc5RFIsTUFBS1MsS0FBTCxTQUFtQmlDLEVBQXVCLElBQU1sQyxZUEw0dUkxQixJQUFJLFNBQVNuRCxNQUFNLFNPcUJoeklzRixHQUFPLEdBQUEwQixHQUFBM0MsS0FDSjRDLEdBQVd6QyxNQUFNMEMsUUFBUTVCLEdBQVNBLEdBQVNBLElBQVE2QixPQUFPLFNBQUNDLEdBQzdELE1BQU9KLEdBQUsxRCxNQUFNaUMsT0FBT0MsUUFBUTRCLE1BQVMsR0FHMUNILEdBQVFoRSxRQUFVb0IsS0FBS2YsTUFBTStELG1CQUFtQkosTVAxQjI5STlELElBQUksY0FBY25ELE1BQU0sU082Qi9oSnNGLEdBQ1JqQixLQUFLZixNQUFNcUQsb0JBQW9CckIsT1A5QitrSm5DLElBQUksZUFBZW5ELE1BQU0sU09pQzluSmlILEdBQ1Q1QyxLQUFLZixNQUFNcUQsbUJBQW1CTSxNUGxDbXJKOUQsSUFBSSxzQkFBc0JuRCxNQUFNLFNPcUNqdUpzSCxHQUNoQixHQUFNQyxHQUFXbEQsS0FBS2YsTUFBTWdELGVBQ3RCVyxFQUFVNUMsS0FBS2YsTUFBTWlDLE1BRTNCLElBQXdCLElBQXBCZ0MsRUFBU3RFLFFBQWdCUyxFQUFNNkQsS0FBYzdELEVBQU11RCxHQUl2RCxHQUF3QixJQUFwQk0sRUFBU3RFLE9BQ1RvQixLQUFLbUQsWUFBWTVELEVBQUtxRCxRQUNuQixDQUNILEdBQU1RLEdBQWdCUixFQUFRQSxFQUFRekIsUUFBUTlCLEVBQU02RCxJQUFhLEVBRWpFbEQsTUFBS3FELGFBQWFKLEdBQVVHLEdBQWU3QyxPQUFPMkMsSUFBYUUsUVBsRHNpS3RFLElBQUksa0JBQWtCbkQsTUFBTSxTT3NEem5Lc0gsR0FDWixHQUFNQyxHQUFXbEQsS0FBS2YsTUFBTWdELGVBQ3RCVyxFQUFVNUMsS0FBS2YsTUFBTWlDLE1BRTNCLElBQXdCLElBQXBCZ0MsRUFBU3RFLE9BSWIsR0FBSVcsRUFBSzJELEtBQWMzRCxFQUFLcUQsR0FDeEI1QyxLQUFLdUIsaUJBQ0x2QixLQUFLUSxZQUNGLENBQ0gsR0FBTThDLEdBQVlWLEVBQVFBLEVBQVF6QixRQUFRNUIsRUFBSzJELElBQWEsRUFFNURsRCxNQUFLcUQsYUFBYUosRUFBU0MsRUFBUzNDLE9BQU8rQyxJQUFjQSxRUHBFeTVLeEUsSUFBSSxpQkFBaUJuRCxNQUFNLFdPeUVqL0txRSxLQUFLZixNQUFNcUQsMEJQekVzaUx4RCxJQUFJLHdCQUF3Qm5ELE1BQU0sU09pSWprTHNGLEVBQU9LLEdBRXpCQSxFQUFNaUMsa0JBRU52RCxLQUFLa0MsT0FBT2pCLEdBQ1pqQixLQUFLUSxRQUVEUixLQUFLZixNQUFNdUUsb0JBQW9CdkUsTUFBTXdDLFNBQ3JDekIsS0FBS2YsTUFBTXVFLG9CQUFvQnZFLE1BQU13QyxRQUFRSCxNUHpJZ3ZMeEMsSUFBSSxtQkFBbUJuRCxNQUFNLFNPNklqekxzRixHQUNiLEdBQUlqQixLQUFLZixNQUFNd0Usa0JBQ1gsTUFBTzFGLEdBQUEyRixFQUFNQyxhQUFhM0QsS0FBS2YsTUFBTXVFLHFCQUNqQ0ksVUFBVzNGLElBQUcsMkJBQTRCK0IsS0FBS2YsTUFBTXVFLG9CQUFvQnZFLE1BQU0yRSxXQUMvRW5DLFFBQVN6QixLQUFLNkQsc0JBQXNCQyxLQUFLOUQsS0FBTWlCLFFQako4bU1uQyxJQUFJLHFCQUFxQm5ELE1BQU0sU09zSnJyTXNGLEVBQU9LLEdBQ3RCLE9BQVFBLEVBQU1PLE9BQ2QsSUFBSyxJQUNMLElBQUssSUFDRDdCLEtBQUttRCxZQUFZbEMsR0FDakJLLEVBQU1jLGdCQUNOLE1BRUosS0FBSyxHQUNEcEMsS0FBS2tDLE9BQU9qQixHQUNaakIsS0FBS1EsUUFDTGMsRUFBTWMscUJQaktxNE10RCxJQUFJLGVBQWVuRCxNQUFNLFdPc0s3NU0sR0FBQW9JLEdBQUEvRCxJQUNYLE9BQ0lqQyxHQUFBMkYsRUFBQU0sY0FBQSxPQUFLSixVQUFVLHVCQUNWNUQsS0FBS2YsTUFBTWlDLE9BQU8rQyxJQUFJLFNBQUNoRCxHQUNwQixNQUNJbEQsR0FBQTJGLEVBQUFNLGNBQUEsT0FDSUUsSUFBQSxTQUFjakQsRUFDZG5DLElBQUttQyxFQUNMMkMsVUFBVzNGLElBQUcsc0JBQ1hrRyw4QkFBK0JKLEVBQUs5RSxNQUFNZ0QsZUFBZWQsUUFBUUYsTUFBVyxJQUUvRVEsUUFBU3NDLEVBQUtaLFlBQVlXLEtBQWpCQyxFQUE0QjlDLEdBQ3JDc0IsVUFBV3dCLEVBQUtLLG1CQUFtQk4sS0FBeEJDLEVBQW1DOUMsR0FDOUNvRCxTQUFTLEtBQ1JOLEVBQUs5RSxNQUFNcUYsU0FBU3JELEdBQU9zRCxLQUMzQlIsRUFBS1MsaUJBQWlCdkQsVVByTDYvTm5DLElBQUksU0FBU25ELE1BQU0sV084TDNqTyxNQUNJb0MsR0FBQTJGLEVBQUFNLGNBQUEsTUFBQXhGLEtBQ1FELElBQUt5QixLQUFLZixNQUFPUyxFQUFlK0UsZUFDcENQLElBQUksVUFDSk4sVUFBVzNGLElBQUcsdUJBQXdCK0IsS0FBS2YsTUFBTTJFLFdBQ2pEckIsVUFBV3ZDLEtBQUs0QixnQkFDZjVCLEtBQUswRSxlQUVOM0csRUFBQTJGLEVBQUFNLGNBQUM3RixFQUFBdUYsRUFBRGxGLEtBQ1FILElBQWtCMkIsS0FBS2YsTUFBT2QsRUFBQXVGLEVBQVVpQixlQUM1Q1QsSUFBSSxZQUNKTixVQUFVLGVBQ1ZnQixrQkFBa0IsRUFDbEJwRCxXQUFBaEQsS0FDT3dCLEtBQUtmLE1BQU11QyxZQUNkQyxRQUFTekIsS0FBS3FCLGlCQUNkTSxRQUFTM0IsS0FBSzBCLG1CQUVsQm1ELGlCQUFrQjdFLEtBQUtnQixZUGhOZzVQdEIsR092RS80UDNCLEVBQUEyRixFQUFNb0IsY0FBN0JwRixHQUNWcUYsVVBzRXVoUXZHLEtPckV2aFFMLEVBQUF1RixFQUFVcUIsV0FLYjNELGVBQWdCdEQsRUFBQSxVQUFVa0gsS0FLMUJoQyxtQkFBb0JsRixFQUFBLFVBQVVrSCxLQUs5QjFDLG1CQUFvQnhFLEVBQUEsVUFBVWtILEtBSzlCeEIsb0JBQXFCMUYsRUFBQSxVQUFVbUgsUUFLL0J4QixrQkFBbUIzRixFQUFBLFVBQVVvSCxLQUs3QmhFLE9BQVFwRCxFQUFBLFVBQVVxSCxRQUFRckgsRUFBQSxVQUFVc0gsUUFLcENuRCxlQUFnQm5FLEVBQUEsVUFBVXFILFFBQVFySCxFQUFBLFVBQVVzSCxVQXJDL0IxRixFQXdDVmlGLGFQK0I4dVJuRyxLTzlCOXVSTCxFQUFBdUYsRUFBVWlCLGNBQ2J2RCxlQUFnQixhQUNoQjRCLG1CQUFvQixhQUNwQlYsbUJBQW9CLGFBQ3BCa0Isb0JBQXNCekYsRUFBQTJGLEVBQUFNLGNBQUEsZ0JBQ3RCUCxtQkFBbUIsRUFDbkJ2QyxVQUNBZSxvQkFoRGF2QyxFQW1EVitFLGFBQWV6SSxPQUFPcUosS0FBSzNGLEVBQWVpRixjUG9Ca3FTN0gsRUFBNkIsUU92RS90UzRDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDUpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdHlwZWFoZWFkXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb25cIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc190eXBlYWhlYWRfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb2JqZWN0X2ludGVyc2VjdGlvbl9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGZpcnN0PWZ1bmN0aW9uIGZpcnN0KGFycmF5KXtyZXR1cm4gYXJyYXlbMF07fTt2YXIgbGFzdD1mdW5jdGlvbiBsYXN0KGFycmF5KXtyZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoLTFdO307dmFyIGlzRnVuY3Rpb249ZnVuY3Rpb24gaXNGdW5jdGlvbih4KXtyZXR1cm4gdHlwZW9mIHg9PT0nZnVuY3Rpb24nO307dmFyIFRva2VuaXplZElucHV0PWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoVG9rZW5pemVkSW5wdXQsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIFRva2VuaXplZElucHV0KCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsVG9rZW5pemVkSW5wdXQpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9VG9rZW5pemVkSW5wdXQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoVG9rZW5pemVkSW5wdXQpKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5mb2N1cz1mdW5jdGlvbigpe3JldHVybiBfdGhpcy5yZWZzLnR5cGVhaGVhZC5mb2N1cygpO30sX3RoaXMuZ2V0SW5wdXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnJlZnMudHlwZWFoZWFkLmdldElucHV0Tm9kZSgpO30sX3RoaXMuZ2V0U2VsZWN0ZWRFbnRpdHlUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnJlZnMudHlwZWFoZWFkLmdldFNlbGVjdGVkRW50aXR5VGV4dCgpO30sX3RoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMucmVmcy50eXBlYWhlYWQuZ2V0VmFsdWUoKTt9LF90aGlzLnNlbGVjdD1mdW5jdGlvbigpe3JldHVybiBfdGhpcy5yZWZzLnR5cGVhaGVhZC5zZWxlY3QoKTt9LF90aGlzLnNldFZhbHVlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gX3RoaXMucmVmcy50eXBlYWhlYWQuc2V0VmFsdWUodmFsdWUpO30sX3RoaXMuYWRkPWZ1bmN0aW9uKGluZGV4KXtpZihfdGhpcy5wcm9wcy50b2tlbnMuaW5kZXhPZihpbmRleCk9PT0tMSl7X3RoaXMucHJvcHMuaGFuZGxlQWRkVG9rZW4oaW5kZXgpO319LF90aGlzLmhhbmRsZUlucHV0Q2xpY2s9ZnVuY3Rpb24oZXZlbnQpe190aGlzLmNsZWFyU2VsZWN0aW9uKCk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2spKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2soZXZlbnQpO319LF90aGlzLmhhbmRsZUlucHV0Rm9jdXM9ZnVuY3Rpb24oZXZlbnQpe190aGlzLmNsZWFyU2VsZWN0aW9uKCk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uRm9jdXMpKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uRm9jdXMoZXZlbnQpO319LF90aGlzLmhhbmRsZUtleURvd249ZnVuY3Rpb24oZXZlbnQpe3N3aXRjaChldmVudC53aGljaCl7Y2FzZSAzNzpfdGhpcy5zZWxlY3RQcmV2aW91c1Rva2VuKGV2ZW50LnNoaWZ0S2V5KTticmVhaztjYXNlIDM5Ol90aGlzLnNlbGVjdE5leHRUb2tlbihldmVudC5zaGlmdEtleSk7YnJlYWs7Y2FzZSA4OmlmKF90aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkLmxlbmd0aCl7X3RoaXMucmVtb3ZlKF90aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkKTtfdGhpcy5mb2N1cygpO31icmVhaztjYXNlIDY1OmlmKGV2ZW50Lm1ldGFLZXkpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X3RoaXMuZm9jdXMoKTtfdGhpcy5zZWxlY3QoKTtfdGhpcy5fc3VwcHJlc3NOZXh0VG9rZW5TZWxlY3Rpb249dHJ1ZTtfdGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oX3RoaXMucHJvcHMudG9rZW5zKTt9fWlmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMub25LZXlEb3duKSl7X3RoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhUb2tlbml6ZWRJbnB1dCxbe2tleTonY29tcG9uZW50RGlkVXBkYXRlJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKXt2YXIgcHJldmlvdXNTZWxlY3RlZEluZGV4ZXM9cHJldlByb3BzLnRva2Vuc1NlbGVjdGVkO3ZhciBjdXJyZW50U2VsZWN0ZWRJbmRleGVzPXRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQ7aWYodGhpcy5wcm9wcy50b2tlbnMubGVuZ3RoPnByZXZQcm9wcy50b2tlbnMubGVuZ3RoKXt0aGlzLnNldFZhbHVlKCcnKTt9aWYodGhpcy5fc3VwcHJlc3NOZXh0VG9rZW5TZWxlY3Rpb24pe3RoaXMuX3N1cHByZXNzTmV4dFRva2VuU2VsZWN0aW9uPWZhbHNlO3JldHVybjt9aWYocHJldmlvdXNTZWxlY3RlZEluZGV4ZXMhPT1jdXJyZW50U2VsZWN0ZWRJbmRleGVzJiZjdXJyZW50U2VsZWN0ZWRJbmRleGVzLmxlbmd0aCE9PTApe2lmKGN1cnJlbnRTZWxlY3RlZEluZGV4ZXMubGVuZ3RoPT09MXx8Y3VycmVudFNlbGVjdGVkSW5kZXhlc1swXSE9PXByZXZpb3VzU2VsZWN0ZWRJbmRleGVzWzBdKXtyZXR1cm4gdGhpcy5yZWZzWyd0b2tlbl8nK2N1cnJlbnRTZWxlY3RlZEluZGV4ZXNbMF1dLmZvY3VzKCk7fWVsc2UgaWYobGFzdChjdXJyZW50U2VsZWN0ZWRJbmRleGVzKSE9PWxhc3QocHJldmlvdXNTZWxlY3RlZEluZGV4ZXMpKXtyZXR1cm4gdGhpcy5yZWZzWyd0b2tlbl8nK2xhc3QoY3VycmVudFNlbGVjdGVkSW5kZXhlcyldLmZvY3VzKCk7fXRoaXMucmVmc1sndG9rZW5fJytjdXJyZW50U2VsZWN0ZWRJbmRleGVzWzBdXS5mb2N1cygpO319fSx7a2V5OidyZW1vdmUnLHZhbHVlOmZ1bmN0aW9uIHJlbW92ZShpbmRleCl7dmFyIF90aGlzMj10aGlzO3ZhciBpbmRleGVzPShBcnJheS5pc0FycmF5KGluZGV4KT9pbmRleDpbaW5kZXhdKS5maWx0ZXIoZnVuY3Rpb24oaWR4KXtyZXR1cm4gX3RoaXMyLnByb3BzLnRva2Vucy5pbmRleE9mKGlkeCkhPT0tMTt9KTtpZihpbmRleGVzLmxlbmd0aCl7dGhpcy5wcm9wcy5oYW5kbGVSZW1vdmVUb2tlbnMoaW5kZXhlcyk7fX19LHtrZXk6J3NlbGVjdFRva2VuJyx2YWx1ZTpmdW5jdGlvbiBzZWxlY3RUb2tlbihpbmRleCl7dGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oW2luZGV4XSk7fX0se2tleTonc2VsZWN0VG9rZW5zJyx2YWx1ZTpmdW5jdGlvbiBzZWxlY3RUb2tlbnMoaW5kZXhlcyl7dGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oaW5kZXhlcyk7fX0se2tleTonc2VsZWN0UHJldmlvdXNUb2tlbicsdmFsdWU6ZnVuY3Rpb24gc2VsZWN0UHJldmlvdXNUb2tlbihhcHBlbmQpe3ZhciBzZWxlY3RlZD10aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkO3ZhciBpbmRleGVzPXRoaXMucHJvcHMudG9rZW5zO2lmKHNlbGVjdGVkLmxlbmd0aD09PTEmJmZpcnN0KHNlbGVjdGVkKT09PWZpcnN0KGluZGV4ZXMpKXtyZXR1cm47fWlmKHNlbGVjdGVkLmxlbmd0aD09PTApe3RoaXMuc2VsZWN0VG9rZW4obGFzdChpbmRleGVzKSk7fWVsc2V7dmFyIHByZXZpb3VzVG9rZW49aW5kZXhlc1tpbmRleGVzLmluZGV4T2YoZmlyc3Qoc2VsZWN0ZWQpKS0xXTt0aGlzLnNlbGVjdFRva2VucyhhcHBlbmQ/W3ByZXZpb3VzVG9rZW5dLmNvbmNhdChzZWxlY3RlZCk6W3ByZXZpb3VzVG9rZW5dKTt9fX0se2tleTonc2VsZWN0TmV4dFRva2VuJyx2YWx1ZTpmdW5jdGlvbiBzZWxlY3ROZXh0VG9rZW4oYXBwZW5kKXt2YXIgc2VsZWN0ZWQ9dGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZDt2YXIgaW5kZXhlcz10aGlzLnByb3BzLnRva2VucztpZihzZWxlY3RlZC5sZW5ndGg9PT0wKXtyZXR1cm47fWlmKGxhc3Qoc2VsZWN0ZWQpPT09bGFzdChpbmRleGVzKSl7dGhpcy5jbGVhclNlbGVjdGlvbigpO3RoaXMuZm9jdXMoKTt9ZWxzZXt2YXIgbmV4dFRva2VuPWluZGV4ZXNbaW5kZXhlcy5pbmRleE9mKGxhc3Qoc2VsZWN0ZWQpKSsxXTt0aGlzLnNlbGVjdFRva2VucyhhcHBlbmQ/c2VsZWN0ZWQuY29uY2F0KG5leHRUb2tlbik6W25leHRUb2tlbl0pO319fSx7a2V5OidjbGVhclNlbGVjdGlvbicsdmFsdWU6ZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKXt0aGlzLnByb3BzLmhhbmRsZU5ld1NlbGVjdGlvbihbXSk7fX0se2tleTonaGFuZGxlVG9rZW5DbG9zZUNsaWNrJyx2YWx1ZTpmdW5jdGlvbiBoYW5kbGVUb2tlbkNsb3NlQ2xpY2soaW5kZXgsZXZlbnQpe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3RoaXMucmVtb3ZlKGluZGV4KTt0aGlzLmZvY3VzKCk7aWYodGhpcy5wcm9wcy50b2tlbkNsb3NlQ29tcG9uZW50LnByb3BzLm9uQ2xpY2spe3RoaXMucHJvcHMudG9rZW5DbG9zZUNvbXBvbmVudC5wcm9wcy5vbkNsaWNrKGV2ZW50KTt9fX0se2tleToncmVuZGVyVG9rZW5DbG9zZScsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyVG9rZW5DbG9zZShpbmRleCl7aWYodGhpcy5wcm9wcy50b2tlbkNsb3NlVmlzaWJsZSl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jbG9uZUVsZW1lbnQodGhpcy5wcm9wcy50b2tlbkNsb3NlQ29tcG9uZW50LHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItdG9rZW5maWVsZC10b2tlbi1jbG9zZScsdGhpcy5wcm9wcy50b2tlbkNsb3NlQ29tcG9uZW50LnByb3BzLmNsYXNzTmFtZSksb25DbGljazp0aGlzLmhhbmRsZVRva2VuQ2xvc2VDbGljay5iaW5kKHRoaXMsaW5kZXgpfSk7fX19LHtrZXk6J2hhbmRsZVRva2VuS2V5RG93bicsdmFsdWU6ZnVuY3Rpb24gaGFuZGxlVG9rZW5LZXlEb3duKGluZGV4LGV2ZW50KXtzd2l0Y2goZXZlbnQud2hpY2gpe2Nhc2UgMTM6Y2FzZSAzMjp0aGlzLnNlbGVjdFRva2VuKGluZGV4KTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgODp0aGlzLnJlbW92ZShpbmRleCk7dGhpcy5mb2N1cygpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7fX19LHtrZXk6J3JlbmRlclRva2VucycsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyVG9rZW5zKCl7dmFyIF90aGlzMz10aGlzO3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2Jyx7Y2xhc3NOYW1lOidiLXRva2VuZmllbGQtdG9rZW5zJ30sdGhpcy5wcm9wcy50b2tlbnMubWFwKGZ1bmN0aW9uKGluZGV4KXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2Rpdicse3JlZjondG9rZW5fJytpbmRleCxrZXk6aW5kZXgsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXRva2VuZmllbGQtdG9rZW4nLHsnYi10b2tlbmZpZWxkLXRva2VuLXNlbGVjdGVkJzpfdGhpczMucHJvcHMudG9rZW5zU2VsZWN0ZWQuaW5kZXhPZihpbmRleCkhPT0tMX0pLG9uQ2xpY2s6X3RoaXMzLnNlbGVjdFRva2VuLmJpbmQoX3RoaXMzLGluZGV4KSxvbktleURvd246X3RoaXMzLmhhbmRsZVRva2VuS2V5RG93bi5iaW5kKF90aGlzMyxpbmRleCksdGFiSW5kZXg6JzAnfSxfdGhpczMucHJvcHMuZW50aXRpZXNbaW5kZXhdLnRleHQsX3RoaXMzLnJlbmRlclRva2VuQ2xvc2UoaW5kZXgpKTt9KSk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0KCkodGhpcy5wcm9wcyxUb2tlbml6ZWRJbnB1dC5pbnRlcm5hbEtleXMpLHtyZWY6J3dyYXBwZXInLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi10b2tlbmZpZWxkLXdyYXBwZXInLHRoaXMucHJvcHMuY2xhc3NOYW1lKSxvbktleURvd246dGhpcy5oYW5kbGVLZXlEb3dufSksdGhpcy5yZW5kZXJUb2tlbnMoKSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fX2RlZmF1bHQuYSxfZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29iamVjdF9pbnRlcnNlY3Rpb25fX19kZWZhdWx0KCkodGhpcy5wcm9wcyxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fX2RlZmF1bHQuYS5kZWZhdWx0UHJvcHMpLHtyZWY6J3R5cGVhaGVhZCcsY2xhc3NOYW1lOidiLXRva2VuZmllbGQnLGNsZWFyT25TZWxlY3Rpb246dHJ1ZSxpbnB1dFByb3BzOl9leHRlbmRzKHt9LHRoaXMucHJvcHMuaW5wdXRQcm9wcyx7b25DbGljazp0aGlzLmhhbmRsZUlucHV0Q2xpY2ssb25Gb2N1czp0aGlzLmhhbmRsZUlucHV0Rm9jdXN9KSxvbkVudGl0eVNlbGVjdGVkOnRoaXMuYWRkfSkpKTt9fV0pO3JldHVybiBUb2tlbml6ZWRJbnB1dDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtUb2tlbml6ZWRJbnB1dC5wcm9wVHlwZXM9X2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc190eXBlYWhlYWRfX19kZWZhdWx0LmEucHJvcFR5cGVzLHtoYW5kbGVBZGRUb2tlbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLGhhbmRsZVJlbW92ZVRva2VuczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLGhhbmRsZU5ld1NlbGVjdGlvbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLHRva2VuQ2xvc2VDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZWxlbWVudCx0b2tlbkNsb3NlVmlzaWJsZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLHRva2VuczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hcnJheU9mKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm51bWJlciksdG9rZW5zU2VsZWN0ZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYXJyYXlPZihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5udW1iZXIpfSk7VG9rZW5pemVkSW5wdXQuZGVmYXVsdFByb3BzPV9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdHlwZWFoZWFkX19fZGVmYXVsdC5hLmRlZmF1bHRQcm9wcyx7aGFuZGxlQWRkVG9rZW46ZnVuY3Rpb24gaGFuZGxlQWRkVG9rZW4oKXt9LGhhbmRsZVJlbW92ZVRva2VuczpmdW5jdGlvbiBoYW5kbGVSZW1vdmVUb2tlbnMoKXt9LGhhbmRsZU5ld1NlbGVjdGlvbjpmdW5jdGlvbiBoYW5kbGVOZXdTZWxlY3Rpb24oKXt9LHRva2VuQ2xvc2VDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsbnVsbCwnWCcpLHRva2VuQ2xvc2VWaXNpYmxlOnRydWUsdG9rZW5zOltdLHRva2Vuc1NlbGVjdGVkOltdfSk7VG9rZW5pemVkSW5wdXQuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKFRva2VuaXplZElucHV0LmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IFRva2VuaXplZElucHV0O1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYTkxYzEzMTNjMmNiN2I0ZWM5ZDEiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdHlwZWFoZWFkXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXR5cGVhaGVhZFwifVxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb2JqZWN0LWludGVyc2VjdGlvblwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBUeXBlYWhlYWQgZnJvbSAnYm91bmRsZXNzLXR5cGVhaGVhZCc7XG5pbXBvcnQgZXh0cmFjdENoaWxkUHJvcHMgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb24nO1xuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5cbmNvbnN0IGZpcnN0ID0gKGFycmF5KSA9PiBhcnJheVswXTtcbmNvbnN0IGxhc3QgPSAoYXJyYXkpID0+IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcblxuLyoqXG5fX0Rpc3RpbGwgcmljaCBlbnRpdHkgZGF0YSBtYXRjaGVkIHZpYSB0eXBlYWhlYWQgaW5wdXQgaW50byBzaW1wbGUgdmlzdWFsIGFic3RyYWN0aW9ucy5fX1xuXG5CYXNpYyB1c2FnZSBvZiB0aGlzIGNvbXBvbmVudCBpcyBpZGVudGljYWwgdG8gdGhhdCBvZiBbVHlwZWFoZWFkXShodHRwczovL2dpdGh1Yi5jb20vZW5pZ21hLWlvL2JvdW5kbGVzcy9tYXN0ZXIvcGFja2FnZXMvYm91bmRsZXNzLXR5cGVhaGVhZCkuIEFkZGl0aW9uYWwgcHJvcHMgYXJlIGF2YWlsYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgdG9rZW5pemF0aW9uIGZ1bmN0aW9uYWxpdHkuXG5cbiMjIENvbXBvbmVudCBJbnN0YW5jZSBNZXRob2RzXG5cbldoZW4gdXNpbmcgYFRva2VuaXplZElucHV0YCBpbiB5b3VyIHByb2plY3QsIHlvdSBtYXkgY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gYSByZW5kZXJlZCBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiBVc2UgW2ByZWZzYF0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9yZWZzLWFuZC10aGUtZG9tLmh0bWwpIHRvIGdldCB0aGUgaW5zdGFuY2UuXG5cbi0gX19gYWRkKGluZGV4OiBudW1iZXIpYF9fXG4gIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlcyBhIHRva2VuIGZvciBgcHJvcHMuZW50aXRpZXNbaW5kZXhdYDsgYHByb3BzLmhhbmRsZUFkZFRva2VuYCB3aWxsIGJlIGNhbGxlZCBhcyBhIGhpbnQgdG8gcGVyc2lzdCB0aGUgY2hhbmdlIGluIHlvdXIgY29udHJvbGxlciB2aWV3IG9yIG90aGVyIGFwcGxpY2F0aW9uIHN0YXRlXG5cbi0gX19gZm9jdXMoKWBfX1xuICBmb2N1c2VzIHRoZSBicm93c2VyIG9vbiB0aGUgdW5kZXJseWluZyB0ZXh0dWFsIGlucHV0IGZvciBpbW1lZGlhdGUgdGV4dCBlbnRyeVxuXG4tIF9fYGdldElucHV0Tm9kZSgpYF9fXG4gIHJldHVybnMgdGhlIHJhdyB1bmRlcmx5aW5nIHRleHR1YWwgaW5wdXQgRE9NIG5vZGVcblxuLSBfX2BnZXRTZWxlY3RlZEVudGl0eVRleHQoKWBfX1xuICByZXR1cm5zIHRoZSBgdGV4dGAgcHJvcGVydHkgb2YgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBlbnRpdHkgKGZyb20gYHByb3BzLmVudGl0aWVzYCksIG9yIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nXG5cbi0gX19gZ2V0VmFsdWUoKWBfX1xuICByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgdGV4dHVhbCBpbnB1dFxuXG4tIF9fYHJlbW92ZShpbmRleDogbnVtYmVyKWBfX1xuICBwcm9ncmFtbWF0aWNhbGx5IHJlbW92ZXMgdGhlIHRva2VuIGZvciBgcHJvcHMuZW50aXRpZXNbaW5kZXhdYDsgYHByb3BzLmhhbmRsZVJlbW92ZVRva2Vuc2Agd2lsbCBiZSBjYWxsZWQgYXMgYSBoaW50IHRvIHBlcnNpc3QgdGhlIGNoYW5nZSBpbiB5b3VyIGNvbnRyb2xsZXIgdmlldyBvciBvdGhlciBhcHBsaWNhdGlvbiBzdGF0ZVxuXG4tIF9fYHNlbGVjdCgpYF9fXG4gIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlcyBhIGZ1bGwgc2VsZWN0aW9uIG9uIHRoZSB1bmRlcmx5aW5nIHRleHR1YWwgaW5wdXQgc3VjaCB0aGF0IGEgcHJlc3Mgb2YgdGhlIEJhY2tzcGFjZSBrZXkgd291bGQgZnVsbHkgY2xlYXIgdGhlIGlucHV0XG5cbi0gX19gc2V0VmFsdWUodmFsdWU6IHN0cmluZylgX19cbiAgc2V0cyB0aGUgdW5kZXJseWluZyB0ZXh0dWFsIGlucHV0IHRvIHRoZSBzcGVjaWZpZWQgdGV4dCBhbmQgdXBkYXRlcyBpbnRlcm5hbCBzdGF0ZTsgZG8gbm90IHVzZSB0aGlzIG1ldGhvZCB3aGVuIHVzaW5nIGBUeXBlYWhlYWRgIGFzIGEgXCJjb250cm9sbGVkIGlucHV0XCJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5pemVkSW5wdXQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAuLi5UeXBlYWhlYWQucHJvcFR5cGVzLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBmdW5jdGlvbiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gYW4gZW50aXR5IGlzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGFuZCBhIHRva2VuIHNob3VsZCBiZSBjcmVhdGVkXG4gICAgICAgICAqL1xuICAgICAgICBoYW5kbGVBZGRUb2tlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGZ1bmN0aW9uIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSB0b2tlbnMgYXJlIHJlbW92ZWQgYnkgdGhlIHVzZXIgdmlhIGNsaWNraW5nIHRoZSBcImNsb3NlXCIgYnV0dG9uIG9yIHByZXNzaW5nIHRoZSBgQmFja3NwYWNlYCBrZXkgd2hpbGUgdG9rZW5zIGFyZSBzZWxlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgaGFuZGxlUmVtb3ZlVG9rZW5zOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZnVuY3Rpb24gaGFuZGxlciB0aGF0IGlzIGNhbGxlZCB3aGVuIG9uZSBvciBtb3JlIHRva2VucyBhcmUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgdmlhIGNsaWNrIG9yIGtleWJvYXJkIGFjdGlvbnM7IGNhbGxlZCB3aXRoIHdoYXQgdGhlIG5ldyBzZWxlY3Rpb24gc2hvdWxkIGJlXG4gICAgICAgICAqL1xuICAgICAgICBoYW5kbGVOZXdTZWxlY3Rpb246IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgSlNYIHVzZWQgZm9yIHRoZSBjbG9zZSBidXR0b24gaXRzZWxmXG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbkNsb3NlQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZGV0ZXJtaW5lcyBpZiB0aGUgYC5iLXRva2VuZmllbGQtdG9rZW4tY2xvc2VgIGVsZW1lbnQgc2hvdWxkIGJlIHJlbmRlcmVkIGZvciBlYWNoIHRva2VuXG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbkNsb3NlVmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBpbmRleGVzIG9mIGVudGl0aWVzIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIFwidG9rZW5zXCIgaW4gdGhlIGNvbXBvbmVudCBVSVxuICAgICAgICAgKi9cbiAgICAgICAgdG9rZW5zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIGluZGV4ZXMgb2YgdG9rZW5pemVkIGVudGl0aWVzIHRoYXQgYXJlIHBhcnQgb2YgYW4gYWN0aXZlIHNlbGVjdGlvbjsgdGhlIHVzZXIgY2FuIHByZXNzIGBCYWNrc3BhY2VgIHRvIHRyaWdnZXIgYGhhbmRsZVJlbW92ZVRva2Vuc2BcbiAgICAgICAgICovXG4gICAgICAgIHRva2Vuc1NlbGVjdGVkOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICAuLi5UeXBlYWhlYWQuZGVmYXVsdFByb3BzLFxuICAgICAgICBoYW5kbGVBZGRUb2tlbjogKCkgPT4ge30sXG4gICAgICAgIGhhbmRsZVJlbW92ZVRva2VuczogKCkgPT4ge30sXG4gICAgICAgIGhhbmRsZU5ld1NlbGVjdGlvbjogKCkgPT4ge30sXG4gICAgICAgIHRva2VuQ2xvc2VDb21wb25lbnQ6ICg8ZGl2Plg8L2Rpdj4pLFxuICAgICAgICB0b2tlbkNsb3NlVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgdG9rZW5zOiBbXSxcbiAgICAgICAgdG9rZW5zU2VsZWN0ZWQ6IFtdLFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhUb2tlbml6ZWRJbnB1dC5kZWZhdWx0UHJvcHMpXG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzID0gcHJldlByb3BzLnRva2Vuc1NlbGVjdGVkO1xuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJbmRleGVzID0gdGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZDtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy50b2tlbnMubGVuZ3RoID4gcHJldlByb3BzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3N1cHByZXNzTmV4dFRva2VuU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBwcmVzc05leHRUb2tlblNlbGVjdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoICAgcHJldmlvdXNTZWxlY3RlZEluZGV4ZXMgIT09IGN1cnJlbnRTZWxlY3RlZEluZGV4ZXNcbiAgICAgICAgICAgICYmIGN1cnJlbnRTZWxlY3RlZEluZGV4ZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAoICAgY3VycmVudFNlbGVjdGVkSW5kZXhlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgfHwgY3VycmVudFNlbGVjdGVkSW5kZXhlc1swXSAhPT0gcHJldmlvdXNTZWxlY3RlZEluZGV4ZXNbMF0gLyogbXVsdGkgc2VsZWN0aW9uLCBsZWZ0d2FyZCAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnNbYHRva2VuXyR7Y3VycmVudFNlbGVjdGVkSW5kZXhlc1swXX1gXS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0KGN1cnJlbnRTZWxlY3RlZEluZGV4ZXMpICE9PSBsYXN0KHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzKSAvKiBtdWx0aSBzZWxlY3Rpb24sIHJpZ2h0d2FyZCAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnNbYHRva2VuXyR7bGFzdChjdXJyZW50U2VsZWN0ZWRJbmRleGVzKX1gXS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlZnNbYHRva2VuXyR7Y3VycmVudFNlbGVjdGVkSW5kZXhlc1swXX1gXS5mb2N1cygpO1xuICAgICAgICB9IC8vIG1vdmUgZm9jdXNcbiAgICB9XG5cbiAgICAvLyBwYXNzdGhyb3VnaHMgdG8gVHlwZWFoZWFkIGluc3RhbmNlIG1ldGhvZHNcbiAgICBmb2N1cyA9ICgpID0+IHRoaXMucmVmcy50eXBlYWhlYWQuZm9jdXMoKVxuICAgIGdldElucHV0Tm9kZSA9ICgpID0+IHRoaXMucmVmcy50eXBlYWhlYWQuZ2V0SW5wdXROb2RlKClcbiAgICBnZXRTZWxlY3RlZEVudGl0eVRleHQgPSAoKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLmdldFNlbGVjdGVkRW50aXR5VGV4dCgpXG4gICAgZ2V0VmFsdWUgPSAoKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLmdldFZhbHVlKClcbiAgICBzZWxlY3QgPSAoKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLnNlbGVjdCgpXG4gICAgc2V0VmFsdWUgPSAodmFsdWUpID0+IHRoaXMucmVmcy50eXBlYWhlYWQuc2V0VmFsdWUodmFsdWUpXG5cbiAgICBhZGQgPSAoaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMudG9rZW5zLmluZGV4T2YoaW5kZXgpID09PSAtMSkgeyB0aGlzLnByb3BzLmhhbmRsZUFkZFRva2VuKGluZGV4KTsgfVxuICAgIH1cblxuICAgIHJlbW92ZShpbmRleCkge1xuICAgICAgICBjb25zdCBpbmRleGVzID0gKEFycmF5LmlzQXJyYXkoaW5kZXgpID8gaW5kZXggOiBbaW5kZXhdKS5maWx0ZXIoKGlkeCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudG9rZW5zLmluZGV4T2YoaWR4KSAhPT0gLTE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleGVzLmxlbmd0aCkgeyB0aGlzLnByb3BzLmhhbmRsZVJlbW92ZVRva2VucyhpbmRleGVzKTsgfVxuICAgIH1cblxuICAgIHNlbGVjdFRva2VuKGluZGV4KSB7XG4gICAgICAgIHRoaXMucHJvcHMuaGFuZGxlTmV3U2VsZWN0aW9uKFtpbmRleF0pO1xuICAgIH1cblxuICAgIHNlbGVjdFRva2VucyhpbmRleGVzKSB7XG4gICAgICAgIHRoaXMucHJvcHMuaGFuZGxlTmV3U2VsZWN0aW9uKGluZGV4ZXMpO1xuICAgIH1cblxuICAgIHNlbGVjdFByZXZpb3VzVG9rZW4oYXBwZW5kKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZDtcbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IHRoaXMucHJvcHMudG9rZW5zO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEgJiYgZmlyc3Qoc2VsZWN0ZWQpID09PSBmaXJzdChpbmRleGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGF0IGxlZnRtb3N0IGJvdW5kXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7IC8vIHBpY2sgdGhlIHJpZ2h0bW9zdFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RUb2tlbihsYXN0KGluZGV4ZXMpKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gYWRkIHRoZSBuZXh0IGxlZnRtb3N0IHRvIGEgcmVjb25zdHJ1Y3RlZCBcInNlbGVjdGVkXCIgYXJyYXlcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVG9rZW4gPSBpbmRleGVzW2luZGV4ZXMuaW5kZXhPZihmaXJzdChzZWxlY3RlZCkpIC0gMV07XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0VG9rZW5zKGFwcGVuZCA/IFtwcmV2aW91c1Rva2VuXS5jb25jYXQoc2VsZWN0ZWQpIDogW3ByZXZpb3VzVG9rZW5dKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdE5leHRUb2tlbihhcHBlbmQpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkO1xuICAgICAgICBjb25zdCBpbmRleGVzID0gdGhpcy5wcm9wcy50b2tlbnM7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3Qoc2VsZWN0ZWQpID09PSBsYXN0KGluZGV4ZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0VG9rZW4gPSBpbmRleGVzW2luZGV4ZXMuaW5kZXhPZihsYXN0KHNlbGVjdGVkKSkgKyAxXTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RUb2tlbnMoYXBwZW5kID8gc2VsZWN0ZWQuY29uY2F0KG5leHRUb2tlbikgOiBbbmV4dFRva2VuXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oW10pO1xuICAgIH1cblxuICAgIGhhbmRsZUlucHV0Q2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNsaWNrKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2soZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlSW5wdXRGb2N1cyA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uRm9jdXMpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25Gb2N1cyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgY2FzZSAzNzogICAgLy8gbGVmdCBhcnJvd1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RQcmV2aW91c1Rva2VuKGV2ZW50LnNoaWZ0S2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzk6ICAgIC8vIHJpZ2h0IGFycm93XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5leHRUb2tlbihldmVudC5zaGlmdEtleSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDg6ICAgICAvLyBiYWNrc3BhY2VcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA2NTogICAgLy8gbGV0dGVyIFwiYVwiXG4gICAgICAgICAgICBpZiAoZXZlbnQubWV0YUtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoKTtcblxuICAgICAgICAgICAgICAgIC8vIGhhY2t5LCBidXQgdGhlIG9ubHkgd2F5IHVubGVzcyB3ZSBtb3ZlIHNlbGVjdGlvbiBtYW5hZ2VtZW50IGludGVybmFsIGFnYWluXG4gICAgICAgICAgICAgICAgdGhpcy5fc3VwcHJlc3NOZXh0VG9rZW5TZWxlY3Rpb24gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24odGhpcy5wcm9wcy50b2tlbnMpO1xuICAgICAgICAgICAgfSAvLyBcImNtZFwiXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzLnByb3BzLm9uS2V5RG93bikpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVRva2VuQ2xvc2VDbGljayhpbmRleCwgZXZlbnQpIHtcbiAgICAgICAgLy8gaWYgd2UgZG9uJ3Qgc3RvcCBwcm9wYWdhdGlvbiwgdGhlIGV2ZW50IGJ1YmJsZXMgYW5kIHJlc3VsdHMgaW4gYSBmYWlsZWQgdG9rZW4gc2VsZWN0aW9uXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnRva2VuQ2xvc2VDb21wb25lbnQucHJvcHMub25DbGljaykge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy50b2tlbkNsb3NlQ29tcG9uZW50LnByb3BzLm9uQ2xpY2soZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyVG9rZW5DbG9zZShpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy50b2tlbkNsb3NlVmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudCh0aGlzLnByb3BzLnRva2VuQ2xvc2VDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGN4KCdiLXRva2VuZmllbGQtdG9rZW4tY2xvc2UnLCB0aGlzLnByb3BzLnRva2VuQ2xvc2VDb21wb25lbnQucHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZVRva2VuQ2xvc2VDbGljay5iaW5kKHRoaXMsIGluZGV4KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlVG9rZW5LZXlEb3duKGluZGV4LCBldmVudCkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAgIGNhc2UgMTM6IC8vIGVudGVyXG4gICAgICAgIGNhc2UgMzI6IC8vIHNwYWNlXG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRva2VuKGluZGV4KTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDg6IC8vIGJhY2tzcGFjZVxuICAgICAgICAgICAgdGhpcy5yZW1vdmUoaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyVG9rZW5zKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2ItdG9rZW5maWVsZC10b2tlbnMnPlxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnRva2Vucy5tYXAoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtgdG9rZW5fJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi10b2tlbmZpZWxkLXRva2VuJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiLXRva2VuZmllbGQtdG9rZW4tc2VsZWN0ZWQnOiB0aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkLmluZGV4T2YoaW5kZXgpICE9PSAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNlbGVjdFRva2VuLmJpbmQodGhpcywgaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5oYW5kbGVUb2tlbktleURvd24uYmluZCh0aGlzLCBpbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg9JzAnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmVudGl0aWVzW2luZGV4XS50ZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclRva2VuQ2xvc2UoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgVG9rZW5pemVkSW5wdXQuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J3dyYXBwZXInXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi10b2tlbmZpZWxkLXdyYXBwZXInLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclRva2VucygpfVxuXG4gICAgICAgICAgICAgICAgPFR5cGVhaGVhZFxuICAgICAgICAgICAgICAgICAgICB7Li4uZXh0cmFjdENoaWxkUHJvcHModGhpcy5wcm9wcywgVHlwZWFoZWFkLmRlZmF1bHRQcm9wcyl9XG4gICAgICAgICAgICAgICAgICAgIHJlZj0ndHlwZWFoZWFkJ1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2ItdG9rZW5maWVsZCdcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJPblNlbGVjdGlvbj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm9wcz17e1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5wcm9wcy5pbnB1dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVJbnB1dENsaWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Gb2N1czogdGhpcy5oYW5kbGVJbnB1dEZvY3VzLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBvbkVudGl0eVNlbGVjdGVkPXt0aGlzLmFkZH0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy10b2tlbml6ZWQtaW5wdXQvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 |