You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
385 lines
55 KiB
385 lines
55 KiB
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
import { Directive, ElementRef, Optional, InjectionToken, Inject, Injector, InjectFlags, } from '@angular/core';
|
|
import { NG_VALUE_ACCESSOR, NG_VALIDATORS, NgForm, FormGroupDirective, NgControl, Validators, } from '@angular/forms';
|
|
import { mixinErrorState, MAT_DATE_FORMATS, DateAdapter, ErrorStateMatcher, } from '@angular/material/core';
|
|
import { BACKSPACE } from '@angular/cdk/keycodes';
|
|
import { MatDatepickerInputBase } from './datepicker-input-base';
|
|
import { DateRange } from './date-selection-model';
|
|
/**
|
|
* Used to provide the date range input wrapper component
|
|
* to the parts without circular dependencies.
|
|
*/
|
|
import * as ɵngcc0 from '@angular/core';
|
|
import * as ɵngcc1 from '@angular/material/core';
|
|
import * as ɵngcc2 from '@angular/forms';
|
|
export const MAT_DATE_RANGE_INPUT_PARENT = new InjectionToken('MAT_DATE_RANGE_INPUT_PARENT');
|
|
/**
|
|
* Base class for the individual inputs that can be projected inside a `mat-date-range-input`.
|
|
*/
|
|
class MatDateRangeInputPartBase extends MatDatepickerInputBase {
|
|
constructor(_rangeInput, elementRef, _defaultErrorStateMatcher, _injector, _parentForm, _parentFormGroup, dateAdapter, dateFormats) {
|
|
super(elementRef, dateAdapter, dateFormats);
|
|
this._rangeInput = _rangeInput;
|
|
this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
|
|
this._injector = _injector;
|
|
this._parentForm = _parentForm;
|
|
this._parentFormGroup = _parentFormGroup;
|
|
}
|
|
ngOnInit() {
|
|
// We need the date input to provide itself as a `ControlValueAccessor` and a `Validator`, while
|
|
// injecting its `NgControl` so that the error state is handled correctly. This introduces a
|
|
// circular dependency, because both `ControlValueAccessor` and `Validator` depend on the input
|
|
// itself. Usually we can work around it for the CVA, but there's no API to do it for the
|
|
// validator. We work around it here by injecting the `NgControl` in `ngOnInit`, after
|
|
// everything has been resolved.
|
|
// tslint:disable-next-line:no-bitwise
|
|
const ngControl = this._injector.get(NgControl, null, InjectFlags.Self | InjectFlags.Optional);
|
|
if (ngControl) {
|
|
this.ngControl = ngControl;
|
|
}
|
|
}
|
|
ngDoCheck() {
|
|
if (this.ngControl) {
|
|
// We need to re-evaluate this on every change detection cycle, because there are some
|
|
// error triggers that we can't subscribe to (e.g. parent form submissions). This means
|
|
// that whatever logic is in here has to be super lean or we risk destroying the performance.
|
|
this.updateErrorState();
|
|
}
|
|
}
|
|
/** Gets whether the input is empty. */
|
|
isEmpty() {
|
|
return this._elementRef.nativeElement.value.length === 0;
|
|
}
|
|
/** Gets the placeholder of the input. */
|
|
_getPlaceholder() {
|
|
return this._elementRef.nativeElement.placeholder;
|
|
}
|
|
/** Focuses the input. */
|
|
focus() {
|
|
this._elementRef.nativeElement.focus();
|
|
}
|
|
/** Handles `input` events on the input element. */
|
|
_onInput(value) {
|
|
super._onInput(value);
|
|
this._rangeInput._handleChildValueChange();
|
|
}
|
|
/** Opens the datepicker associated with the input. */
|
|
_openPopup() {
|
|
this._rangeInput._openDatepicker();
|
|
}
|
|
/** Gets the minimum date from the range input. */
|
|
_getMinDate() {
|
|
return this._rangeInput.min;
|
|
}
|
|
/** Gets the maximum date from the range input. */
|
|
_getMaxDate() {
|
|
return this._rangeInput.max;
|
|
}
|
|
/** Gets the date filter function from the range input. */
|
|
_getDateFilter() {
|
|
return this._rangeInput.dateFilter;
|
|
}
|
|
_parentDisabled() {
|
|
return this._rangeInput._groupDisabled;
|
|
}
|
|
_shouldHandleChangeEvent({ source }) {
|
|
return source !== this._rangeInput._startInput && source !== this._rangeInput._endInput;
|
|
}
|
|
_assignValueProgrammatically(value) {
|
|
super._assignValueProgrammatically(value);
|
|
const opposite = (this === this._rangeInput._startInput ? this._rangeInput._endInput :
|
|
this._rangeInput._startInput);
|
|
opposite === null || opposite === void 0 ? void 0 : opposite._validatorOnChange();
|
|
}
|
|
}
|
|
MatDateRangeInputPartBase.ɵfac = function MatDateRangeInputPartBase_Factory(t) { return new (t || MatDateRangeInputPartBase)(ɵngcc0.ɵɵdirectiveInject(MAT_DATE_RANGE_INPUT_PARENT), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ErrorStateMatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Injector), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.NgForm, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.FormGroupDirective, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.DateAdapter, 8), ɵngcc0.ɵɵdirectiveInject(MAT_DATE_FORMATS, 8)); };
|
|
MatDateRangeInputPartBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatDateRangeInputPartBase, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });
|
|
MatDateRangeInputPartBase.ctorParameters = () => [
|
|
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DATE_RANGE_INPUT_PARENT,] }] },
|
|
{ type: ElementRef },
|
|
{ type: ErrorStateMatcher },
|
|
{ type: Injector },
|
|
{ type: NgForm, decorators: [{ type: Optional }] },
|
|
{ type: FormGroupDirective, decorators: [{ type: Optional }] },
|
|
{ type: DateAdapter, decorators: [{ type: Optional }] },
|
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_DATE_FORMATS,] }] }
|
|
];
|
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatDateRangeInputPartBase, [{
|
|
type: Directive
|
|
}], function () { return [{ type: undefined, decorators: [{
|
|
type: Inject,
|
|
args: [MAT_DATE_RANGE_INPUT_PARENT]
|
|
}] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.ErrorStateMatcher }, { type: ɵngcc0.Injector }, { type: ɵngcc2.NgForm, decorators: [{
|
|
type: Optional
|
|
}] }, { type: ɵngcc2.FormGroupDirective, decorators: [{
|
|
type: Optional
|
|
}] }, { type: ɵngcc1.DateAdapter, decorators: [{
|
|
type: Optional
|
|
}] }, { type: undefined, decorators: [{
|
|
type: Optional
|
|
}, {
|
|
type: Inject,
|
|
args: [MAT_DATE_FORMATS]
|
|
}] }]; }, null); })();
|
|
const _MatDateRangeInputBase = mixinErrorState(MatDateRangeInputPartBase);
|
|
/** Input for entering the start date in a `mat-date-range-input`. */
|
|
export class MatStartDate extends _MatDateRangeInputBase {
|
|
constructor(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats) {
|
|
// TODO(crisbeto): this constructor shouldn't be necessary, but ViewEngine doesn't seem to
|
|
// handle DI correctly when it is inherited from `MatDateRangeInputPartBase`. We can drop this
|
|
// constructor once ViewEngine is removed.
|
|
super(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats);
|
|
/** Validator that checks that the start date isn't after the end date. */
|
|
this._startValidator = (control) => {
|
|
const start = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
|
|
const end = this._model ? this._model.selection.end : null;
|
|
return (!start || !end ||
|
|
this._dateAdapter.compareDate(start, end) <= 0) ?
|
|
null : { 'matStartDateInvalid': { 'end': end, 'actual': start } };
|
|
};
|
|
this._validator = Validators.compose([...super._getValidators(), this._startValidator]);
|
|
}
|
|
ngOnInit() {
|
|
// Normally this happens automatically, but it seems to break if not added explicitly when all
|
|
// of the criteria below are met:
|
|
// 1) The class extends a TS mixin.
|
|
// 2) The application is running in ViewEngine.
|
|
// 3) The application is being transpiled through tsickle.
|
|
// This can be removed once google3 is completely migrated to Ivy.
|
|
super.ngOnInit();
|
|
}
|
|
ngDoCheck() {
|
|
// Normally this happens automatically, but it seems to break if not added explicitly when all
|
|
// of the criteria below are met:
|
|
// 1) The class extends a TS mixin.
|
|
// 2) The application is running in ViewEngine.
|
|
// 3) The application is being transpiled through tsickle.
|
|
// This can be removed once google3 is completely migrated to Ivy.
|
|
super.ngDoCheck();
|
|
}
|
|
_getValueFromModel(modelValue) {
|
|
return modelValue.start;
|
|
}
|
|
_shouldHandleChangeEvent(change) {
|
|
var _a;
|
|
if (!super._shouldHandleChangeEvent(change)) {
|
|
return false;
|
|
}
|
|
else {
|
|
return !((_a = change.oldValue) === null || _a === void 0 ? void 0 : _a.start) ? !!change.selection.start :
|
|
!change.selection.start ||
|
|
!!this._dateAdapter.compareDate(change.oldValue.start, change.selection.start);
|
|
}
|
|
}
|
|
_assignValueToModel(value) {
|
|
if (this._model) {
|
|
const range = new DateRange(value, this._model.selection.end);
|
|
this._model.updateSelection(range, this);
|
|
}
|
|
}
|
|
_formatValue(value) {
|
|
super._formatValue(value);
|
|
// Any time the input value is reformatted we need to tell the parent.
|
|
this._rangeInput._handleChildValueChange();
|
|
}
|
|
/** Gets the value that should be used when mirroring the input's size. */
|
|
getMirrorValue() {
|
|
const element = this._elementRef.nativeElement;
|
|
const value = element.value;
|
|
return value.length > 0 ? value : element.placeholder;
|
|
}
|
|
}
|
|
MatStartDate.ɵfac = function MatStartDate_Factory(t) { return new (t || MatStartDate)(ɵngcc0.ɵɵdirectiveInject(MAT_DATE_RANGE_INPUT_PARENT), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ErrorStateMatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Injector), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.NgForm, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.FormGroupDirective, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.DateAdapter, 8), ɵngcc0.ɵɵdirectiveInject(MAT_DATE_FORMATS, 8)); };
|
|
MatStartDate.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatStartDate, selectors: [["input", "matStartDate", ""]], hostAttrs: ["type", "text", 1, "mat-start-date", "mat-date-range-input-inner"], hostVars: 6, hostBindings: function MatStartDate_HostBindings(rf, ctx) { if (rf & 1) {
|
|
ɵngcc0.ɵɵlistener("input", function MatStartDate_input_HostBindingHandler($event) { return ctx._onInput($event.target.value); })("change", function MatStartDate_change_HostBindingHandler() { return ctx._onChange(); })("keydown", function MatStartDate_keydown_HostBindingHandler($event) { return ctx._onKeydown($event); })("blur", function MatStartDate_blur_HostBindingHandler() { return ctx._onBlur(); });
|
|
} if (rf & 2) {
|
|
ɵngcc0.ɵɵhostProperty("disabled", ctx.disabled);
|
|
ɵngcc0.ɵɵattribute("id", ctx._rangeInput.id)("aria-haspopup", ctx._rangeInput.rangePicker ? "dialog" : null)("aria-owns", (ctx._rangeInput.rangePicker == null ? null : ctx._rangeInput.rangePicker.opened) && ctx._rangeInput.rangePicker.id || null)("min", ctx._getMinDate() ? ctx._dateAdapter.toIso8601(ctx._getMinDate()) : null)("max", ctx._getMaxDate() ? ctx._dateAdapter.toIso8601(ctx._getMaxDate()) : null);
|
|
} }, inputs: { errorStateMatcher: "errorStateMatcher" }, outputs: { dateChange: "dateChange", dateInput: "dateInput" }, features: [ɵngcc0.ɵɵProvidersFeature([
|
|
{ provide: NG_VALUE_ACCESSOR, useExisting: MatStartDate, multi: true },
|
|
{ provide: NG_VALIDATORS, useExisting: MatStartDate, multi: true }
|
|
]), ɵngcc0.ɵɵInheritDefinitionFeature] });
|
|
MatStartDate.ctorParameters = () => [
|
|
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DATE_RANGE_INPUT_PARENT,] }] },
|
|
{ type: ElementRef },
|
|
{ type: ErrorStateMatcher },
|
|
{ type: Injector },
|
|
{ type: NgForm, decorators: [{ type: Optional }] },
|
|
{ type: FormGroupDirective, decorators: [{ type: Optional }] },
|
|
{ type: DateAdapter, decorators: [{ type: Optional }] },
|
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_DATE_FORMATS,] }] }
|
|
];
|
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatStartDate, [{
|
|
type: Directive,
|
|
args: [{
|
|
selector: 'input[matStartDate]',
|
|
host: {
|
|
'class': 'mat-start-date mat-date-range-input-inner',
|
|
'[disabled]': 'disabled',
|
|
'(input)': '_onInput($event.target.value)',
|
|
'(change)': '_onChange()',
|
|
'(keydown)': '_onKeydown($event)',
|
|
'[attr.id]': '_rangeInput.id',
|
|
'[attr.aria-haspopup]': '_rangeInput.rangePicker ? "dialog" : null',
|
|
'[attr.aria-owns]': '(_rangeInput.rangePicker?.opened && _rangeInput.rangePicker.id) || null',
|
|
'[attr.min]': '_getMinDate() ? _dateAdapter.toIso8601(_getMinDate()) : null',
|
|
'[attr.max]': '_getMaxDate() ? _dateAdapter.toIso8601(_getMaxDate()) : null',
|
|
'(blur)': '_onBlur()',
|
|
'type': 'text'
|
|
},
|
|
providers: [
|
|
{ provide: NG_VALUE_ACCESSOR, useExisting: MatStartDate, multi: true },
|
|
{ provide: NG_VALIDATORS, useExisting: MatStartDate, multi: true }
|
|
],
|
|
// These need to be specified explicitly, because some tooling doesn't
|
|
// seem to pick them up from the base class. See #20932.
|
|
outputs: ['dateChange', 'dateInput'],
|
|
inputs: ['errorStateMatcher']
|
|
}]
|
|
}], function () { return [{ type: undefined, decorators: [{
|
|
type: Inject,
|
|
args: [MAT_DATE_RANGE_INPUT_PARENT]
|
|
}] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.ErrorStateMatcher }, { type: ɵngcc0.Injector }, { type: ɵngcc2.NgForm, decorators: [{
|
|
type: Optional
|
|
}] }, { type: ɵngcc2.FormGroupDirective, decorators: [{
|
|
type: Optional
|
|
}] }, { type: ɵngcc1.DateAdapter, decorators: [{
|
|
type: Optional
|
|
}] }, { type: undefined, decorators: [{
|
|
type: Optional
|
|
}, {
|
|
type: Inject,
|
|
args: [MAT_DATE_FORMATS]
|
|
}] }]; }, null); })();
|
|
/** Input for entering the end date in a `mat-date-range-input`. */
|
|
export class MatEndDate extends _MatDateRangeInputBase {
|
|
constructor(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats) {
|
|
// TODO(crisbeto): this constructor shouldn't be necessary, but ViewEngine doesn't seem to
|
|
// handle DI correctly when it is inherited from `MatDateRangeInputPartBase`. We can drop this
|
|
// constructor once ViewEngine is removed.
|
|
super(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats);
|
|
/** Validator that checks that the end date isn't before the start date. */
|
|
this._endValidator = (control) => {
|
|
const end = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
|
|
const start = this._model ? this._model.selection.start : null;
|
|
return (!end || !start ||
|
|
this._dateAdapter.compareDate(end, start) >= 0) ?
|
|
null : { 'matEndDateInvalid': { 'start': start, 'actual': end } };
|
|
};
|
|
this._validator = Validators.compose([...super._getValidators(), this._endValidator]);
|
|
}
|
|
ngOnInit() {
|
|
// Normally this happens automatically, but it seems to break if not added explicitly when all
|
|
// of the criteria below are met:
|
|
// 1) The class extends a TS mixin.
|
|
// 2) The application is running in ViewEngine.
|
|
// 3) The application is being transpiled through tsickle.
|
|
// This can be removed once google3 is completely migrated to Ivy.
|
|
super.ngOnInit();
|
|
}
|
|
ngDoCheck() {
|
|
// Normally this happens automatically, but it seems to break if not added explicitly when all
|
|
// of the criteria below are met:
|
|
// 1) The class extends a TS mixin.
|
|
// 2) The application is running in ViewEngine.
|
|
// 3) The application is being transpiled through tsickle.
|
|
// This can be removed once google3 is completely migrated to Ivy.
|
|
super.ngDoCheck();
|
|
}
|
|
_getValueFromModel(modelValue) {
|
|
return modelValue.end;
|
|
}
|
|
_shouldHandleChangeEvent(change) {
|
|
var _a;
|
|
if (!super._shouldHandleChangeEvent(change)) {
|
|
return false;
|
|
}
|
|
else {
|
|
return !((_a = change.oldValue) === null || _a === void 0 ? void 0 : _a.end) ? !!change.selection.end :
|
|
!change.selection.end ||
|
|
!!this._dateAdapter.compareDate(change.oldValue.end, change.selection.end);
|
|
}
|
|
}
|
|
_assignValueToModel(value) {
|
|
if (this._model) {
|
|
const range = new DateRange(this._model.selection.start, value);
|
|
this._model.updateSelection(range, this);
|
|
}
|
|
}
|
|
_onKeydown(event) {
|
|
// If the user is pressing backspace on an empty end input, move focus back to the start.
|
|
if (event.keyCode === BACKSPACE && !this._elementRef.nativeElement.value) {
|
|
this._rangeInput._startInput.focus();
|
|
}
|
|
super._onKeydown(event);
|
|
}
|
|
}
|
|
MatEndDate.ɵfac = function MatEndDate_Factory(t) { return new (t || MatEndDate)(ɵngcc0.ɵɵdirectiveInject(MAT_DATE_RANGE_INPUT_PARENT), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.ErrorStateMatcher), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.Injector), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.NgForm, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.FormGroupDirective, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.DateAdapter, 8), ɵngcc0.ɵɵdirectiveInject(MAT_DATE_FORMATS, 8)); };
|
|
MatEndDate.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatEndDate, selectors: [["input", "matEndDate", ""]], hostAttrs: ["type", "text", 1, "mat-end-date", "mat-date-range-input-inner"], hostVars: 5, hostBindings: function MatEndDate_HostBindings(rf, ctx) { if (rf & 1) {
|
|
ɵngcc0.ɵɵlistener("input", function MatEndDate_input_HostBindingHandler($event) { return ctx._onInput($event.target.value); })("change", function MatEndDate_change_HostBindingHandler() { return ctx._onChange(); })("keydown", function MatEndDate_keydown_HostBindingHandler($event) { return ctx._onKeydown($event); })("blur", function MatEndDate_blur_HostBindingHandler() { return ctx._onBlur(); });
|
|
} if (rf & 2) {
|
|
ɵngcc0.ɵɵhostProperty("disabled", ctx.disabled);
|
|
ɵngcc0.ɵɵattribute("aria-haspopup", ctx._rangeInput.rangePicker ? "dialog" : null)("aria-owns", (ctx._rangeInput.rangePicker == null ? null : ctx._rangeInput.rangePicker.opened) && ctx._rangeInput.rangePicker.id || null)("min", ctx._getMinDate() ? ctx._dateAdapter.toIso8601(ctx._getMinDate()) : null)("max", ctx._getMaxDate() ? ctx._dateAdapter.toIso8601(ctx._getMaxDate()) : null);
|
|
} }, inputs: { errorStateMatcher: "errorStateMatcher" }, outputs: { dateChange: "dateChange", dateInput: "dateInput" }, features: [ɵngcc0.ɵɵProvidersFeature([
|
|
{ provide: NG_VALUE_ACCESSOR, useExisting: MatEndDate, multi: true },
|
|
{ provide: NG_VALIDATORS, useExisting: MatEndDate, multi: true }
|
|
]), ɵngcc0.ɵɵInheritDefinitionFeature] });
|
|
MatEndDate.ctorParameters = () => [
|
|
{ type: undefined, decorators: [{ type: Inject, args: [MAT_DATE_RANGE_INPUT_PARENT,] }] },
|
|
{ type: ElementRef },
|
|
{ type: ErrorStateMatcher },
|
|
{ type: Injector },
|
|
{ type: NgForm, decorators: [{ type: Optional }] },
|
|
{ type: FormGroupDirective, decorators: [{ type: Optional }] },
|
|
{ type: DateAdapter, decorators: [{ type: Optional }] },
|
|
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_DATE_FORMATS,] }] }
|
|
];
|
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatEndDate, [{
|
|
type: Directive,
|
|
args: [{
|
|
selector: 'input[matEndDate]',
|
|
host: {
|
|
'class': 'mat-end-date mat-date-range-input-inner',
|
|
'[disabled]': 'disabled',
|
|
'(input)': '_onInput($event.target.value)',
|
|
'(change)': '_onChange()',
|
|
'(keydown)': '_onKeydown($event)',
|
|
'[attr.aria-haspopup]': '_rangeInput.rangePicker ? "dialog" : null',
|
|
'[attr.aria-owns]': '(_rangeInput.rangePicker?.opened && _rangeInput.rangePicker.id) || null',
|
|
'[attr.min]': '_getMinDate() ? _dateAdapter.toIso8601(_getMinDate()) : null',
|
|
'[attr.max]': '_getMaxDate() ? _dateAdapter.toIso8601(_getMaxDate()) : null',
|
|
'(blur)': '_onBlur()',
|
|
'type': 'text'
|
|
},
|
|
providers: [
|
|
{ provide: NG_VALUE_ACCESSOR, useExisting: MatEndDate, multi: true },
|
|
{ provide: NG_VALIDATORS, useExisting: MatEndDate, multi: true }
|
|
],
|
|
// These need to be specified explicitly, because some tooling doesn't
|
|
// seem to pick them up from the base class. See #20932.
|
|
outputs: ['dateChange', 'dateInput'],
|
|
inputs: ['errorStateMatcher']
|
|
}]
|
|
}], function () { return [{ type: undefined, decorators: [{
|
|
type: Inject,
|
|
args: [MAT_DATE_RANGE_INPUT_PARENT]
|
|
}] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc1.ErrorStateMatcher }, { type: ɵngcc0.Injector }, { type: ɵngcc2.NgForm, decorators: [{
|
|
type: Optional
|
|
}] }, { type: ɵngcc2.FormGroupDirective, decorators: [{
|
|
type: Optional
|
|
}] }, { type: ɵngcc1.DateAdapter, decorators: [{
|
|
type: Optional
|
|
}] }, { type: undefined, decorators: [{
|
|
type: Optional
|
|
}, {
|
|
type: Inject,
|
|
args: [MAT_DATE_FORMATS]
|
|
}] }]; }, null); })();
|
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1pbnB1dC1wYXJ0cy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL2RhdGVwaWNrZXIvZGF0ZS1yYW5nZS1pbnB1dC1wYXJ0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLGNBQWMsRUFDZCxNQUFNLEVBRU4sUUFBUSxFQUNSLFdBQVcsR0FFWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixNQUFNLEVBQ04sa0JBQWtCLEVBQ2xCLFNBQVMsRUFFVCxVQUFVLEdBR1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBRUwsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixXQUFXLEVBRVgsaUJBQWlCLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBQyxzQkFBc0IsRUFBZSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBQyxTQUFTLEVBQTJCLE1BQU0sd0JBQXdCLENBQUM7QUFtQjNFO0FBQ0E7QUFDQTtBQUNBLEdBQUc7Ozs7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FDcEMsSUFBSSxjQUFjLENBQW1DLDZCQUE2QixDQUFDLENBQUM7QUFFeEY7QUFDQTtBQUNBLEdBQUc7QUFDSCxNQUNlLHlCQUNiLFNBQVEsc0JBQW9DO0FBQUcsSUFZL0MsWUFDOEMsV0FBdUMsRUFDbkYsVUFBd0MsRUFDakMseUJBQTRDLEVBQzNDLFNBQW1CLEVBQ1IsV0FBbUIsRUFDbkIsZ0JBQW9DLEVBQzNDLFdBQTJCLEVBQ0QsV0FBMkI7QUFDckUsUUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFX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QUFRO0FBQU8sWUE3U2xCLFdBQVcsdUJBOFNSLFFBQVE7QUFBTyw0Q0FDZixRQUFRLFlBQUksTUFBTSxTQUFDLGdCQUFnQjtBQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FBRTtBQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgT3B0aW9uYWwsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3QsXG4gIE9uSW5pdCxcbiAgSW5qZWN0b3IsXG4gIEluamVjdEZsYWdzLFxuICBEb0NoZWNrLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOR19WQUxJREFUT1JTLFxuICBOZ0Zvcm0sXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgTmdDb250cm9sLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9ycyxcbiAgQWJzdHJhY3RDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDYW5VcGRhdGVFcnJvclN0YXRlLFxuICBtaXhpbkVycm9yU3RhdGUsXG4gIE1BVF9EQVRFX0ZPUk1BVFMsXG4gIERhdGVBZGFwdGVyLFxuICBNYXREYXRlRm9ybWF0cyxcbiAgRXJyb3JTdGF0ZU1hdGNoZXIsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtCQUNLU1BBQ0V9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge01hdERhdGVwaWNrZXJJbnB1dEJhc2UsIERhdGVGaWx0ZXJGbn0gZnJvbSAnLi9kYXRlcGlja2VyLWlucHV0LWJhc2UnO1xuaW1wb3J0IHtEYXRlUmFuZ2UsIERhdGVTZWxlY3Rpb25Nb2RlbENoYW5nZX0gZnJvbSAnLi9kYXRlLXNlbGVjdGlvbi1tb2RlbCc7XG5cbi8qKiBQYXJlbnQgY29tcG9uZW50IHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQgYXJvdW5kIGBNYXRTdGFydERhdGVgIGFuZCBgTWF0RW5kRGF0ZWAuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hdERhdGVSYW5nZUlucHV0UGFyZW50PEQ+IHtcbiAgaWQ6IHN0cmluZztcbiAgbWluOiBEIHwgbnVsbDtcbiAgbWF4OiBEIHwgbnVsbDtcbiAgZGF0ZUZpbHRlcjogRGF0ZUZpbHRlckZuPEQ+O1xuICByYW5nZVBpY2tlcjoge1xuICAgIG9wZW5lZDogYm9vbGVhbjtcbiAgICBpZDogc3RyaW5nO1xuICB9O1xuICBfc3RhcnRJbnB1dDogTWF0RGF0ZVJhbmdlSW5wdXRQYXJ0QmFzZTxEPjtcbiAgX2VuZElucHV0OiBNYXREYXRlUmFuZ2VJbnB1dFBhcnRCYXNlPEQ+O1xuICBfZ3JvdXBEaXNhYmxlZDogYm9vbGVhbjtcbiAgX2hhbmRsZUNoaWxkVmFsdWVDaGFuZ2UoKTogdm9pZDtcbiAgX29wZW5EYXRlcGlja2VyKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVXNlZCB0byBwcm92aWRlIHRoZSBkYXRlIHJhbmdlIGlucHV0IHdyYXBwZXIgY29tcG9uZW50XG4gKiB0byB0aGUgcGFydHMgd2l0aG91dCBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVRfREFURV9SQU5HRV9JTlBVVF9QQVJFTlQgPVxuICAgIG5ldyBJbmplY3Rpb25Ub2tlbjxNYXREYXRlUmFuZ2VJbnB1dFBhcmVudDx1bmtub3duPj4oJ01BVF9EQVRFX1JBTkdFX0lOUFVUX1BBUkVOVCcpO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHRoZSBpbmRpdmlkdWFsIGlucHV0cyB0aGF0IGNhbiBiZSBwcm9qZWN0ZWQgaW5zaWRlIGEgYG1hdC1kYXRlLXJhbmdlLWlucHV0YC5cbiAqL1xuQERpcmVjdGl2ZSgpXG5hYnN0cmFjdCBjbGFzcyBNYXREYXRlUmFuZ2VJbnB1dFBhcnRCYXNlPEQ+XG4gIGV4dGVuZHMgTWF0RGF0ZXBpY2tlcklucHV0QmFzZTxEYXRlUmFuZ2U8RD4+IGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrIHtcblxuICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICBuZ0NvbnRyb2w6IE5nQ29udHJvbDtcblxuICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICBhYnN0cmFjdCB1cGRhdGVFcnJvclN0YXRlKCk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG92ZXJyaWRlIF92YWxpZGF0b3I6IFZhbGlkYXRvckZuIHwgbnVsbDtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IG92ZXJyaWRlIF9hc3NpZ25WYWx1ZVRvTW9kZWwodmFsdWU6IEQgfCBudWxsKTogdm9pZDtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IG92ZXJyaWRlIF9nZXRWYWx1ZUZyb21Nb2RlbChtb2RlbFZhbHVlOiBEYXRlUmFuZ2U8RD4pOiBEIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1BVF9EQVRFX1JBTkdFX0lOUFVUX1BBUkVOVCkgcHVibGljIF9yYW5nZUlucHV0OiBNYXREYXRlUmFuZ2VJbnB1dFBhcmVudDxEPixcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIHB1YmxpYyBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIF9wYXJlbnRGb3JtOiBOZ0Zvcm0sXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RD4sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfREFURV9GT1JNQVRTKSBkYXRlRm9ybWF0czogTWF0RGF0ZUZvcm1hdHMpIHtcbiAgICBzdXBlcihlbGVtZW50UmVmLCBkYXRlQWRhcHRlciwgZGF0ZUZvcm1hdHMpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gV2UgbmVlZCB0aGUgZGF0ZSBpbnB1dCB0byBwcm92aWRlIGl0c2VsZiBhcyBhIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgYW5kIGEgYFZhbGlkYXRvcmAsIHdoaWxlXG4gICAgLy8gaW5qZWN0aW5nIGl0cyBgTmdDb250cm9sYCBzbyB0aGF0IHRoZSBlcnJvciBzdGF0ZSBpcyBoYW5kbGVkIGNvcnJlY3RseS4gVGhpcyBpbnRyb2R1Y2VzIGFcbiAgICAvLyBjaXJjdWxhciBkZXBlbmRlbmN5LCBiZWNhdXNlIGJvdGggYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBhbmQgYFZhbGlkYXRvcmAgZGVwZW5kIG9uIHRoZSBpbnB1dFxuICAgIC8vIGl0c2VsZi4gVXN1YWxseSB3ZSBjYW4gd29yayBhcm91bmQgaXQgZm9yIHRoZSBDVkEsIGJ1dCB0aGVyZSdzIG5vIEFQSSB0byBkbyBpdCBmb3IgdGhlXG4gICAgLy8gdmFsaWRhdG9yLiBXZSB3b3JrIGFyb3VuZCBpdCBoZXJlIGJ5IGluamVjdGluZyB0aGUgYE5nQ29udHJvbGAgaW4gYG5nT25Jbml0YCwgYWZ0ZXJcbiAgICAvLyBldmVyeXRoaW5nIGhhcyBiZWVuIHJlc29sdmVkLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgY29uc3QgbmdDb250cm9sID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCwgSW5qZWN0RmxhZ3MuU2VsZiB8IEluamVjdEZsYWdzLk9wdGlvbmFsKTtcblxuICAgIGlmIChuZ0NvbnRyb2wpIHtcbiAgICAgIHRoaXMubmdDb250cm9sID0gbmdDb250cm9sO1xuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgdGhpcyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lXG4gICAgICAvLyBlcnJvciB0cmlnZ2VycyB0aGF0IHdlIGNhbid0IHN1YnNjcmliZSB0byAoZS5nLiBwYXJlbnQgZm9ybSBzdWJtaXNzaW9ucykuIFRoaXMgbWVhbnNcbiAgICAgIC8vIHRoYXQgd2hhdGV2ZXIgbG9naWMgaXMgaW4gaGVyZSBoYXMgdG8gYmUgc3VwZXIgbGVhbiBvciB3ZSByaXNrIGRlc3Ryb3lpbmcgdGhlIHBlcmZvcm1hbmNlLlxuICAgICAgdGhpcy51cGRhdGVFcnJvclN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldHMgd2hldGhlciB0aGUgaW5wdXQgaXMgZW1wdHkuICovXG4gIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgcGxhY2Vob2xkZXIgb2YgdGhlIGlucHV0LiAqL1xuICBfZ2V0UGxhY2Vob2xkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBpbnB1dC4gKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKiogSGFuZGxlcyBgaW5wdXRgIGV2ZW50cyBvbiB0aGUgaW5wdXQgZWxlbWVudC4gKi9cbiAgb3ZlcnJpZGUgX29uSW5wdXQodmFsdWU6IHN0cmluZykge1xuICAgIHN1cGVyLl9vbklucHV0KHZhbHVlKTtcbiAgICB0aGlzLl9yYW5nZUlucHV0Ll9oYW5kbGVDaGlsZFZhbHVlQ2hhbmdlKCk7XG4gIH1cblxuICAvKiogT3BlbnMgdGhlIGRhdGVwaWNrZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dC4gKi9cbiAgcHJvdGVjdGVkIF9vcGVuUG9wdXAoKTogdm9pZCB7XG4gICAgdGhpcy5fcmFuZ2VJbnB1dC5fb3BlbkRhdGVwaWNrZXIoKTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBtaW5pbXVtIGRhdGUgZnJvbSB0aGUgcmFuZ2UgaW5wdXQuICovXG4gIF9nZXRNaW5EYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZUlucHV0Lm1pbjtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBtYXhpbXVtIGRhdGUgZnJvbSB0aGUgcmFuZ2UgaW5wdXQuICovXG4gIF9nZXRNYXhEYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZUlucHV0Lm1heDtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBkYXRlIGZpbHRlciBmdW5jdGlvbiBmcm9tIHRoZSByYW5nZSBpbnB1dC4gKi9cbiAgcHJvdGVjdGVkIF9nZXREYXRlRmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZUlucHV0LmRhdGVGaWx0ZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3BhcmVudERpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZUlucHV0Ll9ncm91cERpc2FibGVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudCh7c291cmNlfTogRGF0ZVNlbGVjdGlvbk1vZGVsQ2hhbmdlPERhdGVSYW5nZTxEPj4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc291cmNlICE9PSB0aGlzLl9yYW5nZUlucHV0Ll9zdGFydElucHV0ICYmIHNvdXJjZSAhPT0gdGhpcy5fcmFuZ2VJbnB1dC5fZW5kSW5wdXQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2Fzc2lnblZhbHVlUHJvZ3JhbW1hdGljYWxseSh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICBzdXBlci5fYXNzaWduVmFsdWVQcm9ncmFtbWF0aWNhbGx5KHZhbHVlKTtcbiAgICBjb25zdCBvcHBvc2l0ZSA9ICh0aGlzID09PSB0aGlzLl9yYW5nZUlucHV0Ll9zdGFydElucHV0ID8gdGhpcy5fcmFuZ2VJbnB1dC5fZW5kSW5wdXQgOlxuICAgICAgICB0aGlzLl9yYW5nZUlucHV0Ll9zdGFydElucHV0KSBhcyBNYXREYXRlUmFuZ2VJbnB1dFBhcnRCYXNlPEQ+IHwgdW5kZWZpbmVkO1xuICAgIG9wcG9zaXRlPy5fdmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgfVxufVxuXG5jb25zdCBfTWF0RGF0ZVJhbmdlSW5wdXRCYXNlID0gbWl4aW5FcnJvclN0YXRlKE1hdERhdGVSYW5nZUlucHV0UGFydEJhc2UpO1xuXG4vKiogSW5wdXQgZm9yIGVudGVyaW5nIHRoZSBzdGFydCBkYXRlIGluIGEgYG1hdC1kYXRlLXJhbmdlLWlucHV0YC4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2lucHV0W21hdFN0YXJ0RGF0ZV0nLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1zdGFydC1kYXRlIG1hdC1kYXRlLXJhbmdlLWlucHV0LWlubmVyJyxcbiAgICAnW2Rpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgJyhpbnB1dCknOiAnX29uSW5wdXQoJGV2ZW50LnRhcmdldC52YWx1ZSknLFxuICAgICcoY2hhbmdlKSc6ICdfb25DaGFuZ2UoKScsXG4gICAgJyhrZXlkb3duKSc6ICdfb25LZXlkb3duKCRldmVudCknLFxuICAgICdbYXR0ci5pZF0nOiAnX3JhbmdlSW5wdXQuaWQnLFxuICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdfcmFuZ2VJbnB1dC5yYW5nZVBpY2tlciA/IFwiZGlhbG9nXCIgOiBudWxsJyxcbiAgICAnW2F0dHIuYXJpYS1vd25zXSc6ICcoX3JhbmdlSW5wdXQucmFuZ2VQaWNrZXI/Lm9wZW5lZCAmJiBfcmFuZ2VJbnB1dC5yYW5nZVBpY2tlci5pZCkgfHwgbnVsbCcsXG4gICAgJ1thdHRyLm1pbl0nOiAnX2dldE1pbkRhdGUoKSA/IF9kYXRlQWRhcHRlci50b0lzbzg2MDEoX2dldE1pbkRhdGUoKSkgOiBudWxsJyxcbiAgICAnW2F0dHIubWF4XSc6ICdfZ2V0TWF4RGF0ZSgpID8gX2RhdGVBZGFwdGVyLnRvSXNvODYwMShfZ2V0TWF4RGF0ZSgpKSA6IG51bGwnLFxuICAgICcoYmx1ciknOiAnX29uQmx1cigpJyxcbiAgICAndHlwZSc6ICd0ZXh0JyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogTWF0U3RhcnREYXRlLCBtdWx0aTogdHJ1ZX0sXG4gICAge3Byb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBNYXRTdGFydERhdGUsIG11bHRpOiB0cnVlfVxuICBdLFxuICAvLyBUaGVzZSBuZWVkIHRvIGJlIHNwZWNpZmllZCBleHBsaWNpdGx5LCBiZWNhdXNlIHNvbWUgdG9vbGluZyBkb2Vzbid0XG4gIC8vIHNlZW0gdG8gcGljayB0aGVtIHVwIGZyb20gdGhlIGJhc2UgY2xhc3MuIFNlZSAjMjA5MzIuXG4gIG91dHB1dHM6IFsnZGF0ZUNoYW5nZScsICdkYXRlSW5wdXQnXSxcbiAgaW5wdXRzOiBbJ2Vycm9yU3RhdGVNYXRjaGVyJ11cbn0pXG5leHBvcnQgY2xhc3MgTWF0U3RhcnREYXRlPEQ+IGV4dGVuZHMgX01hdERhdGVSYW5nZUlucHV0QmFzZTxEPiBpbXBsZW1lbnRzXG4gICAgQ2FuVXBkYXRlRXJyb3JTdGF0ZSwgRG9DaGVjaywgT25Jbml0IHtcbiAgLyoqIFZhbGlkYXRvciB0aGF0IGNoZWNrcyB0aGF0IHRoZSBzdGFydCBkYXRlIGlzbid0IGFmdGVyIHRoZSBlbmQgZGF0ZS4gKi9cbiAgcHJpdmF0ZSBfc3RhcnRWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbChcbiAgICAgIHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpKTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbCA/IHRoaXMuX21vZGVsLnNlbGVjdGlvbi5lbmQgOiBudWxsO1xuICAgIHJldHVybiAoIXN0YXJ0IHx8ICFlbmQgfHxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUoc3RhcnQsIGVuZCkgPD0gMCkgP1xuICAgICAgICBudWxsIDogeydtYXRTdGFydERhdGVJbnZhbGlkJzogeydlbmQnOiBlbmQsICdhY3R1YWwnOiBzdGFydH19O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfREFURV9SQU5HRV9JTlBVVF9QQVJFTlQpIHJhbmdlSW5wdXQ6IE1hdERhdGVSYW5nZUlucHV0UGFyZW50PEQ+LFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXG4gICAgZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKCkgcGFyZW50Rm9ybTogTmdGb3JtLFxuICAgIEBPcHRpb25hbCgpIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIEBPcHRpb25hbCgpIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEPixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9EQVRFX0ZPUk1BVFMpIGRhdGVGb3JtYXRzOiBNYXREYXRlRm9ybWF0cykge1xuXG4gICAgLy8gVE9ETyhjcmlzYmV0byk6IHRoaXMgY29uc3RydWN0b3Igc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IFZpZXdFbmdpbmUgZG9lc24ndCBzZWVtIHRvXG4gICAgLy8gaGFuZGxlIERJIGNvcnJlY3RseSB3aGVuIGl0IGlzIGluaGVyaXRlZCBmcm9tIGBNYXREYXRlUmFuZ2VJbnB1dFBhcnRCYXNlYC4gV2UgY2FuIGRyb3AgdGhpc1xuICAgIC8vIGNvbnN0cnVjdG9yIG9uY2UgVmlld0VuZ2luZSBpcyByZW1vdmVkLlxuICAgIHN1cGVyKHJhbmdlSW5wdXQsIGVsZW1lbnRSZWYsIGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgaW5qZWN0b3IsIHBhcmVudEZvcm0sIHBhcmVudEZvcm1Hcm91cCxcbiAgICAgICAgZGF0ZUFkYXB0ZXIsIGRhdGVGb3JtYXRzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIC8vIE5vcm1hbGx5IHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5LCBidXQgaXQgc2VlbXMgdG8gYnJlYWsgaWYgbm90IGFkZGVkIGV4cGxpY2l0bHkgd2hlbiBhbGxcbiAgICAvLyBvZiB0aGUgY3JpdGVyaWEgYmVsb3cgYXJlIG1ldDpcbiAgICAvLyAxKSBUaGUgY2xhc3MgZXh0ZW5kcyBhIFRTIG1peGluLlxuICAgIC8vIDIpIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIFZpZXdFbmdpbmUuXG4gICAgLy8gMykgVGhlIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHRyYW5zcGlsZWQgdGhyb3VnaCB0c2lja2xlLlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlbW92ZWQgb25jZSBnb29nbGUzIGlzIGNvbXBsZXRlbHkgbWlncmF0ZWQgdG8gSXZ5LlxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICBvdmVycmlkZSBuZ0RvQ2hlY2soKSB7XG4gICAgLy8gTm9ybWFsbHkgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHksIGJ1dCBpdCBzZWVtcyB0byBicmVhayBpZiBub3QgYWRkZWQgZXhwbGljaXRseSB3aGVuIGFsbFxuICAgIC8vIG9mIHRoZSBjcml0ZXJpYSBiZWxvdyBhcmUgbWV0OlxuICAgIC8vIDEpIFRoZSBjbGFzcyBleHRlbmRzIGEgVFMgbWl4aW4uXG4gICAgLy8gMikgVGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gVmlld0VuZ2luZS5cbiAgICAvLyAzKSBUaGUgYXBwbGljYXRpb24gaXMgYmVpbmcgdHJhbnNwaWxlZCB0aHJvdWdoIHRzaWNrbGUuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVtb3ZlZCBvbmNlIGdvb2dsZTMgaXMgY29tcGxldGVseSBtaWdyYXRlZCB0byBJdnkuXG4gICAgc3VwZXIubmdEb0NoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbLi4uc3VwZXIuX2dldFZhbGlkYXRvcnMoKSwgdGhpcy5fc3RhcnRWYWxpZGF0b3JdKTtcblxuICBwcm90ZWN0ZWQgX2dldFZhbHVlRnJvbU1vZGVsKG1vZGVsVmFsdWU6IERhdGVSYW5nZTxEPikge1xuICAgIHJldHVybiBtb2RlbFZhbHVlLnN0YXJ0O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudChcbiAgICAgIGNoYW5nZTogRGF0ZVNlbGVjdGlvbk1vZGVsQ2hhbmdlPERhdGVSYW5nZTxEPj4pOiBib29sZWFuIHtcbiAgICBpZiAoIXN1cGVyLl9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudChjaGFuZ2UpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAhY2hhbmdlLm9sZFZhbHVlPy5zdGFydCA/ICEhY2hhbmdlLnNlbGVjdGlvbi5zdGFydCA6XG4gICAgICAgICFjaGFuZ2Uuc2VsZWN0aW9uLnN0YXJ0IHx8XG4gICAgICAgICEhdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUoY2hhbmdlLm9sZFZhbHVlLnN0YXJ0LCBjaGFuZ2Uuc2VsZWN0aW9uLnN0YXJ0KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Fzc2lnblZhbHVlVG9Nb2RlbCh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5fbW9kZWwpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gbmV3IERhdGVSYW5nZSh2YWx1ZSwgdGhpcy5fbW9kZWwuc2VsZWN0aW9uLmVuZCk7XG4gICAgICB0aGlzLl9tb2RlbC51cGRhdGVTZWxlY3Rpb24ocmFuZ2UsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBfZm9ybWF0VmFsdWUodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgc3VwZXIuX2Zvcm1hdFZhbHVlKHZhbHVlKTtcblxuICAgIC8vIEFueSB0aW1lIHRoZSBpbnB1dCB2YWx1ZSBpcyByZWZvcm1hdHRlZCB3ZSBuZWVkIHRvIHRlbGwgdGhlIHBhcmVudC5cbiAgICB0aGlzLl9yYW5nZUlucHV0Ll9oYW5kbGVDaGlsZFZhbHVlQ2hhbmdlKCk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIG1pcnJvcmluZyB0aGUgaW5wdXQncyBzaXplLiAqL1xuICBnZXRNaXJyb3JWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LnZhbHVlO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiBlbGVtZW50LnBsYWNlaG9sZGVyO1xuICB9XG59XG5cblxuLyoqIElucHV0IGZvciBlbnRlcmluZyB0aGUgZW5kIGRhdGUgaW4gYSBgbWF0LWRhdGUtcmFuZ2UtaW5wdXRgLiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbbWF0RW5kRGF0ZV0nLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1lbmQtZGF0ZSBtYXQtZGF0ZS1yYW5nZS1pbnB1dC1pbm5lcicsXG4gICAgJ1tkaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICcoaW5wdXQpJzogJ19vbklucHV0KCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAnKGNoYW5nZSknOiAnX29uQ2hhbmdlKCknLFxuICAgICcoa2V5ZG93biknOiAnX29uS2V5ZG93bigkZXZlbnQpJyxcbiAgICAnW2F0dHIuYXJpYS1oYXNwb3B1cF0nOiAnX3JhbmdlSW5wdXQucmFuZ2VQaWNrZXIgPyBcImRpYWxvZ1wiIDogbnVsbCcsXG4gICAgJ1thdHRyLmFyaWEtb3duc10nOiAnKF9yYW5nZUlucHV0LnJhbmdlUGlja2VyPy5vcGVuZWQgJiYgX3JhbmdlSW5wdXQucmFuZ2VQaWNrZXIuaWQpIHx8IG51bGwnLFxuICAgICdbYXR0ci5taW5dJzogJ19nZXRNaW5EYXRlKCkgPyBfZGF0ZUFkYXB0ZXIudG9Jc284NjAxKF9nZXRNaW5EYXRlKCkpIDogbnVsbCcsXG4gICAgJ1thdHRyLm1heF0nOiAnX2dldE1heERhdGUoKSA/IF9kYXRlQWRhcHRlci50b0lzbzg2MDEoX2dldE1heERhdGUoKSkgOiBudWxsJyxcbiAgICAnKGJsdXIpJzogJ19vbkJsdXIoKScsXG4gICAgJ3R5cGUnOiAndGV4dCcsXG4gIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IE1hdEVuZERhdGUsIG11bHRpOiB0cnVlfSxcbiAgICB7cHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IE1hdEVuZERhdGUsIG11bHRpOiB0cnVlfVxuICBdLFxuICAvLyBUaGVzZSBuZWVkIHRvIGJlIHNwZWNpZmllZCBleHBsaWNpdGx5LCBiZWNhdXNlIHNvbWUgdG9vbGluZyBkb2Vzbid0XG4gIC8vIHNlZW0gdG8gcGljayB0aGVtIHVwIGZyb20gdGhlIGJhc2UgY2xhc3MuIFNlZSAjMjA5MzIuXG4gIG91dHB1dHM6IFsnZGF0ZUNoYW5nZScsICdkYXRlSW5wdXQnXSxcbiAgaW5wdXRzOiBbJ2Vycm9yU3RhdGVNYXRjaGVyJ11cbn0pXG5leHBvcnQgY2xhc3MgTWF0RW5kRGF0ZTxEPiBleHRlbmRzIF9NYXREYXRlUmFuZ2VJbnB1dEJhc2U8RD4gaW1wbGVtZW50c1xuICAgIENhblVwZGF0ZUVycm9yU3RhdGUsIERvQ2hlY2ssIE9uSW5pdCB7XG4gIC8qKiBWYWxpZGF0b3IgdGhhdCBjaGVja3MgdGhhdCB0aGUgZW5kIGRhdGUgaXNuJ3QgYmVmb3JlIHRoZSBzdGFydCBkYXRlLiAqL1xuICBwcml2YXRlIF9lbmRWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZSkpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwgPyB0aGlzLl9tb2RlbC5zZWxlY3Rpb24uc3RhcnQgOiBudWxsO1xuICAgIHJldHVybiAoIWVuZCB8fCAhc3RhcnQgfHxcbiAgICAgICAgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUoZW5kLCBzdGFydCkgPj0gMCkgP1xuICAgICAgICBudWxsIDogeydtYXRFbmREYXRlSW52YWxpZCc6IHsnc3RhcnQnOiBzdGFydCwgJ2FjdHVhbCc6IGVuZH19O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfREFURV9SQU5HRV9JTlBVVF9QQVJFTlQpIHJhbmdlSW5wdXQ6IE1hdERhdGVSYW5nZUlucHV0UGFyZW50PEQ+LFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXG4gICAgZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKCkgcGFyZW50Rm9ybTogTmdGb3JtLFxuICAgIEBPcHRpb25hbCgpIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIEBPcHRpb25hbCgpIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEPixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9EQVRFX0ZPUk1BVFMpIGRhdGVGb3JtYXRzOiBNYXREYXRlRm9ybWF0cykge1xuXG4gICAgLy8gVE9ETyhjcmlzYmV0byk6IHRoaXMgY29uc3RydWN0b3Igc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IFZpZXdFbmdpbmUgZG9lc24ndCBzZWVtIHRvXG4gICAgLy8gaGFuZGxlIERJIGNvcnJlY3RseSB3aGVuIGl0IGlzIGluaGVyaXRlZCBmcm9tIGBNYXREYXRlUmFuZ2VJbnB1dFBhcnRCYXNlYC4gV2UgY2FuIGRyb3AgdGhpc1xuICAgIC8vIGNvbnN0cnVjdG9yIG9uY2UgVmlld0VuZ2luZSBpcyByZW1vdmVkLlxuICAgIHN1cGVyKHJhbmdlSW5wdXQsIGVsZW1lbnRSZWYsIGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgaW5qZWN0b3IsIHBhcmVudEZvcm0sIHBhcmVudEZvcm1Hcm91cCxcbiAgICAgICAgZGF0ZUFkYXB0ZXIsIGRhdGVGb3JtYXRzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIC8vIE5vcm1hbGx5IHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5LCBidXQgaXQgc2VlbXMgdG8gYnJlYWsgaWYgbm90IGFkZGVkIGV4cGxpY2l0bHkgd2hlbiBhbGxcbiAgICAvLyBvZiB0aGUgY3JpdGVyaWEgYmVsb3cgYXJlIG1ldDpcbiAgICAvLyAxKSBUaGUgY2xhc3MgZXh0ZW5kcyBhIFRTIG1peGluLlxuICAgIC8vIDIpIFRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIFZpZXdFbmdpbmUuXG4gICAgLy8gMykgVGhlIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHRyYW5zcGlsZWQgdGhyb3VnaCB0c2lja2xlLlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlbW92ZWQgb25jZSBnb29nbGUzIGlzIGNvbXBsZXRlbHkgbWlncmF0ZWQgdG8gSXZ5LlxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICBvdmVycmlkZSBuZ0RvQ2hlY2soKSB7XG4gICAgLy8gTm9ybWFsbHkgdGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHksIGJ1dCBpdCBzZWVtcyB0byBicmVhayBpZiBub3QgYWRkZWQgZXhwbGljaXRseSB3aGVuIGFsbFxuICAgIC8vIG9mIHRoZSBjcml0ZXJpYSBiZWxvdyBhcmUgbWV0OlxuICAgIC8vIDEpIFRoZSBjbGFzcyBleHRlbmRzIGEgVFMgbWl4aW4uXG4gICAgLy8gMikgVGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gVmlld0VuZ2luZS5cbiAgICAvLyAzKSBUaGUgYXBwbGljYXRpb24gaXMgYmVpbmcgdHJhbnNwaWxlZCB0aHJvdWdoIHRzaWNrbGUuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVtb3ZlZCBvbmNlIGdvb2dsZTMgaXMgY29tcGxldGVseSBtaWdyYXRlZCB0byBJdnkuXG4gICAgc3VwZXIubmdEb0NoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbLi4uc3VwZXIuX2dldFZhbGlkYXRvcnMoKSwgdGhpcy5fZW5kVmFsaWRhdG9yXSk7XG5cbiAgcHJvdGVjdGVkIF9nZXRWYWx1ZUZyb21Nb2RlbChtb2RlbFZhbHVlOiBEYXRlUmFuZ2U8RD4pIHtcbiAgICByZXR1cm4gbW9kZWxWYWx1ZS5lbmQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3Nob3VsZEhhbmRsZUNoYW5nZUV2ZW50KFxuICAgICAgY2hhbmdlOiBEYXRlU2VsZWN0aW9uTW9kZWxDaGFuZ2U8RGF0ZVJhbmdlPEQ+Pik6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuX3Nob3VsZEhhbmRsZUNoYW5nZUV2ZW50KGNoYW5nZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICFjaGFuZ2Uub2xkVmFsdWU/LmVuZCA/ICEhY2hhbmdlLnNlbGVjdGlvbi5lbmQgOlxuICAgICAgICAhY2hhbmdlLnNlbGVjdGlvbi5lbmQgfHxcbiAgICAgICAgISF0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShjaGFuZ2Uub2xkVmFsdWUuZW5kLCBjaGFuZ2Uuc2VsZWN0aW9uLmVuZCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9hc3NpZ25WYWx1ZVRvTW9kZWwodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgaWYgKHRoaXMuX21vZGVsKSB7XG4gICAgICBjb25zdCByYW5nZSA9IG5ldyBEYXRlUmFuZ2UodGhpcy5fbW9kZWwuc2VsZWN0aW9uLnN0YXJ0LCB2YWx1ZSk7XG4gICAgICB0aGlzLl9tb2RlbC51cGRhdGVTZWxlY3Rpb24ocmFuZ2UsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIF9vbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAvLyBJZiB0aGUgdXNlciBpcyBwcmVzc2luZyBiYWNrc3BhY2Ugb24gYW4gZW1wdHkgZW5kIGlucHV0LCBtb3ZlIGZvY3VzIGJhY2sgdG8gdGhlIHN0YXJ0LlxuICAgIGlmIChldmVudC5rZXlDb2RlID09PSBCQUNLU1BBQ0UgJiYgIXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSkge1xuICAgICAgdGhpcy5fcmFuZ2VJbnB1dC5fc3RhcnRJbnB1dC5mb2N1cygpO1xuICAgIH1cblxuICAgIHN1cGVyLl9vbktleWRvd24oZXZlbnQpO1xuICB9XG59XG4iXX0=
|