@codebakery/origami
Advanced tools
Comparing version 3.0.0-beta.2 to 3.0.0-beta.3
@@ -1,2 +0,2 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/forms")):"function"==typeof define&&define.amd?define("@codebakery/origami/forms",["exports","@angular/core","@angular/forms"],t):t((e.codebakery=e.codebakery||{},e.codebakery.origami=e.codebakery.origami||{},e.codebakery.origami.forms={}),e.ng.core,e.ng.forms)}(this,function(e,i,r){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)};var s={provide:r.NG_VALUE_ACCESSOR,useExisting:i.forwardRef(function(){return t}),multi:!0},t=function(o){function e(e,t,i,r){var n=o.call(this,i,e,r)||this;return n.elementRef=e,n.injector=t,n.validationErrorsKey="validate",n.isWritingValue=!1,n}return function t(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}(e,o),e.prototype.ngAfterViewInit=function(){var t=this,i=this.elementRef.nativeElement;if(this.isValidatable(i)){var e=this.injector.get(r.NgControl).control;this.statusSub=e.statusChanges.subscribe(function(){"function"==typeof t.isInvalid?i.invalid=t.isInvalid(e):i.invalid=!!e.invalid&&!!e.dirty}),"function"==typeof i.validate&&e.setValidators(r.Validators.compose([e.validator,function(){return i.validate()?null:((e={})[t.validationErrorsKey]=!0,e);var e}]))}},e.prototype.ngOnDestroy=function(){this.statusSub&&this.statusSub.unsubscribe()},e.prototype.writeValue=function(e){this.isWritingValue=!0;var t=this.elementRef.nativeElement;if(this.isMultiSelectable(t)||this.isSelectable(t)){var i=this.getSelectableProperty(t,e);i&&(t[i]=e)}else this.isCheckedElement(t)?t.checked=Boolean(e):o.prototype.writeValue.call(this,e);this.isWritingValue=!1},e.prototype.onChangedEvent=function(e){if(!this.isWritingValue){var t=this.elementRef.nativeElement,i=!1;switch(e.type){case"selected-items-changed":case"selected-item-changed":i="selectedItems"===(r=this.getSelectableProperty(t))||"selectedItem"===r;break;case"selected-values-changed":case"selected-changed":i="selectedValues"===(r=this.getSelectableProperty(t))||"selected"===r;break;default:i=!0}if(i){var r=void 0;r=this.isMultiSelectable(t)||this.isSelectable(t)?this.getSelectableProperty(t):this.isCheckedElement(t)?"checked":"value",this.onChange(t[r])}}},e.prototype.isCheckedElement=function(e){return this.isPropertyDefined(e,"checked")},e.prototype.isSelectable=function(e){return this.isPropertyDefined(e,"selected")||this.isPropertyDefined(e,"selectedItem")},e.prototype.isMultiSelectable=function(e){return!!e&&!0===e.multi&&(this.isPropertyDefined(e,"selectedValues")||this.isPropertyDefined(e,"selectedValues"))},e.prototype.isValidatable=function(e){return this.isPropertyDefined(e,"invalid")},e.prototype.isPropertyDefined=function(e,t){return!!e&&t in e},e.prototype.getSelectableProperty=function(e,t){var i=this.isMultiSelectable(e),r=i?"selectedItems":"selectedItem",n=i?"selectedValues":"selected";if("boolean"!=typeof this.useSelectableValueProp){var o=r in e,s=n in e;if(o&&!s)this.useSelectableValueProp=!0;else if(!o&&s)this.useSelectableValueProp=!1;else{if(null==t)return undefined;var a=e[r];try{e[r]=t}catch(l){}this.useSelectableValueProp=e[r]===t,e[r]=a}}return this.useSelectableValueProp?r:n},e.decorators=[{type:i.Directive,args:[{selector:"[ngModel][origami],[formControlName][origami],[formControl][origami]",providers:[s]}]}],e.ctorParameters=function(){return[{type:i.ElementRef},{type:i.Injector},{type:i.Renderer2},{type:Boolean,decorators:[{type:i.Optional},{type:i.Inject,args:[r.COMPOSITION_BUFFER_MODE]}]}]},e.propDecorators={isInvalid:[{type:i.Input}],validationErrorsKey:[{type:i.Input}],onChangedEvent:[{type:i.HostListener,args:["selected-items-changed",["$event"]]},{type:i.HostListener,args:["selected-item-changed",["$event"]]},{type:i.HostListener,args:["selected-values-changed",["$event"]]},{type:i.HostListener,args:["selected-changed",["$event"]]},{type:i.HostListener,args:["checked-changed",["$event"]]},{type:i.HostListener,args:["value-changed",["$event"]]}]},e}(r.DefaultValueAccessor),o=function(){function e(){}return e.decorators=[{type:i.NgModule,args:[{declarations:[t],exports:[t]}]}],e}();e.OrigamiFormsModule=o,e.ORIGAMI_CONTROL_VALUE_ACCESSOR=s,e.OrigamiControlValueAccessor=t,Object.defineProperty(e,"__esModule",{value:!0})}); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/forms")):"function"==typeof define&&define.amd?define("@codebakery/origami/forms",["exports","@angular/core","@angular/forms"],t):t((e.codebakery=e.codebakery||{},e.codebakery.origami=e.codebakery.origami||{},e.codebakery.origami.forms={}),e.ng.core,e.ng.forms)}(this,function(e,i,r){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)};var s={provide:r.NG_VALUE_ACCESSOR,useExisting:i.forwardRef(function(){return t}),multi:!0},t=function(o){function e(e,t,i,r){var n=o.call(this,i,e,r)||this;return n.elementRef=e,n.injector=t,n.validationErrorsKey="validate",n.isWritingValue=!1,n.isUpdatingValidity=!1,n}return function t(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}(e,o),Object.defineProperty(e.prototype,"control",{get:function(){return this._control||(this._control=this.injector.get(r.NgControl).control),this._control},enumerable:!0,configurable:!0}),e.prototype.ngAfterViewInit=function(){var t=this,i=this.elementRef.nativeElement;if(this.isValidatable(i)){var e=this.control;this.statusSub=e.statusChanges.subscribe(function(){"function"==typeof t.isInvalid?i.invalid=t.isInvalid(e):i.invalid=!!e.invalid&&!!e.dirty}),"function"==typeof i.validate&&e.setValidators(r.Validators.compose([e.validator,function(){return i.validate()?null:((e={})[t.validationErrorsKey]=!0,e);var e}]))}},e.prototype.ngOnDestroy=function(){this.statusSub&&this.statusSub.unsubscribe()},e.prototype.writeValue=function(e){this.isWritingValue=!0;var t=this.elementRef.nativeElement;if(this.isMultiSelectable(t)||this.isSelectable(t)){var i=this.getSelectableProperty(t,e);i&&(t[i]=e)}else this.isCheckedElement(t)?t.checked=Boolean(e):o.prototype.writeValue.call(this,e);this.isWritingValue=!1},e.prototype.onChangedEvent=function(e){if(!this.isWritingValue){var t=this.elementRef.nativeElement,i=!1;switch(e.type){case"selected-items-changed":case"selected-item-changed":i="selectedItems"===(r=this.getSelectableProperty(t))||"selectedItem"===r;break;case"selected-values-changed":case"selected-changed":i="selectedValues"===(r=this.getSelectableProperty(t))||"selected"===r;break;default:i=!0}if(i){var r=void 0;r=this.isMultiSelectable(t)||this.isSelectable(t)?this.getSelectableProperty(t):this.isCheckedElement(t)?"checked":"value",this.onChange(t[r])}}},e.prototype.onInvalidChanged=function(){if(!this.isUpdatingValidity){var e=this.elementRef.nativeElement;this.isValidatable(e)&&this.control&&this.control.invalid!==e.invalid&&(this.isUpdatingValidity=!0,this.control.updateValueAndValidity(),this.isUpdatingValidity=!1)}},e.prototype.isCheckedElement=function(e){return this.isPropertyDefined(e,"checked")},e.prototype.isSelectable=function(e){return this.isPropertyDefined(e,"selected")||this.isPropertyDefined(e,"selectedItem")},e.prototype.isMultiSelectable=function(e){return!!e&&!0===e.multi&&(this.isPropertyDefined(e,"selectedValues")||this.isPropertyDefined(e,"selectedValues"))},e.prototype.isValidatable=function(e){return this.isPropertyDefined(e,"invalid")},e.prototype.isPropertyDefined=function(e,t){return!!e&&t in e},e.prototype.getSelectableProperty=function(e,t){var i=this.isMultiSelectable(e),r=i?"selectedItems":"selectedItem",n=i?"selectedValues":"selected";if("boolean"!=typeof this.useSelectableValueProp){var o=r in e,s=n in e;if(o&&!s)this.useSelectableValueProp=!0;else if(!o&&s)this.useSelectableValueProp=!1;else{if(null==t)return undefined;var a=e[r];try{e[r]=t}catch(l){}this.useSelectableValueProp=e[r]===t,e[r]=a}}return this.useSelectableValueProp?r:n},e.decorators=[{type:i.Directive,args:[{selector:"[ngModel][origami],[formControlName][origami],[formControl][origami]",providers:[s]}]}],e.ctorParameters=function(){return[{type:i.ElementRef},{type:i.Injector},{type:i.Renderer2},{type:Boolean,decorators:[{type:i.Optional},{type:i.Inject,args:[r.COMPOSITION_BUFFER_MODE]}]}]},e.propDecorators={isInvalid:[{type:i.Input}],validationErrorsKey:[{type:i.Input}],onChangedEvent:[{type:i.HostListener,args:["selected-items-changed",["$event"]]},{type:i.HostListener,args:["selected-item-changed",["$event"]]},{type:i.HostListener,args:["selected-values-changed",["$event"]]},{type:i.HostListener,args:["selected-changed",["$event"]]},{type:i.HostListener,args:["checked-changed",["$event"]]},{type:i.HostListener,args:["value-changed",["$event"]]}],onInvalidChanged:[{type:i.HostListener,args:["invalid-changed"]}]},e}(r.DefaultValueAccessor),o=function(){function e(){}return e.decorators=[{type:i.NgModule,args:[{declarations:[t],exports:[t]}]}],e}();e.OrigamiFormsModule=o,e.ORIGAMI_CONTROL_VALUE_ACCESSOR=s,e.OrigamiControlValueAccessor=t,Object.defineProperty(e,"__esModule",{value:!0})}); | ||
//# sourceMappingURL=origami-forms.umd.min.js.map |
@@ -119,4 +119,20 @@ /** | ||
this.isWritingValue = false; | ||
/** | ||
* Flag that informs the value accessor that it is currently updating an | ||
* element's validity and should ignore additional `invalid` property changes | ||
* until it is complete. | ||
*/ | ||
this.isUpdatingValidity = false; | ||
} | ||
/** | ||
* The `AbstractControl` attached to this element. | ||
* @return {?} | ||
*/ | ||
get control() { | ||
if (!this._control) { | ||
this._control = /** @type {?} */ (((/** @type {?} */ (this.injector.get(NgControl))).control)); | ||
} | ||
return this._control; | ||
} | ||
/** | ||
* Lifecycle callback that will connect an element's validatable properties | ||
@@ -131,3 +147,3 @@ * (if they are implemented) to the Angular control. | ||
/** @type {?} */ | ||
const control = /** @type {?} */ (((/** @type {?} */ (this.injector.get(NgControl))).control)); | ||
const control = /** @type {?} */ ((this.control)); | ||
// Allows Angular validators to update the custom element's validity | ||
@@ -246,2 +262,27 @@ this.statusSub = /** @type {?} */ ((control.statusChanges)).subscribe(() => { | ||
/** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
* @return {?} | ||
*/ | ||
onInvalidChanged() { | ||
if (!this.isUpdatingValidity) { | ||
/** @type {?} */ | ||
const element = this.elementRef.nativeElement; | ||
if (this.isValidatable(element) && | ||
this.control && | ||
this.control.invalid !== element.invalid) { | ||
this.isUpdatingValidity = true; | ||
this.control.updateValueAndValidity(); | ||
this.isUpdatingValidity = false; | ||
} | ||
} | ||
} | ||
/** | ||
* Determines whether or not an element is checkbox-like. | ||
@@ -364,3 +405,4 @@ * | ||
validationErrorsKey: [{ type: Input }], | ||
onChangedEvent: [{ type: HostListener, args: ['selected-items-changed', ['$event'],] }, { type: HostListener, args: ['selected-item-changed', ['$event'],] }, { type: HostListener, args: ['selected-values-changed', ['$event'],] }, { type: HostListener, args: ['selected-changed', ['$event'],] }, { type: HostListener, args: ['checked-changed', ['$event'],] }, { type: HostListener, args: ['value-changed', ['$event'],] }] | ||
onChangedEvent: [{ type: HostListener, args: ['selected-items-changed', ['$event'],] }, { type: HostListener, args: ['selected-item-changed', ['$event'],] }, { type: HostListener, args: ['selected-values-changed', ['$event'],] }, { type: HostListener, args: ['selected-changed', ['$event'],] }, { type: HostListener, args: ['checked-changed', ['$event'],] }, { type: HostListener, args: ['value-changed', ['$event'],] }], | ||
onInvalidChanged: [{ type: HostListener, args: ['invalid-changed',] }] | ||
}; | ||
@@ -397,2 +439,9 @@ if (false) { | ||
/** | ||
* Flag that informs the value accessor that it is currently updating an | ||
* element's validity and should ignore additional `invalid` property changes | ||
* until it is complete. | ||
* @type {?} | ||
*/ | ||
OrigamiControlValueAccessor.prototype.isUpdatingValidity; | ||
/** | ||
* Indicates whether or not to use the value property or index property for a | ||
@@ -404,2 +453,7 @@ * select or mulit-select element. When undefined, it indicates that the | ||
OrigamiControlValueAccessor.prototype.useSelectableValueProp; | ||
/** | ||
* Cached `control` value. | ||
* @type {?} | ||
*/ | ||
OrigamiControlValueAccessor.prototype._control; | ||
/** @type {?} */ | ||
@@ -411,2 +465,2 @@ OrigamiControlValueAccessor.prototype.elementRef; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29kZWJha2VyeS9vcmlnYW1pL2Zvcm1zLyIsInNvdXJjZXMiOlsic3JjL3ZhbHVlLWFjY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxFQUVSLFNBQVMsRUFDVCxVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBRVgsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ3hCLGFBQWEsOEJBQThCLEdBQWE7SUFDdEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9ERixNQUFNLGtDQUFtQyxTQUFRLG9CQUFvQjs7Ozs7OztJQW9DbkUsWUFDUyxZQUNHLFFBQWtCLEVBQzVCLFFBQW1CLEVBR25CLGVBQXdCO1FBRXhCLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBUHRDLGVBQVUsR0FBVixVQUFVO1FBQ1AsYUFBUSxHQUFSLFFBQVEsQ0FBVTs7Ozs7Ozs7bUNBckJSLFVBQVU7Ozs7Ozs4QkFXUCxLQUFLO0tBaUI3Qjs7Ozs7O0lBTUQsZUFBZTs7UUFDYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxD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QUFDLFNBQVMsQ0FBQyxDQUFDOzs7Z0JBR3pDLElBQUk7b0JBQ0YsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDNUI7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7O2lCQUVmOzs7Z0JBSUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLENBQUM7Z0JBQzNELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxhQUFhLENBQUM7YUFDcEM7aUJBQU07Z0JBQ0wsT0FBTyxTQUFTLENBQUM7YUFDbEI7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs7OztZQTdROUQsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFDTixzRUFBc0U7Z0JBQ3hFLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixDQUFDO2FBQzVDOzs7O1lBN0dDLFVBQVU7WUFHVixRQUFRO1lBS1IsU0FBUzswQ0E4SU4sUUFBUSxZQUNSLE1BQU0sU0FBQyx1QkFBdUI7Ozt3QkFsQ2hDLEtBQUs7a0NBU0wsS0FBSzs2QkF3R0wsWUFBWSxTQUFDLHdCQUF3QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2pELFlBQVksU0FBQyx1QkFBdUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNoRCxZQUFZLFNBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDbEQsWUFBWSxTQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQzNDLFlBQVksU0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUMxQyxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBQcm92aWRlcixcbiAgUmVuZGVyZXIyLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ09NUE9TSVRJT05fQlVGRkVSX01PREUsXG4gIERlZmF1bHRWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdDb250cm9sLFxuICBWYWxpZGF0b3JzLFxuICBBYnN0cmFjdENvbnRyb2xcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBhIGNoZWNrYm94LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gIGNoZWNrZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGFibGVMaWtlIHtcbiAgc2VsZWN0ZWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHNlbGVjdGVkSXRlbT86IGFueTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgbXVsdGkgc2VsZWN0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNlbGVjdGFibGVMaWtlIHtcbiAgc2VsZWN0ZWRWYWx1ZXM/OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+O1xuICBzZWxlY3RlZEl0ZW1zPzogYW55W107XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHZhbGlkYXRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRhYmxlTGlrZSB7XG4gIGludmFsaWQ/OiBib29sZWFuO1xuICB2YWxpZGF0ZT8oKTogdm9pZDtcbn1cblxuLyoqXG4gKiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBPUklHQU1JX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yKSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbi8qKlxuICogQSB2YWx1ZSBhY2Nlc3NvciBmb3IgYG5nTW9kZWxgLCBgZm9ybUNvbnRyb2xgLCBhbmQgYGZvcm1Db250cm9sTmFtZWAsIG9uXG4gKiBjdXN0b20gZWxlbWVudHMuIEluIGFkZGl0aW9uIHRvIG9uZSBvZiB0aGUgYWJvdmUgZGlyZWN0aXZlcywgYG9yaWdhbWlgXG4gKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVsZW1lbnQgdG8gZGVub3RlIHRoYXQgdGhpcyB2YWx1ZSBhY2Nlc3NvciBzaG91bGRcbiAqIGNvbnRyb2wgaXQuXG4gKlxuICogRXhhbXBsZTogYDxwYXBlci1pbnB1dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgb3JpZ2FtaT48L3BhcGVyLWlucHV0PmBcbiAqXG4gKiBUaGUgY29ubmVjdGVkIGVsZW1lbnQgc2hvdWxkIGltcGxlbWVudCBvbmUgb2YgdGhlIGJlbG93XG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYGNoZWNrZWRgIGFzIGEgYm9vbGVhbiBmb3IgY2hlY2tib3gtbGlrZSBlbGVtZW50cy5cbiAqIC0gYHNlbGVjdGVkYCBmb3Igc2luZ2xlIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG11c3QgYmUgYW4gaW5kZXggb3Igc3RyaW5nXG4gKiAgIG5hbWUgYXR0cmlidXRlLlxuICogLSBgc2VsZWN0ZWRJdGVtYCBmb3Igc2luZ2xlIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG1heSBiZSBhbnkgdHlwZS5cbiAqIC0gYHNlbGVjdGVkVmFsdWVzYCBmb3IgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBhcnJheSBvZlxuICogICBpbmRpY2VzIG9yIHN0cmluZyBuYW1lIGF0dHJpYnV0ZXMuXG4gKiAtIGBzZWxlY3RlZEl0ZW1zYCBmb3IgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBhcnJheSBvZiBhbnlcbiAqICAgdHlwZS5cbiAqIC0gYHZhbHVlYCBmb3IgYW55IGJhc2ljIGZvcm0gZWxlbWVudC4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICpcbiAqIEZvciBzZWxlY3RhYmxlIGFuZCBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLCB0aGUgYXR0cmlidXRlIGB1c2VLZXlgIHNob3VsZFxuICogYmUgc3BlY2lmaWVkIGlmIHRoZSBjb250cm9sIGJpbmRpbmdzIGFuIGluZGV4IG9yIG5hbWUgdmFsdWUgdG8gdGhlIGVsZW1lbnRcbiAqIGluc3RlYWQgb2YgYW4gb2JqZWN0LlxuICpcbiAqIEFkZGl0aW9uYWxseSwgYW4gZWxlbWVudCBtYXkgaW1wbGVtZW50IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgZGlzYWJsZWRgIGFzIGEgYm9vbGVhblxuICogLSBgaW52YWxpZGAgYXMgYSBib29sZWFuIHRvIGluZGljYXRlIHZhbGlkaXR5XG4gKiAtIGB2YWxpZGF0ZSgpYCBhcyBhIGZ1bmN0aW9uIHRvIHJ1biBjdXN0b20gdmFsaWRhdGlvblxuICpcbiAqIFRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGVzZSBldmVudHMsIGFuIGVsZW1lbnQgc2hvdWxkIGltcGxlbWVudCBvbmUgb3JcbiAqIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBldmVudHMgdG8gbm90aWZ5IEFuZ3VsYXIgb2YgYW55IHVwZGF0ZXMuXG4gKlxuICogLSBgaW5wdXRgIC0gd2lsbCB1cGRhdGUgYW55IG9mIHRoZSBhYm92ZSBwcm9wZXJ0aWVzXG4gKiAtIGBibHVyYFxuICogLSBgY2hlY2tlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLWl0ZW0tY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbXMtY2hhbmdlZGBcbiAqIC0gYHZhbHVlLWNoYW5nZWRgXG4gKiAtIGBpbnZhbGlkLWNoYW5nZWRgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnW25nTW9kZWxdW29yaWdhbWldLFtmb3JtQ29udHJvbE5hbWVdW29yaWdhbWldLFtmb3JtQ29udHJvbF1bb3JpZ2FtaV0nLFxuICBwcm92aWRlcnM6IFtPUklHQU1JX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBleHRlbmRzIERlZmF1bHRWYWx1ZUFjY2Vzc29yXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgbG9naWMgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gc2V0IGFuIGVsZW1lbnQncyBgaW52YWxpZGBcbiAgICogcHJvcGVydHkgdG8gZ2l2ZW4gdGhlIHByb3ZpZGVkIGBBYnN0cmFjdENvbnRyb2xgLiBUaGUgZGVmYXVsdCBpcyB0byBzZXQgdGhlXG4gICAqIGVsZW1lbnQgYXMgYGludmFsaWRgIHdoZW5ldmVyIHRoZSBjb250cm9sIGlzIGJvdGggaW52YWxpZCBhbmQgZGlydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBpc0ludmFsaWQ/OiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGtleSB0byB1c2Ugd2hlbiByZXBvcnRpbmcgdGhhdCBhbiBlbGVtZW50J3MgYHZhbGlkYXRlKClgIGZ1bmN0aW9uXG4gICAqIHJldHVybnMgZmFsc2UuIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgY29udHJvbCdzIGBlcnJvcnNgIG9iamVjdCB3aWxsIGJlXG4gICAqIHNldCB3aXRoIHRoaXMga2V5IGFuZCBhIHZhbHVlIG9mIHRydWUuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGtleSBpcyBcInZhbGlkYXRlXCIuXG4gICAqL1xuICBASW5wdXQoKVxuICB2YWxpZGF0aW9uRXJyb3JzS2V5ID0gJ3ZhbGlkYXRlJztcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBOZ0NvbnRyb2wncyBzdGF0dXNDaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXR1c1N1Yj86IHsgdW5zdWJzY3JpYmUoKTogdm9pZCB9O1xuICAvKipcbiAgICogTW9zdCBjdXN0b20gZWxlbWVudHMgcHJvcGVydHkgd2lsbCBlbWl0IGEgYHByb3BlcnR5LWNoYW5nZWRgIGV2ZW50IHdoZW5cbiAgICogdGhlaXIgdmFsdWUgaXMgc2V0LiBUaGlzIGZsYWcgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdG8gaWdub3JlIHRoZVxuICAgKiBuZXh0IGV2ZW50IHdoaWxlIGl0IGlzIGluIHRoZSBtaWRkbGUgb2Ygd3JpdGluZyBhIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFKVxuICAgIGNvbXBvc2l0aW9uTW9kZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihyZW5kZXJlciwgZWxlbWVudFJlZiwgY29tcG9zaXRpb25Nb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgdGhhdCB3aWxsIGNvbm5lY3QgYW4gZWxlbWVudCdzIHZhbGlkYXRhYmxlIHByb3BlcnRpZXNcbiAgICogKGlmIHRoZXkgYXJlIGltcGxlbWVudGVkKSB0byB0aGUgQW5ndWxhciBjb250cm9sLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlKGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gKDxOZ0NvbnRyb2w+dGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sKSkuY29udHJvbCE7XG4gICAgICAvLyBBbGxvd3MgQW5ndWxhciB2YWxpZGF0b3JzIHRvIHVwZGF0ZSB0aGUgY3VzdG9tIGVsZW1lbnQncyB2YWxpZGl0eVxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSBjb250cm9sLnN0YXR1c0NoYW5nZXMhLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0ludmFsaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSB0aGlzLmlzSW52YWxpZChjb250cm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSAhIWNvbnRyb2wuaW52YWxpZCAmJiAhIWNvbnRyb2wuZGlydHk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbGxvd3MgY3VzdG9tIGVsZW1lbnQgdmFsaWRhdGUgZnVuY3Rpb24gdG8gdXBkYXRlIEFuZ3VsYXIgY29udHJvbCdzXG4gICAgICAvLyB2YWxpZGl0eVxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlISgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV06IHRydWUgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3RhdHVzU3ViKSB7XG4gICAgICB0aGlzLnN0YXR1c1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSB2YWx1ZSB0byBhIGN1c3RvbSBlbGVtZW50J3MgY29ycmVjdCB2YWx1ZSBwcm9wZXJ0eSwgYmFzZWQgb24gd2hhdFxuICAgKiBraW5kIG9mIGVsZW1lbnQgdGhlIGRpcmVjdGl2ZSBjb250cm9scy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB3cml0ZVxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IHRydWU7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpIHx8IHRoaXMuaXNTZWxlY3RhYmxlKGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICAoPGFueT5lbGVtZW50KVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNXcml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGN1c3RvbSBlbGVtZW50IGV2ZW50cyBhbmQgbm90aWZ5IEFuZ3VsYXIgb2YgYW55IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY2hlY2tlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndmFsdWUtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIG9uQ2hhbmdlZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1dyaXRpbmdWYWx1ZSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRJdGVtcycgfHwgcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW0nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtY2hhbmdlZCc6IHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoYW5nZWQgPSBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkVmFsdWVzJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBsZXQgcHJvcGVydHk6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBwcm9wZXJ0eSB3aWxsIGJlIGRlZmluZWQgaWYgd2UgcmVhY2ggdGhpcyBzaW5jZSBjaGFuZ2VkIGNhbiBvbmx5XG4gICAgICAgICAgLy8gYmUgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBmb3Igc2VsZWN0YWJsZSBlbGVtZW50c1xuICAgICAgICAgIHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCkhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ2NoZWNrZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IHVzZSBgZXZlbnQuZGV0YWlsLnZhbHVlYCwgc2luY2Ugd2UgY2Fubm90IGFzc3VtZSB0aGF0IGFsbFxuICAgICAgICAvLyBjaGFuZ2UgZXZlbnRzIHdpbGwgcHJvdmlkZSB0aGF0LiBBZGRpdGlvbmFsbHksIHNvbWUgZXZlbnQgZGV0YWlsc1xuICAgICAgICAvLyBtYXkgYmUgc3BsaWNlcyBvZiBhbiBhcnJheSBvciBvYmplY3QgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShlbGVtZW50W3Byb3BlcnR5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBjaGVja2JveC1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNDaGVja2VkRWxlbWVudChlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2NoZWNrZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZCcpIHx8XG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZEl0ZW0nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZWxlbWVudCAmJlxuICAgICAgZWxlbWVudC5tdWx0aSA9PT0gdHJ1ZSAmJlxuICAgICAgKHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykgfHxcbiAgICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZGF0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFZhbGlkYXRhYmxlTGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2ludmFsaWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgcHJvcGVydHkgaXMgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWRcbiAgICogZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3JcbiAgICovXG4gIHByaXZhdGUgaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZWxlbWVudCAmJiBwcm9wZXJ0eSBpbiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc2VsZWN0YWJsZSBvciBtdWx0aS1zZWxlY3RhYmxlIGVsZW1lbnRcbiAgICogdGhhdCBzaG91bGQgYmUgdXBkYXRlZC4gVGhpcyBtZXRob2Qgd2lsbCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCB0aGVcbiAgICogdmFsdWUgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQuIElmIGl0IGNhbm5vdFxuICAgKiBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlLCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGdldCB0aGUgcHJvcGVydHkgZm9yXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIGZvciB0aGUgZWxlbWVudCdzIHByb3BlcnR5XG4gICAqIEByZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lLCBvciB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQ6IGFueSwgdmFsdWU/OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzTXVsdGkgPSB0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHZhbHVlUHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRJdGVtcycgOiAnc2VsZWN0ZWRJdGVtJztcbiAgICBjb25zdCBpbmRleFByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkVmFsdWVzJyA6ICdzZWxlY3RlZCc7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHNldHRpbmcgdGhlIGluZGV4IG9yIHZhbHVlIHByb3BlcnR5IGZvclxuICAgICAgLy8gYSBzZWxlY3RhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhhc1ZhbHVlUHJvcCA9IHZhbHVlUHJvcCBpbiBlbGVtZW50O1xuICAgICAgY29uc3QgaGFzSW5kZXhQcm9wID0gaW5kZXhQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBpZiAoaGFzVmFsdWVQcm9wICYmICFoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ZhbHVlUHJvcCAmJiBoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGVsZW1lbnRbdmFsdWVQcm9wXTtcbiAgICAgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBoYXMgYm90aCBwcm9wZXJ0aWVzLCB0cnkgdG8gc2V0IGl0IHRvIHRoZSB2YWx1ZVxuICAgICAgICAvLyBwcm9wZXJ0eSBmaXJzdC4gSWYgaXQgZmFpbHMsIHRoZW4gdXNlIHRoZSBpbmRleCBwcm9wZXJ0eVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvdWxkIHRocm93IGlmIHRoZSB2YWx1ZSBpcyBhbiB1bmV4cGVjdGVkIHR5cGVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgd2Ugc2V0IGl0IHRvIGlzIHN0aWxsIGFjY3VyYXRlLiBJZiBpdCdzXG4gICAgICAgIC8vIG5vdCB0aGVuIHRoZSBlbGVtZW50IHNpbGVudGx5IHJlamVjdGVkIHRoZSBuZXcgdmFsdWUuXG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGVsZW1lbnRbdmFsdWVQcm9wXSA9PT0gdmFsdWU7XG4gICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBpbmRleFByb3A7XG4gIH1cbn1cbiJdfQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29kZWJha2VyeS9vcmlnYW1pL2Zvcm1zLyIsInNvdXJjZXMiOlsic3JjL3ZhbHVlLWFjY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxFQUVSLFNBQVMsRUFDVCxVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBRVgsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ3hCLGFBQWEsOEJBQThCLEdBQWE7SUFDdEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9ERixNQUFNLGtDQUFtQyxTQUFRLG9CQUFvQjs7Ozs7OztJQXlEbkUsWUFDUyxZQUNHLFFBQWtCLEVBQzVCLFFBQW1CLEVBR25CLGVBQXdCO1FBRXhCLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBUHRDLGVBQVUsR0FBVixVQUFVO1FBQ1AsYUFBUSxHQUFSLFFBQVEsQ0FBVTs7Ozs7Ozs7bUNBMUNSLFVBQVU7Ozs7Ozs4QkFzQlAsS0FBSzs7Ozs7O2tDQU1ELEtBQUs7S0FxQmpDOzs7OztJQTVDRCxJQUFJLE9BQU87UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixJQUFJLENBQUMsUUFBUSxzQkFBRyxtQkFB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RUFDTixzRUFBc0U7Z0JBQ3hFLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixDQUFDO2FBQzVDOzs7O1lBN0dDLFVBQVU7WUFHVixRQUFRO1lBS1IsU0FBUzswQ0FtS04sUUFBUSxZQUNSLE1BQU0sU0FBQyx1QkFBdUI7Ozt3QkF2RGhDLEtBQUs7a0NBU0wsS0FBSzs2QkErSEwsWUFBWSxTQUFDLHdCQUF3QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2pELFlBQVksU0FBQyx1QkFBdUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNoRCxZQUFZLFNBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDbEQsWUFBWSxTQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQzNDLFlBQVksU0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUMxQyxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDOytCQXFEeEMsWUFBWSxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgUHJvdmlkZXIsXG4gIFJlbmRlcmVyMixcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFLFxuICBEZWZhdWx0VmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nQ29udHJvbCxcbiAgVmFsaWRhdG9ycyxcbiAgQWJzdHJhY3RDb250cm9sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgYSBjaGVja2JveC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja2VkRWxlbWVudExpa2Uge1xuICBjaGVja2VkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RhYmxlTGlrZSB7XG4gIHNlbGVjdGVkPzogc3RyaW5nIHwgbnVtYmVyO1xuICBzZWxlY3RlZEl0ZW0/OiBhbnk7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gIHNlbGVjdGVkVmFsdWVzPzogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgc2VsZWN0ZWRJdGVtcz86IGFueVtdO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0YWJsZUxpa2Uge1xuICBpbnZhbGlkPzogYm9vbGVhbjtcbiAgdmFsaWRhdGU/KCk6IHZvaWQ7XG59XG5cbi8qKlxuICogT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIHByb3ZpZGVyLlxuICovXG5leHBvcnQgY29uc3QgT1JJR0FNSV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciksXG4gIG11bHRpOiB0cnVlXG59O1xuXG4vKipcbiAqIEEgdmFsdWUgYWNjZXNzb3IgZm9yIGBuZ01vZGVsYCwgYGZvcm1Db250cm9sYCwgYW5kIGBmb3JtQ29udHJvbE5hbWVgLCBvblxuICogY3VzdG9tIGVsZW1lbnRzLiBJbiBhZGRpdGlvbiB0byBvbmUgb2YgdGhlIGFib3ZlIGRpcmVjdGl2ZXMsIGBvcmlnYW1pYFxuICogc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50IHRvIGRlbm90ZSB0aGF0IHRoaXMgdmFsdWUgYWNjZXNzb3Igc2hvdWxkXG4gKiBjb250cm9sIGl0LlxuICpcbiAqIEV4YW1wbGU6IGA8cGFwZXItaW5wdXQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIG9yaWdhbWk+PC9wYXBlci1pbnB1dD5gXG4gKlxuICogVGhlIGNvbm5lY3RlZCBlbGVtZW50IHNob3VsZCBpbXBsZW1lbnQgb25lIG9mIHRoZSBiZWxvd1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBjaGVja2VkYCBhcyBhIGJvb2xlYW4gZm9yIGNoZWNrYm94LWxpa2UgZWxlbWVudHMuXG4gKiAtIGBzZWxlY3RlZGAgZm9yIHNpbmdsZSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGluZGV4IG9yIHN0cmluZ1xuICogICBuYW1lIGF0dHJpYnV0ZS5cbiAqIC0gYHNlbGVjdGVkSXRlbWAgZm9yIHNpbmdsZSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKiAtIGBzZWxlY3RlZFZhbHVlc2AgZm9yIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG11c3QgYmUgYW4gYXJyYXkgb2ZcbiAqICAgaW5kaWNlcyBvciBzdHJpbmcgbmFtZSBhdHRyaWJ1dGVzLlxuICogLSBgc2VsZWN0ZWRJdGVtc2AgZm9yIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG11c3QgYmUgYW4gYXJyYXkgb2YgYW55XG4gKiAgIHR5cGUuXG4gKiAtIGB2YWx1ZWAgZm9yIGFueSBiYXNpYyBmb3JtIGVsZW1lbnQuIEl0IG1heSBiZSBhbnkgdHlwZS5cbiAqXG4gKiBGb3Igc2VsZWN0YWJsZSBhbmQgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cywgdGhlIGF0dHJpYnV0ZSBgdXNlS2V5YCBzaG91bGRcbiAqIGJlIHNwZWNpZmllZCBpZiB0aGUgY29udHJvbCBiaW5kaW5ncyBhbiBpbmRleCBvciBuYW1lIHZhbHVlIHRvIHRoZSBlbGVtZW50XG4gKiBpbnN0ZWFkIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIGFuIGVsZW1lbnQgbWF5IGltcGxlbWVudCBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYGRpc2FibGVkYCBhcyBhIGJvb2xlYW5cbiAqIC0gYGludmFsaWRgIGFzIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSB2YWxpZGl0eVxuICogLSBgdmFsaWRhdGUoKWAgYXMgYSBmdW5jdGlvbiB0byBydW4gY3VzdG9tIHZhbGlkYXRpb25cbiAqXG4gKiBUbyBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlc2UgZXZlbnRzLCBhbiBlbGVtZW50IHNob3VsZCBpbXBsZW1lbnQgb25lIG9yXG4gKiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzIHRvIG5vdGlmeSBBbmd1bGFyIG9mIGFueSB1cGRhdGVzLlxuICpcbiAqIC0gYGlucHV0YCAtIHdpbGwgdXBkYXRlIGFueSBvZiB0aGUgYWJvdmUgcHJvcGVydGllc1xuICogLSBgYmx1cmBcbiAqIC0gYGNoZWNrZWQtY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLWl0ZW1zLWNoYW5nZWRgXG4gKiAtIGB2YWx1ZS1jaGFuZ2VkYFxuICogLSBgaW52YWxpZC1jaGFuZ2VkYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6XG4gICAgJ1tuZ01vZGVsXVtvcmlnYW1pXSxbZm9ybUNvbnRyb2xOYW1lXVtvcmlnYW1pXSxbZm9ybUNvbnRyb2xdW29yaWdhbWldJyxcbiAgcHJvdmlkZXJzOiBbT1JJR0FNSV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IgZXh0ZW5kcyBEZWZhdWx0VmFsdWVBY2Nlc3NvclxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGxvZ2ljIHRvIGRldGVybWluZSB3aGF0IHRvIHNldCBhbiBlbGVtZW50J3MgYGludmFsaWRgXG4gICAqIHByb3BlcnR5IHRvIGdpdmVuIHRoZSBwcm92aWRlZCBgQWJzdHJhY3RDb250cm9sYC4gVGhlIGRlZmF1bHQgaXMgdG8gc2V0IHRoZVxuICAgKiBlbGVtZW50IGFzIGBpbnZhbGlkYCB3aGVuZXZlciB0aGUgY29udHJvbCBpcyBib3RoIGludmFsaWQgYW5kIGRpcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgaXNJbnZhbGlkPzogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gdXNlIHdoZW4gcmVwb3J0aW5nIHRoYXQgYW4gZWxlbWVudCdzIGB2YWxpZGF0ZSgpYCBmdW5jdGlvblxuICAgKiByZXR1cm5zIGZhbHNlLiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGNvbnRyb2wncyBgZXJyb3JzYCBvYmplY3Qgd2lsbCBiZVxuICAgKiBzZXQgd2l0aCB0aGlzIGtleSBhbmQgYSB2YWx1ZSBvZiB0cnVlLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBrZXkgaXMgXCJ2YWxpZGF0ZVwiLlxuICAgKi9cbiAgQElucHV0KClcbiAgdmFsaWRhdGlvbkVycm9yc0tleSA9ICd2YWxpZGF0ZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBgQWJzdHJhY3RDb250cm9sYCBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBnZXQgY29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5fY29udHJvbCkge1xuICAgICAgdGhpcy5fY29udHJvbCA9ICg8TmdDb250cm9sPnRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCkpLmNvbnRyb2whO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jb250cm9sO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byB0aGUgTmdDb250cm9sJ3Mgc3RhdHVzQ2hhbmdlcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0dXNTdWI/OiB7IHVuc3Vic2NyaWJlKCk6IHZvaWQgfTtcbiAgLyoqXG4gICAqIE1vc3QgY3VzdG9tIGVsZW1lbnRzIHByb3BlcnR5IHdpbGwgZW1pdCBhIGBwcm9wZXJ0eS1jaGFuZ2VkYCBldmVudCB3aGVuXG4gICAqIHRoZWlyIHZhbHVlIGlzIHNldC4gVGhpcyBmbGFnIGluZm9ybXMgdGhlIHZhbHVlIGFjY2Vzc29yIHRvIGlnbm9yZSB0aGVcbiAgICogbmV4dCBldmVudCB3aGlsZSBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIHdyaXRpbmcgYSB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgaXNXcml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0aGF0IGl0IGlzIGN1cnJlbnRseSB1cGRhdGluZyBhblxuICAgKiBlbGVtZW50J3MgdmFsaWRpdHkgYW5kIHNob3VsZCBpZ25vcmUgYWRkaXRpb25hbCBgaW52YWxpZGAgcHJvcGVydHkgY2hhbmdlc1xuICAgKiB1bnRpbCBpdCBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHByaXZhdGUgaXNVcGRhdGluZ1ZhbGlkaXR5ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gdXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBvciBpbmRleCBwcm9wZXJ0eSBmb3IgYVxuICAgKiBzZWxlY3Qgb3IgbXVsaXQtc2VsZWN0IGVsZW1lbnQuIFdoZW4gdW5kZWZpbmVkLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGVcbiAgICogZGV0ZXJtaW5hdGlvbiBvZiB3aGljaCBwcm9wZXJ0eSB0byB1c2UgaGFzIG5vdCBvY2N1cnJlZCB5ZXQuXG4gICAqL1xuICBwcml2YXRlIHVzZVNlbGVjdGFibGVWYWx1ZVByb3A/OiBib29sZWFuO1xuICAvKipcbiAgICogQ2FjaGVkIGBjb250cm9sYCB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFKVxuICAgIGNvbXBvc2l0aW9uTW9kZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihyZW5kZXJlciwgZWxlbWVudFJlZiwgY29tcG9zaXRpb25Nb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgdGhhdCB3aWxsIGNvbm5lY3QgYW4gZWxlbWVudCdzIHZhbGlkYXRhYmxlIHByb3BlcnRpZXNcbiAgICogKGlmIHRoZXkgYXJlIGltcGxlbWVudGVkKSB0byB0aGUgQW5ndWxhciBjb250cm9sLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlKGVsZW1lbnQpKSB7XG4gICAgICAvLyBUaGUgY29udHJvbCB3aWxsIGFsd2F5cyBiZSBzZXQgYnkgbmdBZnRlclZpZXdJbml0IGR1ZSB0byB0aGUgbmF0dXJlIG9mXG4gICAgICAvLyB0aGUgZGlyZWN0aXZlJ3Mgc2VsZWN0b3JzXG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9sITtcbiAgICAgIC8vIEFsbG93cyBBbmd1bGFyIHZhbGlkYXRvcnMgdG8gdXBkYXRlIHRoZSBjdXN0b20gZWxlbWVudCdzIHZhbGlkaXR5XG4gICAgICB0aGlzLnN0YXR1c1N1YiA9IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcyEuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlzSW52YWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVsZW1lbnQuaW52YWxpZCA9IHRoaXMuaXNJbnZhbGlkKGNvbnRyb2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuaW52YWxpZCA9ICEhY29udHJvbC5pbnZhbGlkICYmICEhY29udHJvbC5kaXJ0eTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93cyBjdXN0b20gZWxlbWVudCB2YWxpZGF0ZSBmdW5jdGlvbiB0byB1cGRhdGUgQW5ndWxhciBjb250cm9sJ3NcbiAgICAgIC8vIHZhbGlkaXR5XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFxuICAgICAgICAgIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICBjb250cm9sLnZhbGlkYXRvcixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsaWRhdGUhKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XTogdHJ1ZSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNTdWIpIHtcbiAgICAgIHRoaXMuc3RhdHVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgY3VzdG9tIGVsZW1lbnQncyBjb3JyZWN0IHZhbHVlIHByb3BlcnR5LCBiYXNlZCBvbiB3aGF0XG4gICAqIGtpbmQgb2YgZWxlbWVudCB0aGUgZGlyZWN0aXZlIGNvbnRyb2xzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCwgdmFsdWUpO1xuICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICg8YW55PmVsZW1lbnQpW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgY3VzdG9tIGVsZW1lbnQgZXZlbnRzIGFuZCBub3RpZnkgQW5ndWxhciBvZiBhbnkgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGVja2VkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd2YWx1ZS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2VkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzV3JpdGluZ1ZhbHVlKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRWYWx1ZXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgICAgIC8vIHByb3BlcnR5IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSByZWFjaCB0aGlzIHNpbmNlIGNoYW5nZWQgY2FuIG9ubHlcbiAgICAgICAgICAvLyBiZSB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGZvciBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KSE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAnY2hlY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBldmVudC5kZXRhaWwudmFsdWVgLCBzaW5jZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsXG4gICAgICAgIC8vIGNoYW5nZSBldmVudHMgd2lsbCBwcm92aWRlIHRoYXQuIEFkZGl0aW9uYWxseSwgc29tZSBldmVudCBkZXRhaWxzXG4gICAgICAgIC8vIG1heSBiZSBzcGxpY2VzIG9mIGFuIGFycmF5IG9yIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsZW1lbnRbcHJvcGVydHldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBgaW52YWxpZGAgcHJvcGVydHkgY2hhbmdlcy4gU29tZSBlbGVtZW50cywgc3VjaCBhc1xuICAgKiBgPHZhYWRpbi1kYXRlLXBpY2tlcj5gIGhhdmUgbXVsdGlwbGUgXCJ2YWx1ZXNcIi4gU2V0dGluZyB0aGUgcHJpbWFyeSB2YWx1ZVxuICAgKiAoZXguIHRoZSBkYXRlIHN0cmluZykgbWF5IHJlc3VsdCBpbiBhIHRlbXBvcmFyaWx5IGludmFsaWQgZWxlbWVudCB1bnRpbFxuICAgKiBzdWJzZXF1ZW50IHZhbHVlcyAoZXguIHRoZSBzZWxlY3RlZCBkYXRlKSBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogU2luY2UgdGhpcyB2YWx1ZSBhY2Nlc3NvciBvbmx5IGxpc3RlbnMgZm9yIHZhbHVlIGNoYW5nZXMsIGl0IG1heSBub3QgYmVcbiAgICogbm90aWZpZWQgb2YgdGhlIGNoYW5nZSBpbiB2YWxpZGl0eS4gVGhpcyBsaXN0ZW5lciB3aWxsIGxpc3RlbiBmb3IgYW55XG4gICAqIGV4cGxpY2l0eSB2YWxpZGl0eSBjaGFuZ2VzIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJlLWV2YWx1YXRlIGEgY29udHJvbCdzXG4gICAqIHZhbGlkaXR5IGlmIGl0IGFuZCB0aGUgZWxlbWVudCdzIHZhbGlkaXR5IGFyZSBvdXQgb2Ygc3luYy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2ludmFsaWQtY2hhbmdlZCcpXG4gIG9uSW52YWxpZENoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzVXBkYXRpbmdWYWxpZGl0eSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkgJiZcbiAgICAgICAgdGhpcy5jb250cm9sICYmXG4gICAgICAgIHRoaXMuY29udHJvbC5pbnZhbGlkICE9PSBlbGVtZW50LmludmFsaWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmlzVXBkYXRpbmdWYWxpZGl0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGluZ1ZhbGlkaXR5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBjaGVja2JveC1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNDaGVja2VkRWxlbWVudChlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2NoZWNrZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZCcpIHx8XG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZEl0ZW0nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZWxlbWVudCAmJlxuICAgICAgZWxlbWVudC5tdWx0aSA9PT0gdHJ1ZSAmJlxuICAgICAgKHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykgfHxcbiAgICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZGF0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFZhbGlkYXRhYmxlTGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2ludmFsaWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgcHJvcGVydHkgaXMgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWRcbiAgICogZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3JcbiAgICovXG4gIHByaXZhdGUgaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZWxlbWVudCAmJiBwcm9wZXJ0eSBpbiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc2VsZWN0YWJsZSBvciBtdWx0aS1zZWxlY3RhYmxlIGVsZW1lbnRcbiAgICogdGhhdCBzaG91bGQgYmUgdXBkYXRlZC4gVGhpcyBtZXRob2Qgd2lsbCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCB0aGVcbiAgICogdmFsdWUgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQuIElmIGl0IGNhbm5vdFxuICAgKiBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlLCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGdldCB0aGUgcHJvcGVydHkgZm9yXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIGZvciB0aGUgZWxlbWVudCdzIHByb3BlcnR5XG4gICAqIEByZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lLCBvciB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQ6IGFueSwgdmFsdWU/OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzTXVsdGkgPSB0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHZhbHVlUHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRJdGVtcycgOiAnc2VsZWN0ZWRJdGVtJztcbiAgICBjb25zdCBpbmRleFByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkVmFsdWVzJyA6ICdzZWxlY3RlZCc7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHNldHRpbmcgdGhlIGluZGV4IG9yIHZhbHVlIHByb3BlcnR5IGZvclxuICAgICAgLy8gYSBzZWxlY3RhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhhc1ZhbHVlUHJvcCA9IHZhbHVlUHJvcCBpbiBlbGVtZW50O1xuICAgICAgY29uc3QgaGFzSW5kZXhQcm9wID0gaW5kZXhQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBpZiAoaGFzVmFsdWVQcm9wICYmICFoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ZhbHVlUHJvcCAmJiBoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGVsZW1lbnRbdmFsdWVQcm9wXTtcbiAgICAgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBoYXMgYm90aCBwcm9wZXJ0aWVzLCB0cnkgdG8gc2V0IGl0IHRvIHRoZSB2YWx1ZVxuICAgICAgICAvLyBwcm9wZXJ0eSBmaXJzdC4gSWYgaXQgZmFpbHMsIHRoZW4gdXNlIHRoZSBpbmRleCBwcm9wZXJ0eVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvdWxkIHRocm93IGlmIHRoZSB2YWx1ZSBpcyBhbiB1bmV4cGVjdGVkIHR5cGVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgd2Ugc2V0IGl0IHRvIGlzIHN0aWxsIGFjY3VyYXRlLiBJZiBpdCdzXG4gICAgICAgIC8vIG5vdCB0aGVuIHRoZSBlbGVtZW50IHNpbGVudGx5IHJlamVjdGVkIHRoZSBuZXcgdmFsdWUuXG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGVsZW1lbnRbdmFsdWVQcm9wXSA9PT0gdmFsdWU7XG4gICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBpbmRleFByb3A7XG4gIH1cbn1cbiJdfQ== |
@@ -115,4 +115,27 @@ /** | ||
_this.isWritingValue = false; | ||
/** | ||
* Flag that informs the value accessor that it is currently updating an | ||
* element's validity and should ignore additional `invalid` property changes | ||
* until it is complete. | ||
*/ | ||
_this.isUpdatingValidity = false; | ||
return _this; | ||
} | ||
Object.defineProperty(OrigamiControlValueAccessor.prototype, "control", { | ||
/** | ||
* The `AbstractControl` attached to this element. | ||
*/ | ||
get: /** | ||
* The `AbstractControl` attached to this element. | ||
* @return {?} | ||
*/ | ||
function () { | ||
if (!this._control) { | ||
this._control = /** @type {?} */ (((/** @type {?} */ (this.injector.get(NgControl))).control)); | ||
} | ||
return this._control; | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}); | ||
/** | ||
@@ -138,3 +161,3 @@ * Lifecycle callback that will connect an element's validatable properties | ||
/** @type {?} */ | ||
var control_1 = /** @type {?} */ (((/** @type {?} */ (this.injector.get(NgControl))).control)); | ||
var control_1 = /** @type {?} */ ((this.control)); | ||
// Allows Angular validators to update the custom element's validity | ||
@@ -285,2 +308,50 @@ this.statusSub = /** @type {?} */ ((control_1.statusChanges)).subscribe(function () { | ||
/** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
*/ | ||
/** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
* @return {?} | ||
*/ | ||
OrigamiControlValueAccessor.prototype.onInvalidChanged = /** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
* @return {?} | ||
*/ | ||
function () { | ||
if (!this.isUpdatingValidity) { | ||
/** @type {?} */ | ||
var element = this.elementRef.nativeElement; | ||
if (this.isValidatable(element) && | ||
this.control && | ||
this.control.invalid !== element.invalid) { | ||
this.isUpdatingValidity = true; | ||
this.control.updateValueAndValidity(); | ||
this.isUpdatingValidity = false; | ||
} | ||
} | ||
}; | ||
/** | ||
* Determines whether or not an element is checkbox-like. | ||
@@ -464,3 +535,4 @@ * | ||
validationErrorsKey: [{ type: Input }], | ||
onChangedEvent: [{ type: HostListener, args: ['selected-items-changed', ['$event'],] }, { type: HostListener, args: ['selected-item-changed', ['$event'],] }, { type: HostListener, args: ['selected-values-changed', ['$event'],] }, { type: HostListener, args: ['selected-changed', ['$event'],] }, { type: HostListener, args: ['checked-changed', ['$event'],] }, { type: HostListener, args: ['value-changed', ['$event'],] }] | ||
onChangedEvent: [{ type: HostListener, args: ['selected-items-changed', ['$event'],] }, { type: HostListener, args: ['selected-item-changed', ['$event'],] }, { type: HostListener, args: ['selected-values-changed', ['$event'],] }, { type: HostListener, args: ['selected-changed', ['$event'],] }, { type: HostListener, args: ['checked-changed', ['$event'],] }, { type: HostListener, args: ['value-changed', ['$event'],] }], | ||
onInvalidChanged: [{ type: HostListener, args: ['invalid-changed',] }] | ||
}; | ||
@@ -500,2 +572,9 @@ return OrigamiControlValueAccessor; | ||
/** | ||
* Flag that informs the value accessor that it is currently updating an | ||
* element's validity and should ignore additional `invalid` property changes | ||
* until it is complete. | ||
* @type {?} | ||
*/ | ||
OrigamiControlValueAccessor.prototype.isUpdatingValidity; | ||
/** | ||
* Indicates whether or not to use the value property or index property for a | ||
@@ -507,2 +586,7 @@ * select or mulit-select element. When undefined, it indicates that the | ||
OrigamiControlValueAccessor.prototype.useSelectableValueProp; | ||
/** | ||
* Cached `control` value. | ||
* @type {?} | ||
*/ | ||
OrigamiControlValueAccessor.prototype._control; | ||
/** @type {?} */ | ||
@@ -514,2 +598,2 @@ OrigamiControlValueAccessor.prototype.elementRef; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29kZWJha2VyeS9vcmlnYW1pL2Zvcm1zLyIsInNvdXJjZXMiOlsic3JjL3ZhbHVlLWFjY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUVMLFFBQVEsRUFFUixTQUFTLEVBQ1QsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0N4QixXQUFhLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsMkJBQTJCLEVBQTNCLENBQTJCLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9EK0MsdURBQW9CO0lBb0NuRSxxQ0FDUyxZQUNHLFFBQWtCLEVBQzVCLFFBQW1CLEVBR25CLGVBQXdCO1FBTjFCLFlBUUUsa0JBQU0sUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsU0FDN0M7UUFSUSxnQkFBVSxHQUFWLFVBQVU7UUFDUCxjQUFRLEdBQVIsUUFBUSxDQUFVOzs7Ozs7OztvQ0FyQlIsVUFBVTs7Ozs7OytCQVdQLEtBQUs7O0tBaUI3QjtJQUVEOzs7T0FHRzs7Ozs7O0lBQ0gscURBQWU7Ozs7O0lBQWY7UUFBQSxpQkE4QkM7O1FBN0JDLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUks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QyxjQUMxQyxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDOztzQ0E5TzNDO0VBaUhpRCxvQkFBb0I7U0FBeEQsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBQcm92aWRlcixcbiAgUmVuZGVyZXIyLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ09NUE9TSVRJT05fQlVGRkVSX01PREUsXG4gIERlZmF1bHRWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdDb250cm9sLFxuICBWYWxpZGF0b3JzLFxuICBBYnN0cmFjdENvbnRyb2xcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBhIGNoZWNrYm94LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gIGNoZWNrZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGFibGVMaWtlIHtcbiAgc2VsZWN0ZWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHNlbGVjdGVkSXRlbT86IGFueTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgbXVsdGkgc2VsZWN0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNlbGVjdGFibGVMaWtlIHtcbiAgc2VsZWN0ZWRWYWx1ZXM/OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+O1xuICBzZWxlY3RlZEl0ZW1zPzogYW55W107XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHZhbGlkYXRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRhYmxlTGlrZSB7XG4gIGludmFsaWQ/OiBib29sZWFuO1xuICB2YWxpZGF0ZT8oKTogdm9pZDtcbn1cblxuLyoqXG4gKiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBPUklHQU1JX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yKSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbi8qKlxuICogQSB2YWx1ZSBhY2Nlc3NvciBmb3IgYG5nTW9kZWxgLCBgZm9ybUNvbnRyb2xgLCBhbmQgYGZvcm1Db250cm9sTmFtZWAsIG9uXG4gKiBjdXN0b20gZWxlbWVudHMuIEluIGFkZGl0aW9uIHRvIG9uZSBvZiB0aGUgYWJvdmUgZGlyZWN0aXZlcywgYG9yaWdhbWlgXG4gKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVsZW1lbnQgdG8gZGVub3RlIHRoYXQgdGhpcyB2YWx1ZSBhY2Nlc3NvciBzaG91bGRcbiAqIGNvbnRyb2wgaXQuXG4gKlxuICogRXhhbXBsZTogYDxwYXBlci1pbnB1dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgb3JpZ2FtaT48L3BhcGVyLWlucHV0PmBcbiAqXG4gKiBUaGUgY29ubmVjdGVkIGVsZW1lbnQgc2hvdWxkIGltcGxlbWVudCBvbmUgb2YgdGhlIGJlbG93XG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYGNoZWNrZWRgIGFzIGEgYm9vbGVhbiBmb3IgY2hlY2tib3gtbGlrZSBlbGVtZW50cy5cbiAqIC0gYHNlbGVjdGVkYCBmb3Igc2luZ2xlIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG11c3QgYmUgYW4gaW5kZXggb3Igc3RyaW5nXG4gKiAgIG5hbWUgYXR0cmlidXRlLlxuICogLSBgc2VsZWN0ZWRJdGVtYCBmb3Igc2luZ2xlIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG1heSBiZSBhbnkgdHlwZS5cbiAqIC0gYHNlbGVjdGVkVmFsdWVzYCBmb3IgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBhcnJheSBvZlxuICogICBpbmRpY2VzIG9yIHN0cmluZyBuYW1lIGF0dHJpYnV0ZXMuXG4gKiAtIGBzZWxlY3RlZEl0ZW1zYCBmb3IgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBhcnJheSBvZiBhbnlcbiAqICAgdHlwZS5cbiAqIC0gYHZhbHVlYCBmb3IgYW55IGJhc2ljIGZvcm0gZWxlbWVudC4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICpcbiAqIEZvciBzZWxlY3RhYmxlIGFuZCBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLCB0aGUgYXR0cmlidXRlIGB1c2VLZXlgIHNob3VsZFxuICogYmUgc3BlY2lmaWVkIGlmIHRoZSBjb250cm9sIGJpbmRpbmdzIGFuIGluZGV4IG9yIG5hbWUgdmFsdWUgdG8gdGhlIGVsZW1lbnRcbiAqIGluc3RlYWQgb2YgYW4gb2JqZWN0LlxuICpcbiAqIEFkZGl0aW9uYWxseSwgYW4gZWxlbWVudCBtYXkgaW1wbGVtZW50IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgZGlzYWJsZWRgIGFzIGEgYm9vbGVhblxuICogLSBgaW52YWxpZGAgYXMgYSBib29sZWFuIHRvIGluZGljYXRlIHZhbGlkaXR5XG4gKiAtIGB2YWxpZGF0ZSgpYCBhcyBhIGZ1bmN0aW9uIHRvIHJ1biBjdXN0b20gdmFsaWRhdGlvblxuICpcbiAqIFRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGVzZSBldmVudHMsIGFuIGVsZW1lbnQgc2hvdWxkIGltcGxlbWVudCBvbmUgb3JcbiAqIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBldmVudHMgdG8gbm90aWZ5IEFuZ3VsYXIgb2YgYW55IHVwZGF0ZXMuXG4gKlxuICogLSBgaW5wdXRgIC0gd2lsbCB1cGRhdGUgYW55IG9mIHRoZSBhYm92ZSBwcm9wZXJ0aWVzXG4gKiAtIGBibHVyYFxuICogLSBgY2hlY2tlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLWl0ZW0tY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbXMtY2hhbmdlZGBcbiAqIC0gYHZhbHVlLWNoYW5nZWRgXG4gKiAtIGBpbnZhbGlkLWNoYW5nZWRgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnW25nTW9kZWxdW29yaWdhbWldLFtmb3JtQ29udHJvbE5hbWVdW29yaWdhbWldLFtmb3JtQ29udHJvbF1bb3JpZ2FtaV0nLFxuICBwcm92aWRlcnM6IFtPUklHQU1JX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBleHRlbmRzIERlZmF1bHRWYWx1ZUFjY2Vzc29yXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgbG9naWMgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gc2V0IGFuIGVsZW1lbnQncyBgaW52YWxpZGBcbiAgICogcHJvcGVydHkgdG8gZ2l2ZW4gdGhlIHByb3ZpZGVkIGBBYnN0cmFjdENvbnRyb2xgLiBUaGUgZGVmYXVsdCBpcyB0byBzZXQgdGhlXG4gICAqIGVsZW1lbnQgYXMgYGludmFsaWRgIHdoZW5ldmVyIHRoZSBjb250cm9sIGlzIGJvdGggaW52YWxpZCBhbmQgZGlydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBpc0ludmFsaWQ/OiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGtleSB0byB1c2Ugd2hlbiByZXBvcnRpbmcgdGhhdCBhbiBlbGVtZW50J3MgYHZhbGlkYXRlKClgIGZ1bmN0aW9uXG4gICAqIHJldHVybnMgZmFsc2UuIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgY29udHJvbCdzIGBlcnJvcnNgIG9iamVjdCB3aWxsIGJlXG4gICAqIHNldCB3aXRoIHRoaXMga2V5IGFuZCBhIHZhbHVlIG9mIHRydWUuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGtleSBpcyBcInZhbGlkYXRlXCIuXG4gICAqL1xuICBASW5wdXQoKVxuICB2YWxpZGF0aW9uRXJyb3JzS2V5ID0gJ3ZhbGlkYXRlJztcblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBOZ0NvbnRyb2wncyBzdGF0dXNDaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXR1c1N1Yj86IHsgdW5zdWJzY3JpYmUoKTogdm9pZCB9O1xuICAvKipcbiAgICogTW9zdCBjdXN0b20gZWxlbWVudHMgcHJvcGVydHkgd2lsbCBlbWl0IGEgYHByb3BlcnR5LWNoYW5nZWRgIGV2ZW50IHdoZW5cbiAgICogdGhlaXIgdmFsdWUgaXMgc2V0LiBUaGlzIGZsYWcgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdG8gaWdub3JlIHRoZVxuICAgKiBuZXh0IGV2ZW50IHdoaWxlIGl0IGlzIGluIHRoZSBtaWRkbGUgb2Ygd3JpdGluZyBhIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFKVxuICAgIGNvbXBvc2l0aW9uTW9kZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihyZW5kZXJlciwgZWxlbWVudFJlZiwgY29tcG9zaXRpb25Nb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgdGhhdCB3aWxsIGNvbm5lY3QgYW4gZWxlbWVudCdzIHZhbGlkYXRhYmxlIHByb3BlcnRpZXNcbiAgICogKGlmIHRoZXkgYXJlIGltcGxlbWVudGVkKSB0byB0aGUgQW5ndWxhciBjb250cm9sLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlKGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gKDxOZ0NvbnRyb2w+dGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sKSkuY29udHJvbCE7XG4gICAgICAvLyBBbGxvd3MgQW5ndWxhciB2YWxpZGF0b3JzIHRvIHVwZGF0ZSB0aGUgY3VzdG9tIGVsZW1lbnQncyB2YWxpZGl0eVxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSBjb250cm9sLnN0YXR1c0NoYW5nZXMhLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0ludmFsaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSB0aGlzLmlzSW52YWxpZChjb250cm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSAhIWNvbnRyb2wuaW52YWxpZCAmJiAhIWNvbnRyb2wuZGlydHk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbGxvd3MgY3VzdG9tIGVsZW1lbnQgdmFsaWRhdGUgZnVuY3Rpb24gdG8gdXBkYXRlIEFuZ3VsYXIgY29udHJvbCdzXG4gICAgICAvLyB2YWxpZGl0eVxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlISgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV06IHRydWUgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3RhdHVzU3ViKSB7XG4gICAgICB0aGlzLnN0YXR1c1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSB2YWx1ZSB0byBhIGN1c3RvbSBlbGVtZW50J3MgY29ycmVjdCB2YWx1ZSBwcm9wZXJ0eSwgYmFzZWQgb24gd2hhdFxuICAgKiBraW5kIG9mIGVsZW1lbnQgdGhlIGRpcmVjdGl2ZSBjb250cm9scy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB3cml0ZVxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IHRydWU7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpIHx8IHRoaXMuaXNTZWxlY3RhYmxlKGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICAoPGFueT5lbGVtZW50KVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNXcml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGN1c3RvbSBlbGVtZW50IGV2ZW50cyBhbmQgbm90aWZ5IEFuZ3VsYXIgb2YgYW55IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY2hlY2tlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndmFsdWUtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIG9uQ2hhbmdlZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1dyaXRpbmdWYWx1ZSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRJdGVtcycgfHwgcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW0nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtY2hhbmdlZCc6IHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoYW5nZWQgPSBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkVmFsdWVzJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBsZXQgcHJvcGVydHk6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBwcm9wZXJ0eSB3aWxsIGJlIGRlZmluZWQgaWYgd2UgcmVhY2ggdGhpcyBzaW5jZSBjaGFuZ2VkIGNhbiBvbmx5XG4gICAgICAgICAgLy8gYmUgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBmb3Igc2VsZWN0YWJsZSBlbGVtZW50c1xuICAgICAgICAgIHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCkhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ2NoZWNrZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IHVzZSBgZXZlbnQuZGV0YWlsLnZhbHVlYCwgc2luY2Ugd2UgY2Fubm90IGFzc3VtZSB0aGF0IGFsbFxuICAgICAgICAvLyBjaGFuZ2UgZXZlbnRzIHdpbGwgcHJvdmlkZSB0aGF0LiBBZGRpdGlvbmFsbHksIHNvbWUgZXZlbnQgZGV0YWlsc1xuICAgICAgICAvLyBtYXkgYmUgc3BsaWNlcyBvZiBhbiBhcnJheSBvciBvYmplY3QgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShlbGVtZW50W3Byb3BlcnR5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBjaGVja2JveC1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNDaGVja2VkRWxlbWVudChlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2NoZWNrZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZCcpIHx8XG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZEl0ZW0nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZWxlbWVudCAmJlxuICAgICAgZWxlbWVudC5tdWx0aSA9PT0gdHJ1ZSAmJlxuICAgICAgKHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykgfHxcbiAgICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZGF0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFZhbGlkYXRhYmxlTGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2ludmFsaWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgcHJvcGVydHkgaXMgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWRcbiAgICogZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3JcbiAgICovXG4gIHByaXZhdGUgaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZWxlbWVudCAmJiBwcm9wZXJ0eSBpbiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc2VsZWN0YWJsZSBvciBtdWx0aS1zZWxlY3RhYmxlIGVsZW1lbnRcbiAgICogdGhhdCBzaG91bGQgYmUgdXBkYXRlZC4gVGhpcyBtZXRob2Qgd2lsbCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCB0aGVcbiAgICogdmFsdWUgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQuIElmIGl0IGNhbm5vdFxuICAgKiBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlLCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGdldCB0aGUgcHJvcGVydHkgZm9yXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIGZvciB0aGUgZWxlbWVudCdzIHByb3BlcnR5XG4gICAqIEByZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lLCBvciB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQ6IGFueSwgdmFsdWU/OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzTXVsdGkgPSB0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHZhbHVlUHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRJdGVtcycgOiAnc2VsZWN0ZWRJdGVtJztcbiAgICBjb25zdCBpbmRleFByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkVmFsdWVzJyA6ICdzZWxlY3RlZCc7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHNldHRpbmcgdGhlIGluZGV4IG9yIHZhbHVlIHByb3BlcnR5IGZvclxuICAgICAgLy8gYSBzZWxlY3RhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhhc1ZhbHVlUHJvcCA9IHZhbHVlUHJvcCBpbiBlbGVtZW50O1xuICAgICAgY29uc3QgaGFzSW5kZXhQcm9wID0gaW5kZXhQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBpZiAoaGFzVmFsdWVQcm9wICYmICFoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ZhbHVlUHJvcCAmJiBoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGVsZW1lbnRbdmFsdWVQcm9wXTtcbiAgICAgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBoYXMgYm90aCBwcm9wZXJ0aWVzLCB0cnkgdG8gc2V0IGl0IHRvIHRoZSB2YWx1ZVxuICAgICAgICAvLyBwcm9wZXJ0eSBmaXJzdC4gSWYgaXQgZmFpbHMsIHRoZW4gdXNlIHRoZSBpbmRleCBwcm9wZXJ0eVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvdWxkIHRocm93IGlmIHRoZSB2YWx1ZSBpcyBhbiB1bmV4cGVjdGVkIHR5cGVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgd2Ugc2V0IGl0IHRvIGlzIHN0aWxsIGFjY3VyYXRlLiBJZiBpdCdzXG4gICAgICAgIC8vIG5vdCB0aGVuIHRoZSBlbGVtZW50IHNpbGVudGx5IHJlamVjdGVkIHRoZSBuZXcgdmFsdWUuXG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGVsZW1lbnRbdmFsdWVQcm9wXSA9PT0gdmFsdWU7XG4gICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBpbmRleFByb3A7XG4gIH1cbn1cbiJdfQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29kZWJha2VyeS9vcmlnYW1pL2Zvcm1zLyIsInNvdXJjZXMiOlsic3JjL3ZhbHVlLWFjY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUVMLFFBQVEsRUFFUixTQUFTLEVBQ1QsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0N4QixXQUFhLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsMkJBQTJCLEVBQTNCLENBQTJCLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9EK0MsdURBQW9CO0lBeURuRSxxQ0FDUyxZQUNHLFFBQWtCLEVBQzVCLFFBQW1CLEVBR25CLGVBQXdCO1FBTjFCLFlBUUUsa0JBQU0sUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsU0FDN0M7UUFSUSxnQkFBVSxHQUFWLFVBQVU7UUFDUCxjQUFRLEdBQVIsUUFBUSxDQUFVOzs7Ozs7OztvQ0ExQ1IsVUFBVTs7Ozs7OytCQXNCUCxLQUFLOzs7Ozs7bUNBTUQsS0FBSzs7S0FxQmpDO0lBNUNELHNCQUFJLGdEQUFPO1FBSFg7O1dBRUc7Ozs7O1FBQ0g7WUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFFBQVEs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QkFBc0IsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxDQUFDO2dCQUMzRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsYUFBYSxDQUFDO2FBQ3BDO2lCQUFNO2dCQUNMLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7OztnQkEvVDlELFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQ04sc0VBQXNFO29CQUN4RSxTQUFTLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztpQkFDNUM7Ozs7Z0JBN0dDLFVBQVU7Z0JBR1YsUUFBUTtnQkFLUixTQUFTOzhDQW1LTixRQUFRLFlBQ1IsTUFBTSxTQUFDLHVCQUF1Qjs7OzRCQXZEaEMsS0FBSztzQ0FTTCxLQUFLO2lDQStITCxZQUFZLFNBQUMsd0JBQXdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDakQsWUFBWSxTQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2hELFlBQVksU0FBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNsRCxZQUFZLFNBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDM0MsWUFBWSxTQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQzFDLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7bUNBcUR4QyxZQUFZLFNBQUMsaUJBQWlCOztzQ0ExVGpDO0VBaUhpRCxvQkFBb0I7U0FBeEQsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBQcm92aWRlcixcbiAgUmVuZGVyZXIyLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ09NUE9TSVRJT05fQlVGRkVSX01PREUsXG4gIERlZmF1bHRWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdDb250cm9sLFxuICBWYWxpZGF0b3JzLFxuICBBYnN0cmFjdENvbnRyb2xcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBhIGNoZWNrYm94LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gIGNoZWNrZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGFibGVMaWtlIHtcbiAgc2VsZWN0ZWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHNlbGVjdGVkSXRlbT86IGFueTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgbXVsdGkgc2VsZWN0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNlbGVjdGFibGVMaWtlIHtcbiAgc2VsZWN0ZWRWYWx1ZXM/OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+O1xuICBzZWxlY3RlZEl0ZW1zPzogYW55W107XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHZhbGlkYXRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRhYmxlTGlrZSB7XG4gIGludmFsaWQ/OiBib29sZWFuO1xuICB2YWxpZGF0ZT8oKTogdm9pZDtcbn1cblxuLyoqXG4gKiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBPUklHQU1JX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yKSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbi8qKlxuICogQSB2YWx1ZSBhY2Nlc3NvciBmb3IgYG5nTW9kZWxgLCBgZm9ybUNvbnRyb2xgLCBhbmQgYGZvcm1Db250cm9sTmFtZWAsIG9uXG4gKiBjdXN0b20gZWxlbWVudHMuIEluIGFkZGl0aW9uIHRvIG9uZSBvZiB0aGUgYWJvdmUgZGlyZWN0aXZlcywgYG9yaWdhbWlgXG4gKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVsZW1lbnQgdG8gZGVub3RlIHRoYXQgdGhpcyB2YWx1ZSBhY2Nlc3NvciBzaG91bGRcbiAqIGNvbnRyb2wgaXQuXG4gKlxuICogRXhhbXBsZTogYDxwYXBlci1pbnB1dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgb3JpZ2FtaT48L3BhcGVyLWlucHV0PmBcbiAqXG4gKiBUaGUgY29ubmVjdGVkIGVsZW1lbnQgc2hvdWxkIGltcGxlbWVudCBvbmUgb2YgdGhlIGJlbG93XG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYGNoZWNrZWRgIGFzIGEgYm9vbGVhbiBmb3IgY2hlY2tib3gtbGlrZSBlbGVtZW50cy5cbiAqIC0gYHNlbGVjdGVkYCBmb3Igc2luZ2xlIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG11c3QgYmUgYW4gaW5kZXggb3Igc3RyaW5nXG4gKiAgIG5hbWUgYXR0cmlidXRlLlxuICogLSBgc2VsZWN0ZWRJdGVtYCBmb3Igc2luZ2xlIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG1heSBiZSBhbnkgdHlwZS5cbiAqIC0gYHNlbGVjdGVkVmFsdWVzYCBmb3IgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBhcnJheSBvZlxuICogICBpbmRpY2VzIG9yIHN0cmluZyBuYW1lIGF0dHJpYnV0ZXMuXG4gKiAtIGBzZWxlY3RlZEl0ZW1zYCBmb3IgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBhcnJheSBvZiBhbnlcbiAqICAgdHlwZS5cbiAqIC0gYHZhbHVlYCBmb3IgYW55IGJhc2ljIGZvcm0gZWxlbWVudC4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICpcbiAqIEZvciBzZWxlY3RhYmxlIGFuZCBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLCB0aGUgYXR0cmlidXRlIGB1c2VLZXlgIHNob3VsZFxuICogYmUgc3BlY2lmaWVkIGlmIHRoZSBjb250cm9sIGJpbmRpbmdzIGFuIGluZGV4IG9yIG5hbWUgdmFsdWUgdG8gdGhlIGVsZW1lbnRcbiAqIGluc3RlYWQgb2YgYW4gb2JqZWN0LlxuICpcbiAqIEFkZGl0aW9uYWxseSwgYW4gZWxlbWVudCBtYXkgaW1wbGVtZW50IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgZGlzYWJsZWRgIGFzIGEgYm9vbGVhblxuICogLSBgaW52YWxpZGAgYXMgYSBib29sZWFuIHRvIGluZGljYXRlIHZhbGlkaXR5XG4gKiAtIGB2YWxpZGF0ZSgpYCBhcyBhIGZ1bmN0aW9uIHRvIHJ1biBjdXN0b20gdmFsaWRhdGlvblxuICpcbiAqIFRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGVzZSBldmVudHMsIGFuIGVsZW1lbnQgc2hvdWxkIGltcGxlbWVudCBvbmUgb3JcbiAqIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBldmVudHMgdG8gbm90aWZ5IEFuZ3VsYXIgb2YgYW55IHVwZGF0ZXMuXG4gKlxuICogLSBgaW5wdXRgIC0gd2lsbCB1cGRhdGUgYW55IG9mIHRoZSBhYm92ZSBwcm9wZXJ0aWVzXG4gKiAtIGBibHVyYFxuICogLSBgY2hlY2tlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLWl0ZW0tY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbXMtY2hhbmdlZGBcbiAqIC0gYHZhbHVlLWNoYW5nZWRgXG4gKiAtIGBpbnZhbGlkLWNoYW5nZWRgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnW25nTW9kZWxdW29yaWdhbWldLFtmb3JtQ29udHJvbE5hbWVdW29yaWdhbWldLFtmb3JtQ29udHJvbF1bb3JpZ2FtaV0nLFxuICBwcm92aWRlcnM6IFtPUklHQU1JX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBleHRlbmRzIERlZmF1bHRWYWx1ZUFjY2Vzc29yXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgbG9naWMgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gc2V0IGFuIGVsZW1lbnQncyBgaW52YWxpZGBcbiAgICogcHJvcGVydHkgdG8gZ2l2ZW4gdGhlIHByb3ZpZGVkIGBBYnN0cmFjdENvbnRyb2xgLiBUaGUgZGVmYXVsdCBpcyB0byBzZXQgdGhlXG4gICAqIGVsZW1lbnQgYXMgYGludmFsaWRgIHdoZW5ldmVyIHRoZSBjb250cm9sIGlzIGJvdGggaW52YWxpZCBhbmQgZGlydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBpc0ludmFsaWQ/OiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGtleSB0byB1c2Ugd2hlbiByZXBvcnRpbmcgdGhhdCBhbiBlbGVtZW50J3MgYHZhbGlkYXRlKClgIGZ1bmN0aW9uXG4gICAqIHJldHVybnMgZmFsc2UuIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgY29udHJvbCdzIGBlcnJvcnNgIG9iamVjdCB3aWxsIGJlXG4gICAqIHNldCB3aXRoIHRoaXMga2V5IGFuZCBhIHZhbHVlIG9mIHRydWUuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGtleSBpcyBcInZhbGlkYXRlXCIuXG4gICAqL1xuICBASW5wdXQoKVxuICB2YWxpZGF0aW9uRXJyb3JzS2V5ID0gJ3ZhbGlkYXRlJztcblxuICAvKipcbiAgICogVGhlIGBBYnN0cmFjdENvbnRyb2xgIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudC5cbiAgICovXG4gIGdldCBjb250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9jb250cm9sKSB7XG4gICAgICB0aGlzLl9jb250cm9sID0gKDxOZ0NvbnRyb2w+dGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sKSkuY29udHJvbCE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2w7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBOZ0NvbnRyb2wncyBzdGF0dXNDaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXR1c1N1Yj86IHsgdW5zdWJzY3JpYmUoKTogdm9pZCB9O1xuICAvKipcbiAgICogTW9zdCBjdXN0b20gZWxlbWVudHMgcHJvcGVydHkgd2lsbCBlbWl0IGEgYHByb3BlcnR5LWNoYW5nZWRgIGV2ZW50IHdoZW5cbiAgICogdGhlaXIgdmFsdWUgaXMgc2V0LiBUaGlzIGZsYWcgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdG8gaWdub3JlIHRoZVxuICAgKiBuZXh0IGV2ZW50IHdoaWxlIGl0IGlzIGluIHRoZSBtaWRkbGUgb2Ygd3JpdGluZyBhIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICAvKipcbiAgICogRmxhZyB0aGF0IGluZm9ybXMgdGhlIHZhbHVlIGFjY2Vzc29yIHRoYXQgaXQgaXMgY3VycmVudGx5IHVwZGF0aW5nIGFuXG4gICAqIGVsZW1lbnQncyB2YWxpZGl0eSBhbmQgc2hvdWxkIGlnbm9yZSBhZGRpdGlvbmFsIGBpbnZhbGlkYCBwcm9wZXJ0eSBjaGFuZ2VzXG4gICAqIHVudGlsIGl0IGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1VwZGF0aW5nVmFsaWRpdHkgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIHZhbHVlIHByb3BlcnR5IG9yIGluZGV4IHByb3BlcnR5IGZvciBhXG4gICAqIHNlbGVjdCBvciBtdWxpdC1zZWxlY3QgZWxlbWVudC4gV2hlbiB1bmRlZmluZWQsIGl0IGluZGljYXRlcyB0aGF0IHRoZVxuICAgKiBkZXRlcm1pbmF0aW9uIG9mIHdoaWNoIHByb3BlcnR5IHRvIHVzZSBoYXMgbm90IG9jY3VycmVkIHlldC5cbiAgICovXG4gIHByaXZhdGUgdXNlU2VsZWN0YWJsZVZhbHVlUHJvcD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWNoZWQgYGNvbnRyb2xgIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NUE9TSVRJT05fQlVGRkVSX01PREUpXG4gICAgY29tcG9zaXRpb25Nb2RlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHJlbmRlcmVyLCBlbGVtZW50UmVmLCBjb21wb3NpdGlvbk1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0aGF0IHdpbGwgY29ubmVjdCBhbiBlbGVtZW50J3MgdmFsaWRhdGFibGUgcHJvcGVydGllc1xuICAgKiAoaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQpIHRvIHRoZSBBbmd1bGFyIGNvbnRyb2wuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIC8vIFRoZSBjb250cm9sIHdpbGwgYWx3YXlzIGJlIHNldCBieSBuZ0FmdGVyVmlld0luaXQgZHVlIHRvIHRoZSBuYXR1cmUgb2ZcbiAgICAgIC8vIHRoZSBkaXJlY3RpdmUncyBzZWxlY3RvcnNcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2whO1xuICAgICAgLy8gQWxsb3dzIEFuZ3VsYXIgdmFsaWRhdG9ycyB0byB1cGRhdGUgdGhlIGN1c3RvbSBlbGVtZW50J3MgdmFsaWRpdHlcbiAgICAgIHRoaXMuc3RhdHVzU3ViID0gY29udHJvbC5zdGF0dXNDaGFuZ2VzIS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNJbnZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gdGhpcy5pc0ludmFsaWQoY29udHJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gISFjb250cm9sLmludmFsaWQgJiYgISFjb250cm9sLmRpcnR5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3dzIGN1c3RvbSBlbGVtZW50IHZhbGlkYXRlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbmd1bGFyIGNvbnRyb2wnc1xuICAgICAgLy8gdmFsaWRpdHlcbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICAgIGNvbnRyb2wudmFsaWRhdG9yLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWxpZGF0ZSEoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IFt0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXldOiB0cnVlIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucy5cbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN0YXR1c1N1Yikge1xuICAgICAgdGhpcy5zdGF0dXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgdmFsdWUgdG8gYSBjdXN0b20gZWxlbWVudCdzIGNvcnJlY3QgdmFsdWUgcHJvcGVydHksIGJhc2VkIG9uIHdoYXRcbiAgICoga2luZCBvZiBlbGVtZW50IHRoZSBkaXJlY3RpdmUgY29udHJvbHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gd3JpdGVcbiAgICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNXcml0aW5nVmFsdWUgPSB0cnVlO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50LCB2YWx1ZSk7XG4gICAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgICAgKDxhbnk+ZWxlbWVudClbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQ2hlY2tlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBjdXN0b20gZWxlbWVudCBldmVudHMgYW5kIG5vdGlmeSBBbmd1bGFyIG9mIGFueSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGNoYW5nZSBldmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtaXRlbXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW0tY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2NoZWNrZWQtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3ZhbHVlLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBvbkNoYW5nZWRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNXcml0aW5nVmFsdWUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtaXRlbXMtY2hhbmdlZCc6XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW0tY2hhbmdlZCc6IHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoYW5nZWQgPSBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRJdGVtJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCc6XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZFZhbHVlcycgfHwgcHJvcGVydHkgPT09ICdzZWxlY3RlZCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgbGV0IHByb3BlcnR5OiBzdHJpbmc7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpIHx8IHRoaXMuaXNTZWxlY3RhYmxlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgLy8gcHJvcGVydHkgd2lsbCBiZSBkZWZpbmVkIGlmIHdlIHJlYWNoIHRoaXMgc2luY2UgY2hhbmdlZCBjYW4gb25seVxuICAgICAgICAgIC8vIGJlIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGRlZmluZWQgZm9yIHNlbGVjdGFibGUgZWxlbWVudHNcbiAgICAgICAgICBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpITtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ2hlY2tlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICBwcm9wZXJ0eSA9ICdjaGVja2VkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eSA9ICd2YWx1ZSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEb24ndCB1c2UgYGV2ZW50LmRldGFpbC52YWx1ZWAsIHNpbmNlIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCBhbGxcbiAgICAgICAgLy8gY2hhbmdlIGV2ZW50cyB3aWxsIHByb3ZpZGUgdGhhdC4gQWRkaXRpb25hbGx5LCBzb21lIGV2ZW50IGRldGFpbHNcbiAgICAgICAgLy8gbWF5IGJlIHNwbGljZXMgb2YgYW4gYXJyYXkgb3Igb2JqZWN0IGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoZWxlbWVudFtwcm9wZXJ0eV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGBpbnZhbGlkYCBwcm9wZXJ0eSBjaGFuZ2VzLiBTb21lIGVsZW1lbnRzLCBzdWNoIGFzXG4gICAqIGA8dmFhZGluLWRhdGUtcGlja2VyPmAgaGF2ZSBtdWx0aXBsZSBcInZhbHVlc1wiLiBTZXR0aW5nIHRoZSBwcmltYXJ5IHZhbHVlXG4gICAqIChleC4gdGhlIGRhdGUgc3RyaW5nKSBtYXkgcmVzdWx0IGluIGEgdGVtcG9yYXJpbHkgaW52YWxpZCBlbGVtZW50IHVudGlsXG4gICAqIHN1YnNlcXVlbnQgdmFsdWVzIChleC4gdGhlIHNlbGVjdGVkIGRhdGUpIGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgKlxuICAgKiBTaW5jZSB0aGlzIHZhbHVlIGFjY2Vzc29yIG9ubHkgbGlzdGVucyBmb3IgdmFsdWUgY2hhbmdlcywgaXQgbWF5IG5vdCBiZVxuICAgKiBub3RpZmllZCBvZiB0aGUgY2hhbmdlIGluIHZhbGlkaXR5LiBUaGlzIGxpc3RlbmVyIHdpbGwgbGlzdGVuIGZvciBhbnlcbiAgICogZXhwbGljaXR5IHZhbGlkaXR5IGNoYW5nZXMgZnJvbSB0aGUgZWxlbWVudCBhbmQgcmUtZXZhbHVhdGUgYSBjb250cm9sJ3NcbiAgICogdmFsaWRpdHkgaWYgaXQgYW5kIHRoZSBlbGVtZW50J3MgdmFsaWRpdHkgYXJlIG91dCBvZiBzeW5jLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignaW52YWxpZC1jaGFuZ2VkJylcbiAgb25JbnZhbGlkQ2hhbmdlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNVcGRhdGluZ1ZhbGlkaXR5KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wgJiZcbiAgICAgICAgdGhpcy5jb250cm9sLmludmFsaWQgIT09IGVsZW1lbnQuaW52YWxpZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNVcGRhdGluZ1ZhbGlkaXR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIGNoZWNrYm94LWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnY2hlY2tlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBzZWxlY3RhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc1NlbGVjdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkJykgfHxcbiAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkSXRlbScpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgbXVsdGkgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBNdWx0aVNlbGVjdGFibGVMaWtlIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmXG4gICAgICBlbGVtZW50Lm11bHRpID09PSB0cnVlICYmXG4gICAgICAodGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSB8fFxuICAgICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZFZhbHVlcycpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIHZhbGlkYXRhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc1ZhbGlkYXRhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgVmFsaWRhdGFibGVMaWtlIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnaW52YWxpZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGFueXdoZXJlIGluIHRoZSBwcm92aWRlZFxuICAgKiBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvclxuICAgKi9cbiAgcHJpdmF0ZSBpc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFlbGVtZW50ICYmIHByb3BlcnR5IGluIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBzZWxlY3RhYmxlIG9yIG11bHRpLXNlbGVjdGFibGUgZWxlbWVudFxuICAgKiB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLiBUaGlzIG1ldGhvZCB3aWxsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHRoZVxuICAgKiB2YWx1ZSB0eXBlIHRvIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZC4gSWYgaXQgY2Fubm90XG4gICAqIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSB0byB1c2UsIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBmb3JcbiAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgZm9yIHRoZSBlbGVtZW50J3MgcHJvcGVydHlcbiAgICogQHJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudDogYW55LCB2YWx1ZT86IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaXNNdWx0aSA9IHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCk7XG4gICAgY29uc3QgdmFsdWVQcm9wID0gaXNNdWx0aSA/ICdzZWxlY3RlZEl0ZW1zJyA6ICdzZWxlY3RlZEl0ZW0nO1xuICAgIGNvbnN0IGluZGV4UHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRWYWx1ZXMnIDogJ3NlbGVjdGVkJztcbiAgICBpZiAodHlwZW9mIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgYmUgc2V0dGluZyB0aGUgaW5kZXggb3IgdmFsdWUgcHJvcGVydHkgZm9yXG4gICAgICAvLyBhIHNlbGVjdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgaGFzVmFsdWVQcm9wID0gdmFsdWVQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBjb25zdCBoYXNJbmRleFByb3AgPSBpbmRleFByb3AgaW4gZWxlbWVudDtcbiAgICAgIGlmIChoYXNWYWx1ZVByb3AgJiYgIWhhc0luZGV4UHJvcCkge1xuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghaGFzVmFsdWVQcm9wICYmIGhhc0luZGV4UHJvcCkge1xuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZWxlbWVudFt2YWx1ZVByb3BdO1xuICAgICAgICAvLyBXaGVuIHRoZSBlbGVtZW50IGhhcyBib3RoIHByb3BlcnRpZXMsIHRyeSB0byBzZXQgaXQgdG8gdGhlIHZhbHVlXG4gICAgICAgIC8vIHByb3BlcnR5IGZpcnN0LiBJZiBpdCBmYWlscywgdGhlbiB1c2UgdGhlIGluZGV4IHByb3BlcnR5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZWxlbWVudFt2YWx1ZVByb3BdID0gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gQ291bGQgdGhyb3cgaWYgdGhlIHZhbHVlIGlzIGFuIHVuZXhwZWN0ZWQgdHlwZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB2YWx1ZSB3ZSBzZXQgaXQgdG8gaXMgc3RpbGwgYWNjdXJhdGUuIElmIGl0J3NcbiAgICAgICAgLy8gbm90IHRoZW4gdGhlIGVsZW1lbnQgc2lsZW50bHkgcmVqZWN0ZWQgdGhlIG5ldyB2YWx1ZS5cbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZWxlbWVudFt2YWx1ZVByb3BdID09PSB2YWx1ZTtcbiAgICAgICAgZWxlbWVudFt2YWx1ZVByb3BdID0gcHJldmlvdXNWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA/IHZhbHVlUHJvcCA6IGluZGV4UHJvcDtcbiAgfVxufVxuIl19 |
@@ -86,4 +86,20 @@ import { Directive, ElementRef, HostListener, Inject, Injector, Input, Optional, Renderer2, forwardRef, NgModule } from '@angular/core'; | ||
this.isWritingValue = false; | ||
/** | ||
* Flag that informs the value accessor that it is currently updating an | ||
* element's validity and should ignore additional `invalid` property changes | ||
* until it is complete. | ||
*/ | ||
this.isUpdatingValidity = false; | ||
} | ||
/** | ||
* The `AbstractControl` attached to this element. | ||
* @return {?} | ||
*/ | ||
get control() { | ||
if (!this._control) { | ||
this._control = /** @type {?} */ (((/** @type {?} */ (this.injector.get(NgControl))).control)); | ||
} | ||
return this._control; | ||
} | ||
/** | ||
* Lifecycle callback that will connect an element's validatable properties | ||
@@ -98,3 +114,3 @@ * (if they are implemented) to the Angular control. | ||
/** @type {?} */ | ||
const control = /** @type {?} */ (((/** @type {?} */ (this.injector.get(NgControl))).control)); | ||
const control = /** @type {?} */ ((this.control)); | ||
// Allows Angular validators to update the custom element's validity | ||
@@ -213,2 +229,27 @@ this.statusSub = /** @type {?} */ ((control.statusChanges)).subscribe(() => { | ||
/** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
* @return {?} | ||
*/ | ||
onInvalidChanged() { | ||
if (!this.isUpdatingValidity) { | ||
/** @type {?} */ | ||
const element = this.elementRef.nativeElement; | ||
if (this.isValidatable(element) && | ||
this.control && | ||
this.control.invalid !== element.invalid) { | ||
this.isUpdatingValidity = true; | ||
this.control.updateValueAndValidity(); | ||
this.isUpdatingValidity = false; | ||
} | ||
} | ||
} | ||
/** | ||
* Determines whether or not an element is checkbox-like. | ||
@@ -331,3 +372,4 @@ * | ||
validationErrorsKey: [{ type: Input }], | ||
onChangedEvent: [{ type: HostListener, args: ['selected-items-changed', ['$event'],] }, { type: HostListener, args: ['selected-item-changed', ['$event'],] }, { type: HostListener, args: ['selected-values-changed', ['$event'],] }, { type: HostListener, args: ['selected-changed', ['$event'],] }, { type: HostListener, args: ['checked-changed', ['$event'],] }, { type: HostListener, args: ['value-changed', ['$event'],] }] | ||
onChangedEvent: [{ type: HostListener, args: ['selected-items-changed', ['$event'],] }, { type: HostListener, args: ['selected-item-changed', ['$event'],] }, { type: HostListener, args: ['selected-values-changed', ['$event'],] }, { type: HostListener, args: ['selected-changed', ['$event'],] }, { type: HostListener, args: ['checked-changed', ['$event'],] }, { type: HostListener, args: ['value-changed', ['$event'],] }], | ||
onInvalidChanged: [{ type: HostListener, args: ['invalid-changed',] }] | ||
}; | ||
@@ -364,2 +406,2 @@ | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2FtaS1mb3Jtcy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS9mb3Jtcy9zcmMvdmFsdWUtYWNjZXNzb3IudHMiLCJuZzovL0Bjb2RlYmFrZXJ5L29yaWdhbWkvZm9ybXMvc3JjL2Zvcm1zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gdXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBvciBpbmRleCBwcm9wZXJ0eSBmb3IgYVxuICAgKiBzZWxlY3Qgb3IgbXVsaXQtc2VsZWN0IGVsZW1lbnQuIFdoZW4gdW5kZWZpbmVkLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGVcbiAgICogZGV0ZXJtaW5hdGlvbiBvZiB3aGljaCBwcm9wZXJ0eSB0byB1c2UgaGFzIG5vdCBvY2N1cnJlZCB5ZXQuXG4gICAqL1xuICBwcml2YXRlIHVzZVNlbGVjdGFibGVWYWx1ZVByb3A/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NUE9TSVRJT05fQlVGRkVSX01PREUpXG4gICAgY29tcG9zaXRpb25Nb2RlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHJlbmRlcmVyLCBlbGVtZW50UmVmLCBjb21wb3NpdGlvbk1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0aGF0IHdpbGwgY29ubmVjdCBhbiBlbGVtZW50J3MgdmFsaWRhdGFibGUgcHJvcGVydGllc1xuICAgKiAoaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQpIHRvIHRoZSBBbmd1bGFyIGNvbnRyb2wuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICAgIC8vIEFsbG93cyBBbmd1bGFyIHZhbGlkYXRvcnMgdG8gdXBkYXRlIHRoZSBjdXN0b20gZWxlbWVudCdzIHZhbGlkaXR5XG4gICAgICB0aGlzLnN0YXR1c1N1YiA9IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcyEuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlzSW52YWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVsZW1lbnQuaW52YWxpZCA9IHRoaXMuaXNJbnZhbGlkKGNvbnRyb2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuaW52YWxpZCA9ICEhY29udHJvbC5pbnZhbGlkICYmICEhY29udHJvbC5kaXJ0eTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93cyBjdXN0b20gZWxlbWVudCB2YWxpZGF0ZSBmdW5jdGlvbiB0byB1cGRhdGUgQW5ndWxhciBjb250cm9sJ3NcbiAgICAgIC8vIHZhbGlkaXR5XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFxuICAgICAgICAgIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICBjb250cm9sLnZhbGlkYXRvcixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsaWRhdGUhKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XTogdHJ1ZSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNTdWIpIHtcbiAgICAgIHRoaXMuc3RhdHVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgY3VzdG9tIGVsZW1lbnQncyBjb3JyZWN0IHZhbHVlIHByb3BlcnR5LCBiYXNlZCBvbiB3aGF0XG4gICAqIGtpbmQgb2YgZWxlbWVudCB0aGUgZGlyZWN0aXZlIGNvbnRyb2xzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCwgdmFsdWUpO1xuICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICg8YW55PmVsZW1lbnQpW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgY3VzdG9tIGVsZW1lbnQgZXZlbnRzIGFuZCBub3RpZnkgQW5ndWxhciBvZiBhbnkgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGVja2VkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd2YWx1ZS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2VkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzV3JpdGluZ1ZhbHVlKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRWYWx1ZXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgICAgIC8vIHByb3BlcnR5IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSByZWFjaCB0aGlzIHNpbmNlIGNoYW5nZWQgY2FuIG9ubHlcbiAgICAgICAgICAvLyBiZSB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGZvciBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KSE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAnY2hlY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBldmVudC5kZXRhaWwudmFsdWVgLCBzaW5jZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsXG4gICAgICAgIC8vIGNoYW5nZSBldmVudHMgd2lsbCBwcm92aWRlIHRoYXQuIEFkZGl0aW9uYWxseSwgc29tZSBldmVudCBkZXRhaWxzXG4gICAgICAgIC8vIG1heSBiZSBzcGxpY2VzIG9mIGFuIGFycmF5IG9yIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsZW1lbnRbcHJvcGVydHldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIGNoZWNrYm94LWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnY2hlY2tlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBzZWxlY3RhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc1NlbGVjdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkJykgfHxcbiAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkSXRlbScpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgbXVsdGkgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBNdWx0aVNlbGVjdGFibGVMaWtlIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmXG4gICAgICBlbGVtZW50Lm11bHRpID09PSB0cnVlICYmXG4gICAgICAodGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSB8fFxuICAgICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZFZhbHVlcycpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIHZhbGlkYXRhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc1ZhbGlkYXRhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgVmFsaWRhdGFibGVMaWtlIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnaW52YWxpZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGFueXdoZXJlIGluIHRoZSBwcm92aWRlZFxuICAgKiBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvclxuICAgKi9cbiAgcHJpdmF0ZSBpc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFlbGVtZW50ICYmIHByb3BlcnR5IGluIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBzZWxlY3RhYmxlIG9yIG11bHRpLXNlbGVjdGFibGUgZWxlbWVudFxuICAgKiB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLiBUaGlzIG1ldGhvZCB3aWxsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHRoZVxuICAgKiB2YWx1ZSB0eXBlIHRvIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZC4gSWYgaXQgY2Fubm90XG4gICAqIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSB0byB1c2UsIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBmb3JcbiAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgZm9yIHRoZSBlbGVtZW50J3MgcHJvcGVydHlcbiAgICogQHJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudDogYW55LCB2YWx1ZT86IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaXNNdWx0aSA9IHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCk7XG4gICAgY29uc3QgdmFsdWVQcm9wID0gaXNNdWx0aSA/ICdzZWxlY3RlZEl0ZW1zJyA6ICdzZWxlY3RlZEl0ZW0nO1xuICAgIGNvbnN0IGluZGV4UHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRWYWx1ZXMnIDogJ3NlbGVjdGVkJztcbiAgICBpZiAodHlwZW9mIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgYmUgc2V0dGluZyB0aGUgaW5kZXggb3IgdmFsdWUgcHJvcGVydHkgZm9yXG4gICAgICAvLyBhIHNlbGVjdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgaGFzVmFsdWVQcm9wID0gdmFsdWVQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBjb25zdCBoYXNJbmRleFByb3AgPSBpbmRleFByb3AgaW4gZWxlbWVudDtcbiAgICAgIGlmIChoYXNWYWx1ZVByb3AgJiYgIWhhc0luZGV4UHJvcCkge1xuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghaGFzVmFsdWVQcm9wICYmIGhhc0luZGV4UHJvcCkge1xuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZWxlbWVudFt2YWx1ZVByb3BdO1xuICAgICAgICAvLyBXaGVuIHRoZSBlbGVtZW50IGhhcyBib3RoIHByb3BlcnRpZXMsIHRyeSB0byBzZXQgaXQgdG8gdGhlIHZhbHVlXG4gICAgICAgIC8vIHByb3BlcnR5IGZpcnN0LiBJZiBpdCBmYWlscywgdGhlbiB1c2UgdGhlIGluZGV4IHByb3BlcnR5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZWxlbWVudFt2YWx1ZVByb3BdID0gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gQ291bGQgdGhyb3cgaWYgdGhlIHZhbHVlIGlzIGFuIHVuZXhwZWN0ZWQgdHlwZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB2YWx1ZSB3ZSBzZXQgaXQgdG8gaXMgc3RpbGwgYWNjdXJhdGUuIElmIGl0J3NcbiAgICAgICAgLy8gbm90IHRoZW4gdGhlIGVsZW1lbnQgc2lsZW50bHkgcmVqZWN0ZWQgdGhlIG5ldyB2YWx1ZS5cbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZWxlbWVudFt2YWx1ZVByb3BdID09PSB2YWx1ZTtcbiAgICAgICAgZWxlbWVudFt2YWx1ZVByb3BdID0gcHJldmlvdXNWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA/IHZhbHVlUHJvcCA6IGluZGV4UHJvcDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vdmFsdWUtYWNjZXNzb3InO1xuXG4vKipcbiAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRlbXBsYXRlIGFuZCByZWFjdGl2ZSBBbmd1bGFyIGZvcm0gZGlyZWN0aXZlcyBhbmRcbiAqIGN1c3RvbSBlbGVtZW50cy5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yXSxcbiAgZXhwb3J0czogW09yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3Nvcl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUZvcm1zTW9kdWxlIHt9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7QUF5REEsTUFBYSw4QkFBOEIsR0FBYTtJQUN0RCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsTUFBTSwyQkFBMkIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvREYsaUNBQXlDLFNBQVEsb0JBQW9COzs7Ozs7O0lBb0NuRSxZQUNTLFlBQ0csUUFBa0IsRUFDNUIsUUFBbUIsRUFHbkIsZUFBd0I7UUFFeEIsS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFQdEMsZUFBVSxHQUFWLFVBQVU7UUFDUCxhQUFRLEdBQVIsUUFBUSxDQUFVOzs7Ozs7OzttQ0FyQlIsVUFBVTs7Ozs7OzhCQVdQLEtBQUs7S0FpQjdCOzs7Ozs7SUFNRCxlQUFlOztRQUNiLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRTs7WUFDL0IsTUFBTSxPQUFPLHNCQUFHLG1CQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFFLE9BQU8sR0FBRTs7WUFFbkUsSUFBSSxDQUFDLFNBQVMsc0JBQUcsT0FBTyxDQUFDLGFBQWEsR0FBRSxTQUFTLENBQUM7Z0JBQ2hELElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRTtvQkFDeEMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUMzQztxQkFBTTtvQkFDTCxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2lCQUN4RDthQUNGLENBQUMsQ0FBQzs7O1lBSUgsSUFBSSxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFO2dCQUMxQyxPQUFPLENBQUMsYUFBYSxDQUNuQixVQUFVLENBQUMsT0FBTyxDQUFDO29CQUNqQixPQUFPLENBQUMsU0FBUztvQkFDakI7d0JBQ0UsdUJBQUksT0FBTyxDQUFDLFFBQVEsTUFBSzs0QkFDdkIsT0FBTyxJQUFJLENBQUM7eUJBQ2I7NkJBQU07NEJBQ0wsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksRUFBRSxDQUFDO3lCQUM3QztxQkFDRjtpQkFDRixDQUFDLENBQ0gsQ0FBQzthQUNIO1NBQ0Y7S0FDRjs7Ozs7SUFLRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDOUI7S0FDRjs7Ozs7Ozs7SUFRRCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzs7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTs7WUFDakUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RCxJQUFJLFFBQVEsRUFBRTtnQkFDWixtQkFBTSxPQUFPLEdBQUUsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ2xDO1NBQ0Y7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QyxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQzthQUFNO1lBQ0wsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QjtRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0tBQzdCOzs7Ozs7O0lBYUQsY0FBYyxDQUFDLEtBQVk7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7O1lBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDOztZQUM5QyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDcEIsUUFBUSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsS0FBSyx3QkFBd0IsQ0FBQztnQkFDOUIsS0FBSyx1QkFBdUIsRUFBRTs7b0JBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckQsT0FBTyxHQUFHLFFBQVEsS0FBSyxlQUFlLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQztvQkFDdEUsTUFBTTtpQkFDUDtnQkFDRCxLQUFLLHlCQUF5QixDQUFDO2dCQUMvQixLQUFLLGtCQUFrQixFQUFFOztvQkFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNyRCxPQUFPLEdBQUcsUUFBUSxLQUFLLGdCQUFnQixJQUFJLFFBQVEsS0FBSyxVQUFVLENBQUM7b0JBQ25FLE1BQU07aUJBQ1A7Z0JBQ0Q7b0JBQ0UsT0FBTyxHQUFHLElBQUksQ0FBQzthQUNsQjtZQUVELElBQUksT0FBTyxFQUFFOztnQkFDWCxJQUFJLFFBQVEsQ0FBUztnQkFDckIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTs7O29CQUdqRSxRQUFRLHNCQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDO2lCQUNqRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDekMsUUFBUSxHQUFHLFNBQVMsQ0FBQztpQkFDdEI7cUJBQU07b0JBQ0wsUUFBUSxHQUFHLE9BQU8sQ0FBQztpQkFDcEI7Ozs7Z0JBS0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUNsQztTQUNGO0tBQ0Y7Ozs7Ozs7SUFPRCxnQkFBZ0IsQ0FBQyxPQUFZO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztLQUNuRDs7Ozs7OztJQU9ELFlBQVksQ0FBQyxPQUFZO1FBQ3ZCLFFBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7WUFDM0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsRUFDL0M7S0FDSDs7Ozs7OztJQU9ELGlCQUFpQixDQUFDLE9BQVk7UUFDNUIsUUFDRSxDQUFDLENBQUMsT0FBTztZQUNULE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSTthQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDO2dCQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsRUFDcEQ7S0FDSDs7Ozs7OztJQU9ELGFBQWEsQ0FBQyxPQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztLQUNuRDs7Ozs7Ozs7O0lBU08saUJBQWlCLENBQUMsT0FBWSxFQUFFLFFBQWdCO1FBQ3RELE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7SUFhbEMscUJBQXFCLENBQUMsT0FBWSxFQUFFLEtBQVc7O1FBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7UUFDaEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxHQUFHLGVBQWUsR0FBRyxjQUFjLENBQUM7O1FBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sR0FBRyxnQkFBZ0IsR0FBRyxVQUFVLENBQUM7UUFDMUQsSUFBSSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxTQUFTLEVBQUU7O1lBR3BELE1BQU0sWUFBWSxHQUFHLFNBQVMsSUFBSSxPQUFPLENBQUM7O1lBQzFDLE1BQU0sWUFBWSxHQUFHLFNBQVMsSUFBSSxPQUFPLENBQUM7WUFDMUMsSUFBSSxZQUFZLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7YUFDcEM7aUJBQU0sSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7YUFDckM7aUJBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTs7Z0JBQ3pELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7O2dCQUd6QyxJQUFJO29CQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7aUJBQzVCO2dCQUFDLE9BQU8sS0FBSyxFQUFFOztpQkFFZjs7O2dCQUlELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxDQUFDO2dCQUMzRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsYUFBYSxDQUFDO2FBQ3BDO2lCQUFNO2dCQUNMLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLEdBQUcsU0FBUyxDQUFDOzs7O1lBN1E5RCxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUNOLHNFQUFzRTtnQkFDeEUsU0FBUyxFQUFFLENBQUMsOEJBQThCLENBQUM7YUFDNUM7Ozs7WUE3R0MsVUFBVTtZQUdWLFFBQVE7WUFLUixTQUFTOzBDQThJTixRQUFRLFlBQ1IsTUFBTSxTQUFDLHVCQUF1Qjs7O3dCQWxDaEMsS0FBSztrQ0FTTCxLQUFLOzZCQXdHTCxZQUFZLFNBQUMsd0JBQXdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDakQsWUFBWSxTQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2hELFlBQVksU0FBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNsRCxZQUFZLFNBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDM0MsWUFBWSxTQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQzFDLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7QUM5TzNDOzs7O0FBV0E7OztZQUpDLFFBQVEsU0FBQztnQkFDUixZQUFZLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztnQkFDM0MsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7YUFDdkM7Ozs7Ozs7Ozs7Ozs7OzsifQ== | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2FtaS1mb3Jtcy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS9mb3Jtcy9zcmMvdmFsdWUtYWNjZXNzb3IudHMiLCJuZzovL0Bjb2RlYmFrZXJ5L29yaWdhbWkvZm9ybXMvc3JjL2Zvcm1zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFic3RyYWN0Q29udHJvbGAgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdGhhdCBpdCBpcyBjdXJyZW50bHkgdXBkYXRpbmcgYW5cbiAgICogZWxlbWVudCdzIHZhbGlkaXR5IGFuZCBzaG91bGQgaWdub3JlIGFkZGl0aW9uYWwgYGludmFsaWRgIHByb3BlcnR5IGNoYW5nZXNcbiAgICogdW50aWwgaXQgaXMgY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGlzVXBkYXRpbmdWYWxpZGl0eSA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhY2hlZCBgY29udHJvbGAgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChDT01QT1NJVElPTl9CVUZGRVJfTU9ERSlcbiAgICBjb21wb3NpdGlvbk1vZGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIocmVuZGVyZXIsIGVsZW1lbnRSZWYsIGNvbXBvc2l0aW9uTW9kZSk7XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRoYXQgd2lsbCBjb25uZWN0IGFuIGVsZW1lbnQncyB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzXG4gICAqIChpZiB0aGV5IGFyZSBpbXBsZW1lbnRlZCkgdG8gdGhlIEFuZ3VsYXIgY29udHJvbC5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSkge1xuICAgICAgLy8gVGhlIGNvbnRyb2wgd2lsbCBhbHdheXMgYmUgc2V0IGJ5IG5nQWZ0ZXJWaWV3SW5pdCBkdWUgdG8gdGhlIG5hdHVyZSBvZlxuICAgICAgLy8gdGhlIGRpcmVjdGl2ZSdzIHNlbGVjdG9yc1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbCE7XG4gICAgICAvLyBBbGxvd3MgQW5ndWxhciB2YWxpZGF0b3JzIHRvIHVwZGF0ZSB0aGUgY3VzdG9tIGVsZW1lbnQncyB2YWxpZGl0eVxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSBjb250cm9sLnN0YXR1c0NoYW5nZXMhLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0ludmFsaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSB0aGlzLmlzSW52YWxpZChjb250cm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSAhIWNvbnRyb2wuaW52YWxpZCAmJiAhIWNvbnRyb2wuZGlydHk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbGxvd3MgY3VzdG9tIGVsZW1lbnQgdmFsaWRhdGUgZnVuY3Rpb24gdG8gdXBkYXRlIEFuZ3VsYXIgY29udHJvbCdzXG4gICAgICAvLyB2YWxpZGl0eVxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlISgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV06IHRydWUgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3RhdHVzU3ViKSB7XG4gICAgICB0aGlzLnN0YXR1c1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSB2YWx1ZSB0byBhIGN1c3RvbSBlbGVtZW50J3MgY29ycmVjdCB2YWx1ZSBwcm9wZXJ0eSwgYmFzZWQgb24gd2hhdFxuICAgKiBraW5kIG9mIGVsZW1lbnQgdGhlIGRpcmVjdGl2ZSBjb250cm9scy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB3cml0ZVxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IHRydWU7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpIHx8IHRoaXMuaXNTZWxlY3RhYmxlKGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICAoPGFueT5lbGVtZW50KVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNXcml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGN1c3RvbSBlbGVtZW50IGV2ZW50cyBhbmQgbm90aWZ5IEFuZ3VsYXIgb2YgYW55IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY2hlY2tlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndmFsdWUtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIG9uQ2hhbmdlZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1dyaXRpbmdWYWx1ZSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRJdGVtcycgfHwgcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW0nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtY2hhbmdlZCc6IHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoYW5nZWQgPSBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkVmFsdWVzJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBsZXQgcHJvcGVydHk6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBwcm9wZXJ0eSB3aWxsIGJlIGRlZmluZWQgaWYgd2UgcmVhY2ggdGhpcyBzaW5jZSBjaGFuZ2VkIGNhbiBvbmx5XG4gICAgICAgICAgLy8gYmUgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBmb3Igc2VsZWN0YWJsZSBlbGVtZW50c1xuICAgICAgICAgIHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCkhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ2NoZWNrZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IHVzZSBgZXZlbnQuZGV0YWlsLnZhbHVlYCwgc2luY2Ugd2UgY2Fubm90IGFzc3VtZSB0aGF0IGFsbFxuICAgICAgICAvLyBjaGFuZ2UgZXZlbnRzIHdpbGwgcHJvdmlkZSB0aGF0LiBBZGRpdGlvbmFsbHksIHNvbWUgZXZlbnQgZGV0YWlsc1xuICAgICAgICAvLyBtYXkgYmUgc3BsaWNlcyBvZiBhbiBhcnJheSBvciBvYmplY3QgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShlbGVtZW50W3Byb3BlcnR5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgYGludmFsaWRgIHByb3BlcnR5IGNoYW5nZXMuIFNvbWUgZWxlbWVudHMsIHN1Y2ggYXNcbiAgICogYDx2YWFkaW4tZGF0ZS1waWNrZXI+YCBoYXZlIG11bHRpcGxlIFwidmFsdWVzXCIuIFNldHRpbmcgdGhlIHByaW1hcnkgdmFsdWVcbiAgICogKGV4LiB0aGUgZGF0ZSBzdHJpbmcpIG1heSByZXN1bHQgaW4gYSB0ZW1wb3JhcmlseSBpbnZhbGlkIGVsZW1lbnQgdW50aWxcbiAgICogc3Vic2VxdWVudCB2YWx1ZXMgKGV4LiB0aGUgc2VsZWN0ZWQgZGF0ZSkgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAqXG4gICAqIFNpbmNlIHRoaXMgdmFsdWUgYWNjZXNzb3Igb25seSBsaXN0ZW5zIGZvciB2YWx1ZSBjaGFuZ2VzLCBpdCBtYXkgbm90IGJlXG4gICAqIG5vdGlmaWVkIG9mIHRoZSBjaGFuZ2UgaW4gdmFsaWRpdHkuIFRoaXMgbGlzdGVuZXIgd2lsbCBsaXN0ZW4gZm9yIGFueVxuICAgKiBleHBsaWNpdHkgdmFsaWRpdHkgY2hhbmdlcyBmcm9tIHRoZSBlbGVtZW50IGFuZCByZS1ldmFsdWF0ZSBhIGNvbnRyb2wnc1xuICAgKiB2YWxpZGl0eSBpZiBpdCBhbmQgdGhlIGVsZW1lbnQncyB2YWxpZGl0eSBhcmUgb3V0IG9mIHN5bmMuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdpbnZhbGlkLWNoYW5nZWQnKVxuICBvbkludmFsaWRDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRhYmxlKGVsZW1lbnQpICYmXG4gICAgICAgIHRoaXMuY29udHJvbCAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wuaW52YWxpZCAhPT0gZWxlbWVudC5pbnZhbGlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmlzVXBkYXRpbmdWYWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgY2hlY2tib3gtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzQ2hlY2tlZEVsZW1lbnQoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBDaGVja2VkRWxlbWVudExpa2Uge1xuICAgIHJldHVybiB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdjaGVja2VkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzU2VsZWN0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFNlbGVjdGFibGVMaWtlIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWQnKSB8fFxuICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRJdGVtJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc011bHRpU2VsZWN0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICAhIWVsZW1lbnQgJiZcbiAgICAgIGVsZW1lbnQubXVsdGkgPT09IHRydWUgJiZcbiAgICAgICh0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZFZhbHVlcycpIHx8XG4gICAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzVmFsaWRhdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBWYWxpZGF0YWJsZUxpa2Uge1xuICAgIHJldHVybiB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdpbnZhbGlkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIHByb3BlcnR5IGlzIGRlZmluZWQgYW55d2hlcmUgaW4gdGhlIHByb3ZpZGVkXG4gICAqIGVsZW1lbnQncyBwcm90b3R5cGUgY2hhaW4uXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yXG4gICAqL1xuICBwcml2YXRlIGlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQ6IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWVsZW1lbnQgJiYgcHJvcGVydHkgaW4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHNlbGVjdGFibGUgb3IgbXVsdGktc2VsZWN0YWJsZSBlbGVtZW50XG4gICAqIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuIFRoaXMgbWV0aG9kIHdpbGwgdXNlIGRlZmluZWQgcHJvcGVydGllcyBhbmQgdGhlXG4gICAqIHZhbHVlIHR5cGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkLiBJZiBpdCBjYW5ub3RcbiAgICogZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHRvIHVzZSwgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBnZXQgdGhlIHByb3BlcnR5IGZvclxuICAgKiBAcGFyYW0gdmFsdWUgYSB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eVxuICAgKiBAcmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSwgb3IgdW5kZWZpbmVkIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50OiBhbnksIHZhbHVlPzogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc011bHRpID0gdGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KTtcbiAgICBjb25zdCB2YWx1ZVByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkSXRlbXMnIDogJ3NlbGVjdGVkSXRlbSc7XG4gICAgY29uc3QgaW5kZXhQcm9wID0gaXNNdWx0aSA/ICdzZWxlY3RlZFZhbHVlcycgOiAnc2VsZWN0ZWQnO1xuICAgIGlmICh0eXBlb2YgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBpbmRleCBvciB2YWx1ZSBwcm9wZXJ0eSBmb3JcbiAgICAgIC8vIGEgc2VsZWN0YWJsZSBlbGVtZW50XG4gICAgICBjb25zdCBoYXNWYWx1ZVByb3AgPSB2YWx1ZVByb3AgaW4gZWxlbWVudDtcbiAgICAgIGNvbnN0IGhhc0luZGV4UHJvcCA9IGluZGV4UHJvcCBpbiBlbGVtZW50O1xuICAgICAgaWYgKGhhc1ZhbHVlUHJvcCAmJiAhaGFzSW5kZXhQcm9wKSB7XG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFoYXNWYWx1ZVByb3AgJiYgaGFzSW5kZXhQcm9wKSB7XG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBlbGVtZW50W3ZhbHVlUHJvcF07XG4gICAgICAgIC8vIFdoZW4gdGhlIGVsZW1lbnQgaGFzIGJvdGggcHJvcGVydGllcywgdHJ5IHRvIHNldCBpdCB0byB0aGUgdmFsdWVcbiAgICAgICAgLy8gcHJvcGVydHkgZmlyc3QuIElmIGl0IGZhaWxzLCB0aGVuIHVzZSB0aGUgaW5kZXggcHJvcGVydHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbGVtZW50W3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBDb3VsZCB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgYW4gdW5leHBlY3RlZCB0eXBlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlIHdlIHNldCBpdCB0byBpcyBzdGlsbCBhY2N1cmF0ZS4gSWYgaXQnc1xuICAgICAgICAvLyBub3QgdGhlbiB0aGUgZWxlbWVudCBzaWxlbnRseSByZWplY3RlZCB0aGUgbmV3IHZhbHVlLlxuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSBlbGVtZW50W3ZhbHVlUHJvcF0gPT09IHZhbHVlO1xuICAgICAgICBlbGVtZW50W3ZhbHVlUHJvcF0gPSBwcmV2aW91c1ZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID8gdmFsdWVQcm9wIDogaW5kZXhQcm9wO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi92YWx1ZS1hY2Nlc3Nvcic7XG5cbi8qKlxuICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgdGVtcGxhdGUgYW5kIHJlYWN0aXZlIEFuZ3VsYXIgZm9ybSBkaXJlY3RpdmVzIGFuZFxuICogY3VzdG9tIGVsZW1lbnRzLlxuICovXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3JdLFxuICBleHBvcnRzOiBbT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yXVxufSlcbmV4cG9ydCBjbGFzcyBPcmlnYW1pRm9ybXNNb2R1bGUge31cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7OztBQXlEQSxNQUFhLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9ERixpQ0FBeUMsU0FBUSxvQkFBb0I7Ozs7Ozs7SUF5RG5FLFlBQ1MsWUFDRyxRQUFrQixFQUM1QixRQUFtQixFQUduQixlQUF3QjtRQUV4QixLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQVB0QyxlQUFVLEdBQVYsVUFBVTtRQUNQLGFBQVEsR0FBUixRQUFRLENBQVU7Ozs7Ozs7O21DQTFDUixVQUFVOzs7Ozs7OEJBc0JQLEtBQUs7Ozs7OztrQ0FNRCxLQUFLO0tBcUJqQzs7Ozs7SUE1Q0QsSUFBSSxPQUFPO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsc0JBQUcsbUJBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxD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 |
@@ -82,4 +82,27 @@ import { __extends } from 'tslib'; | ||
_this.isWritingValue = false; | ||
/** | ||
* Flag that informs the value accessor that it is currently updating an | ||
* element's validity and should ignore additional `invalid` property changes | ||
* until it is complete. | ||
*/ | ||
_this.isUpdatingValidity = false; | ||
return _this; | ||
} | ||
Object.defineProperty(OrigamiControlValueAccessor.prototype, "control", { | ||
/** | ||
* The `AbstractControl` attached to this element. | ||
*/ | ||
get: /** | ||
* The `AbstractControl` attached to this element. | ||
* @return {?} | ||
*/ | ||
function () { | ||
if (!this._control) { | ||
this._control = /** @type {?} */ (((/** @type {?} */ (this.injector.get(NgControl))).control)); | ||
} | ||
return this._control; | ||
}, | ||
enumerable: true, | ||
configurable: true | ||
}); | ||
/** | ||
@@ -105,3 +128,3 @@ * Lifecycle callback that will connect an element's validatable properties | ||
/** @type {?} */ | ||
var control_1 = /** @type {?} */ (((/** @type {?} */ (this.injector.get(NgControl))).control)); | ||
var control_1 = /** @type {?} */ ((this.control)); | ||
// Allows Angular validators to update the custom element's validity | ||
@@ -252,2 +275,50 @@ this.statusSub = /** @type {?} */ ((control_1.statusChanges)).subscribe(function () { | ||
/** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
*/ | ||
/** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
* @return {?} | ||
*/ | ||
OrigamiControlValueAccessor.prototype.onInvalidChanged = /** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
* @return {?} | ||
*/ | ||
function () { | ||
if (!this.isUpdatingValidity) { | ||
/** @type {?} */ | ||
var element = this.elementRef.nativeElement; | ||
if (this.isValidatable(element) && | ||
this.control && | ||
this.control.invalid !== element.invalid) { | ||
this.isUpdatingValidity = true; | ||
this.control.updateValueAndValidity(); | ||
this.isUpdatingValidity = false; | ||
} | ||
} | ||
}; | ||
/** | ||
* Determines whether or not an element is checkbox-like. | ||
@@ -431,3 +502,4 @@ * | ||
validationErrorsKey: [{ type: Input }], | ||
onChangedEvent: [{ type: HostListener, args: ['selected-items-changed', ['$event'],] }, { type: HostListener, args: ['selected-item-changed', ['$event'],] }, { type: HostListener, args: ['selected-values-changed', ['$event'],] }, { type: HostListener, args: ['selected-changed', ['$event'],] }, { type: HostListener, args: ['checked-changed', ['$event'],] }, { type: HostListener, args: ['value-changed', ['$event'],] }] | ||
onChangedEvent: [{ type: HostListener, args: ['selected-items-changed', ['$event'],] }, { type: HostListener, args: ['selected-item-changed', ['$event'],] }, { type: HostListener, args: ['selected-values-changed', ['$event'],] }, { type: HostListener, args: ['selected-changed', ['$event'],] }, { type: HostListener, args: ['checked-changed', ['$event'],] }, { type: HostListener, args: ['value-changed', ['$event'],] }], | ||
onInvalidChanged: [{ type: HostListener, args: ['invalid-changed',] }] | ||
}; | ||
@@ -469,2 +541,2 @@ return OrigamiControlValueAccessor; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2FtaS1mb3Jtcy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS9mb3Jtcy9zcmMvdmFsdWUtYWNjZXNzb3IudHMiLCJuZzovL0Bjb2RlYmFrZXJ5L29yaWdhbWkvZm9ybXMvc3JjL2Zvcm1zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gdXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBvciBpbmRleCBwcm9wZXJ0eSBmb3IgYVxuICAgKiBzZWxlY3Qgb3IgbXVsaXQtc2VsZWN0IGVsZW1lbnQuIFdoZW4gdW5kZWZpbmVkLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGVcbiAgICogZGV0ZXJtaW5hdGlvbiBvZiB3aGljaCBwcm9wZXJ0eSB0byB1c2UgaGFzIG5vdCBvY2N1cnJlZCB5ZXQuXG4gICAqL1xuICBwcml2YXRlIHVzZVNlbGVjdGFibGVWYWx1ZVByb3A/OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NUE9TSVRJT05fQlVGRkVSX01PREUpXG4gICAgY29tcG9zaXRpb25Nb2RlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHJlbmRlcmVyLCBlbGVtZW50UmVmLCBjb21wb3NpdGlvbk1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0aGF0IHdpbGwgY29ubmVjdCBhbiBlbGVtZW50J3MgdmFsaWRhdGFibGUgcHJvcGVydGllc1xuICAgKiAoaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQpIHRvIHRoZSBBbmd1bGFyIGNvbnRyb2wuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICAgIC8vIEFsbG93cyBBbmd1bGFyIHZhbGlkYXRvcnMgdG8gdXBkYXRlIHRoZSBjdXN0b20gZWxlbWVudCdzIHZhbGlkaXR5XG4gICAgICB0aGlzLnN0YXR1c1N1YiA9IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcyEuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlzSW52YWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVsZW1lbnQuaW52YWxpZCA9IHRoaXMuaXNJbnZhbGlkKGNvbnRyb2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuaW52YWxpZCA9ICEhY29udHJvbC5pbnZhbGlkICYmICEhY29udHJvbC5kaXJ0eTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93cyBjdXN0b20gZWxlbWVudCB2YWxpZGF0ZSBmdW5jdGlvbiB0byB1cGRhdGUgQW5ndWxhciBjb250cm9sJ3NcbiAgICAgIC8vIHZhbGlkaXR5XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFxuICAgICAgICAgIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICBjb250cm9sLnZhbGlkYXRvcixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsaWRhdGUhKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XTogdHJ1ZSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNTdWIpIHtcbiAgICAgIHRoaXMuc3RhdHVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgY3VzdG9tIGVsZW1lbnQncyBjb3JyZWN0IHZhbHVlIHByb3BlcnR5LCBiYXNlZCBvbiB3aGF0XG4gICAqIGtpbmQgb2YgZWxlbWVudCB0aGUgZGlyZWN0aXZlIGNvbnRyb2xzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCwgdmFsdWUpO1xuICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICg8YW55PmVsZW1lbnQpW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgY3VzdG9tIGVsZW1lbnQgZXZlbnRzIGFuZCBub3RpZnkgQW5ndWxhciBvZiBhbnkgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGVja2VkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd2YWx1ZS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2VkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzV3JpdGluZ1ZhbHVlKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRWYWx1ZXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgICAgIC8vIHByb3BlcnR5IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSByZWFjaCB0aGlzIHNpbmNlIGNoYW5nZWQgY2FuIG9ubHlcbiAgICAgICAgICAvLyBiZSB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGZvciBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KSE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAnY2hlY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBldmVudC5kZXRhaWwudmFsdWVgLCBzaW5jZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsXG4gICAgICAgIC8vIGNoYW5nZSBldmVudHMgd2lsbCBwcm92aWRlIHRoYXQuIEFkZGl0aW9uYWxseSwgc29tZSBldmVudCBkZXRhaWxzXG4gICAgICAgIC8vIG1heSBiZSBzcGxpY2VzIG9mIGFuIGFycmF5IG9yIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsZW1lbnRbcHJvcGVydHldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIGNoZWNrYm94LWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnY2hlY2tlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBzZWxlY3RhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc1NlbGVjdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkJykgfHxcbiAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkSXRlbScpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgbXVsdGkgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBNdWx0aVNlbGVjdGFibGVMaWtlIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmXG4gICAgICBlbGVtZW50Lm11bHRpID09PSB0cnVlICYmXG4gICAgICAodGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSB8fFxuICAgICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZFZhbHVlcycpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIHZhbGlkYXRhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc1ZhbGlkYXRhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgVmFsaWRhdGFibGVMaWtlIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnaW52YWxpZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGFueXdoZXJlIGluIHRoZSBwcm92aWRlZFxuICAgKiBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvclxuICAgKi9cbiAgcHJpdmF0ZSBpc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFlbGVtZW50ICYmIHByb3BlcnR5IGluIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBzZWxlY3RhYmxlIG9yIG11bHRpLXNlbGVjdGFibGUgZWxlbWVudFxuICAgKiB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLiBUaGlzIG1ldGhvZCB3aWxsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHRoZVxuICAgKiB2YWx1ZSB0eXBlIHRvIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZC4gSWYgaXQgY2Fubm90XG4gICAqIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSB0byB1c2UsIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBmb3JcbiAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgZm9yIHRoZSBlbGVtZW50J3MgcHJvcGVydHlcbiAgICogQHJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudDogYW55LCB2YWx1ZT86IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaXNNdWx0aSA9IHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCk7XG4gICAgY29uc3QgdmFsdWVQcm9wID0gaXNNdWx0aSA/ICdzZWxlY3RlZEl0ZW1zJyA6ICdzZWxlY3RlZEl0ZW0nO1xuICAgIGNvbnN0IGluZGV4UHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRWYWx1ZXMnIDogJ3NlbGVjdGVkJztcbiAgICBpZiAodHlwZW9mIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgYmUgc2V0dGluZyB0aGUgaW5kZXggb3IgdmFsdWUgcHJvcGVydHkgZm9yXG4gICAgICAvLyBhIHNlbGVjdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgaGFzVmFsdWVQcm9wID0gdmFsdWVQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBjb25zdCBoYXNJbmRleFByb3AgPSBpbmRleFByb3AgaW4gZWxlbWVudDtcbiAgICAgIGlmIChoYXNWYWx1ZVByb3AgJiYgIWhhc0luZGV4UHJvcCkge1xuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghaGFzVmFsdWVQcm9wICYmIGhhc0luZGV4UHJvcCkge1xuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZWxlbWVudFt2YWx1ZVByb3BdO1xuICAgICAgICAvLyBXaGVuIHRoZSBlbGVtZW50IGhhcyBib3RoIHByb3BlcnRpZXMsIHRyeSB0byBzZXQgaXQgdG8gdGhlIHZhbHVlXG4gICAgICAgIC8vIHByb3BlcnR5IGZpcnN0LiBJZiBpdCBmYWlscywgdGhlbiB1c2UgdGhlIGluZGV4IHByb3BlcnR5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZWxlbWVudFt2YWx1ZVByb3BdID0gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gQ291bGQgdGhyb3cgaWYgdGhlIHZhbHVlIGlzIGFuIHVuZXhwZWN0ZWQgdHlwZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB2YWx1ZSB3ZSBzZXQgaXQgdG8gaXMgc3RpbGwgYWNjdXJhdGUuIElmIGl0J3NcbiAgICAgICAgLy8gbm90IHRoZW4gdGhlIGVsZW1lbnQgc2lsZW50bHkgcmVqZWN0ZWQgdGhlIG5ldyB2YWx1ZS5cbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZWxlbWVudFt2YWx1ZVByb3BdID09PSB2YWx1ZTtcbiAgICAgICAgZWxlbWVudFt2YWx1ZVByb3BdID0gcHJldmlvdXNWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA/IHZhbHVlUHJvcCA6IGluZGV4UHJvcDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vdmFsdWUtYWNjZXNzb3InO1xuXG4vKipcbiAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRlbXBsYXRlIGFuZCByZWFjdGl2ZSBBbmd1bGFyIGZvcm0gZGlyZWN0aXZlcyBhbmRcbiAqIGN1c3RvbSBlbGVtZW50cy5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yXSxcbiAgZXhwb3J0czogW09yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3Nvcl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUZvcm1zTW9kdWxlIHt9XG4iXSwibmFtZXMiOlsidHNsaWJfMS5fX2V4dGVuZHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBeURBLElBQWEsOEJBQThCLEdBQWE7SUFDdEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSwyQkFBMkIsR0FBQSxDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvRCtDQSwrQ0FBb0I7SUFvQ25FLHFDQUNTLFlBQ0csUUFBa0IsRUFDNUIsUUFBbUIsRUFHbkIsZUFBd0I7UUFOMUIsWUFRRSxrQkFBTSxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxTQUM3QztRQVJRLGdCQUFVLEdBQVYsVUFBVTtRQUNQLGNBQVEsR0FBUixRQUFRLENBQVU7Ozs7Ozs7O29DQXJCUixVQUFVOzs7Ozs7K0JBV1AsS0FBSzs7S0FpQjdCOzs7Ozs7Ozs7O0lBTUQscURBQWU7Ozs7O0lBQWY7UUFBQSxpQkE4QkM7O1FBN0JDLElBQU0s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 | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2FtaS1mb3Jtcy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS9mb3Jtcy9zcmMvdmFsdWUtYWNjZXNzb3IudHMiLCJuZzovL0Bjb2RlYmFrZXJ5L29yaWdhbWkvZm9ybXMvc3JjL2Zvcm1zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFic3RyYWN0Q29udHJvbGAgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdGhhdCBpdCBpcyBjdXJyZW50bHkgdXBkYXRpbmcgYW5cbiAgICogZWxlbWVudCdzIHZhbGlkaXR5IGFuZCBzaG91bGQgaWdub3JlIGFkZGl0aW9uYWwgYGludmFsaWRgIHByb3BlcnR5IGNoYW5nZXNcbiAgICogdW50aWwgaXQgaXMgY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGlzVXBkYXRpbmdWYWxpZGl0eSA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhY2hlZCBgY29udHJvbGAgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChDT01QT1NJVElPTl9CVUZGRVJfTU9ERSlcbiAgICBjb21wb3NpdGlvbk1vZGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIocmVuZGVyZXIsIGVsZW1lbnRSZWYsIGNvbXBvc2l0aW9uTW9kZSk7XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRoYXQgd2lsbCBjb25uZWN0IGFuIGVsZW1lbnQncyB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzXG4gICAqIChpZiB0aGV5IGFyZSBpbXBsZW1lbnRlZCkgdG8gdGhlIEFuZ3VsYXIgY29udHJvbC5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSkge1xuICAgICAgLy8gVGhlIGNvbnRyb2wgd2lsbCBhbHdheXMgYmUgc2V0IGJ5IG5nQWZ0ZXJWaWV3SW5pdCBkdWUgdG8gdGhlIG5hdHVyZSBvZlxuICAgICAgLy8gdGhlIGRpcmVjdGl2ZSdzIHNlbGVjdG9yc1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbCE7XG4gICAgICAvLyBBbGxvd3MgQW5ndWxhciB2YWxpZGF0b3JzIHRvIHVwZGF0ZSB0aGUgY3VzdG9tIGVsZW1lbnQncyB2YWxpZGl0eVxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSBjb250cm9sLnN0YXR1c0NoYW5nZXMhLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0ludmFsaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSB0aGlzLmlzSW52YWxpZChjb250cm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSAhIWNvbnRyb2wuaW52YWxpZCAmJiAhIWNvbnRyb2wuZGlydHk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbGxvd3MgY3VzdG9tIGVsZW1lbnQgdmFsaWRhdGUgZnVuY3Rpb24gdG8gdXBkYXRlIEFuZ3VsYXIgY29udHJvbCdzXG4gICAgICAvLyB2YWxpZGl0eVxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlISgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV06IHRydWUgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3RhdHVzU3ViKSB7XG4gICAgICB0aGlzLnN0YXR1c1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSB2YWx1ZSB0byBhIGN1c3RvbSBlbGVtZW50J3MgY29ycmVjdCB2YWx1ZSBwcm9wZXJ0eSwgYmFzZWQgb24gd2hhdFxuICAgKiBraW5kIG9mIGVsZW1lbnQgdGhlIGRpcmVjdGl2ZSBjb250cm9scy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB3cml0ZVxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IHRydWU7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpIHx8IHRoaXMuaXNTZWxlY3RhYmxlKGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICAoPGFueT5lbGVtZW50KVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNXcml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGN1c3RvbSBlbGVtZW50IGV2ZW50cyBhbmQgbm90aWZ5IEFuZ3VsYXIgb2YgYW55IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY2hlY2tlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndmFsdWUtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIG9uQ2hhbmdlZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1dyaXRpbmdWYWx1ZSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRJdGVtcycgfHwgcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW0nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtY2hhbmdlZCc6IHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoYW5nZWQgPSBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkVmFsdWVzJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBsZXQgcHJvcGVydHk6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBwcm9wZXJ0eSB3aWxsIGJlIGRlZmluZWQgaWYgd2UgcmVhY2ggdGhpcyBzaW5jZSBjaGFuZ2VkIGNhbiBvbmx5XG4gICAgICAgICAgLy8gYmUgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBmb3Igc2VsZWN0YWJsZSBlbGVtZW50c1xuICAgICAgICAgIHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCkhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ2NoZWNrZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IHVzZSBgZXZlbnQuZGV0YWlsLnZhbHVlYCwgc2luY2Ugd2UgY2Fubm90IGFzc3VtZSB0aGF0IGFsbFxuICAgICAgICAvLyBjaGFuZ2UgZXZlbnRzIHdpbGwgcHJvdmlkZSB0aGF0LiBBZGRpdGlvbmFsbHksIHNvbWUgZXZlbnQgZGV0YWlsc1xuICAgICAgICAvLyBtYXkgYmUgc3BsaWNlcyBvZiBhbiBhcnJheSBvciBvYmplY3QgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShlbGVtZW50W3Byb3BlcnR5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgYGludmFsaWRgIHByb3BlcnR5IGNoYW5nZXMuIFNvbWUgZWxlbWVudHMsIHN1Y2ggYXNcbiAgICogYDx2YWFkaW4tZGF0ZS1waWNrZXI+YCBoYXZlIG11bHRpcGxlIFwidmFsdWVzXCIuIFNldHRpbmcgdGhlIHByaW1hcnkgdmFsdWVcbiAgICogKGV4LiB0aGUgZGF0ZSBzdHJpbmcpIG1heSByZXN1bHQgaW4gYSB0ZW1wb3JhcmlseSBpbnZhbGlkIGVsZW1lbnQgdW50aWxcbiAgICogc3Vic2VxdWVudCB2YWx1ZXMgKGV4LiB0aGUgc2VsZWN0ZWQgZGF0ZSkgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAqXG4gICAqIFNpbmNlIHRoaXMgdmFsdWUgYWNjZXNzb3Igb25seSBsaXN0ZW5zIGZvciB2YWx1ZSBjaGFuZ2VzLCBpdCBtYXkgbm90IGJlXG4gICAqIG5vdGlmaWVkIG9mIHRoZSBjaGFuZ2UgaW4gdmFsaWRpdHkuIFRoaXMgbGlzdGVuZXIgd2lsbCBsaXN0ZW4gZm9yIGFueVxuICAgKiBleHBsaWNpdHkgdmFsaWRpdHkgY2hhbmdlcyBmcm9tIHRoZSBlbGVtZW50IGFuZCByZS1ldmFsdWF0ZSBhIGNvbnRyb2wnc1xuICAgKiB2YWxpZGl0eSBpZiBpdCBhbmQgdGhlIGVsZW1lbnQncyB2YWxpZGl0eSBhcmUgb3V0IG9mIHN5bmMuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdpbnZhbGlkLWNoYW5nZWQnKVxuICBvbkludmFsaWRDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRhYmxlKGVsZW1lbnQpICYmXG4gICAgICAgIHRoaXMuY29udHJvbCAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wuaW52YWxpZCAhPT0gZWxlbWVudC5pbnZhbGlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmlzVXBkYXRpbmdWYWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgY2hlY2tib3gtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzQ2hlY2tlZEVsZW1lbnQoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBDaGVja2VkRWxlbWVudExpa2Uge1xuICAgIHJldHVybiB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdjaGVja2VkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzU2VsZWN0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFNlbGVjdGFibGVMaWtlIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWQnKSB8fFxuICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRJdGVtJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc011bHRpU2VsZWN0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICAhIWVsZW1lbnQgJiZcbiAgICAgIGVsZW1lbnQubXVsdGkgPT09IHRydWUgJiZcbiAgICAgICh0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZFZhbHVlcycpIHx8XG4gICAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzVmFsaWRhdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBWYWxpZGF0YWJsZUxpa2Uge1xuICAgIHJldHVybiB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdpbnZhbGlkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIHByb3BlcnR5IGlzIGRlZmluZWQgYW55d2hlcmUgaW4gdGhlIHByb3ZpZGVkXG4gICAqIGVsZW1lbnQncyBwcm90b3R5cGUgY2hhaW4uXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yXG4gICAqL1xuICBwcml2YXRlIGlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQ6IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWVsZW1lbnQgJiYgcHJvcGVydHkgaW4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHNlbGVjdGFibGUgb3IgbXVsdGktc2VsZWN0YWJsZSBlbGVtZW50XG4gICAqIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuIFRoaXMgbWV0aG9kIHdpbGwgdXNlIGRlZmluZWQgcHJvcGVydGllcyBhbmQgdGhlXG4gICAqIHZhbHVlIHR5cGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkLiBJZiBpdCBjYW5ub3RcbiAgICogZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHRvIHVzZSwgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBnZXQgdGhlIHByb3BlcnR5IGZvclxuICAgKiBAcGFyYW0gdmFsdWUgYSB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eVxuICAgKiBAcmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSwgb3IgdW5kZWZpbmVkIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50OiBhbnksIHZhbHVlPzogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc011bHRpID0gdGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KTtcbiAgICBjb25zdCB2YWx1ZVByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkSXRlbXMnIDogJ3NlbGVjdGVkSXRlbSc7XG4gICAgY29uc3QgaW5kZXhQcm9wID0gaXNNdWx0aSA/ICdzZWxlY3RlZFZhbHVlcycgOiAnc2VsZWN0ZWQnO1xuICAgIGlmICh0eXBlb2YgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBpbmRleCBvciB2YWx1ZSBwcm9wZXJ0eSBmb3JcbiAgICAgIC8vIGEgc2VsZWN0YWJsZSBlbGVtZW50XG4gICAgICBjb25zdCBoYXNWYWx1ZVByb3AgPSB2YWx1ZVByb3AgaW4gZWxlbWVudDtcbiAgICAgIGNvbnN0IGhhc0luZGV4UHJvcCA9IGluZGV4UHJvcCBpbiBlbGVtZW50O1xuICAgICAgaWYgKGhhc1ZhbHVlUHJvcCAmJiAhaGFzSW5kZXhQcm9wKSB7XG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFoYXNWYWx1ZVByb3AgJiYgaGFzSW5kZXhQcm9wKSB7XG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBlbGVtZW50W3ZhbHVlUHJvcF07XG4gICAgICAgIC8vIFdoZW4gdGhlIGVsZW1lbnQgaGFzIGJvdGggcHJvcGVydGllcywgdHJ5IHRvIHNldCBpdCB0byB0aGUgdmFsdWVcbiAgICAgICAgLy8gcHJvcGVydHkgZmlyc3QuIElmIGl0IGZhaWxzLCB0aGVuIHVzZSB0aGUgaW5kZXggcHJvcGVydHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbGVtZW50W3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBDb3VsZCB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgYW4gdW5leHBlY3RlZCB0eXBlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlIHdlIHNldCBpdCB0byBpcyBzdGlsbCBhY2N1cmF0ZS4gSWYgaXQnc1xuICAgICAgICAvLyBub3QgdGhlbiB0aGUgZWxlbWVudCBzaWxlbnRseSByZWplY3RlZCB0aGUgbmV3IHZhbHVlLlxuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSBlbGVtZW50W3ZhbHVlUHJvcF0gPT09IHZhbHVlO1xuICAgICAgICBlbGVtZW50W3ZhbHVlUHJvcF0gPSBwcmV2aW91c1ZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID8gdmFsdWVQcm9wIDogaW5kZXhQcm9wO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi92YWx1ZS1hY2Nlc3Nvcic7XG5cbi8qKlxuICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgdGVtcGxhdGUgYW5kIHJlYWN0aXZlIEFuZ3VsYXIgZm9ybSBkaXJlY3RpdmVzIGFuZFxuICogY3VzdG9tIGVsZW1lbnRzLlxuICovXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3JdLFxuICBleHBvcnRzOiBbT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yXVxufSlcbmV4cG9ydCBjbGFzcyBPcmlnYW1pRm9ybXNNb2R1bGUge31cbiJdLCJuYW1lcyI6WyJ0c2xpYl8xLl9fZXh0ZW5kcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUF5REEsSUFBYSw4QkFBOEIsR0FBYTtJQUN0RCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLDJCQUEyQixHQUFBLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9EK0NBLCtDQUFvQjtJQXlEbkUscUNBQ1MsWUFDRyxRQUFrQixFQUM1QixRQUFtQixFQUduQixlQUF3QjtRQU4xQixZQVFFLGtCQUFNLFFBQVEsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLFNBQzdDO1FBUlEsZ0JBQVUsR0FBVixVQUFVO1FBQ1AsY0FBUSxHQUFSLFFBQVEsQ0FBVTs7Ozs7Ozs7b0NBMUNSLFVBQVU7Ozs7OzsrQkFzQlAsS0FBSzs7Ozs7O21DQU1ELEtBQUs7O0tBcUJqQztJQTVDRCxzQkFBSSxnREFBTzs7Ozs7Ozs7UUFBWDtZQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNsQixJQUFJLENBQUMsUUFBUSxzQkFBRyxtQkFBWSxJQUFJLENBQUMs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 |
@@ -1,1 +0,1 @@ | ||
{"__symbolic":"module","version":4,"metadata":{"OrigamiFormsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":7,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"OrigamiControlValueAccessor"}],"exports":[{"__symbolic":"reference","name":"OrigamiControlValueAccessor"}]}]}],"members":{}},"CheckedElementLike":{"__symbolic":"interface"},"SelectableLike":{"__symbolic":"interface"},"MultiSelectableLike":{"__symbolic":"interface"},"ValidatableLike":{"__symbolic":"interface"},"ORIGAMI_CONTROL_VALUE_ACCESSOR":{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":58,"character":11},"useExisting":{"__symbolic":"reference","name":"OrigamiControlValueAccessor"},"multi":true},"OrigamiControlValueAccessor":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@angular/forms","name":"DefaultValueAccessor","line":113,"character":49},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":108,"character":1},"arguments":[{"selector":"[ngModel][origami],[formControlName][origami],[formControl][origami]","providers":[{"__symbolic":"reference","name":"ORIGAMI_CONTROL_VALUE_ACCESSOR"}]}]}],"members":{"isInvalid":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":120,"character":3}}]}],"validationErrorsKey":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":129,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":153,"character":5}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":154,"character":5},"arguments":[{"__symbolic":"reference","module":"@angular/forms","name":"COMPOSITION_BUFFER_MODE","line":154,"character":12}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":150,"character":23},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":151,"character":24},{"__symbolic":"reference","module":"@angular/core","name":"Renderer2","line":152,"character":14},{"__symbolic":"reference","name":"boolean"}]}],"ngAfterViewInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"onChangedEvent":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":233,"character":3},"arguments":["selected-items-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":234,"character":3},"arguments":["selected-item-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":235,"character":3},"arguments":["selected-values-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":236,"character":3},"arguments":["selected-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":237,"character":3},"arguments":["checked-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":238,"character":3},"arguments":["value-changed",["$event"]]}]}],"isCheckedElement":[{"__symbolic":"method"}],"isSelectable":[{"__symbolic":"method"}],"isMultiSelectable":[{"__symbolic":"method"}],"isValidatable":[{"__symbolic":"method"}],"isPropertyDefined":[{"__symbolic":"method"}],"getSelectableProperty":[{"__symbolic":"method"}]}}},"origins":{"OrigamiFormsModule":"./src/forms.module","CheckedElementLike":"./src/value-accessor","SelectableLike":"./src/value-accessor","MultiSelectableLike":"./src/value-accessor","ValidatableLike":"./src/value-accessor","ORIGAMI_CONTROL_VALUE_ACCESSOR":"./src/value-accessor","OrigamiControlValueAccessor":"./src/value-accessor"},"importAs":"@codebakery/origami/forms"} | ||
{"__symbolic":"module","version":4,"metadata":{"OrigamiFormsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":7,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"OrigamiControlValueAccessor"}],"exports":[{"__symbolic":"reference","name":"OrigamiControlValueAccessor"}]}]}],"members":{}},"CheckedElementLike":{"__symbolic":"interface"},"SelectableLike":{"__symbolic":"interface"},"MultiSelectableLike":{"__symbolic":"interface"},"ValidatableLike":{"__symbolic":"interface"},"ORIGAMI_CONTROL_VALUE_ACCESSOR":{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":58,"character":11},"useExisting":{"__symbolic":"reference","name":"OrigamiControlValueAccessor"},"multi":true},"OrigamiControlValueAccessor":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@angular/forms","name":"DefaultValueAccessor","line":113,"character":49},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":108,"character":1},"arguments":[{"selector":"[ngModel][origami],[formControlName][origami],[formControl][origami]","providers":[{"__symbolic":"reference","name":"ORIGAMI_CONTROL_VALUE_ACCESSOR"}]}]}],"members":{"isInvalid":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":120,"character":3}}]}],"validationErrorsKey":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":129,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":174,"character":5}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":175,"character":5},"arguments":[{"__symbolic":"reference","module":"@angular/forms","name":"COMPOSITION_BUFFER_MODE","line":175,"character":12}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":171,"character":23},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":172,"character":24},{"__symbolic":"reference","module":"@angular/core","name":"Renderer2","line":173,"character":14},{"__symbolic":"reference","name":"boolean"}]}],"ngAfterViewInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"onChangedEvent":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":256,"character":3},"arguments":["selected-items-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":257,"character":3},"arguments":["selected-item-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":258,"character":3},"arguments":["selected-values-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":259,"character":3},"arguments":["selected-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":260,"character":3},"arguments":["checked-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":261,"character":3},"arguments":["value-changed",["$event"]]}]}],"onInvalidChanged":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":314,"character":3},"arguments":["invalid-changed"]}]}],"isCheckedElement":[{"__symbolic":"method"}],"isSelectable":[{"__symbolic":"method"}],"isMultiSelectable":[{"__symbolic":"method"}],"isValidatable":[{"__symbolic":"method"}],"isPropertyDefined":[{"__symbolic":"method"}],"getSelectableProperty":[{"__symbolic":"method"}]}}},"origins":{"OrigamiFormsModule":"./src/forms.module","CheckedElementLike":"./src/value-accessor","SelectableLike":"./src/value-accessor","MultiSelectableLike":"./src/value-accessor","ValidatableLike":"./src/value-accessor","ORIGAMI_CONTROL_VALUE_ACCESSOR":"./src/value-accessor","OrigamiControlValueAccessor":"./src/value-accessor"},"importAs":"@codebakery/origami/forms"} |
@@ -97,2 +97,6 @@ import { AfterViewInit, ElementRef, Injector, OnDestroy, Provider, Renderer2 } from '@angular/core'; | ||
/** | ||
* The `AbstractControl` attached to this element. | ||
*/ | ||
readonly control: AbstractControl | undefined; | ||
/** | ||
* Subscription to the NgControl's statusChanges. | ||
@@ -110,2 +114,8 @@ */ | ||
/** | ||
* Flag that informs the value accessor that it is currently updating an | ||
* element's validity and should ignore additional `invalid` property changes | ||
* until it is complete. | ||
*/ | ||
private isUpdatingValidity; | ||
/** | ||
* Indicates whether or not to use the value property or index property for a | ||
@@ -116,2 +126,6 @@ * select or mulit-select element. When undefined, it indicates that the | ||
private useSelectableValueProp?; | ||
/** | ||
* Cached `control` value. | ||
*/ | ||
private _control; | ||
constructor(elementRef: ElementRef, injector: Injector, renderer: Renderer2, compositionMode: boolean); | ||
@@ -141,2 +155,14 @@ /** | ||
/** | ||
* Listen for `invalid` property changes. Some elements, such as | ||
* `<vaadin-date-picker>` have multiple "values". Setting the primary value | ||
* (ex. the date string) may result in a temporarily invalid element until | ||
* subsequent values (ex. the selected date) have been updated. | ||
* | ||
* Since this value accessor only listens for value changes, it may not be | ||
* notified of the change in validity. This listener will listen for any | ||
* explicity validity changes from the element and re-evaluate a control's | ||
* validity if it and the element's validity are out of sync. | ||
*/ | ||
onInvalidChanged(): void; | ||
/** | ||
* Determines whether or not an element is checkbox-like. | ||
@@ -143,0 +169,0 @@ * |
{ | ||
"$schema": "./node_modules/ng-packagr/package.schema.json", | ||
"name": "@codebakery/origami", | ||
"version": "3.0.0-beta.2", | ||
"version": "3.0.0-beta.3", | ||
"description": "Angular + Polymer", | ||
@@ -6,0 +6,0 @@ "keywords": [ |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1137949
8777