@sumaris-net/ngx-components 18.23.71 → 18.24.0

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.
@@ -862,30 +862,39 @@ export function deepMergeSkipUndefined(target = {}, ...sources) {
862
862
  * @return {unknown} The updated target object after merging the source objects, excluding undefined properties.
863
863
  */
864
864
  function _safeDeepMergeSkipUndefined(target, sources, visited) {
865
- if (isEmptyArray(sources))
865
+ if (!sources.length) {
866
866
  return target;
867
- if (!target)
867
+ }
868
+ // Si target est falsy, on prend le premier source valide
869
+ if (!target || typeof target !== 'object' || Array.isArray(target)) {
868
870
  return _safeDeepMergeSkipUndefined(sources[0], sources.slice(1), visited);
869
- return sources.reduce((acc, source) => {
870
- if (!source || typeof source !== 'object' || Array.isArray(source))
871
- return acc;
872
- // Protection against infinite loop
873
- if (visited.has(source))
874
- return acc;
871
+ }
872
+ for (const source of sources) {
873
+ if (!source || typeof source !== 'object' || Array.isArray(source)) {
874
+ continue;
875
+ }
876
+ // Skip if already visited
877
+ if (visited.has(source)) {
878
+ continue;
879
+ }
875
880
  visited.add(source);
876
881
  for (const [key, value] of Object.entries(source)) {
877
882
  if (value === undefined) {
878
- continue; // Skip undefined
883
+ continue;
879
884
  }
880
- if (value && typeof value === 'object' && !Array.isArray(value) && !visited.has(value)) {
881
- // Recursive merge for objects (excluding null, arrays or already visited)
882
- acc[key] = _safeDeepMergeSkipUndefined(acc[key] || {}, value, visited);
885
+ if (value &&
886
+ typeof value === 'object' &&
887
+ !Array.isArray(value) &&
888
+ !visited.has(value)) {
889
+ // Merge récursif
890
+ target[key] = _safeDeepMergeSkipUndefined(target[key] ?? {}, [value], visited);
883
891
  }
884
892
  else {
885
- acc[key] = value;
893
+ // Primitive, null, array, etc. → replace
894
+ target[key] = value;
886
895
  }
887
896
  }
888
- return acc;
889
- }, target);
897
+ }
898
+ return target;
890
899
  }
891
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxhQUFhLE1BQU0sT0FBTyxDQUFDO0FBRXZDLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFM0MsTUFBTSxVQUFVLEtBQUssQ0FBSSxHQUF5QjtJQUNoRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQztBQUMzQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLFlBQVksQ0FBSSxHQUF5QjtJQUN2RCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUNELE1BQU0sVUFBVSxRQUFRLENBQUksR0FBeUI7SUFDbkQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUM7QUFDM0MsQ0FBQztBQUNELE1BQU0sVUFBVSxlQUFlLENBQUksR0FBeUI7SUFDMUQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzdGLENBQUM7QUFDRCxNQUFNLFVBQVUsYUFBYSxDQUFJLEdBQXlCO0lBQ3hELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFH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Q04sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLE1BQVcsQ0FBQyxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjbG9uZUltcG9ydGVkIGZyb20gJ2Nsb25lJztcbmltcG9ydCB7IEtleXNFbnVtLCBLZXlWYWx1ZVR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfSk9JTl9QUk9QRVJUSUVTX1NFUEFSQVRPUiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFJlZ0V4cFV0aWxzIH0gZnJvbSAnLi9yZWdleHBzJztcbmltcG9ydCB7IHVud3JhcEVTTW9kdWxlIH0gZnJvbSAnLi9tb2R1bGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmlsPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05pbE9yQmxhbms8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyAmJiBvYmoudHJpbSgpID09PSAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWw8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsT3JCbGFuazxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgKHR5cGVvZiBvYmogIT09ICdzdHJpbmcnIHx8IG9iai50cmltKCkgIT09ICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbE9yTmFOPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiAodHlwZW9mIG9iaiAhPT0gJ251bWJlcicgfHwgIWlzTmFOKG9iaikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmlsT3JOYU48VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyAmJiBpc05hTihvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdEVtcHR5QXJyYXk8VD4ob2JqOiBUW10gfCByZWFkb25seSBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgb2JqLmxlbmd0aCA+IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RBcnJheVZhbHVlPFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KG9iaikgPyBvYmpbMF0gOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gbGFzdEFycmF5VmFsdWU8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc05vdEVtcHR5QXJyYXkob2JqKSA/IG9ialtvYmoubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eUFycmF5PFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICFvYmoubGVuZ3RoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5UmVzaXplPFQ+KGFycmF5OiBUW10gfCBudWxsIHwgdW5kZWZpbmVkLCBzaXplOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IFQpOiBUW10ge1xuICBpZiAoc2l6ZSA8IDApIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50ICdzaXplJyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXCIpO1xuICBpZiAoIWFycmF5KSByZXR1cm4gbmV3QXJyYXkoc2l6ZSwgZGVmYXVsdFZhbHVlKTtcblxuICAvLyBSZWR1Y2Ugc2l6ZVxuICBpZiAoYXJyYXkubGVuZ3RoID4gc2l6ZSkge1xuICAgIHJldHVybiBhcnJheS5zbGljZSgwLCBzaXplKTtcbiAgfVxuICAvLyBJbmNyZWFzZSBzaXplXG4gIGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA8IHNpemUpIHtcbiAgICByZXR1cm4gWy4uLmFycmF5LCAuLi5uZXdBcnJheShzaXplIC0gYXJyYXkubGVuZ3RoLCBkZWZhdWx0VmFsdWUpXTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBuZXdBcnJheTxUPihzaXplOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IFQpOiBUW10ge1xuICBpZiAoc2l6ZSA8IDApIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50ICdzaXplJyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXCIpO1xuICByZXR1cm4gbmV3IEFycmF5KHNpemUpLmZpbGwoZGVmYXVsdFZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbEJvb2xlYW4ob2JqOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogb2JqIGlzIGJvb2xlYW4ge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHx8IGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsU3RyaW5nKG9iajogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IG9iaiBpcyBzdHJpbmcge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgfHwgZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWxPYmplY3Qob2JqOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogb2JqIGlzIG9iamVjdCB7XG4gIHJldHVybiAob2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB8fCBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JsYW5rU3RyaW5nKG9iajogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IG9iaiBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgJiYgb2JqLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gbm90TmlsT3JEZWZhdWx0PFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogVCk6IFQge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gb2JqIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5U2l6ZTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gKGlzTm90RW1wdHlBcnJheShvYmopICYmIG9iai5sZW5ndGgpIHx8IDA7XG59XG5cbi8qKlxuICogUmVtb3ZlIGR1cGxpY2F0ZWQgdmFsdWUsIGluIGFycmF5LiBXaWxsIGNvbXB1dGUgYSB1bmlxdWUga2V5IChmcm9tIGdpdmVuIHByb3BlcnRpZXMsIG9yIGdpdmVuIGZ1bmN0aW9uKS5cbiAqIElmIHByb3BlcnRpZXNPcktleUZuIGlzIG5pbCBvciB1bmRlZmluZWQsIHdpbGwgdXNlIGFsbCBvYmplY3QgcHJvcGVydGllc1xuICpcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzT3JLZXlGblxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlEaXN0aW5jdDxUID0gYW55Pih2YWx1ZXM6IFRbXSwgcHJvcGVydGllc09yS2V5Rm4/OiBzdHJpbmcgfCBzdHJpbmdbXSB8ICgob2JqOiBUKSA9PiBzdHJpbmcpKTogVFtdIHtcbiAgaWYgKGlzRW1wdHlBcnJheSh2YWx1ZXMpKSByZXR1cm4gdmFsdWVzO1xuICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICBjb25zdCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSA9ICghcHJvcGVydGllc09yS2V5Rm4gJiYgZmlyc3RWYWx1ZSAmJiB0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZmlyc3RWYWx1ZSkgJiYgT2JqZWN0LmtleXMoZmlyc3RWYWx1ZSkpIHx8IChBcnJheS5pc0FycmF5KHByb3BlcnRpZXNPcktleUZuKSAmJiBwcm9wZXJ0aWVzT3JLZXlGbik7XG4gIGNvbnN0IGdldEtleTogKG9iajogVCkgPT4gc3RyaW5nID1cbiAgICAodHlwZW9mIHByb3BlcnRpZXNPcktleUZuID09PSAnZnVuY3Rpb24nICYmIHByb3BlcnRpZXNPcktleUZuKSB8fFxuICAgICh0eXBlb2YgcHJvcGVydGllc09yS2V5Rm4gPT09ICdzdHJpbmcnICYmICgob2JqKSA9PiBnZXRQcm9wZXJ0eUJ5UGF0aEFzU3RyaW5nKG9iaiwgcHJvcGVydGllc09yS2V5Rm4pKSkgfHxcbiAgICAoaXNFbXB0eUFycmF5KHByb3BlcnRpZXMpICYmICgob2JqKSA9PiBvYmo/LnRvU3RyaW5nKCkpKSB8fFxuICAgICgob2JqKSA9PiBqb2luUHJvcGVydGllc1BhdGgob2JqLCBwcm9wZXJ0aWVzLCB7IHNlcGFyYXRvcjogJ3wnLCBvbWl0RW1wdHlTdHJpbmdzOiBmYWxzZSB9KSk7XG4gIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKChyZXMsIGl0ZW0pID0+IHtcbiAgICBjb25zdCB1bmlxdWVLZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgaWYgKGV4aXN0aW5nSWRzLmhhcyh1bmlxdWVLZXkpKSByZXR1cm4gcmVzOyAvLyBTa2lwIGlmIGR1cGxpY2F0ZVxuICAgIGV4aXN0aW5nSWRzLmFkZCh1bmlxdWVLZXkpO1xuICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICB9LCBbXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbElmVW5kZWZpbmVkPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBUIHwgbnVsbCB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCA/IG51bGwgOiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbElmTmlsT3JCbGFuazxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IG51bGwge1xuICByZXR1cm4gaXNOaWxPckJsYW5rKG9iaikgPyBudWxsIDogb2JqO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuZGVmaW5lZElmTnVsbDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBvYmogPT09IG51bGwgPyB1bmRlZmluZWQgOiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJpbUVtcHR5VG9OdWxsPFQ+KHN0cjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IChzdHIgJiYgc3RyLnRyaW0oKSkgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLmxlbmd0aCAmJiB2YWx1ZSkgfHwgbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4ob2JqOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gKG9iaiAhPT0gJ2ZhbHNlJyA/ICEhb2JqIDogZmFsc2UpIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKG9iajogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZywgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGlzTm90TmlsT3JOYU4ob2JqKSA/ICtvYmogOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9GbG9hdChvYmo6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZT86IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gcGFyc2VGbG9hdChvYmopIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvSW50KG9iajogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgPyBwYXJzZUludChvYmosIDApIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTm90TmlsPFQgPSBhbnk+KG9iajogVCwgZGVmYXVsdFZhbHVlPzogVCk6IGFueSB8IG51bGwge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gb2JqIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXk8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkLCBwcm9wZXJ0eT86IHN0cmluZyk6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFbXB0eUFycmF5KG9iaikpIHJldHVybiBvYmo7XG4gIGlmIChwcm9wZXJ0eSkge1xuICAgIHJldHVybiBvYmouZmlsdGVyKChpdGVtLCBpLCBhcnJheSkgPT4gYXJyYXkuZmluZEluZGV4KCh0KSA9PiB0ICYmIGl0ZW0gJiYgdFtwcm9wZXJ0eV0gPT09IGl0ZW1bcHJvcGVydHldKSA9PT0gaSk7XG4gIH1cbiAgcmV0dXJuIG9iai5maWx0ZXIoKGl0ZW0sIGksIGFycmF5KSA9PiBhcnJheS5maW5kSW5kZXgoKHQpID0+IHQgJiYgaXRlbSAmJiB0ID09PSBpdGVtKSA9PT0gaSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydHNXaXRoVXBwZXJDYXNlKGlucHV0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnB1dD8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKHNlYXJjaCkgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIFJlZ2V4cHMubWF0Y2hVcHBlckNhc2UgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgbWF0Y2hVcHBlckNhc2UgPSBSZWdFeHBVdGlscy5tYXRjaFVwcGVyQ2FzZTtcblxuLyoqXG4gKiBSZW1vdmUgdHJhaWxpbmcgc2xhc2ggaWYgYW55LiBFeGFtcGxlcyA6XG4gKiAtICcvdGVzdC8nIC0+ICcvdGVzdCdcbiAqIC0gJy8nIC0+IHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9UcmFpbGluZ1NsYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gJy8nKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAocGF0aC50cmltKCkubGFzdEluZGV4T2YoJy8nKSA9PT0gcGF0aC5sZW5ndGggLSAxKSByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTtcbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlQWxsKHZhbHVlOiBzdHJpbmcsIHNlYXJjaFN0cmluZzogYW55LCByZXBsYWNlbWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHdoaWxlICh2YWx1ZSAmJiB2YWx1ZS5pbmRleE9mKHNlYXJjaFN0cmluZykgIT09IC0xKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHNlYXJjaFN0cmluZywgcmVwbGFjZW1lbnQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbmQodmFsdWU6IHN0cmluZywgZW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWU/LmVuZHNXaXRoKGVuZCB8fCAnJykgPyB2YWx1ZS5zdWJzdHIoMCwgdmFsdWUubGVuZ3RoIC0gZW5kLmxlbmd0aCkgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhc2UgY2hhbmdlIGJ5IGFuIHVuZGVyc2NvcmUgKC5lLmcgJ215U3RyaW5nJyBiZWNvbWVzICdteV9zdHJpbmcnKVxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlQ2FzZVRvVW5kZXJzY29yZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzTmlsT3JCbGFuayh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMV8kMicpLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogUmVwbGFjZSB1bmRlcnNjb3JlIGJ5IGEgY2hhbmdlIGNhc2UgKC5lLmcgJ01ZX1NUUklORycgYmVjb21lcyAnTXlTdHJpbmcnKVxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5kZXJzY29yZVRvQ2hhbmdlQ2FzZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzTmlsT3JCbGFuayh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAuc3BsaXQoJ18nKVxuICAgIC5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKVxuICAgIC5tYXAoKHN0ciwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IHN0ciA6IGNhcGl0YWxpemVGaXJzdExldHRlcihzdHIpKSlcbiAgICAuam9pbignJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEaWFjcml0aWNzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0Lm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VnZ2VzdEZyb21TdHJpbmdBcnJheSh2YWx1ZXM6IHN0cmluZ1tdLCBzZWFyY2hUZXh0OiBhbnksIG9wdHM/OiB7IGFueVNlYXJjaD86IGJvb2xlYW4gfSk6IHN0cmluZ1tdIHtcbiAgc2VhcmNoVGV4dCA9ICh0eXBlb2Ygc2VhcmNoVGV4dCA9PT0gJ3N0cmluZycgJiYgc2VhcmNoVGV4dCAhPT0gJyonICYmIHNlYXJjaFRleHQpIHx8IHVuZGVmaW5lZDtcbiAgbGV0IGNsZWFuU2VhcmNoVGV4dCA9IFJlZ0V4cFV0aWxzLmNsZWFuU2VhcmNoVGV4dChzZWFyY2hUZXh0IGFzIHN0cmluZyk7XG4gIGlmICghY2xlYW5TZWFyY2hUZXh0Py5sZW5ndGgpIHJldHVybiB2YWx1ZXM7XG5cbiAgLy8gSWYgd2lsZGNhcmQsIHNlYXJjaCB1c2luZyByZWdleHBcbiAgaWYgKG9wdHM/LmFueVNlYXJjaCB8fCBSZWdFeHBVdGlscy5oYXNXaWxkY2FyZENoYXJhY3RlcihjbGVhblNlYXJjaFRleHQpKSB7XG4gICAgY29uc3QgcmVnZXhwID0gUmVnRXhwVXRpbHMuY29tcGlsZVNlYXJjaFJlZ2V4cChjbGVhblNlYXJjaFRleHQsICdnaScpO1xuICAgIHJldHVybiB2YWx1ZXMuZmlsdGVyKCh2KSA9PiBSZWdFeHBVdGlscy5tYXRjaCh2LCByZWdleHApKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBubyB3aWxkY2FyZCwgc2VhcmNoIHVzaW5nIHN0YXJ0c1dpdGhcbiAgICBjbGVhblNlYXJjaFRleHQgPSBjbGVhblNlYXJjaFRleHQudG9VcHBlckNhc2UoKTtcbiAgICByZXR1cm4gdmFsdWVzLmZpbHRlcigodikgPT4gc3RhcnRzV2l0aFVwcGVyQ2FzZSh2LCBjbGVhblNlYXJjaFRleHQpKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpvaW5PcHRpb25zIHtcbiAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICBvbWl0RW1wdHlTdHJpbmdzPzogYm9vbGVhbjtcbiAgdHJpbVJlc3VsdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEpvaW5zIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0IGludG8gYSBzaW5nbGUgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmllZCBzZXBhcmF0b3JcbiAqIGFuZCBvcHRpb25hbCBjb25maWd1cmF0aW9ucyBmb3IgdHJpbW1pbmcgYW5kIG9taXR0aW5nIGVtcHR5IHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtUfSBvYmogVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGJlIGpvaW5lZC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BlcnRpZXMgQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5IHBhdGhzIHRvIGJlIGFjY2Vzc2VkIGFuZCBqb2luZWQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IEpvaW5PcHRpb25zfSBbc2VwYXJhdG9yT3JPcHRzXSBBIHN0cmluZyBzZXBhcmF0b3Igb3IgYW4gb2JqZWN0IGRlZmluaW5nIGFkZGl0aW9uYWwgb3B0aW9uc1xuICogZm9yIGpvaW5pbmcsIHN1Y2ggYXMgdGhlIHNlcGFyYXRvciwgd2hldGhlciB0byB0cmltIHJlc3VsdHMsIGFuZCB3aGV0aGVyIHRvIG9taXQgZW1wdHkgc3RyaW5ncy5cbiAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQSBzdHJpbmcgZm9ybWVkIGJ5IGpvaW5pbmcgdGhlIHNlbGVjdGVkIHByb3BlcnR5IHZhbHVlcywgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkXG4gKiB2YWx1ZXMgYXJlIGZvdW5kIGFmdGVyIHByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luUHJvcGVydGllc1BhdGg8VCA9IGFueT4ob2JqOiBULCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgc2VwYXJhdG9yT3JPcHRzPzogc3RyaW5nIHwgSm9pbk9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIW9iaikgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZGlzcGxheSBhbiB1bmRlZmluZWQgZW50aXR5LicpO1xuICBpZiAoaXNFbXB0eUFycmF5KHByb3BlcnRpZXMpKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG9yIGVtcHR5ICdwcm9wZXJ0aWVzJyBhcmd1bWVudFwiKTtcblxuICBjb25zdCBvcHRzOiBKb2luT3B0aW9ucyA9IHR5cGVvZiBzZXBhcmF0b3JPck9wdHMgPT09ICdzdHJpbmcnID8geyBzZXBhcmF0b3I6IHNlcGFyYXRvck9yT3B0cyB9IDogc2VwYXJhdG9yT3JPcHRzIHx8IHt9O1xuICBjb25zdCBvbWl0RW1wdHlTdHJpbmdzID0gb3B0cy5vbWl0RW1wdHlTdHJpbmdzID8/IHRydWU7XG4gIGNvbnN0IHRyaW1SZXN1bHRzID0gb3B0cy50cmltUmVzdWx0cyA/PyB0cnVlO1xuICBjb25zdCBzZXBhcmF0b3IgPSBvcHRzLnNlcGFyYXRvciA/PyBERUZBVUxUX0pPSU5fUFJPUEVSVElFU19TRVBBUkFUT1I7XG5cbiAgbGV0IHZhbHVlcyA9IHByb3BlcnRpZXMubWFwKChwYXRoKSA9PiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGgpKTtcblxuICBpZiAodHJpbVJlc3VsdHMpIHtcbiAgICB2YWx1ZXMgPSB2YWx1ZXMubWFwKCh2KSA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdi50cmltKCkgOiB2KSk7XG4gIH1cblxuICBpZiAob21pdEVtcHR5U3RyaW5ncykge1xuICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZXMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gKGlzTm90TmlsT3JCbGFuayh2YWx1ZSkgPyB2YWx1ZSA6ICcnKSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBKb2lucyB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGludG8gYSBzaW5nbGUgc3RyaW5nIHVzaW5nIGEgZ2l2ZW4gc2VwYXJhdG9yIG9yIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtUfSBvYmogVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGpvaW4uXG4gKiBAcGFyYW0ge0tbXX0ga2V5cyBBbiBhcnJheSBvZiBrZXlzIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydGllcyB0byByZXRyaWV2ZSBhbmQgam9pbi5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgSm9pbk9wdGlvbnN9IFtzZXBhcmF0b3JPck9wdHNdIEEgc3RyaW5nIHRvIHVzZSBhcyB0aGUgc2VwYXJhdG9yIG9yIGFuIG9wdGlvbnMgb2JqZWN0IHNwZWNpZnlpbmcgY29uZmlndXJhdGlvbiBmb3IgdGhlIGpvaW4gb3BlcmF0aW9uLlxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBqb2luZWQgcHJvcGVydHkgdmFsdWVzLCBvciB1bmRlZmluZWQgaWYgdGhlIG9iamVjdCBpcyBub3QgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luUHJvcGVydGllczxUID0gYW55LCBLIGV4dGVuZHMga2V5b2YgVCA9IGFueT4ob2JqOiBULCBrZXlzOiBLW10sIHNlcGFyYXRvck9yT3B0cz86IHN0cmluZyB8IEpvaW5PcHRpb25zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmopIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGRpc3BsYXkgYW4gdW5kZWZpbmVkIGVudGl0eS4nKTtcblxuICBjb25zdCBvcHRzOiBKb2luT3B0aW9ucyA9IHR5cGVvZiBzZXBhcmF0b3JPck9wdHMgPT09ICdzdHJpbmcnID8geyBzZXBhcmF0b3I6IHNlcGFyYXRvck9yT3B0cyB9IDogc2VwYXJhdG9yT3JPcHRzIHx8IHt9O1xuICBjb25zdCBvbWl0RW1wdHlTdHJpbmdzID0gb3B0cy5vbWl0RW1wdHlTdHJpbmdzID8/IHRydWU7XG4gIGNvbnN0IHRyaW1SZXN1bHRzID0gb3B0cy50cmltUmVzdWx0cyA/PyB0cnVlO1xuICBjb25zdCBzZXBhcmF0b3IgPSBvcHRzLnNlcGFyYXRvciA/PyBERUZBVUxUX0pPSU5fUFJPUEVSVElFU19TRVBBUkFUT1I7XG5cbiAgbGV0IHZhbHVlczogYW55W10gPSBrZXlzLm1hcCgoa2V5KSA9PiBnZXRQcm9wZXJ0eShvYmosIGtleSkpO1xuXG4gIGlmICh0cmltUmVzdWx0cykge1xuICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoKHYpID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2LnRyaW0oKSA6IHYpKTtcbiAgfVxuXG4gIGlmIChvbWl0RW1wdHlTdHJpbmdzKSB7XG4gICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcihpc05vdE5pbE9yQmxhbmspO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiAoaXNOb3ROaWxPckJsYW5rKHZhbHVlKSA/IHZhbHVlIDogJycpKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZXMuam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMuXG4gKlxuICogQ29tcGFyZXMgdHdvIHZhbHVlcyB1c2luZyB0aGUgSmF2YVNjcmlwdCBncmVhdGVyLXRoYW4gb3BlcmF0b3IuXG4gKiBXb3JrcyBmb3IgbnVtYmVycywgc3RyaW5ncywgZGF0ZXMsIGFuZCBhbnkgdHlwZXMgdGhhdCBwcm92aWRlXG4gKiBhIG1lYW5pbmdmdWwgYD5gIGNvbXBhcmlzb24uIFVzZSBmb3IgYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFR5cGUgb2YgdGhlIGNvbXBhcmVkIHZhbHVlcy5cbiAqIEBwYXJhbSBhIC0gTGVmdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBSaWdodCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMgMCBpZiBlcXVhbCwgLTEgaWYgYSA8IGIsIDEgaWYgYSA+IGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVmFsdWVzPFQ+KGE6IFQsIGI6IFQpOiBudW1iZXIge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gIHJldHVybiBhID4gYiA/IDEgOiAtMTtcbn1cblxuLyoqXG4gKiBSZXZlcnNlIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIChkZXNjZW5kaW5nIG9yZGVyKS5cbiAqXG4gKiBTYW1lIHNlbWFudGljcyBhcyB7QGxpbmsgY29tcGFyZVZhbHVlc30gYnV0IGludmVydGVkLCB0byBzb3J0XG4gKiBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFR5cGUgb2YgdGhlIGNvbXBhcmVkIHZhbHVlcy5cbiAqIEBwYXJhbSBhIC0gTGVmdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBSaWdodCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMgMCBpZiBlcXVhbCwgMSBpZiBhIDwgYiwgLTEgaWYgYSA+IGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVmFsdWVzRGVzYzxUPihhOiBULCBiOiBUKTogbnVtYmVyIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiAwO1xuICByZXR1cm4gYSA+IGIgPyAtMSA6IDE7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIGJhc2VkIG9uIGEgbmVzdGVkIHByb3BlcnR5IHBhdGguXG4gKlxuICogVXNlcyB7QGxpbmsgZ2V0UHJvcGVydHlCeVBhdGh9IHRvIGV4dHJhY3QgdmFsdWVzIGFuZCBjb21wYXJlcyB0aGVtXG4gKiBpbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUeXBlIG9mIGNvbXBhcmVkIG9iamVjdHMuXG4gKiBAcGFyYW0gcGF0aCAtIFByb3BlcnR5IHBhdGggb3IgYXJyYXkgcGF0aCAoZS5nLiBcImEuYlswXS5jXCIpLlxuICogQHBhcmFtIGRpcmVjdGlvbiAtIFNvcnQgZGlyZWN0aW9uLCAnYXNjJyBieSBkZWZhdWx0LlxuICogQHBhcmFtIG51bGxzRmlyc3RcbiAqIEByZXR1cm5zIEEgY29tcGFyYXRvciBjb21wYXRpYmxlIHdpdGggYEFycmF5LnByb3RvdHlwZS5zb3J0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5UGF0aENvbXBhcmF0b3I8VCA9IGFueT4oXG4gIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYycsXG4gIG51bGxzRmlyc3Q/OiBib29sZWFuXG4pOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyIHtcbiAgbnVsbHNGaXJzdCA9IG51bGxzRmlyc3QgPz8gZGlyZWN0aW9uID09ICdkZXNjJztcbiAgY29uc3QgY29tcGFyZUZuID0gZGlyZWN0aW9uID09PSAnYXNjJyA/IGNvbXBhcmVWYWx1ZXMgOiBjb21wYXJlVmFsdWVzRGVzYztcbiAgcmV0dXJuIChhOiBULCBiOiBUKSA9PiB7XG4gICAgY29uc3QgdmFsdWVBID0gZ2V0UHJvcGVydHlCeVBhdGgoYSwgcGF0aCk7XG4gICAgY29uc3QgdmFsdWVCID0gZ2V0UHJvcGVydHlCeVBhdGgoYiwgcGF0aCk7XG4gICAgaWYgKHZhbHVlQSA9PSBudWxsICYmIHZhbHVlQiA9PSBudWxsKSByZXR1cm4gMDtcbiAgICBpZiAodmFsdWVBID09IG51bGwpIHJldHVybiBudWxsc0ZpcnN0ID8gLTEgOiAxO1xuICAgIGlmICh2YWx1ZUIgPT0gbnVsbCkgcmV0dXJuIG51bGxzRmlyc3QgPyAxIDogLTE7XG4gICAgcmV0dXJuIGNvbXBhcmVGbih2YWx1ZUEsIHZhbHVlQik7XG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21wYXJhdG9yIGJhc2VkIG9uIGEgZGlyZWN0IHByb3BlcnR5IG9mIHRoZSBjb21wYXJlZCBvYmplY3RzLlxuICpcbiAqIEZhbGxzIGJhY2sgdG8gYGRlZmF1bHRWYWx1ZWAgd2hlbiB0aGUgcHJvcGVydHkgaXMgYHVuZGVmaW5lZGAgb24gYW4gaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUeXBlIG9mIGNvbXBhcmVkIG9iamVjdHMuXG4gKiBAdHlwZVBhcmFtIEsgLSBLZXkgb2YgdGhlIHByb3BlcnR5IGluIGBUYC5cbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFByb3BlcnR5IG5hbWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbiwgJ2FzYycgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSBudWxsc0ZpcnN0IC0gSWYgdHJ1ZSwgbmlsIHZhbHVlcyBhcmUgcGxhY2VkIGZpcnN0LCBlbHNlIGxhc3QuIEJ5IGRlZmF1bHQsICdmYWxzZScgaWYgZGlyZWN0aW9uPSdhc2MnLCAndHJ1ZScgaWYgZGlyZWN0aW9uPSdkZXNjJ1xuICogQHJldHVybnMgQSBjb21wYXJhdG9yIGNvbXBhdGlibGUgd2l0aCBgQXJyYXkucHJvdG90eXBlLnNvcnRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHlDb21wYXJhdG9yPFQgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55PihcbiAgcHJvcGVydHk6IEssXG4gIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJyxcbiAgbnVsbHNGaXJzdD86IGJvb2xlYW5cbik6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICBudWxsc0ZpcnN0ID0gbnVsbHNGaXJzdCA/PyBkaXJlY3Rpb24gPT09ICdkZXNjJztcbiAgY29uc3QgY29tcGFyZUZuID0gZGlyZWN0aW9uID09PSAnYXNjJyA/IGNvbXBhcmVWYWx1ZXMgOiBjb21wYXJlVmFsdWVzRGVzYztcbiAgcmV0dXJuIChhOiBULCBiOiBUKSA9PiB7XG4gICAgY29uc3QgdmFsdWVBID0gYVtwcm9wZXJ0eV07XG4gICAgY29uc3QgdmFsdWVCID0gYltwcm9wZXJ0eV07XG4gICAgaWYgKHZhbHVlQSA9PSBudWxsICYmIHZhbHVlQiA9PSBudWxsKSByZXR1cm4gMDtcbiAgICBpZiAodmFsdWVBID09IG51bGwpIHJldHVybiBudWxsc0ZpcnN0ID8gLTEgOiAxO1xuICAgIGlmICh2YWx1ZUIgPT0gbnVsbCkgcmV0dXJuIG51bGxzRmlyc3QgPyAxIDogLTE7XG4gICAgcmV0dXJuIGNvbXBhcmVGbih2YWx1ZUEsIHZhbHVlQik7XG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21wYXJhdG9yIHVzaW5nIG11bHRpcGxlIHByb3BlcnR5IHBhdGhzIGFzIHRpZS1icmVha2Vycy5cbiAqXG4gKiBFYWNoIGtleSBpbiBga2V5c2AgaXMgcmVzb2x2ZWQgdmlhIHtAbGluayBnZXRQcm9wZXJ0eUJ5UGF0aH0uIFRoZSBmaXJzdFxuICogbm9uLXplcm8gY29tcGFyaXNvbiByZXN1bHQgaXMgcmV0dXJuZWQuIElmIHByb3ZpZGVkLCBgZGVmYXVsdFZhbHVlc1tpXWBcbiAqIGlzIHVzZWQgd2hlbiBhIHZhbHVlIGF0IGBrZXlzW2ldYCBpcyB1bmRlZmluZWQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVHlwZSBvZiBjb21wYXJlZCBvYmplY3RzLlxuICogQHBhcmFtIGtleXMgLSBPcmRlcmVkIGxpc3Qgb2YgcHJvcGVydHkgcGF0aHMgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbiBhcHBsaWVkIHRvIGVhY2gga2V5LCAnYXNjJyBieSBkZWZhdWx0LlxuICogQHBhcmFtIG51bGxzRmlyc3QgLSBPcHRpb25hbFxuICogQHRocm93cyBFcnJvciB3aGVuIGBrZXlzYCBpcyBlbXB0eSBvciB3aGVuIGBkZWZhdWx0VmFsdWVzYCBsZW5ndGggaXMgaW52YWxpZC5cbiAqIEByZXR1cm5zIEEgY29tcGFyYXRvciBjb21wYXRpYmxlIHdpdGggYEFycmF5LnByb3RvdHlwZS5zb3J0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnRpZXNQYXRoQ29tcGFyYXRvcjxUID0gYW55PihrZXlzOiBzdHJpbmdbXSwgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnLCBudWxsc0ZpcnN0PzogYm9vbGVhbik6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICBpZiAoaXNFbXB0eUFycmF5KGtleXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHM6IG1pc3NpbmcgJ2tleXMnIG9yIGFycmF5ICdkZWZhdWx0VmFsdWVzJyBoYXMgYSBiYWQgbGVuZ3RoXCIpO1xuICB9XG4gIG51bGxzRmlyc3QgPSBudWxsc0ZpcnN0ID8/IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICBjb25zdCBjb21wYXJlRm4gPSBkaXJlY3Rpb24gPT09ICdhc2MnID8gY29tcGFyZVZhbHVlcyA6IGNvbXBhcmVWYWx1ZXNEZXNjO1xuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+XG4gICAga2V5c1xuICAgICAgLm1hcCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUEgPSBnZXRQcm9wZXJ0eUJ5UGF0aChhLCBrZXkpO1xuICAgICAgICBjb25zdCB2YWx1ZUIgPSBnZXRQcm9wZXJ0eUJ5UGF0aChiLCBrZXkpO1xuICAgICAgICBpZiAodmFsdWVBID09IG51bGwgJiYgdmFsdWVCID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAodmFsdWVBID09IG51bGwpIHJldHVybiBudWxsc0ZpcnN0ID8gLTEgOiAxO1xuICAgICAgICBpZiAodmFsdWVCID09IG51bGwpIHJldHVybiBudWxsc0ZpcnN0ID8gMSA6IC0xO1xuICAgICAgICByZXR1cm4gY29tcGFyZUZuKHZhbHVlQSwgdmFsdWVCKTtcbiAgICAgIH0pXG4gICAgICAvLyBTdG9wIGlmIG5vdCBlcXVhbHMsIG90aGVyd2lzZSBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGtleVxuICAgICAgLmZpbmQoKHJlcykgPT4gcmVzICE9PSAwKSB8fCAwO1xufVxuXG4vKipcbiAqIENvbXBvc2UgYSBjb21wYXJhdG9yIGZyb20gbXVsdGlwbGUgY29tcGFyYXRvcnMgKG11bHRpLWxldmVsIHNvcnQpLlxuICpcbiAqIEVhY2ggY29tcGFyYXRvciBpcyBhcHBsaWVkIHNlcXVlbnRpYWxseS4gVGhlIGZpcnN0IG5vbi16ZXJvIHJlc3VsdCBpc1xuICogcmV0dXJuZWQsIGFsbG93aW5nIHlvdSB0byBkZWZpbmUgcHJpbWFyeSwgc2Vjb25kYXJ5LCB0ZXJ0aWFyeSBjcml0ZXJpYSwgZXRjLlxuICogSWYgYWxsIGNvbXBhcmF0b3JzIHJldHVybiAwLCB0aGUgaXRlbXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUeXBlIG9mIHRoZSBjb21wYXJlZCBpdGVtcy5cbiAqIEBwYXJhbSBjb21wYXJhdG9ycyAtIExpc3Qgb2YgY29tcGFyYXRvciBmdW5jdGlvbnMgdG8gYXBwbHkgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGNvbXBhcmF0b3IgY29tcGF0aWJsZSB3aXRoIGBBcnJheS5wcm90b3R5cGUuc29ydGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlQ29tcGFyYXRvcnM8VD4oLi4uY29tcGFyYXRvcnM6IEFycmF5PChhOiBULCBiOiBUKSA9PiBudW1iZXI+KTogKGE6IFQsIGI6IFQpID0+IG51bWJlciB7XG4gIHJldHVybiAoYTogVCwgYjogVCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb21wYXJhdG9yc1xuICAgICAgICA/Lm1hcCgoY29tcGFyYXRvcikgPT4gY29tcGFyYXRvcihhLCBiKSlcbiAgICAgICAgLy8gU3RvcCBpZiBub3QgZXF1YWxzLCBvdGhlcndpc2UgY29udGludWUgd2l0aCB0aGUgbmV4dCBrZXlcbiAgICAgICAgLmZpbmQoKHJlcykgPT4gcmVzICE9PSAwKSB8fCAwXG4gICAgKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnQ8VD4oYXJyYXk6IFRbXSwgYXR0cmlidXRlPzogc3RyaW5nLCBvcHRzPzogSW50bC5Db2xsYXRvck9wdGlvbnMpOiBUW10ge1xuICBpZiAoaXNFbXB0eUFycmF5KGFycmF5KSkgcmV0dXJuIGFycmF5O1xuICBjb25zdCBjb21wYXJlRm46IChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyID0gb3B0cyA/IG5ldyBJbnRsLkNvbGxhdG9yKHVuZGVmaW5lZCwgb3B0cykuY29tcGFyZSA6ICh2MSwgdjIpID0+ICh2MSA9PT0gdjIgPyAwIDogdjEgPiB2MiA/IDEgOiAtMSk7XG4gIHJldHVybiBhcnJheVxuICAgIC5zbGljZSgpIC8vIGNvcHlcbiAgICAuc29ydChhdHRyaWJ1dGUgPyAoYSwgYikgPT4gY29tcGFyZUZuKGFbYXR0cmlidXRlXSwgYlthdHRyaWJ1dGVdKSA6IGNvbXBhcmVGbik7XG59XG5jb25zdCBJTlRFR0VSX1JFR0VYUCA9IC9eWy1dP1xcZCskLztcbmV4cG9ydCBmdW5jdGlvbiBpc0ludCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgSU5URUdFUl9SRUdFWFAudGVzdCh2YWx1ZSk7XG59XG5jb25zdCBOVU1CRVJfUkVHRVhQID0gL15bLV0/XFxkKyhcXC5cXGQrKT8kLztcbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgTlVNQkVSX1JFR0VYUC50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgTlVNQkVSX1JBTkdFX1JFR0VYUCA9IC9eKFxcZCstXFxkKyl8KFs+PD1dKlxcZCspJC87XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJSYW5nZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgTlVNQkVSX1JBTkdFX1JFR0VYUC50ZXN0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5QnlQYXRoKG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBpZiAoaXNOaWwob2JqKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgLy8gUGF0aCBpcyBhbiBhcnJheTogY29udmVydCBwYXRoIHRvIHN0cmluZ1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGguam9pbignLicpLCBkZWZhdWx0VmFsdWUpO1xuICB9XG4gIGlmIChpc05pbE9yQmxhbmsocGF0aCkpIHJldHVybiBvYmo7XG4gIGlmIChwYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEpIHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9bLl0/XFxbKFteXFxbXFxdXSopXShbLl0pPy8sICcuJDEkMicpO1xuICB9XG4gIGNvbnN0IGkgPSBwYXRoLmluZGV4T2YoJy4nKTtcbiAgLy8gU2ltcGxlIHByb3BlcnR5IHBhdGhcbiAgaWYgKGkgPT09IC0xKSB7XG4gICAgY29uc3QgcmVzID0gb2JqW3BhdGhdO1xuICAgIHJldHVybiBpc05vdE5pbChyZXMpIHx8IGlzTmlsKGRlZmF1bHRWYWx1ZSkgPyByZXMgOiBkZWZhdWx0VmFsdWU7XG4gIH1cbiAgLy8gQ29tcGxleCBwcm9wZXJ0eSBwYXRoXG4gIGNvbnN0IG9wdGlvbmFsID0gcGF0aC5jaGFyQXQoaSAtIDEpID09PSAnPyc7XG4gIGNvbnN0IGtleSA9IHBhdGguc3Vic3RyaW5nKDAsIG9wdGlvbmFsID8gaSAtIDEgOiBpKTtcbiAgaWYgKGlzTmlsKG9ialtrZXldKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBPYmplY3Qgb3IgQXJyYXlcbiAgICAvLyBSZWN1cnNpdmUgY2FsbFxuICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmpba2V5XSwgcGF0aC5zdWJzdHJpbmcoaSArIDEpKTtcbiAgfVxuICBpZiAob3B0aW9uYWwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9wZXJ0eSBwYXRoOiAnJHtrZXl9JyBpcyBub3QgYW4gdmFsaWQgb2JqZWN0LmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHk8VCA9IGFueSwgSyBleHRlbmRzIGtleW9mIFQgPSBhbnk+KG9iajogVCwga2V5OiBLKTogVFtLXSB7XG4gIGlmIChpc05pbChvYmopKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gb2JqW2tleV07IC8vIEluZmVycmVkIHR5cGUgaXMgVFtLXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHlCeVBhdGhBc1N0cmluZyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlcyA9IGdldFByb3BlcnR5QnlQYXRoKG9iaiwgcGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgcmV0dXJuIHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gcmVzIDogaXNOaWwocmVzKSA/IHJlcyA6ICcnICsgcmVzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBhbiBvYmplY3QncyBwcm9wZXJ0eSwgdXNpbmcgYSBwYXRoIChsaWtlICc8cHJvcGVydHlfMT4uPHN1Yl9wcm9wZXJ0eV8xPicpXG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuIHRoZSBnaXZlbiBvYmpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3BlcnR5QnlQYXRoPFQgPSBhbnk+KG9iajogVCwgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIHZhbHVlOiBhbnkpOiBUIHtcbiAgLy8gUGF0aCBpcyBhbiBhcnJheTogY29udmVydCBwYXRoIHRvIHN0cmluZ1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgIHJldHVybiBzZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGguam9pbignLicpLCB2YWx1ZSk7XG4gIH1cbiAgaWYgKGlzTmlsKG9iaikpIHJldHVybiBvYmo7IC8vIFNraXBcbiAgY29uc3QgaSA9IHBhdGguaW5kZXhPZignLicpO1xuICAvLyBTaW1wbGUgcHJvcGVydHkgcGF0aFxuICBpZiAoaSA9PT0gLTEpIHtcbiAgICBvYmpbcGF0aF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGNvbnN0IGtleSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpO1xuICBpZiAoaXNOaWwob2JqW2tleV0pKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob2JqW2tleV0gJiYgdHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBzZXRQcm9wZXJ0eUJ5UGF0aChvYmpba2V5XSwgcGF0aC5zdWJzdHJpbmcoaSArIDEpLCB2YWx1ZSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvcm0gcGF0aDogJyR7a2V5fScgaXMgbm90IGFuIHZhbGlkIG9iamVjdC5gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG1zIDw9IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2U8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+KTogdmFsdWUgaXMgUHJvbWlzZTxUPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWU/LlsndGhlbiddID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZT8uWydjYXRjaCddID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFJvdW5kcyBhIG51bWVyaWMgdmFsdWUgdG8gJ25iRGVjaW1hbCcgZGVjaW1hbCBwbGFjZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSByb3VuZGVkLiBDYW4gYmUgYSBudW1iZXIsIHVuZGVmaW5lZCwgb3IgbnVsbC5cbiAqIEBwYXJhbSBuYkRlY2ltYWwgdGhlIG51bWJlciBvZiBkZWNpbWFsIChkZWZhdWx0OiAyKVxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgcm91bmRlZCB2YWx1ZSB3aXRoIHR3byBkZWNpbWFsIHBsYWNlcyBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgYSB2YWxpZCBudW1iZXI7IG90aGVyd2lzZSwgcmV0dXJucyB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCwgbmJEZWNpbWFsPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlzTm90TmlsT3JOYU4oK3ZhbHVlKSkge1xuICAgIG5iRGVjaW1hbCA9IG5iRGVjaW1hbCA/PyAyO1xuICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucG93KDEwLCBuYkRlY2ltYWwpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCgrdmFsdWUgKyBOdW1iZXIuRVBTSUxPTikgKiBmYWN0b3IpIC8gZmFjdG9yO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsc09yTmlsKHZhbHVlMTogYW55LCB2YWx1ZTI6IGFueSkge1xuICByZXR1cm4gdmFsdWUxID09PSB2YWx1ZTIgfHwgKGlzTmlsKHZhbHVlMSkgJiYgaXNOaWwodmFsdWUyKSk7XG59XG5cbi8qKlxuICogcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcmV0dXJuIHRoZSByZW1vdmVkIGVsZW1lbnRzXG4gKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IG9uIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZFxuICogQHBhcmFtIHByZWRpY2F0ZSB0aGUgc2VsZWN0aW9uIHByZWRpY2F0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKTogVFtdIHtcbiAgbGV0IG5iUmVtb3ZlID0gMDtcbiAgcmV0dXJuIGFycmF5XG4gICAgLnNsaWNlKClcbiAgICAubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgIG5iUmVtb3ZlKys7IC8vIGdsaXRjaCBjb3VudGVyIHRvIGF2b2lkIGluZGV4IGdhcFxuICAgICAgICByZXR1cm4gYXJyYXkuc3BsaWNlKGluZGV4IC0gbmJSZW1vdmUgKyAxLCAxKVswXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pXG4gICAgLmZpbHRlcihpc05vdE5pbCk7XG59XG5cbi8qKlxuICogcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcmV0dXJuIHRoZSByZW1vdmVkIGVsZW1lbnRcbiAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgb24gd2hpY2ggdGhlIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkXG4gKiBAcGFyYW0gcHJlZGljYXRlIHRoZSBzZWxlY3Rpb24gcHJlZGljYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmU8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pOiBUIHtcbiAgcmV0dXJuIGFycmF5LnNsaWNlKCkuZmluZCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcGl0YWxpemVGaXJzdExldHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cmluZygxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmNhcGl0YWxpemVGaXJzdExldHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiB2YWx1ZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHZhbHVlLnN1YnN0cmluZygxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuVG9TdHJpbmcodmFsdWU6IGFueSwgb3B0czogeyB5ZXNMYWJlbDogc3RyaW5nOyBub0xhYmVsOiBzdHJpbmcgfSA9IHsgeWVzTGFiZWw6ICdDT01NT04uWUVTJywgbm9MYWJlbDogJ0NPTU1PTi5OTycgfSkge1xuICBpZiAoaXNOaWwodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09ICd0cnVlJyA/IG9wdHMueWVzTGFiZWwgOiBvcHRzLm5vTGFiZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5UHJvcGVydHk8VCwgTSBleHRlbmRzIEtleVZhbHVlVHlwZTxUPiA9IEtleVZhbHVlVHlwZTxUPj4oYXJyYXk6IFRbXSB8IHJlYWRvbmx5IFRbXSwgcHJvcGVydHlOYW1lOiBrZXlvZiBUIHwgc3RyaW5nKTogTSB7XG4gIHJldHVybiAoYXJyYXkgfHwgW10pLnJlZHVjZSgocmVzLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9ICh2YWx1ZSBhcyB1bmtub3duIGFzIGFueSk/Lltwcm9wZXJ0eU5hbWVdO1xuICAgIGlmIChpc05vdE5pbChrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9LCB7fSkgYXMgTTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QnlJZDxULCBNIGV4dGVuZHMgS2V5VmFsdWVUeXBlPFQ+ID0gS2V5VmFsdWVUeXBlPFQ+PihhcnJheTogVFtdIHwgcmVhZG9ubHkgVFtdKTogTSB7XG4gIHJldHVybiAoYXJyYXkgfHwgW10pLnJlZHVjZShcbiAgICAocmVzLCB2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdmFsdWU/LlsnaWQnXTtcbiAgICAgIGlmIChpc05vdE5pbChrZXkpKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG4gICAgPE0+e31cbiAgKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBhbiBhcnJheSwgaW50byBhIG1hcCBvZiBhcnJheSwgZ3JvdXAgYnkgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RCeVByb3BlcnR5PFQ+KHZhbHVlczogVFtdLCBwcm9wZXJ0eU5hbWU6IGtleW9mIFQsIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlcik6IEtleVZhbHVlVHlwZTxUW10+IHtcbiAgcmV0dXJuICh2YWx1ZXMgfHwgW10pLnJlZHVjZShcbiAgICAocmVzLCBpdGVtKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtPy5bcHJvcGVydHlOYW1lXSA/PyBkZWZhdWx0VmFsdWU7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzW2tleV0gPSByZXNba2V5XSB8fCBbXTtcbiAgICAgICAgcmVzW2tleV0ucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSxcbiAgICA8S2V5VmFsdWVUeXBlPFRbXT4+e31cbiAgKTtcbn1cblxuXG4vKipcbiAqIFNwbGl0IGFuIGFycmF5LCBpbnRvIGEgbWFwIG9mIGFycmF5LCBncm91cCBieSBwcm9wZXJ0eSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0QnlQcm9wZXJ0eVBhdGg8VD4odmFsdWVzOiBUW10sIHByb3BlcnR5UGF0aDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgZGVmYXVsdFZhbHVlPzogc3RyaW5nIHwgbnVtYmVyKTogS2V5VmFsdWVUeXBlPFRbXT4ge1xuICByZXR1cm4gKHZhbHVlcyB8fCBbXSkucmVkdWNlKFxuICAgIChyZXMsIGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGdldFByb3BlcnR5QnlQYXRoKGl0ZW0sIHByb3BlcnR5UGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyB8fCB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXNba2V5XSA9IHJlc1trZXldIHx8IFtdO1xuICAgICAgICByZXNba2V5XS5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LFxuICAgIDxLZXlWYWx1ZVR5cGU8VFtdPj57fVxuICApO1xufVxuXG5cbi8qKlxuICogU3BsaXQgYW4gYXJyYXkgaW50byBjaHVua3Mgd2l0aCBmaXhlZCBzaXplXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEFycmF5SW5DaHVua3M8VCA9IGFueT4odmFsdWU6IFRbXSwgY2h1bmtTaXplOiBudW1iZXIpOiBUW11bXSB7XG4gIGlmICghdmFsdWU/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICBpZiAoY2h1bmtTaXplID09PSAtMSkgcmV0dXJuIFt2YWx1ZV07IC8vIE9ubHkgb25lIHBhZ2VcbiAgaWYgKCFjaHVua1NpemUgfHwgaXNOYU4oY2h1bmtTaXplKSB8fCBjaHVua1NpemUgPCAxKSB7XG4gICAgdGhyb3cgJ1tzcGxpdEFycmF5SW5DaHVua3NdIE51bWJlciBvZiByb3cgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciAhJztcbiAgfVxuICBpZiAodmFsdWUubGVuZ3RoIDw9IGNodW5rU2l6ZSkge1xuICAgIHJldHVybiBbdmFsdWVdO1xuICB9XG4gIGxldCBsZW5ndGggPSBNYXRoLnJvdW5kKHZhbHVlLmxlbmd0aCAvIGNodW5rU2l6ZSArIDAuNSk7XG4gIGlmICh2YWx1ZS5sZW5ndGggPT09IChsZW5ndGggLSAxKSAqIGNodW5rU2l6ZSkge1xuICAgIGxlbmd0aCA9IGxlbmd0aCAtIDE7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFydCA9IGkgKiBjaHVua1NpemU7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4odmFsdWUubGVuZ3RoLCBzdGFydCArIGNodW5rU2l6ZSk7XG4gICAgcmVzdWx0W2ldID0gdmFsdWUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHR3byBvYmplY3RzIG9yIHR3byB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogVHdvIG9iamVjdHMgb3IgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAqXG4gKiAqIEJvdGggb2JqZWN0cyBvciB2YWx1ZXMgcGFzcyBgPT09YCBjb21wYXJpc29uLlxuICogKiBCb3RoIG9iamVjdHMgb3IgdmFsdWVzIGFyZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhbGwgb2YgdGhlaXIgcHJvcGVydGllcyBhcmUgZXF1YWwgYnlcbiAqICAgY29tcGFyaW5nIHRoZW0gd2l0aCBgZXF1YWxzYC5cbiAqXG4gKiBAcGFyYW0gbzEgT2JqZWN0IG9yIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gbzIgT2JqZWN0IG9yIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFyZ3VtZW50cyBhcmUgZXF1YWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMobzE6IGFueSwgbzI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAobzEgPT09IG8yKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG8xID09PSBudWxsIHx8IG8yID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChvMSAhPT0gbzEgJiYgbzIgIT09IG8yKSByZXR1cm4gdHJ1ZTsgLy8gTmFOID09PSBOYU5cbiAgY29uc3QgdDEgPSB0eXBlb2YgbzE7XG4gIGNvbnN0IHQyID0gdHlwZW9mIG8yO1xuICBsZXQgbGVuZ3RoOiBudW1iZXI7XG4gIGxldCBrZXk6IGFueTtcbiAgbGV0IGtleVNldDogYW55O1xuICBpZiAodDEgPT09IHQyICYmIHQxID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8xKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG8yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKChsZW5ndGggPSBvMS5sZW5ndGgpID09PSBvMi5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobzIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGtleVNldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgICBmb3IgKGtleSBpbiBvMSkge1xuICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGtleSBpbiBvMikge1xuICAgICAgICBpZiAoIShrZXkgaW4ga2V5U2V0KSAmJiB0eXBlb2YgbzJba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmNvbnN0IF9jbG9uZSA9IHVud3JhcEVTTW9kdWxlPHR5cGVvZiBjbG9uZUltcG9ydGVkPihjbG9uZUltcG9ydGVkKTtcblxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBCZWFucyB7XG4gIC8qKlxuICAgKiBEZWVwIGNsb25lLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B2b3JiL2Nsb25lXG4gICAqL1xuICBzdGF0aWMgY2xvbmUgPSBfY2xvbmU7XG5cbiAgLyoqXG4gICAqIENvcHkgYSBzb3VyY2Ugb2JqZWN0LCBieSBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBkYXRhVHlwZS5cbiAgICogSU1QT1JUQU5UOiBleHRyYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIE5PVCBpbiB0aGUgdGFyZ2V0Q2xhc3MgYXJlIE5PVCBjb3BpZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gY29weVxuICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGNsYXNzIHRvIHVzZSBhcyB0YXJnZXQgY2xhc3NcbiAgICogQHBhcmFtIGtleXMgVGhlIGtleXMgdG8gY29weS4gSWYgZW1wdHksIHdpbGwgY29weSBvbmx5IE5PVCBvcHRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIGRhdGFUeXBlXG4gICAqL1xuICBzdGF0aWMgY29weTxUPihzb3VyY2U6IFQsIGRhdGFUeXBlOiBuZXcgKCkgPT4gVCwga2V5cz86IEtleXNFbnVtPFQ+KTogVCB7XG4gICAgaWYgKGlzTmlsKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IGRhdGFUeXBlKCk7XG4gICAgT2JqZWN0LmtleXMoa2V5cyB8fCB0YXJnZXQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgaWYgYW4gb2JqZWN0IGFsbCBhbGwgcHJvcGVydGllcyB0byBuaWxcbiAgICovXG4gIHN0YXRpYyBpc0VtcHR5PFQ+KFxuICAgIGRhdGE6IFQsXG4gICAga2V5cz86IEtleXNFbnVtPFQ+IHwgc3RyaW5nW10sXG4gICAgb3B0cz86IHtcbiAgICAgIGJsYW5rU3RyaW5nTGlrZUVtcHR5PzogYm9vbGVhbjtcbiAgICB9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBpc05pbChkYXRhKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogT2JqZWN0LmtleXMoa2V5cyB8fCBkYXRhKSlcbiAgICAgICAgLy8gRmluZCBpbmRleCBvZiB0aGUgZmlyc3QgTk9UIG5pbCB2YWx1ZVxuICAgICAgICAuZmluZEluZGV4KChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuICFCZWFucy5pc0VtcHR5KHZhbHVlLCBudWxsLCBvcHRzKTsgLy8gTG9vcFxuICAgICAgICAgIGlmIChvcHRzICYmIG9wdHMuYmxhbmtTdHJpbmdMaWtlRW1wdHkgPT09IHRydWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIGlzTm90TmlsT3JCbGFuayh2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKTtcbiAgICAgICAgfSkgPT09IC0xXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0QnlJZDxUPihhcnJheTogVFtdKTogS2V5VmFsdWVUeXBlPFRbXT4ge1xuICAgIHJldHVybiBjb2xsZWN0QnlQcm9wZXJ0eShhcnJheSwgJ2lkJyBhcyBrZXlvZiBUKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0QnlQcm9wZXJ0eSA9IGNvbGxlY3RCeVByb3BlcnR5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudFdpdGhDbGFzcyhlbGVtOiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIGlmICghY2xhc3NOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtPy5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdEFycmF5czxUID0gYW55Pih2YWx1ZXM6IFRbXVtdKTogVFtdIHtcbiAgaWYgKGlzRW1wdHlBcnJheSh2YWx1ZXMpKSByZXR1cm4gW107XG5cbiAgLy8gVXRpbGlzZSBsYSBtw6l0aG9kZSByZWR1Y2UgcG91ciBvYnRlbmlyIGwnaW50ZXJzZWN0aW9uIGRlcyB0YWJsZWF1eFxuICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MuZmlsdGVyKCh4KSA9PiBjdXJyLmluY2x1ZGVzKHgpKSwgdmFsdWVzWzBdLnNsaWNlKCkpO1xufVxuXG4vKipcbiAqIEludGVycG9sYXRlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgcGxhY2Vob2xkZXJzIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIHN0cmluZyBjb250YWluaW5nIHBsYWNlaG9sZGVycyBlbmNsb3NlZCBpbiBkb3VibGUgY3VybHkgYnJhY2VzIChlLmcuLCB7e2tleX19KS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gaW50ZXJwb2xhdGVQYXJhbXMgLSBBbiBvYmplY3QgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIGludGVycG9sYXRpb24uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzIHJlcGxhY2VkIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzLCBvciB0aGUgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHBsYWNlaG9sZGVycyBhcmUgbWF0Y2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlU3RyaW5nKG1lc3NhZ2U6IHN0cmluZywgaW50ZXJwb2xhdGVQYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICBpZiAoaXNOaWxPckJsYW5rKG1lc3NhZ2UpKSByZXR1cm4gbWVzc2FnZTtcblxuICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC97eyhbXn1dKyl9fS9nLCAobWF0Y2g6IHN0cmluZywgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSBnZXRQcm9wZXJ0eUJ5UGF0aEFzU3RyaW5nKGludGVycG9sYXRlUGFyYW1zLCBwYXRoLnRyaW0oKSk7XG4gICAgICByZXR1cm4gcGFyYW1WYWx1ZSB8fCAnJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gYmluZCBhbiBleHByZXNzaW9uOlxcblxcdC0gbWVzc2FnZTogJHttZXNzYWdlfVxcblxcdC0gZXhwcmVzc2lvbjogJHttYXRjaH1gKTtcbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBUcmFuc2Zvcm1zIGEgdmFsdWUgKHR5cGljYWxseSBhIHN0cmluZykgdG8gYSBudW1iZXIuXG4gKiBJbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgdHJhbnNmb3JtIGZ1bmN0aW9uIG9mIGFuIGlucHV0LlxuICogU2hvdWxkIHJldHVybiBuPXVuZGVmaW5lZCB3aGVuIGZvciBhIG5pbCBpbnB1dFxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGJlIHRyYW5zZm9ybWVkLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgVmFsdWUgdG8gdXNlIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBjYW4ndCBiZSBwYXJzZWQgYXMgYSBudW1iZXIuXG4gKlxuICogIEB1c2FnZU5vdGVzXG4gKiAgYGBgdHNcbiAqICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBpZCE6IG51bWJlcjtcbiAqICBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJPck5pbEF0dHJpYnV0ZSh2YWx1ZTogdW5rbm93biwgZmFsbGJhY2tWYWx1ZSA9IE5hTik6IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIHZhbHVlIGFzIHVuZGVmaW5lZCB8IG51bGw7XG4gIC8vIHBhcnNlRmxvYXQodmFsdWUpIGhhbmRsZXMgbW9zdCBvZiB0aGUgY2FzZXMgd2UncmUgaW50ZXJlc3RlZCBpbiAoaXQgdHJlYXRzIG51bGwsIGVtcHR5IHN0cmluZyxcbiAgLy8gYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzIGFzIE5hTiwgd2hlcmUgTnVtYmVyIGp1c3QgdXNlcyAwKSBidXQgaXQgY29uc2lkZXJzIHRoZSBzdHJpbmdcbiAgLy8gJzEyM2hlbGxvJyB0byBiZSBhIHZhbGlkIG51bWJlci4gVGhlcmVmb3JlIHdlIGFsc28gY2hlY2sgaWYgTnVtYmVyKHZhbHVlKSBpcyBOYU4uXG4gIGNvbnN0IGlzTnVtYmVyVmFsdWUgPSAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSBhcyBhbnkpKSAmJiAhaXNOYU4oTnVtYmVyKHZhbHVlKSk7XG4gIHJldHVybiBpc051bWJlclZhbHVlID8gTnVtYmVyKHZhbHVlKSA6IGZhbGxiYWNrVmFsdWU7XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIGdpdmVuIG51bWJlciBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgLSBUaGUgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZC5cbiAqIEBwYXJhbSB7SW50bC5OdW1iZXJGb3JtYXRPcHRpb25zICYgeyBmaXhlZERlY2ltYWxzPzogbnVtYmVyIH19IFtvcHRzXSAtIEFuIG9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIGZvcm1hdHRpbmcgb3B0aW9ucy4gSXQgY2FuIGluY2x1ZGUgc3RhbmRhcmQgYEludGwuTnVtYmVyRm9ybWF0T3B0aW9uc2AgcHJvcGVydGllcyBhbmQgYW4gYWRkaXRpb25hbCBgZml4ZWREZWNpbWFsc2AgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGZpeGVkIGRlY2ltYWwgcGxhY2VzLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG51bWJlciBhcyBhIHN0cmluZywgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb1N0cmluZyh2YWw6IG51bWJlciwgb3B0cz86IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyAmIHsgZml4ZWREZWNpbWFscz86IG51bWJlciB9KTogc3RyaW5nIHtcbiAgLy8gRm9ybWF0IHRoZSBvdXRwdXQgdG8gZGlzcGxheSBhbnkgd2F5IHlvdSB3YW50IGhlcmUuXG4gIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwgJiYgIWlzTmFOKHZhbCkpIHtcbiAgICBpZiAob3B0cz8uZml4ZWREZWNpbWFscykge1xuICAgICAgcmV0dXJuIHZhbC50b0ZpeGVkKG9wdHMuZml4ZWREZWNpbWFscyk7XG4gICAgfVxuICAgIHJldHVybiB2YWwudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZGVlcE1lcmdlU2tpcFVuZGVmaW5lZCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHNXaXRob3V0VW5kZWZpbmVkKC4uLm9iamVjdHM6IHVua25vd25bXSk6IHVua25vd24ge1xuICByZXR1cm4gX3NhZmVEZWVwTWVyZ2VTa2lwVW5kZWZpbmVkKHt9LCBvYmplY3RzLCBuZXcgV2Vha1NldCgpKTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZGVlcE1lcmdlU2tpcFVuZGVmaW5lZCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25Ta2lwVW5kZWZpbmVkKHRhcmdldDogdW5rbm93biwgLi4uc291cmNlczogdW5rbm93bltdKTogdW5rbm93biB7XG4gIHJldHVybiBfc2FmZURlZXBNZXJnZVNraXBVbmRlZmluZWQodGFyZ2V0LCBzb3VyY2VzLCBuZXcgV2Vha1NldCgpKTtcbn1cblxuLyoqXG4gKiBNZXJnZSBtYW55IG9iamVjdHMgaW50byBvbmUgbmV3IG9iamVjdCwgc2tpcHBpbmcgdW5kZWZpbmVkIG9iamVjdHMgb3IgcHJvcGVydGllcyB3aXRoIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgcmVjdXJzaXZlLCBidXQgcHJldmVudHMgY2lyY3VsYXIgcmVmZXJlbmNlcyAtIGZpeCBpc3N1ZSBzdW1hcmlzLWFwcCMxOTI5LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdG8gbWVyZ2UgcHJvcGVydGllcyBpbnRvLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QgaWYgbm90IHByb3ZpZGVkLlxuICogQHBhcmFtIHsuLi51bmtub3duW119IHNvdXJjZXMgLSBPbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBtZXJnZSBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7VH0gVGhlIHJlc3VsdGluZyBvYmplY3QgYWZ0ZXIgbWVyZ2luZyB0aGUgdGFyZ2V0IGFuZCBzb3VyY2Ugb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNZXJnZVNraXBVbmRlZmluZWQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih0YXJnZXQ6IFBhcnRpYWw8VD4gPSB7fSBhcyBULCAuLi5zb3VyY2VzOiB1bmtub3duW10pOiBUIHtcbiAgcmV0dXJuIF9zYWZlRGVlcE1lcmdlU2tpcFVuZGVmaW5lZCh0YXJnZXQsIHNvdXJjZXMsIG5ldyBXZWFrU2V0KCkpO1xufVxuXG4vKipcbiAqIFNhZmVseSBtZXJnZSBwcm9wZXJ0aWVzIGZyb20gc291cmNlIG9iamVjdHMgdG8gdGhlIHRhcmdldCBvYmplY3Qgd2hpbGUgc2tpcHBpbmcgdW5kZWZpbmVkIHZhbHVlcy5cbiAqIFByZXZlbnRzIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnkga2VlcGluZyB0cmFjayBvZiBwcm9jZXNzZWQgc291cmNlcy5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHdoaWNoIHByb3BlcnRpZXMgc2hvdWxkIGJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHt1bmtub3duW119IHNvdXJjZXMgLSBBbiBhcnJheSBvZiBzb3VyY2Ugb2JqZWN0cyBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gYmUgYXNzaWduZWQuXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gdmlzaXRlZCAtIEFuIG9wdGlvbmFsIGFycmF5IHRvIHRyYWNrIHByb2Nlc3NlZCBzb3VyY2Ugb2JqZWN0cyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICogQHJldHVybiB7dW5rbm93bn0gVGhlIHVwZGF0ZWQgdGFyZ2V0IG9iamVjdCBhZnRlciBtZXJnaW5nIHRoZSBzb3VyY2Ugb2JqZWN0cywgZXhjbHVkaW5nIHVuZGVmaW5lZCBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBfc2FmZURlZXBNZXJnZVNraXBVbmRlZmluZWQ8VD4odGFyZ2V0OiB1bmtub3duLCBzb3VyY2VzOiB1bmtub3duW10sIHZpc2l0ZWQ6IFdlYWtTZXQ8b2JqZWN0Pik6IGFueSB7XG4gIGlmIChpc0VtcHR5QXJyYXkoc291cmNlcykpIHJldHVybiB0YXJnZXQgYXMgVDtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiBfc2FmZURlZXBNZXJnZVNraXBVbmRlZmluZWQoc291cmNlc1swXSwgc291cmNlcy5zbGljZSgxKSwgdmlzaXRlZCk7XG4gIHJldHVybiBzb3VyY2VzLnJlZHVjZSgoYWNjLCBzb3VyY2UpID0+IHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNvdXJjZSkpIHJldHVybiBhY2M7XG5cbiAgICAvLyBQcm90ZWN0aW9uIGFnYWluc3QgaW5maW5pdGUgbG9vcFxuICAgIGlmICh2aXNpdGVkLmhhcyhzb3VyY2UpKSByZXR1cm4gYWNjO1xuICAgIHZpc2l0ZWQuYWRkKHNvdXJjZSk7XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmlzaXRlZC5oYXModmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZSBtZXJnZSBmb3Igb2JqZWN0cyAoZXhjbHVkaW5nIG51bGwsIGFycmF5cyBvciBhbHJlYWR5IHZpc2l0ZWQpXG4gICAgICAgIGFjY1trZXldID0gX3NhZmVEZWVwTWVyZ2VTa2lwVW5kZWZpbmVkKGFjY1trZXldIHx8IHt9LCB2YWx1ZSwgdmlzaXRlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB0YXJnZXQgYXMgVCk7XG59XG4iXX0=
900
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxhQUFhLE1BQU0sT0FBTyxDQUFDO0FBRXZDLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFM0MsTUFBTSxVQUFVLEtBQUssQ0FBSSxHQUF5QjtJQUNoRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQztBQUMzQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLFlBQVksQ0FBSSxHQUF5QjtJQUN2RCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUNELE1BQU0sVUFBVSxRQUFRLENBQUksR0FBeUI7SUFDbkQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUM7QUFDM0MsQ0FBQztBQUNELE1BQU0sVUFBVSxlQUFlLENBQUksR0FBeUI7SUFDMUQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzdGLENBQUM7QUFDRCxNQUFNLFVBQVUsYUFBYSxDQUFJLEdBQXlCO0lBQ3hELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFH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RyxDQUFDLEdBQUcsMkJBQTJCLENBQ3ZDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQ2pCLENBQUMsS0FBSyxDQUFDLEVBQ1AsT0FBTyxDQUNSLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04seUNBQXlDO2dCQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjbG9uZUltcG9ydGVkIGZyb20gJ2Nsb25lJztcbmltcG9ydCB7IEtleXNFbnVtLCBLZXlWYWx1ZVR5cGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfSk9JTl9QUk9QRVJUSUVTX1NFUEFSQVRPUiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFJlZ0V4cFV0aWxzIH0gZnJvbSAnLi9yZWdleHBzJztcbmltcG9ydCB7IHVud3JhcEVTTW9kdWxlIH0gZnJvbSAnLi9tb2R1bGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmlsPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05pbE9yQmxhbms8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyAmJiBvYmoudHJpbSgpID09PSAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWw8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsT3JCbGFuazxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgKHR5cGVvZiBvYmogIT09ICdzdHJpbmcnIHx8IG9iai50cmltKCkgIT09ICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbE9yTmFOPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiAodHlwZW9mIG9iaiAhPT0gJ251bWJlcicgfHwgIWlzTmFOKG9iaikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmlsT3JOYU48VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyAmJiBpc05hTihvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdEVtcHR5QXJyYXk8VD4ob2JqOiBUW10gfCByZWFkb25seSBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgb2JqLmxlbmd0aCA+IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RBcnJheVZhbHVlPFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KG9iaikgPyBvYmpbMF0gOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gbGFzdEFycmF5VmFsdWU8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc05vdEVtcHR5QXJyYXkob2JqKSA/IG9ialtvYmoubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eUFycmF5PFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsIHx8ICFvYmoubGVuZ3RoO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5UmVzaXplPFQ+KGFycmF5OiBUW10gfCBudWxsIHwgdW5kZWZpbmVkLCBzaXplOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IFQpOiBUW10ge1xuICBpZiAoc2l6ZSA8IDApIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50ICdzaXplJyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXCIpO1xuICBpZiAoIWFycmF5KSByZXR1cm4gbmV3QXJyYXkoc2l6ZSwgZGVmYXVsdFZhbHVlKTtcblxuICAvLyBSZWR1Y2Ugc2l6ZVxuICBpZiAoYXJyYXkubGVuZ3RoID4gc2l6ZSkge1xuICAgIHJldHVybiBhcnJheS5zbGljZSgwLCBzaXplKTtcbiAgfVxuICAvLyBJbmNyZWFzZSBzaXplXG4gIGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA8IHNpemUpIHtcbiAgICByZXR1cm4gWy4uLmFycmF5LCAuLi5uZXdBcnJheShzaXplIC0gYXJyYXkubGVuZ3RoLCBkZWZhdWx0VmFsdWUpXTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBuZXdBcnJheTxUPihzaXplOiBudW1iZXIsIGRlZmF1bHRWYWx1ZT86IFQpOiBUW10ge1xuICBpZiAoc2l6ZSA8IDApIHRocm93IG5ldyBFcnJvcihcIkFyZ3VtZW50ICdzaXplJyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyXCIpO1xuICByZXR1cm4gbmV3IEFycmF5KHNpemUpLmZpbGwoZGVmYXVsdFZhbHVlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbEJvb2xlYW4ob2JqOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogb2JqIGlzIGJvb2xlYW4ge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHx8IGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsU3RyaW5nKG9iajogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IG9iaiBpcyBzdHJpbmcge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgfHwgZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWxPYmplY3Qob2JqOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogb2JqIGlzIG9iamVjdCB7XG4gIHJldHVybiAob2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB8fCBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JsYW5rU3RyaW5nKG9iajogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IG9iaiBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgJiYgb2JqLnRyaW0oKS5sZW5ndGggPT09IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gbm90TmlsT3JEZWZhdWx0PFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogVCk6IFQge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gb2JqIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5U2l6ZTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gKGlzTm90RW1wdHlBcnJheShvYmopICYmIG9iai5sZW5ndGgpIHx8IDA7XG59XG5cbi8qKlxuICogUmVtb3ZlIGR1cGxpY2F0ZWQgdmFsdWUsIGluIGFycmF5LiBXaWxsIGNvbXB1dGUgYSB1bmlxdWUga2V5IChmcm9tIGdpdmVuIHByb3BlcnRpZXMsIG9yIGdpdmVuIGZ1bmN0aW9uKS5cbiAqIElmIHByb3BlcnRpZXNPcktleUZuIGlzIG5pbCBvciB1bmRlZmluZWQsIHdpbGwgdXNlIGFsbCBvYmplY3QgcHJvcGVydGllc1xuICpcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzT3JLZXlGblxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlEaXN0aW5jdDxUID0gYW55Pih2YWx1ZXM6IFRbXSwgcHJvcGVydGllc09yS2V5Rm4/OiBzdHJpbmcgfCBzdHJpbmdbXSB8ICgob2JqOiBUKSA9PiBzdHJpbmcpKTogVFtdIHtcbiAgaWYgKGlzRW1wdHlBcnJheSh2YWx1ZXMpKSByZXR1cm4gdmFsdWVzO1xuICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICBjb25zdCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSA9ICghcHJvcGVydGllc09yS2V5Rm4gJiYgZmlyc3RWYWx1ZSAmJiB0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZmlyc3RWYWx1ZSkgJiYgT2JqZWN0LmtleXMoZmlyc3RWYWx1ZSkpIHx8IChBcnJheS5pc0FycmF5KHByb3BlcnRpZXNPcktleUZuKSAmJiBwcm9wZXJ0aWVzT3JLZXlGbik7XG4gIGNvbnN0IGdldEtleTogKG9iajogVCkgPT4gc3RyaW5nID1cbiAgICAodHlwZW9mIHByb3BlcnRpZXNPcktleUZuID09PSAnZnVuY3Rpb24nICYmIHByb3BlcnRpZXNPcktleUZuKSB8fFxuICAgICh0eXBlb2YgcHJvcGVydGllc09yS2V5Rm4gPT09ICdzdHJpbmcnICYmICgob2JqKSA9PiBnZXRQcm9wZXJ0eUJ5UGF0aEFzU3RyaW5nKG9iaiwgcHJvcGVydGllc09yS2V5Rm4pKSkgfHxcbiAgICAoaXNFbXB0eUFycmF5KHByb3BlcnRpZXMpICYmICgob2JqKSA9PiBvYmo/LnRvU3RyaW5nKCkpKSB8fFxuICAgICgob2JqKSA9PiBqb2luUHJvcGVydGllc1BhdGgob2JqLCBwcm9wZXJ0aWVzLCB7IHNlcGFyYXRvcjogJ3wnLCBvbWl0RW1wdHlTdHJpbmdzOiBmYWxzZSB9KSk7XG4gIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKChyZXMsIGl0ZW0pID0+IHtcbiAgICBjb25zdCB1bmlxdWVLZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgaWYgKGV4aXN0aW5nSWRzLmhhcyh1bmlxdWVLZXkpKSByZXR1cm4gcmVzOyAvLyBTa2lwIGlmIGR1cGxpY2F0ZVxuICAgIGV4aXN0aW5nSWRzLmFkZCh1bmlxdWVLZXkpO1xuICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICB9LCBbXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbElmVW5kZWZpbmVkPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBUIHwgbnVsbCB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCA/IG51bGwgOiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbElmTmlsT3JCbGFuazxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IG51bGwge1xuICByZXR1cm4gaXNOaWxPckJsYW5rKG9iaikgPyBudWxsIDogb2JqO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuZGVmaW5lZElmTnVsbDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBvYmogPT09IG51bGwgPyB1bmRlZmluZWQgOiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJpbUVtcHR5VG9OdWxsPFQ+KHN0cjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IChzdHIgJiYgc3RyLnRyaW0oKSkgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLmxlbmd0aCAmJiB2YWx1ZSkgfHwgbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4ob2JqOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gKG9iaiAhPT0gJ2ZhbHNlJyA/ICEhb2JqIDogZmFsc2UpIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKG9iajogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZywgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGlzTm90TmlsT3JOYU4ob2JqKSA/ICtvYmogOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9GbG9hdChvYmo6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZT86IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gcGFyc2VGbG9hdChvYmopIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvSW50KG9iajogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgPyBwYXJzZUludChvYmosIDApIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTm90TmlsPFQgPSBhbnk+KG9iajogVCwgZGVmYXVsdFZhbHVlPzogVCk6IGFueSB8IG51bGwge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gb2JqIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXk8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkLCBwcm9wZXJ0eT86IHN0cmluZyk6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFbXB0eUFycmF5KG9iaikpIHJldHVybiBvYmo7XG4gIGlmIChwcm9wZXJ0eSkge1xuICAgIHJldHVybiBvYmouZmlsdGVyKChpdGVtLCBpLCBhcnJheSkgPT4gYXJyYXkuZmluZEluZGV4KCh0KSA9PiB0ICYmIGl0ZW0gJiYgdFtwcm9wZXJ0eV0gPT09IGl0ZW1bcHJvcGVydHldKSA9PT0gaSk7XG4gIH1cbiAgcmV0dXJuIG9iai5maWx0ZXIoKGl0ZW0sIGksIGFycmF5KSA9PiBhcnJheS5maW5kSW5kZXgoKHQpID0+IHQgJiYgaXRlbSAmJiB0ID09PSBpdGVtKSA9PT0gaSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydHNXaXRoVXBwZXJDYXNlKGlucHV0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnB1dD8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKHNlYXJjaCkgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIFJlZ2V4cHMubWF0Y2hVcHBlckNhc2UgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgbWF0Y2hVcHBlckNhc2UgPSBSZWdFeHBVdGlscy5tYXRjaFVwcGVyQ2FzZTtcblxuLyoqXG4gKiBSZW1vdmUgdHJhaWxpbmcgc2xhc2ggaWYgYW55LiBFeGFtcGxlcyA6XG4gKiAtICcvdGVzdC8nIC0+ICcvdGVzdCdcbiAqIC0gJy8nIC0+IHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9UcmFpbGluZ1NsYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gJy8nKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAocGF0aC50cmltKCkubGFzdEluZGV4T2YoJy8nKSA9PT0gcGF0aC5sZW5ndGggLSAxKSByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSAxKTtcbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlQWxsKHZhbHVlOiBzdHJpbmcsIHNlYXJjaFN0cmluZzogYW55LCByZXBsYWNlbWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHdoaWxlICh2YWx1ZSAmJiB2YWx1ZS5pbmRleE9mKHNlYXJjaFN0cmluZykgIT09IC0xKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHNlYXJjaFN0cmluZywgcmVwbGFjZW1lbnQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbmQodmFsdWU6IHN0cmluZywgZW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWU/LmVuZHNXaXRoKGVuZCB8fCAnJykgPyB2YWx1ZS5zdWJzdHIoMCwgdmFsdWUubGVuZ3RoIC0gZW5kLmxlbmd0aCkgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGNhc2UgY2hhbmdlIGJ5IGFuIHVuZGVyc2NvcmUgKC5lLmcgJ215U3RyaW5nJyBiZWNvbWVzICdteV9zdHJpbmcnKVxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlQ2FzZVRvVW5kZXJzY29yZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzTmlsT3JCbGFuayh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMV8kMicpLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogUmVwbGFjZSB1bmRlcnNjb3JlIGJ5IGEgY2hhbmdlIGNhc2UgKC5lLmcgJ01ZX1NUUklORycgYmVjb21lcyAnTXlTdHJpbmcnKVxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5kZXJzY29yZVRvQ2hhbmdlQ2FzZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzTmlsT3JCbGFuayh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAuc3BsaXQoJ18nKVxuICAgIC5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKVxuICAgIC5tYXAoKHN0ciwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IHN0ciA6IGNhcGl0YWxpemVGaXJzdExldHRlcihzdHIpKSlcbiAgICAuam9pbignJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEaWFjcml0aWNzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0Lm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3VnZ2VzdEZyb21TdHJpbmdBcnJheSh2YWx1ZXM6IHN0cmluZ1tdLCBzZWFyY2hUZXh0OiBhbnksIG9wdHM/OiB7IGFueVNlYXJjaD86IGJvb2xlYW4gfSk6IHN0cmluZ1tdIHtcbiAgc2VhcmNoVGV4dCA9ICh0eXBlb2Ygc2VhcmNoVGV4dCA9PT0gJ3N0cmluZycgJiYgc2VhcmNoVGV4dCAhPT0gJyonICYmIHNlYXJjaFRleHQpIHx8IHVuZGVmaW5lZDtcbiAgbGV0IGNsZWFuU2VhcmNoVGV4dCA9IFJlZ0V4cFV0aWxzLmNsZWFuU2VhcmNoVGV4dChzZWFyY2hUZXh0IGFzIHN0cmluZyk7XG4gIGlmICghY2xlYW5TZWFyY2hUZXh0Py5sZW5ndGgpIHJldHVybiB2YWx1ZXM7XG5cbiAgLy8gSWYgd2lsZGNhcmQsIHNlYXJjaCB1c2luZyByZWdleHBcbiAgaWYgKG9wdHM/LmFueVNlYXJjaCB8fCBSZWdFeHBVdGlscy5oYXNXaWxkY2FyZENoYXJhY3RlcihjbGVhblNlYXJjaFRleHQpKSB7XG4gICAgY29uc3QgcmVnZXhwID0gUmVnRXhwVXRpbHMuY29tcGlsZVNlYXJjaFJlZ2V4cChjbGVhblNlYXJjaFRleHQsICdnaScpO1xuICAgIHJldHVybiB2YWx1ZXMuZmlsdGVyKCh2KSA9PiBSZWdFeHBVdGlscy5tYXRjaCh2LCByZWdleHApKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBubyB3aWxkY2FyZCwgc2VhcmNoIHVzaW5nIHN0YXJ0c1dpdGhcbiAgICBjbGVhblNlYXJjaFRleHQgPSBjbGVhblNlYXJjaFRleHQudG9VcHBlckNhc2UoKTtcbiAgICByZXR1cm4gdmFsdWVzLmZpbHRlcigodikgPT4gc3RhcnRzV2l0aFVwcGVyQ2FzZSh2LCBjbGVhblNlYXJjaFRleHQpKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpvaW5PcHRpb25zIHtcbiAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICBvbWl0RW1wdHlTdHJpbmdzPzogYm9vbGVhbjtcbiAgdHJpbVJlc3VsdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEpvaW5zIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzIGZyb20gYW4gb2JqZWN0IGludG8gYSBzaW5nbGUgc3RyaW5nLCB1c2luZyBhIHNwZWNpZmllZCBzZXBhcmF0b3JcbiAqIGFuZCBvcHRpb25hbCBjb25maWd1cmF0aW9ucyBmb3IgdHJpbW1pbmcgYW5kIG9taXR0aW5nIGVtcHR5IHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtUfSBvYmogVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGJlIGpvaW5lZC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BlcnRpZXMgQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIHByb3BlcnR5IHBhdGhzIHRvIGJlIGFjY2Vzc2VkIGFuZCBqb2luZWQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IEpvaW5PcHRpb25zfSBbc2VwYXJhdG9yT3JPcHRzXSBBIHN0cmluZyBzZXBhcmF0b3Igb3IgYW4gb2JqZWN0IGRlZmluaW5nIGFkZGl0aW9uYWwgb3B0aW9uc1xuICogZm9yIGpvaW5pbmcsIHN1Y2ggYXMgdGhlIHNlcGFyYXRvciwgd2hldGhlciB0byB0cmltIHJlc3VsdHMsIGFuZCB3aGV0aGVyIHRvIG9taXQgZW1wdHkgc3RyaW5ncy5cbiAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gQSBzdHJpbmcgZm9ybWVkIGJ5IGpvaW5pbmcgdGhlIHNlbGVjdGVkIHByb3BlcnR5IHZhbHVlcywgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkXG4gKiB2YWx1ZXMgYXJlIGZvdW5kIGFmdGVyIHByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luUHJvcGVydGllc1BhdGg8VCA9IGFueT4ob2JqOiBULCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgc2VwYXJhdG9yT3JPcHRzPzogc3RyaW5nIHwgSm9pbk9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIW9iaikgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZGlzcGxheSBhbiB1bmRlZmluZWQgZW50aXR5LicpO1xuICBpZiAoaXNFbXB0eUFycmF5KHByb3BlcnRpZXMpKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG9yIGVtcHR5ICdwcm9wZXJ0aWVzJyBhcmd1bWVudFwiKTtcblxuICBjb25zdCBvcHRzOiBKb2luT3B0aW9ucyA9IHR5cGVvZiBzZXBhcmF0b3JPck9wdHMgPT09ICdzdHJpbmcnID8geyBzZXBhcmF0b3I6IHNlcGFyYXRvck9yT3B0cyB9IDogc2VwYXJhdG9yT3JPcHRzIHx8IHt9O1xuICBjb25zdCBvbWl0RW1wdHlTdHJpbmdzID0gb3B0cy5vbWl0RW1wdHlTdHJpbmdzID8/IHRydWU7XG4gIGNvbnN0IHRyaW1SZXN1bHRzID0gb3B0cy50cmltUmVzdWx0cyA/PyB0cnVlO1xuICBjb25zdCBzZXBhcmF0b3IgPSBvcHRzLnNlcGFyYXRvciA/PyBERUZBVUxUX0pPSU5fUFJPUEVSVElFU19TRVBBUkFUT1I7XG5cbiAgbGV0IHZhbHVlcyA9IHByb3BlcnRpZXMubWFwKChwYXRoKSA9PiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGgpKTtcblxuICBpZiAodHJpbVJlc3VsdHMpIHtcbiAgICB2YWx1ZXMgPSB2YWx1ZXMubWFwKCh2KSA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdi50cmltKCkgOiB2KSk7XG4gIH1cblxuICBpZiAob21pdEVtcHR5U3RyaW5ncykge1xuICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIoaXNOb3ROaWxPckJsYW5rKTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZXMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gKGlzTm90TmlsT3JCbGFuayh2YWx1ZSkgPyB2YWx1ZSA6ICcnKSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBKb2lucyB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGludG8gYSBzaW5nbGUgc3RyaW5nIHVzaW5nIGEgZ2l2ZW4gc2VwYXJhdG9yIG9yIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtUfSBvYmogVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGpvaW4uXG4gKiBAcGFyYW0ge0tbXX0ga2V5cyBBbiBhcnJheSBvZiBrZXlzIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydGllcyB0byByZXRyaWV2ZSBhbmQgam9pbi5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgSm9pbk9wdGlvbnN9IFtzZXBhcmF0b3JPck9wdHNdIEEgc3RyaW5nIHRvIHVzZSBhcyB0aGUgc2VwYXJhdG9yIG9yIGFuIG9wdGlvbnMgb2JqZWN0IHNwZWNpZnlpbmcgY29uZmlndXJhdGlvbiBmb3IgdGhlIGpvaW4gb3BlcmF0aW9uLlxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBqb2luZWQgcHJvcGVydHkgdmFsdWVzLCBvciB1bmRlZmluZWQgaWYgdGhlIG9iamVjdCBpcyBub3QgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luUHJvcGVydGllczxUID0gYW55LCBLIGV4dGVuZHMga2V5b2YgVCA9IGFueT4ob2JqOiBULCBrZXlzOiBLW10sIHNlcGFyYXRvck9yT3B0cz86IHN0cmluZyB8IEpvaW5PcHRpb25zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmopIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGRpc3BsYXkgYW4gdW5kZWZpbmVkIGVudGl0eS4nKTtcblxuICBjb25zdCBvcHRzOiBKb2luT3B0aW9ucyA9IHR5cGVvZiBzZXBhcmF0b3JPck9wdHMgPT09ICdzdHJpbmcnID8geyBzZXBhcmF0b3I6IHNlcGFyYXRvck9yT3B0cyB9IDogc2VwYXJhdG9yT3JPcHRzIHx8IHt9O1xuICBjb25zdCBvbWl0RW1wdHlTdHJpbmdzID0gb3B0cy5vbWl0RW1wdHlTdHJpbmdzID8/IHRydWU7XG4gIGNvbnN0IHRyaW1SZXN1bHRzID0gb3B0cy50cmltUmVzdWx0cyA/PyB0cnVlO1xuICBjb25zdCBzZXBhcmF0b3IgPSBvcHRzLnNlcGFyYXRvciA/PyBERUZBVUxUX0pPSU5fUFJPUEVSVElFU19TRVBBUkFUT1I7XG5cbiAgbGV0IHZhbHVlczogYW55W10gPSBrZXlzLm1hcCgoa2V5KSA9PiBnZXRQcm9wZXJ0eShvYmosIGtleSkpO1xuXG4gIGlmICh0cmltUmVzdWx0cykge1xuICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoKHYpID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2LnRyaW0oKSA6IHYpKTtcbiAgfVxuXG4gIGlmIChvbWl0RW1wdHlTdHJpbmdzKSB7XG4gICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcihpc05vdE5pbE9yQmxhbmspO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiAoaXNOb3ROaWxPckJsYW5rKHZhbHVlKSA/IHZhbHVlIDogJycpKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZXMuam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMuXG4gKlxuICogQ29tcGFyZXMgdHdvIHZhbHVlcyB1c2luZyB0aGUgSmF2YVNjcmlwdCBncmVhdGVyLXRoYW4gb3BlcmF0b3IuXG4gKiBXb3JrcyBmb3IgbnVtYmVycywgc3RyaW5ncywgZGF0ZXMsIGFuZCBhbnkgdHlwZXMgdGhhdCBwcm92aWRlXG4gKiBhIG1lYW5pbmdmdWwgYD5gIGNvbXBhcmlzb24uIFVzZSBmb3IgYXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFR5cGUgb2YgdGhlIGNvbXBhcmVkIHZhbHVlcy5cbiAqIEBwYXJhbSBhIC0gTGVmdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBSaWdodCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMgMCBpZiBlcXVhbCwgLTEgaWYgYSA8IGIsIDEgaWYgYSA+IGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVmFsdWVzPFQ+KGE6IFQsIGI6IFQpOiBudW1iZXIge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gIHJldHVybiBhID4gYiA/IDEgOiAtMTtcbn1cblxuLyoqXG4gKiBSZXZlcnNlIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIChkZXNjZW5kaW5nIG9yZGVyKS5cbiAqXG4gKiBTYW1lIHNlbWFudGljcyBhcyB7QGxpbmsgY29tcGFyZVZhbHVlc30gYnV0IGludmVydGVkLCB0byBzb3J0XG4gKiBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFR5cGUgb2YgdGhlIGNvbXBhcmVkIHZhbHVlcy5cbiAqIEBwYXJhbSBhIC0gTGVmdCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIGIgLSBSaWdodCB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMgMCBpZiBlcXVhbCwgMSBpZiBhIDwgYiwgLTEgaWYgYSA+IGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlVmFsdWVzRGVzYzxUPihhOiBULCBiOiBUKTogbnVtYmVyIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiAwO1xuICByZXR1cm4gYSA+IGIgPyAtMSA6IDE7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIGJhc2VkIG9uIGEgbmVzdGVkIHByb3BlcnR5IHBhdGguXG4gKlxuICogVXNlcyB7QGxpbmsgZ2V0UHJvcGVydHlCeVBhdGh9IHRvIGV4dHJhY3QgdmFsdWVzIGFuZCBjb21wYXJlcyB0aGVtXG4gKiBpbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUeXBlIG9mIGNvbXBhcmVkIG9iamVjdHMuXG4gKiBAcGFyYW0gcGF0aCAtIFByb3BlcnR5IHBhdGggb3IgYXJyYXkgcGF0aCAoZS5nLiBcImEuYlswXS5jXCIpLlxuICogQHBhcmFtIGRpcmVjdGlvbiAtIFNvcnQgZGlyZWN0aW9uLCAnYXNjJyBieSBkZWZhdWx0LlxuICogQHBhcmFtIG51bGxzRmlyc3RcbiAqIEByZXR1cm5zIEEgY29tcGFyYXRvciBjb21wYXRpYmxlIHdpdGggYEFycmF5LnByb3RvdHlwZS5zb3J0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5UGF0aENvbXBhcmF0b3I8VCA9IGFueT4oXG4gIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYycsXG4gIG51bGxzRmlyc3Q/OiBib29sZWFuXG4pOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyIHtcbiAgbnVsbHNGaXJzdCA9IG51bGxzRmlyc3QgPz8gZGlyZWN0aW9uID09ICdkZXNjJztcbiAgY29uc3QgY29tcGFyZUZuID0gZGlyZWN0aW9uID09PSAnYXNjJyA/IGNvbXBhcmVWYWx1ZXMgOiBjb21wYXJlVmFsdWVzRGVzYztcbiAgcmV0dXJuIChhOiBULCBiOiBUKSA9PiB7XG4gICAgY29uc3QgdmFsdWVBID0gZ2V0UHJvcGVydHlCeVBhdGgoYSwgcGF0aCk7XG4gICAgY29uc3QgdmFsdWVCID0gZ2V0UHJvcGVydHlCeVBhdGgoYiwgcGF0aCk7XG4gICAgaWYgKHZhbHVlQSA9PSBudWxsICYmIHZhbHVlQiA9PSBudWxsKSByZXR1cm4gMDtcbiAgICBpZiAodmFsdWVBID09IG51bGwpIHJldHVybiBudWxsc0ZpcnN0ID8gLTEgOiAxO1xuICAgIGlmICh2YWx1ZUIgPT0gbnVsbCkgcmV0dXJuIG51bGxzRmlyc3QgPyAxIDogLTE7XG4gICAgcmV0dXJuIGNvbXBhcmVGbih2YWx1ZUEsIHZhbHVlQik7XG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21wYXJhdG9yIGJhc2VkIG9uIGEgZGlyZWN0IHByb3BlcnR5IG9mIHRoZSBjb21wYXJlZCBvYmplY3RzLlxuICpcbiAqIEZhbGxzIGJhY2sgdG8gYGRlZmF1bHRWYWx1ZWAgd2hlbiB0aGUgcHJvcGVydHkgaXMgYHVuZGVmaW5lZGAgb24gYW4gaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUeXBlIG9mIGNvbXBhcmVkIG9iamVjdHMuXG4gKiBAdHlwZVBhcmFtIEsgLSBLZXkgb2YgdGhlIHByb3BlcnR5IGluIGBUYC5cbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFByb3BlcnR5IG5hbWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbiwgJ2FzYycgYnkgZGVmYXVsdC5cbiAqIEBwYXJhbSBudWxsc0ZpcnN0IC0gSWYgdHJ1ZSwgbmlsIHZhbHVlcyBhcmUgcGxhY2VkIGZpcnN0LCBlbHNlIGxhc3QuIEJ5IGRlZmF1bHQsICdmYWxzZScgaWYgZGlyZWN0aW9uPSdhc2MnLCAndHJ1ZScgaWYgZGlyZWN0aW9uPSdkZXNjJ1xuICogQHJldHVybnMgQSBjb21wYXJhdG9yIGNvbXBhdGlibGUgd2l0aCBgQXJyYXkucHJvdG90eXBlLnNvcnRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHlDb21wYXJhdG9yPFQgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55PihcbiAgcHJvcGVydHk6IEssXG4gIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJyxcbiAgbnVsbHNGaXJzdD86IGJvb2xlYW5cbik6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICBudWxsc0ZpcnN0ID0gbnVsbHNGaXJzdCA/PyBkaXJlY3Rpb24gPT09ICdkZXNjJztcbiAgY29uc3QgY29tcGFyZUZuID0gZGlyZWN0aW9uID09PSAnYXNjJyA/IGNvbXBhcmVWYWx1ZXMgOiBjb21wYXJlVmFsdWVzRGVzYztcbiAgcmV0dXJuIChhOiBULCBiOiBUKSA9PiB7XG4gICAgY29uc3QgdmFsdWVBID0gYVtwcm9wZXJ0eV07XG4gICAgY29uc3QgdmFsdWVCID0gYltwcm9wZXJ0eV07XG4gICAgaWYgKHZhbHVlQSA9PSBudWxsICYmIHZhbHVlQiA9PSBudWxsKSByZXR1cm4gMDtcbiAgICBpZiAodmFsdWVBID09IG51bGwpIHJldHVybiBudWxsc0ZpcnN0ID8gLTEgOiAxO1xuICAgIGlmICh2YWx1ZUIgPT0gbnVsbCkgcmV0dXJuIG51bGxzRmlyc3QgPyAxIDogLTE7XG4gICAgcmV0dXJuIGNvbXBhcmVGbih2YWx1ZUEsIHZhbHVlQik7XG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21wYXJhdG9yIHVzaW5nIG11bHRpcGxlIHByb3BlcnR5IHBhdGhzIGFzIHRpZS1icmVha2Vycy5cbiAqXG4gKiBFYWNoIGtleSBpbiBga2V5c2AgaXMgcmVzb2x2ZWQgdmlhIHtAbGluayBnZXRQcm9wZXJ0eUJ5UGF0aH0uIFRoZSBmaXJzdFxuICogbm9uLXplcm8gY29tcGFyaXNvbiByZXN1bHQgaXMgcmV0dXJuZWQuIElmIHByb3ZpZGVkLCBgZGVmYXVsdFZhbHVlc1tpXWBcbiAqIGlzIHVzZWQgd2hlbiBhIHZhbHVlIGF0IGBrZXlzW2ldYCBpcyB1bmRlZmluZWQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVHlwZSBvZiBjb21wYXJlZCBvYmplY3RzLlxuICogQHBhcmFtIGtleXMgLSBPcmRlcmVkIGxpc3Qgb2YgcHJvcGVydHkgcGF0aHMgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBkaXJlY3Rpb24gLSBTb3J0IGRpcmVjdGlvbiBhcHBsaWVkIHRvIGVhY2gga2V5LCAnYXNjJyBieSBkZWZhdWx0LlxuICogQHBhcmFtIG51bGxzRmlyc3QgLSBPcHRpb25hbFxuICogQHRocm93cyBFcnJvciB3aGVuIGBrZXlzYCBpcyBlbXB0eSBvciB3aGVuIGBkZWZhdWx0VmFsdWVzYCBsZW5ndGggaXMgaW52YWxpZC5cbiAqIEByZXR1cm5zIEEgY29tcGFyYXRvciBjb21wYXRpYmxlIHdpdGggYEFycmF5LnByb3RvdHlwZS5zb3J0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnRpZXNQYXRoQ29tcGFyYXRvcjxUID0gYW55PihrZXlzOiBzdHJpbmdbXSwgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnLCBudWxsc0ZpcnN0PzogYm9vbGVhbik6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICBpZiAoaXNFbXB0eUFycmF5KGtleXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHM6IG1pc3NpbmcgJ2tleXMnIG9yIGFycmF5ICdkZWZhdWx0VmFsdWVzJyBoYXMgYSBiYWQgbGVuZ3RoXCIpO1xuICB9XG4gIG51bGxzRmlyc3QgPSBudWxsc0ZpcnN0ID8/IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnO1xuICBjb25zdCBjb21wYXJlRm4gPSBkaXJlY3Rpb24gPT09ICdhc2MnID8gY29tcGFyZVZhbHVlcyA6IGNvbXBhcmVWYWx1ZXNEZXNjO1xuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+XG4gICAga2V5c1xuICAgICAgLm1hcCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUEgPSBnZXRQcm9wZXJ0eUJ5UGF0aChhLCBrZXkpO1xuICAgICAgICBjb25zdCB2YWx1ZUIgPSBnZXRQcm9wZXJ0eUJ5UGF0aChiLCBrZXkpO1xuICAgICAgICBpZiAodmFsdWVBID09IG51bGwgJiYgdmFsdWVCID09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAodmFsdWVBID09IG51bGwpIHJldHVybiBudWxsc0ZpcnN0ID8gLTEgOiAxO1xuICAgICAgICBpZiAodmFsdWVCID09IG51bGwpIHJldHVybiBudWxsc0ZpcnN0ID8gMSA6IC0xO1xuICAgICAgICByZXR1cm4gY29tcGFyZUZuKHZhbHVlQSwgdmFsdWVCKTtcbiAgICAgIH0pXG4gICAgICAvLyBTdG9wIGlmIG5vdCBlcXVhbHMsIG90aGVyd2lzZSBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGtleVxuICAgICAgLmZpbmQoKHJlcykgPT4gcmVzICE9PSAwKSB8fCAwO1xufVxuXG4vKipcbiAqIENvbXBvc2UgYSBjb21wYXJhdG9yIGZyb20gbXVsdGlwbGUgY29tcGFyYXRvcnMgKG11bHRpLWxldmVsIHNvcnQpLlxuICpcbiAqIEVhY2ggY29tcGFyYXRvciBpcyBhcHBsaWVkIHNlcXVlbnRpYWxseS4gVGhlIGZpcnN0IG5vbi16ZXJvIHJlc3VsdCBpc1xuICogcmV0dXJuZWQsIGFsbG93aW5nIHlvdSB0byBkZWZpbmUgcHJpbWFyeSwgc2Vjb25kYXJ5LCB0ZXJ0aWFyeSBjcml0ZXJpYSwgZXRjLlxuICogSWYgYWxsIGNvbXBhcmF0b3JzIHJldHVybiAwLCB0aGUgaXRlbXMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUeXBlIG9mIHRoZSBjb21wYXJlZCBpdGVtcy5cbiAqIEBwYXJhbSBjb21wYXJhdG9ycyAtIExpc3Qgb2YgY29tcGFyYXRvciBmdW5jdGlvbnMgdG8gYXBwbHkgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGNvbXBhcmF0b3IgY29tcGF0aWJsZSB3aXRoIGBBcnJheS5wcm90b3R5cGUuc29ydGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlQ29tcGFyYXRvcnM8VD4oLi4uY29tcGFyYXRvcnM6IEFycmF5PChhOiBULCBiOiBUKSA9PiBudW1iZXI+KTogKGE6IFQsIGI6IFQpID0+IG51bWJlciB7XG4gIHJldHVybiAoYTogVCwgYjogVCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjb21wYXJhdG9yc1xuICAgICAgICA/Lm1hcCgoY29tcGFyYXRvcikgPT4gY29tcGFyYXRvcihhLCBiKSlcbiAgICAgICAgLy8gU3RvcCBpZiBub3QgZXF1YWxzLCBvdGhlcndpc2UgY29udGludWUgd2l0aCB0aGUgbmV4dCBrZXlcbiAgICAgICAgLmZpbmQoKHJlcykgPT4gcmVzICE9PSAwKSB8fCAwXG4gICAgKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnQ8VD4oYXJyYXk6IFRbXSwgYXR0cmlidXRlPzogc3RyaW5nLCBvcHRzPzogSW50bC5Db2xsYXRvck9wdGlvbnMpOiBUW10ge1xuICBpZiAoaXNFbXB0eUFycmF5KGFycmF5KSkgcmV0dXJuIGFycmF5O1xuICBjb25zdCBjb21wYXJlRm46IChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyID0gb3B0cyA/IG5ldyBJbnRsLkNvbGxhdG9yKHVuZGVmaW5lZCwgb3B0cykuY29tcGFyZSA6ICh2MSwgdjIpID0+ICh2MSA9PT0gdjIgPyAwIDogdjEgPiB2MiA/IDEgOiAtMSk7XG4gIHJldHVybiBhcnJheVxuICAgIC5zbGljZSgpIC8vIGNvcHlcbiAgICAuc29ydChhdHRyaWJ1dGUgPyAoYSwgYikgPT4gY29tcGFyZUZuKGFbYXR0cmlidXRlXSwgYlthdHRyaWJ1dGVdKSA6IGNvbXBhcmVGbik7XG59XG5jb25zdCBJTlRFR0VSX1JFR0VYUCA9IC9eWy1dP1xcZCskLztcbmV4cG9ydCBmdW5jdGlvbiBpc0ludCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgSU5URUdFUl9SRUdFWFAudGVzdCh2YWx1ZSk7XG59XG5jb25zdCBOVU1CRVJfUkVHRVhQID0gL15bLV0/XFxkKyhcXC5cXGQrKT8kLztcbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgTlVNQkVSX1JFR0VYUC50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgTlVNQkVSX1JBTkdFX1JFR0VYUCA9IC9eKFxcZCstXFxkKyl8KFs+PD1dKlxcZCspJC87XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJSYW5nZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgTlVNQkVSX1JBTkdFX1JFR0VYUC50ZXN0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5QnlQYXRoKG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBpZiAoaXNOaWwob2JqKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgLy8gUGF0aCBpcyBhbiBhcnJheTogY29udmVydCBwYXRoIHRvIHN0cmluZ1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGguam9pbignLicpLCBkZWZhdWx0VmFsdWUpO1xuICB9XG4gIGlmIChpc05pbE9yQmxhbmsocGF0aCkpIHJldHVybiBvYmo7XG4gIGlmIChwYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEpIHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9bLl0/XFxbKFteXFxbXFxdXSopXShbLl0pPy8sICcuJDEkMicpO1xuICB9XG4gIGNvbnN0IGkgPSBwYXRoLmluZGV4T2YoJy4nKTtcbiAgLy8gU2ltcGxlIHByb3BlcnR5IHBhdGhcbiAgaWYgKGkgPT09IC0xKSB7XG4gICAgY29uc3QgcmVzID0gb2JqW3BhdGhdO1xuICAgIHJldHVybiBpc05vdE5pbChyZXMpIHx8IGlzTmlsKGRlZmF1bHRWYWx1ZSkgPyByZXMgOiBkZWZhdWx0VmFsdWU7XG4gIH1cbiAgLy8gQ29tcGxleCBwcm9wZXJ0eSBwYXRoXG4gIGNvbnN0IG9wdGlvbmFsID0gcGF0aC5jaGFyQXQoaSAtIDEpID09PSAnPyc7XG4gIGNvbnN0IGtleSA9IHBhdGguc3Vic3RyaW5nKDAsIG9wdGlvbmFsID8gaSAtIDEgOiBpKTtcbiAgaWYgKGlzTmlsKG9ialtrZXldKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBPYmplY3Qgb3IgQXJyYXlcbiAgICAvLyBSZWN1cnNpdmUgY2FsbFxuICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmpba2V5XSwgcGF0aC5zdWJzdHJpbmcoaSArIDEpKTtcbiAgfVxuICBpZiAob3B0aW9uYWwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9wZXJ0eSBwYXRoOiAnJHtrZXl9JyBpcyBub3QgYW4gdmFsaWQgb2JqZWN0LmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHk8VCA9IGFueSwgSyBleHRlbmRzIGtleW9mIFQgPSBhbnk+KG9iajogVCwga2V5OiBLKTogVFtLXSB7XG4gIGlmIChpc05pbChvYmopKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gb2JqW2tleV07IC8vIEluZmVycmVkIHR5cGUgaXMgVFtLXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHlCeVBhdGhBc1N0cmluZyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlcyA9IGdldFByb3BlcnR5QnlQYXRoKG9iaiwgcGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgcmV0dXJuIHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gcmVzIDogaXNOaWwocmVzKSA/IHJlcyA6ICcnICsgcmVzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBhbiBvYmplY3QncyBwcm9wZXJ0eSwgdXNpbmcgYSBwYXRoIChsaWtlICc8cHJvcGVydHlfMT4uPHN1Yl9wcm9wZXJ0eV8xPicpXG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0gcGF0aFxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJuIHRoZSBnaXZlbiBvYmpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3BlcnR5QnlQYXRoPFQgPSBhbnk+KG9iajogVCwgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIHZhbHVlOiBhbnkpOiBUIHtcbiAgLy8gUGF0aCBpcyBhbiBhcnJheTogY29udmVydCBwYXRoIHRvIHN0cmluZ1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgIHJldHVybiBzZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGguam9pbignLicpLCB2YWx1ZSk7XG4gIH1cbiAgaWYgKGlzTmlsKG9iaikpIHJldHVybiBvYmo7IC8vIFNraXBcbiAgY29uc3QgaSA9IHBhdGguaW5kZXhPZignLicpO1xuICAvLyBTaW1wbGUgcHJvcGVydHkgcGF0aFxuICBpZiAoaSA9PT0gLTEpIHtcbiAgICBvYmpbcGF0aF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIGNvbnN0IGtleSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpO1xuICBpZiAoaXNOaWwob2JqW2tleV0pKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob2JqW2tleV0gJiYgdHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBzZXRQcm9wZXJ0eUJ5UGF0aChvYmpba2V5XSwgcGF0aC5zdWJzdHJpbmcoaSArIDEpLCB2YWx1ZSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvcm0gcGF0aDogJyR7a2V5fScgaXMgbm90IGFuIHZhbGlkIG9iamVjdC5gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKG1zIDw9IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2U8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+KTogdmFsdWUgaXMgUHJvbWlzZTxUPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWU/LlsndGhlbiddID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZT8uWydjYXRjaCddID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFJvdW5kcyBhIG51bWVyaWMgdmFsdWUgdG8gJ25iRGVjaW1hbCcgZGVjaW1hbCBwbGFjZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSByb3VuZGVkLiBDYW4gYmUgYSBudW1iZXIsIHVuZGVmaW5lZCwgb3IgbnVsbC5cbiAqIEBwYXJhbSBuYkRlY2ltYWwgdGhlIG51bWJlciBvZiBkZWNpbWFsIChkZWZhdWx0OiAyKVxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgcm91bmRlZCB2YWx1ZSB3aXRoIHR3byBkZWNpbWFsIHBsYWNlcyBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgYSB2YWxpZCBudW1iZXI7IG90aGVyd2lzZSwgcmV0dXJucyB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbCwgbmJEZWNpbWFsPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlzTm90TmlsT3JOYU4oK3ZhbHVlKSkge1xuICAgIG5iRGVjaW1hbCA9IG5iRGVjaW1hbCA/PyAyO1xuICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucG93KDEwLCBuYkRlY2ltYWwpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCgrdmFsdWUgKyBOdW1iZXIuRVBTSUxPTikgKiBmYWN0b3IpIC8gZmFjdG9yO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsc09yTmlsKHZhbHVlMTogYW55LCB2YWx1ZTI6IGFueSkge1xuICByZXR1cm4gdmFsdWUxID09PSB2YWx1ZTIgfHwgKGlzTmlsKHZhbHVlMSkgJiYgaXNOaWwodmFsdWUyKSk7XG59XG5cbi8qKlxuICogcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcmV0dXJuIHRoZSByZW1vdmVkIGVsZW1lbnRzXG4gKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IG9uIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZFxuICogQHBhcmFtIHByZWRpY2F0ZSB0aGUgc2VsZWN0aW9uIHByZWRpY2F0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKTogVFtdIHtcbiAgbGV0IG5iUmVtb3ZlID0gMDtcbiAgcmV0dXJuIGFycmF5XG4gICAgLnNsaWNlKClcbiAgICAubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgIG5iUmVtb3ZlKys7IC8vIGdsaXRjaCBjb3VudGVyIHRvIGF2b2lkIGluZGV4IGdhcFxuICAgICAgICByZXR1cm4gYXJyYXkuc3BsaWNlKGluZGV4IC0gbmJSZW1vdmUgKyAxLCAxKVswXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pXG4gICAgLmZpbHRlcihpc05vdE5pbCk7XG59XG5cbi8qKlxuICogcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcmV0dXJuIHRoZSByZW1vdmVkIGVsZW1lbnRcbiAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkgb24gd2hpY2ggdGhlIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkXG4gKiBAcGFyYW0gcHJlZGljYXRlIHRoZSBzZWxlY3Rpb24gcHJlZGljYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmU8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pOiBUIHtcbiAgcmV0dXJuIGFycmF5LnNsaWNlKCkuZmluZCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcGl0YWxpemVGaXJzdExldHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cmluZygxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmNhcGl0YWxpemVGaXJzdExldHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiB2YWx1ZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHZhbHVlLnN1YnN0cmluZygxKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBib29sZWFuVG9TdHJpbmcodmFsdWU6IGFueSwgb3B0czogeyB5ZXNMYWJlbDogc3RyaW5nOyBub0xhYmVsOiBzdHJpbmcgfSA9IHsgeWVzTGFiZWw6ICdDT01NT04uWUVTJywgbm9MYWJlbDogJ0NPTU1PTi5OTycgfSkge1xuICBpZiAoaXNOaWwodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09ICd0cnVlJyA/IG9wdHMueWVzTGFiZWwgOiBvcHRzLm5vTGFiZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5UHJvcGVydHk8VCwgTSBleHRlbmRzIEtleVZhbHVlVHlwZTxUPiA9IEtleVZhbHVlVHlwZTxUPj4oYXJyYXk6IFRbXSB8IHJlYWRvbmx5IFRbXSwgcHJvcGVydHlOYW1lOiBrZXlvZiBUIHwgc3RyaW5nKTogTSB7XG4gIHJldHVybiAoYXJyYXkgfHwgW10pLnJlZHVjZSgocmVzLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9ICh2YWx1ZSBhcyB1bmtub3duIGFzIGFueSk/Lltwcm9wZXJ0eU5hbWVdO1xuICAgIGlmIChpc05vdE5pbChrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9LCB7fSkgYXMgTTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0QnlJZDxULCBNIGV4dGVuZHMgS2V5VmFsdWVUeXBlPFQ+ID0gS2V5VmFsdWVUeXBlPFQ+PihhcnJheTogVFtdIHwgcmVhZG9ubHkgVFtdKTogTSB7XG4gIHJldHVybiAoYXJyYXkgfHwgW10pLnJlZHVjZShcbiAgICAocmVzLCB2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdmFsdWU/LlsnaWQnXTtcbiAgICAgIGlmIChpc05vdE5pbChrZXkpKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG4gICAgPE0+e31cbiAgKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBhbiBhcnJheSwgaW50byBhIG1hcCBvZiBhcnJheSwgZ3JvdXAgYnkgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RCeVByb3BlcnR5PFQ+KHZhbHVlczogVFtdLCBwcm9wZXJ0eU5hbWU6IGtleW9mIFQsIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlcik6IEtleVZhbHVlVHlwZTxUW10+IHtcbiAgcmV0dXJuICh2YWx1ZXMgfHwgW10pLnJlZHVjZShcbiAgICAocmVzLCBpdGVtKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtPy5bcHJvcGVydHlOYW1lXSA/PyBkZWZhdWx0VmFsdWU7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzW2tleV0gPSByZXNba2V5XSB8fCBbXTtcbiAgICAgICAgcmVzW2tleV0ucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSxcbiAgICA8S2V5VmFsdWVUeXBlPFRbXT4+e31cbiAgKTtcbn1cblxuXG4vKipcbiAqIFNwbGl0IGFuIGFycmF5LCBpbnRvIGEgbWFwIG9mIGFycmF5LCBncm91cCBieSBwcm9wZXJ0eSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0QnlQcm9wZXJ0eVBhdGg8VD4odmFsdWVzOiBUW10sIHByb3BlcnR5UGF0aDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgZGVmYXVsdFZhbHVlPzogc3RyaW5nIHwgbnVtYmVyKTogS2V5VmFsdWVUeXBlPFRbXT4ge1xuICByZXR1cm4gKHZhbHVlcyB8fCBbXSkucmVkdWNlKFxuICAgIChyZXMsIGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGdldFByb3BlcnR5QnlQYXRoKGl0ZW0sIHByb3BlcnR5UGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyB8fCB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXNba2V5XSA9IHJlc1trZXldIHx8IFtdO1xuICAgICAgICByZXNba2V5XS5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LFxuICAgIDxLZXlWYWx1ZVR5cGU8VFtdPj57fVxuICApO1xufVxuXG5cbi8qKlxuICogU3BsaXQgYW4gYXJyYXkgaW50byBjaHVua3Mgd2l0aCBmaXhlZCBzaXplXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEFycmF5SW5DaHVua3M8VCA9IGFueT4odmFsdWU6IFRbXSwgY2h1bmtTaXplOiBudW1iZXIpOiBUW11bXSB7XG4gIGlmICghdmFsdWU/Lmxlbmd0aCkgcmV0dXJuIFtdO1xuICBpZiAoY2h1bmtTaXplID09PSAtMSkgcmV0dXJuIFt2YWx1ZV07IC8vIE9ubHkgb25lIHBhZ2VcbiAgaWYgKCFjaHVua1NpemUgfHwgaXNOYU4oY2h1bmtTaXplKSB8fCBjaHVua1NpemUgPCAxKSB7XG4gICAgdGhyb3cgJ1tzcGxpdEFycmF5SW5DaHVua3NdIE51bWJlciBvZiByb3cgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciAhJztcbiAgfVxuICBpZiAodmFsdWUubGVuZ3RoIDw9IGNodW5rU2l6ZSkge1xuICAgIHJldHVybiBbdmFsdWVdO1xuICB9XG4gIGxldCBsZW5ndGggPSBNYXRoLnJvdW5kKHZhbHVlLmxlbmd0aCAvIGNodW5rU2l6ZSArIDAuNSk7XG4gIGlmICh2YWx1ZS5sZW5ndGggPT09IChsZW5ndGggLSAxKSAqIGNodW5rU2l6ZSkge1xuICAgIGxlbmd0aCA9IGxlbmd0aCAtIDE7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFydCA9IGkgKiBjaHVua1NpemU7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4odmFsdWUubGVuZ3RoLCBzdGFydCArIGNodW5rU2l6ZSk7XG4gICAgcmVzdWx0W2ldID0gdmFsdWUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHR3byBvYmplY3RzIG9yIHR3byB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogVHdvIG9iamVjdHMgb3IgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAqXG4gKiAqIEJvdGggb2JqZWN0cyBvciB2YWx1ZXMgcGFzcyBgPT09YCBjb21wYXJpc29uLlxuICogKiBCb3RoIG9iamVjdHMgb3IgdmFsdWVzIGFyZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhbGwgb2YgdGhlaXIgcHJvcGVydGllcyBhcmUgZXF1YWwgYnlcbiAqICAgY29tcGFyaW5nIHRoZW0gd2l0aCBgZXF1YWxzYC5cbiAqXG4gKiBAcGFyYW0gbzEgT2JqZWN0IG9yIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gbzIgT2JqZWN0IG9yIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFyZ3VtZW50cyBhcmUgZXF1YWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMobzE6IGFueSwgbzI6IGFueSk6IGJvb2xlYW4ge1xuICBpZiAobzEgPT09IG8yKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG8xID09PSBudWxsIHx8IG8yID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChvMSAhPT0gbzEgJiYgbzIgIT09IG8yKSByZXR1cm4gdHJ1ZTsgLy8gTmFOID09PSBOYU5cbiAgY29uc3QgdDEgPSB0eXBlb2YgbzE7XG4gIGNvbnN0IHQyID0gdHlwZW9mIG8yO1xuICBsZXQgbGVuZ3RoOiBudW1iZXI7XG4gIGxldCBrZXk6IGFueTtcbiAgbGV0IGtleVNldDogYW55O1xuICBpZiAodDEgPT09IHQyICYmIHQxID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8xKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG8yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKChsZW5ndGggPSBvMS5sZW5ndGgpID09PSBvMi5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobzIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGtleVNldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgICBmb3IgKGtleSBpbiBvMSkge1xuICAgICAgICBpZiAoIWVxdWFscyhvMVtrZXldLCBvMltrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGtleSBpbiBvMikge1xuICAgICAgICBpZiAoIShrZXkgaW4ga2V5U2V0KSAmJiB0eXBlb2YgbzJba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmNvbnN0IF9jbG9uZSA9IHVud3JhcEVTTW9kdWxlPHR5cGVvZiBjbG9uZUltcG9ydGVkPihjbG9uZUltcG9ydGVkKTtcblxuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBCZWFucyB7XG4gIC8qKlxuICAgKiBEZWVwIGNsb25lLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B2b3JiL2Nsb25lXG4gICAqL1xuICBzdGF0aWMgY2xvbmUgPSBfY2xvbmU7XG5cbiAgLyoqXG4gICAqIENvcHkgYSBzb3VyY2Ugb2JqZWN0LCBieSBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBkYXRhVHlwZS5cbiAgICogSU1QT1JUQU5UOiBleHRyYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIE5PVCBpbiB0aGUgdGFyZ2V0Q2xhc3MgYXJlIE5PVCBjb3BpZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gY29weVxuICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGNsYXNzIHRvIHVzZSBhcyB0YXJnZXQgY2xhc3NcbiAgICogQHBhcmFtIGtleXMgVGhlIGtleXMgdG8gY29weS4gSWYgZW1wdHksIHdpbGwgY29weSBvbmx5IE5PVCBvcHRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIGRhdGFUeXBlXG4gICAqL1xuICBzdGF0aWMgY29weTxUPihzb3VyY2U6IFQsIGRhdGFUeXBlOiBuZXcgKCkgPT4gVCwga2V5cz86IEtleXNFbnVtPFQ+KTogVCB7XG4gICAgaWYgKGlzTmlsKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IGRhdGFUeXBlKCk7XG4gICAgT2JqZWN0LmtleXMoa2V5cyB8fCB0YXJnZXQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgaWYgYW4gb2JqZWN0IGFsbCBhbGwgcHJvcGVydGllcyB0byBuaWxcbiAgICovXG4gIHN0YXRpYyBpc0VtcHR5PFQ+KFxuICAgIGRhdGE6IFQsXG4gICAga2V5cz86IEtleXNFbnVtPFQ+IHwgc3RyaW5nW10sXG4gICAgb3B0cz86IHtcbiAgICAgIGJsYW5rU3RyaW5nTGlrZUVtcHR5PzogYm9vbGVhbjtcbiAgICB9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBpc05pbChkYXRhKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogT2JqZWN0LmtleXMoa2V5cyB8fCBkYXRhKSlcbiAgICAgICAgLy8gRmluZCBpbmRleCBvZiB0aGUgZmlyc3QgTk9UIG5pbCB2YWx1ZVxuICAgICAgICAuZmluZEluZGV4KChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuICFCZWFucy5pc0VtcHR5KHZhbHVlLCBudWxsLCBvcHRzKTsgLy8gTG9vcFxuICAgICAgICAgIGlmIChvcHRzICYmIG9wdHMuYmxhbmtTdHJpbmdMaWtlRW1wdHkgPT09IHRydWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIGlzTm90TmlsT3JCbGFuayh2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKTtcbiAgICAgICAgfSkgPT09IC0xXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0QnlJZDxUPihhcnJheTogVFtdKTogS2V5VmFsdWVUeXBlPFRbXT4ge1xuICAgIHJldHVybiBjb2xsZWN0QnlQcm9wZXJ0eShhcnJheSwgJ2lkJyBhcyBrZXlvZiBUKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0QnlQcm9wZXJ0eSA9IGNvbGxlY3RCeVByb3BlcnR5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudFdpdGhDbGFzcyhlbGVtOiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIGlmICghY2xhc3NOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtPy5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdEFycmF5czxUID0gYW55Pih2YWx1ZXM6IFRbXVtdKTogVFtdIHtcbiAgaWYgKGlzRW1wdHlBcnJheSh2YWx1ZXMpKSByZXR1cm4gW107XG5cbiAgLy8gVXRpbGlzZSBsYSBtw6l0aG9kZSByZWR1Y2UgcG91ciBvYnRlbmlyIGwnaW50ZXJzZWN0aW9uIGRlcyB0YWJsZWF1eFxuICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MuZmlsdGVyKCh4KSA9PiBjdXJyLmluY2x1ZGVzKHgpKSwgdmFsdWVzWzBdLnNsaWNlKCkpO1xufVxuXG4vKipcbiAqIEludGVycG9sYXRlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgcGxhY2Vob2xkZXJzIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIHN0cmluZyBjb250YWluaW5nIHBsYWNlaG9sZGVycyBlbmNsb3NlZCBpbiBkb3VibGUgY3VybHkgYnJhY2VzIChlLmcuLCB7e2tleX19KS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gaW50ZXJwb2xhdGVQYXJhbXMgLSBBbiBvYmplY3QgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIGludGVycG9sYXRpb24uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzIHJlcGxhY2VkIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzLCBvciB0aGUgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHBsYWNlaG9sZGVycyBhcmUgbWF0Y2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlU3RyaW5nKG1lc3NhZ2U6IHN0cmluZywgaW50ZXJwb2xhdGVQYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICBpZiAoaXNOaWxPckJsYW5rKG1lc3NhZ2UpKSByZXR1cm4gbWVzc2FnZTtcblxuICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKC97eyhbXn1dKyl9fS9nLCAobWF0Y2g6IHN0cmluZywgcGF0aDogc3RyaW5nKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSBnZXRQcm9wZXJ0eUJ5UGF0aEFzU3RyaW5nKGludGVycG9sYXRlUGFyYW1zLCBwYXRoLnRyaW0oKSk7XG4gICAgICByZXR1cm4gcGFyYW1WYWx1ZSB8fCAnJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gYmluZCBhbiBleHByZXNzaW9uOlxcblxcdC0gbWVzc2FnZTogJHttZXNzYWdlfVxcblxcdC0gZXhwcmVzc2lvbjogJHttYXRjaH1gKTtcbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBUcmFuc2Zvcm1zIGEgdmFsdWUgKHR5cGljYWxseSBhIHN0cmluZykgdG8gYSBudW1iZXIuXG4gKiBJbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgdHJhbnNmb3JtIGZ1bmN0aW9uIG9mIGFuIGlucHV0LlxuICogU2hvdWxkIHJldHVybiBuPXVuZGVmaW5lZCB3aGVuIGZvciBhIG5pbCBpbnB1dFxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGJlIHRyYW5zZm9ybWVkLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgVmFsdWUgdG8gdXNlIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBjYW4ndCBiZSBwYXJzZWQgYXMgYSBudW1iZXIuXG4gKlxuICogIEB1c2FnZU5vdGVzXG4gKiAgYGBgdHNcbiAqICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBpZCE6IG51bWJlcjtcbiAqICBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJPck5pbEF0dHJpYnV0ZSh2YWx1ZTogdW5rbm93biwgZmFsbGJhY2tWYWx1ZSA9IE5hTik6IG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIHZhbHVlIGFzIHVuZGVmaW5lZCB8IG51bGw7XG4gIC8vIHBhcnNlRmxvYXQodmFsdWUpIGhhbmRsZXMgbW9zdCBvZiB0aGUgY2FzZXMgd2UncmUgaW50ZXJlc3RlZCBpbiAoaXQgdHJlYXRzIG51bGwsIGVtcHR5IHN0cmluZyxcbiAgLy8gYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzIGFzIE5hTiwgd2hlcmUgTnVtYmVyIGp1c3QgdXNlcyAwKSBidXQgaXQgY29uc2lkZXJzIHRoZSBzdHJpbmdcbiAgLy8gJzEyM2hlbGxvJyB0byBiZSBhIHZhbGlkIG51bWJlci4gVGhlcmVmb3JlIHdlIGFsc28gY2hlY2sgaWYgTnVtYmVyKHZhbHVlKSBpcyBOYU4uXG4gIGNvbnN0IGlzTnVtYmVyVmFsdWUgPSAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSBhcyBhbnkpKSAmJiAhaXNOYU4oTnVtYmVyKHZhbHVlKSk7XG4gIHJldHVybiBpc051bWJlclZhbHVlID8gTnVtYmVyKHZhbHVlKSA6IGZhbGxiYWNrVmFsdWU7XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIGdpdmVuIG51bWJlciBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWwgLSBUaGUgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZC5cbiAqIEBwYXJhbSB7SW50bC5OdW1iZXJGb3JtYXRPcHRpb25zICYgeyBmaXhlZERlY2ltYWxzPzogbnVtYmVyIH19IFtvcHRzXSAtIEFuIG9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIGZvcm1hdHRpbmcgb3B0aW9ucy4gSXQgY2FuIGluY2x1ZGUgc3RhbmRhcmQgYEludGwuTnVtYmVyRm9ybWF0T3B0aW9uc2AgcHJvcGVydGllcyBhbmQgYW4gYWRkaXRpb25hbCBgZml4ZWREZWNpbWFsc2AgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGZpeGVkIGRlY2ltYWwgcGxhY2VzLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG51bWJlciBhcyBhIHN0cmluZywgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb1N0cmluZyh2YWw6IG51bWJlciwgb3B0cz86IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyAmIHsgZml4ZWREZWNpbWFscz86IG51bWJlciB9KTogc3RyaW5nIHtcbiAgLy8gRm9ybWF0IHRoZSBvdXRwdXQgdG8gZGlzcGxheSBhbnkgd2F5IHlvdSB3YW50IGhlcmUuXG4gIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwgJiYgIWlzTmFOKHZhbCkpIHtcbiAgICBpZiAob3B0cz8uZml4ZWREZWNpbWFscykge1xuICAgICAgcmV0dXJuIHZhbC50b0ZpeGVkKG9wdHMuZml4ZWREZWNpbWFscyk7XG4gICAgfVxuICAgIHJldHVybiB2YWwudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZGVlcE1lcmdlU2tpcFVuZGVmaW5lZCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHNXaXRob3V0VW5kZWZpbmVkKC4uLm9iamVjdHM6IHVua25vd25bXSk6IHVua25vd24ge1xuICByZXR1cm4gX3NhZmVEZWVwTWVyZ2VTa2lwVW5kZWZpbmVkKHt9LCBvYmplY3RzLCBuZXcgV2Vha1NldCgpKTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZGVlcE1lcmdlU2tpcFVuZGVmaW5lZCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ25Ta2lwVW5kZWZpbmVkKHRhcmdldDogdW5rbm93biwgLi4uc291cmNlczogdW5rbm93bltdKTogdW5rbm93biB7XG4gIHJldHVybiBfc2FmZURlZXBNZXJnZVNraXBVbmRlZmluZWQodGFyZ2V0LCBzb3VyY2VzLCBuZXcgV2Vha1NldCgpKTtcbn1cblxuLyoqXG4gKiBNZXJnZSBtYW55IG9iamVjdHMgaW50byBvbmUgbmV3IG9iamVjdCwgc2tpcHBpbmcgdW5kZWZpbmVkIG9iamVjdHMgb3IgcHJvcGVydGllcyB3aXRoIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgcmVjdXJzaXZlLCBidXQgcHJldmVudHMgY2lyY3VsYXIgcmVmZXJlbmNlcyAtIGZpeCBpc3N1ZSBzdW1hcmlzLWFwcCMxOTI5LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdG8gbWVyZ2UgcHJvcGVydGllcyBpbnRvLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QgaWYgbm90IHByb3ZpZGVkLlxuICogQHBhcmFtIHsuLi51bmtub3duW119IHNvdXJjZXMgLSBPbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBtZXJnZSBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0LlxuICogQHJldHVybiB7VH0gVGhlIHJlc3VsdGluZyBvYmplY3QgYWZ0ZXIgbWVyZ2luZyB0aGUgdGFyZ2V0IGFuZCBzb3VyY2Ugb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNZXJnZVNraXBVbmRlZmluZWQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih0YXJnZXQ6IFBhcnRpYWw8VD4gPSB7fSBhcyBULCAuLi5zb3VyY2VzOiB1bmtub3duW10pOiBUIHtcbiAgcmV0dXJuIF9zYWZlRGVlcE1lcmdlU2tpcFVuZGVmaW5lZCh0YXJnZXQsIHNvdXJjZXMsIG5ldyBXZWFrU2V0KCkpO1xufVxuXG4vKipcbiAqIFNhZmVseSBtZXJnZSBwcm9wZXJ0aWVzIGZyb20gc291cmNlIG9iamVjdHMgdG8gdGhlIHRhcmdldCBvYmplY3Qgd2hpbGUgc2tpcHBpbmcgdW5kZWZpbmVkIHZhbHVlcy5cbiAqIFByZXZlbnRzIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnkga2VlcGluZyB0cmFjayBvZiBwcm9jZXNzZWQgc291cmNlcy5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHdoaWNoIHByb3BlcnRpZXMgc2hvdWxkIGJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHt1bmtub3duW119IHNvdXJjZXMgLSBBbiBhcnJheSBvZiBzb3VyY2Ugb2JqZWN0cyBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gYmUgYXNzaWduZWQuXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gdmlzaXRlZCAtIEFuIG9wdGlvbmFsIGFycmF5IHRvIHRyYWNrIHByb2Nlc3NlZCBzb3VyY2Ugb2JqZWN0cyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICogQHJldHVybiB7dW5rbm93bn0gVGhlIHVwZGF0ZWQgdGFyZ2V0IG9iamVjdCBhZnRlciBtZXJnaW5nIHRoZSBzb3VyY2Ugb2JqZWN0cywgZXhjbHVkaW5nIHVuZGVmaW5lZCBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBfc2FmZURlZXBNZXJnZVNraXBVbmRlZmluZWQ8VD4oXG4gIHRhcmdldDogYW55LFxuICBzb3VyY2VzOiB1bmtub3duW10sXG4gIHZpc2l0ZWQ6IFdlYWtTZXQ8b2JqZWN0PlxuKTogVCB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgLy8gU2kgdGFyZ2V0IGVzdCBmYWxzeSwgb24gcHJlbmQgbGUgcHJlbWllciBzb3VyY2UgdmFsaWRlXG4gIGlmICghdGFyZ2V0IHx8IHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHJldHVybiBfc2FmZURlZXBNZXJnZVNraXBVbmRlZmluZWQoc291cmNlc1swXSwgc291cmNlcy5zbGljZSgxKSwgdmlzaXRlZCkgYXMgVDtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIFNraXAgaWYgYWxyZWFkeSB2aXNpdGVkXG4gICAgaWYgKHZpc2l0ZWQuaGFzKHNvdXJjZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2aXNpdGVkLmFkZChzb3VyY2UpO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgIXZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdClcbiAgICAgICkge1xuICAgICAgICAvLyBNZXJnZSByw6ljdXJzaWZcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBfc2FmZURlZXBNZXJnZVNraXBVbmRlZmluZWQoXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPz8ge30sXG4gICAgICAgICAgW3ZhbHVlXSxcbiAgICAgICAgICB2aXNpdGVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcmltaXRpdmUsIG51bGwsIGFycmF5LCBldGMuIOKGkiByZXBsYWNlXG4gICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cbiJdfQ==