@dimanoid/ngx-dm-tour
Version:
891 lines • 89.3 kB
JavaScript
/**
* @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG0tdG91ci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRpbWFub2lkL25neC1kbS10b3VyLyIsInNvdXJjZXMiOlsibGliL2RtLXRvdXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWMsTUFBTSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQWdDLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7Ozs7O0FBS3RELE1BQU0sT0FBTyxhQUFhOzs7Ozs7O0lBYXRCLFlBQ1ksZ0JBQWtDLEVBQ2xDLEtBQWlCLEVBQ0MsUUFBUSxFQUNBLEdBQWlCO1FBSDNDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNDLGFBQVEsR0FBUixRQUFRLENBQUE7UUFaOUIsY0FBUyxHQUE2RCxFQUFFLENBQUM7UUFPekUsZUFBVSxHQUFxRCxJQUFJLENBQUM7UUFReEUsSUFBSSxDQUFDLElBQUksR0FBSSxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUM1QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUzs7O1lBQzFCLEdBQUcsRUFBRSxHQUFFLENBQUM7Ozs7WUFDUixHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFDcEMsQ0FBQztTQUNMO1FBQ0QsSUFBSSxjQUFjLEVBQUU7O2tCQUNWLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBUTtZQUNuQyxJQUFJLGNBQWM7OztZQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUzs7O1lBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFDLENBQUM7U0FDcEU7SUFDTCxDQUFDOzs7OztJQUVPLFFBQVE7UUFDWixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxVQUFVLEVBQUU7O2tCQUMzRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7WUFDeEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0IsSUFBSSxFQUFFLEVBQUU7Z0JBQ0osRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQ3JCO1lBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzlCOztrQkFDSyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMvQjtJQUNMLENBQUM7Ozs7Ozs7SUFFRCxlQUFlLENBQUMsU0FBaUIsRUFBRSxFQUFVLEVBQUUsRUFBYztRQUN6RCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQzFCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsK0JBQStCLFNBQVMsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7SUFDeEQsQ0FBQzs7Ozs7O0lBRUQsaUJBQWlCLENBQUMsU0FBaUIsRUFBRSxFQUFVO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDN0QsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsU0FBUyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1QyxDQUFDOzs7OztJQUVELGdCQUFnQixDQUFDLFNBQWlCO1FBQzlCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUzs7O1lBQzFCLEdBQUcsRUFBRTtnQkFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUzs7O2dCQUMxQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDOzs7O2dCQUN2QyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFDcEMsQ0FBQztZQUNOLENBQUM7Ozs7WUFDRCxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFDcEMsQ0FBQztTQUNMO2FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixTQUFTLFlBQVksQ0FBQyxDQUFDO1NBQzFFO2FBQ0ksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUU7WUFDN0UsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVM7OztZQUMxQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDOzs7O1lBQ3ZDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUNwQyxDQUFDO1NBQ0w7YUFDSTtZQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNyQztJQUNMLENBQUM7Ozs7O0lBRUQsUUFBUSxDQUFDLFNBQWlCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUzs7O1lBQzFCLEdBQUcsRUFBRTtnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUzs7O2dCQUN0QyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQzs7OztnQkFDL0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQ3BDLENBQUM7WUFDTixDQUFDOzs7O1lBQ0QsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQ3BDLENBQUM7U0FDTDthQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsU0FBUyxZQUFZLENBQUMsQ0FBQztTQUMxRTthQUNJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxFQUFFO1lBQzdFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTOzs7WUFDdEMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7Ozs7WUFDL0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQ3BDLENBQUM7U0FDTDthQUNJO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7Ozs7O0lBRU8sYUFBYTtRQUNqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsT0FBTyxJQUFJLFVBQVU7Ozs7UUFBQyxHQUFHLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBZ0MsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsU0FBUzs7OztZQUN2RixHQUFHLENBQUMsRUFBRTtnQkFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO29CQUNwQixLQUFLLE1BQU0sT0FBTyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7d0JBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQztxQkFDeEM7b0JBQ0QsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNkO3FCQUNJO29CQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztpQkFDdEU7WUFDTCxDQUFDOzs7O1lBQ0QsR0FBRyxDQUFDLEVBQUU7Z0JBQ0YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNwQixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLENBQUMsRUFDSixDQUFDO1FBQ04sQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDOzs7Ozs7SUFFTyxvQkFBb0IsQ0FBQyxTQUFpQjtRQUMxQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDbEM7UUFDRCxPQUFPLElBQUksVUFBVTs7OztRQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFnQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsYUFBYSxDQUFDLENBQUMsU0FBUzs7OztZQUNwRyxHQUFHLENBQUMsRUFBRTtnQkFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTs7OEJBQ3ZCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3FCQUMzRDtvQkFDRCxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ2Q7cUJBQ0k7b0JBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO2lCQUM5RDtZQUNMLENBQUM7Ozs7WUFDRCxHQUFHLENBQUMsRUFBRTtnQkFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxFQUNKLENBQUM7UUFDTixDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7OztJQUVPLGdCQUFnQixDQUFDLFNBQWlCO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksVUFBVTs7OztRQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksU0FBUyxhQUFhLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxTQUFTOzs7O1lBQy9GLEdBQUcsQ0FBQyxFQUFFO2dCQUNGLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztnQkFDckMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsQ0FBQzs7OztZQUNELEdBQUcsQ0FBQyxFQUFFO2dCQUNGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDLEVBQ0osQ0FBQztRQUNOLENBQUMsRUFBQyxDQUFDO0lBQ1AsQ0FBQzs7Ozs7O0lBRU8saUJBQWlCLENBQUMsU0FBaUI7O2NBQ2pDLEdBQUcsR0FBYSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM3RixJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUMsNkRBQTZELFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbkYsT0FBTztTQUNWOztjQUNLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRzs7Y0FDWixFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7UUFDeEQsSUFBSSxFQUFFLEVBQUU7WUFDSixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3pDOztjQUNLLEdBQUcsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7O2NBQ25DLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7O1lBRXZDLElBQVM7O2NBRVAsR0FBRyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2hELElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztjQUVuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDOztjQUM5QyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDOztjQUVyQixHQUFHLEdBQVUsRUFBRTtRQUNyQixLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTs7a0JBQ1osQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTs7MEJBQ2pCLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7b0JBQ3RDLElBQUksRUFBRSxFQUFFO3dCQUNKLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ2hCO2lCQUNKO3FCQUNJLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtvQkFDakIsS0FBSyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO3dCQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUU7O2tDQUNILEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUM7NEJBQ3ZDLElBQUksRUFBRSxFQUFFO2dDQUNKLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7NkJBQ2hCO3lCQUNKO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtRQUNELElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDakIsSUFBSSxDQUFDLEVBQUUsQ0FBQyw2REFBNkQsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNuRixPQUFPO1NBQ1Y7UUFDRCxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQzs7Y0FFbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQztRQUMzQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzFCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3BEOztjQUNLLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztRQUNuQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFekIsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDbEQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsVUFBVTs7O1FBQUMsR0FBRyxFQUFFO1lBQ1osQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTzs7OztZQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTzs7OztZQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7UUFDMUYsQ0FBQyxHQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1osQ0FBQzs7Ozs7OztJQUVPLGFBQWEsQ0FBQyxDQUFnQixFQUFFLElBQVM7O2NBQ3ZDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTs7Y0FDL0MsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLOztjQUNmLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRzs7Y0FDWixFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7Y0FDeEUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDOztjQUMzQixHQUFHLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQzdDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7O2NBQ0ssS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLO1lBQ2pCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztZQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxNQUFNO2dCQUM5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ3pELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7UUFDaEMsSUFBSSxLQUFLLElBQUksUUFBUSxFQUFFOztrQkFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0MsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRCxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsd0NBQXdDLENBQUMsQ0FBQztZQUM3RSxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO1lBQ2pGLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzNCO2FBQ0k7O2tCQUNLLEVBQUUsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUM7O2tCQUNyQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7WUFDN0UsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUNqRixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMzQjs7Y0FFSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDakMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7Y0FDN0IsR0FBRyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7WUFDbkIsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQzVELElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFO2dCQUNiLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQzthQUMzQjtpQkFDSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUU7Z0JBQy9CLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUM3QjtpQkFDSSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBQ2pDLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUM5QjtpQkFDSSxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFO2dCQUNuQixHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDNUI7aUJBQ0k7Z0JBQ0QsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQzlCO1NBQ0o7YUFDSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3RCLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEI7O1lBQ0csQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztZQUM1QixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O1lBQzVCLEVBQUUsR0FBRyxDQUFDLEVBQUU7O1lBQ1IsRUFBRSxHQUFHLENBQUMsRUFBRTtRQUNaLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRTtZQUNqQixFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDVixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQUU7Z0JBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDZDtpQkFDSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUU7Z0JBQ3hCLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFDVixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUNmO1NBQ0o7YUFDSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUU7WUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNQLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQUU7Z0JBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDZDtpQkFDSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUU7Z0JBQ3hCLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFDVixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUNmO1NBQ0o7YUFDSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDdkIsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ1YsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRTtnQkFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDUCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQzthQUNiO2lCQUNJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBRTtnQkFDekIsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUNWLENBQUMsR0FBRyxDQ