@egoist/web-voice-processor
Version:
Real-time audio processing for voice, in web browsers
1 lines • 132 kB
JavaScript
function A(A,I,g,C,B,i,Q){try{var c=A[i](Q),o=c.value}catch(A){return void g(A)}c.done?I(o):Promise.resolve(o).then(C,B)}function I(A){var I={exports:{}};return A(I,I.exports),I.exports}"undefined"!=typeof window&&(window.AudioContext=window.AudioContext||window.webkitAudioContext,"function"==typeof AudioWorkletNode&&"audioWorklet"in AudioContext.prototype||AudioContext&&("audioWorklet"in AudioContext.prototype||(AudioContext.prototype.audioWorklet={addModule:async function(A,I){}}),window.AudioWorkletNode=window.AudioWorkletNode||function(A,I,g){const{numberOfChannels:C=1,frameLength:B=512}=g&&g.processorOptions,i=A.createScriptProcessor(B,C,C);return i.port||(i.port={}),i.onaudioprocess=A=>{if(i.port&&i.port.onmessage){const I=[];for(let g=0;g<A.inputBuffer.numberOfChannels;g++)I.push(A.inputBuffer.getChannelData(g));i.port.onmessage({data:{buffer:I}})}},i.port.close=()=>{},i}));var g=I((function(A){function I(g){return A.exports=I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},A.exports.__esModule=!0,A.exports.default=A.exports,I(g)}A.exports=I,A.exports.__esModule=!0,A.exports.default=A.exports})),C=I((function(A){var I=g.default;function C(){A.exports=C=function(){return g},A.exports.__esModule=!0,A.exports.default=A.exports;var g={},B=Object.prototype,i=B.hasOwnProperty,Q=Object.defineProperty||function(A,I,g){A[I]=g.value},c="function"==typeof Symbol?Symbol:{},o=c.iterator||"@@iterator",l=c.asyncIterator||"@@asyncIterator",d=c.toStringTag||"@@toStringTag";function Z(A,I,g){return Object.defineProperty(A,I,{value:g,enumerable:!0,configurable:!0,writable:!0}),A[I]}try{Z({},"")}catch(A){Z=function(A,I,g){return A[I]=g}}function G(A,I,g,C){var B=I&&I.prototype instanceof b?I:b,i=Object.create(B.prototype),c=new r(C||[]);return Q(i,"_invoke",{value:R(A,g,c)}),i}function e(A,I,g){try{return{type:"normal",arg:A.call(I,g)}}catch(A){return{type:"throw",arg:A}}}g.wrap=G;var t={};function b(){}function m(){}function s(){}var a={};Z(a,o,(function(){return this}));var n=Object.getPrototypeOf,E=n&&n(n(W([])));E&&E!==B&&i.call(E,o)&&(a=E);var y=s.prototype=b.prototype=Object.create(a);function h(A){["next","throw","return"].forEach((function(I){Z(A,I,(function(A){return this._invoke(I,A)}))}))}function V(A,g){function C(B,Q,c,o){var l=e(A[B],A,Q);if("throw"!==l.type){var d=l.arg,Z=d.value;return Z&&"object"==I(Z)&&i.call(Z,"__await")?g.resolve(Z.__await).then((function(A){C("next",A,c,o)}),(function(A){C("throw",A,c,o)})):g.resolve(Z).then((function(A){d.value=A,c(d)}),(function(A){return C("throw",A,c,o)}))}o(l.arg)}var B;Q(this,"_invoke",{value:function(A,I){function i(){return new g((function(g,B){C(A,I,g,B)}))}return B=B?B.then(i,i):i()}})}function R(A,I,g){var C="suspendedStart";return function(B,i){if("executing"===C)throw new Error("Generator is already running");if("completed"===C){if("throw"===B)throw i;return u()}for(g.method=B,g.arg=i;;){var Q=g.delegate;if(Q){var c=N(Q,g);if(c){if(c===t)continue;return c}}if("next"===g.method)g.sent=g._sent=g.arg;else if("throw"===g.method){if("suspendedStart"===C)throw C="completed",g.arg;g.dispatchException(g.arg)}else"return"===g.method&&g.abrupt("return",g.arg);C="executing";var o=e(A,I,g);if("normal"===o.type){if(C=g.done?"completed":"suspendedYield",o.arg===t)continue;return{value:o.arg,done:g.done}}"throw"===o.type&&(C="completed",g.method="throw",g.arg=o.arg)}}}function N(A,I){var g=I.method,C=A.iterator[g];if(void 0===C)return I.delegate=null,"throw"===g&&A.iterator.return&&(I.method="return",I.arg=void 0,N(A,I),"throw"===I.method)||"return"!==g&&(I.method="throw",I.arg=new TypeError("The iterator does not provide a '"+g+"' method")),t;var B=e(C,A.iterator,I.arg);if("throw"===B.type)return I.method="throw",I.arg=B.arg,I.delegate=null,t;var i=B.arg;return i?i.done?(I[A.resultName]=i.value,I.next=A.nextLoc,"return"!==I.method&&(I.method="next",I.arg=void 0),I.delegate=null,t):i:(I.method="throw",I.arg=new TypeError("iterator result is not an object"),I.delegate=null,t)}function w(A){var I={tryLoc:A[0]};1 in A&&(I.catchLoc=A[1]),2 in A&&(I.finallyLoc=A[2],I.afterLoc=A[3]),this.tryEntries.push(I)}function X(A){var I=A.completion||{};I.type="normal",delete I.arg,A.completion=I}function r(A){this.tryEntries=[{tryLoc:"root"}],A.forEach(w,this),this.reset(!0)}function W(A){if(A){var I=A[o];if(I)return I.call(A);if("function"==typeof A.next)return A;if(!isNaN(A.length)){var g=-1,C=function I(){for(;++g<A.length;)if(i.call(A,g))return I.value=A[g],I.done=!1,I;return I.value=void 0,I.done=!0,I};return C.next=C}}return{next:u}}function u(){return{value:void 0,done:!0}}return m.prototype=s,Q(y,"constructor",{value:s,configurable:!0}),Q(s,"constructor",{value:m,configurable:!0}),m.displayName=Z(s,d,"GeneratorFunction"),g.isGeneratorFunction=function(A){var I="function"==typeof A&&A.constructor;return!!I&&(I===m||"GeneratorFunction"===(I.displayName||I.name))},g.mark=function(A){return Object.setPrototypeOf?Object.setPrototypeOf(A,s):(A.__proto__=s,Z(A,d,"GeneratorFunction")),A.prototype=Object.create(y),A},g.awrap=function(A){return{__await:A}},h(V.prototype),Z(V.prototype,l,(function(){return this})),g.AsyncIterator=V,g.async=function(A,I,C,B,i){void 0===i&&(i=Promise);var Q=new V(G(A,I,C,B),i);return g.isGeneratorFunction(I)?Q:Q.next().then((function(A){return A.done?A.value:Q.next()}))},h(y),Z(y,d,"Generator"),Z(y,o,(function(){return this})),Z(y,"toString",(function(){return"[object Generator]"})),g.keys=function(A){var I=Object(A),g=[];for(var C in I)g.push(C);return g.reverse(),function A(){for(;g.length;){var C=g.pop();if(C in I)return A.value=C,A.done=!1,A}return A.done=!0,A}},g.values=W,r.prototype={constructor:r,reset:function(A){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(X),!A)for(var I in this)"t"===I.charAt(0)&&i.call(this,I)&&!isNaN(+I.slice(1))&&(this[I]=void 0)},stop:function(){this.done=!0;var A=this.tryEntries[0].completion;if("throw"===A.type)throw A.arg;return this.rval},dispatchException:function(A){if(this.done)throw A;var I=this;function g(g,C){return Q.type="throw",Q.arg=A,I.next=g,C&&(I.method="next",I.arg=void 0),!!C}for(var C=this.tryEntries.length-1;C>=0;--C){var B=this.tryEntries[C],Q=B.completion;if("root"===B.tryLoc)return g("end");if(B.tryLoc<=this.prev){var c=i.call(B,"catchLoc"),o=i.call(B,"finallyLoc");if(c&&o){if(this.prev<B.catchLoc)return g(B.catchLoc,!0);if(this.prev<B.finallyLoc)return g(B.finallyLoc)}else if(c){if(this.prev<B.catchLoc)return g(B.catchLoc,!0)}else{if(!o)throw new Error("try statement without catch or finally");if(this.prev<B.finallyLoc)return g(B.finallyLoc)}}}},abrupt:function(A,I){for(var g=this.tryEntries.length-1;g>=0;--g){var C=this.tryEntries[g];if(C.tryLoc<=this.prev&&i.call(C,"finallyLoc")&&this.prev<C.finallyLoc){var B=C;break}}B&&("break"===A||"continue"===A)&&B.tryLoc<=I&&I<=B.finallyLoc&&(B=null);var Q=B?B.completion:{};return Q.type=A,Q.arg=I,B?(this.method="next",this.next=B.finallyLoc,t):this.complete(Q)},complete:function(A,I){if("throw"===A.type)throw A.arg;return"break"===A.type||"continue"===A.type?this.next=A.arg:"return"===A.type?(this.rval=this.arg=A.arg,this.method="return",this.next="end"):"normal"===A.type&&I&&(this.next=I),t},finish:function(A){for(var I=this.tryEntries.length-1;I>=0;--I){var g=this.tryEntries[I];if(g.finallyLoc===A)return this.complete(g.completion,g.afterLoc),X(g),t}},catch:function(A){for(var I=this.tryEntries.length-1;I>=0;--I){var g=this.tryEntries[I];if(g.tryLoc===A){var C=g.completion;if("throw"===C.type){var B=C.arg;X(g)}return B}}throw new Error("illegal catch attempt")},delegateYield:function(A,I,g){return this.delegate={iterator:W(A),resultName:I,nextLoc:g},"next"===this.method&&(this.arg=void 0),t}},g}A.exports=C,A.exports.__esModule=!0,A.exports.default=A.exports})),B=C(),i=B;try{regeneratorRuntime=B}catch(A){"object"==typeof globalThis?globalThis.regeneratorRuntime=B:Function("r","regeneratorRuntime = r")(B)}function Q(A){return Q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(A){return typeof A}:function(A){return A&&"function"==typeof Symbol&&A.constructor===Symbol&&A!==Symbol.prototype?"symbol":typeof A},Q(A)}function c(A){var I=function(A,I){if("object"!==Q(A)||null===A)return A;var g=A[Symbol.toPrimitive];if(void 0!==g){var C=g.call(A,I||"default");if("object"!==Q(C))return C;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===I?String:Number)(A)}(A,"string");return"symbol"===Q(I)?I:String(I)}function o(A,I,g){return(I=c(I))in A?Object.defineProperty(A,I,{value:g,enumerable:!0,configurable:!0,writable:!0}):A[I]=g,A}function l(A,I){if(!(A instanceof I))throw new TypeError("Cannot call a class as a function")}function d(A,I){for(var g=0;g<I.length;g++){var C=I[g];C.enumerable=C.enumerable||!1,C.configurable=!0,"value"in C&&(C.writable=!0),Object.defineProperty(A,c(C.key),C)}}function Z(A,I,g){return I&&d(A.prototype,I),g&&d(A,g),Object.defineProperty(A,"prototype",{writable:!1}),A}function G(A){if(void 0===A)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return A}function e(A,I){return e=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(A,I){return A.__proto__=I,A},e(A,I)}function t(A){return t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(A){return A.__proto__||Object.getPrototypeOf(A)},t(A)}function b(A,I){var g=Object.keys(A);if(Object.getOwnPropertySymbols){var C=Object.getOwnPropertySymbols(A);I&&(C=C.filter((function(I){return Object.getOwnPropertyDescriptor(A,I).enumerable}))),g.push.apply(g,C)}return g}var m=function(){function A(){l(this,A),o(this,"_path",void 0),o(this,"_meta",void 0)}return Z(A,[{key:"meta",get:function(){if(void 0!==this._meta)return function(A){for(var I=1;I<arguments.length;I++){var g=null!=arguments[I]?arguments[I]:{};I%2?b(Object(g),!0).forEach((function(I){o(A,I,g[I])})):Object.getOwnPropertyDescriptors?Object.defineProperties(A,Object.getOwnPropertyDescriptors(g)):b(Object(g)).forEach((function(I){Object.defineProperty(A,I,Object.getOwnPropertyDescriptor(g,I))}))}return A}({version:0},this._meta)}}],[{key:"getPtr",value:function(I){return A._filePtrs.get(I)}},{key:"setPtr",value:function(I,g){A._filePtrs.set(I,g)}},{key:"removePtr",value:function(I){A._filePtrs.delete(I)}}]),A}();function s(A){var I=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(A){return!1}}();return function(){var g,C=t(A);if(I){var B=t(this).constructor;g=Reflect.construct(C,arguments,B)}else g=C.apply(this,arguments);return function(A,I){if(I&&("object"===Q(I)||"function"==typeof I))return I;if(void 0!==I)throw new TypeError("Derived constructors may only return object or undefined");return G(A)}(this,g)}}o(m,"_filePtrs",new Map);var a=function(I){!function(A,I){if("function"!=typeof I&&null!==I)throw new TypeError("Super expression must either be null or a function");A.prototype=Object.create(I&&I.prototype,{constructor:{value:A,writable:!0,configurable:!0}}),Object.defineProperty(A,"prototype",{writable:!1}),I&&e(A,I)}(Q,m);var g,C,B=s(Q);function Q(A,I,g,C){var i;return l(this,Q),o(G(i=B.call(this)),"_pos",0),o(G(i),"_mode",void 0),i._path=A,i._meta=I,i._mode=C,i}return Z(Q,[{key:"close",value:function(){}},{key:"read",value:function(A,I){if(!this.exists())throw new Error("'".concat(this._path,"' doesn't exist."));if(this._isEOF){var g=new Error("EOF");throw g.name="EndOfFile",g}var C=Math.min(A*I,this._file.length-this._pos),B=C-C%A,i=new Uint8Array(B);return i.set(this._file.slice(this._pos,this._pos+B),0),this._pos+=B,i}},{key:"write",value:function(A){var I=new Uint8Array(this._pos+A.length);void 0!==this._file?(I.set(this._file.slice(0,this._pos)),I.set(A,this._pos)):I.set(A),this._file=I,this._pos+=A.length}},{key:"seek",value:function(A,I){if(!this.exists()&&"readonly"===this._mode)throw new Error("'".concat(this._path,"' doesn't exist."));if(A<0){var g=new Error("EOF");throw g.name="EndOfFile",g}var C;if(0===I)C=Math.min(A,this._file.length);else if(1===I)C=Math.min(this._pos+A,this._file.length);else{if(2!==I)throw new Error("Invalid operation: ".concat(I,"."));C=Math.min(this._file.length+A,this._file.length)}this._pos=C}},{key:"tell",value:function(){return this.exists()?this._pos:-1}},{key:"remove",value:(g=i.mark((function A(){return i.wrap((function(A){for(;;)switch(A.prev=A.next){case 0:Q._memFiles.delete(this._path),this._file=void 0,this._pos=0;case 3:case"end":return A.stop()}}),A,this)})),C=function(){var I=this,C=arguments;return new Promise((function(B,i){var Q=g.apply(I,C);function c(I){A(Q,B,i,c,o,"next",I)}function o(I){A(Q,B,i,c,o,"throw",I)}c(void 0)}))},function(){return C.apply(this,arguments)})},{key:"exists",value:function(){return void 0!==this._file}},{key:"_isEOF",get:function(){return this._pos>=this._file.length}},{key:"_file",get:function(){return Q._memFiles.get(this._path)},set:function(A){Q._memFiles.set(this._path,A)}}],[{key:"open",value:function(A,I){var g=Q._memFiles.get(A),C=I.includes("r")?"readonly":"readwrite";if(void 0===g&&"readonly"===C){var B=new Error("'".concat(A,"' doesn't exist."));throw B.name="FileNotExists",B}var i=new Q(A,void 0,void 0,C);return I.includes("a")&&i.seek(0,2),i}}]),Q}();function n(A,I){for(var g=I;0!==A[g];)g++;return new TextDecoder("utf-8").decode(A.subarray(I,g))}function E(A){for(var I=atob(A),g=new Uint8Array(I.length),C=0;C<I.length;C++)g[C]=I.charCodeAt(C);return g}function y(A,I,g){var C=void 0===I?null:I,B=function(A,I){var g=atob(A);if(I){for(var C=new Uint8Array(g.length),B=0,i=g.length;B<i;++B)C[B]=g.charCodeAt(B);return String.fromCharCode.apply(null,new Uint16Array(C.buffer))}return g}(A,void 0!==g&&g),i=B.indexOf("\n",10)+1,Q=B.substring(i)+(C?"//# sourceMappingURL="+C:""),c=new Blob([Q],{type:"application/javascript"});return URL.createObjectURL(c)}function h(A,I,g){var C;return function(B){return C=C||y(A,I,g),new Worker(C,B)}}o(a,"_memFiles",new Map);var V=h("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgewogICAgdHJ5IHsKICAgICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpOwogICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGluZm8uZG9uZSkgewogICAgICByZXNvbHZlKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywKICAgICAgICBhcmdzID0gYXJndW1lbnRzOwogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsKICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAibmV4dCIsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikgewogICAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCAidGhyb3ciLCBlcnIpOwogICAgICAgIH0KICAgICAgICBfbmV4dCh1bmRlZmluZWQpOwogICAgICB9KTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbikgewogICAgdmFyIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfTsKICAJcmV0dXJuIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0czsKICB9CgogIHZhciBfdHlwZW9mXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CiAgZnVuY3Rpb24gX3R5cGVvZihvYmopIHsKICAgICJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7CgogICAgcmV0dXJuIChtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvYmopIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7CiAgICB9IDogZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gb2JqICYmICJmdW5jdGlvbiIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvYmo7CiAgICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzKSwgX3R5cGVvZihvYmopOwogIH0KICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgfSk7CgogIHZhciByZWdlbmVyYXRvclJ1bnRpbWUkMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKICB2YXIgX3R5cGVvZiA9IF90eXBlb2ZfMVsiZGVmYXVsdCJdOwogIGZ1bmN0aW9uIF9yZWdlbmVyYXRvclJ1bnRpbWUoKSB7CiAgICBtb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvclJ1bnRpbWUgPSBmdW5jdGlvbiBfcmVnZW5lcmF0b3JSdW50aW1lKCkgewogICAgICByZXR1cm4gZXhwb3J0czsKICAgIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgICB2YXIgZXhwb3J0cyA9IHt9LAogICAgICBPcCA9IE9iamVjdC5wcm90b3R5cGUsCiAgICAgIGhhc093biA9IE9wLmhhc093blByb3BlcnR5LAogICAgICBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAob2JqLCBrZXksIGRlc2MpIHsKICAgICAgICBvYmpba2V5XSA9IGRlc2MudmFsdWU7CiAgICAgIH0sCiAgICAgICRTeW1ib2wgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSwKICAgICAgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8ICJAQGl0ZXJhdG9yIiwKICAgICAgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCAiQEBhc3luY0l0ZXJhdG9yIiwKICAgICAgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8ICJAQHRvU3RyaW5nVGFnIjsKICAgIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgIHdyaXRhYmxlOiAhMAogICAgICB9KSwgb2JqW2tleV07CiAgICB9CiAgICB0cnkgewogICAgICBkZWZpbmUoe30sICIiKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBkZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7CiAgICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yLAogICAgICAgIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKSwKICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pOwogICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZ2VuZXJhdG9yLCAiX2ludm9rZSIsIHsKICAgICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KQogICAgICB9KSwgZ2VuZXJhdG9yOwogICAgfQogICAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJub3JtYWwiLAogICAgICAgICAgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKQogICAgICAgIH07CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAidGhyb3ciLAogICAgICAgICAgYXJnOiBlcnIKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICBleHBvcnRzLndyYXAgPSB3cmFwOwogICAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTsKICAgIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9CiAgICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9CiAgICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9CiAgICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTsKICAgIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICAgIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwKICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7CiAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJiBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiYgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSAmJiAoSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSk7CiAgICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CiAgICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7CiAgICAgIFsibmV4dCIsICJ0aHJvdyIsICJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHsKICAgICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkgewogICAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpOwogICAgICAgIGlmICgidGhyb3ciICE9PSByZWNvcmQudHlwZSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmcsCiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0LnZhbHVlOwogICAgICAgICAgcmV0dXJuIHZhbHVlICYmICJvYmplY3QiID09IF90eXBlb2YodmFsdWUpICYmIGhhc093bi5jYWxsKHZhbHVlLCAiX19hd2FpdCIpID8gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICBpbnZva2UoIm5leHQiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgaW52b2tlKCJ0aHJvdyIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0pIDogUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAodW53cmFwcGVkKSB7CiAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZCwgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiBpbnZva2UoInRocm93IiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpOwogICAgICB9CiAgICAgIHZhciBwcmV2aW91c1Byb21pc2U7CiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICJfaW52b2tlIiwgewogICAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZShtZXRob2QsIGFyZykgewogICAgICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID0gcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkgewogICAgICB2YXIgc3RhdGUgPSAic3VzcGVuZGVkU3RhcnQiOwogICAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7CiAgICAgICAgaWYgKCJleGVjdXRpbmciID09PSBzdGF0ZSkgdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7CiAgICAgICAgaWYgKCJjb21wbGV0ZWQiID09PSBzdGF0ZSkgewogICAgICAgICAgaWYgKCJ0aHJvdyIgPT09IG1ldGhvZCkgdGhyb3cgYXJnOwogICAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZCwgY29udGV4dC5hcmcgPSBhcmc7OykgewogICAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTsKICAgICAgICAgIGlmIChkZWxlZ2F0ZSkgewogICAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTsKICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7CiAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICgibmV4dCIgPT09IGNvbnRleHQubWV0aG9kKSBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7ZWxzZSBpZiAoInRocm93IiA9PT0gY29udGV4dC5tZXRob2QpIHsKICAgICAgICAgICAgaWYgKCJzdXNwZW5kZWRTdGFydCIgPT09IHN0YXRlKSB0aHJvdyBzdGF0ZSA9ICJjb21wbGV0ZWQiLCBjb250ZXh0LmFyZzsKICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7CiAgICAgICAgICB9IGVsc2UgInJldHVybiIgPT09IGNvbnRleHQubWV0aG9kICYmIGNvbnRleHQuYWJydXB0KCJyZXR1cm4iLCBjb250ZXh0LmFyZyk7CiAgICAgICAgICBzdGF0ZSA9ICJleGVjdXRpbmciOwogICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpOwogICAgICAgICAgaWYgKCJub3JtYWwiID09PSByZWNvcmQudHlwZSkgewogICAgICAgICAgICBpZiAoc3RhdGUgPSBjb250ZXh0LmRvbmUgPyAiY29tcGxldGVkIiA6ICJzdXNwZW5kZWRZaWVsZCIsIHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLAogICAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgICAgInRocm93IiA9PT0gcmVjb3JkLnR5cGUgJiYgKHN0YXRlID0gImNvbXBsZXRlZCIsIGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7CiAgICAgIHZhciBtZXRob2ROYW1lID0gY29udGV4dC5tZXRob2QsCiAgICAgICAgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kTmFtZV07CiAgICAgIGlmICh1bmRlZmluZWQgPT09IG1ldGhvZCkgcmV0dXJuIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCAidGhyb3ciID09PSBtZXRob2ROYW1lICYmIGRlbGVnYXRlLml0ZXJhdG9yWyJyZXR1cm4iXSAmJiAoY29udGV4dC5tZXRob2QgPSAicmV0dXJuIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQsIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpLCAidGhyb3ciID09PSBjb250ZXh0Lm1ldGhvZCkgfHwgInJldHVybiIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gInRocm93IiwgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICciICsgbWV0aG9kTmFtZSArICInIG1ldGhvZCIpKSwgQ29udGludWVTZW50aW5lbDsKICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTsKICAgICAgaWYgKCJ0aHJvdyIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmcsIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsOwogICAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7CiAgICAgIHJldHVybiBpbmZvID8gaW5mby5kb25lID8gKGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlLCBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jLCAicmV0dXJuIiAhPT0gY29udGV4dC5tZXRob2QgJiYgKGNvbnRleHQubWV0aG9kID0gIm5leHQiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKSA6IGluZm8gOiAoY29udGV4dC5tZXRob2QgPSAidGhyb3ciLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsLCBDb250aW51ZVNlbnRpbmVsKTsKICAgIH0KICAgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CiAgICAgIHZhciBlbnRyeSA9IHsKICAgICAgICB0cnlMb2M6IGxvY3NbMF0KICAgICAgfTsKICAgICAgMSBpbiBsb2NzICYmIChlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV0pLCAyIGluIGxvY3MgJiYgKGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdLCBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM10pLCB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7CiAgICB9CiAgICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7CiAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9OwogICAgICByZWNvcmQudHlwZSA9ICJub3JtYWwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDsKICAgIH0KICAgIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHsKICAgICAgdGhpcy50cnlFbnRyaWVzID0gW3sKICAgICAgICB0cnlMb2M6ICJyb290IgogICAgICB9XSwgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAgIH0KICAgIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkgewogICAgICBpZiAoaXRlcmFibGUpIHsKICAgICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07CiAgICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CiAgICAgICAgaWYgKCJmdW5jdGlvbiIgPT0gdHlwZW9mIGl0ZXJhYmxlLm5leHQpIHJldHVybiBpdGVyYWJsZTsKICAgICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHsKICAgICAgICAgIHZhciBpID0gLTEsCiAgICAgICAgICAgIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgICAgICAgIGZvciAoOyArK2kgPCBpdGVyYWJsZS5sZW5ndGg7KSBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSByZXR1cm4gbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDsKICAgICAgICAgICAgICByZXR1cm4gbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCwgbmV4dC5kb25lID0gITAsIG5leHQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBuZXh0OiBkb25lUmVzdWx0CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBkb25lUmVzdWx0KCkgewogICAgICByZXR1cm4gewogICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgZG9uZTogITAKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lUHJvcGVydHkoR3AsICJjb25zdHJ1Y3RvciIsIHsKICAgICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLAogICAgICBjb25maWd1cmFibGU6ICEwCiAgICB9KSwgZGVmaW5lUHJvcGVydHkoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsICJjb25zdHJ1Y3RvciIsIHsKICAgICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uLAogICAgICBjb25maWd1cmFibGU6ICEwCiAgICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKSwgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24gKGdlbkZ1bikgewogICAgICB2YXIgY3RvciA9ICJmdW5jdGlvbiIgPT0gdHlwZW9mIGdlbkZ1biAmJiBnZW5GdW4uY29uc3RydWN0b3I7CiAgICAgIHJldHVybiAhIWN0b3IgJiYgKGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8ICJHZW5lcmF0b3JGdW5jdGlvbiIgPT09IChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkpOwogICAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikgewogICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpIDogKGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsICJHZW5lcmF0b3JGdW5jdGlvbiIpKSwgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApLCBnZW5GdW47CiAgICB9LCBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24gKGFyZykgewogICAgICByZXR1cm4gewogICAgICAgIF9fYXdhaXQ6IGFyZwogICAgICB9OwogICAgfSwgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKSwgZGVmaW5lKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCBhc3luY0l0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSksIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3IsIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbiAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7CiAgICAgIHZvaWQgMCA9PT0gUHJvbWlzZUltcGwgJiYgKFByb21pc2VJbXBsID0gUHJvbWlzZSk7CiAgICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTsKICAgICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKSA/IGl0ZXIgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTsKICAgICAgfSk7CiAgICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApLCBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yIiksIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KSwgZGVmaW5lKEdwLCAidG9TdHJpbmciLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiAiW29iamVjdCBHZW5lcmF0b3JdIjsKICAgIH0pLCBleHBvcnRzLmtleXMgPSBmdW5jdGlvbiAodmFsKSB7CiAgICAgIHZhciBvYmplY3QgPSBPYmplY3QodmFsKSwKICAgICAgICBrZXlzID0gW107CiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGtleXMucHVzaChrZXkpOwogICAgICByZXR1cm4ga2V5cy5yZXZlcnNlKCksIGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgZm9yICg7IGtleXMubGVuZ3RoOykgewogICAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7CiAgICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgcmV0dXJuIG5leHQudmFsdWUgPSBrZXksIG5leHQuZG9uZSA9ICExLCBuZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7CiAgICAgIH07CiAgICB9LCBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcywgQ29udGV4dC5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LAogICAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoc2tpcFRlbXBSZXNldCkgewogICAgICAgIGlmICh0aGlzLnByZXYgPSAwLCB0aGlzLm5leHQgPSAwLCB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkLCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gIm5leHQiLCB0aGlzLmFyZyA9IHVuZGVmaW5lZCwgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSksICFza2lwVGVtcFJlc2V0KSBmb3IgKHZhciBuYW1lIGluIHRoaXMpICJ0IiA9PT0gbmFtZS5jaGFyQXQoMCkgJiYgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiYgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSAmJiAodGhpc1tuYW1lXSA9IHVuZGVmaW5lZCk7CiAgICAgIH0sCiAgICAgIHN0b3A6IGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgICAgdGhpcy5kb25lID0gITA7CiAgICAgICAgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsKICAgICAgICBpZiAoInRocm93IiA9PT0gcm9vdFJlY29yZC50eXBlKSB0aHJvdyByb290UmVjb3JkLmFyZzsKICAgICAgICByZXR1cm4gdGhpcy5ydmFsOwogICAgICB9LAogICAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24gZGlzcGF0Y2hFeGNlcHRpb24oZXhjZXB0aW9uKSB7CiAgICAgICAgaWYgKHRoaXMuZG9uZSkgdGhyb3cgZXhjZXB0aW9uOwogICAgICAgIHZhciBjb250ZXh0ID0gdGhpczsKICAgICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHsKICAgICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9ICJ0aHJvdyIsIHJlY29yZC5hcmcgPSBleGNlcHRpb24sIGNvbnRleHQubmV4dCA9IGxvYywgY2F1Z2h0ICYmIChjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCAhIWNhdWdodDsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldLAogICAgICAgICAgICByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogICAgICAgICAgaWYgKCJyb290IiA9PT0gZW50cnkudHJ5TG9jKSByZXR1cm4gaGFuZGxlKCJlbmQiKTsKICAgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7CiAgICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCAiY2F0Y2hMb2MiKSwKICAgICAgICAgICAgICBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksICJmaW5hbGx5TG9jIik7CiAgICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCAhMCk7CiAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoIWhhc0ZpbmFsbHkpIHRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgYWJydXB0OiBmdW5jdGlvbiBhYnJ1cHQodHlwZSwgYXJnKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOwogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiYgaGFzT3duLmNhbGwoZW50cnksICJmaW5hbGx5TG9jIikgJiYgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgewogICAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaW5hbGx5RW50cnkgJiYgKCJicmVhayIgPT09IHR5cGUgfHwgImNvbnRpbnVlIiA9PT0gdHlwZSkgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jICYmIChmaW5hbGx5RW50cnkgPSBudWxsKTsKICAgICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTsKICAgICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPSB0eXBlLCByZWNvcmQuYXJnID0gYXJnLCBmaW5hbGx5RW50cnkgPyAodGhpcy5tZXRob2QgPSAibmV4dCIsIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jLCBDb250aW51ZVNlbnRpbmVsKSA6IHRoaXMuY29tcGxldGUocmVjb3JkKTsKICAgICAgfSwKICAgICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJlY29yZCwgYWZ0ZXJMb2MpIHsKICAgICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHRocm93IHJlY29yZC5hcmc7CiAgICAgICAgcmV0dXJuICJicmVhayIgPT09IHJlY29yZC50eXBlIHx8ICJjb250aW51ZSIgPT09IHJlY29yZC50eXBlID8gdGhpcy5uZXh0ID0gcmVjb3JkLmFyZyA6ICJyZXR1cm4iID09PSByZWNvcmQudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmcsIHRoaXMubWV0aG9kID0gInJldHVybiIsIHRoaXMubmV4dCA9ICJlbmQiKSA6ICJub3JtYWwiID09PSByZWNvcmQudHlwZSAmJiBhZnRlckxvYyAmJiAodGhpcy5uZXh0ID0gYWZ0ZXJMb2MpLCBDb250aW51ZVNlbnRpbmVsOwogICAgICB9LAogICAgICBmaW5pc2g6IGZ1bmN0aW9uIGZpbmlzaChmaW5hbGx5TG9jKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOwogICAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHJldHVybiB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKSwgcmVzZXRUcnlFbnRyeShlbnRyeSksIENvbnRpbnVlU2VudGluZWw7CiAgICAgICAgfQogICAgICB9LAogICAgICAiY2F0Y2giOiBmdW5jdGlvbiBfY2F0Y2godHJ5TG9jKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOwogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7CiAgICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogICAgICAgICAgICBpZiAoInRocm93IiA9PT0gcmVjb3JkLnR5cGUpIHsKICAgICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsKICAgICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhyb3duOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpOwogICAgICB9LAogICAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7CiAgICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSwKICAgICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsCiAgICAgICAgICBuZXh0TG9jOiBuZXh0TG9jCiAgICAgICAgfSwgIm5leHQiID09PSB0aGlzLm1ldGhvZCAmJiAodGhpcy5hcmcgPSB1bmRlZmluZWQpLCBDb250aW51ZVNlbnRpbmVsOwogICAgICB9CiAgICB9LCBleHBvcnRzOwogIH0KICBtb2R1bGUuZXhwb3J0cyA9IF9yZWdlbmVyYXRvclJ1bnRpbWUsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7CiAgfSk7CgogIC8vIFRPRE8oQmFiZWwgOCk6IFJlbW92ZSB0aGlzIGZpbGUuCgogIHZhciBydW50aW1lID0gcmVnZW5lcmF0b3JSdW50aW1lJDEoKTsKICB2YXIgcmVnZW5lcmF0b3IgPSBydW50aW1lOwoKICAvLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUvcnVudGltZS5qcyNMNzM2PQogIHRyeSB7CiAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogIH0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7CiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICJvYmplY3QiKSB7CiAgICAgIGdsb2JhbFRoaXMucmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTsKICAgIH0gZWxzZSB7CiAgICAgIEZ1bmN0aW9uKCJyIiwgInJlZ2VuZXJhdG9yUnVudGltZSA9IHIiKShydW50aW1lKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7CiAgICAiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiOwoKICAgIHJldHVybiBfdHlwZW9mID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgU3ltYm9sICYmICJzeW1ib2wiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7CiAgICAgIHJldHVybiB0eXBlb2Ygb2JqOwogICAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgcmV0dXJuIG9iaiAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOwogICAgfSwgX3R5cGVvZihvYmopOwogIH0KCiAgZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LCBoaW50KSB7CiAgICBpZiAoX3R5cGVvZihpbnB1dCkgIT09ICJvYmplY3QiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7CiAgICB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07CiAgICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhciByZXMgPSBwcmltLmNhbGwoaW5wdXQsIGhpbnQgfHwgImRlZmF1bHQiKTsKICAgICAgaWYgKF90eXBlb2YocmVzKSAhPT0gIm9iamVjdCIpIHJldHVybiByZXM7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIik7CiAgICB9CiAgICByZXR1cm4gKGhpbnQgPT09ICJzdHJpbmciID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7CiAgfQoKICBmdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsKICAgIHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCAic3RyaW5nIik7CiAgICByZXR1cm4gX3R5cGVvZihrZXkpID09PSAic3ltYm9sIiA/IGtleSA6IFN0cmluZyhrZXkpOwogIH0KCiAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgewogICAga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsKICAgIGlmIChrZXkgaW4gb2JqKSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KCiAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsKICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLCBkZXNjcmlwdG9yKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsICJwcm90b3R5cGUiLCB7CiAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgfSk7CiAgICByZXR1cm4gQ29uc3RydWN0b3I7CiAgfQoKICBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsKICAgIGlmIChzZWxmID09PSB2b2lkIDApIHsKICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsKICAgIH0KICAgIHJldHVybiBzZWxmOwogIH0KCiAgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsKICAgIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgewogICAgICBvLl9fcHJvdG9fXyA9IHA7CiAgICAgIHJldHVybiBvOwogICAgfTsKICAgIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7CiAgfQoKICBmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7CiAgICB9CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICB2YWx1ZTogc3ViQ2xhc3MsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCAicHJvdG90eXBlIiwgewogICAgICB3cml0YWJsZTogZmFsc2UKICAgIH0pOwogICAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7CiAgfQoKICBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7CiAgICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gIm9iamVjdCIgfHwgdHlwZW9mIGNhbGwgPT09ICJmdW5jdGlvbiIpKSB7CiAgICAgIHJldHVybiBjYWxsOwogICAgfSBlbHNlIGlmIChjYWxsICE9PSB2b2lkIDApIHsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTsKICAgIH0KICAgIHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOwogIH0KCiAgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsKICAgIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgewogICAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOwogICAgfTsKICAgIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7CiAgfQoKICBmdW5jdGlvbiBvd25LZXlzJDEob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9CiAgZnVuY3Rpb24gX29iamVjdFNwcmVhZCQxKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzJDEoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyQxKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH0KICAvKg0KICAgIENvcHlyaWdodCAyMDIyIFBpY292b2ljZSBJbmMuDQoKICAgIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgbGljZW5zZS4gQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlICJMSUNFTlNFIg0KICAgIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgc291cmNlLg0KCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uDQogICAgYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQogICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCiAgKi8KICAvKioNCiAgICogQmFzZVB2RmlsZSBDbGFzcw0KICAgKiBUaGlzIGNsYXNzIG1vY2tzIHRoZSBmaWxlIHN5c3RlbSB1c2luZyBpbi1tZW1vcnkgc3RvcmFnZS4NCiAgICovCiAgdmFyIFB2RmlsZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBQdkZpbGUoKSB7CiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQdkZpbGUpOwogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgIl9wYXRoIiwgdm9pZCAwKTsKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJfbWV0YSIsIHZvaWQgMCk7CiAgICB9CiAgICBfY3JlYXRlQ2xhc3MoUHZGaWxlLCBbewogICAgICBrZXk6ICJtZXRhIiwKICAgICAgZ2V0OgogICAgICAvKioNCiAgICAgICAqIEdldHRlciBmb3IgZmlsZSdzIG1ldGEgaW5mb3JtYXRpb24uDQogICAgICAgKi8KICAgICAgZnVuY3Rpb24gZ2V0KCkgewogICAgICAgIGlmICh0aGlzLl9tZXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkJDEoewogICAgICAgICAgdmVyc2lvbjogMAogICAgICAgIH0sIHRoaXMuX21ldGEpOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogR2V0IHRoZSBmaWxlIHBvaW50ZXIgZnJvbSB0aGUgX2ZpbGVQdHJzIG1hcC4NCiAgICAgICAqIEBwYXJhbSBwdHIgVGhlIHBvaW50ZXIgdG8gQmFzZVB2RmlsZSBpbnN0YW5jZSB0byBnZXQgZnJvbSB0aGUgbWFwLg0KICAgICAgICogQHJldHVybnMgQmFzZVB2RmlsZSByZXR1cm5zIHRoZSBjdXJyZW50IGZpbGUgaW5zdGFuY2UgcmVsYXRlZCB0byBwdHIuDQogICAgICAgKi8KICAgIH1dLCBbewogICAgICBrZXk6ICJnZXRQdHIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHRyKHB0cikgewogICAgICAgIHJldHVybiBQdkZpbGUuX2ZpbGVQdHJzLmdldChwdHIpOwogICAgICB9CiAgICAgIC8qKg0KICAgICAgICogU2F2ZXMgdGhlIEJhc2VQdkZpbGUgaW5zdGFuY2UgdG8gdGhlIG1hcCB3aXRoIGFuIGFzc29jaWF0ZWQgcHRyLg0KICAgICAgICogQHBhcmFtIHB0ciBUaGUgZmlsZSBwb2ludGVyIHRvIHNhdmUgYXMgdGhlIGtleS4NCiAgICAgICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgQmFzZVB2RmlsZSBpbnN0YW5jZSB0byBzYXZlIGFzIHRoZSB2YWx1ZS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJzZXRQdHIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UHRyKHB0ciwgaW5zdGFuY2UpIHsKICAgICAgICBQdkZpbGUuX2ZpbGVQdHJzLnNldChwdHIsIGluc3RhbmNlKTsKICAgICAgfQogICAgICAvKioNCiAgICAgICAqIFJlbW92ZXMgdGhlIHB0ciBmcm9tIHRoZSBfZmlsZVB0cnMgbWFwLg0KICAgICAgICogQHBhcmFtIHB0ciBUaGUgZmlsZSBwb2ludGVyIHRvIHJlbW92ZS4NCiAgICAgICAqLwogICAgfSwgewogICAgICBrZXk6ICJyZW1vdmVQdHIiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlUHRyKHB0cikgewogICAgICAgIFB2RmlsZS5fZmlsZVB0cnNbImRlbGV0ZSJdKHB0cik7CiAgICAgIH0KICAgIH1dKTsKICAgIHJldHVybiBQdkZpbGU7CiAgfSgpOwogIF9kZWZpbmVQcm9wZXJ0eShQdkZpbGUsICJfZmlsZVB0cnMiLCBuZXcgTWFwKCkpOwoKICBmdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfQogIGZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gInVuZGVmaW5lZCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09ICJmdW5jdGlvbiIpIHJldHVybiB0cnVlOyB0cnkgeyBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9CiAgLyoqDQogICAqIFB2RmlsZU1lbSBDbGFzcw0KICAgKiBUaGlzIGNsYXNzIG1vY2tzIHRoZSBmaWxlIHN5c3RlbSB1c2luZyBpbi1tZW1vcnkgc3RvcmFnZS4NCiAgICovCiAgdmFyIFB2RmlsZU1lbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B2RmlsZSkgewogICAgX2luaGVyaXRzKFB2RmlsZU1lbSwgX1B2RmlsZSk7CiAgICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFB2RmlsZU1lbSk7CiAgICBmdW5jdGlvbiBQdkZpbGVNZW0ocGF0aCwgbWV0YSwgZGIsIG1vZGUpIHsKICAgICAgdmFyIF90aGlzOwogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHZGaWxlTWVtKTsKICAgICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKTsKICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCAiX3BvcyIsIDApOwogICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICJfbW9kZSIsIHZvaWQgMCk7CiAgICAgIF90aGlzLl9wYXRoID0gcGF0aDsKICAgICAgX3RoaXMuX21ldGEgPSBtZXRhOwogICAgICBfdGhpcy5fbW9kZSA9IG1vZGU7CiAgICAgIHJldHVybiBfdGhpczsKICAgIH0KICAgIF9jcmVhdGVDbGFzcyhQdkZpbGVNZW0sIFt7CiAgICAgIGtleTogImNsb3NlIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJyZWFkIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlYWQoc2l6ZSwgY291bnQpIHsKICAgICAgICBpZiAoIXRoaXMuZXhpc3RzKCkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIuY29uY2F0KHRoaXMuX3BhdGgsICInIGRvZXNuJ3QgZXhpc3QuIikpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5faXNFT0YpIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIHRvQ29weSA9IE1hdGgubWluKHNpemUgKiBjb3VudCwgdGhpcy5fZmlsZS5sZW5ndGggLSB0aGlzLl9wb3MpOwogICAgICAgIHZhciB0b3RhbEVsZW1zID0gdG9Db3B5IC0gdG9Db3B5ICUgc2l6ZTsKICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodG90YWxFbGVtcyk7CiAgICAgICAgYnVmZmVyLnNldCh0aGlzLl9maWxlLnNsaWNlKHRoaXMuX3BvcywgdGhpcy5fcG9zICsgdG90YWxFbGVtcyksIDApOwogICAgICAgIHRoaXMuX3BvcyArPSB0b3RhbEVsZW1zOwogICAgICAgIHJldHVybiBidWZmZXI7CiAgICAgIH0KICAgIH0sIHsKICAgICAga2V5OiAid3JpdGUiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGUoY29udGVudCkgewogICAgICAgIHZhciBuZXdGaWxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fcG9zICsgY29udGVudC5sZW5ndGgpOwogICAgICAgIGlmICh0aGlzLl9maWxlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIG5ld0ZpbGUuc2V0KHRoaXMuX2ZpbGUuc2xpY2UoMCwgdGhpcy5fcG9zKSk7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50LCB0aGlzLl9wb3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdGaWxlLnNldChjb250ZW50KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZmlsZSA9IG5ld0ZpbGU7CiAgICAgICAgdGhpcy5fcG9zICs9IGNvbnRlbnQubGVuZ3RoOwogICAgICB9CiAgICB9LCB7CiAgICAgIGtleTogInNlZWsiLAogICAgICB2YWx1ZTogZnVuY3Rpb24gc2VlayhvZmZzZXQsIHdoZW5jZSkgewogICAgICAgIGlmICghdGhpcy5leGlzdHMoKSAmJiB0aGlzLl9tb2RlID09PSAicmVhZG9ubHkiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIiciLmNvbmNhdCh0aGlzLl9wYXRoLCAiJyBkb2Vzbid0IGV4aXN0LiIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoIkVPRiIpOwogICAgICAgICAgZXJyLm5hbWUgPSAiRW5kT2ZGaWxlIjsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld09mZnNldDsKICAgICAgICBpZiAod2hlbmNlID09PSAwKSB7CiAgICAgICAgICBuZXdPZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2ZpbGUubGVuZ3RoKTsKICAgICAgICB9IGVsc2UgaWYgKHdoZW5jZSA9PT0gMSkgewogICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5taW4odGhpcy5fcG9zICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsKICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKHRoaXMuX2ZpbGUubGVuZ3RoICsgb2Zmc2V0LCB0aGlzLl9maWxlLmxlbmd0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBvcGVyYXRpb246ICIuY29uY2F0KHdoZW5jZSwgIi4iKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BvcyA9IG5ld09mZnNldDsKICAgICAgfQogICAgfSwgewogICAgICBrZXk6ICJ0ZWxsIiwKICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRlbGwoKSB7CiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cygp