| 1
2 | 10x
| module.exports=function(e){function t(n){Iif(o[n])return o[n].exports;var r=o[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var o={};return t.m=e,t.c=o,t.i=function(e){return e},t.d=function(e,o,n){t.o(e,o)||Object.defineProperty(e,o,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(o,"a",o),o},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=9)}([function(e,t){e.exports=require("boundless-arrow-key-navigation")},function(e,t){e.exports=require("boundless-async")},function(e,t){e.exports=require("boundless-segmented-control")},function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-uuid")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("lodash.isinteger")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,o){"use strict";function n(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(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 a(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 s=o(7),p=o.n(s),u=o(8),l=(o.n(u),o(5)),c=o.n(l),m=o(6),P=o.n(m),g=o(1),d=o.n(g),f=o(2),T=o.n(f),h=o(0),b=o.n(h),I=o(3),y=o.n(I),C=o(4),v=o.n(C),O=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var n in o)Object.prototype.hasOwnProperty.call(o,n)&&(e[n]=o[n])}return e},x=function(){function e(e,t){for(var o=0;o<t.length;o++){var n=t[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),w=function(e){return e},N=function(e){return"function"==typeof e},E=function(){},A=function(e){function t(){var e,o,n,a;r(this,t);for(var s=arguments.length,p=Array(s),u=0;u<s;u++)p[u]=arguments[u];return o=n=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),n.mounted=!1,n.state={currentPage:n.props.initialPage,targetIndex:(n.props.initialPage-1)*n.props.numItemsPerPage},n.currentPage=function(){return n.state.currentPage},n.getPageForIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.props.numItemsPerPage;return Math.ceil((e+1)/t)},n.totalPages=function(){return Math.ceil(n.props.totalItems/n.props.numItemsPerPage)},n.firstVisibleItemIndex=function(){return(n.currentPage()-1)*n.props.numItemsPerPage},n.jumpToIndex=function(e){if(e<0||e>=n.props.totalItems)throw Error("Cannot page to invalid index "+e+".");n.setState({currentPage:n.getPageForIndex(e),targetIndex:e})},n.handlePageSelected=function(e){var o=void 0;switch(e[t.CONTROL_DATA_ATTRIBUTE]){case void 0:return;case t.control.FIRST:o=0;break;case t.control.PREVIOUS:o=n.firstVisibleItemIndex()-n.props.numItemsPerPage;break;case t.control.NEXT:o=n.firstVisibleItemIndex()+n.props.numItemsPerPage;break;case t.control.LAST:o=n.props.totalItems-1;break;default:o=parseInt(e[t.CONTROL_DATA_ATTRIBUTE],10)*n.props.numItemsPerPage-1}n.setState({currentPage:n.getPageForIndex(o),targetIndex:o})},n.handleItemPromiseFulfillment=function(e){if(n.mounted)return n.props.itemToJSXConverter(e)},a=o,i(n,a)}return a(t,e),x(t,[{key:"componentDidMount",value:function(){this.mounted=!0}},{key:"componentWillUnmount",value:function(){this.mounted=!1}},{key:"componentDidUpdate",value:function(e,t){t.currentPage!==this.currentPage()&&o.i(u.findDOMNode)(this.refs.item_0).focus()}},{key:"componentWillReceiveProps",value:function(){var e=this,t=this.props;this.setState(function(o,n){return n.identifier!==t.identifier?{currentPage:1,targetIndex:0}:{currentPage:e.getPageForIndex(o.targetIndex,n.numItemsPerPage),targetIndex:o.targetIndex}})}},{key:"generateControls",value:function(){var e=[],o=this.currentPage(),r=this.totalPages(),i=o-(o-1)%this.props.numPageToggles,a=Math.min(i+this.props.numPageToggles-1,r);if(this.props.showPaginationState&&e.push({children:N(this.props.showPaginationState)?this.props.showPaginationState(o,r):o+" / "+r,className:"b-pagination-control b-pagination-control-state",disabled:!0}),this.props.showJumpToFirstPageControl){var s;e.push((s={},n(s,t.CONTROL_DATA_ATTRIBUTE,t.control.FIRST),n(s,"children",this.props.jumpToFirstPageControlContent),n(s,"className","b-pagination-control b-pagination-control-first"),n(s,"disabled",1===o),s))}if(this.props.showJumpToPreviousPageControl){var p;e.push((p={},n(p,t.CONTROL_DATA_ATTRIBUTE,t.control.PREVIOUS),n(p,"children",this.props.jumpToPreviousPageControlContent),n(p,"className","b-pagination-control b-pagination-control-previous"),n(p,"disabled",1===o),p))}for(var u=i;u<=a;u++){var l;e.push((l={},n(l,t.CONTROL_DATA_ATTRIBUTE,u),n(l,"children",u),n(l,"className","b-pagination-control"),n(l,"pressed",o===u),l))}if(this.props.showJumpToNextPageControl){var c;e.push((c={},n(c,t.CONTROL_DATA_ATTRIBUTE,t.control.NEXT),n(c,"children",this.props.jumpToNextPageControlContent),n(c,"className","b-pagination-control b-pagination-control-next"),n(c,"disabled",o===r),c))}if(this.props.showJumpToLastPageControl){var m;e.push((m={},n(m,t.CONTROL_DATA_ATTRIBUTE,t.control.LAST),n(m,"children",this.props.jumpToLastPageControlContent),n(m,"className","b-pagination-control b-pagination-control-last"),n(m,"disabled",o===r),m))}return this.props.customControlContent&&e.push({children:this.props.customControlContent,className:"b-pagination-control b-pagination-control-custom",disabled:!0}),e}},{key:"generateItems",value:function(){for(var e=[],t=this.firstVisibleItemIndex(),o=Math.min(this.props.totalItems,t+this.props.numItemsPerPage)-1,n=t;n<=o;n+=1)e.push(this.props.getItem(n));return e}},{key:"renderItems",value:function(){var e=this,t=this.props.itemWrapperProps;return p.a.createElement(b.a,O({},t,{className:c()("b-pagination-items",t.className)}),this.generateItems().map(function(t,o){return p.a.createElement(d.a,{ref:0===o?"item_0":null,key:o,className:c()("b-pagination-item",{"b-pagination-item-even":o%2===0,"b-pagination-item-odd":o%2!==0}),"data-pagination-index":e.props.numItemsPerPage*(e.currentPage()-1)+o,pendingContent:e.props.itemLoadingContent},t instanceof Promise?t.then(e.handleItemPromiseFulfillment,e.handleItemPromiseFulfillment):e.props.itemToJSXConverter(t))}))}},{key:"renderControls",value:function(e){var o;if(!(this.props.hidePagerIfNotNeeded&&this.props.totalItems<=this.props.numItemsPerPage))return p.a.createElement(T.a,O({},this.props.controlWrapperProps,{className:c()("b-pagination-controls",this.props.controlWrapperProps.className,(o={},n(o,"b-pagination-controls-above",e===t.position.ABOVE),n(o,"b-pagination-controls-below",e===t.position.BELOW),o)),options:this.generateControls(),onOptionSelected:this.handlePageSelected}))}},{key:"renderView",value:function(){var e=this.props.position,o=t.position;return p.a.createElement("div",{className:"b-pagination"},e===o.ABOVE||e===o.BOTH?this.renderControls(o.ABOVE):null,this.props.before,this.renderItems(),this.props.after,e===o.BELOW||e===o.BOTH?this.renderControls(o.BELOW):null)}},{key:"render",value:function(){return p.a.createElement("div",O({},y()(this.props,t.internalKeys),{className:c()("b-pagination-wrapper",this.props.className)}),this.renderView())}}]),t}(p.a.PureComponent);A.control={CUSTOM:v()(),FIRST:v()(),LAST:v()(),NEXT:v()(),PREVIOUS:v()()},A.position={ABOVE:v()(),BELOW:v()(),BOTH:v()()},A.CONTROL_DATA_ATTRIBUTE="data-page-control",A.propTypes={"*":s.PropTypes.any,after:s.PropTypes.node,before:s.PropTypes.node,controlWrapperProps:s.PropTypes.shape({"*":s.PropTypes.any}),customControlContent:s.PropTypes.node,getItem:s.PropTypes.func.isRequired,hidePagerIfNotNeeded:s.PropTypes.bool,identifier:s.PropTypes.string.isRequired,initialPage:function(e){if(P()(e.initialPage)===!1)return new Error("`initialPage` must be an integer.");var t=Math.ceil(e.totalItems/e.numItemsPerPage);return e.initialPage<1||e.initialPage>t?new Error("`initialPage` must be between 1 and "+t+"."):void 0},itemLoadingContent:s.PropTypes.node,itemToJSXConverter:s.PropTypes.func,itemWrapperProps:s.PropTypes.shape({"*":s.PropTypes.any}),jumpToFirstPageControlContent:s.PropTypes.node,jumpToLastPageControlContent:s.PropTypes.node,jumpToNextPageControlContent:s.PropTypes.node,jumpToPreviousPageControlContent:s.PropTypes.node,numItemsPerPage:function(e){return P()(e.numItemsPerPage)===!1?new Error("`numItemsPerPage` must be an integer."):e.numItemsPerPage<1?new Error("`numItemsPerPage` must be greater than zero."):void 0},numPageToggles:s.PropTypes.number,position:s.PropTypes.oneOf([A.position.ABOVE,A.position.BELOW,A.position.BOTH]),showJumpToFirstPageControl:s.PropTypes.bool,showJumpToLastPageControl:s.PropTypes.bool,showJumpToNextPageControl:s.PropTypes.bool,showJumpToPreviousPageControl:s.PropTypes.bool,showPaginationState:s.PropTypes.oneOfType([s.PropTypes.bool,s.PropTypes.func]),totalItems:s.PropTypes.number.isRequired},A.defaultProps={after:null,before:null,controlWrapperProps:{},customControlContent:null,getItem:E,hidePagerIfNotNeeded:!1,identifier:v()(),initialPage:1,itemLoadingContent:void 0,itemToJSXConverter:w,itemWrapperProps:{},jumpToFirstPageControlContent:"⇤",jumpToLastPageControlContent:"⇥",jumpToNextPageControlContent:"→",jumpToPreviousPageControlContent:"←",numItemsPerPage:10,numPageToggles:5,position:A.position.ABOVE,showJumpToFirstPageControl:!0,showJumpToLastPageControl:!0,showJumpToNextPageControl:!0,showJumpToPreviousPageControl:!0,showPaginationState:!0,totalItems:null},A.internalKeys=Object.keys(A.defaultProps),t.default=A}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGQ0NzAyOGFjZjAwZmIyNWEwYTg2Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvblwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtYXN5bmNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXNlZ21lbnRlZC1jb250cm9sXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJsb2Rhc2guaXNpbnRlZ2VyXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtcGFnaW5hdGlvbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJyZXF1aXJlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9kZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsIndyaXRhYmxlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfbG9kYXNoX2lzaW50ZWdlcl9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2xvZGFzaF9pc2ludGVnZXJfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc19hc3luY19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc19hc3luY19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3NlZ21lbnRlZF9jb250cm9sX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3NlZ21lbnRlZF9jb250cm9sX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9ib3VuZGxlc3NfYXJyb3dfa2V5X25hdmlnYXRpb25fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9ib3VuZGxlc3NfYXJyb3dfa2V5X25hdmlnYXRpb25fX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfN19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImlkZW50aXR5IiwieCIsImlzRnVuY3Rpb24iLCJub29wIiwiUGFnaW5hdGlvbiIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsImNvbmNhdCIsIm1vdW50ZWQiLCJzdGF0ZSIsImN1cnJlbnRQYWdlIiwiaW5pdGlhbFBhZ2UiLCJ0YXJnZXRJbmRleCIsIm51bUl0ZW1zUGVyUGFnZSIsImdldFBhZ2VGb3JJbmRleCIsImluZGV4IiwiaXRlbXNQZXJQYWdlIiwidW5kZWZpbmVkIiwiTWF0aCIsImNlaWwiLCJ0b3RhbFBhZ2VzIiwidG90YWxJdGVtcyIsImZpcnN0VmlzaWJsZUl0ZW1JbmRleCIsImp1bXBUb0luZGV4IiwiRXJyb3IiLCJzZXRTdGF0ZSIsImhhbmRsZVBhZ2VTZWxlY3RlZCIsIm9wdGlvbiIsIm5leHRUYXJnZXRJbmRleCIsIkNPTlRST0xfREFUQV9BVFRSSUJVVEUiLCJjb250cm9sIiwiRklSU1QiLCJQUkVWSU9VUyIsIk5FWFQiLCJMQVNUIiwicGFyc2VJbnQiLCJoYW5kbGVJdGVtUHJvbWlzZUZ1bGZpbGxtZW50IiwicGF5bG9hZCIsIml0ZW1Ub0pTWENvbnZlcnRlciIsIl8iLCJwcmV2U3RhdGUiLCJyZWZzIiwiaXRlbV8wIiwiZm9jdXMiLCJfdGhpczIiLCJvbGRQcm9wcyIsImlkZW50aWZpZXIiLCJvcHRpb25zIiwic3RhcnRQYWdlIiwibnVtUGFnZVRvZ2dsZXMiLCJlbmRQYWdlIiwibWluIiwic2hvd1BhZ2luYXRpb25TdGF0ZSIsInB1c2giLCJjaGlsZHJlbiIsImNsYXNzTmFtZSIsImRpc2FibGVkIiwic2hvd0p1bXBUb0ZpcnN0UGFnZUNvbnRyb2wiLCJfb3B0aW9ucyRwdXNoIiwianVtcFRvRmlyc3RQYWdlQ29udHJvbENvbnRlbnQiLCJzaG93SnVtcFRvUHJldmlvdXNQYWdlQ29udHJvbCIsIl9vcHRpb25zJHB1c2gyIiwianVtcFRvUHJldmlvdXNQYWdlQ29udHJvbENvbnRlbnQiLCJfb3B0aW9ucyRwdXNoMyIsInNob3dKdW1wVG9OZXh0UGFnZUNvbnRyb2wiLCJfb3B0aW9ucyRwdXNoNCIsImp1bXBUb05leHRQYWdlQ29udHJvbENvbnRlbnQiLCJzaG93SnVtcFRvTGFzdFBhZ2VDb250cm9sIiwiX29wdGlvbnMkcHVzaDUiLCJqdW1wVG9MYXN0UGFnZUNvbnRyb2xDb250ZW50IiwiY3VzdG9tQ29udHJvbENvbnRlbnQiLCJpdGVtcyIsImZpcnN0SW5kZXgiLCJsYXN0SW5kZXgiLCJnZXRJdGVtIiwiX3RoaXMzIiwiaXRlbVdyYXBwZXJQcm9wcyIsImEiLCJjcmVhdGVFbGVtZW50IiwiZ2VuZXJhdGVJdGVtcyIsIm1hcCIsIml0ZW0iLCJyZWYiLCJiLXBhZ2luYXRpb24taXRlbS1ldmVuIiwiYi1wYWdpbmF0aW9uLWl0ZW0tb2RkIiwiZGF0YS1wYWdpbmF0aW9uLWluZGV4IiwicGVuZGluZ0NvbnRlbnQiLCJpdGVtTG9hZGluZ0NvbnRlbnQiLCJQcm9taXNlIiwidGhlbiIsInBvc2l0aW9uIiwiX2N4IiwiaGlkZVBhZ2VySWZOb3ROZWVkZWQiLCJjb250cm9sV3JhcHBlclByb3BzIiwiQUJPVkUiLCJCRUxPVyIsImdlbmVyYXRlQ29udHJvbHMiLCJvbk9wdGlvblNlbGVjdGVkIiwiQk9USCIsInJlbmRlckNvbnRyb2xzIiwiYmVmb3JlIiwicmVuZGVySXRlbXMiLCJhZnRlciIsImludGVybmFsS2V5cyIsInJlbmRlclZpZXciLCJQdXJlQ29tcG9uZW50IiwiQ1VTVE9NIiwicHJvcFR5cGVzIiwiKiIsImFueSIsIm5vZGUiLCJzaGFwZSIsImZ1bmMiLCJpc1JlcXVpcmVkIiwiYm9vbCIsInN0cmluZyIsIm51bWJlck9mUGFnZXMiLCJudW1iZXIiLCJvbmVPZiIsIm9uZU9mVHlwZSIsImRlZmF1bHRQcm9wcyIsImtleXMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBRyxFQUFBLFNBQUFLLEdBQTJDLE1BQUFBLElBRzNDUixFQUFBUyxFQUFBLFNBQUFYLEVBQUFZLEVBQUFDLEdBQ0FYLEVBQUFZLEVBQUFkLEVBQUFZLElBQ0FHLE9BQUFDLGVBQUFoQixFQUFBWSxHQUNBSyxjQUFBLEVBQ0FDLFlBQUEsRUFDQUMsSUFB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akYsRUFDVG1HLHNCQUFzQixFQUN0QjlDLFdBQVlyRSxNQUNaa0MsWUFBYSxFQUNiNEUsbUJBQW9CdEUsT0FDcEJxQixtQkFBb0JoRCxFQUNwQnNGLG9CQUNBakIsOEJBQStCLElBQy9CVSw2QkFBOEIsSUFDOUJILDZCQUE4QixJQUM5QkosaUNBQWtDLElBQ2xDakQsZ0JBQWlCLEdBQ2pCb0MsZUFBZ0IsRUFDaEJ5QyxTQUFVaEcsRUFBV2dHLFNBQVNJLE1BQzlCckMsNEJBQTRCLEVBQzVCVSwyQkFBMkIsRUFDM0JILDJCQUEyQixFQUMzQkosK0JBQStCLEVBQy9CUixxQkFBcUIsRUFDckIvQixXQUFZLE1Bdk9DM0IsRUEwT1Y2RyxhQUFlL0ssT0FBT2lNLEtBQUsvSCxFQUFXOEgsY1hySHV2Y2xMLEVBQTZCLFFXckhoemNvRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA5KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWFycm93LWtleS1uYXZpZ2F0aW9uXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWFzeW5jXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXNlZ21lbnRlZC1jb250cm9sXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy11dWlkXCIpO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImxvZGFzaC5pc2ludGVnZXJcIik7XG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19sb2Rhc2hfaXNpbnRlZ2VyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19sb2Rhc2hfaXNpbnRlZ2VyX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfbG9kYXNoX2lzaW50ZWdlcl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX2FzeW5jX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfYXN5bmNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfYXN5bmNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X2JvdW5kbGVzc19zZWdtZW50ZWRfY29udHJvbF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3NlZ21lbnRlZF9jb250cm9sX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3NlZ21lbnRlZF9jb250cm9sX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNl9ib3VuZGxlc3NfYXJyb3dfa2V5X25hdmlnYXRpb25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc19hcnJvd19rZXlfbmF2aWdhdGlvbl9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X2JvdW5kbGVzc19hcnJvd19rZXlfbmF2aWdhdGlvbl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X2JvdW5kbGVzc191dGlsc191dWlkX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X2JvdW5kbGVzc191dGlsc191dWlkX18pO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHZhbHVlKXtpZihrZXkgaW4gb2JqKXtPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLGtleSx7dmFsdWU6dmFsdWUsZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOnRydWV9KTt9ZWxzZXtvYmpba2V5XT12YWx1ZTt9cmV0dXJuIG9iajt9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBpZGVudGl0eT1mdW5jdGlvbiBpZGVudGl0eSh4KXtyZXR1cm4geDt9O3ZhciBpc0Z1bmN0aW9uPWZ1bmN0aW9uIGlzRnVuY3Rpb24oeCl7cmV0dXJuIHR5cGVvZiB4PT09J2Z1bmN0aW9uJzt9O3ZhciBub29wPWZ1bmN0aW9uIG5vb3AoKXt9O3ZhciBQYWdpbmF0aW9uPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoUGFnaW5hdGlvbixfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gUGFnaW5hdGlvbigpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLFBhZ2luYXRpb24pO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9UGFnaW5hdGlvbi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihQYWdpbmF0aW9uKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMubW91bnRlZD1mYWxzZSxfdGhpcy5zdGF0ZT17Y3VycmVudFBhZ2U6X3RoaXMucHJvcHMuaW5pdGlhbFBhZ2UsdGFyZ2V0SW5kZXg6KF90aGlzLnByb3BzLmluaXRpYWxQYWdlLTEpKl90aGlzLnByb3BzLm51bUl0ZW1zUGVyUGFnZX0sX3RoaXMuY3VycmVudFBhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMuc3RhdGUuY3VycmVudFBhZ2U7fSxfdGhpcy5nZXRQYWdlRm9ySW5kZXg9ZnVuY3Rpb24oaW5kZXgpe3ZhciBpdGVtc1BlclBhZ2U9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOl90aGlzLnByb3BzLm51bUl0ZW1zUGVyUGFnZTtyZXR1cm4gTWF0aC5jZWlsKChpbmRleCsxKS9pdGVtc1BlclBhZ2UpO30sX3RoaXMudG90YWxQYWdlcz1mdW5jdGlvbigpe3JldHVybiBNYXRoLmNlaWwoX3RoaXMucHJvcHMudG90YWxJdGVtcy9fdGhpcy5wcm9wcy5udW1JdGVtc1BlclBhZ2UpO30sX3RoaXMuZmlyc3RWaXNpYmxlSXRlbUluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuKF90aGlzLmN1cnJlbnRQYWdlKCktMSkqX3RoaXMucHJvcHMubnVtSXRlbXNQZXJQYWdlO30sX3RoaXMuanVtcFRvSW5kZXg9ZnVuY3Rpb24oaSl7aWYoaTwwfHxpPj1fdGhpcy5wcm9wcy50b3RhbEl0ZW1zKXt0aHJvdyBFcnJvcignQ2Fubm90IHBhZ2UgdG8gaW52YWxpZCBpbmRleCAnK2krJy4nKTt9X3RoaXMuc2V0U3RhdGUoe2N1cnJlbnRQYWdlOl90aGlzLmdldFBhZ2VGb3JJbmRleChpKSx0YXJnZXRJbmRleDppfSk7fSxfdGhpcy5oYW5kbGVQYWdlU2VsZWN0ZWQ9ZnVuY3Rpb24ob3B0aW9uKXt2YXIgbmV4dFRhcmdldEluZGV4PXZvaWQgMDtzd2l0Y2gob3B0aW9uW1BhZ2luYXRpb24uQ09OVFJPTF9EQVRBX0FUVFJJQlVURV0pe2Nhc2UgdW5kZWZpbmVkOnJldHVybjtjYXNlIFBhZ2luYXRpb24uY29udHJvbC5GSVJTVDpuZXh0VGFyZ2V0SW5kZXg9MDticmVhaztjYXNlIFBhZ2luYXRpb24uY29udHJvbC5QUkVWSU9VUzpuZXh0VGFyZ2V0SW5kZXg9X3RoaXMuZmlyc3RWaXNpYmxlSXRlbUluZGV4KCktX3RoaXMucHJvcHMubnVtSXRlbXNQZXJQYWdlO2JyZWFrO2Nhc2UgUGFnaW5hdGlvbi5jb250cm9sLk5FWFQ6bmV4dFRhcmdldEluZGV4PV90aGlzLmZpcnN0VmlzaWJsZUl0ZW1JbmRleCgpK190aGlzLnByb3BzLm51bUl0ZW1zUGVyUGFnZTticmVhaztjYXNlIFBhZ2luYXRpb24uY29udHJvbC5MQVNUOm5leHRUYXJnZXRJbmRleD1fdGhpcy5wcm9wcy50b3RhbEl0ZW1zLTE7YnJlYWs7ZGVmYXVsdDpuZXh0VGFyZ2V0SW5kZXg9cGFyc2VJbnQob3B0aW9uW1BhZ2luYXRpb24uQ09OVFJPTF9EQVRBX0FUVFJJQlVURV0sMTApKl90aGlzLnByb3BzLm51bUl0ZW1zUGVyUGFnZS0xO31fdGhpcy5zZXRTdGF0ZSh7Y3VycmVudFBhZ2U6X3RoaXMuZ2V0UGFnZUZvckluZGV4KG5leHRUYXJnZXRJbmRleCksdGFyZ2V0SW5kZXg6bmV4dFRhcmdldEluZGV4fSk7fSxfdGhpcy5oYW5kbGVJdGVtUHJvbWlzZUZ1bGZpbGxtZW50PWZ1bmN0aW9uKHBheWxvYWQpe2lmKF90aGlzLm1vdW50ZWQpe3JldHVybiBfdGhpcy5wcm9wcy5pdGVtVG9KU1hDb252ZXJ0ZXIocGF5bG9hZCk7fX0sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoUGFnaW5hdGlvbixbe2tleTonY29tcG9uZW50RGlkTW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCl7dGhpcy5tb3VudGVkPXRydWU7fX0se2tleTonY29tcG9uZW50V2lsbFVubW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7dGhpcy5tb3VudGVkPWZhbHNlO319LHtrZXk6J2NvbXBvbmVudERpZFVwZGF0ZScsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKF8scHJldlN0YXRlKXtpZihwcmV2U3RhdGUuY3VycmVudFBhZ2UhPT10aGlzLmN1cnJlbnRQYWdlKCkpe19fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX19bXCJmaW5kRE9NTm9kZVwiXSkodGhpcy5yZWZzLml0ZW1fMCkuZm9jdXMoKTt9fX0se2tleTonY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpe3ZhciBfdGhpczI9dGhpczt2YXIgb2xkUHJvcHM9dGhpcy5wcm9wczt0aGlzLnNldFN0YXRlKGZ1bmN0aW9uKHN0YXRlLHByb3BzKXtpZihwcm9wcy5pZGVudGlmaWVyIT09b2xkUHJvcHMuaWRlbnRpZmllcil7cmV0dXJue2N1cnJlbnRQYWdlOjEsdGFyZ2V0SW5kZXg6MH07fXJldHVybntjdXJyZW50UGFnZTpfdGhpczIuZ2V0UGFnZUZvckluZGV4KHN0YXRlLnRhcmdldEluZGV4LHByb3BzLm51bUl0ZW1zUGVyUGFnZSksdGFyZ2V0SW5kZXg6c3RhdGUudGFyZ2V0SW5kZXh9O30pO319LHtrZXk6J2dlbmVyYXRlQ29udHJvbHMnLHZhbHVlOmZ1bmN0aW9uIGdlbmVyYXRlQ29udHJvbHMoKXt2YXIgb3B0aW9ucz1bXTt2YXIgY3VycmVudFBhZ2U9dGhpcy5jdXJyZW50UGFnZSgpO3ZhciB0b3RhbFBhZ2VzPXRoaXMudG90YWxQYWdlcygpO3ZhciBzdGFydFBhZ2U9Y3VycmVudFBhZ2UtKGN1cnJlbnRQYWdlLTEpJXRoaXMucHJvcHMubnVtUGFnZVRvZ2dsZXM7dmFyIGVuZFBhZ2U9TWF0aC5taW4oc3RhcnRQYWdlK3RoaXMucHJvcHMubnVtUGFnZVRvZ2dsZXMtMSx0b3RhbFBhZ2VzKTtpZih0aGlzLnByb3BzLnNob3dQYWdpbmF0aW9uU3RhdGUpe29wdGlvbnMucHVzaCh7Y2hpbGRyZW46aXNGdW5jdGlvbih0aGlzLnByb3BzLnNob3dQYWdpbmF0aW9uU3RhdGUpP3RoaXMucHJvcHMuc2hvd1BhZ2luYXRpb25TdGF0ZShjdXJyZW50UGFnZSx0b3RhbFBhZ2VzKTpjdXJyZW50UGFnZSsnIC8gJyt0b3RhbFBhZ2VzLGNsYXNzTmFtZTonYi1wYWdpbmF0aW9uLWNvbnRyb2wgYi1wYWdpbmF0aW9uLWNvbnRyb2wtc3RhdGUnLGRpc2FibGVkOnRydWV9KTt9aWYodGhpcy5wcm9wcy5zaG93SnVtcFRvRmlyc3RQYWdlQ29udHJvbCl7dmFyIF9vcHRpb25zJHB1c2g7b3B0aW9ucy5wdXNoKChfb3B0aW9ucyRwdXNoPXt9LF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoLFBhZ2luYXRpb24uQ09OVFJPTF9EQVRBX0FUVFJJQlVURSxQYWdpbmF0aW9uLmNvbnRyb2wuRklSU1QpLF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoLCdjaGlsZHJlbicsdGhpcy5wcm9wcy5qdW1wVG9GaXJzdFBhZ2VDb250cm9sQ29udGVudCksX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2gsJ2NsYXNzTmFtZScsJ2ItcGFnaW5hdGlvbi1jb250cm9sIGItcGFnaW5hdGlvbi1jb250cm9sLWZpcnN0JyksX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2gsJ2Rpc2FibGVkJyxjdXJyZW50UGFnZT09PTEpLF9vcHRpb25zJHB1c2gpKTt9aWYodGhpcy5wcm9wcy5zaG93SnVtcFRvUHJldmlvdXNQYWdlQ29udHJvbCl7dmFyIF9vcHRpb25zJHB1c2gyO29wdGlvbnMucHVzaCgoX29wdGlvbnMkcHVzaDI9e30sX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2gyLFBhZ2luYXRpb24uQ09OVFJPTF9EQVRBX0FUVFJJQlVURSxQYWdpbmF0aW9uLmNvbnRyb2wuUFJFVklPVVMpLF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoMiwnY2hpbGRyZW4nLHRoaXMucHJvcHMuanVtcFRvUHJldmlvdXNQYWdlQ29udHJvbENvbnRlbnQpLF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoMiwnY2xhc3NOYW1lJywnYi1wYWdpbmF0aW9uLWNvbnRyb2wgYi1wYWdpbmF0aW9uLWNvbnRyb2wtcHJldmlvdXMnKSxfZGVmaW5lUHJvcGVydHkoX29wdGlvbnMkcHVzaDIsJ2Rpc2FibGVkJyxjdXJyZW50UGFnZT09PTEpLF9vcHRpb25zJHB1c2gyKSk7fWZvcih2YXIgaT1zdGFydFBhZ2U7aTw9ZW5kUGFnZTtpKyspe3ZhciBfb3B0aW9ucyRwdXNoMztvcHRpb25zLnB1c2goKF9vcHRpb25zJHB1c2gzPXt9LF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoMyxQYWdpbmF0aW9uLkNPTlRST0xfREFUQV9BVFRSSUJVVEUsaSksX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2gzLCdjaGlsZHJlbicsaSksX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2gzLCdjbGFzc05hbWUnLCdiLXBhZ2luYXRpb24tY29udHJvbCcpLF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoMywncHJlc3NlZCcsY3VycmVudFBhZ2U9PT1pKSxfb3B0aW9ucyRwdXNoMykpO31pZih0aGlzLnByb3BzLnNob3dKdW1wVG9OZXh0UGFnZUNvbnRyb2wpe3ZhciBfb3B0aW9ucyRwdXNoNDtvcHRpb25zLnB1c2goKF9vcHRpb25zJHB1c2g0PXt9LF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoNCxQYWdpbmF0aW9uLkNPTlRST0xfREFUQV9BVFRSSUJVVEUsUGFnaW5hdGlvbi5jb250cm9sLk5FWFQpLF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoNCwnY2hpbGRyZW4nLHRoaXMucHJvcHMuanVtcFRvTmV4dFBhZ2VDb250cm9sQ29udGVudCksX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2g0LCdjbGFzc05hbWUnLCdiLXBhZ2luYXRpb24tY29udHJvbCBiLXBhZ2luYXRpb24tY29udHJvbC1uZXh0JyksX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2g0LCdkaXNhYmxlZCcsY3VycmVudFBhZ2U9PT10b3RhbFBhZ2VzKSxfb3B0aW9ucyRwdXNoNCkpO31pZih0aGlzLnByb3BzLnNob3dKdW1wVG9MYXN0UGFnZUNvbnRyb2wpe3ZhciBfb3B0aW9ucyRwdXNoNTtvcHRpb25zLnB1c2goKF9vcHRpb25zJHB1c2g1PXt9LF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoNSxQYWdpbmF0aW9uLkNPTlRST0xfREFUQV9BVFRSSUJVVEUsUGFnaW5hdGlvbi5jb250cm9sLkxBU1QpLF9kZWZpbmVQcm9wZXJ0eShfb3B0aW9ucyRwdXNoNSwnY2hpbGRyZW4nLHRoaXMucHJvcHMuanVtcFRvTGFzdFBhZ2VDb250cm9sQ29udGVudCksX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2g1LCdjbGFzc05hbWUnLCdiLXBhZ2luYXRpb24tY29udHJvbCBiLXBhZ2luYXRpb24tY29udHJvbC1sYXN0JyksX2RlZmluZVByb3BlcnR5KF9vcHRpb25zJHB1c2g1LCdkaXNhYmxlZCcsY3VycmVudFBhZ2U9PT10b3RhbFBhZ2VzKSxfb3B0aW9ucyRwdXNoNSkpO31pZih0aGlzLnByb3BzLmN1c3RvbUNvbnRyb2xDb250ZW50KXtvcHRpb25zLnB1c2goe2NoaWxkcmVuOnRoaXMucHJvcHMuY3VzdG9tQ29udHJvbENvbnRlbnQsY2xhc3NOYW1lOidiLXBhZ2luYXRpb24tY29udHJvbCBiLXBhZ2luYXRpb24tY29udHJvbC1jdXN0b20nLGRpc2FibGVkOnRydWV9KTt9cmV0dXJuIG9wdGlvbnM7fX0se2tleTonZ2VuZXJhdGVJdGVtcycsdmFsdWU6ZnVuY3Rpb24gZ2VuZXJhdGVJdGVtcygpe3ZhciBpdGVtcz1bXTt2YXIgZmlyc3RJbmRleD10aGlzLmZpcnN0VmlzaWJsZUl0ZW1JbmRleCgpO3ZhciBsYXN0SW5kZXg9TWF0aC5taW4odGhpcy5wcm9wcy50b3RhbEl0ZW1zLGZpcnN0SW5kZXgrdGhpcy5wcm9wcy5udW1JdGVtc1BlclBhZ2UpLTE7Zm9yKHZhciBpPWZpcnN0SW5kZXg7aTw9bGFzdEluZGV4O2krPTEpe2l0ZW1zLnB1c2godGhpcy5wcm9wcy5nZXRJdGVtKGkpKTt9cmV0dXJuIGl0ZW1zO319LHtrZXk6J3JlbmRlckl0ZW1zJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJJdGVtcygpe3ZhciBfdGhpczM9dGhpczt2YXIgcHJvcHM9dGhpcy5wcm9wcy5pdGVtV3JhcHBlclByb3BzO3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfYm91bmRsZXNzX2Fycm93X2tleV9uYXZpZ2F0aW9uX19fZGVmYXVsdC5hLF9leHRlbmRzKHt9LHByb3BzLHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcGFnaW5hdGlvbi1pdGVtcycscHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMuZ2VuZXJhdGVJdGVtcygpLm1hcChmdW5jdGlvbihpdGVtLGluZGV4KXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc19hc3luY19fX2RlZmF1bHQuYSx7cmVmOmluZGV4PT09MD8naXRlbV8wJzpudWxsLGtleTppbmRleCxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcGFnaW5hdGlvbi1pdGVtJyx7J2ItcGFnaW5hdGlvbi1pdGVtLWV2ZW4nOmluZGV4JTI9PT0wLCdiLXBhZ2luYXRpb24taXRlbS1vZGQnOmluZGV4JTIhPT0wfSksJ2RhdGEtcGFnaW5hdGlvbi1pbmRleCc6X3RoaXMzLnByb3BzLm51bUl0ZW1zUGVyUGFnZSooX3RoaXMzLmN1cnJlbnRQYWdlKCktMSkraW5kZXgscGVuZGluZ0NvbnRlbnQ6X3RoaXMzLnByb3BzLml0ZW1Mb2FkaW5nQ29udGVudH0saXRlbSBpbnN0YW5jZW9mIFByb21pc2U/aXRlbS50aGVuKF90aGlzMy5oYW5kbGVJdGVtUHJvbWlzZUZ1bGZpbGxtZW50LF90aGlzMy5oYW5kbGVJdGVtUHJvbWlzZUZ1bGZpbGxtZW50KTpfdGhpczMucHJvcHMuaXRlbVRvSlNYQ29udmVydGVyKGl0ZW0pKTt9KSk7fX0se2tleToncmVuZGVyQ29udHJvbHMnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckNvbnRyb2xzKHBvc2l0aW9uKXt2YXIgX2N4O2lmKHRoaXMucHJvcHMuaGlkZVBhZ2VySWZOb3ROZWVkZWQmJnRoaXMucHJvcHMudG90YWxJdGVtczw9dGhpcy5wcm9wcy5udW1JdGVtc1BlclBhZ2Upe3JldHVybjt9cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9ib3VuZGxlc3Nfc2VnbWVudGVkX2NvbnRyb2xfX19kZWZhdWx0LmEsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5jb250cm9sV3JhcHBlclByb3BzLHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcGFnaW5hdGlvbi1jb250cm9scycsdGhpcy5wcm9wcy5jb250cm9sV3JhcHBlclByb3BzLmNsYXNzTmFtZSwoX2N4PXt9LF9kZWZpbmVQcm9wZXJ0eShfY3gsJ2ItcGFnaW5hdGlvbi1jb250cm9scy1hYm92ZScscG9zaXRpb249PT1QYWdpbmF0aW9uLnBvc2l0aW9uLkFCT1ZFKSxfZGVmaW5lUHJvcGVydHkoX2N4LCdiLXBhZ2luYXRpb24tY29udHJvbHMtYmVsb3cnLHBvc2l0aW9uPT09UGFnaW5hdGlvbi5wb3NpdGlvbi5CRUxPVyksX2N4KSksb3B0aW9uczp0aGlzLmdlbmVyYXRlQ29udHJvbHMoKSxvbk9wdGlvblNlbGVjdGVkOnRoaXMuaGFuZGxlUGFnZVNlbGVjdGVkfSkpO319LHtrZXk6J3JlbmRlclZpZXcnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlclZpZXcoKXt2YXIgcG9zaXRpb249dGhpcy5wcm9wcy5wb3NpdGlvbjt2YXIgcD1QYWdpbmF0aW9uLnBvc2l0aW9uO3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2Jyx7Y2xhc3NOYW1lOidiLXBhZ2luYXRpb24nfSxwb3NpdGlvbj09PXAuQUJPVkV8fHBvc2l0aW9uPT09cC5CT1RIP3RoaXMucmVuZGVyQ29udHJvbHMocC5BQk9WRSk6bnVsbCx0aGlzLnByb3BzLmJlZm9yZSx0aGlzLnJlbmRlckl0ZW1zKCksdGhpcy5wcm9wcy5hZnRlcixwb3NpdGlvbj09PXAuQkVMT1d8fHBvc2l0aW9uPT09cC5CT1RIP3RoaXMucmVuZGVyQ29udHJvbHMocC5CRUxPVyk6bnVsbCk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0KCkodGhpcy5wcm9wcyxQYWdpbmF0aW9uLmludGVybmFsS2V5cykse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1wYWdpbmF0aW9uLXdyYXBwZXInLHRoaXMucHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMucmVuZGVyVmlldygpKTt9fV0pO3JldHVybiBQYWdpbmF0aW9uO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO1BhZ2luYXRpb24uY29udHJvbD17Q1VTVE9NOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpLEZJUlNUOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpLExBU1Q6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCgpKCksTkVYVDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxQUkVWSU9VUzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKX07UGFnaW5hdGlvbi5wb3NpdGlvbj17QUJPVkU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCgpKCksQkVMT1c6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCgpKCksQk9USDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKX07UGFnaW5hdGlvbi5DT05UUk9MX0RBVEFfQVRUUklCVVRFPSdkYXRhLXBhZ2UtY29udHJvbCc7UGFnaW5hdGlvbi5wcm9wVHlwZXM9eycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnksYWZ0ZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxiZWZvcmU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxjb250cm9sV3JhcHBlclByb3BzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnNoYXBlKHsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55fSksY3VzdG9tQ29udHJvbENvbnRlbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxnZXRJdGVtOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMuaXNSZXF1aXJlZCxoaWRlUGFnZXJJZk5vdE5lZWRlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGlkZW50aWZpZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLmlzUmVxdWlyZWQsaW5pdGlhbFBhZ2U6ZnVuY3Rpb24gdmFsaWRhdGVJbml0aWFsUGFnZShwcm9wcyl7aWYoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2xvZGFzaF9pc2ludGVnZXJfX19kZWZhdWx0KCkocHJvcHMuaW5pdGlhbFBhZ2UpPT09ZmFsc2Upe3JldHVybiBuZXcgRXJyb3IoJ2Bpbml0aWFsUGFnZWAgbXVzdCBiZSBhbiBpbnRlZ2VyLicpO312YXIgbnVtYmVyT2ZQYWdlcz1NYXRoLmNlaWwocHJvcHMudG90YWxJdGVtcy9wcm9wcy5udW1JdGVtc1BlclBhZ2UpO2lmKHByb3BzLmluaXRpYWxQYWdlPDF8fHByb3BzLmluaXRpYWxQYWdlPm51bWJlck9mUGFnZXMpe3JldHVybiBuZXcgRXJyb3IoJ2Bpbml0aWFsUGFnZWAgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICcrbnVtYmVyT2ZQYWdlcysnLicpO319LGl0ZW1Mb2FkaW5nQ29udGVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlLGl0ZW1Ub0pTWENvbnZlcnRlcjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLGl0ZW1XcmFwcGVyUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoeycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnl9KSxqdW1wVG9GaXJzdFBhZ2VDb250cm9sQ29udGVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlLGp1bXBUb0xhc3RQYWdlQ29udHJvbENvbnRlbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxqdW1wVG9OZXh0UGFnZUNvbnRyb2xDb250ZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsanVtcFRvUHJldmlvdXNQYWdlQ29udHJvbENvbnRlbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxudW1JdGVtc1BlclBhZ2U6ZnVuY3Rpb24gdmFsaWRhdGVOdW1JdGVtc1BlclBhZ2UocHJvcHMpe2lmKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19sb2Rhc2hfaXNpbnRlZ2VyX19fZGVmYXVsdCgpKHByb3BzLm51bUl0ZW1zUGVyUGFnZSk9PT1mYWxzZSl7cmV0dXJuIG5ldyBFcnJvcignYG51bUl0ZW1zUGVyUGFnZWAgbXVzdCBiZSBhbiBpbnRlZ2VyLicpO31lbHNlIGlmKHByb3BzLm51bUl0ZW1zUGVyUGFnZTwxKXtyZXR1cm4gbmV3IEVycm9yKCdgbnVtSXRlbXNQZXJQYWdlYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpO319LG51bVBhZ2VUb2dnbGVzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm51bWJlcixwb3NpdGlvbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZihbUGFnaW5hdGlvbi5wb3NpdGlvbi5BQk9WRSxQYWdpbmF0aW9uLnBvc2l0aW9uLkJFTE9XLFBhZ2luYXRpb24ucG9zaXRpb24uQk9USF0pLHNob3dKdW1wVG9GaXJzdFBhZ2VDb250cm9sOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsc2hvd0p1bXBUb0xhc3RQYWdlQ29udHJvbDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLHNob3dKdW1wVG9OZXh0UGFnZUNvbnRyb2w6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxzaG93SnVtcFRvUHJldmlvdXNQYWdlQ29udHJvbDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLHNob3dQYWdpbmF0aW9uU3RhdGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSx0b3RhbEl0ZW1zOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm51bWJlci5pc1JlcXVpcmVkfTtQYWdpbmF0aW9uLmRlZmF1bHRQcm9wcz17YWZ0ZXI6bnVsbCxiZWZvcmU6bnVsbCxjb250cm9sV3JhcHBlclByb3BzOnt9LGN1c3RvbUNvbnRyb2xDb250ZW50Om51bGwsZ2V0SXRlbTpub29wLGhpZGVQYWdlcklmTm90TmVlZGVkOmZhbHNlLGlkZW50aWZpZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV84X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCgpKCksaW5pdGlhbFBhZ2U6MSxpdGVtTG9hZGluZ0NvbnRlbnQ6dW5kZWZpbmVkLGl0ZW1Ub0pTWENvbnZlcnRlcjppZGVudGl0eSxpdGVtV3JhcHBlclByb3BzOnt9LGp1bXBUb0ZpcnN0UGFnZUNvbnRyb2xDb250ZW50Oifih6QnLGp1bXBUb0xhc3RQYWdlQ29udHJvbENvbnRlbnQ6J+KHpScsanVtcFRvTmV4dFBhZ2VDb250cm9sQ29udGVudDon4oaSJyxqdW1wVG9QcmV2aW91c1BhZ2VDb250cm9sQ29udGVudDon4oaQJyxudW1JdGVtc1BlclBhZ2U6MTAsbnVtUGFnZVRvZ2dsZXM6NSxwb3NpdGlvbjpQYWdpbmF0aW9uLnBvc2l0aW9uLkFCT1ZFLHNob3dKdW1wVG9GaXJzdFBhZ2VDb250cm9sOnRydWUsc2hvd0p1bXBUb0xhc3RQYWdlQ29udHJvbDp0cnVlLHNob3dKdW1wVG9OZXh0UGFnZUNvbnRyb2w6dHJ1ZSxzaG93SnVtcFRvUHJldmlvdXNQYWdlQ29udHJvbDp0cnVlLHNob3dQYWdpbmF0aW9uU3RhdGU6dHJ1ZSx0b3RhbEl0ZW1zOm51bGx9O1BhZ2luYXRpb24uaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKFBhZ2luYXRpb24uZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gUGFnaW5hdGlvbjtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDkpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGQ0NzAyOGFjZjAwZmIyNWEwYTg2IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWFycm93LWtleS1uYXZpZ2F0aW9uXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLWFycm93LWtleS1uYXZpZ2F0aW9uXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1hc3luY1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1hc3luY1wifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3Mtc2VnbWVudGVkLWNvbnRyb2xcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3Mtc2VnbWVudGVkLWNvbnRyb2xcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtdXVpZFwifVxuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifVxuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJsb2Rhc2guaXNpbnRlZ2VyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwibG9kYXNoLmlzaW50ZWdlclwifVxuLy8gbW9kdWxlIGlkID0gNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifVxuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7ZmluZERPTU5vZGV9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgaXNJbnRlZ2VyIGZyb20gJ2xvZGFzaC5pc2ludGVnZXInO1xuXG5pbXBvcnQgQXN5bmMgZnJvbSAnYm91bmRsZXNzLWFzeW5jJztcbmltcG9ydCBTZWdtZW50ZWRDb250cm9sIGZyb20gJ2JvdW5kbGVzcy1zZWdtZW50ZWQtY29udHJvbCc7XG5pbXBvcnQgQXJyb3dLZXlOYXZpZ2F0aW9uIGZyb20gJ2JvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvbic7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbmltcG9ydCB1dWlkIGZyb20gJ2JvdW5kbGVzcy11dGlscy11dWlkJztcblxuY29uc3QgaWRlbnRpdHkgPSAoeCkgPT4geDtcbmNvbnN0IGlzRnVuY3Rpb24gPSAoeCkgPT4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbi8qKlxuICogX19WaWV3IGFuZCBuYXZpZ2F0ZSBoZXRlcm9nZW5pb3VzIGNvbnRlbnQgb25lIHBhZ2UgYXQgYSB0aW1lLl9fXG4gKlxuICogUGFnaW5hdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhbiBlbmNhcHN1bGF0ZWQgdmlldyBzeXN0ZW0sIGFjY2VwdGluZyBhbiBhcnJheSBvZiBpdGVtcyBhcyBpbnB1dC5cbiAqXG4gKiAjIyBDb21wb25lbnQgSW5zdGFuY2UgTWV0aG9kc1xuICpcbiAqIFdoZW4gdXNpbmcgYFBhZ2luYXRpb25gIGluIHlvdXIgcHJvamVjdCwgeW91IG1heSBjYWxsIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiBhIHJlbmRlcmVkXG4gKiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiBVc2UgW2ByZWZzYF0oaHR0cHM6Ly8gKiBmYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9yZWZzLWFuZC10aGUtZG9tLmh0bWwpXG4gKiB0byBnZXQgdGhlIGluc3RhbmNlLlxuICpcbiAqIC0gX19gY3VycmVudFBhZ2UoKWBfXyByZXR1cm5zIHRoZSBfX19vbmVfX18taW5kZXhlZCBwYWdlIG51bWJlciBjdXJyZW50bHkgaW4gdmlld1xuICpcbiAqIC0gX19ganVtcFRvSW5kZXgoaW5kZXg6IG51bWJlcilgX18gcmVuZGVycyB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHRoZSBfX196ZXJvX19fLWluZGV4ZWQgaXRlbVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIGNvbnRyb2wgPSB7XG4gICAgICAgIENVU1RPTTogdXVpZCgpLFxuICAgICAgICBGSVJTVDogdXVpZCgpLFxuICAgICAgICBMQVNUOiB1dWlkKCksXG4gICAgICAgIE5FWFQ6IHV1aWQoKSxcbiAgICAgICAgUFJFVklPVVM6IHV1aWQoKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgcG9zaXRpb24gPSB7XG4gICAgICAgIEFCT1ZFOiB1dWlkKCksXG4gICAgICAgIEJFTE9XOiB1dWlkKCksXG4gICAgICAgIEJPVEg6IHV1aWQoKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgQ09OVFJPTF9EQVRBX0FUVFJJQlVURSA9ICdkYXRhLXBhZ2UtY29udHJvbCdcblxuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICovXG4gICAgICAgICcqJzogUHJvcFR5cGVzLmFueSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYXJiaXRyYXJ5IGNvbnRlbnQgdG8gYmUgcmVuZGVyZWQgYWZ0ZXIgdGhlIGl0ZW1zIGluIHRoZSBET01cbiAgICAgICAgICovXG4gICAgICAgIGFmdGVyOiBQcm9wVHlwZXMubm9kZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYXJiaXRyYXJ5IGNvbnRlbnQgdG8gYmUgcmVuZGVyZWQgYmVmb3JlIHRoZSBpdGVtcyBpbiB0aGUgRE9NXG4gICAgICAgICAqL1xuICAgICAgICBiZWZvcmU6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIGNvbnRyb2xXcmFwcGVyUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbGxvd3MgZm9yIGFyYml0cmFyeSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGludG8gdGhlIGNvbnRyb2wgYXJlYVxuICAgICAgICAgKi9cbiAgICAgICAgY3VzdG9tQ29udHJvbENvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2l0aCBhIGRlc2lyZWQgaXRlbSBpbmRleCB3aGVuIHRoYXQgaXRlbSBjb21lcyBpbnRvIHZpZXc7XG4gICAgICAgICAqIGFjY2VwdHMgYSBgUHJvbWlzZWAgaWYgeW91IG5lZWQgdG8gZmV0Y2ggdGhlIHJvdyBhc3luY2hyb25vdXNseVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0SXRlbTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZG9lcyBub3QgcmVuZGVyIHRoZSBwYWdpbmcgY29udHJvbHMgaWYgdGhlIG51bWJlciBvZiBpdGVtcyBzdXBwbGllZFxuICAgICAgICAgKiB0byB0aGUgdmlldyBpcyBsZXNzLXRoYW4tb3ItZXF1YWwtdG8gdGhlIG51bWJlciBvZiBpdGVtcyB0byBzaG93XG4gICAgICAgICAqIHBlciBwYWdlIHZpYSBgcHJvcHMubnVtSXRlbXNQZXJQYWdlYFxuICAgICAgICAgKi9cbiAgICAgICAgaGlkZVBhZ2VySWZOb3ROZWVkZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgZGF0YSBzb3VyY2UgYmVpbmcgY29uc3VtZWQ7IHBhc3MgYVxuICAgICAgICAgKiBkaWZmZXJlbnQgbmFtZSB0byBjYXVzZSB0aGUgdmlldyB0byBmdWxseSByZXNldCBhbmQgcHVsbCBmcmVzaCBkYXRhXG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGlmaWVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSAoX19vbmUtaW5kZXhlZF9fKSBudW1iZXIgb2YgdGhlIHBhZ2UgdGhhdCBzaG91bGQgYmUgaW5pdGlhbGx5XG4gICAgICAgICAqIGRpc3BsYXllZDsgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICAgICAqIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICAgICAgICovXG4gICAgICAgIGluaXRpYWxQYWdlOiBmdW5jdGlvbiB2YWxpZGF0ZUluaXRpYWxQYWdlKHByb3BzKSB7XG4gICAgICAgICAgICBpZiAoaXNJbnRlZ2VyKHByb3BzLmluaXRpYWxQYWdlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdgaW5pdGlhbFBhZ2VgIG11c3QgYmUgYW4gaW50ZWdlci4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZQYWdlcyA9IE1hdGguY2VpbChwcm9wcy50b3RhbEl0ZW1zIC8gcHJvcHMubnVtSXRlbXNQZXJQYWdlKTtcblxuICAgICAgICAgICAgaWYgKHByb3BzLmluaXRpYWxQYWdlIDwgMSB8fCBwcm9wcy5pbml0aWFsUGFnZSA+IG51bWJlck9mUGFnZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdgaW5pdGlhbFBhZ2VgIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAnICsgbnVtYmVyT2ZQYWdlcyArICcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbG93cyBmb3IgYXJiaXRyYXJ5IGNvbnRlbnQgdG8gYmUgcmVuZGVyZWQgaW50byBwYWdpbmF0aW9uIGl0ZW1zXG4gICAgICAgICAqIGFzIHRoZXkncmUgbG9hZGluZyBpZiB0aGUgYmFja2luZyBkYXRhIGlzIGEgYFByb21pc2VgXG4gICAgICAgICAqL1xuICAgICAgICBpdGVtTG9hZGluZ0NvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbiBmdW5jdGlvbiB0byBzcGVjaWZ5IGhvdyBhbiBpdGVtIHNob3VsZCBiZSBjb252ZXJ0ZWRcbiAgICAgICAgICogdG8gSlNYLCBpZiBpdCBpcyBub3QgYWxyZWFkeSByZW5kZXJhYmxlIGJ5IFJlYWN0XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYGpzeFxuICAgICAgICAgKlxuICAgICAgICAgKiBjb25zdCBnZXRJdGVtID0gKCkgPT4gKHtpZDogMTIzNCwgdGV4dDogJ2Zvbyd9KTtcbiAgICAgICAgICogY29uc3Qgb2JqVG9KU1ggPSAoe2lkLCB0ZXh0fSkgPT4gPGRpdiBkYXRhLWlkPXtpZH0+e3RleHR9PC9kaXY+O1xuICAgICAgICAgKlxuICAgICAgICAgKiA8UGFnaW5hdGlvblxuICAgICAgICAgKiAgICAgZ2V0SXRlbT17Z2V0SXRlbX1cbiAgICAgICAgICogICAgIGlkZW50aWZlcj0nZm9vJ1xuICAgICAgICAgKiAgICAgaXRlbVRvSlNYQ29udmVydGVyPXtvYmpUb0pTWH1cbiAgICAgICAgICogICAgIHRvdGFsSXRlbXM9ezF9IC8+XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVRvSlNYQ29udmVydGVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICBpdGVtV3JhcHBlclByb3BzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuICAgICAgICB9KSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogY29udGVudCB0byBiZSBkaXNwbGF5ZWQgaW5zaWRlIG9mIHRoZSBcIkZpcnN0IHBhZ2VcIiBjb250cm9sIGJ1dHRvblxuICAgICAgICAgKi9cbiAgICAgICAganVtcFRvRmlyc3RQYWdlQ29udHJvbENvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250ZW50IHRvIGJlIGRpc3BsYXllZCBpbnNpZGUgb2YgdGhlIFwiTGFzdCBwYWdlXCIgY29udHJvbCBidXR0b25cbiAgICAgICAgICovXG4gICAgICAgIGp1bXBUb0xhc3RQYWdlQ29udHJvbENvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250ZW50IHRvIGJlIGRpc3BsYXllZCBpbnNpZGUgb2YgdGhlIFwiTmV4dCBwYWdlXCIgY29udHJvbCBidXR0b25cbiAgICAgICAgICovXG4gICAgICAgIGp1bXBUb05leHRQYWdlQ29udHJvbENvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250ZW50IHRvIGJlIGRpc3BsYXllZCBpbnNpZGUgb2YgdGhlIFwiUHJldmlvdXMgcGFnZVwiIGNvbnRyb2wgYnV0dG9uXG4gICAgICAgICAqL1xuICAgICAgICBqdW1wVG9QcmV2aW91c1BhZ2VDb250cm9sQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBiZSBkaXNwbGF5ZWQgb24gZWFjaCBwYWdlOyBtdXN0IGJlXG4gICAgICAgICAqIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgICAgICAqL1xuICAgICAgICBudW1JdGVtc1BlclBhZ2U6IGZ1bmN0aW9uIHZhbGlkYXRlTnVtSXRlbXNQZXJQYWdlKHByb3BzKSB7XG4gICAgICAgICAgICBpZiAoaXNJbnRlZ2VyKHByb3BzLm51bUl0ZW1zUGVyUGFnZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignYG51bUl0ZW1zUGVyUGFnZWAgbXVzdCBiZSBhbiBpbnRlZ2VyLicpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5udW1JdGVtc1BlclBhZ2UgPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignYG51bUl0ZW1zUGVyUGFnZWAgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY29udHJvbCBiYXIgYXRcbiAgICAgICAgICogb25lIHRpbWVcbiAgICAgICAgICovXG4gICAgICAgIG51bVBhZ2VUb2dnbGVzOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhZ2luYXRpb24gY29udHJvbHMgYXJlIGRpc3BsYXllZCBhYm92ZSxcbiAgICAgICAgICogYmVsb3csIG9yIGJvdGggYWJvdmUgYW5kIGJlbG93IHRoZSBjb250ZW50XG4gICAgICAgICAqL1xuICAgICAgICBwb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICAgICAgICAgIFBhZ2luYXRpb24ucG9zaXRpb24uQUJPVkUsXG4gICAgICAgICAgICBQYWdpbmF0aW9uLnBvc2l0aW9uLkJFTE9XLFxuICAgICAgICAgICAgUGFnaW5hdGlvbi5wb3NpdGlvbi5CT1RILFxuICAgICAgICBdKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogd2hldGhlciB0aGUgXCJmaXJzdCBwYWdlXCIgY29udHJvbCBidXR0b24gc2hvdWxkIGJlIGRpc3BsYXllZFxuICAgICAgICAgKi9cbiAgICAgICAgc2hvd0p1bXBUb0ZpcnN0UGFnZUNvbnRyb2w6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHRoZSBcImxhc3QgcGFnZVwiIGNvbnRyb2wgYnV0dG9uIHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICAgICAgICovXG4gICAgICAgIHNob3dKdW1wVG9MYXN0UGFnZUNvbnRyb2w6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHRoZSBcIm5leHQgcGFnZVwiIGNvbnRyb2wgYnV0dG9uIHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAgICAgICAgICovXG4gICAgICAgIHNob3dKdW1wVG9OZXh0UGFnZUNvbnRyb2w6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHRoZSBcInByZXZpb3VzIHBhZ2VcIiBjb250cm9sIGJ1dHRvbiBzaG91bGQgYmUgZGlzcGxheWVkXG4gICAgICAgICAqL1xuICAgICAgICBzaG93SnVtcFRvUHJldmlvdXNQYWdlQ29udHJvbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJlbmRlcnMgYW4gZWxlbWVudCBjYWxsZWQgYC5iLXBhZ2luYXRpb24tY29udHJvbC1zdGF0ZWAgdGhhdFxuICAgICAgICAgKiBjb250YWlucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFnaW5hdGlvbiBsaWtlIFwiMSBvZiAxMFwiO1xuICAgICAgICAgKiBhbHRlcm5hdGl2ZWx5LCB0aGlzIHByb3AgYWxzbyBhY2NlcHRzIGEgZnVuY3Rpb24gdGhhdCBpdCB3aWxsXG4gICAgICAgICAqIGNhbGwgd2l0aCB0aGUgY3VycmVudFBhZ2UgYW5kIHRvdGFsUGFnZXMgZm9yIHlvdSB0byBmb3JtYXQ6XG5cbiAgICAgICAgICogYGBganN4XG4gICAgICAgICAqIHNob3dQYWdpbmF0ZWRTdGF0ZT17XG4gICAgICAgICAqICAgICAoY3VycmVudFBhZ2UsIHRvdGFsUGFnZXMpID0+IChcbiAgICAgICAgICogICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZm9vJz5cbiAgICAgICAgICogICAgICAgICAgICAgWW91J3JlIG9uIHBhZ2Uge2N1cnJlbnRQYWdlfSBvZiB7dG90YWxQYWdlc30gcGFnZXMhXG4gICAgICAgICAqICAgICAgICAgPC9kaXY+XG4gICAgICAgICAqICAgICApXG4gICAgICAgICAqIH1cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBzaG93UGFnaW5hdGlvblN0YXRlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdmlld1xuICAgICAgICAgKi9cbiAgICAgICAgdG90YWxJdGVtczogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGFmdGVyOiBudWxsLFxuICAgICAgICBiZWZvcmU6IG51bGwsXG4gICAgICAgIGNvbnRyb2xXcmFwcGVyUHJvcHM6IHt9LFxuICAgICAgICBjdXN0b21Db250cm9sQ29udGVudDogbnVsbCxcbiAgICAgICAgZ2V0SXRlbTogbm9vcCxcbiAgICAgICAgaGlkZVBhZ2VySWZOb3ROZWVkZWQ6IGZhbHNlLFxuICAgICAgICBpZGVudGlmaWVyOiB1dWlkKCksXG4gICAgICAgIGluaXRpYWxQYWdlOiAxLFxuICAgICAgICBpdGVtTG9hZGluZ0NvbnRlbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgaXRlbVRvSlNYQ29udmVydGVyOiBpZGVudGl0eSxcbiAgICAgICAgaXRlbVdyYXBwZXJQcm9wczoge30sXG4gICAgICAgIGp1bXBUb0ZpcnN0UGFnZUNvbnRyb2xDb250ZW50OiAn4oekJyxcbiAgICAgICAganVtcFRvTGFzdFBhZ2VDb250cm9sQ29udGVudDogJ+KHpScsXG4gICAgICAgIGp1bXBUb05leHRQYWdlQ29udHJvbENvbnRlbnQ6ICfihpInLFxuICAgICAgICBqdW1wVG9QcmV2aW91c1BhZ2VDb250cm9sQ29udGVudDogJ+KGkCcsXG4gICAgICAgIG51bUl0ZW1zUGVyUGFnZTogMTAsXG4gICAgICAgIG51bVBhZ2VUb2dnbGVzOiA1LFxuICAgICAgICBwb3NpdGlvbjogUGFnaW5hdGlvbi5wb3NpdGlvbi5BQk9WRSxcbiAgICAgICAgc2hvd0p1bXBUb0ZpcnN0UGFnZUNvbnRyb2w6IHRydWUsXG4gICAgICAgIHNob3dKdW1wVG9MYXN0UGFnZUNvbnRyb2w6IHRydWUsXG4gICAgICAgIHNob3dKdW1wVG9OZXh0UGFnZUNvbnRyb2w6IHRydWUsXG4gICAgICAgIHNob3dKdW1wVG9QcmV2aW91c1BhZ2VDb250cm9sOiB0cnVlLFxuICAgICAgICBzaG93UGFnaW5hdGlvblN0YXRlOiB0cnVlLFxuICAgICAgICB0b3RhbEl0ZW1zOiBudWxsLFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhQYWdpbmF0aW9uLmRlZmF1bHRQcm9wcylcblxuICAgIG1vdW50ZWQgPSBmYWxzZVxuXG4gICAgc3RhdGUgPSB7XG4gICAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnByb3BzLmluaXRpYWxQYWdlLFxuICAgICAgICB0YXJnZXRJbmRleDogKHRoaXMucHJvcHMuaW5pdGlhbFBhZ2UgLSAxKSAqIHRoaXMucHJvcHMubnVtSXRlbXNQZXJQYWdlLFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBjdXJyZW50UGFnZSA9ICgpID0+IHRoaXMuc3RhdGUuY3VycmVudFBhZ2VcblxuICAgIGdldFBhZ2VGb3JJbmRleCA9IChpbmRleCwgaXRlbXNQZXJQYWdlID0gdGhpcy5wcm9wcy5udW1JdGVtc1BlclBhZ2UpID0+IE1hdGguY2VpbCgoaW5kZXggKyAxKSAvIGl0ZW1zUGVyUGFnZSlcbiAgICB0b3RhbFBhZ2VzID0gKCkgPT4gTWF0aC5jZWlsKHRoaXMucHJvcHMudG90YWxJdGVtcyAvIHRoaXMucHJvcHMubnVtSXRlbXNQZXJQYWdlKVxuXG4gICAgZmlyc3RWaXNpYmxlSXRlbUluZGV4ID0gKCkgPT4gKHRoaXMuY3VycmVudFBhZ2UoKSAtIDEpICogdGhpcy5wcm9wcy5udW1JdGVtc1BlclBhZ2VcblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkgICAgIHsgdGhpcy5tb3VudGVkID0gdHJ1ZTsgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkgIHsgdGhpcy5tb3VudGVkID0gZmFsc2U7IH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShfLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgaWYgKHByZXZTdGF0ZS5jdXJyZW50UGFnZSAhPT0gdGhpcy5jdXJyZW50UGFnZSgpKSB7XG4gICAgICAgICAgICBmaW5kRE9NTm9kZSh0aGlzLnJlZnMuaXRlbV8wKS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpIHtcbiAgICAgICAgY29uc3Qgb2xkUHJvcHMgPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIC8vIHVzZSB0cmFuc2FjdGlvbmFsIGBzZXRTdGF0ZSgpYCBzeW50YXggdG8gZW5zdXJlIHRoYXQgcGVuZGluZyBzdGF0ZSB1cGRhdGVzIGFyZSBob25vcmVkLFxuICAgICAgICAvLyBsaWtlIHRob3NlIGZyb20gYGp1bXBUb0luZGV4KClgXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlLCBwcm9wcykgPT4ge1xuICAgICAgICAgICAgLy8gTk9URTogYHByb3BzYCBoZXJlIGlzIHRlY2huaWNhbGx5IHRoZSBgbmV4dFByb3BzYCB5b3UnZCByZWNlaXZlIGZyb20gdGhlIGZpcnN0IGNXUlAgYXJndW1lbnRcbiAgICAgICAgICAgIC8vIHNvIHRoYXQncyB3aHkgd2UncmUgY2FjaGluZyBgb2xkUHJvcHNgIG91dHNpZGUgdGhlIGBzZXRTdGF0ZWBcbiAgICAgICAgICAgIGlmIChwcm9wcy5pZGVudGlmaWVyICE9PSBvbGRQcm9wcy5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IDEsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMuZ2V0UGFnZUZvckluZGV4KHN0YXRlLnRhcmdldEluZGV4LCBwcm9wcy5udW1JdGVtc1BlclBhZ2UpLFxuICAgICAgICAgICAgICAgIHRhcmdldEluZGV4OiBzdGF0ZS50YXJnZXRJbmRleCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBqdW1wVG9JbmRleCA9IChpKSA9PiB7XG4gICAgICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMucHJvcHMudG90YWxJdGVtcykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCBwYWdlIHRvIGludmFsaWQgaW5kZXggJHtpfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMuZ2V0UGFnZUZvckluZGV4KGkpLFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXg6IGksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdlbmVyYXRlQ29udHJvbHMoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBbXTtcbiAgICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlKCk7XG4gICAgICAgIGNvbnN0IHRvdGFsUGFnZXMgPSB0aGlzLnRvdGFsUGFnZXMoKTtcbiAgICAgICAgY29uc3Qgc3RhcnRQYWdlID0gY3VycmVudFBhZ2UgLSAoKGN1cnJlbnRQYWdlIC0gMSkgJSB0aGlzLnByb3BzLm51bVBhZ2VUb2dnbGVzKTtcbiAgICAgICAgY29uc3QgZW5kUGFnZSA9IE1hdGgubWluKHN0YXJ0UGFnZSArIHRoaXMucHJvcHMubnVtUGFnZVRvZ2dsZXMgLSAxLCB0b3RhbFBhZ2VzKTtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG93UGFnaW5hdGlvblN0YXRlKSB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBpc0Z1bmN0aW9uKHRoaXMucHJvcHMuc2hvd1BhZ2luYXRpb25TdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnByb3BzLnNob3dQYWdpbmF0aW9uU3RhdGUoY3VycmVudFBhZ2UsIHRvdGFsUGFnZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogYCR7Y3VycmVudFBhZ2V9IC8gJHt0b3RhbFBhZ2VzfWAsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnYi1wYWdpbmF0aW9uLWNvbnRyb2wgYi1wYWdpbmF0aW9uLWNvbnRyb2wtc3RhdGUnLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG93SnVtcFRvRmlyc3RQYWdlQ29udHJvbCkge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBbUGFnaW5hdGlvbi5DT05UUk9MX0RBVEFfQVRUUklCVVRFXTogUGFnaW5hdGlvbi5jb250cm9sLkZJUlNULFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLnByb3BzLmp1bXBUb0ZpcnN0UGFnZUNvbnRyb2xDb250ZW50LFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2ItcGFnaW5hdGlvbi1jb250cm9sIGItcGFnaW5hdGlvbi1jb250cm9sLWZpcnN0JyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPT09IDEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNob3dKdW1wVG9QcmV2aW91c1BhZ2VDb250cm9sKSB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIFtQYWdpbmF0aW9uLkNPTlRST0xfREFUQV9BVFRSSUJVVEVdOiBQYWdpbmF0aW9uLmNvbnRyb2wuUFJFVklPVVMsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMucHJvcHMuanVtcFRvUHJldmlvdXNQYWdlQ29udHJvbENvbnRlbnQsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnYi1wYWdpbmF0aW9uLWNvbnRyb2wgYi1wYWdpbmF0aW9uLWNvbnRyb2wtcHJldmlvdXMnLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA9PT0gMSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0UGFnZTsgaSA8PSBlbmRQYWdlOyBpKyspIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgW1BhZ2luYXRpb24uQ09OVFJPTF9EQVRBX0FUVFJJQlVURV06IGksXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGksXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnYi1wYWdpbmF0aW9uLWNvbnRyb2wnLFxuICAgICAgICAgICAgICAgIHByZXNzZWQ6IGN1cnJlbnRQYWdlID09PSBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG93SnVtcFRvTmV4dFBhZ2VDb250cm9sKSB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIFtQYWdpbmF0aW9uLkNPTlRST0xfREFUQV9BVFRSSUJVVEVdOiBQYWdpbmF0aW9uLmNvbnRyb2wuTkVYVCxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogdGhpcy5wcm9wcy5qdW1wVG9OZXh0UGFnZUNvbnRyb2xDb250ZW50LFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2ItcGFnaW5hdGlvbi1jb250cm9sIGItcGFnaW5hdGlvbi1jb250cm9sLW5leHQnLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA9PT0gdG90YWxQYWdlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2hvd0p1bXBUb0xhc3RQYWdlQ29udHJvbCkge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBbUGFnaW5hdGlvbi5DT05UUk9MX0RBVEFfQVRUUklCVVRFXTogUGFnaW5hdGlvbi5jb250cm9sLkxBU1QsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMucHJvcHMuanVtcFRvTGFzdFBhZ2VDb250cm9sQ29udGVudCxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdiLXBhZ2luYXRpb24tY29udHJvbCBiLXBhZ2luYXRpb24tY29udHJvbC1sYXN0JyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPT09IHRvdGFsUGFnZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmN1c3RvbUNvbnRyb2xDb250ZW50KSB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLnByb3BzLmN1c3RvbUNvbnRyb2xDb250ZW50LFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2ItcGFnaW5hdGlvbi1jb250cm9sIGItcGFnaW5hdGlvbi1jb250cm9sLWN1c3RvbScsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIGdlbmVyYXRlSXRlbXMoKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSB0aGlzLmZpcnN0VmlzaWJsZUl0ZW1JbmRleCgpO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBNYXRoLm1pbih0aGlzLnByb3BzLnRvdGFsSXRlbXMsIGZpcnN0SW5kZXggKyB0aGlzLnByb3BzLm51bUl0ZW1zUGVyUGFnZSkgLSAxO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBmaXJzdEluZGV4OyBpIDw9IGxhc3RJbmRleDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHRoaXMucHJvcHMuZ2V0SXRlbShpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgaGFuZGxlUGFnZVNlbGVjdGVkID0gKG9wdGlvbikgPT4ge1xuICAgICAgICBsZXQgbmV4dFRhcmdldEluZGV4O1xuXG4gICAgICAgIHN3aXRjaCAob3B0aW9uW1BhZ2luYXRpb24uQ09OVFJPTF9EQVRBX0FUVFJJQlVURV0pIHtcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBQYWdpbmF0aW9uLmNvbnRyb2wuRklSU1Q6XG4gICAgICAgICAgICBuZXh0VGFyZ2V0SW5kZXggPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYWdpbmF0aW9uLmNvbnRyb2wuUFJFVklPVVM6XG4gICAgICAgICAgICBuZXh0VGFyZ2V0SW5kZXggPSB0aGlzLmZpcnN0VmlzaWJsZUl0ZW1JbmRleCgpIC0gdGhpcy5wcm9wcy5udW1JdGVtc1BlclBhZ2U7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFBhZ2luYXRpb24uY29udHJvbC5ORVhUOlxuICAgICAgICAgICAgbmV4dFRhcmdldEluZGV4ID0gdGhpcy5maXJzdFZpc2libGVJdGVtSW5kZXgoKSArIHRoaXMucHJvcHMubnVtSXRlbXNQZXJQYWdlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQYWdpbmF0aW9uLmNvbnRyb2wuTEFTVDpcbiAgICAgICAgICAgIG5leHRUYXJnZXRJbmRleCA9IHRoaXMucHJvcHMudG90YWxJdGVtcyAtIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbmV4dFRhcmdldEluZGV4ID0gcGFyc2VJbnQob3B0aW9uW1BhZ2luYXRpb24uQ09OVFJPTF9EQVRBX0FUVFJJQlVURV0sIDEwKSAqIHRoaXMucHJvcHMubnVtSXRlbXNQZXJQYWdlIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMuZ2V0UGFnZUZvckluZGV4KG5leHRUYXJnZXRJbmRleCksXG4gICAgICAgICAgICB0YXJnZXRJbmRleDogbmV4dFRhcmdldEluZGV4LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVJdGVtUHJvbWlzZUZ1bGZpbGxtZW50ID0gKHBheWxvYWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW91bnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaXRlbVRvSlNYQ29udmVydGVyKHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVySXRlbXMoKSB7XG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wcy5pdGVtV3JhcHBlclByb3BzO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QXJyb3dLZXlOYXZpZ2F0aW9uXG4gICAgICAgICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItcGFnaW5hdGlvbi1pdGVtcycsIHByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgIHt0aGlzLmdlbmVyYXRlSXRlbXMoKS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8QXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9e2luZGV4ID09PSAwID8gJ2l0ZW1fMCcgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1wYWdpbmF0aW9uLWl0ZW0nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiLXBhZ2luYXRpb24taXRlbS1ldmVuJzogaW5kZXggJSAyID09PSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYi1wYWdpbmF0aW9uLWl0ZW0tb2RkJzogaW5kZXggJSAyICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcGFnaW5hdGlvbi1pbmRleD17dGhpcy5wcm9wcy5udW1JdGVtc1BlclBhZ2UgKiAodGhpcy5jdXJyZW50UGFnZSgpIC0gMSkgKyBpbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nQ29udGVudD17dGhpcy5wcm9wcy5pdGVtTG9hZGluZ0NvbnRlbnR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpdGVtIGluc3RhbmNlb2YgUHJvbWlzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udGhlbih0aGlzLmhhbmRsZUl0ZW1Qcm9taXNlRnVsZmlsbG1lbnQsIHRoaXMuaGFuZGxlSXRlbVByb21pc2VGdWxmaWxsbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnByb3BzLml0ZW1Ub0pTWENvbnZlcnRlcihpdGVtKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXN5bmM+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L0Fycm93S2V5TmF2aWdhdGlvbj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXJDb250cm9scyhwb3NpdGlvbikge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5oaWRlUGFnZXJJZk5vdE5lZWRlZCAmJiB0aGlzLnByb3BzLnRvdGFsSXRlbXMgPD0gdGhpcy5wcm9wcy5udW1JdGVtc1BlclBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8U2VnbWVudGVkQ29udHJvbFxuICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLmNvbnRyb2xXcmFwcGVyUHJvcHN9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1wYWdpbmF0aW9uLWNvbnRyb2xzJywgdGhpcy5wcm9wcy5jb250cm9sV3JhcHBlclByb3BzLmNsYXNzTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBbJ2ItcGFnaW5hdGlvbi1jb250cm9scy1hYm92ZSddOiBwb3NpdGlvbiA9PT0gUGFnaW5hdGlvbi5wb3NpdGlvbi5BQk9WRSxcbiAgICAgICAgICAgICAgICAgICAgWydiLXBhZ2luYXRpb24tY29udHJvbHMtYmVsb3cnXTogcG9zaXRpb24gPT09IFBhZ2luYXRpb24ucG9zaXRpb24uQkVMT1csXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgb3B0aW9ucz17dGhpcy5nZW5lcmF0ZUNvbnRyb2xzKCl9XG4gICAgICAgICAgICAgICAgb25PcHRpb25TZWxlY3RlZD17dGhpcy5oYW5kbGVQYWdlU2VsZWN0ZWR9IC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyVmlldygpIHtcbiAgICAgICAgY29uc3Qge3Bvc2l0aW9ufSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGNvbnN0IHAgPSBQYWdpbmF0aW9uLnBvc2l0aW9uO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nYi1wYWdpbmF0aW9uJz5cbiAgICAgICAgICAgICAgICB7cG9zaXRpb24gPT09IHAuQUJPVkUgfHwgcG9zaXRpb24gPT09IHAuQk9USCA/IHRoaXMucmVuZGVyQ29udHJvbHMocC5BQk9WRSkgOiBudWxsfVxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmJlZm9yZX1cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJJdGVtcygpfVxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmFmdGVyfVxuICAgICAgICAgICAgICAgIHtwb3NpdGlvbiA9PT0gcC5CRUxPVyB8fCBwb3NpdGlvbiA9PT0gcC5CT1RIID8gdGhpcy5yZW5kZXJDb250cm9scyhwLkJFTE9XKSA6IG51bGx9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IHsuLi5vbWl0KHRoaXMucHJvcHMsIFBhZ2luYXRpb24uaW50ZXJuYWxLZXlzKX0gY2xhc3NOYW1lPXtjeCgnYi1wYWdpbmF0aW9uLXdyYXBwZXInLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclZpZXcoKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1wYWdpbmF0aW9uL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |