@auth0/auth0-spa-js 1.21.1 → 1.22.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.
@@ -406,10 +406,10 @@ var shared = createCommonjsModule(function (module) {
406
406
  (module.exports = function (key, value) {
407
407
  return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});
408
408
  })('versions', []).push({
409
- version: '3.22.0',
409
+ version: '3.22.4',
410
410
  mode: 'global',
411
411
  copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',
412
- license: 'https://github.com/zloirock/core-js/blob/v3.22.0/LICENSE',
412
+ license: 'https://github.com/zloirock/core-js/blob/v3.22.4/LICENSE',
413
413
  source: 'https://github.com/zloirock/core-js'
414
414
  });
415
415
  });
@@ -585,6 +585,21 @@ var createNonEnumerableProperty = descriptors ? function (object, key, value) {
585
585
  return object;
586
586
  };
587
587
 
588
+ var FunctionPrototype$1 = Function.prototype;
589
+ // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
590
+ var getDescriptor = descriptors && Object.getOwnPropertyDescriptor;
591
+
592
+ var EXISTS = hasOwnProperty_1(FunctionPrototype$1, 'name');
593
+ // additional protection from minified / mangled / dropped function names
594
+ var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';
595
+ var CONFIGURABLE = EXISTS && (!descriptors || (descriptors && getDescriptor(FunctionPrototype$1, 'name').configurable));
596
+
597
+ var functionName = {
598
+ EXISTS: EXISTS,
599
+ PROPER: PROPER,
600
+ CONFIGURABLE: CONFIGURABLE
601
+ };
602
+
588
603
  var functionToString = functionUncurryThis(Function.toString);
589
604
 
590
605
  // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
@@ -668,50 +683,56 @@ var internalState = {
668
683
  getterFor: getterFor
669
684
  };
670
685
 
671
- var FunctionPrototype$1 = Function.prototype;
672
- // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe
673
- var getDescriptor = descriptors && Object.getOwnPropertyDescriptor;
674
-
675
- var EXISTS = hasOwnProperty_1(FunctionPrototype$1, 'name');
676
- // additional protection from minified / mangled / dropped function names
677
- var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';
678
- var CONFIGURABLE = EXISTS && (!descriptors || (descriptors && getDescriptor(FunctionPrototype$1, 'name').configurable));
686
+ var makeBuiltIn_1 = createCommonjsModule(function (module) {
687
+ var defineProperty = objectDefineProperty.f;
688
+ var CONFIGURABLE_FUNCTION_NAME = functionName.CONFIGURABLE;
679
689
 
680
- var functionName = {
681
- EXISTS: EXISTS,
682
- PROPER: PROPER,
683
- CONFIGURABLE: CONFIGURABLE
684
- };
685
690
 
686
- var redefine = createCommonjsModule(function (module) {
687
- var CONFIGURABLE_FUNCTION_NAME = functionName.CONFIGURABLE;
688
691
 
689
- var getInternalState = internalState.get;
690
692
  var enforceInternalState = internalState.enforce;
693
+ var getInternalState = internalState.get;
694
+
695
+ var CONFIGURABLE_LENGTH = !fails(function () {
696
+ return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;
697
+ });
698
+
691
699
  var TEMPLATE = String(String).split('String');
692
700
 
693
- (module.exports = function (O, key, value, options) {
701
+ var makeBuiltIn = module.exports = function (value, name, options) {
702
+ if (String(name).slice(0, 7) === 'Symbol(') {
703
+ name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
704
+ }
705
+ if (options && options.getter) name = 'get ' + name;
706
+ if (options && options.setter) name = 'set ' + name;
707
+ if (!hasOwnProperty_1(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {
708
+ defineProperty(value, 'name', { value: name, configurable: true });
709
+ }
710
+ if (CONFIGURABLE_LENGTH && options && hasOwnProperty_1(options, 'arity') && value.length !== options.arity) {
711
+ defineProperty(value, 'length', { value: options.arity });
712
+ }
713
+ var state = enforceInternalState(value);
714
+ if (!hasOwnProperty_1(state, 'source')) {
715
+ state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
716
+ } return value;
717
+ };
718
+
719
+ // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
720
+ // eslint-disable-next-line no-extend-native -- required
721
+ Function.prototype.toString = makeBuiltIn(function toString() {
722
+ return isCallable(this) && getInternalState(this).source || inspectSource(this);
723
+ }, 'toString');
724
+ });
725
+
726
+ var defineBuiltIn = function (O, key, value, options) {
694
727
  var unsafe = options ? !!options.unsafe : false;
695
728
  var simple = options ? !!options.enumerable : false;
696
729
  var noTargetGet = options ? !!options.noTargetGet : false;
697
730
  var name = options && options.name !== undefined ? options.name : key;
698
- var state;
699
- if (isCallable(value)) {
700
- if (String(name).slice(0, 7) === 'Symbol(') {
701
- name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
702
- }
703
- if (!hasOwnProperty_1(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {
704
- createNonEnumerableProperty(value, 'name', name);
705
- }
706
- state = enforceInternalState(value);
707
- if (!state.source) {
708
- state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
709
- }
710
- }
731
+ if (isCallable(value)) makeBuiltIn_1(value, name, options);
711
732
  if (O === global_1) {
712
733
  if (simple) O[key] = value;
713
734
  else setGlobal(key, value);
714
- return;
735
+ return O;
715
736
  } else if (!unsafe) {
716
737
  delete O[key];
717
738
  } else if (!noTargetGet && O[key]) {
@@ -719,11 +740,8 @@ var TEMPLATE = String(String).split('String');
719
740
  }
720
741
  if (simple) O[key] = value;
721
742
  else createNonEnumerableProperty(O, key, value);
722
- // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
723
- })(Function.prototype, 'toString', function toString() {
724
- return isCallable(this) && getInternalState(this).source || inspectSource(this);
725
- });
726
- });
743
+ return O;
744
+ };
727
745
 
728
746
  var ceil = Math.ceil;
729
747
  var floor = Math.floor;
@@ -930,8 +948,7 @@ var _export = function (options, source) {
930
948
  if (options.sham || (targetProperty && targetProperty.sham)) {
931
949
  createNonEnumerableProperty(sourceProperty, 'sham', true);
932
950
  }
933
- // extend global
934
- redefine(target, key, sourceProperty, options);
951
+ defineBuiltIn(target, key, sourceProperty, options);
935
952
  }
936
953
  };
937
954
 
@@ -1171,7 +1188,7 @@ var FORCED$2 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
1171
1188
  // `Array.prototype.concat` method
1172
1189
  // https://tc39.es/ecma262/#sec-array.prototype.concat
1173
1190
  // with adding support of @@isConcatSpreadable and @@species
1174
- _export({ target: 'Array', proto: true, forced: FORCED$2 }, {
1191
+ _export({ target: 'Array', proto: true, arity: 1, forced: FORCED$2 }, {
1175
1192
  // eslint-disable-next-line no-unused-vars -- required for `.length`
1176
1193
  concat: function concat(arg) {
1177
1194
  var O = toObject(this);
@@ -1203,7 +1220,7 @@ var objectToString = toStringTagSupport ? {}.toString : function toString() {
1203
1220
  // `Object.prototype.toString` method
1204
1221
  // https://tc39.es/ecma262/#sec-object.prototype.tostring
1205
1222
  if (!toStringTagSupport) {
1206
- redefine(Object.prototype, 'toString', objectToString, { unsafe: true });
1223
+ defineBuiltIn(Object.prototype, 'toString', objectToString, { unsafe: true });
1207
1224
  }
1208
1225
 
1209
1226
  // `Object.keys` method
@@ -1385,9 +1402,9 @@ var symbolDefineToPrimitive = function () {
1385
1402
  // `Symbol.prototype[@@toPrimitive]` method
1386
1403
  // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
1387
1404
  // eslint-disable-next-line no-unused-vars -- required for .length
1388
- redefine(SymbolPrototype, TO_PRIMITIVE, function (hint) {
1405
+ defineBuiltIn(SymbolPrototype, TO_PRIMITIVE, function (hint) {
1389
1406
  return functionCall(valueOf, this);
1390
- });
1407
+ }, { arity: 1 });
1391
1408
  }
1392
1409
  };
1393
1410
 
@@ -1621,11 +1638,11 @@ if (!nativeSymbol) {
1621
1638
 
1622
1639
  SymbolPrototype$1 = $Symbol[PROTOTYPE];
1623
1640
 
1624
- redefine(SymbolPrototype$1, 'toString', function toString() {
1641
+ defineBuiltIn(SymbolPrototype$1, 'toString', function toString() {
1625
1642
  return getInternalState$2(this).tag;
1626
1643
  });
1627
1644
 
1628
- redefine($Symbol, 'withoutSetter', function (description) {
1645
+ defineBuiltIn($Symbol, 'withoutSetter', function (description) {
1629
1646
  return wrap(uid(description), description);
1630
1647
  });
1631
1648
 
@@ -1649,7 +1666,7 @@ if (!nativeSymbol) {
1649
1666
  }
1650
1667
  });
1651
1668
  {
1652
- redefine(ObjectPrototype$2, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
1669
+ defineBuiltIn(ObjectPrototype$2, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
1653
1670
  }
1654
1671
  }
1655
1672
  }
@@ -1789,7 +1806,7 @@ var fixIllFormed = function (match, offset, string) {
1789
1806
  if ($stringify) {
1790
1807
  // `JSON.stringify` method
1791
1808
  // https://tc39.es/ecma262/#sec-json.stringify
1792
- _export({ target: 'JSON', stat: true, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE }, {
1809
+ _export({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE }, {
1793
1810
  // eslint-disable-next-line no-unused-vars -- required for `.length`
1794
1811
  stringify: function stringify(it, replacer, space) {
1795
1812
  var args = arraySlice(arguments);
@@ -2020,7 +2037,7 @@ if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype$2 = {};
2020
2037
  // `%IteratorPrototype%[@@iterator]()` method
2021
2038
  // https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
2022
2039
  if (!isCallable(IteratorPrototype$2[ITERATOR$4])) {
2023
- redefine(IteratorPrototype$2, ITERATOR$4, function () {
2040
+ defineBuiltIn(IteratorPrototype$2, ITERATOR$4, function () {
2024
2041
  return this;
2025
2042
  });
2026
2043
  }
@@ -2126,7 +2143,7 @@ var defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAUL
2126
2143
  if (objectSetPrototypeOf) {
2127
2144
  objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
2128
2145
  } else if (!isCallable(CurrentIteratorPrototype[ITERATOR$3])) {
2129
- redefine(CurrentIteratorPrototype, ITERATOR$3, returnThis);
2146
+ defineBuiltIn(CurrentIteratorPrototype, ITERATOR$3, returnThis);
2130
2147
  }
2131
2148
  }
2132
2149
  // Set @@toStringTag to native iterators
@@ -2153,14 +2170,14 @@ var defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAUL
2153
2170
  };
2154
2171
  if (FORCED) for (KEY in methods) {
2155
2172
  if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
2156
- redefine(IterablePrototype, KEY, methods[KEY]);
2173
+ defineBuiltIn(IterablePrototype, KEY, methods[KEY]);
2157
2174
  }
2158
2175
  } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
2159
2176
  }
2160
2177
 
2161
2178
  // define iterator
2162
2179
  if (IterablePrototype[ITERATOR$3] !== defaultIterator) {
2163
- redefine(IterablePrototype, ITERATOR$3, defaultIterator, { name: DEFAULT });
2180
+ defineBuiltIn(IterablePrototype, ITERATOR$3, defaultIterator, { name: DEFAULT });
2164
2181
  }
2165
2182
  iterators[NAME] = defaultIterator;
2166
2183
 
@@ -2418,7 +2435,7 @@ var exportTypedArrayMethod$1 = function (KEY, property, forced, options) {
2418
2435
  }
2419
2436
  }
2420
2437
  if (!TypedArrayPrototype[KEY] || forced) {
2421
- redefine(TypedArrayPrototype, KEY, forced ? property
2438
+ defineBuiltIn(TypedArrayPrototype, KEY, forced ? property
2422
2439
  : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property, options);
2423
2440
  }
2424
2441
  };
@@ -2436,14 +2453,14 @@ var exportTypedArrayStaticMethod = function (KEY, property, forced) {
2436
2453
  if (!TypedArray[KEY] || forced) {
2437
2454
  // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable
2438
2455
  try {
2439
- return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);
2456
+ return defineBuiltIn(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && TypedArray[KEY] || property);
2440
2457
  } catch (error) { /* empty */ }
2441
2458
  } else return;
2442
2459
  }
2443
2460
  for (ARRAY in TypedArrayConstructorsList) {
2444
2461
  TypedArrayConstructor = global_1[ARRAY];
2445
2462
  if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {
2446
- redefine(TypedArrayConstructor, KEY, property);
2463
+ defineBuiltIn(TypedArrayConstructor, KEY, property);
2447
2464
  }
2448
2465
  }
2449
2466
  };
@@ -2575,9 +2592,15 @@ var addToUnscopables = function (key) {
2575
2592
  var $includes = arrayIncludes.includes;
2576
2593
 
2577
2594
 
2595
+
2596
+ // FF99+ bug
2597
+ var BROKEN_ON_SPARSE = fails(function () {
2598
+ return !Array(1).includes();
2599
+ });
2600
+
2578
2601
  // `Array.prototype.includes` method
2579
2602
  // https://tc39.es/ecma262/#sec-array.prototype.includes
2580
- _export({ target: 'Array', proto: true }, {
2603
+ _export({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {
2581
2604
  includes: function includes(el /* , fromIndex = 0 */) {
2582
2605
  return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
2583
2606
  }
@@ -2868,7 +2891,7 @@ var collection = function (CONSTRUCTOR_NAME, wrapper, common) {
2868
2891
 
2869
2892
  var fixMethod = function (KEY) {
2870
2893
  var uncurriedNativeMethod = functionUncurryThis(NativePrototype[KEY]);
2871
- redefine(NativePrototype, KEY,
2894
+ defineBuiltIn(NativePrototype, KEY,
2872
2895
  KEY == 'add' ? function add(value) {
2873
2896
  uncurriedNativeMethod(this, value === 0 ? 0 : value);
2874
2897
  return this;
@@ -2947,8 +2970,8 @@ var collection = function (CONSTRUCTOR_NAME, wrapper, common) {
2947
2970
  return Constructor;
2948
2971
  };
2949
2972
 
2950
- var redefineAll = function (target, src, options) {
2951
- for (var key in src) redefine(target, key, src[key], options);
2973
+ var defineBuiltIns = function (target, src, options) {
2974
+ for (var key in src) defineBuiltIn(target, key, src[key], options);
2952
2975
  return target;
2953
2976
  };
2954
2977
 
@@ -3038,7 +3061,7 @@ var collectionStrong = {
3038
3061
  }
3039
3062
  };
3040
3063
 
3041
- redefineAll(Prototype, {
3064
+ defineBuiltIns(Prototype, {
3042
3065
  // `{ Map, Set }.prototype.clear()` methods
3043
3066
  // https://tc39.es/ecma262/#sec-map.prototype.clear
3044
3067
  // https://tc39.es/ecma262/#sec-set.prototype.clear
@@ -3098,7 +3121,7 @@ var collectionStrong = {
3098
3121
  }
3099
3122
  });
3100
3123
 
3101
- redefineAll(Prototype, IS_MAP ? {
3124
+ defineBuiltIns(Prototype, IS_MAP ? {
3102
3125
  // `Map.prototype.get(key)` method
3103
3126
  // https://tc39.es/ecma262/#sec-map.prototype.get
3104
3127
  get: function get(key) {
@@ -3885,7 +3908,7 @@ if (typeof globalNS['Promise'] !== 'function') {
3885
3908
 
3886
3909
  })));
3887
3910
 
3888
- var version = '1.21.1';
3911
+ var version = '1.22.0';
3889
3912
 
3890
3913
  /**
3891
3914
  * @ignore
@@ -3913,7 +3936,7 @@ var CACHE_LOCATION_MEMORY = 'memory';
3913
3936
  /**
3914
3937
  * @ignore
3915
3938
  */
3916
- var MISSING_REFRESH_TOKEN_ERROR_MESSAGE = 'The web worker is missing the refresh token';
3939
+ var MISSING_REFRESH_TOKEN_ERROR_MESSAGE = 'Missing Refresh Token';
3917
3940
  /**
3918
3941
  * @ignore
3919
3942
  */
@@ -4048,6 +4071,20 @@ var MfaRequiredError = /** @class */ (function (_super) {
4048
4071
  return _this;
4049
4072
  }
4050
4073
  return MfaRequiredError;
4074
+ }(GenericError));
4075
+ var MissingRefreshTokenError = /** @class */ (function (_super) {
4076
+ __extends(MissingRefreshTokenError, _super);
4077
+ /* istanbul ignore next */
4078
+ function MissingRefreshTokenError(audience, scope) {
4079
+ var _this = _super.call(this, 'missing_refresh_token', "Missing Refresh Token (audience: '".concat(valueOrEmptyString(audience, [
4080
+ 'default'
4081
+ ]), "', scope: '").concat(valueOrEmptyString(scope), "')")) || this;
4082
+ _this.audience = audience;
4083
+ _this.scope = scope;
4084
+ Object.setPrototypeOf(_this, MissingRefreshTokenError.prototype);
4085
+ return _this;
4086
+ }
4087
+ return MissingRefreshTokenError;
4051
4088
  }(GenericError));
4052
4089
 
4053
4090
  var parseQueryResult = function (queryString) {
@@ -4227,7 +4264,17 @@ var validateCrypto = function () {
4227
4264
  if (typeof getCryptoSubtle() === 'undefined') {
4228
4265
  throw new Error("\n auth0-spa-js must run on a secure origin. See https://github.com/auth0/auth0-spa-js/blob/master/FAQ.md#why-do-i-get-auth0-spa-js-must-run-on-a-secure-origin for more information.\n ");
4229
4266
  }
4230
- };
4267
+ };
4268
+ /**
4269
+ * Returns an empty string when value is falsy, or when it's value is included in the exclude argument.
4270
+ * @param value The value to check
4271
+ * @param exclude An array of values that should result in an empty string.
4272
+ * @returns The value, or an empty string when falsy or included in the exclude argument.
4273
+ */
4274
+ function valueOrEmptyString(value, exclude) {
4275
+ if (exclude === void 0) { exclude = []; }
4276
+ return value && !exclude.includes(value) ? value : '';
4277
+ }
4231
4278
 
4232
4279
  /**
4233
4280
  * Sends the specified message to the web worker
@@ -4989,7 +5036,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
4989
5036
  };
4990
5037
  }
4991
5038
 
4992
- var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQogICAgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7DQogICAgICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7DQogICAgICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdDsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsNCiAgICAgICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9DQogICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQ0KICAgICAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQ0KICAgICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0NCiAgICAgICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkgew0KICAgICAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnOw0KICAgICAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgInRocm93IjogdmVyYigxKSwgInJldHVybiI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZzsNCiAgICAgICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9DQogICAgICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHsNCiAgICAgICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7DQogICAgICAgICAgICB3aGlsZSAoXykgdHJ5IHsNCiAgICAgICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WyJyZXR1cm4iXSA6IG9wWzBdID8geVsidGhyb3ciXSB8fCAoKHQgPSB5WyJyZXR1cm4iXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7DQogICAgICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07DQogICAgICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH0NCiAgICAgICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHsNCiAgICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9bU3ltYm9sLml0ZXJhdG9yXTsNCiAgICAgICAgaWYgKCFtKSByZXR1cm4gbzsNCiAgICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH0NCiAgICAgICAgZmluYWxseSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBhcjsNCiAgICB9CgogICAgLyoqDQogICAgICogQGlnbm9yZQ0KICAgICAqLw0KICAgIHZhciBNSVNTSU5HX1JFRlJFU0hfVE9LRU5fRVJST1JfTUVTU0FHRSA9ICdUaGUgd2ViIHdvcmtlciBpcyBtaXNzaW5nIHRoZSByZWZyZXNoIHRva2VuJzsKCiAgICB2YXIgcmVmcmVzaFRva2VucyA9IHt9Ow0KICAgIHZhciBjYWNoZUtleSA9IGZ1bmN0aW9uIChhdWRpZW5jZSwgc2NvcGUpIHsgcmV0dXJuICIiLmNvbmNhdChhdWRpZW5jZSwgInwiKS5jb25jYXQoc2NvcGUpOyB9Ow0KICAgIHZhciBnZXRSZWZyZXNoVG9rZW4gPSBmdW5jdGlvbiAoYXVkaWVuY2UsIHNjb3BlKSB7DQogICAgICAgIHJldHVybiByZWZyZXNoVG9rZW5zW2NhY2hlS2V5KGF1ZGllbmNlLCBzY29wZSldOw0KICAgIH07DQogICAgdmFyIHNldFJlZnJlc2hUb2tlbiA9IGZ1bmN0aW9uIChyZWZyZXNoVG9rZW4sIGF1ZGllbmNlLCBzY29wZSkgeyByZXR1cm4gKHJlZnJlc2hUb2tlbnNbY2FjaGVLZXkoYXVkaWVuY2UsIHNjb3BlKV0gPSByZWZyZXNoVG9rZW4pOyB9Ow0KICAgIHZhciBkZWxldGVSZWZyZXNoVG9rZW4gPSBmdW5jdGlvbiAoYXVkaWVuY2UsIHNjb3BlKSB7DQogICAgICAgIHJldHVybiBkZWxldGUgcmVmcmVzaFRva2Vuc1tjYWNoZUtleShhdWRpZW5jZSwgc2NvcGUpXTsNCiAgICB9Ow0KICAgIHZhciB3YWl0ID0gZnVuY3Rpb24gKHRpbWUpIHsNCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJldHVybiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpOyB9KTsNCiAgICB9Ow0KICAgIHZhciBmb3JtRGF0YVRvT2JqZWN0ID0gZnVuY3Rpb24gKGZvcm1EYXRhKSB7DQogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoZm9ybURhdGEpOw0KICAgICAgICB2YXIgcGFyc2VkUXVlcnkgPSB7fTsNCiAgICAgICAgcXVlcnlQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAodmFsLCBrZXkpIHsNCiAgICAgICAgICAgIHBhcnNlZFF1ZXJ5W2tleV0gPSB2YWw7DQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4gcGFyc2VkUXVlcnk7DQogICAgfTsNCiAgICB2YXIgbWVzc2FnZUhhbmRsZXIgPSBmdW5jdGlvbiAoX2EpIHsNCiAgICAgICAgdmFyIF9iID0gX2EuZGF0YSwgdGltZW91dCA9IF9iLnRpbWVvdXQsIGF1dGggPSBfYi5hdXRoLCBmZXRjaFVybCA9IF9iLmZldGNoVXJsLCBmZXRjaE9wdGlvbnMgPSBfYi5mZXRjaE9wdGlvbnMsIHVzZUZvcm1EYXRhID0gX2IudXNlRm9ybURhdGEsIF9jID0gX19yZWFkKF9hLnBvcnRzLCAxKSwgcG9ydCA9IF9jWzBdOw0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBqc29uLCBfZCwgYXVkaWVuY2UsIHNjb3BlLCBib2R5LCByZWZyZXNoVG9rZW4sIGFib3J0Q29udHJvbGxlciwgcmVzcG9uc2UsIGVycm9yXzEsIGVycm9yXzI7DQogICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9lKSB7DQogICAgICAgICAgICAgICAgc3dpdGNoIChfZS5sYWJlbCkgew0KICAgICAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICAgICBfZCA9IGF1dGggfHwge30sIGF1ZGllbmNlID0gX2QuYXVkaWVuY2UsIHNjb3BlID0gX2Quc2NvcGU7DQogICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDE7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMSwgNywgLCA4XSk7DQogICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gdXNlRm9ybURhdGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZvcm1EYXRhVG9PYmplY3QoZmV0Y2hPcHRpb25zLmJvZHkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGZldGNoT3B0aW9ucy5ib2R5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYm9keS5yZWZyZXNoX3Rva2VuICYmIGJvZHkuZ3JhbnRfdHlwZSA9PT0gJ3JlZnJlc2hfdG9rZW4nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFRva2VuID0gZ2V0UmVmcmVzaFRva2VuKGF1ZGllbmNlLCBzY29wZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKE1JU1NJTkdfUkVGUkVTSF9UT0tFTl9FUlJPUl9NRVNTQUdFKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmJvZHkgPSB1c2VGb3JtRGF0YQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBVUkxTZWFyY2hQYXJhbXMoX19hc3NpZ24oX19hc3NpZ24oe30sIGJvZHkpLCB7IHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbiB9KSkudG9TdHJpbmcoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KF9fYXNzaWduKF9fYXNzaWduKHt9LCBib2R5KSwgeyByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4gfSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyID0gdm9pZCAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hPcHRpb25zLnNpZ25hbCA9IGFib3J0Q29udHJvbGxlci5zaWduYWw7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHZvaWQgMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMjsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsyLCA0LCAsIDVdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UucmFjZShbDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQodGltZW91dCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoKGZldGNoVXJsLCBfX2Fzc2lnbih7fSwgZmV0Y2hPcHRpb25zKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKV07DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gX2Uuc2VudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNV07DQogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoNCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEgPSBfZS5zZW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaCBlcnJvciwgcmVqZWN0IGBzZW5kTWVzc2FnZWAgdXNpbmcgYGVycm9yYCBrZXkgc28gdGhhdCB3ZSByZXRyeS4NCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcl8xLm1lc3NhZ2UNCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDU6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgdGltZXMgb3V0LCBhYm9ydCBpdCBhbmQgbGV0IGBzd2l0Y2hGZXRjaGAgcmFpc2UgdGhlIGVycm9yLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogIlRpbWVvdXQgd2hlbiBleGVjdXRpbmcgJ2ZldGNoJyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXNwb25zZS5qc29uKCldOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDY6DQogICAgICAgICAgICAgICAgICAgICAgICBqc29uID0gX2Uuc2VudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24ucmVmcmVzaF90b2tlbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlZnJlc2hUb2tlbihqc29uLnJlZnJlc2hfdG9rZW4sIGF1ZGllbmNlLCBzY29wZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGpzb24ucmVmcmVzaF90b2tlbjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJlZnJlc2hUb2tlbihhdWRpZW5jZSwgc2NvcGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2s6IHJlc3BvbnNlLm9rLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb246IGpzb24NCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07DQogICAgICAgICAgICAgICAgICAgIGNhc2UgNzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzIgPSBfZS5zZW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbjogew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogZXJyb3JfMi5tZXNzYWdlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA4XTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIgLypyZXR1cm4qL107DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgIH07DQogICAgLy8gRG9uJ3QgcnVuIGBhZGRFdmVudExpc3RlbmVyYCBpbiBvdXIgdGVzdHMgKHRoaXMgaXMgcmVwbGFjZWQgaW4gcm9sbHVwKQ0KICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICAqLw0KICAgIHsNCiAgICAgICAgLy8gQHRzLWlnbm9yZQ0KICAgICAgICBhZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbWVzc2FnZUhhbmRsZXIpOw0KICAgIH0KCn0pKCk7Cgo=', null, false);
5039
+ var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0KDQogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLg0KDQogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgNCiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkNCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsDQogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NDQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1INCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SDQogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KICAgIC8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovDQoNCiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHsNCiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fA0KICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fA0KICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTsNCiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7DQogICAgICAgIGlmICh0eXBlb2YgYiAhPT0gImZ1bmN0aW9uIiAmJiBiICE9PSBudWxsKQ0KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiICsgU3RyaW5nKGIpICsgIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7DQogICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7DQogICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQ0KICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7DQogICAgfQ0KDQogICAgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7DQogICAgICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7DQogICAgICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHsNCiAgICAgICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdDsNCiAgICAgICAgfTsNCiAgICAgICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsNCiAgICAgICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9DQogICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQ0KICAgICAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQ0KICAgICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0NCiAgICAgICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkgew0KICAgICAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnOw0KICAgICAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgInRocm93IjogdmVyYigxKSwgInJldHVybiI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZzsNCiAgICAgICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9DQogICAgICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHsNCiAgICAgICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7DQogICAgICAgICAgICB3aGlsZSAoXykgdHJ5IHsNCiAgICAgICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WyJyZXR1cm4iXSA6IG9wWzBdID8geVsidGhyb3ciXSB8fCAoKHQgPSB5WyJyZXR1cm4iXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7DQogICAgICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdOw0KICAgICAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07DQogICAgICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH0NCiAgICAgICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHsNCiAgICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9bU3ltYm9sLml0ZXJhdG9yXTsNCiAgICAgICAgaWYgKCFtKSByZXR1cm4gbzsNCiAgICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH0NCiAgICAgICAgZmluYWxseSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBhcjsNCiAgICB9CgogICAgLyoqDQogICAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiB2YWx1ZSBpcyBmYWxzeSwgb3Igd2hlbiBpdCdzIHZhbHVlIGlzIGluY2x1ZGVkIGluIHRoZSBleGNsdWRlIGFyZ3VtZW50Lg0KICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2sNCiAgICAgKiBAcGFyYW0gZXhjbHVkZSBBbiBhcnJheSBvZiB2YWx1ZXMgdGhhdCBzaG91bGQgcmVzdWx0IGluIGFuIGVtcHR5IHN0cmluZy4NCiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIGZhbHN5IG9yIGluY2x1ZGVkIGluIHRoZSBleGNsdWRlIGFyZ3VtZW50Lg0KICAgICAqLw0KICAgIGZ1bmN0aW9uIHZhbHVlT3JFbXB0eVN0cmluZyh2YWx1ZSwgZXhjbHVkZSkgew0KICAgICAgICBpZiAoZXhjbHVkZSA9PT0gdm9pZCAwKSB7IGV4Y2x1ZGUgPSBbXTsgfQ0KICAgICAgICByZXR1cm4gdmFsdWUgJiYgIWV4Y2x1ZGUuaW5jbHVkZXModmFsdWUpID8gdmFsdWUgOiAnJzsNCiAgICB9CgogICAgLyoqDQogICAgICogRm9yIGNvbnRleHQgb24gdGhlIGlzdGFuYnVsIGlnbm9yZSBzdGF0ZW1lbnRzIGJlbG93LCBzZWU6DQogICAgICogaHR0cHM6Ly9naXRodWIuY29tL2dvdHdhcmxvc3QvaXN0YW5idWwvaXNzdWVzLzY5MA0KICAgICAqLw0KICAgIC8qKg0KICAgICAqIFRocm93biB3aGVuIG5ldHdvcmsgcmVxdWVzdHMgdG8gdGhlIEF1dGggc2VydmVyIGZhaWwuDQogICAgICovDQogICAgdmFyIEdlbmVyaWNFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsNCiAgICAgICAgX19leHRlbmRzKEdlbmVyaWNFcnJvciwgX3N1cGVyKTsNCiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8NCiAgICAgICAgZnVuY3Rpb24gR2VuZXJpY0Vycm9yKGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbikgew0KICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZXJyb3JfZGVzY3JpcHRpb24pIHx8IHRoaXM7DQogICAgICAgICAgICBfdGhpcy5lcnJvciA9IGVycm9yOw0KICAgICAgICAgICAgX3RoaXMuZXJyb3JfZGVzY3JpcHRpb24gPSBlcnJvcl9kZXNjcmlwdGlvbjsNCiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgR2VuZXJpY0Vycm9yLnByb3RvdHlwZSk7DQogICAgICAgICAgICByZXR1cm4gX3RoaXM7DQogICAgICAgIH0NCiAgICAgICAgR2VuZXJpY0Vycm9yLmZyb21QYXlsb2FkID0gZnVuY3Rpb24gKF9hKSB7DQogICAgICAgICAgICB2YXIgZXJyb3IgPSBfYS5lcnJvciwgZXJyb3JfZGVzY3JpcHRpb24gPSBfYS5lcnJvcl9kZXNjcmlwdGlvbjsNCiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0Vycm9yKGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbik7DQogICAgICAgIH07DQogICAgICAgIHJldHVybiBHZW5lcmljRXJyb3I7DQogICAgfShFcnJvcikpOw0KICAgIC8qKg0KICAgICAqIFRocm93biB3aGVuIGhhbmRsaW5nIHRoZSByZWRpcmVjdCBjYWxsYmFjayBmYWlscywgd2lsbCBiZSBvbmUgb2YgQXV0aDAncw0KICAgICAqIEF1dGhlbnRpY2F0aW9uIEFQSSdzIFN0YW5kYXJkIEVycm9yIFJlc3BvbnNlczogaHR0cHM6Ly9hdXRoMC5jb20vZG9jcy9hcGkvYXV0aGVudGljYXRpb24/amF2YXNjcmlwdCNzdGFuZGFyZC1lcnJvci1yZXNwb25zZXMNCiAgICAgKi8NCiAgICAvKiogQGNsYXNzICovICgoZnVuY3Rpb24gKF9zdXBlcikgew0KICAgICAgICBfX2V4dGVuZHMoQXV0aGVudGljYXRpb25FcnJvciwgX3N1cGVyKTsNCiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8NCiAgICAgICAgZnVuY3Rpb24gQXV0aGVudGljYXRpb25FcnJvcihlcnJvciwgZXJyb3JfZGVzY3JpcHRpb24sIHN0YXRlLCBhcHBTdGF0ZSkgew0KICAgICAgICAgICAgaWYgKGFwcFN0YXRlID09PSB2b2lkIDApIHsgYXBwU3RhdGUgPSBudWxsOyB9DQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBlcnJvciwgZXJyb3JfZGVzY3JpcHRpb24pIHx8IHRoaXM7DQogICAgICAgICAgICBfdGhpcy5zdGF0ZSA9IHN0YXRlOw0KICAgICAgICAgICAgX3RoaXMuYXBwU3RhdGUgPSBhcHBTdGF0ZTsNCiAgICAgICAgICAgIC8vaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmsNCiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgQXV0aGVudGljYXRpb25FcnJvci5wcm90b3R5cGUpOw0KICAgICAgICAgICAgcmV0dXJuIF90aGlzOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBBdXRoZW50aWNhdGlvbkVycm9yOw0KICAgIH0pKEdlbmVyaWNFcnJvcikpOw0KICAgIC8qKg0KICAgICAqIFRocm93biB3aGVuIHNpbGVudCBhdXRoIHRpbWVzIG91dCAodXN1YWxseSBkdWUgdG8gYSBjb25maWd1cmF0aW9uIGlzc3VlKSBvcg0KICAgICAqIHdoZW4gbmV0d29yayByZXF1ZXN0cyB0byB0aGUgQXV0aCBzZXJ2ZXIgdGltZW91dC4NCiAgICAgKi8NCiAgICB2YXIgVGltZW91dEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgew0KICAgICAgICBfX2V4dGVuZHMoVGltZW91dEVycm9yLCBfc3VwZXIpOw0KICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLw0KICAgICAgICBmdW5jdGlvbiBUaW1lb3V0RXJyb3IoKSB7DQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCAndGltZW91dCcsICdUaW1lb3V0JykgfHwgdGhpczsNCiAgICAgICAgICAgIC8vaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmsNCiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgVGltZW91dEVycm9yLnByb3RvdHlwZSk7DQogICAgICAgICAgICByZXR1cm4gX3RoaXM7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFRpbWVvdXRFcnJvcjsNCiAgICB9KEdlbmVyaWNFcnJvcikpOw0KICAgIC8qKg0KICAgICAqIEVycm9yIHRocm93biB3aGVuIHRoZSBsb2dpbiBwb3B1cCB0aW1lcyBvdXQgKGlmIHRoZSB1c2VyIGRvZXMgbm90IGNvbXBsZXRlIGF1dGgpDQogICAgICovDQogICAgLyoqIEBjbGFzcyAqLyAoKGZ1bmN0aW9uIChfc3VwZXIpIHsNCiAgICAgICAgX19leHRlbmRzKFBvcHVwVGltZW91dEVycm9yLCBfc3VwZXIpOw0KICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLw0KICAgICAgICBmdW5jdGlvbiBQb3B1cFRpbWVvdXRFcnJvcihwb3B1cCkgew0KICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsNCiAgICAgICAgICAgIF90aGlzLnBvcHVwID0gcG9wdXA7DQogICAgICAgICAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrDQogICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIFBvcHVwVGltZW91dEVycm9yLnByb3RvdHlwZSk7DQogICAgICAgICAgICByZXR1cm4gX3RoaXM7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFBvcHVwVGltZW91dEVycm9yOw0KICAgIH0pKFRpbWVvdXRFcnJvcikpOw0KICAgIC8qKiBAY2xhc3MgKi8gKChmdW5jdGlvbiAoX3N1cGVyKSB7DQogICAgICAgIF9fZXh0ZW5kcyhQb3B1cENhbmNlbGxlZEVycm9yLCBfc3VwZXIpOw0KICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLw0KICAgICAgICBmdW5jdGlvbiBQb3B1cENhbmNlbGxlZEVycm9yKHBvcHVwKSB7DQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCAnY2FuY2VsbGVkJywgJ1BvcHVwIGNsb3NlZCcpIHx8IHRoaXM7DQogICAgICAgICAgICBfdGhpcy5wb3B1cCA9IHBvcHVwOw0KICAgICAgICAgICAgLy9odHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29yaw0KICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKF90aGlzLCBQb3B1cENhbmNlbGxlZEVycm9yLnByb3RvdHlwZSk7DQogICAgICAgICAgICByZXR1cm4gX3RoaXM7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIFBvcHVwQ2FuY2VsbGVkRXJyb3I7DQogICAgfSkoR2VuZXJpY0Vycm9yKSk7DQogICAgLyoqDQogICAgICogRXJyb3IgdGhyb3duIHdoZW4gdGhlIHRva2VuIGV4Y2hhbmdlIHJlc3VsdHMgaW4gYSBgbWZhX3JlcXVpcmVkYCBlcnJvcg0KICAgICAqLw0KICAgIC8qKiBAY2xhc3MgKi8gKChmdW5jdGlvbiAoX3N1cGVyKSB7DQogICAgICAgIF9fZXh0ZW5kcyhNZmFSZXF1aXJlZEVycm9yLCBfc3VwZXIpOw0KICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLw0KICAgICAgICBmdW5jdGlvbiBNZmFSZXF1aXJlZEVycm9yKGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbiwgbWZhX3Rva2VuKSB7DQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBlcnJvciwgZXJyb3JfZGVzY3JpcHRpb24pIHx8IHRoaXM7DQogICAgICAgICAgICBfdGhpcy5tZmFfdG9rZW4gPSBtZmFfdG9rZW47DQogICAgICAgICAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrDQogICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIE1mYVJlcXVpcmVkRXJyb3IucHJvdG90eXBlKTsNCiAgICAgICAgICAgIHJldHVybiBfdGhpczsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gTWZhUmVxdWlyZWRFcnJvcjsNCiAgICB9KShHZW5lcmljRXJyb3IpKTsNCiAgICB2YXIgTWlzc2luZ1JlZnJlc2hUb2tlbkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgew0KICAgICAgICBfX2V4dGVuZHMoTWlzc2luZ1JlZnJlc2hUb2tlbkVycm9yLCBfc3VwZXIpOw0KICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLw0KICAgICAgICBmdW5jdGlvbiBNaXNzaW5nUmVmcmVzaFRva2VuRXJyb3IoYXVkaWVuY2UsIHNjb3BlKSB7DQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCAnbWlzc2luZ19yZWZyZXNoX3Rva2VuJywgIk1pc3NpbmcgUmVmcmVzaCBUb2tlbiAoYXVkaWVuY2U6ICciLmNvbmNhdCh2YWx1ZU9yRW1wdHlTdHJpbmcoYXVkaWVuY2UsIFsNCiAgICAgICAgICAgICAgICAnZGVmYXVsdCcNCiAgICAgICAgICAgIF0pLCAiJywgc2NvcGU6ICciKS5jb25jYXQodmFsdWVPckVtcHR5U3RyaW5nKHNjb3BlKSwgIicpIikpIHx8IHRoaXM7DQogICAgICAgICAgICBfdGhpcy5hdWRpZW5jZSA9IGF1ZGllbmNlOw0KICAgICAgICAgICAgX3RoaXMuc2NvcGUgPSBzY29wZTsNCiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgTWlzc2luZ1JlZnJlc2hUb2tlbkVycm9yLnByb3RvdHlwZSk7DQogICAgICAgICAgICByZXR1cm4gX3RoaXM7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIE1pc3NpbmdSZWZyZXNoVG9rZW5FcnJvcjsNCiAgICB9KEdlbmVyaWNFcnJvcikpOwoKICAgIHZhciByZWZyZXNoVG9rZW5zID0ge307DQogICAgdmFyIGNhY2hlS2V5ID0gZnVuY3Rpb24gKGF1ZGllbmNlLCBzY29wZSkgeyByZXR1cm4gIiIuY29uY2F0KGF1ZGllbmNlLCAifCIpLmNvbmNhdChzY29wZSk7IH07DQogICAgdmFyIGdldFJlZnJlc2hUb2tlbiA9IGZ1bmN0aW9uIChhdWRpZW5jZSwgc2NvcGUpIHsNCiAgICAgICAgcmV0dXJuIHJlZnJlc2hUb2tlbnNbY2FjaGVLZXkoYXVkaWVuY2UsIHNjb3BlKV07DQogICAgfTsNCiAgICB2YXIgc2V0UmVmcmVzaFRva2VuID0gZnVuY3Rpb24gKHJlZnJlc2hUb2tlbiwgYXVkaWVuY2UsIHNjb3BlKSB7IHJldHVybiAocmVmcmVzaFRva2Vuc1tjYWNoZUtleShhdWRpZW5jZSwgc2NvcGUpXSA9IHJlZnJlc2hUb2tlbik7IH07DQogICAgdmFyIGRlbGV0ZVJlZnJlc2hUb2tlbiA9IGZ1bmN0aW9uIChhdWRpZW5jZSwgc2NvcGUpIHsNCiAgICAgICAgcmV0dXJuIGRlbGV0ZSByZWZyZXNoVG9rZW5zW2NhY2hlS2V5KGF1ZGllbmNlLCBzY29wZSldOw0KICAgIH07DQogICAgdmFyIHdhaXQgPSBmdW5jdGlvbiAodGltZSkgew0KICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZSk7IH0pOw0KICAgIH07DQogICAgdmFyIGZvcm1EYXRhVG9PYmplY3QgPSBmdW5jdGlvbiAoZm9ybURhdGEpIHsNCiAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhmb3JtRGF0YSk7DQogICAgICAgIHZhciBwYXJzZWRRdWVyeSA9IHt9Ow0KICAgICAgICBxdWVyeVBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWwsIGtleSkgew0KICAgICAgICAgICAgcGFyc2VkUXVlcnlba2V5XSA9IHZhbDsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiBwYXJzZWRRdWVyeTsNCiAgICB9Ow0KICAgIHZhciBtZXNzYWdlSGFuZGxlciA9IGZ1bmN0aW9uIChfYSkgew0KICAgICAgICB2YXIgX2IgPSBfYS5kYXRhLCB0aW1lb3V0ID0gX2IudGltZW91dCwgYXV0aCA9IF9iLmF1dGgsIGZldGNoVXJsID0gX2IuZmV0Y2hVcmwsIGZldGNoT3B0aW9ucyA9IF9iLmZldGNoT3B0aW9ucywgdXNlRm9ybURhdGEgPSBfYi51c2VGb3JtRGF0YSwgX2MgPSBfX3JlYWQoX2EucG9ydHMsIDEpLCBwb3J0ID0gX2NbMF07DQogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIGpzb24sIF9kLCBhdWRpZW5jZSwgc2NvcGUsIGJvZHksIHJlZnJlc2hUb2tlbiwgYWJvcnRDb250cm9sbGVyLCByZXNwb25zZSwgZXJyb3JfMSwgZXJyb3JfMjsNCiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2UpIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9lLmxhYmVsKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgICAgIF9kID0gYXV0aCB8fCB7fSwgYXVkaWVuY2UgPSBfZC5hdWRpZW5jZSwgc2NvcGUgPSBfZC5zY29wZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIF9lLmxhYmVsID0gMTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgX2UudHJ5cy5wdXNoKFsxLCA3LCAsIDhdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSB1c2VGb3JtRGF0YQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm9ybURhdGFUb09iamVjdChmZXRjaE9wdGlvbnMuYm9keSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZmV0Y2hPcHRpb25zLmJvZHkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFib2R5LnJlZnJlc2hfdG9rZW4gJiYgYm9keS5ncmFudF90eXBlID09PSAncmVmcmVzaF90b2tlbicpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW4gPSBnZXRSZWZyZXNoVG9rZW4oYXVkaWVuY2UsIHNjb3BlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1JlZnJlc2hUb2tlbkVycm9yKGF1ZGllbmNlLCBzY29wZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoT3B0aW9ucy5ib2R5ID0gdXNlRm9ybURhdGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgVVJMU2VhcmNoUGFyYW1zKF9fYXNzaWduKF9fYXNzaWduKHt9LCBib2R5KSwgeyByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4gfSkpLnRvU3RyaW5nKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYm9keSksIHsgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuIH0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlciA9IHZvaWQgMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQWJvcnRDb250cm9sbGVyID09PSAnZnVuY3Rpb24nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoT3B0aW9ucy5zaWduYWwgPSBhYm9ydENvbnRyb2xsZXIuc2lnbmFsOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB2b2lkIDA7DQogICAgICAgICAgICAgICAgICAgICAgICBfZS5sYWJlbCA9IDI7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICAgIF9lLnRyeXMucHVzaChbMiwgNCwgLCA1XSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLnJhY2UoWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KHRpbWVvdXQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaChmZXRjaFVybCwgX19hc3NpZ24oe30sIGZldGNoT3B0aW9ucykpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSldOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDM6DQogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IF9lLnNlbnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Uuc2VudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmV0Y2ggZXJyb3IsIHJlamVjdCBgc2VuZE1lc3NhZ2VgIHVzaW5nIGBlcnJvcmAga2V5IHNvIHRoYXQgd2UgcmV0cnkuDQogICAgICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JfMS5tZXNzYWdlDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSA1Og0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IHRpbWVzIG91dCwgYWJvcnQgaXQgYW5kIGxldCBgc3dpdGNoRmV0Y2hgIHJhaXNlIHRoZSBlcnJvci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRDb250cm9sbGVyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICJUaW1lb3V0IHdoZW4gZXhlY3V0aW5nICdmZXRjaCciDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVzcG9uc2UuanNvbigpXTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSA2Og0KICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IF9lLnNlbnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uLnJlZnJlc2hfdG9rZW4pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZWZyZXNoVG9rZW4oanNvbi5yZWZyZXNoX3Rva2VuLCBhdWRpZW5jZSwgc2NvcGUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBqc29uLnJlZnJlc2hfdG9rZW47DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVSZWZyZXNoVG9rZW4oYXVkaWVuY2UsIHNjb3BlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiByZXNwb25zZS5vaywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uOiBqc29uDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDhdOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDc6DQogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8yID0gX2Uuc2VudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2s6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb246IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVycm9yXzIubWVzc2FnZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgOF07DQogICAgICAgICAgICAgICAgICAgIGNhc2UgODogcmV0dXJuIFsyIC8qcmV0dXJuKi9dOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICB9Ow0KICAgIC8vIERvbid0IHJ1biBgYWRkRXZlbnRMaXN0ZW5lcmAgaW4gb3VyIHRlc3RzICh0aGlzIGlzIHJlcGxhY2VkIGluIHJvbGx1cCkNCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi8NCiAgICB7DQogICAgICAgIC8vIEB0cy1pZ25vcmUNCiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG1lc3NhZ2VIYW5kbGVyKTsNCiAgICB9Cgp9KSgpOwoK', null, false);
4993
5040
  /* eslint-enable */
4994
5041
 
4995
5042
  var isIE11 = function () { return /Trident.*rv:11\.0/.test(navigator.userAgent); };
@@ -5221,6 +5268,8 @@ var Auth0Client = /** @class */ (function () {
5221
5268
  this.worker = new WorkerFactory();
5222
5269
  }
5223
5270
  this.customOptions = getCustomInitialOptions(options);
5271
+ this.useRefreshTokensFallback =
5272
+ this.options.useRefreshTokensFallback !== false;
5224
5273
  }
5225
5274
  Auth0Client.prototype._url = function (path) {
5226
5275
  var auth0Client = encodeURIComponent(btoa(JSON.stringify(this.options.auth0Client || DEFAULT_AUTH0_CLIENT)));
@@ -5948,10 +5997,12 @@ var Auth0Client = /** @class */ (function () {
5948
5997
  }))];
5949
5998
  case 1:
5950
5999
  cache = _a.sent();
5951
- if (!((!cache || !cache.refresh_token) && !this.worker)) return [3 /*break*/, 3];
6000
+ if (!((!cache || !cache.refresh_token) && !this.worker)) return [3 /*break*/, 4];
6001
+ if (!this.useRefreshTokensFallback) return [3 /*break*/, 3];
5952
6002
  return [4 /*yield*/, this._getTokenFromIFrame(options)];
5953
6003
  case 2: return [2 /*return*/, _a.sent()];
5954
- case 3:
6004
+ case 3: throw new MissingRefreshTokenError(options.audience || 'default', options.scope);
6005
+ case 4:
5955
6006
  redirect_uri = options.redirect_uri ||
5956
6007
  this.options.redirect_uri ||
5957
6008
  window.location.origin;
@@ -5959,31 +6010,32 @@ var Auth0Client = /** @class */ (function () {
5959
6010
  timeout = typeof options.timeoutInSeconds === 'number'
5960
6011
  ? options.timeoutInSeconds * 1000
5961
6012
  : null;
5962
- _a.label = 4;
5963
- case 4:
5964
- _a.trys.push([4, 6, , 9]);
5965
- return [4 /*yield*/, oauthToken(__assign(__assign(__assign(__assign(__assign({}, this.customOptions), customOptions), { audience: audience, scope: scope, baseUrl: this.domainUrl, client_id: this.options.client_id, grant_type: 'refresh_token', refresh_token: cache && cache.refresh_token, redirect_uri: redirect_uri }), (timeout && { timeout: timeout })), { auth0Client: this.options.auth0Client, useFormData: this.options.useFormData, timeout: this.httpTimeoutMs }), this.worker)];
6013
+ _a.label = 5;
5966
6014
  case 5:
5967
- tokenResult = _a.sent();
5968
- return [3 /*break*/, 9];
6015
+ _a.trys.push([5, 7, , 10]);
6016
+ return [4 /*yield*/, oauthToken(__assign(__assign(__assign(__assign(__assign({}, this.customOptions), customOptions), { audience: audience, scope: scope, baseUrl: this.domainUrl, client_id: this.options.client_id, grant_type: 'refresh_token', refresh_token: cache && cache.refresh_token, redirect_uri: redirect_uri }), (timeout && { timeout: timeout })), { auth0Client: this.options.auth0Client, useFormData: this.options.useFormData, timeout: this.httpTimeoutMs }), this.worker)];
5969
6017
  case 6:
6018
+ tokenResult = _a.sent();
6019
+ return [3 /*break*/, 10];
6020
+ case 7:
5970
6021
  e_2 = _a.sent();
5971
6022
  if (!
5972
6023
  // The web worker didn't have a refresh token in memory so
5973
6024
  // fallback to an iframe.
5974
- (e_2.message === MISSING_REFRESH_TOKEN_ERROR_MESSAGE ||
6025
+ ((e_2.message.indexOf(MISSING_REFRESH_TOKEN_ERROR_MESSAGE) > -1 ||
5975
6026
  // A refresh token was found, but is it no longer valid.
5976
6027
  // Fallback to an iframe.
5977
6028
  (e_2.message &&
5978
- e_2.message.indexOf(INVALID_REFRESH_TOKEN_ERROR_MESSAGE) > -1)))
6029
+ e_2.message.indexOf(INVALID_REFRESH_TOKEN_ERROR_MESSAGE) > -1)) &&
6030
+ this.useRefreshTokensFallback))
5979
6031
  // The web worker didn't have a refresh token in memory so
5980
6032
  // fallback to an iframe.
5981
- return [3 /*break*/, 8];
6033
+ return [3 /*break*/, 9];
5982
6034
  return [4 /*yield*/, this._getTokenFromIFrame(options)];
5983
- case 7: return [2 /*return*/, _a.sent()];
5984
- case 8: throw e_2;
5985
- case 9: return [4 /*yield*/, this._verifyIdToken(tokenResult.id_token)];
5986
- case 10:
6035
+ case 8: return [2 /*return*/, _a.sent()];
6036
+ case 9: throw e_2;
6037
+ case 10: return [4 /*yield*/, this._verifyIdToken(tokenResult.id_token)];
6038
+ case 11:
5987
6039
  decodedToken = _a.sent();
5988
6040
  return [2 /*return*/, __assign(__assign({}, tokenResult), { decodedToken: decodedToken, scope: options.scope, oauthTokenScope: tokenResult.scope, audience: options.audience || 'default' })];
5989
6041
  }