ngx-speculoos 11.1.0 → 12.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  ngx-speculoos helps you write simpler, cleaner unit tests for your Angular components, based on the
7
7
  *page object* pattern. It also provides utilities to make writing Angular unit tests easier.
8
8
 
9
- The library simply wraps the standard Angular ComponentFixture, and you should thus be
9
+ The library simply wraps the standard Angular ComponentFixture, and you should thus be
10
10
  able to understand and start using ngx-speculoos in just a few minutes if you already know
11
11
  how to write Angular unit tests.
12
12
 
@@ -28,8 +28,8 @@ how to write Angular unit tests.
28
28
  - [Dispatching events](#dispatching-events)
29
29
  - [Custom Jasmine matchers](#custom-jasmine-matchers)
30
30
  - [Routing helpers](#routing-helpers)
31
- - [ActivatedRoute stub](#activated-route-stub)
32
- - [RoutingTester](#routing-tester)
31
+ - [ActivatedRoute stub](#activatedroute-stub)
32
+ - [RoutingTester](#routingtester)
33
33
  - [Mocking helper](#mocking-helper)
34
34
  - [Testing with a host component](#testing-with-a-host-component)
35
35
  - [Gotchas](#gotchas)
@@ -74,12 +74,12 @@ it('should hide cities when selecting the empty country option', () => {
74
74
 
75
75
  ngx-speculoos allows writing the above tests in a simpler, cleaner way:
76
76
 
77
- - by using the page object pattern (which is optional, but recommended), you avoid repetitions.
78
- - by using wrappers around elements, dispatching events and triggering change detection is automatic.
79
- - by using wrappers around elements, you get useful additional methods to make tests easier to write and read.
80
- - by using custom matchers, you get even simpler expectations and more readable error messages
81
- - in any case you need them, you always have access to the fixture, the native elements, the debug elements, etc.
82
-
77
+ - by using the page object pattern (which is optional, but recommended), you avoid repetitions.
78
+ - by using wrappers around elements, dispatching events and triggering change detection is automatic.
79
+ - by using wrappers around elements, you get useful additional methods to make tests easier to write and read.
80
+ - by using custom matchers, you get even simpler expectations and more readable error messages
81
+ - in any case you need them, you always have access to the fixture, the native elements, the debug elements, etc.
82
+
83
83
  ```typescript
84
84
  class MyComponentTester extends ComponentTester<MyComponent> {
85
85
  constructor() {
@@ -121,17 +121,17 @@ Using yarn: `yarn add --dev ngx-speculoos`
121
121
 
122
122
  ### Getting started
123
123
 
124
- - import ComponentTester, and other needed classes from ngx-speculoos
125
- - Create a `MyComponentTester` class (in your `my-component.spec.ts` file, typically) extending
126
- `ComponentTester<MyComponent>`, as shown above.
127
- - Expose getters (or methods, if you prefer) returning the elements used in your tests, using
128
- one of the ComponentTester methods (`element`, `elements`, `input`, `select`, `textarea`, `button`, etc.).
129
- See the [API documentation](https://ngx-speculoos.ninja-squad.com/documentation/classes/ComponentTester.html) for details
130
- - Write your tests, as shown above, benefiting from the additional methods on the TestXxx classes.
131
- - If needed, you can always get the fixture, componentInstance, debugElement, nativeElement, etc.
132
- from the ComponentTester, and the nativeElement from each TestXxx wrapper.
133
- - If you like our custom matchers, add them in a `beforeEach` block as shown above, and enjoy.
134
- You can also add them for all tests at once by adding the beforeEach block to the CLI-generated `test.ts` file.
124
+ - import ComponentTester, and other needed classes from ngx-speculoos
125
+ - Create a `MyComponentTester` class (in your `my-component.spec.ts` file, typically) extending
126
+ `ComponentTester<MyComponent>`, as shown above.
127
+ - Expose getters (or methods, if you prefer) returning the elements used in your tests, using
128
+ one of the ComponentTester methods (`element`, `elements`, `input`, `select`, `textarea`, `button`, etc.).
129
+ See the [API documentation](https://ngx-speculoos.ninja-squad.com/documentation/classes/ComponentTester.html) for details
130
+ - Write your tests, as shown above, benefiting from the additional methods on the TestXxx classes.
131
+ - If needed, you can always get the fixture, componentInstance, debugElement, nativeElement, etc.
132
+ from the ComponentTester, and the nativeElement from each TestXxx wrapper.
133
+ - If you like our custom matchers, add them in a `beforeEach` block as shown above, and enjoy.
134
+ You can also add them for all tests at once by adding the beforeEach block to the CLI-generated `test.ts` file.
135
135
 
136
136
  ## Features in details
137
137
 
@@ -144,12 +144,12 @@ You can simply create one in your tests using
144
144
  const tester = new ComponentTester(MyComponent);
145
145
  ```
146
146
 
147
- and then use it to query for sub elements, components, directives, etc. But we recommend adopting the
147
+ and then use it to query for sub elements, components, directives, etc. But we recommend adopting the
148
148
  page object pattern, in order to make your test easier to write and read, and to avoid repeating the
149
- same selectors over and over again.
149
+ same selectors over and over again.
150
150
 
151
151
  You do that by writing a class that extends `ComponentTester`, and provides getters (or functions)
152
- to query for elements, components, etc.
152
+ to query for elements, components, etc.
153
153
 
154
154
  ```typescript
155
155
  class MyComponentTester extends ComponentTester<MyComponent> {
@@ -193,16 +193,16 @@ describe('My component', () => {
193
193
 
194
194
  #### Queries for elements
195
195
 
196
- Most of the queries that ngx-speculoos supports are used to query for DOM elements. The queries, however,
196
+ Most of the queries that ngx-speculoos supports are used to query for DOM elements. The queries, however,
197
197
  don't actually returns native DOM elements, but wrappers around them, which are instances of `TestElement`.
198
198
 
199
199
  `TestElement` has more specialized subclasses: `TestHtmlElement`, `TestInput`, `TestSelect`, `TestTextarea`, `TestButton`.
200
200
  Those subclasses offer helpful methods to get information or dispatch events to HTML elements, inputs, selects, etc.
201
- Our custom matchers act on those `TestElement` objects.
201
+ Our custom matchers act on those `TestElement` objects.
202
202
 
203
203
  You can [create your own subclasses of TestElement](#queries-for-custom-testelement) and query for them, too.
204
204
 
205
- A TestElement is a wrapper around an Angular `DebugElement`. So it can access the `DebugElement` and the
205
+ A TestElement is a wrapper around an Angular `DebugElement`. So it can access the `DebugElement` and the
206
206
  native DOM element that it wraps. It also has an instance of the `ComponentTester` which created it,
207
207
  which itself wraps the Angular `ComponentFixture` and thus allows detecting changes automatically after
208
208
  an element has been dispatched, for example.
@@ -249,11 +249,11 @@ get reviewers() {
249
249
 
250
250
  #### Queries for injection tokens
251
251
 
252
- Querying using `element(DatepickerDirective)` will return you a `TestElement` on which the
252
+ Querying using `element(DatepickerDirective)` will return you a `TestElement` on which the
253
253
  `DatepickerDirective` has been applied.
254
254
 
255
255
  If you need to get the `Datepicker` directive instance itself, then use the `token()` method
256
- (or `tokens()` to get several of them)
256
+ (or `tokens()` to get several of them)
257
257
  which takes a selector (CSS or type) as first argument, and the token as second argument:
258
258
 
259
259
  ```typescript
@@ -351,7 +351,7 @@ or in all tests, by adding the above line of code in the `test.ts` file.
351
351
 
352
352
  ### Dispatching events
353
353
 
354
- `TestElement` provides two methods that allow dispatching events in a simple way.
354
+ `TestElement` provides two methods that allow dispatching events in a simple way.
355
355
 
356
356
  - `dispatchEvent(event: Event)`
357
357
  - `dispatchEventOfType(type: string)`
@@ -380,7 +380,7 @@ with your own reusable components in tests.
380
380
 
381
381
  The library provides a stub for the `ActivatedRoute` class that you typically inject in your routed components.
382
382
  It mimics the behavior of the actual `ActivatedRoute`, by having a snapshot and observables that emit when this
383
- snapshot changes. And it also allows simulating navigations by imperatively changing the parameters, query parameters,
383
+ snapshot changes. And it also allows simulating navigations by imperatively changing the parameters, query parameters,
384
384
  etc.
385
385
 
386
386
  ```typescript
@@ -428,11 +428,11 @@ describe('routing component', () => {
428
428
 
429
429
  #### RoutingTester
430
430
 
431
- An alternative approach to injecting a stub activated route consists in using the Angular RouterTestingHarness.
432
- The library helps using it by providing a RoutingTester, which is a ComponentTester wrapping the
433
- RouterTestingHarness in addition to wrapping its fixture, and additionally provides helpe properties.
431
+ An alternative approach to injecting a stub activated route consists in using the Angular `RouterTestingHarness`.
432
+ The library helps using it by providing a `RoutingTester`, which is a `ComponentTester` wrapping the
433
+ `RouterTestingHarness` in addition to wrapping its fixture, and additionally provides helper properties.
434
434
 
435
- Here's an example usage for a component displaying the value of the query parameter `'page'` and allowing
435
+ Here's an example usage of a component displaying the value of the query parameter `'page'` and allowing
436
436
  to navigate to itself with a different value for that query parameter.
437
437
 
438
438
  ```typescript
@@ -496,7 +496,7 @@ const productService = jasmine.createSpyObj<ProductService>('ProductService', ['
496
496
  ```
497
497
 
498
498
  Since most of what we mock (usually Angular services) are classes, we can actually do a bit of introspection
499
- and create a mock that will automatically mock all the methods declared in the class. That's what our
499
+ and create a mock that will automatically mock all the methods declared in the class. That's what our
500
500
  `createMock()` function does. The above code can thus be reduced to:
501
501
 
502
502
  ```typescript
@@ -517,7 +517,7 @@ class HostComponent {
517
517
  id: 'u1',
518
518
  name: 'John'
519
519
  };
520
-
520
+
521
521
  smiled = false;
522
522
  }
523
523
 
@@ -525,11 +525,11 @@ class HostComponentTester extends ComponentTester<HostComponent> {
525
525
  constructor() {
526
526
  super(HostComponent);
527
527
  }
528
-
528
+
529
529
  get userComponent() {
530
530
  return this.component(UserComponent);
531
531
  }
532
-
532
+
533
533
  // ...
534
534
  }
535
535
  ```
@@ -550,7 +550,7 @@ But you still need to call `detectChanges()` by yourself in the other cases:
550
550
  `detectChanges()`. You need to do it yourself. The first call will cause the component lifecycle to start,
551
551
  just as when using a `ComponentFixture` directly.
552
552
  - to force change detection once you've changed the state of your component without dispatching an event:
553
- by changing the state, or emitting an event through a subject, or triggering a navigation
553
+ by changing the state, or emitting an event through a subject, or triggering a navigation
554
554
  from the `ActivatedRouteStub`
555
555
 
556
556
  ### Can I use the `TestElement` methods to act on the component element itself, rather than a sub-element?
@@ -280,4 +280,4 @@ const speculoosMatchers = {
280
280
  }
281
281
  };
282
282
  export { speculoosMatchers };
283
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2hlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvbWF0Y2hlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE1BQU0saUJBQWlCLEdBQW1DO0lBQ3hEOztPQUVHO0lBQ0gsV0FBVztRQUNULE1BQU0sTUFBTSxHQUFHLENBQUMsVUFBbUIsRUFBRSxFQUFXLEVBQUUsUUFBZ0IsRUFBRSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLDRCQUE0QixRQUFRLHFDQUFxQyxFQUFFLENBQUM7YUFDNUc7WUFDRCxJQUFJLENBQUMsQ0FBQyxFQUFFLFlBQVksV0FBVyxDQUFDLEVBQUU7Z0JBQ2hDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsUUFBUSxpREFBaUQsRUFBRSxDQUFDO2FBQ3hIO1lBQ0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUMxQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUNYLHVCQUF1QixVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLFFBQVEsS0FBSztnQkFDM0Us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QUFDO1FBQ0YsT0FBTztZQUNMLE9BQU8sQ0FBQyxFQUFXO2dCQUNqQixPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUNELGVBQWUsQ0FBQyxFQUFXO2dCQUN6QixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdFRleHRBcmVhIH0gZnJvbSAnLi90ZXN0LXRleHRhcmVhJztcbmltcG9ydCB7IFRlc3RJbnB1dCB9IGZyb20gJy4vdGVzdC1pbnB1dCc7XG5pbXBvcnQgeyBUZXN0RWxlbWVudCB9IGZyb20gJy4vdGVzdC1lbGVtZW50JztcbmltcG9ydCB7IFRlc3RTZWxlY3QgfSBmcm9tICcuL3Rlc3Qtc2VsZWN0JztcbmltcG9ydCB7IFRlc3RIdG1sRWxlbWVudCB9IGZyb20gJy4vdGVzdC1odG1sLWVsZW1lbnQnO1xuXG5jb25zdCBzcGVjdWxvb3NNYXRjaGVyczogamFzbWluZS5DdXN0b21NYXRjaGVyRmFjdG9yaWVzID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgYXMgdGhlIGdpdmVuIENTUyBjbGFzc1xuICAgKi9cbiAgdG9IYXZlQ2xhc3MoKTogamFzbWluZS5DdXN0b21NYXRjaGVyIHtcbiAgICBjb25zdCBhc3NlcnQgPSAoaXNOZWdhdGl2ZTogYm9vbGVhbiwgZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayBjbGFzcyAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgY2xhc3MgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdEVsZW1lbnRgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWwgPSBlbC5jbGFzc2VzO1xuICAgICAgY29uc3QgcGFzcyA9IGFjdHVhbC5pbmRleE9mKGV4cGVjdGVkKSAhPT0gLTE7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYEV4cGVjdGVkIGVsZW1lbnQgdG8gJHtpc05lZ2F0aXZlID8gJ25vdCAnIDogJyd9aGF2ZSBjbGFzcyAnJHtleHBlY3RlZH0nLCBgICtcbiAgICAgICAgYGJ1dCBoYWQgJHthY3R1YWwubGVuZ3RoID8gXCInXCIgKyBhY3R1YWwuam9pbignLCAnKSArIFwiJ1wiIDogJ25vbmUnfWA7XG4gICAgICByZXR1cm4geyBwYXNzOiBpc05lZ2F0aXZlID8gIXBhc3MgOiBwYXNzLCBtZXNzYWdlIH07XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgY29tcGFyZShlbDogdW5rbm93biwgZXhwZWN0ZWQ6IHN0cmluZyk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQoZmFsc2UsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9LFxuICAgICAgbmVnYXRpdmVDb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydCh0cnVlLCBlbCwgZXhwZWN0ZWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGF0IHRoZSByZWNlaXZlciBpcyBhIFRlc3RJbnB1dCBvciBhIFRlc3RUZXh0QXJlYSBhbmQgaGFzIHRoZSBnaXZlbiB2YWx1ZVxuICAgKi9cbiAgdG9IYXZlVmFsdWUoKTogamFzbWluZS5DdXN0b21NYXRjaGVyIHtcbiAgICBjb25zdCBhc3NlcnQgPSAoaXNOZWdhdGl2ZTogYm9vbGVhbiwgZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayB2YWx1ZSAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdElucHV0KSAmJiAhKGVsIGluc3RhbmNlb2YgVGVzdFRleHRBcmVhKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayB2YWx1ZSAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBuZWl0aGVyIGEgVGVzdElucHV0IG5vciBhIFRlc3RUZXh0QXJlYWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGVsLnZhbHVlO1xuICAgICAgY29uc3QgcGFzcyA9IGFjdHVhbCA9PT0gZXhwZWN0ZWQ7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEV4cGVjdGVkIGVsZW1lbnQgdG8gJHtpc05lZ2F0aXZlID8gJ25vdCAnIDogJyd9aGF2ZSB2YWx1ZSAnJHtleHBlY3RlZH0nLCBidXQgaGFkIHZhbHVlICcke2FjdHVhbH0nYDtcbiAgICAgIHJldHVybiB7IHBhc3M6IGlzTmVnYXRpdmUgPyAhcGFzcyA6IHBhc3MsIG1lc3NhZ2UgfTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydChmYWxzZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgaGFzIHRoZSBleGFjdCBnaXZlbiB0ZXh0Q29udGVudFxuICAgKi9cbiAgdG9IYXZlVGV4dCgpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXIge1xuICAgIGNvbnN0IGFzc2VydCA9IChpc05lZ2F0aXZlOiBib29sZWFuLCBlbDogdW5rbm93biwgZXhwZWN0ZWQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4geyBwYXNzOiBmYWxzZSwgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIHRleHQgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RFbGVtZW50KSkge1xuICAgICAgICByZXR1cm4geyBwYXNzOiBmYWxzZSwgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIHRleHQgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdEVsZW1lbnRgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWwgPSBlbC50ZXh0Q29udGVudDtcbiAgICAgIGNvbnN0IHBhc3MgPSBhY3R1YWwgPT09IGV4cGVjdGVkO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBFeHBlY3RlZCBlbGVtZW50IHRvICR7aXNOZWdhdGl2ZSA/ICdub3QgJyA6ICcnfWhhdmUgdGV4dCAnJHtleHBlY3RlZH0nLCBidXQgaGFkICcke2FjdHVhbH0nYDtcbiAgICAgIHJldHVybiB7IHBhc3M6IGlzTmVnYXRpdmUgPyAhcGFzcyA6IHBhc3MsIG1lc3NhZ2UgfTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydChmYWxzZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgaGFzIHRoZSBnaXZlbiB0ZXh0Q29udGVudCwgYWZ0ZXIgYm90aCBoYXZlIGJlZW4gdHJpbW1lZC5cbiAgICogU28sIEFuIGVsZW1lbnQgc3VjaCBhc1xuICAgKiBgYGBcbiAgICogPGgxPlxuICAgKiAgIFNvbWUgdGl0bGVcbiAgICogPC9oMT5cbiAgICogYGBgXG4gICAqIHdpbGwgcGFzcyB0aGUgdGVzdFxuICAgKiBgYGBcbiAgICogZXhwZWN0KHRlc3Rlci50aXRsZSkudG9IYXZlVHJpbW1lZFRleHQoJ1NvbWUgdGl0bGUnKVxuICAgKiBgYGBcbiAgICovXG4gIHRvSGF2ZVRyaW1tZWRUZXh0KCk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlciB7XG4gICAgY29uc3QgYXNzZXJ0ID0gKGlzTmVnYXRpdmU6IGJvb2xlYW4sIGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB0cmltbWVkRXhwZWN0ZWQgPSBleHBlY3RlZC50cmltKCk7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgdHJpbW1lZCB0ZXh0ICcke3RyaW1tZWRFeHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGFzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIHRyaW1tZWQgdGV4dCAnJHt0cmltbWVkRXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdEVsZW1lbnRgXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWwgPSBlbC50ZXh0Q29udGVudD8udHJpbSgpO1xuICAgICAgY29uc3QgcGFzcyA9IGFjdHVhbCA9PT0gdHJpbW1lZEV4cGVjdGVkO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBFeHBlY3RlZCBlbGVtZW50IHRvICR7aXNOZWdhdGl2ZSA/ICdub3QgJyA6ICcnfWhhdmUgdHJpbW1lZCB0ZXh0ICcke3RyaW1tZWRFeHBlY3RlZH0nLCBidXQgaGFkICcke2FjdHVhbH0nYDtcbiAgICAgIHJldHVybiB7IHBhc3M6IGlzTmVnYXRpdmUgPyAhcGFzcyA6IHBhc3MsIG1lc3NhZ2UgfTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydChmYWxzZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHRleHRDb250ZW50XG4gICAqL1xuICB0b0NvbnRhaW5UZXh0KCk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlciB7XG4gICAgY29uc3QgYXNzZXJ0ID0gKGlzTmVnYXRpdmU6IGJvb2xlYW4sIGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgdGV4dCAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgdGV4dCAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBub3QgYSBUZXN0RWxlbWVudGAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGVsLnRleHRDb250ZW50O1xuICAgICAgaWYgKCFhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXNzOiBpc05lZ2F0aXZlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCBlbGVtZW50IHRvICR7aXNOZWdhdGl2ZSA/ICdub3QgJyA6ICcnfWNvbnRhaW4gdGV4dCAnJHtleHBlY3RlZH0nLCBidXQgaGFkIG5vIHRleHRgXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwYXNzID0gYWN0dWFsLmluZGV4T2YoZXhwZWN0ZWQpICE9PSAtMTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRXhwZWN0ZWQgZWxlbWVudCB0byAke2lzTmVnYXRpdmUgPyAnbm90ICcgOiAnJ31jb250YWluIHRleHQgJyR7ZXhwZWN0ZWR9JywgYnV0IGhhZCB0ZXh0ICcke2FjdHVhbH0nYDtcbiAgICAgIHJldHVybiB7IHBhc3M6IGlzTmVnYXRpdmUgPyAhcGFzcyA6IHBhc3MsIG1lc3NhZ2UgfTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydChmYWxzZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHRleHRDb250ZW50XG4gICAqL1xuICB0b0JlQ2hlY2tlZCgpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXIge1xuICAgIGNvbnN0IGFzc2VydCA9IChpc05lZ2F0aXZlOiBib29sZWFuLCBlbDogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4geyBwYXNzOiBmYWxzZSwgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIGlmIGVsZW1lbnQgd2FzIGNoZWNrZWQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdElucHV0KSkge1xuICAgICAgICByZXR1cm4geyBwYXNzOiBmYWxzZSwgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIGlmIGVsZW1lbnQgd2FzIGNoZWNrZWQsIGJ1dCBlbGVtZW50IHdhcyBub3QgYSBUZXN0SW5wdXRgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwYXNzID0gZWwuY2hlY2tlZDtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRXhwZWN0ZWQgZWxlbWVudCB0byBiZSAke2lzTmVnYXRpdmUgPyAnbm90ICcgOiAnJ31jaGVja2VkLCBidXQgd2FzJHshaXNOZWdhdGl2ZSA/ICcgbm90JyA6ICcnfWA7XG4gICAgICByZXR1cm4geyBwYXNzOiBpc05lZ2F0aXZlID8gIXBhc3MgOiBwYXNzLCBtZXNzYWdlIH07XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgY29tcGFyZShlbDogdW5rbm93bik6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQoZmFsc2UsIGVsKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24pOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgYSBUZXN0U2VsZWN0IHdyYXBwaW5nIGEgRE9NIGVsZW1lbnQgYW5kIGhhcyB0aGUgZ2l2ZW4gc2VsZWN0ZWQgaW5kZXhcbiAgICovXG4gIHRvSGF2ZVNlbGVjdGVkSW5kZXgoKTogamFzbWluZS5DdXN0b21NYXRjaGVyIHtcbiAgICBjb25zdCBhc3NlcnQgPSAoaXNOZWdhdGl2ZTogYm9vbGVhbiwgZWw6IHVua25vd24sIGV4cGVjdGVkOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayBzZWxlY3RlZCBpbmRleCAke2V4cGVjdGVkfSBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RTZWxlY3QpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgaW5kZXggJHtleHBlY3RlZH0gb24gZWxlbWVudCwgYnV0IGVsZW1lbnQgd2FzIG5vdCBhIFRlc3RTZWxlY3RgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWwgPSBlbC5zZWxlY3RlZEluZGV4O1xuICAgICAgY29uc3QgcGFzcyA9IGFjdHVhbCA9PT0gZXhwZWN0ZWQ7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEV4cGVjdGVkIGVsZW1lbnQgdG8gJHtpc05lZ2F0aXZlID8gJ25vdCAnIDogJyd9aGF2ZSBzZWxlY3RlZCBpbmRleCAke2V4cGVjdGVkfSwgYnV0IGhhZCAke2FjdHVhbH1gO1xuICAgICAgcmV0dXJuIHsgcGFzczogaXNOZWdhdGl2ZSA/ICFwYXNzIDogcGFzcywgbWVzc2FnZSB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBudW1iZXIpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KGZhbHNlLCBlbCwgZXhwZWN0ZWQpO1xuICAgICAgfSxcbiAgICAgIG5lZ2F0aXZlQ29tcGFyZShlbDogdW5rbm93biwgZXhwZWN0ZWQ6IG51bWJlcik6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQodHJ1ZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgYSBUZXN0U2VsZWN0IHdyYXBwaW5nIGEgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc2VsZWN0ZWQgb3B0aW9uJ3MgdmFsdWUgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlXG4gICAqL1xuICB0b0hhdmVTZWxlY3RlZFZhbHVlKCk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlciB7XG4gICAgY29uc3QgYXNzZXJ0ID0gKGlzTmVnYXRpdmU6IGJvb2xlYW4sIGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgdmFsdWUgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RTZWxlY3QpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgdmFsdWUgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdFNlbGVjdGAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGVsLnNlbGVjdGVkVmFsdWU7XG4gICAgICBjb25zdCBwYXNzID0gYWN0dWFsID09PSBleHBlY3RlZDtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRXhwZWN0ZWQgZWxlbWVudCB0byAke2lzTmVnYXRpdmUgPyAnbm90ICcgOiAnJ31oYXZlIHNlbGVjdGVkIHZhbHVlICcke2V4cGVjdGVkfScsIGJ1dCBoYWQgJyR7YWN0dWFsfSdgO1xuICAgICAgcmV0dXJuIHsgcGFzczogaXNOZWdhdGl2ZSA/ICFwYXNzIDogcGFzcywgbWVzc2FnZSB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KGZhbHNlLCBlbCwgZXhwZWN0ZWQpO1xuICAgICAgfSxcbiAgICAgIG5lZ2F0aXZlQ29tcGFyZShlbDogdW5rbm93biwgZXhwZWN0ZWQ6IHN0cmluZyk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQodHJ1ZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgYSBUZXN0U2VsZWN0IHdyYXBwaW5nIGEgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc2VsZWN0ZWQgb3B0aW9uJ3MgbGFiZWwgZXF1YWwgdG8gdGhlIGdpdmVuIGxhYmVsXG4gICAqL1xuICB0b0hhdmVTZWxlY3RlZExhYmVsKCk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlciB7XG4gICAgY29uc3QgYXNzZXJ0ID0gKGlzTmVnYXRpdmU6IGJvb2xlYW4sIGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgbGFiZWwgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RTZWxlY3QpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgbGFiZWwgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdFNlbGVjdGAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGVsLnNlbGVjdGVkTGFiZWw7XG4gICAgICBjb25zdCBwYXNzID0gYWN0dWFsID09PSBleHBlY3RlZDtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRXhwZWN0ZWQgZWxlbWVudCB0byAke2lzTmVnYXRpdmUgPyAnbm90ICcgOiAnJ31oYXZlIHNlbGVjdGVkIGxhYmVsICcke2V4cGVjdGVkfScsIGJ1dCBoYWQgJyR7YWN0dWFsfSdgO1xuICAgICAgcmV0dXJuIHsgcGFzczogaXNOZWdhdGl2ZSA/ICFwYXNzIDogcGFzcywgbWVzc2FnZSB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KGZhbHNlLCBlbCwgZXhwZWN0ZWQpO1xuICAgICAgfSxcbiAgICAgIG5lZ2F0aXZlQ29tcGFyZShlbDogdW5rbm93biwgZXhwZWN0ZWQ6IHN0cmluZyk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQodHJ1ZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgYSBUZXN0SHRtbEVsZW1lbnQgd2hpY2ggaXMgdmlzaWJsZVxuICAgKi9cbiAgdG9CZVZpc2libGUoKTogamFzbWluZS5DdXN0b21NYXRjaGVyIHtcbiAgICBjb25zdCBhc3NlcnQgPSAoaXNOZWdhdGl2ZTogYm9vbGVhbiwgZWw6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3RhdGUgPSBgJHtpc05lZ2F0aXZlID8gJ2luJyA6ICcnfXZpc2libGVgO1xuICAgICAgY29uc3QgaW52ZXJzZVN0YXRlID0gYCR7aXNOZWdhdGl2ZSA/ICcnIDogJ2luJ312aXNpYmxlYDtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayBpZiBlbGVtZW50IHdhcyAke2V4cGVjdGVkU3RhdGV9LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RIdG1sRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayBpZiBlbGVtZW50IHdhcyAke2V4cGVjdGVkU3RhdGV9LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdEh0bWxFbGVtZW50YCB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcGFzcyA9IGVsLnZpc2libGU7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEV4cGVjdGVkIGVsZW1lbnQgdG8gYmUgJHtleHBlY3RlZFN0YXRlfSwgYnV0IHdhcyAke2ludmVyc2VTdGF0ZX1gO1xuICAgICAgcmV0dXJuIHsgcGFzczogaXNOZWdhdGl2ZSA/ICFwYXNzIDogcGFzcywgbWVzc2FnZSB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmUoZWw6IHVua25vd24pOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KGZhbHNlLCBlbCk7XG4gICAgICB9LFxuICAgICAgbmVnYXRpdmVDb21wYXJlKGVsOiB1bmtub3duKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydCh0cnVlLCBlbCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuZXhwb3J0IHsgc3BlY3Vsb29zTWF0Y2hlcnMgfTtcbiJdfQ==
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2hlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvbWF0Y2hlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE1BQU0saUJBQWlCLEdBQW1DO0lBQ3hEOztPQUVHO0lBQ0gsV0FBVztRQUNULE1BQU0sTUFBTSxHQUFHLENBQUMsVUFBbUIsRUFBRSxFQUFXLEVBQUUsUUFBZ0IsRUFBRSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDUixPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsNEJBQTRCLFFBQVEscUNBQXFDLEVBQUUsQ0FBQztZQUM3RyxDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUMsRUFBRSxZQUFZLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsUUFBUSxpREFBaUQsRUFBRSxDQUFDO1lBQ3pILENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQzFCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQ1gsdUJBQXVCLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVB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QzlILENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLDBCQUEwQixhQUFhLGFBQWEsWUFBWSxFQUFFLENBQUM7WUFDbkYsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEQsQ0FBQyxDQUFDO1FBQ0YsT0FBTztZQUNMLE9BQU8sQ0FBQyxFQUFXO2dCQUNqQixPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUNELGVBQWUsQ0FBQyxFQUFXO2dCQUN6QixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdFRleHRBcmVhIH0gZnJvbSAnLi90ZXN0LXRleHRhcmVhJztcbmltcG9ydCB7IFRlc3RJbnB1dCB9IGZyb20gJy4vdGVzdC1pbnB1dCc7XG5pbXBvcnQgeyBUZXN0RWxlbWVudCB9IGZyb20gJy4vdGVzdC1lbGVtZW50JztcbmltcG9ydCB7IFRlc3RTZWxlY3QgfSBmcm9tICcuL3Rlc3Qtc2VsZWN0JztcbmltcG9ydCB7IFRlc3RIdG1sRWxlbWVudCB9IGZyb20gJy4vdGVzdC1odG1sLWVsZW1lbnQnO1xuXG5jb25zdCBzcGVjdWxvb3NNYXRjaGVyczogamFzbWluZS5DdXN0b21NYXRjaGVyRmFjdG9yaWVzID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgYXMgdGhlIGdpdmVuIENTUyBjbGFzc1xuICAgKi9cbiAgdG9IYXZlQ2xhc3MoKTogamFzbWluZS5DdXN0b21NYXRjaGVyIHtcbiAgICBjb25zdCBhc3NlcnQgPSAoaXNOZWdhdGl2ZTogYm9vbGVhbiwgZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayBjbGFzcyAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgY2xhc3MgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdEVsZW1lbnRgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWwgPSBlbC5jbGFzc2VzO1xuICAgICAgY29uc3QgcGFzcyA9IGFjdHVhbC5pbmRleE9mKGV4cGVjdGVkKSAhPT0gLTE7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYEV4cGVjdGVkIGVsZW1lbnQgdG8gJHtpc05lZ2F0aXZlID8gJ25vdCAnIDogJyd9aGF2ZSBjbGFzcyAnJHtleHBlY3RlZH0nLCBgICtcbiAgICAgICAgYGJ1dCBoYWQgJHthY3R1YWwubGVuZ3RoID8gXCInXCIgKyBhY3R1YWwuam9pbignLCAnKSArIFwiJ1wiIDogJ25vbmUnfWA7XG4gICAgICByZXR1cm4geyBwYXNzOiBpc05lZ2F0aXZlID8gIXBhc3MgOiBwYXNzLCBtZXNzYWdlIH07XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgY29tcGFyZShlbDogdW5rbm93biwgZXhwZWN0ZWQ6IHN0cmluZyk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQoZmFsc2UsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9LFxuICAgICAgbmVnYXRpdmVDb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydCh0cnVlLCBlbCwgZXhwZWN0ZWQpO1xuICAgICAgfVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGF0IHRoZSByZWNlaXZlciBpcyBhIFRlc3RJbnB1dCBvciBhIFRlc3RUZXh0QXJlYSBhbmQgaGFzIHRoZSBnaXZlbiB2YWx1ZVxuICAgKi9cbiAgdG9IYXZlVmFsdWUoKTogamFzbWluZS5DdXN0b21NYXRjaGVyIHtcbiAgICBjb25zdCBhc3NlcnQgPSAoaXNOZWdhdGl2ZTogYm9vbGVhbiwgZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayB2YWx1ZSAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdElucHV0KSAmJiAhKGVsIGluc3RhbmNlb2YgVGVzdFRleHRBcmVhKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayB2YWx1ZSAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBuZWl0aGVyIGEgVGVzdElucHV0IG5vciBhIFRlc3RUZXh0QXJlYWBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGVsLnZhbHVlO1xuICAgICAgY29uc3QgcGFzcyA9IGFjdHVhbCA9PT0gZXhwZWN0ZWQ7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEV4cGVjdGVkIGVsZW1lbnQgdG8gJHtpc05lZ2F0aXZlID8gJ25vdCAnIDogJyd9aGF2ZSB2YWx1ZSAnJHtleHBlY3RlZH0nLCBidXQgaGFkIHZhbHVlICcke2FjdHVhbH0nYDtcbiAgICAgIHJldHVybiB7IHBhc3M6IGlzTmVnYXRpdmUgPyAhcGFzcyA6IHBhc3MsIG1lc3NhZ2UgfTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydChmYWxzZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgaGFzIHRoZSBleGFjdCBnaXZlbiB0ZXh0Q29udGVudFxuICAgKi9cbiAgdG9IYXZlVGV4dCgpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXIge1xuICAgIGNvbnN0IGFzc2VydCA9IChpc05lZ2F0aXZlOiBib29sZWFuLCBlbDogdW5rbm93biwgZXhwZWN0ZWQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4geyBwYXNzOiBmYWxzZSwgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIHRleHQgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RFbGVtZW50KSkge1xuICAgICAgICByZXR1cm4geyBwYXNzOiBmYWxzZSwgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIHRleHQgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdEVsZW1lbnRgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWwgPSBlbC50ZXh0Q29udGVudDtcbiAgICAgIGNvbnN0IHBhc3MgPSBhY3R1YWwgPT09IGV4cGVjdGVkO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBFeHBlY3RlZCBlbGVtZW50IHRvICR7aXNOZWdhdGl2ZSA/ICdub3QgJyA6ICcnfWhhdmUgdGV4dCAnJHtleHBlY3RlZH0nLCBidXQgaGFkICcke2FjdHVhbH0nYDtcbiAgICAgIHJldHVybiB7IHBhc3M6IGlzTmVnYXRpdmUgPyAhcGFzcyA6IHBhc3MsIG1lc3NhZ2UgfTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydChmYWxzZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgaGFzIHRoZSBnaXZlbiB0ZXh0Q29udGVudCwgYWZ0ZXIgYm90aCBoYXZlIGJlZW4gdHJpbW1lZC5cbiAgICogU28sIEFuIGVsZW1lbnQgc3VjaCBhc1xuICAgKiBgYGBcbiAgICogPGgxPlxuICAgKiAgIFNvbWUgdGl0bGVcbiAgICogPC9oMT5cbiAgICogYGBgXG4gICAqIHdpbGwgcGFzcyB0aGUgdGVzdFxuICAgKiBgYGBcbiAgICogZXhwZWN0KHRlc3Rlci50aXRsZSkudG9IYXZlVHJpbW1lZFRleHQoJ1NvbWUgdGl0bGUnKVxuICAgKiBgYGBcbiAgICovXG4gIHRvSGF2ZVRyaW1tZWRUZXh0KCk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlciB7XG4gICAgY29uc3QgYXNzZXJ0ID0gKGlzTmVnYXRpdmU6IGJvb2xlYW4sIGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB0cmltbWVkRXhwZWN0ZWQgPSBleHBlY3RlZC50cmltKCk7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgdHJpbW1lZCB0ZXh0ICcke3RyaW1tZWRFeHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGFzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIHRyaW1tZWQgdGV4dCAnJHt0cmltbWVkRXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdEVsZW1lbnRgXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWwgPSBlbC50ZXh0Q29udGVudD8udHJpbSgpO1xuICAgICAgY29uc3QgcGFzcyA9IGFjdHVhbCA9PT0gdHJpbW1lZEV4cGVjdGVkO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBFeHBlY3RlZCBlbGVtZW50IHRvICR7aXNOZWdhdGl2ZSA/ICdub3QgJyA6ICcnfWhhdmUgdHJpbW1lZCB0ZXh0ICcke3RyaW1tZWRFeHBlY3RlZH0nLCBidXQgaGFkICcke2FjdHVhbH0nYDtcbiAgICAgIHJldHVybiB7IHBhc3M6IGlzTmVnYXRpdmUgPyAhcGFzcyA6IHBhc3MsIG1lc3NhZ2UgfTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydChmYWxzZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHRleHRDb250ZW50XG4gICAqL1xuICB0b0NvbnRhaW5UZXh0KCk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlciB7XG4gICAgY29uc3QgYXNzZXJ0ID0gKGlzTmVnYXRpdmU6IGJvb2xlYW4sIGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgdGV4dCAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgdGV4dCAnJHtleHBlY3RlZH0nIG9uIGVsZW1lbnQsIGJ1dCBlbGVtZW50IHdhcyBub3QgYSBUZXN0RWxlbWVudGAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGVsLnRleHRDb250ZW50O1xuICAgICAgaWYgKCFhY3R1YWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwYXNzOiBpc05lZ2F0aXZlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCBlbGVtZW50IHRvICR7aXNOZWdhdGl2ZSA/ICdub3QgJyA6ICcnfWNvbnRhaW4gdGV4dCAnJHtleHBlY3RlZH0nLCBidXQgaGFkIG5vIHRleHRgXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwYXNzID0gYWN0dWFsLmluZGV4T2YoZXhwZWN0ZWQpICE9PSAtMTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRXhwZWN0ZWQgZWxlbWVudCB0byAke2lzTmVnYXRpdmUgPyAnbm90ICcgOiAnJ31jb250YWluIHRleHQgJyR7ZXhwZWN0ZWR9JywgYnV0IGhhZCB0ZXh0ICcke2FjdHVhbH0nYDtcbiAgICAgIHJldHVybiB7IHBhc3M6IGlzTmVnYXRpdmUgPyAhcGFzcyA6IHBhc3MsIG1lc3NhZ2UgfTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJlKGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydChmYWxzZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsLCBleHBlY3RlZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgdGhlIHJlY2VpdmVyIGlzIGEgVGVzdEVsZW1lbnQgd3JhcHBpbmcgYSBET00gZWxlbWVudCBhbmQgY29udGFpbnMgdGhlIGdpdmVuIHRleHRDb250ZW50XG4gICAqL1xuICB0b0JlQ2hlY2tlZCgpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXIge1xuICAgIGNvbnN0IGFzc2VydCA9IChpc05lZ2F0aXZlOiBib29sZWFuLCBlbDogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4geyBwYXNzOiBmYWxzZSwgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIGlmIGVsZW1lbnQgd2FzIGNoZWNrZWQsIGJ1dCBlbGVtZW50IHdhcyBmYWxzeWAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghKGVsIGluc3RhbmNlb2YgVGVzdElucHV0KSkge1xuICAgICAgICByZXR1cm4geyBwYXNzOiBmYWxzZSwgbWVzc2FnZTogYEV4cGVjdGVkIHRvIGNoZWNrIGlmIGVsZW1lbnQgd2FzIGNoZWNrZWQsIGJ1dCBlbGVtZW50IHdhcyBub3QgYSBUZXN0SW5wdXRgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwYXNzID0gZWwuY2hlY2tlZDtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRXhwZWN0ZWQgZWxlbWVudCB0byBiZSAke2lzTmVnYXRpdmUgPyAnbm90ICcgOiAnJ31jaGVja2VkLCBidXQgd2FzJHshaXNOZWdhdGl2ZSA/ICcgbm90JyA6ICcnfWA7XG4gICAgICByZXR1cm4geyBwYXNzOiBpc05lZ2F0aXZlID8gIXBhc3MgOiBwYXNzLCBtZXNzYWdlIH07XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgY29tcGFyZShlbDogdW5rbm93bik6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQoZmFsc2UsIGVsKTtcbiAgICAgIH0sXG4gICAgICBuZWdhdGl2ZUNvbXBhcmUoZWw6IHVua25vd24pOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KHRydWUsIGVsKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgYSBUZXN0U2VsZWN0IHdyYXBwaW5nIGEgRE9NIGVsZW1lbnQgYW5kIGhhcyB0aGUgZ2l2ZW4gc2VsZWN0ZWQgaW5kZXhcbiAgICovXG4gIHRvSGF2ZVNlbGVjdGVkSW5kZXgoKTogamFzbWluZS5DdXN0b21NYXRjaGVyIHtcbiAgICBjb25zdCBhc3NlcnQgPSAoaXNOZWdhdGl2ZTogYm9vbGVhbiwgZWw6IHVua25vd24sIGV4cGVjdGVkOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayBzZWxlY3RlZCBpbmRleCAke2V4cGVjdGVkfSBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RTZWxlY3QpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgaW5kZXggJHtleHBlY3RlZH0gb24gZWxlbWVudCwgYnV0IGVsZW1lbnQgd2FzIG5vdCBhIFRlc3RTZWxlY3RgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWwgPSBlbC5zZWxlY3RlZEluZGV4O1xuICAgICAgY29uc3QgcGFzcyA9IGFjdHVhbCA9PT0gZXhwZWN0ZWQ7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEV4cGVjdGVkIGVsZW1lbnQgdG8gJHtpc05lZ2F0aXZlID8gJ25vdCAnIDogJyd9aGF2ZSBzZWxlY3RlZCBpbmRleCAke2V4cGVjdGVkfSwgYnV0IGhhZCAke2FjdHVhbH1gO1xuICAgICAgcmV0dXJuIHsgcGFzczogaXNOZWdhdGl2ZSA/ICFwYXNzIDogcGFzcywgbWVzc2FnZSB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBudW1iZXIpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KGZhbHNlLCBlbCwgZXhwZWN0ZWQpO1xuICAgICAgfSxcbiAgICAgIG5lZ2F0aXZlQ29tcGFyZShlbDogdW5rbm93biwgZXhwZWN0ZWQ6IG51bWJlcik6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQodHJ1ZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgYSBUZXN0U2VsZWN0IHdyYXBwaW5nIGEgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc2VsZWN0ZWQgb3B0aW9uJ3MgdmFsdWUgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlXG4gICAqL1xuICB0b0hhdmVTZWxlY3RlZFZhbHVlKCk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlciB7XG4gICAgY29uc3QgYXNzZXJ0ID0gKGlzTmVnYXRpdmU6IGJvb2xlYW4sIGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgdmFsdWUgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RTZWxlY3QpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgdmFsdWUgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdFNlbGVjdGAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGVsLnNlbGVjdGVkVmFsdWU7XG4gICAgICBjb25zdCBwYXNzID0gYWN0dWFsID09PSBleHBlY3RlZDtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRXhwZWN0ZWQgZWxlbWVudCB0byAke2lzTmVnYXRpdmUgPyAnbm90ICcgOiAnJ31oYXZlIHNlbGVjdGVkIHZhbHVlICcke2V4cGVjdGVkfScsIGJ1dCBoYWQgJyR7YWN0dWFsfSdgO1xuICAgICAgcmV0dXJuIHsgcGFzczogaXNOZWdhdGl2ZSA/ICFwYXNzIDogcGFzcywgbWVzc2FnZSB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KGZhbHNlLCBlbCwgZXhwZWN0ZWQpO1xuICAgICAgfSxcbiAgICAgIG5lZ2F0aXZlQ29tcGFyZShlbDogdW5rbm93biwgZXhwZWN0ZWQ6IHN0cmluZyk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQodHJ1ZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgYSBUZXN0U2VsZWN0IHdyYXBwaW5nIGEgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc2VsZWN0ZWQgb3B0aW9uJ3MgbGFiZWwgZXF1YWwgdG8gdGhlIGdpdmVuIGxhYmVsXG4gICAqL1xuICB0b0hhdmVTZWxlY3RlZExhYmVsKCk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlciB7XG4gICAgY29uc3QgYXNzZXJ0ID0gKGlzTmVnYXRpdmU6IGJvb2xlYW4sIGVsOiB1bmtub3duLCBleHBlY3RlZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgbGFiZWwgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RTZWxlY3QpKSB7XG4gICAgICAgIHJldHVybiB7IHBhc3M6IGZhbHNlLCBtZXNzYWdlOiBgRXhwZWN0ZWQgdG8gY2hlY2sgc2VsZWN0ZWQgbGFiZWwgJyR7ZXhwZWN0ZWR9JyBvbiBlbGVtZW50LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdFNlbGVjdGAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGVsLnNlbGVjdGVkTGFiZWw7XG4gICAgICBjb25zdCBwYXNzID0gYWN0dWFsID09PSBleHBlY3RlZDtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRXhwZWN0ZWQgZWxlbWVudCB0byAke2lzTmVnYXRpdmUgPyAnbm90ICcgOiAnJ31oYXZlIHNlbGVjdGVkIGxhYmVsICcke2V4cGVjdGVkfScsIGJ1dCBoYWQgJyR7YWN0dWFsfSdgO1xuICAgICAgcmV0dXJuIHsgcGFzczogaXNOZWdhdGl2ZSA/ICFwYXNzIDogcGFzcywgbWVzc2FnZSB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmUoZWw6IHVua25vd24sIGV4cGVjdGVkOiBzdHJpbmcpOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KGZhbHNlLCBlbCwgZXhwZWN0ZWQpO1xuICAgICAgfSxcbiAgICAgIG5lZ2F0aXZlQ29tcGFyZShlbDogdW5rbm93biwgZXhwZWN0ZWQ6IHN0cmluZyk6IGphc21pbmUuQ3VzdG9tTWF0Y2hlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiBhc3NlcnQodHJ1ZSwgZWwsIGV4cGVjdGVkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCB0aGUgcmVjZWl2ZXIgaXMgYSBUZXN0SHRtbEVsZW1lbnQgd2hpY2ggaXMgdmlzaWJsZVxuICAgKi9cbiAgdG9CZVZpc2libGUoKTogamFzbWluZS5DdXN0b21NYXRjaGVyIHtcbiAgICBjb25zdCBhc3NlcnQgPSAoaXNOZWdhdGl2ZTogYm9vbGVhbiwgZWw6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3RhdGUgPSBgJHtpc05lZ2F0aXZlID8gJ2luJyA6ICcnfXZpc2libGVgO1xuICAgICAgY29uc3QgaW52ZXJzZVN0YXRlID0gYCR7aXNOZWdhdGl2ZSA/ICcnIDogJ2luJ312aXNpYmxlYDtcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayBpZiBlbGVtZW50IHdhcyAke2V4cGVjdGVkU3RhdGV9LCBidXQgZWxlbWVudCB3YXMgZmFsc3lgIH07XG4gICAgICB9XG4gICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIFRlc3RIdG1sRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHsgcGFzczogZmFsc2UsIG1lc3NhZ2U6IGBFeHBlY3RlZCB0byBjaGVjayBpZiBlbGVtZW50IHdhcyAke2V4cGVjdGVkU3RhdGV9LCBidXQgZWxlbWVudCB3YXMgbm90IGEgVGVzdEh0bWxFbGVtZW50YCB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcGFzcyA9IGVsLnZpc2libGU7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYEV4cGVjdGVkIGVsZW1lbnQgdG8gYmUgJHtleHBlY3RlZFN0YXRlfSwgYnV0IHdhcyAke2ludmVyc2VTdGF0ZX1gO1xuICAgICAgcmV0dXJuIHsgcGFzczogaXNOZWdhdGl2ZSA/ICFwYXNzIDogcGFzcywgbWVzc2FnZSB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmUoZWw6IHVua25vd24pOiBqYXNtaW5lLkN1c3RvbU1hdGNoZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gYXNzZXJ0KGZhbHNlLCBlbCk7XG4gICAgICB9LFxuICAgICAgbmVnYXRpdmVDb21wYXJlKGVsOiB1bmtub3duKTogamFzbWluZS5DdXN0b21NYXRjaGVyUmVzdWx0IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydCh0cnVlLCBlbCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcblxuZXhwb3J0IHsgc3BlY3Vsb29zTWF0Y2hlcnMgfTtcbiJdfQ==
@@ -22,4 +22,4 @@ function collectMethodNames(proto) {
22
22
  export function createMock(type) {
23
23
  return jasmine.createSpyObj(type.name, collectMethodNames(type.prototype));
24
24
  }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zcGVjdWxvb3Mvc3JjL2xpYi9tb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLDhEQUE4RDtBQUM5RCxTQUFTLGtCQUFrQixDQUFDLEtBQWM7SUFDeEMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUN4QyxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsTUFBTSxXQUFXLEdBQWtCLEVBQUUsQ0FBQztJQUN0QyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNuRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELElBQUksVUFBVSxJQUFJLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxVQUFVLElBQUksR0FBRyxLQUFLLGFBQWEsRUFBRTtZQUNqRixXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZCO0tBQ0Y7SUFDRCxPQUFPLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBSSxJQUFhO0lBQ3pDLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBSSxJQUFJLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQTRDLENBQUMsQ0FBQztBQUMzSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gY29sbGVjdE1ldGhvZE5hbWVzKHByb3RvOiB1bmtub3duKTogQXJyYXk8c3RyaW5nPiB7XG4gIGlmICghcHJvdG8gfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgbWV0aG9kTmFtZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGtleSk7XG4gICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09ICdmdW5jdGlvbicgJiYga2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICBtZXRob2ROYW1lcy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubWV0aG9kTmFtZXMsIC4uLmNvbGxlY3RNZXRob2ROYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKV07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNweSBvYmplY3QgZm9yIGEgY2xhc3Mgd2hlcmUgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcyAoYW5kIG9mIGl0cyBzdXBlcmNsYXNzZXMpIGFyZSBzcGllcy5cbiAqIEkuZS4sIGZvciBhIGNsYXNzIGBVc2VyU2VydmljZWAgd2l0aCBtZXRob2RzIGBnZXQoKWAsIGBjcmVhdGUoKWAsIGB1cGRhdGUoKWAgYW5kIGBkZWxldGUoKWAsIGNhbGxpbmdcbiAqIGBjcmVhdGVNb2NrKFVzZXJTZXJ2aWNlKWAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nXG4gKiBgamFzbWluZS5jcmVhdGVTcHlPYmo8VXNlclNlcnZpY2U+KCdVc2VyU2VydmljZScsIFsnZ2V0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10pYC5cbiAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIG1vY2sgKHVzdWFsbHkgYSBzZXJ2aWNlIGNsYXNzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9jazxUPih0eXBlOiBUeXBlPFQ+KTogamFzbWluZS5TcHlPYmo8VD4ge1xuICByZXR1cm4gamFzbWluZS5jcmVhdGVTcHlPYmo8VD4odHlwZS5uYW1lLCBjb2xsZWN0TWV0aG9kTmFtZXModHlwZS5wcm90b3R5cGUpIGFzIHVua25vd24gYXMgamFzbWluZS5TcHlPYmpNZXRob2ROYW1lczxUPik7XG59XG4iXX0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zcGVjdWxvb3Mvc3JjL2xpYi9tb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLDhEQUE4RDtBQUM5RCxTQUFTLGtCQUFrQixDQUFDLEtBQWM7SUFDeEMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFrQixFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELElBQUksVUFBVSxJQUFJLE9BQU8sVUFBVSxDQUFDLEtBQUssS0FBSyxVQUFVLElBQUksR0FBRyxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ2xGLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBSSxJQUFhO0lBQ3pDLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBSSxJQUFJLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQTRDLENBQUMsQ0FBQztBQUMzSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gY29sbGVjdE1ldGhvZE5hbWVzKHByb3RvOiB1bmtub3duKTogQXJyYXk8c3RyaW5nPiB7XG4gIGlmICghcHJvdG8gfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgbWV0aG9kTmFtZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pKSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIGtleSk7XG4gICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09ICdmdW5jdGlvbicgJiYga2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICBtZXRob2ROYW1lcy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubWV0aG9kTmFtZXMsIC4uLmNvbGxlY3RNZXRob2ROYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pKV07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNweSBvYmplY3QgZm9yIGEgY2xhc3Mgd2hlcmUgYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBjbGFzcyAoYW5kIG9mIGl0cyBzdXBlcmNsYXNzZXMpIGFyZSBzcGllcy5cbiAqIEkuZS4sIGZvciBhIGNsYXNzIGBVc2VyU2VydmljZWAgd2l0aCBtZXRob2RzIGBnZXQoKWAsIGBjcmVhdGUoKWAsIGB1cGRhdGUoKWAgYW5kIGBkZWxldGUoKWAsIGNhbGxpbmdcbiAqIGBjcmVhdGVNb2NrKFVzZXJTZXJ2aWNlKWAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nXG4gKiBgamFzbWluZS5jcmVhdGVTcHlPYmo8VXNlclNlcnZpY2U+KCdVc2VyU2VydmljZScsIFsnZ2V0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10pYC5cbiAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIG1vY2sgKHVzdWFsbHkgYSBzZXJ2aWNlIGNsYXNzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9jazxUPih0eXBlOiBUeXBlPFQ+KTogamFzbWluZS5TcHlPYmo8VD4ge1xuICByZXR1cm4gamFzbWluZS5jcmVhdGVTcHlPYmo8VD4odHlwZS5uYW1lLCBjb2xsZWN0TWV0aG9kTmFtZXModHlwZS5wcm90b3R5cGUpIGFzIHVua25vd24gYXMgamFzbWluZS5TcHlPYmpNZXRob2ROYW1lczxUPik7XG59XG4iXX0=
@@ -1,87 +1,5 @@
1
1
  import { ActivatedRoute, ActivatedRouteSnapshot, convertToParamMap } from '@angular/router';
2
- import { BehaviorSubject, map } from 'rxjs';
3
- /**
4
- * Creates a fake partial ActivatedRoute for tests.
5
- *
6
- * If you pass params, then the created route's paramMap will contain the same values.
7
- * The same goes for queryParams and queryParamMap.
8
- *
9
- * If you pass a parent route and a snapshot, and the passed snapshot doesn't have a parent, then the snapshot's
10
- * parent will be set to the parent route snapshot. This allows the code under test to use
11
- * `route.parent.snapshot` or `route.snapshot.parent`.
12
- *
13
- * If you pass a snapshot with a parent, but don't pass a parent or pass a parent without snapshot, then the route's
14
- * parent snapshot will be set to the given snapshot's parent. This allows the code under test to use
15
- * `route.parent.snapshot` or `route.snapshot.parent`.
16
- *
17
- * @returns a partially populated, fake ActivatedRoute, depending on what you passed in
18
- * @deprecated favor stubRoute, which creates an easier to use and more logical stub
19
- */
20
- export function fakeRoute(options) {
21
- const result = {
22
- url: options.url,
23
- params: options.params,
24
- paramMap: options.params && options.params.pipe(map(params => convertToParamMap(params))),
25
- queryParams: options.queryParams,
26
- queryParamMap: options.queryParams && options.queryParams.pipe(map(params => convertToParamMap(params))),
27
- fragment: options.fragment,
28
- data: options.data,
29
- outlet: options.outlet,
30
- component: options.component,
31
- snapshot: options.snapshot,
32
- routeConfig: options.routeConfig,
33
- root: options.root,
34
- parent: options.parent,
35
- firstChild: options.firstChild,
36
- children: options.children,
37
- pathFromRoot: options.pathFromRoot
38
- };
39
- for (let route = result; route; route = route.parent) {
40
- if (route.parent && route.parent.snapshot && !route.snapshot) {
41
- // eslint-disable-next-line deprecation/deprecation
42
- route.snapshot = fakeSnapshot({});
43
- }
44
- if (route.parent && route.parent.snapshot && !route.snapshot.parent) {
45
- route.snapshot.parent = route.parent.snapshot;
46
- }
47
- if (route.snapshot && route.snapshot.parent && !route.parent) {
48
- // eslint-disable-next-line deprecation/deprecation
49
- route.parent = fakeRoute({});
50
- }
51
- if (route.snapshot && route.snapshot.parent && route.parent && !route.parent.snapshot) {
52
- route.parent.snapshot = route.snapshot.parent;
53
- }
54
- }
55
- return result;
56
- }
57
- /**
58
- * Creates a fake partial ActivatedRouteSnapshot for tests.
59
- *
60
- * If you pass params, then the created snapshot's paramMap will contain the same values.
61
- * The same goes for queryParams and queryParamMap.
62
- *
63
- * @returns a partially populated, fake ActivatedRoute, depending on what you passed in
64
- * @deprecated favor stubRoute, which creates an easier to use and more logical stub for both the route and its snapshot
65
- */
66
- export function fakeSnapshot(options) {
67
- return {
68
- url: options.url,
69
- params: options.params,
70
- paramMap: options.params && convertToParamMap(options.params),
71
- queryParams: options.queryParams,
72
- queryParamMap: options.queryParams && convertToParamMap(options.queryParams),
73
- fragment: options.fragment,
74
- data: options.data,
75
- outlet: options.outlet,
76
- component: options.component,
77
- routeConfig: options.routeConfig,
78
- root: options.root,
79
- parent: options.parent,
80
- firstChild: options.firstChild,
81
- children: options.children,
82
- pathFromRoot: options.pathFromRoot
83
- };
84
- }
2
+ import { BehaviorSubject } from 'rxjs';
85
3
  class ActivatedRouteSnapshotStub extends ActivatedRouteSnapshot {
86
4
  get parent() {
87
5
  return this._parent;
@@ -348,4 +266,4 @@ export class ActivatedRouteStub extends ActivatedRoute {
348
266
  export function stubRoute(options) {
349
267
  return new ActivatedRouteStub(options);
350
268
  }
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBNkMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2SSxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUd4RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0E0QnpCO0lBQ0MsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDekYsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLGFBQWEsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDaEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FB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QUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0M7UUFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUFtQztJQUMzRCxPQUFPLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBjb252ZXJ0VG9QYXJhbU1hcCwgRGF0YSwgUGFyYW1NYXAsIFBhcmFtcywgUm91dGUsIFVybFNlZ21lbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZmFrZSBwYXJ0aWFsIEFjdGl2YXRlZFJvdXRlIGZvciB0ZXN0cy5cbiAqXG4gKiBJZiB5b3UgcGFzcyBwYXJhbXMsIHRoZW4gdGhlIGNyZWF0ZWQgcm91dGUncyBwYXJhbU1hcCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLlxuICogVGhlIHNhbWUgZ29lcyBmb3IgcXVlcnlQYXJhbXMgYW5kIHF1ZXJ5UGFyYW1NYXAuXG4gKlxuICogSWYgeW91IHBhc3MgYSBwYXJlbnQgcm91dGUgYW5kIGEgc25hcHNob3QsIGFuZCB0aGUgcGFzc2VkIHNuYXBzaG90IGRvZXNuJ3QgaGF2ZSBhIHBhcmVudCwgdGhlbiB0aGUgc25hcHNob3Qnc1xuICogcGFyZW50IHdpbGwgYmUgc2V0IHRvIHRoZSBwYXJlbnQgcm91dGUgc25hcHNob3QuIFRoaXMgYWxsb3dzIHRoZSBjb2RlIHVuZGVyIHRlc3QgdG8gdXNlXG4gKiBgcm91dGUucGFyZW50LnNuYXBzaG90YCBvciBgcm91dGUuc25hcHNob3QucGFyZW50YC5cbiAqXG4gKiBJZiB5b3UgcGFzcyBhIHNuYXBzaG90IHdpdGggYSBwYXJlbnQsIGJ1dCBkb24ndCBwYXNzIGEgcGFyZW50IG9yIHBhc3MgYSBwYXJlbnQgd2l0aG91dCBzbmFwc2hvdCwgdGhlbiB0aGUgcm91dGUnc1xuICogcGFyZW50IHNuYXBzaG90IHdpbGwgYmUgc2V0IHRvIHRoZSBnaXZlbiBzbmFwc2hvdCdzIHBhcmVudC4gVGhpcyBhbGxvd3MgdGhlIGNvZGUgdW5kZXIgdGVzdCB0byB1c2VcbiAqIGByb3V0ZS5wYXJlbnQuc25hcHNob3RgIG9yIGByb3V0ZS5zbmFwc2hvdC5wYXJlbnRgLlxuICpcbiAqIEByZXR1cm5zIGEgcGFydGlhbGx5IHBvcHVsYXRlZCwgZmFrZSBBY3RpdmF0ZWRSb3V0ZSwgZGVwZW5kaW5nIG9uIHdoYXQgeW91IHBhc3NlZCBpblxuICogQGRlcHJlY2F0ZWQgZmF2b3Igc3R1YlJvdXRlLCB3aGljaCBjcmVhdGVzIGFuIGVhc2llciB0byB1c2UgYW5kIG1vcmUgbG9naWNhbCBzdHViXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWtlUm91dGUob3B0aW9uczoge1xuICB1cmw/OiBPYnNlcnZhYmxlPFVybFNlZ21lbnRbXT47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBtYXRyaXggcGFyYW1ldGVycyBzY29wZWQgdG8gdGhpcyByb3V0ZSAqL1xuICBwYXJhbXM/OiBPYnNlcnZhYmxlPFBhcmFtcz47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIHNoYXJlZCBieSBhbGwgdGhlIHJvdXRlcyAqL1xuICBxdWVyeVBhcmFtcz86IE9ic2VydmFibGU8UGFyYW1zPjtcbiAgLyoqIEFuIG9ic2VydmFibGUgb2YgdGhlIFVSTCBmcmFnbWVudCBzaGFyZWQgYnkgYWxsIHRoZSByb3V0ZXMgKi9cbiAgZnJhZ21lbnQ/OiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIC8qKiBBbiBvYnNlcnZhYmxlIG9mIHRoZSBzdGF0aWMgYW5kIHJlc29sdmVkIGRhdGEgb2YgdGhpcyByb3V0ZS4gKi9cbiAgZGF0YT86IE9ic2VydmFibGU8RGF0YT47XG4gIC8qKiBUaGUgb3V0bGV0IG5hbWUgb2YgdGhlIHJvdXRlLiBJdCdzIGEgY29uc3RhbnQgKi9cbiAgb3V0bGV0Pzogc3RyaW5nO1xuICAvKiogVGhlIGNvbXBvbmVudCBvZiB0aGUgcm91dGUuIEl0J3MgYSBjb25zdGFudCAqL1xuICBjb21wb25lbnQ/OiBUeXBlPHVua25vd24+IHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHNuYXBzaG90IG9mIHRoaXMgcm91dGUgKi9cbiAgc25hcHNob3Q/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBtYXRjaCB0aGlzIHJvdXRlICovXG4gIHJvdXRlQ29uZmlnPzogUm91dGUgfCBudWxsO1xuICAvKiogVGhlIHJvb3Qgb2YgdGhlIHJvdXRlciBzdGF0ZSAqL1xuICByb290PzogQWN0aXZhdGVkUm91dGU7XG4gIC8qKiBUaGUgcGFyZW50IG9mIHRoaXMgcm91dGUgaW4gdGhlIHJvdXRlciBzdGF0ZSB0cmVlICovXG4gIHBhcmVudD86IEFjdGl2YXRlZFJvdXRlIHwgbnVsbDtcbiAgLyoqIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBmaXJzdENoaWxkPzogQWN0aXZhdGVkUm91dGU7XG4gIC8qKiBUaGUgY2hpbGRyZW4gb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgKi9cbiAgY2hpbGRyZW4/OiBBY3RpdmF0ZWRSb3V0ZVtdO1xuICAvKiogVGhlIHBhdGggZnJvbSB0aGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgdG8gdGhpcyByb3V0ZSAqL1xuICBwYXRoRnJvbVJvb3Q/OiBBY3RpdmF0ZWRSb3V0ZVtdO1xufSk6IEFjdGl2YXRlZFJvdXRlIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICBwYXJhbU1hcDogb3B0aW9ucy5wYXJhbXMgJiYgb3B0aW9ucy5wYXJhbXMucGlwZShtYXAocGFyYW1zID0+IGNvbnZlcnRUb1BhcmFtTWFwKHBhcmFtcykpKSxcbiAgICBxdWVyeVBhcmFtczogb3B0aW9ucy5xdWVyeVBhcmFtcyxcbiAgICBxdWVyeVBhcmFtTWFwOiBvcHRpb25zLnF1ZXJ5UGFyYW1zICYmIG9wdGlvbnMucXVlcnlQYXJhbXMucGlwZShtYXAocGFyYW1zID0+IGNvbnZlcnRUb1BhcmFtTWFwKHBhcmFtcykpKSxcbiAgICBmcmFnbWVudDogb3B0aW9ucy5mcmFnbWVudCxcbiAgICBkYXRhOiBvcHRpb25zLmRhdGEsXG4gICAgb3V0bGV0OiBvcHRpb25zLm91dGxldCxcbiAgICBjb21wb25lbnQ6IG9wdGlvbnMuY29tcG9uZW50LFxuICAgIHNuYXBzaG90OiBvcHRpb25zLnNuYXBzaG90LFxuICAgIHJvdXRlQ29uZmlnOiBvcHRpb25zLnJvdXRlQ29uZmlnLFxuICAgIHJvb3Q6IG9wdGlvbnMucm9vdCxcbiAgICBwYXJlbnQ6IG9wdGlvbnMucGFyZW50LFxuICAgIGZpcnN0Q2hpbGQ6IG9wdGlvbnMuZmlyc3RDaGlsZCxcbiAgICBjaGlsZHJlbjogb3B0aW9ucy5jaGlsZHJlbixcbiAgICBwYXRoRnJvbVJvb3Q6IG9wdGlvbnMucGF0aEZyb21Sb290XG4gIH0gYXMgQWN0aXZhdGVkUm91dGU7XG5cbiAgZm9yIChsZXQgcm91dGU6IG51bGwgfCBBY3RpdmF0ZWRSb3V0ZSA9IHJlc3VsdDsgcm91dGU7IHJvdXRlID0gcm91dGUucGFyZW50KSB7XG4gICAgaWYgKHJvdXRlLnBhcmVudCAmJiByb3V0ZS5wYXJlbnQuc25hcHNob3QgJiYgIXJvdXRlLnNuYXBzaG90KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgIHJvdXRlLnNuYXBzaG90ID0gZmFrZVNuYXBzaG90KHt9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLnBhcmVudCAmJiByb3V0ZS5wYXJlbnQuc25hcHNob3QgJiYgIXJvdXRlLnNuYXBzaG90LnBhcmVudCkge1xuICAgICAgKHJvdXRlLnNuYXBzaG90IGFzIE9taXQ8QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgJ3BhcmVudCc+ICYgeyBwYXJlbnQ6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSkucGFyZW50ID0gcm91dGUucGFyZW50LnNuYXBzaG90O1xuICAgIH1cblxuICAgIGlmIChyb3V0ZS5zbmFwc2hvdCAmJiByb3V0ZS5zbmFwc2hvdC5wYXJlbnQgJiYgIXJvdXRlLnBhcmVudCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICAocm91dGUgYXMgT21pdDxBY3RpdmF0ZWRSb3V0ZSwgJ3BhcmVudCc+ICYgeyBwYXJlbnQ6IEFjdGl2YXRlZFJvdXRlIH0pLnBhcmVudCA9IGZha2VSb3V0ZSh7fSk7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5zbmFwc2hvdCAmJiByb3V0ZS5zbmFwc2hvdC5wYXJlbnQgJiYgcm91dGUucGFyZW50ICYmICFyb3V0ZS5wYXJlbnQuc25hcHNob3QpIHtcbiAgICAgIHJvdXRlLnBhcmVudC5zbmFwc2hvdCA9IHJvdXRlLnNuYXBzaG90LnBhcmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmYWtlIHBhcnRpYWwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCBmb3IgdGVzdHMuXG4gKlxuICogSWYgeW91IHBhc3MgcGFyYW1zLCB0aGVuIHRoZSBjcmVhdGVkIHNuYXBzaG90J3MgcGFyYW1NYXAgd2lsbCBjb250YWluIHRoZSBzYW1lIHZhbHVlcy5cbiAqIFRoZSBzYW1lIGdvZXMgZm9yIHF1ZXJ5UGFyYW1zIGFuZCBxdWVyeVBhcmFtTWFwLlxuICpcbiAqIEByZXR1cm5zIGEgcGFydGlhbGx5IHBvcHVsYXRlZCwgZmFrZSBBY3RpdmF0ZWRSb3V0ZSwgZGVwZW5kaW5nIG9uIHdoYXQgeW91IHBhc3NlZCBpblxuICogQGRlcHJlY2F0ZWQgZmF2b3Igc3R1YlJvdXRlLCB3aGljaCBjcmVhdGVzIGFuIGVhc2llciB0byB1c2UgYW5kIG1vcmUgbG9naWNhbCBzdHViIGZvciBib3RoIHRoZSByb3V0ZSBhbmQgaXRzIHNuYXBzaG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWtlU25hcHNob3Qob3B0aW9uczoge1xuICB1cmw/OiBVcmxTZWdtZW50W107XG4gIC8qKiBUaGUgbWF0cml4IHBhcmFtZXRlcnMgc2NvcGVkIHRvIHRoaXMgcm91dGUgKi9cbiAgcGFyYW1zPzogUGFyYW1zO1xuICAvKiogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgc2hhcmVkIGJ5IGFsbCB0aGUgcm91dGVzICovXG4gIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAvKiogVGhlIFVSTCBmcmFnbWVudCBzaGFyZWQgYnkgYWxsIHRoZSByb3V0ZXMgKi9cbiAgZnJhZ21lbnQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3RhdGljIGFuZCByZXNvbHZlZCBkYXRhIG9mIHRoaXMgcm91dGUgKi9cbiAgZGF0YT86IERhdGE7XG4gIC8qKiBUaGUgb3V0bGV0IG5hbWUgb2YgdGhlIHJvdXRlICovXG4gIG91dGxldD86IHN0cmluZztcbiAgLyoqIFRoZSBjb21wb25lbnQgb2YgdGhlIHJvdXRlICovXG4gIGNvbXBvbmVudD86IFR5cGU8dW5rbm93bj4gfCBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBtYXRjaCB0aGlzIHJvdXRlICovXG4gIHJvdXRlQ29uZmlnPzogUm91dGU7XG4gIC8qKiBUaGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlICovXG4gIHJvb3Q/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICAvKiogVGhlIHBhcmVudCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBwYXJlbnQ/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbDtcbiAgLyoqIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBmaXJzdENoaWxkPzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGw7XG4gIC8qKiBUaGUgY2hpbGRyZW4gb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgKi9cbiAgY2hpbGRyZW4/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90W107XG4gIC8qKiBUaGUgcGF0aCBmcm9tIHRoZSByb290IG9mIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSB0byB0aGlzIHJvdXRlICovXG4gIHBhdGhGcm9tUm9vdD86IEFjdGl2YXRlZFJvdXRlU25hcHNob3RbXTtcbn0pOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgcmV0dXJuIHtcbiAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgcGFyYW1NYXA6IG9wdGlvbnMucGFyYW1zICYmIGNvbnZlcnRUb1BhcmFtTWFwKG9wdGlvbnMucGFyYW1zKSxcbiAgICBxdWVyeVBhcmFtczogb3B0aW9ucy5xdWVyeVBhcmFtcyxcbiAgICBxdWVyeVBhcmFtTWFwOiBvcHRpb25zLnF1ZXJ5UGFyYW1zICYmIGNvbnZlcnRUb1BhcmFtTWFwKG9wdGlvbnMucXVlcnlQYXJhbXMpLFxuICAgIGZyYWdtZW50OiBvcHRpb25zLmZyYWdtZW50LFxuICAgIGRhdGE6IG9wdGlvbnMuZGF0YSxcbiAgICBvdXRsZXQ6IG9wdGlvbnMub3V0bGV0LFxuICAgIGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsXG4gICAgcm91dGVDb25maWc6IG9wdGlvbnMucm91dGVDb25maWcsXG4gICAgcm9vdDogb3B0aW9ucy5yb290LFxuICAgIHBhcmVudDogb3B0aW9ucy5wYXJlbnQsXG4gICAgZmlyc3RDaGlsZDogb3B0aW9ucy5maXJzdENoaWxkLFxuICAgIGNoaWxkcmVuOiBvcHRpb25zLmNoaWxkcmVuLFxuICAgIHBhdGhGcm9tUm9vdDogb3B0aW9ucy5wYXRoRnJvbVJvb3RcbiAgfSBhcyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIHRoYXQgYXJlIHBhc3NlZCB3aGVuIGNyZWF0aW5nIGFuIEFjdGl2YXRlZFJvdXRlU3R1Yi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0ZWRSb3V0ZVN0dWJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgcm91dGVcbiAgICovXG4gIHBhcmFtcz86IFBhcmFtcztcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgcXVlcnkgcGFyYW1ldGVycyBvZiB0aGUgcm91dGVcbiAgICovXG4gIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBkYXRhIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgZGF0YT86IERhdGE7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIHRpdGxlIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBmcmFnbWVudCBvZiB0aGUgcm91dGVcbiAgICovXG4gIGZyYWdtZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHVybCBvZiB0aGUgcm91dGVcbiAgICovXG4gIHVybD86IFVybFNlZ21lbnRbXTtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgb2YgdGhlIHJvdXRlXG4gICAqL1xuICBwYXJlbnQ/OiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIGZpcnN0IGNoaWxkIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgZmlyc3RDaGlsZD86IEFjdGl2YXRlZFJvdXRlU3R1YiB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGRyZW4gb2YgdGhlIHJvdXRlXG4gICAqL1xuICBjaGlsZHJlbj86IEFjdGl2YXRlZFJvdXRlU3R1YltdIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgcm91dGVDb25maWc/OiBSb3V0ZSB8IG51bGw7XG59XG5cbmNsYXNzIEFjdGl2YXRlZFJvdXRlU25hcHNob3RTdHViIGV4dGVuZHMgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XG4gIHByaXZhdGUgX3BhcmVudDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9yb290OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90O1xuICBwcml2YXRlIF9maXJzdENoaWxkOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2NoaWxkcmVuOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PiA9IFtdO1xuICBwcml2YXRlIF9wYXRoRnJvbVJvb3Q6IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+ID0gW107XG4gIHByaXZhdGUgX3RpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IHBhcmVudCgpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuXG4gIHNldCBwYXJlbnQodmFsdWU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsKSB7XG4gICAgdGhpcy5fcGFyZW50ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcm9vdCgpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcbiAgfVxuXG4gIHNldCByb290KHZhbHVlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KSB7XG4gICAgdGhpcy5fcm9vdCA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGZpcnN0Q2hpbGQoKTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9maXJzdENoaWxkO1xuICB9XG5cbiAgc2V0IGZpcnN0Q2hpbGQodmFsdWU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsKSB7XG4gICAgdGhpcy5fZmlyc3RDaGlsZCA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGNoaWxkcmVuKCk6IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gIH1cblxuICBzZXQgY2hpbGRyZW4odmFsdWU6IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+KSB7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBwYXRoRnJvbVJvb3QoKTogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4ge1xuICAgIHJldHVybiB0aGlzLl9wYXRoRnJvbVJvb3Q7XG4gIH1cblxuICBzZXQgcGF0aEZyb21Sb290KHZhbHVlOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90Pikge1xuICAgIHRoaXMuX3BhdGhGcm9tUm9vdCA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHRpdGxlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICB9XG5cbiAgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90aXRsZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHBhcmFtTWFwKCk6IFBhcmFtTWFwIHtcbiAgICByZXR1cm4gY29udmVydFRvUGFyYW1NYXAodGhpcy5wYXJhbXMpO1xuICB9XG5cbiAgZ2V0IHF1ZXJ5UGFyYW1NYXAoKTogUGFyYW1NYXAge1xuICAgIHJldHVybiBjb252ZXJ0VG9QYXJhbU1hcCh0aGlzLnF1ZXJ5UGFyYW1zKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcm9vdCA9IHRoaXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHN0dWIgZm9yIEFjdGl2YXRlZFJvdXRlLiBJdCBiZWhhdmVzIGFsbW9zdCB0aGUgc2FtZSB3YXkgYXMgdGhlIGFjdHVhbCBBY3RpdmF0ZWRSb3V0ZSwgZXhwb3NpbmcgYSBzbmFwc2hvdFxuICogYW5kIG9ic2VydmFibGVzIGZvciB0aGUgcGFyYW1zLCBxdWVyeSBwYXJhbXMgZXRjLiwgd2hpY2ggYXJlIGtlcHQgaW4gc3luYy5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgdGhpcyBzdHViIGFsbG93cyBzaW11bGF0aW5nIGEgbmF2aWdhdGlvbiBieSBjaGFuZ2luZyB0aGUgcGFyYW1zLCB0aGUgcXVlcnkgcGFyYW1zLCB0aGUgZnJhZ21lbnQsIGV0Yy5cbiAqIFdoZW4gdGhhdCBoYXBwZW5zLCB0aGUgc25hcHNob3QgaXMgbW9kaWZpZWQsIHRoZW4gdGhlIHJlbGV2YW50IG9ic2VydmFibGVzIGVtaXQgdGhlIG5ldyB2YWx1ZXMuXG4gKlxuICogVGhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgZG9uJ3QgcmVhbGx5IHdvcmsgdGhlIHNhbWUgd2F5IGFzIHRoZSByZWFsIEFjdGl2YXRlZFJvdXRlIHRob3VnaDpcbiAqIC0gdGhlIGhhbmRsaW5nIG9mIHRoZSBmaXJzdENoaWxkIGFuZCBvZiB0aGUgY2hpbGRyZW4gaXMgZW50aXJlbHkgdW5kZXIgdGhlIHRlc3RlcidzIHJlc3BvbnNpYmlsaXR5LiBTZXR0aW5nIHRoZSBwYXJlbnRcbiAqICAgb2YgYSByb3V0ZSBzdHViIGRvZXMgbm90IGFkZCB0aGlzIHJvdXRlIHRvIHRoZSBjaGlsZHJlbiBvZiBpdHMgcGFyZW50LCBmb3IgZXhhbXBsZS5cbiAqIC0gd2hlbiBjaGFuZ2luZyB0aGUgcGFyYW1zLCBxdWVyeSBwYXJhbXMsIGZyYWdtZW50LCBldGMuLCB0aGVpciBhc3NvY2lhdGVkIG9ic2VydmFibGUgZW1pdHMgdW5jb25kaXRpb25hbGx5LCBpbnN0ZWFkIG9mXG4gKiAgIGZpcnN0IGNoZWNraW5nIGlmIHRoZSB2YWx1ZSBpcyBhY3R1YWxseSBkaWZmZXJlbnQgZnJvbSBiZWZvcmUuIEl0J3MgdGh1cyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHRlc3RlciB0byBub3RcbiAqICAgY2hhbmdlIHRoZSB2YWx1ZXMgaWYgdGhleSdyZSB0aGUgc2FtZSBhcyBiZWZvcmUuXG4gKiAtIHRoZSBwYXJhbXMsIHBhcmFtTWFwLCBxdWVyeVBhcmFtcyBhbmQgcXVlcnlQYXJhbU1hcCBvYmplY3RzIG9mIHRoZSByb3V0ZSBzbmFwc2hvdCBjaGFuZ2Ugd2hlbiBwYXJhbXMgb3IgcXVlcnkgcGFyYW1zIGFyZSBzZXRcbiAqICAgb24gdGhlIHN0dWIgcm91dGUuIFNvIGlmIHRoZSBjb2RlIGtlZXBzIGEgcmVmZXJlbmNlIHRvIHBhcmFtcyBvciBwYXJhbU1hcHMsIGl0IHdvbid0IHNlZSB0aGUgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGl2YXRlZFJvdXRlU3R1YiBleHRlbmRzIEFjdGl2YXRlZFJvdXRlIHtcbiAgcHJpdmF0ZSBfZmlyc3RDaGlsZDogQWN0aXZhdGVkUm91dGVTdHViIHwgbnVsbDtcbiAgcHJpdmF0ZSBfY2hpbGRyZW46IEFycmF5PEFjdGl2YXRlZFJvdXRlU3R1Yj47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJhbXNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8UGFyYW1zPjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyeVBhcmFtc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQYXJhbXM+O1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8RGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZnJhZ21lbnRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD47XG4gIHByaXZhdGUgcmVhZG9ubHkgdXJsU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEFycmF5PFVybFNlZ21lbnQ+PjtcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4gIHByaXZhdGUgX3BhcmVudDogQWN0aXZhdGVkUm91dGVTdHViIHwgbnVsbDtcbiAgcHJpdmF0ZSBfcm9vdDogQWN0aXZhdGVkUm91dGVTdHViO1xuICBwcml2YXRlIF9wYXRoRnJvbVJvb3Q6IEFycmF5PEFjdGl2YXRlZFJvdXRlU3R1Yj47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UsIGJhc2VkIG9uIHRoZSBnaXZlbiBvcHRpb25zLlxuICAgKiBJZiBhbiBvcHRpb24gaXMgbm90IHByb3ZpZGVkIChvciBpZiBubyBvcHRpb24gaXMgcHJvdmlkZWQgYXQgYWxsKSwgdGhlbiB0aGUgcm91dGUgaGFzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBvcHRpb25cbiAgICogKGVtcHR5IHBhcmFtZXRlcnMgZm9yIGV4YW1wbGUsIG51bGwgZnJhZ21lbnQsIGV0Yy4pXG4gICAqIElmIG5vIHBhcmVudCBpcyBwYXNzZWQsIHRoZW4gdGhpcyByb3V0ZSBoYXMgbm8gcGFyZW50IGFuZCBpcyB0aHVzIHNldCBhcyB0aGUgcm9vdC4gT3RoZXJ3aXNlLCB0aGUgcm9vdCBhbmQgdGhlIHBhdGhcbiAgICogZnJvbSByb290IGFyZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSByb290IGFuZCBwYXRoIGZyb20gcm9vdCBvZiB0aGUgZ2l2ZW4gcGFyZW50IHJvdXRlLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IEFjdGl2YXRlZFJvdXRlU3R1Yk9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3Qgc25hcHNob3QgPSBuZXcgQWN0aXZhdGVkUm91dGVTbmFwc2hvdFN0dWIoKTtcbiAgICB0aGlzLnNuYXBzaG90ID0gc25hcHNob3Q7XG5cbiAgICB0aGlzLl9maXJzdENoaWxkID0gb3B0aW9ucz8uZmlyc3RDaGlsZCA/PyBudWxsO1xuICAgIHRoaXMuX2NoaWxkcmVuID0gb3B0aW9ucz8uY2hpbGRyZW4gPz8gW107XG4gICAgdGhpcy5fcGFyZW50ID0gb3B0aW9ucz8ucGFyZW50ID8/IG51bGw7XG4gICAgdGhpcy5fcm9vdCA9IHRoaXMucGFyZW50Py5yb290ID8/IHRoaXM7XG4gICAgdGhpcy5fcGF0aEZyb21Sb290ID0gdGhpcy5wYXJlbnQgPyBbLi4udGhpcy5wYXJlbnQucGF0aEZyb21Sb290LCB0aGlzXSA6IFt0aGlzXTtcblxuICAgIHNuYXBzaG90LnBhcmFtcyA9IG9wdGlvbnM/LnBhcmFtcyA/PyB7fTtcbiAgICBzbmFwc2hvdC5xdWVyeVBhcmFtcyA9IG9wdGlvbnM/LnF1ZXJ5UGFyYW1zID8/IHt9O1xuICAgIHNuYXBzaG90LmRhdGEgPSBvcHRpb25zPy5kYXRhID8/IHt9O1xuICAgIHNuYXBzaG90LnRpdGxlID0gb3B0aW9ucz8udGl0bGU7XG4gICAgc25hcHNob3QuZnJhZ21lbnQgPSBvcHRpb25zPy5mcmFnbWVudCA/PyBudWxsO1xuICAgIHNuYXBzaG90LnVybCA9IG9wdGlvbnM/LnVybCA/PyBbXTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSByb3V0ZUNvbmZpZyBpcyByZWFkb25seSwgYnV0IHdlIG5lZWQgdG8gb3ZlcndyaXRlIGl0IGhlcmVcbiAgICBzbmFwc2hvdC5yb3V0ZUNvbmZpZyA9IG9wdGlvbnM/LnJvdXRlQ29uZmlnID8/IG51bGw7XG5cbiAgICBzbmFwc2hvdC5maXJzdENoaWxkID0gdGhpcy5maXJzdENoaWxkPy5zbmFwc2hvdCA/PyBudWxsO1xuICAgIHNuYXBzaG90LmNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbj8ubWFwKHJvdXRlID0+IHJvdXRlLnNuYXBzaG90KSA/PyBbXTtcbiAgICBzbmFwc2hvdC5wYXJlbnQgPSB0aGlzLnBhcmVudD8uc25hcHNob3QgPz8gbnVsbDtcbiAgICBzbmFwc2hvdC5yb290ID0gdGhpcy5yb290LnNuYXBzaG90O1xuICAgIHNuYXBzaG90LnBhdGhGcm9tUm9vdCA9IHRoaXMucGF0aEZyb21Sb290Lm1hcChyb3V0ZSA9PiByb3V0ZS5zbmFwc2hvdCk7XG5cbiAgICB0aGlzLnBhcmFtc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhcmFtcz4odGhpcy5zbmFwc2hvdC5wYXJhbXMpO1xuICAgIHRoaXMucXVlcnlQYXJhbXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYXJhbXM+KHRoaXMuc25hcHNob3QucXVlcnlQYXJhbXMpO1xuICAgIHRoaXMuZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGE+KHRoaXMuc25hcHNob3QuZGF0YSk7XG4gICAgdGhpcy50aXRsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odGhpcy5zbmFwc2hvdC50aXRsZSk7XG4gICAgdGhpcy5mcmFnbWVudFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KHRoaXMuc25hcHNob3QuZnJhZ21lbnQpO1xuICAgIHRoaXMudXJsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8VXJsU2VnbWVudD4+KHRoaXMuc25hcHNob3QudXJsKTtcblxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5wYXJhbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucXVlcnlQYXJhbXMgPSB0aGlzLnF1ZXJ5UGFyYW1zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZnJhZ21lbnQgPSB0aGlzLmZyYWdtZW50U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnVybCA9IHRoaXMudXJsU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSB0aXRsZSBpcyByZWFkb25seSwgYnV0IHdlIG5lZWQgdG8gYmUgYWJsZSB0byBpbml0aWFsaXplIGl0ICBoZXJlXG4gICAgdGhpcy50aXRsZSA9IHRoaXMudGl0bGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IHJvb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cblxuICBnZXQgcGFyZW50KCk6IEFjdGl2YXRlZFJvdXRlU3R1YiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gIH1cblxuICBnZXQgcGF0aEZyb21Sb290KCk6IEFycmF5PEFjdGl2YXRlZFJvdXRlU3R1Yj4ge1xuICAgIHJldHVybiB0aGlzLl9wYXRoRnJvbVJvb3Q7XG4gIH1cblxuICBnZXQgZmlyc3RDaGlsZCgpOiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RDaGlsZDtcbiAgfVxuXG4gIGdldCBjaGlsZHJlbigpOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVN0dWI+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gIH1cblxuICBnZXQgcm91dGVDb25maWcoKTogUm91dGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zbmFwc2hvdC5yb3V0ZUNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IHBhcmFtZXRlcnMuIEFsbCB0aGUgb3RoZXIgcGFydHMgKHF1ZXJ5IHBhcmFtcyBldGMuKSBzdGF5IGFzIHRoZXkgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIHRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIHNldFBhcmFtcyhwYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlck5hdmlnYXRpb24oeyBwYXJhbXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyBwYXJhbWV0ZXIuIFRoZSBvdGhlciBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGFsbCB0aGUgb3RoZXIgcGFydHMgKHF1ZXJ5IHBhcmFtcyBldGMuKVxuICAgKiBzdGF5IGFzIHRoZXkgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIG9uZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwdWJsaWMgc2V0UGFyYW0obmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYXJhbXMoeyAuLi50aGlzLnNuYXBzaG90LnBhcmFtcywgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IHF1ZXJ5IHBhcmFtZXRlcnMuIEFsbCB0aGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKSBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgc2V0UXVlcnlQYXJhbXMocXVlcnlQYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlck5hdmlnYXRpb24oeyBxdWVyeVBhcmFtcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IHBhcmFtZXRlci4gVGhlIG90aGVyIHF1ZXJ5IHBhcmFtZXRlcnMsIGFzIHdlbGwgYXMgYWxsIHRoZSBvdGhlciBwYXJ0cyAocGFyYW1zIGV0Yy4pXG4gICAqIHN0YXkgYXMgdGhlIGFyZS5cbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGB0cmlnZ2VyTmF2aWdhdGlvbmAgdGhhdCBjYW4gYmUgdXNlZCB0byBvbmx5IGNoYW5nZSBvbmUgcXVlcnkgcGFyYW1ldGVyLlxuICAgKi9cbiAgcHVibGljIHNldFF1ZXJ5UGFyYW0obmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZXRRdWVyeVBhcmFtcyh7IC4uLnRoaXMuc25hcHNob3QucXVlcnlQYXJhbXMsIFtuYW1lXTogdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyBkYXRhLiBUaGUgb3RoZXIgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBhbGwgdGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLilcbiAgICogc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIHRoZSBkYXRhLlxuICAgKi9cbiAgcHVibGljIHNldERhdGEoZGF0YTogRGF0YSk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlck5hdmlnYXRpb24oeyBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgZGF0YSBpdGVtLiBUaGUgb3RoZXIgZGF0YSwgYXMgd2VsbCBhcyBhbGwgdGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLilcbiAgICogc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIG9uZSBkYXRhIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgc2V0RGF0YUl0ZW0obmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0YSh7IC4uLnRoaXMuc25hcHNob3QuZGF0YSwgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IHRpdGxlLiBUaGUgb3RoZXIgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBhbGwgdGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLilcbiAgICogc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIHRoZSB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBzZXRUaXRsZSh0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IHRpdGxlOiB7IHZhbHVlOiB0aXRsZSB9IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgZnJhZ21lbnQuIFRoZSBvdGhlciBwYXJ0cyAocGFyYW1zIGV0Yy4pICBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIGZyYWdtZW50LlxuICAgKi9cbiAgcHVibGljIHNldEZyYWdtZW50KGZyYWdtZW50OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IGZyYWdtZW50IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgdXJsLiBUaGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKSAgc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIHRoZSB1cmwuXG4gICAqL1xuICBwdWJsaWMgc2V0VXJsKHVybDogQXJyYXk8VXJsU2VnbWVudD4pOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJOYXZpZ2F0aW9uKHsgdXJsIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gb3B0aW9ucy4gSWYgYW4gb3B0aW9uIGlzIHVuZGVmaW5lZCBvciBudWxsLCBpdCdzIGlnbm9yZWQuIEV4Y2VwdCBmb3IgZnJhZ21lbnQsIHdoaWNoIGlzIG9ubHlcbiAgICogaWdub3JlZCBpZiBpdCdzIHVuZGVmaW5lZCwgYmVjYXVzZSBudWxsIGlzIGEgdmFsaWQgdmFsdWUgZm9yIGEgZnJhZ21lbnQuXG4gICAqXG4gICAqIFRoZSBub24taWdub3JlZCB2YWx1ZXMgYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSBzbmFwc2hvdCBvZiB0aGUgcm91dGUuIE9uY2UgdGhlIHNuYXBzaG90IGhhcyBiZWVuIG1vZGlmaWVkLFxuICAgKiB0aGUgb2JzZXJ2YWJsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgdXBkYXRlZCBwYXJ0cyBlbWl0IHRoZSBuZXcgdmFsdWUuXG4gICAqXG4gICAqIFNvLCBzZXR0aW5nIHBhcmFtcyBhbmQgcXVlcnkgcGFyYW1zIHdpbGwgbWFrZSB0aGUgcGFyYW1zIGFuZCBxdWVyeVBhcmFtcyBvYnNlcnZhYmxlcyBlbWl0LCBidXQgbm90IHRoZSBmcmFnbWVudCwgZGF0YSBhbmRcbiAgICogdXJsIG9ic2VydmFibGVzIGZvciBleGFtcGxlLiBUaGlzIGlzIGNvbnNpc3RlbnQgdG8gaG93IHRoZSByb3V0ZXIgYmVoYXZlcy5cbiAgICpcbiAgICogTm90ZTogc2luY2UgdGhlIHRpdGxlIG9mIGEgcm91dGUgY2FuIGJlY29tZSB1bmRlZmluZWQsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIG5hdmlnYXRpb24gd2hpY2ggbGVhdmVzIHRoZSB0aXRsZVxuICAgKiBhcyBpdCBpcyBhbmQgYSBuYXZpZ2F0aW9uIHRoYXQgc2V0cyB0aGUgdGl0bGUgdG8gdW5kZWZpbmVkLCBhIHdyYXBwZXIgb2JqZWN0IGlzIHVzZWQgZm9yIHRoZSB0aXRsZS4gU29cbiAgICpcbiAgICogLSBgdHJpZ2dlck5hdmlnYXRpb24oeyBwYXJhbXM6Li4uIH0pYCBsZWF2ZXMgdGhlIHRpdGxlIGFzIGlzIGJlY2F1c2UgaXQncyB1bmRlZmluZWQgaW4gdGhlIG9wdGlvbnNcbiAgICogLSBgdHJpZ2dlck5hdmlnYXRpb24oeyB0aXRsZTogeyB2YWx1ZTogJ3Rlc3QnIH0gfSlgIHNldHMgdGhlIHRpdGxlIHRvICd0ZXN0J1xuICAgKiAtIGB0cmlnZ2VyTmF2aWdhdGlvbih7IHRpdGxlOiB7IHZhbHVlOiB1bmRlZmluZWQgfSB9KWAgc2V0cyB0aGUgdGl0bGUgdG8gdW5kZWZpbmVkXG4gICAqL1xuICBwdWJsaWMgdHJpZ2dlck5hdmlnYXRpb24ob3B0aW9uczoge1xuICAgIHBhcmFtcz86IFBhcmFtcztcbiAgICBxdWVyeVBhcmFtcz86IFBhcmFtcztcbiAgICBmcmFnbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgZGF0YT86IERhdGEgfCBudWxsO1xuICAgIHRpdGxlPzogeyB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfCBudWxsO1xuICAgIHVybD86IEFycmF5PFVybFNlZ21lbnQ+IHwgbnVsbDtcbiAgfSk6IHZvaWQge1xuICAgIC8vIHNldCB0aGUgc25hcHNob3QgZmlyc3RcbiAgICBpZiAob3B0aW9ucy5wYXJhbXMpIHtcbiAgICAgIHRoaXMuc25hcHNob3QucGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnF1ZXJ5UGFyYW1zKSB7XG4gICAgICB0aGlzLnNuYXBzaG90LnF1ZXJ5UGFyYW1zID0gb3B0aW9ucy5xdWVyeVBhcmFtcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZnJhZ21lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zbmFwc2hvdC5mcmFnbWVudCA9IG9wdGlvbnMuZnJhZ21lbnQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIHRoaXMuc25hcHNob3QuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGl0bGUpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhlIHRpdGxlIGlzIHJlYWRvbmx5LCBidXQgd2UgbmVlZCB0byBiZSBhYmxlIHRvIG92ZXJ3cml0ZSBpdCBoZXJlXG4gICAgICB0aGlzLnNuYXBzaG90LnRpdGxlID0gb3B0aW9ucy50aXRsZS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICB0aGlzLnNuYXBzaG90LnVybCA9IG9wdGlvbnMudXJsO1xuICAgIH1cblxuICAgIC8vIHRoZW4gZW1pdCBldmVyeXRoaW5nIHRoYXQgaGFzIGNoYW5nZWRcbiAgICBpZiAob3B0aW9ucy5wYXJhbXMpIHtcbiAgICAgIHRoaXMucGFyYW1zU3ViamVjdC5uZXh0KHRoaXMuc25hcHNob3QucGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucXVlcnlQYXJhbXMpIHtcbiAgICAgIHRoaXMucXVlcnlQYXJhbXNTdWJqZWN0Lm5leHQodGhpcy5zbmFwc2hvdC5xdWVyeVBhcmFtcyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZyYWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZnJhZ21lbnRTdWJqZWN0Lm5leHQodGhpcy5zbmFwc2hvdC5mcmFnbWVudCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dCh0aGlzLnNuYXBzaG90LmRhdGEpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50aXRsZSkge1xuICAgICAgdGhpcy50aXRsZVN1YmplY3QubmV4dCh0aGlzLnNuYXBzaG90LnRpdGxlKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudXJsKSB7XG4gICAgICB0aGlzLnVybFN1YmplY3QubmV4dCh0aGlzLnNuYXBzaG90LnVybCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdBY3RpdmF0ZWRSb3V0ZVN0dWInO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBBY3RpdmF0ZWRSb3V0ZVN0dWIsIGJ5IGNhbGxpbmcgaXRzIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3R1YlJvdXRlKG9wdGlvbnM/OiBBY3RpdmF0ZWRSb3V0ZVN0dWJPcHRpb25zKTogQWN0aXZhdGVkUm91dGVTdHViIHtcbiAgcmV0dXJuIG5ldyBBY3RpdmF0ZWRSb3V0ZVN0dWIob3B0aW9ucyk7XG59XG4iXX0=
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBNkMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2SSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZ0R2QyxNQUFNLDBCQUEyQixTQUFRLHNCQUFzQjtJQVE3RCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQW9DO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLEtBQTZCO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEtBQW9DO1FBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQW9DO1FBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLEtBQW9DO1FBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcs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QUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUFtQztJQUMzRCxPQUFPLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBjb252ZXJ0VG9QYXJhbU1hcCwgRGF0YSwgUGFyYW1NYXAsIFBhcmFtcywgUm91dGUsIFVybFNlZ21lbnQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHdoZW4gY3JlYXRpbmcgYW4gQWN0aXZhdGVkUm91dGVTdHViLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2YXRlZFJvdXRlU3R1Yk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgcGFyYW1zPzogUGFyYW1zO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgcXVlcnlQYXJhbXM/OiBQYXJhbXM7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGRhdGEgb2YgdGhlIHJvdXRlXG4gICAqL1xuICBkYXRhPzogRGF0YTtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgdGl0bGUgb2YgdGhlIHJvdXRlXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGZyYWdtZW50IG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgZnJhZ21lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgdXJsIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgdXJsPzogVXJsU2VnbWVudFtdO1xuICAvKipcbiAgICogVGhlIHBhcmVudCBvZiB0aGUgcm91dGVcbiAgICovXG4gIHBhcmVudD86IEFjdGl2YXRlZFJvdXRlU3R1YiB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgY2hpbGQgb2YgdGhlIHJvdXRlXG4gICAqL1xuICBmaXJzdENoaWxkPzogQWN0aXZhdGVkUm91dGVTdHViIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBjaGlsZHJlbiBvZiB0aGUgcm91dGVcbiAgICovXG4gIGNoaWxkcmVuPzogQWN0aXZhdGVkUm91dGVTdHViW10gfCBudWxsO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJvdXRlXG4gICAqL1xuICByb3V0ZUNvbmZpZz86IFJvdXRlIHwgbnVsbDtcbn1cblxuY2xhc3MgQWN0aXZhdGVkUm91dGVTbmFwc2hvdFN0dWIgZXh0ZW5kcyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgcHJpdmF0ZSBfcGFyZW50OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3Jvb3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Q7XG4gIHByaXZhdGUgX2ZpcnN0Q2hpbGQ6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfY2hpbGRyZW46IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+ID0gW107XG4gIHByaXZhdGUgX3BhdGhGcm9tUm9vdDogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4gPSBbXTtcbiAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBnZXQgcGFyZW50KCk6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG5cbiAgc2V0IHBhcmVudCh2YWx1ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCByb290KCk6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Qge1xuICAgIHJldHVybiB0aGlzLl9yb290O1xuICB9XG5cbiAgc2V0IHJvb3QodmFsdWU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpIHtcbiAgICB0aGlzLl9yb290ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZmlyc3RDaGlsZCgpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBzZXQgZmlyc3RDaGlsZCh2YWx1ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwpIHtcbiAgICB0aGlzLl9maXJzdENoaWxkID0gdmFsdWU7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKTogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4ge1xuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcbiAgfVxuXG4gIHNldCBjaGlsZHJlbih2YWx1ZTogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4pIHtcbiAgICB0aGlzLl9jaGlsZHJlbiA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHBhdGhGcm9tUm9vdCgpOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90PiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdGhGcm9tUm9vdDtcbiAgfVxuXG4gIHNldCBwYXRoRnJvbVJvb3QodmFsdWU6IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+KSB7XG4gICAgdGhpcy5fcGF0aEZyb21Sb290ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gIH1cblxuICBzZXQgdGl0bGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3RpdGxlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcGFyYW1NYXAoKTogUGFyYW1NYXAge1xuICAgIHJldHVybiBjb252ZXJ0VG9QYXJhbU1hcCh0aGlzLnBhcmFtcyk7XG4gIH1cblxuICBnZXQgcXVlcnlQYXJhbU1hcCgpOiBQYXJhbU1hcCB7XG4gICAgcmV0dXJuIGNvbnZlcnRUb1BhcmFtTWFwKHRoaXMucXVlcnlQYXJhbXMpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9yb290ID0gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIEEgc3R1YiBmb3IgQWN0aXZhdGVkUm91dGUuIEl0IGJlaGF2ZXMgYWxtb3N0IHRoZSBzYW1lIHdheSBhcyB0aGUgYWN0dWFsIEFjdGl2YXRlZFJvdXRlLCBleHBvc2luZyBhIHNuYXBzaG90XG4gKiBhbmQgb2JzZXJ2YWJsZXMgZm9yIHRoZSBwYXJhbXMsIHF1ZXJ5IHBhcmFtcyBldGMuLCB3aGljaCBhcmUga2VwdCBpbiBzeW5jLlxuICpcbiAqIEluIGFkZGl0aW9uLCB0aGlzIHN0dWIgYWxsb3dzIHNpbXVsYXRpbmcgYSBuYXZpZ2F0aW9uIGJ5IGNoYW5naW5nIHRoZSBwYXJhbXMsIHRoZSBxdWVyeSBwYXJhbXMsIHRoZSBmcmFnbWVudCwgZXRjLlxuICogV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBzbmFwc2hvdCBpcyBtb2RpZmllZCwgdGhlbiB0aGUgcmVsZXZhbnQgb2JzZXJ2YWJsZXMgZW1pdCB0aGUgbmV3IHZhbHVlcy5cbiAqXG4gKiBUaGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBkb24ndCByZWFsbHkgd29yayB0aGUgc2FtZSB3YXkgYXMgdGhlIHJlYWwgQWN0aXZhdGVkUm91dGUgdGhvdWdoOlxuICogLSB0aGUgaGFuZGxpbmcgb2YgdGhlIGZpcnN0Q2hpbGQgYW5kIG9mIHRoZSBjaGlsZHJlbiBpcyBlbnRpcmVseSB1bmRlciB0aGUgdGVzdGVyJ3MgcmVzcG9uc2liaWxpdHkuIFNldHRpbmcgdGhlIHBhcmVudFxuICogICBvZiBhIHJvdXRlIHN0dWIgZG9lcyBub3QgYWRkIHRoaXMgcm91dGUgdG8gdGhlIGNoaWxkcmVuIG9mIGl0cyBwYXJlbnQsIGZvciBleGFtcGxlLlxuICogLSB3aGVuIGNoYW5naW5nIHRoZSBwYXJhbXMsIHF1ZXJ5IHBhcmFtcywgZnJhZ21lbnQsIGV0Yy4sIHRoZWlyIGFzc29jaWF0ZWQgb2JzZXJ2YWJsZSBlbWl0cyB1bmNvbmRpdGlvbmFsbHksIGluc3RlYWQgb2ZcbiAqICAgZmlyc3QgY2hlY2tpbmcgaWYgdGhlIHZhbHVlIGlzIGFjdHVhbGx5IGRpZmZlcmVudCBmcm9tIGJlZm9yZS4gSXQncyB0aHVzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdGVzdGVyIHRvIG5vdFxuICogICBjaGFuZ2UgdGhlIHZhbHVlcyBpZiB0aGV5J3JlIHRoZSBzYW1lIGFzIGJlZm9yZS5cbiAqIC0gdGhlIHBhcmFtcywgcGFyYW1NYXAsIHF1ZXJ5UGFyYW1zIGFuZCBxdWVyeVBhcmFtTWFwIG9iamVjdHMgb2YgdGhlIHJvdXRlIHNuYXBzaG90IGNoYW5nZSB3aGVuIHBhcmFtcyBvciBxdWVyeSBwYXJhbXMgYXJlIHNldFxuICogICBvbiB0aGUgc3R1YiByb3V0ZS4gU28gaWYgdGhlIGNvZGUga2VlcHMgYSByZWZlcmVuY2UgdG8gcGFyYW1zIG9yIHBhcmFtTWFwcywgaXQgd29uJ3Qgc2VlIHRoZSBjaGFuZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZhdGVkUm91dGVTdHViIGV4dGVuZHMgQWN0aXZhdGVkUm91dGUge1xuICBwcml2YXRlIF9maXJzdENoaWxkOiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsO1xuICBwcml2YXRlIF9jaGlsZHJlbjogQXJyYXk8QWN0aXZhdGVkUm91dGVTdHViPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQYXJhbXM+O1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJ5UGFyYW1zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFBhcmFtcz47XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxEYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmcmFnbWVudFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPjtcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8VXJsU2VnbWVudD4+O1xuICBwcml2YXRlIHJlYWRvbmx5IHRpdGxlU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbiAgcHJpdmF0ZSBfcGFyZW50OiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsO1xuICBwcml2YXRlIF9yb290OiBBY3RpdmF0ZWRSb3V0ZVN0dWI7XG4gIHByaXZhdGUgX3BhdGhGcm9tUm9vdDogQXJyYXk8QWN0aXZhdGVkUm91dGVTdHViPjtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSwgYmFzZWQgb24gdGhlIGdpdmVuIG9wdGlvbnMuXG4gICAqIElmIGFuIG9wdGlvbiBpcyBub3QgcHJvdmlkZWQgKG9yIGlmIG5vIG9wdGlvbiBpcyBwcm92aWRlZCBhdCBhbGwpLCB0aGVuIHRoZSByb3V0ZSBoYXMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIG9wdGlvblxuICAgKiAoZW1wdHkgcGFyYW1ldGVycyBmb3IgZXhhbXBsZSwgbnVsbCBmcmFnbWVudCwgZXRjLilcbiAgICogSWYgbm8gcGFyZW50IGlzIHBhc3NlZCwgdGhlbiB0aGlzIHJvdXRlIGhhcyBubyBwYXJlbnQgYW5kIGlzIHRodXMgc2V0IGFzIHRoZSByb290LiBPdGhlcndpc2UsIHRoZSByb290IGFuZCB0aGUgcGF0aFxuICAgKiBmcm9tIHJvb3QgYXJlIGNyZWF0ZWQgYmFzZWQgb24gdGhlIHJvb3QgYW5kIHBhdGggZnJvbSByb290IG9mIHRoZSBnaXZlbiBwYXJlbnQgcm91dGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQWN0aXZhdGVkUm91dGVTdHViT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90U3R1YigpO1xuICAgIHRoaXMuc25hcHNob3QgPSBzbmFwc2hvdDtcblxuICAgIHRoaXMuX2ZpcnN0Q2hpbGQgPSBvcHRpb25zPy5maXJzdENoaWxkID8/IG51bGw7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSBvcHRpb25zPy5jaGlsZHJlbiA/PyBbXTtcbiAgICB0aGlzLl9wYXJlbnQgPSBvcHRpb25zPy5wYXJlbnQgPz8gbnVsbDtcbiAgICB0aGlzLl9yb290ID0gdGhpcy5wYXJlbnQ/LnJvb3QgPz8gdGhpcztcbiAgICB0aGlzLl9wYXRoRnJvbVJvb3QgPSB0aGlzLnBhcmVudCA/IFsuLi50aGlzLnBhcmVudC5wYXRoRnJvbVJvb3QsIHRoaXNdIDogW3RoaXNdO1xuXG4gICAgc25hcHNob3QucGFyYW1zID0gb3B0aW9ucz8ucGFyYW1zID8/IHt9O1xuICAgIHNuYXBzaG90LnF1ZXJ5UGFyYW1zID0gb3B0aW9ucz8ucXVlcnlQYXJhbXMgPz8ge307XG4gICAgc25hcHNob3QuZGF0YSA9IG9wdGlvbnM/LmRhdGEgPz8ge307XG4gICAgc25hcHNob3QudGl0bGUgPSBvcHRpb25zPy50aXRsZTtcbiAgICBzbmFwc2hvdC5mcmFnbWVudCA9IG9wdGlvbnM/LmZyYWdtZW50ID8/IG51bGw7XG4gICAgc25hcHNob3QudXJsID0gb3B0aW9ucz8udXJsID8/IFtdO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhlIHJvdXRlQ29uZmlnIGlzIHJlYWRvbmx5LCBidXQgd2UgbmVlZCB0byBvdmVyd3JpdGUgaXQgaGVyZVxuICAgIHNuYXBzaG90LnJvdXRlQ29uZmlnID0gb3B0aW9ucz8ucm91dGVDb25maWcgPz8gbnVsbDtcblxuICAgIHNuYXBzaG90LmZpcnN0Q2hpbGQgPSB0aGlzLmZpcnN0Q2hpbGQ/LnNuYXBzaG90ID8/IG51bGw7XG4gICAgc25hcHNob3QuY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuPy5tYXAocm91dGUgPT4gcm91dGUuc25hcHNob3QpID8/IFtdO1xuICAgIHNuYXBzaG90LnBhcmVudCA9IHRoaXMucGFyZW50Py5zbmFwc2hvdCA/PyBudWxsO1xuICAgIHNuYXBzaG90LnJvb3QgPSB0aGlzLnJvb3Quc25hcHNob3Q7XG4gICAgc25hcHNob3QucGF0aEZyb21Sb290ID0gdGhpcy5wYXRoRnJvbVJvb3QubWFwKHJvdXRlID0+IHJvdXRlLnNuYXBzaG90KTtcblxuICAgIHRoaXMucGFyYW1zU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFyYW1zPih0aGlzLnNuYXBzaG90LnBhcmFtcyk7XG4gICAgdGhpcy5xdWVyeVBhcmFtc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhcmFtcz4odGhpcy5zbmFwc2hvdC5xdWVyeVBhcmFtcyk7XG4gICAgdGhpcy5kYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0YT4odGhpcy5zbmFwc2hvdC5kYXRhKTtcbiAgICB0aGlzLnRpdGxlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgdW5kZWZpbmVkPih0aGlzLnNuYXBzaG90LnRpdGxlKTtcbiAgICB0aGlzLmZyYWdtZW50U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4odGhpcy5zbmFwc2hvdC5mcmFnbWVudCk7XG4gICAgdGhpcy51cmxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnJheTxVcmxTZWdtZW50Pj4odGhpcy5zbmFwc2hvdC51cmwpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSB0aGlzLnBhcmFtc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHRoaXMucXVlcnlQYXJhbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5mcmFnbWVudCA9IHRoaXMuZnJhZ21lbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMudXJsID0gdGhpcy51cmxTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhlIHRpdGxlIGlzIHJlYWRvbmx5LCBidXQgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGluaXRpYWxpemUgaXQgIGhlcmVcbiAgICB0aGlzLnRpdGxlID0gdGhpcy50aXRsZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgcm9vdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcbiAgfVxuXG4gIGdldCBwYXJlbnQoKTogQWN0aXZhdGVkUm91dGVTdHViIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuXG4gIGdldCBwYXRoRnJvbVJvb3QoKTogQXJyYXk8QWN0aXZhdGVkUm91dGVTdHViPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdGhGcm9tUm9vdDtcbiAgfVxuXG4gIGdldCBmaXJzdENoaWxkKCk6IEFjdGl2YXRlZFJvdXRlU3R1YiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9maXJzdENoaWxkO1xuICB9XG5cbiAgZ2V0IGNoaWxkcmVuKCk6IEFycmF5PEFjdGl2YXRlZFJvdXRlU3R1Yj4ge1xuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcbiAgfVxuXG4gIGdldCByb3V0ZUNvbmZpZygpOiBSb3V0ZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNuYXBzaG90LnJvdXRlQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgcGFyYW1ldGVycy4gQWxsIHRoZSBvdGhlciBwYXJ0cyAocXVlcnkgcGFyYW1zIGV0Yy4pIHN0YXkgYXMgdGhleSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgc2V0UGFyYW1zKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IHBhcmFtcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IHBhcmFtZXRlci4gVGhlIG90aGVyIHBhcmFtZXRlcnMsIGFzIHdlbGwgYXMgYWxsIHRoZSBvdGhlciBwYXJ0cyAocXVlcnkgcGFyYW1zIGV0Yy4pXG4gICAqIHN0YXkgYXMgdGhleSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2Ugb25lIHBhcmFtZXRlci5cbiAgICovXG4gIHB1YmxpYyBzZXRQYXJhbShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFBhcmFtcyh7IC4uLnRoaXMuc25hcHNob3QucGFyYW1zLCBbbmFtZV06IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgcXVlcnkgcGFyYW1ldGVycy4gQWxsIHRoZSBvdGhlciBwYXJ0cyAocGFyYW1zIGV0Yy4pIHN0YXkgYXMgdGhlIGFyZS5cbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGB0cmlnZ2VyTmF2aWdhdGlvbmAgdGhhdCBjYW4gYmUgdXNlZCB0byBvbmx5IGNoYW5nZSB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBzZXRRdWVyeVBhcmFtcyhxdWVyeVBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IHF1ZXJ5UGFyYW1zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgcGFyYW1ldGVyLiBUaGUgb3RoZXIgcXVlcnkgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBhbGwgdGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLilcbiAgICogc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIG9uZSBxdWVyeSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwdWJsaWMgc2V0UXVlcnlQYXJhbShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFF1ZXJ5UGFyYW1zKHsgLi4udGhpcy5zbmFwc2hvdC5xdWVyeVBhcmFtcywgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IGRhdGEuIFRoZSBvdGhlciBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGFsbCB0aGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKVxuICAgKiBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgc2V0RGF0YShkYXRhOiBEYXRhKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IGRhdGEgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyBkYXRhIGl0ZW0uIFRoZSBvdGhlciBkYXRhLCBhcyB3ZWxsIGFzIGFsbCB0aGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKVxuICAgKiBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2Ugb25lIGRhdGEgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBzZXREYXRhSXRlbShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRhKHsgLi4udGhpcy5zbmFwc2hvdC5kYXRhLCBbbmFtZV06IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgdGl0bGUuIFRoZSBvdGhlciBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGFsbCB0aGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKVxuICAgKiBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJOYXZpZ2F0aW9uKHsgdGl0bGU6IHsgdmFsdWU6IHRpdGxlIH0gfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyBmcmFnbWVudC4gVGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLikgIHN0YXkgYXMgdGhlIGFyZS5cbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGB0cmlnZ2VyTmF2aWdhdGlvbmAgdGhhdCBjYW4gYmUgdXNlZCB0byBvbmx5IGNoYW5nZSB0aGUgZnJhZ21lbnQuXG4gICAqL1xuICBwdWJsaWMgc2V0RnJhZ21lbnQoZnJhZ21lbnQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJOYXZpZ2F0aW9uKHsgZnJhZ21lbnQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyB1cmwuIFRoZSBvdGhlciBwYXJ0cyAocGFyYW1zIGV0Yy4pICBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIHVybC5cbiAgICovXG4gIHB1YmxpYyBzZXRVcmwodXJsOiBBcnJheTxVcmxTZWdtZW50Pik6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlck5hdmlnYXRpb24oeyB1cmwgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBvcHRpb25zLiBJZiBhbiBvcHRpb24gaXMgdW5kZWZpbmVkIG9yIG51bGwsIGl0J3MgaWdub3JlZC4gRXhjZXB0IGZvciBmcmFnbWVudCwgd2hpY2ggaXMgb25seVxuICAgKiBpZ25vcmVkIGlmIGl0J3MgdW5kZWZpbmVkLCBiZWNhdXNlIG51bGwgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgYSBmcmFnbWVudC5cbiAgICpcbiAgICogVGhlIG5vbi1pZ25vcmVkIHZhbHVlcyBhcmUgdXNlZCB0byBjaGFuZ2UgdGhlIHNuYXBzaG90IG9mIHRoZSByb3V0ZS4gT25jZSB0aGUgc25hcHNob3QgaGFzIGJlZW4gbW9kaWZpZWQsXG4gICAqIHRoZSBvYnNlcnZhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSB1cGRhdGVkIHBhcnRzIGVtaXQgdGhlIG5ldyB2YWx1ZS5cbiAgICpcbiAgICogU28sIHNldHRpbmcgcGFyYW1zIGFuZCBxdWVyeSBwYXJhbXMgd2lsbCBtYWtlIHRoZSBwYXJhbXMgYW5kIHF1ZXJ5UGFyYW1zIG9ic2VydmFibGVzIGVtaXQsIGJ1dCBub3QgdGhlIGZyYWdtZW50LCBkYXRhIGFuZFxuICAgKiB1cmwgb2JzZXJ2YWJsZXMgZm9yIGV4YW1wbGUuIFRoaXMgaXMgY29uc2lzdGVudCB0byBob3cgdGhlIHJvdXRlciBiZWhhdmVzLlxuICAgKlxuICAgKiBOb3RlOiBzaW5jZSB0aGUgdGl0bGUgb2YgYSByb3V0ZSBjYW4gYmVjb21lIHVuZGVmaW5lZCwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbmF2aWdhdGlvbiB3aGljaCBsZWF2ZXMgdGhlIHRpdGxlXG4gICAqIGFzIGl0IGlzIGFuZCBhIG5hdmlnYXRpb24gdGhhdCBzZXRzIHRoZSB0aXRsZSB0byB1bmRlZmluZWQsIGEgd3JhcHBlciBvYmplY3QgaXMgdXNlZCBmb3IgdGhlIHRpdGxlLiBTb1xuICAgKlxuICAgKiAtIGB0cmlnZ2VyTmF2aWdhdGlvbih7IHBhcmFtczouLi4gfSlgIGxlYXZlcyB0aGUgdGl0bGUgYXMgaXMgYmVjYXVzZSBpdCdzIHVuZGVmaW5lZCBpbiB0aGUgb3B0aW9uc1xuICAgKiAtIGB0cmlnZ2VyTmF2aWdhdGlvbih7IHRpdGxlOiB7IHZhbHVlOiAndGVzdCcgfSB9KWAgc2V0cyB0aGUgdGl0bGUgdG8gJ3Rlc3QnXG4gICAqIC0gYHRyaWdnZXJOYXZpZ2F0aW9uKHsgdGl0bGU6IHsgdmFsdWU6IHVuZGVmaW5lZCB9IH0pYCBzZXRzIHRoZSB0aXRsZSB0byB1bmRlZmluZWRcbiAgICovXG4gIHB1YmxpYyB0cmlnZ2VyTmF2aWdhdGlvbihvcHRpb25zOiB7XG4gICAgcGFyYW1zPzogUGFyYW1zO1xuICAgIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAgIGZyYWdtZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBkYXRhPzogRGF0YSB8IG51bGw7XG4gICAgdGl0bGU/OiB7IHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQgfSB8IG51bGw7XG4gICAgdXJsPzogQXJyYXk8VXJsU2VnbWVudD4gfCBudWxsO1xuICB9KTogdm9pZCB7XG4gICAgLy8gc2V0IHRoZSBzbmFwc2hvdCBmaXJzdFxuICAgIGlmIChvcHRpb25zLnBhcmFtcykge1xuICAgICAgdGhpcy5zbmFwc2hvdC5wYXJhbXMgPSBvcHRpb25zLnBhcmFtcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucXVlcnlQYXJhbXMpIHtcbiAgICAgIHRoaXMuc25hcHNob3QucXVlcnlQYXJhbXMgPSBvcHRpb25zLnF1ZXJ5UGFyYW1zO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mcmFnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNuYXBzaG90LmZyYWdtZW50ID0gb3B0aW9ucy5mcmFnbWVudDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgdGhpcy5zbmFwc2hvdC5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50aXRsZSkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgdGl0bGUgaXMgcmVhZG9ubHksIGJ1dCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gb3ZlcndyaXRlIGl0IGhlcmVcbiAgICAgIHRoaXMuc25hcHNob3QudGl0bGUgPSBvcHRpb25zLnRpdGxlLnZhbHVlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgIHRoaXMuc25hcHNob3QudXJsID0gb3B0aW9ucy51cmw7XG4gICAgfVxuXG4gICAgLy8gdGhlbiBlbWl0IGV2ZXJ5dGhpbmcgdGhhdCBoYXMgY2hhbmdlZFxuICAgIGlmIChvcHRpb25zLnBhcmFtcykge1xuICAgICAgdGhpcy5wYXJhbXNTdWJqZWN0Lm5leHQodGhpcy5zbmFwc2hvdC5wYXJhbXMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5xdWVyeVBhcmFtcykge1xuICAgICAgdGhpcy5xdWVyeVBhcmFtc1N1YmplY3QubmV4dCh0aGlzLnNuYXBzaG90LnF1ZXJ5UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZnJhZ21lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5mcmFnbWVudFN1YmplY3QubmV4dCh0aGlzLnNuYXBzaG90LmZyYWdtZW50KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KHRoaXMuc25hcHNob3QuZGF0YSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlU3ViamVjdC5uZXh0KHRoaXMuc25hcHNob3QudGl0bGUpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgIHRoaXMudXJsU3ViamVjdC5uZXh0KHRoaXMuc25hcHNob3QudXJsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0FjdGl2YXRlZFJvdXRlU3R1Yic7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEFjdGl2YXRlZFJvdXRlU3R1YiwgYnkgY2FsbGluZyBpdHMgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHViUm91dGUob3B0aW9ucz86IEFjdGl2YXRlZFJvdXRlU3R1Yk9wdGlvbnMpOiBBY3RpdmF0ZWRSb3V0ZVN0dWIge1xuICByZXR1cm4gbmV3IEFjdGl2YXRlZFJvdXRlU3R1YihvcHRpb25zKTtcbn1cbiJdfQ==