UNPKG

@blox/material

Version:

Material Components for Angular

702 lines 94.2 kB
import { ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Input, Output, Renderer2, ChangeDetectorRef, HostListener, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { MDCChipFoundation, MDCChipSetFoundation } from '@material/chips'; import { announce } from '../../utils/thirdparty.announce'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; import { asBoolean } from '../../utils/value.utils'; export var ChipEventSource; (function (ChipEventSource) { ChipEventSource[ChipEventSource["primary"] = 0] = "primary"; ChipEventSource[ChipEventSource["trailing"] = 1] = "trailing"; ChipEventSource[ChipEventSource["none"] = 2] = "none"; })(ChipEventSource || (ChipEventSource = {})); ; /** * Directive for the (optional) leading or trailing icon of an `mdcChip`. * Depending on the position within the `mdcChip` the icon will determine * whether it is a leading or trailing icon. * Trailing icons must implement the functionality to remove the chip from the set, and * must only be added to input chips (`mdcChipSet="input"`). Chips with a trailing * icon must implement the `remove` event. Trailing icons should be wrapped * inside an `mdcChipCell`. */ export class MdcChipIconDirective { constructor(_elm, _rndr, _cdRef) { this._elm = _elm; this._rndr = _rndr; this._cdRef = _cdRef; /** @internal */ this._cls = true; /** @internal */ this._leading = false; /** * Event emitted for trailing icon user interactions. Please note that chip removal should be * handled by the `remove` output of the chip, *not* by a handler for this output. */ this.interact = new EventEmitter(); /** @internal */ this._trailing = false; this._originalTabindex = null; this.__tabindex = -1; this.__role = null; /** @internal */ this._chip = null; this.__role = _elm.nativeElement.getAttribute('role'); let tabIndex = _elm.nativeElement.getAttribute('tabindex'); if (tabIndex) { this._originalTabindex = +tabIndex; this.__tabindex = +tabIndex; } } ngOnDestroy() { this._chip = null; } /** @internal */ get _tabindex() { return this._trailing ? this.__tabindex : this._originalTabindex; } /** @internal */ set _tabindex(val) { this.__tabindex = val == null ? -1 : val; } /** @internal */ get _role() { if (this.__role) return this.__role; return this._trailing ? 'button' : null; } /** @internal */ _handleClick(event) { var _a; if (this._chip && this._trailing) (_a = this._chip._foundation) === null || _a === void 0 ? void 0 : _a.handleTrailingIconInteraction(event); } /** @internal */ _handleInteraction(event) { var _a; if (this._chip && this._trailing) (_a = this._chip._foundation) === null || _a === void 0 ? void 0 : _a.handleTrailingIconInteraction(event); } } MdcChipIconDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcChipIcon]' },] } ]; MdcChipIconDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: ChangeDetectorRef } ]; MdcChipIconDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-chip__icon',] }], _leading: [{ type: HostBinding, args: ['class.mdc-chip__icon--leading',] }], interact: [{ type: Output }], _trailing: [{ type: HostBinding, args: ['class.mdc-chip__icon--trailing',] }], _tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }], _role: [{ type: HostBinding, args: ['attr.role',] }], _handleClick: [{ type: HostListener, args: ['click', ['$event'],] }], _handleInteraction: [{ type: HostListener, args: ['keydown', ['$event'],] }] }; /** * Directive for the text of an `mdcChip`. Must be contained in an `mdcChipPrimaryAction` * directive. */ export class MdcChipTextDirective { constructor(_elm) { this._elm = _elm; this._cls = true; } } MdcChipTextDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcChipText]' },] } ]; MdcChipTextDirective.ctorParameters = () => [ { type: ElementRef } ]; MdcChipTextDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-chip__text',] }] }; /** * Directive for the primary action element of a chip. The `mdcChipPrimaryAction` must * contain the `mdcChipText` directive, and be contained by an `mdcChipCell` directive. */ export class MdcChipPrimaryActionDirective { constructor(_elm) { this._elm = _elm; /** @internal */ this._cls = true; this.__tabindex = -1; /** @internal */ this.__role = 'button'; this.__tabindex = +(this._elm.nativeElement.getAttribute('tabindex') || -1); } /** @internal */ get _role() { return this.__role; } /** @internal */ get _tabindex() { return this.__tabindex; } /** @internal */ set _tabindex(val) { this.__tabindex = val; } } MdcChipPrimaryActionDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcChipPrimaryAction]' },] } ]; MdcChipPrimaryActionDirective.ctorParameters = () => [ { type: ElementRef } ]; MdcChipPrimaryActionDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-chip__primary-action',] }], _role: [{ type: HostBinding, args: ['attr.role',] }], _tabindex: [{ type: HostBinding, args: ['attr.tabindex',] }] }; /** * Directive for the main content of a chip, or for an optional trailing * action on `input` chips. This directive must contain an * `mdcChipPrimaryActione` or an `mdcChipIcon` (when used for the trailing action). * An `mdcChipCell` must always be the direct child of an `mdcChip`. */ export class MdcChipCellDirective { constructor(_elm) { this._elm = _elm; /** @internal */ this._role = 'gridcell'; } } MdcChipCellDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcChipCell]' },] } ]; MdcChipCellDirective.ctorParameters = () => [ { type: ElementRef } ]; MdcChipCellDirective.propDecorators = { _role: [{ type: HostBinding, args: ['attr.role',] }] }; /** * Directive for a chip. Chips must be child elements of an `mdcChipSet`, * and must contain an `mdcChipCell`, and may additionally contain an `mdcChipIcon` for * the leading icon. An optional trailing icon must be wrapped in a second `mdcChipCell`. */ export class MdcChipDirective extends AbstractMdcRipple { constructor(_elm, rndr, registry, doc) { super(_elm, rndr, registry, doc); this._elm = _elm; /** @internal */ this._cls = true; /** @internal */ this._role = 'row'; this.initialized = false; this.selectedMem = false; this.removableMem = true; this._value = null; /** * Event emitted for user interaction with the chip. */ this.interact = new EventEmitter(); /** * Event emitted when the user has removed (by clicking the trailing icon) the chip. * This event must be implemented when the `removable` property is set, and the chip * has a trailing icon. The implementation must remove the chip from the set. * Without such implementation the directive will animate the chip out of vision, * but will not remove the chip from the DOM. */ this.remove = new EventEmitter(); /** * Event emitted when a navigation event has occured. */ this.navigation = new EventEmitter(); /** * Event emitted when the chip changes from not-selected to selected state or vice versa * (for filter and choice chips). */ this.selectedChange = new EventEmitter(); // Like selectedChange, but only the events that should go to the chipset (i.e. not including the ones initiated by the chipset) /** @internal */ this._selectedForChipSet = new EventEmitter(); /** @internal */ this._notifyRemoval = new EventEmitter(); /** @internal */ this._set = null; this._checkmark = null; this._leadingIcon = null; this._trailingIcon = null; this._adapter = { addClass: (className) => { const hasClass = this._elm.nativeElement.classList.contains(className); this._renderer.addClass(this._elm.nativeElement, className); if (!hasClass && className === 'mdc-chip--selected') { this.selectedMem = true; this.selectedChange.emit(true); } }, removeClass: (className) => { const hasClass = this._elm.nativeElement.classList.contains(className); this._renderer.removeClass(this._elm.nativeElement, className); if (hasClass && className === 'mdc-chip--selected') { this.selectedMem = false; this.selectedChange.emit(false); } }, hasClass: (className) => this._elm.nativeElement.classList.contains(className), addClassToLeadingIcon: (className) => this._leadingIcon && this._renderer.addClass(this._leadingIcon._elm.nativeElement, className), removeClassFromLeadingIcon: (className) => this._leadingIcon && this._renderer.removeClass(this._leadingIcon._elm.nativeElement, className), eventTargetHasClass: (target, className) => !!target && target.classList.contains(className), getAttribute: (attr) => this._elm.nativeElement.getAttribute(attr), notifyInteraction: () => this.interact.emit(), notifySelection: (selected, chipSetShouldIgnore) => { if (!chipSetShouldIgnore) this._selectedForChipSet.emit(selected); }, notifyTrailingIconInteraction: () => this._trailingIcon.interact.emit(), notifyRemoval: (removedAnnouncement) => this._notifyRemoval.emit({ removedAnnouncement }), notifyNavigation: (key, source) => this.navigation.emit({ key, source: source }), getComputedStyleValue: (propertyName) => getComputedStyle(this._elm.nativeElement).getPropertyValue(propertyName), setStyleProperty: (style, value) => this._renderer.setStyle(this._elm.nativeElement, style, value), hasLeadingIcon: () => !!this._leadingIcon, getRootBoundingClientRect: () => this._elm.nativeElement.getBoundingClientRect(), getCheckmarkBoundingClientRect: () => { var _a; return ((_a = this._checkmark) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect()) || null; }, setPrimaryActionAttr: (attr, value) => this._primaryAction && this._renderer.setAttribute(this._primaryAction._elm.nativeElement, attr, value), focusPrimaryAction: () => { var _a; return (_a = this._primaryAction) === null || _a === void 0 ? void 0 : _a._elm.nativeElement.focus(); }, hasTrailingAction: () => !!this._trailingIcon, setTrailingActionAttr: (attr, value) => this._trailingIcon && this._renderer.setAttribute(this._trailingIcon._elm.nativeElement, attr, value), focusTrailingAction: () => { var _a; return (_a = this._trailingIcon) === null || _a === void 0 ? void 0 : _a._elm.nativeElement.focus(); }, isRTL: () => getComputedStyle(this._elm.nativeElement).getPropertyValue('direction') === 'rtl' }; /** @internal */ this._foundation = new MDCChipFoundation(this._adapter); this._uniqueValue = `mdc-chip-${MdcChipDirective.nextValue++}`; } ngAfterContentInit() { this.initActions(); this.initIcons(); this._icons.changes.subscribe(() => this._reInit()); this._texts.changes.subscribe(() => this._reInit()); this._primaryActions.changes.subscribe(() => this._reInit()); this._chipCells.changes.subscribe(() => this._reInit()); this.addRippleSurface('mdc-chip__ripple'); this.initCheckMark(); this.initRipple(); this._foundation.init(); if (this.selectedMem) // triggers setting the foundation selected state (and possibly for other [choice] chips too): this.selected = this.selectedMem; if (!this.removableMem) this._foundation.setShouldRemoveOnTrailingIconClick(this.removableMem); this.initialized = true; } ngOnDestroy() { this.destroyRipple(); this._foundation.destroy(); } /** @internal */ _reInit() { // if icons have changed, the foundation must be reinitialized, because // trailingIconInteractionHandler might have to be removed and/or attached // to another icon: this._foundation.destroy(); this._foundation = new MDCChipFoundation(this._adapter); this.initActions(); this.initIcons(); this.initCheckMark(); this._foundation.init(); if (!this.removableMem) this._foundation.setShouldRemoveOnTrailingIconClick(this.removableMem); // no need to call setSelected again, as the previous state will still be available via // the mdc-chip--selected class } initActions() { if (this._set) { let role = 'button'; if (this._set._type === 'choice') role = 'radio'; else if (this._set._type === 'filter') role = 'checkbox'; this._primaryActions.forEach(action => { action.__role = role; }); } } initIcons() { let newLeading = this.computeLeadingIcon(); let newTrailing = this.computeTrailingIcon(newLeading); if (newLeading !== this._leadingIcon || newTrailing !== this._trailingIcon) { this._leadingIcon = newLeading; this._trailingIcon = newTrailing; this._icons.forEach(icon => { icon._chip = this; let leading = icon === this._leadingIcon; let trailing = icon === this._trailingIcon; let changed = leading !== icon._leading || trailing !== icon._trailing; icon._leading = icon === this._leadingIcon; icon._trailing = icon === this._trailingIcon; if (changed) // if we don't do this we get ExpressionChangedAfterItHasBeenCheckedError: icon._cdRef.detectChanges(); }); this.removeCheckMark(); // checkmark may have changed position, will be readded later (for filter chips) } } get _text() { var _a; return (_a = this._texts) === null || _a === void 0 ? void 0 : _a.first; } get _primaryAction() { var _a; return (_a = this._primaryActions) === null || _a === void 0 ? void 0 : _a.first; } get _chipCell() { var _a; return (_a = this._chipCells) === null || _a === void 0 ? void 0 : _a.first; } computeLeadingIcon() { if (this._icons && this._icons.length > 0) { let icon = this._icons.first; let prev = this.previousElement(icon._elm.nativeElement); let last = icon._elm.nativeElement; while (true) { // if it is contained in another element, check the siblings of the container too: if (prev == null && last != null && last.parentElement !== this._elm.nativeElement) prev = last.parentElement; // no more elements before, must be the leading icon: if (prev == null) return icon; // comes after the text, so it's not the leading icon: if (this._text && (prev === this._text._elm.nativeElement || prev.contains(this._text._elm.nativeElement))) return null; last = prev; prev = this.previousElement(prev); } } return null; } computeTrailingIcon(leading) { if (this._icons.length > 0) { let icon = this._icons.last; if (icon === leading) return null; // if not the leading icon, it must be the trailing icon: return icon; } return null; } previousElement(el) { let result = el.previousSibling; while (result != null && !(result instanceof Element)) result = result.previousSibling; return result; } initCheckMark() { if (this._set && this._set._type === 'filter') this.addCheckMark(); else this.removeCheckMark(); } addCheckMark() { if (!this._checkmark && this._chipCell) { let path = this._renderer.createElement('path', 'svg'); this._renderer.addClass(path, 'mdc-chip__checkmark-path'); this._renderer.setAttribute(path, 'fill', 'none'); this._renderer.setAttribute(path, 'stroke', 'black'); this._renderer.setAttribute(path, 'd', 'M1.73,12.91 8.1,19.28 22.79,4.59'); let svg = this._renderer.createElement('svg', 'svg'); this._renderer.appendChild(svg, path); this._renderer.addClass(svg, 'mdc-chip__checkmark-svg'); this._renderer.setAttribute(svg, 'viewBox', '-2 -3 30 30'); this._checkmark = this._renderer.createElement('div'); this._renderer.appendChild(this._checkmark, svg); this._renderer.addClass(this._checkmark, 'mdc-chip__checkmark'); this._renderer.insertBefore(this._elm.nativeElement, this._checkmark, this._chipCell._elm.nativeElement); } } removeCheckMark() { if (this._checkmark) { this._checkmark.parentElement.removeChild(this._checkmark); this._checkmark = null; } } /** * The value the chip represents. The value must be unique for the `mdcChipSet`. If you do not provide a value * a unique value will be computed automatically. */ get value() { return this._value ? this._value : this._uniqueValue; } set value(val) { this._value = val; } /** * The 'selected' state of the chip. Filter and choice chips are either selected or * not selected. Making a choice chip selected, will make all other chips in that set * not selected. */ get selected() { return this.initialized ? this._foundation.isSelected() : this.selectedMem; } set selected(val) { let value = asBoolean(val); this.selectedMem = value; if (this.initialized && value !== this._foundation.isSelected()) this._foundation.setSelected(value); // when not initialized the selectedChange will be emitted via the foundation after // initialization } /** * If set to a value other than `false`, clicking the trailing icon will animate the * chip out of view, and then emit the `remove` output. */ get removable() { return this.initialized ? this._foundation.getShouldRemoveOnTrailingIconClick() : this.removableMem; } set removable(val) { let value = asBoolean(val); this.removableMem = value; if (this.initialized && value !== this._foundation.getShouldRemoveOnTrailingIconClick()) this._foundation.setShouldRemoveOnTrailingIconClick(value); // when not initialized the removable change will be set on the foundation after // initialization } /** @docs-private */ computeRippleBoundingRect() { return this._foundation.getDimensions(); } /** @internal */ _handleInteraction(event) { var _a; (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.handleInteraction(event); } /** @internal */ _handleTransitionEnd(event) { var _a; (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.handleTransitionEnd(event); } /** @internal */ _handleKeydown(event) { var _a, _b; (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.handleKeydown(event); (_b = this._foundation) === null || _b === void 0 ? void 0 : _b.handleInteraction(event); } /** @internal */ _untabbable() { if (this._primaryAction) this._primaryAction._tabindex = -1; if (this._trailingIcon) this._trailingIcon._tabindex = -1; } /** @internal */ _allowtabbable() { let result = !!this._primaryAction && this._primaryAction._tabindex !== -1; if (result && this._trailingIcon) this._trailingIcon._tabindex = -1; if (!result) result = !!this._trailingIcon && this._trailingIcon._tabindex != null && this._trailingIcon._tabindex !== -1; return result; } /** @internal */ _forceTabbable() { if (this._primaryAction) this._primaryAction._tabindex = 0; else if (this._trailingIcon) this._trailingIcon._tabindex = 0; } } /** @internal */ MdcChipDirective.nextValue = 1; // for computing a unique value, if no value was provided MdcChipDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcChip]' },] } ]; MdcChipDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: MdcEventRegistry }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; MdcChipDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-chip',] }], _role: [{ type: HostBinding, args: ['attr.role',] }], interact: [{ type: Output }], remove: [{ type: Output }], navigation: [{ type: Output }], selectedChange: [{ type: Output }], _selectedForChipSet: [{ type: Output }], _notifyRemoval: [{ type: Output }], _icons: [{ type: ContentChildren, args: [MdcChipIconDirective, { descendants: true },] }], _texts: [{ type: ContentChildren, args: [MdcChipTextDirective, { descendants: true },] }], _primaryActions: [{ type: ContentChildren, args: [MdcChipPrimaryActionDirective, { descendants: true },] }], _chipCells: [{ type: ContentChildren, args: [MdcChipCellDirective,] }], value: [{ type: Input }], selected: [{ type: Input }], removable: [{ type: HostBinding, args: ['class.mdc-chip--deletable',] }, { type: Input }], _handleInteraction: [{ type: HostListener, args: ['click', ['$event'],] }], _handleTransitionEnd: [{ type: HostListener, args: ['transitionend', ['$event'],] }], _handleKeydown: [{ type: HostListener, args: ['keydown', ['$event'],] }] }; /** * Directive for a chip-set (a collection of <code>mdcChip</code>). */ export class MdcChipSetDirective { constructor(_elm, cdRef) { this._elm = _elm; this.cdRef = cdRef; /** @internal */ this._cls = true; /** @internal */ this._role = 'grid'; this._subscriptions = []; this._initialized = false; /** @internal */ this._type = 'action'; /** @internal */ this._adapter = { hasClass: (className) => this._elm.nativeElement.classList.contains(className), removeChipAtIndex: (index) => { this.chip(index).remove.emit(); // needed so that when focusChipTrailingActionAtIndex is called the // chip has already been removed from the DOM: this.cdRef.detectChanges(); }, selectChipAtIndex: (index, selected, shouldNotifyClients) => { var _a; (_a = this.chip(index)) === null || _a === void 0 ? void 0 : _a._foundation.setSelectedFromChipSet(selected, shouldNotifyClients); }, getIndexOfChipById: (chipValue) => this.findChipIndex(chipValue), focusChipPrimaryActionAtIndex: (index) => { var _a; return (_a = this.chip(index)) === null || _a === void 0 ? void 0 : _a._foundation.focusPrimaryAction(); }, focusChipTrailingActionAtIndex: (index) => { var _a; return (_a = this.chip(index)) === null || _a === void 0 ? void 0 : _a._foundation.focusTrailingAction(); }, removeFocusFromChipAtIndex: (index) => { var _a; return (_a = this.chip(index)) === null || _a === void 0 ? void 0 : _a._foundation.removeFocus(); }, isRTL: () => getComputedStyle(this._elm.nativeElement).getPropertyValue('direction') === 'rtl', getChipListCount: () => this._chips.length, announceMessage: (message) => announce(message) }; /** @internal */ this._foundation = new MDCChipSetFoundation(this._adapter); } ngAfterContentInit() { this._chips.changes.subscribe(() => { this.initSubscriptions(); this.initChips(); this.cdRef.detectChanges(); }); this.initSubscriptions(); this.initChips(); this._foundation.init(); this._initialized = true; this.cdRef.detectChanges(); } ngOnDestroy() { var _a; (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.destroy(); this._foundation = null; this.destroySubscriptions(); this._initialized = false; } /** * Chip sets by default contain 'action' chips. Set this value to <code>choice</code>, * <code>filter</code>, <code>input</code>, or <code>action</code> to determine the kind * of chips that are contained in the chip set. */ get mdcChipSet() { return this._type; } set mdcChipSet(value) { if (value !== this._type) { if (value === 'choice' || value === 'filter' || value === 'input') this._type = value; else this._type = 'action'; if (this._initialized) this.initChips(true); } } initChips(force = false) { let hasTabbableItem = false; this._chips.forEach(chip => { if (force || chip._set !== this) { chip._set = this; chip._reInit(); } if (hasTabbableItem) chip._untabbable(); else hasTabbableItem = chip._allowtabbable(); }); if (!hasTabbableItem && this._chips.length > 0) this._chips.first._forceTabbable(); } destroySubscriptions() { try { this._subscriptions.forEach(sub => sub.unsubscribe()); } finally { this._subscriptions = []; } } initSubscriptions() { this.destroySubscriptions(); this._subscriptions = []; this._chips.forEach(chip => { this._subscriptions.push(chip.interact.subscribe(() => this._foundation.handleChipInteraction({ chipId: chip.value }))); this._subscriptions.push(chip._selectedForChipSet.subscribe((selected) => this._foundation.handleChipSelection({ chipId: chip.value, selected, shouldIgnore: false }))); this._subscriptions.push(chip._notifyRemoval.subscribe(({ removedAnnouncement }) => this._foundation.handleChipRemoval({ chipId: chip.value, removedAnnouncement }))); this._subscriptions.push(chip.navigation.subscribe(({ key, source }) => this._foundation.handleChipNavigation({ chipId: chip.value, key, source }))); }); } chip(index) { if (index < 0 || index >= this._chips.length) return null; return this._chips.toArray()[index]; } findChipIndex(chipValue) { return this._chips.toArray().findIndex(chip => chip.value === chipValue); } /** @internal */ get _choice() { return this._type === 'choice'; } /** @internal */ get _filter() { return this._type === 'filter'; } /** @internal */ get _input() { return this._type === 'input'; } } MdcChipSetDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcChipSet]' },] } ]; MdcChipSetDirective.ctorParameters = () => [ { type: ElementRef }, { type: ChangeDetectorRef } ]; MdcChipSetDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-chip-set',] }], _role: [{ type: HostBinding, args: ['attr.role',] }], _chips: [{ type: ContentChildren, args: [MdcChipDirective, { descendants: true },] }], mdcChipSet: [{ type: Input }], _choice: [{ type: HostBinding, args: ['class.mdc-chip-set--choice',] }], _filter: [{ type: HostBinding, args: ['class.mdc-chip-set--filter',] }], _input: [{ type: HostBinding, args: ['class.mdc-chip-set--input',] }] }; export const CHIP_DIRECTIVES = [ MdcChipIconDirective, MdcChipTextDirective, MdcChipPrimaryActionDirective, MdcChipCellDirective, MdcChipDirective, MdcChipSetDirective ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLmNoaXAuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hpcHMvbWRjLmNoaXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsZUFBZSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQ3JGLE1BQU0sRUFBYSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHcEQsTUFBTSxDQUFOLElBQVksZUFJWDtBQUpELFdBQVksZUFBZTtJQUN2QiwyREFBNkIsQ0FBQTtJQUM3Qiw2REFBK0IsQ0FBQTtJQUMvQixxREFBdUIsQ0FBQTtBQUMzQixDQUFDLEVBSlcsZUFBZSxLQUFmLGVBQWUsUUFJMUI7QUFBQSxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBa0I3QixZQUFtQixJQUFnQixFQUFVLEtBQWdCLEVBQVMsTUFBeUI7UUFBNUUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLFVBQUssR0FBTCxLQUFLLENBQVc7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQWpCL0YsZ0JBQWdCO1FBQzhCLFNBQUksR0FB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