@fgv/ts-utils 1.2.1 → 1.3.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.
Files changed (77) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +4 -0
  3. package/brand.d.ts +8 -0
  4. package/brand.d.ts.map +1 -0
  5. package/brand.js +24 -0
  6. package/converter.d.ts +149 -105
  7. package/converter.d.ts.map +1 -0
  8. package/converter.js +46 -59
  9. package/converters.d.ts +432 -194
  10. package/converters.d.ts.map +1 -0
  11. package/converters.js +262 -151
  12. package/csvHelpers.d.ts +7 -0
  13. package/csvHelpers.d.ts.map +1 -0
  14. package/csvHelpers.js +12 -2
  15. package/extendedArray.d.ts +46 -0
  16. package/extendedArray.d.ts.map +1 -0
  17. package/extendedArray.js +46 -1
  18. package/formatter.d.ts +53 -0
  19. package/formatter.d.ts.map +1 -0
  20. package/formatter.js +24 -1
  21. package/hash.d.ts +31 -3
  22. package/hash.d.ts.map +1 -0
  23. package/hash.js +36 -5
  24. package/index.d.ts +7 -3
  25. package/index.d.ts.map +1 -0
  26. package/index.js +16 -6
  27. package/logger.d.ts +3 -2
  28. package/logger.d.ts.map +1 -0
  29. package/logger.js +1 -1
  30. package/package.json +13 -9
  31. package/rangeOf.d.ts +96 -0
  32. package/rangeOf.d.ts.map +1 -0
  33. package/rangeOf.js +80 -1
  34. package/result.d.ts +393 -39
  35. package/result.d.ts.map +1 -0
  36. package/result.js +259 -49
  37. package/ts-utils.d.ts +2451 -0
  38. package/tsdoc-metadata.json +11 -0
  39. package/utils.d.ts +49 -27
  40. package/utils.d.ts.map +1 -0
  41. package/utils.js +45 -28
  42. package/validation/boolean.d.ts +27 -0
  43. package/validation/boolean.d.ts.map +1 -0
  44. package/validation/boolean.js +59 -0
  45. package/validation/classes.d.ts +5 -0
  46. package/validation/classes.d.ts.map +1 -0
  47. package/validation/classes.js +34 -0
  48. package/validation/field.d.ts +43 -0
  49. package/validation/field.d.ts.map +1 -0
  50. package/validation/field.js +72 -0
  51. package/validation/genericValidator.d.ts +84 -0
  52. package/validation/genericValidator.d.ts.map +1 -0
  53. package/validation/genericValidator.js +138 -0
  54. package/validation/index.d.ts +7 -0
  55. package/validation/index.d.ts.map +1 -0
  56. package/validation/index.js +59 -0
  57. package/validation/number.d.ts +27 -0
  58. package/validation/number.d.ts.map +1 -0
  59. package/validation/number.js +57 -0
  60. package/validation/object.d.ts +115 -0
  61. package/validation/object.d.ts.map +1 -0
  62. package/validation/object.js +143 -0
  63. package/validation/string.d.ts +27 -0
  64. package/validation/string.d.ts.map +1 -0
  65. package/validation/string.js +57 -0
  66. package/validation/traits.d.ts +68 -0
  67. package/validation/traits.d.ts.map +1 -0
  68. package/validation/traits.js +58 -0
  69. package/validation/validator.d.ts +82 -0
  70. package/validation/validator.d.ts.map +1 -0
  71. package/validation/validator.js +24 -0
  72. package/validation/validatorBase.d.ts +25 -0
  73. package/validation/validatorBase.d.ts.map +1 -0
  74. package/validation/validatorBase.js +44 -0
  75. package/validation/validators.d.ts +32 -0
  76. package/validation/validators.d.ts.map +1 -0
  77. package/validation/validators.js +59 -0
package/index.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -22,7 +26,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
26
  return result;
23
27
  };
24
28
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.Hash = exports.Csv = exports.Converters = void 0;
29
+ exports.Validation = exports.Hash = exports.Csv = exports.Converters = void 0;
26
30
  /*
27
31
  * Copyright (c) 2020 Erik Fortune
28
32
  *
@@ -44,13 +48,19 @@ exports.Hash = exports.Csv = exports.Converters = void 0;
44
48
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
45
49
  * SOFTWARE.
46
50
  */
51
+ __exportStar(require("./brand"), exports);
47
52
  __exportStar(require("./converter"), exports);
48
- exports.Converters = __importStar(require("./converters"));
49
- exports.Csv = __importStar(require("./csvHelpers"));
50
53
  __exportStar(require("./extendedArray"), exports);
51
54
  __exportStar(require("./formatter"), exports);
52
- exports.Hash = __importStar(require("./hash"));
53
55
  __exportStar(require("./rangeOf"), exports);
54
56
  __exportStar(require("./result"), exports);
55
57
  __exportStar(require("./utils"), exports);
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDhDQUE0QjtBQUM1QiwyREFBMkM7QUFDM0Msb0RBQW9DO0FBQ3BDLGtEQUFnQztBQUNoQyw4Q0FBNEI7QUFDNUIsK0NBQStCO0FBQy9CLDRDQUEwQjtBQUMxQiwyQ0FBeUI7QUFDekIsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlcic7XG5leHBvcnQgKiBhcyBDb252ZXJ0ZXJzIGZyb20gJy4vY29udmVydGVycyc7XG5leHBvcnQgKiBhcyBDc3YgZnJvbSAnLi9jc3ZIZWxwZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdHRlcic7XG5leHBvcnQgKiBhcyBIYXNoIGZyb20gJy4vaGFzaCc7XG5leHBvcnQgKiBmcm9tICcuL3JhbmdlT2YnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG4iXX0=
58
+ const Converters = __importStar(require("./converters"));
59
+ exports.Converters = Converters;
60
+ const Csv = __importStar(require("./csvHelpers"));
61
+ exports.Csv = Csv;
62
+ const Hash = __importStar(require("./hash"));
63
+ exports.Hash = Hash;
64
+ const Validation = __importStar(require("./validation"));
65
+ exports.Validation = Validation;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCwwQ0FBd0I7QUFDeEIsOENBQTRCO0FBQzVCLGtEQUFnQztBQUNoQyw4Q0FBNEI7QUFDNUIsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6QiwwQ0FBd0I7QUFFeEIseURBQTJDO0FBSWxDLGdDQUFVO0FBSG5CLGtEQUFvQztBQUdmLGtCQUFHO0FBRnhCLDZDQUErQjtBQUVMLG9CQUFJO0FBRDlCLHlEQUEyQztBQUNYLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2JyYW5kJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdHRlcic7XG5leHBvcnQgKiBmcm9tICcuL3JhbmdlT2YnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCAqIGFzIENvbnZlcnRlcnMgZnJvbSAnLi9jb252ZXJ0ZXJzJztcbmltcG9ydCAqIGFzIENzdiBmcm9tICcuL2NzdkhlbHBlcnMnO1xuaW1wb3J0ICogYXMgSGFzaCBmcm9tICcuL2hhc2gnO1xuaW1wb3J0ICogYXMgVmFsaWRhdGlvbiBmcm9tICcuL3ZhbGlkYXRpb24nO1xuZXhwb3J0IHsgQ29udmVydGVycywgQ3N2LCBIYXNoLCBWYWxpZGF0aW9uIH07XG4iXX0=
package/logger.d.ts CHANGED
@@ -22,11 +22,11 @@ export declare abstract class LoggerBase {
22
22
  protected abstract _innerLog(message: string): Success<string | undefined>;
23
23
  }
24
24
  export declare class InMemoryLogger extends LoggerBase {
25
- get messages(): string[];
26
- get silent(): string[];
27
25
  protected _messages: string[];
28
26
  protected _silent: string[];
29
27
  constructor(logLevel?: LogLevel);
28
+ get messages(): string[];
29
+ get silent(): string[];
30
30
  clear(): void;
31
31
  protected _innerLog(message: string): Success<string | undefined>;
32
32
  protected _innerSilent(message: string): Success<string | undefined>;
@@ -34,3 +34,4 @@ export declare class InMemoryLogger extends LoggerBase {
34
34
  export declare class NoOpLogger extends LoggerBase {
35
35
  protected _innerLog(message: string): Success<string | undefined>;
36
36
  }
37
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
package/logger.js CHANGED
@@ -112,4 +112,4 @@ class NoOpLogger extends LoggerBase {
112
112
  }
113
113
  }
114
114
  exports.NoOpLogger = NoOpLogger;
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxxQ0FBMkQ7QUFhM0QsTUFBc0IsVUFBVTtJQUc1QixZQUFtQixRQUFtQjtRQUYvQixhQUFRLEdBQWEsTUFBTSxDQUFDO1FBRy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksTUFBTSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsT0FBaUIsRUFBRSxHQUFHLFVBQXFCO1FBQ3JELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN4QztRQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxJQUFJLENBQUMsT0FBaUIsRUFBRSxHQUFHLFVBQXFCO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUM1RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFpQixFQUFFLEdBQUcsVUFBcUI7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENB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SSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLFNBQVMsQ0FBQyxPQUFlO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFUyxZQUFZLENBQUMsT0FBZTtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixPQUFPLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUF6QkQsd0NBeUJDO0FBRUQsTUFBYSxVQUFXLFNBQVEsVUFBVTtJQUM1QixTQUFTLENBQUMsT0FBZTtRQUMvQixRQUFRO1FBQ1IsT0FBTyxJQUFBLGdCQUFPLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNKO0FBTEQsZ0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEZhaWx1cmUsIFN1Y2Nlc3MsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ2RldGFpbCd8J2luZm8nfCd3YXJuaW5nJ3wnZXJyb3InfCdzaWxlbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgbG9nKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+O1xuICAgIGRldGFpbChtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPjtcbiAgICBpbmZvKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+O1xuICAgIHdhcm4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD47XG4gICAgd2FybkFuZEZhaWw8VD4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IEZhaWx1cmU8VD47XG4gICAgZXJyb3I8VD4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IEZhaWx1cmU8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dnZXJCYXNlIHtcbiAgICBwdWJsaWMgbG9nTGV2ZWw6IExvZ0xldmVsID0gJ2luZm8nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGxvZ0xldmVsPzogTG9nTGV2ZWwpIHtcbiAgICAgICAgdGhpcy5sb2dMZXZlbCA9IGxvZ0xldmVsID8/ICdpbmZvJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZGV0YWlsKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPT09ICdkZXRhaWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2cobWVzc2FnZSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICgodGhpcy5sb2dMZXZlbCA9PT0gJ2RldGFpbCcpIHx8ICh0aGlzLmxvZ0xldmVsID09PSAnaW5mbycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2cobWVzc2FnZSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybihtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICgodGhpcy5sb2dMZXZlbCAhPT0gJ2Vycm9yJykgJiYgKHRoaXMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nKG1lc3NhZ2UsIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdhcm5BbmRGYWlsPFQ+KG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBGYWlsdXJlPFQ+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5fZm9ybWF0KG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBpZiAoKHRoaXMubG9nTGV2ZWwgIT09ICdlcnJvcicpICYmICh0aGlzLmxvZ0xldmVsICE9PSAnc2lsZW50JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubG9nKGZvcm1hdHRlZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQudmFsdWUgPz8gZm9ybWF0dGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChmb3JtYXR0ZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcjxUPihtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogRmFpbHVyZTxUPiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX2Zvcm1hdChtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmxvZyhmb3JtYXR0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0LnZhbHVlID8/IGZvcm1hdHRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoZm9ybWF0dGVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9nKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZVN0cmluZyA9IHRoaXMuX2Zvcm1hdChtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5uZXJTaWxlbnQobWVzc2FnZVN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyTG9nKG1lc3NhZ2VTdHJpbmcpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZm9ybWF0KG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByYXcgPSBbbWVzc2FnZSwgLi4ucGFyYW1ldGVyc107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gcmF3LmZpbHRlcigobSk6IG0gaXMgc3RyaW5nID0+IChtICE9PSB1bmRlZmluZWQpKTtcbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IGZpbHRlcmVkLm1hcCgobSkgPT4gbS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3Qgam9pbmVkID0gc3RyaW5ncy5qb2luKCcnKTtcbiAgICAgICAgcmV0dXJuIGpvaW5lZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyU2lsZW50KF9tZXNzYWdlOiBzdHJpbmcpOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2lubmVyTG9nKG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUxvZ2dlciBleHRlbmRzIExvZ2dlckJhc2Uge1xuICAgIHB1YmxpYyBnZXQgbWVzc2FnZXMoKTogc3RyaW5nW10geyByZXR1cm4gdGhpcy5fbWVzc2FnZXM7IH1cbiAgICBwdWJsaWMgZ2V0IHNpbGVudCgpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9zaWxlbnQ7IH1cblxuICAgIHByb3RlY3RlZCBfbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJvdGVjdGVkIF9zaWxlbnQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobG9nTGV2ZWw/OiBMb2dMZXZlbCkge1xuICAgICAgICBzdXBlcihsb2dMZXZlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLl9zaWxlbnQgPSBbXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyTG9nKG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VlZChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyU2lsZW50KG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLl9zaWxlbnQucHVzaChtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb09wTG9nZ2VyIGV4dGVuZHMgTG9nZ2VyQmFzZSB7XG4gICAgcHJvdGVjdGVkIF9pbm5lckxvZyhtZXNzYWdlOiBzdHJpbmcpOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gbm8tb3BcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQobWVzc2FnZSk7XG4gICAgfVxufVxuIl19
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxxQ0FBMkQ7QUFhM0QsTUFBc0IsVUFBVTtJQUc1QixZQUFtQixRQUFtQjtRQUYvQixhQUFRLEdBQWEsTUFBTSxDQUFDO1FBRy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksTUFBTSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxNQUFNLENBQUMsT0FBaUIsRUFBRSxHQUFHLFVBQXFCO1FBQ3JELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN4QztRQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxJQUFJLENBQUMsT0FBaUIsRUFBRSxHQUFHLFVBQXFCO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUM1RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVNLElBQUksQ0FBQyxPQUFpQixFQUFFLEdBQUcsVUFBcUI7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENB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SSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLFNBQVMsQ0FBQyxPQUFlO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFUyxZQUFZLENBQUMsT0FBZTtRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixPQUFPLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUF6QkQsd0NBeUJDO0FBRUQsTUFBYSxVQUFXLFNBQVEsVUFBVTtJQUM1QixTQUFTLENBQUMsT0FBZTtRQUMvQixRQUFRO1FBQ1IsT0FBTyxJQUFBLGdCQUFPLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNKO0FBTEQsZ0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEZhaWx1cmUsIFN1Y2Nlc3MsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ2RldGFpbCd8J2luZm8nfCd3YXJuaW5nJ3wnZXJyb3InfCdzaWxlbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgbG9nKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+O1xuICAgIGRldGFpbChtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPjtcbiAgICBpbmZvKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+O1xuICAgIHdhcm4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD47XG4gICAgd2FybkFuZEZhaWw8VD4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IEZhaWx1cmU8VD47XG4gICAgZXJyb3I8VD4obWVzc2FnZT86IHVua25vd24sIC4uLnBhcmFtZXRlcnM6IHVua25vd25bXSk6IEZhaWx1cmU8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dnZXJCYXNlIHtcbiAgICBwdWJsaWMgbG9nTGV2ZWw6IExvZ0xldmVsID0gJ2luZm8nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGxvZ0xldmVsPzogTG9nTGV2ZWwpIHtcbiAgICAgICAgdGhpcy5sb2dMZXZlbCA9IGxvZ0xldmVsID8/ICdpbmZvJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZGV0YWlsKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPT09ICdkZXRhaWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2cobWVzc2FnZSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICgodGhpcy5sb2dMZXZlbCA9PT0gJ2RldGFpbCcpIHx8ICh0aGlzLmxvZ0xldmVsID09PSAnaW5mbycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2cobWVzc2FnZSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybihtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogU3VjY2VzczxzdHJpbmd8dW5kZWZpbmVkPiB7XG4gICAgICAgIGlmICgodGhpcy5sb2dMZXZlbCAhPT0gJ2Vycm9yJykgJiYgKHRoaXMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nKG1lc3NhZ2UsIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdhcm5BbmRGYWlsPFQ+KG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBGYWlsdXJlPFQ+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5fZm9ybWF0KG1lc3NhZ2UsIC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICBpZiAoKHRoaXMubG9nTGV2ZWwgIT09ICdlcnJvcicpICYmICh0aGlzLmxvZ0xldmVsICE9PSAnc2lsZW50JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubG9nKGZvcm1hdHRlZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQudmFsdWUgPz8gZm9ybWF0dGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChmb3JtYXR0ZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcjxUPihtZXNzYWdlPzogdW5rbm93biwgLi4ucGFyYW1ldGVyczogdW5rbm93bltdKTogRmFpbHVyZTxUPiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHRoaXMuX2Zvcm1hdChtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmxvZyhmb3JtYXR0ZWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0LnZhbHVlID8/IGZvcm1hdHRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoZm9ybWF0dGVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9nKG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZVN0cmluZyA9IHRoaXMuX2Zvcm1hdChtZXNzYWdlLCAuLi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMubG9nTGV2ZWwgPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW5uZXJTaWxlbnQobWVzc2FnZVN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyTG9nKG1lc3NhZ2VTdHJpbmcpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZm9ybWF0KG1lc3NhZ2U/OiB1bmtub3duLCAuLi5wYXJhbWV0ZXJzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByYXcgPSBbbWVzc2FnZSwgLi4ucGFyYW1ldGVyc107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gcmF3LmZpbHRlcigobSk6IG0gaXMgc3RyaW5nID0+IChtICE9PSB1bmRlZmluZWQpKTtcbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IGZpbHRlcmVkLm1hcCgobSkgPT4gbS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3Qgam9pbmVkID0gc3RyaW5ncy5qb2luKCcnKTtcbiAgICAgICAgcmV0dXJuIGpvaW5lZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyU2lsZW50KF9tZXNzYWdlOiBzdHJpbmcpOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2lubmVyTG9nKG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD47XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUxvZ2dlciBleHRlbmRzIExvZ2dlckJhc2Uge1xuICAgIHByb3RlY3RlZCBfbWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJvdGVjdGVkIF9zaWxlbnQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobG9nTGV2ZWw/OiBMb2dMZXZlbCkge1xuICAgICAgICBzdXBlcihsb2dMZXZlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtZXNzYWdlcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9tZXNzYWdlczsgfVxuICAgIHB1YmxpYyBnZXQgc2lsZW50KCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuX3NpbGVudDsgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLl9zaWxlbnQgPSBbXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyTG9nKG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc3VjY2VlZChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lubmVyU2lsZW50KG1lc3NhZ2U6IHN0cmluZyk6IFN1Y2Nlc3M8c3RyaW5nfHVuZGVmaW5lZD4ge1xuICAgICAgICB0aGlzLl9zaWxlbnQucHVzaChtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb09wTG9nZ2VyIGV4dGVuZHMgTG9nZ2VyQmFzZSB7XG4gICAgcHJvdGVjdGVkIF9pbm5lckxvZyhtZXNzYWdlOiBzdHJpbmcpOiBTdWNjZXNzPHN0cmluZ3x1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gbm8tb3BcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQobWVzc2FnZSk7XG4gICAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "@fgv/ts-utils",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Assorted Typescript Utilities",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
+ "api-extractor": "$(npm bin)/api-extractor run --local --verbose -c ./config/api-extractor.json",
7
8
  "build": "rimraf dist && tsc && ./prep.sh",
9
+ "build-docs": "$(npm bin)/api-documenter markdown --input-folder ./temp --output-folder docs",
10
+ "build-all": "npm run build; npm run api-extractor; npm run build-docs",
8
11
  "clean": "rimraf dist",
9
12
  "test": "jest",
10
13
  "test-handles": "jest --runInBand --detectOpenHandles",
@@ -28,20 +31,21 @@
28
31
  },
29
32
  "homepage": "https://github.com/DidjaRedo/ts-utils#readme",
30
33
  "devDependencies": {
34
+ "@microsoft/api-documenter": "^7.16.0",
35
+ "@microsoft/api-extractor": "^7.19.5",
31
36
  "@types/jest": "^27.0.2",
32
37
  "@types/luxon": "^2.0.4",
33
38
  "@types/mustache": "^4.1.2",
34
- "@types/node": "^15.0.1",
35
- "@typescript-eslint/eslint-plugin": "^4.32.0",
36
- "@typescript-eslint/parser": "^4.32.0",
37
- "eslint": "^7.32.0",
38
- "eslint-config-standard": "^16.0.3",
39
+ "@types/node": "^17.0.21",
40
+ "@typescript-eslint/eslint-plugin": "^5.15.0",
41
+ "@typescript-eslint/parser": "^5.15.0",
42
+ "eslint": "^8.11.0",
43
+ "eslint-config-standard": "^17.0.0-1",
39
44
  "eslint-plugin-import": "^2.24.2",
40
45
  "eslint-plugin-node": "^11.1.0",
41
- "eslint-plugin-promise": "^5.1.0",
42
- "eslint-plugin-standard": "^5.0.0",
46
+ "eslint-plugin-promise": "^6.0.0",
43
47
  "jest": "^27.2.4",
44
- "jest-extended": "^0.11.5",
48
+ "jest-extended": "^2.0.0",
45
49
  "jest-matcher-utils": "^27.2.4",
46
50
  "rimraf": "^3.0.2",
47
51
  "ts-jest": "^27.0.5",
package/rangeOf.d.ts CHANGED
@@ -1,29 +1,125 @@
1
1
  import { Result } from './result';
2
+ /**
3
+ * Represents a generic range of some comparable type `<T>`.
4
+ * @public
5
+ */
2
6
  export interface RangeOfProperties<T> {
3
7
  readonly min?: T;
4
8
  readonly max?: T;
5
9
  }
10
+ /**
11
+ * Format strings (in mustache format) to
12
+ * use for both open-ended and complete
13
+ * {@link RangeOf | RangeOf<T>}.
14
+ * @public
15
+ */
6
16
  export interface RangeOfFormats {
7
17
  minOnly: string;
8
18
  maxOnly: string;
9
19
  minMax: string;
10
20
  }
21
+ /**
22
+ * Default {@link RangeOfFormats | formats} to use for both
23
+ * open-ended and complete {@link RangeOf | RangeOf<T>}.
24
+ * @public
25
+ */
11
26
  export declare const DEFAULT_RANGEOF_FORMATS: {
12
27
  minOnly: string;
13
28
  maxOnly: string;
14
29
  minMax: string;
15
30
  };
31
+ /**
32
+ * Simple implementation of a possibly open-ended range of some comparable
33
+ * type `<T>` with test and formatting.
34
+ * @public
35
+ */
16
36
  export declare class RangeOf<T> implements RangeOfProperties<T> {
37
+ /**
38
+ * Minimum extent of the range.
39
+ */
17
40
  readonly min?: T;
41
+ /**
42
+ * Maximum extent of the range.
43
+ */
18
44
  readonly max?: T;
45
+ /**
46
+ * Creates a new {@link RangeOf | RangeOf<T>}.
47
+ * @param min - Optional mininum extent of the range.
48
+ * @param max - Optional maximum extent of the range.
49
+ */
19
50
  constructor(min?: T, max?: T);
51
+ /**
52
+ * Static constructor for a {@link RangeOf | RangeOf<T>}.
53
+ * @param init - {@link RangeOfProperties | Range initializer}.
54
+ * @returns A new {@link RangeOf | RangeOf<T>}.
55
+ */
20
56
  static createRange<T>(init?: RangeOfProperties<T>): Result<RangeOf<T>>;
57
+ /**
58
+ * Gets a formatted description of a {@link RangeOfProperties | RangeOfProperties<T>} given an
59
+ * optional set of formats and 'empty' value to use.
60
+ * @param range - The {@link RangeOfProperties | RangeOfProperties<T>} to be formatted.
61
+ * @param formats - Optionas {@link RangeOfFormats | formats} to use. Default is
62
+ * {@link DEFAULT_RANGEOF_FORMATS | DEFAULT_RANGEOF_FORMATS}.
63
+ * @param emptyValue - Value which represents unbounded minimum or maximum for this range. Default is `undefined`.
64
+ * @returns A string representation of the range.
65
+ */
21
66
  static propertiesToString<T>(range: RangeOfProperties<T>, formats?: RangeOfFormats, emptyValue?: T): string | undefined;
67
+ /**
68
+ * Default comparison uses javascript built-in comparison.
69
+ * @param t1 - First value to be compared.
70
+ * @param t2 - Second value to be compared.
71
+ * @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
72
+ * and `'equal'` if `t1` and `t2` are equal.
73
+ * @internal
74
+ */
22
75
  protected static _defaultCompare<T>(t1: T, t2: T): 'less' | 'equal' | 'greater';
76
+ /**
77
+ * Checks if a supplied value is within this range.
78
+ * @param t - The value to be tested.
79
+ * @returns `'included'` if `t` falls within the range, `'less'` if `t` falls
80
+ * below the minimum extent of the range and `'greater'` if `t` is above the
81
+ * maximum extent.
82
+ */
23
83
  check(t: T): 'less' | 'included' | 'greater';
84
+ /**
85
+ * Determines if a supplied value is within this range.
86
+ * @param t - The value to be tested.
87
+ * @returns Returns `true` if `t` falls within the range, `false` otherwise.
88
+ */
24
89
  includes(t: T): boolean;
90
+ /**
91
+ * Finds the transition value that would bring a supplied value `t` into
92
+ * range.
93
+ * @param t - The value to be tested.
94
+ * @returns The minimum extent of the range if `t` is below the range or
95
+ * the maximum extent of the range if `t` is above the range. Returns
96
+ * `undefined` if `t` already falls within the range.
97
+ */
25
98
  findTransition(t: T): T | undefined;
99
+ /**
100
+ * Formats the minimum and maximum values of this range.
101
+ * @param format - A format function used to format the values.
102
+ * @returns A {@link RangeOfProperties | RangeOfProperties<string>} contaning the
103
+ * formatted representation of the {@link RangeOf.min | minimum} and {@link RangeOf.max | maximum}
104
+ * extent of the range, or `undefined` for an extent that is not present.
105
+ */
26
106
  toFormattedProperties(format: (value: T) => string | undefined): RangeOfProperties<string>;
107
+ /**
108
+ * Formats this range using the supplied format function.
109
+ * @param format - Format function used to format minimum and maxiumum extent values.
110
+ * @param formats - The {@link RangeOfFormats | format strings} used to format the range
111
+ * (default {@link DEFAULT_RANGEOF_FORMATS}).
112
+ * @returns Returns a formatted representation of this range.
113
+ */
27
114
  format(format: (value: T) => string | undefined, formats?: RangeOfFormats): string | undefined;
115
+ /**
116
+ * Inner compare method can be overriden by a derived class.
117
+ * @param t1 - First value to compare.
118
+ * @param t2 - Second value to compare.
119
+ * @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
120
+ * and `'equal'` if `t1` and `t2` are equal.
121
+ * @internal
122
+ */
28
123
  protected _compare(t1: T, t2: T): 'less' | 'equal' | 'greater';
29
124
  }
125
+ //# sourceMappingURL=rangeOf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rangeOf.d.ts","sourceRoot":"","sources":["../src/rangeOf.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,MAAM,EAAiB,MAAM,UAAU,CAAC;AAGjD;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;CAInC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,OAAO,CAAC,CAAC,CAAE,YAAW,iBAAiB,CAAC,CAAC,CAAC;IACnD;;OAEG;IACH,SAAgB,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB;;OAEG;IACH,SAAgB,GAAG,CAAC,EAAE,CAAC,CAAC;IAExB;;;;OAIG;gBACgB,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IASnC;;;;OAIG;WACW,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAI7E;;;;;;;;OAQG;WACW,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG,MAAM,GAAC,SAAS;IAgB5H;;;;;;;OAOG;IACH,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,GAAC,OAAO,GAAC,SAAS;IAU3E;;;;;;OAMG;IACI,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,GAAC,UAAU,GAAC,SAAS;IAU/C;;;;OAIG;IACI,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IAI9B;;;;;;;OAOG;IACI,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,SAAS;IAUxC;;;;;;OAMG;IACI,qBAAqB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAC,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAO/F;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAC,SAAS,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,GAAC,SAAS;IAIjG;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,GAAC,OAAO,GAAC,SAAS;CAG7D"}
package/rangeOf.js CHANGED
@@ -27,12 +27,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
27
27
  exports.RangeOf = exports.DEFAULT_RANGEOF_FORMATS = void 0;
28
28
  const result_1 = require("./result");
29
29
  const mustache_1 = __importDefault(require("mustache"));
30
+ /**
31
+ * Default {@link RangeOfFormats | formats} to use for both
32
+ * open-ended and complete {@link RangeOf | RangeOf<T>}.
33
+ * @public
34
+ */
30
35
  exports.DEFAULT_RANGEOF_FORMATS = {
31
36
  minOnly: '{{min}}-',
32
37
  maxOnly: '-{{max}}',
33
38
  minMax: '{{min}}-{{max}}',
34
39
  };
40
+ /**
41
+ * Simple implementation of a possibly open-ended range of some comparable
42
+ * type `<T>` with test and formatting.
43
+ * @public
44
+ */
35
45
  class RangeOf {
46
+ /**
47
+ * Creates a new {@link RangeOf | RangeOf<T>}.
48
+ * @param min - Optional mininum extent of the range.
49
+ * @param max - Optional maximum extent of the range.
50
+ */
36
51
  constructor(min, max) {
37
52
  if (((min !== undefined) && (max !== undefined)) &&
38
53
  this._compare(min, max) === 'greater') {
@@ -41,9 +56,23 @@ class RangeOf {
41
56
  this.min = min;
42
57
  this.max = max;
43
58
  }
59
+ /**
60
+ * Static constructor for a {@link RangeOf | RangeOf<T>}.
61
+ * @param init - {@link RangeOfProperties | Range initializer}.
62
+ * @returns A new {@link RangeOf | RangeOf<T>}.
63
+ */
44
64
  static createRange(init) {
45
65
  return (0, result_1.captureResult)(() => new RangeOf(init === null || init === void 0 ? void 0 : init.min, init === null || init === void 0 ? void 0 : init.max));
46
66
  }
67
+ /**
68
+ * Gets a formatted description of a {@link RangeOfProperties | RangeOfProperties<T>} given an
69
+ * optional set of formats and 'empty' value to use.
70
+ * @param range - The {@link RangeOfProperties | RangeOfProperties<T>} to be formatted.
71
+ * @param formats - Optionas {@link RangeOfFormats | formats} to use. Default is
72
+ * {@link DEFAULT_RANGEOF_FORMATS | DEFAULT_RANGEOF_FORMATS}.
73
+ * @param emptyValue - Value which represents unbounded minimum or maximum for this range. Default is `undefined`.
74
+ * @returns A string representation of the range.
75
+ */
47
76
  static propertiesToString(range, formats, emptyValue) {
48
77
  formats = formats !== null && formats !== void 0 ? formats : exports.DEFAULT_RANGEOF_FORMATS;
49
78
  if ((range.min !== undefined) && (range.min !== emptyValue)) {
@@ -59,6 +88,14 @@ class RangeOf {
59
88
  }
60
89
  return undefined;
61
90
  }
91
+ /**
92
+ * Default comparison uses javascript built-in comparison.
93
+ * @param t1 - First value to be compared.
94
+ * @param t2 - Second value to be compared.
95
+ * @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
96
+ * and `'equal'` if `t1` and `t2` are equal.
97
+ * @internal
98
+ */
62
99
  static _defaultCompare(t1, t2) {
63
100
  if (t1 < t2) {
64
101
  return 'less';
@@ -68,6 +105,13 @@ class RangeOf {
68
105
  }
69
106
  return 'equal';
70
107
  }
108
+ /**
109
+ * Checks if a supplied value is within this range.
110
+ * @param t - The value to be tested.
111
+ * @returns `'included'` if `t` falls within the range, `'less'` if `t` falls
112
+ * below the minimum extent of the range and `'greater'` if `t` is above the
113
+ * maximum extent.
114
+ */
71
115
  check(t) {
72
116
  if ((this.min !== undefined) && (this._compare(t, this.min) === 'less')) {
73
117
  return 'less';
@@ -77,9 +121,22 @@ class RangeOf {
77
121
  }
78
122
  return 'included';
79
123
  }
124
+ /**
125
+ * Determines if a supplied value is within this range.
126
+ * @param t - The value to be tested.
127
+ * @returns Returns `true` if `t` falls within the range, `false` otherwise.
128
+ */
80
129
  includes(t) {
81
130
  return this.check(t) === 'included';
82
131
  }
132
+ /**
133
+ * Finds the transition value that would bring a supplied value `t` into
134
+ * range.
135
+ * @param t - The value to be tested.
136
+ * @returns The minimum extent of the range if `t` is below the range or
137
+ * the maximum extent of the range if `t` is above the range. Returns
138
+ * `undefined` if `t` already falls within the range.
139
+ */
83
140
  findTransition(t) {
84
141
  switch (this.check(t)) {
85
142
  case 'less':
@@ -89,18 +146,40 @@ class RangeOf {
89
146
  }
90
147
  return undefined;
91
148
  }
149
+ /**
150
+ * Formats the minimum and maximum values of this range.
151
+ * @param format - A format function used to format the values.
152
+ * @returns A {@link RangeOfProperties | RangeOfProperties<string>} contaning the
153
+ * formatted representation of the {@link RangeOf.min | minimum} and {@link RangeOf.max | maximum}
154
+ * extent of the range, or `undefined` for an extent that is not present.
155
+ */
92
156
  toFormattedProperties(format) {
93
157
  return {
94
158
  min: (this.min !== undefined) ? format(this.min) : undefined,
95
159
  max: (this.max !== undefined) ? format(this.max) : undefined,
96
160
  };
97
161
  }
162
+ /**
163
+ * Formats this range using the supplied format function.
164
+ * @param format - Format function used to format minimum and maxiumum extent values.
165
+ * @param formats - The {@link RangeOfFormats | format strings} used to format the range
166
+ * (default {@link DEFAULT_RANGEOF_FORMATS}).
167
+ * @returns Returns a formatted representation of this range.
168
+ */
98
169
  format(format, formats) {
99
170
  return RangeOf.propertiesToString(this.toFormattedProperties(format), formats);
100
171
  }
172
+ /**
173
+ * Inner compare method can be overriden by a derived class.
174
+ * @param t1 - First value to compare.
175
+ * @param t2 - Second value to compare.
176
+ * @returns `'less'` if `t1` is less than `t2`, `'greater'` if `t1` is larger
177
+ * and `'equal'` if `t1` and `t2` are equal.
178
+ * @internal
179
+ */
101
180
  _compare(t1, t2) {
102
181
  return RangeOf._defaultCompare(t1, t2);
103
182
  }
104
183
  }
105
184
  exports.RangeOf = RangeOf;
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2VPZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZU9mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7OztBQUVILHFDQUFpRDtBQUNqRCx3REFBZ0M7QUFhbkIsUUFBQSx1QkFBdUIsR0FBRztJQUNuQyxPQUFPLEVBQUUsVUFBVTtJQUNuQixPQUFPLEVBQUUsVUFBVTtJQUNuQixNQUFNLEVBQUUsaUJBQWlCO0NBQzVCLENBQUM7QUFFRixNQUFhLE9BQU87SUFJaEIsWUFBbUIsR0FBTyxFQUFFLEdBQU87UUFDL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2pHO1FBQ0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVcsQ0FBSSxJQUEyQjtRQUNwRCxPQUFPLElBQUEsc0JBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsR0FBRyxFQUFFLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSxNQUFNLENBQUMsa0JBQWtCLENBQUksS0FBMkIsRUFBRSxPQUF3QixFQUFFLFVBQWM7UUFDckcsT0FBTyxH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LENBQUM7SUFDbkYsQ0FBQztJQUVTLFFBQVEsQ0FBQyxFQUFLLEVBQUUsRUFBSztRQUMzQixPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQWpGRCwwQkFpRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0IH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcblxuZXhwb3J0IGludGVyZmFjZSBSYW5nZU9mUHJvcGVydGllczxUPiB7XG4gICAgcmVhZG9ubHkgbWluPzogVDtcbiAgICByZWFkb25seSBtYXg/OiBUO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlT2ZGb3JtYXRzIHtcbiAgICBtaW5Pbmx5OiBzdHJpbmc7XG4gICAgbWF4T25seTogc3RyaW5nO1xuICAgIG1pbk1heDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFMgPSB7XG4gICAgbWluT25seTogJ3t7bWlufX0tJyxcbiAgICBtYXhPbmx5OiAnLXt7bWF4fX0nLFxuICAgIG1pbk1heDogJ3t7bWlufX0te3ttYXh9fScsXG59O1xuXG5leHBvcnQgY2xhc3MgUmFuZ2VPZjxUPiBpbXBsZW1lbnRzIFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWluPzogVDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWF4PzogVDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtaW4/OiBULCBtYXg/OiBUKSB7XG4gICAgICAgIGlmICgoKG1pbiAhPT0gdW5kZWZpbmVkKSAmJiAobWF4ICE9PSB1bmRlZmluZWQpKSAmJlxuICAgICAgICAgICAgdGhpcy5fY29tcGFyZShtaW4sIG1heCkgPT09ICdncmVhdGVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZlcnRlZCByYW5nZSAtICR7SlNPTi5zdHJpbmdpZnkobWluKX0gbXVzdCBiZSA8PSAke0pTT04uc3RyaW5naWZ5KG1heCl9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJhbmdlPFQ+KGluaXQ/OiBSYW5nZU9mUHJvcGVydGllczxUPik6IFJlc3VsdDxSYW5nZU9mPFQ+PiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBSYW5nZU9mPFQ+KGluaXQ/Lm1pbiwgaW5pdD8ubWF4KSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwcm9wZXJ0aWVzVG9TdHJpbmc8VD4ocmFuZ2U6IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+LCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMsIGVtcHR5VmFsdWU/OiBUKTogc3RyaW5nfHVuZGVmaW5lZCB7XG4gICAgICAgIGZvcm1hdHMgPSBmb3JtYXRzID8/IERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTO1xuICAgICAgICBpZiAoKHJhbmdlLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWluICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKChyYW5nZS5tYXggIT09IHVuZGVmaW5lZCkgJiYgKHJhbmdlLm1heCAhPT0gZW1wdHlWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKGZvcm1hdHMubWluTWF4LCByYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKGZvcm1hdHMubWluT25seSwgcmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChyYW5nZS5tYXggIT09IHVuZGVmaW5lZCkgJiYgKHJhbmdlLm1heCAhPT0gZW1wdHlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5tYXhPbmx5LCByYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9kZWZhdWx0Q29tcGFyZTxUPih0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICBpZiAodDEgPCB0Mikge1xuICAgICAgICAgICAgcmV0dXJuICdsZXNzJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0MSA+IHQyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2dyZWF0ZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZXF1YWwnO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGVjayh0OiBUKTogJ2xlc3MnfCdpbmNsdWRlZCd8J2dyZWF0ZXInIHtcbiAgICAgICAgaWYgKCh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1pbikgPT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGVzcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1heCkgIT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgcHVibGljIGluY2x1ZGVzKHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2sodCkgPT09ICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRUcmFuc2l0aW9uKHQ6IFQpOiBUfHVuZGVmaW5lZCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jaGVjayh0KSkge1xuICAgICAgICAgICAgY2FzZSAnbGVzcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWluO1xuICAgICAgICAgICAgY2FzZSAnaW5jbHVkZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1heDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0Zvcm1hdHRlZFByb3BlcnRpZXMoZm9ybWF0OiAodmFsdWU6IFQpID0+IHN0cmluZ3x1bmRlZmluZWQpOiBSYW5nZU9mUHJvcGVydGllczxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogKHRoaXMubWluICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWluKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1heDogKHRoaXMubWF4ICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWF4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0KGZvcm1hdDogKHZhbHVlOiBUKSA9PiBzdHJpbmd8dW5kZWZpbmVkLCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlT2YucHJvcGVydGllc1RvU3RyaW5nKHRoaXMudG9Gb3JtYXR0ZWRQcm9wZXJ0aWVzKGZvcm1hdCksIGZvcm1hdHMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY29tcGFyZSh0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICByZXR1cm4gUmFuZ2VPZi5fZGVmYXVsdENvbXBhcmUodDEsIHQyKTtcbiAgICB9XG59XG4iXX0=
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2VPZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yYW5nZU9mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7OztBQUVILHFDQUFpRDtBQUNqRCx3REFBZ0M7QUF1QmhDOzs7O0dBSUc7QUFDVSxRQUFBLHVCQUF1QixHQUFHO0lBQ25DLE9BQU8sRUFBRSxVQUFVO0lBQ25CLE9BQU8sRUFBRSxVQUFVO0lBQ25CLE1BQU0sRUFBRSxpQkFBaUI7Q0FDNUIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFVaEI7Ozs7T0FJRztJQUNILFlBQW1CLEdBQU8sRUFBRSxHQUFPO1FBQy9CLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqRztRQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFJLElBQTJCO1FBQ3BELE9BQU8sSUFBQSxzQkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxHQUFHLEVBQUUsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7OztP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QUMsQ0FBQyxTQUFTO1NBQy9ELENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLE1BQXNDLEVBQUUsT0FBd0I7UUFDMUUsT0FBTyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sUUFBUSxDQUFDLEVBQUssRUFBRSxFQUFLO1FBQzNCLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztDQUNKO0FBNUpELDBCQTRKQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQgfSBmcm9tICcuL3Jlc3VsdCc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHJhbmdlIG9mIHNvbWUgY29tcGFyYWJsZSB0eXBlIGA8VD5gLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+IHtcbiAgICByZWFkb25seSBtaW4/OiBUO1xuICAgIHJlYWRvbmx5IG1heD86IFQ7XG59XG5cbi8qKlxuICogRm9ybWF0IHN0cmluZ3MgKGluIG11c3RhY2hlIGZvcm1hdCkgdG9cbiAqIHVzZSBmb3IgYm90aCBvcGVuLWVuZGVkIGFuZCBjb21wbGV0ZVxuICoge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZU9mRm9ybWF0cyB7XG4gICAgbWluT25seTogc3RyaW5nO1xuICAgIG1heE9ubHk6IHN0cmluZztcbiAgICBtaW5NYXg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHtAbGluayBSYW5nZU9mRm9ybWF0cyB8IGZvcm1hdHN9IHRvIHVzZSBmb3IgYm90aFxuICogb3Blbi1lbmRlZCBhbmQgY29tcGxldGUge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTID0ge1xuICAgIG1pbk9ubHk6ICd7e21pbn19LScsXG4gICAgbWF4T25seTogJy17e21heH19JyxcbiAgICBtaW5NYXg6ICd7e21pbn19LXt7bWF4fX0nLFxufTtcblxuLyoqXG4gKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgYSBwb3NzaWJseSBvcGVuLWVuZGVkIHJhbmdlIG9mIHNvbWUgY29tcGFyYWJsZVxuICogdHlwZSBgPFQ+YCB3aXRoIHRlc3QgYW5kIGZvcm1hdHRpbmcuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW5nZU9mPFQ+IGltcGxlbWVudHMgUmFuZ2VPZlByb3BlcnRpZXM8VD4ge1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWluPzogVDtcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IG1heD86IFQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBSYW5nZU9mIHwgUmFuZ2VPZjxUPn0uXG4gICAgICogQHBhcmFtIG1pbiAtIE9wdGlvbmFsIG1pbmludW0gZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gbWF4IC0gT3B0aW9uYWwgbWF4aW11bSBleHRlbnQgb2YgdGhlIHJhbmdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtaW4/OiBULCBtYXg/OiBUKSB7XG4gICAgICAgIGlmICgoKG1pbiAhPT0gdW5kZWZpbmVkKSAmJiAobWF4ICE9PSB1bmRlZmluZWQpKSAmJlxuICAgICAgICAgICAgdGhpcy5fY29tcGFyZShtaW4sIG1heCkgPT09ICdncmVhdGVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZlcnRlZCByYW5nZSAtICR7SlNPTi5zdHJpbmdpZnkobWluKX0gbXVzdCBiZSA8PSAke0pTT04uc3RyaW5naWZ5KG1heCl9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWluID0gbWluO1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgY29uc3RydWN0b3IgZm9yIGEge0BsaW5rIFJhbmdlT2YgfCBSYW5nZU9mPFQ+fS5cbiAgICAgKiBAcGFyYW0gaW5pdCAtIHtAbGluayBSYW5nZU9mUHJvcGVydGllcyB8IFJhbmdlIGluaXRpYWxpemVyfS5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgUmFuZ2VPZiB8IFJhbmdlT2Y8VD59LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUmFuZ2U8VD4oaW5pdD86IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+KTogUmVzdWx0PFJhbmdlT2Y8VD4+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IFJhbmdlT2Y8VD4oaW5pdD8ubWluLCBpbml0Py5tYXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgZm9ybWF0dGVkIGRlc2NyaXB0aW9uIG9mIGEge0BsaW5rIFJhbmdlT2ZQcm9wZXJ0aWVzIHwgUmFuZ2VPZlByb3BlcnRpZXM8VD59IGdpdmVuIGFuXG4gICAgICogb3B0aW9uYWwgc2V0IG9mIGZvcm1hdHMgYW5kICdlbXB0eScgdmFsdWUgdG8gdXNlLlxuICAgICAqIEBwYXJhbSByYW5nZSAtIFRoZSB7QGxpbmsgUmFuZ2VPZlByb3BlcnRpZXMgfCBSYW5nZU9mUHJvcGVydGllczxUPn0gdG8gYmUgZm9ybWF0dGVkLlxuICAgICAqIEBwYXJhbSBmb3JtYXRzIC0gT3B0aW9uYXMge0BsaW5rIFJhbmdlT2ZGb3JtYXRzIHwgZm9ybWF0c30gdG8gdXNlLiBEZWZhdWx0IGlzXG4gICAgICoge0BsaW5rIERFRkFVTFRfUkFOR0VPRl9GT1JNQVRTIHwgREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFN9LlxuICAgICAqIEBwYXJhbSBlbXB0eVZhbHVlIC0gVmFsdWUgd2hpY2ggcmVwcmVzZW50cyB1bmJvdW5kZWQgbWluaW11bSBvciBtYXhpbXVtIGZvciB0aGlzIHJhbmdlLiBEZWZhdWx0IGlzIGB1bmRlZmluZWRgLlxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHByb3BlcnRpZXNUb1N0cmluZzxUPihyYW5nZTogUmFuZ2VPZlByb3BlcnRpZXM8VD4sIGZvcm1hdHM/OiBSYW5nZU9mRm9ybWF0cywgZW1wdHlWYWx1ZT86IFQpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgZm9ybWF0cyA9IGZvcm1hdHMgPz8gREVGQVVMVF9SQU5HRU9GX0ZPUk1BVFM7XG4gICAgICAgIGlmICgocmFuZ2UubWluICE9PSB1bmRlZmluZWQpICYmIChyYW5nZS5taW4gIT09IGVtcHR5VmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoKHJhbmdlLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWF4ICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5taW5NYXgsIHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoZm9ybWF0cy5taW5Pbmx5LCByYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHJhbmdlLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAocmFuZ2UubWF4ICE9PSBlbXB0eVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIE11c3RhY2hlLnJlbmRlcihmb3JtYXRzLm1heE9ubHksIHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgY29tcGFyaXNvbiB1c2VzIGphdmFzY3JpcHQgYnVpbHQtaW4gY29tcGFyaXNvbi5cbiAgICAgKiBAcGFyYW0gdDEgLSBGaXJzdCB2YWx1ZSB0byBiZSBjb21wYXJlZC5cbiAgICAgKiBAcGFyYW0gdDIgLSBTZWNvbmQgdmFsdWUgdG8gYmUgY29tcGFyZWQuXG4gICAgICogQHJldHVybnMgYCdsZXNzJ2AgaWYgYHQxYCBpcyBsZXNzIHRoYW4gYHQyYCwgYCdncmVhdGVyJ2AgaWYgYHQxYCBpcyBsYXJnZXJcbiAgICAgKiBhbmQgYCdlcXVhbCdgIGlmIGB0MWAgYW5kIGB0MmAgYXJlIGVxdWFsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2RlZmF1bHRDb21wYXJlPFQ+KHQxOiBULCB0MjogVCk6ICdsZXNzJ3wnZXF1YWwnfCdncmVhdGVyJyB7XG4gICAgICAgIGlmICh0MSA8IHQyKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2xlc3MnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHQxID4gdDIpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdlcXVhbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3VwcGxpZWQgdmFsdWUgaXMgd2l0aGluIHRoaXMgcmFuZ2UuXG4gICAgICogQHBhcmFtIHQgLSBUaGUgdmFsdWUgdG8gYmUgdGVzdGVkLlxuICAgICAqIEByZXR1cm5zIGAnaW5jbHVkZWQnYCBpZiBgdGAgZmFsbHMgd2l0aGluIHRoZSByYW5nZSwgYCdsZXNzJ2AgaWYgYHRgIGZhbGxzXG4gICAgICogYmVsb3cgdGhlIG1pbmltdW0gZXh0ZW50IG9mIHRoZSByYW5nZSBhbmQgYCdncmVhdGVyJ2AgaWYgYHRgIGlzIGFib3ZlIHRoZVxuICAgICAqIG1heGltdW0gZXh0ZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBjaGVjayh0OiBUKTogJ2xlc3MnfCdpbmNsdWRlZCd8J2dyZWF0ZXInIHtcbiAgICAgICAgaWYgKCh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1pbikgPT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGVzcyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLm1heCAhPT0gdW5kZWZpbmVkKSAmJiAodGhpcy5fY29tcGFyZSh0LCB0aGlzLm1heCkgIT09ICdsZXNzJykpIHtcbiAgICAgICAgICAgIHJldHVybiAnZ3JlYXRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIHN1cHBsaWVkIHZhbHVlIGlzIHdpdGhpbiB0aGlzIHJhbmdlLlxuICAgICAqIEBwYXJhbSB0IC0gVGhlIHZhbHVlIHRvIGJlIHRlc3RlZC5cbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiBgdGAgZmFsbHMgd2l0aGluIHRoZSByYW5nZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGluY2x1ZGVzKHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2sodCkgPT09ICdpbmNsdWRlZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHRyYW5zaXRpb24gdmFsdWUgdGhhdCB3b3VsZCBicmluZyBhIHN1cHBsaWVkIHZhbHVlIGB0YCBpbnRvXG4gICAgICogcmFuZ2UuXG4gICAgICogQHBhcmFtIHQgLSBUaGUgdmFsdWUgdG8gYmUgdGVzdGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBtaW5pbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UgaWYgYHRgIGlzIGJlbG93IHRoZSByYW5nZSBvclxuICAgICAqIHRoZSBtYXhpbXVtIGV4dGVudCBvZiB0aGUgcmFuZ2UgaWYgYHRgIGlzIGFib3ZlIHRoZSByYW5nZS4gIFJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCBpZiBgdGAgYWxyZWFkeSBmYWxscyB3aXRoaW4gdGhlIHJhbmdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kVHJhbnNpdGlvbih0OiBUKTogVHx1bmRlZmluZWQge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY2hlY2sodCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xlc3MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1pbjtcbiAgICAgICAgICAgIGNhc2UgJ2luY2x1ZGVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBvZiB0aGlzIHJhbmdlLlxuICAgICAqIEBwYXJhbSBmb3JtYXQgLSBBIGZvcm1hdCBmdW5jdGlvbiB1c2VkIHRvIGZvcm1hdCB0aGUgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIFJhbmdlT2ZQcm9wZXJ0aWVzIHwgUmFuZ2VPZlByb3BlcnRpZXM8c3RyaW5nPn0gY29udGFuaW5nIHRoZVxuICAgICAqIGZvcm1hdHRlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIFJhbmdlT2YubWluIHwgbWluaW11bX0gYW5kIHtAbGluayBSYW5nZU9mLm1heCB8IG1heGltdW19XG4gICAgICogZXh0ZW50IG9mIHRoZSByYW5nZSwgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIGV4dGVudCB0aGF0IGlzIG5vdCBwcmVzZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b0Zvcm1hdHRlZFByb3BlcnRpZXMoZm9ybWF0OiAodmFsdWU6IFQpID0+IHN0cmluZ3x1bmRlZmluZWQpOiBSYW5nZU9mUHJvcGVydGllczxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogKHRoaXMubWluICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWluKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1heDogKHRoaXMubWF4ICE9PSB1bmRlZmluZWQpID8gZm9ybWF0KHRoaXMubWF4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIHRoaXMgcmFuZ2UgdXNpbmcgdGhlIHN1cHBsaWVkIGZvcm1hdCBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gZm9ybWF0IC0gRm9ybWF0IGZ1bmN0aW9uIHVzZWQgdG8gZm9ybWF0IG1pbmltdW0gYW5kIG1heGl1bXVtIGV4dGVudCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGZvcm1hdHMgLSBUaGUge0BsaW5rIFJhbmdlT2ZGb3JtYXRzIHwgZm9ybWF0IHN0cmluZ3N9IHVzZWQgdG8gZm9ybWF0IHRoZSByYW5nZVxuICAgICAqIChkZWZhdWx0IHtAbGluayBERUZBVUxUX1JBTkdFT0ZfRk9STUFUU30pLlxuICAgICAqIEByZXR1cm5zIFJldHVybnMgYSBmb3JtYXR0ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByYW5nZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybWF0KGZvcm1hdDogKHZhbHVlOiBUKSA9PiBzdHJpbmd8dW5kZWZpbmVkLCBmb3JtYXRzPzogUmFuZ2VPZkZvcm1hdHMpOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJhbmdlT2YucHJvcGVydGllc1RvU3RyaW5nKHRoaXMudG9Gb3JtYXR0ZWRQcm9wZXJ0aWVzKGZvcm1hdCksIGZvcm1hdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElubmVyIGNvbXBhcmUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgYSBkZXJpdmVkIGNsYXNzLlxuICAgICAqIEBwYXJhbSB0MSAtIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHQyIC0gU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMgYCdsZXNzJ2AgaWYgYHQxYCBpcyBsZXNzIHRoYW4gYHQyYCwgYCdncmVhdGVyJ2AgaWYgYHQxYCBpcyBsYXJnZXJcbiAgICAgKiBhbmQgYCdlcXVhbCdgIGlmIGB0MWAgYW5kIGB0MmAgYXJlIGVxdWFsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfY29tcGFyZSh0MTogVCwgdDI6IFQpOiAnbGVzcyd8J2VxdWFsJ3wnZ3JlYXRlcicge1xuICAgICAgICByZXR1cm4gUmFuZ2VPZi5fZGVmYXVsdENvbXBhcmUodDEsIHQyKTtcbiAgICB9XG59XG4iXX0=