ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
325 lines • 33.3 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { NgTemplateOutlet } from '@angular/common';
import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { isNonEmptyString, isTemplateRef } from 'ng-zorro-antd/core/util';
import { NzPopoverDirective } from 'ng-zorro-antd/popover';
import { NzColorBlockComponent } from './color-block.component';
import { NzColorFormatComponent } from './color-format.component';
import { NgAntdColorPickerModule } from './src/ng-antd-color-picker.module';
import { defaultColor, generateColor } from './src/util/util';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "./src/ng-antd-color-picker.component";
export class NzColorPickerComponent {
constructor(formBuilder, cdr) {
this.formBuilder = formBuilder;
this.cdr = cdr;
this.nzFormat = null;
this.nzValue = '';
this.nzSize = 'default';
this.nzDefaultValue = '';
this.nzTrigger = 'click';
this.nzTitle = '';
this.nzFlipFlop = null;
this.nzShowText = false;
this.nzOpen = false;
this.nzAllowClear = false;
this.nzDisabled = false;
this.nzDisabledAlpha = false;
this.nzOnChange = new EventEmitter();
this.nzOnFormatChange = new EventEmitter();
this.nzOnClear = new EventEmitter();
this.nzOnOpenChange = new EventEmitter();
this.isTemplateRef = isTemplateRef;
this.isNonEmptyString = isNonEmptyString;
this.destroy$ = new Subject();
this.isNzDisableFirstChange = true;
this.blockColor = '';
this.clearColor = false;
this.showText = defaultColor.toHexString();
this.formControl = this.formBuilder.control('');
this.onChange = () => { };
}
writeValue(value) {
this.nzValue = value;
this.getBlockColor();
this.formControl.patchValue(value);
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched() { }
setDisabledState(isDisabled) {
this.nzDisabled = (this.isNzDisableFirstChange && this.nzDisabled) || isDisabled;
this.isNzDisableFirstChange = false;
this.cdr.markForCheck();
}
ngOnInit() {
this.getBlockColor();
this.formControl.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {
if (!!value) {
let color = value;
if (this.nzFormat === 'hex') {
color =
generateColor(value).getAlpha() < 1
? generateColor(value).toHex8String()
: generateColor(value).toHexString();
}
else if (this.nzFormat === 'hsb') {
color = generateColor(value).toHsbString();
}
else if (this.nzFormat === 'rgb') {
color = generateColor(value).toRgbString();
}
this.showText = color;
this.onChange(color);
this.cdr.markForCheck();
}
});
}
ngOnChanges(changes) {
const { nzValue, nzDefaultValue } = changes;
if (nzValue || nzDefaultValue) {
this.getBlockColor();
}
}
clearColorHandle() {
this.clearColor = true;
this.nzOnClear.emit(true);
this.cdr.markForCheck();
}
getBlockColor() {
if (!!this.nzValue) {
this.blockColor = generateColor(this.nzValue).toRgbString();
}
else if (!!this.nzDefaultValue) {
this.blockColor = generateColor(this.nzDefaultValue).toRgbString();
}
else {
this.blockColor = defaultColor.toHexString();
}
}
colorChange(value) {
this.blockColor = value.color.getAlpha() < 1 ? value.color.toHex8String() : value.color.toHexString();
this.clearColor = false;
this.cdr.markForCheck();
}
formatChange(value) {
this.nzValue = value.color;
this.clearColor = false;
this.getBlockColor();
this.nzOnChange.emit({ color: generateColor(value.color), format: value.format });
this.formControl.patchValue(value.color);
this.cdr.markForCheck();
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
get isNzTitleNonEmptyString() {
return isNonEmptyString(this.nzTitle);
}
get isNzTitleTemplateRef() {
return isTemplateRef(this.nzTitle);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzColorPickerComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.2", type: NzColorPickerComponent, isStandalone: true, selector: "nz-color-picker", inputs: { nzFormat: "nzFormat", nzValue: "nzValue", nzSize: "nzSize", nzDefaultValue: "nzDefaultValue", nzTrigger: "nzTrigger", nzTitle: "nzTitle", nzFlipFlop: "nzFlipFlop", nzShowText: ["nzShowText", "nzShowText", booleanAttribute], nzOpen: ["nzOpen", "nzOpen", booleanAttribute], nzAllowClear: ["nzAllowClear", "nzAllowClear", booleanAttribute], nzDisabled: ["nzDisabled", "nzDisabled", booleanAttribute], nzDisabledAlpha: ["nzDisabledAlpha", "nzDisabledAlpha", booleanAttribute] }, outputs: { nzOnChange: "nzOnChange", nzOnFormatChange: "nzOnFormatChange", nzOnClear: "nzOnClear", nzOnOpenChange: "nzOnOpenChange" }, host: { properties: { "class.ant-color-picker-disabled": "nzDisabled" }, classAttribute: "ant-color-picker-inline" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NzColorPickerComponent),
multi: true
}
], exportAs: ["NzColorPicker"], usesOnChanges: true, ngImport: i0, template: `
<div
[class.ant-color-picker-trigger]="!nzFlipFlop"
[class.ant-color-picker-sm]="nzSize === 'small'"
[class.ant-color-picker-lg]="nzSize === 'large'"
nz-popover
[nzPopoverContent]="colorPicker"
[nzPopoverTrigger]="!nzDisabled ? nzTrigger : null"
[nzPopoverVisible]="nzOpen"
(nzPopoverVisibleChange)="nzOnOpenChange.emit($event)"
>
(!nzFlipFlop) {
<nz-color-block [nzColor]="blockColor" [nzSize]="nzSize" />
} {
<ng-template [ngTemplateOutlet]="nzFlipFlop" />
}
(nzShowText && !!showText && !nzFlipFlop) {
<div class="ant-color-picker-trigger-text">
{{ showText }}
</div>
}
</div>
<ng-template #colorPicker>
<ng-antd-color-picker
[value]="nzValue"
[defaultValue]="nzDefaultValue"
[disabled]="nzDisabled"
[panelRenderHeader]="nzPanelRenderHeader"
[panelRenderFooter]="nzPanelRenderFooter"
[disabledAlpha]="nzDisabledAlpha"
(nzOnChange)="colorChange($event)"
/>
</ng-template>
<ng-template #nzPanelRenderHeader>
(nzTitle || nzAllowClear) {
<div class="ant-color-picker-title">
<div class="ant-color-picker-title-content">
(isNzTitleTemplateRef) {
<ng-container *ngTemplateOutlet="$any(nzTitle)" />
}
(isNzTitleNonEmptyString) {
<span [innerHTML]="nzTitle"></span>
}
</div>
(nzAllowClear) {
<div class="ant-color-picker-clear" (click)="clearColorHandle()"></div>
}
</div>
}
</ng-template>
<ng-template #nzPanelRenderFooter>
<nz-color-format
[colorValue]="blockColor"
[clearColor]="clearColor"
[format]="nzFormat"
[nzDisabledAlpha]="nzDisabledAlpha"
(formatChange)="formatChange($event)"
(nzOnFormatChange)="nzOnFormatChange.emit($event)"
/>
</ng-template>
`, isInline: true, dependencies: [{ kind: "ngmodule", type: NgAntdColorPickerModule }, { kind: "component", type: i2.NgAntdColorPickerComponent, selector: "ng-antd-color-picker", inputs: ["value", "defaultValue", "panelRenderHeader", "panelRenderFooter", "disabledAlpha", "disabled"], outputs: ["nzOnChange", "nzOnChangeComplete"] }, { kind: "directive", type: NzPopoverDirective, selector: "[nz-popover]", inputs: ["nzPopoverArrowPointAtCenter", "nzPopoverTitle", "nzPopoverContent", "nz-popover", "nzPopoverTrigger", "nzPopoverPlacement", "nzPopoverOrigin", "nzPopoverVisible", "nzPopoverMouseEnterDelay", "nzPopoverMouseLeaveDelay", "nzPopoverOverlayClassName", "nzPopoverOverlayStyle", "nzPopoverBackdrop"], outputs: ["nzPopoverVisibleChange"], exportAs: ["nzPopover"] }, { kind: "component", type: NzColorBlockComponent, selector: "nz-color-block", inputs: ["nzColor", "nzSize"], outputs: ["nzOnClick"], exportAs: ["NzColorBlock"] }, { kind: "component", type: NzColorFormatComponent, selector: "nz-color-format", inputs: ["format", "colorValue", "clearColor", "nzDisabledAlpha"], outputs: ["formatChange", "nzOnFormatChange"], exportAs: ["NzColorFormat"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzColorPickerComponent, decorators: [{
type: Component,
args: [{
selector: 'nz-color-picker',
exportAs: 'NzColorPicker',
changeDetection: ChangeDetectionStrategy.OnPush,
standalone: true,
imports: [
NgAntdColorPickerModule,
NzPopoverDirective,
NzColorBlockComponent,
NzColorFormatComponent,
NgTemplateOutlet
],
template: `
<div
[class.ant-color-picker-trigger]="!nzFlipFlop"
[class.ant-color-picker-sm]="nzSize === 'small'"
[class.ant-color-picker-lg]="nzSize === 'large'"
nz-popover
[nzPopoverContent]="colorPicker"
[nzPopoverTrigger]="!nzDisabled ? nzTrigger : null"
[nzPopoverVisible]="nzOpen"
(nzPopoverVisibleChange)="nzOnOpenChange.emit($event)"
>
(!nzFlipFlop) {
<nz-color-block [nzColor]="blockColor" [nzSize]="nzSize" />
} {
<ng-template [ngTemplateOutlet]="nzFlipFlop" />
}
(nzShowText && !!showText && !nzFlipFlop) {
<div class="ant-color-picker-trigger-text">
{{ showText }}
</div>
}
</div>
<ng-template #colorPicker>
<ng-antd-color-picker
[value]="nzValue"
[defaultValue]="nzDefaultValue"
[disabled]="nzDisabled"
[panelRenderHeader]="nzPanelRenderHeader"
[panelRenderFooter]="nzPanelRenderFooter"
[disabledAlpha]="nzDisabledAlpha"
(nzOnChange)="colorChange($event)"
/>
</ng-template>
<ng-template #nzPanelRenderHeader>
(nzTitle || nzAllowClear) {
<div class="ant-color-picker-title">
<div class="ant-color-picker-title-content">
(isNzTitleTemplateRef) {
<ng-container *ngTemplateOutlet="$any(nzTitle)" />
}
(isNzTitleNonEmptyString) {
<span [innerHTML]="nzTitle"></span>
}
</div>
(nzAllowClear) {
<div class="ant-color-picker-clear" (click)="clearColorHandle()"></div>
}
</div>
}
</ng-template>
<ng-template #nzPanelRenderFooter>
<nz-color-format
[colorValue]="blockColor"
[clearColor]="clearColor"
[format]="nzFormat"
[nzDisabledAlpha]="nzDisabledAlpha"
(formatChange)="formatChange($event)"
(nzOnFormatChange)="nzOnFormatChange.emit($event)"
/>
</ng-template>
`,
host: {
class: 'ant-color-picker-inline',
'[class.ant-color-picker-disabled]': `nzDisabled`
},
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NzColorPickerComponent),
multi: true
}
]
}]
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { nzFormat: [{
type: Input
}], nzValue: [{
type: Input
}], nzSize: [{
type: Input
}], nzDefaultValue: [{
type: Input
}], nzTrigger: [{
type: Input
}], nzTitle: [{
type: Input
}], nzFlipFlop: [{
type: Input
}], nzShowText: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzOpen: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzAllowClear: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzDisabled: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzDisabledAlpha: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], nzOnChange: [{
type: Output
}], nzOnFormatChange: [{
type: Output
}], nzOnClear: [{
type: Output
}], nzOnOpenChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY29sb3ItcGlja2VyL2NvbG9yLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUlMLE1BQU0sRUFHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFDLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUF3RjlELE1BQU0sT0FBTyxzQkFBc0I7SUEwQmpDLFlBQ1UsV0FBd0IsRUFDeEIsR0FBc0I7UUFEdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUEzQnZCLGFBQVEsR0FBbUMsSUFBSSxDQUFDO1FBQ2hELFlBQU8sR0FBcUIsRUFB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TztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ2tDLFVBQVU7c0JBQWpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsTUFBTTtzQkFBN0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxZQUFZO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFVBQVU7c0JBQWpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDbkIsVUFBVTtzQkFBNUIsTUFBTTtnQkFDWSxnQkFBZ0I7c0JBQWxDLE1BQU07Z0JBQ1ksU0FBUztzQkFBM0IsTUFBTTtnQkFDWSxjQUFjO3NCQUFoQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQnVpbGRlciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE56U2FmZUFueSwgTnpTaXplTERTVHlwZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBpc05vbkVtcHR5U3RyaW5nLCBpc1RlbXBsYXRlUmVmIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpQb3BvdmVyRGlyZWN0aXZlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9wb3BvdmVyJztcblxuaW1wb3J0IHsgTnpDb2xvckJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi9jb2xvci1ibG9jay5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnpDb2xvckZvcm1hdENvbXBvbmVudCB9IGZyb20gJy4vY29sb3ItZm9ybWF0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0FudGRDb2xvclBpY2tlck1vZHVsZSB9IGZyb20gJy4vc3JjL25nLWFudGQtY29sb3ItcGlja2VyLm1vZHVsZSc7XG5pbXBvcnQgeyBkZWZhdWx0Q29sb3IsIGdlbmVyYXRlQ29sb3IgfSBmcm9tICcuL3NyYy91dGlsL3V0aWwnO1xuaW1wb3J0IHsgTnpDb2xvciwgTnpDb2xvclBpY2tlckZvcm1hdFR5cGUsIE56Q29sb3JQaWNrZXJUcmlnZ2VyVHlwZSB9IGZyb20gJy4vdHlwaW5ncyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LWNvbG9yLXBpY2tlcicsXG4gIGV4cG9ydEFzOiAnTnpDb2xvclBpY2tlcicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdBbnRkQ29sb3JQaWNrZXJNb2R1bGUsXG4gICAgTnpQb3BvdmVyRGlyZWN0aXZlLFxuICAgIE56Q29sb3JCbG9ja0NvbXBvbmVudCxcbiAgICBOekNvbG9yRm9ybWF0Q29tcG9uZW50LFxuICAgIE5nVGVtcGxhdGVPdXRsZXRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBbY2xhc3MuYW50LWNvbG9yLXBpY2tlci10cmlnZ2VyXT1cIiFuekZsaXBGbG9wXCJcbiAgICAgIFtjbGFzcy5hbnQtY29sb3ItcGlja2VyLXNtXT1cIm56U2l6ZSA9PT0gJ3NtYWxsJ1wiXG4gICAgICBbY2xhc3MuYW50LWNvbG9yLXBpY2tlci1sZ109XCJuelNpemUgPT09ICdsYXJnZSdcIlxuICAgICAgbnotcG9wb3ZlclxuICAgICAgW256UG9wb3ZlckNvbnRlbnRdPVwiY29sb3JQaWNrZXJcIlxuICAgICAgW256UG9wb3ZlclRyaWdnZXJdPVwiIW56RGlzYWJsZWQgPyBuelRyaWdnZXIgOiBudWxsXCJcbiAgICAgIFtuelBvcG92ZXJWaXNpYmxlXT1cIm56T3BlblwiXG4gICAgICAobnpQb3BvdmVyVmlzaWJsZUNoYW5nZSk9XCJuek9uT3BlbkNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgID5cbiAgICAgIEBpZiAoIW56RmxpcEZsb3ApIHtcbiAgICAgICAgPG56LWNvbG9yLWJsb2NrIFtuekNvbG9yXT1cImJsb2NrQ29sb3JcIiBbbnpTaXplXT1cIm56U2l6ZVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm56RmxpcEZsb3BcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChuelNob3dUZXh0ICYmICEhc2hvd1RleHQgJiYgIW56RmxpcEZsb3ApIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItdHJpZ2dlci10ZXh0XCI+XG4gICAgICAgICAge3sgc2hvd1RleHQgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPG5nLXRlbXBsYXRlICNjb2xvclBpY2tlcj5cbiAgICAgIDxuZy1hbnRkLWNvbG9yLXBpY2tlclxuICAgICAgICBbdmFsdWVdPVwibnpWYWx1ZVwiXG4gICAgICAgIFtkZWZhdWx0VmFsdWVdPVwibnpEZWZhdWx0VmFsdWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibnpEaXNhYmxlZFwiXG4gICAgICAgIFtwYW5lbFJlbmRlckhlYWRlcl09XCJuelBhbmVsUmVuZGVySGVhZGVyXCJcbiAgICAgICAgW3BhbmVsUmVuZGVyRm9vdGVyXT1cIm56UGFuZWxSZW5kZXJGb290ZXJcIlxuICAgICAgICBbZGlzYWJsZWRBbHBoYV09XCJuekRpc2FibGVkQWxwaGFcIlxuICAgICAgICAobnpPbkNoYW5nZSk9XCJjb2xvckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI256UGFuZWxSZW5kZXJIZWFkZXI+XG4gICAgICBAaWYgKG56VGl0bGUgfHwgbnpBbGxvd0NsZWFyKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXRpdGxlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItdGl0bGUtY29udGVudFwiPlxuICAgICAgICAgICAgQGlmIChpc056VGl0bGVUZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiJGFueShuelRpdGxlKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGlzTnpUaXRsZU5vbkVtcHR5U3RyaW5nKSB7XG4gICAgICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwibnpUaXRsZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKG56QWxsb3dDbGVhcikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jb2xvci1waWNrZXItY2xlYXJcIiAoY2xpY2spPVwiY2xlYXJDb2xvckhhbmRsZSgpXCI+PC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjbnpQYW5lbFJlbmRlckZvb3Rlcj5cbiAgICAgIDxuei1jb2xvci1mb3JtYXRcbiAgICAgICAgW2NvbG9yVmFsdWVdPVwiYmxvY2tDb2xvclwiXG4gICAgICAgIFtjbGVhckNvbG9yXT1cImNsZWFyQ29sb3JcIlxuICAgICAgICBbZm9ybWF0XT1cIm56Rm9ybWF0XCJcbiAgICAgICAgW256RGlzYWJsZWRBbHBoYV09XCJuekRpc2FibGVkQWxwaGFcIlxuICAgICAgICAoZm9ybWF0Q2hhbmdlKT1cImZvcm1hdENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKG56T25Gb3JtYXRDaGFuZ2UpPVwibnpPbkZvcm1hdENoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdhbnQtY29sb3ItcGlja2VyLWlubGluZScsXG4gICAgJ1tjbGFzcy5hbnQtY29sb3ItcGlja2VyLWRpc2FibGVkXSc6IGBuekRpc2FibGVkYFxuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE56Q29sb3JQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTnpDb2xvclBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgbnpGb3JtYXQ6IE56Q29sb3JQaWNrZXJGb3JtYXRUeXBlIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56VmFsdWU6IHN0cmluZyB8IE56Q29sb3IgPSAnJztcbiAgQElucHV0KCkgbnpTaXplOiBOelNpemVMRFNUeXBlID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBuekRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgTnpDb2xvciA9ICcnO1xuICBASW5wdXQoKSBuelRyaWdnZXI6IE56Q29sb3JQaWNrZXJUcmlnZ2VyVHlwZSA9ICdjbGljayc7XG4gIEBJbnB1dCgpIG56VGl0bGU6IFRlbXBsYXRlUmVmPHZvaWQ+IHwgc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIG56RmxpcEZsb3A6IFRlbXBsYXRlUmVmPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuelNob3dUZXh0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuek9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56QWxsb3dDbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbnpEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbnpEaXNhYmxlZEFscGhhOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNvbG9yOiBOekNvbG9yOyBmb3JtYXQ6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkZvcm1hdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpDb2xvclBpY2tlckZvcm1hdFR5cGU+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uQ2xlYXIgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uT3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNUZW1wbGF0ZVJlZiA9IGlzVGVtcGxhdGVSZWY7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc05vbkVtcHR5U3RyaW5nID0gaXNOb25FbXB0eVN0cmluZztcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgaXNOekRpc2FibGVGaXJzdENoYW5nZTogYm9vbGVhbiA9IHRydWU7XG4gIGJsb2NrQ29sb3I6IHN0cmluZyA9ICcnO1xuICBjbGVhckNvbG9yOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dUZXh0OiBzdHJpbmcgPSBkZWZhdWx0Q29sb3IudG9IZXhTdHJpbmcoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIGZvcm1Db250cm9sID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKTtcblxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm56VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmdldEJsb2NrQ29sb3IoKTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoKTogdm9pZCB7fVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubnpEaXNhYmxlZCA9ICh0aGlzLmlzTnpEaXNhYmxlRmlyc3RDaGFuZ2UgJiYgdGhpcy5uekRpc2FibGVkKSB8fCBpc0Rpc2FibGVkO1xuICAgIHRoaXMuaXNOekRpc2FibGVGaXJzdENoYW5nZSA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRCbG9ja0NvbG9yKCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICBpZiAoISF2YWx1ZSkge1xuICAgICAgICBsZXQgY29sb3IgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMubnpGb3JtYXQgPT09ICdoZXgnKSB7XG4gICAgICAgICAgY29sb3IgPVxuICAgICAgICAgICAgZ2VuZXJhdGVDb2xvcih2YWx1ZSkuZ2V0QWxwaGEoKSA8IDFcbiAgICAgICAgICAgICAgPyBnZW5lcmF0ZUNvbG9yKHZhbHVlKS50b0hleDhTdHJpbmcoKVxuICAgICAgICAgICAgICA6IGdlbmVyYXRlQ29sb3IodmFsdWUpLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5uekZvcm1hdCA9PT0gJ2hzYicpIHtcbiAgICAgICAgICBjb2xvciA9IGdlbmVyYXRlQ29sb3IodmFsdWUpLnRvSHNiU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5uekZvcm1hdCA9PT0gJ3JnYicpIHtcbiAgICAgICAgICBjb2xvciA9IGdlbmVyYXRlQ29sb3IodmFsdWUpLnRvUmdiU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93VGV4dCA9IGNvbG9yO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKGNvbG9yKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBuelZhbHVlLCBuekRlZmF1bHRWYWx1ZSB9ID0gY2hhbmdlcztcbiAgICBpZiAobnpWYWx1ZSB8fCBuekRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5nZXRCbG9ja0NvbG9yKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJDb2xvckhhbmRsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQ29sb3IgPSB0cnVlO1xuICAgIHRoaXMubnpPbkNsZWFyLmVtaXQodHJ1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXRCbG9ja0NvbG9yKCk6IHZvaWQge1xuICAgIGlmICghIXRoaXMubnpWYWx1ZSkge1xuICAgICAgdGhpcy5ibG9ja0NvbG9yID0gZ2VuZXJhdGVDb2xvcih0aGlzLm56VmFsdWUpLnRvUmdiU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICghIXRoaXMubnpEZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMuYmxvY2tDb2xvciA9IGdlbmVyYXRlQ29sb3IodGhpcy5uekRlZmF1bHRWYWx1ZSkudG9SZ2JTdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ibG9ja0NvbG9yID0gZGVmYXVsdENvbG9yLnRvSGV4U3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgY29sb3JDaGFuZ2UodmFsdWU6IHsgY29sb3I6IE56Q29sb3IgfSk6IHZvaWQge1xuICAgIHRoaXMuYmxvY2tDb2xvciA9IHZhbHVlLmNvbG9yLmdldEFscGhhKCkgPCAxID8gdmFsdWUuY29sb3IudG9IZXg4U3RyaW5nKCkgOiB2YWx1ZS5jb2xvci50b0hleFN0cmluZygpO1xuICAgIHRoaXMuY2xlYXJDb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9ybWF0Q2hhbmdlKHZhbHVlOiB7IGNvbG9yOiBzdHJpbmc7IGZvcm1hdDogTnpDb2xvclBpY2tlckZvcm1hdFR5cGUgfSk6IHZvaWQge1xuICAgIHRoaXMubnpWYWx1ZSA9IHZhbHVlLmNvbG9yO1xuICAgIHRoaXMuY2xlYXJDb2xvciA9IGZhbHNlO1xuICAgIHRoaXMuZ2V0QmxvY2tDb2xvcigpO1xuICAgIHRoaXMubnpPbkNoYW5nZS5lbWl0KHsgY29sb3I6IGdlbmVyYXRlQ29sb3IodmFsdWUuY29sb3IpLCBmb3JtYXQ6IHZhbHVlLmZvcm1hdCB9KTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUodmFsdWUuY29sb3IpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0IGlzTnpUaXRsZU5vbkVtcHR5U3RyaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vbkVtcHR5U3RyaW5nKHRoaXMubnpUaXRsZSk7XG4gIH1cblxuICBnZXQgaXNOelRpdGxlVGVtcGxhdGVSZWYoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVGVtcGxhdGVSZWYodGhpcy5uelRpdGxlKTtcbiAgfVxufVxuIl19