/**
 * The Fluid Theme Motion System v1.0.0
 * Toggleable motion and animation system
 * 
 * Copyright (c) 2025 AGILE LLC
 * Author: Neil S. White
 * 
 * Features:
 * - Master motion toggle (on/off)
 * - Motion.dev integration
 * - Swup.js page transitions
 * - Barba.js advanced transitions
 * - Accessibility first (respects prefers-reduced-motion)
 * - Performance optimized
 */

/* ============================================
   MOTION CONTROL VARIABLES
   ============================================ */

:root {
  /* Motion timing - slower, more elegant defaults */
  --fluid-motion-duration-fast: 0.4s;
  --fluid-motion-duration-normal: 0.8s;
  --fluid-motion-duration-slow: 1.2s;
  --fluid-motion-duration-slower: 1.8s;
  
  /* Motion easing curves */
  --fluid-motion-ease-linear: linear;
  --fluid-motion-ease-in: cubic-bezier(0.4, 0, 1, 1);
  --fluid-motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
  --fluid-motion-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
  --fluid-motion-ease-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
  --fluid-motion-ease-bounce: cubic-bezier(0.68, -0.6, 0.32, 1.6);
  --fluid-motion-ease-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275);
  
  /* Motion state control */
  --fluid-motion-enabled: 1;
  --fluid-motion-scale: 1;
}

/* ============================================
   MOTION DISABLED STATES
   ============================================ */

/* Global motion disable */
[data-motion-disabled="true"] {
  --fluid-motion-enabled: 0;
  --fluid-motion-duration-fast: 0s;
  --fluid-motion-duration-normal: 0s;
  --fluid-motion-duration-slow: 0s;
  --fluid-motion-duration-slower: 0s;
  --fluid-motion-scale: 0;
}

[data-motion-disabled="true"] *,
[data-motion-disabled="true"] *::before,
[data-motion-disabled="true"] *::after {
  animation-duration: 0s !important;
  animation-delay: 0s !important;
  transition-duration: 0s !important;
  transition-delay: 0s !important;
  scroll-behavior: auto !important;
  transform: none !important;
}

/* Respect user's reduced motion preference */
@media (prefers-reduced-motion: reduce) {
  :root {
    --fluid-motion-enabled: 0;
    --fluid-motion-duration-fast: 0s;
    --fluid-motion-duration-normal: 0s;
    --fluid-motion-duration-slow: 0s;
    --fluid-motion-duration-slower: 0s;
  }
  
  *,
  *::before,
  *::after {
    animation-duration: 0s !important;
    animation-delay: 0s !important;
    transition-duration: 0s !important;
    transition-delay: 0s !important;
    scroll-behavior: auto !important;
  }
}

/* ============================================
   CORE ANIMATION KEYFRAMES
   ============================================ */

@keyframes fluid-motion-fade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes fluid-motion-fade-out {
  from { opacity: 1; }
  to { opacity: 0; }
}

@keyframes fluid-motion-slide-up {
  from {
    opacity: 0;
    transform: translateY(20px); /* Reduced from 30px for subtlety */
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes fluid-motion-slide-down {
  from {
    opacity: 0;
    transform: translateY(-20px); /* Reduced from -30px */
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes fluid-motion-slide-left {
  from {
    opacity: 0;
    transform: translateX(-20px); /* Reduced from -30px */
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

@keyframes fluid-motion-slide-right {
  from {
    opacity: 0;
    transform: translateX(20px); /* Reduced from 30px */
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

@keyframes fluid-motion-scale-in {
  from {
    opacity: 0;
    transform: scale(0.8);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

@keyframes fluid-motion-scale-out {
  from {
    opacity: 1;
    transform: scale(1);
  }
  to {
    opacity: 0;
    transform: scale(0.8);
  }
}

@keyframes fluid-motion-zoom-in {
  from {
    opacity: 0;
    transform: scale(0.5);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

@keyframes fluid-motion-rotate-in {
  from {
    opacity: 0;
    transform: rotate(-180deg) scale(0.5);
  }
  to {
    opacity: 1;
    transform: rotate(0deg) scale(1);
  }
}

@keyframes fluid-motion-bounce-in {
  0% {
    opacity: 0;
    transform: scale(0.3);
  }
  50% {
    transform: scale(1.1);
  }
  70% {
    transform: scale(0.9);
  }
  100% {
    opacity: 1;
    transform: scale(1);
  }
}

@keyframes fluid-motion-shake {
  0%, 100% { transform: translateX(0); }
  10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); }
  20%, 40%, 60%, 80% { transform: translateX(4px); }
}

@keyframes fluid-motion-wobble {
  0%, 100% { transform: rotate(0deg); }
  15% { transform: rotate(-5deg); }
  30% { transform: rotate(3deg); }
  45% { transform: rotate(-3deg); }
  60% { transform: rotate(2deg); }
  75% { transform: rotate(-1deg); }
}

@keyframes fluid-motion-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.7; }
}

@keyframes fluid-motion-heartbeat {
  0%, 100% { transform: scale(1); }
  14% { transform: scale(1.1); }
  28% { transform: scale(1); }
  42% { transform: scale(1.1); }
  70% { transform: scale(1); }
}

@keyframes fluid-motion-spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

@keyframes fluid-motion-flip {
  0% { transform: perspective(400px) rotateY(0); }
  40% { transform: perspective(400px) translateZ(150px) rotateY(170deg); }
  50% { transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); }
  80% { transform: perspective(400px) rotateY(360deg) scale(0.95); }
  100% { transform: perspective(400px) scale(1); }
}

/* ============================================
   SCROLL ANIMATION BASE STATES
   ============================================ */

/* Base motion elements */
[data-motion] {
  will-change: transform, opacity;
  backface-visibility: hidden;
  perspective: 1000px;
}

/* Scroll-triggered animation states */
[data-motion="fade-in"] {
  opacity: 0;
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

[data-motion="slide-up"] {
  opacity: 0;
  transform: translateY(20px); /* Reduced for subtlety */
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out),
              transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

[data-motion="slide-left"] {
  opacity: 0;
  transform: translateX(-20px); /* Reduced for subtlety */
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out),
              transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

[data-motion="slide-right"] {
  opacity: 0;
  transform: translateX(20px); /* Reduced for subtlety */
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out),
              transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

[data-motion="scale-in"] {
  opacity: 0;
  transform: scale(0.8);
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out),
              transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-spring);
}

[data-motion="rotate-in"] {
  opacity: 0;
  transform: rotate(-15deg) scale(0.9);
  transition: opacity var(--fluid-motion-duration-slow) var(--fluid-motion-ease-out),
              transform var(--fluid-motion-duration-slow) var(--fluid-motion-ease-spring);
}

/* Active states when elements are visible */
[data-motion="fade-in"].motion-visible {
  opacity: 1;
}

[data-motion="slide-up"].motion-visible,
[data-motion="slide-left"].motion-visible,
[data-motion="slide-right"].motion-visible {
  opacity: 1;
  transform: translate(0, 0);
}

[data-motion="scale-in"].motion-visible {
  opacity: 1;
  transform: scale(1);
}

[data-motion="rotate-in"].motion-visible {
  opacity: 1;
  transform: rotate(0deg) scale(1);
}

/* ============================================
   STAGGER ANIMATIONS
   ============================================ */

/* Stagger container children */
[data-motion-stagger] > * {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out),
              transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

/* Stagger delays when visible */
[data-motion-stagger].motion-visible > *:nth-child(1) { transition-delay: 0.1s; }
[data-motion-stagger].motion-visible > *:nth-child(2) { transition-delay: 0.2s; }
[data-motion-stagger].motion-visible > *:nth-child(3) { transition-delay: 0.3s; }
[data-motion-stagger].motion-visible > *:nth-child(4) { transition-delay: 0.4s; }
[data-motion-stagger].motion-visible > *:nth-child(5) { transition-delay: 0.5s; }
[data-motion-stagger].motion-visible > *:nth-child(6) { transition-delay: 0.6s; }
[data-motion-stagger].motion-visible > *:nth-child(7) { transition-delay: 0.7s; }
[data-motion-stagger].motion-visible > *:nth-child(8) { transition-delay: 0.8s; }
[data-motion-stagger].motion-visible > *:nth-child(9) { transition-delay: 0.9s; }
[data-motion-stagger].motion-visible > *:nth-child(10) { transition-delay: 1.0s; }

[data-motion-stagger].motion-visible > * {
  opacity: 1;
  transform: translateY(0);
}

/* ============================================
   MOTION UTILITY CLASSES
   ============================================ */

/* Fade animations */
.motion-fade-in {
  animation: fluid-motion-fade-in var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-fade-out {
  animation: fluid-motion-fade-out var(--fluid-motion-duration-normal) var(--fluid-motion-ease-in);
}

/* Slide animations */
.motion-slide-up {
  animation: fluid-motion-slide-up var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-slide-down {
  animation: fluid-motion-slide-down var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-slide-left {
  animation: fluid-motion-slide-left var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-slide-right {
  animation: fluid-motion-slide-right var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

/* Scale animations */
.motion-scale-in {
  animation: fluid-motion-scale-in var(--fluid-motion-duration-normal) var(--fluid-motion-ease-spring);
}

.motion-zoom-in {
  animation: fluid-motion-zoom-in var(--fluid-motion-duration-slow) var(--fluid-motion-ease-out);
}

.motion-bounce-in {
  animation: fluid-motion-bounce-in var(--fluid-motion-duration-slower) var(--fluid-motion-ease-bounce);
}

.motion-rotate-in {
  animation: fluid-motion-rotate-in var(--fluid-motion-duration-slow) var(--fluid-motion-ease-out);
}

.motion-flip-in {
  animation: fluid-motion-flip var(--fluid-motion-duration-slower) var(--fluid-motion-ease-out);
}

/* Continuous animations */
.motion-spin {
  animation: fluid-motion-spin 1s var(--fluid-motion-ease-linear) infinite;
}

.motion-pulse {
  animation: fluid-motion-pulse 2s var(--fluid-motion-ease-in-out) infinite;
}

.motion-heartbeat {
  animation: fluid-motion-heartbeat 1.5s var(--fluid-motion-ease-in-out) infinite;
}

.motion-shake {
  animation: fluid-motion-shake 0.5s var(--fluid-motion-ease-in-out);
}

.motion-wobble {
  animation: fluid-motion-wobble 1s var(--fluid-motion-ease-in-out);
}

/* Animation speeds */
.motion-fast {
  animation-duration: var(--fluid-motion-duration-fast) !important;
}

.motion-slow {
  animation-duration: var(--fluid-motion-duration-slow) !important;
}

.motion-slower {
  animation-duration: var(--fluid-motion-duration-slower) !important;
}

/* Animation delays for staggering */
.motion-delay-1 { animation-delay: 0.1s; }
.motion-delay-2 { animation-delay: 0.2s; }
.motion-delay-3 { animation-delay: 0.3s; }
.motion-delay-4 { animation-delay: 0.4s; }
.motion-delay-5 { animation-delay: 0.5s; }
.motion-delay-6 { animation-delay: 0.6s; }
.motion-delay-7 { animation-delay: 0.7s; }
.motion-delay-8 { animation-delay: 0.8s; }

/* ============================================
   HOVER EFFECTS
   ============================================ */

/* Lift effect */
.motion-hover-lift {
  transition: transform var(--fluid-motion-duration-fast) var(--fluid-motion-ease-out),
              box-shadow var(--fluid-motion-duration-fast) var(--fluid-motion-ease-out);
}

.motion-hover-lift:hover {
  transform: translateY(-2px) scale(var(--fluid-motion-scale, 1));
  box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
}

/* Scale effects */
.motion-hover-scale {
  transition: transform var(--fluid-motion-duration-fast) var(--fluid-motion-ease-out);
}

.motion-hover-scale:hover {
  transform: scale(calc(1.05 * var(--fluid-motion-scale, 1)));
}

.motion-hover-scale-sm:hover {
  transform: scale(calc(1.02 * var(--fluid-motion-scale, 1)));
}

.motion-hover-scale-lg:hover {
  transform: scale(calc(1.1 * var(--fluid-motion-scale, 1)));
}

/* Rotate effects */
.motion-hover-rotate {
  transition: transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-hover-rotate:hover {
  transform: rotate(calc(5deg * var(--fluid-motion-scale, 1)));
}

/* Glow effect */
.motion-hover-glow {
  transition: box-shadow var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-hover-glow:hover {
  box-shadow: 0 0 20px rgba(91, 99, 211, calc(0.4 * var(--fluid-motion-scale, 1)));
}

/* Tilt effect */
.motion-hover-tilt {
  transition: transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
  transform-style: preserve-3d;
}

.motion-hover-tilt:hover {
  transform: perspective(1000px) 
             rotateX(calc(10deg * var(--fluid-motion-scale, 1))) 
             rotateY(calc(-10deg * var(--fluid-motion-scale, 1)));
}

/* ============================================
   PAGE TRANSITIONS
   ============================================ */

/* Swup transitions */
.transition-fade {
  opacity: 1;
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-in-out);
}

html.is-animating .transition-fade {
  opacity: 0;
}

.transition-slide {
  transform: translateX(0);
  transition: transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

html.is-animating .transition-slide {
  transform: translateX(100%);
}

.transition-scale {
  transform: scale(1);
  opacity: 1;
  transition: transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-in-out),
              opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-in-out);
}

html.is-animating .transition-scale {
  transform: scale(0.9);
  opacity: 0;
}

/* Barba transitions */
.barba-container {
  position: relative;
  z-index: 1;
}

.barba-container.barba-leave {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  z-index: 2;
}

.barba-container.barba-leave-active {
  transition: transform var(--fluid-motion-duration-slow) var(--fluid-motion-ease-in-out);
  transform: translateX(-100%);
}

.barba-container.barba-enter {
  transform: translateX(100%);
}

.barba-container.barba-enter-active {
  transition: transform var(--fluid-motion-duration-slow) var(--fluid-motion-ease-in-out);
  transform: translateX(0);
}

/* ============================================
   LOADING STATES
   ============================================ */

.motion-loading {
  position: relative;
  overflow: hidden;
}

.motion-loading::after {
  content: '';
  position: absolute;
  top: 0;
  left: -100%;
  width: 100%;
  height: 100%;
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.4),
    transparent
  );
  animation: motion-shimmer calc(1.5s * var(--fluid-motion-scale, 1)) var(--fluid-motion-ease-in-out) infinite;
}

@keyframes motion-shimmer {
  0% { left: -100%; }
  100% { left: 100%; }
}

/* Skeleton loading */
.motion-skeleton {
  background: linear-gradient(
    90deg,
    #f0f0f0 25%,
    #e0e0e0 50%,
    #f0f0f0 75%
  );
  background-size: 200% 100%;
  animation: motion-skeleton calc(1.5s * var(--fluid-motion-scale, 1)) var(--fluid-motion-ease-in-out) infinite;
}

@keyframes motion-skeleton {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* ============================================
   INTERACTIVE ELEMENTS
   ============================================ */

/* Button press effect */
.motion-btn-press {
  transition: transform var(--fluid-motion-duration-fast) var(--fluid-motion-ease-out);
}

.motion-btn-press:active {
  transform: scale(calc(0.95 * var(--fluid-motion-scale, 1)));
}

/* Ripple effect */
.motion-ripple {
  position: relative;
  overflow: hidden;
}

.motion-ripple::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 0;
  height: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.3);
  transform: translate(-50%, -50%);
  transition: width var(--fluid-motion-duration-slow) var(--fluid-motion-ease-out),
              height var(--fluid-motion-duration-slow) var(--fluid-motion-ease-out);
}

.motion-ripple:active::before {
  width: calc(300px * var(--fluid-motion-scale, 1));
  height: calc(300px * var(--fluid-motion-scale, 1));
}

/* ============================================
   NOTIFICATION ANIMATIONS
   ============================================ */

.motion-notification-enter {
  animation: motion-notification-slide-in var(--fluid-motion-duration-normal) var(--fluid-motion-ease-spring);
}

.motion-notification-exit {
  animation: motion-notification-slide-out var(--fluid-motion-duration-normal) var(--fluid-motion-ease-in);
}

@keyframes motion-notification-slide-in {
  from {
    transform: translateX(100%);
    opacity: 0;
  }
  to {
    transform: translateX(0);
    opacity: 1;
  }
}

@keyframes motion-notification-slide-out {
  from {
    transform: translateX(0);
    opacity: 1;
  }
  to {
    transform: translateX(100%);
    opacity: 0;
  }
}

/* ============================================
   MODAL/DRAWER ANIMATIONS
   ============================================ */

.motion-modal-backdrop {
  opacity: 0;
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-modal-backdrop.motion-visible {
  opacity: 1;
}

.motion-modal {
  opacity: 0;
  transform: scale(0.9) translateY(-20px);
  transition: opacity var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out),
              transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-spring);
}

.motion-modal.motion-visible {
  opacity: 1;
  transform: scale(1) translateY(0);
}

.motion-drawer-left {
  transform: translateX(-100%);
  transition: transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-drawer-left.motion-visible {
  transform: translateX(0);
}

.motion-drawer-right {
  transform: translateX(100%);
  transition: transform var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out);
}

.motion-drawer-right.motion-visible {
  transform: translateX(0);
}

/* ============================================
   SCROLL PROGRESS & PARALLAX
   ============================================ */

.motion-scroll-progress {
  position: fixed;
  top: 0;
  left: 0;
  width: 0%;
  height: 3px;
  background: var(--fluid-color-primary, #667eea);
  z-index: 1000;
  transition: width var(--fluid-motion-duration-fast) var(--fluid-motion-ease-out);
}

.motion-parallax {
  will-change: transform;
  transform: translateY(var(--motion-parallax-offset, 0));
}

/* ============================================
   UTILITY CLASSES
   ============================================ */

/* Hide elements initially (for scroll animations) */
.motion-hidden {
  opacity: 0;
  visibility: hidden;
}

.motion-visible {
  opacity: 1;
  visibility: visible;
}

/* Prevent motion on specific elements */
.motion-none {
  animation: none !important;
  transition: none !important;
}

/* Force motion even when globally disabled */
.motion-force {
  animation-duration: var(--fluid-motion-duration-normal) !important;
  transition-duration: var(--fluid-motion-duration-normal) !important;
}

/* ============================================
   RESPONSIVE MOTION
   ============================================ */

/* Reduce motion complexity on smaller screens */
@media (max-width: 768px) {
  :root {
    --fluid-motion-duration-slow: 0.4s;
    --fluid-motion-duration-slower: 0.6s;
  }
  
  .motion-complex {
    animation: fluid-motion-fade-in var(--fluid-motion-duration-normal) var(--fluid-motion-ease-out) !important;
  }
}

/* Disable hover effects on touch devices */
@media (hover: none) and (pointer: coarse) {
  .motion-hover-lift:hover,
  .motion-hover-scale:hover,
  .motion-hover-tilt:hover,
  .motion-hover-rotate:hover {
    transform: none;
    box-shadow: initial;
  }
}

/* ============================================
   DEBUG MODE
   ============================================ */

[data-motion-debug="true"] [data-motion] {
  outline: 2px dashed rgba(91, 99, 211, 0.5) !important;
  background: rgba(91, 99, 211, 0.1) !important;
  position: relative;
}

[data-motion-debug="true"] [data-motion]::before {
  content: attr(data-motion);
  position: absolute;
  top: -20px;
  left: 0;
  font-size: 10px;
  background: rgba(91, 99, 211, 0.8);
  color: white;
  padding: 2px 6px;
  border-radius: 3px;
  z-index: 1000;
  font-family: monospace;
}

/* ============================================
   PRINT STYLES (no motion)
   ============================================ */

@media print {
  *,
  *::before,
  *::after {
    animation: none !important;
    transition: none !important;
    transform: none !important;
    opacity: 1 !important;
    visibility: visible !important;
  }
}

/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jc3MvZmx1aWQtbW90aW9uLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiJmbHVpZC1tb3Rpb24ubWluLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIEZsdWlkIFRoZW1lIE1vdGlvbiBTeXN0ZW0gdjEuMC4wXG4gKiBUb2dnbGVhYmxlIG1vdGlvbiBhbmQgYW5pbWF0aW9uIHN5c3RlbVxuICogXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjUgQUdJTEUgTExDXG4gKiBBdXRob3I6IE5laWwgUy4gV2hpdGVcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIE1hc3RlciBtb3Rpb24gdG9nZ2xlIChvbi9vZmYpXG4gKiAtIE1vdGlvbi5kZXYgaW50ZWdyYXRpb25cbiAqIC0gU3d1cC5qcyBwYWdlIHRyYW5zaXRpb25zXG4gKiAtIEJhcmJhLmpzIGFkdmFuY2VkIHRyYW5zaXRpb25zXG4gKiAtIEFjY2Vzc2liaWxpdHkgZmlyc3QgKHJlc3BlY3RzIHByZWZlcnMtcmVkdWNlZC1tb3Rpb24pXG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXplZFxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBNT1RJT04gQ09OVFJPTCBWQVJJQUJMRVNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbjpyb290IHtcbiAgLyogTW90aW9uIHRpbWluZyAtIHNsb3dlciwgbW9yZSBlbGVnYW50IGRlZmF1bHRzICovXG4gIC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLWZhc3Q6IDAuNHM7XG4gIC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbDogMC44cztcbiAgLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tc2xvdzogMS4ycztcbiAgLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tc2xvd2VyOiAxLjhzO1xuICBcbiAgLyogTW90aW9uIGVhc2luZyBjdXJ2ZXMgKi9cbiAgLS1mbHVpZC1tb3Rpb24tZWFzZS1saW5lYXI6IGxpbmVhcjtcbiAgLS1mbHVpZC1tb3Rpb24tZWFzZS1pbjogY3ViaWMtYmV6aWVyKDAuNCwgMCwgMSwgMSk7XG4gIC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0OiBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgLS1mbHVpZC1tb3Rpb24tZWFzZS1pbi1vdXQ6IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gIC0tZmx1aWQtbW90aW9uLWVhc2Utc3ByaW5nOiBjdWJpYy1iZXppZXIoMC42OCwgLTAuNTUsIDAuMjY1LCAxLjU1KTtcbiAgLS1mbHVpZC1tb3Rpb24tZWFzZS1ib3VuY2U6IGN1YmljLWJlemllcigwLjY4LCAtMC42LCAwLjMyLCAxLjYpO1xuICAtLWZsdWlkLW1vdGlvbi1lYXNlLWVsYXN0aWM6IGN1YmljLWJlemllcigwLjE3NSwgMC44ODUsIDAuMzIsIDEuMjc1KTtcbiAgXG4gIC8qIE1vdGlvbiBzdGF0ZSBjb250cm9sICovXG4gIC0tZmx1aWQtbW90aW9uLWVuYWJsZWQ6IDE7XG4gIC0tZmx1aWQtbW90aW9uLXNjYWxlOiAxO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTU9USU9OIERJU0FCTEVEIFNUQVRFU1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogR2xvYmFsIG1vdGlvbiBkaXNhYmxlICovXG5bZGF0YS1tb3Rpb24tZGlzYWJsZWQ9XCJ0cnVlXCJdIHtcbiAgLS1mbHVpZC1tb3Rpb24tZW5hYmxlZDogMDtcbiAgLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tZmFzdDogMHM7XG4gIC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbDogMHM7XG4gIC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLXNsb3c6IDBzO1xuICAtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1zbG93ZXI6IDBzO1xuICAtLWZsdWlkLW1vdGlvbi1zY2FsZTogMDtcbn1cblxuW2RhdGEtbW90aW9uLWRpc2FibGVkPVwidHJ1ZVwiXSAqLFxuW2RhdGEtbW90aW9uLWRpc2FibGVkPVwidHJ1ZVwiXSAqOjpiZWZvcmUsXG5bZGF0YS1tb3Rpb24tZGlzYWJsZWQ9XCJ0cnVlXCJdICo6OmFmdGVyIHtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwcyAhaW1wb3J0YW50O1xuICBhbmltYXRpb24tZGVsYXk6IDBzICFpbXBvcnRhbnQ7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDBzICFpbXBvcnRhbnQ7XG4gIHRyYW5zaXRpb24tZGVsYXk6IDBzICFpbXBvcnRhbnQ7XG4gIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50O1xuICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLyogUmVzcGVjdCB1c2VyJ3MgcmVkdWNlZCBtb3Rpb24gcHJlZmVyZW5jZSAqL1xuQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHtcbiAgOnJvb3Qge1xuICAgIC0tZmx1aWQtbW90aW9uLWVuYWJsZWQ6IDA7XG4gICAgLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tZmFzdDogMHM7XG4gICAgLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsOiAwcztcbiAgICAtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1zbG93OiAwcztcbiAgICAtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1zbG93ZXI6IDBzO1xuICB9XG4gIFxuICAqLFxuICAqOjpiZWZvcmUsXG4gICo6OmFmdGVyIHtcbiAgICBhbmltYXRpb24tZHVyYXRpb246IDBzICFpbXBvcnRhbnQ7XG4gICAgYW5pbWF0aW9uLWRlbGF5OiAwcyAhaW1wb3J0YW50O1xuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDBzICFpbXBvcnRhbnQ7XG4gICAgdHJhbnNpdGlvbi1kZWxheTogMHMgIWltcG9ydGFudDtcbiAgICBzY3JvbGwtYmVoYXZpb3I6IGF1dG8gIWltcG9ydGFudDtcbiAgfVxufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgQ09SRSBBTklNQVRJT04gS0VZRlJBTUVTXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5Aa2V5ZnJhbWVzIGZsdWlkLW1vdGlvbi1mYWRlLWluIHtcbiAgZnJvbSB7IG9wYWNpdHk6IDA7IH1cbiAgdG8geyBvcGFjaXR5OiAxOyB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLWZhZGUtb3V0IHtcbiAgZnJvbSB7IG9wYWNpdHk6IDE7IH1cbiAgdG8geyBvcGFjaXR5OiAwOyB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLXNsaWRlLXVwIHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjBweCk7IC8qIFJlZHVjZWQgZnJvbSAzMHB4IGZvciBzdWJ0bGV0eSAqL1xuICB9XG4gIHRvIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGZsdWlkLW1vdGlvbi1zbGlkZS1kb3duIHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwcHgpOyAvKiBSZWR1Y2VkIGZyb20gLTMwcHggKi9cbiAgfVxuICB0byB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBmbHVpZC1tb3Rpb24tc2xpZGUtbGVmdCB7XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0yMHB4KTsgLyogUmVkdWNlZCBmcm9tIC0zMHB4ICovXG4gIH1cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLXNsaWRlLXJpZ2h0IHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMjBweCk7IC8qIFJlZHVjZWQgZnJvbSAzMHB4ICovXG4gIH1cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLXNjYWxlLWluIHtcbiAgZnJvbSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOCk7XG4gIH1cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGZsdWlkLW1vdGlvbi1zY2FsZS1vdXQge1xuICBmcm9tIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjgpO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLXpvb20taW4ge1xuICBmcm9tIHtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC41KTtcbiAgfVxuICB0byB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLXJvdGF0ZS1pbiB7XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoLTE4MGRlZykgc2NhbGUoMC41KTtcbiAgfVxuICB0byB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKSBzY2FsZSgxKTtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGZsdWlkLW1vdGlvbi1ib3VuY2UtaW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMyk7XG4gIH1cbiAgNTAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG4gIH1cbiAgNzAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOSk7XG4gIH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLXNoYWtlIHtcbiAgMCUsIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7IH1cbiAgMTAlLCAzMCUsIDUwJSwgNzAlLCA5MCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTRweCk7IH1cbiAgMjAlLCA0MCUsIDYwJSwgODAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDRweCk7IH1cbn1cblxuQGtleWZyYW1lcyBmbHVpZC1tb3Rpb24td29iYmxlIHtcbiAgMCUsIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxuICAxNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZyk7IH1cbiAgMzAlIHsgdHJhbnNmb3JtOiByb3RhdGUoM2RlZyk7IH1cbiAgNDUlIHsgdHJhbnNmb3JtOiByb3RhdGUoLTNkZWcpOyB9XG4gIDYwJSB7IHRyYW5zZm9ybTogcm90YXRlKDJkZWcpOyB9XG4gIDc1JSB7IHRyYW5zZm9ybTogcm90YXRlKC0xZGVnKTsgfVxufVxuXG5Aa2V5ZnJhbWVzIGZsdWlkLW1vdGlvbi1wdWxzZSB7XG4gIDAlLCAxMDAlIHsgb3BhY2l0eTogMTsgfVxuICA1MCUgeyBvcGFjaXR5OiAwLjc7IH1cbn1cblxuQGtleWZyYW1lcyBmbHVpZC1tb3Rpb24taGVhcnRiZWF0IHtcbiAgMCUsIDEwMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9XG4gIDE0JSB7IHRyYW5zZm9ybTogc2NhbGUoMS4xKTsgfVxuICAyOCUgeyB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9XG4gIDQyJSB7IHRyYW5zZm9ybTogc2NhbGUoMS4xKTsgfVxuICA3MCUgeyB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLXNwaW4ge1xuICBmcm9tIHsgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XG59XG5cbkBrZXlmcmFtZXMgZmx1aWQtbW90aW9uLWZsaXAge1xuICAwJSB7IHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZVkoMCk7IH1cbiAgNDAlIHsgdHJhbnNmb3JtOiBwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlWigxNTBweCkgcm90YXRlWSgxNzBkZWcpOyB9XG4gIDUwJSB7IHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZVooMTUwcHgpIHJvdGF0ZVkoMTkwZGVnKSBzY2FsZSgxKTsgfVxuICA4MCUgeyB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGVZKDM2MGRlZykgc2NhbGUoMC45NSk7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogcGVyc3BlY3RpdmUoNDAwcHgpIHNjYWxlKDEpOyB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBTQ1JPTEwgQU5JTUFUSU9OIEJBU0UgU1RBVEVTXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBCYXNlIG1vdGlvbiBlbGVtZW50cyAqL1xuW2RhdGEtbW90aW9uXSB7XG4gIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm0sIG9wYWNpdHk7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgcGVyc3BlY3RpdmU6IDEwMDBweDtcbn1cblxuLyogU2Nyb2xsLXRyaWdnZXJlZCBhbmltYXRpb24gc3RhdGVzICovXG5bZGF0YS1tb3Rpb249XCJmYWRlLWluXCJdIHtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG5bZGF0YS1tb3Rpb249XCJzbGlkZS11cFwiXSB7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMHB4KTsgLyogUmVkdWNlZCBmb3Igc3VidGxldHkgKi9cbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm0gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KTtcbn1cblxuW2RhdGEtbW90aW9uPVwic2xpZGUtbGVmdFwiXSB7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMjBweCk7IC8qIFJlZHVjZWQgZm9yIHN1YnRsZXR5ICovXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KSxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtIHZhcigtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1ub3JtYWwpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCk7XG59XG5cbltkYXRhLW1vdGlvbj1cInNsaWRlLXJpZ2h0XCJdIHtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpOyAvKiBSZWR1Y2VkIGZvciBzdWJ0bGV0eSAqL1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IHZhcigtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1ub3JtYWwpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCksXG4gICAgICAgICAgICAgIHRyYW5zZm9ybSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG5bZGF0YS1tb3Rpb249XCJzY2FsZS1pblwiXSB7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC44KTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm0gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utc3ByaW5nKTtcbn1cblxuW2RhdGEtbW90aW9uPVwicm90YXRlLWluXCJdIHtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiByb3RhdGUoLTE1ZGVnKSBzY2FsZSgwLjkpO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IHZhcigtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1zbG93KSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpLFxuICAgICAgICAgICAgICB0cmFuc2Zvcm0gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLXNsb3cpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLXNwcmluZyk7XG59XG5cbi8qIEFjdGl2ZSBzdGF0ZXMgd2hlbiBlbGVtZW50cyBhcmUgdmlzaWJsZSAqL1xuW2RhdGEtbW90aW9uPVwiZmFkZS1pblwiXS5tb3Rpb24tdmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG59XG5cbltkYXRhLW1vdGlvbj1cInNsaWRlLXVwXCJdLm1vdGlvbi12aXNpYmxlLFxuW2RhdGEtbW90aW9uPVwic2xpZGUtbGVmdFwiXS5tb3Rpb24tdmlzaWJsZSxcbltkYXRhLW1vdGlvbj1cInNsaWRlLXJpZ2h0XCJdLm1vdGlvbi12aXNpYmxlIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7XG59XG5cbltkYXRhLW1vdGlvbj1cInNjYWxlLWluXCJdLm1vdGlvbi12aXNpYmxlIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbn1cblxuW2RhdGEtbW90aW9uPVwicm90YXRlLWluXCJdLm1vdGlvbi12aXNpYmxlIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZykgc2NhbGUoMSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBTVEFHR0VSIEFOSU1BVElPTlNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIFN0YWdnZXIgY29udGFpbmVyIGNoaWxkcmVuICovXG5bZGF0YS1tb3Rpb24tc3RhZ2dlcl0gPiAqIHtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IHZhcigtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1ub3JtYWwpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCksXG4gICAgICAgICAgICAgIHRyYW5zZm9ybSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG4vKiBTdGFnZ2VyIGRlbGF5cyB3aGVuIHZpc2libGUgKi9cbltkYXRhLW1vdGlvbi1zdGFnZ2VyXS5tb3Rpb24tdmlzaWJsZSA+ICo6bnRoLWNoaWxkKDEpIHsgdHJhbnNpdGlvbi1kZWxheTogMC4xczsgfVxuW2RhdGEtbW90aW9uLXN0YWdnZXJdLm1vdGlvbi12aXNpYmxlID4gKjpudGgtY2hpbGQoMikgeyB0cmFuc2l0aW9uLWRlbGF5OiAwLjJzOyB9XG5bZGF0YS1tb3Rpb24tc3RhZ2dlcl0ubW90aW9uLXZpc2libGUgPiAqOm50aC1jaGlsZCgzKSB7IHRyYW5zaXRpb24tZGVsYXk6IDAuM3M7IH1cbltkYXRhLW1vdGlvbi1zdGFnZ2VyXS5tb3Rpb24tdmlzaWJsZSA+ICo6bnRoLWNoaWxkKDQpIHsgdHJhbnNpdGlvbi1kZWxheTogMC40czsgfVxuW2RhdGEtbW90aW9uLXN0YWdnZXJdLm1vdGlvbi12aXNpYmxlID4gKjpudGgtY2hpbGQoNSkgeyB0cmFuc2l0aW9uLWRlbGF5OiAwLjVzOyB9XG5bZGF0YS1tb3Rpb24tc3RhZ2dlcl0ubW90aW9uLXZpc2libGUgPiAqOm50aC1jaGlsZCg2KSB7IHRyYW5zaXRpb24tZGVsYXk6IDAuNnM7IH1cbltkYXRhLW1vdGlvbi1zdGFnZ2VyXS5tb3Rpb24tdmlzaWJsZSA+ICo6bnRoLWNoaWxkKDcpIHsgdHJhbnNpdGlvbi1kZWxheTogMC43czsgfVxuW2RhdGEtbW90aW9uLXN0YWdnZXJdLm1vdGlvbi12aXNpYmxlID4gKjpudGgtY2hpbGQoOCkgeyB0cmFuc2l0aW9uLWRlbGF5OiAwLjhzOyB9XG5bZGF0YS1tb3Rpb24tc3RhZ2dlcl0ubW90aW9uLXZpc2libGUgPiAqOm50aC1jaGlsZCg5KSB7IHRyYW5zaXRpb24tZGVsYXk6IDAuOXM7IH1cbltkYXRhLW1vdGlvbi1zdGFnZ2VyXS5tb3Rpb24tdmlzaWJsZSA+ICo6bnRoLWNoaWxkKDEwKSB7IHRyYW5zaXRpb24tZGVsYXk6IDEuMHM7IH1cblxuW2RhdGEtbW90aW9uLXN0YWdnZXJdLm1vdGlvbi12aXNpYmxlID4gKiB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIE1PVElPTiBVVElMSVRZIENMQVNTRVNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIEZhZGUgYW5pbWF0aW9ucyAqL1xuLm1vdGlvbi1mYWRlLWluIHtcbiAgYW5pbWF0aW9uOiBmbHVpZC1tb3Rpb24tZmFkZS1pbiB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG4ubW90aW9uLWZhZGUtb3V0IHtcbiAgYW5pbWF0aW9uOiBmbHVpZC1tb3Rpb24tZmFkZS1vdXQgdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2UtaW4pO1xufVxuXG4vKiBTbGlkZSBhbmltYXRpb25zICovXG4ubW90aW9uLXNsaWRlLXVwIHtcbiAgYW5pbWF0aW9uOiBmbHVpZC1tb3Rpb24tc2xpZGUtdXAgdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KTtcbn1cblxuLm1vdGlvbi1zbGlkZS1kb3duIHtcbiAgYW5pbWF0aW9uOiBmbHVpZC1tb3Rpb24tc2xpZGUtZG93biB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG4ubW90aW9uLXNsaWRlLWxlZnQge1xuICBhbmltYXRpb246IGZsdWlkLW1vdGlvbi1zbGlkZS1sZWZ0IHZhcigtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1ub3JtYWwpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCk7XG59XG5cbi5tb3Rpb24tc2xpZGUtcmlnaHQge1xuICBhbmltYXRpb246IGZsdWlkLW1vdGlvbi1zbGlkZS1yaWdodCB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG4vKiBTY2FsZSBhbmltYXRpb25zICovXG4ubW90aW9uLXNjYWxlLWluIHtcbiAgYW5pbWF0aW9uOiBmbHVpZC1tb3Rpb24tc2NhbGUtaW4gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utc3ByaW5nKTtcbn1cblxuLm1vdGlvbi16b29tLWluIHtcbiAgYW5pbWF0aW9uOiBmbHVpZC1tb3Rpb24tem9vbS1pbiB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tc2xvdykgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KTtcbn1cblxuLm1vdGlvbi1ib3VuY2UtaW4ge1xuICBhbmltYXRpb246IGZsdWlkLW1vdGlvbi1ib3VuY2UtaW4gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLXNsb3dlcikgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2UtYm91bmNlKTtcbn1cblxuLm1vdGlvbi1yb3RhdGUtaW4ge1xuICBhbmltYXRpb246IGZsdWlkLW1vdGlvbi1yb3RhdGUtaW4gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLXNsb3cpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCk7XG59XG5cbi5tb3Rpb24tZmxpcC1pbiB7XG4gIGFuaW1hdGlvbjogZmx1aWQtbW90aW9uLWZsaXAgdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLXNsb3dlcikgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KTtcbn1cblxuLyogQ29udGludW91cyBhbmltYXRpb25zICovXG4ubW90aW9uLXNwaW4ge1xuICBhbmltYXRpb246IGZsdWlkLW1vdGlvbi1zcGluIDFzIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLWxpbmVhcikgaW5maW5pdGU7XG59XG5cbi5tb3Rpb24tcHVsc2Uge1xuICBhbmltYXRpb246IGZsdWlkLW1vdGlvbi1wdWxzZSAycyB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuXG4ubW90aW9uLWhlYXJ0YmVhdCB7XG4gIGFuaW1hdGlvbjogZmx1aWQtbW90aW9uLWhlYXJ0YmVhdCAxLjVzIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLWluLW91dCkgaW5maW5pdGU7XG59XG5cbi5tb3Rpb24tc2hha2Uge1xuICBhbmltYXRpb246IGZsdWlkLW1vdGlvbi1zaGFrZSAwLjVzIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLWluLW91dCk7XG59XG5cbi5tb3Rpb24td29iYmxlIHtcbiAgYW5pbWF0aW9uOiBmbHVpZC1tb3Rpb24td29iYmxlIDFzIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLWluLW91dCk7XG59XG5cbi8qIEFuaW1hdGlvbiBzcGVlZHMgKi9cbi5tb3Rpb24tZmFzdCB7XG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLWZhc3QpICFpbXBvcnRhbnQ7XG59XG5cbi5tb3Rpb24tc2xvdyB7XG4gIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLXNsb3cpICFpbXBvcnRhbnQ7XG59XG5cbi5tb3Rpb24tc2xvd2VyIHtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tc2xvd2VyKSAhaW1wb3J0YW50O1xufVxuXG4vKiBBbmltYXRpb24gZGVsYXlzIGZvciBzdGFnZ2VyaW5nICovXG4ubW90aW9uLWRlbGF5LTEgeyBhbmltYXRpb24tZGVsYXk6IDAuMXM7IH1cbi5tb3Rpb24tZGVsYXktMiB7IGFuaW1hdGlvbi1kZWxheTogMC4yczsgfVxuLm1vdGlvbi1kZWxheS0zIHsgYW5pbWF0aW9uLWRlbGF5OiAwLjNzOyB9XG4ubW90aW9uLWRlbGF5LTQgeyBhbmltYXRpb24tZGVsYXk6IDAuNHM7IH1cbi5tb3Rpb24tZGVsYXktNSB7IGFuaW1hdGlvbi1kZWxheTogMC41czsgfVxuLm1vdGlvbi1kZWxheS02IHsgYW5pbWF0aW9uLWRlbGF5OiAwLjZzOyB9XG4ubW90aW9uLWRlbGF5LTcgeyBhbmltYXRpb24tZGVsYXk6IDAuN3M7IH1cbi5tb3Rpb24tZGVsYXktOCB7IGFuaW1hdGlvbi1kZWxheTogMC44czsgfVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgSE9WRVIgRUZGRUNUU1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogTGlmdCBlZmZlY3QgKi9cbi5tb3Rpb24taG92ZXItbGlmdCB7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KSxcbiAgICAgICAgICAgICAgYm94LXNoYWRvdyB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tZmFzdCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KTtcbn1cblxuLm1vdGlvbi1ob3Zlci1saWZ0OmhvdmVyIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpIHNjYWxlKHZhcigtLWZsdWlkLW1vdGlvbi1zY2FsZSwgMSkpO1xuICBib3gtc2hhZG93OiAwIDhweCAyNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG5cbi8qIFNjYWxlIGVmZmVjdHMgKi9cbi5tb3Rpb24taG92ZXItc2NhbGUge1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCk7XG59XG5cbi5tb3Rpb24taG92ZXItc2NhbGU6aG92ZXIge1xuICB0cmFuc2Zvcm06IHNjYWxlKGNhbGMoMS4wNSAqIHZhcigtLWZsdWlkLW1vdGlvbi1zY2FsZSwgMSkpKTtcbn1cblxuLm1vdGlvbi1ob3Zlci1zY2FsZS1zbTpob3ZlciB7XG4gIHRyYW5zZm9ybTogc2NhbGUoY2FsYygxLjAyICogdmFyKC0tZmx1aWQtbW90aW9uLXNjYWxlLCAxKSkpO1xufVxuXG4ubW90aW9uLWhvdmVyLXNjYWxlLWxnOmhvdmVyIHtcbiAgdHJhbnNmb3JtOiBzY2FsZShjYWxjKDEuMSAqIHZhcigtLWZsdWlkLW1vdGlvbi1zY2FsZSwgMSkpKTtcbn1cblxuLyogUm90YXRlIGVmZmVjdHMgKi9cbi5tb3Rpb24taG92ZXItcm90YXRlIHtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1ub3JtYWwpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCk7XG59XG5cbi5tb3Rpb24taG92ZXItcm90YXRlOmhvdmVyIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoY2FsYyg1ZGVnICogdmFyKC0tZmx1aWQtbW90aW9uLXNjYWxlLCAxKSkpO1xufVxuXG4vKiBHbG93IGVmZmVjdCAqL1xuLm1vdGlvbi1ob3Zlci1nbG93IHtcbiAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG4ubW90aW9uLWhvdmVyLWdsb3c6aG92ZXIge1xuICBib3gtc2hhZG93OiAwIDAgMjBweCByZ2JhKDkxLCA5OSwgMjExLCBjYWxjKDAuNCAqIHZhcigtLWZsdWlkLW1vdGlvbi1zY2FsZSwgMSkpKTtcbn1cblxuLyogVGlsdCBlZmZlY3QgKi9cbi5tb3Rpb24taG92ZXItdGlsdCB7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xuICB0cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xufVxuXG4ubW90aW9uLWhvdmVyLXRpbHQ6aG92ZXIge1xuICB0cmFuc2Zvcm06IHBlcnNwZWN0aXZlKDEwMDBweCkgXG4gICAgICAgICAgICAgcm90YXRlWChjYWxjKDEwZGVnICogdmFyKC0tZmx1aWQtbW90aW9uLXNjYWxlLCAxKSkpIFxuICAgICAgICAgICAgIHJvdGF0ZVkoY2FsYygtMTBkZWcgKiB2YXIoLS1mbHVpZC1tb3Rpb24tc2NhbGUsIDEpKSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBQQUdFIFRSQU5TSVRJT05TXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBTd3VwIHRyYW5zaXRpb25zICovXG4udHJhbnNpdGlvbi1mYWRlIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1pbi1vdXQpO1xufVxuXG5odG1sLmlzLWFuaW1hdGluZyAudHJhbnNpdGlvbi1mYWRlIHtcbiAgb3BhY2l0eTogMDtcbn1cblxuLnRyYW5zaXRpb24tc2xpZGUge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG5odG1sLmlzLWFuaW1hdGluZyAudHJhbnNpdGlvbi1zbGlkZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcbn1cblxuLnRyYW5zaXRpb24tc2NhbGUge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2UtaW4tb3V0KSxcbiAgICAgICAgICAgICAgb3BhY2l0eSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1pbi1vdXQpO1xufVxuXG5odG1sLmlzLWFuaW1hdGluZyAudHJhbnNpdGlvbi1zY2FsZSB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC45KTtcbiAgb3BhY2l0eTogMDtcbn1cblxuLyogQmFyYmEgdHJhbnNpdGlvbnMgKi9cbi5iYXJiYS1jb250YWluZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG59XG5cbi5iYXJiYS1jb250YWluZXIuYmFyYmEtbGVhdmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIHotaW5kZXg6IDI7XG59XG5cbi5iYXJiYS1jb250YWluZXIuYmFyYmEtbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1zbG93KSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1pbi1vdXQpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xufVxuXG4uYmFyYmEtY29udGFpbmVyLmJhcmJhLWVudGVyIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xufVxuXG4uYmFyYmEtY29udGFpbmVyLmJhcmJhLWVudGVyLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tc2xvdykgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2UtaW4tb3V0KTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgTE9BRElORyBTVEFURVNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi5tb3Rpb24tbG9hZGluZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLm1vdGlvbi1sb2FkaW5nOjphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogLTEwMCU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudChcbiAgICA5MGRlZyxcbiAgICB0cmFuc3BhcmVudCxcbiAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCksXG4gICAgdHJhbnNwYXJlbnRcbiAgKTtcbiAgYW5pbWF0aW9uOiBtb3Rpb24tc2hpbW1lciBjYWxjKDEuNXMgKiB2YXIoLS1mbHVpZC1tb3Rpb24tc2NhbGUsIDEpKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuXG5Aa2V5ZnJhbWVzIG1vdGlvbi1zaGltbWVyIHtcbiAgMCUgeyBsZWZ0OiAtMTAwJTsgfVxuICAxMDAlIHsgbGVmdDogMTAwJTsgfVxufVxuXG4vKiBTa2VsZXRvbiBsb2FkaW5nICovXG4ubW90aW9uLXNrZWxldG9uIHtcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgIDkwZGVnLFxuICAgICNmMGYwZjAgMjUlLFxuICAgICNlMGUwZTAgNTAlLFxuICAgICNmMGYwZjAgNzUlXG4gICk7XG4gIGJhY2tncm91bmQtc2l6ZTogMjAwJSAxMDAlO1xuICBhbmltYXRpb246IG1vdGlvbi1za2VsZXRvbiBjYWxjKDEuNXMgKiB2YXIoLS1mbHVpZC1tb3Rpb24tc2NhbGUsIDEpKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1pbi1vdXQpIGluZmluaXRlO1xufVxuXG5Aa2V5ZnJhbWVzIG1vdGlvbi1za2VsZXRvbiB7XG4gIDAlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMjAwJSAwOyB9XG4gIDEwMCUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjAwJSAwOyB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBJTlRFUkFDVElWRSBFTEVNRU5UU1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyogQnV0dG9uIHByZXNzIGVmZmVjdCAqL1xuLm1vdGlvbi1idG4tcHJlc3Mge1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCk7XG59XG5cbi5tb3Rpb24tYnRuLXByZXNzOmFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogc2NhbGUoY2FsYygwLjk1ICogdmFyKC0tZmx1aWQtbW90aW9uLXNjYWxlLCAxKSkpO1xufVxuXG4vKiBSaXBwbGUgZWZmZWN0ICovXG4ubW90aW9uLXJpcHBsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLm1vdGlvbi1yaXBwbGU6OmJlZm9yZSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgdHJhbnNpdGlvbjogd2lkdGggdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLXNsb3cpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCksXG4gICAgICAgICAgICAgIGhlaWdodCB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tc2xvdykgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KTtcbn1cblxuLm1vdGlvbi1yaXBwbGU6YWN0aXZlOjpiZWZvcmUge1xuICB3aWR0aDogY2FsYygzMDBweCAqIHZhcigtLWZsdWlkLW1vdGlvbi1zY2FsZSwgMSkpO1xuICBoZWlnaHQ6IGNhbGMoMzAwcHggKiB2YXIoLS1mbHVpZC1tb3Rpb24tc2NhbGUsIDEpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIE5PVElGSUNBVElPTiBBTklNQVRJT05TXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4ubW90aW9uLW5vdGlmaWNhdGlvbi1lbnRlciB7XG4gIGFuaW1hdGlvbjogbW90aW9uLW5vdGlmaWNhdGlvbi1zbGlkZS1pbiB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1zcHJpbmcpO1xufVxuXG4ubW90aW9uLW5vdGlmaWNhdGlvbi1leGl0IHtcbiAgYW5pbWF0aW9uOiBtb3Rpb24tbm90aWZpY2F0aW9uLXNsaWRlLW91dCB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1pbik7XG59XG5cbkBrZXlmcmFtZXMgbW90aW9uLW5vdGlmaWNhdGlvbi1zbGlkZS1pbiB7XG4gIGZyb20ge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIG1vdGlvbi1ub3RpZmljYXRpb24tc2xpZGUtb3V0IHtcbiAgZnJvbSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbiAgdG8ge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBNT0RBTC9EUkFXRVIgQU5JTUFUSU9OU1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLm1vdGlvbi1tb2RhbC1iYWNrZHJvcCB7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KTtcbn1cblxuLm1vdGlvbi1tb2RhbC1iYWNrZHJvcC5tb3Rpb24tdmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi5tb3Rpb24tbW9kYWwge1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2Zvcm06IHNjYWxlKDAuOSkgdHJhbnNsYXRlWSgtMjBweCk7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KSxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtIHZhcigtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1ub3JtYWwpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLXNwcmluZyk7XG59XG5cbi5tb3Rpb24tbW9kYWwubW90aW9uLXZpc2libGUge1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZVkoMCk7XG59XG5cbi5tb3Rpb24tZHJhd2VyLWxlZnQge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLW5vcm1hbCkgdmFyKC0tZmx1aWQtbW90aW9uLWVhc2Utb3V0KTtcbn1cblxuLm1vdGlvbi1kcmF3ZXItbGVmdC5tb3Rpb24tdmlzaWJsZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbn1cblxuLm1vdGlvbi1kcmF3ZXItcmlnaHQge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpO1xufVxuXG4ubW90aW9uLWRyYXdlci1yaWdodC5tb3Rpb24tdmlzaWJsZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFNDUk9MTCBQUk9HUkVTUyAmIFBBUkFMTEFYXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4ubW90aW9uLXNjcm9sbC1wcm9ncmVzcyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMCU7XG4gIGhlaWdodDogM3B4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1mbHVpZC1jb2xvci1wcmltYXJ5LCAjNjY3ZWVhKTtcbiAgei1pbmRleDogMTAwMDtcbiAgdHJhbnNpdGlvbjogd2lkdGggdmFyKC0tZmx1aWQtbW90aW9uLWR1cmF0aW9uLWZhc3QpIHZhcigtLWZsdWlkLW1vdGlvbi1lYXNlLW91dCk7XG59XG5cbi5tb3Rpb24tcGFyYWxsYXgge1xuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkodmFyKC0tbW90aW9uLXBhcmFsbGF4LW9mZnNldCwgMCkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgVVRJTElUWSBDTEFTU0VTXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiBIaWRlIGVsZW1lbnRzIGluaXRpYWxseSAoZm9yIHNjcm9sbCBhbmltYXRpb25zKSAqL1xuLm1vdGlvbi1oaWRkZW4ge1xuICBvcGFjaXR5OiAwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi5tb3Rpb24tdmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG5cbi8qIFByZXZlbnQgbW90aW9uIG9uIHNwZWNpZmljIGVsZW1lbnRzICovXG4ubW90aW9uLW5vbmUge1xuICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4vKiBGb3JjZSBtb3Rpb24gZXZlbiB3aGVuIGdsb2JhbGx5IGRpc2FibGVkICovXG4ubW90aW9uLWZvcmNlIHtcbiAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSAhaW1wb3J0YW50O1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSAhaW1wb3J0YW50O1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgUkVTUE9OU0lWRSBNT1RJT05cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qIFJlZHVjZSBtb3Rpb24gY29tcGxleGl0eSBvbiBzbWFsbGVyIHNjcmVlbnMgKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICA6cm9vdCB7XG4gICAgLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tc2xvdzogMC40cztcbiAgICAtLWZsdWlkLW1vdGlvbi1kdXJhdGlvbi1zbG93ZXI6IDAuNnM7XG4gIH1cbiAgXG4gIC5tb3Rpb24tY29tcGxleCB7XG4gICAgYW5pbWF0aW9uOiBmbHVpZC1tb3Rpb24tZmFkZS1pbiB2YXIoLS1mbHVpZC1tb3Rpb24tZHVyYXRpb24tbm9ybWFsKSB2YXIoLS1mbHVpZC1tb3Rpb24tZWFzZS1vdXQpICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLyogRGlzYWJsZSBob3ZlciBlZmZlY3RzIG9uIHRvdWNoIGRldmljZXMgKi9cbkBtZWRpYSAoaG92ZXI6IG5vbmUpIGFuZCAocG9pbnRlcjogY29hcnNlKSB7XG4gIC5tb3Rpb24taG92ZXItbGlmdDpob3ZlcixcbiAgLm1vdGlvbi1ob3Zlci1zY2FsZTpob3ZlcixcbiAgLm1vdGlvbi1ob3Zlci10aWx0OmhvdmVyLFxuICAubW90aW9uLWhvdmVyLXJvdGF0ZTpob3ZlciB7XG4gICAgdHJhbnNmb3JtOiBub25lO1xuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XG4gIH1cbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIERFQlVHIE1PREVcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbltkYXRhLW1vdGlvbi1kZWJ1Zz1cInRydWVcIl0gW2RhdGEtbW90aW9uXSB7XG4gIG91dGxpbmU6IDJweCBkYXNoZWQgcmdiYSg5MSwgOTksIDIxMSwgMC41KSAhaW1wb3J0YW50O1xuICBiYWNrZ3JvdW5kOiByZ2JhKDkxLCA5OSwgMjExLCAwLjEpICFpbXBvcnRhbnQ7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuW2RhdGEtbW90aW9uLWRlYnVnPVwidHJ1ZVwiXSBbZGF0YS1tb3Rpb25dOjpiZWZvcmUge1xuICBjb250ZW50OiBhdHRyKGRhdGEtbW90aW9uKTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC0yMHB4O1xuICBsZWZ0OiAwO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGJhY2tncm91bmQ6IHJnYmEoOTEsIDk5LCAyMTEsIDAuOCk7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgcGFkZGluZzogMnB4IDZweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICB6LWluZGV4OiAxMDAwO1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgUFJJTlQgU1RZTEVTIChubyBtb3Rpb24pXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5AbWVkaWEgcHJpbnQge1xuICAqLFxuICAqOjpiZWZvcmUsXG4gICo6OmFmdGVyIHtcbiAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDtcbiAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7XG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XG4gICAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICAgIHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDtcbiAgfVxufVxuIl19 */