@angular/forms 16.0.0-next.3 → 16.0.0-next.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/src/directives/abstract_form_group_directive.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/checkbox_value_accessor.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/control_value_accessor.mjs +7 -7
- package/{esm2020 → esm2022}/src/directives/default_value_accessor.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/ng_control_status.mjs +7 -7
- package/{esm2020 → esm2022}/src/directives/ng_form.mjs +4 -4
- package/esm2022/src/directives/ng_model.mjs +332 -0
- package/esm2022/src/directives/ng_model_group.mjs +95 -0
- package/{esm2020 → esm2022}/src/directives/ng_no_validate_directive.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/number_value_accessor.mjs +4 -4
- package/{esm2020 → esm2022}/src/directives/radio_control_value_accessor.mjs +11 -11
- package/{esm2020 → esm2022}/src/directives/range_value_accessor.mjs +4 -4
- package/esm2022/src/directives/reactive_directives/form_control_directive.mjs +185 -0
- package/esm2022/src/directives/reactive_directives/form_control_name.mjs +219 -0
- package/{esm2020 → esm2022}/src/directives/reactive_directives/form_group_directive.mjs +4 -4
- package/esm2022/src/directives/reactive_directives/form_group_name.mjs +247 -0
- package/{esm2020 → esm2022}/src/directives/select_control_value_accessor.mjs +7 -7
- package/{esm2020 → esm2022}/src/directives/select_multiple_control_value_accessor.mjs +7 -7
- package/{esm2020 → esm2022}/src/directives/validators.mjs +28 -28
- package/{esm2020 → esm2022}/src/directives.mjs +43 -43
- package/{esm2020 → esm2022}/src/form_builder.mjs +10 -10
- package/{esm2020 → esm2022}/src/form_providers.mjs +9 -9
- package/esm2022/src/model/abstract_model.mjs +939 -0
- package/esm2022/src/validators.mjs +678 -0
- package/{esm2020 → esm2022}/src/version.mjs +1 -1
- package/{fesm2020 → fesm2022}/forms.mjs +228 -187
- package/fesm2022/forms.mjs.map +1 -0
- package/index.d.ts +21 -21
- package/package.json +8 -14
- package/esm2020/src/directives/ng_model.mjs +0 -326
- package/esm2020/src/directives/ng_model_group.mjs +0 -89
- package/esm2020/src/directives/reactive_directives/form_control_directive.mjs +0 -185
- package/esm2020/src/directives/reactive_directives/form_control_name.mjs +0 -209
- package/esm2020/src/directives/reactive_directives/form_group_name.mjs +0 -227
- package/esm2020/src/model/abstract_model.mjs +0 -939
- package/esm2020/src/validators.mjs +0 -679
- package/fesm2015/forms.mjs +0 -7272
- package/fesm2015/forms.mjs.map +0 -1
- package/fesm2020/forms.mjs.map +0 -1
- /package/{esm2020 → esm2022}/forms.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/abstract_control_directive.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/control_container.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/error_examples.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/form_interface.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/ng_control.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/reactive_errors.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/shared.mjs +0 -0
- /package/{esm2020 → esm2022}/src/directives/template_driven_errors.mjs +0 -0
- /package/{esm2020 → esm2022}/src/errors.mjs +0 -0
- /package/{esm2020 → esm2022}/src/forms.mjs +0 -0
- /package/{esm2020 → esm2022}/src/model/form_array.mjs +0 -0
- /package/{esm2020 → esm2022}/src/model/form_control.mjs +0 -0
- /package/{esm2020 → esm2022}/src/model/form_group.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util.mjs +0 -0
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v16.0.0-next.
|
|
2
|
+
* @license Angular v16.0.0-next.5
|
|
3
3
|
* (c) 2010-2022 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -1371,7 +1371,7 @@ export declare class EmailValidator extends AbstractValidatorDirective {
|
|
|
1371
1371
|
/** @nodoc */
|
|
1372
1372
|
enabled(input: boolean): boolean;
|
|
1373
1373
|
static ɵfac: i0.ɵɵFactoryDeclaration<EmailValidator, never>;
|
|
1374
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<EmailValidator, "[email][formControlName],[email][formControl],[email][ngModel]", never, { "email": "email"; }, {}, never, never, false, never>;
|
|
1374
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<EmailValidator, "[email][formControlName],[email][formControl],[email][ngModel]", never, { "email": { "alias": "email"; "required": false; }; }, {}, never, never, false, never>;
|
|
1375
1375
|
}
|
|
1376
1376
|
|
|
1377
1377
|
/**
|
|
@@ -1828,7 +1828,7 @@ export declare class FormArrayName extends ControlContainer implements OnInit, O
|
|
|
1828
1828
|
get path(): string[];
|
|
1829
1829
|
private _checkParentType;
|
|
1830
1830
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormArrayName, [{ optional: true; host: true; skipSelf: true; }, { optional: true; self: true; }, { optional: true; self: true; }]>;
|
|
1831
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FormArrayName, "[formArrayName]", never, { "name": "formArrayName"; }, {}, never, never, false, never>;
|
|
1831
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FormArrayName, "[formArrayName]", never, { "name": { "alias": "formArrayName"; "required": false; }; }, {}, never, never, false, never>;
|
|
1832
1832
|
}
|
|
1833
1833
|
|
|
1834
1834
|
declare const formArrayNameProvider: any;
|
|
@@ -2299,7 +2299,7 @@ export declare class FormControlDirective extends NgControl implements OnChanges
|
|
|
2299
2299
|
viewToModelUpdate(newValue: any): void;
|
|
2300
2300
|
private _isControlChanged;
|
|
2301
2301
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormControlDirective, [{ optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }, { optional: true; }]>;
|
|
2302
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlDirective, "[formControl]", ["ngForm"], { "form": "formControl"; "isDisabled": "disabled"; "model": "ngModel"; }, { "update": "ngModelChange"; }, never, never, false, never>;
|
|
2302
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlDirective, "[formControl]", ["ngForm"], { "form": { "alias": "formControl"; "required": false; }; "isDisabled": { "alias": "disabled"; "required": false; }; "model": { "alias": "ngModel"; "required": false; }; }, { "update": "ngModelChange"; }, never, never, false, never>;
|
|
2303
2303
|
}
|
|
2304
2304
|
|
|
2305
2305
|
/**
|
|
@@ -2389,7 +2389,7 @@ export declare class FormControlName extends NgControl implements OnChanges, OnD
|
|
|
2389
2389
|
private _checkParentType;
|
|
2390
2390
|
private _setUpControl;
|
|
2391
2391
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormControlName, [{ optional: true; host: true; skipSelf: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }]>;
|
|
2392
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlName, "[formControlName]", never, { "name": "formControlName"; "isDisabled": "disabled"; "model": "ngModel"; }, { "update": "ngModelChange"; }, never, never, false, never>;
|
|
2392
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlName, "[formControlName]", never, { "name": { "alias": "formControlName"; "required": false; }; "isDisabled": { "alias": "disabled"; "required": false; }; "model": { "alias": "ngModel"; "required": false; }; }, { "update": "ngModelChange"; }, never, never, false, never>;
|
|
2393
2393
|
}
|
|
2394
2394
|
|
|
2395
2395
|
/**
|
|
@@ -2972,7 +2972,7 @@ export declare class FormGroupDirective extends ControlContainer implements Form
|
|
|
2972
2972
|
private _updateValidators;
|
|
2973
2973
|
private _checkFormPresent;
|
|
2974
2974
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormGroupDirective, [{ optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }]>;
|
|
2975
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FormGroupDirective, "[formGroup]", ["ngForm"], { "form": "formGroup"; }, { "ngSubmit": "ngSubmit"; }, never, never, false, never>;
|
|
2975
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FormGroupDirective, "[formGroup]", ["ngForm"], { "form": { "alias": "formGroup"; "required": false; }; }, { "ngSubmit": "ngSubmit"; }, never, never, false, never>;
|
|
2976
2976
|
}
|
|
2977
2977
|
|
|
2978
2978
|
/**
|
|
@@ -3035,7 +3035,7 @@ export declare class FormGroupName extends AbstractFormGroupDirective implements
|
|
|
3035
3035
|
name: string | number | null;
|
|
3036
3036
|
constructor(parent: ControlContainer, validators: (Validator | ValidatorFn)[], asyncValidators: (AsyncValidator | AsyncValidatorFn)[]);
|
|
3037
3037
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormGroupName, [{ optional: true; host: true; skipSelf: true; }, { optional: true; self: true; }, { optional: true; self: true; }]>;
|
|
3038
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<FormGroupName, "[formGroupName]", never, { "name": "formGroupName"; }, {}, never, never, false, never>;
|
|
3038
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<FormGroupName, "[formGroupName]", never, { "name": { "alias": "formGroupName"; "required": false; }; }, {}, never, never, false, never>;
|
|
3039
3039
|
}
|
|
3040
3040
|
|
|
3041
3041
|
declare type FormHooks = 'change' | 'blur' | 'submit';
|
|
@@ -3420,7 +3420,7 @@ export declare class MaxLengthValidator extends AbstractValidatorDirective {
|
|
|
3420
3420
|
*/
|
|
3421
3421
|
maxlength: string | number | null;
|
|
3422
3422
|
static ɵfac: i0.ɵɵFactoryDeclaration<MaxLengthValidator, never>;
|
|
3423
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<MaxLengthValidator, "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", never, { "maxlength": "maxlength"; }, {}, never, never, false, never>;
|
|
3423
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<MaxLengthValidator, "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", never, { "maxlength": { "alias": "maxlength"; "required": false; }; }, {}, never, never, false, never>;
|
|
3424
3424
|
}
|
|
3425
3425
|
|
|
3426
3426
|
/**
|
|
@@ -3451,7 +3451,7 @@ export declare class MaxValidator extends AbstractValidatorDirective {
|
|
|
3451
3451
|
*/
|
|
3452
3452
|
max: string | number | null;
|
|
3453
3453
|
static ɵfac: i0.ɵɵFactoryDeclaration<MaxValidator, never>;
|
|
3454
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<MaxValidator, "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", never, { "max": "max"; }, {}, never, never, false, never>;
|
|
3454
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<MaxValidator, "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", never, { "max": { "alias": "max"; "required": false; }; }, {}, never, never, false, never>;
|
|
3455
3455
|
}
|
|
3456
3456
|
|
|
3457
3457
|
/**
|
|
@@ -3494,7 +3494,7 @@ export declare class MinLengthValidator extends AbstractValidatorDirective {
|
|
|
3494
3494
|
*/
|
|
3495
3495
|
minlength: string | number | null;
|
|
3496
3496
|
static ɵfac: i0.ɵɵFactoryDeclaration<MinLengthValidator, never>;
|
|
3497
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<MinLengthValidator, "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", never, { "minlength": "minlength"; }, {}, never, never, false, never>;
|
|
3497
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<MinLengthValidator, "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", never, { "minlength": { "alias": "minlength"; "required": false; }; }, {}, never, never, false, never>;
|
|
3498
3498
|
}
|
|
3499
3499
|
|
|
3500
3500
|
/**
|
|
@@ -3525,7 +3525,7 @@ export declare class MinValidator extends AbstractValidatorDirective {
|
|
|
3525
3525
|
*/
|
|
3526
3526
|
min: string | number | null;
|
|
3527
3527
|
static ɵfac: i0.ɵɵFactoryDeclaration<MinValidator, never>;
|
|
3528
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<MinValidator, "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", never, { "min": "min"; }, {}, never, never, false, never>;
|
|
3528
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<MinValidator, "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", never, { "min": { "alias": "min"; "required": false; }; }, {}, never, never, false, never>;
|
|
3529
3529
|
}
|
|
3530
3530
|
|
|
3531
3531
|
declare const modelGroupProvider: any;
|
|
@@ -3891,7 +3891,7 @@ export declare class NgForm extends ControlContainer implements Form, AfterViewI
|
|
|
3891
3891
|
private _setUpdateStrategy;
|
|
3892
3892
|
private _findContainer;
|
|
3893
3893
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgForm, [{ optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }]>;
|
|
3894
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForm, "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", ["ngForm"], { "options": "ngFormOptions"; }, { "ngSubmit": "ngSubmit"; }, never, never, false, never>;
|
|
3894
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForm, "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", ["ngForm"], { "options": { "alias": "ngFormOptions"; "required": false; }; }, { "ngSubmit": "ngSubmit"; }, never, never, false, never>;
|
|
3895
3895
|
}
|
|
3896
3896
|
|
|
3897
3897
|
declare const ngGroupStatusHost: {
|
|
@@ -4078,7 +4078,7 @@ export declare class NgModel extends NgControl implements OnChanges, OnDestroy {
|
|
|
4078
4078
|
private _updateDisabled;
|
|
4079
4079
|
private _getPath;
|
|
4080
4080
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgModel, [{ optional: true; host: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; self: true; }, { optional: true; }, { optional: true; }]>;
|
|
4081
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgModel, "[ngModel]:not([formControlName]):not([formControl])", ["ngModel"], { "name": "name"; "isDisabled": "disabled"; "model": "ngModel"; "options": "ngModelOptions"; }, { "update": "ngModelChange"; }, never, never, false, never>;
|
|
4081
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgModel, "[ngModel]:not([formControlName]):not([formControl])", ["ngModel"], { "name": { "alias": "name"; "required": false; }; "isDisabled": { "alias": "disabled"; "required": false; }; "model": { "alias": "ngModel"; "required": false; }; "options": { "alias": "ngModelOptions"; "required": false; }; }, { "update": "ngModelChange"; }, never, never, false, never>;
|
|
4082
4082
|
}
|
|
4083
4083
|
|
|
4084
4084
|
/**
|
|
@@ -4116,7 +4116,7 @@ export declare class NgModelGroup extends AbstractFormGroupDirective implements
|
|
|
4116
4116
|
name: string;
|
|
4117
4117
|
constructor(parent: ControlContainer, validators: (Validator | ValidatorFn)[], asyncValidators: (AsyncValidator | AsyncValidatorFn)[]);
|
|
4118
4118
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgModelGroup, [{ host: true; skipSelf: true; }, { optional: true; self: true; }, { optional: true; self: true; }]>;
|
|
4119
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgModelGroup, "[ngModelGroup]", ["ngModelGroup"], { "name": "ngModelGroup"; }, {}, never, never, false, never>;
|
|
4119
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgModelGroup, "[ngModelGroup]", ["ngModelGroup"], { "name": { "alias": "ngModelGroup"; "required": false; }; }, {}, never, never, false, never>;
|
|
4120
4120
|
}
|
|
4121
4121
|
|
|
4122
4122
|
/**
|
|
@@ -4154,7 +4154,7 @@ export declare class NgSelectOption implements OnDestroy {
|
|
|
4154
4154
|
/** @nodoc */
|
|
4155
4155
|
ngOnDestroy(): void;
|
|
4156
4156
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgSelectOption, [null, null, { optional: true; host: true; }]>;
|
|
4157
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgSelectOption, "option", never, { "ngValue": "ngValue"; "value": "value"; }, {}, never, never, false, never>;
|
|
4157
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgSelectOption, "option", never, { "ngValue": { "alias": "ngValue"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, false, never>;
|
|
4158
4158
|
}
|
|
4159
4159
|
|
|
4160
4160
|
/**
|
|
@@ -4271,7 +4271,7 @@ export declare class PatternValidator extends AbstractValidatorDirective {
|
|
|
4271
4271
|
*/
|
|
4272
4272
|
pattern: string | RegExp;
|
|
4273
4273
|
static ɵfac: i0.ɵɵFactoryDeclaration<PatternValidator, never>;
|
|
4274
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<PatternValidator, "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", never, { "pattern": "pattern"; }, {}, never, never, false, never>;
|
|
4274
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<PatternValidator, "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", never, { "pattern": { "alias": "pattern"; "required": false; }; }, {}, never, never, false, never>;
|
|
4275
4275
|
}
|
|
4276
4276
|
|
|
4277
4277
|
/**
|
|
@@ -4404,7 +4404,7 @@ export declare class RadioControlValueAccessor extends BuiltInControlValueAccess
|
|
|
4404
4404
|
fireUncheck(value: any): void;
|
|
4405
4405
|
private _checkName;
|
|
4406
4406
|
static ɵfac: i0.ɵɵFactoryDeclaration<RadioControlValueAccessor, never>;
|
|
4407
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<RadioControlValueAccessor, "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", never, { "name": "name"; "formControlName": "formControlName"; "value": "value"; }, {}, never, never, false, never>;
|
|
4407
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<RadioControlValueAccessor, "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", never, { "name": { "alias": "name"; "required": false; }; "formControlName": { "alias": "formControlName"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, false, never>;
|
|
4408
4408
|
}
|
|
4409
4409
|
|
|
4410
4410
|
/**
|
|
@@ -4515,7 +4515,7 @@ export declare class RequiredValidator extends AbstractValidatorDirective {
|
|
|
4515
4515
|
/** @nodoc */
|
|
4516
4516
|
enabled(input: boolean): boolean;
|
|
4517
4517
|
static ɵfac: i0.ɵɵFactoryDeclaration<RequiredValidator, never>;
|
|
4518
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<RequiredValidator, ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", never, { "required": "required"; }, {}, never, never, false, never>;
|
|
4518
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<RequiredValidator, ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", never, { "required": { "alias": "required"; "required": false; }; }, {}, never, never, false, never>;
|
|
4519
4519
|
}
|
|
4520
4520
|
|
|
4521
4521
|
/**
|
|
@@ -4595,7 +4595,7 @@ export declare class SelectControlValueAccessor extends BuiltInControlValueAcces
|
|
|
4595
4595
|
*/
|
|
4596
4596
|
registerOnChange(fn: (value: any) => any): void;
|
|
4597
4597
|
static ɵfac: i0.ɵɵFactoryDeclaration<SelectControlValueAccessor, never>;
|
|
4598
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<SelectControlValueAccessor, "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", never, { "compareWith": "compareWith"; }, {}, never, never, false, never>;
|
|
4598
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<SelectControlValueAccessor, "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", never, { "compareWith": { "alias": "compareWith"; "required": false; }; }, {}, never, never, false, never>;
|
|
4599
4599
|
}
|
|
4600
4600
|
|
|
4601
4601
|
/**
|
|
@@ -4658,7 +4658,7 @@ export declare class SelectMultipleControlValueAccessor extends BuiltInControlVa
|
|
|
4658
4658
|
*/
|
|
4659
4659
|
registerOnChange(fn: (value: any) => any): void;
|
|
4660
4660
|
static ɵfac: i0.ɵɵFactoryDeclaration<SelectMultipleControlValueAccessor, never>;
|
|
4661
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<SelectMultipleControlValueAccessor, "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", never, { "compareWith": "compareWith"; }, {}, never, never, false, never>;
|
|
4661
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<SelectMultipleControlValueAccessor, "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", never, { "compareWith": { "alias": "compareWith"; "required": false; }; }, {}, never, never, false, never>;
|
|
4662
4662
|
}
|
|
4663
4663
|
|
|
4664
4664
|
/**
|
|
@@ -5331,7 +5331,7 @@ export declare class ɵNgSelectMultipleOption implements OnDestroy {
|
|
|
5331
5331
|
/** @nodoc */
|
|
5332
5332
|
ngOnDestroy(): void;
|
|
5333
5333
|
static ɵfac: i0.ɵɵFactoryDeclaration<ɵNgSelectMultipleOption, [null, null, { optional: true; host: true; }]>;
|
|
5334
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<ɵNgSelectMultipleOption, "option", never, { "ngValue": "ngValue"; "value": "value"; }, {}, never, never, false, never>;
|
|
5334
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<ɵNgSelectMultipleOption, "option", never, { "ngValue": { "alias": "ngValue"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, false, never>;
|
|
5335
5335
|
}
|
|
5336
5336
|
|
|
5337
5337
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/forms",
|
|
3
|
-
"version": "16.0.0-next.
|
|
3
|
+
"version": "16.0.0-next.5",
|
|
4
4
|
"description": "Angular - directives and services for creating forms",
|
|
5
5
|
"author": "angular",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"tslib": "^2.3.0"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@angular/core": "16.0.0-next.
|
|
15
|
-
"@angular/common": "16.0.0-next.
|
|
16
|
-
"@angular/platform-browser": "16.0.0-next.
|
|
14
|
+
"@angular/core": "16.0.0-next.5",
|
|
15
|
+
"@angular/common": "16.0.0-next.5",
|
|
16
|
+
"@angular/platform-browser": "16.0.0-next.5",
|
|
17
17
|
"rxjs": "^6.5.3 || ^7.4.0"
|
|
18
18
|
},
|
|
19
19
|
"repository": {
|
|
@@ -42,12 +42,8 @@
|
|
|
42
42
|
]
|
|
43
43
|
},
|
|
44
44
|
"sideEffects": false,
|
|
45
|
-
"
|
|
46
|
-
"fesm2015": "./fesm2015/forms.mjs",
|
|
47
|
-
"esm2020": "./esm2020/forms.mjs",
|
|
45
|
+
"module": "./fesm2022/forms.mjs",
|
|
48
46
|
"typings": "./index.d.ts",
|
|
49
|
-
"module": "./fesm2015/forms.mjs",
|
|
50
|
-
"es2020": "./fesm2020/forms.mjs",
|
|
51
47
|
"type": "module",
|
|
52
48
|
"exports": {
|
|
53
49
|
"./package.json": {
|
|
@@ -55,11 +51,9 @@
|
|
|
55
51
|
},
|
|
56
52
|
".": {
|
|
57
53
|
"types": "./index.d.ts",
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"node": "./fesm2015/forms.mjs",
|
|
62
|
-
"default": "./fesm2020/forms.mjs"
|
|
54
|
+
"esm2022": "./esm2022/forms.mjs",
|
|
55
|
+
"esm": "./esm2022/forms.mjs",
|
|
56
|
+
"default": "./fesm2022/forms.mjs"
|
|
63
57
|
}
|
|
64
58
|
}
|
|
65
59
|
}
|
|
@@ -1,326 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { ChangeDetectorRef, Directive, EventEmitter, forwardRef, Host, Inject, Input, Optional, Output, Self, ɵcoerceToBoolean as coerceToBoolean } from '@angular/core';
|
|
9
|
-
import { FormControl } from '../model/form_control';
|
|
10
|
-
import { NG_ASYNC_VALIDATORS, NG_VALIDATORS } from '../validators';
|
|
11
|
-
import { AbstractFormGroupDirective } from './abstract_form_group_directive';
|
|
12
|
-
import { ControlContainer } from './control_container';
|
|
13
|
-
import { NG_VALUE_ACCESSOR } from './control_value_accessor';
|
|
14
|
-
import { NgControl } from './ng_control';
|
|
15
|
-
import { NgForm } from './ng_form';
|
|
16
|
-
import { NgModelGroup } from './ng_model_group';
|
|
17
|
-
import { CALL_SET_DISABLED_STATE, controlPath, isPropertyUpdated, selectValueAccessor, setUpControl } from './shared';
|
|
18
|
-
import { formGroupNameException, missingNameException, modelParentException } from './template_driven_errors';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "./control_container";
|
|
21
|
-
const formControlBinding = {
|
|
22
|
-
provide: NgControl,
|
|
23
|
-
useExisting: forwardRef(() => NgModel)
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* `ngModel` forces an additional change detection run when its inputs change:
|
|
27
|
-
* E.g.:
|
|
28
|
-
* ```
|
|
29
|
-
* <div>{{myModel.valid}}</div>
|
|
30
|
-
* <input [(ngModel)]="myValue" #myModel="ngModel">
|
|
31
|
-
* ```
|
|
32
|
-
* I.e. `ngModel` can export itself on the element and then be used in the template.
|
|
33
|
-
* Normally, this would result in expressions before the `input` that use the exported directive
|
|
34
|
-
* to have an old value as they have been
|
|
35
|
-
* dirty checked before. As this is a very common case for `ngModel`, we added this second change
|
|
36
|
-
* detection run.
|
|
37
|
-
*
|
|
38
|
-
* Notes:
|
|
39
|
-
* - this is just one extra run no matter how many `ngModel`s have been changed.
|
|
40
|
-
* - this is a general problem when using `exportAs` for directives!
|
|
41
|
-
*/
|
|
42
|
-
const resolvedPromise = (() => Promise.resolve())();
|
|
43
|
-
/**
|
|
44
|
-
* @description
|
|
45
|
-
* Creates a `FormControl` instance from a domain model and binds it
|
|
46
|
-
* to a form control element.
|
|
47
|
-
*
|
|
48
|
-
* The `FormControl` instance tracks the value, user interaction, and
|
|
49
|
-
* validation status of the control and keeps the view synced with the model. If used
|
|
50
|
-
* within a parent form, the directive also registers itself with the form as a child
|
|
51
|
-
* control.
|
|
52
|
-
*
|
|
53
|
-
* This directive is used by itself or as part of a larger form. Use the
|
|
54
|
-
* `ngModel` selector to activate it.
|
|
55
|
-
*
|
|
56
|
-
* It accepts a domain model as an optional `Input`. If you have a one-way binding
|
|
57
|
-
* to `ngModel` with `[]` syntax, changing the domain model's value in the component
|
|
58
|
-
* class sets the value in the view. If you have a two-way binding with `[()]` syntax
|
|
59
|
-
* (also known as 'banana-in-a-box syntax'), the value in the UI always syncs back to
|
|
60
|
-
* the domain model in your class.
|
|
61
|
-
*
|
|
62
|
-
* To inspect the properties of the associated `FormControl` (like the validity state),
|
|
63
|
-
* export the directive into a local template variable using `ngModel` as the key (ex:
|
|
64
|
-
* `#myVar="ngModel"`). You can then access the control using the directive's `control` property.
|
|
65
|
-
* However, the most commonly used properties (like `valid` and `dirty`) also exist on the control
|
|
66
|
-
* for direct access. See a full list of properties directly available in
|
|
67
|
-
* `AbstractControlDirective`.
|
|
68
|
-
*
|
|
69
|
-
* @see `RadioControlValueAccessor`
|
|
70
|
-
* @see `SelectControlValueAccessor`
|
|
71
|
-
*
|
|
72
|
-
* @usageNotes
|
|
73
|
-
*
|
|
74
|
-
* ### Using ngModel on a standalone control
|
|
75
|
-
*
|
|
76
|
-
* The following examples show a simple standalone control using `ngModel`:
|
|
77
|
-
*
|
|
78
|
-
* {@example forms/ts/simpleNgModel/simple_ng_model_example.ts region='Component'}
|
|
79
|
-
*
|
|
80
|
-
* When using the `ngModel` within `<form>` tags, you'll also need to supply a `name` attribute
|
|
81
|
-
* so that the control can be registered with the parent form under that name.
|
|
82
|
-
*
|
|
83
|
-
* In the context of a parent form, it's often unnecessary to include one-way or two-way binding,
|
|
84
|
-
* as the parent form syncs the value for you. You access its properties by exporting it into a
|
|
85
|
-
* local template variable using `ngForm` such as (`#f="ngForm"`). Use the variable where
|
|
86
|
-
* needed on form submission.
|
|
87
|
-
*
|
|
88
|
-
* If you do need to populate initial values into your form, using a one-way binding for
|
|
89
|
-
* `ngModel` tends to be sufficient as long as you use the exported form's value rather
|
|
90
|
-
* than the domain model's value on submit.
|
|
91
|
-
*
|
|
92
|
-
* ### Using ngModel within a form
|
|
93
|
-
*
|
|
94
|
-
* The following example shows controls using `ngModel` within a form:
|
|
95
|
-
*
|
|
96
|
-
* {@example forms/ts/simpleForm/simple_form_example.ts region='Component'}
|
|
97
|
-
*
|
|
98
|
-
* ### Using a standalone ngModel within a group
|
|
99
|
-
*
|
|
100
|
-
* The following example shows you how to use a standalone ngModel control
|
|
101
|
-
* within a form. This controls the display of the form, but doesn't contain form data.
|
|
102
|
-
*
|
|
103
|
-
* ```html
|
|
104
|
-
* <form>
|
|
105
|
-
* <input name="login" ngModel placeholder="Login">
|
|
106
|
-
* <input type="checkbox" ngModel [ngModelOptions]="{standalone: true}"> Show more options?
|
|
107
|
-
* </form>
|
|
108
|
-
* <!-- form value: {login: ''} -->
|
|
109
|
-
* ```
|
|
110
|
-
*
|
|
111
|
-
* ### Setting the ngModel `name` attribute through options
|
|
112
|
-
*
|
|
113
|
-
* The following example shows you an alternate way to set the name attribute. Here,
|
|
114
|
-
* an attribute identified as name is used within a custom form control component. To still be able
|
|
115
|
-
* to specify the NgModel's name, you must specify it using the `ngModelOptions` input instead.
|
|
116
|
-
*
|
|
117
|
-
* ```html
|
|
118
|
-
* <form>
|
|
119
|
-
* <my-custom-form-control name="Nancy" ngModel [ngModelOptions]="{name: 'user'}">
|
|
120
|
-
* </my-custom-form-control>
|
|
121
|
-
* </form>
|
|
122
|
-
* <!-- form value: {user: ''} -->
|
|
123
|
-
* ```
|
|
124
|
-
*
|
|
125
|
-
* @ngModule FormsModule
|
|
126
|
-
* @publicApi
|
|
127
|
-
*/
|
|
128
|
-
class NgModel extends NgControl {
|
|
129
|
-
constructor(parent, validators, asyncValidators, valueAccessors, _changeDetectorRef, callSetDisabledState) {
|
|
130
|
-
super();
|
|
131
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
132
|
-
this.callSetDisabledState = callSetDisabledState;
|
|
133
|
-
this.control = new FormControl();
|
|
134
|
-
/** @internal */
|
|
135
|
-
this._registered = false;
|
|
136
|
-
/**
|
|
137
|
-
* @description
|
|
138
|
-
* Event emitter for producing the `ngModelChange` event after
|
|
139
|
-
* the view model updates.
|
|
140
|
-
*/
|
|
141
|
-
this.update = new EventEmitter();
|
|
142
|
-
this._parent = parent;
|
|
143
|
-
this._setValidators(validators);
|
|
144
|
-
this._setAsyncValidators(asyncValidators);
|
|
145
|
-
this.valueAccessor = selectValueAccessor(this, valueAccessors);
|
|
146
|
-
}
|
|
147
|
-
/** @nodoc */
|
|
148
|
-
ngOnChanges(changes) {
|
|
149
|
-
this._checkForErrors();
|
|
150
|
-
if (!this._registered || 'name' in changes) {
|
|
151
|
-
if (this._registered) {
|
|
152
|
-
this._checkName();
|
|
153
|
-
if (this.formDirective) {
|
|
154
|
-
// We can't call `formDirective.removeControl(this)`, because the `name` has already been
|
|
155
|
-
// changed. We also can't reset the name temporarily since the logic in `removeControl`
|
|
156
|
-
// is inside a promise and it won't run immediately. We work around it by giving it an
|
|
157
|
-
// object with the same shape instead.
|
|
158
|
-
const oldName = changes['name'].previousValue;
|
|
159
|
-
this.formDirective.removeControl({ name: oldName, path: this._getPath(oldName) });
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
this._setUpControl();
|
|
163
|
-
}
|
|
164
|
-
if ('isDisabled' in changes) {
|
|
165
|
-
this._updateDisabled(changes);
|
|
166
|
-
}
|
|
167
|
-
if (isPropertyUpdated(changes, this.viewModel)) {
|
|
168
|
-
this._updateValue(this.model);
|
|
169
|
-
this.viewModel = this.model;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
/** @nodoc */
|
|
173
|
-
ngOnDestroy() {
|
|
174
|
-
this.formDirective && this.formDirective.removeControl(this);
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* @description
|
|
178
|
-
* Returns an array that represents the path from the top-level form to this control.
|
|
179
|
-
* Each index is the string name of the control on that level.
|
|
180
|
-
*/
|
|
181
|
-
get path() {
|
|
182
|
-
return this._getPath(this.name);
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* @description
|
|
186
|
-
* The top-level directive for this control if present, otherwise null.
|
|
187
|
-
*/
|
|
188
|
-
get formDirective() {
|
|
189
|
-
return this._parent ? this._parent.formDirective : null;
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* @description
|
|
193
|
-
* Sets the new value for the view model and emits an `ngModelChange` event.
|
|
194
|
-
*
|
|
195
|
-
* @param newValue The new value emitted by `ngModelChange`.
|
|
196
|
-
*/
|
|
197
|
-
viewToModelUpdate(newValue) {
|
|
198
|
-
this.viewModel = newValue;
|
|
199
|
-
this.update.emit(newValue);
|
|
200
|
-
}
|
|
201
|
-
_setUpControl() {
|
|
202
|
-
this._setUpdateStrategy();
|
|
203
|
-
this._isStandalone() ? this._setUpStandalone() : this.formDirective.addControl(this);
|
|
204
|
-
this._registered = true;
|
|
205
|
-
}
|
|
206
|
-
_setUpdateStrategy() {
|
|
207
|
-
if (this.options && this.options.updateOn != null) {
|
|
208
|
-
this.control._updateOn = this.options.updateOn;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
_isStandalone() {
|
|
212
|
-
return !this._parent || !!(this.options && this.options.standalone);
|
|
213
|
-
}
|
|
214
|
-
_setUpStandalone() {
|
|
215
|
-
setUpControl(this.control, this, this.callSetDisabledState);
|
|
216
|
-
this.control.updateValueAndValidity({ emitEvent: false });
|
|
217
|
-
}
|
|
218
|
-
_checkForErrors() {
|
|
219
|
-
if (!this._isStandalone()) {
|
|
220
|
-
this._checkParentType();
|
|
221
|
-
}
|
|
222
|
-
this._checkName();
|
|
223
|
-
}
|
|
224
|
-
_checkParentType() {
|
|
225
|
-
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
226
|
-
if (!(this._parent instanceof NgModelGroup) &&
|
|
227
|
-
this._parent instanceof AbstractFormGroupDirective) {
|
|
228
|
-
throw formGroupNameException();
|
|
229
|
-
}
|
|
230
|
-
else if (!(this._parent instanceof NgModelGroup) && !(this._parent instanceof NgForm)) {
|
|
231
|
-
throw modelParentException();
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
_checkName() {
|
|
236
|
-
if (this.options && this.options.name)
|
|
237
|
-
this.name = this.options.name;
|
|
238
|
-
if (!this._isStandalone() && !this.name && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
239
|
-
throw missingNameException();
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
_updateValue(value) {
|
|
243
|
-
resolvedPromise.then(() => {
|
|
244
|
-
this.control.setValue(value, { emitViewToModelChange: false });
|
|
245
|
-
this._changeDetectorRef?.markForCheck();
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
_updateDisabled(changes) {
|
|
249
|
-
const disabledValue = changes['isDisabled'].currentValue;
|
|
250
|
-
// checking for 0 to avoid breaking change
|
|
251
|
-
const isDisabled = disabledValue !== 0 && coerceToBoolean(disabledValue);
|
|
252
|
-
resolvedPromise.then(() => {
|
|
253
|
-
if (isDisabled && !this.control.disabled) {
|
|
254
|
-
this.control.disable();
|
|
255
|
-
}
|
|
256
|
-
else if (!isDisabled && this.control.disabled) {
|
|
257
|
-
this.control.enable();
|
|
258
|
-
}
|
|
259
|
-
this._changeDetectorRef?.markForCheck();
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
_getPath(controlName) {
|
|
263
|
-
return this._parent ? controlPath(controlName, this._parent) : [controlName];
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
NgModel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-next.3", ngImport: i0, type: NgModel, deps: [{ token: i1.ControlContainer, host: true, optional: true }, { token: NG_VALIDATORS, optional: true, self: true }, { token: NG_ASYNC_VALIDATORS, optional: true, self: true }, { token: NG_VALUE_ACCESSOR, optional: true, self: true }, { token: ChangeDetectorRef, optional: true }, { token: CALL_SET_DISABLED_STATE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
267
|
-
NgModel.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0-next.3", type: NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: { name: "name", isDisabled: ["disabled", "isDisabled"], model: ["ngModel", "model"], options: ["ngModelOptions", "options"] }, outputs: { update: "ngModelChange" }, providers: [formControlBinding], exportAs: ["ngModel"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
268
|
-
export { NgModel };
|
|
269
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-next.3", ngImport: i0, type: NgModel, decorators: [{
|
|
270
|
-
type: Directive,
|
|
271
|
-
args: [{
|
|
272
|
-
selector: '[ngModel]:not([formControlName]):not([formControl])',
|
|
273
|
-
providers: [formControlBinding],
|
|
274
|
-
exportAs: 'ngModel'
|
|
275
|
-
}]
|
|
276
|
-
}], ctorParameters: function () { return [{ type: i1.ControlContainer, decorators: [{
|
|
277
|
-
type: Optional
|
|
278
|
-
}, {
|
|
279
|
-
type: Host
|
|
280
|
-
}] }, { type: undefined, decorators: [{
|
|
281
|
-
type: Optional
|
|
282
|
-
}, {
|
|
283
|
-
type: Self
|
|
284
|
-
}, {
|
|
285
|
-
type: Inject,
|
|
286
|
-
args: [NG_VALIDATORS]
|
|
287
|
-
}] }, { type: undefined, decorators: [{
|
|
288
|
-
type: Optional
|
|
289
|
-
}, {
|
|
290
|
-
type: Self
|
|
291
|
-
}, {
|
|
292
|
-
type: Inject,
|
|
293
|
-
args: [NG_ASYNC_VALIDATORS]
|
|
294
|
-
}] }, { type: undefined, decorators: [{
|
|
295
|
-
type: Optional
|
|
296
|
-
}, {
|
|
297
|
-
type: Self
|
|
298
|
-
}, {
|
|
299
|
-
type: Inject,
|
|
300
|
-
args: [NG_VALUE_ACCESSOR]
|
|
301
|
-
}] }, { type: i0.ChangeDetectorRef, decorators: [{
|
|
302
|
-
type: Optional
|
|
303
|
-
}, {
|
|
304
|
-
type: Inject,
|
|
305
|
-
args: [ChangeDetectorRef]
|
|
306
|
-
}] }, { type: undefined, decorators: [{
|
|
307
|
-
type: Optional
|
|
308
|
-
}, {
|
|
309
|
-
type: Inject,
|
|
310
|
-
args: [CALL_SET_DISABLED_STATE]
|
|
311
|
-
}] }]; }, propDecorators: { name: [{
|
|
312
|
-
type: Input
|
|
313
|
-
}], isDisabled: [{
|
|
314
|
-
type: Input,
|
|
315
|
-
args: ['disabled']
|
|
316
|
-
}], model: [{
|
|
317
|
-
type: Input,
|
|
318
|
-
args: ['ngModel']
|
|
319
|
-
}], options: [{
|
|
320
|
-
type: Input,
|
|
321
|
-
args: ['ngModelOptions']
|
|
322
|
-
}], update: [{
|
|
323
|
-
type: Output,
|
|
324
|
-
args: ['ngModelChange']
|
|
325
|
-
}] } });
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdfbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9uZ19tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXdCLFFBQVEsRUFBRSxNQUFNLEVBQVksSUFBSSxFQUFpQixnQkFBZ0IsSUFBSSxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHdE4sT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUF1QixpQkFBaUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2pGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBMEIsWUFBWSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQzVJLE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDOzs7QUFHNUcsTUFBTSxrQkFBa0IsR0FBYTtJQUNuQyxPQUFPLEVBQUUsU0FBUztJQUNsQixXQUFXLEVBQUUsVUFB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QUMsYUFBYTs7MEJBQ3hDLFFBQVE7OzBCQUFJLElBQUk7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFFOUMsUUFBUTs7MEJBQUksSUFBSTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUM1QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3BDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsdUJBQXVCOzRDQWhEN0IsSUFBSTtzQkFBckIsS0FBSztnQkFPYSxVQUFVO3NCQUE1QixLQUFLO3VCQUFDLFVBQVU7Z0JBTUMsS0FBSztzQkFBdEIsS0FBSzt1QkFBQyxTQUFTO2dCQW1CUyxPQUFPO3NCQUEvQixLQUFLO3VCQUFDLGdCQUFnQjtnQkFPRSxNQUFNO3NCQUE5QixNQUFNO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3QsIEluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPcHRpb25hbCwgT3V0cHV0LCBQcm92aWRlciwgU2VsZiwgU2ltcGxlQ2hhbmdlcywgybVjb2VyY2VUb0Jvb2xlYW4gYXMgY29lcmNlVG9Cb29sZWFufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtGb3JtSG9va3N9IGZyb20gJy4uL21vZGVsL2Fic3RyYWN0X21vZGVsJztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJy4uL21vZGVsL2Zvcm1fY29udHJvbCc7XG5pbXBvcnQge05HX0FTWU5DX1ZBTElEQVRPUlMsIE5HX1ZBTElEQVRPUlN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuXG5pbXBvcnQge0Fic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlfSBmcm9tICcuL2Fic3RyYWN0X2Zvcm1fZ3JvdXBfZGlyZWN0aXZlJztcbmltcG9ydCB7Q29udHJvbENvbnRhaW5lcn0gZnJvbSAnLi9jb250cm9sX2NvbnRhaW5lcic7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7TmdDb250cm9sfSBmcm9tICcuL25nX2NvbnRyb2wnO1xuaW1wb3J0IHtOZ0Zvcm19IGZyb20gJy4vbmdfZm9ybSc7XG5pbXBvcnQge05nTW9kZWxHcm91cH0gZnJvbSAnLi9uZ19tb2RlbF9ncm91cCc7XG5pbXBvcnQge0NBTExfU0VUX0RJU0FCTEVEX1NUQVRFLCBjb250cm9sUGF0aCwgaXNQcm9wZXJ0eVVwZGF0ZWQsIHNlbGVjdFZhbHVlQWNjZXNzb3IsIFNldERpc2FibGVkU3RhdGVPcHRpb24sIHNldFVwQ29udHJvbH0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHtmb3JtR3JvdXBOYW1lRXhjZXB0aW9uLCBtaXNzaW5nTmFtZUV4Y2VwdGlvbiwgbW9kZWxQYXJlbnRFeGNlcHRpb259IGZyb20gJy4vdGVtcGxhdGVfZHJpdmVuX2Vycm9ycyc7XG5pbXBvcnQge0FzeW5jVmFsaWRhdG9yLCBBc3luY1ZhbGlkYXRvckZuLCBWYWxpZGF0b3IsIFZhbGlkYXRvckZufSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuXG5jb25zdCBmb3JtQ29udHJvbEJpbmRpbmc6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOZ0NvbnRyb2wsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nTW9kZWwpXG59O1xuXG4vKipcbiAqIGBuZ01vZGVsYCBmb3JjZXMgYW4gYWRkaXRpb25hbCBjaGFuZ2UgZGV0ZWN0aW9uIHJ1biB3aGVuIGl0cyBpbnB1dHMgY2hhbmdlOlxuICogRS5nLjpcbiAqIGBgYFxuICogPGRpdj57e215TW9kZWwudmFsaWR9fTwvZGl2PlxuICogPGlucHV0IFsobmdNb2RlbCldPVwibXlWYWx1ZVwiICNteU1vZGVsPVwibmdNb2RlbFwiPlxuICogYGBgXG4gKiBJLmUuIGBuZ01vZGVsYCBjYW4gZXhwb3J0IGl0c2VsZiBvbiB0aGUgZWxlbWVudCBhbmQgdGhlbiBiZSB1c2VkIGluIHRoZSB0ZW1wbGF0ZS5cbiAqIE5vcm1hbGx5LCB0aGlzIHdvdWxkIHJlc3VsdCBpbiBleHByZXNzaW9ucyBiZWZvcmUgdGhlIGBpbnB1dGAgdGhhdCB1c2UgdGhlIGV4cG9ydGVkIGRpcmVjdGl2ZVxuICogdG8gaGF2ZSBhbiBvbGQgdmFsdWUgYXMgdGhleSBoYXZlIGJlZW5cbiAqIGRpcnR5IGNoZWNrZWQgYmVmb3JlLiBBcyB0aGlzIGlzIGEgdmVyeSBjb21tb24gY2FzZSBmb3IgYG5nTW9kZWxgLCB3ZSBhZGRlZCB0aGlzIHNlY29uZCBjaGFuZ2VcbiAqIGRldGVjdGlvbiBydW4uXG4gKlxuICogTm90ZXM6XG4gKiAtIHRoaXMgaXMganVzdCBvbmUgZXh0cmEgcnVuIG5vIG1hdHRlciBob3cgbWFueSBgbmdNb2RlbGBzIGhhdmUgYmVlbiBjaGFuZ2VkLlxuICogLSB0aGlzIGlzIGEgZ2VuZXJhbCBwcm9ibGVtIHdoZW4gdXNpbmcgYGV4cG9ydEFzYCBmb3IgZGlyZWN0aXZlcyFcbiAqL1xuY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKSgpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQ3JlYXRlcyBhIGBGb3JtQ29udHJvbGAgaW5zdGFuY2UgZnJvbSBhIGRvbWFpbiBtb2RlbCBhbmQgYmluZHMgaXRcbiAqIHRvIGEgZm9ybSBjb250cm9sIGVsZW1lbnQuXG4gKlxuICogVGhlIGBGb3JtQ29udHJvbGAgaW5zdGFuY2UgdHJhY2tzIHRoZSB2YWx1ZSwgdXNlciBpbnRlcmFjdGlvbiwgYW5kXG4gKiB2YWxpZGF0aW9uIHN0YXR1cyBvZiB0aGUgY29udHJvbCBhbmQga2VlcHMgdGhlIHZpZXcgc3luY2VkIHdpdGggdGhlIG1vZGVsLiBJZiB1c2VkXG4gKiB3aXRoaW4gYSBwYXJlbnQgZm9ybSwgdGhlIGRpcmVjdGl2ZSBhbHNvIHJlZ2lzdGVycyBpdHNlbGYgd2l0aCB0aGUgZm9ybSBhcyBhIGNoaWxkXG4gKiBjb250cm9sLlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGlzIHVzZWQgYnkgaXRzZWxmIG9yIGFzIHBhcnQgb2YgYSBsYXJnZXIgZm9ybS4gVXNlIHRoZVxuICogYG5nTW9kZWxgIHNlbGVjdG9yIHRvIGFjdGl2YXRlIGl0LlxuICpcbiAqIEl0IGFjY2VwdHMgYSBkb21haW4gbW9kZWwgYXMgYW4gb3B0aW9uYWwgYElucHV0YC4gSWYgeW91IGhhdmUgYSBvbmUtd2F5IGJpbmRpbmdcbiAqIHRvIGBuZ01vZGVsYCB3aXRoIGBbXWAgc3ludGF4LCBjaGFuZ2luZyB0aGUgZG9tYWluIG1vZGVsJ3MgdmFsdWUgaW4gdGhlIGNvbXBvbmVudFxuICogY2xhc3Mgc2V0cyB0aGUgdmFsdWUgaW4gdGhlIHZpZXcuIElmIHlvdSBoYXZlIGEgdHdvLXdheSBiaW5kaW5nIHdpdGggYFsoKV1gIHN5bnRheFxuICogKGFsc28ga25vd24gYXMgJ2JhbmFuYS1pbi1hLWJveCBzeW50YXgnKSwgdGhlIHZhbHVlIGluIHRoZSBVSSBhbHdheXMgc3luY3MgYmFjayB0b1xuICogdGhlIGRvbWFpbiBtb2RlbCBpbiB5b3VyIGNsYXNzLlxuICpcbiAqIFRvIGluc3BlY3QgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFzc29jaWF0ZWQgYEZvcm1Db250cm9sYCAobGlrZSB0aGUgdmFsaWRpdHkgc3RhdGUpLFxuICogZXhwb3J0IHRoZSBkaXJlY3RpdmUgaW50byBhIGxvY2FsIHRlbXBsYXRlIHZhcmlhYmxlIHVzaW5nIGBuZ01vZGVsYCBhcyB0aGUga2V5IChleDpcbiAqIGAjbXlWYXI9XCJuZ01vZGVsXCJgKS4gWW91IGNhbiB0aGVuIGFjY2VzcyB0aGUgY29udHJvbCB1c2luZyB0aGUgZGlyZWN0aXZlJ3MgYGNvbnRyb2xgIHByb3BlcnR5LlxuICogSG93ZXZlciwgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBwcm9wZXJ0aWVzIChsaWtlIGB2YWxpZGAgYW5kIGBkaXJ0eWApIGFsc28gZXhpc3Qgb24gdGhlIGNvbnRyb2xcbiAqIGZvciBkaXJlY3QgYWNjZXNzLiBTZWUgYSBmdWxsIGxpc3Qgb2YgcHJvcGVydGllcyBkaXJlY3RseSBhdmFpbGFibGUgaW5cbiAqIGBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmVgLlxuICpcbiAqIEBzZWUgYFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3JgXG4gKiBAc2VlIGBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcmBcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBVc2luZyBuZ01vZGVsIG9uIGEgc3RhbmRhbG9uZSBjb250cm9sXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IGEgc2ltcGxlIHN0YW5kYWxvbmUgY29udHJvbCB1c2luZyBgbmdNb2RlbGA6XG4gKlxuICoge0BleGFtcGxlIGZvcm1zL3RzL3NpbXBsZU5nTW9kZWwvc2ltcGxlX25nX21vZGVsX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfVxuICpcbiAqIFdoZW4gdXNpbmcgdGhlIGBuZ01vZGVsYCB3aXRoaW4gYDxmb3JtPmAgdGFncywgeW91J2xsIGFsc28gbmVlZCB0byBzdXBwbHkgYSBgbmFtZWAgYXR0cmlidXRlXG4gKiBzbyB0aGF0IHRoZSBjb250cm9sIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIHBhcmVudCBmb3JtIHVuZGVyIHRoYXQgbmFtZS5cbiAqXG4gKiBJbiB0aGUgY29udGV4dCBvZiBhIHBhcmVudCBmb3JtLCBpdCdzIG9mdGVuIHVubmVjZXNzYXJ5IHRvIGluY2x1ZGUgb25lLXdheSBvciB0d28td2F5IGJpbmRpbmcsXG4gKiBhcyB0aGUgcGFyZW50IGZvcm0gc3luY3MgdGhlIHZhbHVlIGZvciB5b3UuIFlvdSBhY2Nlc3MgaXRzIHByb3BlcnRpZXMgYnkgZXhwb3J0aW5nIGl0IGludG8gYVxuICogbG9jYWwgdGVtcGxhdGUgdmFyaWFibGUgdXNpbmcgYG5nRm9ybWAgc3VjaCBhcyAoYCNmPVwibmdGb3JtXCJgKS4gVXNlIHRoZSB2YXJpYWJsZSB3aGVyZVxuICogbmVlZGVkIG9uIGZvcm0gc3VibWlzc2lvbi5cbiAqXG4gKiBJZiB5b3UgZG8gbmVlZCB0byBwb3B1bGF0ZSBpbml0aWFsIHZhbHVlcyBpbnRvIHlvdXIgZm9ybSwgdXNpbmcgYSBvbmUtd2F5IGJpbmRpbmcgZm9yXG4gKiBgbmdNb2RlbGAgdGVuZHMgdG8gYmUgc3VmZmljaWVudCBhcyBsb25nIGFzIHlvdSB1c2UgdGhlIGV4cG9ydGVkIGZvcm0ncyB2YWx1ZSByYXRoZXJcbiAqIHRoYW4gdGhlIGRvbWFpbiBtb2RlbCdzIHZhbHVlIG9uIHN1Ym1pdC5cbiAqXG4gKiAjIyMgVXNpbmcgbmdNb2RlbCB3aXRoaW4gYSBmb3JtXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGNvbnRyb2xzIHVzaW5nIGBuZ01vZGVsYCB3aXRoaW4gYSBmb3JtOlxuICpcbiAqIHtAZXhhbXBsZSBmb3Jtcy90cy9zaW1wbGVGb3JtL3NpbXBsZV9mb3JtX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfVxuICpcbiAqICMjIyBVc2luZyBhIHN0YW5kYWxvbmUgbmdNb2RlbCB3aXRoaW4gYSBncm91cFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIHVzZSBhIHN0YW5kYWxvbmUgbmdNb2RlbCBjb250cm9sXG4gKiB3aXRoaW4gYSBmb3JtLiBUaGlzIGNvbnRyb2xzIHRoZSBkaXNwbGF5IG9mIHRoZSBmb3JtLCBidXQgZG9lc24ndCBjb250YWluIGZvcm0gZGF0YS5cbiAqXG4gKiBgYGBodG1sXG4gKiA8Zm9ybT5cbiAqICAgPGlucHV0IG5hbWU9XCJsb2dpblwiIG5nTW9kZWwgcGxhY2Vob2xkZXI9XCJMb2dpblwiPlxuICogICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmdNb2RlbCBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+IFNob3cgbW9yZSBvcHRpb25zP1xuICogPC9mb3JtPlxuICogPCEtLSBmb3JtIHZhbHVlOiB7bG9naW46ICcnfSAtLT5cbiAqIGBgYFxuICpcbiAqICMjIyBTZXR0aW5nIHRoZSBuZ01vZGVsIGBuYW1lYCBhdHRyaWJ1dGUgdGhyb3VnaCBvcHRpb25zXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHlvdSBhbiBhbHRlcm5hdGUgd2F5IHRvIHNldCB0aGUgbmFtZSBhdHRyaWJ1dGUuIEhlcmUsXG4gKiBhbiBhdHRyaWJ1dGUgaWRlbnRpZmllZCBhcyBuYW1lIGlzIHVzZWQgd2l0aGluIGEgY3VzdG9tIGZvcm0gY29udHJvbCBjb21wb25lbnQuIFRvIHN0aWxsIGJlIGFibGVcbiAqIHRvIHNwZWNpZnkgdGhlIE5nTW9kZWwncyBuYW1lLCB5b3UgbXVzdCBzcGVjaWZ5IGl0IHVzaW5nIHRoZSBgbmdNb2RlbE9wdGlvbnNgIGlucHV0IGluc3RlYWQuXG4gKlxuICogYGBgaHRtbFxuICogPGZvcm0+XG4gKiAgIDxteS1jdXN0b20tZm9ybS1jb250cm9sIG5hbWU9XCJOYW5jeVwiIG5nTW9kZWwgW25nTW9kZWxPcHRpb25zXT1cIntuYW1lOiAndXNlcid9XCI+XG4gKiAgIDwvbXktY3VzdG9tLWZvcm0tY29udHJvbD5cbiAqIDwvZm9ybT5cbiAqIDwhLS0gZm9ybSB2YWx1ZToge3VzZXI6ICcnfSAtLT5cbiAqIGBgYFxuICpcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdNb2RlbF06bm90KFtmb3JtQ29udHJvbE5hbWVdKTpub3QoW2Zvcm1Db250cm9sXSknLFxuICBwcm92aWRlcnM6IFtmb3JtQ29udHJvbEJpbmRpbmddLFxuICBleHBvcnRBczogJ25nTW9kZWwnXG59KVxuZXhwb3J0IGNsYXNzIE5nTW9kZWwgZXh0ZW5kcyBOZ0NvbnRyb2wgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBjb250cm9sOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuXG4gIC8vIEF0IHJ1bnRpbWUgd2UgY29lcmNlIGFyYml0cmFyeSB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIFwiZGlzYWJsZWRcIiBpbnB1dCB0byBhIFwiYm9vbGVhblwiLlxuICAvLyBUaGlzIGlzIG5vdCByZWZsZWN0ZWQgaW4gdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5IGJlY2F1c2Ugb3V0c2lkZSBvZiB0ZW1wbGF0ZXMsIGNvbnN1bWVyc1xuICAvLyBzaG91bGQgb25seSBkZWFsIHdpdGggYm9vbGVhbnMuIEluIHRlbXBsYXRlcywgYSBzdHJpbmcgaXMgYWxsb3dlZCBmb3IgY29udmVuaWVuY2UgYW5kIHRvXG4gIC8vIG1hdGNoIHRoZSBuYXRpdmUgXCJkaXNhYmxlZCBhdHRyaWJ1dGVcIiBzZW1hbnRpY3Mgd2hpY2ggY2FuIGJlIG9ic2VydmVkIG9uIGlucHV0IGVsZW1lbnRzLlxuICAvLyBUaGlzIHN0YXRpYyBtZW1iZXIgdGVsbHMgdGhlIGNvbXBpbGVyIHRoYXQgdmFsdWVzIG9mIHR5cGUgXCJzdHJpbmdcIiBjYW4gYWxzbyBiZSBhc3NpZ25lZFxuICAvLyB0byB0aGUgaW5wdXQgaW4gYSB0ZW1wbGF0ZS5cbiAgLyoqIEBub2RvYyAqL1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaXNEaXNhYmxlZDogYm9vbGVhbnxzdHJpbmc7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCByZWZlcmVuY2UgdG8gdGhlIHZpZXcgbW9kZWwgdmFsdWUuXG4gICAqIEBub2RvY1xuICAgKi9cbiAgdmlld01vZGVsOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUcmFja3MgdGhlIG5hbWUgYm91bmQgdG8gdGhlIGRpcmVjdGl2ZS4gSWYgYSBwYXJlbnQgZm9ybSBleGlzdHMsIGl0XG4gICAqIHVzZXMgdGhpcyBuYW1lIGFzIGEga2V5IHRvIHJldHJpZXZlIHRoaXMgY29udHJvbCdzIHZhbHVlLlxuICAgKi9cbiAgLy8gVE9ETyhpc3N1ZS8yNDU3MSk6IHJlbW92ZSAnIScuXG4gIEBJbnB1dCgpIG92ZXJyaWRlIG5hbWUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUcmFja3Mgd2hldGhlciB0aGUgY29udHJvbCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIC8vIFRPRE8oaXNzdWUvMjQ1NzEpOiByZW1vdmUgJyEnLlxuICBASW5wdXQoJ2Rpc2FibGVkJykgaXNEaXNhYmxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUcmFja3MgdGhlIHZhbHVlIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLlxuICAgKi9cbiAgQElucHV0KCduZ01vZGVsJykgbW9kZWw6IGFueTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRyYWNrcyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGlzIGBuZ01vZGVsYCBpbnN0YW5jZS5cbiAgICpcbiAgICogKipuYW1lKio6IEFuIGFsdGVybmF0aXZlIHRvIHNldHRpbmcgdGhlIG5hbWUgYXR0cmlidXRlIG9uIHRoZSBmb3JtIGNvbnRyb2wgZWxlbWVudC4gU2VlXG4gICAqIHRoZSBbZXhhbXBsZV0oYXBpL2Zvcm1zL05nTW9kZWwjdXNpbmctbmdtb2RlbC1vbi1hLXN0YW5kYWxvbmUtY29udHJvbCkgZm9yIHVzaW5nIGBOZ01vZGVsYFxuICAgKiBhcyBhIHN0YW5kYWxvbmUgY29udHJvbC5cbiAgICpcbiAgICogKipzdGFuZGFsb25lKio6IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBgbmdNb2RlbGAgd2lsbCBub3QgcmVnaXN0ZXIgaXRzZWxmIHdpdGggaXRzIHBhcmVudCBmb3JtLFxuICAgKiBhbmQgYWN0cyBhcyBpZiBpdCdzIG5vdCBpbiB0aGUgZm9ybS4gRGVmYXVsdHMgdG8gZmFsc2UuIElmIG5vIHBhcmVudCBmb3JtIGV4aXN0cywgdGhpcyBvcHRpb25cbiAgICogaGFzIG5vIGVmZmVjdC5cbiAgICpcbiAgICogKip1cGRhdGVPbioqOiBEZWZpbmVzIHRoZSBldmVudCB1cG9uIHdoaWNoIHRoZSBmb3JtIGNvbnRyb2wgdmFsdWUgYW5kIHZhbGlkaXR5IHVwZGF0ZS5cbiAgICogRGVmYXVsdHMgdG8gJ2NoYW5nZScuIFBvc3NpYmxlIHZhbHVlczogYCdjaGFuZ2UnYCB8IGAnYmx1cidgIHwgYCdzdWJtaXQnYC5cbiAgICpcbiAgICovXG4gIC8vIFRPRE8oaXNzdWUvMjQ1NzEpOiByZW1vdmUgJyEnLlxuICBASW5wdXQoJ25nTW9kZWxPcHRpb25zJykgb3B0aW9ucyE6IHtuYW1lPzogc3RyaW5nLCBzdGFuZGFsb25lPzogYm9vbGVhbiwgdXBkYXRlT24/OiBGb3JtSG9va3N9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRXZlbnQgZW1pdHRlciBmb3IgcHJvZHVjaW5nIHRoZSBgbmdNb2RlbENoYW5nZWAgZXZlbnQgYWZ0ZXJcbiAgICogdGhlIHZpZXcgbW9kZWwgdXBkYXRlcy5cbiAgICovXG4gIEBPdXRwdXQoJ25nTW9kZWxDaGFuZ2UnKSB1cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBAT3B0aW9uYWwoKSBASG9zdCgpIHBhcmVudDogQ29udHJvbENvbnRhaW5lcixcbiAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxJREFUT1JTKSB2YWxpZGF0b3JzOiAoVmFsaWRhdG9yfFZhbGlkYXRvckZuKVtdLFxuICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIGFzeW5jVmFsaWRhdG9yczpcbiAgICAgICAgICAoQXN5bmNWYWxpZGF0b3J8QXN5bmNWYWxpZGF0b3JGbilbXSxcbiAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxVRV9BQ0NFU1NPUikgdmFsdWVBY2Nlc3NvcnM6IENvbnRyb2xWYWx1ZUFjY2Vzc29yW10sXG4gICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZj86IENoYW5nZURldGVjdG9yUmVmfG51bGwsXG4gICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENBTExfU0VUX0RJU0FCTEVEX1NUQVRFKSBwcml2YXRlIGNhbGxTZXREaXNhYmxlZFN0YXRlPzpcbiAgICAgICAgICBTZXREaXNhYmxlZFN0YXRlT3B0aW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5fc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICB0aGlzLl9zZXRBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzKTtcbiAgICB0aGlzLnZhbHVlQWNjZXNzb3IgPSBzZWxlY3RWYWx1ZUFjY2Vzc29yKHRoaXMsIHZhbHVlQWNjZXNzb3JzKTtcbiAgfVxuXG4gIC8qKiBAbm9kb2MgKi9cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuX2NoZWNrRm9yRXJyb3JzKCk7XG4gICAgaWYgKCF0aGlzLl9yZWdpc3RlcmVkIHx8ICduYW1lJyBpbiBjaGFuZ2VzKSB7XG4gICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZCkge1xuICAgICAgICB0aGlzLl9jaGVja05hbWUoKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybURpcmVjdGl2ZSkge1xuICAgICAgICAgIC8vIFdlIGNhbid0IGNhbGwgYGZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh0aGlzKWAsIGJlY2F1c2UgdGhlIGBuYW1lYCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgICAgICAgLy8gY2hhbmdlZC4gV2UgYWxzbyBjYW4ndCByZXNldCB0aGUgbmFtZSB0ZW1wb3JhcmlseSBzaW5jZSB0aGUgbG9naWMgaW4gYHJlbW92ZUNvbnRyb2xgXG4gICAgICAgICAgLy8gaXMgaW5zaWRlIGEgcHJvbWlzZSBhbmQgaXQgd29uJ3QgcnVuIGltbWVkaWF0ZWx5LiBXZSB3b3JrIGFyb3VuZCBpdCBieSBnaXZpbmcgaXQgYW5cbiAgICAgICAgICAvLyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBpbnN0ZWFkLlxuICAgICAgICAgIGNvbnN0IG9sZE5hbWUgPSBjaGFuZ2VzWyduYW1lJ10ucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgICB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh7bmFtZTogb2xkTmFtZSwgcGF0aDogdGhpcy5fZ2V0UGF0aChvbGROYW1lKX0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9zZXRVcENvbnRyb2woKTtcbiAgICB9XG4gICAgaWYgKCdpc0Rpc2FibGVkJyBpbiBjaGFuZ2VzKSB7XG4gICAgICB0aGlzLl91cGRhdGVEaXNhYmxlZChjaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlcywgdGhpcy52aWV3TW9kZWwpKSB7XG4gICAgICB0aGlzLl91cGRhdGVWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICAgIHRoaXMudmlld01vZGVsID0gdGhpcy5tb2RlbDtcbiAgICB9XG4gIH1cblxuICAvKiogQG5vZG9jICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybURpcmVjdGl2ZSAmJiB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyBhbiBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGggZnJvbSB0aGUgdG9wLWxldmVsIGZvcm0gdG8gdGhpcyBjb250cm9sLlxuICAgKiBFYWNoIGluZGV4IGlzIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgY29udHJvbCBvbiB0aGF0IGxldmVsLlxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IHBhdGgoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9nZXRQYXRoKHRoaXMubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSB0b3AtbGV2ZWwgZGlyZWN0aXZlIGZvciB0aGlzIGNvbnRyb2wgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBnZXQgZm9ybURpcmVjdGl2ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZpZXcgbW9kZWwgYW5kIGVtaXRzIGFuIGBuZ01vZGVsQ2hhbmdlYCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgZW1pdHRlZCBieSBgbmdNb2RlbENoYW5nZWAuXG4gICAqL1xuICBvdmVycmlkZSB2aWV3VG9Nb2RlbFVwZGF0ZShuZXdWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52aWV3TW9kZWwgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnVwZGF0ZS5lbWl0KG5ld1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldFVwQ29udHJvbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSgpO1xuICAgIHRoaXMuX2lzU3RhbmRhbG9uZSgpID8gdGhpcy5fc2V0VXBTdGFuZGFsb25lKCkgOiB0aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKTtcbiAgICB0aGlzLl9yZWdpc3RlcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3NldFVwZGF0ZVN0cmF0ZWd5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnVwZGF0ZU9uICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY29udHJvbC5fdXBkYXRlT24gPSB0aGlzLm9wdGlvbnMudXBkYXRlT247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNTdGFuZGFsb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fcGFyZW50IHx8ICEhKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc3RhbmRhbG9uZSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRVcFN0YW5kYWxvbmUoKTogdm9pZCB7XG4gICAgc2V0VXBDb250cm9sKHRoaXMuY29udHJvbCwgdGhpcywgdGhpcy5jYWxsU2V0RGlzYWJsZWRTdGF0ZSk7XG4gICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrRm9yRXJyb3JzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNTdGFuZGFsb25lKCkpIHtcbiAgICAgIHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpO1xuICAgIH1cbiAgICB0aGlzLl9jaGVja05hbWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrUGFyZW50VHlwZSgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICBpZiAoISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBOZ01vZGVsR3JvdXApICYmXG4gICAgICAgICAgdGhpcy5fcGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUpIHtcbiAgICAgICAgdGhyb3cgZm9ybUdyb3VwTmFtZUV4Y2VwdGlvbigpO1xuICAgICAgfSBlbHNlIGlmICghKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIE5nTW9kZWxHcm91cCkgJiYgISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBOZ0Zvcm0pKSB7XG4gICAgICAgIHRocm93IG1vZGVsUGFyZW50RXhjZXB0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tOYW1lKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm5hbWUpIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lO1xuXG4gICAgaWYgKCF0aGlzLl9pc1N0YW5kYWxvbmUoKSAmJiAhdGhpcy5uYW1lICYmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpKSB7XG4gICAgICB0aHJvdyBtaXNzaW5nTmFtZUV4Y2VwdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICByZXNvbHZlZFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHtlbWl0Vmlld1RvTW9kZWxDaGFuZ2U6IGZhbHNlfSk7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj8ubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEaXNhYmxlZChjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgZGlzYWJsZWRWYWx1ZSA9IGNoYW5nZXNbJ2lzRGlzYWJsZWQnXS5jdXJyZW50VmFsdWU7XG4gICAgLy8gY2hlY2tpbmcgZm9yIDAgdG8gYXZvaWQgYnJlYWtpbmcgY2hhbmdlXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IGRpc2FibGVkVmFsdWUgIT09IDAgJiYgY29lcmNlVG9Cb29sZWFuKGRpc2FibGVkVmFsdWUpO1xuXG4gICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGlzRGlzYWJsZWQgJiYgIXRoaXMuY29udHJvbC5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIGlmICghaXNEaXNhYmxlZCAmJiB0aGlzLmNvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5jb250cm9sLmVuYWJsZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj8ubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRQYXRoKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IGNvbnRyb2xQYXRoKGNvbnRyb2xOYW1lLCB0aGlzLl9wYXJlbnQpIDogW2NvbnRyb2xOYW1lXTtcbiAgfVxufVxuIl19
|