react-dropzone 12.0.0 → 12.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -345,6 +345,10 @@ Fortunately, there's the [File System Access API](https://developer.mozilla.org/
345
345
 
346
346
  And this lib makes use of it if available. Though, there's a small catch: using file extensions for the `accept` property is not supported; you must use MIME types as described in [common MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types). Also check [accepting specific file types](https://react-dropzone.js.org/#section-accepting-specific-file-types) for more info on the subject of `accept` limitations.
347
347
 
348
+ Also keep in mind that the FS access API can only be used in [secure contexts](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts).
349
+
350
+ **NOTE** You can disable using the FS access API with the `useFsAccessApi` property: `useDropzone({useFsAccessApi: false})`.
351
+
348
352
  ## Supported Browsers
349
353
  We use [browserslist](https://github.com/browserslist/browserslist) config to state the browser support for this lib, so check it out on [browserslist.dev](https://browserslist.dev/?q=ZGVmYXVsdHM%3D).
350
354
 
package/dist/es/index.js CHANGED
@@ -37,7 +37,7 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
37
37
  import React, { forwardRef, Fragment, useCallback, useEffect, useImperativeHandle, useMemo, useReducer, useRef } from "react";
38
38
  import PropTypes from "prop-types";
39
39
  import { fromEvent } from "file-selector";
40
- import { allFilesAccepted, composeEventHandlers, fileAccepted, fileMatchSize, filePickerOptionsTypes, canUseFileSystemAccessAPI, isEvtWithFiles, isIeOrEdge, isPropagationStopped, onDocumentDragOver, TOO_MANY_FILES_REJECTION } from "./utils/index";
40
+ import { allFilesAccepted, composeEventHandlers, fileAccepted, fileMatchSize, filePickerOptionsTypes, canUseFileSystemAccessAPI, isAbort, isEvtWithFiles, isIeOrEdge, isPropagationStopped, isSecurityError, onDocumentDragOver, TOO_MANY_FILES_REJECTION } from "./utils/index";
41
41
  /**
42
42
  * Convenience wrapper component for the `useDropzone` hook
43
43
  *
@@ -465,11 +465,12 @@ export function useDropzone() {
465
465
 
466
466
  var isFocused = state.isFocused,
467
467
  isFileDialogActive = state.isFileDialogActive,
468
- draggedFiles = state.draggedFiles; // Update file dialog active state when the window is focused on
468
+ draggedFiles = state.draggedFiles;
469
+ var fsAccessApiWorksRef = useRef(typeof window !== "undefined" && window.isSecureContext && useFsAccessApi && canUseFileSystemAccessAPI()); // Update file dialog active state when the window is focused on
469
470
 
470
471
  var onWindowFocus = function onWindowFocus() {
471
472
  // Execute the timeout only if the file dialog is opened in the browser
472
- if (isFileDialogActive) {
473
+ if (!fsAccessApiWorksRef.current && isFileDialogActive) {
473
474
  setTimeout(function () {
474
475
  if (inputRef.current) {
475
476
  var files = inputRef.current.files;
@@ -486,15 +487,11 @@ export function useDropzone() {
486
487
  };
487
488
 
488
489
  useEffect(function () {
489
- if (useFsAccessApi && canUseFileSystemAccessAPI()) {
490
- return function () {};
491
- }
492
-
493
490
  window.addEventListener("focus", onWindowFocus, false);
494
491
  return function () {
495
492
  window.removeEventListener("focus", onWindowFocus, false);
496
493
  };
497
- }, [inputRef, isFileDialogActive, onFileDialogCancelCb, useFsAccessApi]);
494
+ }, [inputRef, isFileDialogActive, onFileDialogCancelCb, fsAccessApiWorksRef]);
498
495
  var dragTargetsRef = useRef([]);
499
496
 
500
497
  var onDocumentDrop = function onDocumentDrop(event) {
@@ -683,7 +680,9 @@ export function useDropzone() {
683
680
  }, [getFilesFromEvent, setFiles, noDragEventsBubbling]); // Fn for opening the file dialog programmatically
684
681
 
685
682
  var openFileDialog = useCallback(function () {
686
- if (useFsAccessApi && canUseFileSystemAccessAPI()) {
683
+ // No point to use FS access APIs if context is not secure
684
+ // https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts#feature_detection
685
+ if (fsAccessApiWorksRef.current) {
687
686
  dispatch({
688
687
  type: "openDialog"
689
688
  });
@@ -696,13 +695,26 @@ export function useDropzone() {
696
695
  window.showOpenFilePicker(opts).then(function (handles) {
697
696
  return getFilesFromEvent(handles);
698
697
  }).then(function (files) {
699
- return setFiles(files, null);
700
- }).catch(function (e) {
701
- return onFileDialogCancelCb(e);
702
- }).finally(function () {
703
- return dispatch({
698
+ setFiles(files, null);
699
+ dispatch({
704
700
  type: "closeDialog"
705
701
  });
702
+ }).catch(function (e) {
703
+ // AbortError means the user canceled
704
+ if (isAbort(e)) {
705
+ onFileDialogCancelCb(e);
706
+ dispatch({
707
+ type: "closeDialog"
708
+ });
709
+ } else if (isSecurityError(e)) {
710
+ fsAccessApiWorksRef.current = false; // CORS, so cannot use this API
711
+ // Try using the input
712
+
713
+ if (inputRef.current) {
714
+ inputRef.current.value = null;
715
+ inputRef.current.click();
716
+ }
717
+ }
706
718
  });
707
719
  return;
708
720
  }
@@ -727,7 +739,7 @@ export function useDropzone() {
727
739
  event.preventDefault();
728
740
  openFileDialog();
729
741
  }
730
- }, [rootRef, inputRef, openFileDialog]); // Update focus state for the dropzone
742
+ }, [rootRef, openFileDialog]); // Update focus state for the dropzone
731
743
 
732
744
  var onFocusCb = useCallback(function () {
733
745
  dispatch({
@@ -753,7 +765,7 @@ export function useDropzone() {
753
765
  } else {
754
766
  openFileDialog();
755
767
  }
756
- }, [inputRef, noClick, openFileDialog]);
768
+ }, [noClick, openFileDialog]);
757
769
 
758
770
  var composeHandler = function composeHandler(fn) {
759
771
  return disabled ? null : fn;
@@ -202,4 +202,26 @@ export function filePickerOptionsTypes(accept) {
202
202
  return _objectSpread(_objectSpread({}, a), {}, _defineProperty({}, b, []));
203
203
  }, {}) : {}
204
204
  }];
205
+ }
206
+ /**
207
+ * Check if v is an exception caused by aborting a request (e.g window.showOpenFilePicker()).
208
+ *
209
+ * See https://developer.mozilla.org/en-US/docs/Web/API/DOMException.
210
+ * @param {any} v
211
+ * @returns {boolean} True if v is an abort exception.
212
+ */
213
+
214
+ export function isAbort(v) {
215
+ return v instanceof DOMException && (v.name === "AbortError" || v.code === v.ABORT_ERR);
216
+ }
217
+ /**
218
+ * Check if v is a security error.
219
+ *
220
+ * See https://developer.mozilla.org/en-US/docs/Web/API/DOMException.
221
+ * @param {any} v
222
+ * @returns {boolean} True if v is a security error.
223
+ */
224
+
225
+ export function isSecurityError(v) {
226
+ return v instanceof DOMException && (v.name === "SecurityError" || v.code === v.SECURITY_ERR);
205
227
  }
package/dist/index.js CHANGED
@@ -12,5 +12,5 @@
12
12
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
13
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
14
  PERFORMANCE OF THIS SOFTWARE.
15
- ***************************************************************************** */()}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);n<t;n++)r[n]=e[n];return r}function v(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function u(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,u)}c((r=r.apply(e,t||[])).next())}))}function g(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,u])}}}function m(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >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;n<e.length;n++){var r=e[n];t.push(r)}return t}function A(e){if("function"!=typeof e.webkitGetAsEntry)return P(e);var t=e.webkitGetAsEntry();return t&&t.isDirectory?z(t):P(e)}function k(e){return e.reduce((function(e,t){return function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(m(arguments[t]));return e}(e,Array.isArray(t)?k(t):[t])}),[])}function P(e){var t=e.getAsFile();if(!t)return Promise.reject(e+" is not a File");var n=b(t);return Promise.resolve(n)}function E(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return[2,e.isDirectory?z(e):C(e)]}))}))}function z(e){var t=e.createReader();return new Promise((function(e,n){var r=[];!function o(){var i=this;t.readEntries((function(t){return v(i,void 0,void 0,(function(){var i,a,u;return g(this,(function(c){switch(c.label){case 0:if(t.length)return[3,5];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,Promise.all(r)];case 2:return i=c.sent(),e(i),[3,4];case 3:return a=c.sent(),n(a),[3,4];case 4:return[3,6];case 5:u=Promise.all(t.map(E)),r.push(u),o(),c.label=6;case 6:return[2]}}))}))}),(function(e){n(e)}))}()}))}function C(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return[2,new Promise((function(t,n){e.file((function(n){var r=b(n,e.fullPath);t(r)}),(function(e){n(e)}))}))]}))}))}var S="file-invalid-type",T="file-too-large",R="file-too-small",L="too-many-files",I={FileInvalidType:S,FileTooLarge:T,FileTooSmall:R,TooManyFiles:L},K=function(e){e=Array.isArray(e)&&1===e.length?e[0]:e;var t=Array.isArray(e)?"one of ".concat(e.join(", ")):e;return{code:S,message:"File type must be ".concat(t)}},M=function(e){return{code:T,message:"File is larger than ".concat(e," ").concat(1===e?"byte":"bytes")}},B=function(e){return{code:R,message:"File is smaller than ".concat(e," ").concat(1===e?"byte":"bytes")}},q={code:L,message:"Too many files"};function G(e,t){var n="application/x-moz-file"===e.type||function(e,t){if(e&&t){var n=Array.isArray(t)?t:t.split(","),r=e.name||"",o=(e.type||"").toLowerCase(),i=o.replace(/\/.*$/,"");return n.some((function(e){var t=e.trim().toLowerCase();return"."===t.charAt(0)?r.toLowerCase().endsWith(t):t.endsWith("/*")?i===t.replace(/\/.*$/,""):o===t}))}return!0}(e,t);return[n,n?null:K(t)]}function $(e,t,n){if(_(e.size))if(_(t)&&_(n)){if(e.size>n)return[!1,M(n)];if(e.size<t)return[!1,B(t)]}else{if(_(t)&&e.size<t)return[!1,B(t)];if(_(n)&&e.size>n)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;n<e;n++)t[n]=arguments[n];return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return t.some((function(t){return!W(e)&&t&&t.apply(void 0,[e].concat(r)),W(e)}))}}function Y(){return"showOpenFilePicker"in window}function Z(e){return e="string"==typeof e?e.split(","):e,[{description:"everything",accept:Array.isArray(e)?e.filter((function(e){return"audio/*"===e||"video/*"===e||"image/*"===e||"text/*"===e||/\w+\/[-+.\w]+/g.test(e)})).reduce((function(e,t){return u(u({},e),{},c({},t,[]))}),{}):{}}]}var ee=["children"],te=["open"],ne=["refKey","role","onKeyDown","onFocus","onBlur","onClick","onDragEnter","onDragOver","onDragLeave","onDrop"],re=["refKey","onChange","onClick"],oe=t.forwardRef((function(e,n){var r=e.children,i=ue(l(e,ee)),a=i.open,c=l(i,te);return t.useImperativeHandle(n,(function(){return{open:a}}),[a]),o.default.createElement(t.Fragment,null,r(u(u({},c),{},{open:a})))}));oe.displayName="Dropzone";var ie={disabled:!1,getFilesFromEvent:function(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return w(e)&&w(e.dataTransfer)?[2,F(e.dataTransfer,e.type)]:function(e){return w(e)&&w(e.target)}(e)?[2,D(e)]:Array.isArray(e)&&e.every((function(e){return"getFile"in e&&"function"==typeof e.getFile}))?[2,x(e)]:[2,[]]}))}))},maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!0};oe.defaultProps=ie,oe.propTypes={children:i.default.func,accept:i.default.oneOfType([i.default.string,i.default.arrayOf(i.default.string)]),multiple:i.default.bool,preventDropOnDocument:i.default.bool,noClick:i.default.bool,noKeyboard:i.default.bool,noDrag:i.default.bool,noDragEventsBubbling:i.default.bool,minSize:i.default.number,maxSize:i.default.number,maxFiles:i.default.number,disabled:i.default.bool,getFilesFromEvent:i.default.func,onFileDialogCancel:i.default.func,onFileDialogOpen:i.default.func,useFsAccessApi:i.default.bool,onDragEnter:i.default.func,onDragLeave:i.default.func,onDragOver:i.default.func,onDrop:i.default.func,onDropAccepted:i.default.func,onDropRejected:i.default.func,validator:i.default.func};var ae={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,draggedFiles:[],acceptedFiles:[],fileRejections:[]};function ue(){var e=arguments.length>0&&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})}));
16
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9ub2RlX21vZHVsZXMvZmlsZS1zZWxlY3Rvci9kaXN0L2VzNS9maWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2VsZWN0b3IvZGlzdC9lczUvZmlsZS1zZWxlY3Rvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9hdHRyLWFjY2VwdC9kaXN0L2VzL2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzL2luZGV4LmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiZXhwb3J0IHZhciBDT01NT05fTUlNRV9UWVBFUyA9IG5ldyBNYXAoW1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcbiAgICBbJ2FhYycsICdhdWRpby9hYWMnXSxcbiAgICBbJ2FidycsICdhcHBsaWNhdGlvbi94LWFiaXdvcmQnXSxcbiAgICBbJ2FyYycsICdhcHBsaWNhdGlvbi94LWZyZWVhcmMnXSxcbiAgICBbJ2F2aWYnLCAnaW1hZ2UvYXZpZiddLFxuICAgIFsnYXZpJywgJ3ZpZGVvL3gtbXN2aWRlbyddLFxuICAgIFsnYXp3JywgJ2FwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2snXSxcbiAgICBbJ2JpbicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ2JtcCcsICdpbWFnZS9ibXAnXSxcbiAgICBbJ2J6JywgJ2FwcGxpY2F0aW9uL3gtYnppcCddLFxuICAgIFsnYnoyJywgJ2FwcGxpY2F0aW9uL3gtYnppcDInXSxcbiAgICBbJ2NkYScsICdhcHBsaWNhdGlvbi94LWNkZiddLFxuICAgIFsnY3NoJywgJ2FwcGxpY2F0aW9uL3gtY3NoJ10sXG4gICAgWydjc3MnLCAndGV4dC9jc3MnXSxcbiAgICBbJ2NzdicsICd0ZXh0L2NzdiddLFxuICAgIFsnZG9jJywgJ2FwcGxpY2F0aW9uL21zd29yZCddLFxuICAgIFsnZG9jeCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCddLFxuICAgIFsnZW90JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0J10sXG4gICAgWydlcHViJywgJ2FwcGxpY2F0aW9uL2VwdWIremlwJ10sXG4gICAgWydneicsICdhcHBsaWNhdGlvbi9nemlwJ10sXG4gICAgWydnaWYnLCAnaW1hZ2UvZ2lmJ10sXG4gICAgWydodG0nLCAndGV4dC9odG1sJ10sXG4gICAgWydodG1sJywgJ3RleHQvaHRtbCddLFxuICAgIFsnaWNvJywgJ2ltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiddLFxuICAgIFsnaWNzJywgJ3RleHQvY2FsZW5kYXInXSxcbiAgICBbJ2phcicsICdhcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmUnXSxcbiAgICBbJ2pwZWcnLCAnaW1hZ2UvanBlZyddLFxuICAgIFsnanBnJywgJ2ltYWdlL2pwZWcnXSxcbiAgICBbJ2pzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnanNvbicsICdhcHBsaWNhdGlvbi9qc29uJ10sXG4gICAgWydqc29ubGQnLCAnYXBwbGljYXRpb24vbGQranNvbiddLFxuICAgIFsnbWlkJywgJ2F1ZGlvL21pZGknXSxcbiAgICBbJ21pZGknLCAnYXVkaW8vbWlkaSddLFxuICAgIFsnbWpzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnbXAzJywgJ2F1ZGlvL21wZWcnXSxcbiAgICBbJ21wNCcsICd2aWRlby9tcDQnXSxcbiAgICBbJ21wZWcnLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbXBrZycsICdhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbCddLFxuICAgIFsnb2RwJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uJ10sXG4gICAgWydvZHMnLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCddLFxuICAgIFsnb2R0JywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCddLFxuICAgIFsnb2dhJywgJ2F1ZGlvL29nZyddLFxuICAgIFsnb2d2JywgJ3ZpZGVvL29nZyddLFxuICAgIFsnb2d4JywgJ2FwcGxpY2F0aW9uL29nZyddLFxuICAgIFsnb3B1cycsICdhdWRpby9vcHVzJ10sXG4gICAgWydvdGYnLCAnZm9udC9vdGYnXSxcbiAgICBbJ3BuZycsICdpbWFnZS9wbmcnXSxcbiAgICBbJ3BkZicsICdhcHBsaWNhdGlvbi9wZGYnXSxcbiAgICBbJ3BocCcsICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCddLFxuICAgIFsncHB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50J10sXG4gICAgWydwcHR4JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nXSxcbiAgICBbJ3JhcicsICdhcHBsaWNhdGlvbi92bmQucmFyJ10sXG4gICAgWydydGYnLCAnYXBwbGljYXRpb24vcnRmJ10sXG4gICAgWydzaCcsICdhcHBsaWNhdGlvbi94LXNoJ10sXG4gICAgWydzdmcnLCAnaW1hZ2Uvc3ZnK3htbCddLFxuICAgIFsnc3dmJywgJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJ10sXG4gICAgWyd0YXInLCAnYXBwbGljYXRpb24veC10YXInXSxcbiAgICBbJ3RpZicsICdpbWFnZS90aWZmJ10sXG4gICAgWyd0aWZmJywgJ2ltYWdlL3RpZmYnXSxcbiAgICBbJ3RzJywgJ3ZpZGVvL21wMnQnXSxcbiAgICBbJ3R0ZicsICdmb250L3R0ZiddLFxuICAgIFsndHh0JywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ3ZzZCcsICdhcHBsaWNhdGlvbi92bmQudmlzaW8nXSxcbiAgICBbJ3dhdicsICdhdWRpby93YXYnXSxcbiAgICBbJ3dlYmEnLCAnYXVkaW8vd2VibSddLFxuICAgIFsnd2VibScsICd2aWRlby93ZWJtJ10sXG4gICAgWyd3ZWJwJywgJ2ltYWdlL3dlYnAnXSxcbiAgICBbJ3dvZmYnLCAnZm9udC93b2ZmJ10sXG4gICAgWyd3b2ZmMicsICdmb250L3dvZmYyJ10sXG4gICAgWyd4aHRtbCcsICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXSxcbiAgICBbJ3hscycsICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnXSxcbiAgICBbJ3hsc3gnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXSxcbiAgICBbJ3htbCcsICdhcHBsaWNhdGlvbi94bWwnXSxcbiAgICBbJ3h1bCcsICdhcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sJ10sXG4gICAgWyd6aXAnLCAnYXBwbGljYXRpb24vemlwJ10sXG4gICAgWyc3eicsICdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnXSxcbiAgICAvLyBPdGhlcnNcbiAgICBbJ21rdicsICd2aWRlby94LW1hdHJvc2thJ10sXG4gICAgWydtb3YnLCAndmlkZW8vcXVpY2t0aW1lJ10sXG4gICAgWydtc2cnLCAnYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2snXVxuXSk7XG5leHBvcnQgZnVuY3Rpb24gdG9GaWxlV2l0aFBhdGgoZmlsZSwgcGF0aCkge1xuICAgIHZhciBmID0gd2l0aE1pbWVUeXBlKGZpbGUpO1xuICAgIGlmICh0eXBlb2YgZi5wYXRoICE9PSAnc3RyaW5nJykgeyAvLyBvbiBlbGVjdHJvbiwgcGF0aCBpcyBhbHJlYWR5IHNldCB0byB0aGUgYWJzb2x1dGUgcGF0aFxuICAgICAgICB2YXIgd2Via2l0UmVsYXRpdmVQYXRoID0gZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGg7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAncGF0aCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IHBhdGhcbiAgICAgICAgICAgICAgICAvLyBJZiA8aW5wdXQgd2Via2l0ZGlyZWN0b3J5PiBpcyBzZXQsXG4gICAgICAgICAgICAgICAgLy8gdGhlIEZpbGUgd2lsbCBoYXZlIGEge3dlYmtpdFJlbGF0aXZlUGF0aH0gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTElucHV0RWxlbWVudC93ZWJraXRkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiB3ZWJraXRSZWxhdGl2ZVBhdGggPT09ICdzdHJpbmcnICYmIHdlYmtpdFJlbGF0aXZlUGF0aC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gd2Via2l0UmVsYXRpdmVQYXRoXG4gICAgICAgICAgICAgICAgICAgIDogZmlsZS5uYW1lLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmO1xufVxuZnVuY3Rpb24gd2l0aE1pbWVUeXBlKGZpbGUpIHtcbiAgICB2YXIgbmFtZSA9IGZpbGUubmFtZTtcbiAgICB2YXIgaGFzRXh0ZW5zaW9uID0gbmFtZSAmJiBuYW1lLmxhc3RJbmRleE9mKCcuJykgIT09IC0xO1xuICAgIGlmIChoYXNFeHRlbnNpb24gJiYgIWZpbGUudHlwZSkge1xuICAgICAgICB2YXIgZXh0ID0gbmFtZS5zcGxpdCgnLicpXG4gICAgICAgICAgICAucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIHR5cGUgPSBDT01NT05fTUlNRV9UWVBFUy5nZXQoZXh0KTtcbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWxlLCAndHlwZScsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdG9GaWxlV2l0aFBhdGggfSBmcm9tICcuL2ZpbGUnO1xudmFyIEZJTEVTX1RPX0lHTk9SRSA9IFtcbiAgICAvLyBUaHVtYm5haWwgY2FjaGUgZmlsZXMgZm9yIG1hY09TIGFuZCBXaW5kb3dzXG4gICAgJy5EU19TdG9yZScsXG4gICAgJ1RodW1icy5kYicgLy8gV2luZG93c1xuXTtcbi8qKlxuICogQ29udmVydCBhIERyYWdFdmVudCdzIERhdGFUcmFzZmVyIG9iamVjdCB0byBhIGxpc3Qgb2YgRmlsZSBvYmplY3RzXG4gKiBOT1RFOiBJZiBzb21lIG9mIHRoZSBpdGVtcyBhcmUgZm9sZGVycyxcbiAqIGV2ZXJ5dGhpbmcgd2lsbCBiZSBmbGF0dGVuZWQgYW5kIHBsYWNlZCBpbiB0aGUgc2FtZSBsaXN0IGJ1dCB0aGUgcGF0aHMgd2lsbCBiZSBrZXB0IGFzIGEge3BhdGh9IHByb3BlcnR5LlxuICpcbiAqIEVYUEVSSU1FTlRBTDogQSBsaXN0IG9mIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtSGFuZGxlIG9iamVjdHMgY2FuIGFsc28gYmUgcGFzc2VkIGFzIGFuIGFyZ1xuICogYW5kIGEgbGlzdCBvZiBGaWxlIG9iamVjdHMgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZXZ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRXZlbnQoZXZ0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZXZ0KSAmJiBpc0RhdGFUcmFuc2ZlcihldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldERhdGFUcmFuc2ZlckZpbGVzKGV2dC5kYXRhVHJhbnNmZXIsIGV2dC50eXBlKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0NoYW5nZUV2dChldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldElucHV0RmlsZXMoZXZ0KV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV2dCkgJiYgZXZ0LmV2ZXJ5KGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAnZ2V0RmlsZScgaW4gaXRlbSAmJiB0eXBlb2YgaXRlbS5nZXRGaWxlID09PSAnZnVuY3Rpb24nOyB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnZXRGc0hhbmRsZUZpbGVzKGV2dCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc0RhdGFUcmFuc2Zlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc09iamVjdCh2YWx1ZS5kYXRhVHJhbnNmZXIpO1xufVxuZnVuY3Rpb24gaXNDaGFuZ2VFdnQodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzT2JqZWN0KHZhbHVlLnRhcmdldCk7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0SW5wdXRGaWxlcyhldnQpIHtcbiAgICByZXR1cm4gZnJvbUxpc3QoZXZ0LnRhcmdldC5maWxlcykubWFwKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiB0b0ZpbGVXaXRoUGF0aChmaWxlKTsgfSk7XG59XG4vLyBFZSBleHBlY3QgZWFjaCBoYW5kbGUgdG8gYmUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1GaWxlSGFuZGxlXG5mdW5jdGlvbiBnZXRGc0hhbmRsZUZpbGVzKGhhbmRsZXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWxlcztcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoZnVuY3Rpb24gKGgpIHsgcmV0dXJuIGguZ2V0RmlsZSgpOyB9KSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVRyYW5zZmVyRmlsZXMoZHQsIHR5cGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpdGVtcywgZmlsZXM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmIChkdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWR0Lml0ZW1zKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBmcm9tTGlzdChkdC5pdGVtcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0ua2luZCA9PT0gJ2ZpbGUnOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSAnZHJhZ3N0YXJ0JyBhbmQgJ2Ryb3AnIGhhcyBhY2Nlc3MgdG8gdGhlIGRhdGEgKHNvdXJjZSBub2RlKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gJ2Ryb3AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaXRlbXNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGl0ZW1zLm1hcCh0b0ZpbGVQcm9taXNlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbm9JZ25vcmVkRmlsZXMoZmxhdHRlbihmaWxlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCBub0lnbm9yZWRGaWxlcyhmcm9tTGlzdChkdC5maWxlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KSldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vSWdub3JlZEZpbGVzKGZpbGVzKSB7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkgeyByZXR1cm4gRklMRVNfVE9fSUdOT1JFLmluZGV4T2YoZmlsZS5uYW1lKSA9PT0gLTE7IH0pO1xufVxuLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5LmZyb20oKVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZnJvbSNCcm93c2VyX2NvbXBhdGliaWxpdHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlTGlzdFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlckl0ZW1MaXN0XG5mdW5jdGlvbiBmcm9tTGlzdChpdGVtcykge1xuICAgIGlmIChpdGVtcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBmaWxlcyA9IFtdO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOiBwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmlsZSA9IGl0ZW1zW2ldO1xuICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVySXRlbVxuZnVuY3Rpb24gdG9GaWxlUHJvbWlzZXMoaXRlbSkge1xuICAgIGlmICh0eXBlb2YgaXRlbS53ZWJraXRHZXRBc0VudHJ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmcm9tRGF0YVRyYW5zZmVySXRlbShpdGVtKTtcbiAgICB9XG4gICAgdmFyIGVudHJ5ID0gaXRlbS53ZWJraXRHZXRBc0VudHJ5KCk7XG4gICAgLy8gU2FmYXJpIHN1cHBvcnRzIGRyb3BwaW5nIGFuIGltYWdlIG5vZGUgZnJvbSBhIGRpZmZlcmVudCB3aW5kb3cgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmdcbiAgICAvLyB0aGUgRGF0YVRyYW5zZmVySXRlbS5nZXRBc0ZpbGUoKSBBUElcbiAgICAvLyBOT1RFOiBGaWxlU3lzdGVtRW50cnkuZmlsZSgpIHRocm93cyBpZiB0cnlpbmcgdG8gZ2V0IHRoZSBmaWxlXG4gICAgaWYgKGVudHJ5ICYmIGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHJldHVybiBmcm9tRGlyRW50cnkoZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSk7XG59XG5mdW5jdGlvbiBmbGF0dGVuKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmaWxlcykgeyByZXR1cm4gX19zcHJlYWQoYWNjLCAoQXJyYXkuaXNBcnJheShmaWxlcykgPyBmbGF0dGVuKGZpbGVzKSA6IFtmaWxlc10pKTsgfSwgW10pO1xufVxuZnVuY3Rpb24gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSkge1xuICAgIHZhciBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGl0ZW0gKyBcIiBpcyBub3QgYSBGaWxlXCIpO1xuICAgIH1cbiAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmd3ApO1xufVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1FbnRyeVxuZnVuY3Rpb24gZnJvbUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW50cnkuaXNEaXJlY3RvcnkgPyBmcm9tRGlyRW50cnkoZW50cnkpIDogZnJvbUZpbGVFbnRyeShlbnRyeSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRGlyZWN0b3J5RW50cnlcbmZ1bmN0aW9uIGZyb21EaXJFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWFkZXIgPSBlbnRyeS5jcmVhdGVSZWFkZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgICBmdW5jdGlvbiByZWFkRW50cmllcygpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZVN5c3RlbURpcmVjdG9yeUVudHJ5L2NyZWF0ZVJlYWRlclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1EaXJlY3RvcnlSZWFkZXIvcmVhZEVudHJpZXNcbiAgICAgICAgICAgIHJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoYmF0Y2gpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZXMsIGVycl8xLCBpdGVtcztcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFiYXRjaC5sZW5ndGgpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGVudHJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IFByb21pc2UuYWxsKGJhdGNoLm1hcChmcm9tRW50cnkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHJlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTsgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZEVudHJpZXMoKTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRmlsZUVudHJ5XG5mdW5jdGlvbiBmcm9tRmlsZUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSwgZW50cnkuZnVsbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmd3ApO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUtc2VsZWN0b3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmIChmaWxlICYmIGFjY2VwdGVkRmlsZXMpIHtcbiAgICB2YXIgYWNjZXB0ZWRGaWxlc0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NlcHRlZEZpbGVzKSA/IGFjY2VwdGVkRmlsZXMgOiBhY2NlcHRlZEZpbGVzLnNwbGl0KCcsJyk7XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICcnO1xuICAgIHZhciBtaW1lVHlwZSA9IChmaWxlLnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGJhc2VNaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICByZXR1cm4gYWNjZXB0ZWRGaWxlc0FycmF5LnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHZhciB2YWxpZFR5cGUgPSB0eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAodmFsaWRUeXBlLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKHZhbGlkVHlwZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbGlkVHlwZS5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcbiAgICAgICAgcmV0dXJuIGJhc2VNaW1lVHlwZSA9PT0gdmFsaWRUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1pbWVUeXBlID09PSB2YWxpZFR5cGU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07IiwiaW1wb3J0IGFjY2VwdHMgZnJvbSBcImF0dHItYWNjZXB0XCI7XG5cbi8vIEVycm9yIGNvZGVzXG5leHBvcnQgY29uc3QgRklMRV9JTlZBTElEX1RZUEUgPSBcImZpbGUtaW52YWxpZC10eXBlXCI7XG5leHBvcnQgY29uc3QgRklMRV9UT09fTEFSR0UgPSBcImZpbGUtdG9vLWxhcmdlXCI7XG5leHBvcnQgY29uc3QgRklMRV9UT09fU01BTEwgPSBcImZpbGUtdG9vLXNtYWxsXCI7XG5leHBvcnQgY29uc3QgVE9PX01BTllfRklMRVMgPSBcInRvby1tYW55LWZpbGVzXCI7XG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGUgPSB7XG4gIEZpbGVJbnZhbGlkVHlwZTogRklMRV9JTlZBTElEX1RZUEUsXG4gIEZpbGVUb29MYXJnZTogRklMRV9UT09fTEFSR0UsXG4gIEZpbGVUb29TbWFsbDogRklMRV9UT09fU01BTEwsXG4gIFRvb01hbnlGaWxlczogVE9PX01BTllfRklMRVMsXG59O1xuXG4vLyBGaWxlIEVycm9yc1xuZXhwb3J0IGNvbnN0IGdldEludmFsaWRUeXBlUmVqZWN0aW9uRXJyID0gKGFjY2VwdCkgPT4ge1xuICBhY2NlcHQgPSBBcnJheS5pc0FycmF5KGFjY2VwdCkgJiYgYWNjZXB0Lmxlbmd0aCA9PT0gMSA/IGFjY2VwdFswXSA6IGFjY2VwdDtcbiAgY29uc3QgbWVzc2FnZVN1ZmZpeCA9IEFycmF5LmlzQXJyYXkoYWNjZXB0KVxuICAgID8gYG9uZSBvZiAke2FjY2VwdC5qb2luKFwiLCBcIil9YFxuICAgIDogYWNjZXB0O1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfSU5WQUxJRF9UWVBFLFxuICAgIG1lc3NhZ2U6IGBGaWxlIHR5cGUgbXVzdCBiZSAke21lc3NhZ2VTdWZmaXh9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUb29MYXJnZVJlamVjdGlvbkVyciA9IChtYXhTaXplKSA9PiB7XG4gIHJldHVybiB7XG4gICAgY29kZTogRklMRV9UT09fTEFSR0UsXG4gICAgbWVzc2FnZTogYEZpbGUgaXMgbGFyZ2VyIHRoYW4gJHttYXhTaXplfSAke1xuICAgICAgbWF4U2l6ZSA9PT0gMSA/IFwiYnl0ZVwiIDogXCJieXRlc1wiXG4gICAgfWAsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIgPSAobWluU2l6ZSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfVE9PX1NNQUxMLFxuICAgIG1lc3NhZ2U6IGBGaWxlIGlzIHNtYWxsZXIgdGhhbiAke21pblNpemV9ICR7XG4gICAgICBtaW5TaXplID09PSAxID8gXCJieXRlXCIgOiBcImJ5dGVzXCJcbiAgICB9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBUT09fTUFOWV9GSUxFU19SRUpFQ1RJT04gPSB7XG4gIGNvZGU6IFRPT19NQU5ZX0ZJTEVTLFxuICBtZXNzYWdlOiBcIlRvbyBtYW55IGZpbGVzXCIsXG59O1xuXG4vLyBGaXJlZm94IHZlcnNpb25zIHByaW9yIHRvIDUzIHJldHVybiBhIGJvZ3VzIE1JTUUgdHlwZSBmb3IgZXZlcnkgZmlsZSBkcmFnLCBzbyBkcmFnb3ZlcnMgd2l0aFxuLy8gdGhhdCBNSU1FIHR5cGUgd2lsbCBhbHdheXMgYmUgYWNjZXB0ZWRcbmV4cG9ydCBmdW5jdGlvbiBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KSB7XG4gIGNvbnN0IGlzQWNjZXB0YWJsZSA9XG4gICAgZmlsZS50eXBlID09PSBcImFwcGxpY2F0aW9uL3gtbW96LWZpbGVcIiB8fCBhY2NlcHRzKGZpbGUsIGFjY2VwdCk7XG4gIHJldHVybiBbXG4gICAgaXNBY2NlcHRhYmxlLFxuICAgIGlzQWNjZXB0YWJsZSA/IG51bGwgOiBnZXRJbnZhbGlkVHlwZVJlamVjdGlvbkVycihhY2NlcHQpLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsZU1hdGNoU2l6ZShmaWxlLCBtaW5TaXplLCBtYXhTaXplKSB7XG4gIGlmIChpc0RlZmluZWQoZmlsZS5zaXplKSkge1xuICAgIGlmIChpc0RlZmluZWQobWluU2l6ZSkgJiYgaXNEZWZpbmVkKG1heFNpemUpKSB7XG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4U2l6ZSkgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIobWF4U2l6ZSldO1xuICAgICAgaWYgKGZpbGUuc2l6ZSA8IG1pblNpemUpIHJldHVybiBbZmFsc2UsIGdldFRvb1NtYWxsUmVqZWN0aW9uRXJyKG1pblNpemUpXTtcbiAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChtaW5TaXplKSAmJiBmaWxlLnNpemUgPCBtaW5TaXplKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIobWluU2l6ZSldO1xuICAgIGVsc2UgaWYgKGlzRGVmaW5lZChtYXhTaXplKSAmJiBmaWxlLnNpemUgPiBtYXhTaXplKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIobWF4U2l6ZSldO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbEZpbGVzQWNjZXB0ZWQoe1xuICBmaWxlcyxcbiAgYWNjZXB0LFxuICBtaW5TaXplLFxuICBtYXhTaXplLFxuICBtdWx0aXBsZSxcbiAgbWF4RmlsZXMsXG59KSB7XG4gIGlmIChcbiAgICAoIW11bHRpcGxlICYmIGZpbGVzLmxlbmd0aCA+IDEpIHx8XG4gICAgKG11bHRpcGxlICYmIG1heEZpbGVzID49IDEgJiYgZmlsZXMubGVuZ3RoID4gbWF4RmlsZXMpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcy5ldmVyeSgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IFthY2NlcHRlZF0gPSBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KTtcbiAgICBjb25zdCBbc2l6ZU1hdGNoXSA9IGZpbGVNYXRjaFNpemUoZmlsZSwgbWluU2l6ZSwgbWF4U2l6ZSk7XG4gICAgcmV0dXJuIGFjY2VwdGVkICYmIHNpemVNYXRjaDtcbiAgfSk7XG59XG5cbi8vIFJlYWN0J3Mgc3ludGhldGljIGV2ZW50cyBoYXMgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQsXG4vLyBidXQgdG8gcmVtYWluIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaWJzIChQcmVhY3QpIGZhbGwgYmFja1xuLy8gdG8gY2hlY2sgZXZlbnQuY2FuY2VsQnViYmxlXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBldmVudC5jYW5jZWxCdWJibGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFdnRXaXRoRmlsZXMoZXZlbnQpIHtcbiAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICByZXR1cm4gISFldmVudC50YXJnZXQgJiYgISFldmVudC50YXJnZXQuZmlsZXM7XG4gIH1cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci90eXBlc1xuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9SZWNvbW1lbmRlZF9kcmFnX3R5cGVzI2ZpbGVcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLFxuICAgICh0eXBlKSA9PiB0eXBlID09PSBcIkZpbGVzXCIgfHwgdHlwZSA9PT0gXCJhcHBsaWNhdGlvbi94LW1vei1maWxlXCJcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2luZEZpbGUoaXRlbSkge1xuICByZXR1cm4gdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiYgaXRlbSAhPT0gbnVsbCAmJiBpdGVtLmtpbmQgPT09IFwiZmlsZVwiO1xufVxuXG4vLyBhbGxvdyB0aGUgZW50aXJlIGRvY3VtZW50IHRvIGJlIGEgZHJhZyB0YXJnZXRcbmV4cG9ydCBmdW5jdGlvbiBvbkRvY3VtZW50RHJhZ092ZXIoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn1cblxuZnVuY3Rpb24gaXNJZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIChcbiAgICB1c2VyQWdlbnQuaW5kZXhPZihcIk1TSUVcIikgIT09IC0xIHx8IHVzZXJBZ2VudC5pbmRleE9mKFwiVHJpZGVudC9cIikgIT09IC0xXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRWRnZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIHVzZXJBZ2VudC5pbmRleE9mKFwiRWRnZS9cIikgIT09IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZU9yRWRnZSh1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkge1xuICByZXR1cm4gaXNJZSh1c2VyQWdlbnQpIHx8IGlzRWRnZSh1c2VyQWdlbnQpO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjb21wb3NlIGV2ZW50IGhhbmRsZXJzXG4gKiBUaGV5IGFyZSBleGVjdXRlZCBpbiBvcmRlciB1bnRpbCBvbmUgb2YgdGhlbSBjYWxscyBgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKWAuXG4gKiBOb3RlIHRoYXQgdGhlIGNoZWNrIGlzIGRvbmUgb24gdGhlIGZpcnN0IGludm9rZSB0b28sXG4gKiBtZWFuaW5nIHRoYXQgaWYgcHJvcGFnYXRpb24gd2FzIHN0b3BwZWQgYmVmb3JlIGludm9raW5nIHRoZSBmbnMsXG4gKiBubyBoYW5kbGVycyB3aWxsIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZucyB0aGUgZXZlbnQgaGFubGRlciBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgZXZlbnQgaGFuZGxlciB0byBhZGQgdG8gYW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUV2ZW50SGFuZGxlcnMoLi4uZm5zKSB7XG4gIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnNvbWUoKGZuKSA9PiB7XG4gICAgICBpZiAoIWlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiBmbikge1xuICAgICAgICBmbihldmVudCwgLi4uYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkgY2hlY2tzIGlmIHRoZSBbRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUEkpXG4gKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkoKSB7XG4gIHJldHVybiBcInNob3dPcGVuRmlsZVBpY2tlclwiIGluIHdpbmRvdztcbn1cblxuLyoqXG4gKiBmaWxlUGlja2VyT3B0aW9uc1R5cGVzIHJldHVybnMgdGhlIHt0eXBlc30gb3B0aW9uIGZvciBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvd2luZG93L3Nob3dPcGVuRmlsZVBpY2tlclxuICogYmFzZWQgb24gdGhlIGFjY2VwdCBhdHRyIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL2F0dHItYWNjZXB0KVxuICogRS5nOiBjb252ZXJ0cyBbJ2ltYWdlLyonLCAndGV4dC8qJ10gdG8geydpbWFnZS8qJzogW10sICd0ZXh0LyonOiBbXX1cbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhY2NlcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVQaWNrZXJPcHRpb25zVHlwZXMoYWNjZXB0KSB7XG4gIGFjY2VwdCA9IHR5cGVvZiBhY2NlcHQgPT09IFwic3RyaW5nXCIgPyBhY2NlcHQuc3BsaXQoXCIsXCIpIDogYWNjZXB0O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImV2ZXJ5dGhpbmdcIixcbiAgICAgIC8vIFRPRE86IE5lZWQgdG8gaGFuZGxlIGZpbHRlcmluZyBtb3JlIGVsZWdhbnRseSB0aGFuIHRoaXMhXG4gICAgICBhY2NlcHQ6IEFycmF5LmlzQXJyYXkoYWNjZXB0KVxuICAgICAgICA/IC8vIEFjY2VwdCBqdXN0IE1JTUUgdHlwZXMgYXMgcGVyIHNwZWNcbiAgICAgICAgICAvLyBOT1RFOiBhY2NlcHQgY2FuIGJlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9maWxlI3VuaXF1ZV9maWxlX3R5cGVfc3BlY2lmaWVyc1xuICAgICAgICAgIGFjY2VwdFxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgaXRlbSA9PT0gXCJhdWRpby8qXCIgfHxcbiAgICAgICAgICAgICAgICBpdGVtID09PSBcInZpZGVvLypcIiB8fFxuICAgICAgICAgICAgICAgIGl0ZW0gPT09IFwiaW1hZ2UvKlwiIHx8XG4gICAgICAgICAgICAgICAgaXRlbSA9PT0gXCJ0ZXh0LypcIiB8fFxuICAgICAgICAgICAgICAgIC9cXHcrXFwvWy0rLlxcd10rL2cudGVzdChpdGVtKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gKHsgLi4uYSwgW2JdOiBbXSB9KSwge30pXG4gICAgICAgIDoge30sXG4gICAgfSxcbiAgXTtcbn1cbiIsIi8qIGVzbGludCBwcmVmZXItdGVtcGxhdGU6IDAgKi9cbmltcG9ydCBSZWFjdCwge1xuICBmb3J3YXJkUmVmLFxuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlTWVtbyxcbiAgdXNlUmVkdWNlcixcbiAgdXNlUmVmLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gXCJmaWxlLXNlbGVjdG9yXCI7XG5pbXBvcnQge1xuICBhbGxGaWxlc0FjY2VwdGVkLFxuICBjb21wb3NlRXZlbnRIYW5kbGVycyxcbiAgZmlsZUFjY2VwdGVkLFxuICBmaWxlTWF0Y2hTaXplLFxuICBmaWxlUGlja2VyT3B0aW9uc1R5cGVzLFxuICBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJLFxuICBpc0V2dFdpdGhGaWxlcyxcbiAgaXNJZU9yRWRnZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQsXG4gIG9uRG9jdW1lbnREcmFnT3ZlcixcbiAgVE9PX01BTllfRklMRVNfUkVKRUNUSU9OLFxufSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgY29tcG9uZW50IGZvciB0aGUgYHVzZURyb3B6b25lYCBob29rXG4gKlxuICogYGBganN4XG4gKiA8RHJvcHpvbmU+XG4gKiAgIHsoe2dldFJvb3RQcm9wcywgZ2V0SW5wdXRQcm9wc30pID0+IChcbiAqICAgICA8ZGl2IHsuLi5nZXRSb290UHJvcHMoKX0+XG4gKiAgICAgICA8aW5wdXQgey4uLmdldElucHV0UHJvcHMoKX0gLz5cbiAqICAgICAgIDxwPkRyYWcgJ24nIGRyb3Agc29tZSBmaWxlcyBoZXJlLCBvciBjbGljayB0byBzZWxlY3QgZmlsZXM8L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgICl9XG4gKiA8L0Ryb3B6b25lPlxuICogYGBgXG4gKi9cbmNvbnN0IERyb3B6b25lID0gZm9yd2FyZFJlZigoeyBjaGlsZHJlbiwgLi4ucGFyYW1zIH0sIHJlZikgPT4ge1xuICBjb25zdCB7IG9wZW4sIC4uLnByb3BzIH0gPSB1c2VEcm9wem9uZShwYXJhbXMpO1xuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoeyBvcGVuIH0pLCBbb3Blbl0pO1xuXG4gIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IHJlYWN0LXN0eWxlZ3VpZGlzdCBjYW5ub3QgY3JlYXRlIGRvY3MgaWYgd2UgZG9uJ3QgcmV0dXJuIGEganN4IGVsZW1lbnRcbiAgcmV0dXJuIDxGcmFnbWVudD57Y2hpbGRyZW4oeyAuLi5wcm9wcywgb3BlbiB9KX08L0ZyYWdtZW50Pjtcbn0pO1xuXG5Ecm9wem9uZS5kaXNwbGF5TmFtZSA9IFwiRHJvcHpvbmVcIjtcblxuLy8gQWRkIGRlZmF1bHQgcHJvcHMgZm9yIHJlYWN0LWRvY2dlblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBkaXNhYmxlZDogZmFsc2UsXG4gIGdldEZpbGVzRnJvbUV2ZW50OiBmcm9tRXZlbnQsXG4gIG1heFNpemU6IEluZmluaXR5LFxuICBtaW5TaXplOiAwLFxuICBtdWx0aXBsZTogdHJ1ZSxcbiAgbWF4RmlsZXM6IDAsXG4gIHByZXZlbnREcm9wT25Eb2N1bWVudDogdHJ1ZSxcbiAgbm9DbGljazogZmFsc2UsXG4gIG5vS2V5Ym9hcmQ6IGZhbHNlLFxuICBub0RyYWc6IGZhbHNlLFxuICBub0RyYWdFdmVudHNCdWJibGluZzogZmFsc2UsXG4gIHZhbGlkYXRvcjogbnVsbCxcbiAgdXNlRnNBY2Nlc3NBcGk6IHRydWUsXG59O1xuXG5Ecm9wem9uZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbkRyb3B6b25lLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFJlbmRlciBmdW5jdGlvbiB0aGF0IGV4cG9zZXMgdGhlIGRyb3B6b25lIHN0YXRlIGFuZCBwcm9wIGdldHRlciBmbnNcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMuZ2V0Um9vdFByb3BzIFJldHVybnMgdGhlIHByb3BzIHlvdSBzaG91bGQgYXBwbHkgdG8gdGhlIHJvb3QgZHJvcCBjb250YWluZXIgeW91IHJlbmRlclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMuZ2V0SW5wdXRQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIGhpZGRlbiBmaWxlIGlucHV0IHlvdSByZW5kZXJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLm9wZW4gT3BlbiB0aGUgbmF0aXZlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0ZvY3VzZWQgRHJvcHpvbmUgYXJlYSBpcyBpbiBmb2N1c1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0ZpbGVEaWFsb2dBY3RpdmUgRmlsZSBkaWFsb2cgaXMgb3BlbmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmlzRHJhZ0FjdGl2ZSBBY3RpdmUgZHJhZyBpcyBpbiBwcm9ncmVzc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0RyYWdBY2NlcHQgRHJhZ2dlZCBmaWxlcyBhcmUgYWNjZXB0ZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNEcmFnUmVqZWN0IFNvbWUgZHJhZ2dlZCBmaWxlcyBhcmUgcmVqZWN0ZWRcbiAgICogQHBhcmFtIHtGaWxlW119IHBhcmFtcy5kcmFnZ2VkRmlsZXMgRmlsZXMgaW4gYWN0aXZlIGRyYWdcbiAgICogQHBhcmFtIHtGaWxlW119IHBhcmFtcy5hY2NlcHRlZEZpbGVzIEFjY2VwdGVkIGZpbGVzXG4gICAqIEBwYXJhbSB7RmlsZVJlamVjdGlvbltdfSBwYXJhbXMuZmlsZVJlamVjdGlvbnMgUmVqZWN0ZWQgZmlsZXMgYW5kIHdoeSB0aGV5IHdlcmUgcmVqZWN0ZWRcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogU2V0IGFjY2VwdGVkIGZpbGUgdHlwZXMuXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vb2tvbmV0L2F0dHItYWNjZXB0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiBLZWVwIGluIG1pbmQgdGhhdCBtaW1lIHR5cGUgZGV0ZXJtaW5hdGlvbiBpcyBub3QgcmVsaWFibGUgYWNyb3NzIHBsYXRmb3Jtcy4gQ1NWIGZpbGVzLFxuICAgKiBmb3IgZXhhbXBsZSwgYXJlIHJlcG9ydGVkIGFzIHRleHQvcGxhaW4gdW5kZXIgbWFjT1MgYnV0IGFzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCB1bmRlclxuICAgKiBXaW5kb3dzLiBJbiBzb21lIGNhc2VzIHRoZXJlIG1pZ2h0IG5vdCBiZSBhIG1pbWUgdHlwZSBzZXQgYXQgYWxsLlxuICAgKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvMjc2XG4gICAqL1xuICBhY2NlcHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gIF0pLFxuXG4gIC8qKlxuICAgKiBBbGxvdyBkcmFnICduJyBkcm9wIChvciBzZWxlY3Rpb24gZnJvbSB0aGUgZmlsZSBkaWFsb2cpIG9mIG11bHRpcGxlIGZpbGVzXG4gICAqL1xuICBtdWx0aXBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBhbGxvdyBkcm9wcGVkIGl0ZW1zIHRvIHRha2Ugb3ZlciB0aGUgY3VycmVudCBicm93c2VyIHdpbmRvd1xuICAgKi9cbiAgcHJldmVudERyb3BPbkRvY3VtZW50OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgZGlzYWJsZXMgY2xpY2sgdG8gb3BlbiB0aGUgbmF0aXZlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZ1xuICAgKi9cbiAgbm9DbGljazogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGRpc2FibGVzIFNQQUNFL0VOVEVSIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cuXG4gICAqIE5vdGUgdGhhdCBpdCBhbHNvIHN0b3BzIHRyYWNraW5nIHRoZSBmb2N1cyBzdGF0ZS5cbiAgICovXG4gIG5vS2V5Ym9hcmQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNhYmxlcyBkcmFnICduJyBkcm9wXG4gICAqL1xuICBub0RyYWc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzdG9wcyBkcmFnIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBhcmVudHNcbiAgICovXG4gIG5vRHJhZ0V2ZW50c0J1YmJsaW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogTWluaW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICAgKi9cbiAgbWluU2l6ZTogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogTWF4aW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICAgKi9cbiAgbWF4U2l6ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIE1heGltdW0gYWNjZXB0ZWQgbnVtYmVyIG9mIGZpbGVzXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGhlcmUgaXMgbm8gbGltaXRhdGlvbiB0byBob3cgbWFueSBmaWxlcyBhcmUgYWNjZXB0ZWQuXG4gICAqL1xuICBtYXhGaWxlczogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogRW5hYmxlL2Rpc2FibGUgdGhlIGRyb3B6b25lXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHRvIHByb3ZpZGUgYSBjdXN0b20gZmlsZSBhZ2dyZWdhdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAgICovXG4gIGdldEZpbGVzRnJvbUV2ZW50OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gY2xvc2luZyB0aGUgZmlsZSBkaWFsb2cgd2l0aCBubyBzZWxlY3Rpb25cbiAgICovXG4gIG9uRmlsZURpYWxvZ0NhbmNlbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIG9wZW5pbmcgdGhlIGZpbGUgZGlhbG9nXG4gICAqL1xuICBvbkZpbGVEaWFsb2dPcGVuOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgdG8gdXNlIHRoZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZV9TeXN0ZW1fQWNjZXNzX0FQSVxuICAgKiB0byBvcGVuIHRoZSBmaWxlIHBpY2tlciBpbnN0ZWFkIG9mIHVzaW5nIGFuIGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIGNsaWNrIGV2ZW50LlxuICAgKi9cbiAgdXNlRnNBY2Nlc3NBcGk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyYWdlbnRlcmAgZXZlbnQgb2NjdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ0VudGVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnbGVhdmVgIGV2ZW50IG9jY3Vyc1xuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ0xlYXZlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnb3ZlcmAgZXZlbnQgb2NjdXJzXG4gICAqXG4gICAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudFxuICAgKi9cbiAgb25EcmFnT3ZlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHRoZSBgZ2V0RmlsZXNGcm9tRXZlbnRgIGNhbGxiYWNrIGlzIGRvbmUuXG4gICAqXG4gICAqIEZpbGVzIGFyZSBhY2NlcHRlZCBvciByZWplY3RlZCBiYXNlZCBvbiB0aGUgYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCBhbmQgYG1heFNpemVgIHByb3BzLlxuICAgKiBgYWNjZXB0YCBtdXN0IGJlIGEgdmFsaWQgW01JTUUgdHlwZV0oaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbCkgYWNjb3JkaW5nIHRvIFtpbnB1dCBlbGVtZW50IHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy93aWtpL0hUTUwvRWxlbWVudHMvaW5wdXQvZmlsZSkgb3IgYSB2YWxpZCBmaWxlIGV4dGVuc2lvbi5cbiAgICogSWYgYG11bHRpcGxlYCBpcyBzZXQgdG8gZmFsc2UgYW5kIGFkZGl0aW9uYWwgZmlsZXMgYXJlIGRyb3BwZWQsXG4gICAqIGFsbCBmaWxlcyBiZXNpZGVzIHRoZSBmaXJzdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBBbnkgZmlsZSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2l6ZSBpbiB0aGUgW2BtaW5TaXplYCwgYG1heFNpemVgXSByYW5nZSwgd2lsbCBiZSByZWplY3RlZCBhcyB3ZWxsLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIGBvbkRyb3BgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGludm9rZWQgcmVnYXJkbGVzcyBpZiB0aGUgZHJvcHBlZCBmaWxlcyB3ZXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLlxuICAgKiBJZiB5b3UnZCBsaWtlIHRvIHJlYWN0IHRvIGEgc3BlY2lmaWMgc2NlbmFyaW8sIHVzZSB0aGUgYG9uRHJvcEFjY2VwdGVkYC9gb25Ecm9wUmVqZWN0ZWRgIHByb3BzLlxuICAgKlxuICAgKiBgb25Ecm9wYCB3aWxsIHByb3ZpZGUgeW91IHdpdGggYW4gYXJyYXkgb2YgW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBzZW5kIHRvIGEgc2VydmVyLlxuICAgKiBGb3IgZXhhbXBsZSwgd2l0aCBbU3VwZXJBZ2VudF0oaHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL3N1cGVyYWdlbnQpIGFzIGEgaHR0cC9hamF4IGxpYnJhcnk6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGZ1bmN0aW9uIG9uRHJvcChhY2NlcHRlZEZpbGVzKSB7XG4gICAqICAgY29uc3QgcmVxID0gcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAgICogICBhY2NlcHRlZEZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAqICAgICByZXEuYXR0YWNoKGZpbGUubmFtZSwgZmlsZSlcbiAgICogICB9KVxuICAgKiAgIHJlcS5lbmQoY2FsbGJhY2spXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBhY2NlcHRlZEZpbGVzXG4gICAqIEBwYXJhbSB7RmlsZVJlamVjdGlvbltdfSBmaWxlUmVqZWN0aW9uc1xuICAgKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gICAqL1xuICBvbkRyb3A6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAgICogTm90ZSB0aGF0IGlmIG5vIGZpbGVzIGFyZSBhY2NlcHRlZCwgdGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGaWxlW119IGZpbGVzXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50XG4gICAqL1xuICBvbkRyb3BBY2NlcHRlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICAgKiBOb3RlIHRoYXQgaWYgbm8gZmlsZXMgYXJlIHJlamVjdGVkLCB0aGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gZmlsZVJlamVjdGlvbnNcbiAgICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnRcbiAgICovXG4gIG9uRHJvcFJlamVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cbiAgICogQHBhcmFtIHtGaWxlfSBmaWxlXG4gICAqIEByZXR1cm5zIHtGaWxlRXJyb3J8RmlsZUVycm9yW119XG4gICAqL1xuICB2YWxpZGF0b3I6IFByb3BUeXBlcy5mdW5jLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRHJvcHpvbmU7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJhZ2VudGVyYCxcbiAqIGBkcmFnb3ZlcmAgYW5kIGBkcmFnbGVhdmVgIGV2ZW50cy5cbiAqIEl0IGlzIG5vdCBpbnZva2VkIGlmIHRoZSBpdGVtcyBhcmUgbm90IGZpbGVzIChzdWNoIGFzIGxpbmssIHRleHQsIGV0Yy4pLlxuICpcbiAqIEBjYWxsYmFjayBkcmFnQ2JcbiAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudFxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJvcGAgb3IgaW5wdXQgY2hhbmdlIGV2ZW50LlxuICogSXQgaXMgbm90IGludm9rZWQgaWYgdGhlIGl0ZW1zIGFyZSBub3QgZmlsZXMgKHN1Y2ggYXMgbGluaywgdGV4dCwgZXRjLikuXG4gKlxuICogQGNhbGxiYWNrIGRyb3BDYlxuICogQHBhcmFtIHtGaWxlW119IGFjY2VwdGVkRmlsZXMgTGlzdCBvZiBhY2NlcHRlZCBmaWxlc1xuICogQHBhcmFtIHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zIExpc3Qgb2YgcmVqZWN0ZWQgZmlsZXMgYW5kIHdoeSB0aGV5IHdlcmUgcmVqZWN0ZWRcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyb3BgIG9yIGlucHV0IGNoYW5nZSBldmVudC5cbiAqIEl0IGlzIG5vdCBpbnZva2VkIGlmIHRoZSBpdGVtcyBhcmUgZmlsZXMgKHN1Y2ggYXMgbGluaywgdGV4dCwgZXRjLikuXG4gKlxuICogQGNhbGxiYWNrIGRyb3BBY2NlcHRlZENiXG4gKiBAcGFyYW0ge0ZpbGVbXX0gZmlsZXMgTGlzdCBvZiBhY2NlcHRlZCBmaWxlcyB0aGF0IG1lZXQgdGhlIGdpdmVuIGNyaXRlcmlhXG4gKiAoYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCwgYG1heFNpemVgKVxuICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJvcGAgb3IgaW5wdXQgY2hhbmdlIGV2ZW50LlxuICpcbiAqIEBjYWxsYmFjayBkcm9wUmVqZWN0ZWRDYlxuICogQHBhcmFtIHtGaWxlW119IGZpbGVzIExpc3Qgb2YgcmVqZWN0ZWQgZmlsZXMgdGhhdCBkbyBub3QgbWVldCB0aGUgZ2l2ZW4gY3JpdGVyaWFcbiAqIChgYWNjZXB0YCwgYG11bHRpcGxlYCwgYG1pblNpemVgLCBgbWF4U2l6ZWApXG4gKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCBhZ2dyZWdhdGUgZmlsZXMsXG4gKiBpbiBhIGFzeW5jaHJvbm91cyBmYXNoaW9uLCBmcm9tIGRyYWcgb3IgaW5wdXQgY2hhbmdlIGV2ZW50cy5cbiAqXG4gKiBAY2FsbGJhY2sgZ2V0RmlsZXNGcm9tRXZlbnRcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqIEByZXR1cm5zIHsoRmlsZVtdfFByb21pc2U8RmlsZVtdPil9XG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBkcm9wem9uZSBzdGF0ZSBhbmQgc29tZSBoZWxwZXIgZnVuY3Rpb25zLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERyb3B6b25lU3RhdGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFJvb3RQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIHRoZSByb290IGRyb3AgY29udGFpbmVyIHlvdSByZW5kZXJcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldElucHV0UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byBoaWRkZW4gZmlsZSBpbnB1dCB5b3UgcmVuZGVyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBvcGVuIE9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGb2N1c2VkIERyb3B6b25lIGFyZWEgaXMgaW4gZm9jdXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGaWxlRGlhbG9nQWN0aXZlIEZpbGUgZGlhbG9nIGlzIG9wZW5lZFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0RyYWdBY3RpdmUgQWN0aXZlIGRyYWcgaXMgaW4gcHJvZ3Jlc3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNEcmFnQWNjZXB0IERyYWdnZWQgZmlsZXMgYXJlIGFjY2VwdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRHJhZ1JlamVjdCBTb21lIGRyYWdnZWQgZmlsZXMgYXJlIHJlamVjdGVkXG4gKiBAcHJvcGVydHkge0ZpbGVbXX0gZHJhZ2dlZEZpbGVzIEZpbGVzIGluIGFjdGl2ZSBkcmFnXG4gKiBAcHJvcGVydHkge0ZpbGVbXX0gYWNjZXB0ZWRGaWxlcyBBY2NlcHRlZCBmaWxlc1xuICogQHByb3BlcnR5IHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zIFJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gKi9cblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICBpc0ZpbGVEaWFsb2dBY3RpdmU6IGZhbHNlLFxuICBpc0RyYWdBY3RpdmU6IGZhbHNlLFxuICBpc0RyYWdBY2NlcHQ6IGZhbHNlLFxuICBpc0RyYWdSZWplY3Q6IGZhbHNlLFxuICBkcmFnZ2VkRmlsZXM6IFtdLFxuICBhY2NlcHRlZEZpbGVzOiBbXSxcbiAgZmlsZVJlamVjdGlvbnM6IFtdLFxufTtcblxuLyoqXG4gKiBBIFJlYWN0IGhvb2sgdGhhdCBjcmVhdGVzIGEgZHJhZyAnbicgZHJvcCBhcmVhLlxuICpcbiAqIGBgYGpzeFxuICogZnVuY3Rpb24gTXlEcm9wem9uZShwcm9wcykge1xuICogICBjb25zdCB7Z2V0Um9vdFByb3BzLCBnZXRJbnB1dFByb3BzfSA9IHVzZURyb3B6b25lKHtcbiAqICAgICBvbkRyb3A6IGFjY2VwdGVkRmlsZXMgPT4ge1xuICogICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIEZpbGUgb2JqZWN0cywgZS5nLiB1cGxvYWQgdG8gc29tZSBzZXJ2ZXJcbiAqICAgICB9XG4gKiAgIH0pO1xuICogICByZXR1cm4gKFxuICogICAgIDxkaXYgey4uLmdldFJvb3RQcm9wcygpfT5cbiAqICAgICAgIDxpbnB1dCB7Li4uZ2V0SW5wdXRQcm9wcygpfSAvPlxuICogICAgICAgPHA+RHJhZyBhbmQgZHJvcCBzb21lIGZpbGVzIGhlcmUsIG9yIGNsaWNrIHRvIHNlbGVjdCBmaWxlczwvcD5cbiAqICAgICA8L2Rpdj5cbiAqICAgKVxuICogfVxuICogYGBgXG4gKlxuICogQGZ1bmN0aW9uIHVzZURyb3B6b25lXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3Byb3BzLmFjY2VwdF0gU2V0IGFjY2VwdGVkIGZpbGUgdHlwZXMuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29rb25ldC9hdHRyLWFjY2VwdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIEtlZXAgaW4gbWluZCB0aGF0IG1pbWUgdHlwZSBkZXRlcm1pbmF0aW9uIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgcGxhdGZvcm1zLiBDU1YgZmlsZXMsXG4gKiBmb3IgZXhhbXBsZSwgYXJlIHJlcG9ydGVkIGFzIHRleHQvcGxhaW4gdW5kZXIgbWFjT1MgYnV0IGFzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCB1bmRlclxuICogV2luZG93cy4gSW4gc29tZSBjYXNlcyB0aGVyZSBtaWdodCBub3QgYmUgYSBtaW1lIHR5cGUgc2V0IGF0IGFsbC5cbiAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL3JlYWN0LWRyb3B6b25lL2lzc3Vlcy8yNzZcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm11bHRpcGxlPXRydWVdIEFsbG93IGRyYWcgJ24nIGRyb3AgKG9yIHNlbGVjdGlvbiBmcm9tIHRoZSBmaWxlIGRpYWxvZykgb2YgbXVsdGlwbGUgZmlsZXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLnByZXZlbnREcm9wT25Eb2N1bWVudD10cnVlXSBJZiBmYWxzZSwgYWxsb3cgZHJvcHBlZCBpdGVtcyB0byB0YWtlIG92ZXIgdGhlIGN1cnJlbnQgYnJvd3NlciB3aW5kb3dcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm5vQ2xpY2s9ZmFsc2VdIElmIHRydWUsIGRpc2FibGVzIGNsaWNrIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm5vS2V5Ym9hcmQ9ZmFsc2VdIElmIHRydWUsIGRpc2FibGVzIFNQQUNFL0VOVEVSIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cuXG4gKiBOb3RlIHRoYXQgaXQgYWxzbyBzdG9wcyB0cmFja2luZyB0aGUgZm9jdXMgc3RhdGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0RyYWc9ZmFsc2VdIElmIHRydWUsIGRpc2FibGVzIGRyYWcgJ24nIGRyb3BcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm5vRHJhZ0V2ZW50c0J1YmJsaW5nPWZhbHNlXSBJZiB0cnVlLCBzdG9wcyBkcmFnIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBhcmVudHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcHJvcHMubWluU2l6ZT0wXSBNaW5pbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gKiBAcGFyYW0ge251bWJlcn0gW3Byb3BzLm1heFNpemU9SW5maW5pdHldIE1heGltdW0gZmlsZSBzaXplIChpbiBieXRlcylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLmRpc2FibGVkPWZhbHNlXSBFbmFibGUvZGlzYWJsZSB0aGUgZHJvcHpvbmVcbiAqIEBwYXJhbSB7Z2V0RmlsZXNGcm9tRXZlbnR9IFtwcm9wcy5nZXRGaWxlc0Zyb21FdmVudF0gVXNlIHRoaXMgdG8gcHJvdmlkZSBhIGN1c3RvbSBmaWxlIGFnZ3JlZ2F0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wcy5vbkZpbGVEaWFsb2dDYW5jZWxdIENiIGZvciB3aGVuIGNsb3NpbmcgdGhlIGZpbGUgZGlhbG9nIHdpdGggbm8gc2VsZWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy51c2VGc0FjY2Vzc0FwaV0gU2V0IHRvIHRydWUgdG8gdXNlIHRoZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZV9TeXN0ZW1fQWNjZXNzX0FQSVxuICogdG8gb3BlbiB0aGUgZmlsZSBwaWNrZXIgaW5zdGVhZCBvZiB1c2luZyBhbiBgPGlucHV0IHR5cGU9XCJmaWxlXCI+YCBjbGljayBldmVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wcy5vbkZpbGVEaWFsb2dPcGVuXSBDYiBmb3Igd2hlbiBvcGVuaW5nIHRoZSBmaWxlIGRpYWxvZ1xuICogQHBhcmFtIHtkcmFnQ2J9IFtwcm9wcy5vbkRyYWdFbnRlcl0gQ2IgZm9yIHdoZW4gdGhlIGBkcmFnZW50ZXJgIGV2ZW50IG9jY3Vycy5cbiAqIEBwYXJhbSB7ZHJhZ0NifSBbcHJvcHMub25EcmFnTGVhdmVdIENiIGZvciB3aGVuIHRoZSBgZHJhZ2xlYXZlYCBldmVudCBvY2N1cnNcbiAqIEBwYXJhbSB7ZHJhZ0NifSBbcHJvcHMub25EcmFnT3Zlcl0gQ2IgZm9yIHdoZW4gdGhlIGBkcmFnb3ZlcmAgZXZlbnQgb2NjdXJzXG4gKiBAcGFyYW0ge2Ryb3BDYn0gW3Byb3BzLm9uRHJvcF0gQ2IgZm9yIHdoZW4gdGhlIGBkcm9wYCBldmVudCBvY2N1cnMuXG4gKiBOb3RlIHRoYXQgdGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHRoZSBgZ2V0RmlsZXNGcm9tRXZlbnRgIGNhbGxiYWNrIGlzIGRvbmUuXG4gKlxuICogRmlsZXMgYXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkIGJhc2VkIG9uIHRoZSBgYWNjZXB0YCwgYG11bHRpcGxlYCwgYG1pblNpemVgIGFuZCBgbWF4U2l6ZWAgcHJvcHMuXG4gKiBgYWNjZXB0YCBtdXN0IGJlIGEgdmFsaWQgW01JTUUgdHlwZV0oaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbCkgYWNjb3JkaW5nIHRvIFtpbnB1dCBlbGVtZW50IHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy93aWtpL0hUTUwvRWxlbWVudHMvaW5wdXQvZmlsZSkgb3IgYSB2YWxpZCBmaWxlIGV4dGVuc2lvbi5cbiAqIElmIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGZhbHNlIGFuZCBhZGRpdGlvbmFsIGZpbGVzIGFyZSBkcm9wcGVkLFxuICogYWxsIGZpbGVzIGJlc2lkZXMgdGhlIGZpcnN0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gKiBBbnkgZmlsZSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2l6ZSBpbiB0aGUgW2BtaW5TaXplYCwgYG1heFNpemVgXSByYW5nZSwgd2lsbCBiZSByZWplY3RlZCBhcyB3ZWxsLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgYG9uRHJvcGAgY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgaW52b2tlZCByZWdhcmRsZXNzIGlmIHRoZSBkcm9wcGVkIGZpbGVzIHdlcmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQuXG4gKiBJZiB5b3UnZCBsaWtlIHRvIHJlYWN0IHRvIGEgc3BlY2lmaWMgc2NlbmFyaW8sIHVzZSB0aGUgYG9uRHJvcEFjY2VwdGVkYC9gb25Ecm9wUmVqZWN0ZWRgIHByb3BzLlxuICpcbiAqIGBvbkRyb3BgIHdpbGwgcHJvdmlkZSB5b3Ugd2l0aCBhbiBhcnJheSBvZiBbRmlsZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGUpIG9iamVjdHMgd2hpY2ggeW91IGNhbiB0aGVuIHByb2Nlc3MgYW5kIHNlbmQgdG8gYSBzZXJ2ZXIuXG4gKiBGb3IgZXhhbXBsZSwgd2l0aCBbU3VwZXJBZ2VudF0oaHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL3N1cGVyYWdlbnQpIGFzIGEgaHR0cC9hamF4IGxpYnJhcnk6XG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIG9uRHJvcChhY2NlcHRlZEZpbGVzKSB7XG4gKiAgIGNvbnN0IHJlcSA9IHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIGFjY2VwdGVkRmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAqICAgICByZXEuYXR0YWNoKGZpbGUubmFtZSwgZmlsZSlcbiAqICAgfSlcbiAqICAgcmVxLmVuZChjYWxsYmFjaylcbiAqIH1cbiAqIGBgYFxuICogQHBhcmFtIHtkcm9wQWNjZXB0ZWRDYn0gW3Byb3BzLm9uRHJvcEFjY2VwdGVkXVxuICogQHBhcmFtIHtkcm9wUmVqZWN0ZWRDYn0gW3Byb3BzLm9uRHJvcFJlamVjdGVkXVxuICpcbiAqIEByZXR1cm5zIHtEcm9wem9uZVN0YXRlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRHJvcHpvbmUob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhY2NlcHQsXG4gICAgZGlzYWJsZWQsXG4gICAgZ2V0RmlsZXNGcm9tRXZlbnQsXG4gICAgbWF4U2l6ZSxcbiAgICBtaW5TaXplLFxuICAgIG11bHRpcGxlLFxuICAgIG1heEZpbGVzLFxuICAgIG9uRHJhZ0VudGVyLFxuICAgIG9uRHJhZ0xlYXZlLFxuICAgIG9uRHJhZ092ZXIsXG4gICAgb25Ecm9wLFxuICAgIG9uRHJvcEFjY2VwdGVkLFxuICAgIG9uRHJvcFJlamVjdGVkLFxuICAgIG9uRmlsZURpYWxvZ0NhbmNlbCxcbiAgICBvbkZpbGVEaWFsb2dPcGVuLFxuICAgIHVzZUZzQWNjZXNzQXBpLFxuICAgIHByZXZlbnREcm9wT25Eb2N1bWVudCxcbiAgICBub0NsaWNrLFxuICAgIG5vS2V5Ym9hcmQsXG4gICAgbm9EcmFnLFxuICAgIG5vRHJhZ0V2ZW50c0J1YmJsaW5nLFxuICAgIHZhbGlkYXRvcixcbiAgfSA9IHtcbiAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcblxuICBjb25zdCBvbkZpbGVEaWFsb2dPcGVuQ2IgPSB1c2VNZW1vKFxuICAgICgpID0+ICh0eXBlb2Ygb25GaWxlRGlhbG9nT3BlbiA9PT0gXCJmdW5jdGlvblwiID8gb25GaWxlRGlhbG9nT3BlbiA6IG5vb3ApLFxuICAgIFtvbkZpbGVEaWFsb2dPcGVuXVxuICApO1xuICBjb25zdCBvbkZpbGVEaWFsb2dDYW5jZWxDYiA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIHR5cGVvZiBvbkZpbGVEaWFsb2dDYW5jZWwgPT09IFwiZnVuY3Rpb25cIiA/IG9uRmlsZURpYWxvZ0NhbmNlbCA6IG5vb3AsXG4gICAgW29uRmlsZURpYWxvZ0NhbmNlbF1cbiAgKTtcblxuICBjb25zdCByb290UmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcblxuICBjb25zdCBbc3RhdGUsIGRpc3BhdGNoXSA9IHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcbiAgY29uc3QgeyBpc0ZvY3VzZWQsIGlzRmlsZURpYWxvZ0FjdGl2ZSwgZHJhZ2dlZEZpbGVzIH0gPSBzdGF0ZTtcblxuICAvLyBVcGRhdGUgZmlsZSBkaWFsb2cgYWN0aXZlIHN0YXRlIHdoZW4gdGhlIHdpbmRvdyBpcyBmb2N1c2VkIG9uXG4gIGNvbnN0IG9uV2luZG93Rm9jdXMgPSAoKSA9PiB7XG4gICAgLy8gRXhlY3V0ZSB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBmaWxlIGRpYWxvZyBpcyBvcGVuZWQgaW4gdGhlIGJyb3dzZXJcbiAgICBpZiAoaXNGaWxlRGlhbG9nQWN0aXZlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBjb25zdCB7IGZpbGVzIH0gPSBpbnB1dFJlZi5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJjbG9zZURpYWxvZ1wiIH0pO1xuICAgICAgICAgICAgb25GaWxlRGlhbG9nQ2FuY2VsQ2IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh1c2VGc0FjY2Vzc0FwaSAmJiBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJKCkpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIG9uV2luZG93Rm9jdXMsIGZhbHNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBvbldpbmRvd0ZvY3VzLCBmYWxzZSk7XG4gICAgfTtcbiAgfSwgW2lucHV0UmVmLCBpc0ZpbGVEaWFsb2dBY3RpdmUsIG9uRmlsZURpYWxvZ0NhbmNlbENiLCB1c2VGc0FjY2Vzc0FwaV0pO1xuXG4gIGNvbnN0IGRyYWdUYXJnZXRzUmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3Qgb25Eb2N1bWVudERyb3AgPSAoZXZlbnQpID0+IHtcbiAgICBpZiAocm9vdFJlZi5jdXJyZW50ICYmIHJvb3RSZWYuY3VycmVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAvLyBJZiB3ZSBpbnRlcmNlcHRlZCBhbiBldmVudCBmb3Igb3VyIGluc3RhbmNlLCBsZXQgaXQgcHJvcGFnYXRlIGRvd24gdG8gdGhlIGluc3RhbmNlJ3Mgb25Ecm9wIGhhbmRsZXJcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50ID0gW107XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgb25Eb2N1bWVudERyYWdPdmVyLCBmYWxzZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBvbkRvY3VtZW50RHJvcCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCBvbkRvY3VtZW50RHJhZ092ZXIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBvbkRvY3VtZW50RHJvcCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3Jvb3RSZWYsIHByZXZlbnREcm9wT25Eb2N1bWVudF0pO1xuXG4gIGNvbnN0IG9uRHJhZ0VudGVyQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBQZXJzaXN0IGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZSBldmVudCBsYXRlciBhZnRlciBnZXRGaWxlc0Zyb21FdmVudCgpIGlzIGRvbmVcbiAgICAgIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudCk7XG5cbiAgICAgIGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQgPSBbLi4uZHJhZ1RhcmdldHNSZWYuY3VycmVudCwgZXZlbnQudGFyZ2V0XTtcblxuICAgICAgaWYgKGlzRXZ0V2l0aEZpbGVzKGV2ZW50KSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoZ2V0RmlsZXNGcm9tRXZlbnQoZXZlbnQpKS50aGVuKChkcmFnZ2VkRmlsZXMpID0+IHtcbiAgICAgICAgICBpZiAoaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpICYmICFub0RyYWdFdmVudHNCdWJibGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIGRyYWdnZWRGaWxlcyxcbiAgICAgICAgICAgIGlzRHJhZ0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IFwic2V0RHJhZ2dlZEZpbGVzXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAob25EcmFnRW50ZXIpIHtcbiAgICAgICAgICAgIG9uRHJhZ0VudGVyKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2dldEZpbGVzRnJvbUV2ZW50LCBvbkRyYWdFbnRlciwgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gICk7XG5cbiAgY29uc3Qgb25EcmFnT3ZlckNiID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KTtcblxuICAgICAgY29uc3QgaGFzRmlsZXMgPSBpc0V2dFdpdGhGaWxlcyhldmVudCk7XG4gICAgICBpZiAoaGFzRmlsZXMgJiYgZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcbiAgICAgICAgfSBjYXRjaCB7fSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5ICovXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNGaWxlcyAmJiBvbkRyYWdPdmVyKSB7XG4gICAgICAgIG9uRHJhZ092ZXIoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBbb25EcmFnT3Zlciwgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gICk7XG5cbiAgY29uc3Qgb25EcmFnTGVhdmVDYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudCk7XG5cbiAgICAgIC8vIE9ubHkgZGVhY3RpdmF0ZSBvbmNlIHRoZSBkcm9wem9uZSBhbmQgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBsZWZ0XG4gICAgICBjb25zdCB0YXJnZXRzID0gZHJhZ1RhcmdldHNSZWYuY3VycmVudC5maWx0ZXIoXG4gICAgICAgICh0YXJnZXQpID0+IHJvb3RSZWYuY3VycmVudCAmJiByb290UmVmLmN1cnJlbnQuY29udGFpbnModGFyZ2V0KVxuICAgICAgKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0byByZW1vdmUgYSB0YXJnZXQgcHJlc2VudCBtdWx0aXBsZSB0aW1lcyBvbmx5IG9uY2VcbiAgICAgIC8vIChGaXJlZm94IG1heSBmaXJlIGRyYWdlbnRlci9kcmFnbGVhdmUgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgZWxlbWVudClcbiAgICAgIGNvbnN0IHRhcmdldElkeCA9IHRhcmdldHMuaW5kZXhPZihldmVudC50YXJnZXQpO1xuICAgICAgaWYgKHRhcmdldElkeCAhPT0gLTEpIHtcbiAgICAgICAgdGFyZ2V0cy5zcGxpY2UodGFyZ2V0SWR4LCAxKTtcbiAgICAgIH1cbiAgICAgIGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQgPSB0YXJnZXRzO1xuICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgaXNEcmFnQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzZXREcmFnZ2VkRmlsZXNcIixcbiAgICAgICAgZHJhZ2dlZEZpbGVzOiBbXSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNFdnRXaXRoRmlsZXMoZXZlbnQpICYmIG9uRHJhZ0xlYXZlKSB7XG4gICAgICAgIG9uRHJhZ0xlYXZlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyb290UmVmLCBvbkRyYWdMZWF2ZSwgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gICk7XG5cbiAgY29uc3Qgc2V0RmlsZXMgPSB1c2VDYWxsYmFjayhcbiAgICAoZmlsZXMsIGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBhY2NlcHRlZEZpbGVzID0gW107XG4gICAgICBjb25zdCBmaWxlUmVqZWN0aW9ucyA9IFtdO1xuXG4gICAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IFthY2NlcHRlZCwgYWNjZXB0RXJyb3JdID0gZmlsZUFjY2VwdGVkKGZpbGUsIGFjY2VwdCk7XG4gICAgICAgIGNvbnN0IFtzaXplTWF0Y2gsIHNpemVFcnJvcl0gPSBmaWxlTWF0Y2hTaXplKGZpbGUsIG1pblNpemUsIG1heFNpemUpO1xuICAgICAgICBjb25zdCBjdXN0b21FcnJvcnMgPSB2YWxpZGF0b3IgPyB2YWxpZGF0b3IoZmlsZSkgOiBudWxsO1xuXG4gICAgICAgIGlmIChhY2NlcHRlZCAmJiBzaXplTWF0Y2ggJiYgIWN1c3RvbUVycm9ycykge1xuICAgICAgICAgIGFjY2VwdGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gW2FjY2VwdEVycm9yLCBzaXplRXJyb3JdO1xuXG4gICAgICAgICAgaWYgKGN1c3RvbUVycm9ycykge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChjdXN0b21FcnJvcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVSZWplY3Rpb25zLnB1c2goeyBmaWxlLCBlcnJvcnM6IGVycm9ycy5maWx0ZXIoKGUpID0+IGUpIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW11bHRpcGxlICYmIGFjY2VwdGVkRmlsZXMubGVuZ3RoID4gMSkgfHxcbiAgICAgICAgKG11bHRpcGxlICYmIG1heEZpbGVzID49IDEgJiYgYWNjZXB0ZWRGaWxlcy5sZW5ndGggPiBtYXhGaWxlcylcbiAgICAgICkge1xuICAgICAgICAvLyBSZWplY3QgZXZlcnl0aGluZyBhbmQgZW1wdHkgYWNjZXB0ZWQgZmlsZXNcbiAgICAgICAgYWNjZXB0ZWRGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgZmlsZVJlamVjdGlvbnMucHVzaCh7IGZpbGUsIGVycm9yczogW1RPT19NQU5ZX0ZJTEVTX1JFSkVDVElPTl0gfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBhY2NlcHRlZEZpbGVzLnNwbGljZSgwKTtcbiAgICAgIH1cblxuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICBhY2NlcHRlZEZpbGVzLFxuICAgICAgICBmaWxlUmVqZWN0aW9ucyxcbiAgICAgICAgdHlwZTogXCJzZXRGaWxlc1wiLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbkRyb3ApIHtcbiAgICAgICAgb25Ecm9wKGFjY2VwdGVkRmlsZXMsIGZpbGVSZWplY3Rpb25zLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWxlUmVqZWN0aW9ucy5sZW5ndGggPiAwICYmIG9uRHJvcFJlamVjdGVkKSB7XG4gICAgICAgIG9uRHJvcFJlamVjdGVkKGZpbGVSZWplY3Rpb25zLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IDAgJiYgb25Ecm9wQWNjZXB0ZWQpIHtcbiAgICAgICAgb25Ecm9wQWNjZXB0ZWQoYWNjZXB0ZWRGaWxlcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgZGlzcGF0Y2gsXG4gICAgICBtdWx0aXBsZSxcbiAgICAgIGFjY2VwdCxcbiAgICAgIG1pblNpemUsXG4gICAgICBtYXhTaXplLFxuICAgICAgbWF4RmlsZXMsXG4gICAgICBvbkRyb3AsXG4gICAgICBvbkRyb3BBY2NlcHRlZCxcbiAgICAgIG9uRHJvcFJlamVjdGVkLFxuICAgICAgdmFsaWRhdG9yLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBvbkRyb3BDYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIFBlcnNpc3QgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdGhlIGV2ZW50IGxhdGVyIGFmdGVyIGdldEZpbGVzRnJvbUV2ZW50KCkgaXMgZG9uZVxuICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KTtcblxuICAgICAgZHJhZ1RhcmdldHNSZWYuY3VycmVudCA9IFtdO1xuXG4gICAgICBpZiAoaXNFdnRXaXRoRmlsZXMoZXZlbnQpKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShnZXRGaWxlc0Zyb21FdmVudChldmVudCkpLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgaWYgKGlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiAhbm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0RmlsZXMoZmlsZXMsIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwicmVzZXRcIiB9KTtcbiAgICB9LFxuICAgIFtnZXRGaWxlc0Zyb21FdmVudCwgc2V0RmlsZXMsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApO1xuXG4gIC8vIEZuIGZvciBvcGVuaW5nIHRoZSBmaWxlIGRpYWxvZyBwcm9ncmFtbWF0aWNhbGx5XG4gIGNvbnN0IG9wZW5GaWxlRGlhbG9nID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICh1c2VGc0FjY2Vzc0FwaSAmJiBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJKCkpIHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJvcGVuRGlhbG9nXCIgfSk7XG4gICAgICBvbkZpbGVEaWFsb2dPcGVuQ2IoKTtcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cvc2hvd09wZW5GaWxlUGlja2VyXG4gICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICBtdWx0aXBsZSxcbiAgICAgICAgdHlwZXM6IGZpbGVQaWNrZXJPcHRpb25zVHlwZXMoYWNjZXB0KSxcbiAgICAgIH07XG4gICAgICB3aW5kb3dcbiAgICAgICAgLnNob3dPcGVuRmlsZVBpY2tlcihvcHRzKVxuICAgICAgICAudGhlbigoaGFuZGxlcykgPT4gZ2V0RmlsZXNGcm9tRXZlbnQoaGFuZGxlcykpXG4gICAgICAgIC50aGVuKChmaWxlcykgPT4gc2V0RmlsZXMoZmlsZXMsIG51bGwpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IG9uRmlsZURpYWxvZ0NhbmNlbENiKGUpKVxuICAgICAgICAuZmluYWxseSgoKSA9PiBkaXNwYXRjaCh7IHR5cGU6IFwiY2xvc2VEaWFsb2dcIiB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJvcGVuRGlhbG9nXCIgfSk7XG4gICAgICBvbkZpbGVEaWFsb2dPcGVuQ2IoKTtcbiAgICAgIGlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSBudWxsO1xuICAgICAgaW5wdXRSZWYuY3VycmVudC5jbGljaygpO1xuICAgIH1cbiAgfSwgW1xuICAgIGRpc3BhdGNoLFxuICAgIG9uRmlsZURpYWxvZ09wZW5DYixcbiAgICBvbkZpbGVEaWFsb2dDYW5jZWxDYixcbiAgICB1c2VGc0FjY2Vzc0FwaSxcbiAgICBzZXRGaWxlcyxcbiAgICBhY2NlcHQsXG4gICAgbXVsdGlwbGUsXG4gIF0pO1xuXG4gIC8vIENiIHRvIG9wZW4gdGhlIGZpbGUgZGlhbG9nIHdoZW4gU1BBQ0UvRU5URVIgb2NjdXJzIG9uIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbktleURvd25DYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgLy8gSWdub3JlIGtleWJvYXJkIGV2ZW50cyBidWJibGluZyB1cCB0aGUgRE9NIHRyZWVcbiAgICAgIGlmICghcm9vdFJlZi5jdXJyZW50IHx8ICFyb290UmVmLmN1cnJlbnQuaXNFcXVhbE5vZGUoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAzMiB8fCBldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvcGVuRmlsZURpYWxvZygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3Jvb3RSZWYsIGlucHV0UmVmLCBvcGVuRmlsZURpYWxvZ11cbiAgKTtcblxuICAvLyBVcGRhdGUgZm9jdXMgc3RhdGUgZm9yIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbkZvY3VzQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBcImZvY3VzXCIgfSk7XG4gIH0sIFtdKTtcbiAgY29uc3Qgb25CbHVyQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBcImJsdXJcIiB9KTtcbiAgfSwgW10pO1xuXG4gIC8vIENiIHRvIG9wZW4gdGhlIGZpbGUgZGlhbG9nIHdoZW4gY2xpY2sgb2NjdXJzIG9uIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbkNsaWNrQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKG5vQ2xpY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBJRTExL0VkZ2UgdGhlIGZpbGUtYnJvd3NlciBkaWFsb2cgaXMgYmxvY2tpbmcsIHRoZXJlZm9yZSwgdXNlIHNldFRpbWVvdXQoKVxuICAgIC8vIHRvIGVuc3VyZSBSZWFjdCBjYW4gaGFuZGxlIHN0YXRlIGNoYW5nZXNcbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvNDUwXG4gICAgaWYgKGlzSWVPckVkZ2UoKSkge1xuICAgICAgc2V0VGltZW91dChvcGVuRmlsZURpYWxvZywgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wZW5GaWxlRGlhbG9nKCk7XG4gICAgfVxuICB9LCBbaW5wdXRSZWYsIG5vQ2xpY2ssIG9wZW5GaWxlRGlhbG9nXSk7XG5cbiAgY29uc3QgY29tcG9zZUhhbmRsZXIgPSAoZm4pID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPyBudWxsIDogZm47XG4gIH07XG5cbiAgY29uc3QgY29tcG9zZUtleWJvYXJkSGFuZGxlciA9IChmbikgPT4ge1xuICAgIHJldHVybiBub0tleWJvYXJkID8gbnVsbCA6IGNvbXBvc2VIYW5kbGVyKGZuKTtcbiAgfTtcblxuICBjb25zdCBjb21wb3NlRHJhZ0hhbmRsZXIgPSAoZm4pID0+IHtcbiAgICByZXR1cm4gbm9EcmFnID8gbnVsbCA6IGNvbXBvc2VIYW5kbGVyKGZuKTtcbiAgfTtcblxuICBjb25zdCBzdG9wUHJvcGFnYXRpb24gPSAoZXZlbnQpID0+IHtcbiAgICBpZiAobm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRSb290UHJvcHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICByZWZLZXkgPSBcInJlZlwiLFxuICAgICAgICByb2xlLFxuICAgICAgICBvbktleURvd24sXG4gICAgICAgIG9uRm9jdXMsXG4gICAgICAgIG9uQmx1cixcbiAgICAgICAgb25DbGljayxcbiAgICAgICAgb25EcmFnRW50ZXIsXG4gICAgICAgIG9uRHJhZ092ZXIsXG4gICAgICAgIG9uRHJhZ0xlYXZlLFxuICAgICAgICBvbkRyb3AsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSB7fSkgPT4gKHtcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlS2V5Ym9hcmRIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uS2V5RG93biwgb25LZXlEb3duQ2IpXG4gICAgICAgICksXG4gICAgICAgIG9uRm9jdXM6IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIoXG4gICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25Gb2N1cywgb25Gb2N1c0NiKVxuICAgICAgICApLFxuICAgICAgICBvbkJsdXI6IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25CbHVyLCBvbkJsdXJDYikpLFxuICAgICAgICBvbkNsaWNrOiBjb21wb3NlSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkNsaWNrLCBvbkNsaWNrQ2IpKSxcbiAgICAgICAgb25EcmFnRW50ZXI6IGNvbXBvc2VEcmFnSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyYWdFbnRlciwgb25EcmFnRW50ZXJDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25EcmFnT3ZlcjogY29tcG9zZURyYWdIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRHJhZ092ZXIsIG9uRHJhZ092ZXJDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25EcmFnTGVhdmU6IGNvbXBvc2VEcmFnSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyYWdMZWF2ZSwgb25EcmFnTGVhdmVDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25Ecm9wOiBjb21wb3NlRHJhZ0hhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25Ecm9wLCBvbkRyb3BDYikpLFxuICAgICAgICByb2xlOiB0eXBlb2Ygcm9sZSA9PT0gXCJzdHJpbmdcIiAmJiByb2xlICE9PSBcIlwiID8gcm9sZSA6IFwiYnV0dG9uXCIsXG4gICAgICAgIFtyZWZLZXldOiByb290UmVmLFxuICAgICAgICAuLi4oIWRpc2FibGVkICYmICFub0tleWJvYXJkID8geyB0YWJJbmRleDogMCB9IDoge30pLFxuICAgICAgICAuLi5yZXN0LFxuICAgICAgfSksXG4gICAgW1xuICAgICAgcm9vdFJlZixcbiAgICAgIG9uS2V5RG93bkNiLFxuICAgICAgb25Gb2N1c0NiLFxuICAgICAgb25CbHVyQ2IsXG4gICAgICBvbkNsaWNrQ2IsXG4gICAgICBvbkRyYWdFbnRlckNiLFxuICAgICAgb25EcmFnT3ZlckNiLFxuICAgICAgb25EcmFnTGVhdmVDYixcbiAgICAgIG9uRHJvcENiLFxuICAgICAgbm9LZXlib2FyZCxcbiAgICAgIG5vRHJhZyxcbiAgICAgIGRpc2FibGVkLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBvbklucHV0RWxlbWVudENsaWNrID0gdXNlQ2FsbGJhY2soKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBnZXRJbnB1dFByb3BzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgKHsgcmVmS2V5ID0gXCJyZWZcIiwgb25DaGFuZ2UsIG9uQ2xpY2ssIC4uLnJlc3QgfSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0UHJvcHMgPSB7XG4gICAgICAgICAgYWNjZXB0LFxuICAgICAgICAgIG11bHRpcGxlLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6IFwibm9uZVwiIH0sXG4gICAgICAgICAgb25DaGFuZ2U6IGNvbXBvc2VIYW5kbGVyKGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uQ2hhbmdlLCBvbkRyb3BDYikpLFxuICAgICAgICAgIG9uQ2xpY2s6IGNvbXBvc2VIYW5kbGVyKFxuICAgICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25DbGljaywgb25JbnB1dEVsZW1lbnRDbGljaylcbiAgICAgICAgICApLFxuICAgICAgICAgIGF1dG9Db21wbGV0ZTogXCJvZmZcIixcbiAgICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgICAgW3JlZktleV06IGlucHV0UmVmLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICAuLi5yZXN0LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICBbaW5wdXRSZWYsIGFjY2VwdCwgbXVsdGlwbGUsIG9uRHJvcENiLCBkaXNhYmxlZF1cbiAgKTtcblxuICBjb25zdCBmaWxlQ291bnQgPSBkcmFnZ2VkRmlsZXMubGVuZ3RoO1xuICBjb25zdCBpc0RyYWdBY2NlcHQgPVxuICAgIGZpbGVDb3VudCA+IDAgJiZcbiAgICBhbGxGaWxlc0FjY2VwdGVkKHtcbiAgICAgIGZpbGVzOiBkcmFnZ2VkRmlsZXMsXG4gICAgICBhY2NlcHQsXG4gICAgICBtaW5TaXplLFxuICAgICAgbWF4U2l6ZSxcbiAgICAgIG11bHRpcGxlLFxuICAgICAgbWF4RmlsZXMsXG4gICAgfSk7XG4gIGNvbnN0IGlzRHJhZ1JlamVjdCA9IGZpbGVDb3VudCA+IDAgJiYgIWlzRHJhZ0FjY2VwdDtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGlzRHJhZ0FjY2VwdCxcbiAgICBpc0RyYWdSZWplY3QsXG4gICAgaXNGb2N1c2VkOiBpc0ZvY3VzZWQgJiYgIWRpc2FibGVkLFxuICAgIGdldFJvb3RQcm9wcyxcbiAgICBnZXRJbnB1dFByb3BzLFxuICAgIHJvb3RSZWYsXG4gICAgaW5wdXRSZWYsXG4gICAgb3BlbjogY29tcG9zZUhhbmRsZXIob3BlbkZpbGVEaWFsb2cpLFxuICB9O1xufVxuXG5mdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgXCJmb2N1c1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzRm9jdXNlZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgY2FzZSBcImJsdXJcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICBjYXNlIFwib3BlbkRpYWxvZ1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5pdGlhbFN0YXRlLFxuICAgICAgICBpc0ZpbGVEaWFsb2dBY3RpdmU6IHRydWUsXG4gICAgICB9O1xuICAgIGNhc2UgXCJjbG9zZURpYWxvZ1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzRmlsZURpYWxvZ0FjdGl2ZTogZmFsc2UsXG4gICAgICB9O1xuICAgIGNhc2UgXCJzZXREcmFnZ2VkRmlsZXNcIjpcbiAgICAgIC8qIGVzbGludCBuby1jYXNlLWRlY2xhcmF0aW9uczogMCAqL1xuICAgICAgY29uc3QgeyBpc0RyYWdBY3RpdmUsIGRyYWdnZWRGaWxlcyB9ID0gYWN0aW9uO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGRyYWdnZWRGaWxlcyxcbiAgICAgICAgaXNEcmFnQWN0aXZlLFxuICAgICAgfTtcbiAgICBjYXNlIFwic2V0RmlsZXNcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhY2NlcHRlZEZpbGVzOiBhY3Rpb24uYWNjZXB0ZWRGaWxlcyxcbiAgICAgICAgZmlsZVJlamVjdGlvbnM6IGFjdGlvbi5maWxlUmVqZWN0aW9ucyxcbiAgICAgIH07XG4gICAgY2FzZSBcInJlc2V0XCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbml0aWFsU3RhdGUsXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmV4cG9ydCB7IEVycm9yQ29kZSB9IGZyb20gXCIuL3V0aWxzXCI7XG4iXSwibmFtZXMiOlsiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJ2YWx1ZSIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwicmVzdWx0IiwiZG9uZSIsInRoZW4iLCJhcHBseSIsIl9fZ2VuZXJhdG9yIiwiYm9keSIsImYiLCJ5IiwidCIsImciLCJfIiwibGFiZWwiLCJzZW50IiwidHJ5cyIsIm9wcyIsInZlcmIiLCJ0aHJvdyIsInJldHVybiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwidGhpcyIsIm4iLCJ2Iiwib3AiLCJUeXBlRXJyb3IiLCJjYWxsIiwicG9wIiwibGVuZ3RoIiwicHVzaCIsIl9fcmVhZCIsIm8iLCJtIiwiciIsImkiLCJhciIsImVycm9yIiwiQ09NTU9OX01JTUVfVFlQRVMiLCJNYXAiLCJ0b0ZpbGVXaXRoUGF0aCIsImZpbGUiLCJwYXRoIiwibmFtZSIsImxhc3RJbmRleE9mIiwidHlwZSIsImV4dCIsInNwbGl0IiwidG9Mb3dlckNhc2UiLCJnZXQiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndpdGhNaW1lVHlwZSIsIndlYmtpdFJlbGF0aXZlUGF0aCIsIkZJTEVTX1RPX0lHTk9SRSIsImlzT2JqZWN0IiwiZ2V0SW5wdXRGaWxlcyIsImV2dCIsImZyb21MaXN0IiwidGFyZ2V0IiwiZmlsZXMiLCJtYXAiLCJnZXRGc0hhbmRsZUZpbGVzIiwiaGFuZGxlcyIsIl9hIiwiYWxsIiwiaCIsImdldEZpbGUiLCJnZXREYXRhVHJhbnNmZXJGaWxlcyIsImR0IiwiaXRlbXMiLCJmaWx0ZXIiLCJpdGVtIiwia2luZCIsInRvRmlsZVByb21pc2VzIiwibm9JZ25vcmVkRmlsZXMiLCJmbGF0dGVuIiwiaW5kZXhPZiIsIndlYmtpdEdldEFzRW50cnkiLCJmcm9tRGF0YVRyYW5zZmVySXRlbSIsImVudHJ5IiwiaXNEaXJlY3RvcnkiLCJmcm9tRGlyRW50cnkiLCJyZWR1Y2UiLCJhY2MiLCJhcmd1bWVudHMiLCJjb25jYXQiLCJfX3NwcmVhZCIsIkFycmF5IiwiaXNBcnJheSIsImdldEFzRmlsZSIsImZ3cCIsImZyb21FbnRyeSIsImZyb21GaWxlRW50cnkiLCJyZWFkZXIiLCJjcmVhdGVSZWFkZXIiLCJlbnRyaWVzIiwicmVhZEVudHJpZXMiLCJfdGhpcyIsImJhdGNoIiwiZXJyXzEiLCJlcnIiLCJmdWxsUGF0aCIsIkZJTEVfSU5WQUxJRF9UWVBFIiwiRklMRV9UT09fTEFSR0UiLCJGSUxFX1RPT19TTUFMTCIsIlRPT19NQU5ZX0ZJTEVTIiwiRXJyb3JDb2RlIiwiRmlsZUludmFsaWRUeXBlIiwiRmlsZVRvb0xhcmdlIiwiRmlsZVRvb1NtYWxsIiwiVG9vTWFueUZpbGVzIiwiZ2V0SW52YWxpZFR5cGVSZWplY3Rpb25FcnIiLCJhY2NlcHQiLCJtZXNzYWdlU3VmZml4Iiwiam9pbiIsImNvZGUiLCJtZXNzYWdlIiwiZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIiLCJtYXhTaXplIiwiZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIiLCJtaW5TaXplIiwiVE9PX01BTllfRklMRVNfUkVKRUNUSU9OIiwiZmlsZUFjY2VwdGVkIiwiaXNBY2NlcHRhYmxlIiwiYWNjZXB0ZWRGaWxlcyIsImFjY2VwdGVkRmlsZXNBcnJheSIsImZpbGVOYW1lIiwibWltZVR5cGUiLCJiYXNlTWltZVR5cGUiLCJyZXBsYWNlIiwic29tZSIsInZhbGlkVHlwZSIsInRyaW0iLCJjaGFyQXQiLCJlbmRzV2l0aCIsImFjY2VwdHMiLCJmaWxlTWF0Y2hTaXplIiwiaXNEZWZpbmVkIiwic2l6ZSIsImFsbEZpbGVzQWNjZXB0ZWQiLCJtdWx0aXBsZSIsIm1heEZpbGVzIiwiZXZlcnkiLCJhY2NlcHRlZCIsInNpemVNYXRjaCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwiZXZlbnQiLCJjYW5jZWxCdWJibGUiLCJpc0V2dFdpdGhGaWxlcyIsImRhdGFUcmFuc2ZlciIsInByb3RvdHlwZSIsInR5cGVzIiwib25Eb2N1bWVudERyYWdPdmVyIiwicHJldmVudERlZmF1bHQiLCJpc0llIiwidXNlckFnZW50IiwiaXNFZGdlIiwiaXNJZU9yRWRnZSIsIndpbmRvdyIsIm5hdmlnYXRvciIsImNvbXBvc2VFdmVudEhhbmRsZXJzIiwiZm5zIiwiYXJncyIsImZuIiwiY2FuVXNlRmlsZVN5c3RlbUFjY2Vzc0FQSSIsImZpbGVQaWNrZXJPcHRpb25zVHlwZXMiLCJkZXNjcmlwdGlvbiIsInRlc3QiLCJhIiwiYiIsIkRyb3B6b25lIiwiZm9yd2FyZFJlZiIsInJlZiIsImNoaWxkcmVuIiwidXNlRHJvcHpvbmUiLCJvcGVuIiwicHJvcHMiLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwiUmVhY3QiLCJGcmFnbWVudCIsImRpc3BsYXlOYW1lIiwiZGVmYXVsdFByb3BzIiwiZGlzYWJsZWQiLCJnZXRGaWxlc0Zyb21FdmVudCIsImlzQ2hhbmdlRXZ0IiwiSW5maW5pdHkiLCJwcmV2ZW50RHJvcE9uRG9jdW1lbnQiLCJub0NsaWNrIiwibm9LZXlib2FyZCIsIm5vRHJhZyIsIm5vRHJhZ0V2ZW50c0J1YmJsaW5nIiwidmFsaWRhdG9yIiwidXNlRnNBY2Nlc3NBcGkiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiYXJyYXlPZiIsImJvb2wiLCJudW1iZXIiLCJvbkZpbGVEaWFsb2dDYW5jZWwiLCJvbkZpbGVEaWFsb2dPcGVuIiwib25EcmFnRW50ZXIiLCJvbkRyYWdMZWF2ZSIsIm9uRHJhZ092ZXIiLCJvbkRyb3AiLCJvbkRyb3BBY2NlcHRlZCIsIm9uRHJvcFJlamVjdGVkIiwiaW5pdGlhbFN0YXRlIiwiaXNGb2N1c2VkIiwiaXNGaWxlRGlhbG9nQWN0aXZlIiwiaXNEcmFnQWN0aXZlIiwiaXNEcmFnQWNjZXB0IiwiaXNEcmFnUmVqZWN0IiwiZHJhZ2dlZEZpbGVzIiwiZmlsZVJlamVjdGlvbnMiLCJvcHRpb25zIiwib25GaWxlRGlhbG9nT3BlbkNiIiwidXNlTWVtbyIsIm5vb3AiLCJvbkZpbGVEaWFsb2dDYW5jZWxDYiIsInJvb3RSZWYiLCJ1c2VSZWYiLCJpbnB1dFJlZiIsInVzZVJlZHVjZXIiLCJyZWR1Y2VyIiwic3RhdGUiLCJkaXNwYXRjaCIsIm9uV2luZG93Rm9jdXMiLCJzZXRUaW1lb3V0IiwiY3VycmVudCIsInVzZUVmZmVjdCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZHJhZ1RhcmdldHNSZWYiLCJvbkRvY3VtZW50RHJvcCIsImNvbnRhaW5zIiwiZG9jdW1lbnQiLCJvbkRyYWdFbnRlckNiIiwidXNlQ2FsbGJhY2siLCJwZXJzaXN0Iiwic3RvcFByb3BhZ2F0aW9uIiwib25EcmFnT3ZlckNiIiwiaGFzRmlsZXMiLCJkcm9wRWZmZWN0Iiwib25EcmFnTGVhdmVDYiIsInRhcmdldHMiLCJ0YXJnZXRJZHgiLCJzcGxpY2UiLCJzZXRGaWxlcyIsImZvckVhY2giLCJhY2NlcHRFcnJvciIsInNpemVFcnJvciIsImN1c3RvbUVycm9ycyIsImVycm9ycyIsIm9uRHJvcENiIiwib3BlbkZpbGVEaWFsb2ciLCJvcHRzIiwic2hvd09wZW5GaWxlUGlja2VyIiwiY2F0Y2giLCJmaW5hbGx5IiwiY2xpY2siLCJvbktleURvd25DYiIsImlzRXF1YWxOb2RlIiwia2V5Q29kZSIsIm9uRm9jdXNDYiIsIm9uQmx1ckNiIiwib25DbGlja0NiIiwiY29tcG9zZUhhbmRsZXIiLCJjb21wb3NlS2V5Ym9hcmRIYW5kbGVyIiwiY29tcG9zZURyYWdIYW5kbGVyIiwiZ2V0Um9vdFByb3BzIiwicmVmS2V5Iiwicm9sZSIsIm9uS2V5RG93biIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvbkNsaWNrIiwicmVzdCIsInRhYkluZGV4Iiwib25JbnB1dEVsZW1lbnRDbGljayIsImdldElucHV0UHJvcHMiLCJvbkNoYW5nZSIsImlucHV0UHJvcHMiLCJzdHlsZSIsImRpc3BsYXkiLCJhdXRvQ29tcGxldGUiLCJmaWxlQ291bnQiLCJhY3Rpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O3cwQkFxRU8sU0FBU0EsRUFBVUMsRUFBU0MsRUFBWUMsRUFBR0MsR0FFOUMsT0FBTyxJQUFLRCxJQUFNQSxFQUFJRSxXQUFVLFNBQVVDLEVBQVNDLEdBQy9DLFNBQVNDLEVBQVVDLEdBQVMsSUFBTUMsRUFBS04sRUFBVU8sS0FBS0YsSUFBVyxNQUFPRyxHQUFLTCxFQUFPSyxJQUNwRixTQUFTQyxFQUFTSixHQUFTLElBQU1DLEVBQUtOLEVBQWlCLE1BQUVLLElB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
15
+ ***************************************************************************** */()}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);n<t;n++)r[n]=e[n];return r}function v(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function u(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,u)}c((r=r.apply(e,t||[])).next())}))}function g(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,u])}}}function m(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >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 j(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=j(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,O(k(r.sent()))];case 2:return[2,O(j(e.files).map((function(e){return b(e)})))]}}))}))}function O(e){return e.filter((function(e){return-1===h.indexOf(e.name)}))}function j(e){if(null===e)return[];for(var t=[],n=0;n<e.length;n++){var r=e[n];t.push(r)}return t}function A(e){if("function"!=typeof e.webkitGetAsEntry)return E(e);var t=e.webkitGetAsEntry();return t&&t.isDirectory?C(t):E(e)}function k(e){return e.reduce((function(e,t){return function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(m(arguments[t]));return e}(e,Array.isArray(t)?k(t):[t])}),[])}function E(e){var t=e.getAsFile();if(!t)return Promise.reject(e+" is not a File");var n=b(t);return Promise.resolve(n)}function P(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return[2,e.isDirectory?C(e):S(e)]}))}))}function C(e){var t=e.createReader();return new Promise((function(e,n){var r=[];!function o(){var i=this;t.readEntries((function(t){return v(i,void 0,void 0,(function(){var i,a,u;return g(this,(function(c){switch(c.label){case 0:if(t.length)return[3,5];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,Promise.all(r)];case 2:return i=c.sent(),e(i),[3,4];case 3:return a=c.sent(),n(a),[3,4];case 4:return[3,6];case 5:u=Promise.all(t.map(P)),r.push(u),o(),c.label=6;case 6:return[2]}}))}))}),(function(e){n(e)}))}()}))}function S(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return[2,new Promise((function(t,n){e.file((function(n){var r=b(n,e.fullPath);t(r)}),(function(e){n(e)}))}))]}))}))}var z="file-invalid-type",R="file-too-large",T="file-too-small",L="too-many-files",I={FileInvalidType:z,FileTooLarge:R,FileTooSmall:T,TooManyFiles:L},M=function(e){e=Array.isArray(e)&&1===e.length?e[0]:e;var t=Array.isArray(e)?"one of ".concat(e.join(", ")):e;return{code:z,message:"File type must be ".concat(t)}},K=function(e){return{code:R,message:"File is larger than ".concat(e," ").concat(1===e?"byte":"bytes")}},B=function(e){return{code:T,message:"File is smaller than ".concat(e," ").concat(1===e?"byte":"bytes")}},_={code:L,message:"Too many files"};function q(e,t){var n="application/x-moz-file"===e.type||function(e,t){if(e&&t){var n=Array.isArray(t)?t:t.split(","),r=e.name||"",o=(e.type||"").toLowerCase(),i=o.replace(/\/.*$/,"");return n.some((function(e){var t=e.trim().toLowerCase();return"."===t.charAt(0)?r.toLowerCase().endsWith(t):t.endsWith("/*")?i===t.replace(/\/.*$/,""):o===t}))}return!0}(e,t);return[n,n?null:M(t)]}function G(e,t,n){if($(e.size))if($(t)&&$(n)){if(e.size>n)return[!1,K(n)];if(e.size<t)return[!1,B(t)]}else{if($(t)&&e.size<t)return[!1,B(t)];if($(n)&&e.size>n)return[!1,K(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(q(e,n),1)[0],i=f(G(e,r,o),1)[0];return t&&i}))}function U(e){return"function"==typeof e.isPropagationStopped?e.isPropagationStopped():void 0!==e.cancelBubble&&e.cancelBubble}function W(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 H(e){e.preventDefault()}function Y(e){return-1!==e.indexOf("MSIE")||-1!==e.indexOf("Trident/")}function J(e){return-1!==e.indexOf("Edge/")}function Q(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.navigator.userAgent;return Y(e)||J(e)}function V(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return t.some((function(t){return!U(e)&&t&&t.apply(void 0,[e].concat(r)),U(e)}))}}function X(){return"showOpenFilePicker"in window}function Z(e){return e="string"==typeof e?e.split(","):e,[{description:"everything",accept:Array.isArray(e)?e.filter((function(e){return"audio/*"===e||"video/*"===e||"image/*"===e||"text/*"===e||/\w+\/[-+.\w]+/g.test(e)})).reduce((function(e,t){return u(u({},e),{},c({},t,[]))}),{}):{}}]}function ee(e){return e instanceof DOMException&&("AbortError"===e.name||e.code===e.ABORT_ERR)}function te(e){return e instanceof DOMException&&("SecurityError"===e.name||e.code===e.SECURITY_ERR)}var ne=["children"],re=["open"],oe=["refKey","role","onKeyDown","onFocus","onBlur","onClick","onDragEnter","onDragOver","onDragLeave","onDrop"],ie=["refKey","onChange","onClick"],ae=t.forwardRef((function(e,n){var r=e.children,i=le(l(e,ne)),a=i.open,c=l(i,re);return t.useImperativeHandle(n,(function(){return{open:a}}),[a]),o.default.createElement(t.Fragment,null,r(u(u({},c),{},{open:a})))}));ae.displayName="Dropzone";var ue={disabled:!1,getFilesFromEvent:function(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return w(e)&&w(e.dataTransfer)?[2,F(e.dataTransfer,e.type)]:function(e){return w(e)&&w(e.target)}(e)?[2,D(e)]:Array.isArray(e)&&e.every((function(e){return"getFile"in e&&"function"==typeof e.getFile}))?[2,x(e)]:[2,[]]}))}))},maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!0};ae.defaultProps=ue,ae.propTypes={children:i.default.func,accept:i.default.oneOfType([i.default.string,i.default.arrayOf(i.default.string)]),multiple:i.default.bool,preventDropOnDocument:i.default.bool,noClick:i.default.bool,noKeyboard:i.default.bool,noDrag:i.default.bool,noDragEventsBubbling:i.default.bool,minSize:i.default.number,maxSize:i.default.number,maxFiles:i.default.number,disabled:i.default.bool,getFilesFromEvent:i.default.func,onFileDialogCancel:i.default.func,onFileDialogOpen:i.default.func,useFsAccessApi:i.default.bool,onDragEnter:i.default.func,onDragLeave:i.default.func,onDragOver:i.default.func,onDrop:i.default.func,onDropAccepted:i.default.func,onDropRejected:i.default.func,validator:i.default.func};var ce={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,draggedFiles:[],acceptedFiles:[],fileRejections:[]};function le(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=u(u({},ue),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,O=n.preventDropOnDocument,j=n.noClick,A=n.noKeyboard,k=n.noDrag,E=n.noDragEventsBubbling,P=n.validator,C=t.useMemo((function(){return"function"==typeof x?x:se}),[x]),S=t.useMemo((function(){return"function"==typeof D?D:se}),[D]),z=t.useRef(null),R=t.useRef(null),T=t.useReducer(fe,ce),L=f(T,2),I=L[0],M=L[1],K=I.isFocused,B=I.isFileDialogActive,$=I.draggedFiles,Y=t.useRef("undefined"!=typeof window&&window.isSecureContext&&F&&X()),J=function(){!Y.current&&B&&setTimeout((function(){R.current&&(R.current.files.length||(M({type:"closeDialog"}),S()))}),300)};t.useEffect((function(){return window.addEventListener("focus",J,!1),function(){window.removeEventListener("focus",J,!1)}}),[R,B,S,Y]);var ne=t.useRef([]),re=function(e){z.current&&z.current.contains(e.target)||(e.preventDefault(),ne.current=[])};t.useEffect((function(){return O&&(document.addEventListener("dragover",H,!1),document.addEventListener("drop",re,!1)),function(){O&&(document.removeEventListener("dragover",H),document.removeEventListener("drop",re))}}),[z,O]);var ae=t.useCallback((function(e){e.preventDefault(),e.persist(),Fe(e),ne.current=[].concat(s(ne.current),[e.target]),W(e)&&Promise.resolve(i(e)).then((function(t){U(e)&&!E||(M({draggedFiles:t,isDragActive:!0,type:"setDraggedFiles"}),g&&g(e))}))}),[i,g,E]),le=t.useCallback((function(e){e.preventDefault(),e.persist(),Fe(e);var t=W(e);if(t&&e.dataTransfer)try{e.dataTransfer.dropEffect="copy"}catch(e){}return t&&y&&y(e),!1}),[y,E]),pe=t.useCallback((function(e){e.preventDefault(),e.persist(),Fe(e);var t=ne.current.filter((function(e){return z.current&&z.current.contains(e)})),n=t.indexOf(e.target);-1!==n&&t.splice(n,1),ne.current=t,t.length>0||(M({isDragActive:!1,type:"setDraggedFiles",draggedFiles:[]}),W(e)&&m&&m(e))}),[z,m,E]),de=t.useCallback((function(e,t){var n=[],o=[];e.forEach((function(e){var t=f(q(e,r),2),i=t[0],u=t[1],c=f(G(e,p,a),2),l=c[0],s=c[1],d=P?P(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:[_]})})),n.splice(0)),M({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)}),[M,d,r,p,a,v,b,h,w,P]),ve=t.useCallback((function(e){e.preventDefault(),e.persist(),Fe(e),ne.current=[],W(e)&&Promise.resolve(i(e)).then((function(t){U(e)&&!E||de(t,e)})),M({type:"reset"})}),[i,de,E]),ge=t.useCallback((function(){if(Y.current){M({type:"openDialog"}),C();var e={multiple:d,types:Z(r)};window.showOpenFilePicker(e).then((function(e){return i(e)})).then((function(e){de(e,null),M({type:"closeDialog"})})).catch((function(e){ee(e)?(S(e),M({type:"closeDialog"})):te(e)&&(Y.current=!1,R.current&&(R.current.value=null,R.current.click()))}))}else R.current&&(M({type:"openDialog"}),C(),R.current.value=null,R.current.click())}),[M,C,S,F,de,r,d]),me=t.useCallback((function(e){z.current&&z.current.isEqualNode(e.target)&&(32!==e.keyCode&&13!==e.keyCode||(e.preventDefault(),ge()))}),[z,ge]),ye=t.useCallback((function(){M({type:"focus"})}),[]),be=t.useCallback((function(){M({type:"blur"})}),[]),he=t.useCallback((function(){j||(Q()?setTimeout(ge,0):ge())}),[j,ge]),we=function(e){return o?null:e},De=function(e){return A?null:we(e)},xe=function(e){return k?null:we(e)},Fe=function(e){E&&e.stopPropagation()},Oe=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,oe);return u(u(c({onKeyDown:De(V(i,me)),onFocus:De(V(a,ye)),onBlur:De(V(f,be)),onClick:we(V(s,he)),onDragEnter:xe(V(p,ae)),onDragOver:xe(V(d,le)),onDragLeave:xe(V(v,pe)),onDrop:xe(V(g,ve)),role:"string"==typeof r&&""!==r?r:"button"},n,z),o||A?{}:{tabIndex:0}),m)}}),[z,me,ye,be,he,ae,le,pe,ve,A,k,o]),je=t.useCallback((function(e){e.stopPropagation()}),[]),Ae=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,ie),f=c({accept:r,multiple:d,type:"file",style:{display:"none"},onChange:we(V(o,ve)),onClick:we(V(i,je)),autoComplete:"off",tabIndex:-1},n,R);return u(u({},f),a)}}),[R,r,d,ve,o]),ke=$.length,Ee=ke>0&&N({files:$,accept:r,minSize:p,maxSize:a,multiple:d,maxFiles:v}),Pe=ke>0&&!Ee;return u(u({},I),{},{isDragAccept:Ee,isDragReject:Pe,isFocused:K&&!o,getRootProps:Oe,getInputProps:Ae,rootRef:z,inputRef:R,open:we(ge)})}function fe(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({},ce),{},{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({},ce);default:return e}}function se(){}e.ErrorCode=I,e.default=ae,e.useDropzone=le,Object.defineProperty(e,"__esModule",{value:!0})}));
16
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9ub2RlX21vZHVsZXMvZmlsZS1zZWxlY3Rvci9kaXN0L2VzNS9maWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2VsZWN0b3IvZGlzdC9lczUvZmlsZS1zZWxlY3Rvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9hdHRyLWFjY2VwdC9kaXN0L2VzL2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzL2luZGV4LmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiZXhwb3J0IHZhciBDT01NT05fTUlNRV9UWVBFUyA9IG5ldyBNYXAoW1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcbiAgICBbJ2FhYycsICdhdWRpby9hYWMnXSxcbiAgICBbJ2FidycsICdhcHBsaWNhdGlvbi94LWFiaXdvcmQnXSxcbiAgICBbJ2FyYycsICdhcHBsaWNhdGlvbi94LWZyZWVhcmMnXSxcbiAgICBbJ2F2aWYnLCAnaW1hZ2UvYXZpZiddLFxuICAgIFsnYXZpJywgJ3ZpZGVvL3gtbXN2aWRlbyddLFxuICAgIFsnYXp3JywgJ2FwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2snXSxcbiAgICBbJ2JpbicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ2JtcCcsICdpbWFnZS9ibXAnXSxcbiAgICBbJ2J6JywgJ2FwcGxpY2F0aW9uL3gtYnppcCddLFxuICAgIFsnYnoyJywgJ2FwcGxpY2F0aW9uL3gtYnppcDInXSxcbiAgICBbJ2NkYScsICdhcHBsaWNhdGlvbi94LWNkZiddLFxuICAgIFsnY3NoJywgJ2FwcGxpY2F0aW9uL3gtY3NoJ10sXG4gICAgWydjc3MnLCAndGV4dC9jc3MnXSxcbiAgICBbJ2NzdicsICd0ZXh0L2NzdiddLFxuICAgIFsnZG9jJywgJ2FwcGxpY2F0aW9uL21zd29yZCddLFxuICAgIFsnZG9jeCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCddLFxuICAgIFsnZW90JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0J10sXG4gICAgWydlcHViJywgJ2FwcGxpY2F0aW9uL2VwdWIremlwJ10sXG4gICAgWydneicsICdhcHBsaWNhdGlvbi9nemlwJ10sXG4gICAgWydnaWYnLCAnaW1hZ2UvZ2lmJ10sXG4gICAgWydodG0nLCAndGV4dC9odG1sJ10sXG4gICAgWydodG1sJywgJ3RleHQvaHRtbCddLFxuICAgIFsnaWNvJywgJ2ltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiddLFxuICAgIFsnaWNzJywgJ3RleHQvY2FsZW5kYXInXSxcbiAgICBbJ2phcicsICdhcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmUnXSxcbiAgICBbJ2pwZWcnLCAnaW1hZ2UvanBlZyddLFxuICAgIFsnanBnJywgJ2ltYWdlL2pwZWcnXSxcbiAgICBbJ2pzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnanNvbicsICdhcHBsaWNhdGlvbi9qc29uJ10sXG4gICAgWydqc29ubGQnLCAnYXBwbGljYXRpb24vbGQranNvbiddLFxuICAgIFsnbWlkJywgJ2F1ZGlvL21pZGknXSxcbiAgICBbJ21pZGknLCAnYXVkaW8vbWlkaSddLFxuICAgIFsnbWpzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnbXAzJywgJ2F1ZGlvL21wZWcnXSxcbiAgICBbJ21wNCcsICd2aWRlby9tcDQnXSxcbiAgICBbJ21wZWcnLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbXBrZycsICdhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbCddLFxuICAgIFsnb2RwJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uJ10sXG4gICAgWydvZHMnLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCddLFxuICAgIFsnb2R0JywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCddLFxuICAgIFsnb2dhJywgJ2F1ZGlvL29nZyddLFxuICAgIFsnb2d2JywgJ3ZpZGVvL29nZyddLFxuICAgIFsnb2d4JywgJ2FwcGxpY2F0aW9uL29nZyddLFxuICAgIFsnb3B1cycsICdhdWRpby9vcHVzJ10sXG4gICAgWydvdGYnLCAnZm9udC9vdGYnXSxcbiAgICBbJ3BuZycsICdpbWFnZS9wbmcnXSxcbiAgICBbJ3BkZicsICdhcHBsaWNhdGlvbi9wZGYnXSxcbiAgICBbJ3BocCcsICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCddLFxuICAgIFsncHB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50J10sXG4gICAgWydwcHR4JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nXSxcbiAgICBbJ3JhcicsICdhcHBsaWNhdGlvbi92bmQucmFyJ10sXG4gICAgWydydGYnLCAnYXBwbGljYXRpb24vcnRmJ10sXG4gICAgWydzaCcsICdhcHBsaWNhdGlvbi94LXNoJ10sXG4gICAgWydzdmcnLCAnaW1hZ2Uvc3ZnK3htbCddLFxuICAgIFsnc3dmJywgJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJ10sXG4gICAgWyd0YXInLCAnYXBwbGljYXRpb24veC10YXInXSxcbiAgICBbJ3RpZicsICdpbWFnZS90aWZmJ10sXG4gICAgWyd0aWZmJywgJ2ltYWdlL3RpZmYnXSxcbiAgICBbJ3RzJywgJ3ZpZGVvL21wMnQnXSxcbiAgICBbJ3R0ZicsICdmb250L3R0ZiddLFxuICAgIFsndHh0JywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ3ZzZCcsICdhcHBsaWNhdGlvbi92bmQudmlzaW8nXSxcbiAgICBbJ3dhdicsICdhdWRpby93YXYnXSxcbiAgICBbJ3dlYmEnLCAnYXVkaW8vd2VibSddLFxuICAgIFsnd2VibScsICd2aWRlby93ZWJtJ10sXG4gICAgWyd3ZWJwJywgJ2ltYWdlL3dlYnAnXSxcbiAgICBbJ3dvZmYnLCAnZm9udC93b2ZmJ10sXG4gICAgWyd3b2ZmMicsICdmb250L3dvZmYyJ10sXG4gICAgWyd4aHRtbCcsICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXSxcbiAgICBbJ3hscycsICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnXSxcbiAgICBbJ3hsc3gnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXSxcbiAgICBbJ3htbCcsICdhcHBsaWNhdGlvbi94bWwnXSxcbiAgICBbJ3h1bCcsICdhcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sJ10sXG4gICAgWyd6aXAnLCAnYXBwbGljYXRpb24vemlwJ10sXG4gICAgWyc3eicsICdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnXSxcbiAgICAvLyBPdGhlcnNcbiAgICBbJ21rdicsICd2aWRlby94LW1hdHJvc2thJ10sXG4gICAgWydtb3YnLCAndmlkZW8vcXVpY2t0aW1lJ10sXG4gICAgWydtc2cnLCAnYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2snXVxuXSk7XG5leHBvcnQgZnVuY3Rpb24gdG9GaWxlV2l0aFBhdGgoZmlsZSwgcGF0aCkge1xuICAgIHZhciBmID0gd2l0aE1pbWVUeXBlKGZpbGUpO1xuICAgIGlmICh0eXBlb2YgZi5wYXRoICE9PSAnc3RyaW5nJykgeyAvLyBvbiBlbGVjdHJvbiwgcGF0aCBpcyBhbHJlYWR5IHNldCB0byB0aGUgYWJzb2x1dGUgcGF0aFxuICAgICAgICB2YXIgd2Via2l0UmVsYXRpdmVQYXRoID0gZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGg7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAncGF0aCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IHBhdGhcbiAgICAgICAgICAgICAgICAvLyBJZiA8aW5wdXQgd2Via2l0ZGlyZWN0b3J5PiBpcyBzZXQsXG4gICAgICAgICAgICAgICAgLy8gdGhlIEZpbGUgd2lsbCBoYXZlIGEge3dlYmtpdFJlbGF0aXZlUGF0aH0gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTElucHV0RWxlbWVudC93ZWJraXRkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiB3ZWJraXRSZWxhdGl2ZVBhdGggPT09ICdzdHJpbmcnICYmIHdlYmtpdFJlbGF0aXZlUGF0aC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gd2Via2l0UmVsYXRpdmVQYXRoXG4gICAgICAgICAgICAgICAgICAgIDogZmlsZS5uYW1lLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmO1xufVxuZnVuY3Rpb24gd2l0aE1pbWVUeXBlKGZpbGUpIHtcbiAgICB2YXIgbmFtZSA9IGZpbGUubmFtZTtcbiAgICB2YXIgaGFzRXh0ZW5zaW9uID0gbmFtZSAmJiBuYW1lLmxhc3RJbmRleE9mKCcuJykgIT09IC0xO1xuICAgIGlmIChoYXNFeHRlbnNpb24gJiYgIWZpbGUudHlwZSkge1xuICAgICAgICB2YXIgZXh0ID0gbmFtZS5zcGxpdCgnLicpXG4gICAgICAgICAgICAucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIHR5cGUgPSBDT01NT05fTUlNRV9UWVBFUy5nZXQoZXh0KTtcbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWxlLCAndHlwZScsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdG9GaWxlV2l0aFBhdGggfSBmcm9tICcuL2ZpbGUnO1xudmFyIEZJTEVTX1RPX0lHTk9SRSA9IFtcbiAgICAvLyBUaHVtYm5haWwgY2FjaGUgZmlsZXMgZm9yIG1hY09TIGFuZCBXaW5kb3dzXG4gICAgJy5EU19TdG9yZScsXG4gICAgJ1RodW1icy5kYicgLy8gV2luZG93c1xuXTtcbi8qKlxuICogQ29udmVydCBhIERyYWdFdmVudCdzIERhdGFUcmFzZmVyIG9iamVjdCB0byBhIGxpc3Qgb2YgRmlsZSBvYmplY3RzXG4gKiBOT1RFOiBJZiBzb21lIG9mIHRoZSBpdGVtcyBhcmUgZm9sZGVycyxcbiAqIGV2ZXJ5dGhpbmcgd2lsbCBiZSBmbGF0dGVuZWQgYW5kIHBsYWNlZCBpbiB0aGUgc2FtZSBsaXN0IGJ1dCB0aGUgcGF0aHMgd2lsbCBiZSBrZXB0IGFzIGEge3BhdGh9IHByb3BlcnR5LlxuICpcbiAqIEVYUEVSSU1FTlRBTDogQSBsaXN0IG9mIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtSGFuZGxlIG9iamVjdHMgY2FuIGFsc28gYmUgcGFzc2VkIGFzIGFuIGFyZ1xuICogYW5kIGEgbGlzdCBvZiBGaWxlIG9iamVjdHMgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZXZ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRXZlbnQoZXZ0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZXZ0KSAmJiBpc0RhdGFUcmFuc2ZlcihldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldERhdGFUcmFuc2ZlckZpbGVzKGV2dC5kYXRhVHJhbnNmZXIsIGV2dC50eXBlKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0NoYW5nZUV2dChldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldElucHV0RmlsZXMoZXZ0KV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV2dCkgJiYgZXZ0LmV2ZXJ5KGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAnZ2V0RmlsZScgaW4gaXRlbSAmJiB0eXBlb2YgaXRlbS5nZXRGaWxlID09PSAnZnVuY3Rpb24nOyB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnZXRGc0hhbmRsZUZpbGVzKGV2dCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc0RhdGFUcmFuc2Zlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc09iamVjdCh2YWx1ZS5kYXRhVHJhbnNmZXIpO1xufVxuZnVuY3Rpb24gaXNDaGFuZ2VFdnQodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzT2JqZWN0KHZhbHVlLnRhcmdldCk7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0SW5wdXRGaWxlcyhldnQpIHtcbiAgICByZXR1cm4gZnJvbUxpc3QoZXZ0LnRhcmdldC5maWxlcykubWFwKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiB0b0ZpbGVXaXRoUGF0aChmaWxlKTsgfSk7XG59XG4vLyBFZSBleHBlY3QgZWFjaCBoYW5kbGUgdG8gYmUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1GaWxlSGFuZGxlXG5mdW5jdGlvbiBnZXRGc0hhbmRsZUZpbGVzKGhhbmRsZXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWxlcztcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoZnVuY3Rpb24gKGgpIHsgcmV0dXJuIGguZ2V0RmlsZSgpOyB9KSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVRyYW5zZmVyRmlsZXMoZHQsIHR5cGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpdGVtcywgZmlsZXM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmIChkdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWR0Lml0ZW1zKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBmcm9tTGlzdChkdC5pdGVtcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0ua2luZCA9PT0gJ2ZpbGUnOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSAnZHJhZ3N0YXJ0JyBhbmQgJ2Ryb3AnIGhhcyBhY2Nlc3MgdG8gdGhlIGRhdGEgKHNvdXJjZSBub2RlKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gJ2Ryb3AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaXRlbXNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGl0ZW1zLm1hcCh0b0ZpbGVQcm9taXNlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbm9JZ25vcmVkRmlsZXMoZmxhdHRlbihmaWxlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCBub0lnbm9yZWRGaWxlcyhmcm9tTGlzdChkdC5maWxlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KSldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vSWdub3JlZEZpbGVzKGZpbGVzKSB7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkgeyByZXR1cm4gRklMRVNfVE9fSUdOT1JFLmluZGV4T2YoZmlsZS5uYW1lKSA9PT0gLTE7IH0pO1xufVxuLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5LmZyb20oKVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZnJvbSNCcm93c2VyX2NvbXBhdGliaWxpdHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlTGlzdFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlckl0ZW1MaXN0XG5mdW5jdGlvbiBmcm9tTGlzdChpdGVtcykge1xuICAgIGlmIChpdGVtcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBmaWxlcyA9IFtdO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOiBwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmlsZSA9IGl0ZW1zW2ldO1xuICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVySXRlbVxuZnVuY3Rpb24gdG9GaWxlUHJvbWlzZXMoaXRlbSkge1xuICAgIGlmICh0eXBlb2YgaXRlbS53ZWJraXRHZXRBc0VudHJ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmcm9tRGF0YVRyYW5zZmVySXRlbShpdGVtKTtcbiAgICB9XG4gICAgdmFyIGVudHJ5ID0gaXRlbS53ZWJraXRHZXRBc0VudHJ5KCk7XG4gICAgLy8gU2FmYXJpIHN1cHBvcnRzIGRyb3BwaW5nIGFuIGltYWdlIG5vZGUgZnJvbSBhIGRpZmZlcmVudCB3aW5kb3cgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmdcbiAgICAvLyB0aGUgRGF0YVRyYW5zZmVySXRlbS5nZXRBc0ZpbGUoKSBBUElcbiAgICAvLyBOT1RFOiBGaWxlU3lzdGVtRW50cnkuZmlsZSgpIHRocm93cyBpZiB0cnlpbmcgdG8gZ2V0IHRoZSBmaWxlXG4gICAgaWYgKGVudHJ5ICYmIGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHJldHVybiBmcm9tRGlyRW50cnkoZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSk7XG59XG5mdW5jdGlvbiBmbGF0dGVuKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmaWxlcykgeyByZXR1cm4gX19zcHJlYWQoYWNjLCAoQXJyYXkuaXNBcnJheShmaWxlcykgPyBmbGF0dGVuKGZpbGVzKSA6IFtmaWxlc10pKTsgfSwgW10pO1xufVxuZnVuY3Rpb24gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSkge1xuICAgIHZhciBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGl0ZW0gKyBcIiBpcyBub3QgYSBGaWxlXCIpO1xuICAgIH1cbiAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmd3ApO1xufVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1FbnRyeVxuZnVuY3Rpb24gZnJvbUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW50cnkuaXNEaXJlY3RvcnkgPyBmcm9tRGlyRW50cnkoZW50cnkpIDogZnJvbUZpbGVFbnRyeShlbnRyeSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRGlyZWN0b3J5RW50cnlcbmZ1bmN0aW9uIGZyb21EaXJFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWFkZXIgPSBlbnRyeS5jcmVhdGVSZWFkZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgICBmdW5jdGlvbiByZWFkRW50cmllcygpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZVN5c3RlbURpcmVjdG9yeUVudHJ5L2NyZWF0ZVJlYWRlclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1EaXJlY3RvcnlSZWFkZXIvcmVhZEVudHJpZXNcbiAgICAgICAgICAgIHJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoYmF0Y2gpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZXMsIGVycl8xLCBpdGVtcztcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFiYXRjaC5sZW5ndGgpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGVudHJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IFByb21pc2UuYWxsKGJhdGNoLm1hcChmcm9tRW50cnkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHJlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTsgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZEVudHJpZXMoKTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRmlsZUVudHJ5XG5mdW5jdGlvbiBmcm9tRmlsZUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSwgZW50cnkuZnVsbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmd3ApO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUtc2VsZWN0b3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmIChmaWxlICYmIGFjY2VwdGVkRmlsZXMpIHtcbiAgICB2YXIgYWNjZXB0ZWRGaWxlc0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NlcHRlZEZpbGVzKSA/IGFjY2VwdGVkRmlsZXMgOiBhY2NlcHRlZEZpbGVzLnNwbGl0KCcsJyk7XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICcnO1xuICAgIHZhciBtaW1lVHlwZSA9IChmaWxlLnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGJhc2VNaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICByZXR1cm4gYWNjZXB0ZWRGaWxlc0FycmF5LnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHZhciB2YWxpZFR5cGUgPSB0eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAodmFsaWRUeXBlLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKHZhbGlkVHlwZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbGlkVHlwZS5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcbiAgICAgICAgcmV0dXJuIGJhc2VNaW1lVHlwZSA9PT0gdmFsaWRUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1pbWVUeXBlID09PSB2YWxpZFR5cGU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07IiwiaW1wb3J0IGFjY2VwdHMgZnJvbSBcImF0dHItYWNjZXB0XCI7XG5cbi8vIEVycm9yIGNvZGVzXG5leHBvcnQgY29uc3QgRklMRV9JTlZBTElEX1RZUEUgPSBcImZpbGUtaW52YWxpZC10eXBlXCI7XG5leHBvcnQgY29uc3QgRklMRV9UT09fTEFSR0UgPSBcImZpbGUtdG9vLWxhcmdlXCI7XG5leHBvcnQgY29uc3QgRklMRV9UT09fU01BTEwgPSBcImZpbGUtdG9vLXNtYWxsXCI7XG5leHBvcnQgY29uc3QgVE9PX01BTllfRklMRVMgPSBcInRvby1tYW55LWZpbGVzXCI7XG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGUgPSB7XG4gIEZpbGVJbnZhbGlkVHlwZTogRklMRV9JTlZBTElEX1RZUEUsXG4gIEZpbGVUb29MYXJnZTogRklMRV9UT09fTEFSR0UsXG4gIEZpbGVUb29TbWFsbDogRklMRV9UT09fU01BTEwsXG4gIFRvb01hbnlGaWxlczogVE9PX01BTllfRklMRVMsXG59O1xuXG4vLyBGaWxlIEVycm9yc1xuZXhwb3J0IGNvbnN0IGdldEludmFsaWRUeXBlUmVqZWN0aW9uRXJyID0gKGFjY2VwdCkgPT4ge1xuICBhY2NlcHQgPSBBcnJheS5pc0FycmF5KGFjY2VwdCkgJiYgYWNjZXB0Lmxlbmd0aCA9PT0gMSA/IGFjY2VwdFswXSA6IGFjY2VwdDtcbiAgY29uc3QgbWVzc2FnZVN1ZmZpeCA9IEFycmF5LmlzQXJyYXkoYWNjZXB0KVxuICAgID8gYG9uZSBvZiAke2FjY2VwdC5qb2luKFwiLCBcIil9YFxuICAgIDogYWNjZXB0O1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfSU5WQUxJRF9UWVBFLFxuICAgIG1lc3NhZ2U6IGBGaWxlIHR5cGUgbXVzdCBiZSAke21lc3NhZ2VTdWZmaXh9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUb29MYXJnZVJlamVjdGlvbkVyciA9IChtYXhTaXplKSA9PiB7XG4gIHJldHVybiB7XG4gICAgY29kZTogRklMRV9UT09fTEFSR0UsXG4gICAgbWVzc2FnZTogYEZpbGUgaXMgbGFyZ2VyIHRoYW4gJHttYXhTaXplfSAke1xuICAgICAgbWF4U2l6ZSA9PT0gMSA/IFwiYnl0ZVwiIDogXCJieXRlc1wiXG4gICAgfWAsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIgPSAobWluU2l6ZSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfVE9PX1NNQUxMLFxuICAgIG1lc3NhZ2U6IGBGaWxlIGlzIHNtYWxsZXIgdGhhbiAke21pblNpemV9ICR7XG4gICAgICBtaW5TaXplID09PSAxID8gXCJieXRlXCIgOiBcImJ5dGVzXCJcbiAgICB9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBUT09fTUFOWV9GSUxFU19SRUpFQ1RJT04gPSB7XG4gIGNvZGU6IFRPT19NQU5ZX0ZJTEVTLFxuICBtZXNzYWdlOiBcIlRvbyBtYW55IGZpbGVzXCIsXG59O1xuXG4vLyBGaXJlZm94IHZlcnNpb25zIHByaW9yIHRvIDUzIHJldHVybiBhIGJvZ3VzIE1JTUUgdHlwZSBmb3IgZXZlcnkgZmlsZSBkcmFnLCBzbyBkcmFnb3ZlcnMgd2l0aFxuLy8gdGhhdCBNSU1FIHR5cGUgd2lsbCBhbHdheXMgYmUgYWNjZXB0ZWRcbmV4cG9ydCBmdW5jdGlvbiBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KSB7XG4gIGNvbnN0IGlzQWNjZXB0YWJsZSA9XG4gICAgZmlsZS50eXBlID09PSBcImFwcGxpY2F0aW9uL3gtbW96LWZpbGVcIiB8fCBhY2NlcHRzKGZpbGUsIGFjY2VwdCk7XG4gIHJldHVybiBbXG4gICAgaXNBY2NlcHRhYmxlLFxuICAgIGlzQWNjZXB0YWJsZSA/IG51bGwgOiBnZXRJbnZhbGlkVHlwZVJlamVjdGlvbkVycihhY2NlcHQpLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsZU1hdGNoU2l6ZShmaWxlLCBtaW5TaXplLCBtYXhTaXplKSB7XG4gIGlmIChpc0RlZmluZWQoZmlsZS5zaXplKSkge1xuICAgIGlmIChpc0RlZmluZWQobWluU2l6ZSkgJiYgaXNEZWZpbmVkKG1heFNpemUpKSB7XG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4U2l6ZSkgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIobWF4U2l6ZSldO1xuICAgICAgaWYgKGZpbGUuc2l6ZSA8IG1pblNpemUpIHJldHVybiBbZmFsc2UsIGdldFRvb1NtYWxsUmVqZWN0aW9uRXJyKG1pblNpemUpXTtcbiAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChtaW5TaXplKSAmJiBmaWxlLnNpemUgPCBtaW5TaXplKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIobWluU2l6ZSldO1xuICAgIGVsc2UgaWYgKGlzRGVmaW5lZChtYXhTaXplKSAmJiBmaWxlLnNpemUgPiBtYXhTaXplKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIobWF4U2l6ZSldO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbEZpbGVzQWNjZXB0ZWQoe1xuICBmaWxlcyxcbiAgYWNjZXB0LFxuICBtaW5TaXplLFxuICBtYXhTaXplLFxuICBtdWx0aXBsZSxcbiAgbWF4RmlsZXMsXG59KSB7XG4gIGlmIChcbiAgICAoIW11bHRpcGxlICYmIGZpbGVzLmxlbmd0aCA+IDEpIHx8XG4gICAgKG11bHRpcGxlICYmIG1heEZpbGVzID49IDEgJiYgZmlsZXMubGVuZ3RoID4gbWF4RmlsZXMpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcy5ldmVyeSgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IFthY2NlcHRlZF0gPSBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KTtcbiAgICBjb25zdCBbc2l6ZU1hdGNoXSA9IGZpbGVNYXRjaFNpemUoZmlsZSwgbWluU2l6ZSwgbWF4U2l6ZSk7XG4gICAgcmV0dXJuIGFjY2VwdGVkICYmIHNpemVNYXRjaDtcbiAgfSk7XG59XG5cbi8vIFJlYWN0J3Mgc3ludGhldGljIGV2ZW50cyBoYXMgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQsXG4vLyBidXQgdG8gcmVtYWluIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaWJzIChQcmVhY3QpIGZhbGwgYmFja1xuLy8gdG8gY2hlY2sgZXZlbnQuY2FuY2VsQnViYmxlXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBldmVudC5jYW5jZWxCdWJibGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFdnRXaXRoRmlsZXMoZXZlbnQpIHtcbiAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICByZXR1cm4gISFldmVudC50YXJnZXQgJiYgISFldmVudC50YXJnZXQuZmlsZXM7XG4gIH1cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci90eXBlc1xuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9SZWNvbW1lbmRlZF9kcmFnX3R5cGVzI2ZpbGVcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLFxuICAgICh0eXBlKSA9PiB0eXBlID09PSBcIkZpbGVzXCIgfHwgdHlwZSA9PT0gXCJhcHBsaWNhdGlvbi94LW1vei1maWxlXCJcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2luZEZpbGUoaXRlbSkge1xuICByZXR1cm4gdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiYgaXRlbSAhPT0gbnVsbCAmJiBpdGVtLmtpbmQgPT09IFwiZmlsZVwiO1xufVxuXG4vLyBhbGxvdyB0aGUgZW50aXJlIGRvY3VtZW50IHRvIGJlIGEgZHJhZyB0YXJnZXRcbmV4cG9ydCBmdW5jdGlvbiBvbkRvY3VtZW50RHJhZ092ZXIoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn1cblxuZnVuY3Rpb24gaXNJZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIChcbiAgICB1c2VyQWdlbnQuaW5kZXhPZihcIk1TSUVcIikgIT09IC0xIHx8IHVzZXJBZ2VudC5pbmRleE9mKFwiVHJpZGVudC9cIikgIT09IC0xXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRWRnZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIHVzZXJBZ2VudC5pbmRleE9mKFwiRWRnZS9cIikgIT09IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZU9yRWRnZSh1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkge1xuICByZXR1cm4gaXNJZSh1c2VyQWdlbnQpIHx8IGlzRWRnZSh1c2VyQWdlbnQpO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjb21wb3NlIGV2ZW50IGhhbmRsZXJzXG4gKiBUaGV5IGFyZSBleGVjdXRlZCBpbiBvcmRlciB1bnRpbCBvbmUgb2YgdGhlbSBjYWxscyBgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKWAuXG4gKiBOb3RlIHRoYXQgdGhlIGNoZWNrIGlzIGRvbmUgb24gdGhlIGZpcnN0IGludm9rZSB0b28sXG4gKiBtZWFuaW5nIHRoYXQgaWYgcHJvcGFnYXRpb24gd2FzIHN0b3BwZWQgYmVmb3JlIGludm9raW5nIHRoZSBmbnMsXG4gKiBubyBoYW5kbGVycyB3aWxsIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZucyB0aGUgZXZlbnQgaGFubGRlciBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgZXZlbnQgaGFuZGxlciB0byBhZGQgdG8gYW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUV2ZW50SGFuZGxlcnMoLi4uZm5zKSB7XG4gIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnNvbWUoKGZuKSA9PiB7XG4gICAgICBpZiAoIWlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiBmbikge1xuICAgICAgICBmbihldmVudCwgLi4uYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkgY2hlY2tzIGlmIHRoZSBbRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUEkpXG4gKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkoKSB7XG4gIHJldHVybiBcInNob3dPcGVuRmlsZVBpY2tlclwiIGluIHdpbmRvdztcbn1cblxuLyoqXG4gKiBmaWxlUGlja2VyT3B0aW9uc1R5cGVzIHJldHVybnMgdGhlIHt0eXBlc30gb3B0aW9uIGZvciBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvd2luZG93L3Nob3dPcGVuRmlsZVBpY2tlclxuICogYmFzZWQgb24gdGhlIGFjY2VwdCBhdHRyIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL2F0dHItYWNjZXB0KVxuICogRS5nOiBjb252ZXJ0cyBbJ2ltYWdlLyonLCAndGV4dC8qJ10gdG8geydpbWFnZS8qJzogW10sICd0ZXh0LyonOiBbXX1cbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhY2NlcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVQaWNrZXJPcHRpb25zVHlwZXMoYWNjZXB0KSB7XG4gIGFjY2VwdCA9IHR5cGVvZiBhY2NlcHQgPT09IFwic3RyaW5nXCIgPyBhY2NlcHQuc3BsaXQoXCIsXCIpIDogYWNjZXB0O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImV2ZXJ5dGhpbmdcIixcbiAgICAgIC8vIFRPRE86IE5lZWQgdG8gaGFuZGxlIGZpbHRlcmluZyBtb3JlIGVsZWdhbnRseSB0aGFuIHRoaXMhXG4gICAgICBhY2NlcHQ6IEFycmF5LmlzQXJyYXkoYWNjZXB0KVxuICAgICAgICA/IC8vIEFjY2VwdCBqdXN0IE1JTUUgdHlwZXMgYXMgcGVyIHNwZWNcbiAgICAgICAgICAvLyBOT1RFOiBhY2NlcHQgY2FuIGJlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9maWxlI3VuaXF1ZV9maWxlX3R5cGVfc3BlY2lmaWVyc1xuICAgICAgICAgIGFjY2VwdFxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgaXRlbSA9PT0gXCJhdWRpby8qXCIgfHxcbiAgICAgICAgICAgICAgICBpdGVtID09PSBcInZpZGVvLypcIiB8fFxuICAgICAgICAgICAgICAgIGl0ZW0gPT09IFwiaW1hZ2UvKlwiIHx8XG4gICAgICAgICAgICAgICAgaXRlbSA9PT0gXCJ0ZXh0LypcIiB8fFxuICAgICAgICAgICAgICAgIC9cXHcrXFwvWy0rLlxcd10rL2cudGVzdChpdGVtKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gKHsgLi4uYSwgW2JdOiBbXSB9KSwge30pXG4gICAgICAgIDoge30sXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2IGlzIGFuIGV4Y2VwdGlvbiBjYXVzZWQgYnkgYWJvcnRpbmcgYSByZXF1ZXN0IChlLmcgd2luZG93LnNob3dPcGVuRmlsZVBpY2tlcigpKS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUV4Y2VwdGlvbi5cbiAqIEBwYXJhbSB7YW55fSB2XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2IGlzIGFuIGFib3J0IGV4Y2VwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnQodikge1xuICByZXR1cm4gKFxuICAgIHYgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiZcbiAgICAodi5uYW1lID09PSBcIkFib3J0RXJyb3JcIiB8fCB2LmNvZGUgPT09IHYuQUJPUlRfRVJSKVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHYgaXMgYSBzZWN1cml0eSBlcnJvci5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUV4Y2VwdGlvbi5cbiAqIEBwYXJhbSB7YW55fSB2XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2IGlzIGEgc2VjdXJpdHkgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlY3VyaXR5RXJyb3Iodikge1xuICByZXR1cm4gKFxuICAgIHYgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiZcbiAgICAodi5uYW1lID09PSBcIlNlY3VyaXR5RXJyb3JcIiB8fCB2LmNvZGUgPT09IHYuU0VDVVJJVFlfRVJSKVxuICApO1xufVxuIiwiLyogZXNsaW50IHByZWZlci10ZW1wbGF0ZTogMCAqL1xuaW1wb3J0IFJlYWN0LCB7XG4gIGZvcndhcmRSZWYsXG4gIEZyYWdtZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlLFxuICB1c2VNZW1vLFxuICB1c2VSZWR1Y2VyLFxuICB1c2VSZWYsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSBcImZpbGUtc2VsZWN0b3JcIjtcbmltcG9ydCB7XG4gIGFsbEZpbGVzQWNjZXB0ZWQsXG4gIGNvbXBvc2VFdmVudEhhbmRsZXJzLFxuICBmaWxlQWNjZXB0ZWQsXG4gIGZpbGVNYXRjaFNpemUsXG4gIGZpbGVQaWNrZXJPcHRpb25zVHlwZXMsXG4gIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEksXG4gIGlzQWJvcnQsXG4gIGlzRXZ0V2l0aEZpbGVzLFxuICBpc0llT3JFZGdlLFxuICBpc1Byb3BhZ2F0aW9uU3RvcHBlZCxcbiAgaXNTZWN1cml0eUVycm9yLFxuICBvbkRvY3VtZW50RHJhZ092ZXIsXG4gIFRPT19NQU5ZX0ZJTEVTX1JFSkVDVElPTixcbn0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIGNvbXBvbmVudCBmb3IgdGhlIGB1c2VEcm9wem9uZWAgaG9va1xuICpcbiAqIGBgYGpzeFxuICogPERyb3B6b25lPlxuICogICB7KHtnZXRSb290UHJvcHMsIGdldElucHV0UHJvcHN9KSA9PiAoXG4gKiAgICAgPGRpdiB7Li4uZ2V0Um9vdFByb3BzKCl9PlxuICogICAgICAgPGlucHV0IHsuLi5nZXRJbnB1dFByb3BzKCl9IC8+XG4gKiAgICAgICA8cD5EcmFnICduJyBkcm9wIHNvbWUgZmlsZXMgaGVyZSwgb3IgY2xpY2sgdG8gc2VsZWN0IGZpbGVzPC9wPlxuICogICAgIDwvZGl2PlxuICogICApfVxuICogPC9Ecm9wem9uZT5cbiAqIGBgYFxuICovXG5jb25zdCBEcm9wem9uZSA9IGZvcndhcmRSZWYoKHsgY2hpbGRyZW4sIC4uLnBhcmFtcyB9LCByZWYpID0+IHtcbiAgY29uc3QgeyBvcGVuLCAuLi5wcm9wcyB9ID0gdXNlRHJvcHpvbmUocGFyYW1zKTtcblxuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHsgb3BlbiB9KSwgW29wZW5dKTtcblxuICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSByZWFjdC1zdHlsZWd1aWRpc3QgY2Fubm90IGNyZWF0ZSBkb2NzIGlmIHdlIGRvbid0IHJldHVybiBhIGpzeCBlbGVtZW50XG4gIHJldHVybiA8RnJhZ21lbnQ+e2NoaWxkcmVuKHsgLi4ucHJvcHMsIG9wZW4gfSl9PC9GcmFnbWVudD47XG59KTtcblxuRHJvcHpvbmUuZGlzcGxheU5hbWUgPSBcIkRyb3B6b25lXCI7XG5cbi8vIEFkZCBkZWZhdWx0IHByb3BzIGZvciByZWFjdC1kb2NnZW5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBnZXRGaWxlc0Zyb21FdmVudDogZnJvbUV2ZW50LFxuICBtYXhTaXplOiBJbmZpbml0eSxcbiAgbWluU2l6ZTogMCxcbiAgbXVsdGlwbGU6IHRydWUsXG4gIG1heEZpbGVzOiAwLFxuICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQ6IHRydWUsXG4gIG5vQ2xpY2s6IGZhbHNlLFxuICBub0tleWJvYXJkOiBmYWxzZSxcbiAgbm9EcmFnOiBmYWxzZSxcbiAgbm9EcmFnRXZlbnRzQnViYmxpbmc6IGZhbHNlLFxuICB2YWxpZGF0b3I6IG51bGwsXG4gIHVzZUZzQWNjZXNzQXBpOiB0cnVlLFxufTtcblxuRHJvcHpvbmUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5Ecm9wem9uZS5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBSZW5kZXIgZnVuY3Rpb24gdGhhdCBleHBvc2VzIHRoZSBkcm9wem9uZSBzdGF0ZSBhbmQgcHJvcCBnZXR0ZXIgZm5zXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmdldFJvb3RQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIHRoZSByb290IGRyb3AgY29udGFpbmVyIHlvdSByZW5kZXJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmdldElucHV0UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byBoaWRkZW4gZmlsZSBpbnB1dCB5b3UgcmVuZGVyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtcy5vcGVuIE9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNGb2N1c2VkIERyb3B6b25lIGFyZWEgaXMgaW4gZm9jdXNcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNGaWxlRGlhbG9nQWN0aXZlIEZpbGUgZGlhbG9nIGlzIG9wZW5lZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0RyYWdBY3RpdmUgQWN0aXZlIGRyYWcgaXMgaW4gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNEcmFnQWNjZXB0IERyYWdnZWQgZmlsZXMgYXJlIGFjY2VwdGVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmlzRHJhZ1JlamVjdCBTb21lIGRyYWdnZWQgZmlsZXMgYXJlIHJlamVjdGVkXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBwYXJhbXMuZHJhZ2dlZEZpbGVzIEZpbGVzIGluIGFjdGl2ZSBkcmFnXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBwYXJhbXMuYWNjZXB0ZWRGaWxlcyBBY2NlcHRlZCBmaWxlc1xuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gcGFyYW1zLmZpbGVSZWplY3Rpb25zIFJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFNldCBhY2NlcHRlZCBmaWxlIHR5cGVzLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29rb25ldC9hdHRyLWFjY2VwdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogS2VlcCBpbiBtaW5kIHRoYXQgbWltZSB0eXBlIGRldGVybWluYXRpb24gaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBwbGF0Zm9ybXMuIENTViBmaWxlcyxcbiAgICogZm9yIGV4YW1wbGUsIGFyZSByZXBvcnRlZCBhcyB0ZXh0L3BsYWluIHVuZGVyIG1hY09TIGJ1dCBhcyBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgdW5kZXJcbiAgICogV2luZG93cy4gSW4gc29tZSBjYXNlcyB0aGVyZSBtaWdodCBub3QgYmUgYSBtaW1lIHR5cGUgc2V0IGF0IGFsbC5cbiAgICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzI3NlxuICAgKi9cbiAgYWNjZXB0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICBdKSxcblxuICAvKipcbiAgICogQWxsb3cgZHJhZyAnbicgZHJvcCAob3Igc2VsZWN0aW9uIGZyb20gdGhlIGZpbGUgZGlhbG9nKSBvZiBtdWx0aXBsZSBmaWxlc1xuICAgKi9cbiAgbXVsdGlwbGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBmYWxzZSwgYWxsb3cgZHJvcHBlZCBpdGVtcyB0byB0YWtlIG92ZXIgdGhlIGN1cnJlbnQgYnJvd3NlciB3aW5kb3dcbiAgICovXG4gIHByZXZlbnREcm9wT25Eb2N1bWVudDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGRpc2FibGVzIGNsaWNrIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAgICovXG4gIG5vQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNhYmxlcyBTUEFDRS9FTlRFUiB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nLlxuICAgKiBOb3RlIHRoYXQgaXQgYWxzbyBzdG9wcyB0cmFja2luZyB0aGUgZm9jdXMgc3RhdGUuXG4gICAqL1xuICBub0tleWJvYXJkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgZGlzYWJsZXMgZHJhZyAnbicgZHJvcFxuICAgKi9cbiAgbm9EcmFnOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgc3RvcHMgZHJhZyBldmVudCBwcm9wYWdhdGlvbiB0byBwYXJlbnRzXG4gICAqL1xuICBub0RyYWdFdmVudHNCdWJibGluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE1pbmltdW0gZmlsZSBzaXplIChpbiBieXRlcylcbiAgICovXG4gIG1pblNpemU6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIE1heGltdW0gZmlsZSBzaXplIChpbiBieXRlcylcbiAgICovXG4gIG1heFNpemU6IFByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFjY2VwdGVkIG51bWJlciBvZiBmaWxlc1xuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwIHdoaWNoIG1lYW5zIHRoZXJlIGlzIG5vIGxpbWl0YXRpb24gdG8gaG93IG1hbnkgZmlsZXMgYXJlIGFjY2VwdGVkLlxuICAgKi9cbiAgbWF4RmlsZXM6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIHRoZSBkcm9wem9uZVxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyB0byBwcm92aWRlIGEgY3VzdG9tIGZpbGUgYWdncmVnYXRvclxuICAgKlxuICAgKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gICAqL1xuICBnZXRGaWxlc0Zyb21FdmVudDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIGNsb3NpbmcgdGhlIGZpbGUgZGlhbG9nIHdpdGggbm8gc2VsZWN0aW9uXG4gICAqL1xuICBvbkZpbGVEaWFsb2dDYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiBvcGVuaW5nIHRoZSBmaWxlIGRpYWxvZ1xuICAgKi9cbiAgb25GaWxlRGlhbG9nT3BlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIHVzZSB0aGUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUElcbiAgICogdG8gb3BlbiB0aGUgZmlsZSBwaWNrZXIgaW5zdGVhZCBvZiB1c2luZyBhbiBgPGlucHV0IHR5cGU9XCJmaWxlXCI+YCBjbGljayBldmVudC5cbiAgICovXG4gIHVzZUZzQWNjZXNzQXBpOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnZW50ZXJgIGV2ZW50IG9jY3Vycy5cbiAgICpcbiAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50XG4gICAqL1xuICBvbkRyYWdFbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJhZ2xlYXZlYCBldmVudCBvY2N1cnNcbiAgICpcbiAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50XG4gICAqL1xuICBvbkRyYWdMZWF2ZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJhZ292ZXJgIGV2ZW50IG9jY3Vyc1xuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ092ZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAgICogTm90ZSB0aGF0IHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBhZnRlciB0aGUgYGdldEZpbGVzRnJvbUV2ZW50YCBjYWxsYmFjayBpcyBkb25lLlxuICAgKlxuICAgKiBGaWxlcyBhcmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQgYmFzZWQgb24gdGhlIGBhY2NlcHRgLCBgbXVsdGlwbGVgLCBgbWluU2l6ZWAgYW5kIGBtYXhTaXplYCBwcm9wcy5cbiAgICogYGFjY2VwdGAgbXVzdCBiZSBhIHZhbGlkIFtNSU1FIHR5cGVdKGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWwpIGFjY29yZGluZyB0byBbaW5wdXQgZWxlbWVudCBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy53My5vcmcvd2lraS9IVE1ML0VsZW1lbnRzL2lucHV0L2ZpbGUpIG9yIGEgdmFsaWQgZmlsZSBleHRlbnNpb24uXG4gICAqIElmIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGZhbHNlIGFuZCBhZGRpdGlvbmFsIGZpbGVzIGFyZSBkcm9wcGVkLFxuICAgKiBhbGwgZmlsZXMgYmVzaWRlcyB0aGUgZmlyc3Qgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQW55IGZpbGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHNpemUgaW4gdGhlIFtgbWluU2l6ZWAsIGBtYXhTaXplYF0gcmFuZ2UsIHdpbGwgYmUgcmVqZWN0ZWQgYXMgd2VsbC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBgb25Ecm9wYCBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIHJlZ2FyZGxlc3MgaWYgdGhlIGRyb3BwZWQgZmlsZXMgd2VyZSBhY2NlcHRlZCBvciByZWplY3RlZC5cbiAgICogSWYgeW91J2QgbGlrZSB0byByZWFjdCB0byBhIHNwZWNpZmljIHNjZW5hcmlvLCB1c2UgdGhlIGBvbkRyb3BBY2NlcHRlZGAvYG9uRHJvcFJlamVjdGVkYCBwcm9wcy5cbiAgICpcbiAgICogYG9uRHJvcGAgd2lsbCBwcm92aWRlIHlvdSB3aXRoIGFuIGFycmF5IG9mIFtGaWxlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZSkgb2JqZWN0cyB3aGljaCB5b3UgY2FuIHRoZW4gcHJvY2VzcyBhbmQgc2VuZCB0byBhIHNlcnZlci5cbiAgICogRm9yIGV4YW1wbGUsIHdpdGggW1N1cGVyQWdlbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS92aXNpb25tZWRpYS9zdXBlcmFnZW50KSBhcyBhIGh0dHAvYWpheCBsaWJyYXJ5OlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBmdW5jdGlvbiBvbkRyb3AoYWNjZXB0ZWRGaWxlcykge1xuICAgKiAgIGNvbnN0IHJlcSA9IHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gICAqICAgYWNjZXB0ZWRGaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgKiAgICAgcmVxLmF0dGFjaChmaWxlLm5hbWUsIGZpbGUpXG4gICAqICAgfSlcbiAgICogICByZXEuZW5kKGNhbGxiYWNrKVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge0ZpbGVbXX0gYWNjZXB0ZWRGaWxlc1xuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gZmlsZVJlamVjdGlvbnNcbiAgICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICAgKi9cbiAgb25Ecm9wOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcm9wYCBldmVudCBvY2N1cnMuXG4gICAqIE5vdGUgdGhhdCBpZiBubyBmaWxlcyBhcmUgYWNjZXB0ZWQsIHRoaXMgY2FsbGJhY2sgaXMgbm90IGludm9rZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBmaWxlc1xuICAgKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudFxuICAgKi9cbiAgb25Ecm9wQWNjZXB0ZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAgICogTm90ZSB0aGF0IGlmIG5vIGZpbGVzIGFyZSByZWplY3RlZCwgdGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50XG4gICAqL1xuICBvbkRyb3BSZWplY3RlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7RmlsZX0gZmlsZVxuICAgKiBAcmV0dXJucyB7RmlsZUVycm9yfEZpbGVFcnJvcltdfVxuICAgKi9cbiAgdmFsaWRhdG9yOiBQcm9wVHlwZXMuZnVuYyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERyb3B6b25lO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyYWdlbnRlcmAsXG4gKiBgZHJhZ292ZXJgIGFuZCBgZHJhZ2xlYXZlYCBldmVudHMuXG4gKiBJdCBpcyBub3QgaW52b2tlZCBpZiB0aGUgaXRlbXMgYXJlIG5vdCBmaWxlcyAoc3VjaCBhcyBsaW5rLCB0ZXh0LCBldGMuKS5cbiAqXG4gKiBAY2FsbGJhY2sgZHJhZ0NiXG4gKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyb3BgIG9yIGlucHV0IGNoYW5nZSBldmVudC5cbiAqIEl0IGlzIG5vdCBpbnZva2VkIGlmIHRoZSBpdGVtcyBhcmUgbm90IGZpbGVzIChzdWNoIGFzIGxpbmssIHRleHQsIGV0Yy4pLlxuICpcbiAqIEBjYWxsYmFjayBkcm9wQ2JcbiAqIEBwYXJhbSB7RmlsZVtdfSBhY2NlcHRlZEZpbGVzIExpc3Qgb2YgYWNjZXB0ZWQgZmlsZXNcbiAqIEBwYXJhbSB7RmlsZVJlamVjdGlvbltdfSBmaWxlUmVqZWN0aW9ucyBMaXN0IG9mIHJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBmb3IgdGhlIGBkcm9wYCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQuXG4gKiBJdCBpcyBub3QgaW52b2tlZCBpZiB0aGUgaXRlbXMgYXJlIGZpbGVzIChzdWNoIGFzIGxpbmssIHRleHQsIGV0Yy4pLlxuICpcbiAqIEBjYWxsYmFjayBkcm9wQWNjZXB0ZWRDYlxuICogQHBhcmFtIHtGaWxlW119IGZpbGVzIExpc3Qgb2YgYWNjZXB0ZWQgZmlsZXMgdGhhdCBtZWV0IHRoZSBnaXZlbiBjcml0ZXJpYVxuICogKGBhY2NlcHRgLCBgbXVsdGlwbGVgLCBgbWluU2l6ZWAsIGBtYXhTaXplYClcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyb3BgIG9yIGlucHV0IGNoYW5nZSBldmVudC5cbiAqXG4gKiBAY2FsbGJhY2sgZHJvcFJlamVjdGVkQ2JcbiAqIEBwYXJhbSB7RmlsZVtdfSBmaWxlcyBMaXN0IG9mIHJlamVjdGVkIGZpbGVzIHRoYXQgZG8gbm90IG1lZXQgdGhlIGdpdmVuIGNyaXRlcmlhXG4gKiAoYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCwgYG1heFNpemVgKVxuICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgYWdncmVnYXRlIGZpbGVzLFxuICogaW4gYSBhc3luY2hyb25vdXMgZmFzaGlvbiwgZnJvbSBkcmFnIG9yIGlucHV0IGNoYW5nZSBldmVudHMuXG4gKlxuICogQGNhbGxiYWNrIGdldEZpbGVzRnJvbUV2ZW50XG4gKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gKiBAcmV0dXJucyB7KEZpbGVbXXxQcm9taXNlPEZpbGVbXT4pfVxuICovXG5cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgZHJvcHpvbmUgc3RhdGUgYW5kIHNvbWUgaGVscGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEcm9wem9uZVN0YXRlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRSb290UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byB0aGUgcm9vdCBkcm9wIGNvbnRhaW5lciB5b3UgcmVuZGVyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRJbnB1dFByb3BzIFJldHVybnMgdGhlIHByb3BzIHlvdSBzaG91bGQgYXBwbHkgdG8gaGlkZGVuIGZpbGUgaW5wdXQgeW91IHJlbmRlclxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gb3BlbiBPcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRm9jdXNlZCBEcm9wem9uZSBhcmVhIGlzIGluIGZvY3VzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRmlsZURpYWxvZ0FjdGl2ZSBGaWxlIGRpYWxvZyBpcyBvcGVuZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNEcmFnQWN0aXZlIEFjdGl2ZSBkcmFnIGlzIGluIHByb2dyZXNzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRHJhZ0FjY2VwdCBEcmFnZ2VkIGZpbGVzIGFyZSBhY2NlcHRlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0RyYWdSZWplY3QgU29tZSBkcmFnZ2VkIGZpbGVzIGFyZSByZWplY3RlZFxuICogQHByb3BlcnR5IHtGaWxlW119IGRyYWdnZWRGaWxlcyBGaWxlcyBpbiBhY3RpdmUgZHJhZ1xuICogQHByb3BlcnR5IHtGaWxlW119IGFjY2VwdGVkRmlsZXMgQWNjZXB0ZWQgZmlsZXNcbiAqIEBwcm9wZXJ0eSB7RmlsZVJlamVjdGlvbltdfSBmaWxlUmVqZWN0aW9ucyBSZWplY3RlZCBmaWxlcyBhbmQgd2h5IHRoZXkgd2VyZSByZWplY3RlZFxuICovXG5cbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgaXNGb2N1c2VkOiBmYWxzZSxcbiAgaXNGaWxlRGlhbG9nQWN0aXZlOiBmYWxzZSxcbiAgaXNEcmFnQWN0aXZlOiBmYWxzZSxcbiAgaXNEcmFnQWNjZXB0OiBmYWxzZSxcbiAgaXNEcmFnUmVqZWN0OiBmYWxzZSxcbiAgZHJhZ2dlZEZpbGVzOiBbXSxcbiAgYWNjZXB0ZWRGaWxlczogW10sXG4gIGZpbGVSZWplY3Rpb25zOiBbXSxcbn07XG5cbi8qKlxuICogQSBSZWFjdCBob29rIHRoYXQgY3JlYXRlcyBhIGRyYWcgJ24nIGRyb3AgYXJlYS5cbiAqXG4gKiBgYGBqc3hcbiAqIGZ1bmN0aW9uIE15RHJvcHpvbmUocHJvcHMpIHtcbiAqICAgY29uc3Qge2dldFJvb3RQcm9wcywgZ2V0SW5wdXRQcm9wc30gPSB1c2VEcm9wem9uZSh7XG4gKiAgICAgb25Ecm9wOiBhY2NlcHRlZEZpbGVzID0+IHtcbiAqICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBGaWxlIG9iamVjdHMsIGUuZy4gdXBsb2FkIHRvIHNvbWUgc2VydmVyXG4gKiAgICAgfVxuICogICB9KTtcbiAqICAgcmV0dXJuIChcbiAqICAgICA8ZGl2IHsuLi5nZXRSb290UHJvcHMoKX0+XG4gKiAgICAgICA8aW5wdXQgey4uLmdldElucHV0UHJvcHMoKX0gLz5cbiAqICAgICAgIDxwPkRyYWcgYW5kIGRyb3Agc29tZSBmaWxlcyBoZXJlLCBvciBjbGljayB0byBzZWxlY3QgZmlsZXM8L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgIClcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBmdW5jdGlvbiB1c2VEcm9wem9uZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFtwcm9wcy5hY2NlcHRdIFNldCBhY2NlcHRlZCBmaWxlIHR5cGVzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvYXR0ci1hY2NlcHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBLZWVwIGluIG1pbmQgdGhhdCBtaW1lIHR5cGUgZGV0ZXJtaW5hdGlvbiBpcyBub3QgcmVsaWFibGUgYWNyb3NzIHBsYXRmb3Jtcy4gQ1NWIGZpbGVzLFxuICogZm9yIGV4YW1wbGUsIGFyZSByZXBvcnRlZCBhcyB0ZXh0L3BsYWluIHVuZGVyIG1hY09TIGJ1dCBhcyBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgdW5kZXJcbiAqIFdpbmRvd3MuIEluIHNvbWUgY2FzZXMgdGhlcmUgbWlnaHQgbm90IGJlIGEgbWltZSB0eXBlIHNldCBhdCBhbGwuXG4gKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvMjc2XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5tdWx0aXBsZT10cnVlXSBBbGxvdyBkcmFnICduJyBkcm9wIChvciBzZWxlY3Rpb24gZnJvbSB0aGUgZmlsZSBkaWFsb2cpIG9mIG11bHRpcGxlIGZpbGVzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5wcmV2ZW50RHJvcE9uRG9jdW1lbnQ9dHJ1ZV0gSWYgZmFsc2UsIGFsbG93IGRyb3BwZWQgaXRlbXMgdG8gdGFrZSBvdmVyIHRoZSBjdXJyZW50IGJyb3dzZXIgd2luZG93XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0NsaWNrPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBjbGljayB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0tleWJvYXJkPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBTUEFDRS9FTlRFUiB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nLlxuICogTm90ZSB0aGF0IGl0IGFsc28gc3RvcHMgdHJhY2tpbmcgdGhlIGZvY3VzIHN0YXRlLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMubm9EcmFnPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBkcmFnICduJyBkcm9wXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0RyYWdFdmVudHNCdWJibGluZz1mYWxzZV0gSWYgdHJ1ZSwgc3RvcHMgZHJhZyBldmVudCBwcm9wYWdhdGlvbiB0byBwYXJlbnRzXG4gKiBAcGFyYW0ge251bWJlcn0gW3Byb3BzLm1pblNpemU9MF0gTWluaW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICogQHBhcmFtIHtudW1iZXJ9IFtwcm9wcy5tYXhTaXplPUluZmluaXR5XSBNYXhpbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5kaXNhYmxlZD1mYWxzZV0gRW5hYmxlL2Rpc2FibGUgdGhlIGRyb3B6b25lXG4gKiBAcGFyYW0ge2dldEZpbGVzRnJvbUV2ZW50fSBbcHJvcHMuZ2V0RmlsZXNGcm9tRXZlbnRdIFVzZSB0aGlzIHRvIHByb3ZpZGUgYSBjdXN0b20gZmlsZSBhZ2dyZWdhdG9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcHMub25GaWxlRGlhbG9nQ2FuY2VsXSBDYiBmb3Igd2hlbiBjbG9zaW5nIHRoZSBmaWxlIGRpYWxvZyB3aXRoIG5vIHNlbGVjdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMudXNlRnNBY2Nlc3NBcGldIFNldCB0byB0cnVlIHRvIHVzZSB0aGUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUElcbiAqIHRvIG9wZW4gdGhlIGZpbGUgcGlja2VyIGluc3RlYWQgb2YgdXNpbmcgYW4gYDxpbnB1dCB0eXBlPVwiZmlsZVwiPmAgY2xpY2sgZXZlbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcHMub25GaWxlRGlhbG9nT3Blbl0gQ2IgZm9yIHdoZW4gb3BlbmluZyB0aGUgZmlsZSBkaWFsb2dcbiAqIEBwYXJhbSB7ZHJhZ0NifSBbcHJvcHMub25EcmFnRW50ZXJdIENiIGZvciB3aGVuIHRoZSBgZHJhZ2VudGVyYCBldmVudCBvY2N1cnMuXG4gKiBAcGFyYW0ge2RyYWdDYn0gW3Byb3BzLm9uRHJhZ0xlYXZlXSBDYiBmb3Igd2hlbiB0aGUgYGRyYWdsZWF2ZWAgZXZlbnQgb2NjdXJzXG4gKiBAcGFyYW0ge2RyYWdDYn0gW3Byb3BzLm9uRHJhZ092ZXJdIENiIGZvciB3aGVuIHRoZSBgZHJhZ292ZXJgIGV2ZW50IG9jY3Vyc1xuICogQHBhcmFtIHtkcm9wQ2J9IFtwcm9wcy5vbkRyb3BdIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICogTm90ZSB0aGF0IHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBhZnRlciB0aGUgYGdldEZpbGVzRnJvbUV2ZW50YCBjYWxsYmFjayBpcyBkb25lLlxuICpcbiAqIEZpbGVzIGFyZSBhY2NlcHRlZCBvciByZWplY3RlZCBiYXNlZCBvbiB0aGUgYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCBhbmQgYG1heFNpemVgIHByb3BzLlxuICogYGFjY2VwdGAgbXVzdCBiZSBhIHZhbGlkIFtNSU1FIHR5cGVdKGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWwpIGFjY29yZGluZyB0byBbaW5wdXQgZWxlbWVudCBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy53My5vcmcvd2lraS9IVE1ML0VsZW1lbnRzL2lucHV0L2ZpbGUpIG9yIGEgdmFsaWQgZmlsZSBleHRlbnNpb24uXG4gKiBJZiBgbXVsdGlwbGVgIGlzIHNldCB0byBmYWxzZSBhbmQgYWRkaXRpb25hbCBmaWxlcyBhcmUgZHJvcHBlZCxcbiAqIGFsbCBmaWxlcyBiZXNpZGVzIHRoZSBmaXJzdCB3aWxsIGJlIHJlamVjdGVkLlxuICogQW55IGZpbGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHNpemUgaW4gdGhlIFtgbWluU2l6ZWAsIGBtYXhTaXplYF0gcmFuZ2UsIHdpbGwgYmUgcmVqZWN0ZWQgYXMgd2VsbC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGBvbkRyb3BgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGludm9rZWQgcmVnYXJkbGVzcyBpZiB0aGUgZHJvcHBlZCBmaWxlcyB3ZXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLlxuICogSWYgeW91J2QgbGlrZSB0byByZWFjdCB0byBhIHNwZWNpZmljIHNjZW5hcmlvLCB1c2UgdGhlIGBvbkRyb3BBY2NlcHRlZGAvYG9uRHJvcFJlamVjdGVkYCBwcm9wcy5cbiAqXG4gKiBgb25Ecm9wYCB3aWxsIHByb3ZpZGUgeW91IHdpdGggYW4gYXJyYXkgb2YgW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBzZW5kIHRvIGEgc2VydmVyLlxuICogRm9yIGV4YW1wbGUsIHdpdGggW1N1cGVyQWdlbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS92aXNpb25tZWRpYS9zdXBlcmFnZW50KSBhcyBhIGh0dHAvYWpheCBsaWJyYXJ5OlxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBvbkRyb3AoYWNjZXB0ZWRGaWxlcykge1xuICogICBjb25zdCByZXEgPSByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICBhY2NlcHRlZEZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gKiAgICAgcmVxLmF0dGFjaChmaWxlLm5hbWUsIGZpbGUpXG4gKiAgIH0pXG4gKiAgIHJlcS5lbmQoY2FsbGJhY2spXG4gKiB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7ZHJvcEFjY2VwdGVkQ2J9IFtwcm9wcy5vbkRyb3BBY2NlcHRlZF1cbiAqIEBwYXJhbSB7ZHJvcFJlamVjdGVkQ2J9IFtwcm9wcy5vbkRyb3BSZWplY3RlZF1cbiAqXG4gKiBAcmV0dXJucyB7RHJvcHpvbmVTdGF0ZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3B6b25lKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYWNjZXB0LFxuICAgIGRpc2FibGVkLFxuICAgIGdldEZpbGVzRnJvbUV2ZW50LFxuICAgIG1heFNpemUsXG4gICAgbWluU2l6ZSxcbiAgICBtdWx0aXBsZSxcbiAgICBtYXhGaWxlcyxcbiAgICBvbkRyYWdFbnRlcixcbiAgICBvbkRyYWdMZWF2ZSxcbiAgICBvbkRyYWdPdmVyLFxuICAgIG9uRHJvcCxcbiAgICBvbkRyb3BBY2NlcHRlZCxcbiAgICBvbkRyb3BSZWplY3RlZCxcbiAgICBvbkZpbGVEaWFsb2dDYW5jZWwsXG4gICAgb25GaWxlRGlhbG9nT3BlbixcbiAgICB1c2VGc0FjY2Vzc0FwaSxcbiAgICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQsXG4gICAgbm9DbGljayxcbiAgICBub0tleWJvYXJkLFxuICAgIG5vRHJhZyxcbiAgICBub0RyYWdFdmVudHNCdWJibGluZyxcbiAgICB2YWxpZGF0b3IsXG4gIH0gPSB7XG4gICAgLi4uZGVmYXVsdFByb3BzLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG5cbiAgY29uc3Qgb25GaWxlRGlhbG9nT3BlbkNiID0gdXNlTWVtbyhcbiAgICAoKSA9PiAodHlwZW9mIG9uRmlsZURpYWxvZ09wZW4gPT09IFwiZnVuY3Rpb25cIiA/IG9uRmlsZURpYWxvZ09wZW4gOiBub29wKSxcbiAgICBbb25GaWxlRGlhbG9nT3Blbl1cbiAgKTtcbiAgY29uc3Qgb25GaWxlRGlhbG9nQ2FuY2VsQ2IgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICB0eXBlb2Ygb25GaWxlRGlhbG9nQ2FuY2VsID09PSBcImZ1bmN0aW9uXCIgPyBvbkZpbGVEaWFsb2dDYW5jZWwgOiBub29wLFxuICAgIFtvbkZpbGVEaWFsb2dDYW5jZWxdXG4gICk7XG5cbiAgY29uc3Qgcm9vdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3QgW3N0YXRlLCBkaXNwYXRjaF0gPSB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG4gIGNvbnN0IHsgaXNGb2N1c2VkLCBpc0ZpbGVEaWFsb2dBY3RpdmUsIGRyYWdnZWRGaWxlcyB9ID0gc3RhdGU7XG5cbiAgY29uc3QgZnNBY2Nlc3NBcGlXb3Jrc1JlZiA9IHVzZVJlZihcbiAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICB3aW5kb3cuaXNTZWN1cmVDb250ZXh0ICYmXG4gICAgICB1c2VGc0FjY2Vzc0FwaSAmJlxuICAgICAgY2FuVXNlRmlsZVN5c3RlbUFjY2Vzc0FQSSgpXG4gICk7XG5cbiAgLy8gVXBkYXRlIGZpbGUgZGlhbG9nIGFjdGl2ZSBzdGF0ZSB3aGVuIHRoZSB3aW5kb3cgaXMgZm9jdXNlZCBvblxuICBjb25zdCBvbldpbmRvd0ZvY3VzID0gKCkgPT4ge1xuICAgIC8vIEV4ZWN1dGUgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZmlsZSBkaWFsb2cgaXMgb3BlbmVkIGluIHRoZSBicm93c2VyXG4gICAgaWYgKCFmc0FjY2Vzc0FwaVdvcmtzUmVmLmN1cnJlbnQgJiYgaXNGaWxlRGlhbG9nQWN0aXZlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBjb25zdCB7IGZpbGVzIH0gPSBpbnB1dFJlZi5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJjbG9zZURpYWxvZ1wiIH0pO1xuICAgICAgICAgICAgb25GaWxlRGlhbG9nQ2FuY2VsQ2IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgb25XaW5kb3dGb2N1cywgZmFsc2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIG9uV2luZG93Rm9jdXMsIGZhbHNlKTtcbiAgICB9O1xuICB9LCBbaW5wdXRSZWYsIGlzRmlsZURpYWxvZ0FjdGl2ZSwgb25GaWxlRGlhbG9nQ2FuY2VsQ2IsIGZzQWNjZXNzQXBpV29ya3NSZWZdKTtcblxuICBjb25zdCBkcmFnVGFyZ2V0c1JlZiA9IHVzZVJlZihbXSk7XG4gIGNvbnN0IG9uRG9jdW1lbnREcm9wID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKHJvb3RSZWYuY3VycmVudCAmJiByb290UmVmLmN1cnJlbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgLy8gSWYgd2UgaW50ZXJjZXB0ZWQgYW4gZXZlbnQgZm9yIG91ciBpbnN0YW5jZSwgbGV0IGl0IHByb3BhZ2F0ZSBkb3duIHRvIHRoZSBpbnN0YW5jZSdzIG9uRHJvcCBoYW5kbGVyXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZHJhZ1RhcmdldHNSZWYuY3VycmVudCA9IFtdO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHByZXZlbnREcm9wT25Eb2N1bWVudCkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIG9uRG9jdW1lbnREcmFnT3ZlciwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImRyb3BcIiwgb25Eb2N1bWVudERyb3AsIGZhbHNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHByZXZlbnREcm9wT25Eb2N1bWVudCkge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgb25Eb2N1bWVudERyYWdPdmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRyb3BcIiwgb25Eb2N1bWVudERyb3ApO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtyb290UmVmLCBwcmV2ZW50RHJvcE9uRG9jdW1lbnRdKTtcblxuICBjb25zdCBvbkRyYWdFbnRlckNiID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gUGVyc2lzdCBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0aGUgZXZlbnQgbGF0ZXIgYWZ0ZXIgZ2V0RmlsZXNGcm9tRXZlbnQoKSBpcyBkb25lXG4gICAgICBldmVudC5wZXJzaXN0KCk7XG4gICAgICBzdG9wUHJvcGFnYXRpb24oZXZlbnQpO1xuXG4gICAgICBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50ID0gWy4uLmRyYWdUYXJnZXRzUmVmLmN1cnJlbnQsIGV2ZW50LnRhcmdldF07XG5cbiAgICAgIGlmIChpc0V2dFdpdGhGaWxlcyhldmVudCkpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGdldEZpbGVzRnJvbUV2ZW50KGV2ZW50KSkudGhlbigoZHJhZ2dlZEZpbGVzKSA9PiB7XG4gICAgICAgICAgaWYgKGlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiAhbm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICBkcmFnZ2VkRmlsZXMsXG4gICAgICAgICAgICBpc0RyYWdBY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiBcInNldERyYWdnZWRGaWxlc1wiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKG9uRHJhZ0VudGVyKSB7XG4gICAgICAgICAgICBvbkRyYWdFbnRlcihldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtnZXRGaWxlc0Zyb21FdmVudCwgb25EcmFnRW50ZXIsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApO1xuXG4gIGNvbnN0IG9uRHJhZ092ZXJDYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudCk7XG5cbiAgICAgIGNvbnN0IGhhc0ZpbGVzID0gaXNFdnRXaXRoRmlsZXMoZXZlbnQpO1xuICAgICAgaWYgKGhhc0ZpbGVzICYmIGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJjb3B5XCI7XG4gICAgICAgIH0gY2F0Y2gge30gLyogZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eSAqL1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzRmlsZXMgJiYgb25EcmFnT3Zlcikge1xuICAgICAgICBvbkRyYWdPdmVyKGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgW29uRHJhZ092ZXIsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApO1xuXG4gIGNvbnN0IG9uRHJhZ0xlYXZlQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5wZXJzaXN0KCk7XG4gICAgICBzdG9wUHJvcGFnYXRpb24oZXZlbnQpO1xuXG4gICAgICAvLyBPbmx5IGRlYWN0aXZhdGUgb25jZSB0aGUgZHJvcHpvbmUgYW5kIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gbGVmdFxuICAgICAgY29uc3QgdGFyZ2V0cyA9IGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQuZmlsdGVyKFxuICAgICAgICAodGFyZ2V0KSA9PiByb290UmVmLmN1cnJlbnQgJiYgcm9vdFJlZi5jdXJyZW50LmNvbnRhaW5zKHRhcmdldClcbiAgICAgICk7XG4gICAgICAvLyBNYWtlIHN1cmUgdG8gcmVtb3ZlIGEgdGFyZ2V0IHByZXNlbnQgbXVsdGlwbGUgdGltZXMgb25seSBvbmNlXG4gICAgICAvLyAoRmlyZWZveCBtYXkgZmlyZSBkcmFnZW50ZXIvZHJhZ2xlYXZlIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGVsZW1lbnQpXG4gICAgICBjb25zdCB0YXJnZXRJZHggPSB0YXJnZXRzLmluZGV4T2YoZXZlbnQudGFyZ2V0KTtcbiAgICAgIGlmICh0YXJnZXRJZHggIT09IC0xKSB7XG4gICAgICAgIHRhcmdldHMuc3BsaWNlKHRhcmdldElkeCwgMSk7XG4gICAgICB9XG4gICAgICBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50ID0gdGFyZ2V0cztcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2V0RHJhZ2dlZEZpbGVzXCIsXG4gICAgICAgIGRyYWdnZWRGaWxlczogW10sXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzRXZ0V2l0aEZpbGVzKGV2ZW50KSAmJiBvbkRyYWdMZWF2ZSkge1xuICAgICAgICBvbkRyYWdMZWF2ZShldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbcm9vdFJlZiwgb25EcmFnTGVhdmUsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApO1xuXG4gIGNvbnN0IHNldEZpbGVzID0gdXNlQ2FsbGJhY2soXG4gICAgKGZpbGVzLCBldmVudCkgPT4ge1xuICAgICAgY29uc3QgYWNjZXB0ZWRGaWxlcyA9IFtdO1xuICAgICAgY29uc3QgZmlsZVJlamVjdGlvbnMgPSBbXTtcblxuICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBbYWNjZXB0ZWQsIGFjY2VwdEVycm9yXSA9IGZpbGVBY2NlcHRlZChmaWxlLCBhY2NlcHQpO1xuICAgICAgICBjb25zdCBbc2l6ZU1hdGNoLCBzaXplRXJyb3JdID0gZmlsZU1hdGNoU2l6ZShmaWxlLCBtaW5TaXplLCBtYXhTaXplKTtcbiAgICAgICAgY29uc3QgY3VzdG9tRXJyb3JzID0gdmFsaWRhdG9yID8gdmFsaWRhdG9yKGZpbGUpIDogbnVsbDtcblxuICAgICAgICBpZiAoYWNjZXB0ZWQgJiYgc2l6ZU1hdGNoICYmICFjdXN0b21FcnJvcnMpIHtcbiAgICAgICAgICBhY2NlcHRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGVycm9ycyA9IFthY2NlcHRFcnJvciwgc2l6ZUVycm9yXTtcblxuICAgICAgICAgIGlmIChjdXN0b21FcnJvcnMpIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoY3VzdG9tRXJyb3JzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlUmVqZWN0aW9ucy5wdXNoKHsgZmlsZSwgZXJyb3JzOiBlcnJvcnMuZmlsdGVyKChlKSA9PiBlKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgKCFtdWx0aXBsZSAmJiBhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IDEpIHx8XG4gICAgICAgIChtdWx0aXBsZSAmJiBtYXhGaWxlcyA+PSAxICYmIGFjY2VwdGVkRmlsZXMubGVuZ3RoID4gbWF4RmlsZXMpXG4gICAgICApIHtcbiAgICAgICAgLy8gUmVqZWN0IGV2ZXJ5dGhpbmcgYW5kIGVtcHR5IGFjY2VwdGVkIGZpbGVzXG4gICAgICAgIGFjY2VwdGVkRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgIGZpbGVSZWplY3Rpb25zLnB1c2goeyBmaWxlLCBlcnJvcnM6IFtUT09fTUFOWV9GSUxFU19SRUpFQ1RJT05dIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYWNjZXB0ZWRGaWxlcy5zcGxpY2UoMCk7XG4gICAgICB9XG5cbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgYWNjZXB0ZWRGaWxlcyxcbiAgICAgICAgZmlsZVJlamVjdGlvbnMsXG4gICAgICAgIHR5cGU6IFwic2V0RmlsZXNcIixcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob25Ecm9wKSB7XG4gICAgICAgIG9uRHJvcChhY2NlcHRlZEZpbGVzLCBmaWxlUmVqZWN0aW9ucywgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZVJlamVjdGlvbnMubGVuZ3RoID4gMCAmJiBvbkRyb3BSZWplY3RlZCkge1xuICAgICAgICBvbkRyb3BSZWplY3RlZChmaWxlUmVqZWN0aW9ucywgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWNjZXB0ZWRGaWxlcy5sZW5ndGggPiAwICYmIG9uRHJvcEFjY2VwdGVkKSB7XG4gICAgICAgIG9uRHJvcEFjY2VwdGVkKGFjY2VwdGVkRmlsZXMsIGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGRpc3BhdGNoLFxuICAgICAgbXVsdGlwbGUsXG4gICAgICBhY2NlcHQsXG4gICAgICBtaW5TaXplLFxuICAgICAgbWF4U2l6ZSxcbiAgICAgIG1heEZpbGVzLFxuICAgICAgb25Ecm9wLFxuICAgICAgb25Ecm9wQWNjZXB0ZWQsXG4gICAgICBvbkRyb3BSZWplY3RlZCxcbiAgICAgIHZhbGlkYXRvcixcbiAgICBdXG4gICk7XG5cbiAgY29uc3Qgb25Ecm9wQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBQZXJzaXN0IGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZSBldmVudCBsYXRlciBhZnRlciBnZXRGaWxlc0Zyb21FdmVudCgpIGlzIGRvbmVcbiAgICAgIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudCk7XG5cbiAgICAgIGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQgPSBbXTtcblxuICAgICAgaWYgKGlzRXZ0V2l0aEZpbGVzKGV2ZW50KSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoZ2V0RmlsZXNGcm9tRXZlbnQoZXZlbnQpKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgIGlmIChpc1Byb3BhZ2F0aW9uU3RvcHBlZChldmVudCkgJiYgIW5vRHJhZ0V2ZW50c0J1YmJsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldEZpbGVzKGZpbGVzLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcInJlc2V0XCIgfSk7XG4gICAgfSxcbiAgICBbZ2V0RmlsZXNGcm9tRXZlbnQsIHNldEZpbGVzLCBub0RyYWdFdmVudHNCdWJibGluZ11cbiAgKTtcblxuICAvLyBGbiBmb3Igb3BlbmluZyB0aGUgZmlsZSBkaWFsb2cgcHJvZ3JhbW1hdGljYWxseVxuICBjb25zdCBvcGVuRmlsZURpYWxvZyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBObyBwb2ludCB0byB1c2UgRlMgYWNjZXNzIEFQSXMgaWYgY29udGV4dCBpcyBub3Qgc2VjdXJlXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU2VjdXJpdHkvU2VjdXJlX0NvbnRleHRzI2ZlYXR1cmVfZGV0ZWN0aW9uXG4gICAgaWYgKGZzQWNjZXNzQXBpV29ya3NSZWYuY3VycmVudCkge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIm9wZW5EaWFsb2dcIiB9KTtcbiAgICAgIG9uRmlsZURpYWxvZ09wZW5DYigpO1xuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy9zaG93T3BlbkZpbGVQaWNrZXJcbiAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIG11bHRpcGxlLFxuICAgICAgICB0eXBlczogZmlsZVBpY2tlck9wdGlvbnNUeXBlcyhhY2NlcHQpLFxuICAgICAgfTtcbiAgICAgIHdpbmRvd1xuICAgICAgICAuc2hvd09wZW5GaWxlUGlja2VyKG9wdHMpXG4gICAgICAgIC50aGVuKChoYW5kbGVzKSA9PiBnZXRGaWxlc0Zyb21FdmVudChoYW5kbGVzKSlcbiAgICAgICAgLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgc2V0RmlsZXMoZmlsZXMsIG51bGwpO1xuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJjbG9zZURpYWxvZ1wiIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAvLyBBYm9ydEVycm9yIG1lYW5zIHRoZSB1c2VyIGNhbmNlbGVkXG4gICAgICAgICAgaWYgKGlzQWJvcnQoZSkpIHtcbiAgICAgICAgICAgIG9uRmlsZURpYWxvZ0NhbmNlbENiKGUpO1xuICAgICAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcImNsb3NlRGlhbG9nXCIgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1NlY3VyaXR5RXJyb3IoZSkpIHtcbiAgICAgICAgICAgIGZzQWNjZXNzQXBpV29ya3NSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gQ09SUywgc28gY2Fubm90IHVzZSB0aGlzIEFQSVxuICAgICAgICAgICAgLy8gVHJ5IHVzaW5nIHRoZSBpbnB1dFxuICAgICAgICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgaW5wdXRSZWYuY3VycmVudC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgIGlucHV0UmVmLmN1cnJlbnQuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwib3BlbkRpYWxvZ1wiIH0pO1xuICAgICAgb25GaWxlRGlhbG9nT3BlbkNiKCk7XG4gICAgICBpbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gbnVsbDtcbiAgICAgIGlucHV0UmVmLmN1cnJlbnQuY2xpY2soKTtcbiAgICB9XG4gIH0sIFtcbiAgICBkaXNwYXRjaCxcbiAgICBvbkZpbGVEaWFsb2dPcGVuQ2IsXG4gICAgb25GaWxlRGlhbG9nQ2FuY2VsQ2IsXG4gICAgdXNlRnNBY2Nlc3NBcGksXG4gICAgc2V0RmlsZXMsXG4gICAgYWNjZXB0LFxuICAgIG11bHRpcGxlLFxuICBdKTtcblxuICAvLyBDYiB0byBvcGVuIHRoZSBmaWxlIGRpYWxvZyB3aGVuIFNQQUNFL0VOVEVSIG9jY3VycyBvbiB0aGUgZHJvcHpvbmVcbiAgY29uc3Qgb25LZXlEb3duQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIC8vIElnbm9yZSBrZXlib2FyZCBldmVudHMgYnViYmxpbmcgdXAgdGhlIERPTSB0cmVlXG4gICAgICBpZiAoIXJvb3RSZWYuY3VycmVudCB8fCAhcm9vdFJlZi5jdXJyZW50LmlzRXF1YWxOb2RlKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIgfHwgZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb3BlbkZpbGVEaWFsb2coKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyb290UmVmLCBvcGVuRmlsZURpYWxvZ11cbiAgKTtcblxuICAvLyBVcGRhdGUgZm9jdXMgc3RhdGUgZm9yIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbkZvY3VzQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBcImZvY3VzXCIgfSk7XG4gIH0sIFtdKTtcbiAgY29uc3Qgb25CbHVyQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBcImJsdXJcIiB9KTtcbiAgfSwgW10pO1xuXG4gIC8vIENiIHRvIG9wZW4gdGhlIGZpbGUgZGlhbG9nIHdoZW4gY2xpY2sgb2NjdXJzIG9uIHRoZSBkcm9wem9uZVxuICBjb25zdCBvbkNsaWNrQ2IgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKG5vQ2xpY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbiBJRTExL0VkZ2UgdGhlIGZpbGUtYnJvd3NlciBkaWFsb2cgaXMgYmxvY2tpbmcsIHRoZXJlZm9yZSwgdXNlIHNldFRpbWVvdXQoKVxuICAgIC8vIHRvIGVuc3VyZSBSZWFjdCBjYW4gaGFuZGxlIHN0YXRlIGNoYW5nZXNcbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvNDUwXG4gICAgaWYgKGlzSWVPckVkZ2UoKSkge1xuICAgICAgc2V0VGltZW91dChvcGVuRmlsZURpYWxvZywgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wZW5GaWxlRGlhbG9nKCk7XG4gICAgfVxuICB9LCBbbm9DbGljaywgb3BlbkZpbGVEaWFsb2ddKTtcblxuICBjb25zdCBjb21wb3NlSGFuZGxlciA9IChmbikgPT4ge1xuICAgIHJldHVybiBkaXNhYmxlZCA/IG51bGwgOiBmbjtcbiAgfTtcblxuICBjb25zdCBjb21wb3NlS2V5Ym9hcmRIYW5kbGVyID0gKGZuKSA9PiB7XG4gICAgcmV0dXJuIG5vS2V5Ym9hcmQgPyBudWxsIDogY29tcG9zZUhhbmRsZXIoZm4pO1xuICB9O1xuXG4gIGNvbnN0IGNvbXBvc2VEcmFnSGFuZGxlciA9IChmbikgPT4ge1xuICAgIHJldHVybiBub0RyYWcgPyBudWxsIDogY29tcG9zZUhhbmRsZXIoZm4pO1xuICB9O1xuXG4gIGNvbnN0IHN0b3BQcm9wYWdhdGlvbiA9IChldmVudCkgPT4ge1xuICAgIGlmIChub0RyYWdFdmVudHNCdWJibGluZykge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldFJvb3RQcm9wcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgICh7XG4gICAgICAgIHJlZktleSA9IFwicmVmXCIsXG4gICAgICAgIHJvbGUsXG4gICAgICAgIG9uS2V5RG93bixcbiAgICAgICAgb25Gb2N1cyxcbiAgICAgICAgb25CbHVyLFxuICAgICAgICBvbkNsaWNrLFxuICAgICAgICBvbkRyYWdFbnRlcixcbiAgICAgICAgb25EcmFnT3ZlcixcbiAgICAgICAgb25EcmFnTGVhdmUsXG4gICAgICAgIG9uRHJvcCxcbiAgICAgICAgLi4ucmVzdFxuICAgICAgfSA9IHt9KSA9PiAoe1xuICAgICAgICBvbktleURvd246IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIoXG4gICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25LZXlEb3duLCBvbktleURvd25DYilcbiAgICAgICAgKSxcbiAgICAgICAgb25Gb2N1czogY29tcG9zZUtleWJvYXJkSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkZvY3VzLCBvbkZvY3VzQ2IpXG4gICAgICAgICksXG4gICAgICAgIG9uQmx1cjogY29tcG9zZUtleWJvYXJkSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkJsdXIsIG9uQmx1ckNiKSksXG4gICAgICAgIG9uQ2xpY2s6IGNvbXBvc2VIYW5kbGVyKGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uQ2xpY2ssIG9uQ2xpY2tDYikpLFxuICAgICAgICBvbkRyYWdFbnRlcjogY29tcG9zZURyYWdIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRHJhZ0VudGVyLCBvbkRyYWdFbnRlckNiKVxuICAgICAgICApLFxuICAgICAgICBvbkRyYWdPdmVyOiBjb21wb3NlRHJhZ0hhbmRsZXIoXG4gICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25EcmFnT3Zlciwgb25EcmFnT3ZlckNiKVxuICAgICAgICApLFxuICAgICAgICBvbkRyYWdMZWF2ZTogY29tcG9zZURyYWdIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRHJhZ0xlYXZlLCBvbkRyYWdMZWF2ZUNiKVxuICAgICAgICApLFxuICAgICAgICBvbkRyb3A6IGNvbXBvc2VEcmFnSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyb3AsIG9uRHJvcENiKSksXG4gICAgICAgIHJvbGU6IHR5cGVvZiByb2xlID09PSBcInN0cmluZ1wiICYmIHJvbGUgIT09IFwiXCIgPyByb2xlIDogXCJidXR0b25cIixcbiAgICAgICAgW3JlZktleV06IHJvb3RSZWYsXG4gICAgICAgIC4uLighZGlzYWJsZWQgJiYgIW5vS2V5Ym9hcmQgPyB7IHRhYkluZGV4OiAwIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc3QsXG4gICAgICB9KSxcbiAgICBbXG4gICAgICByb290UmVmLFxuICAgICAgb25LZXlEb3duQ2IsXG4gICAgICBvbkZvY3VzQ2IsXG4gICAgICBvbkJsdXJDYixcbiAgICAgIG9uQ2xpY2tDYixcbiAgICAgIG9uRHJhZ0VudGVyQ2IsXG4gICAgICBvbkRyYWdPdmVyQ2IsXG4gICAgICBvbkRyYWdMZWF2ZUNiLFxuICAgICAgb25Ecm9wQ2IsXG4gICAgICBub0tleWJvYXJkLFxuICAgICAgbm9EcmFnLFxuICAgICAgZGlzYWJsZWQsXG4gICAgXVxuICApO1xuXG4gIGNvbnN0IG9uSW5wdXRFbGVtZW50Q2xpY2sgPSB1c2VDYWxsYmFjaygoZXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGdldElucHV0UHJvcHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICAoeyByZWZLZXkgPSBcInJlZlwiLCBvbkNoYW5nZSwgb25DbGljaywgLi4ucmVzdCB9ID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXRQcm9wcyA9IHtcbiAgICAgICAgICBhY2NlcHQsXG4gICAgICAgICAgbXVsdGlwbGUsXG4gICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgc3R5bGU6IHsgZGlzcGxheTogXCJub25lXCIgfSxcbiAgICAgICAgICBvbkNoYW5nZTogY29tcG9zZUhhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25DaGFuZ2UsIG9uRHJvcENiKSksXG4gICAgICAgICAgb25DbGljazogY29tcG9zZUhhbmRsZXIoXG4gICAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkNsaWNrLCBvbklucHV0RWxlbWVudENsaWNrKVxuICAgICAgICAgICksXG4gICAgICAgICAgYXV0b0NvbXBsZXRlOiBcIm9mZlwiLFxuICAgICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgICBbcmVmS2V5XTogaW5wdXRSZWYsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIFtpbnB1dFJlZiwgYWNjZXB0LCBtdWx0aXBsZSwgb25Ecm9wQ2IsIGRpc2FibGVkXVxuICApO1xuXG4gIGNvbnN0IGZpbGVDb3VudCA9IGRyYWdnZWRGaWxlcy5sZW5ndGg7XG4gIGNvbnN0IGlzRHJhZ0FjY2VwdCA9XG4gICAgZmlsZUNvdW50ID4gMCAmJlxuICAgIGFsbEZpbGVzQWNjZXB0ZWQoe1xuICAgICAgZmlsZXM6IGRyYWdnZWRGaWxlcyxcbiAgICAgIGFjY2VwdCxcbiAgICAgIG1pblNpemUsXG4gICAgICBtYXhTaXplLFxuICAgICAgbXVsdGlwbGUsXG4gICAgICBtYXhGaWxlcyxcbiAgICB9KTtcbiAgY29uc3QgaXNEcmFnUmVqZWN0ID0gZmlsZUNvdW50ID4gMCAmJiAhaXNEcmFnQWNjZXB0O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgaXNEcmFnQWNjZXB0LFxuICAgIGlzRHJhZ1JlamVjdCxcbiAgICBpc0ZvY3VzZWQ6IGlzRm9jdXNlZCAmJiAhZGlzYWJsZWQsXG4gICAgZ2V0Um9vdFByb3BzLFxuICAgIGdldElucHV0UHJvcHMsXG4gICAgcm9vdFJlZixcbiAgICBpbnB1dFJlZixcbiAgICBvcGVuOiBjb21wb3NlSGFuZGxlcihvcGVuRmlsZURpYWxvZyksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBcImZvY3VzXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgaXNGb2N1c2VkOiB0cnVlLFxuICAgICAgfTtcbiAgICBjYXNlIFwiYmx1clwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzRm9jdXNlZDogZmFsc2UsXG4gICAgICB9O1xuICAgIGNhc2UgXCJvcGVuRGlhbG9nXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbml0aWFsU3RhdGUsXG4gICAgICAgIGlzRmlsZURpYWxvZ0FjdGl2ZTogdHJ1ZSxcbiAgICAgIH07XG4gICAgY2FzZSBcImNsb3NlRGlhbG9nXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgaXNGaWxlRGlhbG9nQWN0aXZlOiBmYWxzZSxcbiAgICAgIH07XG4gICAgY2FzZSBcInNldERyYWdnZWRGaWxlc1wiOlxuICAgICAgLyogZXNsaW50IG5vLWNhc2UtZGVjbGFyYXRpb25zOiAwICovXG4gICAgICBjb25zdCB7IGlzRHJhZ0FjdGl2ZSwgZHJhZ2dlZEZpbGVzIH0gPSBhY3Rpb247XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZHJhZ2dlZEZpbGVzLFxuICAgICAgICBpc0RyYWdBY3RpdmUsXG4gICAgICB9O1xuICAgIGNhc2UgXCJzZXRGaWxlc1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGFjY2VwdGVkRmlsZXM6IGFjdGlvbi5hY2NlcHRlZEZpbGVzLFxuICAgICAgICBmaWxlUmVqZWN0aW9uczogYWN0aW9uLmZpbGVSZWplY3Rpb25zLFxuICAgICAgfTtcbiAgICBjYXNlIFwicmVzZXRcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmluaXRpYWxTdGF0ZSxcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuZXhwb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbiJdLCJuYW1lcyI6WyJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsImFwcGx5IiwiX19nZW5lcmF0b3IiLCJib2R5IiwiZiIsInkiLCJ0IiwiZyIsIl8iLCJsYWJlbCIsInNlbnQiLCJ0cnlzIiwib3BzIiwidmVyYiIsInRocm93IiwicmV0dXJuIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJ0aGlzIiwibiIsInYiLCJvcCIsIlR5cGVFcnJvciIsImNhbGwiLCJwb3AiLCJsZW5ndGgiLCJwdXNoIiwiX19yZWFkIiwibyIsIm0iLCJyIiwiaSIsImFyIiwiZXJyb3IiLCJDT01NT05fTUlNRV9UWVBFUyIsIk1hcCIsInRvRmlsZVdpdGhQYXRoIiwiZmlsZSIsInBhdGgiLCJuYW1lIiwibGFzdEluZGV4T2YiLCJ0eXBlIiwiZXh0Iiwic3BsaXQiLCJ0b0xvd2VyQ2FzZSIsImdldCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5Iiwid3JpdGFibGUiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwid2l0aE1pbWVUeXBlIiwid2Via2l0UmVsYXRpdmVQYXRoIiwiRklMRVNfVE9fSUdOT1JFIiwiaXNPYmplY3QiLCJnZXRJbnB1dEZpbGVzIiwiZXZ0IiwiZnJvbUxpc3QiLCJ0YXJnZXQiLCJmaWxlcyIsIm1hcCIsImdldEZzSGFuZGxlRmlsZXMiLCJoYW5kbGVzIiwiX2EiLCJhbGwiLCJoIiwiZ2V0RmlsZSIsImdldERhdGFUcmFuc2ZlckZpbGVzIiwiZHQiLCJpdGVtcyIsImZpbHRlciIsIml0ZW0iLCJraW5kIiwidG9GaWxlUHJvbWlzZXMiLCJub0lnbm9yZWRGaWxlcyIsImZsYXR0ZW4iLCJpbmRleE9mIiwid2Via2l0R2V0QXNFbnRyeSIsImZyb21EYXRhVHJhbnNmZXJJdGVtIiwiZW50cnkiLCJpc0RpcmVjdG9yeSIsImZyb21EaXJFbnRyeSIsInJlZHVjZSIsImFjYyIsImFyZ3VtZW50cyIsImNvbmNhdCIsIl9fc3ByZWFkIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0QXNGaWxlIiwiZndwIiwiZnJvbUVudHJ5IiwiZnJvbUZpbGVFbnRyeSIsInJlYWRlciIsImNyZWF0ZVJlYWRlciIsImVudHJpZXMiLCJyZWFkRW50cmllcyIsIl90aGlzIiwiYmF0Y2giLCJlcnJfMSIsImVyciIsImZ1bGxQYXRoIiwiRklMRV9JTlZBTElEX1RZUEUiLCJGSUxFX1RPT19MQVJHRSIsIkZJTEVfVE9PX1NNQUxMIiwiVE9PX01BTllfRklMRVMiLCJFcnJvckNvZGUiLCJGaWxlSW52YWxpZFR5cGUiLCJGaWxlVG9vTGFyZ2UiLCJGaWxlVG9vU21hbGwiLCJUb29NYW55RmlsZXMiLCJnZXRJbnZhbGlkVHlwZVJlamVjdGlvbkVyciIsImFjY2VwdCIsIm1lc3NhZ2VTdWZmaXgiLCJqb2luIiwiY29kZSIsIm1lc3NhZ2UiLCJnZXRUb29MYXJnZVJlamVjdGlvbkVyciIsIm1heFNpemUiLCJnZXRUb29TbWFsbFJlamVjdGlvbkVyciIsIm1pblNpemUiLCJUT09fTUFOWV9GSUxFU19SRUpFQ1RJT04iLCJmaWxlQWNjZXB0ZWQiLCJpc0FjY2VwdGFibGUiLCJhY2NlcHRlZEZpbGVzIiwiYWNjZXB0ZWRGaWxlc0FycmF5IiwiZmlsZU5hbWUiLCJtaW1lVHlwZSIsImJhc2VNaW1lVHlwZSIsInJlcGxhY2UiLCJzb21lIiwidmFsaWRUeXBlIiwidHJpbSIsImNoYXJBdCIsImVuZHNXaXRoIiwiYWNjZXB0cyIsImZpbGVNYXRjaFNpemUiLCJpc0RlZmluZWQiLCJzaXplIiwiYWxsRmlsZXNBY2NlcHRlZCIsIm11bHRpcGxlIiwibWF4RmlsZXMiLCJldmVyeSIsImFjY2VwdGVkIiwic2l6ZU1hdGNoIiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJldmVudCIsImNhbmNlbEJ1YmJsZSIsImlzRXZ0V2l0aEZpbGVzIiwiZGF0YVRyYW5zZmVyIiwicHJvdG90eXBlIiwidHlwZXMiLCJvbkRvY3VtZW50RHJhZ092ZXIiLCJwcmV2ZW50RGVmYXVsdCIsImlzSWUiLCJ1c2VyQWdlbnQiLCJpc0VkZ2UiLCJpc0llT3JFZGdlIiwid2luZG93IiwibmF2aWdhdG9yIiwiY29tcG9zZUV2ZW50SGFuZGxlcnMiLCJmbnMiLCJhcmdzIiwiZm4iLCJjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJIiwiZmlsZVBpY2tlck9wdGlvbnNUeXBlcyIsImRlc2NyaXB0aW9uIiwidGVzdCIsImEiLCJiIiwiaXNBYm9ydCIsIkRPTUV4Y2VwdGlvbiIsIkFCT1JUX0VSUiIsImlzU2VjdXJpdHlFcnJvciIsIlNFQ1VSSVRZX0VSUiIsIkRyb3B6b25lIiwiZm9yd2FyZFJlZiIsInJlZiIsImNoaWxkcmVuIiwidXNlRHJvcHpvbmUiLCJvcGVuIiwicHJvcHMiLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwiUmVhY3QiLCJGcmFnbWVudCIsImRpc3BsYXlOYW1lIiwiZGVmYXVsdFByb3BzIiwiZGlzYWJsZWQiLCJnZXRGaWxlc0Zyb21FdmVudCIsImlzQ2hhbmdlRXZ0IiwiSW5maW5pdHkiLCJwcmV2ZW50RHJvcE9uRG9jdW1lbnQiLCJub0NsaWNrIiwibm9LZXlib2FyZCIsIm5vRHJhZyIsIm5vRHJhZ0V2ZW50c0J1YmJsaW5nIiwidmFsaWRhdG9yIiwidXNlRnNBY2Nlc3NBcGkiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJmdW5jIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiYXJyYXlPZiIsImJvb2wiLCJudW1iZXIiLCJvbkZpbGVEaWFsb2dDYW5jZWwiLCJvbkZpbGVEaWFsb2dPcGVuIiwib25EcmFnRW50ZXIiLCJvbkRyYWdMZWF2ZSIsIm9uRHJhZ092ZXIiLCJvbkRyb3AiLCJvbkRyb3BBY2NlcHRlZCIsIm9uRHJvcFJlamVjdGVkIiwiaW5pdGlhbFN0YXRlIiwiaXNGb2N1c2VkIiwiaXNGaWxlRGlhbG9nQWN0aXZlIiwiaXNEcmFnQWN0aXZlIiwiaXNEcmFnQWNjZXB0IiwiaXNEcmFnUmVqZWN0IiwiZHJhZ2dlZEZpbGVzIiwiZmlsZVJlamVjdGlvbnMiLCJvcHRpb25zIiwib25GaWxlRGlhbG9nT3BlbkNiIiwidXNlTWVtbyIsIm5vb3AiLCJvbkZpbGVEaWFsb2dDYW5jZWxDYiIsInJvb3RSZWYiLCJ1c2VSZWYiLCJpbnB1dFJlZiIsInVzZVJlZHVjZXIiLCJyZWR1Y2VyIiwic3RhdGUiLCJkaXNwYXRjaCIsImZzQWNjZXNzQXBpV29ya3NSZWYiLCJpc1NlY3VyZUNvbnRleHQiLCJvbldpbmRvd0ZvY3VzIiwiY3VycmVudCIsInNldFRpbWVvdXQiLCJ1c2VFZmZlY3QiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRyYWdUYXJnZXRzUmVmIiwib25Eb2N1bWVudERyb3AiLCJjb250YWlucyIsImRvY3VtZW50Iiwib25EcmFnRW50ZXJDYiIsInVzZUNhbGxiYWNrIiwicGVyc2lzdCIsInN0b3BQcm9wYWdhdGlvbiIsIm9uRHJhZ092ZXJDYiIsImhhc0ZpbGVzIiwiZHJvcEVmZmVjdCIsIm9uRHJhZ0xlYXZlQ2IiLCJ0YXJnZXRzIiwidGFyZ2V0SWR4Iiwic3BsaWNlIiwic2V0RmlsZXMiLCJmb3JFYWNoIiwiYWNjZXB0RXJyb3IiLCJzaXplRXJyb3IiLCJjdXN0b21FcnJvcnMiLCJlcnJvcnMiLCJvbkRyb3BDYiIsIm9wZW5GaWxlRGlhbG9nIiwib3B0cyIsInNob3dPcGVuRmlsZVBpY2tlciIsImNhdGNoIiwiY2xpY2siLCJvbktleURvd25DYiIsImlzRXF1YWxOb2RlIiwia2V5Q29kZSIsIm9uRm9jdXNDYiIsIm9uQmx1ckNiIiwib25DbGlja0NiIiwiY29tcG9zZUhhbmRsZXIiLCJjb21wb3NlS2V5Ym9hcmRIYW5kbGVyIiwiY29tcG9zZURyYWdIYW5kbGVyIiwiZ2V0Um9vdFByb3BzIiwicmVmS2V5Iiwicm9sZSIsIm9uS2V5RG93biIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvbkNsaWNrIiwicmVzdCIsInRhYkluZGV4Iiwib25JbnB1dEVsZW1lbnRDbGljayIsImdldElucHV0UHJvcHMiLCJvbkNoYW5nZSIsImlucHV0UHJvcHMiLCJzdHlsZSIsImRpc3BsYXkiLCJhdXRvQ29tcGxldGUiLCJmaWxlQ291bnQiLCJhY3Rpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O3cwQkFxRU8sU0FBU0EsRUFBVUMsRUFBU0MsRUFBWUMsRUFBR0MsR0FFOUMsT0FBTyxJQUFLRCxJQUFNQSxFQUFJRSxXQUFVLFNBQVVDLEVBQVNDLEdBQy9DLFNBQVNDLEVBQVVDLEdBQVMsSUFBTUMsRUFBS04sRUFBVU8sS0FBS0YsSUFBVyxNQUFPRyxHQUFLTCxFQUFPSyxJQUNwRixTQUFTQyxFQUFTSixHQUFTLElBQU1DLEVBQUtOLEVBQWlCLE1BQUVLLElBQVcsTUFBT0csR0FBS0wsRUFBT0ssSUFDdkYsU0FBU0YsRUFBS0ksR0FKbEIsSUFBZUwsRUFJYUssRUFBT0MsS0FBT1QsRUFBUVEsRUFBT0wsUUFKMUNBLEVBSXlESyxFQUFPTCxNQUpoREEsYUFBaUJOLEVBQUlNLEVBQVEsSUFBSU4sR0FBRSxTQUFVRyxHQUFXQSxFQUFRRyxPQUlUTyxLQUFLUixFQUFX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
@@ -7,7 +7,14 @@ The value must be a comma-separated list of unique content type specifiers:
7
7
  * video/* representing video files.
8
8
  * image/* representing image files.
9
9
 
10
- For more information see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input
10
+ For more information see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input.
11
+
12
+ **IMPORTANT** As of [v12.0.0](https://github.com/react-dropzone/react-dropzone/releases/tag/v12.0.0), there has been some changes that affect how `accept` works.
13
+ See [file dialog cancel callback](../../README.md#file-dialog-cancel-callback) to read more about why this change was introduced. In summary:
14
+ 1. In browsers that **do not support** the FS access API, the `accept` attr works exactly the same as in previous versions of react-dropozone, for both file picker and dag 'n' drop
15
+ 2. In browsers that **support** the FS access API, when passing file extensions to `accept` (e.g `".jpg,.png"`), the file picker will not apply those filters, but drag 'n' drop will - though, the [browser limitations](#browser-limitations) described in this document still apply
16
+ 3. If you want the same behaviour in all browsers, regardless of using the FS access API or not, you need to use MIME types - [browser limitations](#browser-limitations) still apply
17
+ 4. The use of FS access API can be turned off via `useDropzone({useFsAccessApi: false})`
11
18
 
12
19
  ```jsx harmony
13
20
  import React from 'react';
@@ -20,7 +27,7 @@ function Accept(props) {
20
27
  getRootProps,
21
28
  getInputProps
22
29
  } = useDropzone({
23
- accept: 'image/jpeg, image/png'
30
+ accept: 'image/jpeg,image/png'
24
31
  });
25
32
 
26
33
  const acceptedFileItems = acceptedFiles.map(file => (
@@ -110,7 +117,7 @@ function Accept(props) {
110
117
  isDragAccept,
111
118
  isDragReject
112
119
  } = useDropzone({
113
- accept: 'image/jpeg, image/png'
120
+ accept: 'image/jpeg,image/png'
114
121
  });
115
122
 
116
123
  return (
package/package.json CHANGED
@@ -30,11 +30,11 @@
30
30
  "size-limit": [
31
31
  {
32
32
  "path": "dist/index.js",
33
- "limit": "7 KB"
33
+ "limit": "7.5 KB"
34
34
  },
35
35
  {
36
36
  "path": "dist/es/index.js",
37
- "limit": "7 KB"
37
+ "limit": "7.5 KB"
38
38
  }
39
39
  ],
40
40
  "lint-staged": {
@@ -171,7 +171,7 @@
171
171
  "webpack-blocks": "^2.1.0"
172
172
  },
173
173
  "typings": "typings/react-dropzone.d.ts",
174
- "version": "12.0.0",
174
+ "version": "12.0.4",
175
175
  "engines": {
176
176
  "node": ">= 10.13"
177
177
  },
package/src/index.js CHANGED
@@ -18,9 +18,11 @@ import {
18
18
  fileMatchSize,
19
19
  filePickerOptionsTypes,
20
20
  canUseFileSystemAccessAPI,
21
+ isAbort,
21
22
  isEvtWithFiles,
22
23
  isIeOrEdge,
23
24
  isPropagationStopped,
25
+ isSecurityError,
24
26
  onDocumentDragOver,
25
27
  TOO_MANY_FILES_REJECTION,
26
28
  } from "./utils/index";
@@ -451,10 +453,17 @@ export function useDropzone(options = {}) {
451
453
  const [state, dispatch] = useReducer(reducer, initialState);
452
454
  const { isFocused, isFileDialogActive, draggedFiles } = state;
453
455
 
456
+ const fsAccessApiWorksRef = useRef(
457
+ typeof window !== "undefined" &&
458
+ window.isSecureContext &&
459
+ useFsAccessApi &&
460
+ canUseFileSystemAccessAPI()
461
+ );
462
+
454
463
  // Update file dialog active state when the window is focused on
455
464
  const onWindowFocus = () => {
456
465
  // Execute the timeout only if the file dialog is opened in the browser
457
- if (isFileDialogActive) {
466
+ if (!fsAccessApiWorksRef.current && isFileDialogActive) {
458
467
  setTimeout(() => {
459
468
  if (inputRef.current) {
460
469
  const { files } = inputRef.current;
@@ -468,15 +477,11 @@ export function useDropzone(options = {}) {
468
477
  }
469
478
  };
470
479
  useEffect(() => {
471
- if (useFsAccessApi && canUseFileSystemAccessAPI()) {
472
- return () => {};
473
- }
474
-
475
480
  window.addEventListener("focus", onWindowFocus, false);
476
481
  return () => {
477
482
  window.removeEventListener("focus", onWindowFocus, false);
478
483
  };
479
- }, [inputRef, isFileDialogActive, onFileDialogCancelCb, useFsAccessApi]);
484
+ }, [inputRef, isFileDialogActive, onFileDialogCancelCb, fsAccessApiWorksRef]);
480
485
 
481
486
  const dragTargetsRef = useRef([]);
482
487
  const onDocumentDrop = (event) => {
@@ -678,7 +683,9 @@ export function useDropzone(options = {}) {
678
683
 
679
684
  // Fn for opening the file dialog programmatically
680
685
  const openFileDialog = useCallback(() => {
681
- if (useFsAccessApi && canUseFileSystemAccessAPI()) {
686
+ // No point to use FS access APIs if context is not secure
687
+ // https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts#feature_detection
688
+ if (fsAccessApiWorksRef.current) {
682
689
  dispatch({ type: "openDialog" });
683
690
  onFileDialogOpenCb();
684
691
  // https://developer.mozilla.org/en-US/docs/Web/API/window/showOpenFilePicker
@@ -689,9 +696,25 @@ export function useDropzone(options = {}) {
689
696
  window
690
697
  .showOpenFilePicker(opts)
691
698
  .then((handles) => getFilesFromEvent(handles))
692
- .then((files) => setFiles(files, null))
693
- .catch((e) => onFileDialogCancelCb(e))
694
- .finally(() => dispatch({ type: "closeDialog" }));
699
+ .then((files) => {
700
+ setFiles(files, null);
701
+ dispatch({ type: "closeDialog" });
702
+ })
703
+ .catch((e) => {
704
+ // AbortError means the user canceled
705
+ if (isAbort(e)) {
706
+ onFileDialogCancelCb(e);
707
+ dispatch({ type: "closeDialog" });
708
+ } else if (isSecurityError(e)) {
709
+ fsAccessApiWorksRef.current = false;
710
+ // CORS, so cannot use this API
711
+ // Try using the input
712
+ if (inputRef.current) {
713
+ inputRef.current.value = null;
714
+ inputRef.current.click();
715
+ }
716
+ }
717
+ });
695
718
  return;
696
719
  }
697
720
 
@@ -724,7 +747,7 @@ export function useDropzone(options = {}) {
724
747
  openFileDialog();
725
748
  }
726
749
  },
727
- [rootRef, inputRef, openFileDialog]
750
+ [rootRef, openFileDialog]
728
751
  );
729
752
 
730
753
  // Update focus state for the dropzone
@@ -749,7 +772,7 @@ export function useDropzone(options = {}) {
749
772
  } else {
750
773
  openFileDialog();
751
774
  }
752
- }, [inputRef, noClick, openFileDialog]);
775
+ }, [noClick, openFileDialog]);
753
776
 
754
777
  const composeHandler = (fn) => {
755
778
  return disabled ? null : fn;
package/src/index.spec.js CHANGED
@@ -1403,6 +1403,64 @@ describe("useDropzone() hook", () => {
1403
1403
  jest.useRealTimers();
1404
1404
  });
1405
1405
 
1406
+ it("should not use showOpenFilePicker() if supported and {isSecureContext} is not true", async () => {
1407
+ jest.useFakeTimers();
1408
+
1409
+ const activeRef = createRef();
1410
+ const active = <span ref={activeRef}>I am active</span>;
1411
+ const onClickSpy = jest.spyOn(HTMLInputElement.prototype, "click");
1412
+
1413
+ const handlers = files.map((f) => createFileSystemFileHandle(f));
1414
+ const showOpenFilePickerMock = jest
1415
+ .fn()
1416
+ .mockReturnValue(Promise.resolve(handlers));
1417
+
1418
+ window.showOpenFilePicker = showOpenFilePickerMock;
1419
+ window.isSecureContext = false;
1420
+
1421
+ const onDropSpy = jest.fn();
1422
+ const onFileDialogOpenSpy = jest.fn();
1423
+
1424
+ const ui = (
1425
+ <Dropzone
1426
+ onDrop={onDropSpy}
1427
+ onFileDialogOpen={onFileDialogOpenSpy}
1428
+ accept="application/pdf"
1429
+ multiple
1430
+ >
1431
+ {({ getRootProps, getInputProps, isFileDialogActive }) => (
1432
+ <div {...getRootProps()}>
1433
+ <input {...getInputProps()} />
1434
+ {isFileDialogActive && active}
1435
+ </div>
1436
+ )}
1437
+ </Dropzone>
1438
+ );
1439
+
1440
+ const { container, rerender } = render(ui);
1441
+
1442
+ const dropzone = container.querySelector("div");
1443
+
1444
+ fireEvent.click(dropzone);
1445
+
1446
+ await flushPromises(rerender, ui);
1447
+
1448
+ dispatchEvt(document.body, "focus");
1449
+ drainTimers();
1450
+
1451
+ expect(onFileDialogOpenSpy).toHaveBeenCalled();
1452
+
1453
+ expect(activeRef.current).toBeNull();
1454
+ expect(dropzone).not.toContainElement(activeRef.current);
1455
+ expect(onClickSpy).toHaveBeenCalled();
1456
+ expect(showOpenFilePickerMock).not.toHaveBeenCalled();
1457
+ expect(onDropSpy).not.toHaveBeenCalled();
1458
+
1459
+ jest.useRealTimers();
1460
+
1461
+ window.isSecureContext = true;
1462
+ });
1463
+
1406
1464
  it("should use showOpenFilePicker() if supported and {useFsAccessApi} is true, and not trigger click on input", async () => {
1407
1465
  const activeRef = createRef();
1408
1466
  const active = <span ref={activeRef}>I am active</span>;
@@ -1602,6 +1660,114 @@ describe("useDropzone() hook", () => {
1602
1660
 
1603
1661
  jest.useRealTimers();
1604
1662
  });
1663
+
1664
+ it("should try to use showOpenFilePicker() and fallback to input in case of a security error", async () => {
1665
+ const activeRef = createRef();
1666
+ const active = <span ref={activeRef}>I am active</span>;
1667
+ const onClickSpy = jest.spyOn(HTMLInputElement.prototype, "click");
1668
+
1669
+ const thenable = createThenable();
1670
+ const showOpenFilePickerMock = jest
1671
+ .fn()
1672
+ .mockReturnValue(thenable.promise);
1673
+
1674
+ window.showOpenFilePicker = showOpenFilePickerMock;
1675
+
1676
+ const onDropSpy = jest.fn();
1677
+ const onFileDialogOpenSpy = jest.fn();
1678
+
1679
+ const ui = (
1680
+ <Dropzone
1681
+ onDrop={onDropSpy}
1682
+ onFileDialogOpen={onFileDialogOpenSpy}
1683
+ accept="application/pdf"
1684
+ multiple
1685
+ useFsAccessApi
1686
+ >
1687
+ {({ getRootProps, getInputProps, isFileDialogActive }) => (
1688
+ <div {...getRootProps()}>
1689
+ <input {...getInputProps()} />
1690
+ {isFileDialogActive && active}
1691
+ </div>
1692
+ )}
1693
+ </Dropzone>
1694
+ );
1695
+
1696
+ const { container, rerender } = render(ui);
1697
+
1698
+ const dropzone = container.querySelector("div");
1699
+
1700
+ fireEvent.click(dropzone);
1701
+
1702
+ await flushPromises(rerender, ui);
1703
+
1704
+ expect(activeRef.current).not.toBeNull();
1705
+ expect(dropzone).toContainElement(activeRef.current);
1706
+ expect(onFileDialogOpenSpy).toHaveBeenCalled();
1707
+
1708
+ thenable.cancel(
1709
+ new DOMException("Cannot use this API cross-origin", "SecurityError")
1710
+ );
1711
+ await flushPromises(rerender, ui);
1712
+
1713
+ expect(activeRef.current).not.toBeNull();
1714
+ expect(dropzone).toContainElement(activeRef.current);
1715
+ expect(onClickSpy).toHaveBeenCalled();
1716
+ });
1717
+
1718
+ test("window focus evt is bound if showOpenFilePicker() is supported but errors due to a security error", async () => {
1719
+ jest.useFakeTimers();
1720
+
1721
+ const activeRef = createRef();
1722
+ const active = <span ref={activeRef}>I am active</span>;
1723
+ const onFileDialogCancelSpy = jest.fn();
1724
+
1725
+ const thenable = createThenable();
1726
+ const showOpenFilePickerMock = jest
1727
+ .fn()
1728
+ .mockReturnValue(thenable.promise);
1729
+
1730
+ window.showOpenFilePicker = showOpenFilePickerMock;
1731
+
1732
+ const ui = (
1733
+ <Dropzone onFileDialogCancel={onFileDialogCancelSpy}>
1734
+ {({ getRootProps, getInputProps, isFileDialogActive }) => (
1735
+ <div {...getRootProps()}>
1736
+ <input {...getInputProps()} />
1737
+ {isFileDialogActive && active}
1738
+ </div>
1739
+ )}
1740
+ </Dropzone>
1741
+ );
1742
+
1743
+ const { container, rerender } = render(ui);
1744
+
1745
+ const dropzone = container.querySelector("div");
1746
+
1747
+ fireEvent.click(dropzone);
1748
+
1749
+ drainTimers();
1750
+ await flushPromises(rerender, ui);
1751
+
1752
+ const ref = activeRef.current;
1753
+ expect(ref).not.toBeNull();
1754
+ expect(dropzone).toContainElement(ref);
1755
+
1756
+ thenable.cancel(
1757
+ new DOMException("Cannot use this API cross-origin", "SecurityError")
1758
+ );
1759
+
1760
+ await flushPromises(rerender, ui);
1761
+
1762
+ dispatchEvt(document.body, "focus");
1763
+ drainTimers();
1764
+ await flushPromises(rerender, ui);
1765
+
1766
+ expect(onFileDialogCancelSpy).toHaveBeenCalled();
1767
+ expect(dropzone).not.toContainElement(ref);
1768
+
1769
+ jest.useRealTimers();
1770
+ });
1605
1771
  });
1606
1772
 
1607
1773
  describe("onKeyDown", () => {
@@ -203,3 +203,31 @@ export function filePickerOptionsTypes(accept) {
203
203
  },
204
204
  ];
205
205
  }
206
+
207
+ /**
208
+ * Check if v is an exception caused by aborting a request (e.g window.showOpenFilePicker()).
209
+ *
210
+ * See https://developer.mozilla.org/en-US/docs/Web/API/DOMException.
211
+ * @param {any} v
212
+ * @returns {boolean} True if v is an abort exception.
213
+ */
214
+ export function isAbort(v) {
215
+ return (
216
+ v instanceof DOMException &&
217
+ (v.name === "AbortError" || v.code === v.ABORT_ERR)
218
+ );
219
+ }
220
+
221
+ /**
222
+ * Check if v is a security error.
223
+ *
224
+ * See https://developer.mozilla.org/en-US/docs/Web/API/DOMException.
225
+ * @param {any} v
226
+ * @returns {boolean} True if v is a security error.
227
+ */
228
+ export function isSecurityError(v) {
229
+ return (
230
+ v instanceof DOMException &&
231
+ (v.name === "SecurityError" || v.code === v.SECURITY_ERR)
232
+ );
233
+ }
@@ -426,6 +426,60 @@ describe("filePickerOptionsTypes()", () => {
426
426
  });
427
427
  });
428
428
 
429
+ describe("isAbort()", () => {
430
+ let utils;
431
+ beforeEach(async () => {
432
+ utils = await import("./index");
433
+ });
434
+
435
+ it("should work as expected", () => {
436
+ expect(utils.isAbort(new DOMException())).toBe(false);
437
+ expect(utils.isAbort(new DOMException("some err"))).toBe(false);
438
+ expect(utils.isAbort(new DOMException("some err", "Noop"))).toBe(false);
439
+ expect(utils.isAbort(new DOMException("some err", "AbortError"))).toBe(
440
+ true
441
+ );
442
+ const err = new DOMException("some err");
443
+ const e = new Proxy(err, {
444
+ get(t, p) {
445
+ if (p === "code") {
446
+ return 20;
447
+ }
448
+ return t[p];
449
+ },
450
+ });
451
+ expect(utils.isAbort(e)).toBe(true);
452
+ });
453
+ });
454
+
455
+ describe("isSecurityError()", () => {
456
+ let utils;
457
+ beforeEach(async () => {
458
+ utils = await import("./index");
459
+ });
460
+
461
+ it("should work as expected", () => {
462
+ expect(utils.isSecurityError(new DOMException())).toBe(false);
463
+ expect(utils.isSecurityError(new DOMException("some err"))).toBe(false);
464
+ expect(utils.isSecurityError(new DOMException("some err", "Noop"))).toBe(
465
+ false
466
+ );
467
+ expect(
468
+ utils.isSecurityError(new DOMException("some err", "SecurityError"))
469
+ ).toBe(true);
470
+ const err = new DOMException("some err");
471
+ const e = new Proxy(err, {
472
+ get(t, p) {
473
+ if (p === "code") {
474
+ return 18;
475
+ }
476
+ return t[p];
477
+ },
478
+ });
479
+ expect(utils.isSecurityError(e)).toBe(true);
480
+ });
481
+ });
482
+
429
483
  function createFile(name, size, type) {
430
484
  const file = new File([], name, { type });
431
485
  Object.defineProperty(file, "size", {
package/testSetup.js CHANGED
@@ -1,2 +1,8 @@
1
1
  // https://www.npmjs.com/package/jest-dom
2
2
  require("@testing-library/jest-dom/extend-expect");
3
+
4
+ Object.defineProperty(global, "isSecureContext", {
5
+ value: true,
6
+ writable: true,
7
+ enumerable: true,
8
+ });
@@ -51,6 +51,7 @@ export type DropzoneOptions = Pick<React.HTMLProps<HTMLElement>, PropTypes> & {
51
51
  onFileDialogCancel?: () => void;
52
52
  onFileDialogOpen?: () => void;
53
53
  validator?: <T extends File>(file: T) => FileError | FileError[] | null;
54
+ useFsAccessApi?: boolean;
54
55
  };
55
56
 
56
57
  export type DropEvent =
@@ -26,6 +26,7 @@ export default class Test extends React.Component {
26
26
  disabled
27
27
  multiple={false}
28
28
  accept="*.png"
29
+ useFsAccessApi={false}
29
30
  >
30
31
  {({ getRootProps, getInputProps }) => (
31
32
  <div {...getRootProps()}>