@skyux/inline-form 7.0.0-beta.0 → 7.0.0-beta.10

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.
@@ -1,8 +1,10 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
1
+ var _SkyInlineFormComponent_instances, _SkyInlineFormComponent__config, _SkyInlineFormComponent__showForm, _SkyInlineFormComponent_ngUnsubscribe, _SkyInlineFormComponent_adapter, _SkyInlineFormComponent_elementRef, _SkyInlineFormComponent_resourcesService, _SkyInlineFormComponent_skyAppWindowRef, _SkyInlineFormComponent_changeDetectorRef, _SkyInlineFormComponent_setupButtons, _SkyInlineFormComponent_getPresetButtons, _SkyInlineFormComponent_getCustomButtons, _SkyInlineFormComponent_isValidCustomConfig;
2
+ import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, } from '@angular/core';
2
4
  import { SkyAppWindowRef } from '@skyux/core';
3
5
  import { SkyLibResourcesService } from '@skyux/i18n';
4
- import { zip as observableZip } from 'rxjs';
5
- import { take } from 'rxjs/operators';
6
+ import { ReplaySubject, Subject, zip as observableZip } from 'rxjs';
7
+ import { takeUntil } from 'rxjs/operators';
6
8
  import { skySlideDissolve } from './animations/slide-dissolve';
7
9
  import { SkyInlineFormAdapterService } from './inline-form-adapter.service';
8
10
  import { SkyInlineFormButtonLayout } from './types/inline-form-button-layout';
@@ -16,29 +18,37 @@ import * as i4 from "@angular/common";
16
18
  */
17
19
  export class SkyInlineFormComponent {
18
20
  constructor(adapter, elementRef, resourcesService, skyAppWindowRef, changeDetectorRef) {
19
- this.adapter = adapter;
20
- this.elementRef = elementRef;
21
- this.resourcesService = resourcesService;
22
- this.skyAppWindowRef = skyAppWindowRef;
23
- this.changeDetectorRef = changeDetectorRef;
21
+ _SkyInlineFormComponent_instances.add(this);
24
22
  /**
25
23
  * Fires when users close the inline form.
26
24
  */
27
25
  this.close = new EventEmitter();
28
- this._showForm = false;
26
+ _SkyInlineFormComponent__config.set(this, void 0);
27
+ _SkyInlineFormComponent__showForm.set(this, false);
28
+ _SkyInlineFormComponent_ngUnsubscribe.set(this, new Subject());
29
+ _SkyInlineFormComponent_adapter.set(this, void 0);
30
+ _SkyInlineFormComponent_elementRef.set(this, void 0);
31
+ _SkyInlineFormComponent_resourcesService.set(this, void 0);
32
+ _SkyInlineFormComponent_skyAppWindowRef.set(this, void 0);
33
+ _SkyInlineFormComponent_changeDetectorRef.set(this, void 0);
34
+ __classPrivateFieldSet(this, _SkyInlineFormComponent_adapter, adapter, "f");
35
+ __classPrivateFieldSet(this, _SkyInlineFormComponent_elementRef, elementRef, "f");
36
+ __classPrivateFieldSet(this, _SkyInlineFormComponent_resourcesService, resourcesService, "f");
37
+ __classPrivateFieldSet(this, _SkyInlineFormComponent_skyAppWindowRef, skyAppWindowRef, "f");
38
+ __classPrivateFieldSet(this, _SkyInlineFormComponent_changeDetectorRef, changeDetectorRef, "f");
29
39
  }
30
40
  /**
31
41
  * Specifies configuration options for the buttons to display with the inline form.
32
42
  * @required
33
43
  */
34
44
  set config(value) {
35
- if (value !== this._config) {
36
- this._config = value;
37
- this.setupButtons();
45
+ if (value !== __classPrivateFieldGet(this, _SkyInlineFormComponent__config, "f") && !!value) {
46
+ __classPrivateFieldSet(this, _SkyInlineFormComponent__config, value, "f");
47
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_instances, "m", _SkyInlineFormComponent_setupButtons).call(this);
38
48
  }
39
49
  }
40
50
  get config() {
41
- return this._config;
51
+ return __classPrivateFieldGet(this, _SkyInlineFormComponent__config, "f");
42
52
  }
43
53
  /**
44
54
  * Indicates whether to display the inline form. Users can toggle between displaying
@@ -46,23 +56,25 @@ export class SkyInlineFormComponent {
46
56
  * @default false
47
57
  */
48
58
  set showForm(value) {
49
- this._showForm = value;
59
+ __classPrivateFieldSet(this, _SkyInlineFormComponent__showForm, value, "f");
50
60
  /* istanbul ignore else */
51
61
  if (value) {
52
62
  // setTimeout() prevents applyAutofocus() from firing
53
63
  // until after *ngIf has added the form element to the DOM.
54
- this.skyAppWindowRef.nativeWindow.setTimeout(() => {
55
- this.adapter.applyAutofocus(this.elementRef);
64
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_skyAppWindowRef, "f").nativeWindow.setTimeout(() => {
65
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_adapter, "f").applyAutofocus(__classPrivateFieldGet(this, _SkyInlineFormComponent_elementRef, "f"));
56
66
  });
57
67
  }
58
68
  }
59
69
  get showForm() {
60
- return this._showForm;
70
+ return __classPrivateFieldGet(this, _SkyInlineFormComponent__showForm, "f");
61
71
  }
62
72
  ngOnInit() {
63
- this.setupButtons();
73
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_instances, "m", _SkyInlineFormComponent_setupButtons).call(this);
64
74
  }
65
75
  ngOnDestroy() {
76
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_ngUnsubscribe, "f").next();
77
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_ngUnsubscribe, "f").complete();
66
78
  this.close.complete();
67
79
  }
68
80
  closeInlineForm(event) {
@@ -71,138 +83,132 @@ export class SkyInlineFormComponent {
71
83
  };
72
84
  this.close.emit(args);
73
85
  }
74
- setupButtons() {
75
- if (this.isValidCustomConfig(this.config)) {
76
- this.buttons = this.getCustomButtons(this.config.buttons);
77
- this.changeDetectorRef.markForCheck();
78
- return;
79
- }
80
- this.getPresetButtons().then((buttons) => {
81
- this.buttons = buttons;
82
- this.changeDetectorRef.markForCheck();
83
- });
84
- }
85
- getPresetButtons() {
86
- const buttonType = this.config
87
- ? this.config.buttonLayout
88
- : SkyInlineFormButtonLayout.DoneCancel;
89
- let promise;
90
- switch (buttonType) {
91
- /* istanbul ignore next */
92
- default:
93
- case SkyInlineFormButtonLayout.DoneCancel:
94
- observableZip(this.resourcesService.getString('skyux_inline_form_button_done'), this.resourcesService.getString('skyux_inline_form_button_cancel'))
95
- .pipe(take(1))
96
- .subscribe((values) => {
97
- promise = new Promise((resolve) => {
98
- resolve([
99
- {
100
- text: values[0],
101
- styleType: 'primary',
102
- action: 'done',
103
- },
104
- {
105
- text: values[1],
106
- styleType: 'link',
107
- action: 'cancel',
108
- },
109
- ]);
110
- });
111
- });
112
- break;
113
- case SkyInlineFormButtonLayout.SaveCancel:
114
- observableZip(this.resourcesService.getString('skyux_inline_form_button_save'), this.resourcesService.getString('skyux_inline_form_button_cancel'))
115
- .pipe(take(1))
116
- .subscribe((values) => {
117
- promise = new Promise((resolve) => {
118
- resolve([
119
- {
120
- text: values[0],
121
- styleType: 'primary',
122
- action: 'save',
123
- },
124
- {
125
- text: values[1],
126
- styleType: 'link',
127
- action: 'cancel',
128
- },
129
- ]);
130
- });
131
- });
132
- break;
133
- case SkyInlineFormButtonLayout.DoneDeleteCancel:
134
- observableZip(this.resourcesService.getString('skyux_inline_form_button_done'), this.resourcesService.getString('skyux_inline_form_button_delete'), this.resourcesService.getString('skyux_inline_form_button_cancel'))
135
- .pipe(take(1))
136
- .subscribe((values) => {
137
- promise = new Promise((resolve) => {
138
- resolve([
139
- {
140
- text: values[0],
141
- styleType: 'primary',
142
- action: 'done',
143
- },
144
- {
145
- text: values[1],
146
- styleType: 'default',
147
- action: 'delete',
148
- },
149
- {
150
- text: values[2],
151
- styleType: 'link',
152
- action: 'cancel',
153
- },
154
- ]);
155
- });
156
- });
157
- break;
158
- case SkyInlineFormButtonLayout.SaveDeleteCancel:
159
- observableZip(this.resourcesService.getString('skyux_inline_form_button_save'), this.resourcesService.getString('skyux_inline_form_button_delete'), this.resourcesService.getString('skyux_inline_form_button_cancel'))
160
- .pipe(take(1))
161
- .subscribe((values) => {
162
- promise = new Promise((resolve) => {
163
- resolve([
164
- {
165
- text: values[0],
166
- styleType: 'primary',
167
- action: 'save',
168
- },
169
- {
170
- text: values[1],
171
- styleType: 'default',
172
- action: 'delete',
173
- },
174
- {
175
- text: values[2],
176
- styleType: 'link',
177
- action: 'cancel',
178
- },
179
- ]);
180
- });
181
- });
182
- break;
183
- }
184
- return promise;
86
+ }
87
+ _SkyInlineFormComponent__config = new WeakMap(), _SkyInlineFormComponent__showForm = new WeakMap(), _SkyInlineFormComponent_ngUnsubscribe = new WeakMap(), _SkyInlineFormComponent_adapter = new WeakMap(), _SkyInlineFormComponent_elementRef = new WeakMap(), _SkyInlineFormComponent_resourcesService = new WeakMap(), _SkyInlineFormComponent_skyAppWindowRef = new WeakMap(), _SkyInlineFormComponent_changeDetectorRef = new WeakMap(), _SkyInlineFormComponent_instances = new WeakSet(), _SkyInlineFormComponent_setupButtons = function _SkyInlineFormComponent_setupButtons() {
88
+ if (__classPrivateFieldGet(this, _SkyInlineFormComponent_instances, "m", _SkyInlineFormComponent_isValidCustomConfig).call(this, this.config) &&
89
+ this.config &&
90
+ this.config.buttons) {
91
+ this.buttons = __classPrivateFieldGet(this, _SkyInlineFormComponent_instances, "m", _SkyInlineFormComponent_getCustomButtons).call(this, this.config.buttons);
92
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_changeDetectorRef, "f").markForCheck();
93
+ return;
185
94
  }
186
- getCustomButtons(buttonConfigs) {
187
- const buttons = [];
188
- buttonConfigs.forEach((config) => {
189
- /* istanbul ignore next */
190
- const styleType = config.styleType || 'default';
191
- buttons.push({
192
- action: config.action,
193
- disabled: config.disabled,
194
- styleType: styleType,
195
- text: config.text,
95
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_instances, "m", _SkyInlineFormComponent_getPresetButtons).call(this)
96
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyInlineFormComponent_ngUnsubscribe, "f")))
97
+ .subscribe((buttons) => {
98
+ this.buttons = buttons;
99
+ __classPrivateFieldGet(this, _SkyInlineFormComponent_changeDetectorRef, "f").markForCheck();
100
+ });
101
+ }, _SkyInlineFormComponent_getPresetButtons = function _SkyInlineFormComponent_getPresetButtons() {
102
+ const emitter = new ReplaySubject(1);
103
+ const buttonType = this.config
104
+ ? this.config.buttonLayout
105
+ : SkyInlineFormButtonLayout.DoneCancel;
106
+ switch (buttonType) {
107
+ /* istanbul ignore next */
108
+ default:
109
+ case SkyInlineFormButtonLayout.DoneCancel:
110
+ observableZip(__classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_done'), __classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_cancel'))
111
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyInlineFormComponent_ngUnsubscribe, "f")))
112
+ .subscribe((values) => {
113
+ emitter.next([
114
+ {
115
+ text: values[0],
116
+ styleType: 'primary',
117
+ action: 'done',
118
+ },
119
+ {
120
+ text: values[1],
121
+ styleType: 'link',
122
+ action: 'cancel',
123
+ },
124
+ ]);
196
125
  });
197
- });
198
- return buttons;
199
- }
200
- isValidCustomConfig(config) {
201
- return (config &&
202
- config.buttonLayout === SkyInlineFormButtonLayout.Custom &&
203
- config.buttons.length > 0);
126
+ break;
127
+ case SkyInlineFormButtonLayout.SaveCancel:
128
+ observableZip(__classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_save'), __classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_cancel'))
129
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyInlineFormComponent_ngUnsubscribe, "f")))
130
+ .subscribe((values) => {
131
+ emitter.next([
132
+ {
133
+ text: values[0],
134
+ styleType: 'primary',
135
+ action: 'save',
136
+ },
137
+ {
138
+ text: values[1],
139
+ styleType: 'link',
140
+ action: 'cancel',
141
+ },
142
+ ]);
143
+ });
144
+ break;
145
+ case SkyInlineFormButtonLayout.DoneDeleteCancel:
146
+ observableZip(__classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_done'), __classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_delete'), __classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_cancel'))
147
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyInlineFormComponent_ngUnsubscribe, "f")))
148
+ .subscribe((values) => {
149
+ emitter.next([
150
+ {
151
+ text: values[0],
152
+ styleType: 'primary',
153
+ action: 'done',
154
+ },
155
+ {
156
+ text: values[1],
157
+ styleType: 'default',
158
+ action: 'delete',
159
+ },
160
+ {
161
+ text: values[2],
162
+ styleType: 'link',
163
+ action: 'cancel',
164
+ },
165
+ ]);
166
+ });
167
+ break;
168
+ case SkyInlineFormButtonLayout.SaveDeleteCancel:
169
+ observableZip(__classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_save'), __classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_delete'), __classPrivateFieldGet(this, _SkyInlineFormComponent_resourcesService, "f").getString('skyux_inline_form_button_cancel'))
170
+ .pipe(takeUntil(__classPrivateFieldGet(this, _SkyInlineFormComponent_ngUnsubscribe, "f")))
171
+ .subscribe((values) => {
172
+ emitter.next([
173
+ {
174
+ text: values[0],
175
+ styleType: 'primary',
176
+ action: 'save',
177
+ },
178
+ {
179
+ text: values[1],
180
+ styleType: 'default',
181
+ action: 'delete',
182
+ },
183
+ {
184
+ text: values[2],
185
+ styleType: 'link',
186
+ action: 'cancel',
187
+ },
188
+ ]);
189
+ });
190
+ break;
204
191
  }
205
- }
192
+ return emitter.asObservable();
193
+ }, _SkyInlineFormComponent_getCustomButtons = function _SkyInlineFormComponent_getCustomButtons(buttonConfigs) {
194
+ const buttons = [];
195
+ buttonConfigs.forEach((config) => {
196
+ /* istanbul ignore next */
197
+ const styleType = config.styleType || 'default';
198
+ buttons.push({
199
+ action: config.action,
200
+ disabled: config.disabled,
201
+ styleType: styleType,
202
+ text: config.text,
203
+ });
204
+ });
205
+ return buttons;
206
+ }, _SkyInlineFormComponent_isValidCustomConfig = function _SkyInlineFormComponent_isValidCustomConfig(config) {
207
+ return (!!config &&
208
+ !!config.buttons &&
209
+ config.buttons.length > 0 &&
210
+ config.buttonLayout === SkyInlineFormButtonLayout.Custom);
211
+ };
206
212
  SkyInlineFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: SkyInlineFormComponent, deps: [{ token: i1.SkyInlineFormAdapterService }, { token: i0.ElementRef }, { token: i2.SkyLibResourcesService }, { token: i3.SkyAppWindowRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
207
213
  SkyInlineFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: SkyInlineFormComponent, selector: "sky-inline-form", inputs: { config: "config", template: "template", showForm: "showForm" }, outputs: { close: "close" }, providers: [SkyInlineFormAdapterService], ngImport: i0, template: "<div [@skySlideDissolve]=\"showForm\">\n <div *ngIf=\"!showForm\" class=\"sky-slide-dissolve-first\">\n <ng-content></ng-content>\n </div>\n\n <div *ngIf=\"template && showForm\" class=\"sky-slide-dissolve-last\">\n <div class=\"sky-inline-form sky-shadow sky-box sky-elevation-3\">\n <div class=\"sky-inline-form-content\">\n <ng-container [ngTemplateOutlet]=\"template\"> </ng-container>\n </div>\n <div class=\"sky-inline-form-footer\">\n <button\n *ngFor=\"let button of buttons\"\n class=\"sky-btn {{ 'sky-btn-' + button.styleType }}\"\n type=\"button\"\n [disabled]=\"button.disabled ? true : null\"\n [ngClass]=\"{ 'sky-btn-disabled': button.disabled }\"\n (click)=\"closeInlineForm(button)\"\n >\n {{ button.text }}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".sky-inline-form{background:#eeeeef;border:1px solid #cdcfd2;padding:10px;width:100%}.sky-inline-form .sky-inline-form-footer{margin-top:20px}.sky-inline-form .sky-inline-form-footer button{margin:0 5px 0 0}:host-context(.sky-theme-modern) .sky-inline-form{background-color:#fff;border:none;padding:15px}:host-context(.sky-theme-modern) .sky-inline-form .sky-inline-form-footer{margin-top:30px}:host-context(.sky-theme-modern) .sky-inline-form .sky-inline-form-footer button{margin-right:10px}.sky-theme-modern .sky-inline-form{background-color:#fff;border:none;padding:15px}.sky-theme-modern .sky-inline-form .sky-inline-form-footer{margin-top:30px}.sky-theme-modern .sky-inline-form .sky-inline-form-footer button{margin-right:10px}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-inline-form{background-color:#232427}.sky-theme-modern.sky-theme-mode-dark .sky-inline-form{background-color:#232427}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [skySlideDissolve], changeDetection: i0.ChangeDetectionStrategy.OnPush });
208
214
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: SkyInlineFormComponent, decorators: [{
@@ -217,4 +223,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
217
223
  }], close: [{
218
224
  type: Output
219
225
  }] } });
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2lubGluZS1mb3JtL3NyYy9saWIvbW9kdWxlcy9pbmxpbmUtZm9ybS9pbmxpbmUtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvaW5saW5lLWZvcm0vc3JjL2xpYi9tb2R1bGVzL2lubGluZS1mb3JtL2lubGluZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXJELE9BQU8sRUFBRSxHQUFHLElBQUksYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7O0FBSTlFOztHQUVHO0FBU0gsTUFBTSxPQUFPLHNCQUFzQjtJQTREakMsWUFDVSxPQUFvQyxFQUNwQyxVQUFzQixFQUN0QixnQkFBd0MsRUFDeEMsZUFBZ0MsRUFDaEMsaUJBQW9DO1FBSnBDLFlBQU8sR0FBUCxPQUFPLENBQTZCO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENB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QU0sQ0FBQyxZQUFZLEtBQUsseUJBQXlCLENBQUMsTUFBTTtZQUN4RCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQzFCLENBQUM7SUFDSixDQUFDOzttSEE1UFUsc0JBQXNCO3VHQUF0QixzQkFBc0IsaUpBSHRCLENBQUMsMkJBQTJCLENBQUMsMEJDakMxQyxrNEJBeUJBLGk2Q0RTYyxDQUFDLGdCQUFnQixDQUFDOzJGQUVuQixzQkFBc0I7a0JBUmxDLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQywyQkFBMkIsQ0FBQyxjQUM1QixDQUFDLGdCQUFnQixDQUFDOzhPQVFuQixNQUFNO3NCQURoQixLQUFLO2dCQWlCQyxRQUFRO3NCQURkLEtBQUs7Z0JBU0ssUUFBUTtzQkFEbEIsS0FBSztnQkF1QkMsS0FBSztzQkFGWCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNreUFwcFdpbmRvd1JlZiB9IGZyb20gJ0Bza3l1eC9jb3JlJztcbmltcG9ydCB7IFNreUxpYlJlc291cmNlc1NlcnZpY2UgfSBmcm9tICdAc2t5dXgvaTE4bic7XG5cbmltcG9ydCB7IHppcCBhcyBvYnNlcnZhYmxlWmlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBza3lTbGlkZURpc3NvbHZlIH0gZnJvbSAnLi9hbmltYXRpb25zL3NsaWRlLWRpc3NvbHZlJztcbmltcG9ydCB7IFNreUlubGluZUZvcm1BZGFwdGVyU2VydmljZSB9IGZyb20gJy4vaW5saW5lLWZvcm0tYWRhcHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNreUlubGluZUZvcm1CdXR0b25Db25maWcgfSBmcm9tICcuL3R5cGVzL2lubGluZS1mb3JtLWJ1dHRvbi1jb25maWcnO1xuaW1wb3J0IHsgU2t5SW5saW5lRm9ybUJ1dHRvbkxheW91dCB9IGZyb20gJy4vdHlwZXMvaW5saW5lLWZvcm0tYnV0dG9uLWxheW91dCc7XG5pbXBvcnQgeyBTa3lJbmxpbmVGb3JtQ2xvc2VBcmdzIH0gZnJvbSAnLi90eXBlcy9pbmxpbmUtZm9ybS1jbG9zZS1hcmdzJztcbmltcG9ydCB7IFNreUlubGluZUZvcm1Db25maWcgfSBmcm9tICcuL3R5cGVzL2lubGluZS1mb3JtLWNvbmZpZyc7XG5cbi8qKlxuICogUmVuZGVycyBmb3JtIGNvbnRlbnQgaW4gdGhlIGN1cnJlbnQgdmlldyBpbnN0ZWFkIG9mIGEgc2VwYXJhdGUgbW9kYWwuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1pbmxpbmUtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbmxpbmUtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lubGluZS1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtTa3lJbmxpbmVGb3JtQWRhcHRlclNlcnZpY2VdLFxuICBhbmltYXRpb25zOiBbc2t5U2xpZGVEaXNzb2x2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIFNreUlubGluZUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgYnV0dG9ucyB0byBkaXNwbGF5IHdpdGggdGhlIGlubGluZSBmb3JtLlxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKHZhbHVlOiBTa3lJbmxpbmVGb3JtQ29uZmlnKSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9jb25maWcpIHtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHZhbHVlO1xuICAgICAgdGhpcy5zZXR1cEJ1dHRvbnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBTa3lJbmxpbmVGb3JtQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHRlbXBsYXRlIHRvIHVzZSB0byBpbnN0YW50aWF0ZSB0aGUgaW5saW5lIGZvcm0uXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgaW5saW5lIGZvcm0uIFVzZXJzIGNhbiB0b2dnbGUgYmV0d2VlbiBkaXNwbGF5aW5nXG4gICAqIGFuZCBoaWRpbmcgdGhlIGlubGluZSBmb3JtLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzaG93Rm9ybSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dGb3JtID0gdmFsdWU7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgLy8gc2V0VGltZW91dCgpIHByZXZlbnRzIGFwcGx5QXV0b2ZvY3VzKCkgZnJvbSBmaXJpbmdcbiAgICAgIC8vIHVudGlsIGFmdGVyICpuZ0lmIGhhcyBhZGRlZCB0aGUgZm9ybSBlbGVtZW50IHRvIHRoZSBET00uXG4gICAgICB0aGlzLnNreUFwcFdpbmRvd1JlZi5uYXRpdmVXaW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5hcHBseUF1dG9mb2N1cyh0aGlzLmVsZW1lbnRSZWYpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93Rm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd0Zvcm07XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBjbG9zZSB0aGUgaW5saW5lIGZvcm0uXG4gICAqL1xuICBAT3V0cHV0KClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIHB1YmxpYyBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5SW5saW5lRm9ybUNsb3NlQXJncz4oKTtcblxuICBwdWJsaWMgYnV0dG9uczogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdO1xuXG4gIHByaXZhdGUgX2NvbmZpZzogU2t5SW5saW5lRm9ybUNvbmZpZztcblxuICBwcml2YXRlIF9zaG93Rm9ybSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWRhcHRlcjogU2t5SW5saW5lRm9ybUFkYXB0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBza3lBcHBXaW5kb3dSZWY6IFNreUFwcFdpbmRvd1JlZixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlSW5saW5lRm9ybShldmVudDogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IGFyZ3M6IFNreUlubGluZUZvcm1DbG9zZUFyZ3MgPSB7XG4gICAgICByZWFzb246IGV2ZW50LmFjdGlvbixcbiAgICB9O1xuICAgIHRoaXMuY2xvc2UuZW1pdChhcmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBCdXR0b25zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzVmFsaWRDdXN0b21Db25maWcodGhpcy5jb25maWcpKSB7XG4gICAgICB0aGlzLmJ1dHRvbnMgPSB0aGlzLmdldEN1c3RvbUJ1dHRvbnModGhpcy5jb25maWcuYnV0dG9ucyk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0UHJlc2V0QnV0dG9ucygpLnRoZW4oKGJ1dHRvbnMpID0+IHtcbiAgICAgIHRoaXMuYnV0dG9ucyA9IGJ1dHRvbnM7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmVzZXRCdXR0b25zKCk6IFByb21pc2U8U2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdPiB7XG4gICAgY29uc3QgYnV0dG9uVHlwZSA9IHRoaXMuY29uZmlnXG4gICAgICA/IHRoaXMuY29uZmlnLmJ1dHRvbkxheW91dFxuICAgICAgOiBTa3lJbmxpbmVGb3JtQnV0dG9uTGF5b3V0LkRvbmVDYW5jZWw7XG5cbiAgICBsZXQgcHJvbWlzZTogUHJvbWlzZTxTa3lJbmxpbmVGb3JtQnV0dG9uQ29uZmlnW10+O1xuXG4gICAgc3dpdGNoIChidXR0b25UeXBlKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNhc2UgU2t5SW5saW5lRm9ybUJ1dHRvbkxheW91dC5Eb25lQ2FuY2VsOlxuICAgICAgICBvYnNlcnZhYmxlWmlwKFxuICAgICAgICAgIHRoaXMucmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9kb25lJyksXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZXNTZXJ2aWNlLmdldFN0cmluZygnc2t5dXhfaW5saW5lX2Zvcm1fYnV0dG9uX2NhbmNlbCcpXG4gICAgICAgIClcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlczogYW55KSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2U8U2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdPihcbiAgICAgICAgICAgICAgKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlVHlwZTogJ3ByaW1hcnknLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdkb25lJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlc1sxXSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAnbGluaycsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NhbmNlbCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lJbmxpbmVGb3JtQnV0dG9uTGF5b3V0LlNhdmVDYW5jZWw6XG4gICAgICAgIG9ic2VydmFibGVaaXAoXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZXNTZXJ2aWNlLmdldFN0cmluZygnc2t5dXhfaW5saW5lX2Zvcm1fYnV0dG9uX3NhdmUnKSxcbiAgICAgICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF9pbmxpbmVfZm9ybV9idXR0b25fY2FuY2VsJylcbiAgICAgICAgKVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgodmFsdWVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZTxTa3lJbmxpbmVGb3JtQnV0dG9uQ29uZmlnW10+KFxuICAgICAgICAgICAgICAocmVzb2x2ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlc1swXSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NhdmUnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdmFsdWVzWzFdLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVR5cGU6ICdsaW5rJyxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY2FuY2VsJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFNreUlubGluZUZvcm1CdXR0b25MYXlvdXQuRG9uZURlbGV0ZUNhbmNlbDpcbiAgICAgICAgb2JzZXJ2YWJsZVppcChcbiAgICAgICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF9pbmxpbmVfZm9ybV9idXR0b25fZG9uZScpLFxuICAgICAgICAgIHRoaXMucmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9kZWxldGUnKSxcbiAgICAgICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF9pbmxpbmVfZm9ybV9idXR0b25fY2FuY2VsJylcbiAgICAgICAgKVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgodmFsdWVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZTxTa3lJbmxpbmVGb3JtQnV0dG9uQ29uZmlnW10+KFxuICAgICAgICAgICAgICAocmVzb2x2ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlc1swXSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2RvbmUnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdmFsdWVzWzFdLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlc1syXSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAnbGluaycsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NhbmNlbCcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lJbmxpbmVGb3JtQnV0dG9uTGF5b3V0LlNhdmVEZWxldGVDYW5jZWw6XG4gICAgICAgIG9ic2VydmFibGVaaXAoXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZXNTZXJ2aWNlLmdldFN0cmluZygnc2t5dXhfaW5saW5lX2Zvcm1fYnV0dG9uX3NhdmUnKSxcbiAgICAgICAgICB0aGlzLnJlc291cmNlc1NlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF9pbmxpbmVfZm9ybV9idXR0b25fZGVsZXRlJyksXG4gICAgICAgICAgdGhpcy5yZXNvdXJjZXNTZXJ2aWNlLmdldFN0cmluZygnc2t5dXhfaW5saW5lX2Zvcm1fYnV0dG9uX2NhbmNlbCcpXG4gICAgICAgIClcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlczogYW55KSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2U8U2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdPihcbiAgICAgICAgICAgICAgKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlVHlwZTogJ3ByaW1hcnknLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdzYXZlJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlc1sxXSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2RlbGV0ZScsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMl0sXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlVHlwZTogJ2xpbmsnLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjYW5jZWwnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIGdldEN1c3RvbUJ1dHRvbnMoXG4gICAgYnV0dG9uQ29uZmlnczogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdXG4gICk6IFNreUlubGluZUZvcm1CdXR0b25Db25maWdbXSB7XG4gICAgY29uc3QgYnV0dG9uczogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdID0gW107XG5cbiAgICBidXR0b25Db25maWdzLmZvckVhY2goKGNvbmZpZzogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZykgPT4ge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGNvbnN0IHN0eWxlVHlwZSA9IGNvbmZpZy5zdHlsZVR5cGUgfHwgJ2RlZmF1bHQnO1xuXG4gICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICBhY3Rpb246IGNvbmZpZy5hY3Rpb24sXG4gICAgICAgIGRpc2FibGVkOiBjb25maWcuZGlzYWJsZWQsXG4gICAgICAgIHN0eWxlVHlwZTogc3R5bGVUeXBlLFxuICAgICAgICB0ZXh0OiBjb25maWcudGV4dCxcbiAgICAgIH0gYXMgU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnV0dG9ucztcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZEN1c3RvbUNvbmZpZyhjb25maWc6IFNreUlubGluZUZvcm1Db25maWcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29uZmlnICYmXG4gICAgICBjb25maWcuYnV0dG9uTGF5b3V0ID09PSBTa3lJbmxpbmVGb3JtQnV0dG9uTGF5b3V0LkN1c3RvbSAmJlxuICAgICAgY29uZmlnLmJ1dHRvbnMubGVuZ3RoID4gMFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgW0Bza3lTbGlkZURpc3NvbHZlXT1cInNob3dGb3JtXCI+XG4gIDxkaXYgKm5nSWY9XCIhc2hvd0Zvcm1cIiBjbGFzcz1cInNreS1zbGlkZS1kaXNzb2x2ZS1maXJzdFwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInRlbXBsYXRlICYmIHNob3dGb3JtXCIgY2xhc3M9XCJza3ktc2xpZGUtZGlzc29sdmUtbGFzdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJza3ktaW5saW5lLWZvcm0gc2t5LXNoYWRvdyBza3ktYm94IHNreS1lbGV2YXRpb24tM1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNreS1pbmxpbmUtZm9ybS1jb250ZW50XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIj4gPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJza3ktaW5saW5lLWZvcm0tZm9vdGVyXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGJ1dHRvbnNcIlxuICAgICAgICAgIGNsYXNzPVwic2t5LWJ0biB7eyAnc2t5LWJ0bi0nICsgYnV0dG9uLnN0eWxlVHlwZSB9fVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImJ1dHRvbi5kaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICdza3ktYnRuLWRpc2FibGVkJzogYnV0dG9uLmRpc2FibGVkIH1cIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZUlubGluZUZvcm0oYnV0dG9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBidXR0b24udGV4dCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2lubGluZS1mb3JtL3NyYy9saWIvbW9kdWxlcy9pbmxpbmUtZm9ybS9pbmxpbmUtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvaW5saW5lLWZvcm0vc3JjL2xpYi9tb2R1bGVzL2lubGluZS1mb3JtL2lubGluZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVyRCxPQUFPLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7O0FBSTlFOztHQUVHO0FBU0gsTUFBTSxPQUFPLHNCQUFzQjtJQXFFakMsWUFDRSxPQUFvQyxFQUNwQyxVQUFzQixFQUN0QixnQkFBd0MsRUFDeEMsZUFBZ0MsRUFDaEMsaUJBQW9DOztRQTNCdEM7O1dBRUc7UUFHSSxVQUFLLEdBQUcsSUFBSSxZQUFZ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QUFDLFNBQVMsSUFBSSxTQUFTLENBQUM7UUFFaEQsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1NBQ1csQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxxR0FFb0IsTUFBdUM7SUFDMUQsT0FBTyxDQUNMLENBQUMsQ0FBQyxNQUFNO1FBQ1IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDekIsTUFBTSxDQUFDLFlBQVksS0FBSyx5QkFBeUIsQ0FBQyxNQUFNLENBQ3pELENBQUM7QUFDSixDQUFDO21IQXJRVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixpSkFIdEIsQ0FBQywyQkFBMkIsQ0FBQywwQkNqQzFDLGs0QkF5QkEsaTZDRFNjLENBQUMsZ0JBQWdCLENBQUM7MkZBRW5CLHNCQUFzQjtrQkFSbEMsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLDJCQUEyQixDQUFDLGNBQzVCLENBQUMsZ0JBQWdCLENBQUM7OE9BUW5CLE1BQU07c0JBRGhCLEtBQUs7Z0JBaUJDLFFBQVE7c0JBRGQsS0FBSztnQkFTSyxRQUFRO3NCQURsQixLQUFLO2dCQXVCQyxLQUFLO3NCQUZYLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2t5QXBwV2luZG93UmVmIH0gZnJvbSAnQHNreXV4L2NvcmUnO1xuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgemlwIGFzIG9ic2VydmFibGVaaXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgc2t5U2xpZGVEaXNzb2x2ZSB9IGZyb20gJy4vYW5pbWF0aW9ucy9zbGlkZS1kaXNzb2x2ZSc7XG5pbXBvcnQgeyBTa3lJbmxpbmVGb3JtQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL2lubGluZS1mb3JtLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lJbmxpbmVGb3JtQnV0dG9uQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9pbmxpbmUtZm9ybS1idXR0b24tY29uZmlnJztcbmltcG9ydCB7IFNreUlubGluZUZvcm1CdXR0b25MYXlvdXQgfSBmcm9tICcuL3R5cGVzL2lubGluZS1mb3JtLWJ1dHRvbi1sYXlvdXQnO1xuaW1wb3J0IHsgU2t5SW5saW5lRm9ybUNsb3NlQXJncyB9IGZyb20gJy4vdHlwZXMvaW5saW5lLWZvcm0tY2xvc2UtYXJncyc7XG5pbXBvcnQgeyBTa3lJbmxpbmVGb3JtQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9pbmxpbmUtZm9ybS1jb25maWcnO1xuXG4vKipcbiAqIFJlbmRlcnMgZm9ybSBjb250ZW50IGluIHRoZSBjdXJyZW50IHZpZXcgaW5zdGVhZCBvZiBhIHNlcGFyYXRlIG1vZGFsLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktaW5saW5lLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5saW5lLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbmxpbmUtZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJvdmlkZXJzOiBbU2t5SW5saW5lRm9ybUFkYXB0ZXJTZXJ2aWNlXSxcbiAgYW5pbWF0aW9uczogW3NreVNsaWRlRGlzc29sdmVdLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lJbmxpbmVGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogU3BlY2lmaWVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGJ1dHRvbnMgdG8gZGlzcGxheSB3aXRoIHRoZSBpbmxpbmUgZm9ybS5cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbmZpZyh2YWx1ZTogU2t5SW5saW5lRm9ybUNvbmZpZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy4jX2NvbmZpZyAmJiAhIXZhbHVlKSB7XG4gICAgICB0aGlzLiNfY29uZmlnID0gdmFsdWU7XG4gICAgICB0aGlzLiNzZXR1cEJ1dHRvbnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBTa3lJbmxpbmVGb3JtQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX2NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYSB0ZW1wbGF0ZSB0byB1c2UgdG8gaW5zdGFudGlhdGUgdGhlIGlubGluZSBmb3JtLlxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIGlubGluZSBmb3JtLiBVc2VycyBjYW4gdG9nZ2xlIGJldHdlZW4gZGlzcGxheWluZ1xuICAgKiBhbmQgaGlkaW5nIHRoZSBpbmxpbmUgZm9ybS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2hvd0Zvcm0odmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc2hvd0Zvcm0gPSB2YWx1ZTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICAvLyBzZXRUaW1lb3V0KCkgcHJldmVudHMgYXBwbHlBdXRvZm9jdXMoKSBmcm9tIGZpcmluZ1xuICAgICAgLy8gdW50aWwgYWZ0ZXIgKm5nSWYgaGFzIGFkZGVkIHRoZSBmb3JtIGVsZW1lbnQgdG8gdGhlIERPTS5cbiAgICAgIHRoaXMuI3NreUFwcFdpbmRvd1JlZi5uYXRpdmVXaW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI2FkYXB0ZXIuYXBwbHlBdXRvZm9jdXModGhpcy4jZWxlbWVudFJlZik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNob3dGb3JtKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfc2hvd0Zvcm07XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBjbG9zZSB0aGUgaW5saW5lIGZvcm0uXG4gICAqL1xuICBAT3V0cHV0KClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIHB1YmxpYyBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5SW5saW5lRm9ybUNsb3NlQXJncz4oKTtcblxuICAvLyBUT0RPOiBoYW5kbGUgYnV0dG9ucyBiZWluZyBzZXQgYXN5bmNocm9ub3VzbHkgKFwifCB1bmRlZmluZWRcIikgd2hlbiBzZXR0aW5nIGF1dG9mb2N1c1xuICBwdWJsaWMgYnV0dG9ucyE6IFNreUlubGluZUZvcm1CdXR0b25Db25maWdbXTtcblxuICAjX2NvbmZpZzogU2t5SW5saW5lRm9ybUNvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAjX3Nob3dGb3JtOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNhZGFwdGVyOiBTa3lJbmxpbmVGb3JtQWRhcHRlclNlcnZpY2U7XG4gICNlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAjcmVzb3VyY2VzU2VydmljZTogU2t5TGliUmVzb3VyY2VzU2VydmljZTtcbiAgI3NreUFwcFdpbmRvd1JlZjogU2t5QXBwV2luZG93UmVmO1xuICAjY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IFNreUlubGluZUZvcm1BZGFwdGVyU2VydmljZSxcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHJlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2UsXG4gICAgc2t5QXBwV2luZG93UmVmOiBTa3lBcHBXaW5kb3dSZWYsXG4gICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuI2FkYXB0ZXIgPSBhZGFwdGVyO1xuICAgIHRoaXMuI2VsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMuI3Jlc291cmNlc1NlcnZpY2UgPSByZXNvdXJjZXNTZXJ2aWNlO1xuICAgIHRoaXMuI3NreUFwcFdpbmRvd1JlZiA9IHNreUFwcFdpbmRvd1JlZjtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvclJlZiA9IGNoYW5nZURldGVjdG9yUmVmO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuI3NldHVwQnV0dG9ucygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcblxuICAgIHRoaXMuY2xvc2UuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZUlubGluZUZvcm0oZXZlbnQ6IFNreUlubGluZUZvcm1CdXR0b25Db25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBhcmdzOiBTa3lJbmxpbmVGb3JtQ2xvc2VBcmdzID0ge1xuICAgICAgcmVhc29uOiBldmVudC5hY3Rpb24sXG4gICAgfTtcbiAgICB0aGlzLmNsb3NlLmVtaXQoYXJncyk7XG4gIH1cblxuICAjc2V0dXBCdXR0b25zKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuI2lzVmFsaWRDdXN0b21Db25maWcodGhpcy5jb25maWcpICYmXG4gICAgICB0aGlzLmNvbmZpZyAmJlxuICAgICAgdGhpcy5jb25maWcuYnV0dG9uc1xuICAgICkge1xuICAgICAgdGhpcy5idXR0b25zID0gdGhpcy4jZ2V0Q3VzdG9tQnV0dG9ucyh0aGlzLmNvbmZpZy5idXR0b25zKTtcbiAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuI2dldFByZXNldEJ1dHRvbnMoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoYnV0dG9uczogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdKSA9PiB7XG4gICAgICAgIHRoaXMuYnV0dG9ucyA9IGJ1dHRvbnM7XG4gICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICAjZ2V0UHJlc2V0QnV0dG9ucygpOiBPYnNlcnZhYmxlPFNreUlubGluZUZvcm1CdXR0b25Db25maWdbXT4ge1xuICAgIGNvbnN0IGVtaXR0ZXIgPSBuZXcgUmVwbGF5U3ViamVjdDxTa3lJbmxpbmVGb3JtQnV0dG9uQ29uZmlnW10+KDEpO1xuXG4gICAgY29uc3QgYnV0dG9uVHlwZSA9IHRoaXMuY29uZmlnXG4gICAgICA/IHRoaXMuY29uZmlnLmJ1dHRvbkxheW91dFxuICAgICAgOiBTa3lJbmxpbmVGb3JtQnV0dG9uTGF5b3V0LkRvbmVDYW5jZWw7XG5cbiAgICBzd2l0Y2ggKGJ1dHRvblR5cGUpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSBTa3lJbmxpbmVGb3JtQnV0dG9uTGF5b3V0LkRvbmVDYW5jZWw6XG4gICAgICAgIG9ic2VydmFibGVaaXAoXG4gICAgICAgICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9kb25lJyksXG4gICAgICAgICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9jYW5jZWwnKVxuICAgICAgICApXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAgIGVtaXR0ZXIubmV4dChbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnZG9uZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMV0sXG4gICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAnbGluaycsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnY2FuY2VsJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lJbmxpbmVGb3JtQnV0dG9uTGF5b3V0LlNhdmVDYW5jZWw6XG4gICAgICAgIG9ic2VydmFibGVaaXAoXG4gICAgICAgICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9zYXZlJyksXG4gICAgICAgICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9jYW5jZWwnKVxuICAgICAgICApXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAgIGVtaXR0ZXIubmV4dChbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2F2ZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMV0sXG4gICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAnbGluaycsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnY2FuY2VsJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lJbmxpbmVGb3JtQnV0dG9uTGF5b3V0LkRvbmVEZWxldGVDYW5jZWw6XG4gICAgICAgIG9ic2VydmFibGVaaXAoXG4gICAgICAgICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9kb25lJyksXG4gICAgICAgICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9kZWxldGUnKSxcbiAgICAgICAgICB0aGlzLiNyZXNvdXJjZXNTZXJ2aWNlLmdldFN0cmluZygnc2t5dXhfaW5saW5lX2Zvcm1fYnV0dG9uX2NhbmNlbCcpXG4gICAgICAgIClcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgodmFsdWVzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICAgICAgZW1pdHRlci5uZXh0KFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlc1swXSxcbiAgICAgICAgICAgICAgICBzdHlsZVR5cGU6ICdwcmltYXJ5JyxcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdkb25lJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlc1sxXSxcbiAgICAgICAgICAgICAgICBzdHlsZVR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdkZWxldGUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4dDogdmFsdWVzWzJdLFxuICAgICAgICAgICAgICAgIHN0eWxlVHlwZTogJ2xpbmsnLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NhbmNlbCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU2t5SW5saW5lRm9ybUJ1dHRvbkxheW91dC5TYXZlRGVsZXRlQ2FuY2VsOlxuICAgICAgICBvYnNlcnZhYmxlWmlwKFxuICAgICAgICAgIHRoaXMuI3Jlc291cmNlc1NlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF9pbmxpbmVfZm9ybV9idXR0b25fc2F2ZScpLFxuICAgICAgICAgIHRoaXMuI3Jlc291cmNlc1NlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF9pbmxpbmVfZm9ybV9idXR0b25fZGVsZXRlJyksXG4gICAgICAgICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZS5nZXRTdHJpbmcoJ3NreXV4X2lubGluZV9mb3JtX2J1dHRvbl9jYW5jZWwnKVxuICAgICAgICApXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlczogc3RyaW5nW10pID0+IHtcbiAgICAgICAgICAgIGVtaXR0ZXIubmV4dChbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnc2F2ZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZXNbMV0sXG4gICAgICAgICAgICAgICAgc3R5bGVUeXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlc1syXSxcbiAgICAgICAgICAgICAgICBzdHlsZVR5cGU6ICdsaW5rJyxcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdjYW5jZWwnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBlbWl0dGVyLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgI2dldEN1c3RvbUJ1dHRvbnMoXG4gICAgYnV0dG9uQ29uZmlnczogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdXG4gICk6IFNreUlubGluZUZvcm1CdXR0b25Db25maWdbXSB7XG4gICAgY29uc3QgYnV0dG9uczogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZ1tdID0gW107XG5cbiAgICBidXR0b25Db25maWdzLmZvckVhY2goKGNvbmZpZzogU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZykgPT4ge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGNvbnN0IHN0eWxlVHlwZSA9IGNvbmZpZy5zdHlsZVR5cGUgfHwgJ2RlZmF1bHQnO1xuXG4gICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICBhY3Rpb246IGNvbmZpZy5hY3Rpb24sXG4gICAgICAgIGRpc2FibGVkOiBjb25maWcuZGlzYWJsZWQsXG4gICAgICAgIHN0eWxlVHlwZTogc3R5bGVUeXBlLFxuICAgICAgICB0ZXh0OiBjb25maWcudGV4dCxcbiAgICAgIH0gYXMgU2t5SW5saW5lRm9ybUJ1dHRvbkNvbmZpZyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYnV0dG9ucztcbiAgfVxuXG4gICNpc1ZhbGlkQ3VzdG9tQ29uZmlnKGNvbmZpZzogU2t5SW5saW5lRm9ybUNvbmZpZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNvbmZpZyAmJlxuICAgICAgISFjb25maWcuYnV0dG9ucyAmJlxuICAgICAgY29uZmlnLmJ1dHRvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgY29uZmlnLmJ1dHRvbkxheW91dCA9PT0gU2t5SW5saW5lRm9ybUJ1dHRvbkxheW91dC5DdXN0b21cbiAgICApO1xuICB9XG59XG4iLCI8ZGl2IFtAc2t5U2xpZGVEaXNzb2x2ZV09XCJzaG93Rm9ybVwiPlxuICA8ZGl2ICpuZ0lmPVwiIXNob3dGb3JtXCIgY2xhc3M9XCJza3ktc2xpZGUtZGlzc29sdmUtZmlyc3RcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJ0ZW1wbGF0ZSAmJiBzaG93Rm9ybVwiIGNsYXNzPVwic2t5LXNsaWRlLWRpc3NvbHZlLWxhc3RcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2t5LWlubGluZS1mb3JtIHNreS1zaGFkb3cgc2t5LWJveCBza3ktZWxldmF0aW9uLTNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJza3ktaW5saW5lLWZvcm0tY29udGVudFwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2t5LWlubGluZS1mb3JtLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBidXR0b25zXCJcbiAgICAgICAgICBjbGFzcz1cInNreS1idG4ge3sgJ3NreS1idG4tJyArIGJ1dHRvbi5zdHlsZVR5cGUgfX1cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2t5LWJ0bi1kaXNhYmxlZCc6IGJ1dHRvbi5kaXNhYmxlZCB9XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VJbmxpbmVGb3JtKGJ1dHRvbilcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgYnV0dG9uLnRleHQgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==