juvo-rafa-library
Version:
A comprehensive Angular component library featuring real-world components and validators extracted from the Juvo Rafa backoffice application. Now with improved select components and bug fixes.
128 lines • 18.7 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { CommonModule } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/**
* Confirmation Dialog Component
*
* @description
* A confirmation dialog component for user confirmations in enterprise applications.
* Provides a modal dialog with customizable header, message, and icon.
* Originally designed for critical actions that require user confirmation.
*
* @example
* ```html
* <!-- Basic confirmation dialog -->
* <juvo-confirmation-dialog
* *ngIf="showDialog"
* header="Delete Item"
* message="Are you sure you want to delete this item? This action cannot be undone."
* icon="⚠️"
* (actionAcceptTriggered)="onConfirm()"
* (actionCancelTriggered)="onCancel()">
* </juvo-confirmation-dialog>
*
* <!-- Custom styled dialog -->
* <juvo-confirmation-dialog
* *ngIf="showWarning"
* header="Warning"
* message="This action will affect multiple records."
* icon="🚨"
* acceptText="Continue"
* cancelText="Go Back"
* (actionAcceptTriggered)="onProceed()"
* (actionCancelTriggered)="onGoBack()">
* </juvo-confirmation-dialog>
* ```
*
* @selector juvo-confirmation-dialog
* @since 2.1.0
* @author Juvo Rafa Team
*/
export class JuvoConfirmationDialogComponent {
constructor() {
/** Dialog header text @default "Confirmation" */
this.header = 'Confirmation';
/** Icon to display in the dialog @default "⚠️" */
this.icon = '⚠️';
/** Main confirmation message @default "Are you sure you want to proceed?" */
this.message = 'Are you sure you want to proceed?';
/** Text for accept button @default "Yes" */
this.acceptText = 'Yes';
/** Text for cancel button @default "No" */
this.cancelText = 'No';
/** Whether to show the dialog @default true */
this.visible = true;
/** Dialog width @default "400px" */
this.width = '400px';
/** Emitted when user confirms the action */
this.actionAcceptTriggered = new EventEmitter();
/** Emitted when user cancels the action */
this.actionCancelTriggered = new EventEmitter();
/** Emitted when dialog is closed */
this.onClose = new EventEmitter();
}
/**
* Handles accept button click
* @emits actionAcceptTriggered
*/
onAccept() {
this.actionAcceptTriggered.emit();
this.close();
}
/**
* Handles cancel button click
* @emits actionCancelTriggered
*/
onCancel() {
this.actionCancelTriggered.emit();
this.close();
}
/**
* Closes the dialog
* @emits onClose
*/
close() {
this.visible = false;
this.onClose.emit();
}
/**
* Handles backdrop click
*/
onBackdropClick() {
this.onCancel();
}
/**
* Prevents dialog content click from closing dialog
*/
onContentClick(event) {
event.stopPropagation();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JuvoConfirmationDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: JuvoConfirmationDialogComponent, isStandalone: true, selector: "juvo-confirmation-dialog", inputs: { header: "header", icon: "icon", message: "message", acceptText: "acceptText", cancelText: "cancelText", visible: "visible", width: "width" }, outputs: { actionAcceptTriggered: "actionAcceptTriggered", actionCancelTriggered: "actionCancelTriggered", onClose: "onClose" }, ngImport: i0, template: "<div class=\"dialog-overlay\" \n *ngIf=\"visible\" \n (click)=\"onBackdropClick()\">\n <div class=\"dialog-container\" \n [style.width]=\"width\"\n (click)=\"onContentClick($event)\">\n \n <div class=\"dialog-header\">\n <span class=\"dialog-icon\">{{ icon }}</span>\n <h3 class=\"dialog-title\">{{ header }}</h3>\n <button class=\"dialog-close\" \n (click)=\"onCancel()\" \n type=\"button\"\n aria-label=\"Close\">\n \u2715\n </button>\n </div>\n \n <div class=\"dialog-body\">\n <p class=\"dialog-message\">{{ message }}</p>\n </div>\n \n <div class=\"dialog-footer\">\n <button class=\"btn btn-secondary\" \n (click)=\"onCancel()\" \n type=\"button\">\n {{ cancelText }}\n </button>\n <button class=\"btn btn-primary\" \n (click)=\"onAccept()\" \n type=\"button\">\n {{ acceptText }}\n </button>\n </div>\n </div>\n</div> ", styles: [".dialog-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.dialog-container{background:#fff;border-radius:.5rem;box-shadow:0 10px 25px #0003;max-width:90vw;max-height:90vh;overflow:hidden;animation:dialogAppear .2s ease-out}@keyframes dialogAppear{0%{opacity:0;transform:scale(.95) translateY(-20px)}to{opacity:1;transform:scale(1) translateY(0)}}.dialog-header{display:flex;align-items:center;padding:1.5rem 1.5rem 1rem;border-bottom:1px solid #e5e7eb;gap:.75rem}.dialog-icon{font-size:1.5rem;flex-shrink:0}.dialog-title{flex:1;margin:0;font-size:1.25rem;font-weight:600;color:#374151}.dialog-close{background:none;border:none;font-size:1.25rem;color:#6b7280;cursor:pointer;padding:.25rem;border-radius:.25rem;transition:all .15s;flex-shrink:0}.dialog-close:hover{background:#f3f4f6;color:#374151}.dialog-body{padding:1rem 1.5rem}.dialog-message{margin:0;color:#6b7280;line-height:1.6}.dialog-footer{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 1.5rem 1.5rem;border-top:1px solid #e5e7eb}.btn{padding:.5rem 1rem;border-radius:.375rem;font-weight:500;cursor:pointer;transition:all .15s;border:1px solid;font-size:.875rem;min-width:80px}.btn-primary{background:#dc2626;color:#fff;border-color:#dc2626}.btn-primary:hover{background:#b91c1c;border-color:#b91c1c}.btn-secondary{background:#fff;color:#6b7280;border-color:#d1d5db}.btn-secondary:hover{background:#f9fafb;border-color:#9ca3af;color:#374151}.btn:focus{outline:none;box-shadow:0 0 0 3px #3b82f61a}@media (max-width: 640px){.dialog-container{width:95vw!important;margin:1rem}.dialog-header{padding:1rem}.dialog-body{padding:.75rem 1rem}.dialog-footer{padding:.75rem 1rem 1rem;flex-direction:column}.btn{width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JuvoConfirmationDialogComponent, decorators: [{
type: Component,
args: [{ selector: 'juvo-confirmation-dialog', standalone: true, imports: [CommonModule], template: "<div class=\"dialog-overlay\" \n *ngIf=\"visible\" \n (click)=\"onBackdropClick()\">\n <div class=\"dialog-container\" \n [style.width]=\"width\"\n (click)=\"onContentClick($event)\">\n \n <div class=\"dialog-header\">\n <span class=\"dialog-icon\">{{ icon }}</span>\n <h3 class=\"dialog-title\">{{ header }}</h3>\n <button class=\"dialog-close\" \n (click)=\"onCancel()\" \n type=\"button\"\n aria-label=\"Close\">\n \u2715\n </button>\n </div>\n \n <div class=\"dialog-body\">\n <p class=\"dialog-message\">{{ message }}</p>\n </div>\n \n <div class=\"dialog-footer\">\n <button class=\"btn btn-secondary\" \n (click)=\"onCancel()\" \n type=\"button\">\n {{ cancelText }}\n </button>\n <button class=\"btn btn-primary\" \n (click)=\"onAccept()\" \n type=\"button\">\n {{ acceptText }}\n </button>\n </div>\n </div>\n</div> ", styles: [".dialog-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.dialog-container{background:#fff;border-radius:.5rem;box-shadow:0 10px 25px #0003;max-width:90vw;max-height:90vh;overflow:hidden;animation:dialogAppear .2s ease-out}@keyframes dialogAppear{0%{opacity:0;transform:scale(.95) translateY(-20px)}to{opacity:1;transform:scale(1) translateY(0)}}.dialog-header{display:flex;align-items:center;padding:1.5rem 1.5rem 1rem;border-bottom:1px solid #e5e7eb;gap:.75rem}.dialog-icon{font-size:1.5rem;flex-shrink:0}.dialog-title{flex:1;margin:0;font-size:1.25rem;font-weight:600;color:#374151}.dialog-close{background:none;border:none;font-size:1.25rem;color:#6b7280;cursor:pointer;padding:.25rem;border-radius:.25rem;transition:all .15s;flex-shrink:0}.dialog-close:hover{background:#f3f4f6;color:#374151}.dialog-body{padding:1rem 1.5rem}.dialog-message{margin:0;color:#6b7280;line-height:1.6}.dialog-footer{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 1.5rem 1.5rem;border-top:1px solid #e5e7eb}.btn{padding:.5rem 1rem;border-radius:.375rem;font-weight:500;cursor:pointer;transition:all .15s;border:1px solid;font-size:.875rem;min-width:80px}.btn-primary{background:#dc2626;color:#fff;border-color:#dc2626}.btn-primary:hover{background:#b91c1c;border-color:#b91c1c}.btn-secondary{background:#fff;color:#6b7280;border-color:#d1d5db}.btn-secondary:hover{background:#f9fafb;border-color:#9ca3af;color:#374151}.btn:focus{outline:none;box-shadow:0 0 0 3px #3b82f61a}@media (max-width: 640px){.dialog-container{width:95vw!important;margin:1rem}.dialog-header{padding:1rem}.dialog-body{padding:.75rem 1rem}.dialog-footer{padding:.75rem 1rem 1rem;flex-direction:column}.btn{width:100%}}\n"] }]
}], propDecorators: { header: [{
type: Input
}], icon: [{
type: Input
}], message: [{
type: Input
}], acceptText: [{
type: Input
}], cancelText: [{
type: Input
}], visible: [{
type: Input
}], width: [{
type: Input
}], actionAcceptTriggered: [{
type: Output
}], actionCancelTriggered: [{
type: Output
}], onClose: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianV2by1jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9qdXZvLWNvbmZpcm1hdGlvbi1kaWFsb2cvanV2by1jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9qdXZvLWNvbmZpcm1hdGlvbi1kaWFsb2cvanV2by1jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFFL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQVFILE1BQU0sT0FBTywrQkFBK0I7SUFQNUM7UUFRRSxpREFBaUQ7UUFDeEMsV0FBTSxHQUFXLGNBQWMsQ0FBQztRQUV6QyxrREFBa0Q7UUFDekMsU0FBSSxHQUFXLElBQUksQ0FBQztRQUU3Qiw2RUFBNkU7UUFDcEUsWUFBTyxHQUFXLG1DQUFtQyxDQUFDO1FBRS9ELDRDQUE0QztRQUNuQyxlQUFVLEdBQVcsS0FBSyxDQUFDO1FBRXBDLDJDQUEyQztRQUNsQyxlQUFVLEdBQVcsSUFBSSxDQUFDO1FBRW5DLCtDQUErQztRQUN0QyxZQUFPLEdBQVksSUFBSSxDQUFDO1FBRWpDLG9DQUFvQztRQUMzQixVQUFLLEdBQVcsT0FBTyxDQUFDO1FBRWpDLDRDQUE0QztRQUNsQywwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTNELDJDQUEyQztRQUNqQywwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTNELG9DQUFvQztRQUMxQixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztLQTBDOUM7SUF4Q0M7OztPQUdHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsS0FBWTtRQUN6QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDMUIsQ0FBQzsrR0F0RVUsK0JBQStCO21HQUEvQiwrQkFBK0IsNldDL0M1Qyx5Z0NBbUNPLDB4RERRSyxZQUFZOzs0RkFJWCwrQkFBK0I7a0JBUDNDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQzs4QkFNZCxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHSSxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBR0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUdHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBDb25maXJtYXRpb24gRGlhbG9nIENvbXBvbmVudFxuICogXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgY29uZmlybWF0aW9uIGRpYWxvZyBjb21wb25lbnQgZm9yIHVzZXIgY29uZmlybWF0aW9ucyBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucy5cbiAqIFByb3ZpZGVzIGEgbW9kYWwgZGlhbG9nIHdpdGggY3VzdG9taXphYmxlIGhlYWRlciwgbWVzc2FnZSwgYW5kIGljb24uXG4gKiBPcmlnaW5hbGx5IGRlc2lnbmVkIGZvciBjcml0aWNhbCBhY3Rpb25zIHRoYXQgcmVxdWlyZSB1c2VyIGNvbmZpcm1hdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDwhLS0gQmFzaWMgY29uZmlybWF0aW9uIGRpYWxvZyAtLT5cbiAqIDxqdXZvLWNvbmZpcm1hdGlvbi1kaWFsb2dcbiAqICAgKm5nSWY9XCJzaG93RGlhbG9nXCJcbiAqICAgaGVhZGVyPVwiRGVsZXRlIEl0ZW1cIlxuICogICBtZXNzYWdlPVwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGl0ZW0/IFRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuXCJcbiAqICAgaWNvbj1cIuKaoO+4j1wiXG4gKiAgIChhY3Rpb25BY2NlcHRUcmlnZ2VyZWQpPVwib25Db25maXJtKClcIlxuICogICAoYWN0aW9uQ2FuY2VsVHJpZ2dlcmVkKT1cIm9uQ2FuY2VsKClcIj5cbiAqIDwvanV2by1jb25maXJtYXRpb24tZGlhbG9nPlxuICogXG4gKiA8IS0tIEN1c3RvbSBzdHlsZWQgZGlhbG9nIC0tPlxuICogPGp1dm8tY29uZmlybWF0aW9uLWRpYWxvZ1xuICogICAqbmdJZj1cInNob3dXYXJuaW5nXCJcbiAqICAgaGVhZGVyPVwiV2FybmluZ1wiXG4gKiAgIG1lc3NhZ2U9XCJUaGlzIGFjdGlvbiB3aWxsIGFmZmVjdCBtdWx0aXBsZSByZWNvcmRzLlwiXG4gKiAgIGljb249XCLwn5qoXCJcbiAqICAgYWNjZXB0VGV4dD1cIkNvbnRpbnVlXCJcbiAqICAgY2FuY2VsVGV4dD1cIkdvIEJhY2tcIlxuICogICAoYWN0aW9uQWNjZXB0VHJpZ2dlcmVkKT1cIm9uUHJvY2VlZCgpXCJcbiAqICAgKGFjdGlvbkNhbmNlbFRyaWdnZXJlZCk9XCJvbkdvQmFjaygpXCI+XG4gKiA8L2p1dm8tY29uZmlybWF0aW9uLWRpYWxvZz5cbiAqIGBgYFxuICogXG4gKiBAc2VsZWN0b3IganV2by1jb25maXJtYXRpb24tZGlhbG9nXG4gKiBAc2luY2UgMi4xLjBcbiAqIEBhdXRob3IgSnV2byBSYWZhIFRlYW1cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnanV2by1jb25maXJtYXRpb24tZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9qdXZvLWNvbmZpcm1hdGlvbi1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vanV2by1jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIEp1dm9Db25maXJtYXRpb25EaWFsb2dDb21wb25lbnQge1xuICAvKiogRGlhbG9nIGhlYWRlciB0ZXh0IEBkZWZhdWx0IFwiQ29uZmlybWF0aW9uXCIgKi9cbiAgQElucHV0KCkgaGVhZGVyOiBzdHJpbmcgPSAnQ29uZmlybWF0aW9uJztcbiAgXG4gIC8qKiBJY29uIHRvIGRpc3BsYXkgaW4gdGhlIGRpYWxvZyBAZGVmYXVsdCBcIuKaoO+4j1wiICovXG4gIEBJbnB1dCgpIGljb246IHN0cmluZyA9ICfimqDvuI8nO1xuICBcbiAgLyoqIE1haW4gY29uZmlybWF0aW9uIG1lc3NhZ2UgQGRlZmF1bHQgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZD9cIiAqL1xuICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmcgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQ/JztcbiAgXG4gIC8qKiBUZXh0IGZvciBhY2NlcHQgYnV0dG9uIEBkZWZhdWx0IFwiWWVzXCIgKi9cbiAgQElucHV0KCkgYWNjZXB0VGV4dDogc3RyaW5nID0gJ1llcyc7XG4gIFxuICAvKiogVGV4dCBmb3IgY2FuY2VsIGJ1dHRvbiBAZGVmYXVsdCBcIk5vXCIgKi9cbiAgQElucHV0KCkgY2FuY2VsVGV4dDogc3RyaW5nID0gJ05vJztcbiAgXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGRpYWxvZyBAZGVmYXVsdCB0cnVlICovXG4gIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgLyoqIERpYWxvZyB3aWR0aCBAZGVmYXVsdCBcIjQwMHB4XCIgKi9cbiAgQElucHV0KCkgd2lkdGg6IHN0cmluZyA9ICc0MDBweCc7XG4gIFxuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY29uZmlybXMgdGhlIGFjdGlvbiAqL1xuICBAT3V0cHV0KCkgYWN0aW9uQWNjZXB0VHJpZ2dlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGNhbmNlbHMgdGhlIGFjdGlvbiAqL1xuICBAT3V0cHV0KCkgYWN0aW9uQ2FuY2VsVHJpZ2dlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiBkaWFsb2cgaXMgY2xvc2VkICovXG4gIEBPdXRwdXQoKSBvbkNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFjY2VwdCBidXR0b24gY2xpY2tcbiAgICogQGVtaXRzIGFjdGlvbkFjY2VwdFRyaWdnZXJlZFxuICAgKi9cbiAgb25BY2NlcHQoKTogdm9pZCB7XG4gICAgdGhpcy5hY3Rpb25BY2NlcHRUcmlnZ2VyZWQuZW1pdCgpO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNhbmNlbCBidXR0b24gY2xpY2tcbiAgICogQGVtaXRzIGFjdGlvbkNhbmNlbFRyaWdnZXJlZFxuICAgKi9cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5hY3Rpb25DYW5jZWxUcmlnZ2VyZWQuZW1pdCgpO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGRpYWxvZ1xuICAgKiBAZW1pdHMgb25DbG9zZVxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGJhY2tkcm9wIGNsaWNrXG4gICAqL1xuICBvbkJhY2tkcm9wQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vbkNhbmNlbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGRpYWxvZyBjb250ZW50IGNsaWNrIGZyb20gY2xvc2luZyBkaWFsb2dcbiAgICovXG4gIG9uQ29udGVudENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG59ICIsIjxkaXYgY2xhc3M9XCJkaWFsb2ctb3ZlcmxheVwiIFxuICAgICAqbmdJZj1cInZpc2libGVcIiBcbiAgICAgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygpXCI+XG4gIDxkaXYgY2xhc3M9XCJkaWFsb2ctY29udGFpbmVyXCIgXG4gICAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoXCJcbiAgICAgICAoY2xpY2spPVwib25Db250ZW50Q2xpY2soJGV2ZW50KVwiPlxuICAgIFxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctaGVhZGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImRpYWxvZy1pY29uXCI+e3sgaWNvbiB9fTwvc3Bhbj5cbiAgICAgIDxoMyBjbGFzcz1cImRpYWxvZy10aXRsZVwiPnt7IGhlYWRlciB9fTwvaDM+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZGlhbG9nLWNsb3NlXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkNhbmNlbCgpXCIgXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgICAg4pyVXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWJvZHlcIj5cbiAgICAgIDxwIGNsYXNzPVwiZGlhbG9nLW1lc3NhZ2VcIj57eyBtZXNzYWdlIH19PC9wPlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctZm9vdGVyXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICB7eyBjYW5jZWxUZXh0IH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWNjZXB0KClcIiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICB7eyBhY2NlcHRUZXh0IH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4gIl19