@ajsf/material 0.6.0-beta.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/ajsf-material.d.ts +1 -0
  2. package/{esm2015/ajsf-material.js → esm2020/ajsf-material.mjs} +0 -0
  3. package/{esm2015/lib/angular-flex-monkey-patch.js → esm2020/lib/angular-flex-monkey-patch.mjs} +0 -0
  4. package/esm2020/lib/material-design-framework.component.mjs +102 -0
  5. package/esm2020/lib/material-design-framework.module.mjs +123 -0
  6. package/esm2020/lib/material-design.framework.mjs +57 -0
  7. package/esm2020/lib/widgets/flex-layout-root.component.mjs +76 -0
  8. package/esm2020/lib/widgets/flex-layout-section.component.mjs +359 -0
  9. package/esm2020/lib/widgets/material-add-reference.component.mjs +66 -0
  10. package/esm2020/lib/widgets/material-button-group.component.mjs +95 -0
  11. package/esm2020/lib/widgets/material-button.component.mjs +81 -0
  12. package/esm2020/lib/widgets/material-checkbox.component.mjs +174 -0
  13. package/esm2020/lib/widgets/material-checkboxes.component.mjs +140 -0
  14. package/esm2020/lib/widgets/material-chip-list.component.mjs +35 -0
  15. package/esm2020/lib/widgets/material-datepicker.component.mjs +150 -0
  16. package/esm2020/lib/widgets/material-file.component.mjs +35 -0
  17. package/esm2020/lib/widgets/material-input.component.mjs +158 -0
  18. package/esm2020/lib/widgets/material-number.component.mjs +154 -0
  19. package/esm2020/lib/widgets/material-one-of.component.mjs +35 -0
  20. package/esm2020/lib/widgets/material-radios.component.mjs +131 -0
  21. package/esm2020/lib/widgets/material-select.component.mjs +195 -0
  22. package/esm2020/lib/widgets/material-slider.component.mjs +88 -0
  23. package/esm2020/lib/widgets/material-stepper.component.mjs +35 -0
  24. package/esm2020/lib/widgets/material-tabs.component.mjs +91 -0
  25. package/esm2020/lib/widgets/material-textarea.component.mjs +143 -0
  26. package/{esm2015/lib/widgets/public_api.js → esm2020/lib/widgets/public_api.mjs} +0 -0
  27. package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
  28. package/fesm2015/ajsf-material.mjs +2427 -0
  29. package/fesm2015/ajsf-material.mjs.map +1 -0
  30. package/fesm2020/ajsf-material.mjs +2420 -0
  31. package/fesm2020/ajsf-material.mjs.map +1 -0
  32. package/lib/material-design-framework.component.d.ts +3 -0
  33. package/lib/material-design-framework.module.d.ts +51 -2
  34. package/lib/material-design.framework.d.ts +3 -0
  35. package/lib/widgets/flex-layout-root.component.d.ts +3 -0
  36. package/lib/widgets/flex-layout-section.component.d.ts +3 -0
  37. package/lib/widgets/material-add-reference.component.d.ts +3 -0
  38. package/lib/widgets/material-button-group.component.d.ts +3 -0
  39. package/lib/widgets/material-button.component.d.ts +3 -0
  40. package/lib/widgets/material-checkbox.component.d.ts +3 -0
  41. package/lib/widgets/material-checkboxes.component.d.ts +3 -0
  42. package/lib/widgets/material-chip-list.component.d.ts +3 -0
  43. package/lib/widgets/material-datepicker.component.d.ts +3 -0
  44. package/lib/widgets/material-file.component.d.ts +3 -0
  45. package/lib/widgets/material-input.component.d.ts +3 -0
  46. package/lib/widgets/material-number.component.d.ts +3 -0
  47. package/lib/widgets/material-one-of.component.d.ts +3 -0
  48. package/lib/widgets/material-radios.component.d.ts +3 -0
  49. package/lib/widgets/material-select.component.d.ts +3 -0
  50. package/lib/widgets/material-slider.component.d.ts +3 -0
  51. package/lib/widgets/material-stepper.component.d.ts +3 -0
  52. package/lib/widgets/material-tabs.component.d.ts +3 -0
  53. package/lib/widgets/material-textarea.component.d.ts +3 -0
  54. package/package.json +26 -14
  55. package/ajsf-material.metadata.json +0 -1
  56. package/bundles/ajsf-material.umd.js +0 -1422
  57. package/bundles/ajsf-material.umd.js.map +0 -1
  58. package/esm2015/lib/material-design-framework.component.js +0 -101
  59. package/esm2015/lib/material-design-framework.module.js +0 -80
  60. package/esm2015/lib/material-design.framework.js +0 -54
  61. package/esm2015/lib/widgets/flex-layout-root.component.js +0 -55
  62. package/esm2015/lib/widgets/flex-layout-section.component.js +0 -221
  63. package/esm2015/lib/widgets/material-add-reference.component.js +0 -53
  64. package/esm2015/lib/widgets/material-button-group.component.js +0 -63
  65. package/esm2015/lib/widgets/material-button.component.js +0 -60
  66. package/esm2015/lib/widgets/material-checkbox.component.js +0 -109
  67. package/esm2015/lib/widgets/material-checkboxes.component.js +0 -101
  68. package/esm2015/lib/widgets/material-chip-list.component.js +0 -33
  69. package/esm2015/lib/widgets/material-datepicker.component.js +0 -90
  70. package/esm2015/lib/widgets/material-file.component.js +0 -33
  71. package/esm2015/lib/widgets/material-input.component.js +0 -95
  72. package/esm2015/lib/widgets/material-number.component.js +0 -97
  73. package/esm2015/lib/widgets/material-one-of.component.js +0 -33
  74. package/esm2015/lib/widgets/material-radios.component.js +0 -84
  75. package/esm2015/lib/widgets/material-select.component.js +0 -115
  76. package/esm2015/lib/widgets/material-slider.component.js +0 -60
  77. package/esm2015/lib/widgets/material-stepper.component.js +0 -33
  78. package/esm2015/lib/widgets/material-tabs.component.js +0 -69
  79. package/esm2015/lib/widgets/material-textarea.component.js +0 -88
  80. package/fesm2015/ajsf-material.js +0 -1710
  81. package/fesm2015/ajsf-material.js.map +0 -1
@@ -0,0 +1,143 @@
1
+ import { Component, Inject, Input, Optional } from '@angular/core';
2
+ import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@ajsf/core";
5
+ import * as i2 from "@angular/material/form-field";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "@angular/material/input";
8
+ import * as i5 from "@angular/forms";
9
+ export class MaterialTextareaComponent {
10
+ constructor(matFormFieldDefaultOptions, jsf) {
11
+ this.matFormFieldDefaultOptions = matFormFieldDefaultOptions;
12
+ this.jsf = jsf;
13
+ this.controlDisabled = false;
14
+ this.boundControl = false;
15
+ }
16
+ ngOnInit() {
17
+ this.options = this.layoutNode.options || {};
18
+ this.jsf.initializeControl(this);
19
+ if (!this.options.notitle && !this.options.description && this.options.placeholder) {
20
+ this.options.description = this.options.placeholder;
21
+ }
22
+ }
23
+ updateValue(event) {
24
+ this.jsf.updateValue(this, event.target.value);
25
+ }
26
+ }
27
+ MaterialTextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: MaterialTextareaComponent, deps: [{ token: MAT_FORM_FIELD_DEFAULT_OPTIONS, optional: true }, { token: i1.JsonSchemaFormService }], target: i0.ɵɵFactoryTarget.Component });
28
+ MaterialTextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.1", type: MaterialTextareaComponent, selector: "material-textarea-widget", inputs: { layoutNode: "layoutNode", layoutIndex: "layoutIndex", dataIndex: "dataIndex" }, ngImport: i0, template: `
29
+ <mat-form-field [appearance]="options?.appearance || matFormFieldDefaultOptions?.appearance || 'standard'"
30
+ [class]="options?.htmlClass || ''"
31
+ [floatLabel]="options?.floatLabel || matFormFieldDefaultOptions?.floatLabel || (options?.notitle ? 'never' : 'auto')"
32
+ [hideRequiredMarker]="options?.hideRequired ? 'true' : 'false'"
33
+ [style.width]="'100%'">
34
+ <mat-label *ngIf="!options?.notitle">{{options?.title}}</mat-label>
35
+ <span matPrefix *ngIf="options?.prefix || options?.fieldAddonLeft"
36
+ [innerHTML]="options?.prefix || options?.fieldAddonLeft"></span>
37
+ <textarea matInput *ngIf="boundControl"
38
+ [formControl]="formControl"
39
+ [attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
40
+ [attr.list]="'control' + layoutNode?._id + 'Autocomplete'"
41
+ [attr.maxlength]="options?.maxLength"
42
+ [attr.minlength]="options?.minLength"
43
+ [attr.pattern]="options?.pattern"
44
+ [required]="options?.required"
45
+ [id]="'control' + layoutNode?._id"
46
+ [name]="controlName"
47
+ [placeholder]="options?.notitle ? options?.placeholder : options?.title"
48
+ [readonly]="options?.readonly ? 'readonly' : null"
49
+ [style.width]="'100%'"
50
+ (blur)="options.showErrors = true"></textarea>
51
+ <textarea matInput *ngIf="!boundControl"
52
+ [attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
53
+ [attr.list]="'control' + layoutNode?._id + 'Autocomplete'"
54
+ [attr.maxlength]="options?.maxLength"
55
+ [attr.minlength]="options?.minLength"
56
+ [attr.pattern]="options?.pattern"
57
+ [required]="options?.required"
58
+ [disabled]="controlDisabled"
59
+ [id]="'control' + layoutNode?._id"
60
+ [name]="controlName"
61
+ [placeholder]="options?.notitle ? options?.placeholder : options?.title"
62
+ [readonly]="options?.readonly ? 'readonly' : null"
63
+ [style.width]="'100%'"
64
+ [value]="controlValue"
65
+ (input)="updateValue($event)"
66
+ (blur)="options.showErrors = true"></textarea>
67
+ <span matSuffix *ngIf="options?.suffix || options?.fieldAddonRight"
68
+ [innerHTML]="options?.suffix || options?.fieldAddonRight"></span>
69
+ <mat-hint *ngIf="options?.description && (!options?.showErrors || !options?.errorMessage)"
70
+ align="end" [innerHTML]="options?.description"></mat-hint>
71
+ </mat-form-field>
72
+ <mat-error *ngIf="options?.showErrors && options?.errorMessage"
73
+ [innerHTML]="options?.errorMessage"></mat-error>`, isInline: true, styles: ["mat-error{font-size:75%;margin-top:-1rem;margin-bottom:.5rem}::ng-deep json-schema-form mat-form-field .mat-form-field-wrapper .mat-form-field-flex .mat-form-field-infix{width:auto;width:initial}\n"], components: [{ type: i2.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatLabel, selector: "mat-label" }, { type: i2.MatPrefix, selector: "[matPrefix]" }, { type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i5.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { type: i5.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.MatSuffix, selector: "[matSuffix]" }, { type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i2.MatError, selector: "mat-error", inputs: ["id"] }] });
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.1", ngImport: i0, type: MaterialTextareaComponent, decorators: [{
75
+ type: Component,
76
+ args: [{
77
+ // tslint:disable-next-line:component-selector
78
+ selector: 'material-textarea-widget',
79
+ template: `
80
+ <mat-form-field [appearance]="options?.appearance || matFormFieldDefaultOptions?.appearance || 'standard'"
81
+ [class]="options?.htmlClass || ''"
82
+ [floatLabel]="options?.floatLabel || matFormFieldDefaultOptions?.floatLabel || (options?.notitle ? 'never' : 'auto')"
83
+ [hideRequiredMarker]="options?.hideRequired ? 'true' : 'false'"
84
+ [style.width]="'100%'">
85
+ <mat-label *ngIf="!options?.notitle">{{options?.title}}</mat-label>
86
+ <span matPrefix *ngIf="options?.prefix || options?.fieldAddonLeft"
87
+ [innerHTML]="options?.prefix || options?.fieldAddonLeft"></span>
88
+ <textarea matInput *ngIf="boundControl"
89
+ [formControl]="formControl"
90
+ [attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
91
+ [attr.list]="'control' + layoutNode?._id + 'Autocomplete'"
92
+ [attr.maxlength]="options?.maxLength"
93
+ [attr.minlength]="options?.minLength"
94
+ [attr.pattern]="options?.pattern"
95
+ [required]="options?.required"
96
+ [id]="'control' + layoutNode?._id"
97
+ [name]="controlName"
98
+ [placeholder]="options?.notitle ? options?.placeholder : options?.title"
99
+ [readonly]="options?.readonly ? 'readonly' : null"
100
+ [style.width]="'100%'"
101
+ (blur)="options.showErrors = true"></textarea>
102
+ <textarea matInput *ngIf="!boundControl"
103
+ [attr.aria-describedby]="'control' + layoutNode?._id + 'Status'"
104
+ [attr.list]="'control' + layoutNode?._id + 'Autocomplete'"
105
+ [attr.maxlength]="options?.maxLength"
106
+ [attr.minlength]="options?.minLength"
107
+ [attr.pattern]="options?.pattern"
108
+ [required]="options?.required"
109
+ [disabled]="controlDisabled"
110
+ [id]="'control' + layoutNode?._id"
111
+ [name]="controlName"
112
+ [placeholder]="options?.notitle ? options?.placeholder : options?.title"
113
+ [readonly]="options?.readonly ? 'readonly' : null"
114
+ [style.width]="'100%'"
115
+ [value]="controlValue"
116
+ (input)="updateValue($event)"
117
+ (blur)="options.showErrors = true"></textarea>
118
+ <span matSuffix *ngIf="options?.suffix || options?.fieldAddonRight"
119
+ [innerHTML]="options?.suffix || options?.fieldAddonRight"></span>
120
+ <mat-hint *ngIf="options?.description && (!options?.showErrors || !options?.errorMessage)"
121
+ align="end" [innerHTML]="options?.description"></mat-hint>
122
+ </mat-form-field>
123
+ <mat-error *ngIf="options?.showErrors && options?.errorMessage"
124
+ [innerHTML]="options?.errorMessage"></mat-error>`,
125
+ styles: [`
126
+ mat-error { font-size: 75%; margin-top: -1rem; margin-bottom: 0.5rem; }
127
+ ::ng-deep json-schema-form mat-form-field .mat-form-field-wrapper .mat-form-field-flex
128
+ .mat-form-field-infix { width: initial; }
129
+ `],
130
+ }]
131
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
132
+ type: Inject,
133
+ args: [MAT_FORM_FIELD_DEFAULT_OPTIONS]
134
+ }, {
135
+ type: Optional
136
+ }] }, { type: i1.JsonSchemaFormService }]; }, propDecorators: { layoutNode: [{
137
+ type: Input
138
+ }], layoutIndex: [{
139
+ type: Input
140
+ }], dataIndex: [{
141
+ type: Input
142
+ }] } });
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtdGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWpzZi1tYXRlcmlhbC9zcmMvbGliL3dpZGdldHMvbWF0ZXJpYWwtdGV4dGFyZWEuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7QUF5RDlFLE1BQU0sT0FBTyx5QkFBeUI7SUFXcEMsWUFDNkQsMEJBQTBCLEVBQzdFLEdBQTBCO1FBRHlCLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBQTtRQUM3RSxRQUFHLEdBQUgsR0FBRyxDQUF1QjtRQVRwQyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixpQkFBWSxHQUFHLEtBQUssQ0FBQztJQVNqQixDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDbEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDckQ7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQUs7UUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDOztzSEExQlUseUJBQXlCLGtCQVkxQiw4QkFBOEI7MEdBWjdCLHlCQUF5QiwwSkFwRDFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7dURBNkMyQzsyRkFPMUMseUJBQXlCO2tCQXZEckMsU0FBUzttQkFBQztvQkFDVCw4Q0FBOEM7b0JBQzlDLFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3VEQTZDMkM7b0JBQ3JELE1BQU0sRUFBRSxDQUFDOzs7O0dBSVIsQ0FBQztpQkFDSDs7MEJBYUksTUFBTTsyQkFBQyw4QkFBOEI7OzBCQUFHLFFBQVE7Z0ZBTDFDLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSnNvblNjaGVtYUZvcm1TZXJ2aWNlIH0gZnJvbSAnQGFqc2YvY29yZSc7XG5pbXBvcnQgeyBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdtYXRlcmlhbC10ZXh0YXJlYS13aWRnZXQnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxtYXQtZm9ybS1maWVsZCBbYXBwZWFyYW5jZV09XCJvcHRpb25zPy5hcHBlYXJhbmNlIHx8IG1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zPy5hcHBlYXJhbmNlIHx8ICdzdGFuZGFyZCdcIlxuICAgICAgW2NsYXNzXT1cIm9wdGlvbnM/Lmh0bWxDbGFzcyB8fCAnJ1wiXG4gICAgICBbZmxvYXRMYWJlbF09XCJvcHRpb25zPy5mbG9hdExhYmVsIHx8IG1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zPy5mbG9hdExhYmVsIHx8IChvcHRpb25zPy5ub3RpdGxlID8gJ25ldmVyJyA6ICdhdXRvJylcIlxuICAgICAgW2hpZGVSZXF1aXJlZE1hcmtlcl09XCJvcHRpb25zPy5oaWRlUmVxdWlyZWQgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIj5cbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCIhb3B0aW9ucz8ubm90aXRsZVwiPnt7b3B0aW9ucz8udGl0bGV9fTwvbWF0LWxhYmVsPlxuICAgICAgPHNwYW4gbWF0UHJlZml4ICpuZ0lmPVwib3B0aW9ucz8ucHJlZml4IHx8IG9wdGlvbnM/LmZpZWxkQWRkb25MZWZ0XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJvcHRpb25zPy5wcmVmaXggfHwgb3B0aW9ucz8uZmllbGRBZGRvbkxlZnRcIj48L3NwYW4+XG4gICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgKm5nSWY9XCJib3VuZENvbnRyb2xcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidjb250cm9sJyArIGxheW91dE5vZGU/Ll9pZCArICdTdGF0dXMnXCJcbiAgICAgICAgW2F0dHIubGlzdF09XCInY29udHJvbCcgKyBsYXlvdXROb2RlPy5faWQgKyAnQXV0b2NvbXBsZXRlJ1wiXG4gICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJvcHRpb25zPy5tYXhMZW5ndGhcIlxuICAgICAgICBbYXR0ci5taW5sZW5ndGhdPVwib3B0aW9ucz8ubWluTGVuZ3RoXCJcbiAgICAgICAgW2F0dHIucGF0dGVybl09XCJvcHRpb25zPy5wYXR0ZXJuXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cIm9wdGlvbnM/LnJlcXVpcmVkXCJcbiAgICAgICAgW2lkXT1cIidjb250cm9sJyArIGxheW91dE5vZGU/Ll9pZFwiXG4gICAgICAgIFtuYW1lXT1cImNvbnRyb2xOYW1lXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm9wdGlvbnM/Lm5vdGl0bGUgPyBvcHRpb25zPy5wbGFjZWhvbGRlciA6IG9wdGlvbnM/LnRpdGxlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIm9wdGlvbnM/LnJlYWRvbmx5ID8gJ3JlYWRvbmx5JyA6IG51bGxcIlxuICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzEwMCUnXCJcbiAgICAgICAgKGJsdXIpPVwib3B0aW9ucy5zaG93RXJyb3JzID0gdHJ1ZVwiPjwvdGV4dGFyZWE+XG4gICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgKm5nSWY9XCIhYm91bmRDb250cm9sXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCInY29udHJvbCcgKyBsYXlvdXROb2RlPy5faWQgKyAnU3RhdHVzJ1wiXG4gICAgICAgIFthdHRyLmxpc3RdPVwiJ2NvbnRyb2wnICsgbGF5b3V0Tm9kZT8uX2lkICsgJ0F1dG9jb21wbGV0ZSdcIlxuICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwib3B0aW9ucz8ubWF4TGVuZ3RoXCJcbiAgICAgICAgW2F0dHIubWlubGVuZ3RoXT1cIm9wdGlvbnM/Lm1pbkxlbmd0aFwiXG4gICAgICAgIFthdHRyLnBhdHRlcm5dPVwib3B0aW9ucz8ucGF0dGVyblwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJvcHRpb25zPy5yZXF1aXJlZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sRGlzYWJsZWRcIlxuICAgICAgICBbaWRdPVwiJ2NvbnRyb2wnICsgbGF5b3V0Tm9kZT8uX2lkXCJcbiAgICAgICAgW25hbWVdPVwiY29udHJvbE5hbWVcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwib3B0aW9ucz8ubm90aXRsZSA/IG9wdGlvbnM/LnBsYWNlaG9sZGVyIDogb3B0aW9ucz8udGl0bGVcIlxuICAgICAgICBbcmVhZG9ubHldPVwib3B0aW9ucz8ucmVhZG9ubHkgPyAncmVhZG9ubHknIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCInMTAwJSdcIlxuICAgICAgICBbdmFsdWVdPVwiY29udHJvbFZhbHVlXCJcbiAgICAgICAgKGlucHV0KT1cInVwZGF0ZVZhbHVlKCRldmVudClcIlxuICAgICAgICAoYmx1cik9XCJvcHRpb25zLnNob3dFcnJvcnMgPSB0cnVlXCI+PC90ZXh0YXJlYT5cbiAgICAgIDxzcGFuIG1hdFN1ZmZpeCAqbmdJZj1cIm9wdGlvbnM/LnN1ZmZpeCB8fCBvcHRpb25zPy5maWVsZEFkZG9uUmlnaHRcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cIm9wdGlvbnM/LnN1ZmZpeCB8fCBvcHRpb25zPy5maWVsZEFkZG9uUmlnaHRcIj48L3NwYW4+XG4gICAgICA8bWF0LWhpbnQgKm5nSWY9XCJvcHRpb25zPy5kZXNjcmlwdGlvbiAmJiAoIW9wdGlvbnM/LnNob3dFcnJvcnMgfHwgIW9wdGlvbnM/LmVycm9yTWVzc2FnZSlcIlxuICAgICAgICBhbGlnbj1cImVuZFwiIFtpbm5lckhUTUxdPVwib3B0aW9ucz8uZGVzY3JpcHRpb25cIj48L21hdC1oaW50PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cIm9wdGlvbnM/LnNob3dFcnJvcnMgJiYgb3B0aW9ucz8uZXJyb3JNZXNzYWdlXCJcbiAgICAgIFtpbm5lckhUTUxdPVwib3B0aW9ucz8uZXJyb3JNZXNzYWdlXCI+PC9tYXQtZXJyb3I+YCxcbiAgc3R5bGVzOiBbYFxuICAgIG1hdC1lcnJvciB7IGZvbnQtc2l6ZTogNzUlOyBtYXJnaW4tdG9wOiAtMXJlbTsgbWFyZ2luLWJvdHRvbTogMC41cmVtOyB9XG4gICAgOjpuZy1kZWVwIGpzb24tc2NoZW1hLWZvcm0gbWF0LWZvcm0tZmllbGQgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWZsZXhcbiAgICAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeCB7IHdpZHRoOiBpbml0aWFsOyB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbFRleHRhcmVhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcbiAgY29udHJvbE5hbWU6IHN0cmluZztcbiAgY29udHJvbFZhbHVlOiBhbnk7XG4gIGNvbnRyb2xEaXNhYmxlZCA9IGZhbHNlO1xuICBib3VuZENvbnRyb2wgPSBmYWxzZTtcbiAgb3B0aW9uczogYW55O1xuICBASW5wdXQoKSBsYXlvdXROb2RlOiBhbnk7XG4gIEBJbnB1dCgpIGxheW91dEluZGV4OiBudW1iZXJbXTtcbiAgQElucHV0KCkgZGF0YUluZGV4OiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUykgQE9wdGlvbmFsKCkgcHVibGljIG1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zLFxuICAgIHByaXZhdGUganNmOiBKc29uU2NoZW1hRm9ybVNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmxheW91dE5vZGUub3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLmpzZi5pbml0aWFsaXplQ29udHJvbCh0aGlzKTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub3RpdGxlICYmICF0aGlzLm9wdGlvbnMuZGVzY3JpcHRpb24gJiYgdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuZGVzY3JpcHRpb24gPSB0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVmFsdWUoZXZlbnQpIHtcbiAgICB0aGlzLmpzZi51cGRhdGVWYWx1ZSh0aGlzLCBldmVudC50YXJnZXQudmFsdWUpO1xuICB9XG59XG4iXX0=