@agorapulse/ui-components 18.0.35 → 18.0.36

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.
@@ -0,0 +1,60 @@
1
+ import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ export declare const AP_CHECKBOX_DIRECTIVE_CONTROL_VALUE_ACCESSOR: {
5
+ provide: import("@angular/core").InjectionToken<readonly ControlValueAccessor[]>;
6
+ useExisting: import("@angular/core").Type<any>;
7
+ multi: boolean;
8
+ };
9
+ export declare class CheckboxDirective implements ControlValueAccessor, OnInit, OnDestroy {
10
+ private readonly symbolRegistry;
11
+ private readonly elementRef;
12
+ private readonly renderer;
13
+ private readonly viewContainer;
14
+ ariaLabel?: string;
15
+ ariaLabelledby?: string;
16
+ ariaDescribedby?: string;
17
+ disabled: boolean;
18
+ set indeterminate(indeterminate: boolean);
19
+ get indeterminate(): boolean;
20
+ set checked(checked: boolean);
21
+ get checked(): boolean;
22
+ required: boolean;
23
+ set name(name: string);
24
+ get name(): string;
25
+ readonly change: EventEmitter<boolean>;
26
+ private _checked;
27
+ private _indeterminate;
28
+ private _name;
29
+ private _controlValueAccessorChangeFn;
30
+ private _onTouched;
31
+ private listeners;
32
+ private styleElement;
33
+ private wrapper;
34
+ private checkmarkContainer;
35
+ private indeterminateContainer;
36
+ private symbolComponent?;
37
+ ngOnInit(): void;
38
+ ngOnDestroy(): void;
39
+ private createCheckboxStructure;
40
+ private createOverlayContainer;
41
+ private createCheckmarkSymbol;
42
+ private createIndeterminateBar;
43
+ private updateCheckmarkVisibility;
44
+ private setupEventListeners;
45
+ private applyCheckboxStyles;
46
+ onBlur(): void;
47
+ private onValueChange;
48
+ writeValue(value: boolean): void;
49
+ registerOnChange(fn: (value: boolean) => void): void;
50
+ registerOnTouched(fn: () => void): void;
51
+ setDisabledState(isDisabled: boolean): void;
52
+ validate(): false | {
53
+ invalid: boolean;
54
+ };
55
+ static ɵfac: i0.ɵɵFactoryDeclaration<CheckboxDirective, never>;
56
+ static ɵdir: i0.ɵɵDirectiveDeclaration<CheckboxDirective, "input[type=\"checkbox\"][apCheckbox]", never, { "ariaLabel": { "alias": "aria-label"; "required": false; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "indeterminate": { "alias": "indeterminate"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; "required": { "alias": "required"; "required": false; }; "name": { "alias": "name"; "required": true; }; }, { "change": "change"; }, never, never, true, never>;
57
+ static ngAcceptInputType_disabled: unknown;
58
+ static ngAcceptInputType_indeterminate: unknown;
59
+ static ngAcceptInputType_required: unknown;
60
+ }
@@ -1,5 +1,6 @@
1
1
  export * from './autosize-textarea.directive';
2
2
  export * from './base-button.directive';
3
+ export * from './checkbox.directive';
3
4
  export * from './default-image.directive';
4
5
  export * from './ellipsis.directive';
5
6
  export * from './equal-validator.directive';
@@ -0,0 +1,442 @@
1
+ import { apCheck, SymbolComponent, SymbolRegistry } from '@agorapulse/ui-symbol';
2
+ import { booleanAttribute, Directive, ElementRef, EventEmitter, forwardRef, inject, Input, Output, Renderer2, ViewContainerRef, } from '@angular/core';
3
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import * as i0 from "@angular/core";
5
+ export const AP_CHECKBOX_DIRECTIVE_CONTROL_VALUE_ACCESSOR = {
6
+ provide: NG_VALUE_ACCESSOR,
7
+ useExisting: forwardRef(() => CheckboxDirective),
8
+ multi: true,
9
+ };
10
+ /*
11
+ Host bindings is important here:
12
+ - This provides encapsulation and reactivity regardless of how the directive is used in templates.
13
+ - It guarantees that properties like checked, disabled, required, and ARIA attributes always reflect
14
+ only the directive's logic, not just consumer bindings.
15
+ - So we need to have host bindings for all the properties that we want to control.
16
+ - We could also use @HostListener.
17
+ */
18
+ export class CheckboxDirective {
19
+ symbolRegistry = inject(SymbolRegistry);
20
+ elementRef = inject((ElementRef));
21
+ renderer = inject(Renderer2);
22
+ viewContainer = inject(ViewContainerRef);
23
+ ariaLabel;
24
+ ariaLabelledby;
25
+ ariaDescribedby;
26
+ disabled = false;
27
+ set indeterminate(indeterminate) {
28
+ if (indeterminate) {
29
+ this._checked = false;
30
+ }
31
+ this._indeterminate = indeterminate;
32
+ const input = this.elementRef.nativeElement;
33
+ if (input) {
34
+ input.indeterminate = indeterminate;
35
+ }
36
+ // Only update visibility if containers are ready
37
+ if (this.checkmarkContainer && this.indeterminateContainer) {
38
+ this.updateCheckmarkVisibility();
39
+ }
40
+ }
41
+ get indeterminate() {
42
+ return this._indeterminate;
43
+ }
44
+ set checked(checked) {
45
+ this._checked = checked;
46
+ // Only update visibility if containers are ready
47
+ if (this.checkmarkContainer && this.indeterminateContainer) {
48
+ this.updateCheckmarkVisibility();
49
+ }
50
+ }
51
+ get checked() {
52
+ return this._checked;
53
+ }
54
+ required = false;
55
+ set name(name) {
56
+ this._name = name;
57
+ }
58
+ get name() {
59
+ return this._name;
60
+ }
61
+ // eslint-disable-next-line @angular-eslint/no-output-native
62
+ change = new EventEmitter();
63
+ _checked = false;
64
+ _indeterminate = false;
65
+ _name = '';
66
+ _controlValueAccessorChangeFn = () => { };
67
+ _onTouched = () => { };
68
+ listeners = [];
69
+ styleElement;
70
+ wrapper;
71
+ checkmarkContainer;
72
+ indeterminateContainer;
73
+ symbolComponent;
74
+ ngOnInit() {
75
+ this.symbolRegistry.registerSymbols([apCheck]);
76
+ this.createCheckboxStructure();
77
+ this.setupEventListeners();
78
+ }
79
+ ngOnDestroy() {
80
+ this.listeners.forEach(unlisten => unlisten());
81
+ if (this.styleElement && this.styleElement.parentNode) {
82
+ this.styleElement.parentNode.removeChild(this.styleElement);
83
+ }
84
+ if (this.symbolComponent) {
85
+ this.symbolComponent.destroy();
86
+ }
87
+ if (this.checkmarkContainer && this.checkmarkContainer.parentNode) {
88
+ this.checkmarkContainer.parentNode.removeChild(this.checkmarkContainer);
89
+ }
90
+ if (this.indeterminateContainer && this.indeterminateContainer.parentNode) {
91
+ this.indeterminateContainer.parentNode.removeChild(this.indeterminateContainer);
92
+ }
93
+ // Move input back out of wrapper and remove wrapper
94
+ if (this.wrapper && this.wrapper.parentNode) {
95
+ const input = this.elementRef.nativeElement;
96
+ this.renderer.insertBefore(this.wrapper.parentNode, input, this.wrapper);
97
+ this.wrapper.parentNode.removeChild(this.wrapper);
98
+ }
99
+ }
100
+ createCheckboxStructure() {
101
+ const input = this.elementRef.nativeElement;
102
+ const parent = input.parentElement;
103
+ // Hot take - Input doesn't need positioning since it will be wrapped
104
+ // Make input's parent use inline-flex for alignment
105
+ if (parent) {
106
+ this.renderer.setStyle(parent, 'display', 'inline-flex');
107
+ this.renderer.setStyle(parent, 'align-items', 'center');
108
+ this.renderer.setStyle(parent, 'gap', 'var(--ref-spacing-xxs)');
109
+ }
110
+ this.renderer.addClass(input, 'ap-checkbox-styled');
111
+ this.checkmarkContainer = this.createOverlayContainer('ap-checkbox-checkmark');
112
+ this.wrapper = this.renderer.createElement('span');
113
+ this.renderer.setStyle(this.wrapper, 'position', 'relative');
114
+ this.renderer.setStyle(this.wrapper, 'display', 'inline-flex');
115
+ this.renderer.setStyle(this.wrapper, 'align-items', 'center');
116
+ this.renderer.setStyle(this.wrapper, 'vertical-align', 'middle');
117
+ this.renderer.insertBefore(parent, this.wrapper, input);
118
+ this.renderer.appendChild(this.wrapper, input);
119
+ this.renderer.appendChild(this.wrapper, this.checkmarkContainer);
120
+ this.indeterminateContainer = this.createOverlayContainer('ap-checkbox-indeterminate');
121
+ this.renderer.appendChild(this.wrapper, this.indeterminateContainer);
122
+ this.createCheckmarkSymbol();
123
+ this.createIndeterminateBar();
124
+ this.applyCheckboxStyles();
125
+ this.updateCheckmarkVisibility();
126
+ }
127
+ createOverlayContainer(className) {
128
+ const container = this.renderer.createElement('span');
129
+ this.renderer.addClass(container, className);
130
+ this.renderer.setStyle(container, 'position', 'absolute');
131
+ this.renderer.setStyle(container, 'top', '50%');
132
+ this.renderer.setStyle(container, 'left', '50%');
133
+ this.renderer.setStyle(container, 'transform', 'translate(-50%, -50%)');
134
+ this.renderer.setStyle(container, 'width', 'auto');
135
+ this.renderer.setStyle(container, 'height', 'auto');
136
+ this.renderer.setStyle(container, 'display', 'flex');
137
+ this.renderer.setStyle(container, 'justify-content', 'center');
138
+ this.renderer.setStyle(container, 'align-items', 'center');
139
+ this.renderer.setStyle(container, 'pointer-events', 'none');
140
+ this.renderer.setStyle(container, 'opacity', '0');
141
+ this.renderer.setStyle(container, 'z-index', '1');
142
+ return container;
143
+ }
144
+ createCheckmarkSymbol() {
145
+ // Create the symbol component
146
+ this.symbolComponent = this.viewContainer.createComponent(SymbolComponent);
147
+ // Set inputs using setInput method for signal-based inputs
148
+ this.symbolComponent.setInput('symbolId', 'check');
149
+ this.symbolComponent.setInput('color', 'white');
150
+ this.symbolComponent.setInput('size', 10);
151
+ // Append the symbol to our checkmark container
152
+ this.renderer.appendChild(this.checkmarkContainer, this.symbolComponent.location.nativeElement);
153
+ }
154
+ createIndeterminateBar() {
155
+ // Create the indeterminate bar element exactly like the component
156
+ const bar = this.renderer.createElement('span');
157
+ this.renderer.setStyle(bar, 'height', '1.5px');
158
+ this.renderer.setStyle(bar, 'background', 'var(--ref-color-white)');
159
+ this.renderer.setStyle(bar, 'width', '8px');
160
+ // Append the bar to the indeterminate container
161
+ this.renderer.appendChild(this.indeterminateContainer, bar);
162
+ }
163
+ updateCheckmarkVisibility() {
164
+ if (this.checkmarkContainer) {
165
+ const opacity = this._checked && !this._indeterminate ? '1' : '0';
166
+ this.renderer.setStyle(this.checkmarkContainer, 'opacity', opacity);
167
+ }
168
+ if (this.indeterminateContainer) {
169
+ const opacity = this._indeterminate && !this._checked ? '1' : '0';
170
+ this.renderer.setStyle(this.indeterminateContainer, 'opacity', opacity);
171
+ }
172
+ }
173
+ setupEventListeners() {
174
+ const input = this.elementRef.nativeElement;
175
+ // Input change listener (native checkbox change)
176
+ const changeListener = this.renderer.listen(input, 'change', () => {
177
+ this.onValueChange();
178
+ });
179
+ this.listeners.push(changeListener);
180
+ // Listen for label clicks to ensure focus is maintained
181
+ const parent = input.parentElement;
182
+ if (parent) {
183
+ const labelClickListener = this.renderer.listen(parent, 'click', (event) => {
184
+ const target = event.target;
185
+ // If clicking on a label that targets our input, ensure focus
186
+ if (target.tagName === 'LABEL' && target.getAttribute('for') === this.name) {
187
+ // Small delay to ensure the label click is processed first
188
+ setTimeout(() => {
189
+ input.focus();
190
+ }, 0);
191
+ }
192
+ });
193
+ this.listeners.push(labelClickListener);
194
+ }
195
+ }
196
+ applyCheckboxStyles() {
197
+ // Style the input directly without moving DOM elements
198
+ const styles = `
199
+ /* Complete reset and custom styling for our checkbox */
200
+ input[type="checkbox"].ap-checkbox-styled {
201
+ /* Targeted reset of problematic properties */
202
+ appearance: none !important;
203
+ -webkit-appearance: none !important;
204
+ -moz-appearance: none !important;
205
+
206
+ /* Our custom styling - use !important to override any global styles */
207
+ display: inline-block !important;
208
+ width: 16px !important;
209
+ height: 16px !important;
210
+ min-width: 16px !important;
211
+ min-height: 16px !important;
212
+ margin: 0 !important;
213
+ padding: 0 !important;
214
+ border: 1px solid var(--ref-color-grey-60);
215
+ border-radius: var(--sys-border-radius-sm);
216
+ background: var(--ref-color-white);
217
+ background-color: var(--ref-color-white);
218
+ box-sizing: border-box;
219
+ position: relative;
220
+ cursor: pointer;
221
+ vertical-align: middle;
222
+
223
+ /* Ensure no other styles can interfere */
224
+ box-shadow: none;
225
+ text-decoration: none;
226
+ font: inherit;
227
+ color: inherit;
228
+ letter-spacing: normal;
229
+ word-spacing: normal;
230
+ text-transform: none;
231
+ text-indent: 0;
232
+ text-shadow: none;
233
+ text-align: start;
234
+ }
235
+
236
+ /* Hover state */
237
+ input[type="checkbox"].ap-checkbox-styled:hover {
238
+ border-color: var(--ref-color-grey-80);
239
+ }
240
+
241
+ /* Active/pressed state */
242
+ input[type="checkbox"].ap-checkbox-styled:active {
243
+ border-color: var(--ref-color-grey-100);
244
+ }
245
+
246
+ /* Checked state */
247
+ input[type="checkbox"].ap-checkbox-styled:checked {
248
+ background: var(--ref-color-electric-blue-100);
249
+ border-color: var(--ref-color-electric-blue-100);
250
+ }
251
+
252
+ /* Checked hover state */
253
+ input[type="checkbox"].ap-checkbox-styled:checked:hover {
254
+ background: var(--ref-color-electric-blue-80);
255
+ border-color: var(--ref-color-electric-blue-100);
256
+ }
257
+
258
+ /* Checked active/pressed state */
259
+ input[type="checkbox"].ap-checkbox-styled:checked:active {
260
+ background: var(--ref-color-electric-blue-60);
261
+ border-color: var(--ref-color-electric-blue-100);
262
+ }
263
+
264
+ /* Indeterminate state */
265
+ input[type="checkbox"].ap-checkbox-styled:indeterminate {
266
+ background: var(--ref-color-electric-blue-100);
267
+ border-color: var(--ref-color-electric-blue-100);
268
+ }
269
+
270
+ /* Disabled state */
271
+ input[type="checkbox"].ap-checkbox-styled:disabled {
272
+ border-color: var(--ref-color-grey-20);
273
+ background: var(--ref-color-grey-10);
274
+ cursor: default;
275
+ }
276
+
277
+ input[type="checkbox"].ap-checkbox-styled:disabled:checked {
278
+ background: var(--ref-color-grey-20);
279
+ }
280
+
281
+ /* Focus state - only show on hover-capable devices like the component */
282
+ @media (hover: hover) {
283
+ input[type="checkbox"].ap-checkbox-styled:focus:not(.disabled) {
284
+ outline: 3px solid var(--ref-color-electric-blue-100) !important;
285
+ outline-offset: 1px !important;
286
+ }
287
+ }
288
+
289
+ /* Label styling - targets labels that follow our wrapper containing styled checkboxes */
290
+ span:has(input[type="checkbox"].ap-checkbox-styled) + label {
291
+ display: flex;
292
+ align-items: center;
293
+ font-family: var(--comp-forms-label-font-family);
294
+ font-size: var(--comp-forms-label-size);
295
+ font-weight: var(--comp-forms-label-font-weight);
296
+ line-height: var(--comp-forms-label-line-height);
297
+ color: var(--comp-forms-label-text-color);
298
+ }
299
+
300
+ /* Empty label styling */
301
+ span:has(input[type="checkbox"].ap-checkbox-styled) + label:empty {
302
+ display: none;
303
+ }
304
+
305
+ /* Disabled label styling */
306
+ span:has(input[type="checkbox"].ap-checkbox-styled:disabled) + label {
307
+ color: var(--ref-color-grey-60);
308
+ }
309
+
310
+ /* Label hover styling */
311
+ span:has(input[type="checkbox"].ap-checkbox-styled) + label:hover:not(.disabled) {
312
+ cursor: pointer;
313
+ }
314
+
315
+ /* Disabled label hover */
316
+ span:has(input[type="checkbox"].ap-checkbox-styled:disabled) + label:hover {
317
+ cursor: default;
318
+ }
319
+ `;
320
+ // Create and append style element
321
+ this.styleElement = this.renderer.createElement('style');
322
+ this.renderer.appendChild(this.styleElement, this.renderer.createText(styles));
323
+ this.renderer.appendChild(document.head, this.styleElement);
324
+ }
325
+ onBlur() {
326
+ this._onTouched();
327
+ }
328
+ onValueChange() {
329
+ if (!this.disabled) {
330
+ const input = this.elementRef.nativeElement;
331
+ if (this._indeterminate) {
332
+ // When indeterminate, clicking should go to checked state
333
+ this._checked = true;
334
+ this._indeterminate = false;
335
+ input.checked = true;
336
+ input.indeterminate = false;
337
+ }
338
+ else {
339
+ // Normal toggle behavior
340
+ this._checked = input.checked;
341
+ }
342
+ this.updateCheckmarkVisibility();
343
+ this.change.emit(this._checked);
344
+ this._controlValueAccessorChangeFn(this._checked);
345
+ }
346
+ }
347
+ // ControlValueAccessor implementation
348
+ writeValue(value) {
349
+ this._checked = value;
350
+ const input = this.elementRef.nativeElement;
351
+ input.checked = value;
352
+ // Ensure indeterminate state is properly set
353
+ input.indeterminate = this._indeterminate;
354
+ this.updateCheckmarkVisibility();
355
+ }
356
+ registerOnChange(fn) {
357
+ this._controlValueAccessorChangeFn = fn;
358
+ }
359
+ registerOnTouched(fn) {
360
+ this._onTouched = fn;
361
+ }
362
+ setDisabledState(isDisabled) {
363
+ this.disabled = isDisabled;
364
+ const input = this.elementRef.nativeElement;
365
+ input.disabled = isDisabled;
366
+ }
367
+ validate() {
368
+ const isNotValid = !this._checked && this.required;
369
+ return (isNotValid && {
370
+ invalid: true,
371
+ });
372
+ }
373
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CheckboxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
374
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.9", type: CheckboxDirective, isStandalone: true, selector: "input[type=\"checkbox\"][apCheckbox]", inputs: { ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"], ariaDescribedby: ["aria-describedby", "ariaDescribedby"], disabled: ["disabled", "disabled", booleanAttribute], indeterminate: ["indeterminate", "indeterminate", booleanAttribute], checked: "checked", required: ["required", "required", booleanAttribute], name: "name" }, outputs: { change: "change" }, host: { listeners: { "blur": "onBlur()" }, properties: { "disabled": "disabled", "required": "required", "checked": "checked", "attr.aria-label": "ariaLabel", "attr.aria-labelledby": "ariaLabelledby", "attr.aria-describedby": "ariaDescribedby", "attr.data-test": "name", "id": "name" } }, providers: [
375
+ AP_CHECKBOX_DIRECTIVE_CONTROL_VALUE_ACCESSOR,
376
+ {
377
+ provide: NG_VALIDATORS,
378
+ useExisting: CheckboxDirective,
379
+ multi: true,
380
+ },
381
+ ], ngImport: i0 });
382
+ }
383
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CheckboxDirective, decorators: [{
384
+ type: Directive,
385
+ args: [{
386
+ selector: 'input[type="checkbox"][apCheckbox]',
387
+ standalone: true,
388
+ providers: [
389
+ AP_CHECKBOX_DIRECTIVE_CONTROL_VALUE_ACCESSOR,
390
+ {
391
+ provide: NG_VALIDATORS,
392
+ useExisting: CheckboxDirective,
393
+ multi: true,
394
+ },
395
+ ],
396
+ host: {
397
+ '(blur)': 'onBlur()',
398
+ '[disabled]': 'disabled',
399
+ '[required]': 'required',
400
+ '[checked]': 'checked',
401
+ '[attr.aria-label]': 'ariaLabel',
402
+ '[attr.aria-labelledby]': 'ariaLabelledby',
403
+ '[attr.aria-describedby]': 'ariaDescribedby',
404
+ '[attr.data-test]': 'name',
405
+ '[id]': 'name',
406
+ },
407
+ }]
408
+ }], propDecorators: { ariaLabel: [{
409
+ type: Input,
410
+ args: ['aria-label']
411
+ }], ariaLabelledby: [{
412
+ type: Input,
413
+ args: ['aria-labelledby']
414
+ }], ariaDescribedby: [{
415
+ type: Input,
416
+ args: ['aria-describedby']
417
+ }], disabled: [{
418
+ type: Input,
419
+ args: [{
420
+ transform: booleanAttribute,
421
+ }]
422
+ }], indeterminate: [{
423
+ type: Input,
424
+ args: [{
425
+ transform: booleanAttribute,
426
+ }]
427
+ }], checked: [{
428
+ type: Input
429
+ }], required: [{
430
+ type: Input,
431
+ args: [{
432
+ transform: booleanAttribute,
433
+ }]
434
+ }], name: [{
435
+ type: Input,
436
+ args: [{
437
+ required: true,
438
+ }]
439
+ }], change: [{
440
+ type: Output
441
+ }] } });
442
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL2RpcmVjdGl2ZXMvc3JjL2NoZWNrYm94LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRixPQUFPLEVBQ0gsZ0JBQWdCLEVBRWhCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEdBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXhGLE1BQU0sQ0FBQyxNQUFNLDRDQUE0QyxHQUFHO0lBQ3hELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztJQUNoRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFFRjs7Ozs7OztFQU9FO0FBd0JGLE1BQU0sT0FBTyxpQkFBaUI7SUFDVCxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hDLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUE0QixDQUFBLENBQUMsQ0FBQztJQUNsRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLGFBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVyQyxTQUFTLENBQVU7SUFDZCxjQUFjLENBQVU7SUFDdkIsZUFBZSxDQUFVO0lBS3BELFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsSUFHSSxhQUFhLENBQUMsYUFBc0I7UUFDcEMsSUFBSSxhQUFhLEVBQUUsQ0FB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QkFDeEIsWUFBWSxFQUFFLFVBQVU7d0JBQ3hCLFdBQVcsRUFBRSxTQUFTO3dCQUN0QixtQkFBbUIsRUFBRSxXQUFXO3dCQUNoQyx3QkFBd0IsRUFBRSxnQkFBZ0I7d0JBQzFDLHlCQUF5QixFQUFFLGlCQUFpQjt3QkFDNUMsa0JBQWtCLEVBQUUsTUFBTTt3QkFDMUIsTUFBTSxFQUFFLE1BQU07cUJBQ2pCO2lCQUNKOzhCQU93QixTQUFTO3NCQUE3QixLQUFLO3VCQUFDLFlBQVk7Z0JBQ08sY0FBYztzQkFBdkMsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBQ0csZUFBZTtzQkFBekMsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBS3pCLFFBQVE7c0JBSFAsS0FBSzt1QkFBQzt3QkFDSCxTQUFTLEVBQUUsZ0JBQWdCO3FCQUM5QjtnQkFNRyxhQUFhO3NCQUhoQixLQUFLO3VCQUFDO3dCQUNILFNBQVMsRUFBRSxnQkFBZ0I7cUJBQzlCO2dCQXFCRyxPQUFPO3NCQURWLEtBQUs7Z0JBZ0JOLFFBQVE7c0JBSFAsS0FBSzt1QkFBQzt3QkFDSCxTQUFTLEVBQUUsZ0JBQWdCO3FCQUM5QjtnQkFNRyxJQUFJO3NCQUhQLEtBQUs7dUJBQUM7d0JBQ0gsUUFBUSxFQUFFLElBQUk7cUJBQ2pCO2dCQVNrQixNQUFNO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBDaGVjaywgU3ltYm9sQ29tcG9uZW50LCBTeW1ib2xSZWdpc3RyeSB9IGZyb20gJ0BhZ29yYXB1bHNlL3VpLXN5bWJvbCc7XG5pbXBvcnQge1xuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmV4cG9ydCBjb25zdCBBUF9DSEVDS0JPWF9ESVJFQ1RJVkVfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveERpcmVjdGl2ZSksXG4gICAgbXVsdGk6IHRydWUsXG59O1xuXG4vKlxuICAgIEhvc3QgYmluZGluZ3MgaXMgaW1wb3J0YW50IGhlcmU6XG4gICAgLSBUaGlzIHByb3ZpZGVzIGVuY2Fwc3VsYXRpb24gYW5kIHJlYWN0aXZpdHkgcmVnYXJkbGVzcyBvZiBob3cgdGhlIGRpcmVjdGl2ZSBpcyB1c2VkIGluIHRlbXBsYXRlcy5cbiAgICAtIEl0IGd1YXJhbnRlZXMgdGhhdCBwcm9wZXJ0aWVzIGxpa2UgY2hlY2tlZCwgZGlzYWJsZWQsIHJlcXVpcmVkLCBhbmQgQVJJQSBhdHRyaWJ1dGVzIGFsd2F5cyByZWZsZWN0XG4gICAgb25seSB0aGUgZGlyZWN0aXZlJ3MgbG9naWMsIG5vdCBqdXN0IGNvbnN1bWVyIGJpbmRpbmdzLlxuICAgIC0gU28gd2UgbmVlZCB0byBoYXZlIGhvc3QgYmluZGluZ3MgZm9yIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHdlIHdhbnQgdG8gY29udHJvbC5cbiAgICAtIFdlIGNvdWxkIGFsc28gdXNlIEBIb3N0TGlzdGVuZXIuXG4qL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl1bYXBDaGVja2JveF0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIEFQX0NIRUNLQk9YX0RJUkVDVElWRV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IENoZWNrYm94RGlyZWN0aXZlLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoYmx1ciknOiAnb25CbHVyKCknLFxuICAgICAgICAnW2Rpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgICAgICdbcmVxdWlyZWRdJzogJ3JlcXVpcmVkJyxcbiAgICAgICAgJ1tjaGVja2VkXSc6ICdjaGVja2VkJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtbGFiZWxdJzogJ2FyaWFMYWJlbCcsXG4gICAgICAgICdbYXR0ci5hcmlhLWxhYmVsbGVkYnldJzogJ2FyaWFMYWJlbGxlZGJ5JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZGVzY3JpYmVkYnldJzogJ2FyaWFEZXNjcmliZWRieScsXG4gICAgICAgICdbYXR0ci5kYXRhLXRlc3RdJzogJ25hbWUnLFxuICAgICAgICAnW2lkXSc6ICduYW1lJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDaGVja2JveERpcmVjdGl2ZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzeW1ib2xSZWdpc3RyeSA9IGluamVjdChTeW1ib2xSZWdpc3RyeSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXIgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWwnKSBhcmlhTGFiZWw/OiBzdHJpbmc7XG4gICAgQElucHV0KCdhcmlhLWxhYmVsbGVkYnknKSBhcmlhTGFiZWxsZWRieT86IHN0cmluZztcbiAgICBASW5wdXQoJ2FyaWEtZGVzY3JpYmVkYnknKSBhcmlhRGVzY3JpYmVkYnk/OiBzdHJpbmc7XG4gICAgXG4gICAgQElucHV0KHtcbiAgICAgICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxuICAgIH0pXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBcbiAgICBASW5wdXQoe1xuICAgICAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgfSlcbiAgICBzZXQgaW5kZXRlcm1pbmF0ZShpbmRldGVybWluYXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChpbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgaW5wdXQuaW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSB1cGRhdGUgdmlzaWJpbGl0eSBpZiBjb250YWluZXJzIGFyZSByZWFkeVxuICAgICAgICBpZiAodGhpcy5jaGVja21hcmtDb250YWluZXIgJiYgdGhpcy5pbmRldGVybWluYXRlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrbWFya1Zpc2liaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXRlcm1pbmF0ZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBcbiAgICBzZXQgY2hlY2tlZChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrZWQgPSBjaGVja2VkO1xuICAgICAgICAvLyBPbmx5IHVwZGF0ZSB2aXNpYmlsaXR5IGlmIGNvbnRhaW5lcnMgYXJlIHJlYWR5XG4gICAgICAgIGlmICh0aGlzLmNoZWNrbWFya0NvbnRhaW5lciAmJiB0aGlzLmluZGV0ZXJtaW5hdGVDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hlY2ttYXJrVmlzaWJpbGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tlZDtcbiAgICB9XG5cbiAgICBASW5wdXQoe1xuICAgICAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgfSlcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KHtcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICAgIEBPdXRwdXQoKSByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgX2NoZWNrZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbmFtZSA9ICcnO1xuICAgIHByaXZhdGUgX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIFxuICAgIHByaXZhdGUgbGlzdGVuZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICAgIHByaXZhdGUgc3R5bGVFbGVtZW50ITogSFRNTFN0eWxlRWxlbWVudDtcbiAgICBwcml2YXRlIHdyYXBwZXIhOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIGNoZWNrbWFya0NvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgaW5kZXRlcm1pbmF0ZUNvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgc3ltYm9sQ29tcG9uZW50PzogQ29tcG9uZW50UmVmPFN5bWJvbENvbXBvbmVudD47XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zeW1ib2xSZWdpc3RyeS5yZWdpc3RlclN5bWJvbHMoW2FwQ2hlY2tdKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGVja2JveFN0cnVjdHVyZSgpO1xuICAgICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCh1bmxpc3RlbiA9PiB1bmxpc3RlbigpKTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50ICYmIHRoaXMuc3R5bGVFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN5bWJvbENvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5zeW1ib2xDb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoZWNrbWFya0NvbnRhaW5lciAmJiB0aGlzLmNoZWNrbWFya0NvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrbWFya0NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2hlY2ttYXJrQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRldGVybWluYXRlQ29udGFpbmVyICYmIHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVDb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmluZGV0ZXJtaW5hdGVDb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1vdmUgaW5wdXQgYmFjayBvdXQgb2Ygd3JhcHBlciBhbmQgcmVtb3ZlIHdyYXBwZXJcbiAgICAgICAgaWYgKHRoaXMud3JhcHBlciAmJiB0aGlzLndyYXBwZXIucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHRoaXMud3JhcHBlci5wYXJlbnROb2RlLCBpbnB1dCwgdGhpcy53cmFwcGVyKTtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMud3JhcHBlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNoZWNrYm94U3RydWN0dXJlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBpbnB1dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy8gSG90IHRha2UgLSBJbnB1dCBkb2Vzbid0IG5lZWQgcG9zaXRpb25pbmcgc2luY2UgaXQgd2lsbCBiZSB3cmFwcGVkXG4gICAgICAgIFxuICAgICAgICAvLyBNYWtlIGlucHV0J3MgcGFyZW50IHVzZSBpbmxpbmUtZmxleCBmb3IgYWxpZ25tZW50XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGFyZW50LCAnZGlzcGxheScsICdpbmxpbmUtZmxleCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwYXJlbnQsICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGFyZW50LCAnZ2FwJywgJ3ZhcigtLXJlZi1zcGFjaW5nLXh4cyknKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpbnB1dCwgJ2FwLWNoZWNrYm94LXN0eWxlZCcpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5jaGVja21hcmtDb250YWluZXIgPSB0aGlzLmNyZWF0ZU92ZXJsYXlDb250YWluZXIoJ2FwLWNoZWNrYm94LWNoZWNrbWFyaycpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy53cmFwcGVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy53cmFwcGVyLCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLndyYXBwZXIsICdkaXNwbGF5JywgJ2lubGluZS1mbGV4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy53cmFwcGVyLCAnYWxpZ24taXRlbXMnLCAnY2VudGVyJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy53cmFwcGVyLCAndmVydGljYWwtYWxpZ24nLCAnbWlkZGxlJyk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnQsIHRoaXMud3JhcHBlciwgaW5wdXQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlciwgaW5wdXQpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLndyYXBwZXIsIHRoaXMuY2hlY2ttYXJrQ29udGFpbmVyKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lciA9IHRoaXMuY3JlYXRlT3ZlcmxheUNvbnRhaW5lcignYXAtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZScpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLndyYXBwZXIsIHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lcik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmNyZWF0ZUNoZWNrbWFya1N5bWJvbCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUluZGV0ZXJtaW5hdGVCYXIoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYXBwbHlDaGVja2JveFN0eWxlcygpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja21hcmtWaXNpYmlsaXR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5Q29udGFpbmVyKGNsYXNzTmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsIGNsYXNzTmFtZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICd0b3AnLCAnNTAlJyk7IFxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ2xlZnQnLCAnNTAlJyk7ICAgXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ3dpZHRoJywgJ2F1dG8nKTsgXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAnaGVpZ2h0JywgJ2F1dG8nKTsgXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAnZGlzcGxheScsICdmbGV4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICdvcGFjaXR5JywgJzAnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICd6LWluZGV4JywgJzEnKTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNoZWNrbWFya1N5bWJvbCgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBzeW1ib2wgY29tcG9uZW50XG4gICAgICAgIHRoaXMuc3ltYm9sQ29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChTeW1ib2xDb21wb25lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gU2V0IGlucHV0cyB1c2luZyBzZXRJbnB1dCBtZXRob2QgZm9yIHNpZ25hbC1iYXNlZCBpbnB1dHNcbiAgICAgICAgdGhpcy5zeW1ib2xDb21wb25lbnQuc2V0SW5wdXQoJ3N5bWJvbElkJywgJ2NoZWNrJyk7XG4gICAgICAgIHRoaXMuc3ltYm9sQ29tcG9uZW50LnNldElucHV0KCdjb2xvcicsICd3aGl0ZScpO1xuICAgICAgICB0aGlzLnN5bWJvbENvbXBvbmVudC5zZXRJbnB1dCgnc2l6ZScsIDEwKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgc3ltYm9sIHRvIG91ciBjaGVja21hcmsgY29udGFpbmVyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5jaGVja21hcmtDb250YWluZXIsIHRoaXMuc3ltYm9sQ29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlSW5kZXRlcm1pbmF0ZUJhcigpOiB2b2lkIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbmRldGVybWluYXRlIGJhciBlbGVtZW50IGV4YWN0bHkgbGlrZSB0aGUgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGJhciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJhciwgJ2hlaWdodCcsICcxLjVweCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJhciwgJ2JhY2tncm91bmQnLCAndmFyKC0tcmVmLWNvbG9yLXdoaXRlKScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJhciwgJ3dpZHRoJywgJzhweCcpO1xuICAgICAgICBcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBiYXIgdG8gdGhlIGluZGV0ZXJtaW5hdGUgY29udGFpbmVyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5pbmRldGVybWluYXRlQ29udGFpbmVyLCBiYXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2hlY2ttYXJrVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2ttYXJrQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBvcGFjaXR5ID0gdGhpcy5fY2hlY2tlZCAmJiAhdGhpcy5faW5kZXRlcm1pbmF0ZSA/ICcxJyA6ICcwJztcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jaGVja21hcmtDb250YWluZXIsICdvcGFjaXR5Jywgb3BhY2l0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc3Qgb3BhY2l0eSA9IHRoaXMuX2luZGV0ZXJtaW5hdGUgJiYgIXRoaXMuX2NoZWNrZWQgPyAnMScgOiAnMCc7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lciwgJ29wYWNpdHknLCBvcGFjaXR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIElucHV0IGNoYW5nZSBsaXN0ZW5lciAobmF0aXZlIGNoZWNrYm94IGNoYW5nZSlcbiAgICAgICAgY29uc3QgY2hhbmdlTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihpbnB1dCwgJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChjaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIFxuICAgICAgICAvLyBMaXN0ZW4gZm9yIGxhYmVsIGNsaWNrcyB0byBlbnN1cmUgZm9jdXMgaXMgbWFpbnRhaW5lZFxuICAgICAgICBjb25zdCBwYXJlbnQgPSBpbnB1dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbENsaWNrTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihwYXJlbnQsICdjbGljaycsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvLyBJZiBjbGlja2luZyBvbiBhIGxhYmVsIHRoYXQgdGFyZ2V0cyBvdXIgaW5wdXQsIGVuc3VyZSBmb2N1c1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0xBQkVMJyAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKCdmb3InKSA9PT0gdGhpcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSB0aGUgbGFiZWwgY2xpY2sgaXMgcHJvY2Vzc2VkIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxhYmVsQ2xpY2tMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5Q2hlY2tib3hTdHlsZXMoKTogdm9pZCB7XG4gICAgICAgIC8vIFN0eWxlIHRoZSBpbnB1dCBkaXJlY3RseSB3aXRob3V0IG1vdmluZyBET00gZWxlbWVudHNcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gYFxuICAgICAgICAgICAgLyogQ29tcGxldGUgcmVzZXQgYW5kIGN1c3RvbSBzdHlsaW5nIGZvciBvdXIgY2hlY2tib3ggKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQge1xuICAgICAgICAgICAgICAgIC8qIFRhcmdldGVkIHJlc2V0IG9mIHByb2JsZW1hdGljIHByb3BlcnRpZXMgKi9cbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLyogT3VyIGN1c3RvbSBzdHlsaW5nIC0gdXNlICFpbXBvcnRhbnQgdG8gb3ZlcnJpZGUgYW55IGdsb2JhbCBzdHlsZXMgKi9cbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIG1pbi13aWR0aDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDE2cHggIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcmVmLWNvbG9yLWdyZXktNjApO1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXN5cy1ib3JkZXItcmFkaXVzLXNtKTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1yZWYtY29sb3Itd2hpdGUpO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJlZi1jb2xvci13aGl0ZSk7XG4gICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLyogRW5zdXJlIG5vIG90aGVyIHN0eWxlcyBjYW4gaW50ZXJmZXJlICovXG4gICAgICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgICAgICAgICAgZm9udDogaW5oZXJpdDtcbiAgICAgICAgICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgICAgICAgICAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICAgICAgICAgICAgICAgIHdvcmQtc3BhY2luZzogbm9ybWFsO1xuICAgICAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICAgICAgICAgICAgICAgIHRleHQtaW5kZW50OiAwO1xuICAgICAgICAgICAgICAgIHRleHQtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiBIb3ZlciBzdGF0ZSAqL1xuICAgICAgICAgICAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLmFwLWNoZWNrYm94LXN0eWxlZDpob3ZlciB7XG4gICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZ3JleS04MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIEFjdGl2ZS9wcmVzc2VkIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmFjdGl2ZSB7XG4gICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZ3JleS0xMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiBDaGVja2VkIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmNoZWNrZWQge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZWxlY3RyaWMtYmx1ZS0xMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiBDaGVja2VkIGhvdmVyIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmNoZWNrZWQ6aG92ZXIge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTgwKTtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIENoZWNrZWQgYWN0aXZlL3ByZXNzZWQgc3RhdGUgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6Y2hlY2tlZDphY3RpdmUge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTYwKTtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIEluZGV0ZXJtaW5hdGUgc3RhdGUgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6aW5kZXRlcm1pbmF0ZSB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcmVmLWNvbG9yLWVsZWN0cmljLWJsdWUtMTAwKTtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIERpc2FibGVkIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmRpc2FibGVkIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1ncmV5LTIwKTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1yZWYtY29sb3ItZ3JleS0xMCk7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmRpc2FibGVkOmNoZWNrZWQge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1ncmV5LTIwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogRm9jdXMgc3RhdGUgLSBvbmx5IHNob3cgb24gaG92ZXItY2FwYWJsZSBkZXZpY2VzIGxpa2UgdGhlIGNvbXBvbmVudCAqL1xuICAgICAgICAgICAgQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmZvY3VzOm5vdCguZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogM3B4IHNvbGlkIHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCkgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogTGFiZWwgc3R5bGluZyAtIHRhcmdldHMgbGFiZWxzIHRoYXQgZm9sbG93IG91ciB3cmFwcGVyIGNvbnRhaW5pbmcgc3R5bGVkIGNoZWNrYm94ZXMgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQpICsgbGFiZWwge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICAgICAgICBmb250LWZhbWlseTogdmFyKC0tY29tcC1mb3Jtcy1sYWJlbC1mb250LWZhbWlseSk7XG4gICAgICAgICAgICAgICAgZm9udC1zaXplOiB2YXIoLS1jb21wLWZvcm1zLWxhYmVsLXNpemUpO1xuICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1jb21wLWZvcm1zLWxhYmVsLWZvbnQtd2VpZ2h0KTtcbiAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogdmFyKC0tY29tcC1mb3Jtcy1sYWJlbC1saW5lLWhlaWdodCk7XG4gICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWNvbXAtZm9ybXMtbGFiZWwtdGV4dC1jb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIEVtcHR5IGxhYmVsIHN0eWxpbmcgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQpICsgbGFiZWw6ZW1wdHkge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIERpc2FibGVkIGxhYmVsIHN0eWxpbmcgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6ZGlzYWJsZWQpICsgbGFiZWwge1xuICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZ3JleS02MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIExhYmVsIGhvdmVyIHN0eWxpbmcgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQpICsgbGFiZWw6aG92ZXI6bm90KC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogRGlzYWJsZWQgbGFiZWwgaG92ZXIgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6ZGlzYWJsZWQpICsgbGFiZWw6aG92ZXIge1xuICAgICAgICAgICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBhbmQgYXBwZW5kIHN0eWxlIGVsZW1lbnRcbiAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChzdHlsZXMpKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5oZWFkLCB0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgfVxuXG5cbiAgICBvbkJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25WYWx1ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gaW5kZXRlcm1pbmF0ZSwgY2xpY2tpbmcgc2hvdWxkIGdvIHRvIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaW5wdXQuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWwgdG9nZ2xlIGJlaGF2aW9yXG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hlY2ttYXJrVmlzaWJpbGl0eSgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLl9jaGVja2VkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy5fY2hlY2tlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jaGVja2VkID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSB2YWx1ZTtcbiAgICAgICAgLy8gRW5zdXJlIGluZGV0ZXJtaW5hdGUgc3RhdGUgaXMgcHJvcGVybHkgc2V0XG4gICAgICAgIGlucHV0LmluZGV0ZXJtaW5hdGUgPSB0aGlzLl9pbmRldGVybWluYXRlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrbWFya1Zpc2liaWxpdHkoKTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaW5wdXQuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHZhbGlkYXRlKCkge1xuICAgICAgICBjb25zdCBpc05vdFZhbGlkID0gIXRoaXMuX2NoZWNrZWQgJiYgdGhpcy5yZXF1aXJlZDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzTm90VmFsaWQgJiYge1xuICAgICAgICAgICAgICAgIGludmFsaWQ6IHRydWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxufSJdfQ==
@@ -1,8 +1,9 @@
1
1
  export * from './autosize-textarea.directive';
2
2
  export * from './base-button.directive';
3
+ export * from './checkbox.directive';
3
4
  export * from './default-image.directive';
4
5
  export * from './ellipsis.directive';
5
6
  export * from './equal-validator.directive';
6
7
  export * from './frozen-gif.directive';
7
8
  export * from './multi-style-text.directive';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9kaXJlY3RpdmVzL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsOEJBQThCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2F1dG9zaXplLXRleHRhcmVhLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2Jhc2UtYnV0dG9uLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2RlZmF1bHQtaW1hZ2UuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZWxsaXBzaXMuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZXF1YWwtdmFsaWRhdG9yLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2Zyb3plbi1naWYuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbXVsdGktc3R5bGUtdGV4dC5kaXJlY3RpdmUnO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdWktY29tcG9uZW50cy9kaXJlY3RpdmVzL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXV0b3NpemUtdGV4dGFyZWEuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZS1idXR0b24uZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vY2hlY2tib3guZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZGVmYXVsdC1pbWFnZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9lbGxpcHNpcy5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9lcXVhbC12YWxpZGF0b3IuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZnJvemVuLWdpZi5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9tdWx0aS1zdHlsZS10ZXh0LmRpcmVjdGl2ZSc7XG4iXX0=