react-modal-promise
Version:
Promise wrapper for React components
189 lines (177 loc) • 24.8 kB
JavaScript
import React, { forwardRef, useRef, useState, useCallback, useEffect, useImperativeHandle, useMemo } from 'react';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __rest(s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
}
function __spreadArray(to, from) {
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
to[j] = from[i];
return to;
}
var hexGen = function (len) {
if (len === void 0) { len = 12; }
var maxlen = 8;
var min = Math.pow(16, Math.min(len, maxlen) - 1);
var max = Math.pow(16, Math.min(len, maxlen)) - 1;
var n = Math.floor(Math.random() * (max - min + 1)) + min;
var r = n.toString(16);
while (r.length < len) {
r = r + hexGen(len - maxlen);
}
return r;
};
var DEFAULT_SCOPE = 'stack';
var SCOPE_KEY = 'factoryStack';
if (typeof window !== 'undefined') {
if (!window[SCOPE_KEY]) {
window[SCOPE_KEY] = {};
}
}
var registerContainer = function (scope, ref) {
window[SCOPE_KEY][scope] = ref;
return ref;
};
var unregisterContainer = function (scope) {
delete window[SCOPE_KEY][scope];
};
var getContainer = function (scope) {
return window[SCOPE_KEY][scope || DEFAULT_SCOPE];
};
var InstanceContainer = function (props, ref) {
var _a = (props || {}).scope, scope = _a === void 0 ? DEFAULT_SCOPE : _a;
var propsRef = useRef(props);
var _b = useState({}), instances = _b[0], setInstances = _b[1];
var _c = useState([]), hashStack = _c[0], setHashStack = _c[1];
var resolve = useCallback(function (hash, v) { var _a; return (_a = instances === null || instances === void 0 ? void 0 : instances[hash]) === null || _a === void 0 ? void 0 : _a.resolve(v); }, [instances]);
var resolveAll = useCallback(function (v) { return Object.values(instances).forEach(function (i) { return i.resolve(v); }); }, [instances]);
var reject = useCallback(function (hash, r) { var _a; return (_a = instances === null || instances === void 0 ? void 0 : instances[hash]) === null || _a === void 0 ? void 0 : _a.reject(r); }, [instances]);
var rejectAll = useCallback(function (r) { return Object.values(instances).forEach(function (i) { return i.reject(r); }); }, [instances]);
var hasInstance = useCallback(function (hash) { return !!hashStack.find(function (id) { return id === hash; }); }, [hashStack]);
var getInstance = useCallback(function (hash) { return instances === null || instances === void 0 ? void 0 : instances[hash]; }, [
instances,
]);
var remove = function (hash, options) {
var _a;
setHashStack(function (stack) { return stack.filter(function (s) { return s !== hash; }); });
setTimeout(function () {
setInstances(function (instances) {
var _a = instances, _b = hash; _a[_b]; var omitHash = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
return omitHash;
});
}, options === null || options === void 0 ? void 0 : options.exitTimeout);
(_a = props.onRemove) === null || _a === void 0 ? void 0 : _a.call(props, hash);
};
var create = function (Component, options, instanceProps) {
if (options === void 0) { options = {}; }
return new Promise(function (res, rej) {
var hash = (instanceProps === null || instanceProps === void 0 ? void 0 : instanceProps.instanceId) || hexGen();
var _a = propsRef.current, enterTimeout = _a.enterTimeout, exitTimeout = _a.exitTimeout, isAppendIntances = _a.isAppendIntances, onResolve = _a.onResolve, onReject = _a.onReject;
var instanceOptions = __assign({ enterTimeout: enterTimeout,
exitTimeout: exitTimeout, instanceId: hash }, options);
var instance = __assign({ Component: Component, props: __assign(__assign({}, options), instanceProps), resolve: function (v) {
removeRef.current(hash, instanceOptions);
res(v);
onResolve === null || onResolve === void 0 ? void 0 : onResolve(v, hash);
}, reject: function (r) {
removeRef.current(hash, instanceOptions);
rej(r);
onReject === null || onReject === void 0 ? void 0 : onReject(r, hash);
} }, instanceOptions);
setInstances(function (instances) {
var _a, _b;
return isAppendIntances
? __assign(__assign({}, instances), (_a = {}, _a[hash] = instance, _a)) : __assign((_b = {}, _b[hash] = instance, _b), instances);
});
setTimeout(function () {
var _a, _b;
setHashStack(function (stack) { return __spreadArray(__spreadArray([], stack), [hash]); });
(_b = (_a = propsRef.current).onOpen) === null || _b === void 0 ? void 0 : _b.call(_a, hash, instance);
}, instanceOptions.enterTimeout);
});
};
var removeRef = useRef(remove);
var createRef = useRef(create);
useEffect(function () {
propsRef.current = props;
removeRef.current = remove;
createRef.current = create;
});
useImperativeHandle(ref, function () { return ({
create: createRef.current,
resolve: resolve,
reject: reject,
resolveAll: resolveAll,
rejectAll: rejectAll,
hasInstance: hasInstance,
getInstance: getInstance,
}); });
useEffect(function () {
registerContainer(scope, {
create: createRef.current,
resolve: resolve,
reject: reject,
resolveAll: resolveAll,
rejectAll: rejectAll,
hasInstance: hasInstance,
getInstance: getInstance,
});
return function () { return unregisterContainer(scope); };
}, [scope]);
var mapKeys = useMemo(function () {
var keys = Object.keys(instances);
return keys.map(function (key) {
var _a = instances[key], Component = _a.Component, props = _a.props, resolve = _a.resolve, reject = _a.reject;
var isOpen = !!hashStack.find(function (h) { return h === key; });
return (React.createElement(Component, __assign({}, props, { key: key, isOpen: isOpen, onReject: reject, onResolve: resolve,
/** @deprecated **/
close: resolve,
/** @deprecated **/
open: isOpen })));
});
}, [instances, hashStack]);
return React.createElement(React.Fragment, null, mapKeys);
};
var Container = forwardRef(InstanceContainer);
Container.defaultProps = {
exitTimeout: 500,
enterTimeout: 50,
};
/** @deprecated */
var createModal = function (Component, options) { return function (props) {
return getContainer(options === null || options === void 0 ? void 0 : options.scope).create(Component, options, props);
}; };
var create = function (Component, options) { return function (props) {
return getContainer(options === null || options === void 0 ? void 0 : options.scope).create(Component, options, props);
}; };
export default Container;
export { Container, DEFAULT_SCOPE, SCOPE_KEY, create, createModal, getContainer, hexGen, registerContainer, unregisterContainer };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9oZXgtZ2VuLnRzIiwiLi4vc3JjL3V0aWxzL3JlZ2lzdGVyLXNjb3BlLnRzIiwiLi4vc3JjL0NvbnRhaW5lci50c3giLCIuLi9zcmMvY3JlYXRlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBIZXggPSBzdHJpbmdcblxuZXhwb3J0IGNvbnN0IGhleEdlbiA9IChsZW46IG51bWJlciA9IDEyKTogSGV4ID0+IHtcbiAgY29uc3QgbWF4bGVuID0gOFxuICBjb25zdCBtaW4gPSBNYXRoLnBvdygxNiwgTWF0aC5taW4obGVuLCBtYXhsZW4pIC0gMSlcbiAgY29uc3QgbWF4ID0gTWF0aC5wb3coMTYsIE1hdGgubWluKGxlbiwgbWF4bGVuKSkgLSAxXG4gIGNvbnN0IG4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluXG4gIGxldCByID0gbi50b1N0cmluZygxNilcbiAgd2hpbGUgKHIubGVuZ3RoIDwgbGVuKSB7XG4gICAgciA9IHIgKyBoZXhHZW4obGVuIC0gbWF4bGVuKVxuICB9XG4gIHJldHVybiByXG59XG4iLCJpbXBvcnQgeyBTY29wZSwgU2NvcGVNb2RlbCwgQ29udGFpbmVyUmVmIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NDT1BFID0gJ3N0YWNrJ1xuZXhwb3J0IGNvbnN0IFNDT1BFX0tFWSA9ICdmYWN0b3J5U3RhY2snXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIFtTQ09QRV9LRVldOiBTY29wZU1vZGVsXG4gIH1cbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIGlmICghd2luZG93W1NDT1BFX0tFWV0pIHtcbiAgICB3aW5kb3dbU0NPUEVfS0VZXSA9IHt9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyQ29udGFpbmVyID0gKHNjb3BlOiBTY29wZSwgcmVmOiBDb250YWluZXJSZWYpID0+IHtcbiAgd2luZG93W1NDT1BFX0tFWV1bc2NvcGVdID0gcmVmXG5cbiAgcmV0dXJuIHJlZlxufVxuXG5leHBvcnQgY29uc3QgdW5yZWdpc3RlckNvbnRhaW5lciA9IChzY29wZTogU2NvcGUpID0+IHtcbiAgZGVsZXRlIHdpbmRvd1tTQ09QRV9LRVldW3Njb3BlXVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyID0gKHNjb3BlPzogU2NvcGUpID0+XG4gIHdpbmRvd1tTQ09QRV9LRVldW3Njb3BlIHx8IERFRkFVTFRfU0NPUEVdXG4iLCJpbXBvcnQgUmVhY3QsIHtcbiAgdXNlUmVmLFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlLFxuICBmb3J3YXJkUmVmLFxuICB1c2VTdGF0ZSxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VDYWxsYmFjayxcbn0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7XG4gIGhleEdlbixcbiAgSGV4LFxuICByZWdpc3RlckNvbnRhaW5lcixcbiAgdW5yZWdpc3RlckNvbnRhaW5lcixcbiAgREVGQVVMVF9TQ09QRSxcbn0gZnJvbSAnLi91dGlscydcblxuaW1wb3J0IHtcbiAgQ29udGFpbmVyUmVmLFxuICBDb250YWluZXJQcm9wcyxcbiAgSW5zdGFuY2UsXG4gIEluc3RhbmNlSWQsXG4gIEluc3RhbmNlQ3JlYXRvcixcbiAgSW5zdGFuY2VPcHRpb25zLFxufSBmcm9tICcuL3R5cGVzJ1xuXG5jb25zdCBJbnN0YW5jZUNvbnRhaW5lcjogUmVhY3QuRm9yd2FyZFJlZlJlbmRlckZ1bmN0aW9uPFxuICBDb250YWluZXJSZWYsXG4gIENvbnRhaW5lclByb3BzXG4+ID0gKHByb3BzLCByZWYpID0+IHtcbiAgY29uc3QgeyBzY29wZSA9IERFRkFVTFRfU0NPUEUgfSA9IHByb3BzIHx8IHt9XG5cbiAgY29uc3QgcHJvcHNSZWYgPSB1c2VSZWYocHJvcHMpXG5cbiAgY29uc3QgW2luc3RhbmNlcywgc2V0SW5zdGFuY2VzXSA9IHVzZVN0YXRlPHsgW2tleTogc3RyaW5nXTogSW5zdGFuY2UgfT4oe30pXG4gIGNvbnN0IFtoYXNoU3RhY2ssIHNldEhhc2hTdGFja10gPSB1c2VTdGF0ZTxIZXhbXT4oW10pXG5cbiAgY29uc3QgcmVzb2x2ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChoYXNoOiBJbnN0YW5jZUlkLCB2KSA9PiBpbnN0YW5jZXM/LltoYXNoXT8ucmVzb2x2ZSh2KSxcbiAgICBbaW5zdGFuY2VzXVxuICApXG4gIGNvbnN0IHJlc29sdmVBbGwgPSB1c2VDYWxsYmFjayhcbiAgICB2ID0+IE9iamVjdC52YWx1ZXMoaW5zdGFuY2VzKS5mb3JFYWNoKGkgPT4gaS5yZXNvbHZlKHYpKSxcbiAgICBbaW5zdGFuY2VzXVxuICApXG5cbiAgY29uc3QgcmVqZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKGhhc2g6IEluc3RhbmNlSWQsIHIpID0+IGluc3RhbmNlcz8uW2hhc2hdPy5yZWplY3QociksXG4gICAgW2luc3RhbmNlc11cbiAgKVxuICBjb25zdCByZWplY3RBbGwgPSB1c2VDYWxsYmFjayhcbiAgICByID0+IE9iamVjdC52YWx1ZXMoaW5zdGFuY2VzKS5mb3JFYWNoKGkgPT4gaS5yZWplY3QocikpLFxuICAgIFtpbnN0YW5jZXNdXG4gIClcbiAgY29uc3QgaGFzSW5zdGFuY2UgPSB1c2VDYWxsYmFjayhcbiAgICAoaGFzaDogSW5zdGFuY2VJZCkgPT4gISFoYXNoU3RhY2suZmluZChpZCA9PiBpZCA9PT0gaGFzaCksXG4gICAgW2hhc2hTdGFja11cbiAgKVxuICBjb25zdCBnZXRJbnN0YW5jZSA9IHVzZUNhbGxiYWNrKChoYXNoOiBJbnN0YW5jZUlkKSA9PiBpbnN0YW5jZXM/LltoYXNoXSwgW1xuICAgIGluc3RhbmNlcyxcbiAgXSlcblxuICBjb25zdCByZW1vdmUgPSAoaGFzaDogSW5zdGFuY2VJZCwgb3B0aW9uczogSW5zdGFuY2VPcHRpb25zKTogdm9pZCA9PiB7XG4gICAgc2V0SGFzaFN0YWNrKHN0YWNrID0+IHN0YWNrLmZpbHRlcihzID0+IHMgIT09IGhhc2gpKVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBzZXRJbnN0YW5jZXMoaW5zdGFuY2VzID0+IHtcbiAgICAgICAgY29uc3QgeyBbaGFzaF06IF8sIC4uLm9taXRIYXNoIH0gPSBpbnN0YW5jZXNcblxuICAgICAgICByZXR1cm4gb21pdEhhc2hcbiAgICAgIH0pXG4gICAgfSwgb3B0aW9ucz8uZXhpdFRpbWVvdXQpXG5cbiAgICBwcm9wcy5vblJlbW92ZT8uKGhhc2gpXG4gIH1cblxuICBjb25zdCBjcmVhdGU6IEluc3RhbmNlQ3JlYXRvciA9IChDb21wb25lbnQsIG9wdGlvbnMgPSB7fSwgaW5zdGFuY2VQcm9wcykgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGNvbnN0IGhhc2ggPSBpbnN0YW5jZVByb3BzPy5pbnN0YW5jZUlkIHx8IGhleEdlbigpXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZW50ZXJUaW1lb3V0LFxuICAgICAgICBleGl0VGltZW91dCxcbiAgICAgICAgaXNBcHBlbmRJbnRhbmNlcyxcbiAgICAgICAgb25SZXNvbHZlLFxuICAgICAgICBvblJlamVjdCxcbiAgICAgIH0gPSBwcm9wc1JlZi5jdXJyZW50XG5cbiAgICAgIGNvbnN0IGluc3RhbmNlT3B0aW9ucyA9IHtcbiAgICAgICAgZW50ZXJUaW1lb3V0LFxuICAgICAgICBleGl0VGltZW91dCxcbiAgICAgICAgaW5zdGFuY2VJZDogaGFzaCxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zdGFuY2U6IEluc3RhbmNlID0ge1xuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIHByb3BzOiB7IC4uLm9wdGlvbnMsIC4uLmluc3RhbmNlUHJvcHMgfSxcbiAgICAgICAgcmVzb2x2ZTogdiA9PiB7XG4gICAgICAgICAgcmVtb3ZlUmVmLmN1cnJlbnQoaGFzaCwgaW5zdGFuY2VPcHRpb25zKVxuICAgICAgICAgIHJlcyh2KVxuICAgICAgICAgIG9uUmVzb2x2ZT8uKHYsIGhhc2gpXG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdDogciA9PiB7XG4gICAgICAgICAgcmVtb3ZlUmVmLmN1cnJlbnQoaGFzaCwgaW5zdGFuY2VPcHRpb25zKVxuICAgICAgICAgIHJlaihyKVxuICAgICAgICAgIG9uUmVqZWN0Py4ociwgaGFzaClcbiAgICAgICAgfSxcbiAgICAgICAgLi4uaW5zdGFuY2VPcHRpb25zLFxuICAgICAgfVxuXG4gICAgICBzZXRJbnN0YW5jZXMoaW5zdGFuY2VzID0+XG4gICAgICAgIGlzQXBwZW5kSW50YW5jZXNcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uaW5zdGFuY2VzLFxuICAgICAgICAgICAgICBbaGFzaF06IGluc3RhbmNlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBbaGFzaF06IGluc3RhbmNlLFxuICAgICAgICAgICAgICAuLi5pbnN0YW5jZXMsXG4gICAgICAgICAgICB9XG4gICAgICApXG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRIYXNoU3RhY2soc3RhY2sgPT4gWy4uLnN0YWNrLCBoYXNoXSlcbiAgICAgICAgcHJvcHNSZWYuY3VycmVudC5vbk9wZW4/LihoYXNoLCBpbnN0YW5jZSlcbiAgICAgIH0sIGluc3RhbmNlT3B0aW9ucy5lbnRlclRpbWVvdXQpXG4gICAgfSlcblxuICBjb25zdCByZW1vdmVSZWYgPSB1c2VSZWYocmVtb3ZlKVxuICBjb25zdCBjcmVhdGVSZWYgPSB1c2VSZWYoY3JlYXRlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcHJvcHNSZWYuY3VycmVudCA9IHByb3BzXG4gICAgcmVtb3ZlUmVmLmN1cnJlbnQgPSByZW1vdmVcbiAgICBjcmVhdGVSZWYuY3VycmVudCA9IGNyZWF0ZVxuICB9KVxuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgIGNyZWF0ZTogY3JlYXRlUmVmLmN1cnJlbnQsXG4gICAgcmVzb2x2ZSxcbiAgICByZWplY3QsXG4gICAgcmVzb2x2ZUFsbCxcbiAgICByZWplY3RBbGwsXG4gICAgaGFzSW5zdGFuY2UsXG4gICAgZ2V0SW5zdGFuY2UsXG4gIH0pKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmVnaXN0ZXJDb250YWluZXIoc2NvcGUsIHtcbiAgICAgIGNyZWF0ZTogY3JlYXRlUmVmLmN1cnJlbnQsXG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgICAgcmVzb2x2ZUFsbCxcbiAgICAgIHJlamVjdEFsbCxcbiAgICAgIGhhc0luc3RhbmNlLFxuICAgICAgZ2V0SW5zdGFuY2UsXG4gICAgfSlcblxuICAgIHJldHVybiAoKSA9PiB1bnJlZ2lzdGVyQ29udGFpbmVyKHNjb3BlKVxuICB9LCBbc2NvcGVdKVxuXG4gIGNvbnN0IG1hcEtleXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5zdGFuY2VzKVxuXG4gICAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCB7IENvbXBvbmVudCwgcHJvcHMsIHJlc29sdmUsIHJlamVjdCB9ID0gaW5zdGFuY2VzW2tleV1cblxuICAgICAgY29uc3QgaXNPcGVuID0gISFoYXNoU3RhY2suZmluZChoID0+IGggPT09IGtleSlcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPENvbXBvbmVudFxuICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICBpc09wZW49e2lzT3Blbn1cbiAgICAgICAgICBvblJlamVjdD17cmVqZWN0fVxuICAgICAgICAgIG9uUmVzb2x2ZT17cmVzb2x2ZX1cbiAgICAgICAgICAvKiogQGRlcHJlY2F0ZWQgKiovXG4gICAgICAgICAgY2xvc2U9e3Jlc29sdmV9XG4gICAgICAgICAgLyoqIEBkZXByZWNhdGVkICoqL1xuICAgICAgICAgIG9wZW49e2lzT3Blbn1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICB9KVxuICB9LCBbaW5zdGFuY2VzLCBoYXNoU3RhY2tdKVxuXG4gIHJldHVybiA8PnttYXBLZXlzfTwvPlxufVxuXG5leHBvcnQgY29uc3QgQ29udGFpbmVyID0gZm9yd2FyZFJlZihJbnN0YW5jZUNvbnRhaW5lcilcblxuQ29udGFpbmVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgZXhpdFRpbWVvdXQ6IDUwMCxcbiAgZW50ZXJUaW1lb3V0OiA1MCxcbn1cbiIsImltcG9ydCB7IGdldENvbnRhaW5lciB9IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgeyBDcmVhdGVJbnN0YW5jZSB9IGZyb20gJy4vdHlwZXMnXG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZU1vZGFsOiBDcmVhdGVJbnN0YW5jZSA9IChDb21wb25lbnQsIG9wdGlvbnMpID0+IHByb3BzID0+XG4gIGdldENvbnRhaW5lcihvcHRpb25zPy5zY29wZSkuY3JlYXRlKENvbXBvbmVudCwgb3B0aW9ucywgcHJvcHMpXG5cbmV4cG9ydCBjb25zdCBjcmVhdGU6IENyZWF0ZUluc3RhbmNlID0gKENvbXBvbmVudCwgb3B0aW9ucykgPT4gcHJvcHMgPT5cbiAgZ2V0Q29udGFpbmVyKG9wdGlvbnM/LnNjb3BlKS5jcmVhdGUoQ29tcG9uZW50LCBvcHRpb25zLCBwcm9wcylcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRWEsTUFBTSxHQUFHLFVBQUMsR0FBZ0I7SUFBaEIsb0JBQUEsRUFBQSxRQUFnQjtJQUNyQyxJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDaEIsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FB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