UNPKG

@betokyo/ui-components

Version:

As part of a school project, the BeTokyo UI components library allows us to reuse components in each of our web apps.

159 lines 28.9 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; const MONTHS = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; const DAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']; export class CalendarComponent { constructor() { this.clickHandler = new EventEmitter(); this.changeHandler = new EventEmitter(); } ngOnInit() { if (this.months === undefined) { this.months = [...MONTHS]; } if (this.days === undefined) { this.days = [...DAYS]; } } onClickHandler(day) { if (day.month !== undefined) { this.clickHandler.emit(new DateSelectedEvent(this.schedule.year, day.month, day.date)); } } onNextHandler() { if (this.schedule.month == 12) { this.changeHandler.emit({ month: 1, year: this.schedule.year + 1 }); } else { this.changeHandler.emit({ month: this.schedule.month + 1, year: this.schedule.year }); } } onPrevHandler() { if (this.schedule.month == 1) { this.changeHandler.emit({ month: 12, year: this.schedule.year - 1 }); } else { this.changeHandler.emit({ month: this.schedule.month - 1, year: this.schedule.year }); } } isPrevDisabled() { return this.schedule.month <= (new Date().getMonth() + 1); } month() { if (this.month !== undefined) { return this.months[this.schedule.month - 1]; } throw new Error('Unknown month'); } scheduleDays() { return [ ...this.getPrevDays(), ...this.getScheduleDays(), ...this.getNextDays() ]; } getScheduleDays() { const today = new Date(); const currentMonth = today.getMonth() + 1; if (currentMonth < this.schedule.month) { return this.schedule.days.map(day => { return { ...day, month: this.schedule.month }; }); } if (currentMonth > this.schedule.month) { return this.schedule.days.map(day => { return { ...day, available: false, month: this.schedule.month }; }); } const todayDate = today.getDate(); return this.schedule.days.map(day => { return (day.date >= todayDate) ? { ...day, month: this.schedule.month } : { ...day, available: false, month: this.schedule.month }; }); } getPrevDays() { const current = new Date(`${this.schedule.year}-${this.schedule.month}-01`); const days = []; const lastDayOfMonth = new Date(current); lastDayOfMonth.setDate(current.getDate() - 1); const dayOfWeek = lastDayOfMonth.getDay(); const month = lastDayOfMonth.getMonth() + 1; if (dayOfWeek < 6) { Array.from(Array(dayOfWeek + 1).keys()).forEach(() => { days.push({ date: lastDayOfMonth.getDate(), available: false, month: month }); lastDayOfMonth.setDate(lastDayOfMonth.getDate() - 1); }); } return [...days.reverse()]; } getNextDays() { const current = new Date(`${this.schedule.year}-${this.schedule.month}-01`); const days = []; const firstDayOfMonth = new Date(current); firstDayOfMonth.setMonth(current.getMonth() + 1); const dayOfWeek = firstDayOfMonth.getDay(); const month = firstDayOfMonth.getMonth() + 1; if (dayOfWeek > 0) { Array.from(Array(7 - dayOfWeek).keys()).forEach(x => { days.push({ date: x + 1, month: month, available: true }); }); } return [...days]; } } CalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: CalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); CalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: CalendarComponent, selector: "ui-calendar", inputs: { months: "months", days: "days", schedule: "schedule" }, outputs: { clickHandler: "clickHandler", changeHandler: "changeHandler" }, ngImport: i0, template: "<div class=\"calendar\">\n <nav class=\"calendar-nav\">\n <button type=\"button\" class=\"calendar-nav-button\" (click)=\"onPrevHandler()\" [disabled]=\"isPrevDisabled()\">\n <\n </button>\n <span class=\"calendar-nav-title\">\n {{ month() }} {{schedule.year}}\n </span>\n <button type=\"button\" class=\"calendar-nav-button\" (click)=\"onNextHandler()\">\n >\n </button>\n </nav>\n <div class=\"calendar-header-row\">\n <span *ngFor=\"let dayName of days\" class=\"calendar-header-title\">\n {{dayName}}\n </span>\n </div>\n <div class=\"calendar-body-row\">\n <button type=\"button\" *ngFor=\"let day of scheduleDays()\" class=\"calendar-day-button\" [disabled]=\"!day.available\"\n (click)=\"onClickHandler(day)\">{{day.date}}</button>\n </div>\n</div>", styles: [".calendar{color:var(--color-primary)}.calendar-nav{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:center;margin-left:auto;margin-right:auto;margin-top:var(--margin-v);margin-bottom:var(--margin-v)}.calendar-nav-title{text-transform:capitalize;font-size:small;font-weight:bolder;color:var(--color-primary)}.calendar-nav-button{cursor:pointer;padding:10px 14px;font-weight:700;border-radius:20px;border-width:0;background-color:var(--color-secondary)}.calendar-nav-button[disabled]{background-color:var(--color-secondary-80);color:var(--color-disabled)}.calendar-header-row{display:flex;flex-flow:row;justify-content:space-between;margin-left:auto;margin-right:auto;margin-top:var(--margin-v);margin-bottom:var(--margin-v)}.calendar-header-title{width:calc(100%/7);text-align:center;text-transform:uppercase;font-size:small;color:var(--color-primary)}.calendar-body-row{display:flex;flex-flow:row wrap;justify-content:flex-start}.calendar-day-button{width:calc(100%/7);padding:var(--padding);cursor:pointer;border-width:var(--boder-width);border-style:var(--border-style);border-color:transparent;border-radius:var(--border-radius);background-color:transparent}.calendar-day-button:hover:enabled{border-color:var(--color-primary);background-color:var(--color-primary);color:var(--color-text)}.calendar-day-button[disabled]{color:var(--color-disabled);text-decoration:line-through}@media screen and (min-width: 414px){.calendar{max-width:var(--max-width);margin:auto}}\n", ":host{--color-pending: #FCD64F;--color-accepted: #82C784;--color-cancelled: #A22A44;--color-proposed: #F79F4D;--color-declined: #E6E6E6;--color-ended: #B2CCD6;--color-text: #FFFFFF;--color-base: #000000;--color-available: #2ECC71;--color-disabled: #D2D2D2;--color-primary: #1D2C54;--color-primary-80: rgba(29, 44, 84, .8);--color-primary-50: rgba(29, 44, 84, .5);--color-primary-20: rgba(29, 44, 84, .2);--color-secondary: #D9D9D9;--color-secondary-80: rgba(217, 217, 217, .8);--color-secondary-50: rgba(217, 217, 217, .5);--color-secondary-20: rgba(217, 217, 217, .2);--color-danger: #A22A44;--color-danger-80: rgba(162, 42, 68, .8);--color-danger-50: rgba(162, 42, 68, .5);--color-danger-20: rgba(162, 42, 68, .2);--color-light: #D9D9D9;--color-light-80: rgba(217, 217, 217, .8);--color-light-50: rgba(217, 217, 217, .5);--color-light-20: rgba(217, 217, 217, .2);--color-dark: #000000;--color-dark-80: rgba(0, 0, 0, .8);--color-dark-50: rgba(0, 0, 0, .5);--color-dark-20: rgba(0, 0, 0, .2);--max-width: 315px;--margin-v: 10px;--padding-h: 20px;--padding-v: 15px;--padding: 10px;--small-padding: 5px;--border-radius: 5px;--border-width: 1px;--border-style: solid;--large-mobile: 414px;--mobile-w: 480px;--tablet-w: 768px;--laptop-w: 1024px}h1{font-family:DM Sans,sans-serif;font-size:2em;margin:5px 0}h2{font-family:Dhyana,sans-serif;font-size:1.4em;margin:5px 0}h3{font-family:Dhyana,sans-serif;font-size:1.2em;margin:5px 0}.element-title{font-family:Doppio One,sans-serif;font-size:16px;font-weight:700;line-height:140%}.description-text{font-family:Dhyana,sans-serif;font-size:24px;line-height:140%}.card-text{font-family:Dhyana,sans-serif;font-size:16px;line-height:140%}html,body,div,p,span,button,link{color:var(--color-dark-80);font-family:Dhyana,sans-serif}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: CalendarComponent, decorators: [{ type: Component, args: [{ selector: 'ui-calendar', template: "<div class=\"calendar\">\n <nav class=\"calendar-nav\">\n <button type=\"button\" class=\"calendar-nav-button\" (click)=\"onPrevHandler()\" [disabled]=\"isPrevDisabled()\">\n <\n </button>\n <span class=\"calendar-nav-title\">\n {{ month() }} {{schedule.year}}\n </span>\n <button type=\"button\" class=\"calendar-nav-button\" (click)=\"onNextHandler()\">\n >\n </button>\n </nav>\n <div class=\"calendar-header-row\">\n <span *ngFor=\"let dayName of days\" class=\"calendar-header-title\">\n {{dayName}}\n </span>\n </div>\n <div class=\"calendar-body-row\">\n <button type=\"button\" *ngFor=\"let day of scheduleDays()\" class=\"calendar-day-button\" [disabled]=\"!day.available\"\n (click)=\"onClickHandler(day)\">{{day.date}}</button>\n </div>\n</div>", styles: [".calendar{color:var(--color-primary)}.calendar-nav{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:center;margin-left:auto;margin-right:auto;margin-top:var(--margin-v);margin-bottom:var(--margin-v)}.calendar-nav-title{text-transform:capitalize;font-size:small;font-weight:bolder;color:var(--color-primary)}.calendar-nav-button{cursor:pointer;padding:10px 14px;font-weight:700;border-radius:20px;border-width:0;background-color:var(--color-secondary)}.calendar-nav-button[disabled]{background-color:var(--color-secondary-80);color:var(--color-disabled)}.calendar-header-row{display:flex;flex-flow:row;justify-content:space-between;margin-left:auto;margin-right:auto;margin-top:var(--margin-v);margin-bottom:var(--margin-v)}.calendar-header-title{width:calc(100%/7);text-align:center;text-transform:uppercase;font-size:small;color:var(--color-primary)}.calendar-body-row{display:flex;flex-flow:row wrap;justify-content:flex-start}.calendar-day-button{width:calc(100%/7);padding:var(--padding);cursor:pointer;border-width:var(--boder-width);border-style:var(--border-style);border-color:transparent;border-radius:var(--border-radius);background-color:transparent}.calendar-day-button:hover:enabled{border-color:var(--color-primary);background-color:var(--color-primary);color:var(--color-text)}.calendar-day-button[disabled]{color:var(--color-disabled);text-decoration:line-through}@media screen and (min-width: 414px){.calendar{max-width:var(--max-width);margin:auto}}\n", ":host{--color-pending: #FCD64F;--color-accepted: #82C784;--color-cancelled: #A22A44;--color-proposed: #F79F4D;--color-declined: #E6E6E6;--color-ended: #B2CCD6;--color-text: #FFFFFF;--color-base: #000000;--color-available: #2ECC71;--color-disabled: #D2D2D2;--color-primary: #1D2C54;--color-primary-80: rgba(29, 44, 84, .8);--color-primary-50: rgba(29, 44, 84, .5);--color-primary-20: rgba(29, 44, 84, .2);--color-secondary: #D9D9D9;--color-secondary-80: rgba(217, 217, 217, .8);--color-secondary-50: rgba(217, 217, 217, .5);--color-secondary-20: rgba(217, 217, 217, .2);--color-danger: #A22A44;--color-danger-80: rgba(162, 42, 68, .8);--color-danger-50: rgba(162, 42, 68, .5);--color-danger-20: rgba(162, 42, 68, .2);--color-light: #D9D9D9;--color-light-80: rgba(217, 217, 217, .8);--color-light-50: rgba(217, 217, 217, .5);--color-light-20: rgba(217, 217, 217, .2);--color-dark: #000000;--color-dark-80: rgba(0, 0, 0, .8);--color-dark-50: rgba(0, 0, 0, .5);--color-dark-20: rgba(0, 0, 0, .2);--max-width: 315px;--margin-v: 10px;--padding-h: 20px;--padding-v: 15px;--padding: 10px;--small-padding: 5px;--border-radius: 5px;--border-width: 1px;--border-style: solid;--large-mobile: 414px;--mobile-w: 480px;--tablet-w: 768px;--laptop-w: 1024px}h1{font-family:DM Sans,sans-serif;font-size:2em;margin:5px 0}h2{font-family:Dhyana,sans-serif;font-size:1.4em;margin:5px 0}h3{font-family:Dhyana,sans-serif;font-size:1.2em;margin:5px 0}.element-title{font-family:Doppio One,sans-serif;font-size:16px;font-weight:700;line-height:140%}.description-text{font-family:Dhyana,sans-serif;font-size:24px;line-height:140%}.card-text{font-family:Dhyana,sans-serif;font-size:16px;line-height:140%}html,body,div,p,span,button,link{color:var(--color-dark-80);font-family:Dhyana,sans-serif}\n"] }] }], propDecorators: { months: [{ type: Input }], days: [{ type: Input }], schedule: [{ type: Input }], clickHandler: [{ type: Output }], changeHandler: [{ type: Output }] } }); export class DateSelectedEvent { constructor(year, month, date) { this.year = year; this.month = month; this.date = date; } toString() { return `${this.year}-${this.toTwoString(this.month)}-${this.toTwoString(this.date)}`; } toTwoString(n) { return n < 10 ? `0${n}` : `${n}`; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvdWkvY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvdWkvY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBRS9FLE1BQU0sTUFBTSxHQUFhLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNwSixNQUFNLElBQUksR0FBYSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBT3RHLE1BQU0sT0FBTyxpQkFBaUI7SUFMOUI7UUFVbUIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUNyRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO0tBb0l2RTtJQWxJQyxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztTQUMzQjtRQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQVE7UUFDckIsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDeEY7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUN0QixLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQzthQUM3QixDQUFDLENBQUE7U0FDSDthQUNJO1lBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RCLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDO2dCQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2FBQ3pCLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDdEIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUM7YUFDN0IsQ0FBQyxDQUFBO1NBQ0g7YUFDSTtZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQztnQkFDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSTthQUN6QixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLE1BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM5QztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7U0FDdEIsQ0FBQTtJQUNILENBQUM7SUFFTyxlQUFlO1FBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekIsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUxQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtZQUN0QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEMsT0FBTztvQkFDTCxHQUFHLEdBQUc7b0JBQ04sS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztpQkFDM0IsQ0FBQTtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtZQUN0QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEMsT0FBTztvQkFDTCxHQUFHLEdBQUc7b0JBQ04sU0FBUyxFQUFFLEtBQUs7b0JBQ2hCLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7aUJBQzNCLENBQUE7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO1FBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsR0FBRyxHQUFHO2dCQUNOLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7YUFDM0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ0YsR0FBRyxHQUFHO2dCQUNOLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLO2FBQzNCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQzVFLE1BQU0sSUFBSSxHQUEwRCxFQUFFLENBQUM7UUFDdkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7Z0JBQzdFLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU8sV0FBVztRQUNqQixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUM1RSxNQUFNLElBQUksR0FBMEQsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sZUFBZSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtZQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBQzNELENBQUMsQ0FBQyxDQUFBO1NBQ0g7UUFDRCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDOzs4R0F6SVUsaUJBQWlCO2tHQUFqQixpQkFBaUIsZ01DVjlCLCt5QkFxQk07MkZEWE8saUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGFBQWE7OEJBTVAsTUFBTTtzQkFBckIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1csWUFBWTtzQkFBNUIsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNOztBQXVKVCxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLFlBQ1MsSUFBWSxFQUNaLEtBQWEsRUFDYixJQUFZO1FBRlosU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUksQ0FBQztJQUUxQixRQUFRO1FBQ04sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUN2RixDQUFDO0lBRU8sV0FBVyxDQUFDLENBQVM7UUFDM0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ25DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuY29uc3QgTU9OVEhTOiBzdHJpbmdbXSA9IFsnamFudWFyeScsICdmZWJydWFyeScsICdtYXJjaCcsICdhcHJpbCcsICdtYXknLCAnanVuZScsICdqdWx5JywgJ2F1Z3VzdCcsICdzZXB0ZW1iZXInLCAnb2N0b2JlcicsICdub3ZlbWJlcicsICdkZWNlbWJlciddO1xuY29uc3QgREFZUzogc3RyaW5nW10gPSBbJ3N1bmRheScsICdtb25kYXknLCAndHVlc2RheScsICd3ZWRuZXNkYXknLCAndGh1cnNkYXknLCAnZnJpZGF5JywgJ3NhdHVyZGF5J107XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3VpLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LmNzcycsICcuLi9hc3NldHMvc3R5bGVzL3RoZW1lLmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBwdWJsaWMgbW9udGhzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgcHVibGljIGRheXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBwdWJsaWMgc2NoZWR1bGUhOiBNb250aFNjaGVkdWxlO1xuICBAT3V0cHV0KCkgcHVibGljIGNsaWNrSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVNlbGVjdGVkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhbmdlTW9udGhFdmVudD4oKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb250aHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5tb250aHMgPSBbLi4uTU9OVEhTXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF5cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRheXMgPSBbLi4uREFZU107XG4gICAgfVxuICB9XG5cbiAgb25DbGlja0hhbmRsZXIoZGF5OiBEYXkpOiB2b2lkIHtcbiAgICBpZiAoZGF5Lm1vbnRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tIYW5kbGVyLmVtaXQobmV3IERhdGVTZWxlY3RlZEV2ZW50KHRoaXMuc2NoZWR1bGUueWVhciwgZGF5Lm1vbnRoLCBkYXkuZGF0ZSkpO1xuICAgIH1cbiAgfVxuXG4gIG9uTmV4dEhhbmRsZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2NoZWR1bGUubW9udGggPT0gMTIpIHtcbiAgICAgIHRoaXMuY2hhbmdlSGFuZGxlci5lbWl0KHtcbiAgICAgICAgbW9udGg6IDEsXG4gICAgICAgIHllYXI6IHRoaXMuc2NoZWR1bGUueWVhciArIDFcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jaGFuZ2VIYW5kbGVyLmVtaXQoe1xuICAgICAgICBtb250aDogdGhpcy5zY2hlZHVsZS5tb250aCArIDEsXG4gICAgICAgIHllYXI6IHRoaXMuc2NoZWR1bGUueWVhclxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25QcmV2SGFuZGxlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zY2hlZHVsZS5tb250aCA9PSAxKSB7XG4gICAgICB0aGlzLmNoYW5nZUhhbmRsZXIuZW1pdCh7XG4gICAgICAgIG1vbnRoOiAxMixcbiAgICAgICAgeWVhcjogdGhpcy5zY2hlZHVsZS55ZWFyIC0gMVxuICAgICAgfSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmNoYW5nZUhhbmRsZXIuZW1pdCh7XG4gICAgICAgIG1vbnRoOiB0aGlzLnNjaGVkdWxlLm1vbnRoIC0gMSxcbiAgICAgICAgeWVhcjogdGhpcy5zY2hlZHVsZS55ZWFyXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1ByZXZEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlZHVsZS5tb250aCA8PSAobmV3IERhdGUoKS5nZXRNb250aCgpICsgMSlcbiAgfVxuXG4gIG1vbnRoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubW9udGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubW9udGhzIVt0aGlzLnNjaGVkdWxlLm1vbnRoIC0gMV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtb250aCcpO1xuICB9XG5cbiAgc2NoZWR1bGVEYXlzKCk6IERheVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5nZXRQcmV2RGF5cygpLFxuICAgICAgLi4udGhpcy5nZXRTY2hlZHVsZURheXMoKSxcbiAgICAgIC4uLnRoaXMuZ2V0TmV4dERheXMoKVxuICAgIF1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NoZWR1bGVEYXlzKCk6IERheVtdIHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgY3VycmVudE1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKSArIDE7XG5cbiAgICBpZiAoY3VycmVudE1vbnRoIDwgdGhpcy5zY2hlZHVsZS5tb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGUuZGF5cy5tYXAoZGF5ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5kYXksXG4gICAgICAgICAgbW9udGg6IHRoaXMuc2NoZWR1bGUubW9udGhcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRNb250aCA+IHRoaXMuc2NoZWR1bGUubW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlLmRheXMubWFwKGRheSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGF5LFxuICAgICAgICAgIGF2YWlsYWJsZTogZmFsc2UsXG4gICAgICAgICAgbW9udGg6IHRoaXMuc2NoZWR1bGUubW9udGhcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCB0b2RheURhdGUgPSB0b2RheS5nZXREYXRlKCk7XG4gICAgcmV0dXJuIHRoaXMuc2NoZWR1bGUuZGF5cy5tYXAoZGF5ID0+IHtcbiAgICAgIHJldHVybiAoZGF5LmRhdGUgPj0gdG9kYXlEYXRlKSA/IHtcbiAgICAgICAgLi4uZGF5LFxuICAgICAgICBtb250aDogdGhpcy5zY2hlZHVsZS5tb250aFxuICAgICAgfSA6IHtcbiAgICAgICAgLi4uZGF5LFxuICAgICAgICBhdmFpbGFibGU6IGZhbHNlLFxuICAgICAgICBtb250aDogdGhpcy5zY2hlZHVsZS5tb250aFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJldkRheXMoKTogRGF5W10ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBuZXcgRGF0ZShgJHt0aGlzLnNjaGVkdWxlLnllYXJ9LSR7dGhpcy5zY2hlZHVsZS5tb250aH0tMDFgKTtcbiAgICBjb25zdCBkYXlzOiB7IGRhdGU6IG51bWJlciwgYXZhaWxhYmxlOiBib29sZWFuLCBtb250aDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGNvbnN0IGxhc3REYXlPZk1vbnRoID0gbmV3IERhdGUoY3VycmVudCk7XG4gICAgbGFzdERheU9mTW9udGguc2V0RGF0ZShjdXJyZW50LmdldERhdGUoKSAtIDEpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGxhc3REYXlPZk1vbnRoLmdldERheSgpO1xuICAgIGNvbnN0IG1vbnRoID0gbGFzdERheU9mTW9udGguZ2V0TW9udGgoKSArIDE7XG4gICAgaWYgKGRheU9mV2VlayA8IDYpIHtcbiAgICAgIEFycmF5LmZyb20oQXJyYXkoZGF5T2ZXZWVrICsgMSkua2V5cygpKS5mb3JFYWNoKCgpID0+IHtcbiAgICAgICAgZGF5cy5wdXNoKHsgZGF0ZTogbGFzdERheU9mTW9udGguZ2V0RGF0ZSgpLCBhdmFpbGFibGU6IGZhbHNlLCBtb250aDogbW9udGggfSlcbiAgICAgICAgbGFzdERheU9mTW9udGguc2V0RGF0ZShsYXN0RGF5T2ZNb250aC5nZXREYXRlKCkgLSAxKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBbLi4uZGF5cy5yZXZlcnNlKCldO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROZXh0RGF5cygpOiBEYXlbXSB7XG4gICAgY29uc3QgY3VycmVudCA9IG5ldyBEYXRlKGAke3RoaXMuc2NoZWR1bGUueWVhcn0tJHt0aGlzLnNjaGVkdWxlLm1vbnRofS0wMWApO1xuICAgIGNvbnN0IGRheXM6IHsgZGF0ZTogbnVtYmVyLCBtb250aDogbnVtYmVyLCBhdmFpbGFibGU6IGJvb2xlYW4gfVtdID0gW107XG4gICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gbmV3IERhdGUoY3VycmVudCk7XG4gICAgZmlyc3REYXlPZk1vbnRoLnNldE1vbnRoKGN1cnJlbnQuZ2V0TW9udGgoKSArIDEpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGZpcnN0RGF5T2ZNb250aC5nZXREYXkoKTtcbiAgICBjb25zdCBtb250aCA9IGZpcnN0RGF5T2ZNb250aC5nZXRNb250aCgpICsgMTtcbiAgICBpZiAoZGF5T2ZXZWVrID4gMCkge1xuICAgICAgQXJyYXkuZnJvbShBcnJheSg3IC0gZGF5T2ZXZWVrKS5rZXlzKCkpLmZvckVhY2goeCA9PiB7XG4gICAgICAgIGRheXMucHVzaCh7IGRhdGU6IHggKyAxLCBtb250aDogbW9udGgsIGF2YWlsYWJsZTogdHJ1ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5kYXlzXTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRoU2NoZWR1bGUge1xuICB5ZWFyOiBudW1iZXI7XG4gIG1vbnRoOiBudW1iZXI7XG4gIGRheXM6IERheVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERheSB7XG4gIGRhdGU6IG51bWJlcjtcbiAgbW9udGg/OiBudW1iZXI7XG4gIGF2YWlsYWJsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFuZ2VNb250aEV2ZW50IHtcbiAgeWVhcjogbnVtYmVyO1xuICBtb250aDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRGF0ZVNlbGVjdGVkRXZlbnQge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB5ZWFyOiBudW1iZXIsXG4gICAgcHVibGljIG1vbnRoOiBudW1iZXIsXG4gICAgcHVibGljIGRhdGU6IG51bWJlcikgeyB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy55ZWFyfS0ke3RoaXMudG9Ud29TdHJpbmcodGhpcy5tb250aCl9LSR7dGhpcy50b1R3b1N0cmluZyh0aGlzLmRhdGUpfWA7XG4gIH1cblxuICBwcml2YXRlIHRvVHdvU3RyaW5nKG46IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG4gPCAxMCA/IGAwJHtufWAgOiBgJHtufWA7XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiY2FsZW5kYXJcIj5cbiAgPG5hdiBjbGFzcz1cImNhbGVuZGFyLW5hdlwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2FsZW5kYXItbmF2LWJ1dHRvblwiIChjbGljayk9XCJvblByZXZIYW5kbGVyKClcIiBbZGlzYWJsZWRdPVwiaXNQcmV2RGlzYWJsZWQoKVwiPlxuICAgICAgPFxuICAgIDwvYnV0dG9uPlxuICAgIDxzcGFuIGNsYXNzPVwiY2FsZW5kYXItbmF2LXRpdGxlXCI+XG4gICAgICB7eyBtb250aCgpIH19IHt7c2NoZWR1bGUueWVhcn19XG4gICAgPC9zcGFuPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2FsZW5kYXItbmF2LWJ1dHRvblwiIChjbGljayk9XCJvbk5leHRIYW5kbGVyKClcIj5cbiAgICAgID5cbiAgICA8L2J1dHRvbj5cbiAgPC9uYXY+XG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXItcm93XCI+XG4gICAgPHNwYW4gKm5nRm9yPVwibGV0IGRheU5hbWUgb2YgZGF5c1wiIGNsYXNzPVwiY2FsZW5kYXItaGVhZGVyLXRpdGxlXCI+XG4gICAgICB7e2RheU5hbWV9fVxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ib2R5LXJvd1wiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygc2NoZWR1bGVEYXlzKClcIiBjbGFzcz1cImNhbGVuZGFyLWRheS1idXR0b25cIiBbZGlzYWJsZWRdPVwiIWRheS5hdmFpbGFibGVcIlxuICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tIYW5kbGVyKGRheSlcIj57e2RheS5kYXRlfX08L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=