diff --git a/app/app.js b/app/app.js
index c67ee9c..7f92306 100644
--- a/app/app.js
+++ b/app/app.js
@@ -7,7 +7,8 @@
'oitozero.ngSweetAlert',
'angularMoment'
]).
- config(['$routeProvider', function($routeProvider) {
+ config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
$routeProvider.otherwise({redirectTo: '/'});
+ $locationProvider.html5Mode(true);
}]);
})();
diff --git a/public/app.min.js b/public/app.min.js
index 44afdd3..57c364a 100644
--- a/public/app.min.js
+++ b/public/app.min.js
@@ -1,2 +1,2 @@
-!function(){"use strict";angular.module("ether-wheel",["ngRoute","rzModule","oitozero.ngSweetAlert","angularMoment"]).config(["$routeProvider",function(t){t.otherwise({redirectTo:"/"})}])}(),function(){"use strict";function t(t){var e=[{constant:!0,inputs:[{name:"",type:"uint256"}],name:"contributors",outputs:[{name:"",type:"address"}],type:"function"},{constant:!0,inputs:[],name:"goal",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!0,inputs:[{name:"",type:"address"}],name:"contributions",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"newHost",type:"address"}],name:"changeHost",outputs:[],type:"function"},{constant:!1,inputs:[],name:"destroy",outputs:[],type:"function"},{constant:!1,inputs:[{name:"amount",type:"uint256"}],name:"setContribution",outputs:[],type:"function"},{constant:!0,inputs:[],name:"numWinners",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!0,inputs:[],name:"numContributors",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!1,inputs:[],name:"addToContribution",outputs:[],type:"function"},{constant:!0,inputs:[],name:"increment",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"amount",type:"uint256"}],name:"removeFromContribution",outputs:[],type:"function"},{constant:!0,inputs:[{name:"",type:"uint256"}],name:"recentWins",outputs:[{name:"winner",type:"address"},{name:"timestamp",type:"uint256"},{name:"contribution",type:"uint256"}],type:"function"},{constant:!0,inputs:[],name:"host",outputs:[{name:"",type:"address"}],type:"function"},{inputs:[{name:"_goalInFinney",type:"uint256"},{name:"_incrementInFinney",type:"uint256"},{name:"_recentWinsCount",type:"uint8"}],type:"constructor"},{anonymous:!1,inputs:[{indexed:!1,name:"winner",type:"address"},{indexed:!1,name:"timestamp",type:"uint256"},{indexed:!1,name:"contribution",type:"uint256"}],name:"Won",type:"event"},{anonymous:!1,inputs:[{indexed:!1,name:"contributor",type:"address"}],name:"ChangedContribution",type:"event"}],n=function(n,o,i){this.address=n,this.contributionChangedCallback=o,this.roundEndedCallback=i;var r=t.web3.eth.contract(e);this.contract=r.at(n),this.goal=t.web3.fromWei(this.contract.goal(),"ether").toString(),this.increment=t.web3.fromWei(this.contract.increment(),"ether").toString(),this.contributorsData={},this.desiredContribution=0,this.contract.ChangedContribution().watch(this.onContributionChanged.bind(this)),this.contract.Won().watch(this.onWon.bind(this)),this.initializeContributorsData(),this.updateContractData(),this.refreshRecentWinsList()};return n.prototype.updateContractData=function(){var e=t.web3.eth.getBalance(this.address),n=t.web3.fromWei(e,"ether");this.balance=parseFloat(n.toString())},n.prototype.initializeContributorsData=function(){if(t.isConnected()){this.contributorsData={};for(var e=this.contract.numContributors().toString(),n=0;e>n;++n){var o=this.contract.contributors(n).toString();this.addContributor(o,n)}}},n.prototype.addContributor=function(e,n){this.contributorsData[e]={address:e,contribution:parseFloat(t.web3.fromWei(this.contract.contributions(e),"ether").toString()),index:n}},n.prototype.refreshRecentWinsList=function(){this.recentWins=[];for(var t=this.contract.numWinners(),e=0;t>e;++e)this.recentWins.push(this.contract.recentWins(e))},n.prototype.getContribution=function(t){var e=0;return t in this.contributorsData&&(e=this.contributorsData[t].contribution),e},n.prototype.getAdjustedBalance=function(t){var e=this.desiredContribution-this.getContribution(t);return this.balance+e},n.prototype.setContribution=function(e,n,o){var i=t.web3.toWei(n,"ether")-t.web3.toWei(this.getContribution(e),"ether"),r=t.web3.toWei(n,"ether"),s=0;i>0&&(s=i);var a=this.contract.setContribution.getData(r),c={value:s,from:e,to:this.address,data:a};c.gas=t.web3.eth.estimateGas(c)+1e5,this.contract.setContribution(r,c,o)},n.prototype.onContributionChanged=function(e,n){if(e)return void console.log(e);var o=n.args.contributor,i=parseFloat(t.web3.fromWei(this.contract.contributions(o),"ether").toString()),r=!(o in this.contributorsData);r?this.addContributor(o,i):this.contributorsData[o].contribution=i,this.updateContractData(),this.contributionChangedCallback&&this.contributionChangedCallback(this,o,i,r)},n.prototype.onWon=function(t,e){return t?void console.log(t):(this.desiredContribution=0,this.updateContractData(),this.refreshRecentWinsList(),void(this.roundEndedCallback&&this.roundEndedCallback(this,e.args.winner)))},n}t.$inject=["ethereum"],angular.module("ether-wheel").factory("Wheel",t)}(),function(){"use strict";function t(t,e,n,o,i){function r(){W.isConnected=o.isConnected(),W.isConnected&&(s(),v.addData({value:1,color:g,label:C}),W.wheels=[],y.forEach(function(t){var e=new i(t,m,f);W.wheels.push(e)}),l(W.wheels[0]),W.accounts=o.web3.eth.accounts,W.selectedAccount=o.web3.eth.defaultAccount,W.selectedAccount||(W.selectedAccount=o.web3.eth.coinbase),p())}function s(){function t(t){var e=t.label===W.selectedAccount?"You":t.label,n=e+": "+t.value.toFixed(2)+" Ξ";if(W.goal){var o=t.value/W.goal*100;n+=" ("+Math.round(100*o)/100+"%)"}return n}v&&v.destroy();var e={animationEasing:"easeInOut",segmentStrokeWidth:3,animationSteps:20,segmentStrokeColor:"#EBF0F1",percentageInnerCutout:75,responsive:!0,tooltipTemplate:t},n=document.getElementById("wheel").getContext("2d");v=new Chart(n).Doughnut([],e)}function a(t){var e=t.contributorsData;for(var n in e){var o=e[n],i={label:o.address,value:o.contribution,color:d(o.address)};v.addData(i,o.index)}v.addData({label:C,color:g,value:W.selectedWheel.goal-W.selectedWheel.getAdjustedBalance(W.selectedAccount)}),v.update()}function c(){v.segments[v.segments.length-1].value=W.selectedWheel.goal-W.selectedWheel.getAdjustedBalance(W.selectedAccount),v.update()}function u(){var t=W.selectedWheel.contributorsData;if(W.selectedAccount in t){var e=t[W.selectedAccount].index;v.segments[e].value=W.selectedWheel.desiredContribution}else{var e=Object.keys(t).length;W.selectedWheel.addContributor(W.selectedAccount,e);var n={label:W.selectedAccount,value:W.selectedWheel.desiredContribution,color:d(W.selectedAccount)};v.addData(n,e-2)}c()}function d(t){return t===W.selectedAccount?"#5cb85c":"#3D3E3F"}function l(t){W.selectedWheel!==t&&(W.selectedWheel=t,W.selectedWheel.desiredContribution=W.selectedWheel.getContribution(W.selectedAccount),s(),a(W.selectedWheel),u())}function h(){function t(t,e){if(t){var o=t;o+="
Make sure you've unlocked your account to make transactions (e.g. using the --unlock command with geth). If you're having trouble, you can also set your contribution by sending ether directly to the wheel at:
"+W.selectedWheel.address+'
( view verified source code)',n.swal({title:"Error Setting Contribution",text:o,type:"error",html:!0})}else n.swal({title:"Success!",text:"Your request has been successfully sent to the Ethereum network for processing. You'll see your account balance updated soon.
This may take a minute or two.",type:"success",html:!0}),W.selectedWheel.desiredContribution=W.selectedWheel.getContribution(W.selectedAccount),v.segments[W.selectedWheel.contributorsData[W.selectedAccount].index].value=W.selectedWheel.getContribution(W.selectedAccount),c()}W.selectedWheel.setContribution(W.selectedAccount,W.selectedWheel.desiredContribution,t)}function b(t){return o.web3.fromWei(o.web3.eth.getBalance(t),"ether")}function p(){W.wheels.forEach(function(t){t.desiredContribution=t.getContribution(W.selectedAccount)}),s(),a(W.selectedWheel)}function m(t,n,o,i){if(n==W.selectedAccount&&(W.selectedWheel.desiredContribution=o),t==W.selectedWheel){var r=W.selectedWheel.contributorsData,s=r[n].index;if(i){var a={label:n,value:o,color:d(n)};v.addData(a,s)}else v.segments[r[n].index].value=o;c()}e.$apply()}function f(t,n){W.selectedWheel.desiredContribution=W.selectedWheel.getContribution(W.selectedAccount),e.$apply()}var g="#dce6e9",C="Empty",y=["0x53891ef3793d8534Ad42312BcC77dFAd51Bb5F1C","0x27C0aFc960FbeaB1c6BbA6bE3837d40E948B2250","0x1107BD232640434008b8ce1FD058837E141f754B"],v=null,W=this;W.web3=o.web3,W.moment=moment,W.selectWheel=l,W.getAccountBalance=b,W.onAccountChanged=p,W.setContribution=h,W.onSliderChanged=u,r()}t.$inject=["$route","$scope","SweetAlert","ethereum","Wheel"],angular.module("ether-wheel").controller("WheelCtrl",t)}(),function(){"use strict";function t(){function t(){n.web3.setProvider(new n.web3.providers.HttpProvider("http://localhost:8545"))}function e(){return n.web3.currentProvider.isConnected()}var n={web3:new Web3,isConnected:e};return t(),n}angular.module("ether-wheel").service("ethereum",t)}();
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC5qcyIsIndoZWVsLnNlcnZpY2UuanMiLCJhcHAubWluLmpzIiwid2hlZWwuY29udHJvbGxlci5qcyIsImV0aGVyZXVtLnNlcnZpY2UuanMiXSwibmFtZXMiOlsiYW5ndWxhciIsIm1vZHVsZSIsImNvbmZpZyIsIiRyb3V0ZVByb3ZpZGVyIiwib3RoZXJ3aXNlIiwicmVkaXJlY3RUbyIsIldoZWVsRmFjdG9yeSIsImV0aGVyZXVtIiwiYWJpIiwiY29uc3RhbnQiLCJpbnB1dHMiLCJuYW1lIiwidHlwZSIsIm91dHB1dHMiLCJhbm9ueW1vdXMiLCJpbmRleGVkIiwiV2hlZWwiLCJjb250YWN0QWRkcmVzcyIsImNvbnRyaWJ1dGlvbkNoYW5nZWRDYWxsYmFjayIsInJvdW5kRW5kZWRDYWxsYmFjayIsInRoaXMiLCJhZGRyZXNzIiwiY29udHJhY3RCbHVlcHJpbnQiLCJ3ZWIzIiwiZXRoIiwiY29udHJhY3QiLCJhdCIsImdvYWwiLCJmcm9tV2VpIiwidG9TdHJpbmciLCJpbmNyZW1lbnQiLCJjb250cmlidXRvcnNEYXRhIiwiZGVzaXJlZENvbnRyaWJ1dGlvbiIsIkNoYW5nZWRDb250cmlidXRpb24iLCJ3YXRjaCIsIm9uQ29udHJpYnV0aW9uQ2hhbmdlZCIsImJpbmQiLCJXb24iLCJvbldvbiIsImluaXRpYWxpemVDb250cmlidXRvcnNEYXRhIiwidXBkYXRlQ29udHJhY3REYXRhIiwicmVmcmVzaFJlY2VudFdpbnNMaXN0IiwicHJvdG90eXBlIiwid2VpIiwiZ2V0QmFsYW5jZSIsImV0aGVyIiwiYmFsYW5jZSIsInBhcnNlRmxvYXQiLCJpc0Nvbm5lY3RlZCIsIm51bUNvbnRyaWJ1dG9ycyIsImkiLCJjb250cmlidXRvckFkZHJlc3MiLCJjb250cmlidXRvcnMiLCJhZGRDb250cmlidXRvciIsImluZGV4IiwiY29udHJpYnV0aW9uIiwiY29udHJpYnV0aW9ucyIsInJlY2VudFdpbnMiLCJudW1SZWNlbnRXaW5zIiwibnVtV2lubmVycyIsInB1c2giLCJnZXRDb250cmlidXRpb24iLCJhY2NvdW50IiwiY3VycmVudENvbnRyaWJ1dGlvbiIsImdldEFkanVzdGVkQmFsYW5jZSIsImRlbHRhQ29udHJpYnV0aW9uIiwic2V0Q29udHJpYnV0aW9uIiwidmFsdWUiLCJjYWxsYmFjayIsInRvV2VpIiwiZGVzaXJlZENvbnRyaWJ1dGlvbkluV2VpIiwidmFsdWVUb1NlbmQiLCJjYWxsRGF0YSIsImdldERhdGEiLCJ0cmFuc2FjdGlvbiIsImZyb20iLCJ0byIsImRhdGEiLCJnYXMiLCJlc3RpbWF0ZUdhcyIsImVycm9yIiwicmVzdWx0IiwiY29uc29sZSIsImxvZyIsImFyZ3MiLCJjb250cmlidXRvciIsIm5ld0NvbnRyaWJ1dGlvbiIsImlzTmV3Q29udHJpYnV0b3IiLCJ3aW5uZXIiLCIkaW5qZWN0IiwiZmFjdG9yeSIsIldoZWVsQ3RybCIsIiRyb3V0ZSIsIiRzY29wZSIsIlN3ZWV0QWxlcnQiLCJhY3RpdmF0ZSIsInZtIiwiY3JlYXRlQ2hhcnQiLCJjaGFydCIsImFkZERhdGEiLCJjb2xvciIsImVtcHR5QmFyQ29sb3IiLCJsYWJlbCIsImVtcHR5QmFyTGFiZWwiLCJ3aGVlbHMiLCJjb250cmFjdEFkZHJlc3NlcyIsImZvckVhY2giLCJuZXdXaGVlbCIsIm9uUm91bmRFbmRlZCIsInNlbGVjdFdoZWVsIiwiYWNjb3VudHMiLCJzZWxlY3RlZEFjY291bnQiLCJkZWZhdWx0QWNjb3VudCIsImNvaW5iYXNlIiwib25BY2NvdW50Q2hhbmdlZCIsImdldFRvb2x0aXBUZW1wbGF0ZSIsInZhbHVlT2JqZWN0IiwidG9vbHRpcCIsInRvRml4ZWQiLCJwZXJjZW50YWdlIiwiTWF0aCIsInJvdW5kIiwiZGVzdHJveSIsImNoYXJ0T3B0aW9ucyIsImFuaW1hdGlvbkVhc2luZyIsInNlZ21lbnRTdHJva2VXaWR0aCIsImFuaW1hdGlvblN0ZXBzIiwic2VnbWVudFN0cm9rZUNvbG9yIiwicGVyY2VudGFnZUlubmVyQ3V0b3V0IiwicmVzcG9uc2l2ZSIsInRvb2x0aXBUZW1wbGF0ZSIsImN0eCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRDb250ZXh0IiwiQ2hhcnQiLCJEb3VnaG51dCIsInBvcHVsYXRlQ2hhcnQiLCJ3aGVlbCIsImNoYXJ0RGF0YSIsImdldENoYXJ0Q29sb3JGb3JBY2NvdW50Iiwic2VsZWN0ZWRXaGVlbCIsInVwZGF0ZSIsInVwZGF0ZUNoYXJ0RW1wdHlTbG90Iiwic2VnbWVudHMiLCJsZW5ndGgiLCJ1cGRhdGVDaGFydENvbnRyaWJ1dGlvblByZXZpZXciLCJPYmplY3QiLCJrZXlzIiwib25Db250cmlidXRpb25TZXQiLCJlcnJvck1lc3NhZ2UiLCJzdWJzdHJpbmciLCJzd2FsIiwidGl0bGUiLCJ0ZXh0IiwiaHRtbCIsImdldEFjY291bnRCYWxhbmNlIiwiY29udHJpYnV0b3JBY2NvdW50IiwiJGFwcGx5Iiwid2lubmVyQWRkcmVzcyIsIm1vbWVudCIsIm9uU2xpZGVyQ2hhbmdlZCIsImNvbnRyb2xsZXIiLCJzZXJ2aWNlIiwic2V0UHJvdmlkZXIiLCJwcm92aWRlcnMiLCJIdHRwUHJvdmlkZXIiLCJjdXJyZW50UHJvdmlkZXIiLCJXZWIzIl0sIm1hcHBpbmdzIjoiQ0FBQSxXQUNFLFlBRUFBLFNBQVFDLE9BQU8sZUFDYixVQUNBLFdBQ0Esd0JBQ0Esa0JBRUZDLFFBQVEsaUJBQWtCLFNBQVNDLEdBQ2pDQSxFQUFlQyxXQUFXQyxXQUFZLFlDVjFDLFdBQ0UsWUFLQSxTQUFTQyxHQUFhQyxHQUNwQixHQUFJQyxLQUFRQyxVQUFXLEVBQUtDLFNBQVdDLEtBQU8sR0FBR0MsS0FBTyxZQUFZRCxLQUFPLGVBQWVFLFVBQVlGLEtBQU8sR0FBR0MsS0FBTyxZQUFZQSxLQUFPLGFBQWFILFVBQVcsRUFBS0MsVUFBWUMsS0FBTyxPQUFPRSxVQUFZRixLQUFPLEdBQUdDLEtBQU8sWUFBWUEsS0FBTyxhQUFhSCxVQUFXLEVBQUtDLFNBQVdDLEtBQU8sR0FBR0MsS0FBTyxZQUFZRCxLQUFPLGdCQUFnQkUsVUFBWUYsS0FBTyxHQUFHQyxLQUFPLFlBQVlBLEtB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Iiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ2V0aGVyLXdoZWVsJywgW1xuICAgICduZ1JvdXRlJyxcbiAgICAncnpNb2R1bGUnLFxuICAgICdvaXRvemVyby5uZ1N3ZWV0QWxlcnQnLFxuICAgICdhbmd1bGFyTW9tZW50J1xuICBdKS5cbiAgY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCBmdW5jdGlvbigkcm91dGVQcm92aWRlcikge1xuICAgICRyb3V0ZVByb3ZpZGVyLm90aGVyd2lzZSh7cmVkaXJlY3RUbzogJy8nfSk7XG4gIH1dKTtcbn0pKCk7XG4iLCIoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBhbmd1bGFyLm1vZHVsZSgnZXRoZXItd2hlZWwnKS5mYWN0b3J5KCdXaGVlbCcsIFdoZWVsRmFjdG9yeSk7XG5cbiAgLyogQG5nSW5qZWN0ICovXG4gIGZ1bmN0aW9uIFdoZWVsRmFjdG9yeShldGhlcmV1bSkge1xuICAgIHZhciBhYmkgPSBbe1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJuYW1lXCI6XCJjb250cmlidXRvcnNcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJhZGRyZXNzXCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwiZ29hbFwiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwiYWRkcmVzc1wifV0sXCJuYW1lXCI6XCJjb250cmlidXRpb25zXCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOmZhbHNlLFwiaW5wdXRzXCI6W3tcIm5hbWVcIjpcIm5ld0hvc3RcIixcInR5cGVcIjpcImFkZHJlc3NcIn1dLFwibmFtZVwiOlwiY2hhbmdlSG9zdFwiLFwib3V0cHV0c1wiOltdLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjpmYWxzZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwiZGVzdHJveVwiLFwib3V0cHV0c1wiOltdLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjpmYWxzZSxcImlucHV0c1wiOlt7XCJuYW1lXCI6XCJhbW91bnRcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwibmFtZVwiOlwic2V0Q29udHJpYnV0aW9uXCIsXCJvdXRwdXRzXCI6W10sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcIm51bVdpbm5lcnNcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwibnVtQ29udHJpYnV0b3JzXCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOmZhbHNlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJhZGRUb0NvbnRyaWJ1dGlvblwiLFwib3V0cHV0c1wiOltdLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJpbmNyZW1lbnRcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6ZmFsc2UsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwiYW1vdW50XCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcIm5hbWVcIjpcInJlbW92ZUZyb21Db250cmlidXRpb25cIixcIm91dHB1dHNcIjpbXSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwibmFtZVwiOlwicmVjZW50V2luc1wiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJ3aW5uZXJcIixcInR5cGVcIjpcImFkZHJlc3NcIn0se1wibmFtZVwiOlwidGltZXN0YW1wXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9LHtcIm5hbWVcIjpcImNvbnRyaWJ1dGlvblwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcImhvc3RcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJhZGRyZXNzXCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImlucHV0c1wiOlt7XCJuYW1lXCI6XCJfZ29hbEluRmlubmV5XCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9LHtcIm5hbWVcIjpcIl9pbmNyZW1lbnRJbkZpbm5leVwiLFwidHlwZVwiOlwidWludDI1NlwifSx7XCJuYW1lXCI6XCJfcmVjZW50V2luc0NvdW50XCIsXCJ0eXBlXCI6XCJ1aW50OFwifV0sXCJ0eXBlXCI6XCJjb25zdHJ1Y3RvclwifSx7XCJhbm9ueW1vdXNcIjpmYWxzZSxcImlucHV0c1wiOlt7XCJpbmRleGVkXCI6ZmFsc2UsXCJuYW1lXCI6XCJ3aW5uZXJcIixcInR5cGVcIjpcImFkZHJlc3NcIn0se1wiaW5kZXhlZFwiOmZhbHNlLFwibmFtZVwiOlwidGltZXN0YW1wXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9LHtcImluZGV4ZWRcIjpmYWxzZSxcIm5hbWVcIjpcImNvbnRyaWJ1dGlvblwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJuYW1lXCI6XCJXb25cIixcInR5cGVcIjpcImV2ZW50XCJ9LHtcImFub255bW91c1wiOmZhbHNlLFwiaW5wdXRzXCI6W3tcImluZGV4ZWRcIjpmYWxzZSxcIm5hbWVcIjpcImNvbnRyaWJ1dG9yXCIsXCJ0eXBlXCI6XCJhZGRyZXNzXCJ9XSxcIm5hbWVcIjpcIkNoYW5nZWRDb250cmlidXRpb25cIixcInR5cGVcIjpcImV2ZW50XCJ9XTtcblxuICAgIHZhciBXaGVlbCA9IGZ1bmN0aW9uKGNvbnRhY3RBZGRyZXNzLCBjb250cmlidXRpb25DaGFuZ2VkQ2FsbGJhY2ssIHJvdW5kRW5kZWRDYWxsYmFjaykge1xuICAgICAgdGhpcy5hZGRyZXNzID0gY29udGFjdEFkZHJlc3M7XG4gICAgICB0aGlzLmNvbnRyaWJ1dGlvbkNoYW5nZWRDYWxsYmFjayA9IGNvbnRyaWJ1dGlvbkNoYW5nZWRDYWxsYmFjaztcbiAgICAgIHRoaXMucm91bmRFbmRlZENhbGxiYWNrID0gcm91bmRFbmRlZENhbGxiYWNrO1xuXG4gICAgICB2YXIgY29udHJhY3RCbHVlcHJpbnQgPSBldGhlcmV1bS53ZWIzLmV0aC5jb250cmFjdChhYmkpO1xuICAgICAgdGhpcy5jb250cmFjdCA9IGNvbnRyYWN0Qmx1ZXByaW50LmF0KGNvbnRhY3RBZGRyZXNzKTtcblxuICAgICAgdGhpcy5nb2FsID0gZXRoZXJldW0ud2ViMy5mcm9tV2VpKHRoaXMuY29udHJhY3QuZ29hbCgpLCAnZXRoZXInKS50b1N0cmluZygpO1xuICAgICAgdGhpcy5pbmNyZW1lbnQgPSBldGhlcmV1bS53ZWIzLmZyb21XZWkodGhpcy5jb250cmFjdC5pbmNyZW1lbnQoKSwgJ2V0aGVyJykudG9TdHJpbmcoKTtcblxuICAgICAgdGhpcy5jb250cmlidXRvcnNEYXRhID0ge307XG4gICAgICB0aGlzLmRlc2lyZWRDb250cmlidXRpb24gPSAwO1xuXG4gICAgICB0aGlzLmNvbnRyYWN0LkNoYW5nZWRDb250cmlidXRpb24oKS53YXRjaCh0aGlzLm9uQ29udHJpYnV0aW9uQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMuY29udHJhY3QuV29uKCkud2F0Y2godGhpcy5vbldvbi5iaW5kKHRoaXMpKTtcblxuICAgICAgdGhpcy5pbml0aWFsaXplQ29udHJpYnV0b3JzRGF0YSgpO1xuICAgICAgdGhpcy51cGRhdGVDb250cmFjdERhdGEoKTtcbiAgICAgIHRoaXMucmVmcmVzaFJlY2VudFdpbnNMaXN0KCk7XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgV2hlZWwucHJvdG90eXBlLnVwZGF0ZUNvbnRyYWN0RGF0YSA9IGZ1bmN0aW9uKCl7XG4gICAgICAvLyBDb250cmFjdCBiYWxhbmNlXG4gICAgICB2YXIgd2VpID0gZXRoZXJldW0ud2ViMy5ldGguZ2V0QmFsYW5jZSh0aGlzLmFkZHJlc3MpO1xuICAgICAgdmFyIGV0aGVyID0gZXRoZXJldW0ud2ViMy5mcm9tV2VpKHdlaSwgJ2V0aGVyJyk7XG4gICAgICB0aGlzLmJhbGFuY2UgPSBwYXJzZUZsb2F0KGV0aGVyLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIFdoZWVsLnByb3RvdHlwZS5pbml0aWFsaXplQ29udHJpYnV0b3JzRGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYoIWV0aGVyZXVtLmlzQ29ubmVjdGVkKCkpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHRoaXMuY29udHJpYnV0b3JzRGF0YSA9IHt9O1xuICAgICAgdmFyIG51bUNvbnRyaWJ1dG9ycyA9IHRoaXMuY29udHJhY3QubnVtQ29udHJpYnV0b3JzKCkudG9TdHJpbmcoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBudW1Db250cmlidXRvcnM7ICsraSkge1xuICAgICAgICB2YXIgY29udHJpYnV0b3JBZGRyZXNzID0gdGhpcy5jb250cmFjdC5jb250cmlidXRvcnMoaSkudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5hZGRDb250cmlidXRvcihjb250cmlidXRvckFkZHJlc3MsIGkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBXaGVlbC5wcm90b3R5cGUuYWRkQ29udHJpYnV0b3IgPSBmdW5jdGlvbihhZGRyZXNzLCBpbmRleCkge1xuICAgICAgdGhpcy5jb250cmlidXRvcnNEYXRhW2FkZHJlc3NdID0ge1xuICAgICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICBjb250cmlidXRpb246IHBhcnNlRmxvYXQoZXRoZXJldW0ud2ViMy5mcm9tV2VpKHRoaXMuY29udHJhY3QuY29udHJpYnV0aW9ucyhhZGRyZXNzKSwgJ2V0aGVyJykudG9TdHJpbmcoKSksXG4gICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBXaGVlbC5wcm90b3R5cGUucmVmcmVzaFJlY2VudFdpbnNMaXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnJlY2VudFdpbnMgPSBbXTtcbiAgICAgIHZhciBudW1SZWNlbnRXaW5zID0gdGhpcy5jb250cmFjdC5udW1XaW5uZXJzKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtUmVjZW50V2luczsgKytpKSB7XG4gICAgICAgIHRoaXMucmVjZW50V2lucy5wdXNoKHRoaXMuY29udHJhY3QucmVjZW50V2lucyhpKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFdoZWVsLnByb3RvdHlwZS5nZXRDb250cmlidXRpb24gPSBmdW5jdGlvbihhY2NvdW50KSB7XG4gICAgICB2YXIgY3VycmVudENvbnRyaWJ1dGlvbiA9IDA7XG4gICAgICBpZihhY2NvdW50IGluIHRoaXMuY29udHJpYnV0b3JzRGF0YSkge1xuICAgICAgICBjdXJyZW50Q29udHJpYnV0aW9uID0gdGhpcy5jb250cmlidXRvcnNEYXRhW2FjY291bnRdLmNvbnRyaWJ1dGlvbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50Q29udHJpYnV0aW9uO1xuICAgIH07XG5cbiAgICBXaGVlbC5wcm90b3R5cGUuZ2V0QWRqdXN0ZWRCYWxhbmNlID0gZnVuY3Rpb24oYWNjb3VudCkge1xuICAgICAgdmFyIGRlbHRhQ29udHJpYnV0aW9uID0gKHRoaXMuZGVzaXJlZENvbnRyaWJ1dGlvbiAtIHRoaXMuZ2V0Q29udHJpYnV0aW9uKGFjY291bnQpKTtcbiAgICAgIHJldHVybiB0aGlzLmJhbGFuY2UgKyBkZWx0YUNvbnRyaWJ1dGlvbjtcbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLnNldENvbnRyaWJ1dGlvbiA9IGZ1bmN0aW9uKGFjY291bnQsIHZhbHVlLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGRlbHRhQ29udHJpYnV0aW9uID0gZXRoZXJldW0ud2ViMy50b1dlaSh2YWx1ZSwgJ2V0aGVyJykgLSBldGhlcmV1bS53ZWIzLnRvV2VpKHRoaXMuZ2V0Q29udHJpYnV0aW9uKGFjY291bnQpLCAnZXRoZXInKTtcbiAgICAgIHZhciBkZXNpcmVkQ29udHJpYnV0aW9uSW5XZWkgPSBldGhlcmV1bS53ZWIzLnRvV2VpKHZhbHVlLCAnZXRoZXInKTtcbiAgICAgIHZhciB2YWx1ZVRvU2VuZCA9IDA7XG4gICAgICBpZihkZWx0YUNvbnRyaWJ1dGlvbiA+IDApIHtcbiAgICAgICAgdmFsdWVUb1NlbmQgPSBkZWx0YUNvbnRyaWJ1dGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhbGxEYXRhID0gdGhpcy5jb250cmFjdC5zZXRDb250cmlidXRpb24uZ2V0RGF0YShkZXNpcmVkQ29udHJpYnV0aW9uSW5XZWkpO1xuICAgICAgdmFyIHRyYW5zYWN0aW9uID0geyB2YWx1ZTogdmFsdWVUb1NlbmQsIGZyb206IGFjY291bnQsIHRvOiB0aGlzLmFkZHJlc3MsIGRhdGE6IGNhbGxEYXRhIH07XG4gICAgICB0cmFuc2FjdGlvbi5nYXMgPSBldGhlcmV1bS53ZWIzLmV0aC5lc3RpbWF0ZUdhcyh0cmFuc2FjdGlvbikgKyAxMDAwMDA7XG4gICAgICB0aGlzLmNvbnRyYWN0LnNldENvbnRyaWJ1dGlvbihkZXNpcmVkQ29udHJpYnV0aW9uSW5XZWksIHRyYW5zYWN0aW9uLCBjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIFdoZWVsLnByb3RvdHlwZS5vbkNvbnRyaWJ1dGlvbkNoYW5nZWQgPSBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgICBpZihlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFkZHJlc3MgPSByZXN1bHQuYXJncy5jb250cmlidXRvcjtcbiAgICAgIHZhciBuZXdDb250cmlidXRpb24gPSBwYXJzZUZsb2F0KGV0aGVyZXVtLndlYjMuZnJvbVdlaSh0aGlzLmNvbnRyYWN0LmNvbnRyaWJ1dGlvbnMoYWRkcmVzcyksICdldGhlcicpLnRvU3RyaW5nKCkpO1xuXG4gICAgICB2YXIgaXNOZXdDb250cmlidXRvciA9ICEoYWRkcmVzcyBpbiB0aGlzLmNvbnRyaWJ1dG9yc0RhdGEpO1xuICAgICAgaWYoaXNOZXdDb250cmlidXRvcikge1xuICAgICAgICB0aGlzLmFkZENvbnRyaWJ1dG9yKGFkZHJlc3MsIG5ld0NvbnRyaWJ1dGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbnRyaWJ1dG9yc0RhdGFbYWRkcmVzc10uY29udHJpYnV0aW9uID0gbmV3Q29udHJpYnV0aW9uO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZUNvbnRyYWN0RGF0YSgpO1xuXG4gICAgICBpZighIXRoaXMuY29udHJpYnV0aW9uQ2hhbmdlZENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuY29udHJpYnV0aW9uQ2hhbmdlZENhbGxiYWNrKHRoaXMsIGFkZHJlc3MsIG5ld0NvbnRyaWJ1dGlvbiwgaXNOZXdDb250cmlidXRvcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFdoZWVsLnByb3RvdHlwZS5vbldvbiA9IGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHtcbiAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRlc2lyZWRDb250cmlidXRpb24gPSAwO1xuICAgICAgdGhpcy51cGRhdGVDb250cmFjdERhdGEoKTtcblxuICAgICAgdGhpcy5yZWZyZXNoUmVjZW50V2luc0xpc3QoKTtcbiAgICAgIGlmKCEhdGhpcy5yb3VuZEVuZGVkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5yb3VuZEVuZGVkQ2FsbGJhY2sodGhpcywgcmVzdWx0LmFyZ3Mud2lubmVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgcmV0dXJuIFdoZWVsO1xuICB9XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ2V0aGVyLXdoZWVsJywgW1xuICAgICduZ1JvdXRlJyxcbiAgICAncnpNb2R1bGUnLFxuICAgICdvaXRvemVyby5uZ1N3ZWV0QWxlcnQnLFxuICAgICdhbmd1bGFyTW9tZW50J1xuICBdKS5cbiAgY29uZmlnKFsnJHJvdXRlUHJvdmlkZXInLCBmdW5jdGlvbigkcm91dGVQcm92aWRlcikge1xuICAgICRyb3V0ZVByb3ZpZGVyLm90aGVyd2lzZSh7cmVkaXJlY3RUbzogJy8nfSk7XG4gIH1dKTtcbn0pKCk7XG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIFdoZWVsRmFjdG9yeS4kaW5qZWN0ID0gW1wiZXRoZXJldW1cIl07XG4gIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcpLmZhY3RvcnkoJ1doZWVsJywgV2hlZWxGYWN0b3J5KTtcblxuICAvKiBAbmdJbmplY3QgKi9cbiAgZnVuY3Rpb24gV2hlZWxGYWN0b3J5KGV0aGVyZXVtKSB7XG4gICAgdmFyIGFiaSA9IFt7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcIm5hbWVcIjpcImNvbnRyaWJ1dG9yc1wiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcImFkZHJlc3NcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJnb2FsXCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJhZGRyZXNzXCJ9XSxcIm5hbWVcIjpcImNvbnRyaWJ1dGlvbnNcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6ZmFsc2UsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwibmV3SG9zdFwiLFwidHlwZVwiOlwiYWRkcmVzc1wifV0sXCJuYW1lXCI6XCJjaGFuZ2VIb3N0XCIsXCJvdXRwdXRzXCI6W10sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOmZhbHNlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJkZXN0cm95XCIsXCJvdXRwdXRzXCI6W10sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOmZhbHNlLFwiaW5wdXRzXCI6W3tcIm5hbWVcIjpcImFtb3VudFwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJuYW1lXCI6XCJzZXRDb250cmlidXRpb25cIixcIm91dHB1dHNcIjpbXSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwibnVtV2lubmVyc1wiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJudW1Db250cmlidXRvcnNcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6ZmFsc2UsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcImFkZFRvQ29udHJpYnV0aW9uXCIsXCJvdXRwdXRzXCI6W10sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcImluY3JlbWVudFwiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjpmYWxzZSxcImlucHV0c1wiOlt7XCJuYW1lXCI6XCJhbW91bnRcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwibmFtZVwiOlwicmVtb3ZlRnJvbUNvbnRyaWJ1dGlvblwiLFwib3V0cHV0c1wiOltdLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJuYW1lXCI6XCJyZWNlbnRXaW5zXCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIndpbm5lclwiLFwidHlwZVwiOlwiYWRkcmVzc1wifSx7XCJuYW1lXCI6XCJ0aW1lc3RhbXBcIixcInR5cGVcIjpcInVpbnQyNTZcIn0se1wibmFtZVwiOlwiY29udHJpYnV0aW9uXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwiaG9zdFwiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcImFkZHJlc3NcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiaW5wdXRzXCI6W3tcIm5hbWVcIjpcIl9nb2FsSW5GaW5uZXlcIixcInR5cGVcIjpcInVpbnQyNTZcIn0se1wibmFtZVwiOlwiX2luY3JlbWVudEluRmlubmV5XCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9LHtcIm5hbWVcIjpcIl9yZWNlbnRXaW5zQ291bnRcIixcInR5cGVcIjpcInVpbnQ4XCJ9XSxcInR5cGVcIjpcImNvbnN0cnVjdG9yXCJ9LHtcImFub255bW91c1wiOmZhbHNlLFwiaW5wdXRzXCI6W3tcImluZGV4ZWRcIjpmYWxzZSxcIm5hbWVcIjpcIndpbm5lclwiLFwidHlwZVwiOlwiYWRkcmVzc1wifSx7XCJpbmRleGVkXCI6ZmFsc2UsXCJuYW1lXCI6XCJ0aW1lc3RhbXBcIixcInR5cGVcIjpcInVpbnQyNTZcIn0se1wiaW5kZXhlZFwiOmZhbHNlLFwibmFtZVwiOlwiY29udHJpYnV0aW9uXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcIm5hbWVcIjpcIldvblwiLFwidHlwZVwiOlwiZXZlbnRcIn0se1wiYW5vbnltb3VzXCI6ZmFsc2UsXCJpbnB1dHNcIjpbe1wiaW5kZXhlZFwiOmZhbHNlLFwibmFtZVwiOlwiY29udHJpYnV0b3JcIixcInR5cGVcIjpcImFkZHJlc3NcIn1dLFwibmFtZVwiOlwiQ2hhbmdlZENvbnRyaWJ1dGlvblwiLFwidHlwZVwiOlwiZXZlbnRcIn1dO1xuXG4gICAgdmFyIFdoZWVsID0gZnVuY3Rpb24oY29udGFjdEFkZHJlc3MsIGNvbnRyaWJ1dGlvbkNoYW5nZWRDYWxsYmFjaywgcm91bmRFbmRlZENhbGxiYWNrKSB7XG4gICAgICB0aGlzLmFkZHJlc3MgPSBjb250YWN0QWRkcmVzcztcbiAgICAgIHRoaXMuY29udHJpYnV0aW9uQ2hhbmdlZENhbGxiYWNrID0gY29udHJpYnV0aW9uQ2hhbmdlZENhbGxiYWNrO1xuICAgICAgdGhpcy5yb3VuZEVuZGVkQ2FsbGJhY2sgPSByb3VuZEVuZGVkQ2FsbGJhY2s7XG5cbiAgICAgIHZhciBjb250cmFjdEJsdWVwcmludCA9IGV0aGVyZXVtLndlYjMuZXRoLmNvbnRyYWN0KGFiaSk7XG4gICAgICB0aGlzLmNvbnRyYWN0ID0gY29udHJhY3RCbHVlcHJpbnQuYXQoY29udGFjdEFkZHJlc3MpO1xuXG4gICAgICB0aGlzLmdvYWwgPSBldGhlcmV1bS53ZWIzLmZyb21XZWkodGhpcy5jb250cmFjdC5nb2FsKCksICdldGhlcicpLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLmluY3JlbWVudCA9IGV0aGVyZXVtLndlYjMuZnJvbVdlaSh0aGlzLmNvbnRyYWN0LmluY3JlbWVudCgpLCAnZXRoZXInKS50b1N0cmluZygpO1xuXG4gICAgICB0aGlzLmNvbnRyaWJ1dG9yc0RhdGEgPSB7fTtcbiAgICAgIHRoaXMuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IDA7XG5cbiAgICAgIHRoaXMuY29udHJhY3QuQ2hhbmdlZENvbnRyaWJ1dGlvbigpLndhdGNoKHRoaXMub25Db250cmlidXRpb25DaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5jb250cmFjdC5Xb24oKS53YXRjaCh0aGlzLm9uV29uLmJpbmQodGhpcykpO1xuXG4gICAgICB0aGlzLmluaXRpYWxpemVDb250cmlidXRvcnNEYXRhKCk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRyYWN0RGF0YSgpO1xuICAgICAgdGhpcy5yZWZyZXNoUmVjZW50V2luc0xpc3QoKTtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBXaGVlbC5wcm90b3R5cGUudXBkYXRlQ29udHJhY3REYXRhID0gZnVuY3Rpb24oKXtcbiAgICAgIC8vIENvbnRyYWN0IGJhbGFuY2VcbiAgICAgIHZhciB3ZWkgPSBldGhlcmV1bS53ZWIzLmV0aC5nZXRCYWxhbmNlKHRoaXMuYWRkcmVzcyk7XG4gICAgICB2YXIgZXRoZXIgPSBldGhlcmV1bS53ZWIzLmZyb21XZWkod2VpLCAnZXRoZXInKTtcbiAgICAgIHRoaXMuYmFsYW5jZSA9IHBhcnNlRmxvYXQoZXRoZXIudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgV2hlZWwucHJvdG90eXBlLmluaXRpYWxpemVDb250cmlidXRvcnNEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZighZXRoZXJldW0uaXNDb25uZWN0ZWQoKSkgeyByZXR1cm47IH1cblxuICAgICAgdGhpcy5jb250cmlidXRvcnNEYXRhID0ge307XG4gICAgICB2YXIgbnVtQ29udHJpYnV0b3JzID0gdGhpcy5jb250cmFjdC5udW1Db250cmlidXRvcnMoKS50b1N0cmluZygpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG51bUNvbnRyaWJ1dG9yczsgKytpKSB7XG4gICAgICAgIHZhciBjb250cmlidXRvckFkZHJlc3MgPSB0aGlzLmNvbnRyYWN0LmNvbnRyaWJ1dG9ycyhpKS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmFkZENvbnRyaWJ1dG9yKGNvbnRyaWJ1dG9yQWRkcmVzcywgaSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFdoZWVsLnByb3RvdHlwZS5hZGRDb250cmlidXRvciA9IGZ1bmN0aW9uKGFkZHJlc3MsIGluZGV4KSB7XG4gICAgICB0aGlzLmNvbnRyaWJ1dG9yc0RhdGFbYWRkcmVzc10gPSB7XG4gICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICAgIGNvbnRyaWJ1dGlvbjogcGFyc2VGbG9hdChldGhlcmV1bS53ZWIzLmZyb21XZWkodGhpcy5jb250cmFjdC5jb250cmlidXRpb25zKGFkZHJlc3MpLCAnZXRoZXInKS50b1N0cmluZygpKSxcbiAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICB9O1xuICAgIH1cblxuICAgIFdoZWVsLnByb3RvdHlwZS5yZWZyZXNoUmVjZW50V2luc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMucmVjZW50V2lucyA9IFtdO1xuICAgICAgdmFyIG51bVJlY2VudFdpbnMgPSB0aGlzLmNvbnRyYWN0Lm51bVdpbm5lcnMoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBudW1SZWNlbnRXaW5zOyArK2kpIHtcbiAgICAgICAgdGhpcy5yZWNlbnRXaW5zLnB1c2godGhpcy5jb250cmFjdC5yZWNlbnRXaW5zKGkpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLmdldENvbnRyaWJ1dGlvbiA9IGZ1bmN0aW9uKGFjY291bnQpIHtcbiAgICAgIHZhciBjdXJyZW50Q29udHJpYnV0aW9uID0gMDtcbiAgICAgIGlmKGFjY291bnQgaW4gdGhpcy5jb250cmlidXRvcnNEYXRhKSB7XG4gICAgICAgIGN1cnJlbnRDb250cmlidXRpb24gPSB0aGlzLmNvbnRyaWJ1dG9yc0RhdGFbYWNjb3VudF0uY29udHJpYnV0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnRDb250cmlidXRpb247XG4gICAgfTtcblxuICAgIFdoZWVsLnByb3RvdHlwZS5nZXRBZGp1c3RlZEJhbGFuY2UgPSBmdW5jdGlvbihhY2NvdW50KSB7XG4gICAgICB2YXIgZGVsdGFDb250cmlidXRpb24gPSAodGhpcy5kZXNpcmVkQ29udHJpYnV0aW9uIC0gdGhpcy5nZXRDb250cmlidXRpb24oYWNjb3VudCkpO1xuICAgICAgcmV0dXJuIHRoaXMuYmFsYW5jZSArIGRlbHRhQ29udHJpYnV0aW9uO1xuICAgIH07XG5cbiAgICBXaGVlbC5wcm90b3R5cGUuc2V0Q29udHJpYnV0aW9uID0gZnVuY3Rpb24oYWNjb3VudCwgdmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgZGVsdGFDb250cmlidXRpb24gPSBldGhlcmV1bS53ZWIzLnRvV2VpKHZhbHVlLCAnZXRoZXInKSAtIGV0aGVyZXVtLndlYjMudG9XZWkodGhpcy5nZXRDb250cmlidXRpb24oYWNjb3VudCksICdldGhlcicpO1xuICAgICAgdmFyIGRlc2lyZWRDb250cmlidXRpb25JbldlaSA9IGV0aGVyZXVtLndlYjMudG9XZWkodmFsdWUsICdldGhlcicpO1xuICAgICAgdmFyIHZhbHVlVG9TZW5kID0gMDtcbiAgICAgIGlmKGRlbHRhQ29udHJpYnV0aW9uID4gMCkge1xuICAgICAgICB2YWx1ZVRvU2VuZCA9IGRlbHRhQ29udHJpYnV0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2FsbERhdGEgPSB0aGlzLmNvbnRyYWN0LnNldENvbnRyaWJ1dGlvbi5nZXREYXRhKGRlc2lyZWRDb250cmlidXRpb25JbldlaSk7XG4gICAgICB2YXIgdHJhbnNhY3Rpb24gPSB7IHZhbHVlOiB2YWx1ZVRvU2VuZCwgZnJvbTogYWNjb3VudCwgdG86IHRoaXMuYWRkcmVzcywgZGF0YTogY2FsbERhdGEgfTtcbiAgICAgIHRyYW5zYWN0aW9uLmdhcyA9IGV0aGVyZXVtLndlYjMuZXRoLmVzdGltYXRlR2FzKHRyYW5zYWN0aW9uKSArIDEwMDAwMDtcbiAgICAgIHRoaXMuY29udHJhY3Quc2V0Q29udHJpYnV0aW9uKGRlc2lyZWRDb250cmlidXRpb25JbldlaSwgdHJhbnNhY3Rpb24sIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLm9uQ29udHJpYnV0aW9uQ2hhbmdlZCA9IGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHtcbiAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWRkcmVzcyA9IHJlc3VsdC5hcmdzLmNvbnRyaWJ1dG9yO1xuICAgICAgdmFyIG5ld0NvbnRyaWJ1dGlvbiA9IHBhcnNlRmxvYXQoZXRoZXJldW0ud2ViMy5mcm9tV2VpKHRoaXMuY29udHJhY3QuY29udHJpYnV0aW9ucyhhZGRyZXNzKSwgJ2V0aGVyJykudG9TdHJpbmcoKSk7XG5cbiAgICAgIHZhciBpc05ld0NvbnRyaWJ1dG9yID0gIShhZGRyZXNzIGluIHRoaXMuY29udHJpYnV0b3JzRGF0YSk7XG4gICAgICBpZihpc05ld0NvbnRyaWJ1dG9yKSB7XG4gICAgICAgIHRoaXMuYWRkQ29udHJpYnV0b3IoYWRkcmVzcywgbmV3Q29udHJpYnV0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29udHJpYnV0b3JzRGF0YVthZGRyZXNzXS5jb250cmlidXRpb24gPSBuZXdDb250cmlidXRpb247XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlQ29udHJhY3REYXRhKCk7XG5cbiAgICAgIGlmKCEhdGhpcy5jb250cmlidXRpb25DaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jb250cmlidXRpb25DaGFuZ2VkQ2FsbGJhY2sodGhpcywgYWRkcmVzcywgbmV3Q29udHJpYnV0aW9uLCBpc05ld0NvbnRyaWJ1dG9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLm9uV29uID0gZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkge1xuICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IDA7XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRyYWN0RGF0YSgpO1xuXG4gICAgICB0aGlzLnJlZnJlc2hSZWNlbnRXaW5zTGlzdCgpO1xuICAgICAgaWYoISF0aGlzLnJvdW5kRW5kZWRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLnJvdW5kRW5kZWRDYWxsYmFjayh0aGlzLCByZXN1bHQuYXJncy53aW5uZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICByZXR1cm4gV2hlZWw7XG4gIH1cbn0pKCk7XG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIFdoZWVsQ3RybC4kaW5qZWN0ID0gW1wiJHJvdXRlXCIsIFwiJHNjb3BlXCIsIFwiU3dlZXRBbGVydFwiLCBcImV0aGVyZXVtXCIsIFwiV2hlZWxcIl07XG4gIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcpLmNvbnRyb2xsZXIoJ1doZWVsQ3RybCcsIFdoZWVsQ3RybCk7XG5cbiAgLypAbmdJbmplY3QqL1xuICBmdW5jdGlvbiBXaGVlbEN0cmwoJHJvdXRlLCAkc2NvcGUsIFN3ZWV0QWxlcnQsIGV0aGVyZXVtLCBXaGVlbCkge1xuICAgIHZhciBlbXB0eUJhckNvbG9yID0gJyNkY2U2ZTknO1xuICAgIHZhciBlbXB0eUJhckxhYmVsID0gXCJFbXB0eVwiO1xuICAgIHZhciBjb250cmFjdEFkZHJlc3NlcyA9IFsnMHg1Mzg5MWVmMzc5M2Q4NTM0QWQ0MjMxMkJjQzc3ZEZBZDUxQmI1RjFDJywgJzB4MjdDMGFGYzk2MEZiZWFCMWM2QmJBNmJFMzgzN2Q0MEU5NDhCMjI1MCcsICcweDExMDdCRDIzMjY0MDQzNDAwOGI4Y2UxRkQwNTg4MzdFMTQxZjc1NEInXTtcbiAgICB2YXIgY2hhcnQgPSBudWxsO1xuXG4gICAgdmFyIHZtID0gdGhpcztcblxuICAgIHZtLndlYjMgPSBldGhlcmV1bS53ZWIzO1xuICAgIHZtLm1vbWVudCA9IG1vbWVudDtcbiAgICB2bS5zZWxlY3RXaGVlbCA9IHNlbGVjdFdoZWVsO1xuICAgIHZtLmdldEFjY291bnRCYWxhbmNlID0gZ2V0QWNjb3VudEJhbGFuY2U7XG4gICAgdm0ub25BY2NvdW50Q2hhbmdlZCA9IG9uQWNjb3VudENoYW5nZWQ7XG4gICAgdm0uc2V0Q29udHJpYnV0aW9uID0gc2V0Q29udHJpYnV0aW9uO1xuICAgIHZtLm9uU2xpZGVyQ2hhbmdlZCA9IHVwZGF0ZUNoYXJ0Q29udHJpYnV0aW9uUHJldmlldztcblxuICAgIGFjdGl2YXRlKCk7XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBmdW5jdGlvbiBhY3RpdmF0ZSgpIHtcbiAgICAgIHZtLmlzQ29ubmVjdGVkID0gZXRoZXJldW0uaXNDb25uZWN0ZWQoKTsgLy8gTm90IHVzaW5nIDItd2F5IGJpbmRpbmcgYmVjYXVzZSBmb3Igc29tZSByZWFzb24gaXQgd2FzIERFU1RST1lJTkcgcGVyZm9ybWFuY2UuIEknZCBsaWtlIHRvIGxvb2sgaW50byB0aGlzIG1vcmUgbGF0ZXIuXG4gICAgICBpZighdm0uaXNDb25uZWN0ZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBjaGFydC5hZGREYXRhKHtcbiAgICAgICAgdmFsdWU6IDEuMCxcbiAgICAgICAgY29sb3I6IGVtcHR5QmFyQ29sb3IsXG4gICAgICAgIGxhYmVsOiBlbXB0eUJhckxhYmVsXG4gICAgICB9KTtcblxuICAgICAgdm0ud2hlZWxzID0gW107XG4gICAgICBjb250cmFjdEFkZHJlc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGFkZHJlc3MpIHtcbiAgICAgICAgdmFyIG5ld1doZWVsID0gbmV3IFdoZWVsKGFkZHJlc3MsIG9uQ29udHJpYnV0aW9uQ2hhbmdlZCwgb25Sb3VuZEVuZGVkKTtcbiAgICAgICAgdm0ud2hlZWxzLnB1c2gobmV3V2hlZWwpO1xuICAgICAgfSk7XG4gICAgICBzZWxlY3RXaGVlbCh2bS53aGVlbHNbMF0pO1xuXG4gICAgICB2bS5hY2NvdW50cyA9IGV0aGVyZXVtLndlYjMuZXRoLmFjY291bnRzO1xuICAgICAgdm0uc2VsZWN0ZWRBY2NvdW50ID0gZXRoZXJldW0ud2ViMy5ldGguZGVmYXVsdEFjY291bnQ7XG4gICAgICBpZighdm0uc2VsZWN0ZWRBY2NvdW50KSB7XG4gICAgICAgIHZtLnNlbGVjdGVkQWNjb3VudCA9IGV0aGVyZXVtLndlYjMuZXRoLmNvaW5iYXNlO1xuICAgICAgfVxuICAgICAgb25BY2NvdW50Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNoYXJ0KCkge1xuICAgICAgaWYoISFjaGFydCkgeyBjaGFydC5kZXN0cm95KCk7IH1cblxuICAgICAgdmFyIGNoYXJ0T3B0aW9ucyA9IHtcbiAgICAgICAgYW5pbWF0aW9uRWFzaW5nOiAnZWFzZUluT3V0JyxcbiAgICAgICAgc2VnbWVudFN0cm9rZVdpZHRoOiAzLFxuICAgICAgICBhbmltYXRpb25TdGVwczogMjAsXG4gICAgICAgIHNlZ21lbnRTdHJva2VDb2xvcjogJyNFQkYwRjEnLFxuICAgICAgICBwZXJjZW50YWdlSW5uZXJDdXRvdXQ6IDc1LFxuICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgICB0b29sdGlwVGVtcGxhdGU6IGdldFRvb2x0aXBUZW1wbGF0ZVxuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gZ2V0VG9vbHRpcFRlbXBsYXRlKHZhbHVlT2JqZWN0KSB7XG4gICAgICAgIHZhciBuYW1lID0gKHZhbHVlT2JqZWN0LmxhYmVsID09PSB2bS5zZWxlY3RlZEFjY291bnQpID8gJ1lvdScgOiB2YWx1ZU9iamVjdC5sYWJlbDtcbiAgICAgICAgdmFyIHRvb2x0aXAgPSBuYW1lICsgJzogJyArIHZhbHVlT2JqZWN0LnZhbHVlLnRvRml4ZWQoMikgKyAnIM6eJztcbiAgICAgICAgaWYoISF2bS5nb2FsKSB7XG4gICAgICAgICAgdmFyIHBlcmNlbnRhZ2UgPSAodmFsdWVPYmplY3QudmFsdWUgLyB2bS5nb2FsICogMTAwKTtcbiAgICAgICAgICB0b29sdGlwICs9ICcgKCcgKyBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UgKiAxMDApIC8gMTAwICsgJyUpJ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b29sdGlwO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3aGVlbFwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjaGFydCA9IG5ldyBDaGFydChjdHgpLkRvdWdobnV0KFtdLCBjaGFydE9wdGlvbnMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvcHVsYXRlQ2hhcnQod2hlZWwpIHtcbiAgICAgIHZhciBjb250cmlidXRvcnNEYXRhID0gd2hlZWwuY29udHJpYnV0b3JzRGF0YTtcbiAgICAgIGZvcih2YXIgYWRkcmVzcyBpbiBjb250cmlidXRvcnNEYXRhKVxuICAgICAge1xuICAgICAgICB2YXIgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNEYXRhW2FkZHJlc3NdO1xuICAgICAgICB2YXIgY2hhcnREYXRhID0ge1xuICAgICAgICAgIGxhYmVsOiBjb250cmlidXRvci5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiBjb250cmlidXRvci5jb250cmlidXRpb24sXG4gICAgICAgICAgY29sb3I6IGdldENoYXJ0Q29sb3JGb3JBY2NvdW50KGNvbnRyaWJ1dG9yLmFkZHJlc3MpXG4gICAgICAgIH07XG5cbiAgICAgICAgY2hhcnQuYWRkRGF0YShjaGFydERhdGEsIGNvbnRyaWJ1dG9yLmluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY2hhcnQuYWRkRGF0YSh7XG4gICAgICAgIGxhYmVsOiBlbXB0eUJhckxhYmVsLFxuICAgICAgICBjb2xvcjogZW1wdHlCYXJDb2xvcixcbiAgICAgICAgdmFsdWU6ICh2bS5zZWxlY3RlZFdoZWVsLmdvYWwgLSB2bS5zZWxlY3RlZFdoZWVsLmdldEFkanVzdGVkQmFsYW5jZSh2bS5zZWxlY3RlZEFjY291bnQpKVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXJ0LnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCkge1xuICAgICAgY2hhcnQuc2VnbWVudHNbY2hhcnQuc2VnbWVudHMubGVuZ3RoIC0gMV0udmFsdWUgPSAodm0uc2VsZWN0ZWRXaGVlbC5nb2FsIC0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRBZGp1c3RlZEJhbGFuY2Uodm0uc2VsZWN0ZWRBY2NvdW50KSk7XG4gICAgICBjaGFydC51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVDaGFydENvbnRyaWJ1dGlvblByZXZpZXcoKSB7XG4gICAgICB2YXIgY29udHJpYnV0b3JzRGF0YSA9IHZtLnNlbGVjdGVkV2hlZWwuY29udHJpYnV0b3JzRGF0YTtcbiAgICAgIGlmKHZtLnNlbGVjdGVkQWNjb3VudCBpbiBjb250cmlidXRvcnNEYXRhKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvbnRyaWJ1dG9yc0RhdGFbdm0uc2VsZWN0ZWRBY2NvdW50XS5pbmRleDtcbiAgICAgICAgY2hhcnQuc2VnbWVudHNbaW5kZXhdLnZhbHVlID0gdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW5kZXggPSBPYmplY3Qua2V5cyhjb250cmlidXRvcnNEYXRhKS5sZW5ndGg7XG4gICAgICAgIHZtLnNlbGVjdGVkV2hlZWwuYWRkQ29udHJpYnV0b3Iodm0uc2VsZWN0ZWRBY2NvdW50LCBpbmRleCk7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgIGxhYmVsOiB2bS5zZWxlY3RlZEFjY291bnQsXG4gICAgICAgICAgdmFsdWU6IHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbixcbiAgICAgICAgICBjb2xvcjogZ2V0Q2hhcnRDb2xvckZvckFjY291bnQodm0uc2VsZWN0ZWRBY2NvdW50KVxuICAgICAgICB9O1xuICAgICAgICBjaGFydC5hZGREYXRhKGRhdGEsIGluZGV4IC0gMik7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhcnRDb2xvckZvckFjY291bnQoYWNjb3VudCkge1xuICAgICAgcmV0dXJuIChhY2NvdW50ID09PSB2bS5zZWxlY3RlZEFjY291bnQpID8gJyM1Y2I4NWMnIDogJyMzRDNFM0YnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNlbGVjdFdoZWVsKHdoZWVsKSB7XG4gICAgICBpZih2bS5zZWxlY3RlZFdoZWVsID09PSB3aGVlbCkgeyByZXR1cm47IH1cblxuICAgICAgdm0uc2VsZWN0ZWRXaGVlbCA9IHdoZWVsO1xuICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uID0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50KTtcbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBwb3B1bGF0ZUNoYXJ0KHZtLnNlbGVjdGVkV2hlZWwpO1xuICAgICAgdXBkYXRlQ2hhcnRDb250cmlidXRpb25QcmV2aWV3KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0Q29udHJpYnV0aW9uKCkge1xuICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5zZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50LCB2bS5zZWxlY3RlZFdoZWVsLmRlc2lyZWRDb250cmlidXRpb24sIG9uQ29udHJpYnV0aW9uU2V0KTtcblxuICAgICAgZnVuY3Rpb24gb25Db250cmlidXRpb25TZXQoZXJyb3IsIHJlc3VsdCkge1xuICAgICAgICBpZihlcnJvcikge1xuICAgICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gXCI8YnI+PGJyPk1ha2Ugc3VyZSB5b3UndmUgdW5sb2NrZWQgeW91ciBhY2NvdW50IHRvIG1ha2UgdHJhbnNhY3Rpb25zIChlLmcuIHVzaW5nIHRoZSAtLXVubG9jayBjb21tYW5kIHdpdGggZ2V0aCkuIElmIHlvdSdyZSBoYXZpbmcgdHJvdWJsZSwgeW91IGNhbiBhbHNvIHNldCB5b3VyIGNvbnRyaWJ1dGlvbiBieSBzZW5kaW5nIGV0aGVyIGRpcmVjdGx5IHRvIHRoZSB3aGVlbCBhdDo8YnI+PGNvZGU+XCIgKyB2bS5zZWxlY3RlZFdoZWVsLmFkZHJlc3MgKyBcIjwvY29kZT48YnI+KDxpIGNsYXNzPVxcXCJmYSBmYS1sb2NrXFxcIiBzdHlsZT1cXFwiZm9udC1zaXplOiAwLjhlbTsgbWFyZ2luLXJpZ2h0OiAycHg7XFxcIj48L2k+IDxhIGhyZWY9XFxcImh0dHBzOi8vbGl2ZS5ldGhlci5jYW1wL2FjY291bnQvXCIgKyB2bS5zZWxlY3RlZFdoZWVsLmFkZHJlc3Muc3Vic3RyaW5nKDIpICsgXCIvY29udHJhY3RcXFwiPnZpZXcgdmVyaWZpZWQgc291cmNlIGNvZGU8L2E+KVwiO1xuXG4gICAgICAgICAgU3dlZXRBbGVydC5zd2FsKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIkVycm9yIFNldHRpbmcgQ29udHJpYnV0aW9uXCIsXG4gICAgICAgICAgICB0ZXh0OiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICBodG1sOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgU3dlZXRBbGVydC5zd2FsKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIlN1Y2Nlc3MhXCIsXG4gICAgICAgICAgICB0ZXh0OiBcIllvdXIgcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgRXRoZXJldW0gbmV0d29yayBmb3IgcHJvY2Vzc2luZy4gWW91J2xsIHNlZSB5b3VyIGFjY291bnQgYmFsYW5jZSB1cGRhdGVkIHNvb24uPGJyPjxicj48c3Ryb25nPlRoaXMgbWF5IHRha2UgYSBtaW51dGUgb3IgdHdvPC9zdHJvbmc+LlwiLFxuICAgICAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICBodG1sOiB0cnVlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHZtLnNlbGVjdGVkV2hlZWwuZ2V0Q29udHJpYnV0aW9uKHZtLnNlbGVjdGVkQWNjb3VudCk7XG4gICAgICAgICAgY2hhcnQuc2VnbWVudHNbdm0uc2VsZWN0ZWRXaGVlbC5jb250cmlidXRvcnNEYXRhW3ZtLnNlbGVjdGVkQWNjb3VudF0uaW5kZXhdLnZhbHVlID0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50KTtcbiAgICAgICAgICB1cGRhdGVDaGFydEVtcHR5U2xvdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudCkge1xuICAgICAgcmV0dXJuIGV0aGVyZXVtLndlYjMuZnJvbVdlaShldGhlcmV1bS53ZWIzLmV0aC5nZXRCYWxhbmNlKGFjY291bnQpLCAnZXRoZXInKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkFjY291bnRDaGFuZ2VkKCkge1xuICAgICAgdm0ud2hlZWxzLmZvckVhY2goZnVuY3Rpb24od2hlZWwpIHtcbiAgICAgICAgd2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHdoZWVsLmdldENvbnRyaWJ1dGlvbih2bS5zZWxlY3RlZEFjY291bnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBwb3B1bGF0ZUNoYXJ0KHZtLnNlbGVjdGVkV2hlZWwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ29udHJpYnV0aW9uQ2hhbmdlZCh3aGVlbCwgY29udHJpYnV0b3JBY2NvdW50LCBuZXdDb250cmlidXRpb24sIGlzTmV3Q29udHJpYnV0b3IpIHtcbiAgICAgIGlmKGNvbnRyaWJ1dG9yQWNjb3VudCA9PSB2bS5zZWxlY3RlZEFjY291bnQpIHtcbiAgICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uID0gbmV3Q29udHJpYnV0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZih3aGVlbCA9PSB2bS5zZWxlY3RlZFdoZWVsKSB7XG4gICAgICAgIHZhciBjb250cmlidXRvcnNEYXRhID0gdm0uc2VsZWN0ZWRXaGVlbC5jb250cmlidXRvcnNEYXRhO1xuICAgICAgICB2YXIgaW5kZXggPSBjb250cmlidXRvcnNEYXRhW2NvbnRyaWJ1dG9yQWNjb3VudF0uaW5kZXg7XG5cbiAgICAgICAgaWYoaXNOZXdDb250cmlidXRvcikge1xuICAgICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgbGFiZWw6IGNvbnRyaWJ1dG9yQWNjb3VudCxcbiAgICAgICAgICAgIHZhbHVlOiBuZXdDb250cmlidXRpb24sXG4gICAgICAgICAgICBjb2xvcjogZ2V0Q2hhcnRDb2xvckZvckFjY291bnQoY29udHJpYnV0b3JBY2NvdW50KVxuICAgICAgICAgIH07XG4gICAgICAgICAgY2hhcnQuYWRkRGF0YShkYXRhLCBpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhcnQuc2VnbWVudHNbY29udHJpYnV0b3JzRGF0YVtjb250cmlidXRvckFjY291bnRdLmluZGV4XS52YWx1ZSA9IG5ld0NvbnRyaWJ1dGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCk7XG4gICAgICB9XG5cbiAgICAgICRzY29wZS4kYXBwbHkoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblJvdW5kRW5kZWQod2hlZWwsIHdpbm5lckFkZHJlc3MpIHtcbiAgICAgIHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHZtLnNlbGVjdGVkV2hlZWwuZ2V0Q29udHJpYnV0aW9uKHZtLnNlbGVjdGVkQWNjb3VudCk7XG4gICAgICAkc2NvcGUuJGFwcGx5KCk7XG4gICAgfVxuICB9XG59KSgpO1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ2V0aGVyLXdoZWVsJykuc2VydmljZSgnZXRoZXJldW0nLCBldGhlcmV1bSk7XG5cbiAgICAvKiBAbmdJbmplY3QgKi9cbiAgICBmdW5jdGlvbiBldGhlcmV1bSgpIHtcbiAgICAgIHZhciBzZXJ2aWNlID0ge1xuICAgICAgICB3ZWIzOiBuZXcgV2ViMygpLFxuICAgICAgICBpc0Nvbm5lY3RlZDogaXNDb25uZWN0ZWRcbiAgICAgIH07XG5cbiAgICAgIGFjdGl2YXRlKCk7XG5cbiAgICAgIHJldHVybiBzZXJ2aWNlO1xuXG4gICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgIGZ1bmN0aW9uIGFjdGl2YXRlKCkge1xuICAgICAgICBzZXJ2aWNlLndlYjMuc2V0UHJvdmlkZXIobmV3IHNlcnZpY2Uud2ViMy5wcm92aWRlcnMuSHR0cFByb3ZpZGVyKFwiaHR0cDovL2xvY2FsaG9zdDo4NTQ1XCIpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlLndlYjMuY3VycmVudFByb3ZpZGVyLmlzQ29ubmVjdGVkKCk7XG4gICAgICB9XG4gICAgfVxufSkoKTtcbiIsIihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcpLmNvbnRyb2xsZXIoJ1doZWVsQ3RybCcsIFdoZWVsQ3RybCk7XG5cbiAgLypAbmdJbmplY3QqL1xuICBmdW5jdGlvbiBXaGVlbEN0cmwoJHJvdXRlLCAkc2NvcGUsIFN3ZWV0QWxlcnQsIGV0aGVyZXVtLCBXaGVlbCkge1xuICAgIHZhciBlbXB0eUJhckNvbG9yID0gJyNkY2U2ZTknO1xuICAgIHZhciBlbXB0eUJhckxhYmVsID0gXCJFbXB0eVwiO1xuICAgIHZhciBjb250cmFjdEFkZHJlc3NlcyA9IFsnMHg1Mzg5MWVmMzc5M2Q4NTM0QWQ0MjMxMkJjQzc3ZEZBZDUxQmI1RjFDJywgJzB4MjdDMGFGYzk2MEZiZWFCMWM2QmJBNmJFMzgzN2Q0MEU5NDhCMjI1MCcsICcweDExMDdCRDIzMjY0MDQzNDAwOGI4Y2UxRkQwNTg4MzdFMTQxZjc1NEInXTtcbiAgICB2YXIgY2hhcnQgPSBudWxsO1xuXG4gICAgdmFyIHZtID0gdGhpcztcblxuICAgIHZtLndlYjMgPSBldGhlcmV1bS53ZWIzO1xuICAgIHZtLm1vbWVudCA9IG1vbWVudDtcbiAgICB2bS5zZWxlY3RXaGVlbCA9IHNlbGVjdFdoZWVsO1xuICAgIHZtLmdldEFjY291bnRCYWxhbmNlID0gZ2V0QWNjb3VudEJhbGFuY2U7XG4gICAgdm0ub25BY2NvdW50Q2hhbmdlZCA9IG9uQWNjb3VudENoYW5nZWQ7XG4gICAgdm0uc2V0Q29udHJpYnV0aW9uID0gc2V0Q29udHJpYnV0aW9uO1xuICAgIHZtLm9uU2xpZGVyQ2hhbmdlZCA9IHVwZGF0ZUNoYXJ0Q29udHJpYnV0aW9uUHJldmlldztcblxuICAgIGFjdGl2YXRlKCk7XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBmdW5jdGlvbiBhY3RpdmF0ZSgpIHtcbiAgICAgIHZtLmlzQ29ubmVjdGVkID0gZXRoZXJldW0uaXNDb25uZWN0ZWQoKTsgLy8gTm90IHVzaW5nIDItd2F5IGJpbmRpbmcgYmVjYXVzZSBmb3Igc29tZSByZWFzb24gaXQgd2FzIERFU1RST1lJTkcgcGVyZm9ybWFuY2UuIEknZCBsaWtlIHRvIGxvb2sgaW50byB0aGlzIG1vcmUgbGF0ZXIuXG4gICAgICBpZighdm0uaXNDb25uZWN0ZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBjaGFydC5hZGREYXRhKHtcbiAgICAgICAgdmFsdWU6IDEuMCxcbiAgICAgICAgY29sb3I6IGVtcHR5QmFyQ29sb3IsXG4gICAgICAgIGxhYmVsOiBlbXB0eUJhckxhYmVsXG4gICAgICB9KTtcblxuICAgICAgdm0ud2hlZWxzID0gW107XG4gICAgICBjb250cmFjdEFkZHJlc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGFkZHJlc3MpIHtcbiAgICAgICAgdmFyIG5ld1doZWVsID0gbmV3IFdoZWVsKGFkZHJlc3MsIG9uQ29udHJpYnV0aW9uQ2hhbmdlZCwgb25Sb3VuZEVuZGVkKTtcbiAgICAgICAgdm0ud2hlZWxzLnB1c2gobmV3V2hlZWwpO1xuICAgICAgfSk7XG4gICAgICBzZWxlY3RXaGVlbCh2bS53aGVlbHNbMF0pO1xuXG4gICAgICB2bS5hY2NvdW50cyA9IGV0aGVyZXVtLndlYjMuZXRoLmFjY291bnRzO1xuICAgICAgdm0uc2VsZWN0ZWRBY2NvdW50ID0gZXRoZXJldW0ud2ViMy5ldGguZGVmYXVsdEFjY291bnQ7XG4gICAgICBpZighdm0uc2VsZWN0ZWRBY2NvdW50KSB7XG4gICAgICAgIHZtLnNlbGVjdGVkQWNjb3VudCA9IGV0aGVyZXVtLndlYjMuZXRoLmNvaW5iYXNlO1xuICAgICAgfVxuICAgICAgb25BY2NvdW50Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNoYXJ0KCkge1xuICAgICAgaWYoISFjaGFydCkgeyBjaGFydC5kZXN0cm95KCk7IH1cblxuICAgICAgdmFyIGNoYXJ0T3B0aW9ucyA9IHtcbiAgICAgICAgYW5pbWF0aW9uRWFzaW5nOiAnZWFzZUluT3V0JyxcbiAgICAgICAgc2VnbWVudFN0cm9rZVdpZHRoOiAzLFxuICAgICAgICBhbmltYXRpb25TdGVwczogMjAsXG4gICAgICAgIHNlZ21lbnRTdHJva2VDb2xvcjogJyNFQkYwRjEnLFxuICAgICAgICBwZXJjZW50YWdlSW5uZXJDdXRvdXQ6IDc1LFxuICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgICB0b29sdGlwVGVtcGxhdGU6IGdldFRvb2x0aXBUZW1wbGF0ZVxuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gZ2V0VG9vbHRpcFRlbXBsYXRlKHZhbHVlT2JqZWN0KSB7XG4gICAgICAgIHZhciBuYW1lID0gKHZhbHVlT2JqZWN0LmxhYmVsID09PSB2bS5zZWxlY3RlZEFjY291bnQpID8gJ1lvdScgOiB2YWx1ZU9iamVjdC5sYWJlbDtcbiAgICAgICAgdmFyIHRvb2x0aXAgPSBuYW1lICsgJzogJyArIHZhbHVlT2JqZWN0LnZhbHVlLnRvRml4ZWQoMikgKyAnIM6eJztcbiAgICAgICAgaWYoISF2bS5nb2FsKSB7XG4gICAgICAgICAgdmFyIHBlcmNlbnRhZ2UgPSAodmFsdWVPYmplY3QudmFsdWUgLyB2bS5nb2FsICogMTAwKTtcbiAgICAgICAgICB0b29sdGlwICs9ICcgKCcgKyBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UgKiAxMDApIC8gMTAwICsgJyUpJ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b29sdGlwO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3aGVlbFwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjaGFydCA9IG5ldyBDaGFydChjdHgpLkRvdWdobnV0KFtdLCBjaGFydE9wdGlvbnMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvcHVsYXRlQ2hhcnQod2hlZWwpIHtcbiAgICAgIHZhciBjb250cmlidXRvcnNEYXRhID0gd2hlZWwuY29udHJpYnV0b3JzRGF0YTtcbiAgICAgIGZvcih2YXIgYWRkcmVzcyBpbiBjb250cmlidXRvcnNEYXRhKVxuICAgICAge1xuICAgICAgICB2YXIgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNEYXRhW2FkZHJlc3NdO1xuICAgICAgICB2YXIgY2hhcnREYXRhID0ge1xuICAgICAgICAgIGxhYmVsOiBjb250cmlidXRvci5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiBjb250cmlidXRvci5jb250cmlidXRpb24sXG4gICAgICAgICAgY29sb3I6IGdldENoYXJ0Q29sb3JGb3JBY2NvdW50KGNvbnRyaWJ1dG9yLmFkZHJlc3MpXG4gICAgICAgIH07XG5cbiAgICAgICAgY2hhcnQuYWRkRGF0YShjaGFydERhdGEsIGNvbnRyaWJ1dG9yLmluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY2hhcnQuYWRkRGF0YSh7XG4gICAgICAgIGxhYmVsOiBlbXB0eUJhckxhYmVsLFxuICAgICAgICBjb2xvcjogZW1wdHlCYXJDb2xvcixcbiAgICAgICAgdmFsdWU6ICh2bS5zZWxlY3RlZFdoZWVsLmdvYWwgLSB2bS5zZWxlY3RlZFdoZWVsLmdldEFkanVzdGVkQmFsYW5jZSh2bS5zZWxlY3RlZEFjY291bnQpKVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXJ0LnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCkge1xuICAgICAgY2hhcnQuc2VnbWVudHNbY2hhcnQuc2VnbWVudHMubGVuZ3RoIC0gMV0udmFsdWUgPSAodm0uc2VsZWN0ZWRXaGVlbC5nb2FsIC0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRBZGp1c3RlZEJhbGFuY2Uodm0uc2VsZWN0ZWRBY2NvdW50KSk7XG4gICAgICBjaGFydC51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVDaGFydENvbnRyaWJ1dGlvblByZXZpZXcoKSB7XG4gICAgICB2YXIgY29udHJpYnV0b3JzRGF0YSA9IHZtLnNlbGVjdGVkV2hlZWwuY29udHJpYnV0b3JzRGF0YTtcbiAgICAgIGlmKHZtLnNlbGVjdGVkQWNjb3VudCBpbiBjb250cmlidXRvcnNEYXRhKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvbnRyaWJ1dG9yc0RhdGFbdm0uc2VsZWN0ZWRBY2NvdW50XS5pbmRleDtcbiAgICAgICAgY2hhcnQuc2VnbWVudHNbaW5kZXhdLnZhbHVlID0gdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW5kZXggPSBPYmplY3Qua2V5cyhjb250cmlidXRvcnNEYXRhKS5sZW5ndGg7XG4gICAgICAgIHZtLnNlbGVjdGVkV2hlZWwuYWRkQ29udHJpYnV0b3Iodm0uc2VsZWN0ZWRBY2NvdW50LCBpbmRleCk7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgIGxhYmVsOiB2bS5zZWxlY3RlZEFjY291bnQsXG4gICAgICAgICAgdmFsdWU6IHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbixcbiAgICAgICAgICBjb2xvcjogZ2V0Q2hhcnRDb2xvckZvckFjY291bnQodm0uc2VsZWN0ZWRBY2NvdW50KVxuICAgICAgICB9O1xuICAgICAgICBjaGFydC5hZGREYXRhKGRhdGEsIGluZGV4IC0gMik7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhcnRDb2xvckZvckFjY291bnQoYWNjb3VudCkge1xuICAgICAgcmV0dXJuIChhY2NvdW50ID09PSB2bS5zZWxlY3RlZEFjY291bnQpID8gJyM1Y2I4NWMnIDogJyMzRDNFM0YnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNlbGVjdFdoZWVsKHdoZWVsKSB7XG4gICAgICBpZih2bS5zZWxlY3RlZFdoZWVsID09PSB3aGVlbCkgeyByZXR1cm47IH1cblxuICAgICAgdm0uc2VsZWN0ZWRXaGVlbCA9IHdoZWVsO1xuICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uID0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50KTtcbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBwb3B1bGF0ZUNoYXJ0KHZtLnNlbGVjdGVkV2hlZWwpO1xuICAgICAgdXBkYXRlQ2hhcnRDb250cmlidXRpb25QcmV2aWV3KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0Q29udHJpYnV0aW9uKCkge1xuICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5zZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50LCB2bS5zZWxlY3RlZFdoZWVsLmRlc2lyZWRDb250cmlidXRpb24sIG9uQ29udHJpYnV0aW9uU2V0KTtcblxuICAgICAgZnVuY3Rpb24gb25Db250cmlidXRpb25TZXQoZXJyb3IsIHJlc3VsdCkge1xuICAgICAgICBpZihlcnJvcikge1xuICAgICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gXCI8YnI+PGJyPk1ha2Ugc3VyZSB5b3UndmUgdW5sb2NrZWQgeW91ciBhY2NvdW50IHRvIG1ha2UgdHJhbnNhY3Rpb25zIChlLmcuIHVzaW5nIHRoZSAtLXVubG9jayBjb21tYW5kIHdpdGggZ2V0aCkuIElmIHlvdSdyZSBoYXZpbmcgdHJvdWJsZSwgeW91IGNhbiBhbHNvIHNldCB5b3VyIGNvbnRyaWJ1dGlvbiBieSBzZW5kaW5nIGV0aGVyIGRpcmVjdGx5IHRvIHRoZSB3aGVlbCBhdDo8YnI+PGNvZGU+XCIgKyB2bS5zZWxlY3RlZFdoZWVsLmFkZHJlc3MgKyBcIjwvY29kZT48YnI+KDxpIGNsYXNzPVxcXCJmYSBmYS1sb2NrXFxcIiBzdHlsZT1cXFwiZm9udC1zaXplOiAwLjhlbTsgbWFyZ2luLXJpZ2h0OiAycHg7XFxcIj48L2k+IDxhIGhyZWY9XFxcImh0dHBzOi8vbGl2ZS5ldGhlci5jYW1wL2FjY291bnQvXCIgKyB2bS5zZWxlY3RlZFdoZWVsLmFkZHJlc3Muc3Vic3RyaW5nKDIpICsgXCIvY29udHJhY3RcXFwiPnZpZXcgdmVyaWZpZWQgc291cmNlIGNvZGU8L2E+KVwiO1xuXG4gICAgICAgICAgU3dlZXRBbGVydC5zd2FsKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIkVycm9yIFNldHRpbmcgQ29udHJpYnV0aW9uXCIsXG4gICAgICAgICAgICB0ZXh0OiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICBodG1sOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgU3dlZXRBbGVydC5zd2FsKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIlN1Y2Nlc3MhXCIsXG4gICAgICAgICAgICB0ZXh0OiBcIllvdXIgcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgRXRoZXJldW0gbmV0d29yayBmb3IgcHJvY2Vzc2luZy4gWW91J2xsIHNlZSB5b3VyIGFjY291bnQgYmFsYW5jZSB1cGRhdGVkIHNvb24uPGJyPjxicj48c3Ryb25nPlRoaXMgbWF5IHRha2UgYSBtaW51dGUgb3IgdHdvPC9zdHJvbmc+LlwiLFxuICAgICAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICBodG1sOiB0cnVlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHZtLnNlbGVjdGVkV2hlZWwuZ2V0Q29udHJpYnV0aW9uKHZtLnNlbGVjdGVkQWNjb3VudCk7XG4gICAgICAgICAgY2hhcnQuc2VnbWVudHNbdm0uc2VsZWN0ZWRXaGVlbC5jb250cmlidXRvcnNEYXRhW3ZtLnNlbGVjdGVkQWNjb3VudF0uaW5kZXhdLnZhbHVlID0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50KTtcbiAgICAgICAgICB1cGRhdGVDaGFydEVtcHR5U2xvdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudCkge1xuICAgICAgcmV0dXJuIGV0aGVyZXVtLndlYjMuZnJvbVdlaShldGhlcmV1bS53ZWIzLmV0aC5nZXRCYWxhbmNlKGFjY291bnQpLCAnZXRoZXInKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkFjY291bnRDaGFuZ2VkKCkge1xuICAgICAgdm0ud2hlZWxzLmZvckVhY2goZnVuY3Rpb24od2hlZWwpIHtcbiAgICAgICAgd2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHdoZWVsLmdldENvbnRyaWJ1dGlvbih2bS5zZWxlY3RlZEFjY291bnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBwb3B1bGF0ZUNoYXJ0KHZtLnNlbGVjdGVkV2hlZWwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ29udHJpYnV0aW9uQ2hhbmdlZCh3aGVlbCwgY29udHJpYnV0b3JBY2NvdW50LCBuZXdDb250cmlidXRpb24sIGlzTmV3Q29udHJpYnV0b3IpIHtcbiAgICAgIGlmKGNvbnRyaWJ1dG9yQWNjb3VudCA9PSB2bS5zZWxlY3RlZEFjY291bnQpIHtcbiAgICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uID0gbmV3Q29udHJpYnV0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZih3aGVlbCA9PSB2bS5zZWxlY3RlZFdoZWVsKSB7XG4gICAgICAgIHZhciBjb250cmlidXRvcnNEYXRhID0gdm0uc2VsZWN0ZWRXaGVlbC5jb250cmlidXRvcnNEYXRhO1xuICAgICAgICB2YXIgaW5kZXggPSBjb250cmlidXRvcnNEYXRhW2NvbnRyaWJ1dG9yQWNjb3VudF0uaW5kZXg7XG5cbiAgICAgICAgaWYoaXNOZXdDb250cmlidXRvcikge1xuICAgICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgbGFiZWw6IGNvbnRyaWJ1dG9yQWNjb3VudCxcbiAgICAgICAgICAgIHZhbHVlOiBuZXdDb250cmlidXRpb24sXG4gICAgICAgICAgICBjb2xvcjogZ2V0Q2hhcnRDb2xvckZvckFjY291bnQoY29udHJpYnV0b3JBY2NvdW50KVxuICAgICAgICAgIH07XG4gICAgICAgICAgY2hhcnQuYWRkRGF0YShkYXRhLCBpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhcnQuc2VnbWVudHNbY29udHJpYnV0b3JzRGF0YVtjb250cmlidXRvckFjY291bnRdLmluZGV4XS52YWx1ZSA9IG5ld0NvbnRyaWJ1dGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCk7XG4gICAgICB9XG5cbiAgICAgICRzY29wZS4kYXBwbHkoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblJvdW5kRW5kZWQod2hlZWwsIHdpbm5lckFkZHJlc3MpIHtcbiAgICAgIHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHZtLnNlbGVjdGVkV2hlZWwuZ2V0Q29udHJpYnV0aW9uKHZtLnNlbGVjdGVkQWNjb3VudCk7XG4gICAgICAkc2NvcGUuJGFwcGx5KCk7XG4gICAgfVxuICB9XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcpLnNlcnZpY2UoJ2V0aGVyZXVtJywgZXRoZXJldW0pO1xuXG4gICAgLyogQG5nSW5qZWN0ICovXG4gICAgZnVuY3Rpb24gZXRoZXJldW0oKSB7XG4gICAgICB2YXIgc2VydmljZSA9IHtcbiAgICAgICAgd2ViMzogbmV3IFdlYjMoKSxcbiAgICAgICAgaXNDb25uZWN0ZWQ6IGlzQ29ubmVjdGVkXG4gICAgICB9O1xuXG4gICAgICBhY3RpdmF0ZSgpO1xuXG4gICAgICByZXR1cm4gc2VydmljZTtcblxuICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICBmdW5jdGlvbiBhY3RpdmF0ZSgpIHtcbiAgICAgICAgc2VydmljZS53ZWIzLnNldFByb3ZpZGVyKG5ldyBzZXJ2aWNlLndlYjMucHJvdmlkZXJzLkh0dHBQcm92aWRlcihcImh0dHA6Ly9sb2NhbGhvc3Q6ODU0NVwiKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gc2VydmljZS53ZWIzLmN1cnJlbnRQcm92aWRlci5pc0Nvbm5lY3RlZCgpO1xuICAgICAgfVxuICAgIH1cbn0pKCk7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=
+!function(){"use strict";angular.module("ether-wheel",["ngRoute","rzModule","oitozero.ngSweetAlert","angularMoment"]).config(["$routeProvider","$locationProvider",function(t,e){t.otherwise({redirectTo:"/"}),e.html5Mode(!0)}])}(),function(){"use strict";function t(t){var e=[{constant:!0,inputs:[{name:"",type:"uint256"}],name:"contributors",outputs:[{name:"",type:"address"}],type:"function"},{constant:!0,inputs:[],name:"goal",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!0,inputs:[{name:"",type:"address"}],name:"contributions",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"newHost",type:"address"}],name:"changeHost",outputs:[],type:"function"},{constant:!1,inputs:[],name:"destroy",outputs:[],type:"function"},{constant:!1,inputs:[{name:"amount",type:"uint256"}],name:"setContribution",outputs:[],type:"function"},{constant:!0,inputs:[],name:"numWinners",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!0,inputs:[],name:"numContributors",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!1,inputs:[],name:"addToContribution",outputs:[],type:"function"},{constant:!0,inputs:[],name:"increment",outputs:[{name:"",type:"uint256"}],type:"function"},{constant:!1,inputs:[{name:"amount",type:"uint256"}],name:"removeFromContribution",outputs:[],type:"function"},{constant:!0,inputs:[{name:"",type:"uint256"}],name:"recentWins",outputs:[{name:"winner",type:"address"},{name:"timestamp",type:"uint256"},{name:"contribution",type:"uint256"}],type:"function"},{constant:!0,inputs:[],name:"host",outputs:[{name:"",type:"address"}],type:"function"},{inputs:[{name:"_goalInFinney",type:"uint256"},{name:"_incrementInFinney",type:"uint256"},{name:"_recentWinsCount",type:"uint8"}],type:"constructor"},{anonymous:!1,inputs:[{indexed:!1,name:"winner",type:"address"},{indexed:!1,name:"timestamp",type:"uint256"},{indexed:!1,name:"contribution",type:"uint256"}],name:"Won",type:"event"},{anonymous:!1,inputs:[{indexed:!1,name:"contributor",type:"address"}],name:"ChangedContribution",type:"event"}],n=function(n,o,i){this.address=n,this.contributionChangedCallback=o,this.roundEndedCallback=i;var r=t.web3.eth.contract(e);this.contract=r.at(n),this.goal=t.web3.fromWei(this.contract.goal(),"ether").toString(),this.increment=t.web3.fromWei(this.contract.increment(),"ether").toString(),this.contributorsData={},this.desiredContribution=0,this.contract.ChangedContribution().watch(this.onContributionChanged.bind(this)),this.contract.Won().watch(this.onWon.bind(this)),this.initializeContributorsData(),this.updateContractData(),this.refreshRecentWinsList()};return n.prototype.updateContractData=function(){var e=t.web3.eth.getBalance(this.address),n=t.web3.fromWei(e,"ether");this.balance=parseFloat(n.toString())},n.prototype.initializeContributorsData=function(){if(t.isConnected()){this.contributorsData={};for(var e=this.contract.numContributors().toString(),n=0;e>n;++n){var o=this.contract.contributors(n).toString();this.addContributor(o,n)}}},n.prototype.addContributor=function(e,n){this.contributorsData[e]={address:e,contribution:parseFloat(t.web3.fromWei(this.contract.contributions(e),"ether").toString()),index:n}},n.prototype.refreshRecentWinsList=function(){this.recentWins=[];for(var t=this.contract.numWinners(),e=0;t>e;++e)this.recentWins.push(this.contract.recentWins(e))},n.prototype.getContribution=function(t){var e=0;return t in this.contributorsData&&(e=this.contributorsData[t].contribution),e},n.prototype.getAdjustedBalance=function(t){var e=this.desiredContribution-this.getContribution(t);return this.balance+e},n.prototype.setContribution=function(e,n,o){var i=t.web3.toWei(n,"ether")-t.web3.toWei(this.getContribution(e),"ether"),r=t.web3.toWei(n,"ether"),s=0;i>0&&(s=i);var a=this.contract.setContribution.getData(r),c={value:s,from:e,to:this.address,data:a};c.gas=t.web3.eth.estimateGas(c)+1e5,this.contract.setContribution(r,c,o)},n.prototype.onContributionChanged=function(e,n){if(e)return void console.log(e);var o=n.args.contributor,i=parseFloat(t.web3.fromWei(this.contract.contributions(o),"ether").toString()),r=!(o in this.contributorsData);r?this.addContributor(o,i):this.contributorsData[o].contribution=i,this.updateContractData(),this.contributionChangedCallback&&this.contributionChangedCallback(this,o,i,r)},n.prototype.onWon=function(t,e){return t?void console.log(t):(this.desiredContribution=0,this.updateContractData(),this.refreshRecentWinsList(),void(this.roundEndedCallback&&this.roundEndedCallback(this,e.args.winner)))},n}t.$inject=["ethereum"],angular.module("ether-wheel").factory("Wheel",t)}(),function(){"use strict";function t(t,e,n,o,i){function r(){W.isConnected=o.isConnected(),W.isConnected&&(s(),v.addData({value:1,color:g,label:C}),W.wheels=[],y.forEach(function(t){var e=new i(t,m,f);W.wheels.push(e)}),l(W.wheels[0]),W.accounts=o.web3.eth.accounts,W.selectedAccount=o.web3.eth.defaultAccount,W.selectedAccount||(W.selectedAccount=o.web3.eth.coinbase),p())}function s(){function t(t){var e=t.label===W.selectedAccount?"You":t.label,n=e+": "+t.value.toFixed(2)+" Ξ";if(W.goal){var o=t.value/W.goal*100;n+=" ("+Math.round(100*o)/100+"%)"}return n}v&&v.destroy();var e={animationEasing:"easeInOut",segmentStrokeWidth:3,animationSteps:20,segmentStrokeColor:"#EBF0F1",percentageInnerCutout:75,responsive:!0,tooltipTemplate:t},n=document.getElementById("wheel").getContext("2d");v=new Chart(n).Doughnut([],e)}function a(t){var e=t.contributorsData;for(var n in e){var o=e[n],i={label:o.address,value:o.contribution,color:d(o.address)};v.addData(i,o.index)}v.addData({label:C,color:g,value:W.selectedWheel.goal-W.selectedWheel.getAdjustedBalance(W.selectedAccount)}),v.update()}function c(){v.segments[v.segments.length-1].value=W.selectedWheel.goal-W.selectedWheel.getAdjustedBalance(W.selectedAccount),v.update()}function u(){var t=W.selectedWheel.contributorsData;if(W.selectedAccount in t){var e=t[W.selectedAccount].index;v.segments[e].value=W.selectedWheel.desiredContribution}else{var e=Object.keys(t).length;W.selectedWheel.addContributor(W.selectedAccount,e);var n={label:W.selectedAccount,value:W.selectedWheel.desiredContribution,color:d(W.selectedAccount)};v.addData(n,e-2)}c()}function d(t){return t===W.selectedAccount?"#5cb85c":"#3D3E3F"}function l(t){W.selectedWheel!==t&&(W.selectedWheel=t,W.selectedWheel.desiredContribution=W.selectedWheel.getContribution(W.selectedAccount),s(),a(W.selectedWheel),u())}function h(){function t(t,e){if(t){var o=t;o+="
Make sure you've unlocked your account to make transactions (e.g. using the --unlock command with geth). If you're having trouble, you can also set your contribution by sending ether directly to the wheel at:
"+W.selectedWheel.address+'
( view verified source code)',n.swal({title:"Error Setting Contribution",text:o,type:"error",html:!0})}else n.swal({title:"Success!",text:"Your request has been successfully sent to the Ethereum network for processing. You'll see your account balance updated soon.
This may take a minute or two.",type:"success",html:!0}),W.selectedWheel.desiredContribution=W.selectedWheel.getContribution(W.selectedAccount),v.segments[W.selectedWheel.contributorsData[W.selectedAccount].index].value=W.selectedWheel.getContribution(W.selectedAccount),c()}W.selectedWheel.setContribution(W.selectedAccount,W.selectedWheel.desiredContribution,t)}function b(t){return o.web3.fromWei(o.web3.eth.getBalance(t),"ether")}function p(){W.wheels.forEach(function(t){t.desiredContribution=t.getContribution(W.selectedAccount)}),s(),a(W.selectedWheel)}function m(t,n,o,i){if(n==W.selectedAccount&&(W.selectedWheel.desiredContribution=o),t==W.selectedWheel){var r=W.selectedWheel.contributorsData,s=r[n].index;if(i){var a={label:n,value:o,color:d(n)};v.addData(a,s)}else v.segments[r[n].index].value=o;c()}e.$apply()}function f(t,n){W.selectedWheel.desiredContribution=W.selectedWheel.getContribution(W.selectedAccount),e.$apply()}var g="#dce6e9",C="Empty",y=["0x53891ef3793d8534Ad42312BcC77dFAd51Bb5F1C","0x27C0aFc960FbeaB1c6BbA6bE3837d40E948B2250","0x1107BD232640434008b8ce1FD058837E141f754B"],v=null,W=this;W.web3=o.web3,W.moment=moment,W.selectWheel=l,W.getAccountBalance=b,W.onAccountChanged=p,W.setContribution=h,W.onSliderChanged=u,r()}t.$inject=["$route","$scope","SweetAlert","ethereum","Wheel"],angular.module("ether-wheel").controller("WheelCtrl",t)}(),function(){"use strict";function t(){function t(){n.web3.setProvider(new n.web3.providers.HttpProvider("http://localhost:8545"))}function e(){return n.web3.currentProvider.isConnected()}var n={web3:new Web3,isConnected:e};return t(),n}angular.module("ether-wheel").service("ethereum",t)}();
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC5qcyIsIndoZWVsLnNlcnZpY2UuanMiLCJhcHAubWluLmpzIiwid2hlZWwuY29udHJvbGxlci5qcyIsImV0aGVyZXVtLnNlcnZpY2UuanMiXSwibmFtZXMiOlsiYW5ndWxhciIsIm1vZHVsZSIsImNvbmZpZyIsIiRyb3V0ZVByb3ZpZGVyIiwiJGxvY2F0aW9uUHJvdmlkZXIiLCJvdGhlcndpc2UiLCJyZWRpcmVjdFRvIiwiaHRtbDVNb2RlIiwiV2hlZWxGYWN0b3J5IiwiZXRoZXJldW0iLCJhYmkiLCJjb25zdGFudCIsImlucHV0cyIsIm5hbWUiLCJ0eXBlIiwib3V0cHV0cyIsImFub255bW91cyIsImluZGV4ZWQiLCJXaGVlbCIsImNvbnRhY3RBZGRyZXNzIiwiY29udHJpYnV0aW9uQ2hhbmdlZENhbGxiYWNrIiwicm91bmRFbmRlZENhbGxiYWNrIiwidGhpcyIsImFkZHJlc3MiLCJjb250cmFjdEJsdWVwcmludCIsIndlYjMiLCJldGgiLCJjb250cmFjdCIsImF0IiwiZ29hbCIsImZyb21XZWkiLCJ0b1N0cmluZyIsImluY3JlbWVudCIsImNvbnRyaWJ1dG9yc0RhdGEiLCJkZXNpcmVkQ29udHJpYnV0aW9uIiwiQ2hhbmdlZENvbnRyaWJ1dGlvbiIsIndhdGNoIiwib25Db250cmlidXRpb25DaGFuZ2VkIiwiYmluZCIsIldvbiIsIm9uV29uIiwiaW5pdGlhbGl6ZUNvbnRyaWJ1dG9yc0RhdGEiLCJ1cGRhdGVDb250cmFjdERhdGEiLCJyZWZyZXNoUmVjZW50V2luc0xpc3QiLCJwcm90b3R5cGUiLCJ3ZWkiLCJnZXRCYWxhbmNlIiwiZXRoZXIiLCJiYWxhbmNlIiwicGFyc2VGbG9hdCIsImlzQ29ubmVjdGVkIiwibnVtQ29udHJpYnV0b3JzIiwiaSIsImNvbnRyaWJ1dG9yQWRkcmVzcyIsImNvbnRyaWJ1dG9ycyIsImFkZENvbnRyaWJ1dG9yIiwiaW5kZXgiLCJjb250cmlidXRpb24iLCJjb250cmlidXRpb25zIiwicmVjZW50V2lucyIsIm51bVJlY2VudFdpbnMiLCJudW1XaW5uZXJzIiwicHVzaCIsImdldENvbnRyaWJ1dGlvbiIsImFjY291bnQiLCJjdXJyZW50Q29udHJpYnV0aW9uIiwiZ2V0QWRqdXN0ZWRCYWxhbmNlIiwiZGVsdGFDb250cmlidXRpb24iLCJzZXRDb250cmlidXRpb24iLCJ2YWx1ZSIsImNhbGxiYWNrIiwidG9XZWkiLCJkZXNpcmVkQ29udHJpYnV0aW9uSW5XZWkiLCJ2YWx1ZVRvU2VuZCIsImNhbGxEYXRhIiwiZ2V0RGF0YSIsInRyYW5zYWN0aW9uIiwiZnJvbSIsInRvIiwiZGF0YSIsImdhcyIsImVzdGltYXRlR2FzIiwiZXJyb3IiLCJyZXN1bHQiLCJjb25zb2xlIiwibG9nIiwiYXJncyIsImNvbnRyaWJ1dG9yIiwibmV3Q29udHJpYnV0aW9uIiwiaXNOZXdDb250cmlidXRvciIsIndpbm5lciIsIiRpbmplY3QiLCJmYWN0b3J5IiwiV2hlZWxDdHJsIiwiJHJvdXRlIiwiJHNjb3BlIiwiU3dlZXRBbGVydCIsImFjdGl2YXRlIiwidm0iLCJjcmVhdGVDaGFydCIsImNoYXJ0IiwiYWRkRGF0YSIsImNvbG9yIiwiZW1wdHlCYXJDb2xvciIsImxhYmVsIiwiZW1wdHlCYXJMYWJlbCIsIndoZWVscyIsImNvbnRyYWN0QWRkcmVzc2VzIiwiZm9yRWFjaCIsIm5ld1doZWVsIiwib25Sb3VuZEVuZGVkIiwic2VsZWN0V2hlZWwiLCJhY2NvdW50cyIsInNlbGVjdGVkQWNjb3VudCIsImRlZmF1bHRBY2NvdW50IiwiY29pbmJhc2UiLCJvbkFjY291bnRDaGFuZ2VkIiwiZ2V0VG9vbHRpcFRlbXBsYXRlIiwidmFsdWVPYmplY3QiLCJ0b29sdGlwIiwidG9GaXhlZCIsInBlcmNlbnRhZ2UiLCJNYXRoIiwicm91bmQiLCJkZXN0cm95IiwiY2hhcnRPcHRpb25zIiwiYW5pbWF0aW9uRWFzaW5nIiwic2VnbWVudFN0cm9rZVdpZHRoIiwiYW5pbWF0aW9uU3RlcHMiLCJzZWdtZW50U3Ryb2tlQ29sb3IiLCJwZXJjZW50YWdlSW5uZXJDdXRvdXQiLCJyZXNwb25zaXZlIiwidG9vbHRpcFRlbXBsYXRlIiwiY3R4IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldENvbnRleHQiLCJDaGFydCIsIkRvdWdobnV0IiwicG9wdWxhdGVDaGFydCIsIndoZWVsIiwiY2hhcnREYXRhIiwiZ2V0Q2hhcnRDb2xvckZvckFjY291bnQiLCJzZWxlY3RlZFdoZWVsIiwidXBkYXRlIiwidXBkYXRlQ2hhcnRFbXB0eVNsb3QiLCJzZWdtZW50cyIsImxlbmd0aCIsInVwZGF0ZUNoYXJ0Q29udHJpYnV0aW9uUHJldmlldyIsIk9iamVjdCIsImtleXMiLCJvbkNvbnRyaWJ1dGlvblNldCIsImVycm9yTWVzc2FnZSIsInN1YnN0cmluZyIsInN3YWwiLCJ0aXRsZSIsInRleHQiLCJodG1sIiwiZ2V0QWNjb3VudEJhbGFuY2UiLCJjb250cmlidXRvckFjY291bnQiLCIkYXBwbHkiLCJ3aW5uZXJBZGRyZXNzIiwibW9tZW50Iiwib25TbGlkZXJDaGFuZ2VkIiwiY29udHJvbGxlciIsInNlcnZpY2UiLCJzZXRQcm92aWRlciIsInByb3ZpZGVycyIsIkh0dHBQcm92aWRlciIsImN1cnJlbnRQcm92aWRlciIsIldlYjMiXSwibWFwcGluZ3MiOiJDQUFBLFdBQ0UsWUFFQUEsU0FBUUMsT0FBTyxlQUNiLFVBQ0EsV0FDQSx3QkFDQSxrQkFFRkMsUUFBUSxpQkFBa0Isb0JBQXFCLFNBQVNDLEVBQWdCQyxHQUN0RUQsRUFBZUUsV0FBV0MsV0FBWSxNQUN0Q0YsRUFBa0JHLFdBQVUsU0NYaEMsV0FDRSxZQUtBLFNBQVNDLEdBQWFDLEdBQ3BCLEdBQUlDLEtBQVFDLFVBQVcsRUFBS0MsU0FBV0MsS0FBTyxHQUFHQyxLQUFPLFlBQVlELEtBQU8sZUFBZUUsVUFBWUYsS0FBTyxHQUFHQyxLQUFPLFlBQVlBLEtBQU8sYUFBYUgsVUFBVyxFQUFLQyxVQUFZQyxLQUFPLE9BQU9FLFVBQVlGLEtBQU8sR0FBR0MsS0FBTyxZQUFZQSxLQUFPLGFBQWFILFVBQVcsRUFBS0MsU0FBV0Ms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QyxLQUVPb0UsRUFYVHJLLFFBQVFDLE9BQU8sZUFBZW9LLFFBQVEsV0FBWTVKIiwiZmlsZSI6ImFwcC5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBhbmd1bGFyLm1vZHVsZSgnZXRoZXItd2hlZWwnLCBbXG4gICAgJ25nUm91dGUnLFxuICAgICdyek1vZHVsZScsXG4gICAgJ29pdG96ZXJvLm5nU3dlZXRBbGVydCcsXG4gICAgJ2FuZ3VsYXJNb21lbnQnXG4gIF0pLlxuICBjb25maWcoWyckcm91dGVQcm92aWRlcicsICckbG9jYXRpb25Qcm92aWRlcicsIGZ1bmN0aW9uKCRyb3V0ZVByb3ZpZGVyLCAkbG9jYXRpb25Qcm92aWRlcikge1xuICAgICRyb3V0ZVByb3ZpZGVyLm90aGVyd2lzZSh7cmVkaXJlY3RUbzogJy8nfSk7XG4gICAgJGxvY2F0aW9uUHJvdmlkZXIuaHRtbDVNb2RlKHRydWUpO1xuICB9XSk7XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgYW5ndWxhci5tb2R1bGUoJ2V0aGVyLXdoZWVsJykuZmFjdG9yeSgnV2hlZWwnLCBXaGVlbEZhY3RvcnkpO1xuXG4gIC8qIEBuZ0luamVjdCAqL1xuICBmdW5jdGlvbiBXaGVlbEZhY3RvcnkoZXRoZXJldW0pIHtcbiAgICB2YXIgYWJpID0gW3tcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwibmFtZVwiOlwiY29udHJpYnV0b3JzXCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwiYWRkcmVzc1wifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcImdvYWxcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcImFkZHJlc3NcIn1dLFwibmFtZVwiOlwiY29udHJpYnV0aW9uc1wiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjpmYWxzZSxcImlucHV0c1wiOlt7XCJuYW1lXCI6XCJuZXdIb3N0XCIsXCJ0eXBlXCI6XCJhZGRyZXNzXCJ9XSxcIm5hbWVcIjpcImNoYW5nZUhvc3RcIixcIm91dHB1dHNcIjpbXSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6ZmFsc2UsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcImRlc3Ryb3lcIixcIm91dHB1dHNcIjpbXSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6ZmFsc2UsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwiYW1vdW50XCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcIm5hbWVcIjpcInNldENvbnRyaWJ1dGlvblwiLFwib3V0cHV0c1wiOltdLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJudW1XaW5uZXJzXCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcIm51bUNvbnRyaWJ1dG9yc1wiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjpmYWxzZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwiYWRkVG9Db250cmlidXRpb25cIixcIm91dHB1dHNcIjpbXSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwiaW5jcmVtZW50XCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOmZhbHNlLFwiaW5wdXRzXCI6W3tcIm5hbWVcIjpcImFtb3VudFwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJuYW1lXCI6XCJyZW1vdmVGcm9tQ29udHJpYnV0aW9uXCIsXCJvdXRwdXRzXCI6W10sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcIm5hbWVcIjpcInJlY2VudFdpbnNcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwid2lubmVyXCIsXCJ0eXBlXCI6XCJhZGRyZXNzXCJ9LHtcIm5hbWVcIjpcInRpbWVzdGFtcFwiLFwidHlwZVwiOlwidWludDI1NlwifSx7XCJuYW1lXCI6XCJjb250cmlidXRpb25cIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJob3N0XCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwiYWRkcmVzc1wifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJpbnB1dHNcIjpbe1wibmFtZVwiOlwiX2dvYWxJbkZpbm5leVwiLFwidHlwZVwiOlwidWludDI1NlwifSx7XCJuYW1lXCI6XCJfaW5jcmVtZW50SW5GaW5uZXlcIixcInR5cGVcIjpcInVpbnQyNTZcIn0se1wibmFtZVwiOlwiX3JlY2VudFdpbnNDb3VudFwiLFwidHlwZVwiOlwidWludDhcIn1dLFwidHlwZVwiOlwiY29uc3RydWN0b3JcIn0se1wiYW5vbnltb3VzXCI6ZmFsc2UsXCJpbnB1dHNcIjpbe1wiaW5kZXhlZFwiOmZhbHNlLFwibmFtZVwiOlwid2lubmVyXCIsXCJ0eXBlXCI6XCJhZGRyZXNzXCJ9LHtcImluZGV4ZWRcIjpmYWxzZSxcIm5hbWVcIjpcInRpbWVzdGFtcFwiLFwidHlwZVwiOlwidWludDI1NlwifSx7XCJpbmRleGVkXCI6ZmFsc2UsXCJuYW1lXCI6XCJjb250cmlidXRpb25cIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwibmFtZVwiOlwiV29uXCIsXCJ0eXBlXCI6XCJldmVudFwifSx7XCJhbm9ueW1vdXNcIjpmYWxzZSxcImlucHV0c1wiOlt7XCJpbmRleGVkXCI6ZmFsc2UsXCJuYW1lXCI6XCJjb250cmlidXRvclwiLFwidHlwZVwiOlwiYWRkcmVzc1wifV0sXCJuYW1lXCI6XCJDaGFuZ2VkQ29udHJpYnV0aW9uXCIsXCJ0eXBlXCI6XCJldmVudFwifV07XG5cbiAgICB2YXIgV2hlZWwgPSBmdW5jdGlvbihjb250YWN0QWRkcmVzcywgY29udHJpYnV0aW9uQ2hhbmdlZENhbGxiYWNrLCByb3VuZEVuZGVkQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuYWRkcmVzcyA9IGNvbnRhY3RBZGRyZXNzO1xuICAgICAgdGhpcy5jb250cmlidXRpb25DaGFuZ2VkQ2FsbGJhY2sgPSBjb250cmlidXRpb25DaGFuZ2VkQ2FsbGJhY2s7XG4gICAgICB0aGlzLnJvdW5kRW5kZWRDYWxsYmFjayA9IHJvdW5kRW5kZWRDYWxsYmFjaztcblxuICAgICAgdmFyIGNvbnRyYWN0Qmx1ZXByaW50ID0gZXRoZXJldW0ud2ViMy5ldGguY29udHJhY3QoYWJpKTtcbiAgICAgIHRoaXMuY29udHJhY3QgPSBjb250cmFjdEJsdWVwcmludC5hdChjb250YWN0QWRkcmVzcyk7XG5cbiAgICAgIHRoaXMuZ29hbCA9IGV0aGVyZXVtLndlYjMuZnJvbVdlaSh0aGlzLmNvbnRyYWN0LmdvYWwoKSwgJ2V0aGVyJykudG9TdHJpbmcoKTtcbiAgICAgIHRoaXMuaW5jcmVtZW50ID0gZXRoZXJldW0ud2ViMy5mcm9tV2VpKHRoaXMuY29udHJhY3QuaW5jcmVtZW50KCksICdldGhlcicpLnRvU3RyaW5nKCk7XG5cbiAgICAgIHRoaXMuY29udHJpYnV0b3JzRGF0YSA9IHt9O1xuICAgICAgdGhpcy5kZXNpcmVkQ29udHJpYnV0aW9uID0gMDtcblxuICAgICAgdGhpcy5jb250cmFjdC5DaGFuZ2VkQ29udHJpYnV0aW9uKCkud2F0Y2godGhpcy5vbkNvbnRyaWJ1dGlvbkNoYW5nZWQuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLmNvbnRyYWN0LldvbigpLndhdGNoKHRoaXMub25Xb24uYmluZCh0aGlzKSk7XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRyaWJ1dG9yc0RhdGEoKTtcbiAgICAgIHRoaXMudXBkYXRlQ29udHJhY3REYXRhKCk7XG4gICAgICB0aGlzLnJlZnJlc2hSZWNlbnRXaW5zTGlzdCgpO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIFdoZWVsLnByb3RvdHlwZS51cGRhdGVDb250cmFjdERhdGEgPSBmdW5jdGlvbigpe1xuICAgICAgLy8gQ29udHJhY3QgYmFsYW5jZVxuICAgICAgdmFyIHdlaSA9IGV0aGVyZXVtLndlYjMuZXRoLmdldEJhbGFuY2UodGhpcy5hZGRyZXNzKTtcbiAgICAgIHZhciBldGhlciA9IGV0aGVyZXVtLndlYjMuZnJvbVdlaSh3ZWksICdldGhlcicpO1xuICAgICAgdGhpcy5iYWxhbmNlID0gcGFyc2VGbG9hdChldGhlci50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBXaGVlbC5wcm90b3R5cGUuaW5pdGlhbGl6ZUNvbnRyaWJ1dG9yc0RhdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmKCFldGhlcmV1bS5pc0Nvbm5lY3RlZCgpKSB7IHJldHVybjsgfVxuXG4gICAgICB0aGlzLmNvbnRyaWJ1dG9yc0RhdGEgPSB7fTtcbiAgICAgIHZhciBudW1Db250cmlidXRvcnMgPSB0aGlzLmNvbnRyYWN0Lm51bUNvbnRyaWJ1dG9ycygpLnRvU3RyaW5nKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtQ29udHJpYnV0b3JzOyArK2kpIHtcbiAgICAgICAgdmFyIGNvbnRyaWJ1dG9yQWRkcmVzcyA9IHRoaXMuY29udHJhY3QuY29udHJpYnV0b3JzKGkpLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuYWRkQ29udHJpYnV0b3IoY29udHJpYnV0b3JBZGRyZXNzLCBpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLmFkZENvbnRyaWJ1dG9yID0gZnVuY3Rpb24oYWRkcmVzcywgaW5kZXgpIHtcbiAgICAgIHRoaXMuY29udHJpYnV0b3JzRGF0YVthZGRyZXNzXSA9IHtcbiAgICAgICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgY29udHJpYnV0aW9uOiBwYXJzZUZsb2F0KGV0aGVyZXVtLndlYjMuZnJvbVdlaSh0aGlzLmNvbnRyYWN0LmNvbnRyaWJ1dGlvbnMoYWRkcmVzcyksICdldGhlcicpLnRvU3RyaW5nKCkpLFxuICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgIH07XG4gICAgfVxuXG4gICAgV2hlZWwucHJvdG90eXBlLnJlZnJlc2hSZWNlbnRXaW5zTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5yZWNlbnRXaW5zID0gW107XG4gICAgICB2YXIgbnVtUmVjZW50V2lucyA9IHRoaXMuY29udHJhY3QubnVtV2lubmVycygpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG51bVJlY2VudFdpbnM7ICsraSkge1xuICAgICAgICB0aGlzLnJlY2VudFdpbnMucHVzaCh0aGlzLmNvbnRyYWN0LnJlY2VudFdpbnMoaSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBXaGVlbC5wcm90b3R5cGUuZ2V0Q29udHJpYnV0aW9uID0gZnVuY3Rpb24oYWNjb3VudCkge1xuICAgICAgdmFyIGN1cnJlbnRDb250cmlidXRpb24gPSAwO1xuICAgICAgaWYoYWNjb3VudCBpbiB0aGlzLmNvbnRyaWJ1dG9yc0RhdGEpIHtcbiAgICAgICAgY3VycmVudENvbnRyaWJ1dGlvbiA9IHRoaXMuY29udHJpYnV0b3JzRGF0YVthY2NvdW50XS5jb250cmlidXRpb247XG4gICAgICB9XG4gICAgICByZXR1cm4gY3VycmVudENvbnRyaWJ1dGlvbjtcbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLmdldEFkanVzdGVkQmFsYW5jZSA9IGZ1bmN0aW9uKGFjY291bnQpIHtcbiAgICAgIHZhciBkZWx0YUNvbnRyaWJ1dGlvbiA9ICh0aGlzLmRlc2lyZWRDb250cmlidXRpb24gLSB0aGlzLmdldENvbnRyaWJ1dGlvbihhY2NvdW50KSk7XG4gICAgICByZXR1cm4gdGhpcy5iYWxhbmNlICsgZGVsdGFDb250cmlidXRpb247XG4gICAgfTtcblxuICAgIFdoZWVsLnByb3RvdHlwZS5zZXRDb250cmlidXRpb24gPSBmdW5jdGlvbihhY2NvdW50LCB2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBkZWx0YUNvbnRyaWJ1dGlvbiA9IGV0aGVyZXVtLndlYjMudG9XZWkodmFsdWUsICdldGhlcicpIC0gZXRoZXJldW0ud2ViMy50b1dlaSh0aGlzLmdldENvbnRyaWJ1dGlvbihhY2NvdW50KSwgJ2V0aGVyJyk7XG4gICAgICB2YXIgZGVzaXJlZENvbnRyaWJ1dGlvbkluV2VpID0gZXRoZXJldW0ud2ViMy50b1dlaSh2YWx1ZSwgJ2V0aGVyJyk7XG4gICAgICB2YXIgdmFsdWVUb1NlbmQgPSAwO1xuICAgICAgaWYoZGVsdGFDb250cmlidXRpb24gPiAwKSB7XG4gICAgICAgIHZhbHVlVG9TZW5kID0gZGVsdGFDb250cmlidXRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjYWxsRGF0YSA9IHRoaXMuY29udHJhY3Quc2V0Q29udHJpYnV0aW9uLmdldERhdGEoZGVzaXJlZENvbnRyaWJ1dGlvbkluV2VpKTtcbiAgICAgIHZhciB0cmFuc2FjdGlvbiA9IHsgdmFsdWU6IHZhbHVlVG9TZW5kLCBmcm9tOiBhY2NvdW50LCB0bzogdGhpcy5hZGRyZXNzLCBkYXRhOiBjYWxsRGF0YSB9O1xuICAgICAgdHJhbnNhY3Rpb24uZ2FzID0gZXRoZXJldW0ud2ViMy5ldGguZXN0aW1hdGVHYXModHJhbnNhY3Rpb24pICsgMTAwMDAwO1xuICAgICAgdGhpcy5jb250cmFjdC5zZXRDb250cmlidXRpb24oZGVzaXJlZENvbnRyaWJ1dGlvbkluV2VpLCB0cmFuc2FjdGlvbiwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICBXaGVlbC5wcm90b3R5cGUub25Db250cmlidXRpb25DaGFuZ2VkID0gZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkge1xuICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBhZGRyZXNzID0gcmVzdWx0LmFyZ3MuY29udHJpYnV0b3I7XG4gICAgICB2YXIgbmV3Q29udHJpYnV0aW9uID0gcGFyc2VGbG9hdChldGhlcmV1bS53ZWIzLmZyb21XZWkodGhpcy5jb250cmFjdC5jb250cmlidXRpb25zKGFkZHJlc3MpLCAnZXRoZXInKS50b1N0cmluZygpKTtcblxuICAgICAgdmFyIGlzTmV3Q29udHJpYnV0b3IgPSAhKGFkZHJlc3MgaW4gdGhpcy5jb250cmlidXRvcnNEYXRhKTtcbiAgICAgIGlmKGlzTmV3Q29udHJpYnV0b3IpIHtcbiAgICAgICAgdGhpcy5hZGRDb250cmlidXRvcihhZGRyZXNzLCBuZXdDb250cmlidXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb250cmlidXRvcnNEYXRhW2FkZHJlc3NdLmNvbnRyaWJ1dGlvbiA9IG5ld0NvbnRyaWJ1dGlvbjtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVDb250cmFjdERhdGEoKTtcblxuICAgICAgaWYoISF0aGlzLmNvbnRyaWJ1dGlvbkNoYW5nZWRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNvbnRyaWJ1dGlvbkNoYW5nZWRDYWxsYmFjayh0aGlzLCBhZGRyZXNzLCBuZXdDb250cmlidXRpb24sIGlzTmV3Q29udHJpYnV0b3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBXaGVlbC5wcm90b3R5cGUub25Xb24gPSBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgICBpZihlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kZXNpcmVkQ29udHJpYnV0aW9uID0gMDtcbiAgICAgIHRoaXMudXBkYXRlQ29udHJhY3REYXRhKCk7XG5cbiAgICAgIHRoaXMucmVmcmVzaFJlY2VudFdpbnNMaXN0KCk7XG4gICAgICBpZighIXRoaXMucm91bmRFbmRlZENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucm91bmRFbmRlZENhbGxiYWNrKHRoaXMsIHJlc3VsdC5hcmdzLndpbm5lcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHJldHVybiBXaGVlbDtcbiAgfVxufSkoKTtcbiIsIihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcsIFtcbiAgICAnbmdSb3V0ZScsXG4gICAgJ3J6TW9kdWxlJyxcbiAgICAnb2l0b3plcm8ubmdTd2VldEFsZXJ0JyxcbiAgICAnYW5ndWxhck1vbWVudCdcbiAgXSkuXG4gIGNvbmZpZyhbJyRyb3V0ZVByb3ZpZGVyJywgJyRsb2NhdGlvblByb3ZpZGVyJywgZnVuY3Rpb24oJHJvdXRlUHJvdmlkZXIsICRsb2NhdGlvblByb3ZpZGVyKSB7XG4gICAgJHJvdXRlUHJvdmlkZXIub3RoZXJ3aXNlKHtyZWRpcmVjdFRvOiAnLyd9KTtcbiAgICAkbG9jYXRpb25Qcm92aWRlci5odG1sNU1vZGUodHJ1ZSk7XG4gIH1dKTtcbn0pKCk7XG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIFdoZWVsRmFjdG9yeS4kaW5qZWN0ID0gW1wiZXRoZXJldW1cIl07XG4gIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcpLmZhY3RvcnkoJ1doZWVsJywgV2hlZWxGYWN0b3J5KTtcblxuICAvKiBAbmdJbmplY3QgKi9cbiAgZnVuY3Rpb24gV2hlZWxGYWN0b3J5KGV0aGVyZXVtKSB7XG4gICAgdmFyIGFiaSA9IFt7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcIm5hbWVcIjpcImNvbnRyaWJ1dG9yc1wiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcImFkZHJlc3NcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJnb2FsXCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJhZGRyZXNzXCJ9XSxcIm5hbWVcIjpcImNvbnRyaWJ1dGlvbnNcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6ZmFsc2UsXCJpbnB1dHNcIjpbe1wibmFtZVwiOlwibmV3SG9zdFwiLFwidHlwZVwiOlwiYWRkcmVzc1wifV0sXCJuYW1lXCI6XCJjaGFuZ2VIb3N0XCIsXCJvdXRwdXRzXCI6W10sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOmZhbHNlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJkZXN0cm95XCIsXCJvdXRwdXRzXCI6W10sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOmZhbHNlLFwiaW5wdXRzXCI6W3tcIm5hbWVcIjpcImFtb3VudFwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJuYW1lXCI6XCJzZXRDb250cmlidXRpb25cIixcIm91dHB1dHNcIjpbXSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwibnVtV2lubmVyc1wiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W10sXCJuYW1lXCI6XCJudW1Db250cmlidXRvcnNcIixcIm91dHB1dHNcIjpbe1wibmFtZVwiOlwiXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6ZmFsc2UsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcImFkZFRvQ29udHJpYnV0aW9uXCIsXCJvdXRwdXRzXCI6W10sXCJ0eXBlXCI6XCJmdW5jdGlvblwifSx7XCJjb25zdGFudFwiOnRydWUsXCJpbnB1dHNcIjpbXSxcIm5hbWVcIjpcImluY3JlbWVudFwiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjpmYWxzZSxcImlucHV0c1wiOlt7XCJuYW1lXCI6XCJhbW91bnRcIixcInR5cGVcIjpcInVpbnQyNTZcIn1dLFwibmFtZVwiOlwicmVtb3ZlRnJvbUNvbnRyaWJ1dGlvblwiLFwib3V0cHV0c1wiOltdLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiY29uc3RhbnRcIjp0cnVlLFwiaW5wdXRzXCI6W3tcIm5hbWVcIjpcIlwiLFwidHlwZVwiOlwidWludDI1NlwifV0sXCJuYW1lXCI6XCJyZWNlbnRXaW5zXCIsXCJvdXRwdXRzXCI6W3tcIm5hbWVcIjpcIndpbm5lclwiLFwidHlwZVwiOlwiYWRkcmVzc1wifSx7XCJuYW1lXCI6XCJ0aW1lc3RhbXBcIixcInR5cGVcIjpcInVpbnQyNTZcIn0se1wibmFtZVwiOlwiY29udHJpYnV0aW9uXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcInR5cGVcIjpcImZ1bmN0aW9uXCJ9LHtcImNvbnN0YW50XCI6dHJ1ZSxcImlucHV0c1wiOltdLFwibmFtZVwiOlwiaG9zdFwiLFwib3V0cHV0c1wiOlt7XCJuYW1lXCI6XCJcIixcInR5cGVcIjpcImFkZHJlc3NcIn1dLFwidHlwZVwiOlwiZnVuY3Rpb25cIn0se1wiaW5wdXRzXCI6W3tcIm5hbWVcIjpcIl9nb2FsSW5GaW5uZXlcIixcInR5cGVcIjpcInVpbnQyNTZcIn0se1wibmFtZVwiOlwiX2luY3JlbWVudEluRmlubmV5XCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9LHtcIm5hbWVcIjpcIl9yZWNlbnRXaW5zQ291bnRcIixcInR5cGVcIjpcInVpbnQ4XCJ9XSxcInR5cGVcIjpcImNvbnN0cnVjdG9yXCJ9LHtcImFub255bW91c1wiOmZhbHNlLFwiaW5wdXRzXCI6W3tcImluZGV4ZWRcIjpmYWxzZSxcIm5hbWVcIjpcIndpbm5lclwiLFwidHlwZVwiOlwiYWRkcmVzc1wifSx7XCJpbmRleGVkXCI6ZmFsc2UsXCJuYW1lXCI6XCJ0aW1lc3RhbXBcIixcInR5cGVcIjpcInVpbnQyNTZcIn0se1wiaW5kZXhlZFwiOmZhbHNlLFwibmFtZVwiOlwiY29udHJpYnV0aW9uXCIsXCJ0eXBlXCI6XCJ1aW50MjU2XCJ9XSxcIm5hbWVcIjpcIldvblwiLFwidHlwZVwiOlwiZXZlbnRcIn0se1wiYW5vbnltb3VzXCI6ZmFsc2UsXCJpbnB1dHNcIjpbe1wiaW5kZXhlZFwiOmZhbHNlLFwibmFtZVwiOlwiY29udHJpYnV0b3JcIixcInR5cGVcIjpcImFkZHJlc3NcIn1dLFwibmFtZVwiOlwiQ2hhbmdlZENvbnRyaWJ1dGlvblwiLFwidHlwZVwiOlwiZXZlbnRcIn1dO1xuXG4gICAgdmFyIFdoZWVsID0gZnVuY3Rpb24oY29udGFjdEFkZHJlc3MsIGNvbnRyaWJ1dGlvbkNoYW5nZWRDYWxsYmFjaywgcm91bmRFbmRlZENhbGxiYWNrKSB7XG4gICAgICB0aGlzLmFkZHJlc3MgPSBjb250YWN0QWRkcmVzcztcbiAgICAgIHRoaXMuY29udHJpYnV0aW9uQ2hhbmdlZENhbGxiYWNrID0gY29udHJpYnV0aW9uQ2hhbmdlZENhbGxiYWNrO1xuICAgICAgdGhpcy5yb3VuZEVuZGVkQ2FsbGJhY2sgPSByb3VuZEVuZGVkQ2FsbGJhY2s7XG5cbiAgICAgIHZhciBjb250cmFjdEJsdWVwcmludCA9IGV0aGVyZXVtLndlYjMuZXRoLmNvbnRyYWN0KGFiaSk7XG4gICAgICB0aGlzLmNvbnRyYWN0ID0gY29udHJhY3RCbHVlcHJpbnQuYXQoY29udGFjdEFkZHJlc3MpO1xuXG4gICAgICB0aGlzLmdvYWwgPSBldGhlcmV1bS53ZWIzLmZyb21XZWkodGhpcy5jb250cmFjdC5nb2FsKCksICdldGhlcicpLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLmluY3JlbWVudCA9IGV0aGVyZXVtLndlYjMuZnJvbVdlaSh0aGlzLmNvbnRyYWN0LmluY3JlbWVudCgpLCAnZXRoZXInKS50b1N0cmluZygpO1xuXG4gICAgICB0aGlzLmNvbnRyaWJ1dG9yc0RhdGEgPSB7fTtcbiAgICAgIHRoaXMuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IDA7XG5cbiAgICAgIHRoaXMuY29udHJhY3QuQ2hhbmdlZENvbnRyaWJ1dGlvbigpLndhdGNoKHRoaXMub25Db250cmlidXRpb25DaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5jb250cmFjdC5Xb24oKS53YXRjaCh0aGlzLm9uV29uLmJpbmQodGhpcykpO1xuXG4gICAgICB0aGlzLmluaXRpYWxpemVDb250cmlidXRvcnNEYXRhKCk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRyYWN0RGF0YSgpO1xuICAgICAgdGhpcy5yZWZyZXNoUmVjZW50V2luc0xpc3QoKTtcbiAgICB9XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBXaGVlbC5wcm90b3R5cGUudXBkYXRlQ29udHJhY3REYXRhID0gZnVuY3Rpb24oKXtcbiAgICAgIC8vIENvbnRyYWN0IGJhbGFuY2VcbiAgICAgIHZhciB3ZWkgPSBldGhlcmV1bS53ZWIzLmV0aC5nZXRCYWxhbmNlKHRoaXMuYWRkcmVzcyk7XG4gICAgICB2YXIgZXRoZXIgPSBldGhlcmV1bS53ZWIzLmZyb21XZWkod2VpLCAnZXRoZXInKTtcbiAgICAgIHRoaXMuYmFsYW5jZSA9IHBhcnNlRmxvYXQoZXRoZXIudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgV2hlZWwucHJvdG90eXBlLmluaXRpYWxpemVDb250cmlidXRvcnNEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZighZXRoZXJldW0uaXNDb25uZWN0ZWQoKSkgeyByZXR1cm47IH1cblxuICAgICAgdGhpcy5jb250cmlidXRvcnNEYXRhID0ge307XG4gICAgICB2YXIgbnVtQ29udHJpYnV0b3JzID0gdGhpcy5jb250cmFjdC5udW1Db250cmlidXRvcnMoKS50b1N0cmluZygpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG51bUNvbnRyaWJ1dG9yczsgKytpKSB7XG4gICAgICAgIHZhciBjb250cmlidXRvckFkZHJlc3MgPSB0aGlzLmNvbnRyYWN0LmNvbnRyaWJ1dG9ycyhpKS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLmFkZENvbnRyaWJ1dG9yKGNvbnRyaWJ1dG9yQWRkcmVzcywgaSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIFdoZWVsLnByb3RvdHlwZS5hZGRDb250cmlidXRvciA9IGZ1bmN0aW9uKGFkZHJlc3MsIGluZGV4KSB7XG4gICAgICB0aGlzLmNvbnRyaWJ1dG9yc0RhdGFbYWRkcmVzc10gPSB7XG4gICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICAgIGNvbnRyaWJ1dGlvbjogcGFyc2VGbG9hdChldGhlcmV1bS53ZWIzLmZyb21XZWkodGhpcy5jb250cmFjdC5jb250cmlidXRpb25zKGFkZHJlc3MpLCAnZXRoZXInKS50b1N0cmluZygpKSxcbiAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICB9O1xuICAgIH1cblxuICAgIFdoZWVsLnByb3RvdHlwZS5yZWZyZXNoUmVjZW50V2luc0xpc3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMucmVjZW50V2lucyA9IFtdO1xuICAgICAgdmFyIG51bVJlY2VudFdpbnMgPSB0aGlzLmNvbnRyYWN0Lm51bVdpbm5lcnMoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBudW1SZWNlbnRXaW5zOyArK2kpIHtcbiAgICAgICAgdGhpcy5yZWNlbnRXaW5zLnB1c2godGhpcy5jb250cmFjdC5yZWNlbnRXaW5zKGkpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLmdldENvbnRyaWJ1dGlvbiA9IGZ1bmN0aW9uKGFjY291bnQpIHtcbiAgICAgIHZhciBjdXJyZW50Q29udHJpYnV0aW9uID0gMDtcbiAgICAgIGlmKGFjY291bnQgaW4gdGhpcy5jb250cmlidXRvcnNEYXRhKSB7XG4gICAgICAgIGN1cnJlbnRDb250cmlidXRpb24gPSB0aGlzLmNvbnRyaWJ1dG9yc0RhdGFbYWNjb3VudF0uY29udHJpYnV0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnRDb250cmlidXRpb247XG4gICAgfTtcblxuICAgIFdoZWVsLnByb3RvdHlwZS5nZXRBZGp1c3RlZEJhbGFuY2UgPSBmdW5jdGlvbihhY2NvdW50KSB7XG4gICAgICB2YXIgZGVsdGFDb250cmlidXRpb24gPSAodGhpcy5kZXNpcmVkQ29udHJpYnV0aW9uIC0gdGhpcy5nZXRDb250cmlidXRpb24oYWNjb3VudCkpO1xuICAgICAgcmV0dXJuIHRoaXMuYmFsYW5jZSArIGRlbHRhQ29udHJpYnV0aW9uO1xuICAgIH07XG5cbiAgICBXaGVlbC5wcm90b3R5cGUuc2V0Q29udHJpYnV0aW9uID0gZnVuY3Rpb24oYWNjb3VudCwgdmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgZGVsdGFDb250cmlidXRpb24gPSBldGhlcmV1bS53ZWIzLnRvV2VpKHZhbHVlLCAnZXRoZXInKSAtIGV0aGVyZXVtLndlYjMudG9XZWkodGhpcy5nZXRDb250cmlidXRpb24oYWNjb3VudCksICdldGhlcicpO1xuICAgICAgdmFyIGRlc2lyZWRDb250cmlidXRpb25JbldlaSA9IGV0aGVyZXVtLndlYjMudG9XZWkodmFsdWUsICdldGhlcicpO1xuICAgICAgdmFyIHZhbHVlVG9TZW5kID0gMDtcbiAgICAgIGlmKGRlbHRhQ29udHJpYnV0aW9uID4gMCkge1xuICAgICAgICB2YWx1ZVRvU2VuZCA9IGRlbHRhQ29udHJpYnV0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2FsbERhdGEgPSB0aGlzLmNvbnRyYWN0LnNldENvbnRyaWJ1dGlvbi5nZXREYXRhKGRlc2lyZWRDb250cmlidXRpb25JbldlaSk7XG4gICAgICB2YXIgdHJhbnNhY3Rpb24gPSB7IHZhbHVlOiB2YWx1ZVRvU2VuZCwgZnJvbTogYWNjb3VudCwgdG86IHRoaXMuYWRkcmVzcywgZGF0YTogY2FsbERhdGEgfTtcbiAgICAgIHRyYW5zYWN0aW9uLmdhcyA9IGV0aGVyZXVtLndlYjMuZXRoLmVzdGltYXRlR2FzKHRyYW5zYWN0aW9uKSArIDEwMDAwMDtcbiAgICAgIHRoaXMuY29udHJhY3Quc2V0Q29udHJpYnV0aW9uKGRlc2lyZWRDb250cmlidXRpb25JbldlaSwgdHJhbnNhY3Rpb24sIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLm9uQ29udHJpYnV0aW9uQ2hhbmdlZCA9IGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHtcbiAgICAgIGlmKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYWRkcmVzcyA9IHJlc3VsdC5hcmdzLmNvbnRyaWJ1dG9yO1xuICAgICAgdmFyIG5ld0NvbnRyaWJ1dGlvbiA9IHBhcnNlRmxvYXQoZXRoZXJldW0ud2ViMy5mcm9tV2VpKHRoaXMuY29udHJhY3QuY29udHJpYnV0aW9ucyhhZGRyZXNzKSwgJ2V0aGVyJykudG9TdHJpbmcoKSk7XG5cbiAgICAgIHZhciBpc05ld0NvbnRyaWJ1dG9yID0gIShhZGRyZXNzIGluIHRoaXMuY29udHJpYnV0b3JzRGF0YSk7XG4gICAgICBpZihpc05ld0NvbnRyaWJ1dG9yKSB7XG4gICAgICAgIHRoaXMuYWRkQ29udHJpYnV0b3IoYWRkcmVzcywgbmV3Q29udHJpYnV0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29udHJpYnV0b3JzRGF0YVthZGRyZXNzXS5jb250cmlidXRpb24gPSBuZXdDb250cmlidXRpb247XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlQ29udHJhY3REYXRhKCk7XG5cbiAgICAgIGlmKCEhdGhpcy5jb250cmlidXRpb25DaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5jb250cmlidXRpb25DaGFuZ2VkQ2FsbGJhY2sodGhpcywgYWRkcmVzcywgbmV3Q29udHJpYnV0aW9uLCBpc05ld0NvbnRyaWJ1dG9yKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgV2hlZWwucHJvdG90eXBlLm9uV29uID0gZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkge1xuICAgICAgaWYoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IDA7XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRyYWN0RGF0YSgpO1xuXG4gICAgICB0aGlzLnJlZnJlc2hSZWNlbnRXaW5zTGlzdCgpO1xuICAgICAgaWYoISF0aGlzLnJvdW5kRW5kZWRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLnJvdW5kRW5kZWRDYWxsYmFjayh0aGlzLCByZXN1bHQuYXJncy53aW5uZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICByZXR1cm4gV2hlZWw7XG4gIH1cbn0pKCk7XG5cbihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIFdoZWVsQ3RybC4kaW5qZWN0ID0gW1wiJHJvdXRlXCIsIFwiJHNjb3BlXCIsIFwiU3dlZXRBbGVydFwiLCBcImV0aGVyZXVtXCIsIFwiV2hlZWxcIl07XG4gIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcpLmNvbnRyb2xsZXIoJ1doZWVsQ3RybCcsIFdoZWVsQ3RybCk7XG5cbiAgLypAbmdJbmplY3QqL1xuICBmdW5jdGlvbiBXaGVlbEN0cmwoJHJvdXRlLCAkc2NvcGUsIFN3ZWV0QWxlcnQsIGV0aGVyZXVtLCBXaGVlbCkge1xuICAgIHZhciBlbXB0eUJhckNvbG9yID0gJyNkY2U2ZTknO1xuICAgIHZhciBlbXB0eUJhckxhYmVsID0gXCJFbXB0eVwiO1xuICAgIHZhciBjb250cmFjdEFkZHJlc3NlcyA9IFsnMHg1Mzg5MWVmMzc5M2Q4NTM0QWQ0MjMxMkJjQzc3ZEZBZDUxQmI1RjFDJywgJzB4MjdDMGFGYzk2MEZiZWFCMWM2QmJBNmJFMzgzN2Q0MEU5NDhCMjI1MCcsICcweDExMDdCRDIzMjY0MDQzNDAwOGI4Y2UxRkQwNTg4MzdFMTQxZjc1NEInXTtcbiAgICB2YXIgY2hhcnQgPSBudWxsO1xuXG4gICAgdmFyIHZtID0gdGhpcztcblxuICAgIHZtLndlYjMgPSBldGhlcmV1bS53ZWIzO1xuICAgIHZtLm1vbWVudCA9IG1vbWVudDtcbiAgICB2bS5zZWxlY3RXaGVlbCA9IHNlbGVjdFdoZWVsO1xuICAgIHZtLmdldEFjY291bnRCYWxhbmNlID0gZ2V0QWNjb3VudEJhbGFuY2U7XG4gICAgdm0ub25BY2NvdW50Q2hhbmdlZCA9IG9uQWNjb3VudENoYW5nZWQ7XG4gICAgdm0uc2V0Q29udHJpYnV0aW9uID0gc2V0Q29udHJpYnV0aW9uO1xuICAgIHZtLm9uU2xpZGVyQ2hhbmdlZCA9IHVwZGF0ZUNoYXJ0Q29udHJpYnV0aW9uUHJldmlldztcblxuICAgIGFjdGl2YXRlKCk7XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBmdW5jdGlvbiBhY3RpdmF0ZSgpIHtcbiAgICAgIHZtLmlzQ29ubmVjdGVkID0gZXRoZXJldW0uaXNDb25uZWN0ZWQoKTsgLy8gTm90IHVzaW5nIDItd2F5IGJpbmRpbmcgYmVjYXVzZSBmb3Igc29tZSByZWFzb24gaXQgd2FzIERFU1RST1lJTkcgcGVyZm9ybWFuY2UuIEknZCBsaWtlIHRvIGxvb2sgaW50byB0aGlzIG1vcmUgbGF0ZXIuXG4gICAgICBpZighdm0uaXNDb25uZWN0ZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBjaGFydC5hZGREYXRhKHtcbiAgICAgICAgdmFsdWU6IDEuMCxcbiAgICAgICAgY29sb3I6IGVtcHR5QmFyQ29sb3IsXG4gICAgICAgIGxhYmVsOiBlbXB0eUJhckxhYmVsXG4gICAgICB9KTtcblxuICAgICAgdm0ud2hlZWxzID0gW107XG4gICAgICBjb250cmFjdEFkZHJlc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGFkZHJlc3MpIHtcbiAgICAgICAgdmFyIG5ld1doZWVsID0gbmV3IFdoZWVsKGFkZHJlc3MsIG9uQ29udHJpYnV0aW9uQ2hhbmdlZCwgb25Sb3VuZEVuZGVkKTtcbiAgICAgICAgdm0ud2hlZWxzLnB1c2gobmV3V2hlZWwpO1xuICAgICAgfSk7XG4gICAgICBzZWxlY3RXaGVlbCh2bS53aGVlbHNbMF0pO1xuXG4gICAgICB2bS5hY2NvdW50cyA9IGV0aGVyZXVtLndlYjMuZXRoLmFjY291bnRzO1xuICAgICAgdm0uc2VsZWN0ZWRBY2NvdW50ID0gZXRoZXJldW0ud2ViMy5ldGguZGVmYXVsdEFjY291bnQ7XG4gICAgICBpZighdm0uc2VsZWN0ZWRBY2NvdW50KSB7XG4gICAgICAgIHZtLnNlbGVjdGVkQWNjb3VudCA9IGV0aGVyZXVtLndlYjMuZXRoLmNvaW5iYXNlO1xuICAgICAgfVxuICAgICAgb25BY2NvdW50Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNoYXJ0KCkge1xuICAgICAgaWYoISFjaGFydCkgeyBjaGFydC5kZXN0cm95KCk7IH1cblxuICAgICAgdmFyIGNoYXJ0T3B0aW9ucyA9IHtcbiAgICAgICAgYW5pbWF0aW9uRWFzaW5nOiAnZWFzZUluT3V0JyxcbiAgICAgICAgc2VnbWVudFN0cm9rZVdpZHRoOiAzLFxuICAgICAgICBhbmltYXRpb25TdGVwczogMjAsXG4gICAgICAgIHNlZ21lbnRTdHJva2VDb2xvcjogJyNFQkYwRjEnLFxuICAgICAgICBwZXJjZW50YWdlSW5uZXJDdXRvdXQ6IDc1LFxuICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgICB0b29sdGlwVGVtcGxhdGU6IGdldFRvb2x0aXBUZW1wbGF0ZVxuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gZ2V0VG9vbHRpcFRlbXBsYXRlKHZhbHVlT2JqZWN0KSB7XG4gICAgICAgIHZhciBuYW1lID0gKHZhbHVlT2JqZWN0LmxhYmVsID09PSB2bS5zZWxlY3RlZEFjY291bnQpID8gJ1lvdScgOiB2YWx1ZU9iamVjdC5sYWJlbDtcbiAgICAgICAgdmFyIHRvb2x0aXAgPSBuYW1lICsgJzogJyArIHZhbHVlT2JqZWN0LnZhbHVlLnRvRml4ZWQoMikgKyAnIM6eJztcbiAgICAgICAgaWYoISF2bS5nb2FsKSB7XG4gICAgICAgICAgdmFyIHBlcmNlbnRhZ2UgPSAodmFsdWVPYmplY3QudmFsdWUgLyB2bS5nb2FsICogMTAwKTtcbiAgICAgICAgICB0b29sdGlwICs9ICcgKCcgKyBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UgKiAxMDApIC8gMTAwICsgJyUpJ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b29sdGlwO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3aGVlbFwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjaGFydCA9IG5ldyBDaGFydChjdHgpLkRvdWdobnV0KFtdLCBjaGFydE9wdGlvbnMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvcHVsYXRlQ2hhcnQod2hlZWwpIHtcbiAgICAgIHZhciBjb250cmlidXRvcnNEYXRhID0gd2hlZWwuY29udHJpYnV0b3JzRGF0YTtcbiAgICAgIGZvcih2YXIgYWRkcmVzcyBpbiBjb250cmlidXRvcnNEYXRhKVxuICAgICAge1xuICAgICAgICB2YXIgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNEYXRhW2FkZHJlc3NdO1xuICAgICAgICB2YXIgY2hhcnREYXRhID0ge1xuICAgICAgICAgIGxhYmVsOiBjb250cmlidXRvci5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiBjb250cmlidXRvci5jb250cmlidXRpb24sXG4gICAgICAgICAgY29sb3I6IGdldENoYXJ0Q29sb3JGb3JBY2NvdW50KGNvbnRyaWJ1dG9yLmFkZHJlc3MpXG4gICAgICAgIH07XG5cbiAgICAgICAgY2hhcnQuYWRkRGF0YShjaGFydERhdGEsIGNvbnRyaWJ1dG9yLmluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY2hhcnQuYWRkRGF0YSh7XG4gICAgICAgIGxhYmVsOiBlbXB0eUJhckxhYmVsLFxuICAgICAgICBjb2xvcjogZW1wdHlCYXJDb2xvcixcbiAgICAgICAgdmFsdWU6ICh2bS5zZWxlY3RlZFdoZWVsLmdvYWwgLSB2bS5zZWxlY3RlZFdoZWVsLmdldEFkanVzdGVkQmFsYW5jZSh2bS5zZWxlY3RlZEFjY291bnQpKVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXJ0LnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCkge1xuICAgICAgY2hhcnQuc2VnbWVudHNbY2hhcnQuc2VnbWVudHMubGVuZ3RoIC0gMV0udmFsdWUgPSAodm0uc2VsZWN0ZWRXaGVlbC5nb2FsIC0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRBZGp1c3RlZEJhbGFuY2Uodm0uc2VsZWN0ZWRBY2NvdW50KSk7XG4gICAgICBjaGFydC51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVDaGFydENvbnRyaWJ1dGlvblByZXZpZXcoKSB7XG4gICAgICB2YXIgY29udHJpYnV0b3JzRGF0YSA9IHZtLnNlbGVjdGVkV2hlZWwuY29udHJpYnV0b3JzRGF0YTtcbiAgICAgIGlmKHZtLnNlbGVjdGVkQWNjb3VudCBpbiBjb250cmlidXRvcnNEYXRhKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvbnRyaWJ1dG9yc0RhdGFbdm0uc2VsZWN0ZWRBY2NvdW50XS5pbmRleDtcbiAgICAgICAgY2hhcnQuc2VnbWVudHNbaW5kZXhdLnZhbHVlID0gdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW5kZXggPSBPYmplY3Qua2V5cyhjb250cmlidXRvcnNEYXRhKS5sZW5ndGg7XG4gICAgICAgIHZtLnNlbGVjdGVkV2hlZWwuYWRkQ29udHJpYnV0b3Iodm0uc2VsZWN0ZWRBY2NvdW50LCBpbmRleCk7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgIGxhYmVsOiB2bS5zZWxlY3RlZEFjY291bnQsXG4gICAgICAgICAgdmFsdWU6IHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbixcbiAgICAgICAgICBjb2xvcjogZ2V0Q2hhcnRDb2xvckZvckFjY291bnQodm0uc2VsZWN0ZWRBY2NvdW50KVxuICAgICAgICB9O1xuICAgICAgICBjaGFydC5hZGREYXRhKGRhdGEsIGluZGV4IC0gMik7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhcnRDb2xvckZvckFjY291bnQoYWNjb3VudCkge1xuICAgICAgcmV0dXJuIChhY2NvdW50ID09PSB2bS5zZWxlY3RlZEFjY291bnQpID8gJyM1Y2I4NWMnIDogJyMzRDNFM0YnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNlbGVjdFdoZWVsKHdoZWVsKSB7XG4gICAgICBpZih2bS5zZWxlY3RlZFdoZWVsID09PSB3aGVlbCkgeyByZXR1cm47IH1cblxuICAgICAgdm0uc2VsZWN0ZWRXaGVlbCA9IHdoZWVsO1xuICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uID0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50KTtcbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBwb3B1bGF0ZUNoYXJ0KHZtLnNlbGVjdGVkV2hlZWwpO1xuICAgICAgdXBkYXRlQ2hhcnRDb250cmlidXRpb25QcmV2aWV3KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0Q29udHJpYnV0aW9uKCkge1xuICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5zZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50LCB2bS5zZWxlY3RlZFdoZWVsLmRlc2lyZWRDb250cmlidXRpb24sIG9uQ29udHJpYnV0aW9uU2V0KTtcblxuICAgICAgZnVuY3Rpb24gb25Db250cmlidXRpb25TZXQoZXJyb3IsIHJlc3VsdCkge1xuICAgICAgICBpZihlcnJvcikge1xuICAgICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gXCI8YnI+PGJyPk1ha2Ugc3VyZSB5b3UndmUgdW5sb2NrZWQgeW91ciBhY2NvdW50IHRvIG1ha2UgdHJhbnNhY3Rpb25zIChlLmcuIHVzaW5nIHRoZSAtLXVubG9jayBjb21tYW5kIHdpdGggZ2V0aCkuIElmIHlvdSdyZSBoYXZpbmcgdHJvdWJsZSwgeW91IGNhbiBhbHNvIHNldCB5b3VyIGNvbnRyaWJ1dGlvbiBieSBzZW5kaW5nIGV0aGVyIGRpcmVjdGx5IHRvIHRoZSB3aGVlbCBhdDo8YnI+PGNvZGU+XCIgKyB2bS5zZWxlY3RlZFdoZWVsLmFkZHJlc3MgKyBcIjwvY29kZT48YnI+KDxpIGNsYXNzPVxcXCJmYSBmYS1sb2NrXFxcIiBzdHlsZT1cXFwiZm9udC1zaXplOiAwLjhlbTsgbWFyZ2luLXJpZ2h0OiAycHg7XFxcIj48L2k+IDxhIGhyZWY9XFxcImh0dHBzOi8vbGl2ZS5ldGhlci5jYW1wL2FjY291bnQvXCIgKyB2bS5zZWxlY3RlZFdoZWVsLmFkZHJlc3Muc3Vic3RyaW5nKDIpICsgXCIvY29udHJhY3RcXFwiPnZpZXcgdmVyaWZpZWQgc291cmNlIGNvZGU8L2E+KVwiO1xuXG4gICAgICAgICAgU3dlZXRBbGVydC5zd2FsKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIkVycm9yIFNldHRpbmcgQ29udHJpYnV0aW9uXCIsXG4gICAgICAgICAgICB0ZXh0OiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICBodG1sOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgU3dlZXRBbGVydC5zd2FsKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIlN1Y2Nlc3MhXCIsXG4gICAgICAgICAgICB0ZXh0OiBcIllvdXIgcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgRXRoZXJldW0gbmV0d29yayBmb3IgcHJvY2Vzc2luZy4gWW91J2xsIHNlZSB5b3VyIGFjY291bnQgYmFsYW5jZSB1cGRhdGVkIHNvb24uPGJyPjxicj48c3Ryb25nPlRoaXMgbWF5IHRha2UgYSBtaW51dGUgb3IgdHdvPC9zdHJvbmc+LlwiLFxuICAgICAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICBodG1sOiB0cnVlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHZtLnNlbGVjdGVkV2hlZWwuZ2V0Q29udHJpYnV0aW9uKHZtLnNlbGVjdGVkQWNjb3VudCk7XG4gICAgICAgICAgY2hhcnQuc2VnbWVudHNbdm0uc2VsZWN0ZWRXaGVlbC5jb250cmlidXRvcnNEYXRhW3ZtLnNlbGVjdGVkQWNjb3VudF0uaW5kZXhdLnZhbHVlID0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50KTtcbiAgICAgICAgICB1cGRhdGVDaGFydEVtcHR5U2xvdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudCkge1xuICAgICAgcmV0dXJuIGV0aGVyZXVtLndlYjMuZnJvbVdlaShldGhlcmV1bS53ZWIzLmV0aC5nZXRCYWxhbmNlKGFjY291bnQpLCAnZXRoZXInKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkFjY291bnRDaGFuZ2VkKCkge1xuICAgICAgdm0ud2hlZWxzLmZvckVhY2goZnVuY3Rpb24od2hlZWwpIHtcbiAgICAgICAgd2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHdoZWVsLmdldENvbnRyaWJ1dGlvbih2bS5zZWxlY3RlZEFjY291bnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBwb3B1bGF0ZUNoYXJ0KHZtLnNlbGVjdGVkV2hlZWwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ29udHJpYnV0aW9uQ2hhbmdlZCh3aGVlbCwgY29udHJpYnV0b3JBY2NvdW50LCBuZXdDb250cmlidXRpb24sIGlzTmV3Q29udHJpYnV0b3IpIHtcbiAgICAgIGlmKGNvbnRyaWJ1dG9yQWNjb3VudCA9PSB2bS5zZWxlY3RlZEFjY291bnQpIHtcbiAgICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uID0gbmV3Q29udHJpYnV0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZih3aGVlbCA9PSB2bS5zZWxlY3RlZFdoZWVsKSB7XG4gICAgICAgIHZhciBjb250cmlidXRvcnNEYXRhID0gdm0uc2VsZWN0ZWRXaGVlbC5jb250cmlidXRvcnNEYXRhO1xuICAgICAgICB2YXIgaW5kZXggPSBjb250cmlidXRvcnNEYXRhW2NvbnRyaWJ1dG9yQWNjb3VudF0uaW5kZXg7XG5cbiAgICAgICAgaWYoaXNOZXdDb250cmlidXRvcikge1xuICAgICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgbGFiZWw6IGNvbnRyaWJ1dG9yQWNjb3VudCxcbiAgICAgICAgICAgIHZhbHVlOiBuZXdDb250cmlidXRpb24sXG4gICAgICAgICAgICBjb2xvcjogZ2V0Q2hhcnRDb2xvckZvckFjY291bnQoY29udHJpYnV0b3JBY2NvdW50KVxuICAgICAgICAgIH07XG4gICAgICAgICAgY2hhcnQuYWRkRGF0YShkYXRhLCBpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhcnQuc2VnbWVudHNbY29udHJpYnV0b3JzRGF0YVtjb250cmlidXRvckFjY291bnRdLmluZGV4XS52YWx1ZSA9IG5ld0NvbnRyaWJ1dGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCk7XG4gICAgICB9XG5cbiAgICAgICRzY29wZS4kYXBwbHkoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblJvdW5kRW5kZWQod2hlZWwsIHdpbm5lckFkZHJlc3MpIHtcbiAgICAgIHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHZtLnNlbGVjdGVkV2hlZWwuZ2V0Q29udHJpYnV0aW9uKHZtLnNlbGVjdGVkQWNjb3VudCk7XG4gICAgICAkc2NvcGUuJGFwcGx5KCk7XG4gICAgfVxuICB9XG59KSgpO1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ2V0aGVyLXdoZWVsJykuc2VydmljZSgnZXRoZXJldW0nLCBldGhlcmV1bSk7XG5cbiAgICAvKiBAbmdJbmplY3QgKi9cbiAgICBmdW5jdGlvbiBldGhlcmV1bSgpIHtcbiAgICAgIHZhciBzZXJ2aWNlID0ge1xuICAgICAgICB3ZWIzOiBuZXcgV2ViMygpLFxuICAgICAgICBpc0Nvbm5lY3RlZDogaXNDb25uZWN0ZWRcbiAgICAgIH07XG5cbiAgICAgIGFjdGl2YXRlKCk7XG5cbiAgICAgIHJldHVybiBzZXJ2aWNlO1xuXG4gICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgIGZ1bmN0aW9uIGFjdGl2YXRlKCkge1xuICAgICAgICBzZXJ2aWNlLndlYjMuc2V0UHJvdmlkZXIobmV3IHNlcnZpY2Uud2ViMy5wcm92aWRlcnMuSHR0cFByb3ZpZGVyKFwiaHR0cDovL2xvY2FsaG9zdDo4NTQ1XCIpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlLndlYjMuY3VycmVudFByb3ZpZGVyLmlzQ29ubmVjdGVkKCk7XG4gICAgICB9XG4gICAgfVxufSkoKTtcbiIsIihmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcpLmNvbnRyb2xsZXIoJ1doZWVsQ3RybCcsIFdoZWVsQ3RybCk7XG5cbiAgLypAbmdJbmplY3QqL1xuICBmdW5jdGlvbiBXaGVlbEN0cmwoJHJvdXRlLCAkc2NvcGUsIFN3ZWV0QWxlcnQsIGV0aGVyZXVtLCBXaGVlbCkge1xuICAgIHZhciBlbXB0eUJhckNvbG9yID0gJyNkY2U2ZTknO1xuICAgIHZhciBlbXB0eUJhckxhYmVsID0gXCJFbXB0eVwiO1xuICAgIHZhciBjb250cmFjdEFkZHJlc3NlcyA9IFsnMHg1Mzg5MWVmMzc5M2Q4NTM0QWQ0MjMxMkJjQzc3ZEZBZDUxQmI1RjFDJywgJzB4MjdDMGFGYzk2MEZiZWFCMWM2QmJBNmJFMzgzN2Q0MEU5NDhCMjI1MCcsICcweDExMDdCRDIzMjY0MDQzNDAwOGI4Y2UxRkQwNTg4MzdFMTQxZjc1NEInXTtcbiAgICB2YXIgY2hhcnQgPSBudWxsO1xuXG4gICAgdmFyIHZtID0gdGhpcztcblxuICAgIHZtLndlYjMgPSBldGhlcmV1bS53ZWIzO1xuICAgIHZtLm1vbWVudCA9IG1vbWVudDtcbiAgICB2bS5zZWxlY3RXaGVlbCA9IHNlbGVjdFdoZWVsO1xuICAgIHZtLmdldEFjY291bnRCYWxhbmNlID0gZ2V0QWNjb3VudEJhbGFuY2U7XG4gICAgdm0ub25BY2NvdW50Q2hhbmdlZCA9IG9uQWNjb3VudENoYW5nZWQ7XG4gICAgdm0uc2V0Q29udHJpYnV0aW9uID0gc2V0Q29udHJpYnV0aW9uO1xuICAgIHZtLm9uU2xpZGVyQ2hhbmdlZCA9IHVwZGF0ZUNoYXJ0Q29udHJpYnV0aW9uUHJldmlldztcblxuICAgIGFjdGl2YXRlKCk7XG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBmdW5jdGlvbiBhY3RpdmF0ZSgpIHtcbiAgICAgIHZtLmlzQ29ubmVjdGVkID0gZXRoZXJldW0uaXNDb25uZWN0ZWQoKTsgLy8gTm90IHVzaW5nIDItd2F5IGJpbmRpbmcgYmVjYXVzZSBmb3Igc29tZSByZWFzb24gaXQgd2FzIERFU1RST1lJTkcgcGVyZm9ybWFuY2UuIEknZCBsaWtlIHRvIGxvb2sgaW50byB0aGlzIG1vcmUgbGF0ZXIuXG4gICAgICBpZighdm0uaXNDb25uZWN0ZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBjaGFydC5hZGREYXRhKHtcbiAgICAgICAgdmFsdWU6IDEuMCxcbiAgICAgICAgY29sb3I6IGVtcHR5QmFyQ29sb3IsXG4gICAgICAgIGxhYmVsOiBlbXB0eUJhckxhYmVsXG4gICAgICB9KTtcblxuICAgICAgdm0ud2hlZWxzID0gW107XG4gICAgICBjb250cmFjdEFkZHJlc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGFkZHJlc3MpIHtcbiAgICAgICAgdmFyIG5ld1doZWVsID0gbmV3IFdoZWVsKGFkZHJlc3MsIG9uQ29udHJpYnV0aW9uQ2hhbmdlZCwgb25Sb3VuZEVuZGVkKTtcbiAgICAgICAgdm0ud2hlZWxzLnB1c2gobmV3V2hlZWwpO1xuICAgICAgfSk7XG4gICAgICBzZWxlY3RXaGVlbCh2bS53aGVlbHNbMF0pO1xuXG4gICAgICB2bS5hY2NvdW50cyA9IGV0aGVyZXVtLndlYjMuZXRoLmFjY291bnRzO1xuICAgICAgdm0uc2VsZWN0ZWRBY2NvdW50ID0gZXRoZXJldW0ud2ViMy5ldGguZGVmYXVsdEFjY291bnQ7XG4gICAgICBpZighdm0uc2VsZWN0ZWRBY2NvdW50KSB7XG4gICAgICAgIHZtLnNlbGVjdGVkQWNjb3VudCA9IGV0aGVyZXVtLndlYjMuZXRoLmNvaW5iYXNlO1xuICAgICAgfVxuICAgICAgb25BY2NvdW50Q2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNoYXJ0KCkge1xuICAgICAgaWYoISFjaGFydCkgeyBjaGFydC5kZXN0cm95KCk7IH1cblxuICAgICAgdmFyIGNoYXJ0T3B0aW9ucyA9IHtcbiAgICAgICAgYW5pbWF0aW9uRWFzaW5nOiAnZWFzZUluT3V0JyxcbiAgICAgICAgc2VnbWVudFN0cm9rZVdpZHRoOiAzLFxuICAgICAgICBhbmltYXRpb25TdGVwczogMjAsXG4gICAgICAgIHNlZ21lbnRTdHJva2VDb2xvcjogJyNFQkYwRjEnLFxuICAgICAgICBwZXJjZW50YWdlSW5uZXJDdXRvdXQ6IDc1LFxuICAgICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgICB0b29sdGlwVGVtcGxhdGU6IGdldFRvb2x0aXBUZW1wbGF0ZVxuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gZ2V0VG9vbHRpcFRlbXBsYXRlKHZhbHVlT2JqZWN0KSB7XG4gICAgICAgIHZhciBuYW1lID0gKHZhbHVlT2JqZWN0LmxhYmVsID09PSB2bS5zZWxlY3RlZEFjY291bnQpID8gJ1lvdScgOiB2YWx1ZU9iamVjdC5sYWJlbDtcbiAgICAgICAgdmFyIHRvb2x0aXAgPSBuYW1lICsgJzogJyArIHZhbHVlT2JqZWN0LnZhbHVlLnRvRml4ZWQoMikgKyAnIM6eJztcbiAgICAgICAgaWYoISF2bS5nb2FsKSB7XG4gICAgICAgICAgdmFyIHBlcmNlbnRhZ2UgPSAodmFsdWVPYmplY3QudmFsdWUgLyB2bS5nb2FsICogMTAwKTtcbiAgICAgICAgICB0b29sdGlwICs9ICcgKCcgKyBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UgKiAxMDApIC8gMTAwICsgJyUpJ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b29sdGlwO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3R4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3aGVlbFwiKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjaGFydCA9IG5ldyBDaGFydChjdHgpLkRvdWdobnV0KFtdLCBjaGFydE9wdGlvbnMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvcHVsYXRlQ2hhcnQod2hlZWwpIHtcbiAgICAgIHZhciBjb250cmlidXRvcnNEYXRhID0gd2hlZWwuY29udHJpYnV0b3JzRGF0YTtcbiAgICAgIGZvcih2YXIgYWRkcmVzcyBpbiBjb250cmlidXRvcnNEYXRhKVxuICAgICAge1xuICAgICAgICB2YXIgY29udHJpYnV0b3IgPSBjb250cmlidXRvcnNEYXRhW2FkZHJlc3NdO1xuICAgICAgICB2YXIgY2hhcnREYXRhID0ge1xuICAgICAgICAgIGxhYmVsOiBjb250cmlidXRvci5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiBjb250cmlidXRvci5jb250cmlidXRpb24sXG4gICAgICAgICAgY29sb3I6IGdldENoYXJ0Q29sb3JGb3JBY2NvdW50KGNvbnRyaWJ1dG9yLmFkZHJlc3MpXG4gICAgICAgIH07XG5cbiAgICAgICAgY2hhcnQuYWRkRGF0YShjaGFydERhdGEsIGNvbnRyaWJ1dG9yLmluZGV4KTtcbiAgICAgIH1cblxuICAgICAgY2hhcnQuYWRkRGF0YSh7XG4gICAgICAgIGxhYmVsOiBlbXB0eUJhckxhYmVsLFxuICAgICAgICBjb2xvcjogZW1wdHlCYXJDb2xvcixcbiAgICAgICAgdmFsdWU6ICh2bS5zZWxlY3RlZFdoZWVsLmdvYWwgLSB2bS5zZWxlY3RlZFdoZWVsLmdldEFkanVzdGVkQmFsYW5jZSh2bS5zZWxlY3RlZEFjY291bnQpKVxuICAgICAgfSk7XG5cbiAgICAgIGNoYXJ0LnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCkge1xuICAgICAgY2hhcnQuc2VnbWVudHNbY2hhcnQuc2VnbWVudHMubGVuZ3RoIC0gMV0udmFsdWUgPSAodm0uc2VsZWN0ZWRXaGVlbC5nb2FsIC0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRBZGp1c3RlZEJhbGFuY2Uodm0uc2VsZWN0ZWRBY2NvdW50KSk7XG4gICAgICBjaGFydC51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVDaGFydENvbnRyaWJ1dGlvblByZXZpZXcoKSB7XG4gICAgICB2YXIgY29udHJpYnV0b3JzRGF0YSA9IHZtLnNlbGVjdGVkV2hlZWwuY29udHJpYnV0b3JzRGF0YTtcbiAgICAgIGlmKHZtLnNlbGVjdGVkQWNjb3VudCBpbiBjb250cmlidXRvcnNEYXRhKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvbnRyaWJ1dG9yc0RhdGFbdm0uc2VsZWN0ZWRBY2NvdW50XS5pbmRleDtcbiAgICAgICAgY2hhcnQuc2VnbWVudHNbaW5kZXhdLnZhbHVlID0gdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaW5kZXggPSBPYmplY3Qua2V5cyhjb250cmlidXRvcnNEYXRhKS5sZW5ndGg7XG4gICAgICAgIHZtLnNlbGVjdGVkV2hlZWwuYWRkQ29udHJpYnV0b3Iodm0uc2VsZWN0ZWRBY2NvdW50LCBpbmRleCk7XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgIGxhYmVsOiB2bS5zZWxlY3RlZEFjY291bnQsXG4gICAgICAgICAgdmFsdWU6IHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbixcbiAgICAgICAgICBjb2xvcjogZ2V0Q2hhcnRDb2xvckZvckFjY291bnQodm0uc2VsZWN0ZWRBY2NvdW50KVxuICAgICAgICB9O1xuICAgICAgICBjaGFydC5hZGREYXRhKGRhdGEsIGluZGV4IC0gMik7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhcnRDb2xvckZvckFjY291bnQoYWNjb3VudCkge1xuICAgICAgcmV0dXJuIChhY2NvdW50ID09PSB2bS5zZWxlY3RlZEFjY291bnQpID8gJyM1Y2I4NWMnIDogJyMzRDNFM0YnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNlbGVjdFdoZWVsKHdoZWVsKSB7XG4gICAgICBpZih2bS5zZWxlY3RlZFdoZWVsID09PSB3aGVlbCkgeyByZXR1cm47IH1cblxuICAgICAgdm0uc2VsZWN0ZWRXaGVlbCA9IHdoZWVsO1xuICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uID0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50KTtcbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBwb3B1bGF0ZUNoYXJ0KHZtLnNlbGVjdGVkV2hlZWwpO1xuICAgICAgdXBkYXRlQ2hhcnRDb250cmlidXRpb25QcmV2aWV3KCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0Q29udHJpYnV0aW9uKCkge1xuICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5zZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50LCB2bS5zZWxlY3RlZFdoZWVsLmRlc2lyZWRDb250cmlidXRpb24sIG9uQ29udHJpYnV0aW9uU2V0KTtcblxuICAgICAgZnVuY3Rpb24gb25Db250cmlidXRpb25TZXQoZXJyb3IsIHJlc3VsdCkge1xuICAgICAgICBpZihlcnJvcikge1xuICAgICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gXCI8YnI+PGJyPk1ha2Ugc3VyZSB5b3UndmUgdW5sb2NrZWQgeW91ciBhY2NvdW50IHRvIG1ha2UgdHJhbnNhY3Rpb25zIChlLmcuIHVzaW5nIHRoZSAtLXVubG9jayBjb21tYW5kIHdpdGggZ2V0aCkuIElmIHlvdSdyZSBoYXZpbmcgdHJvdWJsZSwgeW91IGNhbiBhbHNvIHNldCB5b3VyIGNvbnRyaWJ1dGlvbiBieSBzZW5kaW5nIGV0aGVyIGRpcmVjdGx5IHRvIHRoZSB3aGVlbCBhdDo8YnI+PGNvZGU+XCIgKyB2bS5zZWxlY3RlZFdoZWVsLmFkZHJlc3MgKyBcIjwvY29kZT48YnI+KDxpIGNsYXNzPVxcXCJmYSBmYS1sb2NrXFxcIiBzdHlsZT1cXFwiZm9udC1zaXplOiAwLjhlbTsgbWFyZ2luLXJpZ2h0OiAycHg7XFxcIj48L2k+IDxhIGhyZWY9XFxcImh0dHBzOi8vbGl2ZS5ldGhlci5jYW1wL2FjY291bnQvXCIgKyB2bS5zZWxlY3RlZFdoZWVsLmFkZHJlc3Muc3Vic3RyaW5nKDIpICsgXCIvY29udHJhY3RcXFwiPnZpZXcgdmVyaWZpZWQgc291cmNlIGNvZGU8L2E+KVwiO1xuXG4gICAgICAgICAgU3dlZXRBbGVydC5zd2FsKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIkVycm9yIFNldHRpbmcgQ29udHJpYnV0aW9uXCIsXG4gICAgICAgICAgICB0ZXh0OiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgICBodG1sOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgU3dlZXRBbGVydC5zd2FsKHtcbiAgICAgICAgICAgIHRpdGxlOiBcIlN1Y2Nlc3MhXCIsXG4gICAgICAgICAgICB0ZXh0OiBcIllvdXIgcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgRXRoZXJldW0gbmV0d29yayBmb3IgcHJvY2Vzc2luZy4gWW91J2xsIHNlZSB5b3VyIGFjY291bnQgYmFsYW5jZSB1cGRhdGVkIHNvb24uPGJyPjxicj48c3Ryb25nPlRoaXMgbWF5IHRha2UgYSBtaW51dGUgb3IgdHdvPC9zdHJvbmc+LlwiLFxuICAgICAgICAgICAgdHlwZTogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICBodG1sOiB0cnVlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHZtLnNlbGVjdGVkV2hlZWwuZ2V0Q29udHJpYnV0aW9uKHZtLnNlbGVjdGVkQWNjb3VudCk7XG4gICAgICAgICAgY2hhcnQuc2VnbWVudHNbdm0uc2VsZWN0ZWRXaGVlbC5jb250cmlidXRvcnNEYXRhW3ZtLnNlbGVjdGVkQWNjb3VudF0uaW5kZXhdLnZhbHVlID0gdm0uc2VsZWN0ZWRXaGVlbC5nZXRDb250cmlidXRpb24odm0uc2VsZWN0ZWRBY2NvdW50KTtcbiAgICAgICAgICB1cGRhdGVDaGFydEVtcHR5U2xvdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudCkge1xuICAgICAgcmV0dXJuIGV0aGVyZXVtLndlYjMuZnJvbVdlaShldGhlcmV1bS53ZWIzLmV0aC5nZXRCYWxhbmNlKGFjY291bnQpLCAnZXRoZXInKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkFjY291bnRDaGFuZ2VkKCkge1xuICAgICAgdm0ud2hlZWxzLmZvckVhY2goZnVuY3Rpb24od2hlZWwpIHtcbiAgICAgICAgd2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHdoZWVsLmdldENvbnRyaWJ1dGlvbih2bS5zZWxlY3RlZEFjY291bnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGNyZWF0ZUNoYXJ0KCk7XG4gICAgICBwb3B1bGF0ZUNoYXJ0KHZtLnNlbGVjdGVkV2hlZWwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ29udHJpYnV0aW9uQ2hhbmdlZCh3aGVlbCwgY29udHJpYnV0b3JBY2NvdW50LCBuZXdDb250cmlidXRpb24sIGlzTmV3Q29udHJpYnV0b3IpIHtcbiAgICAgIGlmKGNvbnRyaWJ1dG9yQWNjb3VudCA9PSB2bS5zZWxlY3RlZEFjY291bnQpIHtcbiAgICAgICAgdm0uc2VsZWN0ZWRXaGVlbC5kZXNpcmVkQ29udHJpYnV0aW9uID0gbmV3Q29udHJpYnV0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZih3aGVlbCA9PSB2bS5zZWxlY3RlZFdoZWVsKSB7XG4gICAgICAgIHZhciBjb250cmlidXRvcnNEYXRhID0gdm0uc2VsZWN0ZWRXaGVlbC5jb250cmlidXRvcnNEYXRhO1xuICAgICAgICB2YXIgaW5kZXggPSBjb250cmlidXRvcnNEYXRhW2NvbnRyaWJ1dG9yQWNjb3VudF0uaW5kZXg7XG5cbiAgICAgICAgaWYoaXNOZXdDb250cmlidXRvcikge1xuICAgICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgbGFiZWw6IGNvbnRyaWJ1dG9yQWNjb3VudCxcbiAgICAgICAgICAgIHZhbHVlOiBuZXdDb250cmlidXRpb24sXG4gICAgICAgICAgICBjb2xvcjogZ2V0Q2hhcnRDb2xvckZvckFjY291bnQoY29udHJpYnV0b3JBY2NvdW50KVxuICAgICAgICAgIH07XG4gICAgICAgICAgY2hhcnQuYWRkRGF0YShkYXRhLCBpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhcnQuc2VnbWVudHNbY29udHJpYnV0b3JzRGF0YVtjb250cmlidXRvckFjY291bnRdLmluZGV4XS52YWx1ZSA9IG5ld0NvbnRyaWJ1dGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUNoYXJ0RW1wdHlTbG90KCk7XG4gICAgICB9XG5cbiAgICAgICRzY29wZS4kYXBwbHkoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblJvdW5kRW5kZWQod2hlZWwsIHdpbm5lckFkZHJlc3MpIHtcbiAgICAgIHZtLnNlbGVjdGVkV2hlZWwuZGVzaXJlZENvbnRyaWJ1dGlvbiA9IHZtLnNlbGVjdGVkV2hlZWwuZ2V0Q29udHJpYnV0aW9uKHZtLnNlbGVjdGVkQWNjb3VudCk7XG4gICAgICAkc2NvcGUuJGFwcGx5KCk7XG4gICAgfVxuICB9XG59KSgpO1xuIiwiKGZ1bmN0aW9uKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGFuZ3VsYXIubW9kdWxlKCdldGhlci13aGVlbCcpLnNlcnZpY2UoJ2V0aGVyZXVtJywgZXRoZXJldW0pO1xuXG4gICAgLyogQG5nSW5qZWN0ICovXG4gICAgZnVuY3Rpb24gZXRoZXJldW0oKSB7XG4gICAgICB2YXIgc2VydmljZSA9IHtcbiAgICAgICAgd2ViMzogbmV3IFdlYjMoKSxcbiAgICAgICAgaXNDb25uZWN0ZWQ6IGlzQ29ubmVjdGVkXG4gICAgICB9O1xuXG4gICAgICBhY3RpdmF0ZSgpO1xuXG4gICAgICByZXR1cm4gc2VydmljZTtcblxuICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICBmdW5jdGlvbiBhY3RpdmF0ZSgpIHtcbiAgICAgICAgc2VydmljZS53ZWIzLnNldFByb3ZpZGVyKG5ldyBzZXJ2aWNlLndlYjMucHJvdmlkZXJzLkh0dHBQcm92aWRlcihcImh0dHA6Ly9sb2NhbGhvc3Q6ODU0NVwiKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gc2VydmljZS53ZWIzLmN1cnJlbnRQcm92aWRlci5pc0Nvbm5lY3RlZCgpO1xuICAgICAgfVxuICAgIH1cbn0pKCk7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=