!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("prop-types")):"function"==typeof define&&define.amd?define(["exports","react","prop-types"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).reactDropzone={},e.React,e.PropTypes)}(this,(function(e,t,n){"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=r(t),i=r(n);function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function u(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function f(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==n)return;var r,o,i=[],a=!0,u=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(i.push(r.value),!t||i.length!==t);a=!0);}catch(e){u=!0,o=e}finally{try{a||null==n.return||n.return()}finally{if(u)throw o}}return i}(e,t)||p(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")} /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */()}function s(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||p(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}var y=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]);function b(e,t){var n=function(e){var t=e.name;if(t&&-1!==t.lastIndexOf(".")&&!e.type){var n=t.split(".").pop().toLowerCase(),r=y.get(n);r&&Object.defineProperty(e,"type",{value:r,writable:!1,configurable:!1,enumerable:!0})}return e}(e);if("string"!=typeof n.path){var r=e.webkitRelativePath;Object.defineProperty(n,"path",{value:"string"==typeof t?t:"string"==typeof r&&r.length>0?r:e.name,writable:!1,configurable:!1,enumerable:!0})}return n}var h=[".DS_Store","Thumbs.db"];function w(e){return"object"==typeof e&&null!==e}function D(e){return O(e.target.files).map((function(e){return b(e)}))}function x(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){switch(t.label){case 0:return[4,Promise.all(e.map((function(e){return e.getFile()})))];case 1:return[2,t.sent().map((function(e){return b(e)}))]}}))}))}function F(e,t){return v(this,void 0,void 0,(function(){var n;return g(this,(function(r){switch(r.label){case 0:return null===e?[2,[]]:e.items?(n=O(e.items).filter((function(e){return"file"===e.kind})),"drop"!==t?[2,n]:[4,Promise.all(n.map(A))]):[3,2];case 1:return[2,j(k(r.sent()))];case 2:return[2,j(O(e.files).map((function(e){return b(e)})))]}}))}))}function j(e){return e.filter((function(e){return-1===h.indexOf(e.name)}))}function O(e){if(null===e)return[];for(var t=[],n=0;nn)return[!1,M(n)];if(e.sizen)return[!1,M(n)]}return[!0,null]}function _(e){return null!=e}function N(e){var t=e.files,n=e.accept,r=e.minSize,o=e.maxSize,i=e.multiple,a=e.maxFiles;return!(!i&&t.length>1||i&&a>=1&&t.length>a)&&t.every((function(e){var t=f(G(e,n),1)[0],i=f($(e,r,o),1)[0];return t&&i}))}function W(e){return"function"==typeof e.isPropagationStopped?e.isPropagationStopped():void 0!==e.cancelBubble&&e.cancelBubble}function H(e){return e.dataTransfer?Array.prototype.some.call(e.dataTransfer.types,(function(e){return"Files"===e||"application/x-moz-file"===e})):!!e.target&&!!e.target.files}function U(e){e.preventDefault()}function J(e){return-1!==e.indexOf("MSIE")||-1!==e.indexOf("Trident/")}function Q(e){return-1!==e.indexOf("Edge/")}function V(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.navigator.userAgent;return J(e)||Q(e)}function X(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),o=1;o0&&void 0!==arguments[0]?arguments[0]:{},n=u(u({},ie),e),r=n.accept,o=n.disabled,i=n.getFilesFromEvent,a=n.maxSize,p=n.minSize,d=n.multiple,v=n.maxFiles,g=n.onDragEnter,m=n.onDragLeave,y=n.onDragOver,b=n.onDrop,h=n.onDropAccepted,w=n.onDropRejected,D=n.onFileDialogCancel,x=n.onFileDialogOpen,F=n.useFsAccessApi,j=n.preventDropOnDocument,O=n.noClick,A=n.noKeyboard,k=n.noDrag,P=n.noDragEventsBubbling,E=n.validator,z=t.useMemo((function(){return"function"==typeof x?x:le}),[x]),C=t.useMemo((function(){return"function"==typeof D?D:le}),[D]),S=t.useRef(null),T=t.useRef(null),R=t.useReducer(ce,ae),L=f(R,2),I=L[0],K=L[1],M=I.isFocused,B=I.isFileDialogActive,_=I.draggedFiles,J=function(){B&&setTimeout((function(){T.current&&(T.current.files.length||(K({type:"closeDialog"}),C()))}),300)};t.useEffect((function(){return F&&Y()?function(){}:(window.addEventListener("focus",J,!1),function(){window.removeEventListener("focus",J,!1)})}),[T,B,C,F]);var Q=t.useRef([]),ee=function(e){S.current&&S.current.contains(e.target)||(e.preventDefault(),Q.current=[])};t.useEffect((function(){return j&&(document.addEventListener("dragover",U,!1),document.addEventListener("drop",ee,!1)),function(){j&&(document.removeEventListener("dragover",U),document.removeEventListener("drop",ee))}}),[S,j]);var te=t.useCallback((function(e){e.preventDefault(),e.persist(),we(e),Q.current=[].concat(s(Q.current),[e.target]),H(e)&&Promise.resolve(i(e)).then((function(t){W(e)&&!P||(K({draggedFiles:t,isDragActive:!0,type:"setDraggedFiles"}),g&&g(e))}))}),[i,g,P]),oe=t.useCallback((function(e){e.preventDefault(),e.persist(),we(e);var t=H(e);if(t&&e.dataTransfer)try{e.dataTransfer.dropEffect="copy"}catch(e){}return t&&y&&y(e),!1}),[y,P]),ue=t.useCallback((function(e){e.preventDefault(),e.persist(),we(e);var t=Q.current.filter((function(e){return S.current&&S.current.contains(e)})),n=t.indexOf(e.target);-1!==n&&t.splice(n,1),Q.current=t,t.length>0||(K({isDragActive:!1,type:"setDraggedFiles",draggedFiles:[]}),H(e)&&m&&m(e))}),[S,m,P]),fe=t.useCallback((function(e,t){var n=[],o=[];e.forEach((function(e){var t=f(G(e,r),2),i=t[0],u=t[1],c=f($(e,p,a),2),l=c[0],s=c[1],d=E?E(e):null;if(i&&l&&!d)n.push(e);else{var v=[u,s];d&&(v=v.concat(d)),o.push({file:e,errors:v.filter((function(e){return e}))})}})),(!d&&n.length>1||d&&v>=1&&n.length>v)&&(n.forEach((function(e){o.push({file:e,errors:[q]})})),n.splice(0)),K({acceptedFiles:n,fileRejections:o,type:"setFiles"}),b&&b(n,o,t),o.length>0&&w&&w(o,t),n.length>0&&h&&h(n,t)}),[K,d,r,p,a,v,b,h,w,E]),se=t.useCallback((function(e){e.preventDefault(),e.persist(),we(e),Q.current=[],H(e)&&Promise.resolve(i(e)).then((function(t){W(e)&&!P||fe(t,e)})),K({type:"reset"})}),[i,fe,P]),pe=t.useCallback((function(){if(F&&Y()){K({type:"openDialog"}),z();var e={multiple:d,types:Z(r)};window.showOpenFilePicker(e).then((function(e){return i(e)})).then((function(e){return fe(e,null)})).catch((function(e){return C(e)})).finally((function(){return K({type:"closeDialog"})}))}else T.current&&(K({type:"openDialog"}),z(),T.current.value=null,T.current.click())}),[K,z,C,F,fe,r,d]),de=t.useCallback((function(e){S.current&&S.current.isEqualNode(e.target)&&(32!==e.keyCode&&13!==e.keyCode||(e.preventDefault(),pe()))}),[S,T,pe]),ve=t.useCallback((function(){K({type:"focus"})}),[]),ge=t.useCallback((function(){K({type:"blur"})}),[]),me=t.useCallback((function(){O||(V()?setTimeout(pe,0):pe())}),[T,O,pe]),ye=function(e){return o?null:e},be=function(e){return A?null:ye(e)},he=function(e){return k?null:ye(e)},we=function(e){P&&e.stopPropagation()},De=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,r=e.role,i=e.onKeyDown,a=e.onFocus,f=e.onBlur,s=e.onClick,p=e.onDragEnter,d=e.onDragOver,v=e.onDragLeave,g=e.onDrop,m=l(e,ne);return u(u(c({onKeyDown:be(X(i,de)),onFocus:be(X(a,ve)),onBlur:be(X(f,ge)),onClick:ye(X(s,me)),onDragEnter:he(X(p,te)),onDragOver:he(X(d,oe)),onDragLeave:he(X(v,ue)),onDrop:he(X(g,se)),role:"string"==typeof r&&""!==r?r:"button"},n,S),o||A?{}:{tabIndex:0}),m)}}),[S,de,ve,ge,me,te,oe,ue,se,A,k,o]),xe=t.useCallback((function(e){e.stopPropagation()}),[]),Fe=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,o=e.onChange,i=e.onClick,a=l(e,re),f=c({accept:r,multiple:d,type:"file",style:{display:"none"},onChange:ye(X(o,se)),onClick:ye(X(i,xe)),autoComplete:"off",tabIndex:-1},n,T);return u(u({},f),a)}}),[T,r,d,se,o]),je=_.length,Oe=je>0&&N({files:_,accept:r,minSize:p,maxSize:a,multiple:d,maxFiles:v}),Ae=je>0&&!Oe;return u(u({},I),{},{isDragAccept:Oe,isDragReject:Ae,isFocused:M&&!o,getRootProps:De,getInputProps:Fe,rootRef:S,inputRef:T,open:ye(pe)})}function ce(e,t){switch(t.type){case"focus":return u(u({},e),{},{isFocused:!0});case"blur":return u(u({},e),{},{isFocused:!1});case"openDialog":return u(u({},ae),{},{isFileDialogActive:!0});case"closeDialog":return u(u({},e),{},{isFileDialogActive:!1});case"setDraggedFiles":var n=t.isDragActive,r=t.draggedFiles;return u(u({},e),{},{draggedFiles:r,isDragActive:n});case"setFiles":return u(u({},e),{},{acceptedFiles:t.acceptedFiles,fileRejections:t.fileRejections});case"reset":return u({},ae);default:return e}}function le(){}e.ErrorCode=I,e.default=oe,e.useDropzone=ue,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9ub2RlX21vZHVsZXMvZmlsZS1zZWxlY3Rvci9kaXN0L2VzNS9maWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2VsZWN0b3IvZGlzdC9lczUvZmlsZS1zZWxlY3Rvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9hdHRyLWFjY2VwdC9kaXN0L2VzL2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzL2luZGV4LmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiZXhwb3J0IHZhciBDT01NT05fTUlNRV9UWVBFUyA9IG5ldyBNYXAoW1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcbiAgICBbJ2FhYycsICdhdWRpby9hYWMnXSxcbiAgICBbJ2FidycsICdhcHBsaWNhdGlvbi94LWFiaXdvcmQnXSxcbiAgICBbJ2FyYycsICdhcHBsaWNhdGlvbi94LWZyZWVhcmMnXSxcbiAgICBbJ2F2aWYnLCAnaW1hZ2UvYXZpZiddLFxuICAgIFsnYXZpJywgJ3ZpZGVvL3gtbXN2aWRlbyddLFxuICAgIFsnYXp3JywgJ2FwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2snXSxcbiAgICBbJ2JpbicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ2JtcCcsICdpbWFnZS9ibXAnXSxcbiAgICBbJ2J6JywgJ2FwcGxpY2F0aW9uL3gtYnppcCddLFxuICAgIFsnYnoyJywgJ2FwcGxpY2F0aW9uL3gtYnppcDInXSxcbiAgICBbJ2NkYScsICdhcHBsaWNhdGlvbi94LWNkZiddLFxuICAgIFsnY3NoJywgJ2FwcGxpY2F0aW9uL3gtY3NoJ10sXG4gICAgWydjc3MnLCAndGV4dC9jc3MnXSxcbiAgICBbJ2NzdicsICd0ZXh0L2NzdiddLFxuICAgIFsnZG9jJywgJ2FwcGxpY2F0aW9uL21zd29yZCddLFxuICAgIFsnZG9jeCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCddLFxuICAgIFsnZW90JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0J10sXG4gICAgWydlcHViJywgJ2FwcGxpY2F0aW9uL2VwdWIremlwJ10sXG4gICAgWydneicsICdhcHBsaWNhdGlvbi9nemlwJ10sXG4gICAgWydnaWYnLCAnaW1hZ2UvZ2lmJ10sXG4gICAgWydodG0nLCAndGV4dC9odG1sJ10sXG4gICAgWydodG1sJywgJ3RleHQvaHRtbCddLFxuICAgIFsnaWNvJywgJ2ltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiddLFxuICAgIFsnaWNzJywgJ3RleHQvY2FsZW5kYXInXSxcbiAgICBbJ2phcicsICdhcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmUnXSxcbiAgICBbJ2pwZWcnLCAnaW1hZ2UvanBlZyddLFxuICAgIFsnanBnJywgJ2ltYWdlL2pwZWcnXSxcbiAgICBbJ2pzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnanNvbicsICdhcHBsaWNhdGlvbi9qc29uJ10sXG4gICAgWydqc29ubGQnLCAnYXBwbGljYXRpb24vbGQranNvbiddLFxuICAgIFsnbWlkJywgJ2F1ZGlvL21pZGknXSxcbiAgICBbJ21pZGknLCAnYXVkaW8vbWlkaSddLFxuICAgIFsnbWpzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnbXAzJywgJ2F1ZGlvL21wZWcnXSxcbiAgICBbJ21wNCcsICd2aWRlby9tcDQnXSxcbiAgICBbJ21wZWcnLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbXBrZycsICdhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbCddLFxuICAgIFsnb2RwJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uJ10sXG4gICAgWydvZHMnLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCddLFxuICAgIFsnb2R0JywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCddLFxuICAgIFsnb2dhJywgJ2F1ZGlvL29nZyddLFxuICAgIFsnb2d2JywgJ3ZpZGVvL29nZyddLFxuICAgIFsnb2d4JywgJ2FwcGxpY2F0aW9uL29nZyddLFxuICAgIFsnb3B1cycsICdhdWRpby9vcHVzJ10sXG4gICAgWydvdGYnLCAnZm9udC9vdGYnXSxcbiAgICBbJ3BuZycsICdpbWFnZS9wbmcnXSxcbiAgICBbJ3BkZicsICdhcHBsaWNhdGlvbi9wZGYnXSxcbiAgICBbJ3BocCcsICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCddLFxuICAgIFsncHB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50J10sXG4gICAgWydwcHR4JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nXSxcbiAgICBbJ3JhcicsICdhcHBsaWNhdGlvbi92bmQucmFyJ10sXG4gICAgWydydGYnLCAnYXBwbGljYXRpb24vcnRmJ10sXG4gICAgWydzaCcsICdhcHBsaWNhdGlvbi94LXNoJ10sXG4gICAgWydzdmcnLCAnaW1hZ2Uvc3ZnK3htbCddLFxuICAgIFsnc3dmJywgJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJ10sXG4gICAgWyd0YXInLCAnYXBwbGljYXRpb24veC10YXInXSxcbiAgICBbJ3RpZicsICdpbWFnZS90aWZmJ10sXG4gICAgWyd0aWZmJywgJ2ltYWdlL3RpZmYnXSxcbiAgICBbJ3RzJywgJ3ZpZGVvL21wMnQnXSxcbiAgICBbJ3R0ZicsICdmb250L3R0ZiddLFxuICAgIFsndHh0JywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ3ZzZCcsICdhcHBsaWNhdGlvbi92bmQudmlzaW8nXSxcbiAgICBbJ3dhdicsICdhdWRpby93YXYnXSxcbiAgICBbJ3dlYmEnLCAnYXVkaW8vd2VibSddLFxuICAgIFsnd2VibScsICd2aWRlby93ZWJtJ10sXG4gICAgWyd3ZWJwJywgJ2ltYWdlL3dlYnAnXSxcbiAgICBbJ3dvZmYnLCAnZm9udC93b2ZmJ10sXG4gICAgWyd3b2ZmMicsICdmb250L3dvZmYyJ10sXG4gICAgWyd4aHRtbCcsICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXSxcbiAgICBbJ3hscycsICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnXSxcbiAgICBbJ3hsc3gnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXSxcbiAgICBbJ3htbCcsICdhcHBsaWNhdGlvbi94bWwnXSxcbiAgICBbJ3h1bCcsICdhcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sJ10sXG4gICAgWyd6aXAnLCAnYXBwbGljYXRpb24vemlwJ10sXG4gICAgWyc3eicsICdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnXSxcbiAgICAvLyBPdGhlcnNcbiAgICBbJ21rdicsICd2aWRlby94LW1hdHJvc2thJ10sXG4gICAgWydtb3YnLCAndmlkZW8vcXVpY2t0aW1lJ10sXG4gICAgWydtc2cnLCAnYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2snXVxuXSk7XG5leHBvcnQgZnVuY3Rpb24gdG9GaWxlV2l0aFBhdGgoZmlsZSwgcGF0aCkge1xuICAgIHZhciBmID0gd2l0aE1pbWVUeXBlKGZpbGUpO1xuICAgIGlmICh0eXBlb2YgZi5wYXRoICE9PSAnc3RyaW5nJykgeyAvLyBvbiBlbGVjdHJvbiwgcGF0aCBpcyBhbHJlYWR5IHNldCB0byB0aGUgYWJzb2x1dGUgcGF0aFxuICAgICAgICB2YXIgd2Via2l0UmVsYXRpdmVQYXRoID0gZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGg7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAncGF0aCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IHBhdGhcbiAgICAgICAgICAgICAgICAvLyBJZiA8aW5wdXQgd2Via2l0ZGlyZWN0b3J5PiBpcyBzZXQsXG4gICAgICAgICAgICAgICAgLy8gdGhlIEZpbGUgd2lsbCBoYXZlIGEge3dlYmtpdFJlbGF0aXZlUGF0aH0gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTElucHV0RWxlbWVudC93ZWJraXRkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiB3ZWJraXRSZWxhdGl2ZVBhdGggPT09ICdzdHJpbmcnICYmIHdlYmtpdFJlbGF0aXZlUGF0aC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gd2Via2l0UmVsYXRpdmVQYXRoXG4gICAgICAgICAgICAgICAgICAgIDogZmlsZS5uYW1lLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmO1xufVxuZnVuY3Rpb24gd2l0aE1pbWVUeXBlKGZpbGUpIHtcbiAgICB2YXIgbmFtZSA9IGZpbGUubmFtZTtcbiAgICB2YXIgaGFzRXh0ZW5zaW9uID0gbmFtZSAmJiBuYW1lLmxhc3RJbmRleE9mKCcuJykgIT09IC0xO1xuICAgIGlmIChoYXNFeHRlbnNpb24gJiYgIWZpbGUudHlwZSkge1xuICAgICAgICB2YXIgZXh0ID0gbmFtZS5zcGxpdCgnLicpXG4gICAgICAgICAgICAucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIHR5cGUgPSBDT01NT05fTUlNRV9UWVBFUy5nZXQoZXh0KTtcbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWxlLCAndHlwZScsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdG9GaWxlV2l0aFBhdGggfSBmcm9tICcuL2ZpbGUnO1xudmFyIEZJTEVTX1RPX0lHTk9SRSA9IFtcbiAgICAvLyBUaHVtYm5haWwgY2FjaGUgZmlsZXMgZm9yIG1hY09TIGFuZCBXaW5kb3dzXG4gICAgJy5EU19TdG9yZScsXG4gICAgJ1RodW1icy5kYicgLy8gV2luZG93c1xuXTtcbi8qKlxuICogQ29udmVydCBhIERyYWdFdmVudCdzIERhdGFUcmFzZmVyIG9iamVjdCB0byBhIGxpc3Qgb2YgRmlsZSBvYmplY3RzXG4gKiBOT1RFOiBJZiBzb21lIG9mIHRoZSBpdGVtcyBhcmUgZm9sZGVycyxcbiAqIGV2ZXJ5dGhpbmcgd2lsbCBiZSBmbGF0dGVuZWQgYW5kIHBsYWNlZCBpbiB0aGUgc2FtZSBsaXN0IGJ1dCB0aGUgcGF0aHMgd2lsbCBiZSBrZXB0IGFzIGEge3BhdGh9IHByb3BlcnR5LlxuICpcbiAqIEVYUEVSSU1FTlRBTDogQSBsaXN0IG9mIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtSGFuZGxlIG9iamVjdHMgY2FuIGFsc28gYmUgcGFzc2VkIGFzIGFuIGFyZ1xuICogYW5kIGEgbGlzdCBvZiBGaWxlIG9iamVjdHMgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZXZ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRXZlbnQoZXZ0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZXZ0KSAmJiBpc0RhdGFUcmFuc2ZlcihldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldERhdGFUcmFuc2ZlckZpbGVzKGV2dC5kYXRhVHJhbnNmZXIsIGV2dC50eXBlKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0NoYW5nZUV2dChldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldElucHV0RmlsZXMoZXZ0KV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV2dCkgJiYgZXZ0LmV2ZXJ5KGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAnZ2V0RmlsZScgaW4gaXRlbSAmJiB0eXBlb2YgaXRlbS5nZXRGaWxlID09PSAnZnVuY3Rpb24nOyB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnZXRGc0hhbmRsZUZpbGVzKGV2dCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc0RhdGFUcmFuc2Zlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc09iamVjdCh2YWx1ZS5kYXRhVHJhbnNmZXIpO1xufVxuZnVuY3Rpb24gaXNDaGFuZ2VFdnQodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzT2JqZWN0KHZhbHVlLnRhcmdldCk7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0SW5wdXRGaWxlcyhldnQpIHtcbiAgICByZXR1cm4gZnJvbUxpc3QoZXZ0LnRhcmdldC5maWxlcykubWFwKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiB0b0ZpbGVXaXRoUGF0aChmaWxlKTsgfSk7XG59XG4vLyBFZSBleHBlY3QgZWFjaCBoYW5kbGUgdG8gYmUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1GaWxlSGFuZGxlXG5mdW5jdGlvbiBnZXRGc0hhbmRsZUZpbGVzKGhhbmRsZXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWxlcztcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoZnVuY3Rpb24gKGgpIHsgcmV0dXJuIGguZ2V0RmlsZSgpOyB9KSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVRyYW5zZmVyRmlsZXMoZHQsIHR5cGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpdGVtcywgZmlsZXM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmIChkdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWR0Lml0ZW1zKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBmcm9tTGlzdChkdC5pdGVtcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0ua2luZCA9PT0gJ2ZpbGUnOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSAnZHJhZ3N0YXJ0JyBhbmQgJ2Ryb3AnIGhhcyBhY2Nlc3MgdG8gdGhlIGRhdGEgKHNvdXJjZSBub2RlKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gJ2Ryb3AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaXRlbXNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGl0ZW1zLm1hcCh0b0ZpbGVQcm9taXNlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbm9JZ25vcmVkRmlsZXMoZmxhdHRlbihmaWxlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCBub0lnbm9yZWRGaWxlcyhmcm9tTGlzdChkdC5maWxlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KSldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vSWdub3JlZEZpbGVzKGZpbGVzKSB7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkgeyByZXR1cm4gRklMRVNfVE9fSUdOT1JFLmluZGV4T2YoZmlsZS5uYW1lKSA9PT0gLTE7IH0pO1xufVxuLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5LmZyb20oKVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZnJvbSNCcm93c2VyX2NvbXBhdGliaWxpdHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlTGlzdFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlckl0ZW1MaXN0XG5mdW5jdGlvbiBmcm9tTGlzdChpdGVtcykge1xuICAgIGlmIChpdGVtcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBmaWxlcyA9IFtdO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOiBwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmlsZSA9IGl0ZW1zW2ldO1xuICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVySXRlbVxuZnVuY3Rpb24gdG9GaWxlUHJvbWlzZXMoaXRlbSkge1xuICAgIGlmICh0eXBlb2YgaXRlbS53ZWJraXRHZXRBc0VudHJ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmcm9tRGF0YVRyYW5zZmVySXRlbShpdGVtKTtcbiAgICB9XG4gICAgdmFyIGVudHJ5ID0gaXRlbS53ZWJraXRHZXRBc0VudHJ5KCk7XG4gICAgLy8gU2FmYXJpIHN1cHBvcnRzIGRyb3BwaW5nIGFuIGltYWdlIG5vZGUgZnJvbSBhIGRpZmZlcmVudCB3aW5kb3cgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmdcbiAgICAvLyB0aGUgRGF0YVRyYW5zZmVySXRlbS5nZXRBc0ZpbGUoKSBBUElcbiAgICAvLyBOT1RFOiBGaWxlU3lzdGVtRW50cnkuZmlsZSgpIHRocm93cyBpZiB0cnlpbmcgdG8gZ2V0IHRoZSBmaWxlXG4gICAgaWYgKGVudHJ5ICYmIGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHJldHVybiBmcm9tRGlyRW50cnkoZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSk7XG59XG5mdW5jdGlvbiBmbGF0dGVuKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmaWxlcykgeyByZXR1cm4gX19zcHJlYWQoYWNjLCAoQXJyYXkuaXNBcnJheShmaWxlcykgPyBmbGF0dGVuKGZpbGVzKSA6IFtmaWxlc10pKTsgfSwgW10pO1xufVxuZnVuY3Rpb24gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSkge1xuICAgIHZhciBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGl0ZW0gKyBcIiBpcyBub3QgYSBGaWxlXCIpO1xuICAgIH1cbiAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmd3ApO1xufVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1FbnRyeVxuZnVuY3Rpb24gZnJvbUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW50cnkuaXNEaXJlY3RvcnkgPyBmcm9tRGlyRW50cnkoZW50cnkpIDogZnJvbUZpbGVFbnRyeShlbnRyeSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRGlyZWN0b3J5RW50cnlcbmZ1bmN0aW9uIGZyb21EaXJFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWFkZXIgPSBlbnRyeS5jcmVhdGVSZWFkZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgICBmdW5jdGlvbiByZWFkRW50cmllcygpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZVN5c3RlbURpcmVjdG9yeUVudHJ5L2NyZWF0ZVJlYWRlclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1EaXJlY3RvcnlSZWFkZXIvcmVhZEVudHJpZXNcbiAgICAgICAgICAgIHJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoYmF0Y2gpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZXMsIGVycl8xLCBpdGVtcztcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFiYXRjaC5sZW5ndGgpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGVudHJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IFByb21pc2UuYWxsKGJhdGNoLm1hcChmcm9tRW50cnkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHJlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTsgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZEVudHJpZXMoKTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRmlsZUVudHJ5XG5mdW5jdGlvbiBmcm9tRmlsZUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSwgZW50cnkuZnVsbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmd3ApO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUtc2VsZWN0b3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmIChmaWxlICYmIGFjY2VwdGVkRmlsZXMpIHtcbiAgICB2YXIgYWNjZXB0ZWRGaWxlc0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NlcHRlZEZpbGVzKSA/IGFjY2VwdGVkRmlsZXMgOiBhY2NlcHRlZEZpbGVzLnNwbGl0KCcsJyk7XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICcnO1xuICAgIHZhciBtaW1lVHlwZSA9IChmaWxlLnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGJhc2VNaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICByZXR1cm4gYWNjZXB0ZWRGaWxlc0FycmF5LnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHZhciB2YWxpZFR5cGUgPSB0eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAodmFsaWRUeXBlLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKHZhbGlkVHlwZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbGlkVHlwZS5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcbiAgICAgICAgcmV0dXJuIGJhc2VNaW1lVHlwZSA9PT0gdmFsaWRUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1pbWVUeXBlID09PSB2YWxpZFR5cGU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07IiwiaW1wb3J0IGFjY2VwdHMgZnJvbSAnYXR0ci1hY2NlcHQnXG5cbi8vIEVycm9yIGNvZGVzXG5leHBvcnQgY29uc3QgRklMRV9JTlZBTElEX1RZUEUgPSAnZmlsZS1pbnZhbGlkLXR5cGUnXG5leHBvcnQgY29uc3QgRklMRV9UT09fTEFSR0UgPSAnZmlsZS10b28tbGFyZ2UnXG5leHBvcnQgY29uc3QgRklMRV9UT09fU01BTEwgPSAnZmlsZS10b28tc21hbGwnXG5leHBvcnQgY29uc3QgVE9PX01BTllfRklMRVMgPSAndG9vLW1hbnktZmlsZXMnXG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGUgPSB7XG4gIEZpbGVJbnZhbGlkVHlwZTogRklMRV9JTlZBTElEX1RZUEUsXG4gIEZpbGVUb29MYXJnZTogRklMRV9UT09fTEFSR0UsXG4gIEZpbGVUb29TbWFsbDogRklMRV9UT09fU01BTEwsXG4gIFRvb01hbnlGaWxlczogVE9PX01BTllfRklMRVMsXG59XG5cbi8vIEZpbGUgRXJyb3JzXG5leHBvcnQgY29uc3QgZ2V0SW52YWxpZFR5cGVSZWplY3Rpb25FcnIgPSBhY2NlcHQgPT4ge1xuICBhY2NlcHQgPSBBcnJheS5pc0FycmF5KGFjY2VwdCkgJiYgYWNjZXB0Lmxlbmd0aCA9PT0gMSA/IGFjY2VwdFswXSA6IGFjY2VwdFxuICBjb25zdCBtZXNzYWdlU3VmZml4ID0gQXJyYXkuaXNBcnJheShhY2NlcHQpID8gYG9uZSBvZiAke2FjY2VwdC5qb2luKCcsICcpfWAgOiBhY2NlcHRcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBGSUxFX0lOVkFMSURfVFlQRSxcbiAgICBtZXNzYWdlOiBgRmlsZSB0eXBlIG11c3QgYmUgJHttZXNzYWdlU3VmZml4fWBcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIgPSBtYXhTaXplID0+IHtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBGSUxFX1RPT19MQVJHRSxcbiAgICBtZXNzYWdlOiBgRmlsZSBpcyBsYXJnZXIgdGhhbiAke21heFNpemV9ICR7bWF4U2l6ZSA9PT0gMSA/ICdieXRlJyA6ICdieXRlcyd9YFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUb29TbWFsbFJlamVjdGlvbkVyciA9IG1pblNpemUgPT4ge1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfVE9PX1NNQUxMLFxuICAgIG1lc3NhZ2U6IGBGaWxlIGlzIHNtYWxsZXIgdGhhbiAke21pblNpemV9ICR7bWluU2l6ZSA9PT0gMSA/ICdieXRlJyA6ICdieXRlcyd9YFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBUT09fTUFOWV9GSUxFU19SRUpFQ1RJT04gPSB7XG4gIGNvZGU6IFRPT19NQU5ZX0ZJTEVTLFxuICBtZXNzYWdlOiAnVG9vIG1hbnkgZmlsZXMnXG59XG5cbi8vIEZpcmVmb3ggdmVyc2lvbnMgcHJpb3IgdG8gNTMgcmV0dXJuIGEgYm9ndXMgTUlNRSB0eXBlIGZvciBldmVyeSBmaWxlIGRyYWcsIHNvIGRyYWdvdmVycyB3aXRoXG4vLyB0aGF0IE1JTUUgdHlwZSB3aWxsIGFsd2F5cyBiZSBhY2NlcHRlZFxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVBY2NlcHRlZChmaWxlLCBhY2NlcHQpIHtcbiAgY29uc3QgaXNBY2NlcHRhYmxlID0gZmlsZS50eXBlID09PSAnYXBwbGljYXRpb24veC1tb3otZmlsZScgfHwgYWNjZXB0cyhmaWxlLCBhY2NlcHQpXG4gIHJldHVybiBbaXNBY2NlcHRhYmxlLCBpc0FjY2VwdGFibGUgPyBudWxsIDogZ2V0SW52YWxpZFR5cGVSZWplY3Rpb25FcnIoYWNjZXB0KV1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVNYXRjaFNpemUoZmlsZSwgbWluU2l6ZSwgbWF4U2l6ZSkge1xuICBpZiAoaXNEZWZpbmVkKGZpbGUuc2l6ZSkpIHtcbiAgICBpZiAoaXNEZWZpbmVkKG1pblNpemUpICYmIGlzRGVmaW5lZChtYXhTaXplKSkge1xuICAgICAgaWYgKGZpbGUuc2l6ZSA+IG1heFNpemUpIHJldHVybiBbZmFsc2UsIGdldFRvb0xhcmdlUmVqZWN0aW9uRXJyKG1heFNpemUpXVxuICAgICAgaWYgKGZpbGUuc2l6ZSA8IG1pblNpemUpIHJldHVybiBbZmFsc2UsIGdldFRvb1NtYWxsUmVqZWN0aW9uRXJyKG1pblNpemUpXVxuICAgIH0gZWxzZSBpZiAoaXNEZWZpbmVkKG1pblNpemUpICYmIGZpbGUuc2l6ZSA8IG1pblNpemUpXG4gICAgICByZXR1cm4gW2ZhbHNlLCBnZXRUb29TbWFsbFJlamVjdGlvbkVycihtaW5TaXplKV1cbiAgICBlbHNlIGlmIChpc0RlZmluZWQobWF4U2l6ZSkgJiYgZmlsZS5zaXplID4gbWF4U2l6ZSlcbiAgICAgIHJldHVybiBbZmFsc2UsIGdldFRvb0xhcmdlUmVqZWN0aW9uRXJyKG1heFNpemUpXVxuICB9XG4gIHJldHVybiBbdHJ1ZSwgbnVsbF1cbn1cblxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxGaWxlc0FjY2VwdGVkKHtmaWxlcywgYWNjZXB0LCBtaW5TaXplLCBtYXhTaXplLCBtdWx0aXBsZSwgbWF4RmlsZXN9KSB7XG4gIGlmICgoIW11bHRpcGxlICYmIGZpbGVzLmxlbmd0aCA+IDEpIHx8IChtdWx0aXBsZSAmJiBtYXhGaWxlcyA+PSAxICYmIGZpbGVzLmxlbmd0aCA+IG1heEZpbGVzKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcy5ldmVyeShmaWxlID0+IHtcbiAgICBjb25zdCBbYWNjZXB0ZWRdID0gZmlsZUFjY2VwdGVkKGZpbGUsIGFjY2VwdClcbiAgICBjb25zdCBbc2l6ZU1hdGNoXSA9IGZpbGVNYXRjaFNpemUoZmlsZSwgbWluU2l6ZSwgbWF4U2l6ZSlcbiAgICByZXR1cm4gYWNjZXB0ZWQgJiYgc2l6ZU1hdGNoXG4gIH0pXG59XG5cbi8vIFJlYWN0J3Mgc3ludGhldGljIGV2ZW50cyBoYXMgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQsXG4vLyBidXQgdG8gcmVtYWluIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaWJzIChQcmVhY3QpIGZhbGwgYmFja1xuLy8gdG8gY2hlY2sgZXZlbnQuY2FuY2VsQnViYmxlXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpXG4gIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZXZlbnQuY2FuY2VsQnViYmxlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V2dFdpdGhGaWxlcyhldmVudCkge1xuICBpZiAoIWV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgIHJldHVybiAhIWV2ZW50LnRhcmdldCAmJiAhIWV2ZW50LnRhcmdldC5maWxlc1xuICB9XG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9EYXRhVHJhbnNmZXIvdHlwZXNcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxfRHJhZ19hbmRfRHJvcF9BUEkvUmVjb21tZW5kZWRfZHJhZ190eXBlcyNmaWxlXG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKFxuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcyxcbiAgICB0eXBlID0+IHR5cGUgPT09ICdGaWxlcycgfHwgdHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3gtbW96LWZpbGUnXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2luZEZpbGUoaXRlbSkge1xuICByZXR1cm4gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwgJiYgaXRlbS5raW5kID09PSAnZmlsZSdcbn1cblxuLy8gYWxsb3cgdGhlIGVudGlyZSBkb2N1bWVudCB0byBiZSBhIGRyYWcgdGFyZ2V0XG5leHBvcnQgZnVuY3Rpb24gb25Eb2N1bWVudERyYWdPdmVyKGV2ZW50KSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbn1cblxuZnVuY3Rpb24gaXNJZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIHVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgIT09IC0xIHx8IHVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50LycpICE9PSAtMVxufVxuXG5mdW5jdGlvbiBpc0VkZ2UodXNlckFnZW50KSB7XG4gIHJldHVybiB1c2VyQWdlbnQuaW5kZXhPZignRWRnZS8nKSAhPT0gLTFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSWVPckVkZ2UodXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHtcbiAgcmV0dXJuIGlzSWUodXNlckFnZW50KSB8fCBpc0VkZ2UodXNlckFnZW50KVxufVxuXG4vKipcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjb21wb3NlIGV2ZW50IGhhbmRsZXJzXG4gKiBUaGV5IGFyZSBleGVjdXRlZCBpbiBvcmRlciB1bnRpbCBvbmUgb2YgdGhlbSBjYWxscyBgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKWAuXG4gKiBOb3RlIHRoYXQgdGhlIGNoZWNrIGlzIGRvbmUgb24gdGhlIGZpcnN0IGludm9rZSB0b28sXG4gKiBtZWFuaW5nIHRoYXQgaWYgcHJvcGFnYXRpb24gd2FzIHN0b3BwZWQgYmVmb3JlIGludm9raW5nIHRoZSBmbnMsXG4gKiBubyBoYW5kbGVycyB3aWxsIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZucyB0aGUgZXZlbnQgaGFubGRlciBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgZXZlbnQgaGFuZGxlciB0byBhZGQgdG8gYW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUV2ZW50SGFuZGxlcnMoLi4uZm5zKSB7XG4gIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnNvbWUoZm4gPT4ge1xuICAgICAgaWYgKCFpc1Byb3BhZ2F0aW9uU3RvcHBlZChldmVudCkgJiYgZm4pIHtcbiAgICAgICAgZm4oZXZlbnQsIC4uLmFyZ3MpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpXG4gICAgfSlcbn1cblxuLyoqXG4gKiBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJIGNoZWNrcyBpZiB0aGUgW0ZpbGUgU3lzdGVtIEFjY2VzcyBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlX1N5c3RlbV9BY2Nlc3NfQVBJKVxuICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJKCkge1xuICByZXR1cm4gJ3Nob3dPcGVuRmlsZVBpY2tlcicgaW4gd2luZG93O1xufVxuXG4vKipcbiAqIGZpbGVQaWNrZXJPcHRpb25zVHlwZXMgcmV0dXJucyB0aGUge3R5cGVzfSBvcHRpb24gZm9yIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cvc2hvd09wZW5GaWxlUGlja2VyXG4gKiBiYXNlZCBvbiB0aGUgYWNjZXB0IGF0dHIgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvYXR0ci1hY2NlcHQpXG4gKiBFLmc6IGNvbnZlcnRzIFsnaW1hZ2UvKicsICd0ZXh0LyonXSB0byB7J2ltYWdlLyonOiBbXSwgJ3RleHQvKic6IFtdfVxuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IGFjY2VwdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsZVBpY2tlck9wdGlvbnNUeXBlcyhhY2NlcHQpIHtcbiAgYWNjZXB0ID0gdHlwZW9mIGFjY2VwdCA9PT0gJ3N0cmluZycgPyBhY2NlcHQuc3BsaXQoJywnKSA6IGFjY2VwdFxuICByZXR1cm4gW3tcbiAgICBkZXNjcmlwdGlvbjogJ2V2ZXJ5dGhpbmcnLFxuICAgIC8vIFRPRE86IE5lZWQgdG8gaGFuZGxlIGZpbHRlcmluZyBtb3JlIGVsZWdhbnRseSB0aGFuIHRoaXMhXG4gICAgYWNjZXB0OiBBcnJheS5pc0FycmF5KGFjY2VwdClcbiAgICAgIC8vIEFjY2VwdCBqdXN0IE1JTUUgdHlwZXMgYXMgcGVyIHNwZWNcbiAgICAgIC8vIE5PVEU6IGFjY2VwdCBjYW4gYmUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0L2ZpbGUjdW5pcXVlX2ZpbGVfdHlwZV9zcGVjaWZpZXJzXG4gICAgICA/IGFjY2VwdC5maWx0ZXIoaXRlbSA9PlxuICAgICAgICBpdGVtID09PSAnYXVkaW8vKicgfHxcbiAgICAgICAgaXRlbSA9PT0gJ3ZpZGVvLyonIHx8XG4gICAgICAgIGl0ZW0gPT09ICdpbWFnZS8qJyB8fFxuICAgICAgICBpdGVtID09PSAndGV4dC8qJyB8fFxuICAgICAgICAvXFx3K1xcL1stKy5cXHddKy9nLnRlc3QoaXRlbSlcbiAgICAgICkucmVkdWNlKChhLCBiKSA9PiAoey4uLmEsIFtiXTogW119KSwge30pXG4gICAgICA6IHt9LFxuICB9XTtcbn1cbiIsIi8qIGVzbGludCBwcmVmZXItdGVtcGxhdGU6IDAgKi9cbmltcG9ydCBSZWFjdCwge1xuICBmb3J3YXJkUmVmLFxuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlTWVtbyxcbiAgdXNlUmVkdWNlcixcbiAgdXNlUmVmXG59IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJ1xuaW1wb3J0IHtmcm9tRXZlbnR9IGZyb20gJ2ZpbGUtc2VsZWN0b3InXG5pbXBvcnQge1xuICBhbGxGaWxlc0FjY2VwdGVkLFxuICBjb21wb3NlRXZlbnRIYW5kbGVycyxcbiAgZmlsZUFjY2VwdGVkLFxuICBmaWxlTWF0Y2hTaXplLFxuICBmaWxlUGlja2VyT3B0aW9uc1R5cGVzLFxuICBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJLFxuICBpc0V2dFdpdGhGaWxlcyxcbiAgaXNJZU9yRWRnZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQsXG4gIG9uRG9jdW1lbnREcmFnT3ZlcixcbiAgVE9PX01BTllfRklMRVNfUkVKRUNUSU9OXG59IGZyb20gJy4vdXRpbHMvaW5kZXgnXG5cbi8qKlxuICogQ29udmVuaWVuY2Ugd3JhcHBlciBjb21wb25lbnQgZm9yIHRoZSBgdXNlRHJvcHpvbmVgIGhvb2tcbiAqXG4gKiBgYGBqc3hcbiAqIDxEcm9wem9uZT5cbiAqICAgeyh7Z2V0Um9vdFByb3BzLCBnZXRJbnB1dFByb3BzfSkgPT4gKFxuICogICAgIDxkaXYgey4uLmdldFJvb3RQcm9wcygpfT5cbiAqICAgICAgIDxpbnB1dCB7Li4uZ2V0SW5wdXRQcm9wcygpfSAvPlxuICogICAgICAgPHA+RHJhZyAnbicgZHJvcCBzb21lIGZpbGVzIGhlcmUsIG9yIGNsaWNrIHRvIHNlbGVjdCBmaWxlczwvcD5cbiAqICAgICA8L2Rpdj5cbiAqICAgKX1cbiAqIDwvRHJvcHpvbmU+XG4gKiBgYGBcbiAqL1xuY29uc3QgRHJvcHpvbmUgPSBmb3J3YXJkUmVmKCh7Y2hpbGRyZW4sIC4uLnBhcmFtc30sIHJlZikgPT4ge1xuICBjb25zdCB7b3BlbiwgLi4ucHJvcHN9ID0gdXNlRHJvcHpvbmUocGFyYW1zKVxuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe29wZW59KSwgW29wZW5dKVxuXG4gIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IHJlYWN0LXN0eWxlZ3VpZGlzdCBjYW5ub3QgY3JlYXRlIGRvY3MgaWYgd2UgZG9uJ3QgcmV0dXJuIGEganN4IGVsZW1lbnRcbiAgcmV0dXJuIDxGcmFnbWVudD57Y2hpbGRyZW4oey4uLnByb3BzLCBvcGVufSl9PC9GcmFnbWVudD5cbn0pXG5cbkRyb3B6b25lLmRpc3BsYXlOYW1lID0gJ0Ryb3B6b25lJ1xuXG4vLyBBZGQgZGVmYXVsdCBwcm9wcyBmb3IgcmVhY3QtZG9jZ2VuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgZ2V0RmlsZXNGcm9tRXZlbnQ6IGZyb21FdmVudCxcbiAgbWF4U2l6ZTogSW5maW5pdHksXG4gIG1pblNpemU6IDAsXG4gIG11bHRpcGxlOiB0cnVlLFxuICBtYXhGaWxlczogMCxcbiAgcHJldmVudERyb3BPbkRvY3VtZW50OiB0cnVlLFxuICBub0NsaWNrOiBmYWxzZSxcbiAgbm9LZXlib2FyZDogZmFsc2UsXG4gIG5vRHJhZzogZmFsc2UsXG4gIG5vRHJhZ0V2ZW50c0J1YmJsaW5nOiBmYWxzZSxcbiAgdmFsaWRhdG9yOiBudWxsLFxuICB1c2VGc0FjY2Vzc0FwaTogZmFsc2UsXG59XG5cbkRyb3B6b25lLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wc1xuXG5Ecm9wem9uZS5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBSZW5kZXIgZnVuY3Rpb24gdGhhdCBleHBvc2VzIHRoZSBkcm9wem9uZSBzdGF0ZSBhbmQgcHJvcCBnZXR0ZXIgZm5zXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmdldFJvb3RQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIHRoZSByb290IGRyb3AgY29udGFpbmVyIHlvdSByZW5kZXJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmdldElucHV0UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byBoaWRkZW4gZmlsZSBpbnB1dCB5b3UgcmVuZGVyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtcy5vcGVuIE9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNGb2N1c2VkIERyb3B6b25lIGFyZWEgaXMgaW4gZm9jdXNcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNGaWxlRGlhbG9nQWN0aXZlIEZpbGUgZGlhbG9nIGlzIG9wZW5lZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0RyYWdBY3RpdmUgQWN0aXZlIGRyYWcgaXMgaW4gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNEcmFnQWNjZXB0IERyYWdnZWQgZmlsZXMgYXJlIGFjY2VwdGVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmlzRHJhZ1JlamVjdCBTb21lIGRyYWdnZWQgZmlsZXMgYXJlIHJlamVjdGVkXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBwYXJhbXMuZHJhZ2dlZEZpbGVzIEZpbGVzIGluIGFjdGl2ZSBkcmFnXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBwYXJhbXMuYWNjZXB0ZWRGaWxlcyBBY2NlcHRlZCBmaWxlc1xuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gcGFyYW1zLmZpbGVSZWplY3Rpb25zIFJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFNldCBhY2NlcHRlZCBmaWxlIHR5cGVzLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29rb25ldC9hdHRyLWFjY2VwdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogS2VlcCBpbiBtaW5kIHRoYXQgbWltZSB0eXBlIGRldGVybWluYXRpb24gaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBwbGF0Zm9ybXMuIENTViBmaWxlcyxcbiAgICogZm9yIGV4YW1wbGUsIGFyZSByZXBvcnRlZCBhcyB0ZXh0L3BsYWluIHVuZGVyIG1hY09TIGJ1dCBhcyBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgdW5kZXJcbiAgICogV2luZG93cy4gSW4gc29tZSBjYXNlcyB0aGVyZSBtaWdodCBub3QgYmUgYSBtaW1lIHR5cGUgc2V0IGF0IGFsbC5cbiAgICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzI3NlxuICAgKi9cbiAgYWNjZXB0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKV0pLFxuXG4gIC8qKlxuICAgKiBBbGxvdyBkcmFnICduJyBkcm9wIChvciBzZWxlY3Rpb24gZnJvbSB0aGUgZmlsZSBkaWFsb2cpIG9mIG11bHRpcGxlIGZpbGVzXG4gICAqL1xuICBtdWx0aXBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBhbGxvdyBkcm9wcGVkIGl0ZW1zIHRvIHRha2Ugb3ZlciB0aGUgY3VycmVudCBicm93c2VyIHdpbmRvd1xuICAgKi9cbiAgcHJldmVudERyb3BPbkRvY3VtZW50OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgZGlzYWJsZXMgY2xpY2sgdG8gb3BlbiB0aGUgbmF0aXZlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZ1xuICAgKi9cbiAgbm9DbGljazogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGRpc2FibGVzIFNQQUNFL0VOVEVSIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cuXG4gICAqIE5vdGUgdGhhdCBpdCBhbHNvIHN0b3BzIHRyYWNraW5nIHRoZSBmb2N1cyBzdGF0ZS5cbiAgICovXG4gIG5vS2V5Ym9hcmQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNhYmxlcyBkcmFnICduJyBkcm9wXG4gICAqL1xuICBub0RyYWc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzdG9wcyBkcmFnIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBhcmVudHNcbiAgICovXG4gIG5vRHJhZ0V2ZW50c0J1YmJsaW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogTWluaW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICAgKi9cbiAgbWluU2l6ZTogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogTWF4aW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICAgKi9cbiAgbWF4U2l6ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIE1heGltdW0gYWNjZXB0ZWQgbnVtYmVyIG9mIGZpbGVzXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGhlcmUgaXMgbm8gbGltaXRhdGlvbiB0byBob3cgbWFueSBmaWxlcyBhcmUgYWNjZXB0ZWQuXG4gICAqL1xuICBtYXhGaWxlczogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogRW5hYmxlL2Rpc2FibGUgdGhlIGRyb3B6b25lXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHRvIHByb3ZpZGUgYSBjdXN0b20gZmlsZSBhZ2dyZWdhdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAgICovXG4gIGdldEZpbGVzRnJvbUV2ZW50OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gY2xvc2luZyB0aGUgZmlsZSBkaWFsb2cgd2l0aCBubyBzZWxlY3Rpb25cbiAgICovXG4gIG9uRmlsZURpYWxvZ0NhbmNlbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIG9wZW5pbmcgdGhlIGZpbGUgZGlhbG9nXG4gICAqL1xuICBvbkZpbGVEaWFsb2dPcGVuOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgdG8gdXNlIHRoZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZV9TeXN0ZW1fQWNjZXNzX0FQSVxuICAgKiB0byBvcGVuIHRoZSBmaWxlIHBpY2tlciBpbnN0ZWFkIG9mIHVzaW5nIGFuIGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIGNsaWNrIGV2ZW50LlxuICAgKi9cbiAgdXNlRnNBY2Nlc3NBcGk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyYWdlbnRlcmAgZXZlbnQgb2NjdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ0VudGVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnbGVhdmVgIGV2ZW50IG9jY3Vyc1xuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ0xlYXZlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnb3ZlcmAgZXZlbnQgb2NjdXJzXG4gICAqXG4gICAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudFxuICAgKi9cbiAgb25EcmFnT3ZlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHRoZSBgZ2V0RmlsZXNGcm9tRXZlbnRgIGNhbGxiYWNrIGlzIGRvbmUuXG4gICAqXG4gICAqIEZpbGVzIGFyZSBhY2NlcHRlZCBvciByZWplY3RlZCBiYXNlZCBvbiB0aGUgYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCBhbmQgYG1heFNpemVgIHByb3BzLlxuICAgKiBgYWNjZXB0YCBtdXN0IGJlIGEgdmFsaWQgW01JTUUgdHlwZV0oaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbCkgYWNjb3JkaW5nIHRvIFtpbnB1dCBlbGVtZW50IHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy93aWtpL0hUTUwvRWxlbWVudHMvaW5wdXQvZmlsZSkgb3IgYSB2YWxpZCBmaWxlIGV4dGVuc2lvbi5cbiAgICogSWYgYG11bHRpcGxlYCBpcyBzZXQgdG8gZmFsc2UgYW5kIGFkZGl0aW9uYWwgZmlsZXMgYXJlIGRyb3BwZWQsXG4gICAqIGFsbCBmaWxlcyBiZXNpZGVzIHRoZSBmaXJzdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBBbnkgZmlsZSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2l6ZSBpbiB0aGUgW2BtaW5TaXplYCwgYG1heFNpemVgXSByYW5nZSwgd2lsbCBiZSByZWplY3RlZCBhcyB3ZWxsLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIGBvbkRyb3BgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGludm9rZWQgcmVnYXJkbGVzcyBpZiB0aGUgZHJvcHBlZCBmaWxlcyB3ZXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLlxuICAgKiBJZiB5b3UnZCBsaWtlIHRvIHJlYWN0IHRvIGEgc3BlY2lmaWMgc2NlbmFyaW8sIHVzZSB0aGUgYG9uRHJvcEFjY2VwdGVkYC9gb25Ecm9wUmVqZWN0ZWRgIHByb3BzLlxuICAgKlxuICAgKiBgb25Ecm9wYCB3aWxsIHByb3ZpZGUgeW91IHdpdGggYW4gYXJyYXkgb2YgW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBzZW5kIHRvIGEgc2VydmVyLlxuICAgKiBGb3IgZXhhbXBsZSwgd2l0aCBbU3VwZXJBZ2VudF0oaHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL3N1cGVyYWdlbnQpIGFzIGEgaHR0cC9hamF4IGxpYnJhcnk6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGZ1bmN0aW9uIG9uRHJvcChhY2NlcHRlZEZpbGVzKSB7XG4gICAqICAgY29uc3QgcmVxID0gcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAgICogICBhY2NlcHRlZEZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAqICAgICByZXEuYXR0YWNoKGZpbGUubmFtZSwgZmlsZSlcbiAgICogICB9KVxuICAgKiAgIHJlcS5lbmQoY2FsbGJhY2spXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBhY2NlcHRlZEZpbGVzXG4gICAqIEBwYXJhbSB7RmlsZVJlamVjdGlvbltdfSBmaWxlUmVqZWN0aW9uc1xuICAgKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gICAqL1xuICBvbkRyb3A6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAgICogTm90ZSB0aGF0IGlmIG5vIGZpbGVzIGFyZSBhY2NlcHRlZCwgdGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGaWxlW119IGZpbGVzXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50XG4gICAqL1xuICBvbkRyb3BBY2NlcHRlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICAgKiBOb3RlIHRoYXQgaWYgbm8gZmlsZXMgYXJlIHJlamVjdGVkLCB0aGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gZmlsZVJlamVjdGlvbnNcbiAgICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnRcbiAgICovXG4gIG9uRHJvcFJlamVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cbiAgICogQHBhcmFtIHtGaWxlfSBmaWxlXG4gICAqIEByZXR1cm5zIHtGaWxlRXJyb3J8RmlsZUVycm9yW119XG4gICAqL1xuICB2YWxpZGF0b3I6IFByb3BUeXBlcy5mdW5jXG59XG5cbmV4cG9ydCBkZWZhdWx0IERyb3B6b25lXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJhZ2VudGVyYCxcbiAqIGBkcmFnb3ZlcmAgYW5kIGBkcmFnbGVhdmVgIGV2ZW50cy5cbiAqIEl0IGlzIG5vdCBpbnZva2VkIGlmIHRoZSBpdGVtcyBhcmUgbm90IGZpbGVzIChzdWNoIGFzIGxpbmssIHRleHQsIGV0Yy4pLlxuICpcbiAqIEBjYWxsYmFjayBkcmFnQ2JcbiAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudFxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJvcGAgb3IgaW5wdXQgY2hhbmdlIGV2ZW50LlxuICogSXQgaXMgbm90IGludm9rZWQgaWYgdGhlIGl0ZW1zIGFyZSBub3QgZmlsZXMgKHN1Y2ggYXMgbGluaywgdGV4dCwgZXRjLikuXG4gKlxuICogQGNhbGxiYWNrIGRyb3BDYlxuICogQHBhcmFtIHtGaWxlW119IGFjY2VwdGVkRmlsZXMgTGlzdCBvZiBhY2NlcHRlZCBmaWxlc1xuICogQHBhcmFtIHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zIExpc3Qgb2YgcmVqZWN0ZWQgZmlsZXMgYW5kIHdoeSB0aGV5IHdlcmUgcmVqZWN0ZWRcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyb3BgIG9yIGlucHV0IGNoYW5nZSBldmVudC5cbiAqIEl0IGlzIG5vdCBpbnZva2VkIGlmIHRoZSBpdGVtcyBhcmUgZmlsZXMgKHN1Y2ggYXMgbGluaywgdGV4dCwgZXRjLikuXG4gKlxuICogQGNhbGxiYWNrIGRyb3BBY2NlcHRlZENiXG4gKiBAcGFyYW0ge0ZpbGVbXX0gZmlsZXMgTGlzdCBvZiBhY2NlcHRlZCBmaWxlcyB0aGF0IG1lZXQgdGhlIGdpdmVuIGNyaXRlcmlhXG4gKiAoYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCwgYG1heFNpemVgKVxuICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJvcGAgb3IgaW5wdXQgY2hhbmdlIGV2ZW50LlxuICpcbiAqIEBjYWxsYmFjayBkcm9wUmVqZWN0ZWRDYlxuICogQHBhcmFtIHtGaWxlW119IGZpbGVzIExpc3Qgb2YgcmVqZWN0ZWQgZmlsZXMgdGhhdCBkbyBub3QgbWVldCB0aGUgZ2l2ZW4gY3JpdGVyaWFcbiAqIChgYWNjZXB0YCwgYG11bHRpcGxlYCwgYG1pblNpemVgLCBgbWF4U2l6ZWApXG4gKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCBhZ2dyZWdhdGUgZmlsZXMsXG4gKiBpbiBhIGFzeW5jaHJvbm91cyBmYXNoaW9uLCBmcm9tIGRyYWcgb3IgaW5wdXQgY2hhbmdlIGV2ZW50cy5cbiAqXG4gKiBAY2FsbGJhY2sgZ2V0RmlsZXNGcm9tRXZlbnRcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqIEByZXR1cm5zIHsoRmlsZVtdfFByb21pc2U8RmlsZVtdPil9XG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBkcm9wem9uZSBzdGF0ZSBhbmQgc29tZSBoZWxwZXIgZnVuY3Rpb25zLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERyb3B6b25lU3RhdGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFJvb3RQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIHRoZSByb290IGRyb3AgY29udGFpbmVyIHlvdSByZW5kZXJcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldElucHV0UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byBoaWRkZW4gZmlsZSBpbnB1dCB5b3UgcmVuZGVyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBvcGVuIE9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGb2N1c2VkIERyb3B6b25lIGFyZWEgaXMgaW4gZm9jdXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGaWxlRGlhbG9nQWN0aXZlIEZpbGUgZGlhbG9nIGlzIG9wZW5lZFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0RyYWdBY3RpdmUgQWN0aXZlIGRyYWcgaXMgaW4gcHJvZ3Jlc3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNEcmFnQWNjZXB0IERyYWdnZWQgZmlsZXMgYXJlIGFjY2VwdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRHJhZ1JlamVjdCBTb21lIGRyYWdnZWQgZmlsZXMgYXJlIHJlamVjdGVkXG4gKiBAcHJvcGVydHkge0ZpbGVbXX0gZHJhZ2dlZEZpbGVzIEZpbGVzIGluIGFjdGl2ZSBkcmFnXG4gKiBAcHJvcGVydHkge0ZpbGVbXX0gYWNjZXB0ZWRGaWxlcyBBY2NlcHRlZCBmaWxlc1xuICogQHByb3BlcnR5IHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zIFJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gKi9cblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICBpc0ZpbGVEaWFsb2dBY3RpdmU6IGZhbHNlLFxuICBpc0RyYWdBY3RpdmU6IGZhbHNlLFxuICBpc0RyYWdBY2NlcHQ6IGZhbHNlLFxuICBpc0RyYWdSZWplY3Q6IGZhbHNlLFxuICBkcmFnZ2VkRmlsZXM6IFtdLFxuICBhY2NlcHRlZEZpbGVzOiBbXSxcbiAgZmlsZVJlamVjdGlvbnM6IFtdXG59XG5cbi8qKlxuICogQSBSZWFjdCBob29rIHRoYXQgY3JlYXRlcyBhIGRyYWcgJ24nIGRyb3AgYXJlYS5cbiAqXG4gKiBgYGBqc3hcbiAqIGZ1bmN0aW9uIE15RHJvcHpvbmUocHJvcHMpIHtcbiAqICAgY29uc3Qge2dldFJvb3RQcm9wcywgZ2V0SW5wdXRQcm9wc30gPSB1c2VEcm9wem9uZSh7XG4gKiAgICAgb25Ecm9wOiBhY2NlcHRlZEZpbGVzID0+IHtcbiAqICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBGaWxlIG9iamVjdHMsIGUuZy4gdXBsb2FkIHRvIHNvbWUgc2VydmVyXG4gKiAgICAgfVxuICogICB9KTtcbiAqICAgcmV0dXJuIChcbiAqICAgICA8ZGl2IHsuLi5nZXRSb290UHJvcHMoKX0+XG4gKiAgICAgICA8aW5wdXQgey4uLmdldElucHV0UHJvcHMoKX0gLz5cbiAqICAgICAgIDxwPkRyYWcgYW5kIGRyb3Agc29tZSBmaWxlcyBoZXJlLCBvciBjbGljayB0byBzZWxlY3QgZmlsZXM8L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgIClcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBmdW5jdGlvbiB1c2VEcm9wem9uZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFtwcm9wcy5hY2NlcHRdIFNldCBhY2NlcHRlZCBmaWxlIHR5cGVzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvYXR0ci1hY2NlcHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBLZWVwIGluIG1pbmQgdGhhdCBtaW1lIHR5cGUgZGV0ZXJtaW5hdGlvbiBpcyBub3QgcmVsaWFibGUgYWNyb3NzIHBsYXRmb3Jtcy4gQ1NWIGZpbGVzLFxuICogZm9yIGV4YW1wbGUsIGFyZSByZXBvcnRlZCBhcyB0ZXh0L3BsYWluIHVuZGVyIG1hY09TIGJ1dCBhcyBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgdW5kZXJcbiAqIFdpbmRvd3MuIEluIHNvbWUgY2FzZXMgdGhlcmUgbWlnaHQgbm90IGJlIGEgbWltZSB0eXBlIHNldCBhdCBhbGwuXG4gKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvMjc2XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5tdWx0aXBsZT10cnVlXSBBbGxvdyBkcmFnICduJyBkcm9wIChvciBzZWxlY3Rpb24gZnJvbSB0aGUgZmlsZSBkaWFsb2cpIG9mIG11bHRpcGxlIGZpbGVzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5wcmV2ZW50RHJvcE9uRG9jdW1lbnQ9dHJ1ZV0gSWYgZmFsc2UsIGFsbG93IGRyb3BwZWQgaXRlbXMgdG8gdGFrZSBvdmVyIHRoZSBjdXJyZW50IGJyb3dzZXIgd2luZG93XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0NsaWNrPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBjbGljayB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0tleWJvYXJkPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBTUEFDRS9FTlRFUiB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nLlxuICogTm90ZSB0aGF0IGl0IGFsc28gc3RvcHMgdHJhY2tpbmcgdGhlIGZvY3VzIHN0YXRlLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMubm9EcmFnPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBkcmFnICduJyBkcm9wXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0RyYWdFdmVudHNCdWJibGluZz1mYWxzZV0gSWYgdHJ1ZSwgc3RvcHMgZHJhZyBldmVudCBwcm9wYWdhdGlvbiB0byBwYXJlbnRzXG4gKiBAcGFyYW0ge251bWJlcn0gW3Byb3BzLm1pblNpemU9MF0gTWluaW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICogQHBhcmFtIHtudW1iZXJ9IFtwcm9wcy5tYXhTaXplPUluZmluaXR5XSBNYXhpbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5kaXNhYmxlZD1mYWxzZV0gRW5hYmxlL2Rpc2FibGUgdGhlIGRyb3B6b25lXG4gKiBAcGFyYW0ge2dldEZpbGVzRnJvbUV2ZW50fSBbcHJvcHMuZ2V0RmlsZXNGcm9tRXZlbnRdIFVzZSB0aGlzIHRvIHByb3ZpZGUgYSBjdXN0b20gZmlsZSBhZ2dyZWdhdG9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcHMub25GaWxlRGlhbG9nQ2FuY2VsXSBDYiBmb3Igd2hlbiBjbG9zaW5nIHRoZSBmaWxlIGRpYWxvZyB3aXRoIG5vIHNlbGVjdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMudXNlRnNBY2Nlc3NBcGldIFNldCB0byB0cnVlIHRvIHVzZSB0aGUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUElcbiAqIHRvIG9wZW4gdGhlIGZpbGUgcGlja2VyIGluc3RlYWQgb2YgdXNpbmcgYW4gYDxpbnB1dCB0eXBlPVwiZmlsZVwiPmAgY2xpY2sgZXZlbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcHMub25GaWxlRGlhbG9nT3Blbl0gQ2IgZm9yIHdoZW4gb3BlbmluZyB0aGUgZmlsZSBkaWFsb2dcbiAqIEBwYXJhbSB7ZHJhZ0NifSBbcHJvcHMub25EcmFnRW50ZXJdIENiIGZvciB3aGVuIHRoZSBgZHJhZ2VudGVyYCBldmVudCBvY2N1cnMuXG4gKiBAcGFyYW0ge2RyYWdDYn0gW3Byb3BzLm9uRHJhZ0xlYXZlXSBDYiBmb3Igd2hlbiB0aGUgYGRyYWdsZWF2ZWAgZXZlbnQgb2NjdXJzXG4gKiBAcGFyYW0ge2RyYWdDYn0gW3Byb3BzLm9uRHJhZ092ZXJdIENiIGZvciB3aGVuIHRoZSBgZHJhZ292ZXJgIGV2ZW50IG9jY3Vyc1xuICogQHBhcmFtIHtkcm9wQ2J9IFtwcm9wcy5vbkRyb3BdIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICogTm90ZSB0aGF0IHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBhZnRlciB0aGUgYGdldEZpbGVzRnJvbUV2ZW50YCBjYWxsYmFjayBpcyBkb25lLlxuICpcbiAqIEZpbGVzIGFyZSBhY2NlcHRlZCBvciByZWplY3RlZCBiYXNlZCBvbiB0aGUgYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCBhbmQgYG1heFNpemVgIHByb3BzLlxuICogYGFjY2VwdGAgbXVzdCBiZSBhIHZhbGlkIFtNSU1FIHR5cGVdKGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWwpIGFjY29yZGluZyB0byBbaW5wdXQgZWxlbWVudCBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy53My5vcmcvd2lraS9IVE1ML0VsZW1lbnRzL2lucHV0L2ZpbGUpIG9yIGEgdmFsaWQgZmlsZSBleHRlbnNpb24uXG4gKiBJZiBgbXVsdGlwbGVgIGlzIHNldCB0byBmYWxzZSBhbmQgYWRkaXRpb25hbCBmaWxlcyBhcmUgZHJvcHBlZCxcbiAqIGFsbCBmaWxlcyBiZXNpZGVzIHRoZSBmaXJzdCB3aWxsIGJlIHJlamVjdGVkLlxuICogQW55IGZpbGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHNpemUgaW4gdGhlIFtgbWluU2l6ZWAsIGBtYXhTaXplYF0gcmFuZ2UsIHdpbGwgYmUgcmVqZWN0ZWQgYXMgd2VsbC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGBvbkRyb3BgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGludm9rZWQgcmVnYXJkbGVzcyBpZiB0aGUgZHJvcHBlZCBmaWxlcyB3ZXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLlxuICogSWYgeW91J2QgbGlrZSB0byByZWFjdCB0byBhIHNwZWNpZmljIHNjZW5hcmlvLCB1c2UgdGhlIGBvbkRyb3BBY2NlcHRlZGAvYG9uRHJvcFJlamVjdGVkYCBwcm9wcy5cbiAqXG4gKiBgb25Ecm9wYCB3aWxsIHByb3ZpZGUgeW91IHdpdGggYW4gYXJyYXkgb2YgW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBzZW5kIHRvIGEgc2VydmVyLlxuICogRm9yIGV4YW1wbGUsIHdpdGggW1N1cGVyQWdlbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS92aXNpb25tZWRpYS9zdXBlcmFnZW50KSBhcyBhIGh0dHAvYWpheCBsaWJyYXJ5OlxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBvbkRyb3AoYWNjZXB0ZWRGaWxlcykge1xuICogICBjb25zdCByZXEgPSByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICBhY2NlcHRlZEZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gKiAgICAgcmVxLmF0dGFjaChmaWxlLm5hbWUsIGZpbGUpXG4gKiAgIH0pXG4gKiAgIHJlcS5lbmQoY2FsbGJhY2spXG4gKiB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7ZHJvcEFjY2VwdGVkQ2J9IFtwcm9wcy5vbkRyb3BBY2NlcHRlZF1cbiAqIEBwYXJhbSB7ZHJvcFJlamVjdGVkQ2J9IFtwcm9wcy5vbkRyb3BSZWplY3RlZF1cbiAqXG4gKiBAcmV0dXJucyB7RHJvcHpvbmVTdGF0ZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3B6b25lKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYWNjZXB0LFxuICAgIGRpc2FibGVkLFxuICAgIGdldEZpbGVzRnJvbUV2ZW50LFxuICAgIG1heFNpemUsXG4gICAgbWluU2l6ZSxcbiAgICBtdWx0aXBsZSxcbiAgICBtYXhGaWxlcyxcbiAgICBvbkRyYWdFbnRlcixcbiAgICBvbkRyYWdMZWF2ZSxcbiAgICBvbkRyYWdPdmVyLFxuICAgIG9uRHJvcCxcbiAgICBvbkRyb3BBY2NlcHRlZCxcbiAgICBvbkRyb3BSZWplY3RlZCxcbiAgICBvbkZpbGVEaWFsb2dDYW5jZWwsXG4gICAgb25GaWxlRGlhbG9nT3BlbixcbiAgICB1c2VGc0FjY2Vzc0FwaSxcbiAgICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQsXG4gICAgbm9DbGljayxcbiAgICBub0tleWJvYXJkLFxuICAgIG5vRHJhZyxcbiAgICBub0RyYWdFdmVudHNCdWJibGluZyxcbiAgICB2YWxpZGF0b3JcbiAgfSA9IHtcbiAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgLi4ub3B0aW9uc1xuICB9XG5cbiAgY29uc3Qgb25GaWxlRGlhbG9nT3BlbkNiID0gdXNlTWVtbyhcbiAgICAoKSA9PiB0eXBlb2Ygb25GaWxlRGlhbG9nT3BlbiA9PT0gJ2Z1bmN0aW9uJyA/IG9uRmlsZURpYWxvZ09wZW4gOiBub29wLFxuICAgIFtvbkZpbGVEaWFsb2dPcGVuXSlcbiAgY29uc3Qgb25GaWxlRGlhbG9nQ2FuY2VsQ2IgPSB1c2VNZW1vKFxuICAgICgpID0+IHR5cGVvZiBvbkZpbGVEaWFsb2dDYW5jZWwgPT09ICdmdW5jdGlvbicgPyBvbkZpbGVEaWFsb2dDYW5jZWwgOiBub29wLFxuICAgIFtvbkZpbGVEaWFsb2dDYW5jZWxdKVxuXG4gIGNvbnN0IHJvb3RSZWYgPSB1c2VSZWYobnVsbClcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWYobnVsbClcblxuICBjb25zdCBbc3RhdGUsIGRpc3BhdGNoXSA9IHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbFN0YXRlKVxuICBjb25zdCB7aXNGb2N1c2VkLCBpc0ZpbGVEaWFsb2dBY3RpdmUsIGRyYWdnZWRGaWxlc30gPSBzdGF0ZVxuXG4gIC8vIFVwZGF0ZSBmaWxlIGRpYWxvZyBhY3RpdmUgc3RhdGUgd2hlbiB0aGUgd2luZG93IGlzIGZvY3VzZWQgb25cbiAgY29uc3Qgb25XaW5kb3dGb2N1cyA9ICgpID0+IHtcbiAgICAvLyBFeGVjdXRlIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGZpbGUgZGlhbG9nIGlzIG9wZW5lZCBpbiB0aGUgYnJvd3NlclxuICAgIGlmIChpc0ZpbGVEaWFsb2dBY3RpdmUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGNvbnN0IHtmaWxlc30gPSBpbnB1dFJlZi5jdXJyZW50XG5cbiAgICAgICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goe3R5cGU6ICdjbG9zZURpYWxvZyd9KVxuICAgICAgICAgICAgb25GaWxlRGlhbG9nQ2FuY2VsQ2IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMzAwKVxuICAgIH1cbiAgfVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh1c2VGc0FjY2Vzc0FwaSAmJiBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJKCkpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7fVxuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIG9uV2luZG93Rm9jdXMsIGZhbHNlKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBvbldpbmRvd0ZvY3VzLCBmYWxzZSlcbiAgICB9XG4gIH0sIFtpbnB1dFJlZiwgaXNGaWxlRGlhbG9nQWN0aXZlLCBvbkZpbGVEaWFsb2dDYW5jZWxDYiwgdXNlRnNBY2Nlc3NBcGldKVxuXG4gIGNvbnN0IGRyYWdUYXJnZXRzUmVmID0gdXNlUmVmKFtdKVxuICBjb25zdCBvbkRvY3VtZW50RHJvcCA9IGV2ZW50ID0+IHtcbiAgICBpZiAocm9vdFJlZi5jdXJyZW50ICYmIHJvb3RSZWYuY3VycmVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAvLyBJZiB3ZSBpbnRlcmNlcHRlZCBhbiBldmVudCBmb3Igb3VyIGluc3RhbmNlLCBsZXQgaXQgcHJvcGFnYXRlIGRvd24gdG8gdGhlIGluc3RhbmNlJ3Mgb25Ecm9wIGhhbmRsZXJcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZHJhZ1RhcmdldHNSZWYuY3VycmVudCA9IFtdXG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwcmV2ZW50RHJvcE9uRG9jdW1lbnQpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgb25Eb2N1bWVudERyYWdPdmVyLCBmYWxzZSlcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBvbkRvY3VtZW50RHJvcCwgZmFsc2UpXG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChwcmV2ZW50RHJvcE9uRG9jdW1lbnQpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBvbkRvY3VtZW50RHJhZ092ZXIpXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBvbkRvY3VtZW50RHJvcClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtyb290UmVmLCBwcmV2ZW50RHJvcE9uRG9jdW1lbnRdKVxuXG4gIGNvbnN0IG9uRHJhZ0VudGVyQ2IgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAvLyBQZXJzaXN0IGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZSBldmVudCBsYXRlciBhZnRlciBnZXRGaWxlc0Zyb21FdmVudCgpIGlzIGRvbmVcbiAgICAgIGV2ZW50LnBlcnNpc3QoKVxuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KVxuXG4gICAgICBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50ID0gWy4uLmRyYWdUYXJnZXRzUmVmLmN1cnJlbnQsIGV2ZW50LnRhcmdldF1cblxuICAgICAgaWYgKGlzRXZ0V2l0aEZpbGVzKGV2ZW50KSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoZ2V0RmlsZXNGcm9tRXZlbnQoZXZlbnQpKS50aGVuKGRyYWdnZWRGaWxlcyA9PiB7XG4gICAgICAgICAgaWYgKGlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiAhbm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIGRyYWdnZWRGaWxlcyxcbiAgICAgICAgICAgIGlzRHJhZ0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6ICdzZXREcmFnZ2VkRmlsZXMnXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChvbkRyYWdFbnRlcikge1xuICAgICAgICAgICAgb25EcmFnRW50ZXIoZXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW2dldEZpbGVzRnJvbUV2ZW50LCBvbkRyYWdFbnRlciwgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gIClcblxuICBjb25zdCBvbkRyYWdPdmVyQ2IgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBldmVudC5wZXJzaXN0KClcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudClcblxuICAgICAgY29uc3QgaGFzRmlsZXMgPSBpc0V2dFdpdGhGaWxlcyhldmVudCk7XG4gICAgICBpZiAoaGFzRmlsZXMgJiYgZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSdcbiAgICAgICAgfSBjYXRjaCB7fSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5ICovXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNGaWxlcyAmJiBvbkRyYWdPdmVyKSB7XG4gICAgICAgIG9uRHJhZ092ZXIoZXZlbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gICAgW29uRHJhZ092ZXIsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApXG5cbiAgY29uc3Qgb25EcmFnTGVhdmVDYiA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnBlcnNpc3QoKVxuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KVxuXG4gICAgICAvLyBPbmx5IGRlYWN0aXZhdGUgb25jZSB0aGUgZHJvcHpvbmUgYW5kIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gbGVmdFxuICAgICAgY29uc3QgdGFyZ2V0cyA9IGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQuZmlsdGVyKFxuICAgICAgICB0YXJnZXQgPT4gcm9vdFJlZi5jdXJyZW50ICYmIHJvb3RSZWYuY3VycmVudC5jb250YWlucyh0YXJnZXQpXG4gICAgICApXG4gICAgICAvLyBNYWtlIHN1cmUgdG8gcmVtb3ZlIGEgdGFyZ2V0IHByZXNlbnQgbXVsdGlwbGUgdGltZXMgb25seSBvbmNlXG4gICAgICAvLyAoRmlyZWZveCBtYXkgZmlyZSBkcmFnZW50ZXIvZHJhZ2xlYXZlIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGVsZW1lbnQpXG4gICAgICBjb25zdCB0YXJnZXRJZHggPSB0YXJnZXRzLmluZGV4T2YoZXZlbnQudGFyZ2V0KVxuICAgICAgaWYgKHRhcmdldElkeCAhPT0gLTEpIHtcbiAgICAgICAgdGFyZ2V0cy5zcGxpY2UodGFyZ2V0SWR4LCAxKVxuICAgICAgfVxuICAgICAgZHJhZ1RhcmdldHNSZWYuY3VycmVudCA9IHRhcmdldHNcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgaXNEcmFnQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogJ3NldERyYWdnZWRGaWxlcycsXG4gICAgICAgIGRyYWdnZWRGaWxlczogW11cbiAgICAgIH0pXG5cbiAgICAgIGlmIChpc0V2dFdpdGhGaWxlcyhldmVudCkgJiYgb25EcmFnTGVhdmUpIHtcbiAgICAgICAgb25EcmFnTGVhdmUoZXZlbnQpXG4gICAgICB9XG4gICAgfSxcbiAgICBbcm9vdFJlZiwgb25EcmFnTGVhdmUsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApXG5cbiAgY29uc3Qgc2V0RmlsZXMgPSB1c2VDYWxsYmFjaygoZmlsZXMsIGV2ZW50KSA9PiB7XG4gICAgY29uc3QgYWNjZXB0ZWRGaWxlcyA9IFtdXG4gICAgY29uc3QgZmlsZVJlamVjdGlvbnMgPSBbXVxuXG4gICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGNvbnN0IFthY2NlcHRlZCwgYWNjZXB0RXJyb3JdID0gZmlsZUFjY2VwdGVkKGZpbGUsIGFjY2VwdClcbiAgICAgIGNvbnN0IFtzaXplTWF0Y2gsIHNpemVFcnJvcl0gPSBmaWxlTWF0Y2hTaXplKGZpbGUsIG1pblNpemUsIG1heFNpemUpXG4gICAgICBjb25zdCBjdXN0b21FcnJvcnMgPSB2YWxpZGF0b3IgPyB2YWxpZGF0b3IoZmlsZSkgOiBudWxsO1xuXG4gICAgICBpZiAoYWNjZXB0ZWQgJiYgc2l6ZU1hdGNoICYmICFjdXN0b21FcnJvcnMpIHtcbiAgICAgICAgYWNjZXB0ZWRGaWxlcy5wdXNoKGZpbGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZXJyb3JzID0gW2FjY2VwdEVycm9yLCBzaXplRXJyb3JdO1xuXG4gICAgICAgIGlmIChjdXN0b21FcnJvcnMpIHtcbiAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KGN1c3RvbUVycm9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICBmaWxlUmVqZWN0aW9ucy5wdXNoKHtmaWxlLCBlcnJvcnM6IGVycm9ycy5maWx0ZXIoZSA9PiBlKX0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmICgoIW11bHRpcGxlICYmIGFjY2VwdGVkRmlsZXMubGVuZ3RoID4gMSkgfHwgKG11bHRpcGxlICYmIG1heEZpbGVzID49IDEgJiYgYWNjZXB0ZWRGaWxlcy5sZW5ndGggPiBtYXhGaWxlcykpIHtcbiAgICAgIC8vIFJlamVjdCBldmVyeXRoaW5nIGFuZCBlbXB0eSBhY2NlcHRlZCBmaWxlc1xuICAgICAgYWNjZXB0ZWRGaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICBmaWxlUmVqZWN0aW9ucy5wdXNoKHtmaWxlLCBlcnJvcnM6IFtUT09fTUFOWV9GSUxFU19SRUpFQ1RJT05dfSlcbiAgICAgIH0pXG4gICAgICBhY2NlcHRlZEZpbGVzLnNwbGljZSgwKVxuICAgIH1cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIGFjY2VwdGVkRmlsZXMsXG4gICAgICBmaWxlUmVqZWN0aW9ucyxcbiAgICAgIHR5cGU6ICdzZXRGaWxlcydcbiAgICB9KVxuXG4gICAgaWYgKG9uRHJvcCkge1xuICAgICAgb25Ecm9wKGFjY2VwdGVkRmlsZXMsIGZpbGVSZWplY3Rpb25zLCBldmVudClcbiAgICB9XG5cbiAgICBpZiAoZmlsZVJlamVjdGlvbnMubGVuZ3RoID4gMCAmJiBvbkRyb3BSZWplY3RlZCkge1xuICAgICAgb25Ecm9wUmVqZWN0ZWQoZmlsZVJlamVjdGlvbnMsIGV2ZW50KVxuICAgIH1cblxuICAgIGlmIChhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IDAgJiYgb25Ecm9wQWNjZXB0ZWQpIHtcbiAgICAgIG9uRHJvcEFjY2VwdGVkKGFjY2VwdGVkRmlsZXMsIGV2ZW50KVxuICAgIH1cbiAgfSwgW1xuICAgIGRpc3BhdGNoLFxuICAgIG11bHRpcGxlLFxuICAgIGFjY2VwdCxcbiAgICBtaW5TaXplLFxuICAgIG1heFNpemUsXG4gICAgbWF4RmlsZXMsXG4gICAgb25Ecm9wLFxuICAgIG9uRHJvcEFjY2VwdGVkLFxuICAgIG9uRHJvcFJlamVjdGVkLFxuICAgIHZhbGlkYXRvclxuICBdKTtcblxuICBjb25zdCBvbkRyb3BDYiA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIC8vIFBlcnNpc3QgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdGhlIGV2ZW50IGxhdGVyIGFmdGVyIGdldEZpbGVzRnJvbUV2ZW50KCkgaXMgZG9uZVxuICAgICAgZXZlbnQucGVyc2lzdCgpXG4gICAgICBzdG9wUHJvcGFnYXRpb24oZXZlbnQpXG5cbiAgICAgIGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQgPSBbXVxuXG4gICAgICBpZiAoaXNFdnRXaXRoRmlsZXMoZXZlbnQpKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShnZXRGaWxlc0Zyb21FdmVudChldmVudCkpLnRoZW4oZmlsZXMgPT4ge1xuICAgICAgICAgIGlmIChpc1Byb3BhZ2F0aW9uU3RvcHBlZChldmVudCkgJiYgIW5vRHJhZ0V2ZW50c0J1YmJsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0RmlsZXMoZmlsZXMsIGV2ZW50KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZGlzcGF0Y2goe3R5cGU6ICdyZXNldCd9KVxuICAgIH0sXG4gICAgW1xuICAgICAgZ2V0RmlsZXNGcm9tRXZlbnQsXG4gICAgICBzZXRGaWxlcyxcbiAgICAgIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXG4gICAgXVxuICApXG5cbiAgLy8gRm4gZm9yIG9wZW5pbmcgdGhlIGZpbGUgZGlhbG9nIHByb2dyYW1tYXRpY2FsbHlcbiAgY29uc3Qgb3BlbkZpbGVEaWFsb2cgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKHVzZUZzQWNjZXNzQXBpICYmIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkoKSkge1xuICAgICAgZGlzcGF0Y2goe3R5cGU6ICdvcGVuRGlhbG9nJ30pXG4gICAgICBvbkZpbGVEaWFsb2dPcGVuQ2IoKVxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy9zaG93T3BlbkZpbGVQaWNrZXJcbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIG11bHRpcGxlLFxuICAgICAgICB0eXBlczogZmlsZVBpY2tlck9wdGlvbnNUeXBlcyhhY2NlcHQpXG4gICAgICB9O1xuICAgICAgd2luZG93LnNob3dPcGVuRmlsZVBpY2tlcihvcHRzKVxuICAgICAgICAudGhlbihoYW5kbGVzID0+IGdldEZpbGVzRnJvbUV2ZW50KGhhbmRsZXMpKVxuICAgICAgICAudGhlbihmaWxlcyA9PiBzZXRGaWxlcyhmaWxlcywgbnVsbCkpXG4gICAgICAgIC5jYXRjaChlID0+IG9uRmlsZURpYWxvZ0NhbmNlbENiKGUpKVxuICAgICAgICAuZmluYWxseSgoKSA9PiBkaXNwYXRjaCh7dHlwZTogJ2Nsb3NlRGlhbG9nJ30pKTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBkaXNwYXRjaCh7dHlwZTogJ29wZW5EaWFsb2cnfSlcbiAgICAgIG9uRmlsZURpYWxvZ09wZW5DYigpXG4gICAgICBpbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gbnVsbFxuICAgICAgaW5wdXRSZWYuY3VycmVudC5jbGljaygpXG4gICAgfVxuICB9LCBbXG4gICAgZGlzcGF0Y2gsXG4gICAgb25GaWxlRGlhbG9nT3BlbkNiLFxuICAgIG9uRmlsZURpYWxvZ0NhbmNlbENiLFxuICAgIHVzZUZzQWNjZXNzQXBpLFxuICAgIHNldEZpbGVzLFxuICAgIGFjY2VwdCxcbiAgICBtdWx0aXBsZVxuICBdKVxuXG4gIC8vIENiIHRvIG9wZW4gdGhlIGZpbGUgZGlhbG9nIHdoZW4gU1BBQ0UvRU5URVIgb2NjdXJzIG9uIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbktleURvd25DYiA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIC8vIElnbm9yZSBrZXlib2FyZCBldmVudHMgYnViYmxpbmcgdXAgdGhlIERPTSB0cmVlXG4gICAgICBpZiAoIXJvb3RSZWYuY3VycmVudCB8fCAhcm9vdFJlZi5jdXJyZW50LmlzRXF1YWxOb2RlKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAzMiB8fCBldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIG9wZW5GaWxlRGlhbG9nKClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyb290UmVmLCBpbnB1dFJlZiwgb3BlbkZpbGVEaWFsb2ddXG4gIClcblxuICAvLyBVcGRhdGUgZm9jdXMgc3RhdGUgZm9yIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbkZvY3VzQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZGlzcGF0Y2goe3R5cGU6ICdmb2N1cyd9KVxuICB9LCBbXSlcbiAgY29uc3Qgb25CbHVyQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZGlzcGF0Y2goe3R5cGU6ICdibHVyJ30pXG4gIH0sIFtdKVxuXG4gIC8vIENiIHRvIG9wZW4gdGhlIGZpbGUgZGlhbG9nIHdoZW4gY2xpY2sgb2NjdXJzIG9uIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbkNsaWNrQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKG5vQ2xpY2spIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEluIElFMTEvRWRnZSB0aGUgZmlsZS1icm93c2VyIGRpYWxvZyBpcyBibG9ja2luZywgdGhlcmVmb3JlLCB1c2Ugc2V0VGltZW91dCgpXG4gICAgLy8gdG8gZW5zdXJlIFJlYWN0IGNhbiBoYW5kbGUgc3RhdGUgY2hhbmdlc1xuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL3JlYWN0LWRyb3B6b25lL2lzc3Vlcy80NTBcbiAgICBpZiAoaXNJZU9yRWRnZSgpKSB7XG4gICAgICBzZXRUaW1lb3V0KG9wZW5GaWxlRGlhbG9nLCAwKVxuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuRmlsZURpYWxvZygpXG4gICAgfVxuICB9LCBbaW5wdXRSZWYsIG5vQ2xpY2ssIG9wZW5GaWxlRGlhbG9nXSlcblxuICBjb25zdCBjb21wb3NlSGFuZGxlciA9IGZuID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPyBudWxsIDogZm5cbiAgfVxuXG4gIGNvbnN0IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIgPSBmbiA9PiB7XG4gICAgcmV0dXJuIG5vS2V5Ym9hcmQgPyBudWxsIDogY29tcG9zZUhhbmRsZXIoZm4pXG4gIH1cblxuICBjb25zdCBjb21wb3NlRHJhZ0hhbmRsZXIgPSBmbiA9PiB7XG4gICAgcmV0dXJuIG5vRHJhZyA/IG51bGwgOiBjb21wb3NlSGFuZGxlcihmbilcbiAgfVxuXG4gIGNvbnN0IHN0b3BQcm9wYWdhdGlvbiA9IGV2ZW50ID0+IHtcbiAgICBpZiAobm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZ2V0Um9vdFByb3BzID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgcmVmS2V5ID0gJ3JlZicsXG4gICAgICByb2xlLFxuICAgICAgb25LZXlEb3duLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBvbkRyYWdFbnRlcixcbiAgICAgIG9uRHJhZ092ZXIsXG4gICAgICBvbkRyYWdMZWF2ZSxcbiAgICAgIG9uRHJvcCxcbiAgICAgIC4uLnJlc3RcbiAgICB9ID0ge30pID0+ICh7XG4gICAgICBvbktleURvd246IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25LZXlEb3duLCBvbktleURvd25DYikpLFxuICAgICAgb25Gb2N1czogY29tcG9zZUtleWJvYXJkSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkZvY3VzLCBvbkZvY3VzQ2IpKSxcbiAgICAgIG9uQmx1cjogY29tcG9zZUtleWJvYXJkSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkJsdXIsIG9uQmx1ckNiKSksXG4gICAgICBvbkNsaWNrOiBjb21wb3NlSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkNsaWNrLCBvbkNsaWNrQ2IpKSxcbiAgICAgIG9uRHJhZ0VudGVyOiBjb21wb3NlRHJhZ0hhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25EcmFnRW50ZXIsIG9uRHJhZ0VudGVyQ2IpKSxcbiAgICAgIG9uRHJhZ092ZXI6IGNvbXBvc2VEcmFnSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyYWdPdmVyLCBvbkRyYWdPdmVyQ2IpKSxcbiAgICAgIG9uRHJhZ0xlYXZlOiBjb21wb3NlRHJhZ0hhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25EcmFnTGVhdmUsIG9uRHJhZ0xlYXZlQ2IpKSxcbiAgICAgIG9uRHJvcDogY29tcG9zZURyYWdIYW5kbGVyKGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRHJvcCwgb25Ecm9wQ2IpKSxcbiAgICAgIHJvbGU6IHR5cGVvZiByb2xlID09PSAnc3RyaW5nJyAmJiByb2xlICE9PSAnJyA/IHJvbGUgOiAnYnV0dG9uJyxcbiAgICAgIFtyZWZLZXldOiByb290UmVmLFxuICAgICAgLi4uKCFkaXNhYmxlZCAmJiAhbm9LZXlib2FyZCA/IHt0YWJJbmRleDogMH0gOiB7fSksXG4gICAgICAuLi5yZXN0XG4gICAgfSksXG4gICAgW1xuICAgICAgcm9vdFJlZixcbiAgICAgIG9uS2V5RG93bkNiLFxuICAgICAgb25Gb2N1c0NiLFxuICAgICAgb25CbHVyQ2IsXG4gICAgICBvbkNsaWNrQ2IsXG4gICAgICBvbkRyYWdFbnRlckNiLFxuICAgICAgb25EcmFnT3ZlckNiLFxuICAgICAgb25EcmFnTGVhdmVDYixcbiAgICAgIG9uRHJvcENiLFxuICAgICAgbm9LZXlib2FyZCxcbiAgICAgIG5vRHJhZyxcbiAgICAgIGRpc2FibGVkXG4gICAgXVxuICApXG5cbiAgY29uc3Qgb25JbnB1dEVsZW1lbnRDbGljayA9IHVzZUNhbGxiYWNrKGV2ZW50ID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICB9LCBbXSlcblxuICBjb25zdCBnZXRJbnB1dFByb3BzID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe3JlZktleSA9ICdyZWYnLCBvbkNoYW5nZSwgb25DbGljaywgLi4ucmVzdH0gPSB7fSkgPT4ge1xuICAgICAgY29uc3QgaW5wdXRQcm9wcyA9IHtcbiAgICAgICAgYWNjZXB0LFxuICAgICAgICBtdWx0aXBsZSxcbiAgICAgICAgdHlwZTogJ2ZpbGUnLFxuICAgICAgICBzdHlsZToge2Rpc3BsYXk6ICdub25lJ30sXG4gICAgICAgIG9uQ2hhbmdlOiBjb21wb3NlSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkNoYW5nZSwgb25Ecm9wQ2IpKSxcbiAgICAgICAgb25DbGljazogY29tcG9zZUhhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25DbGljaywgb25JbnB1dEVsZW1lbnRDbGljaykpLFxuICAgICAgICBhdXRvQ29tcGxldGU6ICdvZmYnLFxuICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgIFtyZWZLZXldOiBpbnB1dFJlZlxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAuLi5yZXN0XG4gICAgICB9XG4gICAgfSxcbiAgICBbaW5wdXRSZWYsIGFjY2VwdCwgbXVsdGlwbGUsIG9uRHJvcENiLCBkaXNhYmxlZF1cbiAgKVxuXG4gIGNvbnN0IGZpbGVDb3VudCA9IGRyYWdnZWRGaWxlcy5sZW5ndGhcbiAgY29uc3QgaXNEcmFnQWNjZXB0ID0gZmlsZUNvdW50ID4gMCAmJiBhbGxGaWxlc0FjY2VwdGVkKHtmaWxlczogZHJhZ2dlZEZpbGVzLCBhY2NlcHQsIG1pblNpemUsIG1heFNpemUsIG11bHRpcGxlLCBtYXhGaWxlc30pXG4gIGNvbnN0IGlzRHJhZ1JlamVjdCA9IGZpbGVDb3VudCA+IDAgJiYgIWlzRHJhZ0FjY2VwdFxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgaXNEcmFnQWNjZXB0LFxuICAgIGlzRHJhZ1JlamVjdCxcbiAgICBpc0ZvY3VzZWQ6IGlzRm9jdXNlZCAmJiAhZGlzYWJsZWQsXG4gICAgZ2V0Um9vdFByb3BzLFxuICAgIGdldElucHV0UHJvcHMsXG4gICAgcm9vdFJlZixcbiAgICBpbnB1dFJlZixcbiAgICBvcGVuOiBjb21wb3NlSGFuZGxlcihvcGVuRmlsZURpYWxvZylcbiAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ2ZvY3VzJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0ZvY3VzZWQ6IHRydWVcbiAgICAgIH1cbiAgICBjYXNlICdibHVyJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0ZvY3VzZWQ6IGZhbHNlXG4gICAgICB9XG4gICAgY2FzZSAnb3BlbkRpYWxvZyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbml0aWFsU3RhdGUsXG4gICAgICAgIGlzRmlsZURpYWxvZ0FjdGl2ZTogdHJ1ZVxuICAgICAgfVxuICAgIGNhc2UgJ2Nsb3NlRGlhbG9nJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0ZpbGVEaWFsb2dBY3RpdmU6IGZhbHNlXG4gICAgICB9XG4gICAgY2FzZSAnc2V0RHJhZ2dlZEZpbGVzJzpcbiAgICAgIC8qIGVzbGludCBuby1jYXNlLWRlY2xhcmF0aW9uczogMCAqL1xuICAgICAgY29uc3Qge2lzRHJhZ0FjdGl2ZSwgZHJhZ2dlZEZpbGVzfSA9IGFjdGlvblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGRyYWdnZWRGaWxlcyxcbiAgICAgICAgaXNEcmFnQWN0aXZlXG4gICAgICB9XG4gICAgY2FzZSAnc2V0RmlsZXMnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGFjY2VwdGVkRmlsZXM6IGFjdGlvbi5hY2NlcHRlZEZpbGVzLFxuICAgICAgICBmaWxlUmVqZWN0aW9uczogYWN0aW9uLmZpbGVSZWplY3Rpb25zXG4gICAgICB9XG4gICAgY2FzZSAncmVzZXQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5pdGlhbFN0YXRlXG4gICAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQge0Vycm9yQ29kZX0gZnJvbSAnLi91dGlscydcbiJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsImFwcGx5IiwiX19nZW5lcmF0b3IiLCJib2R5IiwiZiIsInkiLCJ0IiwiZyIsIl8iLCJsYWJlbCIsInNlbnQiLCJ0cnlzIiwib3BzIiwidmVyYiIsInRocm93IiwicmV0dXJuIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJ0aGlzIiwibiIsInYiLCJvcCIsIlR5cGVFcnJvciIsImNhbGwiLCJwb3AiLCJsZW5ndGgiLCJwdXNoIiwiX19yZWFkIiwibyIsIm0iLCJyIiwiaSIsImFyIiwiZXJyb3IiLCJDT01NT05fTUlNRV9UWVBFUyIsIk1hcCIsInRvRmlsZVdpdGhQYXRoIiwiZmlsZSIsInBhdGgiLCJuYW1lIiwibGFzdEluZGV4T2YiLCJ0eXBlIiwiZXh0Iiwic3BsaXQiLCJ0b0xvd2VyQ2FzZSIsImdldCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5Iiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid2l0aE1pbWVUeXBlIiwid2Via2l0UmVsYXRpdmVQYXRoIiwiRklMRVNfVE9fSUdOT1JFIiwiaXNPYmplY3QiLCJnZXRJbnB1dEZpbGVzIiwiZXZ0IiwiZnJvbUxpc3QiLCJ0YXJnZXQiLCJmaWxlcyIsIm1hcCIsImdldEZzSGFuZGxlRmlsZXMiLCJoYW5kbGVzIiwiX2EiLCJhbGwiLCJoIiwiZ2V0RmlsZSIsImdldERhdGFUcmFuc2ZlckZpbGVzIiwiZHQiLCJpdGVtcyIsImZpbHRlciIsIml0ZW0iLCJraW5kIiwidG9GaWxlUHJvbWlzZXMiLCJub0lnbm9yZWRGaWxlcyIsImZsYXR0ZW4iLCJpbmRleE9mIiwid2Via2l0R2V0QXNFbnRyeSIsImZyb21EYXRhVHJhbnNmZXJJdGVtIiwiZW50cnkiLCJpc0RpcmVjdG9yeSIsImZyb21EaXJFbnRyeSIsInJlZHVjZSIsImFjYyIsImFyZ3VtZW50cyIsImNvbmNhdCIsIl9fc3ByZWFkIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0QXNGaWxlIiwiZndwIiwiZnJvbUVudHJ5IiwiZnJvbUZpbGVFbnRyeSIsInJlYWRlciIsImNyZWF0ZVJlYWRlciIsImVudHJpZXMiLCJyZWFkRW50cmllcyIsIl90aGlzIiwiYmF0Y2giLCJlcnJfMSIsImVyciIsImZ1bGxQYXRoIiwiRklMRV9JTlZBTElEX1RZUEUiLCJGSUxFX1RPT19MQVJHRSIsIkZJTEVfVE9PX1NNQUxMIiwiVE9PX01BTllfRklMRVMiLCJFcnJvckNvZGUiLCJGaWxlSW52YWxpZFR5cGUiLCJGaWxlVG9vTGFyZ2UiLCJGaWxlVG9vU21hbGwiLCJUb29NYW55RmlsZXMiLCJnZXRJbnZhbGlkVHlwZVJlamVjdGlvbkVyciIsImFjY2VwdCIsIm1lc3NhZ2VTdWZmaXgiLCJqb2luIiwiY29kZSIsIm1lc3NhZ2UiLCJnZXRUb29MYXJnZVJlamVjdGlvbkVyciIsIm1heFNpemUiLCJnZXRUb29TbWFsbFJlamVjdGlvbkVyciIsIm1pblNpemUiLCJUT09fTUFOWV9GSUxFU19SRUpFQ1RJT04iLCJmaWxlQWNjZXB0ZWQiLCJpc0FjY2VwdGFibGUiLCJhY2NlcHRlZEZpbGVzIiwiYWNjZXB0ZWRGaWxlc0FycmF5IiwiZmlsZU5hbWUiLCJtaW1lVHlwZSIsImJhc2VNaW1lVHlwZSIsInJlcGxhY2UiLCJzb21lIiwidmFsaWRUeXBlIiwidHJpbSIsImNoYXJBdCIsImVuZHNXaXRoIiwiYWNjZXB0cyIsImZpbGVNYXRjaFNpemUiLCJpc0RlZmluZWQiLCJzaXplIiwiYWxsRmlsZXNBY2NlcHRlZCIsIm11bHRpcGxlIiwibWF4RmlsZXMiLCJldmVyeSIsImFjY2VwdGVkIiwic2l6ZU1hdGNoIiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJldmVudCIsImNhbmNlbEJ1YmJsZSIsImlzRXZ0V2l0aEZpbGVzIiwiZGF0YVRyYW5zZmVyIiwicHJvdG90eXBlIiwidHlwZXMiLCJvbkRvY3VtZW50RHJhZ092ZXIiLCJwcmV2ZW50RGVmYXVsdCIsImlzSWUiLCJ1c2VyQWdlbnQiLCJpc0VkZ2UiLCJpc0llT3JFZGdlIiwid2luZG93IiwibmF2aWdhdG9yIiwiY29tcG9zZUV2ZW50SGFuZGxlcnMiLCJmbnMiLCJhcmdzIiwiZm4iLCJjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJIiwiZmlsZVBpY2tlck9wdGlvbnNUeXBlcyIsImRlc2NyaXB0aW9uIiwidGVzdCIsImEiLCJiIiwiRHJvcHpvbmUiLCJmb3J3YXJkUmVmIiwicmVmIiwiY2hpbGRyZW4iLCJ1c2VEcm9wem9uZSIsIm9wZW4iLCJwcm9wcyIsInVzZUltcGVyYXRpdmVIYW5kbGUiLCJSZWFjdCIsIkZyYWdtZW50IiwiZGlzcGxheU5hbWUiLCJkZWZhdWx0UHJvcHMiLCJkaXNhYmxlZCIsImdldEZpbGVzRnJvbUV2ZW50IiwiaXNDaGFuZ2VFdnQiLCJJbmZpbml0eSIsInByZXZlbnREcm9wT25Eb2N1bWVudCIsIm5vQ2xpY2siLCJub0tleWJvYXJkIiwibm9EcmFnIiwibm9EcmFnRXZlbnRzQnViYmxpbmciLCJ2YWxpZGF0b3IiLCJ1c2VGc0FjY2Vzc0FwaSIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImZ1bmMiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJhcnJheU9mIiwiYm9vbCIsIm51bWJlciIsIm9uRmlsZURpYWxvZ0NhbmNlbCIsIm9uRmlsZURpYWxvZ09wZW4iLCJvbkRyYWdFbnRlciIsIm9uRHJhZ0xlYXZlIiwib25EcmFnT3ZlciIsIm9uRHJvcCIsIm9uRHJvcEFjY2VwdGVkIiwib25Ecm9wUmVqZWN0ZWQiLCJpbml0aWFsU3RhdGUiLCJpc0ZvY3VzZWQiLCJpc0ZpbGVEaWFsb2dBY3RpdmUiLCJpc0RyYWdBY3RpdmUiLCJpc0RyYWdBY2NlcHQiLCJpc0RyYWdSZWplY3QiLCJkcmFnZ2VkRmlsZXMiLCJmaWxlUmVqZWN0aW9ucyIsIm9wdGlvbnMiLCJvbkZpbGVEaWFsb2dPcGVuQ2IiLCJ1c2VNZW1vIiwibm9vcCIsIm9uRmlsZURpYWxvZ0NhbmNlbENiIiwicm9vdFJlZiIsInVzZVJlZiIsImlucHV0UmVmIiwidXNlUmVkdWNlciIsInJlZHVjZXIiLCJzdGF0ZSIsImRpc3BhdGNoIiwib25XaW5kb3dGb2N1cyIsInNldFRpbWVvdXQiLCJjdXJyZW50IiwidXNlRWZmZWN0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJkcmFnVGFyZ2V0c1JlZiIsIm9uRG9jdW1lbnREcm9wIiwiY29udGFpbnMiLCJkb2N1bWVudCIsIm9uRHJhZ0VudGVyQ2IiLCJ1c2VDYWxsYmFjayIsInBlcnNpc3QiLCJzdG9wUHJvcGFnYXRpb24iLCJvbkRyYWdPdmVyQ2IiLCJoYXNGaWxlcyIsImRyb3BFZmZlY3QiLCJvbkRyYWdMZWF2ZUNiIiwidGFyZ2V0cyIsInRhcmdldElkeCIsInNwbGljZSIsInNldEZpbGVzIiwiZm9yRWFjaCIsImFjY2VwdEVycm9yIiwic2l6ZUVycm9yIiwiY3VzdG9tRXJyb3JzIiwiZXJyb3JzIiwib25Ecm9wQ2IiLCJvcGVuRmlsZURpYWxvZyIsIm9wdHMiLCJzaG93T3BlbkZpbGVQaWNrZXIiLCJjYXRjaCIsImZpbmFsbHkiLCJjbGljayIsIm9uS2V5RG93bkNiIiwiaXNFcXVhbE5vZGUiLCJrZXlDb2RlIiwib25Gb2N1c0NiIiwib25CbHVyQ2IiLCJvbkNsaWNrQ2IiLCJjb21wb3NlSGFuZGxlciIsImNvbXBvc2VLZXlib2FyZEhhbmRsZXIiLCJjb21wb3NlRHJhZ0hhbmRsZXIiLCJnZXRSb290UHJvcHMiLCJyZWZLZXkiLCJyb2xlIiwib25LZXlEb3duIiwib25Gb2N1cyIsIm9uQmx1ciIsIm9uQ2xpY2siLCJyZXN0IiwidGFiSW5kZXgiLCJvbklucHV0RWxlbWVudENsaWNrIiwiZ2V0SW5wdXRQcm9wcyIsIm9uQ2hhbmdlIiwiaW5wdXRQcm9wcyIsInN0eWxlIiwiZGlzcGxheSIsImF1dG9Db21wbGV0ZSIsImZpbGVDb3VudCIsImFjdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7dzBCQXFFTyxTQUFTQSxFQUFVQyxFQUFTQyxFQUFZQyxFQUFHQyxHQUU5QyxPQUFPLElBQUtELElBQU1BLEVBQUlFLFdBQVUsU0FBVUMsRUFBU0MsR0FDL0MsU0FBU0MsRUFBVUMsR0FBUyxJQUFNQyxFQUFLTixFQUFVTyxLQUFLRixJQUFXLE1BQU9HLEdBQUtMLEVBQU9LLElBQ3BGLFNBQVNDLEVBQVNKLEdBQVMsSUFBTUMsRUFBS04sRUFBaUIsTUFBRUssSUFBVyxNQUFPRyxHQUFLTCxFQUFPSyxJQUN2RixTQUFTRixFQUFLSSxHQUpsQixJQUFlTCxFQUlhSyxFQUFPQyxLQUFPVCxFQUFRUSxFQUFPTCxRQUoxQ0EsRUFJeURLLEVBQU9MLE1BSmhEQSxhQUFpQk4sRUFBSU0sRUFBUSxJQUFJTixHQUFFLFNBQVVHLEdBQVdBLEVBQVFHLE9BSVRPLEtBQUtSLEVBQVdLLEdBQ2xHSCxHQUFNTixFQUFZQSxFQUFVYSxNQUFNaEIsRUFBU0MsR0FBYyxLQUFLUyxXQUkvRCxTQUFTTyxFQUFZakIsRUFBU2tCLEdBQ2pDLElBQXNHQyxFQUFHQyxFQUFHQyxFQUFHQyxFQUEzR0MsRUFBSSxDQUFFQyxNQUFPLEVBQUdDLEtBQU0sV0FBYSxHQUFXLEVBQVBKLEVBQUUsR0FBUSxNQUFNQSxFQUFFLEdBQUksT0FBT0EsRUFBRSxJQUFPSyxLQUFNLEdBQUlDLElBQUssSUFDaEcsT0FBT0wsRUFBSSxDQUFFWixLQUFNa0IsRUFBSyxHQUFJQyxNQUFTRCxFQUFLLEdBQUlFLE9BQVVGLEVBQUssSUFBd0IsbUJBQVhHLFNBQTBCVCxFQUFFUyxPQUFPQyxVQUFZLFdBQWEsT0FBT0MsT0FBVVgsRUFDdkosU0FBU00sRUFBS00sR0FBSyxPQUFPLFNBQVVDLEdBQUssT0FDekMsU0FBY0MsR0FDVixHQUFJakIsRUFBRyxNQUFNLElBQUlrQixVQUFVLG1DQUMzQixLQUFPZCxPQUNILEdBQUlKLEVBQUksRUFBR0MsSUFBTUMsRUFBWSxFQUFSZSxFQUFHLEdBQVNoQixFQUFVLE9BQUlnQixFQUFHLEdBQUtoQixFQUFTLFNBQU9DLEVBQUlELEVBQVUsU0FBTUMsRUFBRWlCLEtBQUtsQixHQUFJLEdBQUtBLEVBQUVWLFNBQVdXLEVBQUlBLEVBQUVpQixLQUFLbEIsRUFBR2dCLEVBQUcsS0FBS3RCLEtBQU0sT0FBT08sRUFFM0osT0FESUQsRUFBSSxFQUFHQyxJQUFHZSxFQUFLLENBQVMsRUFBUkEsRUFBRyxHQUFRZixFQUFFYixRQUN6QjRCLEVBQUcsSUFDUCxLQUFLLEVBQUcsS0FBSyxFQUFHZixFQUFJZSxFQUFJLE1BQ3hCLEtBQUssRUFBYyxPQUFYYixFQUFFQyxRQUFnQixDQUFFaEIsTUFBTzRCLEVBQUcsR0FBSXRCLE1BQU0sR0FDaEQsS0FBSyxFQUFHUyxFQUFFQyxRQUFTSixFQUFJZ0IsRUFBRyxHQUFJQSxFQUFLLENBQUMsR0FBSSxTQUN4QyxLQUFLLEVBQUdBLEVBQUtiLEVBQUVJLElBQUlZLE1BQU9oQixFQUFFRyxLQUFLYSxNQUFPLFNBQ3hDLFFBQ0ksS0FBTWxCLEVBQUlFLEVBQUVHLE1BQU1MLEVBQUlBLEVBQUVtQixPQUFTLEdBQUtuQixFQUFFQSxFQUFFbUIsT0FBUyxLQUFrQixJQUFWSixFQUFHLElBQXNCLElBQVZBLEVBQUcsSUFBVyxDQUFFYixFQUFJLEVBQUcsU0FDakcsR0FBYyxJQUFWYSxFQUFHLE1BQWNmLEdBQU1lLEVBQUcsR0FBS2YsRUFBRSxJQUFNZSxFQUFHLEdBQUtmLEVBQUUsSUFBTSxDQUFFRSxFQUFFQyxNQUFRWSxFQUFHLEdBQUksTUFDOUUsR0FBYyxJQUFWQSxFQUFHLElBQVliLEVBQUVDLE1BQVFILEVBQUUsR0FBSSxDQUFFRSxFQUFFQyxNQUFRSCxFQUFFLEdBQUlBLEVBQUllLEVBQUksTUFDN0QsR0FBSWYsR0FBS0UsRUFBRUMsTUFBUUgsRUFBRSxHQUFJLENBQUVFLEVBQUVDLE1BQVFILEVBQUUsR0FBSUUsRUFBRUksSUFBSWMsS0FBS0wsR0FBSyxNQUN2RGYsRUFBRSxJQUFJRSxFQUFFSSxJQUFJWSxNQUNoQmhCLEVBQUVHLEtBQUthLE1BQU8sU0FFdEJILEVBQUtsQixFQUFLb0IsS0FBS3RDLEVBQVN1QixHQUMxQixNQUFPWixHQUFLeUIsRUFBSyxDQUFDLEVBQUd6QixHQUFJUyxFQUFJLFVBQWVELEVBQUlFLEVBQUksRUFDdEQsR0FBWSxFQUFSZSxFQUFHLEdBQVEsTUFBTUEsRUFBRyxHQUFJLE1BQU8sQ0FBRTVCLE1BQU80QixFQUFHLEdBQUtBLEVBQUcsUUFBSyxFQUFRdEIsTUFBTSxHQXJCOUJMLENBQUssQ0FBQ3lCLEVBQUdDLE1BaUR0RCxTQUFTTyxFQUFPQyxFQUFHVCxHQUN0QixJQUFJVSxFQUFzQixtQkFBWGIsUUFBeUJZLEVBQUVaLE9BQU9DLFVBQ2pELElBQUtZLEVBQUcsT0FBT0QsRUFDZixJQUFtQkUsRUFBWWxDLEVBQTNCbUMsRUFBSUYsRUFBRU4sS0FBS0ssR0FBT0ksRUFBSyxHQUMzQixJQUNJLFdBQWMsSUFBTmIsR0FBZ0JBLEtBQU0sTUFBUVcsRUFBSUMsRUFBRXBDLFFBQVFJLE1BQU1pQyxFQUFHTixLQUFLSSxFQUFFckMsT0FFeEUsTUFBT3dDLEdBQVNyQyxFQUFJLENBQUVxQyxNQUFPQSxXQUV6QixJQUNRSCxJQUFNQSxFQUFFL0IsT0FBUzhCLEVBQUlFLEVBQVUsU0FBSUYsRUFBRU4sS0FBS1EsV0FFeEMsR0FBSW5DLEVBQUcsTUFBTUEsRUFBRXFDLE9BRTdCLE9BQU9ELEVDakpKLElBQUlFLEVBQW9CLElBQUlDLElBQUksQ0FFbkMsQ0FBQyxNQUFPLGFBQ1IsQ0FBQyxNQUFPLHlCQUNSLENBQUMsTUFBTyx5QkFDUixDQUFDLE9BQVEsY0FDVCxDQUFDLE1BQU8sbUJBQ1IsQ0FBQyxNQUFPLGdDQUNSLENBQUMsTUFBTyw0QkFDUixDQUFDLE1BQU8sYUFDUixDQUFDLEtBQU0sc0JBQ1AsQ0FBQyxNQUFPLHVCQUNSLENBQUMsTUFBTyxxQkFDUixDQUFDLE1BQU8scUJBQ1IsQ0FBQyxNQUFPLFlBQ1IsQ0FBQyxNQUFPLFlBQ1IsQ0FBQyxNQUFPLHNCQUNSLENBQUMsT0FBUSwyRUFDVCxDQUFDLE1BQU8saUNBQ1IsQ0FBQyxPQUFRLHdCQUNULENBQUMsS0FBTSxvQkFDUCxDQUFDLE1BQU8sYUFDUixDQUFDLE1BQU8sYUFDUixDQUFDLE9BQVEsYUFDVCxDQUFDLE1BQU8sNEJBQ1IsQ0FBQyxNQUFPLGlCQUNSLENBQUMsTUFBTyw0QkFDUixDQUFDLE9BQVEsY0FDVCxDQUFDLE1BQU8sY0FDUixDQUFDLEtBQU0sbUJBQ1AsQ0FBQyxPQUFRLG9CQUNULENBQUMsU0FBVSx1QkFDWCxDQUFDLE1BQU8sY0FDUixDQUFDLE9BQVEsY0FDVCxDQUFDLE1BQU8sbUJBQ1IsQ0FBQyxNQUFPLGNBQ1IsQ0FBQyxNQUFPLGFBQ1IsQ0FBQyxPQUFRLGNBQ1QsQ0FBQyxPQUFRLHVDQUNULENBQUMsTUFBTyxtREFDUixDQUFDLE1BQU8sa0RBQ1IsQ0FBQyxNQUFPLDJDQUNSLENBQUMsTUFBTyxhQUNSLENBQUMsTUFBTyxhQUNSLENBQUMsTUFBTyxtQkFDUixDQUFDLE9BQVEsY0FDVCxDQUFDLE1BQU8sWUFDUixDQUFDLE1BQU8sYUFDUixDQUFDLE1BQU8sbUJBQ1IsQ0FBQyxNQUFPLDJCQUNSLENBQUMsTUFBTyxpQ0FDUixDQUFDLE9BQVEsNkVBQ1QsQ0FBQyxNQUFPLHVCQUNSLENBQUMsTUFBTyxtQkFDUixDQUFDLEtBQU0sb0JBQ1AsQ0FBQyxNQUFPLGlCQUNSLENBQUMsTUFBTyxpQ0FDUixDQUFDLE1BQU8scUJBQ1IsQ0FBQyxNQUFPLGNBQ1IsQ0FBQyxPQUFRLGNBQ1QsQ0FBQyxLQUFNLGNBQ1AsQ0FBQyxNQUFPLFlBQ1IsQ0FBQyxNQUFPLGNBQ1IsQ0FBQyxNQUFPLHlCQUNSLENBQUMsTUFBTyxhQUNSLENBQUMsT0FBUSxjQUNULENBQUMsT0FBUSxjQUNULENBQUMsT0FBUSxjQUNULENBQUMsT0FBUSxhQUNULENBQUMsUUFBUyxjQUNWLENBQUMsUUFBUyx5QkFDVixDQUFDLE1BQU8sNEJBQ1IsQ0FBQyxPQUFRLHFFQUNULENBQUMsTUFBTyxtQkFDUixDQUFDLE1BQU8sbUNBQ1IsQ0FBQyxNQUFPLG1CQUNSLENBQUMsS0FBTSwrQkFFUCxDQUFDLE1BQU8sb0JBQ1IsQ0FBQyxNQUFPLG1CQUNSLENBQUMsTUFBTyxnQ0FFTCxTQUFTQyxFQUFlQyxFQUFNQyxHQUNqQyxJQUFJbEMsRUFtQlIsU0FBc0JpQyxHQUNsQixJQUFJRSxFQUFPRixFQUFLRSxLQUVoQixHQURtQkEsSUFBbUMsSUFBM0JBLEVBQUtDLFlBQVksT0FDdkJILEVBQUtJLEtBQU0sQ0FDNUIsSUFBSUMsRUFBTUgsRUFBS0ksTUFBTSxLQUNoQm5CLE1BQU1vQixjQUNQSCxFQUFPUCxFQUFrQlcsSUFBSUgsR0FDN0JELEdBQ0FLLE9BQU9DLGVBQWVWLEVBQU0sT0FBUSxDQUNoQzVDLE1BQU9nRCxFQUNQTyxVQUFVLEVBQ1ZDLGNBQWMsRUFDZEMsWUFBWSxJQUl4QixPQUFPYixFQW5DQ2MsQ0FBYWQsR0FDckIsR0FBc0IsaUJBQVhqQyxFQUFFa0MsS0FBbUIsQ0FDNUIsSUFBSWMsRUFBcUJmLEVBQUtlLG1CQUM5Qk4sT0FBT0MsZUFBZTNDLEVBQUcsT0FBUSxDQUM3QlgsTUFBdUIsaUJBQVQ2QyxFQUNSQSxFQUk4QixpQkFBdkJjLEdBQW1DQSxFQUFtQjNCLE9BQVMsRUFDbEUyQixFQUNBZixFQUFLRSxLQUNmUyxVQUFVLEVBQ1ZDLGNBQWMsRUFDZEMsWUFBWSxJQUdwQixPQUFPOUMsRUNsR1gsSUFBSWlELEVBQWtCLENBRWxCLFlBQ0EsYUFrQ0osU0FBU0MsRUFBU2xDLEdBQ2QsTUFBb0IsaUJBQU5BLEdBQXdCLE9BQU5BLEVBRXBDLFNBQVNtQyxFQUFjQyxHQUNuQixPQUFPQyxFQUFTRCxFQUFJRSxPQUFPQyxPQUFPQyxLQUFJLFNBQVV2QixHQUFRLE9BQU9ELEVBQWVDLE1BR2xGLFNBQVN3QixFQUFpQkMsR0FDdEIsT0FBTzlFLEVBQVVrQyxVQUFNLE9BQVEsR0FBUSxXQUVuQyxPQUFPaEIsRUFBWWdCLE1BQU0sU0FBVTZDLEdBQy9CLE9BQVFBLEVBQUd0RCxPQUNQLEtBQUssRUFBRyxNQUFPLENBQUMsRUFBYXBCLFFBQVEyRSxJQUFJRixFQUFRRixLQUFJLFNBQVVLLEdBQUssT0FBT0EsRUFBRUMsZUFDN0UsS0FBSyxFQUVELE1BQU8sQ0FBQyxFQURBSCxFQUFHckQsT0FDaUJrRCxLQUFJLFNBQVV2QixHQUFRLE9BQU9ELEVBQWVDLGNBSzVGLFNBQVM4QixFQUFxQkMsRUFBSTNCLEdBQzlCLE9BQU96RCxFQUFVa0MsVUFBTSxPQUFRLEdBQVEsV0FDbkMsSUFBSW1ELEVBQ0osT0FBT25FLEVBQVlnQixNQUFNLFNBQVU2QyxHQUMvQixPQUFRQSxFQUFHdEQsT0FDUCxLQUFLLEVBQ0QsT0FBVyxPQUFQMkQsRUFDTyxDQUFDLEVBQWMsSUFFckJBLEVBQUdDLE9BQ1JBLEVBQVFaLEVBQVNXLEVBQUdDLE9BQ2ZDLFFBQU8sU0FBVUMsR0FBUSxNQUFxQixTQUFkQSxFQUFLQyxRQUc3QixTQUFUL0IsRUFDTyxDQUFDLEVBQWM0QixHQUVuQixDQUFDLEVBQWFoRixRQUFRMkUsSUFBSUssRUFBTVQsSUFBSWEsTUFSckIsQ0FBQyxFQUFhLEdBU3hDLEtBQUssRUFFRCxNQUFPLENBQUMsRUFBY0MsRUFBZUMsRUFEN0JaLEVBQUdyRCxVQUVmLEtBQUssRUFBRyxNQUFPLENBQUMsRUFBY2dFLEVBQWVqQixFQUFTVyxFQUFHVCxPQUNoREMsS0FBSSxTQUFVdkIsR0FBUSxPQUFPRCxFQUFlQyxlQUtyRSxTQUFTcUMsRUFBZWYsR0FDcEIsT0FBT0EsRUFBTVcsUUFBTyxTQUFVakMsR0FBUSxPQUErQyxJQUF4Q2dCLEVBQWdCdUIsUUFBUXZDLEVBQUtFLFNBTTlFLFNBQVNrQixFQUFTWSxHQUNkLEdBQWMsT0FBVkEsRUFDQSxNQUFPLEdBSVgsSUFGQSxJQUFJVixFQUFRLEdBRUg1QixFQUFJLEVBQUdBLEVBQUlzQyxFQUFNNUMsT0FBUU0sSUFBSyxDQUNuQyxJQUFJTSxFQUFPZ0MsRUFBTXRDLEdBQ2pCNEIsRUFBTWpDLEtBQUtXLEdBRWYsT0FBT3NCLEVBR1gsU0FBU2MsRUFBZUYsR0FDcEIsR0FBcUMsbUJBQTFCQSxFQUFLTSxpQkFDWixPQUFPQyxFQUFxQlAsR0FFaEMsSUFBSVEsRUFBUVIsRUFBS00sbUJBSWpCLE9BQUlFLEdBQVNBLEVBQU1DLFlBQ1JDLEVBQWFGLEdBRWpCRCxFQUFxQlAsR0FFaEMsU0FBU0ksRUFBUU4sR0FDYixPQUFPQSxFQUFNYSxRQUFPLFNBQVVDLEVBQUt4QixHQUFTLE9GNkJ6QyxXQUNILElBQUssSUFBSTNCLEVBQUssR0FBSUQsRUFBSSxFQUFHQSxFQUFJcUQsVUFBVTNELE9BQVFNLElBQzNDQyxFQUFLQSxFQUFHcUQsT0FBTzFELEVBQU95RCxVQUFVckQsS0FDcEMsT0FBT0MsRUVoQzRDc0QsQ0FBU0gsRUFBTUksTUFBTUMsUUFBUTdCLEdBQVNnQixFQUFRaEIsR0FBUyxDQUFDQSxNQUFhLElBRTVILFNBQVNtQixFQUFxQlAsR0FDMUIsSUFBSWxDLEVBQU9rQyxFQUFLa0IsWUFDaEIsSUFBS3BELEVBQ0QsT0FBT2hELFFBQVFFLE9BQU9nRixFQUFPLGtCQUVqQyxJQUFJbUIsRUFBTXRELEVBQWVDLEdBQ3pCLE9BQU9oRCxRQUFRQyxRQUFRb0csR0FHM0IsU0FBU0MsRUFBVVosR0FDZixPQUFPL0YsRUFBVWtDLFVBQU0sT0FBUSxHQUFRLFdBQ25DLE9BQU9oQixFQUFZZ0IsTUFBTSxTQUFVNkMsR0FDL0IsTUFBTyxDQUFDLEVBQWNnQixFQUFNQyxZQUFjQyxFQUFhRixHQUFTYSxFQUFjYixVQUsxRixTQUFTRSxFQUFhRixHQUNsQixJQUFJYyxFQUFTZCxFQUFNZSxlQUNuQixPQUFPLElBQUl6RyxTQUFRLFNBQVVDLEVBQVNDLEdBQ2xDLElBQUl3RyxFQUFVLElBQ2QsU0FBU0MsSUFDTCxJQUFJQyxFQUFRL0UsS0FHWjJFLEVBQU9HLGFBQVksU0FBVUUsR0FBUyxPQUFPbEgsRUFBVWlILE9BQU8sT0FBUSxHQUFRLFdBQzFFLElBQUl0QyxFQUFPd0MsRUFBTzlCLEVBQ2xCLE9BQU9uRSxFQUFZZ0IsTUFBTSxTQUFVNkMsR0FDL0IsT0FBUUEsRUFBR3RELE9BQ1AsS0FBSyxFQUNELEdBQU15RixFQUFNekUsT0FBUSxNQUFPLENBQUMsRUFBYSxHQUN6Q3NDLEVBQUd0RCxNQUFRLEVBQ2YsS0FBSyxFQUVELE9BREFzRCxFQUFHcEQsS0FBS2UsS0FBSyxDQUFDLEVBQUcsR0FBSyxJQUNmLENBQUMsRUFBYXJDLFFBQVEyRSxJQUFJK0IsSUFDckMsS0FBSyxFQUdELE9BRkFwQyxFQUFRSSxFQUFHckQsT0FDWHBCLEVBQVFxRSxHQUNELENBQUMsRUFBYSxHQUN6QixLQUFLLEVBR0QsT0FGQXdDLEVBQVFwQyxFQUFHckQsT0FDWG5CLEVBQU80RyxHQUNBLENBQUMsRUFBYSxHQUN6QixLQUFLLEVBQUcsTUFBTyxDQUFDLEVBQWEsR0FDN0IsS0FBSyxFQUNEOUIsRUFBUWhGLFFBQVEyRSxJQUFJa0MsRUFBTXRDLElBQUkrQixJQUM5QkksRUFBUXJFLEtBQUsyQyxHQUViMkIsSUFDQWpDLEVBQUd0RCxNQUFRLEVBQ2YsS0FBSyxFQUFHLE1BQU8sQ0FBQyxhQUdyQixTQUFVMkYsR0FDYjdHLEVBQU82RyxNQUdmSixNQUlSLFNBQVNKLEVBQWNiLEdBQ25CLE9BQU8vRixFQUFVa0MsVUFBTSxPQUFRLEdBQVEsV0FDbkMsT0FBT2hCLEVBQVlnQixNQUFNLFNBQVU2QyxHQUMvQixNQUFPLENBQUMsRUFBYyxJQUFJMUUsU0FBUSxTQUFVQyxFQUFTQyxHQUM3Q3dGLEVBQU0xQyxNQUFLLFNBQVVBLEdBQ2pCLElBQUlxRCxFQUFNdEQsRUFBZUMsRUFBTTBDLEVBQU1zQixVQUNyQy9HLEVBQVFvRyxNQUNULFNBQVVVLEdBQ1Q3RyxFQUFPNkcsZ0JDM0wvQixJQ0RhRSxFQUFvQixvQkFDcEJDLEVBQWlCLGlCQUNqQkMsRUFBaUIsaUJBQ2pCQyxFQUFpQixpQkFFakJDLEVBQVksQ0FDdkJDLGdCQUFpQkwsRUFDakJNLGFBQWNMLEVBQ2RNLGFBQWNMLEVBQ2RNLGFBQWNMLEdBSUhNLEVBQTZCLFNBQUFDLEdBQ3hDQSxFQUFTekIsTUFBTUMsUUFBUXdCLElBQTZCLElBQWxCQSxFQUFPdkYsT0FBZXVGLEVBQU8sR0FBS0EsTUFDOURDLEVBQWdCMUIsTUFBTUMsUUFBUXdCLG9CQUFvQkEsRUFBT0UsS0FBSyxPQUFVRixRQUN2RSxDQUNMRyxLQUFNYixFQUNOYyxvQ0FBOEJILEtBSXJCSSxFQUEwQixTQUFBQyxTQUM5QixDQUNMSCxLQUFNWixFQUNOYSxzQ0FBZ0NFLGNBQXVCLElBQVpBLEVBQWdCLE9BQVMsV0FJM0RDLEVBQTBCLFNBQUFDLFNBQzlCLENBQ0xMLEtBQU1YLEVBQ05ZLHVDQUFpQ0ksY0FBdUIsSUFBWkEsRUFBZ0IsT0FBUyxXQUk1REMsRUFBMkIsQ0FDdENOLEtBQU1WLEVBQ05XLFFBQVMsa0JBS0osU0FBU00sRUFBYXJGLEVBQU0yRSxPQUMzQlcsRUFBNkIsMkJBQWR0RixFQUFLSSxNRDNDVixTQUFVSixFQUFNdUYsR0FDaEMsR0FBSXZGLEdBQVF1RixFQUFlLENBQ3pCLElBQUlDLEVBQXFCdEMsTUFBTUMsUUFBUW9DLEdBQWlCQSxFQUFnQkEsRUFBY2pGLE1BQU0sS0FDeEZtRixFQUFXekYsRUFBS0UsTUFBUSxHQUN4QndGLEdBQVkxRixFQUFLSSxNQUFRLElBQUlHLGNBQzdCb0YsRUFBZUQsRUFBU0UsUUFBUSxRQUFTLElBQzdDLE9BQU9KLEVBQW1CSyxNQUFLLFNBQVV6RixHQUN2QyxJQUFJMEYsRUFBWTFGLEVBQUsyRixPQUFPeEYsY0FFNUIsTUFBNEIsTUFBeEJ1RixFQUFVRSxPQUFPLEdBQ1pQLEVBQVNsRixjQUFjMEYsU0FBU0gsR0FDOUJBLEVBQVVHLFNBQVMsTUFFckJOLElBQWlCRyxFQUFVRixRQUFRLFFBQVMsSUFHOUNGLElBQWFJLEtBSXhCLE9BQU8sRUN1QndESSxDQUFRbEcsRUFBTTJFLFNBQ3RFLENBQUNXLEVBQWNBLEVBQWUsS0FBT1osRUFBMkJDLElBR2xFLFNBQVN3QixFQUFjbkcsRUFBTW1GLEVBQVNGLE1BQ3ZDbUIsRUFBVXBHLEVBQUtxRyxTQUNiRCxFQUFVakIsSUFBWWlCLEVBQVVuQixHQUFVLElBQ3hDakYsRUFBS3FHLEtBQU9wQixFQUFTLE1BQU8sRUFBQyxFQUFPRCxFQUF3QkMsT0FDNURqRixFQUFLcUcsS0FBT2xCLEVBQVMsTUFBTyxFQUFDLEVBQU9ELEVBQXdCQyxRQUMzRCxDQUFBLEdBQUlpQixFQUFVakIsSUFBWW5GLEVBQUtxRyxLQUFPbEIsRUFDM0MsTUFBTyxFQUFDLEVBQU9ELEVBQXdCQyxJQUNwQyxHQUFJaUIsRUFBVW5CLElBQVlqRixFQUFLcUcsS0FBT3BCLEVBQ3pDLE1BQU8sRUFBQyxFQUFPRCxFQUF3QkMsVUFFcEMsRUFBQyxFQUFNLE1BR2hCLFNBQVNtQixFQUFVaEosVUFDVkEsTUFBQUEsRUFHRixTQUFTa0osU0FBa0JoRixJQUFBQSxNQUFPcUQsSUFBQUEsT0FBUVEsSUFBQUEsUUFBU0YsSUFBQUEsUUFBU3NCLElBQUFBLFNBQVVDLElBQUFBLGtCQUNyRUQsR0FBWWpGLEVBQU1sQyxPQUFTLEdBQU9tSCxHQUFZQyxHQUFZLEdBQUtsRixFQUFNbEMsT0FBU29ILElBSTdFbEYsRUFBTW1GLE9BQU0sU0FBQXpHLE9BQ1YwRyxJQUFZckIsRUFBYXJGLEVBQU0yRSxTQUMvQmdDLElBQWFSLEVBQWNuRyxFQUFNbUYsRUFBU0YsZ0JBQzFDeUIsR0FBWUMsS0FPaEIsU0FBU0MsRUFBcUJDLFNBQ08sbUJBQS9CQSxFQUFNRCxxQkFDUkMsRUFBTUQsNEJBQzBCLElBQXZCQyxFQUFNQyxjQUNmRCxFQUFNQyxhQUtWLFNBQVNDLEVBQWVGLFVBQ3hCQSxFQUFNRyxhQUtKOUQsTUFBTStELFVBQVVwQixLQUFLM0csS0FDMUIySCxFQUFNRyxhQUFhRSxPQUNuQixTQUFBOUcsU0FBaUIsVUFBVEEsR0FBNkIsMkJBQVRBLE9BTm5CeUcsRUFBTXhGLFVBQVl3RixFQUFNeEYsT0FBT0MsTUFlckMsU0FBUzZGLEVBQW1CTixHQUNqQ0EsRUFBTU8saUJBR1IsU0FBU0MsRUFBS0MsVUFDMEIsSUFBL0JBLEVBQVUvRSxRQUFRLFVBQXFELElBQW5DK0UsRUFBVS9FLFFBQVEsWUFHL0QsU0FBU2dGLEVBQU9ELFVBQ3lCLElBQWhDQSxFQUFVL0UsUUFBUSxTQUdwQixTQUFTaUYsUUFBV0YseURBQVlHLE9BQU9DLFVBQVVKLGlCQUMvQ0QsRUFBS0MsSUFBY0MsRUFBT0QsR0FhNUIsU0FBU0ssK0JBQXdCQywyQkFBQUEseUJBQy9CLFNBQUNmLDhCQUFVZ0IsbUNBQUFBLDJCQUNoQkQsRUFBSS9CLE1BQUssU0FBQWlDLFVBQ0ZsQixFQUFxQkMsSUFBVWlCLEdBQ2xDQSxnQkFBR2pCLFVBQVVnQixJQUVSakIsRUFBcUJDLE9BUzNCLFNBQVNrQixVQUNQLHVCQUF3Qk4sT0FTMUIsU0FBU08sRUFBdUJyRCxVQUNyQ0EsRUFBMkIsaUJBQVhBLEVBQXNCQSxFQUFPckUsTUFBTSxLQUFPcUUsRUFDbkQsQ0FBQyxDQUNOc0QsWUFBYSxhQUVidEQsT0FBUXpCLE1BQU1DLFFBQVF3QixHQUdsQkEsRUFBTzFDLFFBQU8sU0FBQUMsU0FDTCxZQUFUQSxHQUNTLFlBQVRBLEdBQ1MsWUFBVEEsR0FDUyxXQUFUQSxHQUNBLGlCQUFpQmdHLEtBQUtoRyxNQUN0QlcsUUFBTyxTQUFDc0YsRUFBR0MsaUJBQVdELFdBQUlDLEVBQUksT0FBTSxJQUNwQyx3TEN0SUZDLEdBQVdDLGNBQVcsV0FBd0JDLE9BQXRCQyxJQUFBQSxXQUNIQyxZQUFsQkMsSUFBQUEsS0FBU0MsaUJBRWhCQyxzQkFBb0JMLEdBQUssaUJBQU8sQ0FBQ0csS0FBQUEsS0FBUSxDQUFDQSxJQUduQ0csd0JBQUNDLGdCQUFVTixTQUFhRyxPQUFPRCxLQUFBQSxTQUd4Q0wsR0FBU1UsWUFBYyxXQUd2QixJQUFNQyxHQUFlLENBQ25CQyxVQUFVLEVBQ1ZDLGtCSHRDSyxTQUFtQi9ILEdBQ3RCLE9BQU94RSxFQUFVa0MsVUFBTSxPQUFRLEdBQVEsV0FDbkMsT0FBT2hCLEVBQVlnQixNQUFNLFNBQVU2QyxHQUMvQixPQUFJVCxFQUFTRSxJQWNkRixFQWRxQ0UsRUFjdEI2RixjQWJILENBQUMsRUFBY2xGLEVBQXFCWCxFQUFJNkYsYUFBYzdGLEVBQUlmLE9BZWpGLFNBQXFCaEQsR0FDakIsT0FBTzZELEVBQVM3RCxJQUFVNkQsRUFBUzdELEVBQU1pRSxRQWR4QjhILENBQVloSSxHQUNWLENBQUMsRUFBY0QsRUFBY0MsSUFFL0IrQixNQUFNQyxRQUFRaEMsSUFBUUEsRUFBSXNGLE9BQU0sU0FBVXZFLEdBQVEsTUFBTyxZQUFhQSxHQUFnQyxtQkFBakJBLEVBQUtMLFdBQ3hGLENBQUMsRUFBY0wsRUFBaUJMLElBRXBDLENBQUMsRUFBYyxXRzJCaEM4RCxRQUFTbUUsRUFBQUEsRUFDVGpFLFFBQVMsRUFDVG9CLFVBQVUsRUFDVkMsU0FBVSxFQUNWNkMsdUJBQXVCLEVBQ3ZCQyxTQUFTLEVBQ1RDLFlBQVksRUFDWkMsUUFBUSxFQUNSQyxzQkFBc0IsRUFDdEJDLFVBQVcsS0FDWEMsZ0JBQWdCLEdBR2xCdEIsR0FBU1csYUFBZUEsR0FFeEJYLEdBQVN1QixVQUFZLENBaUJuQnBCLFNBQVVxQixVQUFVQyxLQVVwQm5GLE9BQVFrRixVQUFVRSxVQUFVLENBQUNGLFVBQVVHLE9BQVFILFVBQVVJLFFBQVFKLFVBQVVHLFVBSzNFekQsU0FBVXNELFVBQVVLLEtBS3BCYixzQkFBdUJRLFVBQVVLLEtBS2pDWixRQUFTTyxVQUFVSyxLQU1uQlgsV0FBWU0sVUFBVUssS0FLdEJWLE9BQVFLLFVBQVVLLEtBS2xCVCxxQkFBc0JJLFVBQVVLLEtBS2hDL0UsUUFBUzBFLFVBQVVNLE9BS25CbEYsUUFBUzRFLFVBQVVNLE9BS25CM0QsU0FBVXFELFVBQVVNLE9BS3BCbEIsU0FBVVksVUFBVUssS0FPcEJoQixrQkFBbUJXLFVBQVVDLEtBSzdCTSxtQkFBb0JQLFVBQVVDLEtBSzlCTyxpQkFBa0JSLFVBQVVDLEtBTTVCSCxlQUFnQkUsVUFBVUssS0FPMUJJLFlBQWFULFVBQVVDLEtBT3ZCUyxZQUFhVixVQUFVQyxLQU92QlUsV0FBWVgsVUFBVUMsS0FnQ3RCVyxPQUFRWixVQUFVQyxLQVNsQlksZUFBZ0JiLFVBQVVDLEtBUzFCYSxlQUFnQmQsVUFBVUMsS0FPMUJKLFVBQVdHLFVBQVVDLE1BcUV2QixJQUFNYyxHQUFlLENBQ25CQyxXQUFXLEVBQ1hDLG9CQUFvQixFQUNwQkMsY0FBYyxFQUNkQyxjQUFjLEVBQ2RDLGNBQWMsRUFDZEMsYUFBYyxHQUNkM0YsY0FBZSxHQUNmNEYsZUFBZ0IsSUE4RVgsU0FBUzFDLFNBQVkyQyx5REFBVSxZQXlCL0JwQyxJQUNBb0MsR0F4Qkh6RyxJQUFBQSxPQUNBc0UsSUFBQUEsU0FDQUMsSUFBQUEsa0JBQ0FqRSxJQUFBQSxRQUNBRSxJQUFBQSxRQUNBb0IsSUFBQUEsU0FDQUMsSUFBQUEsU0FDQThELElBQUFBLFlBQ0FDLElBQUFBLFlBQ0FDLElBQUFBLFdBQ0FDLElBQUFBLE9BQ0FDLElBQUFBLGVBQ0FDLElBQUFBLGVBQ0FQLElBQUFBLG1CQUNBQyxJQUFBQSxpQkFDQVYsSUFBQUEsZUFDQU4sSUFBQUEsc0JBQ0FDLElBQUFBLFFBQ0FDLElBQUFBLFdBQ0FDLElBQUFBLE9BQ0FDLElBQUFBLHFCQUNBQyxJQUFBQSxVQU1JMkIsRUFBcUJDLFdBQ3pCLGlCQUFrQyxtQkFBckJqQixFQUFrQ0EsRUFBbUJrQixLQUNsRSxDQUFDbEIsSUFDR21CLEVBQXVCRixXQUMzQixpQkFBb0MsbUJBQXZCbEIsRUFBb0NBLEVBQXFCbUIsS0FDdEUsQ0FBQ25CLElBRUdxQixFQUFVQyxTQUFPLE1BQ2pCQyxFQUFXRCxTQUFPLFFBRUVFLGFBQVdDLEdBQVNqQixhQUF2Q2tCLE9BQU9DLE9BQ1BsQixFQUErQ2lCLEVBQS9DakIsVUFBV0MsRUFBb0NnQixFQUFwQ2hCLG1CQUFvQkksRUFBZ0JZLEVBQWhCWixhQUdoQ2MsRUFBZ0IsV0FFaEJsQixHQUNGbUIsWUFBVyxXQUNMTixFQUFTTyxVQUNLUCxFQUFTTyxRQUFsQjVLLE1BRUlsQyxTQUNUMk0sRUFBUyxDQUFDM0wsS0FBTSxnQkFDaEJvTCxRQUdILE1BR1BXLGFBQVUsa0JBQ0p4QyxHQUFrQjVCLElBQ2IsY0FHVE4sT0FBTzJFLGlCQUFpQixRQUFTSixHQUFlLEdBQ3pDLFdBQ0x2RSxPQUFPNEUsb0JBQW9CLFFBQVNMLEdBQWUsT0FFcEQsQ0FBQ0wsRUFBVWIsRUFBb0JVLEVBQXNCN0IsUUFFbEQyQyxFQUFpQlosU0FBTyxJQUN4QmEsR0FBaUIsU0FBQTFGLEdBQ2pCNEUsRUFBUVMsU0FBV1QsRUFBUVMsUUFBUU0sU0FBUzNGLEVBQU14RixVQUl0RHdGLEVBQU1PLGlCQUNOa0YsRUFBZUosUUFBVSxLQUczQkMsYUFBVSxrQkFDSjlDLElBQ0ZvRCxTQUFTTCxpQkFBaUIsV0FBWWpGLEdBQW9CLEdBQzFEc0YsU0FBU0wsaUJBQWlCLE9BQVFHLElBQWdCLElBRzdDLFdBQ0RsRCxJQUNGb0QsU0FBU0osb0JBQW9CLFdBQVlsRixHQUN6Q3NGLFNBQVNKLG9CQUFvQixPQUFRRSxRQUd4QyxDQUFDZCxFQUFTcEMsUUFFUHFELEdBQWdCQyxlQUNwQixTQUFBOUYsR0FDRUEsRUFBTU8saUJBRU5QLEVBQU0rRixVQUNOQyxHQUFnQmhHLEdBRWhCeUYsRUFBZUosb0JBQWNJLEVBQWVKLFVBQVNyRixFQUFNeEYsU0FFdkQwRixFQUFlRixJQUNqQjdKLFFBQVFDLFFBQVFpTSxFQUFrQnJDLElBQVFsSixNQUFLLFNBQUF1TixHQUN6Q3RFLEVBQXFCQyxLQUFXNEMsSUFJcENzQyxFQUFTLENBQ1BiLGFBQUFBLEVBQ0FILGNBQWMsRUFDZDNLLEtBQU0sb0JBR0prSyxHQUNGQSxFQUFZekQsU0FLcEIsQ0FBQ3FDLEVBQW1Cb0IsRUFBYWIsSUFHN0JxRCxHQUFlSCxlQUNuQixTQUFBOUYsR0FDRUEsRUFBTU8saUJBQ05QLEVBQU0rRixVQUNOQyxHQUFnQmhHLE9BRVZrRyxFQUFXaEcsRUFBZUYsTUFDNUJrRyxHQUFZbEcsRUFBTUcsaUJBRWxCSCxFQUFNRyxhQUFhZ0csV0FBYSxPQUNoQyxpQkFHQUQsR0FBWXZDLEdBQ2RBLEVBQVczRCxJQUdOLElBRVQsQ0FBQzJELEVBQVlmLElBR1R3RCxHQUFnQk4sZUFDcEIsU0FBQTlGLEdBQ0VBLEVBQU1PLGlCQUNOUCxFQUFNK0YsVUFDTkMsR0FBZ0JoRyxPQUdWcUcsRUFBVVosRUFBZUosUUFBUWpLLFFBQ3JDLFNBQUFaLFVBQVVvSyxFQUFRUyxTQUFXVCxFQUFRUyxRQUFRTSxTQUFTbkwsTUFJbEQ4TCxFQUFZRCxFQUFRM0ssUUFBUXNFLEVBQU14RixTQUNyQixJQUFmOEwsR0FDRkQsRUFBUUUsT0FBT0QsRUFBVyxHQUU1QmIsRUFBZUosUUFBVWdCLEVBQ3JCQSxFQUFROU4sT0FBUyxJQUlyQjJNLEVBQVMsQ0FDUGhCLGNBQWMsRUFDZDNLLEtBQU0sa0JBQ044SyxhQUFjLEtBR1puRSxFQUFlRixJQUFVMEQsR0FDM0JBLEVBQVkxRCxNQUdoQixDQUFDNEUsRUFBU2xCLEVBQWFkLElBR25CNEQsR0FBV1YsZUFBWSxTQUFDckwsRUFBT3VGLE9BQzdCdEIsRUFBZ0IsR0FDaEI0RixFQUFpQixHQUV2QjdKLEVBQU1nTSxTQUFRLFNBQUF0TixXQUNvQnFGLEVBQWFyRixFQUFNMkUsTUFBNUMrQixPQUFVNkcsV0FDY3BILEVBQWNuRyxFQUFNbUYsRUFBU0YsTUFBckQwQixPQUFXNkcsT0FDWkMsRUFBZS9ELEVBQVlBLEVBQVUxSixHQUFRLFFBRS9DMEcsR0FBWUMsSUFBYzhHLEVBQzVCbEksRUFBY2xHLEtBQUtXLE9BQ2QsS0FDRDBOLEVBQVMsQ0FBQ0gsRUFBYUMsR0FFdkJDLElBQ0ZDLEVBQVNBLEVBQU8xSyxPQUFPeUssSUFHekJ0QyxFQUFlOUwsS0FBSyxDQUFDVyxLQUFBQSxFQUFNME4sT0FBUUEsRUFBT3pMLFFBQU8sU0FBQTFFLFVBQUtBLGFBSXBEZ0osR0FBWWhCLEVBQWNuRyxPQUFTLEdBQU9tSCxHQUFZQyxHQUFZLEdBQUtqQixFQUFjbkcsT0FBU29ILEtBRWxHakIsRUFBYytILFNBQVEsU0FBQXROLEdBQ3BCbUwsRUFBZTlMLEtBQUssQ0FBQ1csS0FBQUEsRUFBTTBOLE9BQVEsQ0FBQ3RJLFFBRXRDRyxFQUFjNkgsT0FBTyxJQUd2QnJCLEVBQVMsQ0FDUHhHLGNBQUFBLEVBQ0E0RixlQUFBQSxFQUNBL0ssS0FBTSxhQUdKcUssR0FDRkEsRUFBT2xGLEVBQWU0RixFQUFnQnRFLEdBR3BDc0UsRUFBZS9MLE9BQVMsR0FBS3VMLEdBQy9CQSxFQUFlUSxFQUFnQnRFLEdBRzdCdEIsRUFBY25HLE9BQVMsR0FBS3NMLEdBQzlCQSxFQUFlbkYsRUFBZXNCLEtBRS9CLENBQ0RrRixFQUNBeEYsRUFDQTVCLEVBQ0FRLEVBQ0FGLEVBQ0F1QixFQUNBaUUsRUFDQUMsRUFDQUMsRUFDQWpCLElBR0lpRSxHQUFXaEIsZUFDZixTQUFBOUYsR0FDRUEsRUFBTU8saUJBRU5QLEVBQU0rRixVQUNOQyxHQUFnQmhHLEdBRWhCeUYsRUFBZUosUUFBVSxHQUVyQm5GLEVBQWVGLElBQ2pCN0osUUFBUUMsUUFBUWlNLEVBQWtCckMsSUFBUWxKLE1BQUssU0FBQTJELEdBQ3pDc0YsRUFBcUJDLEtBQVc0QyxHQUdwQzRELEdBQVMvTCxFQUFPdUYsTUFHcEJrRixFQUFTLENBQUMzTCxLQUFNLFlBRWxCLENBQ0U4SSxFQUNBbUUsR0FDQTVELElBS0VtRSxHQUFpQmpCLGVBQVksY0FDN0JoRCxHQUFrQjVCLEtBQ3BCZ0UsRUFBUyxDQUFDM0wsS0FBTSxlQUNoQmlMLFFBRU13QyxFQUFPLENBQ1h0SCxTQUFBQSxFQUNBVyxNQUFPYyxFQUF1QnJELElBRWhDOEMsT0FBT3FHLG1CQUFtQkQsR0FDdkJsUSxNQUFLLFNBQUE4RCxVQUFXeUgsRUFBa0J6SCxNQUNsQzlELE1BQUssU0FBQTJELFVBQVMrTCxHQUFTL0wsRUFBTyxTQUM5QnlNLE9BQU0sU0FBQXhRLFVBQUtpTyxFQUFxQmpPLE1BQ2hDeVEsU0FBUSxrQkFBTWpDLEVBQVMsQ0FBQzNMLEtBQU0sd0JBSS9CdUwsRUFBU08sVUFDWEgsRUFBUyxDQUFDM0wsS0FBTSxlQUNoQmlMLElBQ0FNLEVBQVNPLFFBQVE5TyxNQUFRLEtBQ3pCdU8sRUFBU08sUUFBUStCLFdBRWxCLENBQ0RsQyxFQUNBVixFQUNBRyxFQUNBN0IsRUFDQTBELEdBQ0ExSSxFQUNBNEIsSUFJSTJILEdBQWN2QixlQUNsQixTQUFBOUYsR0FFTzRFLEVBQVFTLFNBQVlULEVBQVFTLFFBQVFpQyxZQUFZdEgsRUFBTXhGLFVBSXJDLEtBQWxCd0YsRUFBTXVILFNBQW9DLEtBQWxCdkgsRUFBTXVILFVBQ2hDdkgsRUFBTU8saUJBQ053RyxTQUdKLENBQUNuQyxFQUFTRSxFQUFVaUMsS0FJaEJTLEdBQVkxQixlQUFZLFdBQzVCWixFQUFTLENBQUMzTCxLQUFNLFlBQ2YsSUFDR2tPLEdBQVczQixlQUFZLFdBQzNCWixFQUFTLENBQUMzTCxLQUFNLFdBQ2YsSUFHR21PLEdBQVk1QixlQUFZLFdBQ3hCckQsSUFPQTlCLElBQ0Z5RSxXQUFXMkIsR0FBZ0IsR0FFM0JBLFFBRUQsQ0FBQ2pDLEVBQVVyQyxFQUFTc0UsS0FFakJZLEdBQWlCLFNBQUExRyxVQUNkbUIsRUFBVyxLQUFPbkIsR0FHckIyRyxHQUF5QixTQUFBM0csVUFDdEJ5QixFQUFhLEtBQU9pRixHQUFlMUcsSUFHdEM0RyxHQUFxQixTQUFBNUcsVUFDbEIwQixFQUFTLEtBQU9nRixHQUFlMUcsSUFHbEMrRSxHQUFrQixTQUFBaEcsR0FDbEI0QyxHQUNGNUMsRUFBTWdHLG1CQUlKOEIsR0FBZXJELFdBQ25CLGtCQUFNLHdFQVlGLE9BWEZzRCxPQUFBQSxhQUFTLFFBQ1RDLElBQUFBLEtBQ0FDLElBQUFBLFVBQ0FDLElBQUFBLFFBQ0FDLElBQUFBLE9BQ0FDLElBQUFBLFFBQ0EzRSxJQUFBQSxZQUNBRSxJQUFBQSxXQUNBRCxJQUFBQSxZQUNBRSxJQUFBQSxPQUNHeUUsd0JBRUhKLFVBQVdMLEdBQXVCOUcsRUFBcUJtSCxFQUFXWixLQUNsRWEsUUFBU04sR0FBdUI5RyxFQUFxQm9ILEVBQVNWLEtBQzlEVyxPQUFRUCxHQUF1QjlHLEVBQXFCcUgsRUFBUVYsS0FDNURXLFFBQVNULEdBQWU3RyxFQUFxQnNILEVBQVNWLEtBQ3REakUsWUFBYW9FLEdBQW1CL0csRUFBcUIyQyxFQUFhb0MsS0FDbEVsQyxXQUFZa0UsR0FBbUIvRyxFQUFxQjZDLEVBQVlzQyxLQUNoRXZDLFlBQWFtRSxHQUFtQi9HLEVBQXFCNEMsRUFBYTBDLEtBQ2xFeEMsT0FBUWlFLEdBQW1CL0csRUFBcUI4QyxFQUFRa0QsS0FDeERrQixLQUFzQixpQkFBVEEsR0FBOEIsS0FBVEEsRUFBY0EsRUFBTyxVQUN0REQsRUFBU25ELEdBQ0x4QyxHQUFhTSxFQUE2QixHQUFoQixDQUFDNEYsU0FBVSxJQUN2Q0QsTUFFTCxDQUNFekQsRUFDQXlDLEdBQ0FHLEdBQ0FDLEdBQ0FDLEdBQ0E3QixHQUNBSSxHQUNBRyxHQUNBVSxHQUNBcEUsRUFDQUMsRUFDQVAsSUFJRW1HLEdBQXNCekMsZUFBWSxTQUFBOUYsR0FDdENBLEVBQU1nRyxvQkFDTCxJQUVHd0MsR0FBZ0IvRCxXQUNwQixrQkFBTSx3RUFBZ0QsT0FBOUNzRCxPQUFBQSxhQUFTLFFBQU9VLElBQUFBLFNBQVVMLElBQUFBLFFBQVlDLFVBQ3RDSyxLQUNKNUssT0FBQUEsRUFDQTRCLFNBQUFBLEVBQ0FuRyxLQUFNLE9BQ05vUCxNQUFPLENBQUNDLFFBQVMsUUFDakJILFNBQVVkLEdBQWU3RyxFQUFxQjJILEVBQVUzQixLQUN4RHNCLFFBQVNULEdBQWU3RyxFQUFxQnNILEVBQVNHLEtBQ3RETSxhQUFjLE1BQ2RQLFVBQVcsR0FDVlAsRUFBU2pELGlCQUlQNEQsR0FDQUwsTUFHUCxDQUFDdkQsRUFBVWhILEVBQVE0QixFQUFVb0gsR0FBVTFFLElBR25DMEcsR0FBWXpFLEVBQWE5TCxPQUN6QjRMLEdBQWUyRSxHQUFZLEdBQUtySixFQUFpQixDQUFDaEYsTUFBTzRKLEVBQWN2RyxPQUFBQSxFQUFRUSxRQUFBQSxFQUFTRixRQUFBQSxFQUFTc0IsU0FBQUEsRUFBVUMsU0FBQUEsSUFDM0d5RSxHQUFlMEUsR0FBWSxJQUFNM0UsaUJBR2xDYyxPQUNIZCxhQUFBQSxHQUNBQyxhQUFBQSxHQUNBSixVQUFXQSxJQUFjNUIsRUFDekIwRixhQUFBQSxHQUNBVSxjQUFBQSxHQUNBNUQsUUFBQUEsRUFDQUUsU0FBQUEsRUFDQWpELEtBQU04RixHQUFlWixNQUl6QixTQUFTL0IsR0FBUUMsRUFBTzhELFVBRWRBLEVBQU94UCxVQUNSLHNCQUVFMEwsT0FDSGpCLFdBQVcsUUFFVixxQkFFRWlCLE9BQ0hqQixXQUFXLFFBRVYsMkJBRUVELFFBQ0hFLG9CQUFvQixRQUVuQiw0QkFFRWdCLE9BQ0hoQixvQkFBb0IsUUFFbkIsc0JBRUlDLEVBQThCNkUsRUFBOUI3RSxhQUFjRyxFQUFnQjBFLEVBQWhCMUUsMkJBRWhCWSxPQUNIWixhQUFBQSxFQUNBSCxhQUFBQSxRQUVDLHlCQUVFZSxPQUNIdkcsY0FBZXFLLEVBQU9ySyxjQUN0QjRGLGVBQWdCeUUsRUFBT3pFLHFCQUV0QixvQkFFRVAsbUJBR0VrQixHQUliLFNBQVNQIn0=