UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

563 lines 63 kB
/** * © 2025 Visa * * 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, HostBinding, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class FlexDirective { get hostClasses() { return [ this.vFlex ? (this.vFlexCol ? 'v-flex' : 'v-flex v-flex-row') : null, this.vFlexInline ? 'v-flex-inline' : null, this.vFlexCol ? 'v-flex-col' : null, this.vFlexColReverse ? 'v-flex-col-reverse' : null, this.vFlexRow ? 'v-flex-row' : null, this.vFlexRowReverse ? 'v-flex-row-reverse' : null, this.vFlexWrap ? 'v-flex-wrap' : null, this.vFlexWrapReverse ? 'v-flex-wrap-reverse' : null, this.vFlexNoWrap ? 'v-flex-nowrap' : null, this.vFlexGrow ? 'v-flex-grow' : null, this.vFlexGrow0 ? 'v-flex-grow-0' : null, this.vFlexShrink ? 'v-flex-shrink' : null, this.vFlexShrink0 ? 'v-flex-shrink-0' : null, this.vAlignContentCenter ? 'v-align-content-center' : null, this.vAlignContentStart ? 'v-align-content-start' : null, this.vAlignContentEnd ? 'v-align-content-end' : null, this.vAlignContentBetween ? 'v-align-content-between' : null, this.vAlignContentAround ? 'v-align-content-around' : null, this.vAlignContentEvenly ? 'v-align-content-evenly' : null, this.vAlignItemsStart ? 'v-align-items-start' : null, this.vAlignItemsEnd ? 'v-align-items-end' : null, this.vAlignItemsCenter ? 'v-align-items-center' : null, this.vAlignItemsBaseline ? 'v-align-items-baseline' : null, this.vAlignItemsStretch ? 'v-align-items-stretch' : null, this.vAlignSelfStart ? 'v-align-self-start' : null, this.vAlignSelfEnd ? 'v-align-self-end' : null, this.vAlignSelfCenter ? 'v-align-self-center' : null, this.vAlignSelfBaseline ? 'v-align-self-baseline' : null, this.vAlignSelfStretch ? 'v-align-self-stretch' : null, this.vAlignSelfAuto ? 'v-align-self-auto' : null, this.vJustifyContentStart ? 'v-justify-content-start' : null, this.vJustifyContentEnd ? 'v-justify-content-end' : null, this.vJustifyContentCenter ? 'v-justify-content-center' : null, this.vJustifyContentBetween ? 'v-justify-content-between' : null, this.vJustifyContentAround ? 'v-justify-content-around' : null, this.vJustifyContentEvenly ? 'v-justify-content-evenly' : null, this.vGap ? `v-flex v-gap-${this.vGap}` : null, // vGap="4" this.vColGap ? `v-col-gap-${this.vColGap}` : null, // vGap="4" this.vRowGap ? `v-row-gap-${this.vRowGap}` : null // vGap="4" ].join(' '); } /** * Sets property <code>display: flex</code>. <br> * This property is also a selector and can be used by itself on a flex element. */ get vFlex() { return this._vFlex; } set vFlex(value) { this._vFlex = coerceBooleanProperty(value); } /** * Sets property <code>display: inline-flex</code>. <br> * This property is also a selector and can be used by itself on a flex element. */ get vFlexInline() { return this._vFlexInline; } set vFlexInline(value) { this._vFlexInline = coerceBooleanProperty(value); } /** * Sets property <code>flex-direction: column</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexCol() { return this._vFlexCol; } set vFlexCol(value) { this._vFlexCol = coerceBooleanProperty(value); } /** * Sets property <code>flex-direction: column-reverse</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexColReverse() { return this._vFlexColReverse; } set vFlexColReverse(value) { this._vFlexColReverse = coerceBooleanProperty(value); } /** * Sets property <code>flex-direction: row</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexRow() { return this._vFlexRow; } set vFlexRow(value) { this._vFlexRow = coerceBooleanProperty(value); } /** * Sets property <code>flex-direction: row-reverse</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexRowReverse() { return this._vFlexRowReverse; } set vFlexRowReverse(value) { this._vFlexRowReverse = coerceBooleanProperty(value); } /** * Sets property <code>flex-wrap: wrap</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexWrap() { return this._vFlexWrap; } set vFlexWrap(value) { this._vFlexWrap = coerceBooleanProperty(value); } /** * Sets property <code>flex-wrap: wrap-reverse</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexWrapReverse() { return this._vFlexWrapReverse; } set vFlexWrapReverse(value) { this._vFlexWrapReverse = coerceBooleanProperty(value); } /** * Sets property <code>flex-wrap: no-wrap</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vFlexNoWrap() { return this._vFlexNoWrap; } set vFlexNoWrap(value) { this._vFlexNoWrap = coerceBooleanProperty(value); } /** * Sets property <code>flex-basis: &lt;value&gt;</code>. <br> * Accepts a string that should be in the form of a percentage or CSS unit. <br /> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexBasis() { return this._vFlexBasis; } set vFlexBasis(value) { this._vFlexBasis = value; } get hostFlexBasis() { return this.vFlexBasis ? this.vFlexBasis : null; } /** * Sets property <code>flex-grow: 1</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexGrow() { return this._vFlexGrow; } set vFlexGrow(value) { this._vFlexGrow = coerceBooleanProperty(value); } /** * Sets property <code>flex-grow: 0</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexGrow0() { return this._vFlexGrow0; } set vFlexGrow0(value) { this._vFlexGrow0 = coerceBooleanProperty(value); } /** * Sets property <code>flex-shrink: 1</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexShrink() { return this._vFlexShrink; } set vFlexShrink(value) { this._vFlexShrink = coerceBooleanProperty(value); } /** * Sets property <code>flex-shrink: 0</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vFlexShrink0() { return this._vFlexShrink0; } set vFlexShrink0(value) { this._vFlexShrink0 = coerceBooleanProperty(value); } /** * Sets property <code>align-content: center</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentCenter() { return this._vAlignContentCenter; } set vAlignContentCenter(value) { this._vAlignContentCenter = coerceBooleanProperty(value); } /** * Sets property <code>align-content: start</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentStart() { return this._vAlignContentStart; } set vAlignContentStart(value) { this._vAlignContentStart = coerceBooleanProperty(value); } /** * Sets property <code>align-content: end</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentEnd() { return this._vAlignContentEnd; } set vAlignContentEnd(value) { this._vAlignContentEnd = coerceBooleanProperty(value); } /** * Sets property <code>align-content: space-between</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentBetween() { return this._vAlignContentBetween; } set vAlignContentBetween(value) { this._vAlignContentBetween = coerceBooleanProperty(value); } /** * Sets property <code>align-content: space-around</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentAround() { return this._vAlignContentAround; } set vAlignContentAround(value) { this._vAlignContentAround = coerceBooleanProperty(value); } /** * Sets property <code>align-content: space-evenly</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignContentEvenly() { return this._vAlignContentEvenly; } set vAlignContentEvenly(value) { this._vAlignContentEvenly = coerceBooleanProperty(value); } /** * Sets property <code>align-content: center</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsCenter() { return this._vAlignItemsCenter; } set vAlignItemsCenter(value) { this._vAlignItemsCenter = coerceBooleanProperty(value); } /** * Sets property <code>align-content: start</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsStart() { return this._vAlignItemsStart; } set vAlignItemsStart(value) { this._vAlignItemsStart = coerceBooleanProperty(value); } /** * Sets property <code>align-content: end</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsEnd() { return this._vAlignItemsEnd; } set vAlignItemsEnd(value) { this._vAlignItemsEnd = coerceBooleanProperty(value); } /** * Sets property <code>align-items: baseline</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsBaseline() { return this._vAlignItemsBaseline; } set vAlignItemsBaseline(value) { this._vAlignItemsBaseline = coerceBooleanProperty(value); } /** * Sets property <code>align-items: stretch</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vAlignItemsStretch() { return this._vAlignItemsStretch; } set vAlignItemsStretch(value) { this._vAlignItemsStretch = coerceBooleanProperty(value); } /** * Sets property <code>align-self: center</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfCenter() { return this._vAlignSelfCenter; } set vAlignSelfCenter(value) { this._vAlignSelfCenter = coerceBooleanProperty(value); } /** * Sets property <code>align-self: start</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfStart() { return this._vAlignSelfStart; } set vAlignSelfStart(value) { this._vAlignSelfStart = coerceBooleanProperty(value); } /** * Sets property <code>align-self: end</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfEnd() { return this._vAlignSelfEnd; } set vAlignSelfEnd(value) { this._vAlignSelfEnd = coerceBooleanProperty(value); } /** * Sets property <code>align-self: baseline</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfBaseline() { return this._vAlignSelfBaseline; } set vAlignSelfBaseline(value) { this._vAlignSelfBaseline = coerceBooleanProperty(value); } /** * Sets property <code>align-self: stretch</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfStretch() { return this._vAlignSelfStretch; } set vAlignSelfStretch(value) { this._vAlignSelfStretch = coerceBooleanProperty(value); } /** * Sets property <code>align-self: auto</code>. <br> * This property is also a selector and can be used by itself on the <i>child</i> of a flex element. */ get vAlignSelfAuto() { return this._vAlignSelfAuto; } set vAlignSelfAuto(value) { this._vAlignSelfAuto = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: center</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentCenter() { return this._vJustifyContentCenter; } set vJustifyContentCenter(value) { this._vJustifyContentCenter = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: start</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentStart() { return this._vJustifyContentStart; } set vJustifyContentStart(value) { this._vJustifyContentStart = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: end</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentEnd() { return this._vJustifyContentEnd; } set vJustifyContentEnd(value) { this._vJustifyContentEnd = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: space-between</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentBetween() { return this._vJustifyContentBetween; } set vJustifyContentBetween(value) { this._vJustifyContentBetween = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: space-around</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentAround() { return this._vJustifyContentAround; } set vJustifyContentAround(value) { this._vJustifyContentAround = coerceBooleanProperty(value); } /** * Sets property <code>justify-content: space-evenly</code>. <br> * This property should be used alongside a FlexDirective selector (see selectors above). */ get vJustifyContentEvenly() { return this._vJustifyContentEvenly; } set vJustifyContentEvenly(value) { this._vJustifyContentEvenly = coerceBooleanProperty(value); } /** * Sets property <code>gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties. */ get vGap() { return this._vGap; } set vGap(value) { this._vGap = value; } /** * Sets property <code>column-gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties. */ get vColGap() { return this._vColGap; } set vColGap(value) { this._vColGap = value; } /** * Sets property <code>row-gap</code>. <br>Accepts gap: 0 - 48 and SpacingProperties. */ get vRowGap() { return this._vRowGap; } set vRowGap(value) { this._vRowGap = value; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlexDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: FlexDirective, isStandalone: true, selector: "[vFlex], [vFlexInline], [vGap], [vFlexGrow], [vFlexGrow0], \n [vFlexShrink], [vFlexShrink0], [vFlexBasis], [vAlignSelfStart], [vAlignSelfEnd], \n [vAlignSelfCenter], [vAlignSelfStretch], [vAlignSelfAuto], [vAlignSelfBaseline],", inputs: { vFlex: "vFlex", vFlexInline: "vFlexInline", vFlexCol: "vFlexCol", vFlexColReverse: "vFlexColReverse", vFlexRow: "vFlexRow", vFlexRowReverse: "vFlexRowReverse", vFlexWrap: "vFlexWrap", vFlexWrapReverse: "vFlexWrapReverse", vFlexNoWrap: "vFlexNoWrap", vFlexBasis: "vFlexBasis", vFlexGrow: "vFlexGrow", vFlexGrow0: "vFlexGrow0", vFlexShrink: "vFlexShrink", vFlexShrink0: "vFlexShrink0", vAlignContentCenter: "vAlignContentCenter", vAlignContentStart: "vAlignContentStart", vAlignContentEnd: "vAlignContentEnd", vAlignContentBetween: "vAlignContentBetween", vAlignContentAround: "vAlignContentAround", vAlignContentEvenly: "vAlignContentEvenly", vAlignItemsCenter: "vAlignItemsCenter", vAlignItemsStart: "vAlignItemsStart", vAlignItemsEnd: "vAlignItemsEnd", vAlignItemsBaseline: "vAlignItemsBaseline", vAlignItemsStretch: "vAlignItemsStretch", vAlignSelfCenter: "vAlignSelfCenter", vAlignSelfStart: "vAlignSelfStart", vAlignSelfEnd: "vAlignSelfEnd", vAlignSelfBaseline: "vAlignSelfBaseline", vAlignSelfStretch: "vAlignSelfStretch", vAlignSelfAuto: "vAlignSelfAuto", vJustifyContentCenter: "vJustifyContentCenter", vJustifyContentStart: "vJustifyContentStart", vJustifyContentEnd: "vJustifyContentEnd", vJustifyContentBetween: "vJustifyContentBetween", vJustifyContentAround: "vJustifyContentAround", vJustifyContentEvenly: "vJustifyContentEvenly", vGap: "vGap", vColGap: "vColGap", vRowGap: "vRowGap" }, host: { properties: { "class": "this.hostClasses", "style.flex-basis": "this.hostFlexBasis" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FlexDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: `[vFlex], [vFlexInline], [vGap], [vFlexGrow], [vFlexGrow0], [vFlexShrink], [vFlexShrink0], [vFlexBasis], [vAlignSelfStart], [vAlignSelfEnd], [vAlignSelfCenter], [vAlignSelfStretch], [vAlignSelfAuto], [vAlignSelfBaseline],` }] }], propDecorators: { hostClasses: [{ type: HostBinding, args: ['class'] }], vFlex: [{ type: Input }], vFlexInline: [{ type: Input }], vFlexCol: [{ type: Input }], vFlexColReverse: [{ type: Input }], vFlexRow: [{ type: Input }], vFlexRowReverse: [{ type: Input }], vFlexWrap: [{ type: Input }], vFlexWrapReverse: [{ type: Input }], vFlexNoWrap: [{ type: Input }], vFlexBasis: [{ type: Input }], hostFlexBasis: [{ type: HostBinding, args: ['style.flex-basis'] }], vFlexGrow: [{ type: Input }], vFlexGrow0: [{ type: Input }], vFlexShrink: [{ type: Input }], vFlexShrink0: [{ type: Input }], vAlignContentCenter: [{ type: Input }], vAlignContentStart: [{ type: Input }], vAlignContentEnd: [{ type: Input }], vAlignContentBetween: [{ type: Input }], vAlignContentAround: [{ type: Input }], vAlignContentEvenly: [{ type: Input }], vAlignItemsCenter: [{ type: Input }], vAlignItemsStart: [{ type: Input }], vAlignItemsEnd: [{ type: Input }], vAlignItemsBaseline: [{ type: Input }], vAlignItemsStretch: [{ type: Input }], vAlignSelfCenter: [{ type: Input }], vAlignSelfStart: [{ type: Input }], vAlignSelfEnd: [{ type: Input }], vAlignSelfBaseline: [{ type: Input }], vAlignSelfStretch: [{ type: Input }], vAlignSelfAuto: [{ type: Input }], vJustifyContentCenter: [{ type: Input }], vJustifyContentStart: [{ type: Input }], vJustifyContentEnd: [{ type: Input }], vJustifyContentBetween: [{ type: Input }], vJustifyContentAround: [{ type: Input }], vJustifyContentEvenly: [{ type: Input }], vGap: [{ type: Input }], vColGap: [{ type: Input }], vRowGap: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvZmxleC9mbGV4LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQUUscUJBQXFCLEVBQTZCLE1BQU0sdUJBQXVCLENBQUM7QUFDekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVM5RCxNQUFNLE9BQU8sYUFBYTtJQUN4QixJQUNJLFdBQVc7UUFDYixPQUFPO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEQsSUFB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ZUYsVUFBVTtzQkFEYixLQUFLO2dCQVNGLGFBQWE7c0JBRGhCLFdBQVc7dUJBQUMsa0JBQWtCO2dCQVUzQixTQUFTO3NCQURaLEtBQUs7Z0JBY0YsVUFBVTtzQkFEYixLQUFLO2dCQWNGLFdBQVc7c0JBRGQsS0FBSztnQkFjRixZQUFZO3NCQURmLEtBQUs7Z0JBY0YsbUJBQW1CO3NCQUR0QixLQUFLO2dCQWNGLGtCQUFrQjtzQkFEckIsS0FBSztnQkFjRixnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBY0Ysb0JBQW9CO3NCQUR2QixLQUFLO2dCQWNGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFjRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBY0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFjRixjQUFjO3NCQURqQixLQUFLO2dCQWNGLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0YsZ0JBQWdCO3NCQURuQixLQUFLO2dCQWNGLGVBQWU7c0JBRGxCLEtBQUs7Z0JBY0YsYUFBYTtzQkFEaEIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0YsaUJBQWlCO3NCQURwQixLQUFLO2dCQWNGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBY0YscUJBQXFCO3NCQUR4QixLQUFLO2dCQWNGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFjRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBY0Ysc0JBQXNCO3NCQUR6QixLQUFLO2dCQWNGLHFCQUFxQjtzQkFEeEIsS0FBSztnQkFjRixxQkFBcUI7c0JBRHhCLEtBQUs7Z0JBYUYsSUFBSTtzQkFEUCxLQUFLO2dCQWFGLE9BQU87c0JBRFYsS0FBSztnQkFhRixPQUFPO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSwgQm9vbGVhbklucHV0LCBOdW1iZXJJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RCaW5kaW5nLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3BhY2luZ1Byb3BlcnRpZXMgfSBmcm9tICcuLi9ub3ZhLWxpYi5jb25zdGFudHMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6IGBbdkZsZXhdLCBbdkZsZXhJbmxpbmVdLCBbdkdhcF0sIFt2RmxleEdyb3ddLCBbdkZsZXhHcm93MF0sIFxuICBbdkZsZXhTaHJpbmtdLCBbdkZsZXhTaHJpbmswXSwgW3ZGbGV4QmFzaXNdLCBbdkFsaWduU2VsZlN0YXJ0XSwgW3ZBbGlnblNlbGZFbmRdLCBcbiAgW3ZBbGlnblNlbGZDZW50ZXJdLCBbdkFsaWduU2VsZlN0cmV0Y2hdLCBbdkFsaWduU2VsZkF1dG9dLCBbdkFsaWduU2VsZkJhc2VsaW5lXSxgXG59KVxuZXhwb3J0IGNsYXNzIEZsZXhEaXJlY3RpdmUge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMudkZsZXggPyAodGhpcy52RmxleENvbCA/ICd2LWZsZXgnIDogJ3YtZmxleCB2LWZsZXgtcm93JykgOiBudWxsLFxuICAgICAgdGhpcy52RmxleElubGluZSA/ICd2LWZsZXgtaW5saW5lJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4Q29sID8gJ3YtZmxleC1jb2wnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhDb2xSZXZlcnNlID8gJ3YtZmxleC1jb2wtcmV2ZXJzZScgOiBudWxsLFxuICAgICAgdGhpcy52RmxleFJvdyA/ICd2LWZsZXgtcm93JyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4Um93UmV2ZXJzZSA/ICd2LWZsZXgtcm93LXJldmVyc2UnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhXcmFwID8gJ3YtZmxleC13cmFwJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4V3JhcFJldmVyc2UgPyAndi1mbGV4LXdyYXAtcmV2ZXJzZScgOiBudWxsLFxuICAgICAgdGhpcy52RmxleE5vV3JhcCA/ICd2LWZsZXgtbm93cmFwJyA6IG51bGwsXG4gICAgICB0aGlzLnZGbGV4R3JvdyA/ICd2LWZsZXgtZ3JvdycgOiBudWxsLFxuICAgICAgdGhpcy52RmxleEdyb3cwID8gJ3YtZmxleC1ncm93LTAnIDogbnVsbCxcbiAgICAgIHRoaXMudkZsZXhTaHJpbmsgPyAndi1mbGV4LXNocmluaycgOiBudWxsLFxuICAgICAgdGhpcy52RmxleFNocmluazAgPyAndi1mbGV4LXNocmluay0wJyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRDZW50ZXIgPyAndi1hbGlnbi1jb250ZW50LWNlbnRlcicgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25Db250ZW50U3RhcnQgPyAndi1hbGlnbi1jb250ZW50LXN0YXJ0JyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkNvbnRlbnRFbmQgPyAndi1hbGlnbi1jb250ZW50LWVuZCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25Db250ZW50QmV0d2VlbiA/ICd2LWFsaWduLWNvbnRlbnQtYmV0d2VlbicgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25Db250ZW50QXJvdW5kID8gJ3YtYWxpZ24tY29udGVudC1hcm91bmQnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduQ29udGVudEV2ZW5seSA/ICd2LWFsaWduLWNvbnRlbnQtZXZlbmx5JyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnbkl0ZW1zU3RhcnQgPyAndi1hbGlnbi1pdGVtcy1zdGFydCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25JdGVtc0VuZCA/ICd2LWFsaWduLWl0ZW1zLWVuZCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25JdGVtc0NlbnRlciA/ICd2LWFsaWduLWl0ZW1zLWNlbnRlcicgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25JdGVtc0Jhc2VsaW5lID8gJ3YtYWxpZ24taXRlbXMtYmFzZWxpbmUnIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduSXRlbXNTdHJldGNoID8gJ3YtYWxpZ24taXRlbXMtc3RyZXRjaCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmU3RhcnQgPyAndi1hbGlnbi1zZWxmLXN0YXJ0JyA6IG51bGwsXG4gICAgICB0aGlzLnZBbGlnblNlbGZFbmQgPyAndi1hbGlnbi1zZWxmLWVuZCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmQ2VudGVyID8gJ3YtYWxpZ24tc2VsZi1jZW50ZXInIDogbnVsbCxcbiAgICAgIHRoaXMudkFsaWduU2VsZkJhc2VsaW5lID8gJ3YtYWxpZ24tc2VsZi1iYXNlbGluZScgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmU3RyZXRjaCA/ICd2LWFsaWduLXNlbGYtc3RyZXRjaCcgOiBudWxsLFxuICAgICAgdGhpcy52QWxpZ25TZWxmQXV0byA/ICd2LWFsaWduLXNlbGYtYXV0bycgOiBudWxsLFxuICAgICAgdGhpcy52SnVzdGlmeUNvbnRlbnRTdGFydCA/ICd2LWp1c3RpZnktY29udGVudC1zdGFydCcgOiBudWxsLFxuICAgICAgdGhpcy52SnVzdGlmeUNvbnRlbnRFbmQgPyAndi1qdXN0aWZ5LWNvbnRlbnQtZW5kJyA6IG51bGwsXG4gICAgICB0aGlzLnZKdXN0aWZ5Q29udGVudENlbnRlciA/ICd2LWp1c3RpZnktY29udGVudC1jZW50ZXInIDogbnVsbCxcbiAgICAgIHRoaXMudkp1c3RpZnlDb250ZW50QmV0d2VlbiA/ICd2LWp1c3RpZnktY29udGVudC1iZXR3ZWVuJyA6IG51bGwsXG4gICAgICB0aGlzLnZKdXN0aWZ5Q29udGVudEFyb3VuZCA/ICd2LWp1c3RpZnktY29udGVudC1hcm91bmQnIDogbnVsbCxcbiAgICAgIHRoaXMudkp1c3RpZnlDb250ZW50RXZlbmx5ID8gJ3YtanVzdGlmeS1jb250ZW50LWV2ZW5seScgOiBudWxsLFxuICAgICAgdGhpcy52R2FwID8gYHYtZmxleCB2LWdhcC0ke3RoaXMudkdhcH1gIDogbnVsbCwgLy8gdkdhcD1cIjRcIlxuICAgICAgdGhpcy52Q29sR2FwID8gYHYtY29sLWdhcC0ke3RoaXMudkNvbEdhcH1gIDogbnVsbCwgLy8gdkdhcD1cIjRcIlxuICAgICAgdGhpcy52Um93R2FwID8gYHYtcm93LWdhcC0ke3RoaXMudlJvd0dhcH1gIDogbnVsbCAvLyB2R2FwPVwiNFwiXG4gICAgXS5qb2luKCcgJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5kaXNwbGF5OiBmbGV4PC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsc28gYSBzZWxlY3RvciBhbmQgY2FuIGJlIHVzZWQgYnkgaXRzZWxmIG9uIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleDtcbiAgfVxuICBzZXQgdkZsZXgodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXg6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZGlzcGxheTogaW5saW5lLWZsZXg8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYWxzbyBhIHNlbGVjdG9yIGFuZCBjYW4gYmUgdXNlZCBieSBpdHNlbGYgb24gYSBmbGV4IGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhJbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4SW5saW5lO1xuICB9XG4gIHNldCB2RmxleElubGluZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhJbmxpbmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleElubGluZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWRpcmVjdGlvbjogY29sdW1uPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Q29sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleENvbDtcbiAgfVxuICBzZXQgdkZsZXhDb2wodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Q29sID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhDb2w6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Q29sUmV2ZXJzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhDb2xSZXZlcnNlO1xuICB9XG4gIHNldCB2RmxleENvbFJldmVyc2UodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Q29sUmV2ZXJzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4Q29sUmV2ZXJzZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWRpcmVjdGlvbjogcm93PC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Um93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleFJvdztcbiAgfVxuICBzZXQgdkZsZXhSb3codmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Um93ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhSb3c6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4Um93UmV2ZXJzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhSb3dSZXZlcnNlO1xuICB9XG4gIHNldCB2RmxleFJvd1JldmVyc2UodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4Um93UmV2ZXJzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4Um93UmV2ZXJzZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LXdyYXA6IHdyYXA8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgYWxvbmdzaWRlIGEgRmxleERpcmVjdGl2ZSBzZWxlY3RvciAoc2VlIHNlbGVjdG9ycyBhYm92ZSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdkZsZXhXcmFwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleFdyYXA7XG4gIH1cbiAgc2V0IHZGbGV4V3JhcCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fdkZsZXhXcmFwID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhXcmFwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtd3JhcDogd3JhcC1yZXZlcnNlPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4V3JhcFJldmVyc2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4V3JhcFJldmVyc2U7XG4gIH1cbiAgc2V0IHZGbGV4V3JhcFJldmVyc2UodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4V3JhcFJldmVyc2UgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFdyYXBSZXZlcnNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtd3JhcDogbm8td3JhcDwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZCBhbG9uZ3NpZGUgYSBGbGV4RGlyZWN0aXZlIHNlbGVjdG9yIChzZWUgc2VsZWN0b3JzIGFib3ZlKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleE5vV3JhcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhOb1dyYXA7XG4gIH1cbiAgc2V0IHZGbGV4Tm9XcmFwKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleE5vV3JhcCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4Tm9XcmFwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtYmFzaXM6ICZsdDt2YWx1ZSZndDs8L2NvZGU+LiA8YnI+XG4gICAqIEFjY2VwdHMgYSBzdHJpbmcgdGhhdCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gb2YgYSBwZXJjZW50YWdlIG9yIENTUyB1bml0LiA8YnIgLz5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4QmFzaXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhCYXNpcztcbiAgfVxuICBzZXQgdkZsZXhCYXNpcyh2YWx1ZSkge1xuICAgIHRoaXMuX3ZGbGV4QmFzaXMgPSB2YWx1ZTtcbiAgfVxuICBfdkZsZXhCYXNpczogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmZsZXgtYmFzaXMnKVxuICBnZXQgaG9zdEZsZXhCYXNpcygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy52RmxleEJhc2lzID8gdGhpcy52RmxleEJhc2lzIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmZsZXgtZ3JvdzogMTwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4R3JvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkZsZXhHcm93O1xuICB9XG4gIHNldCB2RmxleEdyb3codmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4R3JvdyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZGbGV4R3JvdzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LWdyb3c6IDA8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYWxzbyBhIHNlbGVjdG9yIGFuZCBjYW4gYmUgdXNlZCBieSBpdHNlbGYgb24gdGhlIDxpPmNoaWxkPC9pPiBvZiBhIGZsZXggZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleEdyb3cwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleEdyb3cwO1xuICB9XG4gIHNldCB2RmxleEdyb3cwKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleEdyb3cwID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhHcm93MDogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V0cyBwcm9wZXJ0eSA8Y29kZT5mbGV4LXNocmluazogMTwvY29kZT4uIDxicj5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHNvIGEgc2VsZWN0b3IgYW5kIGNhbiBiZSB1c2VkIGJ5IGl0c2VsZiBvbiB0aGUgPGk+Y2hpbGQ8L2k+IG9mIGEgZmxleCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZGbGV4U2hyaW5rKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl92RmxleFNocmluaztcbiAgfVxuICBzZXQgdkZsZXhTaHJpbmsodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZGbGV4U2hyaW5rID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfdkZsZXhTaHJpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+ZmxleC1zaHJpbms6IDA8L2NvZGU+LiA8YnI+XG4gICAqIFRoaXMgcHJvcGVydHkgaXMgYWxzbyBhIHNlbGVjdG9yIGFuZCBjYW4gYmUgdXNlZCBieSBpdHNlbGYgb24gdGhlIDxpPmNoaWxkPC9pPiBvZiBhIGZsZXggZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2RmxleFNocmluazAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZGbGV4U2hyaW5rMDtcbiAgfVxuICBzZXQgdkZsZXhTaHJpbmswKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl92RmxleFNocmluazAgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92RmxleFNocmluazA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgcHJvcGVydHkgPGNvZGU+YWxpZ24tY29udGVudDogY2VudGVyPC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZBbGlnbkNvbnRlbnRDZW50ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZBbGlnbkNvbnRlbnRDZW50ZXI7XG4gIH1cbiAgc2V0IHZBbGlnbkNvbnRlbnRDZW50ZXIodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZBbGlnbkNvbnRlbnRDZW50ZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF92QWxpZ25Db250ZW50Q2VudGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHByb3BlcnR5IDxjb2RlPmFsaWduLWNvbnRlbnQ6IHN0YXJ0PC9jb2RlPi4gPGJyPlxuICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGFsb25nc2lkZSBhIEZsZXhEaXJlY3RpdmUgc2VsZWN0b3IgKHNlZSBzZWxlY3RvcnMgYWJvdmUpLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHZBbGlnbkNvbnRlbnRTdGFydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdkFsaWduQ29udGVudFN0YXJ0O1xuICB9XG4gIHNldCB2QWxpZ25Db250ZW50U3RhcnQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3ZBbGlnbkNvbnRlbnRTdGFydCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3ZBbGln