@blox/material
Version:
Material Components for Angular
259 lines • 29.5 kB
JavaScript
import { Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, Output, Renderer2, Self } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { MDCIconButtonToggleFoundation } from '@material/icon-button';
import { asBoolean } from '../../utils/value.utils';
import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple';
import { AbstractMdcIcon } from './abstract.mdc.icon';
import { MdcEventRegistry } from '../../utils/mdc.event.registry';
/**
* Directive for an icon button. Icon buttons can be used with a font icon library such as
* <a href="https://material.io/tools/icons" target="_blank">Google Material Icons</a>, SVG
* elements or images. They provide material styling and a ripple to the icon. Use it on anchor and
* button tags. For toggling icon buttons, see `MdcIconToggleDirective`.
*/
export class MdcIconButtonDirective extends AbstractMdcIcon {
constructor(_elm, renderer, registry, doc) {
super(_elm, renderer, registry, doc);
/** @internal */
this._cls = true;
}
ngAfterContentInit() {
this.initRipple(true);
}
ngOnDestroy() {
this.destroyRipple();
}
}
MdcIconButtonDirective.decorators = [
{ type: Directive, args: [{
selector: 'button[mdcIconButton],a[mdcIconButton]',
providers: [
{ provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcIconButtonDirective) },
{ provide: AbstractMdcIcon, useExisting: forwardRef(() => MdcIconButtonDirective) }
]
},] }
];
MdcIconButtonDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 },
{ type: MdcEventRegistry },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
MdcIconButtonDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-icon-button',] }]
};
/**
* Directive for the icon to display on one of the toggle states of an `mdcIconToggle`. See
* `MdcIconToggleDirective` for more information.
*/
export class MdcIconDirective {
constructor() {
/** @internal */
this._cls = true;
/** @internal */
this._on = false;
}
/**
* Set this input to false to remove the ripple effect from the surface.
*/
get mdcIcon() {
return this._on ? 'on' : '';
}
set mdcIcon(value) {
this._on = value === 'on';
}
}
MdcIconDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcIcon]'
},] }
];
MdcIconDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-icon-button__icon',] }],
_on: [{ type: HostBinding, args: ['class.mdc-icon-button__icon--on',] }],
mdcIcon: [{ type: Input }]
};
/**
* Directive for creating a Material Design icon toggle button: a button that toggles state, and
* switches the icon based on the value of the toggle.
*
* When the applied icon font uses CSS pseudo elements, add a child element for the actual icon,
* and give that element the <code>mdcIconButtonIcon</code> directive. The icon button will
* then update the child element with the correct icon if it is toggled.
*/
export class MdcIconToggleDirective extends AbstractMdcIcon {
constructor(_elm, rndr, registry, doc) {
super(_elm, rndr, registry, doc);
/** @internal */
this._cls = true;
/**
* The aria-label to assign to the icon toggle. You can override the value for the
* on respectively off state by assigning to property `labelOn` or `labelOff`.
*/
this.label = null;
/**
* The aria-label to assign to the icon toggle when it is on. If this input has no value,
* the aria-label will default to the value of the `label` input.
*/
this.labelOn = null;
/**
* The aria-label to assign to the icon toggle when it is off. If this input has no value,
* the aria-label will default to the value of the `label` input.
*/
this.labelOff = null;
/**
* Event emitted when the state of the icon toggle changes (for example when a user clicks
* the icon).
*/
this.onChange = new EventEmitter();
this._onChange = () => { };
this._onTouched = () => { };
this._on = false;
this._disabled = false;
this.toggleAdapter = {
addClass: (className) => this._renderer.addClass(this._elm.nativeElement, className),
removeClass: (className) => this._renderer.removeClass(this._elm.nativeElement, className),
// TODO return mdc-icon-button__icon--on for on...
hasClass: (className) => this._elm.nativeElement.classList.contains(className),
setAttr: (name, value) => this._renderer.setAttribute(this._elm.nativeElement, name, value),
notifyChange: (evtData) => {
this._on = evtData.isOn;
this._onChange(this._on);
this.onChange.emit(this._on);
}
};
this.toggleFoundation = null;
}
ngAfterContentInit() {
this.initRipple(true);
this.toggleFoundation = new MDCIconButtonToggleFoundation(this.toggleAdapter);
this.toggleFoundation.init();
}
ngOnDestroy() {
var _a;
this.destroyRipple();
(_a = this.toggleFoundation) === null || _a === void 0 ? void 0 : _a.destroy();
this.toggleFoundation = null;
}
/** @internal */
writeValue(obj) {
this.on = !!obj;
}
/** @internal */
registerOnChange(onChange) {
this._onChange = onChange;
}
/** @internal */
registerOnTouched(onTouched) {
this._onTouched = onTouched;
}
/** @internal */
setDisabledState(disabled) {
this._disabled = disabled;
}
/**
* The current state of the icon (true for on/pressed, false for off/unpressed).
*/
get on() {
return this.toggleFoundation ? this.toggleFoundation.isOn() : this._on;
}
set on(value) {
const old = this.toggleFoundation ? this.toggleFoundation.isOn() : this._on;
this._on = asBoolean(value);
if (this.toggleFoundation)
this.toggleFoundation.toggle(this._on);
if (this._on !== old)
this.onChange.emit(this._on);
}
/** @internal */
get _label() {
return this._on ? (this.labelOn || this.label) : (this.labelOff || this.label);
}
/** @internal */
_onClick() {
var _a;
(_a = this.toggleFoundation) === null || _a === void 0 ? void 0 : _a.handleClick();
}
/** @internal */
_onBlur() {
this._onTouched();
}
/**
* To disable the icon, set this input to true.
*/
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = asBoolean(value);
}
}
MdcIconToggleDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcIconToggle]',
providers: [
{ provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcIconToggleDirective) },
{ provide: AbstractMdcIcon, useExisting: forwardRef(() => MdcIconToggleDirective) }
]
},] }
];
MdcIconToggleDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Renderer2 },
{ type: MdcEventRegistry },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
MdcIconToggleDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-icon-button',] }],
label: [{ type: Input }],
labelOn: [{ type: Input }],
labelOff: [{ type: Input }],
onChange: [{ type: Output }],
on: [{ type: Input }],
_label: [{ type: HostBinding, args: ['attr.aria-label',] }],
_onClick: [{ type: HostListener, args: ['click',] }],
_onBlur: [{ type: HostListener, args: ['blur',] }],
disabled: [{ type: Input }, { type: HostBinding }]
};
/**
* Directive for adding Angular Forms (<code>ControlValueAccessor</code>) behavior to an
* <code>MdcIconToggleDirective</code>. Allows the use of the Angular Forms API with
* icon toggle buttons, e.g. binding to <code>[(ngModel)]</code>, form validation, etc.
*/
export class MdcFormsIconButtonDirective {
constructor(mdcIconButton) {
this.mdcIconButton = mdcIconButton;
}
/** @docs-private */
writeValue(obj) {
this.mdcIconButton.writeValue(obj);
}
/** @docs-private */
registerOnChange(onChange) {
this.mdcIconButton.registerOnChange(onChange);
}
/** @docs-private */
registerOnTouched(onTouched) {
this.mdcIconButton.registerOnTouched(onTouched);
}
/** @docs-private */
setDisabledState(disabled) {
this.mdcIconButton.setDisabledState(disabled);
}
}
MdcFormsIconButtonDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcIconToggle][formControlName],[mdcIconToggle][formControl],[mdcIconToggle][ngModel]',
providers: [
{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdcFormsIconButtonDirective), multi: true }
]
},] }
];
MdcFormsIconButtonDirective.ctorParameters = () => [
{ type: MdcIconToggleDirective, decorators: [{ type: Self }] }
];
export const ICON_BUTTON_DIRECTIVES = [
MdcIconDirective, MdcIconButtonDirective, MdcIconToggleDirective, MdcFormsIconButtonDirective
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLmljb24tYnV0dG9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ljb24tYnV0dG9uL21kYy5pY29uLWJ1dHRvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUNuRixZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSw2QkFBNkIsRUFBOEQsTUFBTSx1QkFBdUIsQ0FBQztBQUNsSSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFJdkQsWUFBWSxJQUFnQixFQUFFLFFBQW1CLEVBQUUsUUFBMEIsRUFBb0IsR0FBUTtRQUNyRyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBZSxDQUFDLENBQUM7UUFKckQsZ0JBQWdCO1FBQytCLFNBQUksR0FBRyxJQUFJLENBQUM7SUFJM0QsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVE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LGlCQUFpQixDQUFDLFNBQW9CO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixnQkFBZ0IsQ0FBQyxRQUFpQjtRQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7OztZQTVCSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLHdGQUF3RjtnQkFDbEcsU0FBUyxFQUFFO29CQUNQLEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO2lCQUN4RzthQUNKOzs7WUFFOEMsc0JBQXNCLHVCQUFwRCxJQUFJOztBQXdCckIsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUc7SUFDbEMsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsMkJBQTJCO0NBQ2hHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUmVuZGVyZXIyLCBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNRENJY29uQnV0dG9uVG9nZ2xlRm91bmRhdGlvbiwgTURDSWNvbkJ1dHRvblRvZ2dsZUFkYXB0ZXIsIE1EQ0ljb25CdXR0b25Ub2dnbGVFdmVudERldGFpbCB9IGZyb20gJ0BtYXRlcmlhbC9pY29uLWJ1dHRvbic7XG5pbXBvcnQgeyBhc0Jvb2xlYW4gfSBmcm9tICcuLi8uLi91dGlscy92YWx1ZS51dGlscyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1kY1JpcHBsZSB9IGZyb20gJy4uL3JpcHBsZS9hYnN0cmFjdC5tZGMucmlwcGxlJztcbmltcG9ydCB7IEFic3RyYWN0TWRjSWNvbiB9IGZyb20gJy4vYWJzdHJhY3QubWRjLmljb24nO1xuaW1wb3J0IHsgTWRjRXZlbnRSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL21kYy5ldmVudC5yZWdpc3RyeSc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBhbiBpY29uIGJ1dHRvbi4gSWNvbiBidXR0b25zIGNhbiBiZSB1c2VkIHdpdGggYSBmb250IGljb24gbGlicmFyeSBzdWNoIGFzXG4gKiA8YSBocmVmPVwiaHR0cHM6Ly9tYXRlcmlhbC5pby90b29scy9pY29uc1wiIHRhcmdldD1cIl9ibGFua1wiPkdvb2dsZSBNYXRlcmlhbCBJY29uczwvYT4sIFNWR1xuICogZWxlbWVudHMgb3IgaW1hZ2VzLiBUaGV5IHByb3ZpZGUgbWF0ZXJpYWwgc3R5bGluZyBhbmQgYSByaXBwbGUgdG8gdGhlIGljb24uIFVzZSBpdCBvbiBhbmNob3IgYW5kXG4gKiBidXR0b24gdGFncy4gRm9yIHRvZ2dsaW5nIGljb24gYnV0dG9ucywgc2VlIGBNZGNJY29uVG9nZ2xlRGlyZWN0aXZlYC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdidXR0b25bbWRjSWNvbkJ1dHRvbl0sYVttZGNJY29uQnV0dG9uXScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtwcm92aWRlOiBBYnN0cmFjdE1kY1JpcHBsZSwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjSWNvbkJ1dHRvbkRpcmVjdGl2ZSkgfSxcbiAgICAgICAge3Byb3ZpZGU6IEFic3RyYWN0TWRjSWNvbiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjSWNvbkJ1dHRvbkRpcmVjdGl2ZSkgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTWRjSWNvbkJ1dHRvbkRpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjSWNvbiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLWljb24tYnV0dG9uJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihfZWxtOiBFbGVtZW50UmVmLCByZW5kZXJlcjogUmVuZGVyZXIyLCByZWdpc3RyeTogTWRjRXZlbnRSZWdpc3RyeSwgQEluamVjdChET0NVTUVOVCkgZG9jOiBhbnkpIHtcbiAgICAgICAgc3VwZXIoX2VsbSwgcmVuZGVyZXIsIHJlZ2lzdHJ5LCBkb2MgYXMgRG9jdW1lbnQpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0UmlwcGxlKHRydWUpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lSaXBwbGUoKTtcbiAgICB9XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciB0aGUgaWNvbiB0byBkaXNwbGF5IG9uIG9uZSBvZiB0aGUgdG9nZ2xlIHN0YXRlcyBvZiBhbiBgbWRjSWNvblRvZ2dsZWAuIFNlZVxuICogYE1kY0ljb25Ub2dnbGVEaXJlY3RpdmVgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNJY29uXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjSWNvbkRpcmVjdGl2ZSAge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1pY29uLWJ1dHRvbl9faWNvbicpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1pY29uLWJ1dHRvbl9faWNvbi0tb24nKSBfb24gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGlucHV0IHRvIGZhbHNlIHRvIHJlbW92ZSB0aGUgcmlwcGxlIGVmZmVjdCBmcm9tIHRoZSBzdXJmYWNlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBtZGNJY29uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb24gPyAnb24nIDogJyc7XG4gICAgfVxuXG4gICAgc2V0IG1kY0ljb24odmFsdWU6ICdvbicgfCAnJykge1xuICAgICAgICB0aGlzLl9vbiA9IHZhbHVlID09PSAnb24nO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGNyZWF0aW5nIGEgTWF0ZXJpYWwgRGVzaWduIGljb24gdG9nZ2xlIGJ1dHRvbjogYSBidXR0b24gdGhhdCB0b2dnbGVzIHN0YXRlLCBhbmRcbiAqIHN3aXRjaGVzIHRoZSBpY29uIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdG9nZ2xlLlxuICogXG4gKiBXaGVuIHRoZSBhcHBsaWVkIGljb24gZm9udCB1c2VzIENTUyBwc2V1ZG8gZWxlbWVudHMsIGFkZCBhIGNoaWxkIGVsZW1lbnQgZm9yIHRoZSBhY3R1YWwgaWNvbixcbiAqIGFuZCBnaXZlIHRoYXQgZWxlbWVudCB0aGUgPGNvZGU+bWRjSWNvbkJ1dHRvbkljb248L2NvZGU+IGRpcmVjdGl2ZS4gVGhlIGljb24gYnV0dG9uIHdpbGxcbiAqIHRoZW4gdXBkYXRlIHRoZSBjaGlsZCBlbGVtZW50IHdpdGggdGhlIGNvcnJlY3QgaWNvbiBpZiBpdCBpcyB0b2dnbGVkLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNJY29uVG9nZ2xlXScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtwcm92aWRlOiBBYnN0cmFjdE1kY1JpcHBsZSwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjSWNvblRvZ2dsZURpcmVjdGl2ZSkgfSxcbiAgICAgICAge3Byb3ZpZGU6IEFic3RyYWN0TWRjSWNvbiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjSWNvblRvZ2dsZURpcmVjdGl2ZSkgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTWRjSWNvblRvZ2dsZURpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjSWNvbiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1pY29uLWJ1dHRvbicpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmlhLWxhYmVsIHRvIGFzc2lnbiB0byB0aGUgaWNvbiB0b2dnbGUuIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIHZhbHVlIGZvciB0aGVcbiAgICAgKiBvbiByZXNwZWN0aXZlbHkgb2ZmIHN0YXRlIGJ5IGFzc2lnbmluZyB0byBwcm9wZXJ0eSBgbGFiZWxPbmAgb3IgYGxhYmVsT2ZmYC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBsYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFyaWEtbGFiZWwgdG8gYXNzaWduIHRvIHRoZSBpY29uIHRvZ2dsZSB3aGVuIGl0IGlzIG9uLiBJZiB0aGlzIGlucHV0IGhhcyBubyB2YWx1ZSxcbiAgICAgKiB0aGUgYXJpYS1sYWJlbCB3aWxsIGRlZmF1bHQgdG8gdGhlIHZhbHVlIG9mIHRoZSBgbGFiZWxgIGlucHV0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGxhYmVsT246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmlhLWxhYmVsIHRvIGFzc2lnbiB0byB0aGUgaWNvbiB0b2dnbGUgd2hlbiBpdCBpcyBvZmYuIElmIHRoaXMgaW5wdXQgaGFzIG5vIHZhbHVlLFxuICAgICAqIHRoZSBhcmlhLWxhYmVsIHdpbGwgZGVmYXVsdCB0byB0aGUgdmFsdWUgb2YgdGhlIGBsYWJlbGAgaW5wdXQuXG4gICAgICovXG4gICAgQElucHV0KCkgbGFiZWxPZmY6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc3RhdGUgb2YgdGhlIGljb24gdG9nZ2xlIGNoYW5nZXMgKGZvciBleGFtcGxlIHdoZW4gYSB1c2VyIGNsaWNrc1xuICAgICAqIHRoZSBpY29uKS4gXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB0b2dnbGVBZGFwdGVyOiBNRENJY29uQnV0dG9uVG9nZ2xlQWRhcHRlciA9IHtcbiAgICAgICAgYWRkQ2xhc3M6IChjbGFzc05hbWU6IHN0cmluZykgPT4gdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWxtLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSksXG4gICAgICAgIHJlbW92ZUNsYXNzOiAoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LCBjbGFzc05hbWUpLFxuICAgICAgICAvLyBUT0RPIHJldHVybiBtZGMtaWNvbi1idXR0b25fX2ljb24tLW9uIGZvciBvbi4uLlxuICAgICAgICBoYXNDbGFzczogKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB0aGlzLl9lbG0ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSxcbiAgICAgICAgc2V0QXR0cjogKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdGhpcy5fcmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LCBuYW1lLCB2YWx1ZSksXG4gICAgICAgIG5vdGlmeUNoYW5nZTogKGV2dERhdGE6IE1EQ0ljb25CdXR0b25Ub2dnbGVFdmVudERldGFpbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb24gPSBldnREYXRhLmlzT247XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl9vbik7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBwcml2YXRlIHRvZ2dsZUZvdW5kYXRpb246IE1EQ0ljb25CdXR0b25Ub2dnbGVGb3VuZGF0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihfZWxtOiBFbGVtZW50UmVmLCBybmRyOiBSZW5kZXJlcjIsIHJlZ2lzdHJ5OiBNZGNFdmVudFJlZ2lzdHJ5LCBASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgICAgICBzdXBlcihfZWxtLCBybmRyLCByZWdpc3RyeSwgZG9jIGFzIERvY3VtZW50KTtcbiAgICB9XG4gIFxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0UmlwcGxlKHRydWUpO1xuICAgICAgICB0aGlzLnRvZ2dsZUZvdW5kYXRpb24gPSBuZXcgTURDSWNvbkJ1dHRvblRvZ2dsZUZvdW5kYXRpb24odGhpcy50b2dnbGVBZGFwdGVyKTtcbiAgICAgICAgdGhpcy50b2dnbGVGb3VuZGF0aW9uLmluaXQoKTtcbiAgICB9XG4gIFxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lSaXBwbGUoKTtcbiAgICAgICAgdGhpcy50b2dnbGVGb3VuZGF0aW9uPy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMudG9nZ2xlRm91bmRhdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vbiA9ICEhb2JqO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IGFueSkge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaWNvbiAodHJ1ZSBmb3Igb24vcHJlc3NlZCwgZmFsc2UgZm9yIG9mZi91bnByZXNzZWQpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlRm91bmRhdGlvbiA/IHRoaXMudG9nZ2xlRm91bmRhdGlvbi5pc09uKCkgOiB0aGlzLl9vbjtcbiAgICB9XG5cbiAgICBzZXQgb24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgb2xkID0gdGhpcy50b2dnbGVGb3VuZGF0aW9uID8gdGhpcy50b2dnbGVGb3VuZGF0aW9uLmlzT24oKSA6IHRoaXMuX29uO1xuICAgICAgICB0aGlzLl9vbiA9IGFzQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZUZvdW5kYXRpb24pXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUZvdW5kYXRpb24udG9nZ2xlKHRoaXMuX29uKTtcbiAgICAgICAgaWYgKHRoaXMuX29uICE9PSBvbGQpXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fb24pO1xuICAgIH1cblxuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9vbjogYm9vbGVhbiB8ICcnO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxhYmVsJykgZ2V0IF9sYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uID8gKHRoaXMubGFiZWxPbiB8fCB0aGlzLmxhYmVsKSA6ICh0aGlzLmxhYmVsT2ZmIHx8IHRoaXMubGFiZWwpO1xuICAgIH1cbiAgICBcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKSBfb25DbGljaygpIHtcbiAgICAgICAgdGhpcy50b2dnbGVGb3VuZGF0aW9uPy5oYW5kbGVDbGljaygpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJykgX29uQmx1cigpIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG8gZGlzYWJsZSB0aGUgaWNvbiwgc2V0IHRoaXMgaW5wdXQgdG8gdHJ1ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygpXG4gICAgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gYXNCb29sZWFuKHZhbHVlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IGJvb2xlYW4gfCAnJztcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGFkZGluZyBBbmd1bGFyIEZvcm1zICg8Y29kZT5Db250cm9sVmFsdWVBY2Nlc3NvcjwvY29kZT4pIGJlaGF2aW9yIHRvIGFuXG4gKiA8Y29kZT5NZGNJY29uVG9nZ2xlRGlyZWN0aXZlPC9jb2RlPi4gQWxsb3dzIHRoZSB1c2Ugb2YgdGhlIEFuZ3VsYXIgRm9ybXMgQVBJIHdpdGhcbiAqIGljb24gdG9nZ2xlIGJ1dHRvbnMsIGUuZy4gYmluZGluZyB0byA8Y29kZT5bKG5nTW9kZWwpXTwvY29kZT4sIGZvcm0gdmFsaWRhdGlvbiwgZXRjLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNJY29uVG9nZ2xlXVtmb3JtQ29udHJvbE5hbWVdLFttZGNJY29uVG9nZ2xlXVtmb3JtQ29udHJvbF0sW21kY0ljb25Ub2dnbGVdW25nTW9kZWxdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNZGNGb3Jtc0ljb25CdXR0b25EaXJlY3RpdmUpLCBtdWx0aTogdHJ1ZX1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE1kY0Zvcm1zSWNvbkJ1dHRvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBjb25zdHJ1Y3RvcihAU2VsZigpIHByaXZhdGUgbWRjSWNvbkJ1dHRvbjogTWRjSWNvblRvZ2dsZURpcmVjdGl2ZSkge1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSkge1xuICAgICAgICB0aGlzLm1kY0ljb25CdXR0b24ud3JpdGVWYWx1ZShvYmopO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5tZGNJY29uQnV0dG9uLnJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2UpO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiBhbnkpIHtcbiAgICAgICAgdGhpcy5tZGNJY29uQnV0dG9uLnJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZCk7XG4gICAgfVxuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubWRjSWNvbkJ1dHRvbi5zZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBJQ09OX0JVVFRPTl9ESVJFQ1RJVkVTID0gW1xuICAgIE1kY0ljb25EaXJlY3RpdmUsIE1kY0ljb25CdXR0b25EaXJlY3RpdmUsIE1kY0ljb25Ub2dnbGVEaXJlY3RpdmUsIE1kY0Zvcm1zSWNvbkJ1dHRvbkRpcmVjdGl2ZVxuXTtcbiJdfQ==