@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
450 lines • 41.2 kB
JavaScript
/**
* Copyright (c) 2025 Visa, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { AppReadyService } from '../_utilities/services/app-stable-check.service';
import { UUIDService } from '../_utilities/services/uuid.service';
import { SPACE_KEY } from '../nova-lib.constants';
import { BaseInteractiveDirective } from '../_utilities/angular-specific-directives/base-interactive.directive';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/uuid.service";
import * as i2 from "../_utilities/services/app-stable-check.service";
export class InputDirective extends BaseInteractiveDirective {
/**
* Provides custom class(es) for custom styling.
* @default .v-input
*/
get class() {
return [this._class, 'v-input', this.otp ? 'v-input-otp' : '', this.noResize ? 'v-input-resize-none' : ''].join(' ');
}
set class(value) {
this._class = value;
}
get hostClass() {
return this.class;
}
get hostId() {
return this.id;
}
/**
* Sets custom role.
* @default null
* @default 'combobox' when input is used within combobox and no custom role is provided.
* @builtin true
*/
get role() {
return this._role;
}
set role(value) {
this._role = value;
}
get hostRole() {
return this.role;
}
/**
* Sets input as readonly when true.
* @default false
*/
get readonly() {
return this._readonly;
}
set readonly(value) {
this._readonly = coerceBooleanProperty(value);
this.informState();
}
get hostReadonly() {
return this.readonly ? 'readonly' : null;
}
/**
* Sets component as disabled when true.
* @default false
*/
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = coerceBooleanProperty(value);
this.informState();
}
get hostDisabled() {
return this.disabled ? 'disabled' : null;
}
/** Fires when a formControl's disabled state updates */
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* Marks component as invalid when true.
* @default false
*/
get invalid() {
return this._invalid;
}
set invalid(value) {
this._invalid = coerceBooleanProperty(value);
this.informState();
}
get ariaInvalid() {
return this.invalid;
}
/**
* Marks component as required when true.
* @default false
*/
get required() {
return this._required;
}
set required(value) {
this._required = coerceBooleanProperty(value);
this.informState();
}
/**
* Sets input to one-time-passcode (OTP) variant when true.
* @default false
*/
get otp() {
return this._otp;
}
set otp(value) {
this._otp = coerceBooleanProperty(value);
}
/**
* Removes resize from textarea when true.
* @default false
*/
get noResize() {
return this._noResize;
}
set noResize(value) {
this._noResize = coerceBooleanProperty(value);
}
/** Below needed for combobox */
/**
* Aria attribute relaying whether input is expanded.
* @default null
* @builtin true
*/
get ariaExpanded() {
return this._ariaExpanded;
}
set ariaExpanded(value) {
this._ariaExpanded = coerceBooleanProperty(value);
}
get hostAriaExpanded() {
if (this.ariaExpanded !== null) {
return this.ariaExpanded.toString();
}
}
/**
* Aria attribute relaying autocomplete type.
* @default null
* @default 'list' when input is used within combobox and no custom value is provided.
* @builtin true
*/
get ariaAutocomplete() {
return this._ariaAutocomplete;
}
set ariaAutocomplete(value) {
this._ariaAutocomplete = value;
}
get hostAriaAutocomplete() {
if (this.ariaAutocomplete) {
return this.ariaAutocomplete;
}
else if (this._inCombobox) {
return 'list';
}
}
/**
* Sets input aria-haspopup attribute.
* @default null
* @default 'listbox' when input is used within combobox and no custom value is given.
* @builtin true
*/
get ariaHaspopup() {
return this._ariaHaspopup;
}
set ariaHaspopup(value) {
this._ariaHaspopup = coerceBooleanProperty(value);
}
get hostAriaHaspopup() {
if (this.ariaHaspopup) {
return this.ariaHaspopup.toString();
}
else if (this._inCombobox) {
return 'listbox';
}
}
/**
* Sets input aria-owns attribute.
* @default null
* @default '<listbox-container-id>' when input is used within combobox and no custom value is given.
* @builtin true
*/
get ariaOwns() {
return this._ariaOwns;
}
set ariaOwns(value) {
this._ariaOwns = value;
}
get hostAriaOwns() {
if (this.ariaOwns) {
return this.ariaOwns;
}
}
/**
* Aria attribute relaying what element the input controls.
* @default null
* @default '<listbox-id>' when input is used within combobox and combobox menu is open.
* @builtin true
*/
get ariaControls() {
return this._ariaControls;
}
set ariaControls(value) {
this._ariaControls = value;
}
get hostAriaControls() {
if (this.ariaControls) {
return this.ariaControls;
}
}
/**
* Aria attribute relaying what active element the input refers to.
* @default null
* @default '<listbox-item-id>' when input is used within combobox and an option is highlighted or active.
* @builtin true
*/
get ariaActiveDescendant() {
return this._ariaActiveDescendant;
}
set ariaActiveDescendant(value) {
this._ariaActiveDescendant = value;
}
get hostAriaActiveDescendant() {
if (this.ariaActiveDescendant) {
return this.ariaActiveDescendant;
}
}
/**
* Value of input.
*/
get value() {
return this._value;
}
set value(value) {
// if (!value) return;
this._value = value;
if (this.appReadyService.isBrowserAndDomAvailable()) {
if (this.el.nativeElement.value !== value) {
this.el.nativeElement.value = value;
}
}
this.onChange(value);
}
// keep val for backwards compatibility
get val() {
return this._value;
}
set val(value) {
// if (!value) return;
this._value = value;
if (this.appReadyService.isBrowserAndDomAvailable()) {
this.el.nativeElement.value = value;
}
this.onChange(value);
}
handleInput(event) {
if (this.appReadyService.isBrowserAndDomAvailable()) {
this.writeValue(this.el.nativeElement.value);
this.inputEvent.emit(this.el.nativeElement.value);
}
}
handleFocus(event) {
this.onTouched(event);
this.focused.emit();
}
handleBlur(event) { }
handleReadonlySpace(event) {
// this resolves a bug where date/time/color menus were still opening when readonly and pressing space
if (this.readonly && event.key === SPACE_KEY) {
event.preventDefault();
}
}
constructor(el, uuidService, appReadyService) {
super(el);
this.uuidService = uuidService;
this.appReadyService = appReadyService;
this._inCombobox = false;
this._class = '';
/**
* Sets custom id.
* @default uuidService.getUUID('v-input-')
* @builtin true
*/
this.id = this.uuidService.getUUID('v-input-');
this._readonly = false;
this._disabled = false;
this._invalid = false;
this._required = false;
this._otp = false;
this._noResize = false;
this._ariaExpanded = null;
/**
* Emits value when the input event is triggered or backspace key is pressed.
*/
this.inputEvent = new EventEmitter();
/**
* Emits readonly, disabled, invalid, and required state of input when any of these states change.
*/
this.communicateState = new EventEmitter();
this.onChange = (_) => { };
this.onTouched = (_) => { };
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
writeValue(value) {
this.value = value;
this.onChange(this.value);
}
informState() {
this.communicateState.emit({
readonly: this.readonly,
disabled: this.disabled,
invalid: this.invalid,
required: this.required
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputDirective, deps: [{ token: i0.ElementRef }, { token: i1.UUIDService }, { token: i2.AppReadyService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: InputDirective, isStandalone: true, selector: "[v-input]", inputs: { class: "class", id: "id", role: "role", readonly: "readonly", disabled: "disabled", invalid: "invalid", required: "required", otp: "otp", noResize: "noResize", ariaExpanded: ["aria-expanded", "ariaExpanded"], ariaAutocomplete: ["aria-autocomplete", "ariaAutocomplete"], ariaHaspopup: ["aria-haspopup", "ariaHaspopup"], ariaOwns: ["aria-owns", "ariaOwns"], ariaControls: ["aria-controls", "ariaControls"], ariaActiveDescendant: ["aria-activedescendant", "ariaActiveDescendant"], value: "value" }, outputs: { inputEvent: "inputEvent", communicateState: "communicateState" }, host: { listeners: { "input": "handleInput($event)", "focus": "handleFocus($event)", "blur": "handleBlur($event)", "keydown": "handleReadonlySpace($event)" }, properties: { "class": "this.hostClass", "attr.id": "this.hostId", "attr.role": "this.hostRole", "readonly": "this.hostReadonly", "disabled": "this.hostDisabled", "attr.aria-invalid": "this.ariaInvalid", "attr.aria-expanded": "this.hostAriaExpanded", "attr.aria-autocomplete": "this.hostAriaAutocomplete", "attr.aria-haspopup": "this.hostAriaHaspopup", "attr.aria-owns": "this.hostAriaOwns", "attr.aria-controls": "this.hostAriaControls", "attr.aria-activedescendant": "this.hostAriaActiveDescendant" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => InputDirective),
multi: true
}
], usesInheritance: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: '[v-input]',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => InputDirective),
multi: true
}
]
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.UUIDService }, { type: i2.AppReadyService }], propDecorators: { class: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ['class']
}], id: [{
type: Input
}], hostId: [{
type: HostBinding,
args: ['attr.id']
}], role: [{
type: Input
}], hostRole: [{
type: HostBinding,
args: ['attr.role']
}], readonly: [{
type: Input
}], hostReadonly: [{
type: HostBinding,
args: ['readonly']
}], disabled: [{
type: Input
}], hostDisabled: [{
type: HostBinding,
args: ['disabled']
}], invalid: [{
type: Input
}], ariaInvalid: [{
type: HostBinding,
args: ['attr.aria-invalid']
}], required: [{
type: Input
}], otp: [{
type: Input
}], noResize: [{
type: Input
}], ariaExpanded: [{
type: Input,
args: ['aria-expanded']
}], hostAriaExpanded: [{
type: HostBinding,
args: ['attr.aria-expanded']
}], ariaAutocomplete: [{
type: Input,
args: ['aria-autocomplete']
}], hostAriaAutocomplete: [{
type: HostBinding,
args: ['attr.aria-autocomplete']
}], ariaHaspopup: [{
type: Input,
args: ['aria-haspopup']
}], hostAriaHaspopup: [{
type: HostBinding,
args: ['attr.aria-haspopup']
}], ariaOwns: [{
type: Input,
args: ['aria-owns']
}], hostAriaOwns: [{
type: HostBinding,
args: ['attr.aria-owns']
}], ariaControls: [{
type: Input,
args: ['aria-controls']
}], hostAriaControls: [{
type: HostBinding,
args: ['attr.aria-controls']
}], ariaActiveDescendant: [{
type: Input,
args: ['aria-activedescendant']
}], hostAriaActiveDescendant: [{
type: HostBinding,
args: ['attr.aria-activedescendant']
}], value: [{
type: Input
}], inputEvent: [{
type: Output
}], communicateState: [{
type: Output
}], handleInput: [{
type: HostListener,
args: ['input', ['$event']]
}], handleFocus: [{
type: HostListener,
args: ['focus', ['$event']]
}], handleBlur: [{
type: HostListener,
args: ['blur', ['$event']]
}], handleReadonlySpace: [{
type: HostListener,
args: ['keydown', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL2lucHV0L2lucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNFQUFzRSxDQUFDOzs7O0FBYWhILE1BQU0sT0FBTyxjQUFlLFNBQVEsd0JBQXdCO0lBRTFEOzs7T0FHRztJQUNILElBQ0ksS0FBSztRQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUM3RyxHQUFHLENBQ0osQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENB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TUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUloQyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDI1IFZpc2EsIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXBwUmVhZHlTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy9hcHAtc3RhYmxlLWNoZWNrLnNlcnZpY2UnO1xuaW1wb3J0IHsgVVVJRFNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL3V1aWQuc2VydmljZSc7XG5pbXBvcnQgeyBTUEFDRV9LRVkgfSBmcm9tICcuLi9ub3ZhLWxpYi5jb25zdGFudHMnO1xuaW1wb3J0IHsgQmFzZUludGVyYWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9hbmd1bGFyLXNwZWNpZmljLWRpcmVjdGl2ZXMvYmFzZS1pbnRlcmFjdGl2ZS5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbdi1pbnB1dF0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElucHV0RGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElucHV0RGlyZWN0aXZlIGV4dGVuZHMgQmFzZUludGVyYWN0aXZlRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBfaW5Db21ib2JveCA9IGZhbHNlO1xuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtaW5wdXRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbdGhpcy5fY2xhc3MsICd2LWlucHV0JywgdGhpcy5vdHAgPyAndi1pbnB1dC1vdHAnIDogJycsIHRoaXMubm9SZXNpemUgPyAndi1pbnB1dC1yZXNpemUtbm9uZScgOiAnJ10uam9pbihcbiAgICAgICcgJ1xuICAgICk7XG4gIH1cbiAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jbGFzcyA9IHZhbHVlO1xuICB9XG4gIF9jbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gaWQuXG4gICAqIEBkZWZhdWx0IHV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtaW5wdXQtJylcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgaWQ6IHN0cmluZyA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1pbnB1dC0nKTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgZ2V0IGhvc3RJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY3VzdG9tIHJvbGUuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgJ2NvbWJvYm94JyB3aGVuIGlucHV0IGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBubyBjdXN0b20gcm9sZSBpcyBwcm92aWRlZC5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJvbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcm9sZTtcbiAgfVxuICBzZXQgcm9sZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcm9sZSA9IHZhbHVlO1xuICB9XG4gIF9yb2xlOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGhvc3RSb2xlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGlucHV0IGFzIHJlYWRvbmx5IHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cbiAgc2V0IHJlYWRvbmx5KHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZWFkb25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5pbmZvcm1TdGF0ZSgpO1xuICB9XG4gIF9yZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ3JlYWRvbmx5JylcbiAgZ2V0IGhvc3RSZWFkb25seSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSA/ICdyZWFkb25seScgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29tcG9uZW50IGFzIGRpc2FibGVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5pbmZvcm1TdGF0ZSgpO1xuICB9XG4gIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJylcbiAgZ2V0IGhvc3REaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiBudWxsO1xuICB9XG4gIC8qKiBGaXJlcyB3aGVuIGEgZm9ybUNvbnRyb2wncyBkaXNhYmxlZCBzdGF0ZSB1cGRhdGVzICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuICAvKipcbiAgICogTWFya3MgY29tcG9uZW50IGFzIGludmFsaWQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludmFsaWQ7XG4gIH1cbiAgc2V0IGludmFsaWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2ludmFsaWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuaW5mb3JtU3RhdGUoKTtcbiAgfVxuICBfaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1pbnZhbGlkJylcbiAgZ2V0IGFyaWFJbnZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgY29tcG9uZW50IGFzIHJlcXVpcmVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5pbmZvcm1TdGF0ZSgpO1xuICB9XG4gIF9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGlucHV0IHRvIG9uZS10aW1lLXBhc3Njb2RlIChPVFApIHZhcmlhbnQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG90cCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3RwO1xuICB9XG4gIHNldCBvdHAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX290cCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX290cDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHJlc2l6ZSBmcm9tIHRleHRhcmVhIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBub1Jlc2l6ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbm9SZXNpemU7XG4gIH1cbiAgc2V0IG5vUmVzaXplKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9ub1Jlc2l6ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX25vUmVzaXplOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEJlbG93IG5lZWRlZCBmb3IgY29tYm9ib3ggKi9cblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcmVsYXlpbmcgd2hldGhlciBpbnB1dCBpcyBleHBhbmRlZC5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtZXhwYW5kZWQnKVxuICBnZXQgYXJpYUV4cGFuZGVkKCk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUV4cGFuZGVkO1xuICB9XG4gIHNldCBhcmlhRXhwYW5kZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FyaWFFeHBhbmRlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFFeHBhbmRlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1leHBhbmRlZCcpXG4gIGdldCBob3N0QXJpYUV4cGFuZGVkKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFFeHBhbmRlZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUV4cGFuZGVkLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIGF1dG9jb21wbGV0ZSB0eXBlLlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBkZWZhdWx0ICdsaXN0JyB3aGVuIGlucHV0IGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBubyBjdXN0b20gdmFsdWUgaXMgcHJvdmlkZWQuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1hdXRvY29tcGxldGUnKVxuICBnZXQgYXJpYUF1dG9jb21wbGV0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcmlhQXV0b2NvbXBsZXRlO1xuICB9XG4gIHNldCBhcmlhQXV0b2NvbXBsZXRlKHZhbHVlKSB7XG4gICAgdGhpcy5fYXJpYUF1dG9jb21wbGV0ZSA9IHZhbHVlO1xuICB9XG4gIF9hcmlhQXV0b2NvbXBsZXRlOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWF1dG9jb21wbGV0ZScpXG4gIGdldCBob3N0QXJpYUF1dG9jb21wbGV0ZSgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhQXV0b2NvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhQXV0b2NvbXBsZXRlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5faW5Db21ib2JveCkge1xuICAgICAgcmV0dXJuICdsaXN0JztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBpbnB1dCBhcmlhLWhhc3BvcHVwIGF0dHJpYnV0ZS5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnbGlzdGJveCcgd2hlbiBpbnB1dCBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgbm8gY3VzdG9tIHZhbHVlIGlzIGdpdmVuLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtaGFzcG9wdXAnKVxuICBnZXQgYXJpYUhhc3BvcHVwKCk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUhhc3BvcHVwO1xuICB9XG4gIHNldCBhcmlhSGFzcG9wdXAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FyaWFIYXNwb3B1cCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFIYXNwb3B1cDogYm9vbGVhbiB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhhc3BvcHVwJylcbiAgZ2V0IGhvc3RBcmlhSGFzcG9wdXAoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUhhc3BvcHVwKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhSGFzcG9wdXAudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2luQ29tYm9ib3gpIHtcbiAgICAgIHJldHVybiAnbGlzdGJveCc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgaW5wdXQgYXJpYS1vd25zIGF0dHJpYnV0ZS5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnJmx0O2xpc3Rib3gtY29udGFpbmVyLWlkJmd0Oycgd2hlbiBpbnB1dCBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgbm8gY3VzdG9tIHZhbHVlIGlzIGdpdmVuLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtb3ducycpXG4gIGdldCBhcmlhT3ducygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcmlhT3ducztcbiAgfVxuICBzZXQgYXJpYU93bnModmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhT3ducyA9IHZhbHVlO1xuICB9XG4gIF9hcmlhT3duczogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1vd25zJylcbiAgZ2V0IGhvc3RBcmlhT3ducygpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhT3ducykge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYU93bnM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoYXQgZWxlbWVudCB0aGUgaW5wdXQgY29udHJvbHMuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgJyZsdDtsaXN0Ym94LWlkJmd0Oycgd2hlbiBpbnB1dCBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgY29tYm9ib3ggbWVudSBpcyBvcGVuLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtY29udHJvbHMnKVxuICBnZXQgYXJpYUNvbnRyb2xzKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhQ29udHJvbHM7XG4gIH1cbiAgc2V0IGFyaWFDb250cm9scyh2YWx1ZSkge1xuICAgIHRoaXMuX2FyaWFDb250cm9scyA9IHZhbHVlO1xuICB9XG4gIF9hcmlhQ29udHJvbHM6IHN0cmluZyB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWNvbnRyb2xzJylcbiAgZ2V0IGhvc3RBcmlhQ29udHJvbHMoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUNvbnRyb2xzKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhQ29udHJvbHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoYXQgYWN0aXZlIGVsZW1lbnQgdGhlIGlucHV0IHJlZmVycyB0by5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnJmx0O2xpc3Rib3gtaXRlbS1pZCZndDsnIHdoZW4gaW5wdXQgaXMgdXNlZCB3aXRoaW4gY29tYm9ib3ggYW5kIGFuIG9wdGlvbiBpcyBoaWdobGlnaHRlZCBvciBhY3RpdmUuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1hY3RpdmVkZXNjZW5kYW50JylcbiAgZ2V0IGFyaWFBY3RpdmVEZXNjZW5kYW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhQWN0aXZlRGVzY2VuZGFudDtcbiAgfVxuICBzZXQgYXJpYUFjdGl2ZURlc2NlbmRhbnQodmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhQWN0aXZlRGVzY2VuZGFudCA9IHZhbHVlO1xuICB9XG4gIF9hcmlhQWN0aXZlRGVzY2VuZGFudDogc3RyaW5nIHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudCcpXG4gIGdldCBob3N0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUFjdGl2ZURlc2NlbmRhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFBY3RpdmVEZXNjZW5kYW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWx1ZSBvZiBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAvLyBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLmFwcFJlYWR5U2VydmljZS5pc0Jyb3dzZXJBbmREb21BdmFpbGFibGUoKSkge1xuICAgICAgaWYgKHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gIH1cblxuICAvLyBrZWVwIHZhbCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgZ2V0IHZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgLy8gaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5hcHBSZWFkeVNlcnZpY2UuaXNCcm93c2VyQW5kRG9tQXZhaWxhYmxlKCkpIHtcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICB9XG4gIF92YWx1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBldmVudCBpcyB0cmlnZ2VyZWQgb3IgYmFja3NwYWNlIGtleSBpcyBwcmVzc2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIGlucHV0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgcmVhZG9ubHksIGRpc2FibGVkLCBpbnZhbGlkLCBhbmQgcmVxdWlyZWQgc3RhdGUgb2YgaW5wdXQgd2hlbiBhbnkgb2YgdGhlc2Ugc3RhdGVzIGNoYW5nZS5cbiAgICovXG4gIEBPdXRwdXQoKSBjb21tdW5pY2F0ZVN0YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBoYW5kbGVJbnB1dChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5hcHBSZWFkeVNlcnZpY2UuaXNCcm93c2VyQW5kRG9tQXZhaWxhYmxlKCkpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICAgICAgdGhpcy5pbnB1dEV2ZW50LmVtaXQodGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmb2N1cycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUZvY3VzKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMub25Ub3VjaGVkKGV2ZW50KTtcbiAgICB0aGlzLmZvY3VzZWQuZW1pdCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUJsdXIoZXZlbnQ6IEV2ZW50KSB7fVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVSZWFkb25seVNwYWNlKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgLy8gdGhpcyByZXNvbHZlcyBhIGJ1ZyB3aGVyZSBkYXRlL3RpbWUvY29sb3IgbWVudXMgd2VyZSBzdGlsbCBvcGVuaW5nIHdoZW4gcmVhZG9ubHkgYW5kIHByZXNzaW5nIHNwYWNlXG4gICAgaWYgKHRoaXMucmVhZG9ubHkgJiYgZXZlbnQua2V5ID09PSBTUEFDRV9LRVkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB1dWlkU2VydmljZTogVVVJRFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBSZWFkeVNlcnZpY2U6IEFwcFJlYWR5U2VydmljZVxuICApIHtcbiAgICBzdXBlcihlbCk7XG4gIH1cblxuICBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuXG4gIG9uVG91Y2hlZCA9IChfOiBhbnkpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBpbmZvcm1TdGF0ZSgpIHtcbiAgICB0aGlzLmNvbW11bmljYXRlU3RhdGUuZW1pdCh7XG4gICAgICByZWFkb25seTogdGhpcy5yZWFkb25seSxcbiAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkLFxuICAgICAgaW52YWxpZDogdGhpcy5pbnZhbGlkLFxuICAgICAgcmVxdWlyZWQ6IHRoaXMucmVxdWlyZWRcbiAgICB9KTtcbiAgfVxufVxuIl19