UNPKG

@dimanoid/ngx-dm-tour

Version:

891 lines 89.3 kB
/** * @fileoverview added by tsickle * Generated from: lib/dm-tour.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable, Inject, Optional, RendererFactory2 } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { HttpClient } from '@angular/common/http'; import { DmTourConfig, DM_TOUR_CONF } from './models'; import { isElemVisible } from './utils'; import { Observable, Subject } from 'rxjs'; import { GLOBAL_STYLES } from './dm-tour.styles'; import { debounceTime } from 'rxjs/operators'; import ResizeObserver from 'resize-observer-polyfill'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; import * as i2 from "@angular/common"; import * as i3 from "./models/dm-tour-config"; export class DmTourService { /** * @param {?} _rendererFactory * @param {?} _http * @param {?} document * @param {?} cfg */ constructor(_rendererFactory, _http, document, cfg) { this._rendererFactory = _rendererFactory; this._http = _http; this.document = document; this._controls = {}; this._hlVisible = null; this._cfg = new DmTourConfig(cfg); this._r2 = this._rendererFactory.createRenderer(null, null); if (this._cfg.loadIndexOnStart) { this._addGlobalStyles(); this._loadSections().subscribe((/** * @return {?} */ () => { }), (/** * @param {?} err * @return {?} */ err => this._handleLoadError(err))); } if (ResizeObserver) { /** @type {?} */ const resized = new Subject(); new ResizeObserver((/** * @return {?} */ () => resized.next())).observe(this.document.body); resized.pipe(debounceTime(500)).subscribe((/** * @return {?} */ () => this._resized())); } } /** * @private * @return {?} */ _resized() { this._L('_resized', this._hlVisible); if (this._r2 && this._root && this._hlVisible && this._hlVisible.type == 'controls') { /** @type {?} */ const bd = this.document.querySelector('#ngxDmTourRoot'); this._L('_resized, bd:', bd); if (bd) { bd.remove(); this._root = null; } if (this._onClickRemove) { this._onClickRemove(); this._onClickRemove = null; } if (this._onKeyupRemove) { this._onKeyupRemove(); this._onKeyupRemove = null; } /** @type {?} */ const sid = this._hlVisible.sectionId; this._hlVisible = null; this._showControlsHelp(sid); } } /** * @param {?} sectionId * @param {?} id * @param {?} el * @return {?} */ registerControl(sectionId, id, el) { if (!sectionId || !id || !el) { return; } this._L(`registerControl, sectionId: ${sectionId}, is: ${id}, el:`, el); if (!this._controls[sectionId]) { this._controls[sectionId] = {}; } if (!this._controls[sectionId][id]) { this._controls[sectionId][id] = { id }; } this._controls[sectionId][id].el = el.nativeElement; } /** * @param {?} sectionId * @param {?} id * @return {?} */ unregisterControl(sectionId, id) { if (!this._controls[sectionId] || this._controls[sectionId][id]) { return; } this._L(`unregisterControl, sectionId: ${sectionId}, is: ${id}`); delete this._controls[sectionId][id].el; } /** * @param {?} sectionId * @return {?} */ showControlsHelp(sectionId) { if (this._hlVisible) { return; } if (!this._sections) { this._addGlobalStyles(); this._loadSections().subscribe((/** * @return {?} */ () => { this._loadSectionControls(sectionId).subscribe((/** * @return {?} */ () => this._showControlsHelp(sectionId)), (/** * @param {?} err * @return {?} */ err => this._handleLoadError(err))); }), (/** * @param {?} err * @return {?} */ err => this._handleLoadError(err))); } else if (!this._sections[sectionId]) { this._handleLoadError(`There is no a section "${sectionId}" defined.`); } else if (this._sections[sectionId] && !this._sections[sectionId].controlsLoaded) { this._loadSectionControls(sectionId).subscribe((/** * @return {?} */ () => this._showControlsHelp(sectionId)), (/** * @param {?} err * @return {?} */ err => this._handleLoadError(err))); } else { this._showControlsHelp(sectionId); } } /** * @param {?} sectionId * @return {?} */ showHelp(sectionId) { if (this._hlVisible) { return; } if (!this._sections) { this._addGlobalStyles(); this._loadSections().subscribe((/** * @return {?} */ () => { this._loadSectionHtml(sectionId).subscribe((/** * @return {?} */ () => this._showHelp(sectionId)), (/** * @param {?} err * @return {?} */ err => this._handleLoadError(err))); }), (/** * @param {?} err * @return {?} */ err => this._handleLoadError(err))); } else if (!this._sections[sectionId]) { this._handleLoadError(`There is no a section "${sectionId}" defined.`); } else if (this._sections[sectionId] && !this._sections[sectionId].controlsLoaded) { this._loadSectionHtml(sectionId).subscribe((/** * @return {?} */ () => this._showHelp(sectionId)), (/** * @param {?} err * @return {?} */ err => this._handleLoadError(err))); } else { this._showHelp(sectionId); } } /** * @private * @return {?} */ _loadSections() { this._showLoading(); return new Observable((/** * @param {?} obs * @return {?} */ obs => { this._http.get(this._cfg.rootPath + '/index.json').subscribe((/** * @param {?} res * @return {?} */ res => { this._hideLoading(); if (res && res.sections) { this._sections = {}; for (const section of res.sections) { this._sections[section.id] = section; } obs.next(); } else { obs.error('Wrong data format in ${this._cfg.rootPath}/index.json'); } }), (/** * @param {?} err * @return {?} */ err => { this._hideLoading(); obs.error(err); })); })); } /** * @private * @param {?} sectionId * @return {?} */ _loadSectionControls(sectionId) { this._showLoading(); if (!this._controls[sectionId]) { this._controls[sectionId] = {}; } return new Observable((/** * @param {?} obs * @return {?} */ obs => { this._http.get(`${this._cfg.rootPath}/${sectionId}/index.json`).subscribe((/** * @param {?} res * @return {?} */ res => { this._hideLoading(); if (res && res.controls) { for (const ctrl of res.controls) { /** @type {?} */ const c = this._controls[sectionId][ctrl.id]; this._controls[sectionId][ctrl.id] = ctrl; this._controls[sectionId][ctrl.id].el = c ? c.el : null; } obs.next(); } else { obs.error('${this._cfg.rootPath}/${sectionId}/index.json'); } }), (/** * @param {?} err * @return {?} */ err => { this._hideLoading(); obs.error(err); })); })); } /** * @private * @param {?} sectionId * @return {?} */ _loadSectionHtml(sectionId) { this._showLoading(); return new Observable((/** * @param {?} obs * @return {?} */ obs => { this._http.get(`${this._cfg.rootPath}/${sectionId}/index.html`, { responseType: 'text' }).subscribe((/** * @param {?} res * @return {?} */ res => { this._L('section html:', res); this._hideLoading(); this._sections[sectionId].html = res; obs.next(); }), (/** * @param {?} err * @return {?} */ err => { this._hideLoading(); obs.error(err); })); })); } /** * @private * @param {?} sectionId * @return {?} */ _showControlsHelp(sectionId) { /** @type {?} */ const ids = this._controls[sectionId] ? Object.keys(this._controls[sectionId]) : []; if (!ids || ids.length == 0) { this._W(`There are no visible controls registered for the section "${sectionId}"`); return; } /** @type {?} */ const R = this._r2; /** @type {?} */ const bd = this.document.querySelector('#ngxDmTourRoot'); if (bd) { R.removeChild(this.document.body, bd); } /** @type {?} */ const svg = R.createElement('svg', 'svg'); /** @type {?} */ const defs = R.createElement('defs', 'svg'); /** @type {?} */ let stop; /** @type {?} */ const rgr = R.createElement('radialGradient', 'svg'); R.setAttribute(rgr, 'id', 'ngxDmTourGradientR'); stop = R.createElement('stop', 'svg'); R.setAttribute(stop, 'offset', '90%'); R.setAttribute(stop, 'stop-color', 'black'); R.appendChild(rgr, stop); stop = R.createElement('stop', 'svg'); R.setAttribute(stop, 'offset', '100%'); R.setAttribute(stop, 'stop-color', 'transparent'); R.appendChild(rgr, stop); R.appendChild(defs, rgr); /** @type {?} */ const mask = R.createElement('mask', 'svg'); R.setAttribute(mask, 'id', 'ngxDmTourControlsMask'); /** @type {?} */ const mrect = R.createElement('rect', 'svg'); R.setAttribute(mrect, 'width', '10000'); R.setAttribute(mrect, 'height', '10000'); R.setAttribute(mrect, 'fill', 'white'); R.appendChild(mask, mrect); /** @type {?} */ const tts = []; for (const id of ids) { /** @type {?} */ const c = this._controls[sectionId][id]; if (c && c.el) { if (!c.children && c.text) { /** @type {?} */ const tt = this._addControlHl(c, mask); if (tt) { tts.push(tt); } } else if (c.children) { for (const ch of c.children) { if (ch.text) { /** @type {?} */ const tt = this._addControlHl(ch, mask); if (tt) { tts.push(tt); } } } } } } if (tts.length == 0) { this._W(`There are no visible controls registered for the section "${sectionId}"`); return; } R.appendChild(defs, mask); R.appendChild(svg, defs); /** @type {?} */ const rect = R.createElement('rect', 'svg'); R.setAttribute(rect, 'width', '10000'); R.setAttribute(rect, 'height', '10000'); R.setAttribute(rect, 'x', '0'); R.setAttribute(rect, 'y', '0'); R.setAttribute(rect, 'fill', 'var(--ngx-dm-tour-backdrop-color, black)'); R.setAttribute(rect, 'mask', 'url(#ngxDmTourControlsMask)'); R.appendChild(svg, rect); R.setAttribute(svg, 'width', '10000px'); R.setAttribute(svg, 'height', '10000px'); this._root = R.createElement('div'); R.setAttribute(this._root, 'id', 'ngxDmTourRoot'); if (this._cfg.customCssClass) { R.addClass(this._root, this._cfg.customCssClass); } /** @type {?} */ const root = R.createElement('div'); R.appendChild(this._root, root); R.setAttribute(root, 'id', 'ngxDmTourBackdrop'); R.appendChild(root, svg); for (const tt of tts) { R.appendChild(this._root, tt); } this.document.activeElement.blur(); this._hlVisible = { type: 'controls', sectionId }; R.appendChild(this.document.body, this._root); setTimeout((/** * @return {?} */ () => { R.addClass(this._root, 'ngx-dm-tour-show'); this._onClickRemove = R.listen(this.document, 'click', (/** * @param {?} e * @return {?} */ e => this.hideControlsHelp(e))); this._onKeyupRemove = R.listen(this.document, 'keyup', (/** * @param {?} e * @return {?} */ e => this.hideControlsHelp(e))); }), 300); } /** * @private * @param {?} c * @param {?} mask * @return {?} */ _addControlHl(c, mask) { /** @type {?} */ const dr = this.document.body.getBoundingClientRect(); /** @type {?} */ const MR = Math.round; /** @type {?} */ const R = this._r2; /** @type {?} */ const el = typeof c.el === 'string' ? this.document.querySelector(c.el) : c.el; /** @type {?} */ const b = this._getBoundaries(el); /** @type {?} */ const vis = isElemVisible(el); this._L('control:', c, '\nelem:', el, '\nboundaries:', b, '\nisVisible:', vis); if (!vis || !b || b.width == 0 || b.height == 0) { return null; } /** @type {?} */ const shape = c.shape ? c.shape : this._cfg.defaultShape == 'auto' ? (b.width > 200 || b.height > 200 ? 'square' : 'circle') : this._cfg.defaultShape; if (shape == 'square') { /** @type {?} */ const hl = R.createElement('rect', 'svg'); R.setAttribute(hl, 'x', '' + MR(b.left - 10)); R.setAttribute(hl, 'y', '' + MR(b.top - 10)); R.setAttribute(hl, 'width', '' + MR(b.width + 20)); R.setAttribute(hl, 'height', '' + MR(b.height + 20)); R.setAttribute(hl, 'rx', '8'); R.setAttribute(hl, 'fill', 'black'); R.setAttribute(hl, 'stroke', 'black'); R.setAttribute(hl, 'stroke-width', 'var(--ngx-dm-tour-hl-stroke-width, 15)'); R.setAttribute(hl, 'stroke-opacity', 'var(--ngx-dm-tour-hl-stroke-opacity, .3)'); R.appendChild(mask, hl); } else { /** @type {?} */ const hl = R.createElement('circle', 'svg'); /** @type {?} */ const r = b.width > b.height ? b.width / 2 : b.height / 2; R.setAttribute(hl, 'cx', '' + MR(b.left + b.width / 2)); R.setAttribute(hl, 'cy', '' + MR(b.top + b.height / 2)); R.setAttribute(hl, 'r', '' + MR(r + 10)); R.setAttribute(hl, 'fill', 'black'); R.setAttribute(hl, 'stroke', 'black'); R.setAttribute(hl, 'stroke-width', 'var(--ngx-dm-tour-hl-stroke-width, 15)'); R.setAttribute(hl, 'stroke-opacity', 'var(--ngx-dm-tour-hl-stroke-opacity, .3)'); R.appendChild(mask, hl); } /** @type {?} */ const tt = R.createElement('div'); R.addClass(tt, 'ngx-dm-tour-text'); /** @type {?} */ const tti = R.createElement('div'); R.addClass(tti, 'ngx-dm-tour-text-inner'); R.appendChild(tti, R.createText(c.text)); R.appendChild(tt, tti); /** @type {?} */ let pos = c.pos && c.pos != 'auto' ? c.pos.split('-') : null; if (!pos) { if (b.top > 250) { pos = ['top', 'center']; } else if (dr.width - b.right > 250) { pos = ['right', 'center']; } else if (dr.height - b.bottom > 250) { pos = ['bottom', 'center']; } else if (b.left > 250) { pos = ['left', 'center']; } else { pos = ['center', 'center']; } } else if (pos.length == 1) { pos.push('center'); } /** @type {?} */ let x = MR(b.left + b.width / 2); /** @type {?} */ let y = MR(b.top + b.height / 2); /** @type {?} */ let tx = -50; /** @type {?} */ let ty = -50; if (pos[0] == 'top') { ty = -100; y = b.top - 20; if (pos[1] == 'left') { tx = 0; x = b.left; } else if (pos[1] == 'right') { tx = -100; x = b.right; } } else if (pos[0] == 'bottom') { ty = 0; y = b.bottom + 20; if (pos[1] == 'left') { tx = 0; x = b.left; } else if (pos[1] == 'right') { tx = -100; x = b.right; } } else if (pos[0] == 'left') { tx = -100; x = b.left - 20; if (pos[1] == 'top') { ty = 0; y = b.top; } else if (pos[1] == 'bottom') { ty = -100; y = b.bottom; } } else if (pos[0] == 'right') { tx = 0; x = b.right + 20; if (pos[1] == 'top') { ty = 0; y = b.top; } else if (pos[1] == 'bottom') { ty = -100; y = b.bottom; } } // console.log(`[${c.id}] pos:`, pos, '\n\tb:', b, `-> ${x}x${y}`, '\n\tc:', c); R.setStyle(tt, 'top', `${y}px`); R.setStyle(tt, 'left', `${x}px`); R.setStyle(tt, 'transform', `translate(${tx}%, ${ty}%) scale(1)`); R.addClass(tt, `ngx-dm-tour-text-${pos[0]}-${pos[1]}`); return tt; } /** * @private * @param {?} sectionId * @return {?} */ _showHelp(sectionId) { /** @type {?} */ const sec = this._sections[sectionId]; /** @type {?} */ const R = this._r2; /** @type {?} */ const obd = this.document.querySelector('ngxDmTourRoot'); if (obd) { obd.remove(); } this._root = R.createElement('div'); R.setAttribute(this._root, 'id', 'ngxDmTourRoot'); if (this._cfg.customCssClass) { R.addClass(this._root, this._cfg.customCssClass); } /** @type {?} */ const root = R.createElement('div'); R.appendChild(this._root, root); R.setAttribute(root, 'id', 'ngxDmTourBackdrop'); R.addClass(root, 'ngx-dm-tour-dialog'); /** @type {?} */ const dc = R.createElement('div'); R.appendChild(this._root, dc); R.setAttribute(dc, 'id', 'ngxDmTourDialogContainer'); /** @type {?} */ const d = R.createElement('div'); R.appendChild(dc, d); R.setAttribute(d, 'id', 'ngxDmTourDialog'); R.addClass(d, `ngx-dm-tour-section-${sec.id}`); /** @type {?} */ const btnClose = R.createElement('button'); R.appendChild(d, btnClose); R.setAttribute(btnClose, 'id', 'ngxDmTourDialogBtnClose'); R.addClass(btnClose, 'ngx-dm-tour-button'); /** @type {?} */ const btnControls = R.createElement('button'); R.appendChild(d, btnControls); R.setAttribute(btnControls, 'id', 'ngxDmTourDialogBtnControls'); R.addClass(btnControls, 'ngx-dm-tour-button'); R.listen(btnControls, 'click', (/** * @param {?} e * @return {?} */ e => this.hideHelp(e, (/** * @return {?} */ () => this.showControlsHelp(sectionId))))); /** @type {?} */ const dt = R.createElement('div'); R.appendChild(d, dt); R.setAttribute(dt, 'id', 'ngxDmTourDialogTitle'); R.appendChild(dt, R.createText(`Section "${sec.title}"`)); /** @type {?} */ const dd = R.createElement('div'); R.appendChild(d, dd); R.setAttribute(dd, 'id', 'ngxDmTourDialogDesc'); /** @type {?} */ const ddi = R.createElement('div'); R.appendChild(dd, ddi); R.setAttribute(ddi, 'id', 'ngxDmTourDialogDescInner'); ddi.innerHTML = sec.html; this.document.activeElement.blur(); this._hlVisible = { type: 'help', sectionId }; R.appendChild(this.document.body, this._root); this._L('_showHelp, root:', this._root); setTimeout((/** * @return {?} */ () => { R.addClass(this._root, 'ngx-dm-tour-show'); this._onClickRemove = R.listen(this.document, 'click', (/** * @param {?} e * @return {?} */ e => this.hideControlsHelp(e))); this._onKeyupRemove = R.listen(this.document, 'keyup', (/** * @param {?} e * @return {?} */ e => this.hideControlsHelp(e))); })); } /** * @param {?=} e * @return {?} */ hideControlsHelp(e) { this.hideHelp(e); } /** * @param {?=} e * @param {?=} cb * @return {?} */ hideHelp(e, cb) { this._L('hideHelp'); if (e) { e.stopImmediatePropagation(); e.preventDefault(); } if (this._onClickRemove) { this._onClickRemove(); this._onClickRemove = null; } if (this._onKeyupRemove) { this._onKeyupRemove(); this._onKeyupRemove = null; } if (this._root && this._r2) { this._r2.removeClass(this._root, 'ngx-dm-tour-show'); setTimeout((/** * @return {?} */ () => { if (this._root) { this._root.remove(); } this._hlVisible = null; if (cb) { cb(); } }), 500); } else { this._hlVisible = null; if (cb) { cb(); } } } /** * @private * @param {?} el * @return {?} */ _getBoundaries(el) { if (!el || !el.getBoundingClientRect) { return null; } return el.getBoundingClientRect(); } /** * @private * @return {?} */ _showLoading() { /** @type {?} */ const R = this._r2; /** @type {?} */ const obd = this.document.querySelector('#ngxDmTourLoading'); if (obd) { obd.remove(); } /** @type {?} */ const root = R.createElement('div'); R.setAttribute(root, 'id', 'ngxDmTourLoading'); if (this._cfg.customCssClass) { R.addClass(root, this._cfg.customCssClass); } root.innerHTML = this._cfg.loaderHtml; this.document.activeElement.blur(); R.appendChild(this.document.body, root); setTimeout((/** * @return {?} */ () => R.setStyle(root, 'background-color', 'var(--ngx-dm-tour-loading-bg-color, rgba(0,0,0,.3))'))); } /** * @private * @return {?} */ _hideLoading() { /** @type {?} */ const R = this._r2; /** @type {?} */ const obd = this.document.querySelector('#ngxDmTourLoading'); if (obd) { obd.remove(); } } /** * @private * @param {?} err * @return {?} */ _handleLoadError(err) { this._W('[ngx-dm-tour] load error:', err); } /** * @private * @return {?} */ _addGlobalStyles() { /** @type {?} */ const obd = this.document.head.querySelector('#ngxDmTourStyles'); if (!obd) { /** @type {?} */ const R = this._r2; /** @type {?} */ const root = R.createElement('style'); R.setAttribute(root, 'id', 'ngxDmTourStyles'); root.innerHTML = GLOBAL_STYLES; R.appendChild(this.document.head, root); } } /** * @private * @param {...?} args * @return {?} */ _L(...args) { if (this._cfg.debug > 0) { console.log('[ngx-dm-tour]', ...args); } } /** * @private * @param {...?} args * @return {?} */ _W(...args) { if (this._cfg.debug > 1) { console.warn('[ngx-dm-tour]', ...args); } } } DmTourService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ DmTourService.ctorParameters = () => [ { type: RendererFactory2 }, { type: HttpClient }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: DmTourConfig, decorators: [{ type: Inject, args: [DM_TOUR_CONF,] }, { type: Optional }] } ]; /** @nocollapse */ DmTourService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DmTourService_Factory() { return new DmTourService(i0.ɵɵinject(i0.RendererFactory2), i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.DOCUMENT), i0.ɵɵinject(i3.DM_TOUR_CONF, 8)); }, token: DmTourService, providedIn: "root" }); if (false) { /** * @type {?} * @private */ DmTourService.prototype._cfg; /** * @type {?} * @private */ DmTourService.prototype._sections; /** * @type {?} * @private */ DmTourService.prototype._controls; /** * @type {?} * @private */ DmTourService.prototype._r2; /** * @type {?} * @private */ DmTourService.prototype._root; /** * @type {?} * @private */ DmTourService.prototype._onClickRemove; /** * @type {?} * @private */ DmTourService.prototype._onKeyupRemove; /** * @type {?} * @private */ DmTourService.prototype._hlVisible; /** * @type {?} * @private */ DmTourService.prototype._rendererFactory; /** * @type {?} * @private */ DmTourService.prototype._http; /** * @type {?} * @private */ DmTourService.prototype.document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG0tdG91ci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRpbWFub2lkL25neC1kbS10b3VyLyIsInNvdXJjZXMiOlsibGliL2RtLXRvdXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWMsTUFBTSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQWdDLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7Ozs7O0FBS3RELE1BQU0sT0FBTyxhQUFhOzs7Ozs7O0lBYXRCLFlBQ1ksZ0JBQWtDLEVBQ2xDLEtBQWlCLEVBQ0MsUUFBUSxFQUNBLEdBQWlCO1FBSDNDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNDLGFBQVEsR0FBUixRQUFRLENBQUE7UUFaOUIsY0FBUyxHQUE2RCxFQUFFLENBQUM7UUFPekUsZUFBVSxHQUFxRCxJQUFJLENBQUM7UUFReEUsSUFBSSxDQUFDLElBQUksR0FBSSxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENB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