UNPKG

@kushki/ng-suka

Version:

<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>

444 lines 30 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, HostBinding } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** @enum {number} */ const CheckboxState = { Init: 0, Indeterminate: 1, Checked: 2, Unchecked: 3, }; export { CheckboxState }; CheckboxState[CheckboxState.Init] = 'Init'; CheckboxState[CheckboxState.Indeterminate] = 'Indeterminate'; CheckboxState[CheckboxState.Checked] = 'Checked'; CheckboxState[CheckboxState.Unchecked] = 'Unchecked'; /** * Used to emit changes performed on checkbox components. */ export class CheckboxChange { } if (false) { /** @type {?} */ CheckboxChange.prototype.source; /** @type {?} */ CheckboxChange.prototype.checked; } // tslint:disable-next-line: component-class-suffix export class Checkbox { /** * Creates an instance of `Checkbox`. * @param {?} changeDetectorRef */ constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; /** * Size of the checkbox. */ this.size = 'md'; /** * Set to `true` for checkbox to be rendered without any classes on the host element. */ this.inline = false; /** * Set to `true` for a disabled checkbox. */ this.disabled = false; /** * Set to `true` for a loading checkbox. */ this.skeleton = false; /** * Set to `true` to hide the checkbox labels. */ this.hideLabel = false; /** * The unique id for the checkbox component. */ this.id = `checkbox-${Checkbox.checkboxCount}`; /** * Used to set the `aria-label` attribute on the input element. */ // tslint:disable-next-line:no-input-rename this.ariaLabel = ''; /** * Emits event notifying other classes when a change in state occurs on a checkbox after a * click. */ // tslint:disable-next-line: no-output-native this.change = new EventEmitter(); /** * Emits event notifying other classes when a change in state occurs specifically * on an indeterminate checkbox. */ this.indeterminateChange = new EventEmitter(); /** * Set to `true` if the input checkbox is selected (or checked). */ // tslint:disable-next-line: variable-name this._checked = false; /** * Set to `true` if the input checkbox is in state indeterminate. */ // tslint:disable-next-line: variable-name this._indeterminate = false; this.currentCheckboxState = CheckboxState.Init; /** * Called when checkbox is blurred. Needed to properly implement `ControlValueAccessor`. */ this.onTouched = (/** * @return {?} */ () => { }); /** * Method set in `registerOnChange` to propagate changes back to the form. */ this.propagateChange = (/** * @param {?} _ * @return {?} */ (_) => { }); Checkbox.checkboxCount++; } /** * Reflects whether the checkbox state is indeterminate. * @return {?} */ get indeterminate() { return this._indeterminate; } /** * Set the checkbox's indeterminate state to match the parameter and transition the view to reflect the change. * @param {?} indeterminate * @return {?} */ set indeterminate(indeterminate) { /** @type {?} */ const changed = this._indeterminate !== indeterminate; this._indeterminate = indeterminate; if (changed) { this.transitionCheckboxState(CheckboxState.Indeterminate); } else { this.transitionCheckboxState(this.checked ? CheckboxState.Checked : CheckboxState.Unchecked); } this.indeterminateChange.emit(this._indeterminate); } /** * Returns value `true` if state is selected for the checkbox. * @return {?} */ get checked() { return this._checked; } /** * Updating the state of a checkbox to match the state of the parameter passed in. * @param {?} checked * @return {?} */ set checked(checked) { if (checked !== this.checked) { if (this._indeterminate) { Promise.resolve().then((/** * @return {?} */ () => { this._indeterminate = false; this.indeterminateChange.emit(this._indeterminate); })); } this._checked = checked; this.changeDetectorRef.markForCheck(); } } /** * @return {?} */ get checkboxWrapperClass() { return !this.inline; } /** * @return {?} */ get formItemClass() { return !this.inline; } /** * Toggle the selected state of the checkbox. * @return {?} */ toggle() { this.checked = !this.checked; } // this is the initial value set to the component /** * @param {?} value * @return {?} */ writeValue(value) { this.checked = !!value; } /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ registerOnChange(fn) { this.propagateChange = fn; } /** * Registers a callback to be triggered when the control has been touched. * @param {?} fn Callback to be triggered when the checkbox is touched. * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * Executes on the event of a change within `Checkbox` to block propagation. * @param {?} event * @return {?} */ onChange(event) { event.stopPropagation(); } /** * Handles click events on the `Checkbox` and emits changes to other classes. * @param {?} event * @return {?} */ onClick(event) { if (!this.disabled) { this.toggle(); this.transitionCheckboxState(this._checked ? CheckboxState.Checked : CheckboxState.Unchecked); this.emitChangeEvent(); } } /** * Handles changes between checkbox states. * @param {?} newState * @return {?} */ transitionCheckboxState(newState) { /** @type {?} */ const oldState = this.currentCheckboxState; // Indeterminate has to be set always if it's transitioned to // checked has to be set before indeterminate or it overrides // indeterminate's dash if (newState === CheckboxState.Indeterminate) { this.checked = false; this.inputCheckbox.nativeElement.indeterminate = true; } if (oldState === newState) { return; } this.currentCheckboxState = newState; } /** * Creates instance of `CheckboxChange` used to propagate the change event. * @return {?} */ emitChangeEvent() { /** @type {?} */ const event = new CheckboxChange(); event.source = this; event.checked = this.checked; this.propagateChange(this.checked); this.change.emit(event); } /** * Updates the checkbox if it is in the indeterminate state. * @return {?} */ ngAfterViewInit() { if (this.indeterminate) { this.inputCheckbox.nativeElement.indeterminate = true; this.checked = false; } } } /** * Variable used for creating unique ids for checkbox components. */ Checkbox.checkboxCount = 0; Checkbox.decorators = [ { type: Component, args: [{ selector: 'suka-checkbox', template: ` <input #inputCheckbox class="checkbox" type="checkbox" [id]="id" [value]="value" [name]="name" [required]="required" [checked]="checked" [disabled]="disabled" [indeterminate]="indeterminate" [attr.aria-label]="ariaLabel" [attr.aria-labelledby]="ariaLabelledby" [attr.aria-checked]="(indeterminate ? 'mixed' : checked)" (change)="onChange($event)" (click)="onClick($event)"> <label [for]="id" class="checkbox-label" [ngClass]="{ 'skeleton' : skeleton }"> <span [ngClass]="{'visually-hidden' : hideLabel}"> <ng-content></ng-content> </span> </label> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Checkbox, multi: true } ], changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ Checkbox.ctorParameters = () => [ { type: ChangeDetectorRef } ]; Checkbox.propDecorators = { size: [{ type: Input }], nested: [{ type: Input }], inline: [{ type: Input }], disabled: [{ type: Input }], skeleton: [{ type: Input }], hideLabel: [{ type: Input }], name: [{ type: Input }], id: [{ type: Input }], required: [{ type: Input }], value: [{ type: Input }], ariaLabel: [{ type: Input, args: ['aria-label',] }], ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }], indeterminate: [{ type: Input }], checked: [{ type: Input }], checkboxWrapperClass: [{ type: HostBinding, args: ['class.checkbox-wrapper',] }], formItemClass: [{ type: HostBinding, args: ['class.form-item',] }], change: [{ type: Output }], indeterminateChange: [{ type: Output }], inputCheckbox: [{ type: ViewChild, args: ['inputCheckbox', { static: true },] }] }; if (false) { /** * Variable used for creating unique ids for checkbox components. * @type {?} */ Checkbox.checkboxCount; /** * Size of the checkbox. * @type {?} */ Checkbox.prototype.size; /** * Set to `true` for checkbox to be rendered with nested styles. * @type {?} */ Checkbox.prototype.nested; /** * Set to `true` for checkbox to be rendered without any classes on the host element. * @type {?} */ Checkbox.prototype.inline; /** * Set to `true` for a disabled checkbox. * @type {?} */ Checkbox.prototype.disabled; /** * Set to `true` for a loading checkbox. * @type {?} */ Checkbox.prototype.skeleton; /** * Set to `true` to hide the checkbox labels. * @type {?} */ Checkbox.prototype.hideLabel; /** * Sets the name attribute on the `input` element. * @type {?} */ Checkbox.prototype.name; /** * The unique id for the checkbox component. * @type {?} */ Checkbox.prototype.id; /** * Reflects the required attribute of the `input` element. * @type {?} */ Checkbox.prototype.required; /** * Sets the value attribute on the `input` element. * @type {?} */ Checkbox.prototype.value; /** * Used to set the `aria-label` attribute on the input element. * @type {?} */ Checkbox.prototype.ariaLabel; /** * Used to set the `aria-labelledby` attribute on the input element. * @type {?} */ Checkbox.prototype.ariaLabelledby; /** * Emits event notifying other classes when a change in state occurs on a checkbox after a * click. * @type {?} */ Checkbox.prototype.change; /** * Emits event notifying other classes when a change in state occurs specifically * on an indeterminate checkbox. * @type {?} */ Checkbox.prototype.indeterminateChange; /** * Set to `true` if the input checkbox is selected (or checked). * @type {?} */ Checkbox.prototype._checked; /** * Set to `true` if the input checkbox is in state indeterminate. * @type {?} */ Checkbox.prototype._indeterminate; /** @type {?} */ Checkbox.prototype.currentCheckboxState; /** * Maintains a reference to the view DOM element of the `Checkbox`. * @type {?} */ Checkbox.prototype.inputCheckbox; /** * Called when checkbox is blurred. Needed to properly implement `ControlValueAccessor`. * @type {?} */ Checkbox.prototype.onTouched; /** * Method set in `registerOnChange` to propagate changes back to the form. * @type {?} */ Checkbox.prototype.propagateChange; /** * @type {?} * @protected */ Checkbox.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7O0lBTXZFLE9BQUk7SUFDSixnQkFBYTtJQUNiLFVBQU87SUFDUCxZQUFTOzs7Ozs7Ozs7O0FBTVgsTUFBTSxPQUFPLGNBQWM7Q0FHMUI7OztJQUZDLGdDQUFpQjs7SUFDakIsaUNBQWlCOztBQTBDbkIsbURBQW1EO0FBQ25ELE1BQU0sT0FBTyxRQUFROzs7OztJQTBKbkIsWUFBc0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7Ozs7UUFqSmpELFNBQUksR0FBZ0IsSUFBSSxDQUFDOzs7O1FBVXpCLFdBQU0sR0FBRyxLQUFLLENBQUM7Ozs7UUFLZixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBS2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFLakIsY0FBUyxHQUFHLEtBQUssQ0FBQzs7OztRQVVsQixPQUFFLEdBQUcsWUFBWSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUM7Ozs7O1FBZ0I5QixjQUFTLEdBQUcsRUFBRSxDQUFDOzs7Ozs7UUFrRTFCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQzs7Ozs7UUFLNUMsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQzs7Ozs7UUFNNUQsYUFBUSxHQUFHLEtBQUssQ0FBQzs7Ozs7UUFLakIsbUJBQWMsR0FBRyxLQUFLLENBQUM7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RSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsUUFBUTt3QkFDckIsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7Z0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07YUFDaEQ7Ozs7WUFuRUMsaUJBQWlCOzs7bUJBOEVoQixLQUFLO3FCQUtMLEtBQUs7cUJBS0wsS0FBSzt1QkFLTCxLQUFLO3VCQUtMLEtBQUs7d0JBS0wsS0FBSzttQkFLTCxLQUFLO2lCQUtMLEtBQUs7dUJBS0wsS0FBSztvQkFLTCxLQUFLO3dCQU1MLEtBQUssU0FBQyxZQUFZOzZCQU1sQixLQUFLLFNBQUMsaUJBQWlCOzRCQVl2QixLQUFLO3NCQXVCTCxLQUFLO21DQWFMLFdBQVcsU0FBQyx3QkFBd0I7NEJBR3BDLFdBQVcsU0FBQyxpQkFBaUI7cUJBUzdCLE1BQU07a0NBS04sTUFBTTs0QkFrQk4sU0FBUyxTQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Ozs7Ozs7SUFqSjVDLHVCQUF5Qjs7Ozs7SUFLekIsd0JBQWtDOzs7OztJQUtsQywwQkFBeUI7Ozs7O0lBS3pCLDBCQUF3Qjs7Ozs7SUFLeEIsNEJBQTBCOzs7OztJQUsxQiw0QkFBMEI7Ozs7O0lBSzFCLDZCQUEyQjs7Ozs7SUFLM0Isd0JBQXNCOzs7OztJQUt0QixzQkFBbUQ7Ozs7O0lBS25ELDRCQUEyQjs7Ozs7SUFLM0IseUJBQXVCOzs7OztJQU12Qiw2QkFBb0M7Ozs7O0lBTXBDLGtDQUFpRDs7Ozs7O0lBNERqRCwwQkFBc0Q7Ozs7OztJQUt0RCx1Q0FBNEQ7Ozs7O0lBTTVELDRCQUFpQjs7Ozs7SUFLakIsa0NBQXVCOztJQUV2Qix3Q0FBeUQ7Ozs7O0lBS3pELGlDQUF3RTs7Ozs7SUEwRHhFLDZCQUFpQzs7Ozs7SUFnRGpDLG1DQUFrQzs7Ozs7SUFyR3RCLHFDQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgc2V0IG9mIHN0YXRlcyBmb3IgYSBjaGVja2JveCBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBlbnVtIENoZWNrYm94U3RhdGUge1xuICBJbml0LFxuICBJbmRldGVybWluYXRlLFxuICBDaGVja2VkLFxuICBVbmNoZWNrZWRcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGVtaXQgY2hhbmdlcyBwZXJmb3JtZWQgb24gY2hlY2tib3ggY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENoZWNrYm94Q2hhbmdlIHtcbiAgc291cmNlOiBDaGVja2JveDtcbiAgY2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VrYS1jaGVja2JveCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlucHV0XG4gICAgICAjaW5wdXRDaGVja2JveFxuICAgICAgY2xhc3M9XCJjaGVja2JveFwiXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgW2lkXT1cImlkXCJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICBbY2hlY2tlZF09XCJjaGVja2VkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbaW5kZXRlcm1pbmF0ZV09XCJpbmRldGVybWluYXRlXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRieVwiXG4gICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiKGluZGV0ZXJtaW5hdGUgPyAnbWl4ZWQnIDogY2hlY2tlZClcIlxuICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIj5cbiAgICA8bGFiZWxcbiAgICAgIFtmb3JdPVwiaWRcIlxuICAgICAgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdza2VsZXRvbicgOiBza2VsZXRvblxuICAgICAgfVwiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyd2aXN1YWxseS1oaWRkZW4nIDogaGlkZUxhYmVsfVwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogQ2hlY2tib3gsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDaGVja2JveCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIFZhcmlhYmxlIHVzZWQgZm9yIGNyZWF0aW5nIHVuaXF1ZSBpZHMgZm9yIGNoZWNrYm94IGNvbXBvbmVudHMuXG4gICAqL1xuICBzdGF0aWMgY2hlY2tib3hDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIFNpemUgb2YgdGhlIGNoZWNrYm94LlxuICAgKi9cbiAgQElucHV0KCkgc2l6ZTogJ3NtJyB8ICdtZCcgPSAnbWQnO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBjaGVja2JveCB0byBiZSByZW5kZXJlZCB3aXRoIG5lc3RlZCBzdHlsZXMuXG4gICAqL1xuICBASW5wdXQoKSBuZXN0ZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGNoZWNrYm94IHRvIGJlIHJlbmRlcmVkIHdpdGhvdXQgYW55IGNsYXNzZXMgb24gdGhlIGhvc3QgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlubGluZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGRpc2FibGVkIGNoZWNrYm94LlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIGNoZWNrYm94LlxuICAgKi9cbiAgQElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCB0byBoaWRlIHRoZSBjaGVja2JveCBsYWJlbHMuXG4gICAqL1xuICBASW5wdXQoKSBoaWRlTGFiZWwgPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgbmFtZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGNoZWNrYm94IGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlkID0gYGNoZWNrYm94LSR7Q2hlY2tib3guY2hlY2tib3hDb3VudH1gO1xuXG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsID0gJyc7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHRoZSBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGUgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXG4gIEBJbnB1dCgnYXJpYS1sYWJlbGxlZGJ5JykgYXJpYUxhYmVsbGVkYnk6IHN0cmluZztcblxuICAvKipcbiAgICogUmVmbGVjdHMgd2hldGhlciB0aGUgY2hlY2tib3ggc3RhdGUgaXMgaW5kZXRlcm1pbmF0ZS5cbiAgICovXG4gIGdldCBpbmRldGVybWluYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9pbmRldGVybWluYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY2hlY2tib3gncyBpbmRldGVybWluYXRlIHN0YXRlIHRvIG1hdGNoIHRoZSBwYXJhbWV0ZXIgYW5kIHRyYW5zaXRpb24gdGhlIHZpZXcgdG8gcmVmbGVjdCB0aGUgY2hhbmdlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGluZGV0ZXJtaW5hdGUoaW5kZXRlcm1pbmF0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9pbmRldGVybWluYXRlICE9PSBpbmRldGVybWluYXRlO1xuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBpbmRldGVybWluYXRlO1xuXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvbkNoZWNrYm94U3RhdGUoQ2hlY2tib3hTdGF0ZS5JbmRldGVybWluYXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2l0aW9uQ2hlY2tib3hTdGF0ZSh0aGlzLmNoZWNrZWQgPyBDaGVja2JveFN0YXRlLkNoZWNrZWQgOiBDaGVja2JveFN0YXRlLlVuY2hlY2tlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQodGhpcy5faW5kZXRlcm1pbmF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB2YWx1ZSBgdHJ1ZWAgaWYgc3RhdGUgaXMgc2VsZWN0ZWQgZm9yIHRoZSBjaGVja2JveC5cbiAgICovXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGVja2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0aW5nIHRoZSBzdGF0ZSBvZiBhIGNoZWNrYm94IHRvIG1hdGNoIHRoZSBzdGF0ZSBvZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbi5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5jaGVja2VkKSB7XG4gICAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQodGhpcy5faW5kZXRlcm1pbmF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuY2hlY2tib3gtd3JhcHBlcicpIGdldCBjaGVja2JveFdyYXBwZXJDbGFzcygpIHtcbiAgICByZXR1cm4gIXRoaXMuaW5saW5lO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9ybS1pdGVtJykgZ2V0IGZvcm1JdGVtQ2xhc3MoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlubGluZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCBub3RpZnlpbmcgb3RoZXIgY2xhc3NlcyB3aGVuIGEgY2hhbmdlIGluIHN0YXRlIG9jY3VycyBvbiBhIGNoZWNrYm94IGFmdGVyIGFcbiAgICogY2xpY2suXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hlY2tib3hDaGFuZ2U+KCk7XG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCBub3RpZnlpbmcgb3RoZXIgY2xhc3NlcyB3aGVuIGEgY2hhbmdlIGluIHN0YXRlIG9jY3VycyBzcGVjaWZpY2FsbHlcbiAgICogb24gYW4gaW5kZXRlcm1pbmF0ZSBjaGVja2JveC5cbiAgICovXG4gIEBPdXRwdXQoKSBpbmRldGVybWluYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGlmIHRoZSBpbnB1dCBjaGVja2JveCBpcyBzZWxlY3RlZCAob3IgY2hlY2tlZCkuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbiAgX2NoZWNrZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgaWYgdGhlIGlucHV0IGNoZWNrYm94IGlzIGluIHN0YXRlIGluZGV0ZXJtaW5hdGUuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbiAgX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcblxuICBjdXJyZW50Q2hlY2tib3hTdGF0ZTogQ2hlY2tib3hTdGF0ZSA9IENoZWNrYm94U3RhdGUuSW5pdDtcblxuICAvKipcbiAgICogTWFpbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3IERPTSBlbGVtZW50IG9mIHRoZSBgQ2hlY2tib3hgLlxuICAgKi9cbiAgQFZpZXdDaGlsZCgnaW5wdXRDaGVja2JveCcsIHsgc3RhdGljOiB0cnVlIH0pIGlucHV0Q2hlY2tib3g6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYENoZWNrYm94YC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICBDaGVja2JveC5jaGVja2JveENvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgY2hlY2tib3guXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gIH1cblxuICAvLyB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlIHNldCB0byB0aGUgY29tcG9uZW50XG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSAhIXZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBtZXRob2QgaW4gb3JkZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIHRvdWNoZWQuXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY2hlY2tib3ggaXMgdG91Y2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBvbiB0aGUgZXZlbnQgb2YgYSBjaGFuZ2Ugd2l0aGluIGBDaGVja2JveGAgdG8gYmxvY2sgcHJvcGFnYXRpb24uXG4gICAqL1xuICBvbkNoYW5nZShldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHRoZSBgQ2hlY2tib3hgIGFuZCBlbWl0cyBjaGFuZ2VzIHRvIG90aGVyIGNsYXNzZXMuXG4gICAqL1xuICBvbkNsaWNrKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uQ2hlY2tib3hTdGF0ZSh0aGlzLl9jaGVja2VkID8gQ2hlY2tib3hTdGF0ZS5DaGVja2VkIDogQ2hlY2tib3hTdGF0ZS5VbmNoZWNrZWQpO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBjaGVja2JveCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IGBDb250cm9sVmFsdWVBY2Nlc3NvcmAuXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyBjaGFuZ2VzIGJldHdlZW4gY2hlY2tib3ggc3RhdGVzLlxuICAgKi9cbiAgdHJhbnNpdGlvbkNoZWNrYm94U3RhdGUobmV3U3RhdGU6IENoZWNrYm94U3RhdGUpIHtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IHRoaXMuY3VycmVudENoZWNrYm94U3RhdGU7XG5cbiAgICAvLyBJbmRldGVybWluYXRlIGhhcyB0byBiZSBzZXQgYWx3YXlzIGlmIGl0J3MgdHJhbnNpdGlvbmVkIHRvXG4gICAgLy8gY2hlY2tlZCBoYXMgdG8gYmUgc2V0IGJlZm9yZSBpbmRldGVybWluYXRlIG9yIGl0IG92ZXJyaWRlc1xuICAgIC8vIGluZGV0ZXJtaW5hdGUncyBkYXNoXG4gICAgaWYgKG5ld1N0YXRlID09PSBDaGVja2JveFN0YXRlLkluZGV0ZXJtaW5hdGUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5pbnB1dENoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG9sZFN0YXRlID09PSBuZXdTdGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudENoZWNrYm94U3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGBDaGVja2JveENoYW5nZWAgdXNlZCB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBldmVudC5cbiAgICovXG4gIGVtaXRDaGFuZ2VFdmVudCgpIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBDaGVja2JveENoYW5nZSgpO1xuICAgIGV2ZW50LnNvdXJjZSA9IHRoaXM7XG4gICAgZXZlbnQuY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDtcblxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuY2hlY2tlZCk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2hlY2tib3ggaWYgaXQgaXMgaW4gdGhlIGluZGV0ZXJtaW5hdGUgc3RhdGUuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuaW5kZXRlcm1pbmF0ZSkge1xuICAgICAgdGhpcy5pbnB1dENoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHNldCBpbiBgcmVnaXN0ZXJPbkNoYW5nZWAgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcbn1cbiJdfQ==