@almatar/smart-booking-dashboard 0.0.2-alpha.4 → 0.0.2-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +33 -19
  2. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +14 -28
  3. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary-skeleton/almatar-hotel-auto-cancellation-refund-summary-skeleton.component.mjs +16 -0
  4. package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.mjs +10 -13
  5. package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +4 -4
  6. package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +3 -3
  7. package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +2 -30
  8. package/esm2022/lib/models/booking.types.mjs +8 -1
  9. package/fesm2022/almatar-smart-booking-dashboard.mjs +77 -88
  10. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
  11. package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
  12. package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +1 -1
  13. package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +1 -3
  14. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +2 -4
  15. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary-skeleton/almatar-hotel-auto-cancellation-refund-summary-skeleton.component.d.ts +7 -0
  16. package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.d.ts +1 -1
  17. package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +1 -1
  18. package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +1 -1
  19. package/lib/components/result-panel/result-panel.component.d.ts +1 -1
  20. package/lib/models/booking.types.d.ts +2 -0
  21. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +1 -1
  22. package/package.json +1 -1
  23. package/esm2022/lib/shared/store/selectors/currency.selectors.mjs +0 -9
  24. package/lib/shared/store/selectors/currency.selectors.d.ts +0 -2
@@ -92,7 +92,7 @@ export class SbdHotelContentComponent {
92
92
  return '—';
93
93
  return new Intl.NumberFormat('en-US', {
94
94
  style: 'currency',
95
- currency: 'SAR',
95
+ currency: this.bookingData()?.currency?.currencyCode,
96
96
  minimumFractionDigits: 2,
97
97
  }).format(price);
98
98
  }
@@ -120,7 +120,7 @@ export class SbdHotelContentComponent {
120
120
  return String(value);
121
121
  }
122
122
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdHotelContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
123
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdHotelContentComponent, isStandalone: true, selector: "app-sbd-hotel-content", inputs: { bookingData: { classPropertyName: "bookingData", publicName: "bookingData", isSignal: true, isRequired: true, transformFunction: null }, bookingStatus: { classPropertyName: "bookingStatus", publicName: "bookingStatus", isSignal: true, isRequired: true, transformFunction: null }, bookingId: { classPropertyName: "bookingId", publicName: "bookingId", isSignal: true, isRequired: true, transformFunction: null }, dataVerified: { classPropertyName: "dataVerified", publicName: "dataVerified", isSignal: true, isRequired: true, transformFunction: null }, bookingNotes: { classPropertyName: "bookingNotes", publicName: "bookingNotes", isSignal: true, isRequired: true, transformFunction: null }, bookingHistory: { classPropertyName: "bookingHistory", publicName: "bookingHistory", isSignal: true, isRequired: true, transformFunction: null }, historyGroups: { classPropertyName: "historyGroups", publicName: "historyGroups", isSignal: true, isRequired: true, transformFunction: null }, activeContextTab: { classPropertyName: "activeContextTab", publicName: "activeContextTab", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { cancelBooking: "cancelBooking", addNoteRequested: "addNoteRequested", contextTabChanged: "contextTabChanged" }, ngImport: i0, template: "<!-- 2-column layout for hotels -->\n<div class=\"sbd-hotel-content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-hotel-content__aside\">\n\n <!-- Data search at the top of the sidebar -->\n @if (bookingStatus() === 'success') {\n <app-sbd-data-search [data]=\"bookingData()\" />\n <app-sbd-hotel-itinerary-card [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-hotel-content__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-hotel-content__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Booking not found. Double-check the ID and product type, then try again.</span>\n </div>\n }\n\n <!-- Content once loaded -->\n @if (bookingStatus() === 'success') {\n\n <!-- Quick actions -->\n <div class=\"sbd-hotel-content__quick-actions\">\n <span class=\"sbd-hotel-content__quick-label\">Quick actions</span>\n @if (allPackagesCancelled()) {\n <div class=\"sbd-hotel-content__cancelled-status\">\n <i class=\"pi pi-check-circle\"></i>\n <span>All Packages Cancelled</span>\n </div>\n } @else {\n <button\n pButton\n label=\"Cancel Booking\"\n icon=\"pi pi-times-circle\"\n class=\"p-button-danger p-button-sm\"\n (click)=\"onCancelBooking()\">\n </button>\n }\n </div>\n\n <!-- Modern Data Overview Cards -->\n <div class=\"sbd-hotel-content__data-overview\">\n <h3 class=\"sbd-hotel-content__section-title\">Booking Overview</h3>\n\n <div class=\"sbd-hotel-content__data-grid\">\n <!-- Booking ID Card -->\n @if (bookingData()?.bookingId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--blue\">\n <i class=\"pi pi-bookmark\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Booking ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.bookingId }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel Name Card -->\n @if (bookingData()?.hotelName) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--purple\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelName }}</span>\n </div>\n </div>\n }\n\n <!-- Check-in Date Card -->\n @if (bookingData()?.dateFrom) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--green\">\n <i class=\"pi pi-calendar-plus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-in</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateFrom) }}</span>\n @if (bookingData()?.checkInTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkInTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Check-out Date Card -->\n @if (bookingData()?.dateTo) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--orange\">\n <i class=\"pi pi-calendar-minus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-out</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateTo) }}</span>\n @if (bookingData()?.checkOutTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkOutTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Number of Nights Card -->\n @if (bookingData()?.numberOfNights) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--indigo\">\n <i class=\"pi pi-moon\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Duration</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.numberOfNights }} Nights</span>\n </div>\n </div>\n }\n\n <!-- Number of Rooms Card -->\n @if (bookingData()?.rooms) {\n <div class=\"sbd-hotel-content__data-card sbd-hotel-content__data-card--clickable\" (click)=\"showPackagesDetail()\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--pink\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Rooms</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.rooms }} Room{{ bookingData()?.rooms > 1 ? 's' : '' }}</span>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <span class=\"sbd-hotel-content__data-subtext\">Click for details</span>\n }\n </div>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <i class=\"pi pi-chevron-right sbd-hotel-content__data-arrow\"></i>\n }\n </div>\n }\n\n <!-- Price Card -->\n @if (bookingData()?.price) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--emerald\">\n <i class=\"pi pi-wallet\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Total Price</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatPrice(bookingData()?.price) }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel ID Card -->\n @if (bookingData()?.hotelId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--teal\">\n <i class=\"pi pi-id-card\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelId }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-hotel-content__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-hotel-content__context-tabs\">\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"onTabChange('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"onTabChange('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--notes\">{{ bookingNotes().length }}</span>\n </button>\n @if (activeContextTab() === 'notes') {\n <button pButton label=\"Add Note\" icon=\"pi pi-plus\" class=\"p-button-sm p-button-outlined sbd-hotel-content__context-add\"\n (click)=\"onAddNote()\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-hotel-content__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-hotel-content__context-empty\">\n <i class=\"pi pi-inbox\"></i> No notes yet\n </div>\n }\n @for (note of bookingNotes(); track $index) {\n <div class=\"sbd-hotel-content__note\">\n <div class=\"sbd-hotel-content__note-top\">\n <span class=\"sbd-hotel-content__note-badge sbd-hotel-content__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-hotel-content__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-hotel-content__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-hotel-content__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-hotel-content__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-hotel-content__context-empty\">\n <i class=\"pi pi-check\"></i> No changes recorded\n </div>\n }\n @for (group of historyGroups(); track group.changedAt) {\n <div class=\"sbd-hotel-content__changes-group\">\n <div class=\"sbd-hotel-content__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-hotel-content__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-hotel-content__changes-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th><i class=\"pi pi-times-circle\"></i> Before</th>\n <th><i class=\"pi pi-check-circle\"></i> After</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of group.entries; track entry.field) {\n <tr>\n <td class=\"sbd-hotel-content__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-hotel-content__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-hotel-content__changes-new\">{{ entry.to }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n </div>\n\n }\n\n <!-- Loading skeleton for main -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n</div>\n\n<!-- Detail Dialog -->\n<p-dialog\n [(visible)]=\"detailDialogVisible\"\n [header]=\"selectedDetail()?.title || 'Details'\"\n [modal]=\"true\"\n [style]=\"{ width: '600px', maxWidth: '90vw' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n styleClass=\"sbd-hotel-content__detail-dialog\">\n\n @if (selectedDetail()?.type === 'packages' && selectedDetail()?.data) {\n <div class=\"sbd-hotel-content__packages-detail\">\n @for (pkg of selectedDetail()?.data; track $index) {\n <div class=\"sbd-hotel-content__package-card\">\n <div class=\"sbd-hotel-content__package-header\">\n <span class=\"sbd-hotel-content__package-title\">Package {{ $index + 1 }}</span>\n <div class=\"sbd-hotel-content__package-badges\">\n @if (pkg.isCancelled) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--cancelled\">Cancelled</span>\n }\n @if (pkg.isRefundable) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--success\">Refundable</span>\n } @else {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--danger\">Non-Refundable</span>\n }\n </div>\n </div>\n\n @if (pkg.supplier) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Supplier</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.supplier }}</span>\n </div>\n }\n\n @if (pkg.rooms && pkg.rooms.length > 0) {\n <div class=\"sbd-hotel-content__rooms-section\">\n <h4 class=\"sbd-hotel-content__subsection-title\">Rooms ({{ pkg.rooms.length }})</h4>\n @for (room of pkg.rooms; track room.roomId || $index) {\n <div class=\"sbd-hotel-content__room-item\">\n <div class=\"sbd-hotel-content__room-icon\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__room-details\">\n @if (room.roomName) {\n <div class=\"sbd-hotel-content__room-name\">{{ room.roomName }}</div>\n }\n <div class=\"sbd-hotel-content__room-info\">\n @if (room.roomType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomType }}</span>\n }\n @if (room.roomBasis) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomBasis }}</span>\n }\n @if (room.bedType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.bedType }}</span>\n }\n </div>\n @if (room.adultsNum || room.childrenNum) {\n <div class=\"sbd-hotel-content__room-occupancy\">\n @if (room.adultsNum) {\n <span><i class=\"pi pi-user\"></i> {{ room.adultsNum }} Adult{{ room.adultsNum > 1 ? 's' : '' }}</span>\n }\n @if (room.childrenNum) {\n <span><i class=\"pi pi-users\"></i> {{ room.childrenNum }} Child{{ room.childrenNum > 1 ? 'ren' : '' }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (pkg.refundableUntil) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Refundable Until</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.refundableUntil }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</p-dialog>\n", styles: [".sbd-hotel-content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-hotel-content{grid-template-columns:1fr}}.sbd-hotel-content__error{display:flex;align-items:center;gap:10px;padding:16px 20px;background:#fef2f2;border:1px solid rgba(239,68,68,.2);border-radius:10px;color:#ef4444;font-size:13.5px;font-weight:500}.sbd-hotel-content__error i{font-size:18px}.sbd-hotel-content__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-hotel-content__main{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__quick-actions{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:10px;flex-wrap:wrap}.sbd-hotel-content__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-hotel-content__cancelled-status{display:flex;align-items:center;gap:8px;padding:8px 14px;background:linear-gradient(135deg,#dcfce7,#bbf7d0);border:1px solid rgba(21,128,60,.2);border-radius:8px;color:#15803c;font-size:13px;font-weight:600}.sbd-hotel-content__cancelled-status i{font-size:16px;color:#15803c}.sbd-hotel-content__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-hotel-content__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-hotel-content__context-add{margin-left:auto;margin-right:10px}.sbd-hotel-content__context-tab{display:flex;align-items:center;gap:7px;padding:11px 20px;font-size:13px;font-weight:600;color:#64748b;background:transparent;border:none;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.sbd-hotel-content__context-tab .pi{font-size:13px}.sbd-hotel-content__context-tab:hover{color:#334155}.sbd-hotel-content__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-hotel-content__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-hotel-content__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-hotel-content__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-hotel-content__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-hotel-content__context-empty .pi{font-size:16px}.sbd-hotel-content__notes-list{display:flex;flex-direction:column}.sbd-hotel-content__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__note:last-child{border-bottom:none}.sbd-hotel-content__note-top{display:flex;align-items:center;gap:8px}.sbd-hotel-content__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-hotel-content__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-hotel-content__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-hotel-content__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-hotel-content__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-hotel-content__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-hotel-content__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-hotel-content__changes-groups{display:flex;flex-direction:column}.sbd-hotel-content__changes-group{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-group:last-child{border-bottom:none}.sbd-hotel-content__changes-meta{display:flex;align-items:center;gap:6px;padding:8px 16px;background:#fafafa;border-bottom:1px solid #f1f5f9;font-size:11.5px;color:#64748b}.sbd-hotel-content__changes-meta strong{font-weight:700;color:#334155}.sbd-hotel-content__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-hotel-content__changes-sep{color:#cbd5e1}.sbd-hotel-content__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-hotel-content__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__changes-table thead th{padding:7px 14px;text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:#64748b;white-space:nowrap}.sbd-hotel-content__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-hotel-content__changes-table thead th:nth-child(2){color:#dc2626}.sbd-hotel-content__changes-table thead th:nth-child(3){color:#16a34a}.sbd-hotel-content__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-table tbody tr:last-child{border-bottom:none}.sbd-hotel-content__changes-table tbody tr:hover{background:#f8fafc}.sbd-hotel-content__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-hotel-content__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-hotel-content__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-hotel-content__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-hotel-content__data-overview{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px}.sbd-hotel-content__section-title{margin:0 0 16px;font-size:15px;font-weight:700;color:#1e293b;letter-spacing:-.01em}.sbd-hotel-content__data-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}@media (max-width: 768px){.sbd-hotel-content__data-grid{grid-template-columns:1fr}}.sbd-hotel-content__data-card{display:flex;align-items:flex-start;gap:12px;padding:14px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;transition:all .2s ease}.sbd-hotel-content__data-card:hover{background:#fff;border-color:#cbd5e1;box-shadow:0 2px 8px #0000000a;transform:translateY(-1px)}.sbd-hotel-content__data-card--clickable{cursor:pointer}.sbd-hotel-content__data-card--clickable:hover{background:#fff;border-color:#3b82f6;box-shadow:0 4px 12px #3b82f626;transform:translateY(-2px)}.sbd-hotel-content__data-arrow{color:#94a3b8;font-size:14px;margin-left:auto;align-self:center;transition:transform .2s ease}.sbd-hotel-content__data-card--clickable:hover .sbd-hotel-content__data-arrow{transform:translate(3px);color:#3b82f6}.sbd-hotel-content__data-icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;flex-shrink:0}.sbd-hotel-content__data-icon i{font-size:18px;color:#fff}.sbd-hotel-content__data-icon--blue{background:linear-gradient(135deg,#3b82f6,#2563eb)}.sbd-hotel-content__data-icon--purple{background:linear-gradient(135deg,#8b5cf6,#7c3aed)}.sbd-hotel-content__data-icon--green{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--orange{background:linear-gradient(135deg,#f59e0b,#d97706)}.sbd-hotel-content__data-icon--indigo{background:linear-gradient(135deg,#6366f1,#4f46e5)}.sbd-hotel-content__data-icon--pink{background:linear-gradient(135deg,#ec4899,#db2777)}.sbd-hotel-content__data-icon--emerald{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--teal{background:linear-gradient(135deg,#14b8a6,#0d9488)}.sbd-hotel-content__data-content{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.sbd-hotel-content__data-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#64748b}.sbd-hotel-content__data-value{font-size:14px;font-weight:700;color:#1e293b;word-break:break-word}.sbd-hotel-content__data-subtext{font-size:11px;color:#94a3b8;margin-top:2px}.sbd-hotel-content__packages-detail{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__package-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__package-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:12px;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__package-title{font-size:15px;font-weight:700;color:#1e293b}.sbd-hotel-content__badge{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:4px 10px;border-radius:6px}.sbd-hotel-content__badge--success{background:#dcfce7;color:#16a34a}.sbd-hotel-content__badge--danger{background:#fee2e2;color:#dc2626}.sbd-hotel-content__badge--cancelled{background:#f3f4f6;color:#6b7280;border:1px solid #d1d5db}.sbd-hotel-content__package-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.sbd-hotel-content__package-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0}.sbd-hotel-content__package-label{font-size:12px;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__package-value{font-size:13px;font-weight:600;color:#1e293b}.sbd-hotel-content__rooms-section{margin-top:8px}.sbd-hotel-content__subsection-title{font-size:13px;font-weight:700;color:#475569;margin:0 0 12px;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__room-item{display:flex;align-items:flex-start;gap:12px;padding:12px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;margin-bottom:10px}.sbd-hotel-content__room-item:last-child{margin-bottom:0}.sbd-hotel-content__room-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#ec4899,#db2777);border-radius:8px;flex-shrink:0}.sbd-hotel-content__room-icon i{font-size:16px;color:#fff}.sbd-hotel-content__room-details{flex:1;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__room-name{font-size:14px;font-weight:700;color:#1e293b}.sbd-hotel-content__room-info{display:flex;flex-wrap:wrap;gap:6px}.sbd-hotel-content__room-tag{font-size:11px;font-weight:600;padding:3px 8px;background:#e0e7ff;color:#4f46e5;border-radius:4px}.sbd-hotel-content__room-occupancy{display:flex;gap:12px;font-size:12px;color:#64748b}.sbd-hotel-content__room-occupancy span{display:flex;align-items:center;gap:4px}.sbd-hotel-content__room-occupancy span i{font-size:11px}.sbd-hotel-content__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}\n"], dependencies: [{ kind: "component", type: SbdHotelItineraryCardComponent, selector: "app-sbd-hotel-itinerary-card", inputs: ["data", "verified"] }, { kind: "component", type: SbdDataSearchComponent, selector: "app-sbd-data-search", inputs: ["data"] }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }] }); }
123
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdHotelContentComponent, isStandalone: true, selector: "app-sbd-hotel-content", inputs: { bookingData: { classPropertyName: "bookingData", publicName: "bookingData", isSignal: true, isRequired: true, transformFunction: null }, bookingStatus: { classPropertyName: "bookingStatus", publicName: "bookingStatus", isSignal: true, isRequired: true, transformFunction: null }, bookingId: { classPropertyName: "bookingId", publicName: "bookingId", isSignal: true, isRequired: true, transformFunction: null }, dataVerified: { classPropertyName: "dataVerified", publicName: "dataVerified", isSignal: true, isRequired: true, transformFunction: null }, bookingNotes: { classPropertyName: "bookingNotes", publicName: "bookingNotes", isSignal: true, isRequired: true, transformFunction: null }, bookingHistory: { classPropertyName: "bookingHistory", publicName: "bookingHistory", isSignal: true, isRequired: true, transformFunction: null }, historyGroups: { classPropertyName: "historyGroups", publicName: "historyGroups", isSignal: true, isRequired: true, transformFunction: null }, activeContextTab: { classPropertyName: "activeContextTab", publicName: "activeContextTab", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { cancelBooking: "cancelBooking", addNoteRequested: "addNoteRequested", contextTabChanged: "contextTabChanged" }, ngImport: i0, template: "<!-- 2-column layout for hotels -->\n<div class=\"sbd-hotel-content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-hotel-content__aside\">\n\n <!-- Data search at the top of the sidebar -->\n @if (bookingStatus() === 'success') {\n <app-sbd-data-search [data]=\"bookingData()\" />\n <app-sbd-hotel-itinerary-card [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-hotel-content__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-hotel-content__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Booking not found. Double-check the ID and product type, then try again.</span>\n </div>\n }\n\n <!-- Content once loaded -->\n @if (bookingStatus() === 'success') {\n\n <!-- Quick actions -->\n <div class=\"sbd-hotel-content__quick-actions\">\n <span class=\"sbd-hotel-content__quick-label\">Quick actions</span>\n @if (allPackagesCancelled()) {\n <div class=\"sbd-hotel-content__cancelled-status\">\n <i class=\"pi pi-check-circle\"></i>\n <span>All Packages Cancelled</span>\n </div>\n } @else {\n <button\n pButton\n label=\"Cancel Booking\"\n icon=\"pi pi-times-circle\"\n class=\"p-button-danger p-button-sm\"\n (click)=\"onCancelBooking()\">\n </button>\n }\n </div>\n\n <!-- Modern Data Overview Cards -->\n <div class=\"sbd-hotel-content__data-overview\">\n <h3 class=\"sbd-hotel-content__section-title\">Booking Overview</h3>\n\n <div class=\"sbd-hotel-content__data-grid\">\n <!-- Booking ID Card -->\n @if (bookingData()?.bookingId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--blue\">\n <i class=\"pi pi-bookmark\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Booking ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.bookingId }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel Name Card -->\n @if (bookingData()?.hotelName) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--purple\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelName }}</span>\n </div>\n </div>\n }\n\n <!-- Check-in Date Card -->\n @if (bookingData()?.dateFrom) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--green\">\n <i class=\"pi pi-calendar-plus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-in</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateFrom) }}</span>\n @if (bookingData()?.checkInTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkInTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Check-out Date Card -->\n @if (bookingData()?.dateTo) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--orange\">\n <i class=\"pi pi-calendar-minus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-out</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateTo) }}</span>\n @if (bookingData()?.checkOutTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkOutTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Number of Nights Card -->\n @if (bookingData()?.numberOfNights) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--indigo\">\n <i class=\"pi pi-moon\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Duration</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.numberOfNights }} Nights</span>\n </div>\n </div>\n }\n\n <!-- Number of Rooms Card -->\n @if (bookingData()?.rooms) {\n <div class=\"sbd-hotel-content__data-card sbd-hotel-content__data-card--clickable\" (click)=\"showPackagesDetail()\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--pink\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Rooms</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.rooms }} Room{{ bookingData()?.rooms > 1 ? 's' : '' }}</span>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <span class=\"sbd-hotel-content__data-subtext\">Click for details</span>\n }\n </div>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <i class=\"pi pi-chevron-right sbd-hotel-content__data-arrow\"></i>\n }\n </div>\n }\n\n <!-- Price Card -->\n @if (bookingData()?.price) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--emerald\">\n <i class=\"pi pi-wallet\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Total Price</span>\n <span class=\"sbd-hotel-content__data-value\">{{bookingData()?.price + ' ' + bookingData()?.priceCurrency}}</span>\n </div>\n </div>\n }\n\n <!-- Hotel ID Card -->\n @if (bookingData()?.hotelId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--teal\">\n <i class=\"pi pi-id-card\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelId }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-hotel-content__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-hotel-content__context-tabs\">\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"onTabChange('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"onTabChange('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--notes\">{{ bookingNotes().length }}</span>\n </button>\n @if (activeContextTab() === 'notes') {\n <button pButton label=\"Add Note\" icon=\"pi pi-plus\" class=\"p-button-sm p-button-outlined sbd-hotel-content__context-add\"\n (click)=\"onAddNote()\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-hotel-content__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-hotel-content__context-empty\">\n <i class=\"pi pi-inbox\"></i> No notes yet\n </div>\n }\n @for (note of bookingNotes(); track $index) {\n <div class=\"sbd-hotel-content__note\">\n <div class=\"sbd-hotel-content__note-top\">\n <span class=\"sbd-hotel-content__note-badge sbd-hotel-content__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-hotel-content__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-hotel-content__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-hotel-content__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-hotel-content__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-hotel-content__context-empty\">\n <i class=\"pi pi-check\"></i> No changes recorded\n </div>\n }\n @for (group of historyGroups(); track group.changedAt) {\n <div class=\"sbd-hotel-content__changes-group\">\n <div class=\"sbd-hotel-content__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-hotel-content__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-hotel-content__changes-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th><i class=\"pi pi-times-circle\"></i> Before</th>\n <th><i class=\"pi pi-check-circle\"></i> After</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of group.entries; track entry.field) {\n <tr>\n <td class=\"sbd-hotel-content__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-hotel-content__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-hotel-content__changes-new\">{{ entry.to }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n </div>\n\n }\n\n <!-- Loading skeleton for main -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n</div>\n\n<!-- Detail Dialog -->\n<p-dialog\n [(visible)]=\"detailDialogVisible\"\n [header]=\"selectedDetail()?.title || 'Details'\"\n [modal]=\"true\"\n [style]=\"{ width: '600px', maxWidth: '90vw' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n styleClass=\"sbd-hotel-content__detail-dialog\">\n\n @if (selectedDetail()?.type === 'packages' && selectedDetail()?.data) {\n <div class=\"sbd-hotel-content__packages-detail\">\n @for (pkg of selectedDetail()?.data; track $index) {\n <div class=\"sbd-hotel-content__package-card\">\n <div class=\"sbd-hotel-content__package-header\">\n <span class=\"sbd-hotel-content__package-title\">Package {{ $index + 1 }}</span>\n <div class=\"sbd-hotel-content__package-badges\">\n @if (pkg.isCancelled) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--cancelled\">Cancelled</span>\n }\n @if (pkg.isRefundable) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--success\">Refundable</span>\n } @else {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--danger\">Non-Refundable</span>\n }\n </div>\n </div>\n\n @if (pkg.supplier) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Supplier</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.supplier }}</span>\n </div>\n }\n\n @if (pkg.rooms && pkg.rooms.length > 0) {\n <div class=\"sbd-hotel-content__rooms-section\">\n <h4 class=\"sbd-hotel-content__subsection-title\">Rooms ({{ pkg.rooms.length }})</h4>\n @for (room of pkg.rooms; track room.roomId || $index) {\n <div class=\"sbd-hotel-content__room-item\">\n <div class=\"sbd-hotel-content__room-icon\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__room-details\">\n @if (room.roomName) {\n <div class=\"sbd-hotel-content__room-name\">{{ room.roomName }}</div>\n }\n <div class=\"sbd-hotel-content__room-info\">\n @if (room.roomType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomType }}</span>\n }\n @if (room.roomBasis) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomBasis }}</span>\n }\n @if (room.bedType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.bedType }}</span>\n }\n </div>\n @if (room.adultsNum || room.childrenNum) {\n <div class=\"sbd-hotel-content__room-occupancy\">\n @if (room.adultsNum) {\n <span><i class=\"pi pi-user\"></i> {{ room.adultsNum }} Adult{{ room.adultsNum > 1 ? 's' : '' }}</span>\n }\n @if (room.childrenNum) {\n <span><i class=\"pi pi-users\"></i> {{ room.childrenNum }} Child{{ room.childrenNum > 1 ? 'ren' : '' }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (pkg.refundableUntil) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Refundable Until</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.refundableUntil }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</p-dialog>\n", styles: [".sbd-hotel-content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-hotel-content{grid-template-columns:1fr}}.sbd-hotel-content__error{display:flex;align-items:center;gap:10px;padding:16px 20px;background:#fef2f2;border:1px solid rgba(239,68,68,.2);border-radius:10px;color:#ef4444;font-size:13.5px;font-weight:500}.sbd-hotel-content__error i{font-size:18px}.sbd-hotel-content__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-hotel-content__main{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__quick-actions{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:10px;flex-wrap:wrap}.sbd-hotel-content__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-hotel-content__cancelled-status{display:flex;align-items:center;gap:8px;padding:8px 14px;background:linear-gradient(135deg,#dcfce7,#bbf7d0);border:1px solid rgba(21,128,60,.2);border-radius:8px;color:#15803c;font-size:13px;font-weight:600}.sbd-hotel-content__cancelled-status i{font-size:16px;color:#15803c}.sbd-hotel-content__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-hotel-content__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-hotel-content__context-add{margin-left:auto;margin-right:10px}.sbd-hotel-content__context-tab{display:flex;align-items:center;gap:7px;padding:11px 20px;font-size:13px;font-weight:600;color:#64748b;background:transparent;border:none;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.sbd-hotel-content__context-tab .pi{font-size:13px}.sbd-hotel-content__context-tab:hover{color:#334155}.sbd-hotel-content__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-hotel-content__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-hotel-content__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-hotel-content__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-hotel-content__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-hotel-content__context-empty .pi{font-size:16px}.sbd-hotel-content__notes-list{display:flex;flex-direction:column}.sbd-hotel-content__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__note:last-child{border-bottom:none}.sbd-hotel-content__note-top{display:flex;align-items:center;gap:8px}.sbd-hotel-content__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-hotel-content__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-hotel-content__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-hotel-content__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-hotel-content__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-hotel-content__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-hotel-content__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-hotel-content__changes-groups{display:flex;flex-direction:column}.sbd-hotel-content__changes-group{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-group:last-child{border-bottom:none}.sbd-hotel-content__changes-meta{display:flex;align-items:center;gap:6px;padding:8px 16px;background:#fafafa;border-bottom:1px solid #f1f5f9;font-size:11.5px;color:#64748b}.sbd-hotel-content__changes-meta strong{font-weight:700;color:#334155}.sbd-hotel-content__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-hotel-content__changes-sep{color:#cbd5e1}.sbd-hotel-content__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-hotel-content__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__changes-table thead th{padding:7px 14px;text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:#64748b;white-space:nowrap}.sbd-hotel-content__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-hotel-content__changes-table thead th:nth-child(2){color:#dc2626}.sbd-hotel-content__changes-table thead th:nth-child(3){color:#16a34a}.sbd-hotel-content__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-table tbody tr:last-child{border-bottom:none}.sbd-hotel-content__changes-table tbody tr:hover{background:#f8fafc}.sbd-hotel-content__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-hotel-content__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-hotel-content__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-hotel-content__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-hotel-content__data-overview{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px}.sbd-hotel-content__section-title{margin:0 0 16px;font-size:15px;font-weight:700;color:#1e293b;letter-spacing:-.01em}.sbd-hotel-content__data-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}@media (max-width: 768px){.sbd-hotel-content__data-grid{grid-template-columns:1fr}}.sbd-hotel-content__data-card{display:flex;align-items:flex-start;gap:12px;padding:14px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;transition:all .2s ease}.sbd-hotel-content__data-card:hover{background:#fff;border-color:#cbd5e1;box-shadow:0 2px 8px #0000000a;transform:translateY(-1px)}.sbd-hotel-content__data-card--clickable{cursor:pointer}.sbd-hotel-content__data-card--clickable:hover{background:#fff;border-color:#3b82f6;box-shadow:0 4px 12px #3b82f626;transform:translateY(-2px)}.sbd-hotel-content__data-arrow{color:#94a3b8;font-size:14px;margin-left:auto;align-self:center;transition:transform .2s ease}.sbd-hotel-content__data-card--clickable:hover .sbd-hotel-content__data-arrow{transform:translate(3px);color:#3b82f6}.sbd-hotel-content__data-icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;flex-shrink:0}.sbd-hotel-content__data-icon i{font-size:18px;color:#fff}.sbd-hotel-content__data-icon--blue{background:linear-gradient(135deg,#3b82f6,#2563eb)}.sbd-hotel-content__data-icon--purple{background:linear-gradient(135deg,#8b5cf6,#7c3aed)}.sbd-hotel-content__data-icon--green{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--orange{background:linear-gradient(135deg,#f59e0b,#d97706)}.sbd-hotel-content__data-icon--indigo{background:linear-gradient(135deg,#6366f1,#4f46e5)}.sbd-hotel-content__data-icon--pink{background:linear-gradient(135deg,#ec4899,#db2777)}.sbd-hotel-content__data-icon--emerald{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--teal{background:linear-gradient(135deg,#14b8a6,#0d9488)}.sbd-hotel-content__data-content{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.sbd-hotel-content__data-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#64748b}.sbd-hotel-content__data-value{font-size:14px;font-weight:700;color:#1e293b;word-break:break-word}.sbd-hotel-content__data-subtext{font-size:11px;color:#94a3b8;margin-top:2px}.sbd-hotel-content__packages-detail{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__package-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__package-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:12px;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__package-title{font-size:15px;font-weight:700;color:#1e293b}.sbd-hotel-content__badge{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:4px 10px;border-radius:6px}.sbd-hotel-content__badge--success{background:#dcfce7;color:#16a34a}.sbd-hotel-content__badge--danger{background:#fee2e2;color:#dc2626}.sbd-hotel-content__badge--cancelled{background:#f3f4f6;color:#6b7280;border:1px solid #d1d5db}.sbd-hotel-content__package-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.sbd-hotel-content__package-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0}.sbd-hotel-content__package-label{font-size:12px;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__package-value{font-size:13px;font-weight:600;color:#1e293b}.sbd-hotel-content__rooms-section{margin-top:8px}.sbd-hotel-content__subsection-title{font-size:13px;font-weight:700;color:#475569;margin:0 0 12px;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__room-item{display:flex;align-items:flex-start;gap:12px;padding:12px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;margin-bottom:10px}.sbd-hotel-content__room-item:last-child{margin-bottom:0}.sbd-hotel-content__room-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#ec4899,#db2777);border-radius:8px;flex-shrink:0}.sbd-hotel-content__room-icon i{font-size:16px;color:#fff}.sbd-hotel-content__room-details{flex:1;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__room-name{font-size:14px;font-weight:700;color:#1e293b}.sbd-hotel-content__room-info{display:flex;flex-wrap:wrap;gap:6px}.sbd-hotel-content__room-tag{font-size:11px;font-weight:600;padding:3px 8px;background:#e0e7ff;color:#4f46e5;border-radius:4px}.sbd-hotel-content__room-occupancy{display:flex;gap:12px;font-size:12px;color:#64748b}.sbd-hotel-content__room-occupancy span{display:flex;align-items:center;gap:4px}.sbd-hotel-content__room-occupancy span i{font-size:11px}.sbd-hotel-content__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}\n"], dependencies: [{ kind: "component", type: SbdHotelItineraryCardComponent, selector: "app-sbd-hotel-itinerary-card", inputs: ["data", "verified"] }, { kind: "component", type: SbdDataSearchComponent, selector: "app-sbd-data-search", inputs: ["data"] }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }] }); }
124
124
  }
125
125
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdHotelContentComponent, decorators: [{
126
126
  type: Component,
@@ -131,6 +131,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
131
131
  NgIf,
132
132
  ButtonModule,
133
133
  DialogModule,
134
- ], template: "<!-- 2-column layout for hotels -->\n<div class=\"sbd-hotel-content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-hotel-content__aside\">\n\n <!-- Data search at the top of the sidebar -->\n @if (bookingStatus() === 'success') {\n <app-sbd-data-search [data]=\"bookingData()\" />\n <app-sbd-hotel-itinerary-card [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-hotel-content__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-hotel-content__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Booking not found. Double-check the ID and product type, then try again.</span>\n </div>\n }\n\n <!-- Content once loaded -->\n @if (bookingStatus() === 'success') {\n\n <!-- Quick actions -->\n <div class=\"sbd-hotel-content__quick-actions\">\n <span class=\"sbd-hotel-content__quick-label\">Quick actions</span>\n @if (allPackagesCancelled()) {\n <div class=\"sbd-hotel-content__cancelled-status\">\n <i class=\"pi pi-check-circle\"></i>\n <span>All Packages Cancelled</span>\n </div>\n } @else {\n <button\n pButton\n label=\"Cancel Booking\"\n icon=\"pi pi-times-circle\"\n class=\"p-button-danger p-button-sm\"\n (click)=\"onCancelBooking()\">\n </button>\n }\n </div>\n\n <!-- Modern Data Overview Cards -->\n <div class=\"sbd-hotel-content__data-overview\">\n <h3 class=\"sbd-hotel-content__section-title\">Booking Overview</h3>\n\n <div class=\"sbd-hotel-content__data-grid\">\n <!-- Booking ID Card -->\n @if (bookingData()?.bookingId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--blue\">\n <i class=\"pi pi-bookmark\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Booking ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.bookingId }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel Name Card -->\n @if (bookingData()?.hotelName) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--purple\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelName }}</span>\n </div>\n </div>\n }\n\n <!-- Check-in Date Card -->\n @if (bookingData()?.dateFrom) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--green\">\n <i class=\"pi pi-calendar-plus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-in</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateFrom) }}</span>\n @if (bookingData()?.checkInTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkInTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Check-out Date Card -->\n @if (bookingData()?.dateTo) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--orange\">\n <i class=\"pi pi-calendar-minus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-out</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateTo) }}</span>\n @if (bookingData()?.checkOutTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkOutTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Number of Nights Card -->\n @if (bookingData()?.numberOfNights) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--indigo\">\n <i class=\"pi pi-moon\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Duration</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.numberOfNights }} Nights</span>\n </div>\n </div>\n }\n\n <!-- Number of Rooms Card -->\n @if (bookingData()?.rooms) {\n <div class=\"sbd-hotel-content__data-card sbd-hotel-content__data-card--clickable\" (click)=\"showPackagesDetail()\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--pink\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Rooms</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.rooms }} Room{{ bookingData()?.rooms > 1 ? 's' : '' }}</span>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <span class=\"sbd-hotel-content__data-subtext\">Click for details</span>\n }\n </div>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <i class=\"pi pi-chevron-right sbd-hotel-content__data-arrow\"></i>\n }\n </div>\n }\n\n <!-- Price Card -->\n @if (bookingData()?.price) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--emerald\">\n <i class=\"pi pi-wallet\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Total Price</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatPrice(bookingData()?.price) }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel ID Card -->\n @if (bookingData()?.hotelId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--teal\">\n <i class=\"pi pi-id-card\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelId }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-hotel-content__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-hotel-content__context-tabs\">\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"onTabChange('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"onTabChange('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--notes\">{{ bookingNotes().length }}</span>\n </button>\n @if (activeContextTab() === 'notes') {\n <button pButton label=\"Add Note\" icon=\"pi pi-plus\" class=\"p-button-sm p-button-outlined sbd-hotel-content__context-add\"\n (click)=\"onAddNote()\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-hotel-content__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-hotel-content__context-empty\">\n <i class=\"pi pi-inbox\"></i> No notes yet\n </div>\n }\n @for (note of bookingNotes(); track $index) {\n <div class=\"sbd-hotel-content__note\">\n <div class=\"sbd-hotel-content__note-top\">\n <span class=\"sbd-hotel-content__note-badge sbd-hotel-content__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-hotel-content__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-hotel-content__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-hotel-content__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-hotel-content__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-hotel-content__context-empty\">\n <i class=\"pi pi-check\"></i> No changes recorded\n </div>\n }\n @for (group of historyGroups(); track group.changedAt) {\n <div class=\"sbd-hotel-content__changes-group\">\n <div class=\"sbd-hotel-content__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-hotel-content__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-hotel-content__changes-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th><i class=\"pi pi-times-circle\"></i> Before</th>\n <th><i class=\"pi pi-check-circle\"></i> After</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of group.entries; track entry.field) {\n <tr>\n <td class=\"sbd-hotel-content__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-hotel-content__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-hotel-content__changes-new\">{{ entry.to }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n </div>\n\n }\n\n <!-- Loading skeleton for main -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n</div>\n\n<!-- Detail Dialog -->\n<p-dialog\n [(visible)]=\"detailDialogVisible\"\n [header]=\"selectedDetail()?.title || 'Details'\"\n [modal]=\"true\"\n [style]=\"{ width: '600px', maxWidth: '90vw' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n styleClass=\"sbd-hotel-content__detail-dialog\">\n\n @if (selectedDetail()?.type === 'packages' && selectedDetail()?.data) {\n <div class=\"sbd-hotel-content__packages-detail\">\n @for (pkg of selectedDetail()?.data; track $index) {\n <div class=\"sbd-hotel-content__package-card\">\n <div class=\"sbd-hotel-content__package-header\">\n <span class=\"sbd-hotel-content__package-title\">Package {{ $index + 1 }}</span>\n <div class=\"sbd-hotel-content__package-badges\">\n @if (pkg.isCancelled) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--cancelled\">Cancelled</span>\n }\n @if (pkg.isRefundable) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--success\">Refundable</span>\n } @else {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--danger\">Non-Refundable</span>\n }\n </div>\n </div>\n\n @if (pkg.supplier) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Supplier</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.supplier }}</span>\n </div>\n }\n\n @if (pkg.rooms && pkg.rooms.length > 0) {\n <div class=\"sbd-hotel-content__rooms-section\">\n <h4 class=\"sbd-hotel-content__subsection-title\">Rooms ({{ pkg.rooms.length }})</h4>\n @for (room of pkg.rooms; track room.roomId || $index) {\n <div class=\"sbd-hotel-content__room-item\">\n <div class=\"sbd-hotel-content__room-icon\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__room-details\">\n @if (room.roomName) {\n <div class=\"sbd-hotel-content__room-name\">{{ room.roomName }}</div>\n }\n <div class=\"sbd-hotel-content__room-info\">\n @if (room.roomType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomType }}</span>\n }\n @if (room.roomBasis) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomBasis }}</span>\n }\n @if (room.bedType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.bedType }}</span>\n }\n </div>\n @if (room.adultsNum || room.childrenNum) {\n <div class=\"sbd-hotel-content__room-occupancy\">\n @if (room.adultsNum) {\n <span><i class=\"pi pi-user\"></i> {{ room.adultsNum }} Adult{{ room.adultsNum > 1 ? 's' : '' }}</span>\n }\n @if (room.childrenNum) {\n <span><i class=\"pi pi-users\"></i> {{ room.childrenNum }} Child{{ room.childrenNum > 1 ? 'ren' : '' }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (pkg.refundableUntil) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Refundable Until</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.refundableUntil }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</p-dialog>\n", styles: [".sbd-hotel-content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-hotel-content{grid-template-columns:1fr}}.sbd-hotel-content__error{display:flex;align-items:center;gap:10px;padding:16px 20px;background:#fef2f2;border:1px solid rgba(239,68,68,.2);border-radius:10px;color:#ef4444;font-size:13.5px;font-weight:500}.sbd-hotel-content__error i{font-size:18px}.sbd-hotel-content__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-hotel-content__main{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__quick-actions{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:10px;flex-wrap:wrap}.sbd-hotel-content__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-hotel-content__cancelled-status{display:flex;align-items:center;gap:8px;padding:8px 14px;background:linear-gradient(135deg,#dcfce7,#bbf7d0);border:1px solid rgba(21,128,60,.2);border-radius:8px;color:#15803c;font-size:13px;font-weight:600}.sbd-hotel-content__cancelled-status i{font-size:16px;color:#15803c}.sbd-hotel-content__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-hotel-content__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-hotel-content__context-add{margin-left:auto;margin-right:10px}.sbd-hotel-content__context-tab{display:flex;align-items:center;gap:7px;padding:11px 20px;font-size:13px;font-weight:600;color:#64748b;background:transparent;border:none;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.sbd-hotel-content__context-tab .pi{font-size:13px}.sbd-hotel-content__context-tab:hover{color:#334155}.sbd-hotel-content__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-hotel-content__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-hotel-content__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-hotel-content__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-hotel-content__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-hotel-content__context-empty .pi{font-size:16px}.sbd-hotel-content__notes-list{display:flex;flex-direction:column}.sbd-hotel-content__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__note:last-child{border-bottom:none}.sbd-hotel-content__note-top{display:flex;align-items:center;gap:8px}.sbd-hotel-content__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-hotel-content__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-hotel-content__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-hotel-content__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-hotel-content__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-hotel-content__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-hotel-content__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-hotel-content__changes-groups{display:flex;flex-direction:column}.sbd-hotel-content__changes-group{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-group:last-child{border-bottom:none}.sbd-hotel-content__changes-meta{display:flex;align-items:center;gap:6px;padding:8px 16px;background:#fafafa;border-bottom:1px solid #f1f5f9;font-size:11.5px;color:#64748b}.sbd-hotel-content__changes-meta strong{font-weight:700;color:#334155}.sbd-hotel-content__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-hotel-content__changes-sep{color:#cbd5e1}.sbd-hotel-content__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-hotel-content__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__changes-table thead th{padding:7px 14px;text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:#64748b;white-space:nowrap}.sbd-hotel-content__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-hotel-content__changes-table thead th:nth-child(2){color:#dc2626}.sbd-hotel-content__changes-table thead th:nth-child(3){color:#16a34a}.sbd-hotel-content__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-table tbody tr:last-child{border-bottom:none}.sbd-hotel-content__changes-table tbody tr:hover{background:#f8fafc}.sbd-hotel-content__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-hotel-content__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-hotel-content__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-hotel-content__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-hotel-content__data-overview{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px}.sbd-hotel-content__section-title{margin:0 0 16px;font-size:15px;font-weight:700;color:#1e293b;letter-spacing:-.01em}.sbd-hotel-content__data-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}@media (max-width: 768px){.sbd-hotel-content__data-grid{grid-template-columns:1fr}}.sbd-hotel-content__data-card{display:flex;align-items:flex-start;gap:12px;padding:14px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;transition:all .2s ease}.sbd-hotel-content__data-card:hover{background:#fff;border-color:#cbd5e1;box-shadow:0 2px 8px #0000000a;transform:translateY(-1px)}.sbd-hotel-content__data-card--clickable{cursor:pointer}.sbd-hotel-content__data-card--clickable:hover{background:#fff;border-color:#3b82f6;box-shadow:0 4px 12px #3b82f626;transform:translateY(-2px)}.sbd-hotel-content__data-arrow{color:#94a3b8;font-size:14px;margin-left:auto;align-self:center;transition:transform .2s ease}.sbd-hotel-content__data-card--clickable:hover .sbd-hotel-content__data-arrow{transform:translate(3px);color:#3b82f6}.sbd-hotel-content__data-icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;flex-shrink:0}.sbd-hotel-content__data-icon i{font-size:18px;color:#fff}.sbd-hotel-content__data-icon--blue{background:linear-gradient(135deg,#3b82f6,#2563eb)}.sbd-hotel-content__data-icon--purple{background:linear-gradient(135deg,#8b5cf6,#7c3aed)}.sbd-hotel-content__data-icon--green{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--orange{background:linear-gradient(135deg,#f59e0b,#d97706)}.sbd-hotel-content__data-icon--indigo{background:linear-gradient(135deg,#6366f1,#4f46e5)}.sbd-hotel-content__data-icon--pink{background:linear-gradient(135deg,#ec4899,#db2777)}.sbd-hotel-content__data-icon--emerald{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--teal{background:linear-gradient(135deg,#14b8a6,#0d9488)}.sbd-hotel-content__data-content{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.sbd-hotel-content__data-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#64748b}.sbd-hotel-content__data-value{font-size:14px;font-weight:700;color:#1e293b;word-break:break-word}.sbd-hotel-content__data-subtext{font-size:11px;color:#94a3b8;margin-top:2px}.sbd-hotel-content__packages-detail{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__package-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__package-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:12px;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__package-title{font-size:15px;font-weight:700;color:#1e293b}.sbd-hotel-content__badge{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:4px 10px;border-radius:6px}.sbd-hotel-content__badge--success{background:#dcfce7;color:#16a34a}.sbd-hotel-content__badge--danger{background:#fee2e2;color:#dc2626}.sbd-hotel-content__badge--cancelled{background:#f3f4f6;color:#6b7280;border:1px solid #d1d5db}.sbd-hotel-content__package-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.sbd-hotel-content__package-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0}.sbd-hotel-content__package-label{font-size:12px;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__package-value{font-size:13px;font-weight:600;color:#1e293b}.sbd-hotel-content__rooms-section{margin-top:8px}.sbd-hotel-content__subsection-title{font-size:13px;font-weight:700;color:#475569;margin:0 0 12px;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__room-item{display:flex;align-items:flex-start;gap:12px;padding:12px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;margin-bottom:10px}.sbd-hotel-content__room-item:last-child{margin-bottom:0}.sbd-hotel-content__room-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#ec4899,#db2777);border-radius:8px;flex-shrink:0}.sbd-hotel-content__room-icon i{font-size:16px;color:#fff}.sbd-hotel-content__room-details{flex:1;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__room-name{font-size:14px;font-weight:700;color:#1e293b}.sbd-hotel-content__room-info{display:flex;flex-wrap:wrap;gap:6px}.sbd-hotel-content__room-tag{font-size:11px;font-weight:600;padding:3px 8px;background:#e0e7ff;color:#4f46e5;border-radius:4px}.sbd-hotel-content__room-occupancy{display:flex;gap:12px;font-size:12px;color:#64748b}.sbd-hotel-content__room-occupancy span{display:flex;align-items:center;gap:4px}.sbd-hotel-content__room-occupancy span i{font-size:11px}.sbd-hotel-content__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}\n"] }]
134
+ ], template: "<!-- 2-column layout for hotels -->\n<div class=\"sbd-hotel-content\">\n\n <!-- Left: booking context -->\n <aside class=\"sbd-hotel-content__aside\">\n\n <!-- Data search at the top of the sidebar -->\n @if (bookingStatus() === 'success') {\n <app-sbd-data-search [data]=\"bookingData()\" />\n <app-sbd-hotel-itinerary-card [data]=\"bookingData()\" [verified]=\"dataVerified()\" />\n }\n\n <!-- Loading skeleton for aside -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:60%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:80%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:50%\"></div>\n </div>\n }\n\n </aside>\n\n <!-- Right: agent workspace -->\n <main class=\"sbd-hotel-content__main\">\n\n <!-- Error state -->\n @if (bookingStatus() === 'error') {\n <div class=\"sbd-hotel-content__error\">\n <i class=\"pi pi-exclamation-circle\"></i>\n <span>Booking not found. Double-check the ID and product type, then try again.</span>\n </div>\n }\n\n <!-- Content once loaded -->\n @if (bookingStatus() === 'success') {\n\n <!-- Quick actions -->\n <div class=\"sbd-hotel-content__quick-actions\">\n <span class=\"sbd-hotel-content__quick-label\">Quick actions</span>\n @if (allPackagesCancelled()) {\n <div class=\"sbd-hotel-content__cancelled-status\">\n <i class=\"pi pi-check-circle\"></i>\n <span>All Packages Cancelled</span>\n </div>\n } @else {\n <button\n pButton\n label=\"Cancel Booking\"\n icon=\"pi pi-times-circle\"\n class=\"p-button-danger p-button-sm\"\n (click)=\"onCancelBooking()\">\n </button>\n }\n </div>\n\n <!-- Modern Data Overview Cards -->\n <div class=\"sbd-hotel-content__data-overview\">\n <h3 class=\"sbd-hotel-content__section-title\">Booking Overview</h3>\n\n <div class=\"sbd-hotel-content__data-grid\">\n <!-- Booking ID Card -->\n @if (bookingData()?.bookingId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--blue\">\n <i class=\"pi pi-bookmark\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Booking ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.bookingId }}</span>\n </div>\n </div>\n }\n\n <!-- Hotel Name Card -->\n @if (bookingData()?.hotelName) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--purple\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelName }}</span>\n </div>\n </div>\n }\n\n <!-- Check-in Date Card -->\n @if (bookingData()?.dateFrom) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--green\">\n <i class=\"pi pi-calendar-plus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-in</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateFrom) }}</span>\n @if (bookingData()?.checkInTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkInTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Check-out Date Card -->\n @if (bookingData()?.dateTo) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--orange\">\n <i class=\"pi pi-calendar-minus\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Check-out</span>\n <span class=\"sbd-hotel-content__data-value\">{{ formatDate(bookingData()?.dateTo) }}</span>\n @if (bookingData()?.checkOutTime) {\n <span class=\"sbd-hotel-content__data-subtext\">{{ bookingData()?.checkOutTime }}</span>\n }\n </div>\n </div>\n }\n\n <!-- Number of Nights Card -->\n @if (bookingData()?.numberOfNights) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--indigo\">\n <i class=\"pi pi-moon\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Duration</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.numberOfNights }} Nights</span>\n </div>\n </div>\n }\n\n <!-- Number of Rooms Card -->\n @if (bookingData()?.rooms) {\n <div class=\"sbd-hotel-content__data-card sbd-hotel-content__data-card--clickable\" (click)=\"showPackagesDetail()\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--pink\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Rooms</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.rooms }} Room{{ bookingData()?.rooms > 1 ? 's' : '' }}</span>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <span class=\"sbd-hotel-content__data-subtext\">Click for details</span>\n }\n </div>\n @if (bookingData()?.packages && bookingData()?.packages.length > 0) {\n <i class=\"pi pi-chevron-right sbd-hotel-content__data-arrow\"></i>\n }\n </div>\n }\n\n <!-- Price Card -->\n @if (bookingData()?.price) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--emerald\">\n <i class=\"pi pi-wallet\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Total Price</span>\n <span class=\"sbd-hotel-content__data-value\">{{bookingData()?.price + ' ' + bookingData()?.priceCurrency}}</span>\n </div>\n </div>\n }\n\n <!-- Hotel ID Card -->\n @if (bookingData()?.hotelId) {\n <div class=\"sbd-hotel-content__data-card\">\n <div class=\"sbd-hotel-content__data-icon sbd-hotel-content__data-icon--teal\">\n <i class=\"pi pi-id-card\"></i>\n </div>\n <div class=\"sbd-hotel-content__data-content\">\n <span class=\"sbd-hotel-content__data-label\">Hotel ID</span>\n <span class=\"sbd-hotel-content__data-value\">{{ bookingData()?.hotelId }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Context: Notes + Changes tabbed -->\n <div class=\"sbd-hotel-content__context\">\n\n <!-- Tab bar -->\n <div class=\"sbd-hotel-content__context-tabs\">\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'changes'\"\n (click)=\"onTabChange('changes')\">\n <i class=\"pi pi-history\"></i>\n Changes\n @if (bookingHistory().length > 0) {\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--changes\">{{ bookingHistory().length }}</span>\n }\n </button>\n <button class=\"sbd-hotel-content__context-tab\"\n [class.sbd-hotel-content__context-tab--active]=\"activeContextTab() === 'notes'\"\n (click)=\"onTabChange('notes')\">\n <i class=\"pi pi-comments\"></i>\n Notes\n <span class=\"sbd-hotel-content__context-pill sbd-hotel-content__context-pill--notes\">{{ bookingNotes().length }}</span>\n </button>\n @if (activeContextTab() === 'notes') {\n <button pButton label=\"Add Note\" icon=\"pi pi-plus\" class=\"p-button-sm p-button-outlined sbd-hotel-content__context-add\"\n (click)=\"onAddNote()\">\n </button>\n }\n </div>\n\n <!-- Notes tab -->\n @if (activeContextTab() === 'notes') {\n <div class=\"sbd-hotel-content__notes-list\">\n @if (bookingNotes().length === 0) {\n <div class=\"sbd-hotel-content__context-empty\">\n <i class=\"pi pi-inbox\"></i> No notes yet\n </div>\n }\n @for (note of bookingNotes(); track $index) {\n <div class=\"sbd-hotel-content__note\">\n <div class=\"sbd-hotel-content__note-top\">\n <span class=\"sbd-hotel-content__note-badge sbd-hotel-content__note-badge--{{ note.action | lowercase }}\">\n {{ note.action }}\n </span>\n <span class=\"sbd-hotel-content__note-author\">\n {{ note.writtenBy?.firstName }} {{ note.writtenBy?.lastName }}\n </span>\n <span class=\"sbd-hotel-content__note-date\">{{ fmtNoteDate(note.date) }}</span>\n </div>\n <p class=\"sbd-hotel-content__note-msg\">{{ note.message }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Changes tab -->\n @if (activeContextTab() === 'changes') {\n <div class=\"sbd-hotel-content__changes-groups\">\n @if (historyGroups().length === 0) {\n <div class=\"sbd-hotel-content__context-empty\">\n <i class=\"pi pi-check\"></i> No changes recorded\n </div>\n }\n @for (group of historyGroups(); track group.changedAt) {\n <div class=\"sbd-hotel-content__changes-group\">\n <div class=\"sbd-hotel-content__changes-meta\">\n <i class=\"pi pi-user\"></i>\n <strong>{{ group.changedBy }}</strong>\n <span class=\"sbd-hotel-content__changes-sep\">\u00B7</span>\n <span>{{ fmtDate(group.changedAt) }}</span>\n </div>\n <table class=\"sbd-hotel-content__changes-table\">\n <thead>\n <tr>\n <th>Field</th>\n <th><i class=\"pi pi-times-circle\"></i> Before</th>\n <th><i class=\"pi pi-check-circle\"></i> After</th>\n </tr>\n </thead>\n <tbody>\n @for (entry of group.entries; track entry.field) {\n <tr>\n <td class=\"sbd-hotel-content__changes-field\">{{ formatField(entry.field) }}</td>\n <td class=\"sbd-hotel-content__changes-old\">{{ entry.from }}</td>\n <td class=\"sbd-hotel-content__changes-new\">{{ entry.to }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n </div>\n\n }\n\n <!-- Loading skeleton for main -->\n @if (bookingStatus() === 'loading') {\n <div class=\"sbd-hotel-content__skeleton-card\">\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:40%\"></div>\n <div class=\"sbd-hotel-content__skeleton-row\" style=\"width:25%\"></div>\n </div>\n }\n\n </main>\n\n</div>\n\n<!-- Detail Dialog -->\n<p-dialog\n [(visible)]=\"detailDialogVisible\"\n [header]=\"selectedDetail()?.title || 'Details'\"\n [modal]=\"true\"\n [style]=\"{ width: '600px', maxWidth: '90vw' }\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n styleClass=\"sbd-hotel-content__detail-dialog\">\n\n @if (selectedDetail()?.type === 'packages' && selectedDetail()?.data) {\n <div class=\"sbd-hotel-content__packages-detail\">\n @for (pkg of selectedDetail()?.data; track $index) {\n <div class=\"sbd-hotel-content__package-card\">\n <div class=\"sbd-hotel-content__package-header\">\n <span class=\"sbd-hotel-content__package-title\">Package {{ $index + 1 }}</span>\n <div class=\"sbd-hotel-content__package-badges\">\n @if (pkg.isCancelled) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--cancelled\">Cancelled</span>\n }\n @if (pkg.isRefundable) {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--success\">Refundable</span>\n } @else {\n <span class=\"sbd-hotel-content__badge sbd-hotel-content__badge--danger\">Non-Refundable</span>\n }\n </div>\n </div>\n\n @if (pkg.supplier) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Supplier</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.supplier }}</span>\n </div>\n }\n\n @if (pkg.rooms && pkg.rooms.length > 0) {\n <div class=\"sbd-hotel-content__rooms-section\">\n <h4 class=\"sbd-hotel-content__subsection-title\">Rooms ({{ pkg.rooms.length }})</h4>\n @for (room of pkg.rooms; track room.roomId || $index) {\n <div class=\"sbd-hotel-content__room-item\">\n <div class=\"sbd-hotel-content__room-icon\">\n <i class=\"pi pi-home\"></i>\n </div>\n <div class=\"sbd-hotel-content__room-details\">\n @if (room.roomName) {\n <div class=\"sbd-hotel-content__room-name\">{{ room.roomName }}</div>\n }\n <div class=\"sbd-hotel-content__room-info\">\n @if (room.roomType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomType }}</span>\n }\n @if (room.roomBasis) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.roomBasis }}</span>\n }\n @if (room.bedType) {\n <span class=\"sbd-hotel-content__room-tag\">{{ room.bedType }}</span>\n }\n </div>\n @if (room.adultsNum || room.childrenNum) {\n <div class=\"sbd-hotel-content__room-occupancy\">\n @if (room.adultsNum) {\n <span><i class=\"pi pi-user\"></i> {{ room.adultsNum }} Adult{{ room.adultsNum > 1 ? 's' : '' }}</span>\n }\n @if (room.childrenNum) {\n <span><i class=\"pi pi-users\"></i> {{ room.childrenNum }} Child{{ room.childrenNum > 1 ? 'ren' : '' }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (pkg.refundableUntil) {\n <div class=\"sbd-hotel-content__package-row\">\n <span class=\"sbd-hotel-content__package-label\">Refundable Until</span>\n <span class=\"sbd-hotel-content__package-value\">{{ pkg.refundableUntil }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n</p-dialog>\n", styles: [".sbd-hotel-content{display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:start}@media (max-width: 960px){.sbd-hotel-content{grid-template-columns:1fr}}.sbd-hotel-content__error{display:flex;align-items:center;gap:10px;padding:16px 20px;background:#fef2f2;border:1px solid rgba(239,68,68,.2);border-radius:10px;color:#ef4444;font-size:13.5px;font-weight:500}.sbd-hotel-content__error i{font-size:18px}.sbd-hotel-content__aside{display:flex;flex-direction:column;gap:16px;position:sticky;top:20px}.sbd-hotel-content__main{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__quick-actions{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#fff;border:1px solid #e2e8f0;border-radius:10px;flex-wrap:wrap}.sbd-hotel-content__quick-label{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;flex-shrink:0}.sbd-hotel-content__cancelled-status{display:flex;align-items:center;gap:8px;padding:8px 14px;background:linear-gradient(135deg,#dcfce7,#bbf7d0);border:1px solid rgba(21,128,60,.2);border-radius:8px;color:#15803c;font-size:13px;font-weight:600}.sbd-hotel-content__cancelled-status i{font-size:16px;color:#15803c}.sbd-hotel-content__context{background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.sbd-hotel-content__context-tabs{display:flex;align-items:center;border-bottom:1px solid #e2e8f0;background:#f8fafc}.sbd-hotel-content__context-add{margin-left:auto;margin-right:10px}.sbd-hotel-content__context-tab{display:flex;align-items:center;gap:7px;padding:11px 20px;font-size:13px;font-weight:600;color:#64748b;background:transparent;border:none;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}.sbd-hotel-content__context-tab .pi{font-size:13px}.sbd-hotel-content__context-tab:hover{color:#334155}.sbd-hotel-content__context-tab--active{color:#1e2e4a;border-bottom-color:var(--sbd-primary, #3b82f6);background:#fff}.sbd-hotel-content__context-pill{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px}.sbd-hotel-content__context-pill--notes{background:#e0e7ff;color:#4338ca}.sbd-hotel-content__context-pill--changes{background:#fef3c7;color:#b45309}.sbd-hotel-content__context-empty{display:flex;align-items:center;gap:8px;padding:24px 20px;font-size:13px;color:#94a3b8}.sbd-hotel-content__context-empty .pi{font-size:16px}.sbd-hotel-content__notes-list{display:flex;flex-direction:column}.sbd-hotel-content__note{padding:12px 16px;border-bottom:1px solid #f1f5f9;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__note:last-child{border-bottom:none}.sbd-hotel-content__note-top{display:flex;align-items:center;gap:8px}.sbd-hotel-content__note-badge{font-size:10px;font-weight:800;letter-spacing:.05em;padding:2px 8px;border-radius:10px;text-transform:uppercase;flex-shrink:0}.sbd-hotel-content__note-badge--general{background:#dbeafe;color:#1d4ed8}.sbd-hotel-content__note-badge--remark{background:#fef3c7;color:#b45309}.sbd-hotel-content__note-badge--feedback{background:#f3e8ff;color:#7e22ce}.sbd-hotel-content__note-author{font-size:12px;font-weight:700;color:#1e2e4a}.sbd-hotel-content__note-date{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}.sbd-hotel-content__note-msg{margin:0;font-size:13px;color:#334155;line-height:1.55}.sbd-hotel-content__changes-groups{display:flex;flex-direction:column}.sbd-hotel-content__changes-group{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-group:last-child{border-bottom:none}.sbd-hotel-content__changes-meta{display:flex;align-items:center;gap:6px;padding:8px 16px;background:#fafafa;border-bottom:1px solid #f1f5f9;font-size:11.5px;color:#64748b}.sbd-hotel-content__changes-meta strong{font-weight:700;color:#334155}.sbd-hotel-content__changes-meta .pi{font-size:11px;color:#94a3b8}.sbd-hotel-content__changes-sep{color:#cbd5e1}.sbd-hotel-content__changes-table{width:100%;border-collapse:collapse;font-size:12.5px}.sbd-hotel-content__changes-table thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__changes-table thead th{padding:7px 14px;text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:#64748b;white-space:nowrap}.sbd-hotel-content__changes-table thead th .pi{margin-right:4px;font-size:10px}.sbd-hotel-content__changes-table thead th:nth-child(2){color:#dc2626}.sbd-hotel-content__changes-table thead th:nth-child(3){color:#16a34a}.sbd-hotel-content__changes-table tbody tr{border-bottom:1px solid #f1f5f9}.sbd-hotel-content__changes-table tbody tr:last-child{border-bottom:none}.sbd-hotel-content__changes-table tbody tr:hover{background:#f8fafc}.sbd-hotel-content__changes-table tbody td{padding:8px 14px;vertical-align:top;word-break:break-word}.sbd-hotel-content__changes-field{font-size:12px;font-weight:600;color:#475569;width:28%}.sbd-hotel-content__changes-old{color:#dc2626;font-weight:500;text-decoration:line-through;opacity:.8;width:36%}.sbd-hotel-content__changes-new{color:#16a34a;font-weight:700;width:36%}.sbd-hotel-content__data-overview{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px}.sbd-hotel-content__section-title{margin:0 0 16px;font-size:15px;font-weight:700;color:#1e293b;letter-spacing:-.01em}.sbd-hotel-content__data-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}@media (max-width: 768px){.sbd-hotel-content__data-grid{grid-template-columns:1fr}}.sbd-hotel-content__data-card{display:flex;align-items:flex-start;gap:12px;padding:14px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;transition:all .2s ease}.sbd-hotel-content__data-card:hover{background:#fff;border-color:#cbd5e1;box-shadow:0 2px 8px #0000000a;transform:translateY(-1px)}.sbd-hotel-content__data-card--clickable{cursor:pointer}.sbd-hotel-content__data-card--clickable:hover{background:#fff;border-color:#3b82f6;box-shadow:0 4px 12px #3b82f626;transform:translateY(-2px)}.sbd-hotel-content__data-arrow{color:#94a3b8;font-size:14px;margin-left:auto;align-self:center;transition:transform .2s ease}.sbd-hotel-content__data-card--clickable:hover .sbd-hotel-content__data-arrow{transform:translate(3px);color:#3b82f6}.sbd-hotel-content__data-icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;flex-shrink:0}.sbd-hotel-content__data-icon i{font-size:18px;color:#fff}.sbd-hotel-content__data-icon--blue{background:linear-gradient(135deg,#3b82f6,#2563eb)}.sbd-hotel-content__data-icon--purple{background:linear-gradient(135deg,#8b5cf6,#7c3aed)}.sbd-hotel-content__data-icon--green{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--orange{background:linear-gradient(135deg,#f59e0b,#d97706)}.sbd-hotel-content__data-icon--indigo{background:linear-gradient(135deg,#6366f1,#4f46e5)}.sbd-hotel-content__data-icon--pink{background:linear-gradient(135deg,#ec4899,#db2777)}.sbd-hotel-content__data-icon--emerald{background:linear-gradient(135deg,#10b981,#059669)}.sbd-hotel-content__data-icon--teal{background:linear-gradient(135deg,#14b8a6,#0d9488)}.sbd-hotel-content__data-content{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.sbd-hotel-content__data-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#64748b}.sbd-hotel-content__data-value{font-size:14px;font-weight:700;color:#1e293b;word-break:break-word}.sbd-hotel-content__data-subtext{font-size:11px;color:#94a3b8;margin-top:2px}.sbd-hotel-content__packages-detail{display:flex;flex-direction:column;gap:16px}.sbd-hotel-content__package-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__package-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:12px;border-bottom:1px solid #e2e8f0}.sbd-hotel-content__package-title{font-size:15px;font-weight:700;color:#1e293b}.sbd-hotel-content__badge{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:4px 10px;border-radius:6px}.sbd-hotel-content__badge--success{background:#dcfce7;color:#16a34a}.sbd-hotel-content__badge--danger{background:#fee2e2;color:#dc2626}.sbd-hotel-content__badge--cancelled{background:#f3f4f6;color:#6b7280;border:1px solid #d1d5db}.sbd-hotel-content__package-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.sbd-hotel-content__package-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0}.sbd-hotel-content__package-label{font-size:12px;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__package-value{font-size:13px;font-weight:600;color:#1e293b}.sbd-hotel-content__rooms-section{margin-top:8px}.sbd-hotel-content__subsection-title{font-size:13px;font-weight:700;color:#475569;margin:0 0 12px;text-transform:uppercase;letter-spacing:.05em}.sbd-hotel-content__room-item{display:flex;align-items:flex-start;gap:12px;padding:12px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;margin-bottom:10px}.sbd-hotel-content__room-item:last-child{margin-bottom:0}.sbd-hotel-content__room-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#ec4899,#db2777);border-radius:8px;flex-shrink:0}.sbd-hotel-content__room-icon i{font-size:16px;color:#fff}.sbd-hotel-content__room-details{flex:1;display:flex;flex-direction:column;gap:6px}.sbd-hotel-content__room-name{font-size:14px;font-weight:700;color:#1e293b}.sbd-hotel-content__room-info{display:flex;flex-wrap:wrap;gap:6px}.sbd-hotel-content__room-tag{font-size:11px;font-weight:600;padding:3px 8px;background:#e0e7ff;color:#4f46e5;border-radius:4px}.sbd-hotel-content__room-occupancy{display:flex;gap:12px;font-size:12px;color:#64748b}.sbd-hotel-content__room-occupancy span{display:flex;align-items:center;gap:4px}.sbd-hotel-content__room-occupancy span i{font-size:11px}.sbd-hotel-content__skeleton-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px;display:flex;flex-direction:column;gap:12px}.sbd-hotel-content__skeleton-row{height:13px;background:#f1f5f9;border-radius:6px;animation:sbd-shimmer 1.4s ease-in-out infinite}@keyframes sbd-shimmer{0%,to{opacity:1}50%{opacity:.45}}\n"] }]
135
135
  }] });
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2NvbXBvbmVudHMvaG90ZWwtY29udGVudC9ob3RlbC1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9ob3RlbC1jYW5jZWwvY29tcG9uZW50cy9ob3RlbC1jb250ZW50L2hvdGVsLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQzlHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7O0FBZ0JwRixNQUFNLE9BQU8sd0JBQXdCO0lBZHJDO1FBZUUsU0FBUztRQUNULGdCQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBNEIsQ0FBQztRQUN6RCxrQkFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQTRDLENBQUM7UUFDM0UsY0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztRQUNyQyxpQkFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVB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RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQVU7UUFDMUIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDdEQsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7K0dBN0dVLHdCQUF3QjttR0FBeEIsd0JBQXdCLG8wQ0N2QnJDLGkxZ0JBcVhBLHFxVUR4V0ksOEJBQThCLHVHQUM5QixzQkFBc0IsNkVBQ3RCLGFBQWEsaURBRWIsWUFBWSxzS0FDWixZQUFZOzs0RkFLSCx3QkFBd0I7a0JBZHBDLFNBQVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDUCw4QkFBOEI7d0JBQzlCLHNCQUFzQjt3QkFDdEIsYUFBYTt3QkFDYixJQUFJO3dCQUNKLFlBQVk7d0JBQ1osWUFBWTtxQkFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG93ZXJDYXNlUGlwZSwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5cbmltcG9ydCB7IElIb3RlbEJvb2tpbmdEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Jvb2tpbmcudHlwZXMnO1xuaW1wb3J0IHsgU2JkSG90ZWxJdGluZXJhcnlDYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vaG90ZWwtaXRpbmVyYXJ5LWNhcmQvaG90ZWwtaXRpbmVyYXJ5LWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZERhdGFTZWFyY2hDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kYXRhLXNlYXJjaC9kYXRhLXNlYXJjaC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2JkLWhvdGVsLWNvbnRlbnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgU2JkSG90ZWxJdGluZXJhcnlDYXJkQ29tcG9uZW50LFxuICAgIFNiZERhdGFTZWFyY2hDb21wb25lbnQsXG4gICAgTG93ZXJDYXNlUGlwZSxcbiAgICBOZ0lmLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBEaWFsb2dNb2R1bGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9ob3RlbC1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2hvdGVsLWNvbnRlbnQuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBTYmRIb3RlbENvbnRlbnRDb21wb25lbnQge1xuICAvLyBJbnB1dHNcbiAgYm9va2luZ0RhdGEgPSBpbnB1dC5yZXF1aXJlZDxJSG90ZWxCb29raW5nRGF0YSB8IG51bGw+KCk7XG4gIGJvb2tpbmdTdGF0dXMgPSBpbnB1dC5yZXF1aXJlZDwnaWRsZScgfCAnbG9hZGluZycgfCAnc3VjY2VzcycgfCAnZXJyb3InPigpO1xuICBib29raW5nSWQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG4gIGRhdGFWZXJpZmllZCA9IGlucHV0LnJlcXVpcmVkPGJvb2xlYW4+KCk7XG4gIGJvb2tpbmdOb3RlcyA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICBib29raW5nSGlzdG9yeSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICBoaXN0b3J5R3JvdXBzID0gaW5wdXQucmVxdWlyZWQ8YW55W10+KCk7XG4gIGFjdGl2ZUNvbnRleHRUYWIgPSBpbnB1dC5yZXF1aXJlZDwnbm90ZXMnIHwgJ2NoYW5nZXMnPigpO1xuXG4gIC8vIENvbXB1dGVkOiBDaGVjayBpZiBhbGwgcGFja2FnZXMgYXJlIGNhbmNlbGxlZFxuICBhbGxQYWNrYWdlc0NhbmNlbGxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBwYWNrYWdlcyA9IHRoaXMuYm9va2luZ0RhdGEoKT8ucGFja2FnZXM7XG4gICAgaWYgKCFwYWNrYWdlcyB8fCBwYWNrYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gcGFja2FnZXMuZXZlcnkoKHBrZzogYW55KSA9PiBwa2cuaXNDYW5jZWxsZWQgPT09IHRydWUpO1xuICB9KTtcblxuICAvLyBPdXRwdXRzXG4gIGNhbmNlbEJvb2tpbmcgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgYWRkTm90ZVJlcXVlc3RlZCA9IG91dHB1dDx2b2lkPigpO1xuICBjb250ZXh0VGFiQ2hhbmdlZCA9IG91dHB1dDwnbm90ZXMnIHwgJ2NoYW5nZXMnPigpO1xuXG4gIC8vIERpYWxvZyBzdGF0ZVxuICBkZXRhaWxEaWFsb2dWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgc2VsZWN0ZWREZXRhaWwgPSBzaWduYWw8eyB0aXRsZTogc3RyaW5nOyBkYXRhOiBhbnk7IHR5cGU6IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG5cbiAgZm10Tm90ZURhdGUoZGF0ZTogeyBzZWM6IG51bWJlcjsgdXNlYz86IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGU/LnNlYykgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5zZWMgKiAxMDAwKS50b0xvY2FsZVN0cmluZygnZW4tR0InLCB7XG4gICAgICAgIGRheTogJzItZGlnaXQnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IHJldHVybiAn4oCUJzsgfVxuICB9XG5cbiAgZm9ybWF0RmllbGQoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkXG4gICAgICAucmVwbGFjZSgvKFtBLVpdKykoW0EtWl1bYS16XSkvZywgJyQxICQyJylcbiAgICAgIC5yZXBsYWNlKC8oW2EtelxcZF0pKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgICAgLnRyaW0oKTtcbiAgfVxuXG4gIGZtdERhdGUoZHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFkdCkgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZHQpLnRvTG9jYWxlU3RyaW5nKCdlbi1HQicsIHtcbiAgICAgICAgZGF5OiAnMi1kaWdpdCcsIG1vbnRoOiAnc2hvcnQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IHJldHVybiBkdDsgfVxuICB9XG5cbiAgb25DYW5jZWxCb29raW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsQm9va2luZy5lbWl0KCk7XG4gIH1cblxuICBvbkFkZE5vdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hZGROb3RlUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYjogJ25vdGVzJyB8ICdjaGFuZ2VzJyk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dFRhYkNoYW5nZWQuZW1pdCh0YWIpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZShkYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZSkgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1HQicsIHtcbiAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFByaWNlKHByaWNlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghcHJpY2UpIHJldHVybiAn4oCUJztcbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdlbi1VUycsIHtcbiAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgY3VycmVuY3k6ICdTQVInLFxuICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyLFxuICAgIH0pLmZvcm1hdChwcmljZSk7XG4gIH1cblxuICBzaG93RGV0YWlsRGlhbG9nKHRpdGxlOiBzdHJpbmcsIGRhdGE6IGFueSwgdHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZERldGFpbC5zZXQoeyB0aXRsZSwgZGF0YSwgdHlwZSB9KTtcbiAgICB0aGlzLmRldGFpbERpYWxvZ1Zpc2libGUuc2V0KHRydWUpO1xuICB9XG5cbiAgY2xvc2VEZXRhaWxEaWFsb2coKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhaWxEaWFsb2dWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgdGhpcy5zZWxlY3RlZERldGFpbC5zZXQobnVsbCk7XG4gIH1cblxuICBzaG93UGFja2FnZXNEZXRhaWwoKTogdm9pZCB7XG4gICAgY29uc3QgcGFja2FnZXMgPSB0aGlzLmJvb2tpbmdEYXRhKCk/LnBhY2thZ2VzO1xuICAgIGlmIChwYWNrYWdlcyAmJiBwYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNob3dEZXRhaWxEaWFsb2coJ1Jvb20gUGFja2FnZXMnLCBwYWNrYWdlcywgJ3BhY2thZ2VzJyk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0RGV0YWlsVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAn4oCUJztcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZSA/ICdZZXMnIDogJ05vJztcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKTtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuIiwiPCEtLSAyLWNvbHVtbiBsYXlvdXQgZm9yIGhvdGVscyAtLT5cbjxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudFwiPlxuXG4gIDwhLS0gTGVmdDogYm9va2luZyBjb250ZXh0IC0tPlxuICA8YXNpZGUgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYXNpZGVcIj5cblxuICAgIDwhLS0gRGF0YSBzZWFyY2ggYXQgdGhlIHRvcCBvZiB0aGUgc2lkZWJhciAtLT5cbiAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICA8YXBwLXNiZC1kYXRhLXNlYXJjaCBbZGF0YV09XCJib29raW5nRGF0YSgpXCIgLz5cbiAgICAgIDxhcHAtc2JkLWhvdGVsLWl0aW5lcmFyeS1jYXJkIFtkYXRhXT1cImJvb2tpbmdEYXRhKClcIiBbdmVyaWZpZWRdPVwiZGF0YVZlcmlmaWVkKClcIiAvPlxuICAgIH1cblxuICAgIDwhLS0gTG9hZGluZyBza2VsZXRvbiBmb3IgYXNpZGUgLS0+XG4gICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdsb2FkaW5nJykge1xuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo2MCVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1yb3dcIiBzdHlsZT1cIndpZHRoOjQwJVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6ODAlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo1MCVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICA8L2FzaWRlPlxuXG4gIDwhLS0gUmlnaHQ6IGFnZW50IHdvcmtzcGFjZSAtLT5cbiAgPG1haW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fbWFpblwiPlxuXG4gICAgPCEtLSBFcnJvciBzdGF0ZSAtLT5cbiAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ2Vycm9yJykge1xuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19lcnJvclwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWV4Y2xhbWF0aW9uLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgPHNwYW4+Qm9va2luZyBub3QgZm91bmQuIERvdWJsZS1jaGVjayB0aGUgSUQgYW5kIHByb2R1Y3QgdHlwZSwgdGhlbiB0cnkgYWdhaW4uPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBDb250ZW50IG9uY2UgbG9hZGVkIC0tPlxuICAgIEBpZiAoYm9va2luZ1N0YXR1cygpID09PSAnc3VjY2VzcycpIHtcblxuICAgICAgPCEtLSBRdWljayBhY3Rpb25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19xdWljay1hY3Rpb25zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3F1aWNrLWxhYmVsXCI+UXVpY2sgYWN0aW9uczwvc3Bhbj5cbiAgICAgICAgQGlmIChhbGxQYWNrYWdlc0NhbmNlbGxlZCgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jYW5jZWxsZWQtc3RhdHVzXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZWNrLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPkFsbCBQYWNrYWdlcyBDYW5jZWxsZWQ8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGxhYmVsPVwiQ2FuY2VsIEJvb2tpbmdcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzLWNpcmNsZVwiXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLWRhbmdlciBwLWJ1dHRvbi1zbVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25DYW5jZWxCb29raW5nKClcIj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTW9kZXJuIERhdGEgT3ZlcnZpZXcgQ2FyZHMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtb3ZlcnZpZXdcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3NlY3Rpb24tdGl0bGVcIj5Cb29raW5nIE92ZXJ2aWV3PC9oMz5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtZ3JpZFwiPlxuICAgICAgICAgIDwhLS0gQm9va2luZyBJRCBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8uYm9va2luZ0lkKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY2FyZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbiBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uLS1ibHVlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1ib29rbWFya1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkJvb2tpbmcgSUQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS12YWx1ZVwiPnt7IGJvb2tpbmdEYXRhKCk/LmJvb2tpbmdJZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIEhvdGVsIE5hbWUgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LmhvdGVsTmFtZSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tcHVycGxlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1ob21lXCI+PC9pPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWxhYmVsXCI+SG90ZWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS12YWx1ZVwiPnt7IGJvb2tpbmdEYXRhKCk/LmhvdGVsTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIENoZWNrLWluIERhdGUgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LmRhdGVGcm9tKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY2FyZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbiBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uLS1ncmVlblwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2FsZW5kYXItcGx1c1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkNoZWNrLWluPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBmb3JtYXREYXRlKGJvb2tpbmdEYXRhKCk/LmRhdGVGcm9tKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LmNoZWNrSW5UaW1lKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXN1YnRleHRcIj57eyBib29raW5nRGF0YSgpPy5jaGVja0luVGltZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBDaGVjay1vdXQgRGF0ZSBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8uZGF0ZVRvKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY2FyZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbiBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uLS1vcmFuZ2VcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNhbGVuZGFyLW1pbnVzXCI+PC9pPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWxhYmVsXCI+Q2hlY2stb3V0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBmb3JtYXREYXRlKGJvb2tpbmdEYXRhKCk/LmRhdGVUbykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5jaGVja091dFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtc3VidGV4dFwiPnt7IGJvb2tpbmdEYXRhKCk/LmNoZWNrT3V0VGltZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBOdW1iZXIgb2YgTmlnaHRzIENhcmQgLS0+XG4gICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5udW1iZXJPZk5pZ2h0cykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0taW5kaWdvXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1tb29uXCI+PC9pPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWxhYmVsXCI+RHVyYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS12YWx1ZVwiPnt7IGJvb2tpbmdEYXRhKCk/Lm51bWJlck9mTmlnaHRzIH19IE5pZ2h0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIE51bWJlciBvZiBSb29tcyBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8ucm9vbXMpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jYXJkIHNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmQtLWNsaWNrYWJsZVwiIChjbGljayk9XCJzaG93UGFja2FnZXNEZXRhaWwoKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbiBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uLS1waW5rXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1ob21lXCI+PC9pPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWxhYmVsXCI+Um9vbXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS12YWx1ZVwiPnt7IGJvb2tpbmdEYXRhKCk/LnJvb21zIH19IFJvb217eyBib29raW5nRGF0YSgpPy5yb29tcyA+IDEgPyAncycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LnBhY2thZ2VzICYmIGJvb2tpbmdEYXRhKCk/LnBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtc3VidGV4dFwiPkNsaWNrIGZvciBkZXRhaWxzPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8ucGFja2FnZXMgJiYgYm9va2luZ0RhdGEoKT8ucGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2hldnJvbi1yaWdodCBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1hcnJvd1wiPjwvaT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBQcmljZSBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8ucHJpY2UpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uIHNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24tLWVtZXJhbGRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXdhbGxldFwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPlRvdGFsIFByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBmb3JtYXRQcmljZShib29raW5nRGF0YSgpPy5wcmljZSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBIb3RlbCBJRCBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8uaG90ZWxJZCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tdGVhbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaWQtY2FyZFwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkhvdGVsIElEPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5ob3RlbElkIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDb250ZXh0OiBOb3RlcyArIENoYW5nZXMgdGFiYmVkIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0XCI+XG5cbiAgICAgICAgPCEtLSBUYWIgYmFyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtdGFic1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC10YWJcIlxuICAgICAgICAgICAgW2NsYXNzLnNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXRhYi0tYWN0aXZlXT1cImFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ2NoYW5nZXMnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRhYkNoYW5nZSgnY2hhbmdlcycpXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWhpc3RvcnlcIj48L2k+XG4gICAgICAgICAgICBDaGFuZ2VzXG4gICAgICAgICAgICBAaWYgKGJvb2tpbmdIaXN0b3J5KCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXBpbGwgc2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtcGlsbC0tY2hhbmdlc1wiPnt7IGJvb2tpbmdIaXN0b3J5KCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC10YWJcIlxuICAgICAgICAgICAgW2NsYXNzLnNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXRhYi0tYWN0aXZlXT1cImFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ25vdGVzJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25UYWJDaGFuZ2UoJ25vdGVzJylcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY29tbWVudHNcIj48L2k+XG4gICAgICAgICAgICBOb3Rlc1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC1waWxsIHNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXBpbGwtLW5vdGVzXCI+e3sgYm9va2luZ05vdGVzKCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIEBpZiAoYWN0aXZlQ29udGV4dFRhYigpID09PSAnbm90ZXMnKSB7XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJBZGQgTm90ZVwiIGljb249XCJwaSBwaS1wbHVzXCIgY2xhc3M9XCJwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1vdXRsaW5lZCBzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC1hZGRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25BZGROb3RlKClcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBOb3RlcyB0YWIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlQ29udGV4dFRhYigpID09PSAnbm90ZXMnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3Rlcy1saXN0XCI+XG4gICAgICAgICAgICBAaWYgKGJvb2tpbmdOb3RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtZW1wdHlcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluYm94XCI+PC9pPiBObyBub3RlcyB5ZXRcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZm9yIChub3RlIG9mIGJvb2tpbmdOb3RlcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3RlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3RlLXRvcFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fbm90ZS1iYWRnZSBzYmQtaG90ZWwtY29udGVudF9fbm90ZS1iYWRnZS0te3sgbm90ZS5hY3Rpb24gfCBsb3dlcmNhc2UgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbm90ZS5hY3Rpb24gfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX25vdGUtYXV0aG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG5vdGUud3JpdHRlbkJ5Py5maXJzdE5hbWUgfX0ge3sgbm90ZS53cml0dGVuQnk/Lmxhc3ROYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3RlLWRhdGVcIj57eyBmbXROb3RlRGF0ZShub3RlLmRhdGUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX25vdGUtbXNnXCI+e3sgbm90ZS5tZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gQ2hhbmdlcyB0YWIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlQ29udGV4dFRhYigpID09PSAnY2hhbmdlcycpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NoYW5nZXMtZ3JvdXBzXCI+XG4gICAgICAgICAgICBAaWYgKGhpc3RvcnlHcm91cHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jaGVja1wiPjwvaT4gTm8gY2hhbmdlcyByZWNvcmRlZFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGdyb3VwIG9mIGhpc3RvcnlHcm91cHMoKTsgdHJhY2sgZ3JvdXAuY2hhbmdlZEF0KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy1tZXRhXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXVzZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IGdyb3VwLmNoYW5nZWRCeSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy1zZXBcIj7Ctzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZtdERhdGUoZ3JvdXAuY2hhbmdlZEF0KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy10YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoPkZpZWxkPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGg+PGkgY2xhc3M9XCJwaSBwaS10aW1lcy1jaXJjbGVcIj48L2k+IEJlZm9yZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoPjxpIGNsYXNzPVwicGkgcGktY2hlY2stY2lyY2xlXCI+PC9pPiBBZnRlcjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChlbnRyeSBvZiBncm91cC5lbnRyaWVzOyB0cmFjayBlbnRyeS5maWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jaGFuZ2VzLWZpZWxkXCI+e3sgZm9ybWF0RmllbGQoZW50cnkuZmllbGQpIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jaGFuZ2VzLW9sZFwiPnt7IGVudHJ5LmZyb20gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NoYW5nZXMtbmV3XCI+e3sgZW50cnkudG8gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgPC9kaXY+XG5cbiAgICB9XG5cbiAgICA8IS0tIExvYWRpbmcgc2tlbGV0b24gZm9yIG1haW4gLS0+XG4gICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdsb2FkaW5nJykge1xuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo0MCVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1yb3dcIiBzdHlsZT1cIndpZHRoOjI1JVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gIDwvbWFpbj5cblxuPC9kaXY+XG5cbjwhLS0gRGV0YWlsIERpYWxvZyAtLT5cbjxwLWRpYWxvZ1xuICBbKHZpc2libGUpXT1cImRldGFpbERpYWxvZ1Zpc2libGVcIlxuICBbaGVhZGVyXT1cInNlbGVjdGVkRGV0YWlsKCk/LnRpdGxlIHx8ICdEZXRhaWxzJ1wiXG4gIFttb2RhbF09XCJ0cnVlXCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICc2MDBweCcsIG1heFdpZHRoOiAnOTB2dycgfVwiXG4gIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICBbcmVzaXphYmxlXT1cImZhbHNlXCJcbiAgc3R5bGVDbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kZXRhaWwtZGlhbG9nXCI+XG5cbiAgQGlmIChzZWxlY3RlZERldGFpbCgpPy50eXBlID09PSAncGFja2FnZXMnICYmIHNlbGVjdGVkRGV0YWlsKCk/LmRhdGEpIHtcbiAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2VzLWRldGFpbFwiPlxuICAgICAgQGZvciAocGtnIG9mIHNlbGVjdGVkRGV0YWlsKCk/LmRhdGE7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtY2FyZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcGFja2FnZS1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtdGl0bGVcIj5QYWNrYWdlIHt7ICRpbmRleCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtYmFkZ2VzXCI+XG4gICAgICAgICAgICAgIEBpZiAocGtnLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYmFkZ2Ugc2JkLWhvdGVsLWNvbnRlbnRfX2JhZGdlLS1jYW5jZWxsZWRcIj5DYW5jZWxsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChwa2cuaXNSZWZ1bmRhYmxlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYmFkZ2Ugc2JkLWhvdGVsLWNvbnRlbnRfX2JhZGdlLS1zdWNjZXNzXCI+UmVmdW5kYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYmFkZ2Ugc2JkLWhvdGVsLWNvbnRlbnRfX2JhZGdlLS1kYW5nZXJcIj5Ob24tUmVmdW5kYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKHBrZy5zdXBwbGllcikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlLXJvd1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlLWxhYmVsXCI+U3VwcGxpZXI8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtdmFsdWVcIj57eyBwa2cuc3VwcGxpZXIgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKHBrZy5yb29tcyAmJiBwa2cucm9vbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tcy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19zdWJzZWN0aW9uLXRpdGxlXCI+Um9vbXMgKHt7IHBrZy5yb29tcy5sZW5ndGggfX0pPC9oND5cbiAgICAgICAgICAgICAgQGZvciAocm9vbSBvZiBwa2cucm9vbXM7IHRyYWNrIHJvb20ucm9vbUlkIHx8ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb20taWNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWhvbWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5yb29tTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1uYW1lXCI+e3sgcm9vbS5yb29tTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb29tLnJvb21UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tLXRhZ1wiPnt7IHJvb20ucm9vbVR5cGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5yb29tQmFzaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb20tdGFnXCI+e3sgcm9vbS5yb29tQmFzaXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5iZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tLXRhZ1wiPnt7IHJvb20uYmVkVHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHJvb20uYWR1bHRzTnVtIHx8IHJvb20uY2hpbGRyZW5OdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb20tb2NjdXBhbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvb20uYWR1bHRzTnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwicGkgcGktdXNlclwiPjwvaT4ge3sgcm9vbS5hZHVsdHNOdW0gfX0gQWR1bHR7eyByb29tLmFkdWx0c051bSA+IDEgPyAncycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5jaGlsZHJlbk51bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz1cInBpIHBpLXVzZXJzXCI+PC9pPiB7eyByb29tLmNoaWxkcmVuTnVtIH19IENoaWxke3sgcm9vbS5jaGlsZHJlbk51bSA+IDEgPyAncmVuJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChwa2cucmVmdW5kYWJsZVVudGlsKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2Utcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtbGFiZWxcIj5SZWZ1bmRhYmxlIFVudGlsPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlLXZhbHVlXCI+e3sgcGtnLnJlZnVuZGFibGVVbnRpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvcC1kaWFsb2c+XG4iXX0=
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90ZWwtY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL2NvbXBvbmVudHMvaG90ZWwtY2FuY2VsL2NvbXBvbmVudHMvaG90ZWwtY29udGVudC9ob3RlbC1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9ob3RlbC1jYW5jZWwvY29tcG9uZW50cy9ob3RlbC1jb250ZW50L2hvdGVsLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQzlHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7O0FBZ0JwRixNQUFNLE9BQU8sd0JBQXdCO0lBZHJDO1FBZUUsU0FBUztRQUNULGdCQUFXLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBNEIsQ0FBQztRQUN6RCxrQkFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQTRDLENBQUM7UUFDM0UsY0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztRQUNyQyxpQkFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVB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ZSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQVU7UUFDMUIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDdEQsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7K0dBN0dVLHdCQUF3QjttR0FBeEIsd0JBQXdCLG8wQ0N2QnJDLHcyZ0JBcVhBLHFxVUR4V0ksOEJBQThCLHVHQUM5QixzQkFBc0IsNkVBQ3RCLGFBQWEsaURBRWIsWUFBWSxzS0FDWixZQUFZOzs0RkFLSCx3QkFBd0I7a0JBZHBDLFNBQVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDUCw4QkFBOEI7d0JBQzlCLHNCQUFzQjt3QkFDdEIsYUFBYTt3QkFDYixJQUFJO3dCQUNKLFlBQVk7d0JBQ1osWUFBWTtxQkFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG93ZXJDYXNlUGlwZSwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5cbmltcG9ydCB7IElIb3RlbEJvb2tpbmdEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Jvb2tpbmcudHlwZXMnO1xuaW1wb3J0IHsgU2JkSG90ZWxJdGluZXJhcnlDYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vaG90ZWwtaXRpbmVyYXJ5LWNhcmQvaG90ZWwtaXRpbmVyYXJ5LWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFNiZERhdGFTZWFyY2hDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9kYXRhLXNlYXJjaC9kYXRhLXNlYXJjaC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2JkLWhvdGVsLWNvbnRlbnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgU2JkSG90ZWxJdGluZXJhcnlDYXJkQ29tcG9uZW50LFxuICAgIFNiZERhdGFTZWFyY2hDb21wb25lbnQsXG4gICAgTG93ZXJDYXNlUGlwZSxcbiAgICBOZ0lmLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBEaWFsb2dNb2R1bGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9ob3RlbC1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2hvdGVsLWNvbnRlbnQuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBTYmRIb3RlbENvbnRlbnRDb21wb25lbnQge1xuICAvLyBJbnB1dHNcbiAgYm9va2luZ0RhdGEgPSBpbnB1dC5yZXF1aXJlZDxJSG90ZWxCb29raW5nRGF0YSB8IG51bGw+KCk7XG4gIGJvb2tpbmdTdGF0dXMgPSBpbnB1dC5yZXF1aXJlZDwnaWRsZScgfCAnbG9hZGluZycgfCAnc3VjY2VzcycgfCAnZXJyb3InPigpO1xuICBib29raW5nSWQgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG4gIGRhdGFWZXJpZmllZCA9IGlucHV0LnJlcXVpcmVkPGJvb2xlYW4+KCk7XG4gIGJvb2tpbmdOb3RlcyA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICBib29raW5nSGlzdG9yeSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICBoaXN0b3J5R3JvdXBzID0gaW5wdXQucmVxdWlyZWQ8YW55W10+KCk7XG4gIGFjdGl2ZUNvbnRleHRUYWIgPSBpbnB1dC5yZXF1aXJlZDwnbm90ZXMnIHwgJ2NoYW5nZXMnPigpO1xuXG4gIC8vIENvbXB1dGVkOiBDaGVjayBpZiBhbGwgcGFja2FnZXMgYXJlIGNhbmNlbGxlZFxuICBhbGxQYWNrYWdlc0NhbmNlbGxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBwYWNrYWdlcyA9IHRoaXMuYm9va2luZ0RhdGEoKT8ucGFja2FnZXM7XG4gICAgaWYgKCFwYWNrYWdlcyB8fCBwYWNrYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gcGFja2FnZXMuZXZlcnkoKHBrZzogYW55KSA9PiBwa2cuaXNDYW5jZWxsZWQgPT09IHRydWUpO1xuICB9KTtcblxuICAvLyBPdXRwdXRzXG4gIGNhbmNlbEJvb2tpbmcgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgYWRkTm90ZVJlcXVlc3RlZCA9IG91dHB1dDx2b2lkPigpO1xuICBjb250ZXh0VGFiQ2hhbmdlZCA9IG91dHB1dDwnbm90ZXMnIHwgJ2NoYW5nZXMnPigpO1xuXG4gIC8vIERpYWxvZyBzdGF0ZVxuICBkZXRhaWxEaWFsb2dWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgc2VsZWN0ZWREZXRhaWwgPSBzaWduYWw8eyB0aXRsZTogc3RyaW5nOyBkYXRhOiBhbnk7IHR5cGU6IHN0cmluZyB9IHwgbnVsbD4obnVsbCk7XG5cbiAgZm10Tm90ZURhdGUoZGF0ZTogeyBzZWM6IG51bWJlcjsgdXNlYz86IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICBpZiAoIWRhdGU/LnNlYykgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5zZWMgKiAxMDAwKS50b0xvY2FsZVN0cmluZygnZW4tR0InLCB7XG4gICAgICAgIGRheTogJzItZGlnaXQnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IHJldHVybiAn4oCUJzsgfVxuICB9XG5cbiAgZm9ybWF0RmllbGQoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkXG4gICAgICAucmVwbGFjZSgvKFtBLVpdKykoW0EtWl1bYS16XSkvZywgJyQxICQyJylcbiAgICAgIC5yZXBsYWNlKC8oW2EtelxcZF0pKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgICAgLnRyaW0oKTtcbiAgfVxuXG4gIGZtdERhdGUoZHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFkdCkgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZHQpLnRvTG9jYWxlU3RyaW5nKCdlbi1HQicsIHtcbiAgICAgICAgZGF5OiAnMi1kaWdpdCcsIG1vbnRoOiAnc2hvcnQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IHJldHVybiBkdDsgfVxuICB9XG5cbiAgb25DYW5jZWxCb29raW5nKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsQm9va2luZy5lbWl0KCk7XG4gIH1cblxuICBvbkFkZE5vdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hZGROb3RlUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYjogJ25vdGVzJyB8ICdjaGFuZ2VzJyk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dFRhYkNoYW5nZWQuZW1pdCh0YWIpO1xuICB9XG5cbiAgZm9ybWF0RGF0ZShkYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZSkgcmV0dXJuICfigJQnO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1HQicsIHtcbiAgICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFByaWNlKHByaWNlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghcHJpY2UpIHJldHVybiAn4oCUJztcbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCdlbi1VUycsIHtcbiAgICAgIHN0eWxlOiAnY3VycmVuY3knLFxuICAgICAgY3VycmVuY3k6IHRoaXMuYm9va2luZ0RhdGEoKT8uY3VycmVuY3k/LmN1cnJlbmN5Q29kZSxcbiAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMixcbiAgICB9KS5mb3JtYXQocHJpY2UpO1xuICB9XG5cbiAgc2hvd0RldGFpbERpYWxvZyh0aXRsZTogc3RyaW5nLCBkYXRhOiBhbnksIHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWREZXRhaWwuc2V0KHsgdGl0bGUsIGRhdGEsIHR5cGUgfSk7XG4gICAgdGhpcy5kZXRhaWxEaWFsb2dWaXNpYmxlLnNldCh0cnVlKTtcbiAgfVxuXG4gIGNsb3NlRGV0YWlsRGlhbG9nKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWlsRGlhbG9nVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuc2VsZWN0ZWREZXRhaWwuc2V0KG51bGwpO1xuICB9XG5cbiAgc2hvd1BhY2thZ2VzRGV0YWlsKCk6IHZvaWQge1xuICAgIGNvbnN0IHBhY2thZ2VzID0gdGhpcy5ib29raW5nRGF0YSgpPy5wYWNrYWdlcztcbiAgICBpZiAocGFja2FnZXMgJiYgcGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zaG93RGV0YWlsRGlhbG9nKCdSb29tIFBhY2thZ2VzJywgcGFja2FnZXMsICdwYWNrYWdlcycpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdERldGFpbFZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJ+KAlCc7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWUgPyAnWWVzJyA6ICdObyc7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMik7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cbiIsIjwhLS0gMi1jb2x1bW4gbGF5b3V0IGZvciBob3RlbHMgLS0+XG48ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRcIj5cblxuICA8IS0tIExlZnQ6IGJvb2tpbmcgY29udGV4dCAtLT5cbiAgPGFzaWRlIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2FzaWRlXCI+XG5cbiAgICA8IS0tIERhdGEgc2VhcmNoIGF0IHRoZSB0b3Agb2YgdGhlIHNpZGViYXIgLS0+XG4gICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdzdWNjZXNzJykge1xuICAgICAgPGFwcC1zYmQtZGF0YS1zZWFyY2ggW2RhdGFdPVwiYm9va2luZ0RhdGEoKVwiIC8+XG4gICAgICA8YXBwLXNiZC1ob3RlbC1pdGluZXJhcnktY2FyZCBbZGF0YV09XCJib29raW5nRGF0YSgpXCIgW3ZlcmlmaWVkXT1cImRhdGFWZXJpZmllZCgpXCIgLz5cbiAgICB9XG5cbiAgICA8IS0tIExvYWRpbmcgc2tlbGV0b24gZm9yIGFzaWRlIC0tPlxuICAgIEBpZiAoYm9va2luZ1N0YXR1cygpID09PSAnbG9hZGluZycpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6NjAlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo0MCVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1yb3dcIiBzdHlsZT1cIndpZHRoOjgwJVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3NrZWxldG9uLXJvd1wiIHN0eWxlPVwid2lkdGg6NTAlXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgPC9hc2lkZT5cblxuICA8IS0tIFJpZ2h0OiBhZ2VudCB3b3Jrc3BhY2UgLS0+XG4gIDxtYWluIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX21haW5cIj5cblxuICAgIDwhLS0gRXJyb3Igc3RhdGUgLS0+XG4gICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdlcnJvcicpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZXJyb3JcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1leGNsYW1hdGlvbi1jaXJjbGVcIj48L2k+XG4gICAgICAgIDxzcGFuPkJvb2tpbmcgbm90IGZvdW5kLiBEb3VibGUtY2hlY2sgdGhlIElEIGFuZCBwcm9kdWN0IHR5cGUsIHRoZW4gdHJ5IGFnYWluLjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gQ29udGVudCBvbmNlIGxvYWRlZCAtLT5cbiAgICBAaWYgKGJvb2tpbmdTdGF0dXMoKSA9PT0gJ3N1Y2Nlc3MnKSB7XG5cbiAgICAgIDwhLS0gUXVpY2sgYWN0aW9ucyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcXVpY2stYWN0aW9uc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19xdWljay1sYWJlbFwiPlF1aWNrIGFjdGlvbnM8L3NwYW4+XG4gICAgICAgIEBpZiAoYWxsUGFja2FnZXNDYW5jZWxsZWQoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2FuY2VsbGVkLXN0YXR1c1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jaGVjay1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgICA8c3Bhbj5BbGwgUGFja2FnZXMgQ2FuY2VsbGVkPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBsYWJlbD1cIkNhbmNlbCBCb29raW5nXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lcy1jaXJjbGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgcC1idXR0b24tc21cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsQm9va2luZygpXCI+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE1vZGVybiBEYXRhIE92ZXJ2aWV3IENhcmRzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLW92ZXJ2aWV3XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19zZWN0aW9uLXRpdGxlXCI+Qm9va2luZyBPdmVydmlldzwvaDM+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWdyaWRcIj5cbiAgICAgICAgICA8IS0tIEJvb2tpbmcgSUQgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LmJvb2tpbmdJZCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tYmx1ZVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktYm9va21hcmtcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtbGFiZWxcIj5Cb29raW5nIElEPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5ib29raW5nSWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBIb3RlbCBOYW1lIENhcmQgLS0+XG4gICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5ob3RlbE5hbWUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uIHNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24tLXB1cnBsZVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaG9tZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkhvdGVsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5ob3RlbE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBDaGVjay1pbiBEYXRlIENhcmQgLS0+XG4gICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5kYXRlRnJvbSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tZ3JlZW5cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNhbGVuZGFyLXBsdXNcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtbGFiZWxcIj5DaGVjay1pbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXZhbHVlXCI+e3sgZm9ybWF0RGF0ZShib29raW5nRGF0YSgpPy5kYXRlRnJvbSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5jaGVja0luVGltZSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1zdWJ0ZXh0XCI+e3sgYm9va2luZ0RhdGEoKT8uY2hlY2tJblRpbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gQ2hlY2stb3V0IERhdGUgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LmRhdGVUbykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tb3JhbmdlXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jYWxlbmRhci1taW51c1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkNoZWNrLW91dDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXZhbHVlXCI+e3sgZm9ybWF0RGF0ZShib29raW5nRGF0YSgpPy5kYXRlVG8pIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8uY2hlY2tPdXRUaW1lKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXN1YnRleHRcIj57eyBib29raW5nRGF0YSgpPy5jaGVja091dFRpbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gTnVtYmVyIG9mIE5pZ2h0cyBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8ubnVtYmVyT2ZOaWdodHMpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uIHNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24tLWluZGlnb1wiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktbW9vblwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkR1cmF0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5udW1iZXJPZk5pZ2h0cyB9fSBOaWdodHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBOdW1iZXIgb2YgUm9vbXMgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LnJvb21zKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY2FyZCBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jYXJkLS1jbGlja2FibGVcIiAoY2xpY2spPVwic2hvd1BhY2thZ2VzRGV0YWlsKClcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tcGlua1wiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaG9tZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPlJvb21zPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5yb29tcyB9fSBSb29te3sgYm9va2luZ0RhdGEoKT8ucm9vbXMgPiAxID8gJ3MnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChib29raW5nRGF0YSgpPy5wYWNrYWdlcyAmJiBib29raW5nRGF0YSgpPy5wYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXN1YnRleHRcIj5DbGljayBmb3IgZGV0YWlsczwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LnBhY2thZ2VzICYmIGJvb2tpbmdEYXRhKCk/LnBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tcmlnaHQgc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtYXJyb3dcIj48L2k+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gUHJpY2UgQ2FyZCAtLT5cbiAgICAgICAgICBAaWYgKGJvb2tpbmdEYXRhKCk/LnByaWNlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY2FyZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbiBzYmQtaG90ZWwtY29udGVudF9fZGF0YS1pY29uLS1lbWVyYWxkXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS13YWxsZXRcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtbGFiZWxcIj5Ub3RhbCBQcmljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLXZhbHVlXCI+e3tib29raW5nRGF0YSgpPy5wcmljZSArICcgJyArICBib29raW5nRGF0YSgpPy5wcmljZUN1cnJlbmN5fX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBIb3RlbCBJRCBDYXJkIC0tPlxuICAgICAgICAgIEBpZiAoYm9va2luZ0RhdGEoKT8uaG90ZWxJZCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kYXRhLWljb24gc2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtaWNvbi0tdGVhbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaWQtY2FyZFwiPjwvaT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fZGF0YS1sYWJlbFwiPkhvdGVsIElEPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2RhdGEtdmFsdWVcIj57eyBib29raW5nRGF0YSgpPy5ob3RlbElkIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDb250ZXh0OiBOb3RlcyArIENoYW5nZXMgdGFiYmVkIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0XCI+XG5cbiAgICAgICAgPCEtLSBUYWIgYmFyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtdGFic1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC10YWJcIlxuICAgICAgICAgICAgW2NsYXNzLnNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXRhYi0tYWN0aXZlXT1cImFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ2NoYW5nZXMnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRhYkNoYW5nZSgnY2hhbmdlcycpXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWhpc3RvcnlcIj48L2k+XG4gICAgICAgICAgICBDaGFuZ2VzXG4gICAgICAgICAgICBAaWYgKGJvb2tpbmdIaXN0b3J5KCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXBpbGwgc2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtcGlsbC0tY2hhbmdlc1wiPnt7IGJvb2tpbmdIaXN0b3J5KCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC10YWJcIlxuICAgICAgICAgICAgW2NsYXNzLnNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXRhYi0tYWN0aXZlXT1cImFjdGl2ZUNvbnRleHRUYWIoKSA9PT0gJ25vdGVzJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25UYWJDaGFuZ2UoJ25vdGVzJylcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY29tbWVudHNcIj48L2k+XG4gICAgICAgICAgICBOb3Rlc1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC1waWxsIHNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LXBpbGwtLW5vdGVzXCI+e3sgYm9va2luZ05vdGVzKCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIEBpZiAoYWN0aXZlQ29udGV4dFRhYigpID09PSAnbm90ZXMnKSB7XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJBZGQgTm90ZVwiIGljb249XCJwaSBwaS1wbHVzXCIgY2xhc3M9XCJwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1vdXRsaW5lZCBzYmQtaG90ZWwtY29udGVudF9fY29udGV4dC1hZGRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25BZGROb3RlKClcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBOb3RlcyB0YWIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlQ29udGV4dFRhYigpID09PSAnbm90ZXMnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3Rlcy1saXN0XCI+XG4gICAgICAgICAgICBAaWYgKGJvb2tpbmdOb3RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NvbnRleHQtZW1wdHlcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluYm94XCI+PC9pPiBObyBub3RlcyB5ZXRcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZm9yIChub3RlIG9mIGJvb2tpbmdOb3RlcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3RlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3RlLXRvcFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fbm90ZS1iYWRnZSBzYmQtaG90ZWwtY29udGVudF9fbm90ZS1iYWRnZS0te3sgbm90ZS5hY3Rpb24gfCBsb3dlcmNhc2UgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbm90ZS5hY3Rpb24gfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX25vdGUtYXV0aG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG5vdGUud3JpdHRlbkJ5Py5maXJzdE5hbWUgfX0ge3sgbm90ZS53cml0dGVuQnk/Lmxhc3ROYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19ub3RlLWRhdGVcIj57eyBmbXROb3RlRGF0ZShub3RlLmRhdGUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX25vdGUtbXNnXCI+e3sgbm90ZS5tZXNzYWdlIH19PC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDwhLS0gQ2hhbmdlcyB0YWIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlQ29udGV4dFRhYigpID09PSAnY2hhbmdlcycpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NoYW5nZXMtZ3JvdXBzXCI+XG4gICAgICAgICAgICBAaWYgKGhpc3RvcnlHcm91cHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jb250ZXh0LWVtcHR5XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jaGVja1wiPjwvaT4gTm8gY2hhbmdlcyByZWNvcmRlZFxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGdyb3VwIG9mIGhpc3RvcnlHcm91cHMoKTsgdHJhY2sgZ3JvdXAuY2hhbmdlZEF0KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy1tZXRhXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXVzZXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IGdyb3VwLmNoYW5nZWRCeSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy1zZXBcIj7Ctzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZtdERhdGUoZ3JvdXAuY2hhbmdlZEF0KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fY2hhbmdlcy10YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoPkZpZWxkPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGg+PGkgY2xhc3M9XCJwaSBwaS10aW1lcy1jaXJjbGVcIj48L2k+IEJlZm9yZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoPjxpIGNsYXNzPVwicGkgcGktY2hlY2stY2lyY2xlXCI+PC9pPiBBZnRlcjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChlbnRyeSBvZiBncm91cC5lbnRyaWVzOyB0cmFjayBlbnRyeS5maWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jaGFuZ2VzLWZpZWxkXCI+e3sgZm9ybWF0RmllbGQoZW50cnkuZmllbGQpIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19jaGFuZ2VzLW9sZFwiPnt7IGVudHJ5LmZyb20gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX2NoYW5nZXMtbmV3XCI+e3sgZW50cnkudG8gfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgPC9kaXY+XG5cbiAgICB9XG5cbiAgICA8IS0tIExvYWRpbmcgc2tlbGV0b24gZm9yIG1haW4gLS0+XG4gICAgQGlmIChib29raW5nU3RhdHVzKCkgPT09ICdsb2FkaW5nJykge1xuICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fc2tlbGV0b24tcm93XCIgc3R5bGU9XCJ3aWR0aDo0MCVcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19za2VsZXRvbi1yb3dcIiBzdHlsZT1cIndpZHRoOjI1JVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gIDwvbWFpbj5cblxuPC9kaXY+XG5cbjwhLS0gRGV0YWlsIERpYWxvZyAtLT5cbjxwLWRpYWxvZ1xuICBbKHZpc2libGUpXT1cImRldGFpbERpYWxvZ1Zpc2libGVcIlxuICBbaGVhZGVyXT1cInNlbGVjdGVkRGV0YWlsKCk/LnRpdGxlIHx8ICdEZXRhaWxzJ1wiXG4gIFttb2RhbF09XCJ0cnVlXCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICc2MDBweCcsIG1heFdpZHRoOiAnOTB2dycgfVwiXG4gIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICBbcmVzaXphYmxlXT1cImZhbHNlXCJcbiAgc3R5bGVDbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19kZXRhaWwtZGlhbG9nXCI+XG5cbiAgQGlmIChzZWxlY3RlZERldGFpbCgpPy50eXBlID09PSAncGFja2FnZXMnICYmIHNlbGVjdGVkRGV0YWlsKCk/LmRhdGEpIHtcbiAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2VzLWRldGFpbFwiPlxuICAgICAgQGZvciAocGtnIG9mIHNlbGVjdGVkRGV0YWlsKCk/LmRhdGE7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtY2FyZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcGFja2FnZS1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtdGl0bGVcIj5QYWNrYWdlIHt7ICRpbmRleCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtYmFkZ2VzXCI+XG4gICAgICAgICAgICAgIEBpZiAocGtnLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYmFkZ2Ugc2JkLWhvdGVsLWNvbnRlbnRfX2JhZGdlLS1jYW5jZWxsZWRcIj5DYW5jZWxsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChwa2cuaXNSZWZ1bmRhYmxlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYmFkZ2Ugc2JkLWhvdGVsLWNvbnRlbnRfX2JhZGdlLS1zdWNjZXNzXCI+UmVmdW5kYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fYmFkZ2Ugc2JkLWhvdGVsLWNvbnRlbnRfX2JhZGdlLS1kYW5nZXJcIj5Ob24tUmVmdW5kYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICBAaWYgKHBrZy5zdXBwbGllcikge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlLXJvd1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlLWxhYmVsXCI+U3VwcGxpZXI8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtdmFsdWVcIj57eyBwa2cuc3VwcGxpZXIgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKHBrZy5yb29tcyAmJiBwa2cucm9vbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tcy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19zdWJzZWN0aW9uLXRpdGxlXCI+Um9vbXMgKHt7IHBrZy5yb29tcy5sZW5ndGggfX0pPC9oND5cbiAgICAgICAgICAgICAgQGZvciAocm9vbSBvZiBwa2cucm9vbXM7IHRyYWNrIHJvb20ucm9vbUlkIHx8ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb20taWNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWhvbWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5yb29tTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1uYW1lXCI+e3sgcm9vbS5yb29tTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYmQtaG90ZWwtY29udGVudF9fcm9vbS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb29tLnJvb21UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tLXRhZ1wiPnt7IHJvb20ucm9vbVR5cGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5yb29tQmFzaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb20tdGFnXCI+e3sgcm9vbS5yb29tQmFzaXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5iZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19yb29tLXRhZ1wiPnt7IHJvb20uYmVkVHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHJvb20uYWR1bHRzTnVtIHx8IHJvb20uY2hpbGRyZW5OdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3Jvb20tb2NjdXBhbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvb20uYWR1bHRzTnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwicGkgcGktdXNlclwiPjwvaT4ge3sgcm9vbS5hZHVsdHNOdW0gfX0gQWR1bHR7eyByb29tLmFkdWx0c051bSA+IDEgPyAncycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm9vbS5jaGlsZHJlbk51bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz1cInBpIHBpLXVzZXJzXCI+PC9pPiB7eyByb29tLmNoaWxkcmVuTnVtIH19IENoaWxke3sgcm9vbS5jaGlsZHJlbk51bSA+IDEgPyAncmVuJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChwa2cucmVmdW5kYWJsZVVudGlsKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2Utcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2JkLWhvdGVsLWNvbnRlbnRfX3BhY2thZ2UtbGFiZWxcIj5SZWZ1bmRhYmxlIFVudGlsPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNiZC1ob3RlbC1jb250ZW50X19wYWNrYWdlLXZhbHVlXCI+e3sgcGtnLnJlZnVuZGFibGVVbnRpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvcC1kaWFsb2c+XG4iXX0=