UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

466 lines 37.9 kB
import { __decorate, __metadata, __param } from "tslib"; import { CommonModule } from '@angular/common'; import { Component, Directive, HostBinding, Optional, Inject, Input, NgModule } from '@angular/core'; import { IgxButtonModule } from '../directives/button/button.directive'; var NEXT_ID = 0; /** * IgxCardMedia is container for the card media section. * Use it to wrap images and videos. */ var IgxCardMediaDirective = /** @class */ (function () { function IgxCardMediaDirective() { /** * @hidden */ this.cssClass = 'igx-card__media'; /** * An @Input property that sets the `width` and `min-width` style property * of the media container. If not provided it will be set to `auto`. * ```html * <igx-card-media width="300px"></igx-card-media> * ``` */ this.width = 'auto'; /** * An @Input property that sets the `height` style property of the media container. * If not provided it will be set to `auto`. * ```html * <igx-card-media height="50%"></igx-card-media> * ``` */ this.height = 'auto'; /** * An @Input property that sets the `role` attribute of the media container. */ this.role = 'img'; } __decorate([ HostBinding('class.igx-card__media'), __metadata("design:type", Object) ], IgxCardMediaDirective.prototype, "cssClass", void 0); __decorate([ HostBinding('style.width'), HostBinding('style.min-width'), Input(), __metadata("design:type", Object) ], IgxCardMediaDirective.prototype, "width", void 0); __decorate([ HostBinding('style.height'), Input(), __metadata("design:type", Object) ], IgxCardMediaDirective.prototype, "height", void 0); __decorate([ HostBinding('attr.role'), Input(), __metadata("design:type", Object) ], IgxCardMediaDirective.prototype, "role", void 0); IgxCardMediaDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: 'igx-card-media' }) ], IgxCardMediaDirective); return IgxCardMediaDirective; }()); export { IgxCardMediaDirective }; /** * IgxCardHeader is container for the card header */ var IgxCardHeaderComponent = /** @class */ (function () { function IgxCardHeaderComponent() { /** * @hidden */ this.cssClass = 'igx-card-header'; /** * An @Input property that sets the layout style of the header. * By default the header elements(thumbnail and title/subtitle) are aligned horizontally. * ```html * <igx-card-header [vertical]="true"></igx-card-header> * ``` */ this.vertical = false; /** * An @Input property that sets the value of the `role` attribute of the card header. * By default the value is set to `header`. * ```html * <igx-card-header role="header"></igx-card-header> * ``` */ this.role = 'header'; } __decorate([ HostBinding('class.igx-card-header'), __metadata("design:type", Object) ], IgxCardHeaderComponent.prototype, "cssClass", void 0); __decorate([ HostBinding('class.igx-card-header--vertical'), Input(), __metadata("design:type", Object) ], IgxCardHeaderComponent.prototype, "vertical", void 0); __decorate([ HostBinding('attr.role'), __metadata("design:type", Object) ], IgxCardHeaderComponent.prototype, "role", void 0); IgxCardHeaderComponent = __decorate([ Component({ selector: 'igx-card-header', template: "<div class=\"igx-card-header__thumbnail\">\n <ng-content select=\"igx-avatar, igx-card-media, [igxCardThumbnail]\"></ng-content>\n</div>\n\n<div class=\"igx-card-header__titles\">\n <ng-content select=\"\n [igxCardHeaderTitle],\n [igxCardHeaderSubtitle],\n .igx-card-header__title,\n .igx-card-header__subtitle\">\n </ng-content>\n</div>\n\n<ng-content></ng-content>\n" }) ], IgxCardHeaderComponent); return IgxCardHeaderComponent; }()); export { IgxCardHeaderComponent }; /** * IgxCardThumbnail is container for the card thumbnail section. * Use it to wrap anything you want to be used as a thumbnail. */ var IgxCardThumbnailDirective = /** @class */ (function () { function IgxCardThumbnailDirective() { } IgxCardThumbnailDirective = __decorate([ Directive({ selector: '[igxCardThumbnail]' }) ], IgxCardThumbnailDirective); return IgxCardThumbnailDirective; }()); export { IgxCardThumbnailDirective }; /** * igxCardHeaderTitle is used to denote the header title in a card. * Use it to tag text nodes. */ var IgxCardHeaderTitleDirective = /** @class */ (function () { function IgxCardHeaderTitleDirective() { /** * @hidden */ this.cssClass = 'igx-card__header__title'; } __decorate([ HostBinding('class.igx-card-header__title'), __metadata("design:type", Object) ], IgxCardHeaderTitleDirective.prototype, "cssClass", void 0); IgxCardHeaderTitleDirective = __decorate([ Directive({ selector: '[igxCardHeaderTitle]' }) ], IgxCardHeaderTitleDirective); return IgxCardHeaderTitleDirective; }()); export { IgxCardHeaderTitleDirective }; /** * igxCardHeaderSubtitle is used to denote the header subtitle in a card. * Use it to tag text nodes. */ var IgxCardHeaderSubtitleDirective = /** @class */ (function () { function IgxCardHeaderSubtitleDirective() { /** * @hidden */ this.cssClass = 'igx-card-header__subtitle'; } __decorate([ HostBinding('class.igx-card-header__subtitle'), __metadata("design:type", Object) ], IgxCardHeaderSubtitleDirective.prototype, "cssClass", void 0); IgxCardHeaderSubtitleDirective = __decorate([ Directive({ selector: '[igxCardHeaderSubtitle]' }) ], IgxCardHeaderSubtitleDirective); return IgxCardHeaderSubtitleDirective; }()); export { IgxCardHeaderSubtitleDirective }; /** * IgxCardContent is container for the card content. */ var IgxCardContentDirective = /** @class */ (function () { function IgxCardContentDirective() { /** * @hidden */ this.cssClass = 'igx-card-content'; } __decorate([ HostBinding('class.igx-card-content'), __metadata("design:type", Object) ], IgxCardContentDirective.prototype, "cssClass", void 0); IgxCardContentDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: 'igx-card-content' }) ], IgxCardContentDirective); return IgxCardContentDirective; }()); export { IgxCardContentDirective }; /** * IgxCardFooter is container for the card footer */ var IgxCardFooterDirective = /** @class */ (function () { function IgxCardFooterDirective() { /** * An @Input property that sets the value of the `role` attribute of the card footer. * By default the value is set to `footer`. * ```html * <igx-card-footer role="footer"></igx-card-footer> * ``` */ this.role = 'footer'; } __decorate([ HostBinding('attr.role'), Input(), __metadata("design:type", Object) ], IgxCardFooterDirective.prototype, "role", void 0); IgxCardFooterDirective = __decorate([ Directive({ // tslint:disable-next-line:directive-selector selector: 'igx-card-footer' }) ], IgxCardFooterDirective); return IgxCardFooterDirective; }()); export { IgxCardFooterDirective }; /** * **Ignite UI for Angular Card** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/card.html) * * The Ignite UI Card serves as a container that allows custom content to be organized in an appealing way. There are * five sections in a card that you can use to organize your content. These are header, media, content, actions, and footer. * * Example: * ```html * <igx-card> * <igx-card-header> * <h3 igxCardHeaderTitle>{{title}}</h3> * <h5 igxCardHeaderSubtitle>{{subtitle}}</h5> * </igx-card-header> * <igx-card-actions> * <button igxButton igxRipple>Share</button> * <button igxButton igxRipple>Play Album</button> * </igx-card-actions> * </igx-card> * ``` */ export var IgxCardType; (function (IgxCardType) { IgxCardType["DEFAULT"] = "default"; IgxCardType["OUTLINED"] = "outlined"; })(IgxCardType || (IgxCardType = {})); var IgxCardComponent = /** @class */ (function () { function IgxCardComponent() { /** * Sets/gets the `id` of the card. * If not set, `id` will have value `"igx-card-0"`; * ```html * <igx-card id = "my-first-card"></igx-card> * ``` * ```typescript * let cardId = this.card.id; * ``` * @memberof IgxCardComponent */ this.id = "igx-card-" + NEXT_ID++; /** * An @Input property that sets the value of the `role` attribute of the card. * By default the value is set to `group`. * ```html * <igx-card role="group"></igx-card> * ``` */ this.role = 'group'; /** * An @Input property that sets the value of the `type` attribute of the card. * By default the value is set to `default`. You can make the card use the * outlined style by setting the value to `outlined`. * ```html * <igx-card type="outlined"></igx-card> * ``` */ this.type = IgxCardType.DEFAULT; /** * An @Input property that sets the value of the `horizontal` attribute of the card. * Setting this to `true` will make the different card sections align horizontally, * essentially flipping the card to the side. * ```html * <igx-card [horizontal]="true"></igx-card> * ``` */ this.horizontal = false; } Object.defineProperty(IgxCardComponent.prototype, "isOutlinedCard", { /** * A getter which will return true if the card type is `outlined`. */ get: function () { return this.type === IgxCardType.OUTLINED; }, enumerable: true, configurable: true }); __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxCardComponent.prototype, "id", void 0); __decorate([ HostBinding('attr.role'), Input(), __metadata("design:type", Object) ], IgxCardComponent.prototype, "role", void 0); __decorate([ HostBinding('class.igx-card'), Input(), __metadata("design:type", String) ], IgxCardComponent.prototype, "type", void 0); __decorate([ HostBinding('class.igx-card--outlined'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxCardComponent.prototype, "isOutlinedCard", null); __decorate([ HostBinding('class.igx-card--horizontal'), Input(), __metadata("design:type", Object) ], IgxCardComponent.prototype, "horizontal", void 0); IgxCardComponent = __decorate([ Component({ selector: 'igx-card', template: "<ng-container select='igx-card-media'></ng-container>\n\n<ng-container select='igx-card-header'></ng-container>\n<ng-container select='igx-card-content'>\n <ng-content></ng-content>\n</ng-container>\n\n<ng-container select='igx-card-actions'></ng-container>\n" }) ], IgxCardComponent); return IgxCardComponent; }()); export { IgxCardComponent }; export var IgxCardActionsLayout; (function (IgxCardActionsLayout) { IgxCardActionsLayout["DEFAULT"] = "default"; IgxCardActionsLayout["JUSTIFY"] = "justify"; })(IgxCardActionsLayout || (IgxCardActionsLayout = {})); /** * IgxCardActions is container for the card actions. */ var IgxCardActionsComponent = /** @class */ (function () { function IgxCardActionsComponent(card) { this.card = card; this.isVerticalSet = false; /** * An @Input property that sets the layout style of the actions. * By default icons and icon buttons, as well as regular buttons * are split into two containers, which are then positioned on both ends * of the card-actions area. * You can justify the elements in those groups so they are positioned equally * from one another taking up all the space available along the card actions axis. * ```html * <igx-card-actions layout="justify"></igx-card-actions> * ``` */ this.layout = 'default'; /** * An @Input property that sets order of the buttons the actions area. * By default all icons/icon buttons are placed at the end of the action * area. Any regular buttons(flat, raised) will appear before the icons/icon buttons * placed in the actions area. * If you want to reverse their positions so that icons appear first, use the `reverse` * attribute. * ```html * <igx-card-actions [reverse]="true"></igx-card-actions> * ``` */ this.reverse = false; } Object.defineProperty(IgxCardActionsComponent.prototype, "isJustifyLayout", { /** * A getter that returns `true` when the layout has been * set to `justify`. */ get: function () { return this.layout === IgxCardActionsLayout.JUSTIFY; }, enumerable: true, configurable: true }); IgxCardActionsComponent.prototype.ngOnChanges = function (changes) { for (var prop in changes) { if (prop === 'vertical') { this.isVerticalSet = true; } } }; IgxCardActionsComponent.prototype.ngOnInit = function () { this.vertical = !this.isVerticalSet && this.card.horizontal; }; IgxCardActionsComponent.ctorParameters = function () { return [ { type: IgxCardComponent, decorators: [{ type: Optional }, { type: Inject, args: [IgxCardComponent,] }] } ]; }; __decorate([ HostBinding('class.igx-card-actions'), Input(), __metadata("design:type", String) ], IgxCardActionsComponent.prototype, "layout", void 0); __decorate([ HostBinding('class.igx-card-actions--vertical'), Input(), __metadata("design:type", Boolean) ], IgxCardActionsComponent.prototype, "vertical", void 0); __decorate([ HostBinding('class.igx-card-actions--justify'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxCardActionsComponent.prototype, "isJustifyLayout", null); __decorate([ HostBinding('class.igx-card-actions--reverse'), Input(), __metadata("design:type", Object) ], IgxCardActionsComponent.prototype, "reverse", void 0); IgxCardActionsComponent = __decorate([ Component({ // tslint:disable-next-line:directive-selector selector: 'igx-card-actions', template: "<div class=\"igx-card-actions__icons\">\n <ng-content select=\"igx-icon, [igxButton='icon']\"></ng-content>\n</div>\n\n<div #buttons class=\"igx-card-actions__buttons\">\n <ng-content select=\"[igxButton]\"></ng-content>\n</div>\n\n\n<ng-content></ng-content>\n" }), __param(0, Optional()), __param(0, Inject(IgxCardComponent)), __metadata("design:paramtypes", [IgxCardComponent]) ], IgxCardActionsComponent); return IgxCardActionsComponent; }()); export { IgxCardActionsComponent }; /** * @hidden */ var IgxCardModule = /** @class */ (function () { function IgxCardModule() { } IgxCardModule = __decorate([ NgModule({ declarations: [ IgxCardComponent, IgxCardHeaderComponent, IgxCardMediaDirective, IgxCardContentDirective, IgxCardActionsComponent, IgxCardFooterDirective, IgxCardHeaderTitleDirective, IgxCardHeaderSubtitleDirective, IgxCardThumbnailDirective, ], exports: [ IgxCardComponent, IgxCardHeaderComponent, IgxCardMediaDirective, IgxCardContentDirective, IgxCardActionsComponent, IgxCardFooterDirective, IgxCardHeaderTitleDirective, IgxCardHeaderSubtitleDirective, IgxCardThumbnailDirective, ], imports: [CommonModule, IgxButtonModule] }) ], IgxCardModule); return IgxCardModule; }()); export { IgxCardModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2NhcmQvY2FyZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxXQUFXLEVBQ1gsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxFQUlYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFaEI7OztHQUdHO0FBS0g7SUFBQTtRQUNJOztXQUVHO1FBRUksYUFBUSxHQUFHLGlCQUFpQixDQUFDO1FBRXBDOzs7Ozs7V0FNRztRQUlJLFVBQUssR0FBRyxNQUFNLENBQUM7UUFFdEI7Ozs7OztXQU1HO1FBR0ksV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUV2Qjs7V0FFRztRQUdJLFNBQUksR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQS9CRztRQURDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQzs7MkRBQ0Q7SUFZcEM7UUFIQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQzFCLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QixLQUFLLEVBQUU7O3dEQUNjO0lBV3RCO1FBRkMsV0FBVyxDQUFDLGNBQWMsQ0FBQztRQUMzQixLQUFLLEVBQUU7O3lEQUNlO0lBT3ZCO1FBRkMsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUN4QixLQUFLLEVBQUU7O3VEQUNZO0lBbkNYLHFCQUFxQjtRQUpqQyxTQUFTLENBQUM7WUFDUCw4Q0FBOEM7WUFDOUMsUUFBUSxFQUFFLGdCQUFnQjtTQUM3QixDQUFDO09BQ1cscUJBQXFCLENBb0NqQztJQUFELDRCQUFDO0NBQUEsQUFwQ0QsSUFvQ0M7U0FwQ1kscUJBQXFCO0FBc0NsQzs7R0FFRztBQUtIO0lBQUE7UUFDSTs7V0FFRztRQUVJLGFBQVEsR0FBRyxpQkFBaUIsQ0FBQztRQUVwQzs7Ozs7O1dBTUc7UUFHSSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXhCOzs7Ozs7V0FNRztRQUVJLFNBQUksR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQXRCRztRQURDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQzs7NERBQ0Q7SUFXcEM7UUFGQyxXQUFXLENBQUMsaUNBQWlDLENBQUM7UUFDOUMsS0FBSyxFQUFFOzs0REFDZ0I7SUFVeEI7UUFEQyxXQUFXLENBQUMsV0FBVyxDQUFDOzt3REFDRjtJQTFCZCxzQkFBc0I7UUFKbEMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixpYUFBeUM7U0FDNUMsQ0FBQztPQUNXLHNCQUFzQixDQTJCbEM7SUFBRCw2QkFBQztDQUFBLEFBM0JELElBMkJDO1NBM0JZLHNCQUFzQjtBQTZCbkM7OztHQUdHO0FBSUg7SUFBQTtJQUF5QyxDQUFDO0lBQTdCLHlCQUF5QjtRQUhyQyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsb0JBQW9CO1NBQ2pDLENBQUM7T0FDVyx5QkFBeUIsQ0FBSTtJQUFELGdDQUFDO0NBQUEsQUFBMUMsSUFBMEM7U0FBN0IseUJBQXlCO0FBRXRDOzs7R0FHRztBQUlIO0lBQUE7UUFDSTs7V0FFRztRQUVJLGFBQVEsR0FBRyx5QkFBeUIsQ0FBQztJQUNoRCxDQUFDO0lBREc7UUFEQyxXQUFXLENBQUMsOEJBQThCLENBQUM7O2lFQUNBO0lBTG5DLDJCQUEyQjtRQUh2QyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsc0JBQXNCO1NBQ25DLENBQUM7T0FDVywyQkFBMkIsQ0FNdkM7SUFBRCxrQ0FBQztDQUFBLEFBTkQsSUFNQztTQU5ZLDJCQUEyQjtBQVF4Qzs7O0dBR0c7QUFJSDtJQUFBO1FBQ0k7O1dBRUc7UUFFSSxhQUFRLEdBQUcsMkJBQTJCLENBQUM7SUFDbEQsQ0FBQztJQURHO1FBREMsV0FBVyxDQUFDLGlDQUFpQyxDQUFDOztvRUFDRDtJQUxyQyw4QkFBOEI7UUFIMUMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLHlCQUF5QjtTQUN0QyxDQUFDO09BQ1csOEJBQThCLENBTTFDO0lBQUQscUNBQUM7Q0FBQSxBQU5ELElBTUM7U0FOWSw4QkFBOEI7QUFPM0M7O0dBRUc7QUFLSDtJQUFBO1FBQ0k7O1dBRUc7UUFFSSxhQUFRLEdBQUcsa0JBQWtCLENBQUM7SUFDekMsQ0FBQztJQURHO1FBREMsV0FBVyxDQUFDLHdCQUF3QixDQUFDOzs2REFDRDtJQUw1Qix1QkFBdUI7UUFKbkMsU0FBUyxDQUFDO1lBQ1AsOENBQThDO1lBQzlDLFFBQVEsRUFBRSxrQkFBa0I7U0FDL0IsQ0FBQztPQUNXLHVCQUF1QixDQU1uQztJQUFELDhCQUFDO0NBQUEsQUFORCxJQU1DO1NBTlksdUJBQXVCO0FBUXBDOztHQUVHO0FBS0g7SUFBQTtRQUNJOzs7Ozs7V0FNRztRQUdJLFNBQUksR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQURHO1FBRkMsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUN4QixLQUFLLEVBQUU7O3dEQUNlO0lBVmQsc0JBQXNCO1FBSmxDLFNBQVMsQ0FBQztZQUNQLDhDQUE4QztZQUM5QyxRQUFRLEVBQUUsaUJBQWlCO1NBQzlCLENBQUM7T0FDVyxzQkFBc0IsQ0FXbEM7SUFBRCw2QkFBQztDQUFBLEFBWEQsSUFXQztTQVhZLHNCQUFzQjtBQWFuQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLENBQU4sSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ25CLGtDQUFtQixDQUFBO0lBQ25CLG9DQUFxQixDQUFBO0FBQ3pCLENBQUMsRUFIVyxXQUFXLEtBQVgsV0FBVyxRQUd0QjtBQU1EO0lBQUE7UUFDSTs7Ozs7Ozs7OztXQVVHO1FBR0ksT0FBRSxHQUFHLGNBQVksT0FBTyxFQUFJLENBQUM7UUFFcEM7Ozs7OztXQU1HO1FBR0ksU0FBSSxHQUFHLE9BQU8sQ0FBQztRQUV0Qjs7Ozs7OztXQU9HO1FBR0ksU0FBSSxHQUF5QixXQUFXLENBQUMsT0FBTyxDQUFDO1FBVXhEOzs7Ozs7O1dBT0c7UUFHSSxlQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFmRyxzQkFBSSw0Q0FBYztRQUpsQjs7V0FFRzthQUVIO1lBQ0ksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxRQUFRLENBQUM7UUFDOUMsQ0FBQzs7O09BQUE7SUEvQkQ7UUFGQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQ3RCLEtBQUssRUFBRTs7Z0RBQzRCO0lBV3BDO1FBRkMsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUN4QixLQUFLLEVBQUU7O2tEQUNjO0lBWXRCO1FBRkMsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1FBQzdCLEtBQUssRUFBRTs7a0RBQ2dEO0lBTXhEO1FBREMsV0FBVyxDQUFDLDBCQUEwQixDQUFDOzs7MERBR3ZDO0lBWUQ7UUFGQyxXQUFXLENBQUMsNEJBQTRCLENBQUM7UUFDekMsS0FBSyxFQUFFOzt3REFDa0I7SUF6RGpCLGdCQUFnQjtRQUo1QixTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsVUFBVTtZQUNwQixrUkFBa0M7U0FDckMsQ0FBQztPQUNXLGdCQUFnQixDQTBENUI7SUFBRCx1QkFBQztDQUFBLEFBMURELElBMERDO1NBMURZLGdCQUFnQjtBQTREN0IsTUFBTSxDQUFOLElBQVksb0JBR1g7QUFIRCxXQUFZLG9CQUFvQjtJQUM1QiwyQ0FBbUIsQ0FBQTtJQUNuQiwyQ0FBbUIsQ0FBQTtBQUN2QixDQUFDLEVBSFcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUcvQjtBQUVEOztHQUVHO0FBTUg7SUFHSSxpQ0FBeUQsSUFBc0I7UUFBdEIsU0FBSSxHQUFKLElBQUksQ0FBa0I7UUFGdkUsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFJOUI7Ozs7Ozs7Ozs7V0FVRztRQUdJLFdBQU0sR0FBa0MsU0FBUyxDQUFDO1FBbUJ6RDs7Ozs7Ozs7OztXQVVHO1FBR0ksWUFBTyxHQUFHLEtBQUssQ0FBQztJQS9DNEQsQ0FBQztJQThCcEYsc0JBQUksb0RBQWU7UUFMbkI7OztXQUdHO2FBRUg7WUFDSSxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssb0JBQW9CLENBQUMsT0FBTyxDQUFDO1FBQ3hELENBQUM7OztPQUFBO0lBaUJELDZDQUFXLEdBQVgsVUFBWSxPQUFzQjtRQUM5QixLQUFLLElBQU0sSUFBSSxJQUFJLE9BQU8sRUFBRTtZQUN4QixJQUFJLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2FBQzdCO1NBQ0o7SUFDTCxDQUFDO0lBRUQsMENBQVEsR0FBUjtRQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ2hFLENBQUM7O2dCQTNEOEQsZ0JBQWdCLHVCQUFsRSxRQUFRLFlBQUksTUFBTSxTQUFDLGdCQUFnQjs7SUFlaEQ7UUFGQyxXQUFXLENBQUMsd0JBQXdCLENBQUM7UUFDckMsS0FBSyxFQUFFOzsyREFDaUQ7SUFRekQ7UUFGQyxXQUFXLENBQUMsa0NBQWtDLENBQUM7UUFDL0MsS0FBSyxFQUFFOzs2REFDaUI7SUFPekI7UUFEQyxXQUFXLENBQUMsaUNBQWlDLENBQUM7OztrRUFHOUM7SUFlRDtRQUZDLFdBQVcsQ0FBQyxpQ0FBaUMsQ0FBQztRQUM5QyxLQUFLLEVBQUU7OzREQUNlO0lBbERkLHVCQUF1QjtRQUxuQyxTQUFTLENBQUM7WUFDUCw4Q0FBOEM7WUFDOUMsUUFBUSxFQUFFLGtCQUFrQjtZQUM1Qix1UkFBMEM7U0FDN0MsQ0FBQztRQUllLFdBQUEsUUFBUSxFQUFFLENBQUEsRUFBRSxXQUFBLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO3lDQUFjLGdCQUFnQjtPQUh0RSx1QkFBdUIsQ0ErRG5DO0lBQUQsOEJBQUM7Q0FBQSxBQS9ERCxJQStEQztTQS9EWSx1QkFBdUI7QUFpRXBDOztHQUVHO0FBMEJIO0lBQUE7SUFBNkIsQ0FBQztJQUFqQixhQUFhO1FBekJ6QixRQUFRLENBQUM7WUFDTixZQUFZLEVBQUU7Z0JBQ1YsZ0JBQWdCO2dCQUNoQixzQkFBc0I7Z0JBQ3RCLHFCQUFxQjtnQkFDckIsdUJBQXVCO2dCQUN2Qix1QkFBdUI7Z0JBQ3ZCLHNCQUFzQjtnQkFDdEIsMkJBQTJCO2dCQUMzQiw4QkFBOEI7Z0JBQzlCLHlCQUF5QjthQUM1QjtZQUNELE9BQU8sRUFBRTtnQkFDTCxnQkFBZ0I7Z0JBQ2hCLHNCQUFzQjtnQkFDdEIscUJBQXFCO2dCQUNyQix1QkFBdUI7Z0JBQ3ZCLHVCQUF1QjtnQkFDdkIsc0JBQXNCO2dCQUN0QiwyQkFBMkI7Z0JBQzNCLDhCQUE4QjtnQkFDOUIseUJBQXlCO2FBQzVCO1lBQ0QsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQztTQUMzQyxDQUFDO09BQ1csYUFBYSxDQUFJO0lBQUQsb0JBQUM7Q0FBQSxBQUE5QixJQUE4QjtTQUFqQixhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIERpcmVjdGl2ZSxcbiAgICBIb3N0QmluZGluZyxcbiAgICBPcHRpb25hbCxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgTmdNb2R1bGUsXG4gICAgT25Jbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4QnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5cbmxldCBORVhUX0lEID0gMDtcblxuLyoqXG4gKiBJZ3hDYXJkTWVkaWEgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCBtZWRpYSBzZWN0aW9uLlxuICogVXNlIGl0IHRvIHdyYXAgaW1hZ2VzIGFuZCB2aWRlb3MuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ2lneC1jYXJkLW1lZGlhJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkTWVkaWFEaXJlY3RpdmUge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkX19tZWRpYScpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1jYXJkX19tZWRpYSc7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBgd2lkdGhgIGFuZCBgbWluLXdpZHRoYCBzdHlsZSBwcm9wZXJ0eVxuICAgICAqIG9mIHRoZSBtZWRpYSBjb250YWluZXIuIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIGJlIHNldCB0byBgYXV0b2AuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZC1tZWRpYSB3aWR0aD1cIjMwMHB4XCI+PC9pZ3gtY2FyZC1tZWRpYT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoJylcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLm1pbi13aWR0aCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2lkdGggPSAnYXV0byc7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBgaGVpZ2h0YCBzdHlsZSBwcm9wZXJ0eSBvZiB0aGUgbWVkaWEgY29udGFpbmVyLlxuICAgICAqIElmIG5vdCBwcm92aWRlZCBpdCB3aWxsIGJlIHNldCB0byBgYXV0b2AuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZC1tZWRpYSBoZWlnaHQ9XCI1MCVcIj48L2lneC1jYXJkLW1lZGlhPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoZWlnaHQgPSAnYXV0byc7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBtZWRpYSBjb250YWluZXIuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvbGUgPSAnaW1nJztcbn1cblxuLyoqXG4gKiBJZ3hDYXJkSGVhZGVyIGlzIGNvbnRhaW5lciBmb3IgdGhlIGNhcmQgaGVhZGVyXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWNhcmQtaGVhZGVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NhcmQtaGVhZGVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkSGVhZGVyQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC1oZWFkZXInKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtY2FyZC1oZWFkZXInO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgbGF5b3V0IHN0eWxlIG9mIHRoZSBoZWFkZXIuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgaGVhZGVyIGVsZW1lbnRzKHRodW1ibmFpbCBhbmQgdGl0bGUvc3VidGl0bGUpIGFyZSBhbGlnbmVkIGhvcml6b250YWxseS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLWhlYWRlciBbdmVydGljYWxdPVwidHJ1ZVwiPjwvaWd4LWNhcmQtaGVhZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtaGVhZGVyLS12ZXJ0aWNhbCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdmVydGljYWwgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBjYXJkIGhlYWRlci5cbiAgICAgKiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyBzZXQgdG8gYGhlYWRlcmAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZC1oZWFkZXIgcm9sZT1cImhlYWRlclwiPjwvaWd4LWNhcmQtaGVhZGVyPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBwdWJsaWMgcm9sZSA9ICdoZWFkZXInO1xufVxuXG4vKipcbiAqIElneENhcmRUaHVtYm5haWwgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCB0aHVtYm5haWwgc2VjdGlvbi5cbiAqIFVzZSBpdCB0byB3cmFwIGFueXRoaW5nIHlvdSB3YW50IHRvIGJlIHVzZWQgYXMgYSB0aHVtYm5haWwuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2lneENhcmRUaHVtYm5haWxdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYXJkVGh1bWJuYWlsRGlyZWN0aXZlIHsgfVxuXG4vKipcbiAqIGlneENhcmRIZWFkZXJUaXRsZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGUgaGVhZGVyIHRpdGxlIGluIGEgY2FyZC5cbiAqIFVzZSBpdCB0byB0YWcgdGV4dCBub2Rlcy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4Q2FyZEhlYWRlclRpdGxlXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2FyZEhlYWRlclRpdGxlRGlyZWN0aXZlIHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC1oZWFkZXJfX3RpdGxlJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNhcmRfX2hlYWRlcl9fdGl0bGUnO1xufVxuXG4vKipcbiAqIGlneENhcmRIZWFkZXJTdWJ0aXRsZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGUgaGVhZGVyIHN1YnRpdGxlIGluIGEgY2FyZC5cbiAqIFVzZSBpdCB0byB0YWcgdGV4dCBub2Rlcy5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4Q2FyZEhlYWRlclN1YnRpdGxlXSdcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2FyZEhlYWRlclN1YnRpdGxlRGlyZWN0aXZlIHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC1oZWFkZXJfX3N1YnRpdGxlJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNhcmQtaGVhZGVyX19zdWJ0aXRsZSc7XG59XG4vKipcbiAqIElneENhcmRDb250ZW50IGlzIGNvbnRhaW5lciBmb3IgdGhlIGNhcmQgY29udGVudC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnaWd4LWNhcmQtY29udGVudCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2FyZENvbnRlbnREaXJlY3RpdmUge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWNvbnRlbnQnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtY2FyZC1jb250ZW50Jztcbn1cblxuLyoqXG4gKiBJZ3hDYXJkRm9vdGVyIGlzIGNvbnRhaW5lciBmb3IgdGhlIGNhcmQgZm9vdGVyXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ2lneC1jYXJkLWZvb3Rlcidcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2FyZEZvb3RlckRpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIGNhcmQgZm9vdGVyLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIHNldCB0byBgZm9vdGVyYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLWZvb3RlciByb2xlPVwiZm9vdGVyXCI+PC9pZ3gtY2FyZC1mb290ZXI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvbGUgPSAnZm9vdGVyJztcbn1cblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBDYXJkKiogLVxuICogW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LmluZnJhZ2lzdGljcy5jb20vcHJvZHVjdHMvaWduaXRlLXVpLWFuZ3VsYXIvYW5ndWxhci9jb21wb25lbnRzL2NhcmQuaHRtbClcbiAqXG4gKiBUaGUgSWduaXRlIFVJIENhcmQgc2VydmVzIGFzIGEgY29udGFpbmVyIHRoYXQgYWxsb3dzIGN1c3RvbSBjb250ZW50IHRvIGJlIG9yZ2FuaXplZCBpbiBhbiBhcHBlYWxpbmcgd2F5LiBUaGVyZSBhcmVcbiAqIGZpdmUgc2VjdGlvbnMgaW4gYSBjYXJkIHRoYXQgeW91IGNhbiB1c2UgdG8gb3JnYW5pemUgeW91ciBjb250ZW50LiBUaGVzZSBhcmUgaGVhZGVyLCBtZWRpYSwgY29udGVudCwgYWN0aW9ucywgYW5kIGZvb3Rlci5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgaHRtbFxuICogPGlneC1jYXJkPlxuICogICA8aWd4LWNhcmQtaGVhZGVyPlxuICogICAgIDxoMyBpZ3hDYXJkSGVhZGVyVGl0bGU+e3t0aXRsZX19PC9oMz5cbiAqICAgICA8aDUgaWd4Q2FyZEhlYWRlclN1YnRpdGxlPnt7c3VidGl0bGV9fTwvaDU+XG4gKiAgIDwvaWd4LWNhcmQtaGVhZGVyPlxuICogICA8aWd4LWNhcmQtYWN0aW9ucz5cbiAqICAgICAgIDxidXR0b24gaWd4QnV0dG9uIGlneFJpcHBsZT5TaGFyZTwvYnV0dG9uPlxuICogICAgICAgPGJ1dHRvbiBpZ3hCdXR0b24gaWd4UmlwcGxlPlBsYXkgQWxidW08L2J1dHRvbj5cbiAqICAgPC9pZ3gtY2FyZC1hY3Rpb25zPlxuICogPC9pZ3gtY2FyZD5cbiAqIGBgYFxuICovXG5cbmV4cG9ydCBlbnVtIElneENhcmRUeXBlIHtcbiAgICBERUZBVUxUID0gJ2RlZmF1bHQnLFxuICAgIE9VVExJTkVEID0gJ291dGxpbmVkJ1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1jYXJkJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NhcmQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneENhcmRDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgY2FyZC5cbiAgICAgKiBJZiBub3Qgc2V0LCBgaWRgIHdpbGwgaGF2ZSB2YWx1ZSBgXCJpZ3gtY2FyZC0wXCJgO1xuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQgaWQgPSBcIm15LWZpcnN0LWNhcmRcIj48L2lneC1jYXJkPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY2FyZElkID0gIHRoaXMuY2FyZC5pZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q2FyZENvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWNhcmQtJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBjYXJkLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIGlzIHNldCB0byBgZ3JvdXBgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNhcmQgcm9sZT1cImdyb3VwXCI+PC9pZ3gtY2FyZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcm9sZSA9ICdncm91cCc7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYHR5cGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2FyZC5cbiAgICAgKiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyBzZXQgdG8gYGRlZmF1bHRgLiBZb3UgY2FuIG1ha2UgdGhlIGNhcmQgdXNlIHRoZVxuICAgICAqIG91dGxpbmVkIHN0eWxlIGJ5IHNldHRpbmcgdGhlIHZhbHVlIHRvIGBvdXRsaW5lZGAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZCB0eXBlPVwib3V0bGluZWRcIj48L2lneC1jYXJkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHR5cGU6IElneENhcmRUeXBlIHwgc3RyaW5nID0gSWd4Q2FyZFR5cGUuREVGQVVMVDtcblxuICAgIC8qKlxuICAgICAqIEEgZ2V0dGVyIHdoaWNoIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGNhcmQgdHlwZSBpcyBgb3V0bGluZWRgLlxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhcmQtLW91dGxpbmVkJylcbiAgICBnZXQgaXNPdXRsaW5lZENhcmQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09IElneENhcmRUeXBlLk9VVExJTkVEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHZhbHVlIG9mIHRoZSBgaG9yaXpvbnRhbGAgYXR0cmlidXRlIG9mIHRoZSBjYXJkLlxuICAgICAqIFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgd2lsbCBtYWtlIHRoZSBkaWZmZXJlbnQgY2FyZCBzZWN0aW9ucyBhbGlnbiBob3Jpem9udGFsbHksXG4gICAgICogZXNzZW50aWFsbHkgZmxpcHBpbmcgdGhlIGNhcmQgdG8gdGhlIHNpZGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY2FyZCBbaG9yaXpvbnRhbF09XCJ0cnVlXCI+PC9pZ3gtY2FyZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLS1ob3Jpem9udGFsJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBob3Jpem9udGFsID0gZmFsc2U7XG59XG5cbmV4cG9ydCBlbnVtIElneENhcmRBY3Rpb25zTGF5b3V0IHtcbiAgICBERUZBVUxUID0gJ2RlZmF1bHQnLFxuICAgIEpVU1RJRlkgPSAnanVzdGlmeScsXG59XG5cbi8qKlxuICogSWd4Q2FyZEFjdGlvbnMgaXMgY29udGFpbmVyIGZvciB0aGUgY2FyZCBhY3Rpb25zLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdpZ3gtY2FyZC1hY3Rpb25zJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NhcmQtYWN0aW9ucy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2FyZEFjdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgcHJpdmF0ZSBpc1ZlcnRpY2FsU2V0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KElneENhcmRDb21wb25lbnQpIHB1YmxpYyBjYXJkOiBJZ3hDYXJkQ29tcG9uZW50KSB7IH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIGxheW91dCBzdHlsZSBvZiB0aGUgYWN0aW9ucy5cbiAgICAgKiBCeSBkZWZhdWx0IGljb25zIGFuZCBpY29uIGJ1dHRvbnMsIGFzIHdlbGwgYXMgcmVndWxhciBidXR0b25zXG4gICAgICogYXJlIHNwbGl0IGludG8gdHdvIGNvbnRhaW5lcnMsIHdoaWNoIGFyZSB0aGVuIHBvc2l0aW9uZWQgb24gYm90aCBlbmRzXG4gICAgICogb2YgdGhlIGNhcmQtYWN0aW9ucyBhcmVhLlxuICAgICAqIFlvdSBjYW4ganVzdGlmeSB0aGUgZWxlbWVudHMgaW4gdGhvc2UgZ3JvdXBzIHNvIHRoZXkgYXJlIHBvc2l0aW9uZWQgZXF1YWxseVxuICAgICAqIGZyb20gb25lIGFub3RoZXIgdGFraW5nIHVwIGFsbCB0aGUgc3BhY2UgYXZhaWxhYmxlIGFsb25nIHRoZSBjYXJkIGFjdGlvbnMgYXhpcy5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLWFjdGlvbnMgbGF5b3V0PVwianVzdGlmeVwiPjwvaWd4LWNhcmQtYWN0aW9ucz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWFjdGlvbnMnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxheW91dDogSWd4Q2FyZEFjdGlvbnNMYXlvdXQgfCBzdHJpbmcgPSAnZGVmYXVsdCc7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2ZXJ0aWNhbCBhdHRyaWJ1dGUgb2YgdGhlIGFjdGlvbnMuXG4gICAgICogV2hlbiBzZXQgdG8gYHRydWVgIHRoZSBhY3Rpb25zIHdpbGwgYmUgbGF5ZWQgb3V0IHZlcnRpY2FsbHkuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC1hY3Rpb25zLS12ZXJ0aWNhbCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdmVydGljYWw6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBIGdldHRlciB0aGF0IHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGxheW91dCBoYXMgYmVlblxuICAgICAqIHNldCB0byBganVzdGlmeWAuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FyZC1hY3Rpb25zLS1qdXN0aWZ5JylcbiAgICBnZXQgaXNKdXN0aWZ5TGF5b3V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQgPT09IElneENhcmRBY3Rpb25zTGF5b3V0LkpVU1RJRlk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBvcmRlciBvZiB0aGUgYnV0dG9ucyB0aGUgYWN0aW9ucyBhcmVhLlxuICAgICAqIEJ5IGRlZmF1bHQgYWxsIGljb25zL2ljb24gYnV0dG9ucyBhcmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlIGFjdGlvblxuICAgICAqIGFyZWEuIEFueSByZWd1bGFyIGJ1dHRvbnMoZmxhdCwgcmFpc2VkKSB3aWxsIGFwcGVhciBiZWZvcmUgdGhlIGljb25zL2ljb24gYnV0dG9uc1xuICAgICAqIHBsYWNlZCBpbiB0aGUgYWN0aW9ucyBhcmVhLlxuICAgICAqIElmIHlvdSB3YW50IHRvIHJldmVyc2UgdGhlaXIgcG9zaXRpb25zIHNvIHRoYXQgaWNvbnMgYXBwZWFyIGZpcnN0LCB1c2UgdGhlIGByZXZlcnNlYFxuICAgICAqIGF0dHJpYnV0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYXJkLWFjdGlvbnMgW3JldmVyc2VdPVwidHJ1ZVwiPjwvaWd4LWNhcmQtYWN0aW9ucz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jYXJkLWFjdGlvbnMtLXJldmVyc2UnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJldmVyc2UgPSBmYWxzZTtcblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAndmVydGljYWwnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1ZlcnRpY2FsU2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnZlcnRpY2FsID0gIXRoaXMuaXNWZXJ0aWNhbFNldCAmJiB0aGlzLmNhcmQuaG9yaXpvbnRhbDtcbiAgICB9XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5ATmdNb2R1bGUoe1xuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBJZ3hDYXJkQ29tcG9uZW50LFxuICAgICAgICBJZ3hDYXJkSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBJZ3hDYXJkTWVkaWFEaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRDb250ZW50RGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkQWN0aW9uc0NvbXBvbmVudCxcbiAgICAgICAgSWd4Q2FyZEZvb3RlckRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZEhlYWRlclRpdGxlRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkSGVhZGVyU3VidGl0bGVEaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRUaHVtYm5haWxEaXJlY3RpdmUsXG4gICAgXSxcbiAgICBleHBvcnRzOiBbXG4gICAgICAgIElneENhcmRDb21wb25lbnQsXG4gICAgICAgIElneENhcmRIZWFkZXJDb21wb25lbnQsXG4gICAgICAgIElneENhcmRNZWRpYURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZENvbnRlbnREaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRBY3Rpb25zQ29tcG9uZW50LFxuICAgICAgICBJZ3hDYXJkRm9vdGVyRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDYXJkSGVhZGVyVGl0bGVEaXJlY3RpdmUsXG4gICAgICAgIElneENhcmRIZWFkZXJTdWJ0aXRsZURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q2FyZFRodW1ibmFpbERpcmVjdGl2ZSxcbiAgICBdLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElneEJ1dHRvbk1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4Q2FyZE1vZHVsZSB7IH1cbiJdfQ==