From 40f544fffc194361a87bdaf59711e7a2d1229ade Mon Sep 17 00:00:00 2001 From: Woody Date: Thu, 9 Nov 2023 17:05:59 +0100 Subject: [PATCH 01/67] Reimplemented simplified UI --- wled00/data/index.css | 1 + wled00/data/index.js | 5 +- wled00/data/simple.css | 933 ------------------------ wled00/data/simple.htm | 261 +------ wled00/data/simple.js | 1540 +++------------------------------------- wled00/wled_server.cpp | 9 + 6 files changed, 118 insertions(+), 2631 deletions(-) delete mode 100644 wled00/data/simple.css diff --git a/wled00/data/index.css b/wled00/data/index.css index 7faaeb47e..058dc6c26 100644 --- a/wled00/data/index.css +++ b/wled00/data/index.css @@ -413,6 +413,7 @@ button { position: sticky; bottom: 0; max-width: 300px; + z-index: 2; } #sliders .labels { diff --git a/wled00/data/index.js b/wled00/data/index.js index 10ebfaa41..1efd5332e 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -12,6 +12,7 @@ var currentPreset = -1; var lastUpdate = 0; var segCount = 0, ledCount = 0, lowestUnused = 0, maxSeg = 0, lSeg = 0; var pcMode = false, pcModeA = false, lastw = 0, wW; +var simpleUI = false; var tr = 7; var d = document; var palettesData; @@ -2902,7 +2903,7 @@ function hasIroClass(classList) //required by rangetouch.js function lock(e) { - if (pcMode) return; + if (pcMode || simpleUI) return; var l = e.target.classList; var pl = e.target.parentElement.classList; @@ -2916,7 +2917,7 @@ function lock(e) //required by rangetouch.js function move(e) { - if(!locked || pcMode) return; + if(!locked || pcMode || simpleUI) return; var clientX = unify(e).clientX; var dx = clientX - x0; var s = Math.sign(dx); diff --git a/wled00/data/simple.css b/wled00/data/simple.css deleted file mode 100644 index b685a97f9..000000000 --- a/wled00/data/simple.css +++ /dev/null @@ -1,933 +0,0 @@ -@font-face { - font-family: "WIcons"; - src: url(data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAAnUAAsAAAAAE1AAAAmFAAGZmgAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgXwRCAqcYJZIATYCJANwCzoABCAFgwYHIBs7D8iOwzgm3MXMnzZCktnjcbN+QlJLaJ3ulULplpW6UqWioeS91Jye0jUlJwZr5nTdE3LntdPvAg+ft/fbsLsGlNLuhlmQjKi7NPDEIgwTmP//a6mdl+SHUBhEIdHFxak7s4E/yzhJSjC7BQQLfDwopF/i6aqSElEFDXx8ZVWjy3rym4N6FlZQ4hu+nXsGIDMQF3gAxa14AgArtVMhfkgjfEAbiChwuSIwEUCmudPhiQdT6rvIjLSRZEwDhF9BIsooI53TIRIoIUD8kyNZI7UjAyMrR/aM/DwaOpozah9LGCsY2zN2YOzs2L3xqeNp4zXjq8bXT/hMBLj/53YDAIS+7u668n3H+HRPdZd1u3TzdRZdVMTfIl5HfKgd1b7Svqd9W9uprdP8QTOmeaz5TPORJlDDjHVjG0ANMQYsmRrKlmpyqV7kubIQC2GSIkFS+MneCJ48JJFVChQfuwKMp2yU9pmq1VKUR6ret0Gp0SjVYRRF+Xj7+OiUSk/GIzu1miHZWx+g8Y1RUktPmqIitRTXVNzzCtuFPKcH0zRBG+Y9/CnhBa20v5oHfsEUMgXMPEfO5ZcJx0FIPiVywgjb6MIuV+oZ4v2kk6/znIxDKrguM22y+bW8wUGqi7aL8fQJzwnCj8tIppdI9bYDSVJVCQInipW0HbtclcT7vCyLmXaSVrQSNMybaJJBh2PiXrXbgd6AbqecdDTO9EQEIeW0VPWQcdQ8ltPOEu+76q2IxUToJeWpfjQiHHH5AsADLj1bHgQxXsUoHfKYbg+CxCxC69eHcOvWheJ1l6b0nD7jG+bSA1dCZVxmw8ZJ/IYtxPtbJxlpQ/LGjSq00TmdNIZxrGel+y+rZJro+nUh3PrNIGwK6WrXNMV2xTeRWHSjScktLJfe1rc7spyvk3b6V4k48Sr3Am1Pv/QifhsI2uMvc863OiQQRNoedpPfHnSwcete+aDEE67cKzTgBlQgjpjgTDnJtGnX2qbmXJ6FOBLZ7wsr+JZzYnbjdbkCuEfU0HvlwqbtUgJ7zRXFNJsvSxlwz2WYta4xjri/fsulnnFVPyonpP0RL5oVNKkkfElG4csTDNAsgzC38G7gSKVgSZ7m/cEvKALmxKz//u7h6egHF7MrH4jJp/Zx4q32a8T71xnHVRCGlfFZNttd2FcUaay6e9PkhucyR0oPu1z1z/DB+8wixAFdMU1gnmB4xAw68pwHcWjlFrBnXxLjj63UGgvNGVGAJFzxFw+Womn7MAibVbu6leHRB5sc10fLtbrdr/JqV6Yr+ovwFtRHE7M4zG90qNB6YREoo51kFJabq3NeHVKdef/hsMFFSpt5m8XmJqDDAnR0c418mxmxrQzQuyPnspRwfAYkpthzr7gST1xNSf4WtBMM9DQT19uL+gb47gFLP3cT08F8I4dZxJl41Gsx9WHzLBOHzWjRS9NLCOUBCFQ+uGhB/V7ZzUwKESTmDriJ+UecdD/bFXFMLLsjgiAt4pp7ulpxb2tzE8I8xhyHODBK3SGg6QP12BiP3YMw2rDFtWUDXL+esnv3H9QxqfmbDnbMLjGUFpqqZbnWSg0lhWv9wU35qTHqP9zqUrL7kqKj8YjZzg01pb9+yQ8sXZpYxKGiFJTNsIwwpyR44gEOnV/+ennFdHD/2lQ3uS5y1qzIztXUNPE6odYJ0PqUiWJtgKGKMILY60dxeYynbb+sFKKqNn0Wz2rLtMbBQWPnYtmJa4WqFRob/9mmuycQVv7ifCNvXrlhzgDLDvAGA+8H5xjK948cDet+FaXfS+Lko/Wt+vScqarq6kZTbk4NaKqpObkEEpsac9L1rRNXJgPbrWyDdYje6tBQAztkbYC0wDe4UnNipmnZtInu/ujf6Kf7ve112Huf92Ev/7enB/+nP7pbrPiQJZbi0jCSpoN9UNPTkj7JMwpbWgopAbhtbOWkytAF3K+/qo0SASNW2G2bLfnshpB4a9dmz7/Hx//dc3OXNZ46YRyXUV2dYRsD97qKL79qazu+vSI1vPXT7375bWSGocBofD2eIRzJ0cMC0tenwQ0gfvuSdvd14f1uEooLPE3JJHL6uCd/n5n8d35UOKPn6nhr8kyrV3ad3nz2iTiNL414EnefL/JGLlWZtZWaqoEh4xSjvsGb/6m9raFlsLm4uHkQWlv7T/weZzjHHe7xZiUzpJ5WAWBLDNwRKxwRYnFoXGxcaKxN6DR8BNn2o9Nqmmutvra5TnIjXMBlmIFZ3yPYX3Mt9v5mmHuwYvvxPverL9eSvszXNjUXrkbqcGOVW2bEbDGKi3MLVTWzzWHF54Bu/2rA1qko6l9fFgVbBurfVBWFFlVW1ugxOwcs+8W//FcUZJieLl9WXA8eGL5crB7fhOMyxl8bjQWGjB1bW/ok6Ucqensr7F8H7utsmdqoHmz99rvyeE/Pz7u64mvVXLjyY8v8j5XhZeH3aPX75dpiO5eN/OzwcG7zkflt/sd5e7YcqbOowfRg22R5585at2vXX87W1Y0gQ079497eYT1EkyoEqMYABmHd8QvKGrRG6bJYTDCCZYGEWcm5G1jXM2i54Y9WtiBuklP57YtBZMAWlu2fYzDM7Q+5FmxKS3Oz5jwK6IactbWPowuQgNyHluKlaw9wnbOmtuajo/VSw9FrBSRwMcuUV2ZwFhh6s7hsqriWCsgA2s3nFcri4I7O+asxwxZbtLL03E9bhcR6Yz9mIbF0U96K0xGA7bx9y+l2//73j+H2i0EGd27uAVNI/WhCYuWqIDaYxads0lcVFV+dOlHmBx/qO7c6/uZX0tReUtJQv64y3adAvX6xDezAX/8Wm8Cgh/95O9OxsNCYnsXWQ+7pCz8/NMZ57ZAIGEdTw+ap8V+I3NUVe375wiv+lccqj172X7Yw5gJAUQGYPQ6QyxRfgeC+Qc5WnAMCAHFv6TJtet3pn/83b4YCAIBv35ofpTRyt5PjZEwT8KYAEQK8nFgBcE/yUwn2oqHSBKoEG7KZQLMpjo5uha/PI2yuBWOCTSDZajpqQ68+Za18jgGgYMT8nBhjKcFrKCYF6yKSZRLF5tR5YKhUzzNWM52mBvuPMiL7xPx4UaRgFiJZAVFscZ2HUIhUPcEaH5WWDvvmvdPfl5KaCvO8o1+fFCBb6hvuLz8lMROwfjPN8iar90RCCiRCJr3ugqHf6LqgUYYs5hzvu9tMIOUr/xpvRsNVvdZ/p+mB8n7V2Spo0T+aRhPpNhsNFOqxoE2u0suqTipgx58IJA0AAAA=) format('woff'); -} - -:root { - --c-1: #111; - --c-f: #fff; - --c-2: #222; - --c-3: #333; - --c-4: #444; - --c-5: #555; - --c-6: #666; - --c-8: #888; - --c-b: #bbb; - --c-c: #ccc; - --c-e: #eee; - --c-d: #ddd; - --c-r: #e42; - --c-g: #4e2; - --c-l: #48a; - --t-b: .5; - --c-o: rgba(34, 34, 34, .9); - --c-tb : rgba(34, 34, 34, var(--t-b)); - --c-tba: rgba(102, 102, 102, var(--t-b)); - --c-tbh: rgba(51, 51, 51, var(--t-b)); - /*following are internal*/ - --th: 70px; - --tp: 70px; - --bh: 63px; - --tbp: 14px 8px 10px; - --bbp: 9px 0 7px 0; - --bhd: none; - --bmt: 0; -} - -html { - touch-action: manipulation; -} - -body { - margin: 0; - background-color: var(--c-1); - font-family: Helvetica, Verdana, sans-serif; - font-size: 17px; - color: var(--c-f); - text-align: center; - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; - scrollbar-width: 6px; - scrollbar-color: var(--c-sb) transparent; -} - -html, -body { - height: 100%; - width: 100%; - position: fixed; - overscroll-behavior: none; -} - -#bg { - height: 100vh; - width: 100vw; - position: fixed; - z-index: -10; - background-position: center; - background-repeat: no-repeat; - background-size: cover; - opacity: 0; - transition: opacity 2s; -} - -p { - margin: 10px 0 2px 0; -} -a, p, a:visited { - color: var(--c-d); -} -a, a:visited { - text-decoration: none; -} - -button { - outline: 0; - cursor: pointer; - background-color: transparent; - border: 0; - transition: color .3s, background-color .3s; - font-size: 19px; - color: var(--c-c); - min-width: 40px; - min-height: 40px; -} -button:hover { - background: var(--c-4); -} - -.label { - margin: 0; - padding: 6px 0 0; -} - -#namelabel { - position: fixed; - bottom: calc(var(--bh) + 6px); - right: 4px; - color: var(--c-6); - cursor: pointer; - writing-mode: vertical-rl; -} - -.wrapper { - position: fixed; - top: 0; - left: 0; - right: 0; - background: var(--c-tb); - z-index: 1; -} - -.center { - margin: 0 auto; - width: 320px; -} - -.icons { - font-family: 'WIcons'; - font-style: normal; - font-size: 24px; - line-height: 1; - display: inline-block; - margin: -2px 0 4px 0; - text-shadow: -1px -1px 0 var(--c-3), 1px -1px 0 var(--c-3), -1px 1px 0 var(--c-3), 1px 1px 0 var(--c-3); -} - -.huge { - font-size: 42px; -} - -.infot { - table-layout: fixed; - width: 100%; -} - -.keytd { - text-align: left; - padding-bottom: 8px; -} - -.valtd { - text-align: right; - padding-bottom: 8px; -} - -.valtd i { - font-size: small; -} - -.slider-icon -{ - transform: translate(4px,3px); - color: var(--c-d); -} - -.il { - display: inline-block; - vertical-align: middle; -} - -.tab { - background-color: transparent; - color: var(--c-d); -} - -.tab button { - background-color: transparent; - float: left; - border: 0; - transition: color .3s, background-color .3s; - font-size: 17px; - color: var(--c-c); - min-width: 44px; -} - -.top button { - padding: var(--tbp); - margin: 0; -} - -.tab button:hover { - background-color: var(--c-tbh); - color: var(--c-e); -} - -.tab button.active { - background-color: var(--c-tba) !important; - color: var(--c-f); -} - -.active { - background-color: var(--c-6) !important; - color: var(--c-f); -} - -.container { - width: 100%; - height: calc(100% - var(--tp) - var(--bh)); - margin-top: var(--tp); - overscroll-behavior: none; -} - -.tabcontent { - position: relative; - width: 100%; - box-sizing: border-box; - border: 0; - overflow: auto; - height: 100%; - overscroll-behavior: none; -} - -.smooth { transition: transform calc(var(--f, 1)*.5s) ease-out } - -.tab-label { - margin: 0 0 -5px 0; - padding-bottom: 4px; -} - -.overlay { - position: fixed; - height: 100%; - width: 100%; - top: 0; - left: 0; - background-color: var(--c-3); - font-size: 24px; - display: flex; - align-items: center; - justify-content: center; - z-index: 11; - opacity: .95; - transition: .7s; - pointer-events: none; -} - -#toast { - opacity: 0; - background-color: var(--c-5); - max-width: 90%; - color: var(--c-f); - text-align: center; - border-radius: 5px; - padding: 16px; - position: fixed; - z-index: 5; - left: 50%; - transform: translateX(-50%); - bottom: calc(var(--bh) + 22px); - font-size: 17px; - pointer-events: none; -} - -#toast.show { - opacity: 1; - animation: fadein .5s, fadein .5s 2.5s reverse; -} - -#toast.error { - opacity: 1; - background-color: #b21; - animation: fadein .5s; -} - -.modal { - position: fixed; - left: 0; - bottom: 0; - right: 0; - top: calc(var(--th) - 1px); - background-color: var(--c-o); - transform: translateY(100%); - transition: transform .4s; - padding: 8px; - font-size: 20px; - overflow: auto; -} - -#info, #nodes { - z-index: 3; -} - -#rover { - z-index: 2; -} - -#ndlt { - margin: 12px 0; -} - -#roverstar { - position: fixed; - top: calc(var(--th) + 5px); - left: 1px; - display: none; - cursor: pointer; -} - -#connind { - position: fixed; - bottom: calc(var(--bh) + 5px); - left: 4px; - padding: 5px; - border-radius: 5px; - background-color: #a90; - z-index: -2; -} - -#imgw { - display: inline-block; - margin: 8px; -} - -#kv, #kn { - /*max-width: 490px;*/ - display: inline-block; -} - -#info table, #nodes table { - table-layout: fixed; - width: 100%; -} - -#info td, #nodes td { - padding-bottom: 8px; -} - -#info .btn { - margin: 5px; -} -#info table .btn, #nodes table .btn { - margin: 0; - width: 180px; -} -#info div, #nodes div { - width: 490px; - margin: 0 auto; -} - -#kn td { - padding-bottom: 12px; -} - -#heart { - transition: color .9s; - font-size: 16px; - color: #f00; -} - -img { - max-width: 100%; - max-height: 100%; -} - -.wi { - image-rendering: pixelated; - image-rendering: crisp-edges; - width: 210px; -} - -@keyframes fadein { - from {bottom: 0; opacity: 0;} - to {bottom: calc(var(--bh) + 22px); opacity: 1;} -} - -.sliderwrap { - height: 30px; - width: 250px; - position: relative; - margin: 4px 0; -} -#Colors .sliderwrap { - width: 260px; - margin: 10px 0 0; -} - -.sliderdisplay { - content:''; - position: absolute; - top: 10px; left: 8px; right: 8px; - height: 8px; - background: var(--c-4); - border-radius: 16px; - pointer-events: none; - z-index: -1; -} -#Colors .sliderdisplay { - height: 28px; - top: 0; bottom: 0; - left: 0; right: 0; - /*border: 1px solid var(--c-b);*/ -} -#rwrap .sliderdisplay { background: linear-gradient(90deg, #000 0%, #f00); } -#gwrap .sliderdisplay { background: linear-gradient(90deg, #000 0%, #0f0); } -#bwrap .sliderdisplay { background: linear-gradient(90deg, #000 0%, #00f); } -#wwrap .sliderdisplay { background: linear-gradient(90deg, #000 0%, #fff); } -#kwrap .sliderdisplay { background: linear-gradient(90deg, #ff8f1f 0%, #fff 50%, #cbdbff); } -#wbal .sliderdisplay { background: linear-gradient(90deg, #ff8f1f 0%, #fff 50%, #d4e0ff); } - -.sliderbubble { - width: 24px; - position: relative; - display: inline-block; - border-radius: 10px; - background: var(--c-3); - color: var(--c-f); - padding: 4px 4px 2px; - font-size: 14px; - right: 3px; - transition: visibility .25s ease, opacity .25s ease; - opacity: 0; - visibility: hidden; -} - -output.sliderbubbleshow { - visibility: visible; - opacity: 1; -} - -.hidden { - display: none; -} - -input[type=range] { - -webkit-appearance: none; - width: 100%; - padding: 0; - margin: 0; - background-color: transparent; - cursor: pointer; -} -#Colors input[type=range] { - width: 252px; - margin: 0; -} -input[type=range]::-webkit-slider-runnable-track { - width: 100%; - height: 30px; - cursor: pointer; - background: transparent; -} -input[type=range]::-webkit-slider-thumb { - border: 2px solid #000; - height: 20px; - width: 20px; - border-radius: 50%; - background: var(--c-f); - cursor: pointer; - -webkit-appearance: none; - margin-top: 4px; -} -input[type=range]::-moz-range-track { - width: 100%; - height: 30px; - background-color: var(--c-0); -} -input[type=range]::-moz-range-thumb { - border: 2px solid var(--c-3); - height: 20px; - width: 20px; - border-radius: 50%; - background: var(--c-f); - transform: translateY(5px); -} -#Colors input[type=range]::-webkit-slider-thumb { - border: 2px solid #000; -} -#Colors input[type=range]::-moz-range-thumb { - border: 2px solid var(--c-1); -} - -#Presets .list { - max-height: 215px; - overflow-y: scroll; - overflow-x: hidden; - width: 280px; - margin: 0 0 0 20px; - -ms-overflow-style: none; - scrollbar-width: none; /* Firefox */ -} -/* Hide scrollbar for Chrome, Safari and Opera */ -#Presets .list::-webkit-scrollbar { - display: none; -} - -#Segments .sliderwrap{ - width: 225px; -} - -#picker, #rgbwrap, #kwrap, #vwrap, #wwrap, #wbal { - display: none; -} - -.hd { - display: var(--bhd); -} - -#briwrap { - float: right; - margin-top: var(--bmt); -} - -#picker { - width: 260px; -} - -#picker, #csl, #segcont { - margin: 10px auto 0; -} - -.btn { - margin: 10px auto 0; - width: 280px; - font-size: 19px; - background-color: var(--c-3); - color: var(--c-d); - cursor: pointer; - border: 1px solid var(--c-3); - border-radius: 25px; - transition-duration: .3s; - -webkit-backface-visibility: hidden; - -webkit-transform: translate3d(0,0,0); - overflow: clip; - text-overflow: clip; - min-height: 40px; - line-height: 40px; -} -.btn:hover { - background-color: var(--c-4); - border: 1px solid var(--c-4); -} - -.btn-xs { - width: 42px; - height: 42px; - margin: 4px; - padding: 0; -} - -#fxBtn, #palBtn { - background-color: var(--c-2); - border: 1px solid var(--c-2); -} -#fxBtn:hover, #palBtn:hover { - background-color: var(--c-3); - border: 1px solid var(--c-3); -} - -.btn-icon { - margin-right: 8px; - vertical-align: middle; - display: inline-block; -} - -.qcs { - margin: 2px; - border-radius: 14px; - display: inline-block; - width: 28px; - height: 28px; - line-height: 28px;} -.qcsb { - width: 26px; - height: 26px; - line-height: 26px; - border: 1px solid var(--c-f); -} -option { - background-color: var(--c-3); - color: var(--c-f); -} -input[type=number], input[type=text] { - background: var(--c-3); - color: var(--c-f); - border: 0 solid var(--c-f); - border-radius: 5px; - padding: 8px; - margin: 6px 6px 6px 0; - font-size: 19px; - transition: background-color .2s; - outline: 0; - width: 50px; - -webkit-appearance: textfield; - -moz-appearance: textfield; - appearance: textfield; -} - -::selection { - background: var(--c-b); -} - -input[type=number]:focus, input[type=text]:focus { - background: var(--c-6); -} - -input[type=number]::-webkit-inner-spin-button, -input[type=number]::-webkit-outer-spin-button { - -webkit-appearance: none; -} - -.pid { - position: absolute; - top: 0; - left: 0; - padding: 12px 0 0 12px; - font-size: 16px; - width: 20px; - text-align: center; - color: var(--c-b); -} - -.xxs { - border: 2px solid var(--c-e) !important; - width: 44px; - height: 44px; - margin: 5px; - padding: 0; -} - -.xxs-w { - border-width: 4px !important; - margin: 2px; - width: 50px; - height: 50px; - padding: 0; -} - -.qcs, .xxs { - text-shadow: -1px -1px 0 var(--c-6), 1px -1px 0 var(--c-6), -1px 1px 0 var(--c-6), 1px 1px 0 var(--c-6); -} - -.psts { - color: var(--c-f); - margin: 6px; -} - -.pwr { - color: var(--c-6); - cursor: pointer; -} - -.act { - color: var(--c-f); -} - -.check, .radio { - display: inline-block; - position: relative; - cursor: pointer; - text-align: center; -} - -.schkl { - width: 24px; - top: -2px; -} - -.check input, .radio input { - position: absolute; - opacity: 0; - cursor: pointer; - height: 0; - width: 0; -} - -.checkmark, .radiomark { - position: absolute; - top: 0; - bottom: 0; - left: 0; - background-color: var(--c-3); - border: 1px solid var(--c-2); -} - -.radiomark { - height: 24px; - width: 24px; - border-radius: 50%; -} - -.checkmark { - height: 25px; - width: 25px; - border-radius: 10px; -} - -.check:hover input ~ .checkmark { - background-color: var(--c-4); -} - -.check input:checked ~ .checkmark { - background-color: var(--c-6); -} - -.checkmark:after, .radiomark:after { - content: ""; - position: absolute; - display: none; -} - -.check input:checked ~ .checkmark:after, .radio input:checked ~ .radiomark:after { - display: block; -} - -.check .checkmark:after { - left: 9px; - top: 5px; - width: 5px; - height: 10px; - border: solid var(--c-f); - border-width: 0 3px 3px 0; - -webkit-transform: rotate(45deg); - -ms-transform: rotate(45deg); - transform: rotate(45deg); -} - -.radio .radiomark:after { - width: 12px; - height: 12px; - top: 50%; - left: 50%; - margin: -6px; - border-radius: 50%; - background: var(--c-f); -} - -.h { - font-size: 13px; - color: var(--c-b); -} - -.list { - position: relative; - width: 280px; - transition: background-color .5s; - margin: auto auto 20px; - font-size: 19px; - line-height: 24px; -} - -.lstI { - cursor: pointer; - background-color: var(--c-2); - overflow: hidden; - border-radius: 20px; - display: block; - position: relative; - border: 1px solid var(--c-2); - padding: 8px 10px; - margin: 10px 0; - min-height: 24px; -} - -.selected { /* has to be after .lstI */ - background: var(--c-5); -} - -.lstI:hover { - background: var(--c-4); -} -/* -.lstI:last-child { - border: 0; - border-radius: 0 0 20px 20px; - padding-bottom: 10px; -} -*/ -.lstIcontent { - width: 100%; - vertical-align: middle; - padding: 0 20px 0 5px; - text-align: left; -} - -.lstIname { - white-space: nowrap; - cursor: pointer; -} - -.lstIprev { - width: 100%; - height: 8px; - position: absolute; - bottom: 0; - left: 0; - } - -/* Dropdown Content (Hidden by Default) */ -.dd-content { - display: none; - position: absolute; - width: 284px; - z-index: 1; - height: 260px; - overflow-y: scroll; - overflow-x: hidden; - padding: 0 18px; - margin-top: 10px; - -ms-overflow-style: none; - scrollbar-width: none; /* Firefox */ -} -/* Hide scrollbar for Chrome, Safari and Opera */ -.dd-content::-webkit-scrollbar { - display: none; -} - -.fnd { - position: sticky; - top: 0; - z-index: 1; - width: 280px; - margin: 0 auto; -} - -.search-icon { - position: absolute; - top: 10px; - left: 13px; - pointer-events: none; - width: 24px; - height: 24px; - margin-top: -1px; - z-index: 1; -} - -.clear-icon { - position: absolute; - display: none; - top: 10px; - right: 13px; - cursor: pointer; - margin-top: -1px; - z-index: 1; -} - -input[type=text].fnd { - display: block; - width: 100%; - box-sizing: border-box; - padding: 8px 48px 8px 48px; - margin: 5px auto 0; - text-align: left; - border-radius: 25px; - background-color: var(--c-2); - border: 1px solid var(--c-4); -} - -input[type=text].fnd:focus { - background-color: var(--c-4); -} - -input[type=text].fnd:not(:placeholder-shown), input[type=text].fnd:hover { - background-color: var(--c-3); -} - -.h, .c { - text-align: center; -} - -::-webkit-scrollbar { - width: 6px; -} -::-webkit-scrollbar-track { - background: transparent; -} -::-webkit-scrollbar-thumb { - background: var(--c-sb); - opacity: .2; - border-radius: 5px; -} -::-webkit-scrollbar-thumb:hover { - background: var(--c-sbh); -} - -@media not all and (hover: none) { - .sliderwrap:hover + output.sliderbubble { - visibility: visible; - opacity: 1; - } -} - -@media all and (max-width: 335px) { - .sliderbubble { - display: none; - } -} - -@media all and (max-width: 550px) and (min-width: 374px) { - #info .btn, #nodes .btn { - width: 150px; - } - #info div, #nodes div { - width: 320px; - } -} - -@media all and (max-width: 540px) { - .top button { - width: 16.6%; - padding: 8px 0 4px 0; - } -} - -@media all and (min-width: 541px) and (max-width: 719px) { - .top button { - width: 14.2%; - padding: 8px 0 4px 0; - } -} - -@media all and (max-width: 719px) { - .hd { - display: none !important; - } - #briwrap { - margin-top: 0 !important; - float: none; - } -} diff --git a/wled00/data/simple.htm b/wled00/data/simple.htm index 955bd65d8..eca95ddd8 100644 --- a/wled00/data/simple.htm +++ b/wled00/data/simple.htm @@ -1,263 +1,12 @@ + - - - - - - WLED - - + + -
Loading WLED UI...
- -
- -
-
-
- - -
- - - -
-
-

Global brightness

-
- -
- -
-
- -
-
-
- - -
-
-
-

Quick Load

-
-
- -
-

Solid color

-
-
-
-
-
-
-

-
-
-
-
-
R
-
-
- -
- -
-
- -
- -
-

-
-
- -
- -
-
-
-
-

RGB channels

-
-
- -
-
-

-
-
- -
-
-

-
-
- -
-
-

-
-
-

White channel

-
- -
-
-
-
-

White balance

-
- -
-
-
-
- -
-

Color slots

- -
- -
-
-
- -
-

Presets

-
- - - -
-
-
- -
-

Effect

-
- -
- -
-
- -
-
- -
- -
-
- -
-
-
Solid
-
Default
-
-
- - - -
-
- -
-
-
-
- - - -
-
- -
-
-
-
-
-
-
- -
-
-
- - - - - -
- - + + \ No newline at end of file diff --git a/wled00/data/simple.js b/wled00/data/simple.js index b35d1b624..417626b21 100644 --- a/wled00/data/simple.js +++ b/wled00/data/simple.js @@ -1,1459 +1,119 @@ -//page js +/* +This file creates the simple UI by fetching the default UI and modifying it. +*/ + var loc = false, locip, locproto = "http:"; -var noNewSegs = false; -var isOn = false, isInfo = false, isNodes = false, isRgbw = false, cct = false; -var whites = [0,0,0]; -var selColors; -var powered = [true]; -var selectedFx = 0; -var selectedPal = 0; -var csel = 0; -var currentPreset = -1; -var lastUpdate = 0; -var segCount = 0, ledCount = 0, lowestUnused = 0, maxSeg = 0, lSeg = 0; -var tr = 7; -var d = document; -var palettesData; -var fxdata = []; -var pJson = {}, eJson = {}, lJson = {}; -var pN = "", pI = 0, pNum = 0; -var pmt = 1, pmtLS = 0, pmtLast = 0; -var lastinfo = {}; -var ws, cpick, ranges; -var cfg = { - theme:{base:"dark", bg:{url:""}, alpha:{bg:0.6,tab:0.8}, color:{bg:""}}, - comp :{colors:{picker: true, rgb: false, quick: true, hex: false}, labels:true, pcmbot:false, pid:true, seglen:false} -}; -var hol = [ - [0,11,24,4,"https://aircoookie.github.io/xmas.png"], // christmas - [0,2,17,1,"https://images.alphacoders.com/491/491123.jpg"], // st. Patrick's day - [2022,3,17,2,"https://aircoookie.github.io/easter.png"], - [2023,3,9,2,"https://aircoookie.github.io/easter.png"], - [2024,2,31,2,"https://aircoookie.github.io/easter.png"] -]; - -function handleVisibilityChange() {if (!d.hidden && new Date () - lastUpdate > 3000) requestJson();} -function sCol(na, col) {d.documentElement.style.setProperty(na, col);} -function gId(c) {return d.getElementById(c);} -function gEBCN(c) {return d.getElementsByClassName(c);} -function isEmpty(o) {return Object.keys(o).length === 0;} -function isObj(i) { return (i && typeof i === 'object' && !Array.isArray(i)); } - -function applyCfg() -{ - cTheme(cfg.theme.base === "light"); - var bg = cfg.theme.color.bg; - if (bg) sCol('--c-1', bg); - var ccfg = cfg.comp.colors; - //gId('picker').style.display = "none"; // ccfg.picker ? "block":"none"; - //gId('vwrap').style.display = "none"; // ccfg.picker ? "block":"none"; - //gId('rgbwrap').style.display = ccfg.rgb ? "block":"none"; - gId('qcs-w').style.display = ccfg.quick ? "block":"none"; - var l = cfg.comp.labels; //l = false; - var e = d.querySelectorAll('.tab-label'); - for (var i=0; i { - var a = parseFloat(cfg.theme.alpha.bg); - if (isNaN(a)) a = 0.6; - bg.style.opacity = a; - bg.style.backgroundImage = `url(${img.src})`; - img = null; - }); -} - -function loadSkinCSS(cId) -{ - if (!gId(cId)) // check if element exists - { - var h = document.getElementsByTagName('head')[0]; - var l = document.createElement('link'); - l.id = cId; - l.rel = 'stylesheet'; - l.type = 'text/css'; - l.href = getURL('/skin.css'); - l.media = 'all'; - h.appendChild(l); +} else { + // detect reverse proxy + let paths = window.location.pathname.slice(1, window.location.pathname.endsWith('/') ? -1 : undefined).split("/"); + if (paths.length > 2) { + locproto = window.location.protocol; + loc = true; + locip = window.location.hostname + (window.location.port ? ":" + window.location.port : "") + "/" + paths[0]; } } function getURL(path) { return (loc ? locproto + "//" + locip : "") + path; } -async function onLoad() -{ - let l = window.location; - if (l.protocol == "file:") { - loc = true; - locip = localStorage.getItem('locIp'); - if (!locip) { - locip = prompt("File Mode. Please enter WLED IP!"); - localStorage.setItem('locIp', locip); - } - } else { - // detect reverse proxy and/or HTTPS - let pathn = l.pathname; - let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/"); - if (paths[0]==="sliders") paths.shift(); - //while (paths[0]==="") paths.shift(); - locproto = l.protocol; - locip = l.hostname + (l.port ? ":" + l.port : ""); - if (paths.length > 0 && paths[0]!=="") { - loc = true; - locip += "/" + paths.join('/'); - } else if (locproto==="https:") { - loc = true; - } - } - var sett = localStorage.getItem('wledUiCfg'); - if (sett) cfg = mergeDeep(cfg, JSON.parse(sett)); - makeWS(); +// fetch default UI and modify it +fetch(getURL("/index.htm")) + .then(response => response.text()) + .then(data => { + let parser = new DOMParser(); + let doc = parser.parseFromString(data, 'text/html'); + // patch simple ui + simplifyUI(doc); - applyCfg(); - if (cfg.theme.bg.url=="" || cfg.theme.bg.url === "https://picsum.photos/1920/1080") { - var iUrl = cfg.theme.bg.url; - fetch(getURL("/holidays.json"), { - method: 'get' - }) - .then((res)=>{ - return res.json(); - }) - .then((json)=>{ - if (Array.isArray(json)) hol = json; - //TODO: do some parsing first - }) - .catch((e)=>{ - console.log("holidays.json does not contain array of holidays. Defaults loaded."); - }) - .finally(()=>{ - var today = new Date(); - for (var i=0; i=hs && today { + // create new script element + let newScript = document.createElement('script'); + // copy attributes + for (let i = 0; i < script.attributes.length; i++) { + newScript.setAttribute(script.attributes[i].name, script.attributes[i].value); } - if (iUrl !== "") loadBg(iUrl); + // copy content + newScript.innerHTML = script.innerHTML; + // replace script + script.parentNode.replaceChild(newScript, script); }); - } else - loadBg(cfg.theme.bg.url); - loadSkinCSS('skinCss'); + finalizeSimpleUI(); - var cd = gId('csl').children; - for (var i = 0; i < cd.length; i++) cd[i].style.backgroundColor = "rgb(0, 0, 0)"; - selectSlot(0); - cpick.on("input:end", ()=>{ - setColor(1); - }); - pmtLS = localStorage.getItem('wledPmt'); + }) + .catch(error => console.error('Error:', error)); - // Load initial data - loadPalettes(()=>{ - loadPalettesData(redrawPalPrev); - loadFX(()=>{ - loadFXData(); - loadPresets(()=>{ - requestJson(); - }); +// Transforms the default UI into the simple UI +function simplifyUI(doc) { + function gId(id) { + return doc.getElementById(id); + } + + // Disable PC Mode as it does not exist in simple UI + localStorage.setItem("pcm", "false"); + + // Put effects below palett list + gId("Colors").innerHTML += gId("Effects").innerHTML; + // Hide buttons in top bar + gId("buttonNl").style.display = "none"; + gId("buttonSync").style.display = "none"; + gId("buttonSr").style.display = "none"; + gId("buttonPcm").style.display = "none"; + + // Hide bottom bar + gId("bot").style.display = "none"; + doc.documentElement.style.setProperty('--bh', '0px'); + + // Hide other tabs + gId("Effects").style.display = "none"; + gId("Segments").style.display = "none"; + gId("Presets").style.display = "none"; + + // Chage height of palette list + gId("pallist").style.height = "300px"; + gId("pallist").style.overflow = "scroll"; + + // set brightness to 255 and hide slider + gId("sliderBri").value = 255; + gId("briwrap").style.display = "none"; + + // Hide filter options + gId("filters").style.display = "none"; + + /* var observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + if (mutation.attributeName === "class") { + let element = mutation.target; + if (element.matches("#pallist .lstI.selected")) { + element.style.top = "0px"; + } + } }); }); - - d.addEventListener("visibilitychange", handleVisibilityChange, false); - size(); - gId("cv").style.opacity=0; - var sls = d.querySelectorAll('input[type="range"]'); - for (var sl of sls) { - sl.addEventListener('touchstart', toggleBubble); - sl.addEventListener('touchend', toggleBubble); - } -} - -var timeout; -function showToast(text, error = false) -{ - if (error) gId('connind').style.backgroundColor = "var(--c-r)"; - var x = gId("toast"); - x.innerHTML = text; - x.className = error ? "error":"show"; - clearTimeout(timeout); - x.style.animation = 'none'; - timeout = setTimeout(()=>{ x.classList.remove("show"); }, 2900); - if (error) console.log(text); -} - -function showErrorToast() -{ - if (ws && ws.readyState === WebSocket.OPEN) { - // if we received a timeout force WS reconnect - ws.close(); - ws = null; - if (lastinfo.ws > -1) setTimeout(makeWS,500); - } - showToast('Connection to light failed!', true); -} - -function clearErrorToast() {gId("toast").className = gId("toast").className.replace("error", "");} - -function getRuntimeStr(rt) -{ - var t = parseInt(rt); - var days = Math.floor(t/86400); - var hrs = Math.floor((t - days*86400)/3600); - var mins = Math.floor((t - days*86400 - hrs*3600)/60); - var str = days ? (days + " " + (days == 1 ? "day" : "days") + ", ") : ""; - str += (hrs || days) ? (hrs + " " + (hrs == 1 ? "hour" : "hours")) : ""; - if (!days && hrs) str += ", "; - if (t > 59 && !days) str += mins + " min"; - if (t < 3600 && t > 59) str += ", "; - if (t < 3600) str += (t - mins*60) + " sec"; - return str; -} - -function inforow(key, val, unit = "") -{ - return `${key}${val}${unit}`; -} - -function pName(i) -{ - var n = "Preset " + i; - if (pJson && pJson[i] && pJson[i].n) n = pJson[i].n; - return n; -} - -function isPlaylist(i) -{ - return pJson[i].playlist && pJson[i].playlist.ps; -} - -function papiVal(i) -{ - if (!pJson || !pJson[i]) return ""; - var o = Object.assign({},pJson[i]); - if (o.win) return o.win; - delete o.n; delete o.p; delete o.ql; - return JSON.stringify(o); -} - -function qlName(i) -{ - if (!pJson || !pJson[i] || !pJson[i].ql) return ""; - return pJson[i].ql; -} - -function cpBck() -{ - var copyText = gId("bck"); - - copyText.select(); - copyText.setSelectionRange(0, 999999); - d.execCommand("copy"); - showToast("Copied to clipboard!"); -} - -function loadPresets(callback = null) -{ - //1st boot (because there is a callback) - if (callback && pmt == pmtLS && pmt > 0) { - //we have a copy of the presets in local storage and don't need to fetch another one - pJson = JSON.parse(localStorage.getItem("wledP")); - populatePresets(); - pmtLast = pmt; - callback(); - return; - } - - //afterwards - if (!callback && pmt == pmtLast) return; - - pmtLast = pmt; - - fetch(getURL('/presets.json'), { - method: 'get' - }) - .then(res => { - if (!res.ok) showErrorToast(); - return res.json(); - }) - .then(json => { - clearErrorToast(); - pJson = json; - populatePresets(); - }) - .catch(function (error) { - showToast(error, true); - console.log(error); - }) - .finally(()=>{ - if (callback) setTimeout(callback,99); - }); -} - -function loadPalettes(callback = null) -{ - fetch(getURL('/json/palettes'), { - method: 'get' - }) - .then(res => { - if (!res.ok) showErrorToast(); - return res.json(); - }) - .then(json => { - clearErrorToast(); - lJson = Object.entries(json); - populatePalettes(); - }) - .catch(function (error) { - showToast(error, true); - }) - .finally(()=>{ - if (callback) callback(); - }); -} - -function loadFX(callback = null) -{ - fetch(getURL('/json/effects'), { - method: 'get' - }) - .then(res => { - if (!res.ok) showErrorToast(); - return res.json(); - }) - .then(json => { - clearErrorToast(); - eJson = Object.entries(json); - populateEffects(); - }) - .catch(function (error) { - showToast(error, true); - }) - .finally(()=>{ - if (callback) callback(); - }); -} - -function loadFXData(callback = null) -{ - fetch(getURL('/json/fxdata'), { - method: 'get' - }) - .then(res => { - if (!res.ok) showErrorToast(); - return res.json(); - }) - .then(json => { - clearErrorToast(); - fxdata = json||[]; - // add default value for Solid - fxdata.shift() - fxdata.unshift("@;!;"); - }) - .catch(function (error) { - fxdata = []; - showToast(error, true); - }) - .finally(()=>{ - if (callback) callback(); - updateUI(); - }); -} - -var pQL = []; -function populateQL() -{ - var cn = ""; - if (pQL.length > 0) { - pQL.sort((a,b) => (a[0]>b[0])); - for (var key of (pQL||[])) { - cn += ``; - } - } - gId('pql').innerHTML = cn; -} - -function populatePresets() -{ - if (!pJson) {pJson={};return}; - delete pJson["0"]; - var cn = ""; //`

All presets

`; - var arr = Object.entries(pJson); - arr.sort(cmpP); - pQL = []; - var is = []; - pNum = 0; - for (var key of (arr||[])) - { - if (!isObj(key[1])) continue; - let i = parseInt(key[0]); - var qll = key[1].ql; - if (qll) pQL.push([i, qll, pName(i)]); - is.push(i); - - cn += `
`; - //if (cfg.comp.pid) cn += `
${i}
`; - cn += `${isPlaylist(i)?"":""}${pName(i)}
`; - pNum++; - } - gId('pcont').innerHTML = cn; - updatePA(); - populateQL(); -} - -function parseInfo() { - var li = lastinfo; - var name = li.name; - gId('namelabel').innerHTML = name; -// if (name === "Dinnerbone") d.documentElement.style.transform = "rotate(180deg)"; - if (li.live) name = "(Live) " + name; - if (loc) name = "(L) " + name; - d.title = name; - isRgbw = li.leds.wv; - ledCount = li.leds.count; -// syncTglRecv = li.str; - maxSeg = li.leds.maxseg; - pmt = li.fs.pmt; - cct = li.leds.cct; -} - -function populateInfo(i) -{ - var cn=""; - var heap = i.freeheap/1000; - heap = heap.toFixed(1); - var pwr = i.leds.pwr; - var pwru = "Not calculated"; - if (pwr > 1000) {pwr /= 1000; pwr = pwr.toFixed((pwr > 10) ? 0 : 1); pwru = pwr + " A";} - else if (pwr > 0) {pwr = 50 * Math.round(pwr/50); pwru = pwr + " mA";} - var urows=""; - if (i.u) { - for (const [k, val] of Object.entries(i.u)) { - if (val[1]) - urows += inforow(k,val[0],val[1]); - else - urows += inforow(k,val); - } - } - var vcn = "Kuuhaku"; - if (i.ver.startsWith("0.14.")) vcn = "Hoshi"; - if (i.ver.includes("-bl")) vcn = "Supāku"; - if (i.cn) vcn = i.cn; - - cn += `v${i.ver} "${vcn}"

-${urows} -${inforow("Build",i.vid)} -${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")} -${inforow("Uptime",getRuntimeStr(i.uptime))} -${inforow("Time",i.time)} -${inforow("Free heap",heap," kB")} -${i.psram?inforow("Free PSRAM",(i.psram/1024).toFixed(1)," kB"):""} -${inforow("Estimated current",pwru)} -${inforow("Average FPS",i.leds.fps)} -${inforow("MAC address",i.mac)} -${inforow("Filesystem",i.fs.u + "/" + i.fs.t + " kB (" +Math.round(i.fs.u*100/i.fs.t) + "%)")} -${inforow("Environment",i.arch + " " + i.core + " (" + i.lwip + ")")} -
`; - gId('kv').innerHTML = cn; -} - -function populateSegments(s) -{ - var cn = ""; - segCount = (s.seg||[]).length; - lowestUnused = 0; lSeg = 0; - - if (segCount > 1) { - for (var y = 0; y < segCount && y<4; y++) - { - var inst=s.seg[y]; - let i = parseInt(inst.id); - powered[i] = inst.on; - if (i == lowestUnused) lowestUnused = i+1; - if (i > lSeg) lSeg = i; - - cn += -`
${(inst.n&&inst.n!=='')?inst.n:('Segment '+y)}
-
- -
- -
- -
-
- -
-
`; - } - //if (gId('buttonBri').className !== 'active') tglBri(true); - } else { - //tglBri(false); - } - //gId('buttonBri').style.display = (segCount > 1) ? "block" : "none"; - gId('segcont').innerHTML = cn; - for (var i = 0; i < segCount && i<4; i++) updateTrail(gId(`seg${i}bri`)); -} - -function btype(b) -{ - switch (b) { - case 2: - case 32: return "ESP32"; - case 1: - case 82: return "ESP8266"; - } - return "?"; + var config = { attributes: true, childList: true, subtree: true }; + observer.observe(doc.body, config); */ } -function bname(o) -{ - if (o.name=="WLED") return o.ip; - return o.name; -} - -function populateNodes(i,n) -{ - var cn=""; - var urows=""; - var nnodes = 0; - if (n.nodes) { - n.nodes.sort((a,b) => (a.name).localeCompare(b.name)); - for (var x=0;x${bname(o)}`; - urows += inforow(url,`${btype(o.type)}
${o.vid==0?"N/A":o.vid}`); - nnodes++; - } - } - } - if (i.ndc < 0) cn += `Instance List is disabled.`; - else if (nnodes == 0) cn += `No other instances found.`; - cn += ` - ${urows} - ${inforow("Current instance:",i.name)} -
`; - gId('kn').innerHTML = cn; -} - -function loadNodes() -{ - fetch(getURL('/json/nodes'), { - method: 'get' - }) - .then(res => { - if (!res.ok) showToast('Could not load Node list!', true); - return res.json(); - }) - .then(json => { - clearErrorToast(); - populateNodes(lastinfo, json); - }) - .catch(function (error) { - showToast(error, true); - console.log(error); - }); -} - -function populateEffects() -{ - var effects = eJson; - var html = ""; - - effects.shift(); //remove solid - for (let i = 0; i < effects.length; i++) effects[i] = {id: effects[i][0], name:effects[i][1]}; - effects.sort((a,b) => (a.name).localeCompare(b.name)); - effects.unshift({ - "id": 0, - "name": "Solid@;!;0" - }); - - for (let i = 0; i < effects.length; i++) { - // WLEDSR: add slider and color control to setEffect (used by requestjson) - if (effects[i].name.indexOf("RSVD") < 0) { - var posAt = effects[i].name.indexOf("@"); - var extra = ''; - if (posAt > 0) - extra = effects[i].name.substr(posAt); - else - posAt = 999; - html += generateListItemHtml( - 'fx', - effects[i].id, - effects[i].name.substr(0,posAt), - 'setEffect', - '','', - extra - ); - } - } - gId('fxlist').innerHTML=html; -} - -function populatePalettes() -{ - var palettes = lJson; - palettes.shift(); //remove default - for (let i = 0; i < palettes.length; i++) { - palettes[i] = { - "id": palettes[i][0], - "name": palettes[i][1] - }; - } - palettes.sort((a,b) => (a.name).localeCompare(b.name)); - palettes.unshift({ - "id": 0, - "name": "Default", - }); - var html = ""; - for (let i = 0; i < palettes.length; i++) { - html += generateListItemHtml( - 'palette', - palettes[i].id, - palettes[i].name, - 'setPalette', - `
` - ); - } - gId('pallist').innerHTML=html; -} - -function redrawPalPrev() -{ - let palettes = d.querySelectorAll('#pallist .lstI'); - for (let i = 0; i < palettes.length; i++) { - let id = palettes[i].dataset.id; - let lstPrev = palettes[i].querySelector('.lstIprev'); - if (lstPrev) { - lstPrev.style = genPalPrevCss(id); - } - } -} - -function genPalPrevCss(id) -{ - if (!palettesData) return; - - var paletteData = palettesData[id]; - var previewCss = ""; - - if (!paletteData) return 'display: none'; - - // We need at least two colors for a gradient - if (paletteData.length == 1) { - paletteData[1] = paletteData[0]; - if (Array.isArray(paletteData[1])) { - paletteData[1][0] = 255; - } - } - - var gradient = []; - for (let j = 0; j < paletteData.length; j++) { - const element = paletteData[j]; - let r; - let g; - let b; - let index = false; - if (Array.isArray(element)) { - index = element[0]/255*100; - r = element[1]; - g = element[2]; - b = element[3]; - } else if (element == 'r') { - r = Math.random() * 255; - g = Math.random() * 255; - b = Math.random() * 255; - } else { - if (selColors) { - let e = element[1] - 1; - r = selColors[e][0]; - g = selColors[e][1]; - b = selColors[e][2]; - } - } - if (index === false) { - index = j / paletteData.length * 100; - } - - gradient.push(`rgb(${r},${g},${b}) ${index}%`); - } - - return `background: linear-gradient(to right,${gradient.join()});`; -} - -function generateOptionItemHtml(id, name) -{ - return ``; -} - -function generateListItemHtml(listName, id, name, clickAction, extraHtml = '', extraClass = '', extraPar = '') -{ - return `
-
- - ${name} - -
- ${extraHtml} -
`; -} - -//update the 'sliderdisplay' background div of a slider for a visual indication of slider position -function updateTrail(e) -{ - if (e==null) return; - var max = e.hasAttribute('max') ? e.attributes.max.value : 255; - var perc = e.value * 100 / max; - perc = parseInt(perc); - if (perc < 50) perc += 2; - var val = `linear-gradient(90deg, var(--c-f) ${perc}%, var(--c-4) ${perc}%)`; - e.parentNode.getElementsByClassName('sliderdisplay')[0].style.background = val; - var b = e.parentNode.parentNode.getElementsByTagName('output')[0]; - if (b) b.innerHTML = e.value; -} - -//rangetouch slider function -function toggleBubble(e) -{ - var b = e.target.parentNode.parentNode.getElementsByTagName('output')[0]; - b.classList.toggle('sliderbubbleshow'); -} - -function updatePA() -{ - var ps = gEBCN("pres"); - for (let i = 0; i < ps.length; i++) { - ps[i].classList.remove('selected');; - } - ps = gEBCN("psts"); - for (let i = 0; i < ps.length; i++) { - ps[i].classList.remove('selected');; - } - if (currentPreset > 0) { - var acv = gId(`p${currentPreset}o`); - if (acv) acv.classList.add('selected'); - acv = gId(`p${currentPreset}qlb`); - if (acv) acv.classList.add('selected'); - } -} - -function updateUI() -{ - gId('buttonPower').className = (isOn) ? "active":""; - - var sel = 0; - if (lJson && lJson.length) { - for (var i=0; i b[0]); - // playlists follow presets - var name = (a[1].playlist ? '~' : ' ') + a[1].n; - return name.localeCompare((b[1].playlist ? '~' : ' ') + b[1].n, undefined, {numeric: true}); -} - -function makeWS() { - if (ws) return; - let url = loc ? getURL('/ws').replace("http","ws") : "ws://"+window.location.hostname+"/ws"; - ws = new WebSocket(url); - ws.onmessage = (e)=>{ - var json = JSON.parse(e.data); - if (json.leds) return; //liveview packet - clearTimeout(jsonTimeout); - jsonTimeout = null; - lastUpdate = new Date(); - clearErrorToast(); - gId('connind').style.backgroundColor = "var(--c-l)"; - // json object should contain json.info AND json.state (but may not) - var i = json.info; - if (i) { - lastinfo = i; - parseInfo(); - if (isInfo) populateInfo(i); - } else - i = lastinfo; - var s = json.state ? json.state : json; - readState(s); - }; - ws.onclose = (e)=>{ - gId('connind').style.backgroundColor = "var(--c-r)"; - ws = null; - if (lastinfo.ws > -1) setTimeout(makeWS,500); - } - ws.onopen = (e)=>{ - ws.send("{'v':true}"); - reqsLegal = true; - clearErrorToast(); - } -} - -function readState(s,command=false) -{ - if (!s) return false; - - isOn = s.on; - gId('sliderBri').value= s.bri; - nlA = s.nl.on; - nlDur = s.nl.dur; - nlTar = s.nl.tbri; - nlFade = s.nl.fade; - syncSend = s.udpn.send; - if (s.pl<0) currentPreset = s.ps; - else currentPreset = s.pl; - tr = s.transition/10; - - var selc=0; var ind=0; - populateSegments(s); - for (let i = 0; i < (s.seg||[]).length; i++) - { - if(s.seg[i].sel) {selc = ind; break;} ind++; - } - var i=s.seg[selc]; - if (!i) { - showToast('No Segments!', true); - updateUI(); - return; - } - - selColors = i.col; - var cd = gId('csl').children; - for (let e = cd.length-1; e >= 0; e--) - { - var r,g,b,w; - r = i.col[e][0]; - g = i.col[e][1]; - b = i.col[e][2]; - if (isRgbw) w = i.col[e][3]; - cd[e].style.backgroundColor = "rgb(" + r + "," + g + "," + b + ")"; - if (isRgbw) whites[e] = parseInt(w); - selectSlot(csel); - } - gId('sliderW').value = whites[csel]; - if (i.cct && i.cct>=0) gId("sliderA").value = i.cct; - - gId('sliderSpeed').value = i.sx; - gId('sliderIntensity').value = i.ix; -/* - gId('sliderC1').value = i.f1x ? i.f1x : 0; - gId('sliderC2').value = i.f2x ? i.f2x : 0; - gId('sliderC3').value = i.f3x ? i.f3x : 0; -*/ - if (s.error && s.error != 0) { - var errstr = ""; - switch (s.error) { - case 10: - errstr = "Could not mount filesystem!"; - break; - case 11: - errstr = "Not enough space to save preset!"; - break; - case 12: - errstr = "Preset not found."; - break; - case 13: - errstr = "Missing IR.json."; - break; - case 19: - errstr = "A filesystem error has occured."; - break; - } - showToast('Error ' + s.error + ": " + errstr, true); - } - - selectedPal = i.pal; - selectedFx = i.fx; - updateUI(); +// Called when simple UI is ready +function finalizeSimpleUI() { + // disable horizontal scrolling + simpleUI = true; + // set brightness + setBri(); + // set correct position of selected and sticky palette + Array.from(document.styleSheets[0].cssRules).find(rule => rule.selectorText == "#pallist .lstI.sticky").style.top = "0px"; + Array.from(document.styleSheets[0].cssRules).find(rule => rule.selectorText == "#pallist .lstI.selected").style.top = "42px"; + } - -var jsonTimeout; -var reqsLegal = false; - -function requestJson(command=null) -{ - gId('connind').style.backgroundColor = "var(--c-r)"; - if (command && !reqsLegal) return; //stop post requests from chrome onchange event on page restore - if (!jsonTimeout) jsonTimeout = setTimeout(showErrorToast, 3000); - var req = null; - var useWs = (ws && ws.readyState === WebSocket.OPEN); - var type = command ? 'post':'get'; - if (command) { - if (useWs || !command.ps) command.v = true; // force complete /json/si API response - command.time = Math.floor(Date.now() / 1000); - req = JSON.stringify(command); - if (req.length > 1000) useWs = false; //do not send very long requests over websocket - }; - - if (useWs) { - ws.send(req?req:'{"v":true}'); - return; - } else if (command && command.ps) { //refresh UI if we don't use WS (async loading of presets) - setTimeout(requestJson,200); - } - - fetch(getURL('/json/si'), { - method: type, - headers: { - "Content-type": "application/json; charset=UTF-8" - }, - body: req - }) - .then(res => { - if (!res.ok) showErrorToast(); - return res.json(); - }) - .then(json => { - clearTimeout(jsonTimeout); - jsonTimeout = null; - lastUpdate = new Date(); - clearErrorToast(); - gId('connind').style.backgroundColor = "var(--c-g)"; - if (!json) { showToast('Empty response', true); return; } - if (json.success) return; - if (json.info) { - lastinfo = json.info; - parseInfo(); - if (isInfo) populateInfo(lastinfo); - } - var s = json.state ? json.state : json; - readState(s); - reqsLegal = true; - }) - .catch(function (error) { - showToast(error, true); - console.log(error); - }); -} - -function togglePower() -{ - isOn = !isOn; - var obj = {"on": isOn}; - requestJson(obj); -} - -function toggleInfo() -{ - if (isNodes) toggleNodes(); - isInfo = !isInfo; - if (isInfo) requestJson(); - gId('info').style.transform = (isInfo) ? "translateY(0px)":"translateY(100%)"; - gId('buttonI').className = (isInfo) ? "active":""; -} - -function toggleNodes() -{ - if (isInfo) toggleInfo(); - isNodes = !isNodes; - if (isNodes) loadNodes(); - gId('nodes').style.transform = (isNodes) ? "translateY(0px)":"translateY(100%)"; - gId('buttonNodes').className = (isNodes) ? "active":""; -} -/* -function tglBri(b=null) -{ - if (b===null) b = gId(`briwrap`).style.display === "block"; - gId('briwrap').style.display = !b ? "block":"none"; - gId('buttonBri').className = !b ? "active":""; - size(); -} -*/ -function tglCP() -{ - var p = gId('buttonCP').className === "active"; - gId('buttonCP').className = !p ? "active":""; - gId('picker').style.display = !p ? "block":"none"; - gId('vwrap').style.display = !p ? "block":"none"; - gId('rgbwrap').style.display = !p ? "block":"none"; - var csl = gId('Slots').style.display === "block"; - gId('Slots').style.display = !csl ? "block":"none"; - //var ps = gId(`Presets`).style.display === "block"; - //gId('Presets').style.display = !ps ? "block":"none"; -} - -function tglCs(i) -{ - var pss = gId(`p${i}cstgl`).checked; - gId(`p${i}o1`).style.display = pss? "block" : "none"; - gId(`p${i}o2`).style.display = !pss? "block" : "none"; -} - -function selSeg(s) -{ - var sel = gId(`seg${s}sel`).checked; - var obj = {"seg": {"id": s, "sel": sel}}; - requestJson(obj); -} - -function tglPalDropdown() -{ - var p = gId('palDropdown').style; - p.display = (p.display==='block'?'none':'block'); - gId('fxDropdown').style.display = 'none'; - if (p.display==='block') - gId('palDropdown').scrollIntoView({ - behavior: 'smooth', - block: 'center', - }); -} - -function tglFxDropdown() -{ - var p = gId('fxDropdown').style; - p.display = (p.display==='block'?'none':'block'); - gId('palDropdown').style.display = 'none'; - if (p.display==='block') - gId('fxDropdown').scrollIntoView({ - behavior: 'smooth', - block: 'center', - }); -} - -function setSegPwr(s) -{ - var obj = {"seg": {"id": s, "on": !powered[s]}}; - requestJson(obj); -} - -function setSegBri(s) -{ - var obj = {"seg": {"id": s, "bri": parseInt(gId(`seg${s}bri`).value)}}; - requestJson(obj); -} - -function setEffect(ind = 0) -{ - tglFxDropdown(); - var obj = {"seg": {"fx": parseInt(ind), "fxdef":true}}; // fxdef sets effect parameters to default values, TODO add client setting - requestJson(obj); -} - -function setPalette(paletteId = null) -{ - tglPalDropdown(); - var obj = {"seg": {"pal": paletteId}}; - requestJson(obj); -} - -function setBri() -{ - var obj = {"bri": parseInt(gId('sliderBri').value)}; - requestJson(obj); -} - -function setSpeed() -{ - var obj = {"seg": {"sx": parseInt(gId('sliderSpeed').value)}}; - requestJson(obj); -} - -function setIntensity() -{ - var obj = {"seg": {"ix": parseInt(gId('sliderIntensity').value)}}; - requestJson(obj); -} - -function setLor(i) -{ - var obj = {"lor": i}; - requestJson(obj); -} - -function setPreset(i) -{ - var obj = {"ps": i}; - if (isPlaylist(i)) obj.on = true; - showToast("Loading preset " + pName(i) +" (" + i + ")"); - requestJson(obj); -} - -function selectSlot(b) -{ - csel = b; - var cd = gId('csl').children; - for (let i = 0; i < cd.length; i++) cd[i].classList.remove('xxs-w'); - cd[b].classList.add('xxs-w'); - setPicker(cd[b].style.backgroundColor); - gId('sliderW').value = whites[b]; - redrawPalPrev(); - updatePSliders(); -} - -var lasth = 0; -function pC(col) -{ - if (col == "rnd") { - col = {h: 0, s: 0, v: 100}; - col.s = Math.floor((Math.random() * 50) + 50); - do { - col.h = Math.floor(Math.random() * 360); - } while (Math.abs(col.h - lasth) < 50); - lasth = col.h; - } - setPicker(col); - setColor(0); -} - -function updatePSliders() { - //update RGB sliders - var col = cpick.color.rgb; - gId('sliderR').value = col.r; - gId('sliderG').value = col.g; - gId('sliderB').value = col.b; - - //update hex field - var str = cpick.color.hexString.substring(1); - var w = whites[csel]; - if (w > 0) str += w.toString(16); - - //update value slider - var v = gId('sliderV'); - v.value = cpick.color.value; - //background color as if color had full value - var hsv = {"h":cpick.color.hue,"s":cpick.color.saturation,"v":100}; - var c = iro.Color.hsvToRgb(hsv); - var cs = 'rgb('+c.r+','+c.g+','+c.b+')'; - v.nextElementSibling.style.backgroundImage = `linear-gradient(90deg, #000 0%, ${cs})`; - - //update Kelvin slider - gId('sliderK').value = cpick.color.kelvin; -} - -function setPicker(rgb) { - var c = new iro.Color(rgb); - if (c.value > 0) cpick.color.set(c); - else cpick.color.setChannel('hsv', 'v', 0); -} - -function fromV() -{ - cpick.color.setChannel('hsv', 'v', d.getElementById('sliderV').value); -} - -function fromK() -{ - cpick.color.set({ kelvin: d.getElementById('sliderK').value }); -} - -function fromRgb() -{ - var r = gId('sliderR').value; - var g = gId('sliderG').value; - var b = gId('sliderB').value; - setPicker(`rgb(${r},${g},${b})`); - setColor(0); -} - -// sets color from picker: 0=all, 1=leaving picker/HSV, 2=ignore white channel -function setColor(sr) -{ - var cd = gId('csl').children; // color slots - if (sr == 1 && cd[csel].style.backgroundColor == 'rgb(0, 0, 0)') cpick.color.setChannel('hsv', 'v', 100); - cd[csel].style.backgroundColor = cpick.color.rgbString; - if (sr != 2) whites[csel] = parseInt(gId('sliderW').value); - var col = cpick.color.rgb; - var obj = {"seg": {"col": [[col.r, col.g, col.b, whites[csel]],[],[]]}}; - if (sr==1 || gId(`picker`).style.display !== "block") obj.seg.fx = 0; - if (csel == 1) { - obj = {"seg": {"col": [[],[col.r, col.g, col.b, whites[csel]],[]]}}; - } else if (csel == 2) { - obj = {"seg": {"col": [[],[],[col.r, col.g, col.b, whites[csel]]]}}; - } - requestJson(obj); -} - -function setBalance(b) -{ - var obj = {"seg": {"cct": parseInt(b)}}; - requestJson(obj); -} - -var hc = 0; -setInterval(()=>{if (!isInfo) return; hc+=18; if (hc>300) hc=0; if (hc>200)hc=306; if (hc==144) hc+=36; if (hc==108) hc+=18; -gId('heart').style.color = `hsl(${hc}, 100%, 50%)`;}, 910); - -function openGH() { window.open("https://github.com/Aircoookie/WLED/wiki"); } - -var cnfr = false; -function cnfReset() -{ - if (!cnfr) { - var bt = gId('resetbtn'); - bt.style.color = "#f00"; - bt.innerHTML = "Confirm Reboot"; - cnfr = true; return; - } - window.location.href = "/reset"; -} - -function loadPalettesData(callback = null) -{ - if (palettesData) return; - const lsKey = "wledPalx"; - var palettesDataJson = localStorage.getItem(lsKey); - if (palettesDataJson) { - try { - palettesDataJson = JSON.parse(palettesDataJson); - if (palettesDataJson && palettesDataJson.vid == lastinfo.vid) { - palettesData = palettesDataJson.p; - if (callback) callback(); //redrawPalPrev() - return; - } - } catch (e) {} - } - - palettesData = {}; - getPalettesData(0, ()=>{ - localStorage.setItem(lsKey, JSON.stringify({ - p: palettesData, - vid: lastinfo.vid - })); - if (callback) setTimeout(callback, 99); //redrawPalPrev() - }); -} - -function getPalettesData(page, callback) -{ - fetch(getURL(`/json/palx?page=${page}`), { - method: 'get', - headers: { - "Content-type": "application/json; charset=UTF-8" - } - }) - .then((res)=>{ - if (!res.ok) showErrorToast(); - return res.json(); - }) - .then((json)=>{ - palettesData = Object.assign({}, palettesData, json.p); - if (page < json.m) setTimeout(()=>{ getPalettesData(page + 1, callback); }, 50); - else callback(); - }) - .catch((e)=>{ - showToast(e, true); - }); -} - -function search(f,l=null) -{ - f.nextElementSibling.style.display=(f.value!=='')?'block':'none'; - if (!l) return; - var el = gId(l).querySelectorAll('.lstI'); - for (i = 0; i < el.length; i++) { - var it = el[i]; - var itT = it.querySelector('.lstIname').innerText.toUpperCase(); - it.style.display = itT.indexOf(f.value.toUpperCase())>-1?'':'none'; - } -} - -function clean(c) -{ - c.style.display='none'; - var i=c.previousElementSibling; - i.value=''; - i.focus(); - i.dispatchEvent(new Event('input')); -} - -function unfocusSliders() -{ - gId("sliderBri").blur(); - gId("sliderSpeed").blur(); - gId("sliderIntensity").blur(); -} - -//sliding UI -const _C = d.querySelector('.container'), N = 1; - -let iSlide = 0, x0 = null, scrollS = 0, locked = false, w; - -function unify(e) { return e.changedTouches ? e.changedTouches[0] : e; } - -function hasIroClass(classList) -{ - for (var i = 0; i < classList.length; i++) { - var element = classList[i]; - if (element.startsWith('Iro')) return true; - } - return false; -} -//required by rangetouch.js -function lock(e) -{ - var l = e.target.classList; - var pl = e.target.parentElement.classList; - - if (l.contains('noslide') || hasIroClass(l) || hasIroClass(pl)) return; - - x0 = unify(e).clientX; - scrollS = gEBCN("tabcontent")[iSlide].scrollTop; - - _C.classList.toggle('smooth', !(locked = true)); -} -//required by rangetouch.js -function move(e) -{ - if(!locked) return; - var clientX = unify(e).clientX; - var dx = clientX - x0; - var s = Math.sign(dx); - var f = +(s*dx/w).toFixed(2); - - if((clientX != 0) && - (iSlide > 0 || s < 0) && (iSlide < N - 1 || s > 0) && - f > 0.12 && - gEBCN("tabcontent")[iSlide].scrollTop == scrollS) - { - _C.style.setProperty('--i', iSlide -= s); - f = 1 - f; - updateTablinks(iSlide); - } - _C.style.setProperty('--f', f); - _C.classList.toggle('smooth', !(locked = false)); - x0 = null; -} - -function size() -{ - var h = gId('top').clientHeight; - sCol('--th', h + "px"); - sCol("--tp", h - (gId(`briwrap`).style.display === "block" ? 0 : gId(`briwrap`).clientTop) + "px"); - sCol("--bh", "0px"); -} - -function mergeDeep(target, ...sources) -{ - if (!sources.length) return target; - const source = sources.shift(); - - if (isObj(target) && isObj(source)) { - for (const key in source) { - if (isObj(source[key])) { - if (!target[key]) Object.assign(target, { [key]: {} }); - mergeDeep(target[key], source[key]); - } else { - Object.assign(target, { [key]: source[key] }); - } - } - } - return mergeDeep(target, ...sources); -} - -size(); -window.addEventListener('resize', size, false); - -_C.addEventListener('mousedown', lock, false); -_C.addEventListener('touchstart', lock, false); - -_C.addEventListener('mouseout', move, false); -_C.addEventListener('mouseup', move, false); -_C.addEventListener('touchend', move, false); diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 4dbfa1909..56e112a0c 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -253,6 +253,15 @@ void initServer() size_t len, bool final) {handleUpload(request, filename, index, data, len, final);} ); + server.on("/index.htm", HTTP_GET, [](AsyncWebServerRequest *request){ + if (handleFileRead(request, "/index.htm")) return; + if (handleIfNoneMatchCacheHeader(request)) return; + AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L); + response->addHeader(FPSTR(s_content_enc),"gzip"); + setStaticContentCacheHeaders(response); + request->send(response); + }); + #ifdef WLED_ENABLE_SIMPLE_UI server.on("/simple.htm", HTTP_GET, [](AsyncWebServerRequest *request){ if (handleFileRead(request, "/simple.htm")) return; From 23374e98ae10ed866a48b6fb39b21f6aa9a63736 Mon Sep 17 00:00:00 2001 From: Woody Date: Thu, 9 Nov 2023 18:15:04 +0100 Subject: [PATCH 02/67] Added preset quick load before palette list --- wled00/data/simple.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wled00/data/simple.js b/wled00/data/simple.js index 417626b21..16c0115d0 100644 --- a/wled00/data/simple.js +++ b/wled00/data/simple.js @@ -66,6 +66,9 @@ function simplifyUI(doc) { // Put effects below palett list gId("Colors").innerHTML += gId("Effects").innerHTML; + // Put preset quick load before palette list + gId("Colors").insertBefore(gId("pql"), gId("pall")); + // Hide buttons in top bar gId("buttonNl").style.display = "none"; gId("buttonSync").style.display = "none"; @@ -115,5 +118,4 @@ function finalizeSimpleUI() { // set correct position of selected and sticky palette Array.from(document.styleSheets[0].cssRules).find(rule => rule.selectorText == "#pallist .lstI.sticky").style.top = "0px"; Array.from(document.styleSheets[0].cssRules).find(rule => rule.selectorText == "#pallist .lstI.selected").style.top = "42px"; - } From 40cc30e05469269c2f25ca67135a8f1148b1f588 Mon Sep 17 00:00:00 2001 From: Woody Date: Thu, 9 Nov 2023 18:18:55 +0100 Subject: [PATCH 03/67] Remove unnecessary comment in simple.js --- wled00/data/simple.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/wled00/data/simple.js b/wled00/data/simple.js index 16c0115d0..fd3739ff6 100644 --- a/wled00/data/simple.js +++ b/wled00/data/simple.js @@ -51,7 +51,6 @@ fetch(getURL("/index.htm")) script.parentNode.replaceChild(newScript, script); }); finalizeSimpleUI(); - }) .catch(error => console.error('Error:', error)); @@ -94,19 +93,6 @@ function simplifyUI(doc) { // Hide filter options gId("filters").style.display = "none"; - - /* var observer = new MutationObserver(function (mutations) { - mutations.forEach(function (mutation) { - if (mutation.attributeName === "class") { - let element = mutation.target; - if (element.matches("#pallist .lstI.selected")) { - element.style.top = "0px"; - } - } - }); - }); - var config = { attributes: true, childList: true, subtree: true }; - observer.observe(doc.body, config); */ } // Called when simple UI is ready From 63ad3f9290c190d4e2d5063d1202ab48868cd068 Mon Sep 17 00:00:00 2001 From: Woody Date: Thu, 9 Nov 2023 20:48:15 +0100 Subject: [PATCH 04/67] Show brightness slider --- wled00/data/simple.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/wled00/data/simple.js b/wled00/data/simple.js index fd3739ff6..e52ec747c 100644 --- a/wled00/data/simple.js +++ b/wled00/data/simple.js @@ -87,10 +87,6 @@ function simplifyUI(doc) { gId("pallist").style.height = "300px"; gId("pallist").style.overflow = "scroll"; - // set brightness to 255 and hide slider - gId("sliderBri").value = 255; - gId("briwrap").style.display = "none"; - // Hide filter options gId("filters").style.display = "none"; } @@ -99,8 +95,6 @@ function simplifyUI(doc) { function finalizeSimpleUI() { // disable horizontal scrolling simpleUI = true; - // set brightness - setBri(); // set correct position of selected and sticky palette Array.from(document.styleSheets[0].cssRules).find(rule => rule.selectorText == "#pallist .lstI.sticky").style.top = "0px"; Array.from(document.styleSheets[0].cssRules).find(rule => rule.selectorText == "#pallist .lstI.selected").style.top = "42px"; From d3b7b857a4de39ab04c112373845a2a5e5660ea0 Mon Sep 17 00:00:00 2001 From: Woody Date: Thu, 9 Nov 2023 21:39:45 +0100 Subject: [PATCH 05/67] Fix palette list shadow of selected option Fix padding and margin in pallist element Fix palette list shadow of selected option --- wled00/data/simple.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wled00/data/simple.js b/wled00/data/simple.js index e52ec747c..33959c231 100644 --- a/wled00/data/simple.js +++ b/wled00/data/simple.js @@ -86,6 +86,9 @@ function simplifyUI(doc) { // Chage height of palette list gId("pallist").style.height = "300px"; gId("pallist").style.overflow = "scroll"; + // fix shadow + gId("pallist").style.margin = "0px -16px"; + gId("pallist").style.padding = "0px 16px"; // Hide filter options gId("filters").style.display = "none"; From b852b6f55ca1ca02f41a40af6fb6b45fc581395c Mon Sep 17 00:00:00 2001 From: Woody Date: Mon, 13 Nov 2023 13:36:21 +0100 Subject: [PATCH 06/67] Add simplifiedUI to info object --- wled00/json.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/wled00/json.cpp b/wled00/json.cpp index a91404cb2..43ab92b6d 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -650,6 +650,7 @@ void serializeInfo(JsonObject root) root[F("name")] = serverDescription; root[F("udpport")] = udpPort; + root[F("simplifiedui")] = simplifiedUI; root["live"] = (bool)realtimeMode; root[F("liveseg")] = useMainSegmentOnly ? strip.getMainSegmentId() : -1; // if using main segment only for live From 0c97d7701eaf16bf347d5068e0e5fa8177bcb0a6 Mon Sep 17 00:00:00 2001 From: Woody Date: Mon, 13 Nov 2023 13:45:38 +0100 Subject: [PATCH 07/67] Remove no longer needed code for simplifiedUI --- wled00/wled_server.cpp | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 56e112a0c..86b4fa21c 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -1,9 +1,6 @@ #include "wled.h" #include "html_ui.h" -#ifdef WLED_ENABLE_SIMPLE_UI - #include "html_simple.h" -#endif #include "html_settings.h" #include "html_other.h" #ifdef WLED_ENABLE_PIXART @@ -253,26 +250,6 @@ void initServer() size_t len, bool final) {handleUpload(request, filename, index, data, len, final);} ); - server.on("/index.htm", HTTP_GET, [](AsyncWebServerRequest *request){ - if (handleFileRead(request, "/index.htm")) return; - if (handleIfNoneMatchCacheHeader(request)) return; - AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L); - response->addHeader(FPSTR(s_content_enc),"gzip"); - setStaticContentCacheHeaders(response); - request->send(response); - }); - -#ifdef WLED_ENABLE_SIMPLE_UI - server.on("/simple.htm", HTTP_GET, [](AsyncWebServerRequest *request){ - if (handleFileRead(request, "/simple.htm")) return; - if (handleIfNoneMatchCacheHeader(request)) return; - AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_simple, PAGE_simple_L); - response->addHeader(FPSTR(s_content_enc),"gzip"); - setStaticContentCacheHeaders(response); - request->send(response); - }); -#endif - server.on("/iro.js", HTTP_GET, [](AsyncWebServerRequest *request){ AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", iroJs, iroJs_length); response->addHeader(FPSTR(s_content_enc),"gzip"); @@ -460,13 +437,7 @@ void serveIndex(AsyncWebServerRequest* request) if (handleIfNoneMatchCacheHeader(request)) return; - AsyncWebServerResponse *response; -#ifdef WLED_ENABLE_SIMPLE_UI - if (simplifiedUI) - response = request->beginResponse_P(200, "text/html", PAGE_simple, PAGE_simple_L); - else -#endif - response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L); + AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L); response->addHeader(FPSTR(s_content_enc),"gzip"); setStaticContentCacheHeaders(response); From a3dd6ce891151d94be7dfc5d1f086f55c546b02b Mon Sep 17 00:00:00 2001 From: Woody Date: Tue, 14 Nov 2023 20:28:22 +0100 Subject: [PATCH 08/67] simplifiedUI moved to index.js --- wled00/data/index.css | 8 ++++++++ wled00/data/index.js | 44 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/wled00/data/index.css b/wled00/data/index.css index 058dc6c26..c9bf8b665 100644 --- a/wled00/data/index.css +++ b/wled00/data/index.css @@ -1325,11 +1325,19 @@ TD .checkmark, TD .radiomark { top: calc(var(--sti) + 42px); } +#pallist.simplified .lstI.selected { + top: 42px; +} + #fxlist .lstI.sticky, #pallist .lstI.sticky { top: var(--sti); } +#pallist.simplified .lstI.sticky { + top: 0px; +} + /* list item content */ .lstIcontent { padding: 9px 0 7px; diff --git a/wled00/data/index.js b/wled00/data/index.js index 1efd5332e..62f7d18d6 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -12,7 +12,7 @@ var currentPreset = -1; var lastUpdate = 0; var segCount = 0, ledCount = 0, lowestUnused = 0, maxSeg = 0, lSeg = 0; var pcMode = false, pcModeA = false, lastw = 0, wW; -var simpleUI = false; +var simplifiedUI = false; var tr = 7; var d = document; var palettesData; @@ -626,6 +626,7 @@ function parseInfo(i) { if (i.live) name = "(Live) " + name; if (loc) name = "(L) " + name; d.title = name; + simplifiedUI = i.simplifiedui; ledCount = i.leds.count; //syncTglRecv = i.str; maxSeg = i.leds.maxseg; @@ -1661,6 +1662,7 @@ function requestJson(command=null) parseInfo(i); populatePalettes(i); if (isInfo) populateInfo(i); + if (simplifiedUI) simplifyUI(); } var s = json.state ? json.state : json; readState(s); @@ -2903,7 +2905,7 @@ function hasIroClass(classList) //required by rangetouch.js function lock(e) { - if (pcMode || simpleUI) return; + if (pcMode || simplifiedUI) return; var l = e.target.classList; var pl = e.target.parentElement.classList; @@ -2917,7 +2919,7 @@ function lock(e) //required by rangetouch.js function move(e) { - if(!locked || pcMode || simpleUI) return; + if(!locked || pcMode || simplifiedUI) return; var clientX = unify(e).clientX; var dx = clientX - x0; var s = Math.sign(dx); @@ -3017,6 +3019,42 @@ function tooltip() }); }); }; +function simplifyUI() { + // Disable PC Mode as it does not exist in simple UI + if (pcMode) togglePcMode(true); + + // Put effects below palett list + gId("Colors").innerHTML += gId("Effects").innerHTML; + // Put preset quick load before palette list + gId("Colors").insertBefore(gId("pql"), gId("pall")); + + // Hide buttons in top bar + gId("buttonNl").style.display = "none"; + gId("buttonSync").style.display = "none"; + gId("buttonSr").style.display = "none"; + gId("buttonPcm").style.display = "none"; + + // Hide bottom bar + gId("bot").style.display = "none"; + document.documentElement.style.setProperty('--bh', '0px'); + + // Hide other tabs + gId("Effects").style.display = "none"; + gId("Segments").style.display = "none"; + gId("Presets").style.display = "none"; + + // Chage height of palette list + gId("pallist").style.height = "300px"; + gId("pallist").style.overflow = "scroll"; + // fix shadow + gId("pallist").style.margin = "0px -16px"; + gId("pallist").style.padding = "0px 16px"; + // set correct position of selected and sticky palette + gId("pallist").classList.add("simplified"); + + // Hide filter options + gId("filters").style.display = "none"; +} size(); _C.style.setProperty('--n', N); From 3ee3b9725584f963d72b60364080d44a0fd17d36 Mon Sep 17 00:00:00 2001 From: Woody Date: Tue, 14 Nov 2023 21:04:18 +0100 Subject: [PATCH 09/67] Remove old simplifiedUI code and update cdata.js --- tools/cdata.js | 28 +- wled00/data/simple.htm | 12 - wled00/data/simple.js | 104 ---- wled00/html_simple.h | 1141 ---------------------------------------- 4 files changed, 1 insertion(+), 1284 deletions(-) delete mode 100644 wled00/data/simple.htm delete mode 100644 wled00/data/simple.js delete mode 100644 wled00/html_simple.h diff --git a/tools/cdata.js b/tools/cdata.js index 90619ba67..09816f959 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -219,36 +219,10 @@ function writeChunks(srcDir, specs, resultFile) { } writeHtmlGzipped("wled00/data/index.htm", "wled00/html_ui.h", 'index'); -writeHtmlGzipped("wled00/data/simple.htm", "wled00/html_simple.h", 'simple'); writeHtmlGzipped("wled00/data/pixart/pixart.htm", "wled00/html_pixart.h", 'pixart'); writeHtmlGzipped("wled00/data/cpal/cpal.htm", "wled00/html_cpal.h", 'cpal'); writeHtmlGzipped("wled00/data/pxmagic/pxmagic.htm", "wled00/html_pxmagic.h", 'pxmagic'); -/* -writeChunks( - "wled00/data", - [ - { - file: "simple.css", - name: "PAGE_simpleCss", - method: "gzip", - filter: "css-minify", - }, - { - file: "simple.js", - name: "PAGE_simpleJs", - method: "gzip", - filter: "js-minify", - }, - { - file: "simple.htm", - name: "PAGE_simple", - method: "gzip", - filter: "html-minify-ui", - } - ], - "wled00/html_simplex.h" -); -*/ + writeChunks( "wled00/data", [ diff --git a/wled00/data/simple.htm b/wled00/data/simple.htm deleted file mode 100644 index eca95ddd8..000000000 --- a/wled00/data/simple.htm +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/wled00/data/simple.js b/wled00/data/simple.js deleted file mode 100644 index 33959c231..000000000 --- a/wled00/data/simple.js +++ /dev/null @@ -1,104 +0,0 @@ -/* -This file creates the simple UI by fetching the default UI and modifying it. -*/ - -var loc = false, locip, locproto = "http:"; -if (window.location.protocol == "file:") { - loc = true; - locip = localStorage.getItem('locIp'); - if (!locip) { - locip = prompt("File Mode. Please enter WLED IP!"); - localStorage.setItem('locIp', locip); - } -} else { - // detect reverse proxy - let paths = window.location.pathname.slice(1, window.location.pathname.endsWith('/') ? -1 : undefined).split("/"); - if (paths.length > 2) { - locproto = window.location.protocol; - loc = true; - locip = window.location.hostname + (window.location.port ? ":" + window.location.port : "") + "/" + paths[0]; - } -} - -function getURL(path) { - return (loc ? locproto + "//" + locip : "") + path; -} - -// fetch default UI and modify it -fetch(getURL("/index.htm")) - .then(response => response.text()) - .then(data => { - let parser = new DOMParser(); - let doc = parser.parseFromString(data, 'text/html'); - // patch simple ui - simplifyUI(doc); - - // copy page to current page - document.documentElement.innerHTML = doc.documentElement.innerHTML; - - // execute scripts in page - let scripts = document.querySelectorAll('script'); - scripts.forEach(script => { - // create new script element - let newScript = document.createElement('script'); - // copy attributes - for (let i = 0; i < script.attributes.length; i++) { - newScript.setAttribute(script.attributes[i].name, script.attributes[i].value); - } - // copy content - newScript.innerHTML = script.innerHTML; - // replace script - script.parentNode.replaceChild(newScript, script); - }); - finalizeSimpleUI(); - }) - .catch(error => console.error('Error:', error)); - -// Transforms the default UI into the simple UI -function simplifyUI(doc) { - function gId(id) { - return doc.getElementById(id); - } - - // Disable PC Mode as it does not exist in simple UI - localStorage.setItem("pcm", "false"); - - // Put effects below palett list - gId("Colors").innerHTML += gId("Effects").innerHTML; - // Put preset quick load before palette list - gId("Colors").insertBefore(gId("pql"), gId("pall")); - - // Hide buttons in top bar - gId("buttonNl").style.display = "none"; - gId("buttonSync").style.display = "none"; - gId("buttonSr").style.display = "none"; - gId("buttonPcm").style.display = "none"; - - // Hide bottom bar - gId("bot").style.display = "none"; - doc.documentElement.style.setProperty('--bh', '0px'); - - // Hide other tabs - gId("Effects").style.display = "none"; - gId("Segments").style.display = "none"; - gId("Presets").style.display = "none"; - - // Chage height of palette list - gId("pallist").style.height = "300px"; - gId("pallist").style.overflow = "scroll"; - // fix shadow - gId("pallist").style.margin = "0px -16px"; - gId("pallist").style.padding = "0px 16px"; - - // Hide filter options - gId("filters").style.display = "none"; -} - -// Called when simple UI is ready -function finalizeSimpleUI() { - // disable horizontal scrolling - simpleUI = true; - // set correct position of selected and sticky palette - Array.from(document.styleSheets[0].cssRules).find(rule => rule.selectorText == "#pallist .lstI.sticky").style.top = "0px"; - Array.from(document.styleSheets[0].cssRules).find(rule => rule.selectorText == "#pallist .lstI.selected").style.top = "42px"; -} diff --git a/wled00/html_simple.h b/wled00/html_simple.h deleted file mode 100644 index 9a93b7915..000000000 --- a/wled00/html_simple.h +++ /dev/null @@ -1,1141 +0,0 @@ -/* - * Binary array for the Web UI. - * gzip is used for smaller size and improved speeds. - * - * Please see https://kno.wled.ge/advanced/custom-features/#changing-web-ui - * to find out how to easily modify the web UI source! - */ - -// Autogenerated from wled00/data/simple.htm, do not edit!! -const uint16_t PAGE_simple_L = 18059; -const uint8_t PAGE_simple[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcd, 0x7d, 0x69, 0x77, 0xe2, 0xba, - 0xb2, 0xe8, 0xf7, 0xfc, 0x0a, 0xda, 0x7d, 0x4e, 0x1a, 0x1f, 0x1c, 0x30, 0xf3, 0xd4, 0x24, 0x87, - 0x90, 0x90, 0x79, 0x24, 0x73, 0xbf, 0x5e, 0xb7, 0x3d, 0x08, 0x70, 0x62, 0x6c, 0xc7, 0x36, 0x53, - 0x68, 0xee, 0x5a, 0xef, 0xbf, 0xbd, 0x1f, 0xf6, 0xaa, 0x24, 0xdb, 0xd8, 0x06, 0x92, 0xf4, 0xde, - 0xef, 0xac, 0xfb, 0x7a, 0xef, 0x80, 0xd1, 0x50, 0x92, 0x4a, 0xa5, 0x9a, 0x54, 0x92, 0xbf, 0x7f, - 0xd9, 0xbb, 0x68, 0xdd, 0x3c, 0x5e, 0xee, 0x27, 0xfa, 0xee, 0x40, 0xdf, 0x4e, 0x7c, 0xc7, 0xaf, - 0x84, 0x2e, 0x19, 0xbd, 0x06, 0x47, 0x0c, 0x0e, 0x13, 0x88, 0xa4, 0xc2, 0xd7, 0x80, 0xb8, 0x52, - 0xc2, 0x90, 0x06, 0xa4, 0xc1, 0x8d, 0x34, 0x32, 0xb6, 0x4c, 0xdb, 0xe5, 0x12, 0x1b, 0x8a, 0x69, - 0xb8, 0xc4, 0x70, 0x1b, 0xdc, 0x58, 0x53, 0xdd, 0x7e, 0x43, 0x25, 0x23, 0x4d, 0x21, 0x5b, 0xf4, - 0x87, 0xa0, 0x19, 0x9a, 0xab, 0x49, 0xfa, 0x96, 0xa3, 0x48, 0x3a, 0x69, 0x64, 0x85, 0x01, 0x24, - 0x0c, 0x86, 0x03, 0xff, 0x37, 0xe7, 0x03, 0xdd, 0x50, 0xfa, 0x92, 0xed, 0x10, 0x00, 0x32, 0x74, - 0xbb, 0x5b, 0x15, 0x2e, 0xda, 0x98, 0xdb, 0x27, 0x03, 0xb2, 0xa5, 0x98, 0xba, 0x69, 0x73, 0x89, - 0xa0, 0xb9, 0xaf, 0x39, 0xfa, 0x2f, 0x04, 0xc3, 0xcf, 0x99, 0x12, 0x87, 0xf3, 0xaa, 0x4a, 0x96, - 0xa5, 0x93, 0xad, 0x81, 0x29, 0x6b, 0xf0, 0x35, 0x26, 0xf2, 0x16, 0x24, 0x6c, 0x29, 0x92, 0x25, - 0xc9, 0x3a, 0xc1, 0x9a, 0xba, 0x66, 0xbc, 0x24, 0x6c, 0xa2, 0x37, 0x38, 0xa7, 0x0f, 0xc3, 0x51, - 0x86, 0x6e, 0x42, 0x03, 0x38, 0x30, 0xac, 0xbe, 0x4d, 0xba, 0x0d, 0x4e, 0x95, 0x5c, 0xa9, 0xa6, - 0x0d, 0xa4, 0x1e, 0xc9, 0x4c, 0xb6, 0x30, 0xa7, 0x2e, 0x4b, 0x0e, 0x29, 0x15, 0x84, 0x66, 0xb3, - 0xb9, 0xdb, 0x6c, 0xee, 0x37, 0xf7, 0xe1, 0x13, 0xbf, 0x0f, 0x9a, 0xad, 0x03, 0x7c, 0x6a, 0xf7, - 0xe0, 0xe3, 0x48, 0xbf, 0xba, 0x79, 0x51, 0xce, 0x5b, 0x7d, 0xf3, 0x04, 0xd3, 0xf6, 0x6e, 0xf5, - 0xa3, 0xeb, 0xf6, 0x11, 0x3e, 0x5e, 0xb1, 0xd2, 0x3d, 0x5a, 0xf6, 0x30, 0x73, 0x99, 0x79, 0xc4, - 0x94, 0xfd, 0xec, 0xf1, 0xf5, 0x7e, 0xfb, 0xf6, 0xe2, 0x28, 0xfb, 0x0c, 0x49, 0x99, 0xcb, 0xf1, - 0xc5, 0xa4, 0x77, 0x7e, 0x40, 0x9a, 0xb7, 0x67, 0x93, 0xfd, 0xea, 0x41, 0x49, 0xb9, 0x6a, 0x9d, - 0xec, 0xdd, 0x37, 0xfb, 0x56, 0x73, 0xef, 0x29, 0xd7, 0xad, 0x5c, 0x9e, 0x3d, 0xef, 0x76, 0xf2, - 0x57, 0xf7, 0x62, 0xe5, 0xea, 0x24, 0x27, 0x9e, 0x48, 0x4f, 0xad, 0x5c, 0xaf, 0xdb, 0xaa, 0xf6, - 0x5b, 0xc6, 0xab, 0x39, 0x34, 0xcf, 0x7b, 0xcd, 0xeb, 0xde, 0x63, 0xf9, 0xed, 0x6c, 0xd2, 0x9c, - 0x9e, 0xeb, 0xb7, 0xea, 0xd5, 0xa1, 0xfe, 0xa0, 0x35, 0xf5, 0x8b, 0xdc, 0xd9, 0x5e, 0x73, 0xaf, - 0x94, 0xdf, 0xbf, 0x7b, 0x3d, 0x3f, 0x6c, 0x12, 0xb1, 0x49, 0x3b, 0xa2, 0xb7, 0x6f, 0x5e, 0x3a, - 0xc3, 0xab, 0x41, 0xab, 0xc5, 0x6d, 0x6f, 0x24, 0xbe, 0xbb, 0x9a, 0xab, 0x93, 0xed, 0xfb, 0xd3, - 0xfd, 0xbd, 0xef, 0x19, 0xf6, 0x9c, 0xf8, 0xee, 0x28, 0xb6, 0x66, 0xb9, 0xdb, 0x1b, 0xdd, 0xa1, - 0xa1, 0xb8, 0x9a, 0x69, 0x24, 0xba, 0x84, 0xa8, 0xb2, 0xa4, 0xbc, 0x24, 0xf9, 0xd9, 0x7c, 0x24, - 0xd9, 0x09, 0x98, 0x72, 0x53, 0x19, 0x0e, 0x00, 0xf3, 0xe9, 0x1e, 0x71, 0xf7, 0x75, 0x82, 0x8f, - 0xce, 0xee, 0xf4, 0x46, 0xea, 0x9d, 0xc3, 0x1c, 0x24, 0x39, 0xa4, 0x1e, 0x8e, 0xff, 0x21, 0xfe, - 0x14, 0xf4, 0x45, 0x51, 0xc5, 0x26, 0x92, 0x4b, 0xbc, 0xd2, 0x49, 0x8e, 0xb5, 0xc2, 0xf1, 0x75, - 0x3d, 0xed, 0x4e, 0x2d, 0x6f, 0xe2, 0x34, 0x45, 0xc2, 0x16, 0x33, 0xcf, 0xd2, 0x48, 0xf2, 0x0a, - 0x08, 0x7a, 0xda, 0xb1, 0x95, 0x06, 0xa7, 0xd9, 0x66, 0xfa, 0xd9, 0xc1, 0x9f, 0x92, 0xaa, 0xee, - 0x8f, 0x00, 0xc6, 0xa9, 0xe6, 0xc0, 0xec, 0x13, 0x3b, 0xc9, 0xe9, 0x26, 0xb4, 0x27, 0x90, 0xc6, - 0xf6, 0x4c, 0xb1, 0x34, 0xe5, 0xa5, 0x61, 0x90, 0x71, 0x02, 0xcb, 0xb7, 0x90, 0x80, 0x2e, 0x21, - 0x05, 0x0b, 0x7d, 0xb5, 0xe8, 0x03, 0x27, 0xcc, 0x28, 0xa5, 0xd6, 0x72, 0x25, 0x51, 0x18, 0xf7, - 0x09, 0xd1, 0x4f, 0xb5, 0x5e, 0xdf, 0x35, 0x88, 0xe3, 0xd4, 0xbe, 0x64, 0x59, 0x4a, 0xd3, 0xe8, - 0xe9, 0xa4, 0x96, 0x2b, 0x7b, 0x05, 0xf6, 0x34, 0x9b, 0x50, 0x4c, 0xd4, 0x38, 0x45, 0x37, 0x95, - 0x97, 0xb1, 0xe6, 0x10, 0xe8, 0x88, 0x34, 0x35, 0x87, 0x6e, 0xed, 0xc7, 0x4c, 0x31, 0x07, 0x96, - 0x69, 0x40, 0x87, 0x6a, 0xd8, 0xe6, 0x50, 0x4b, 0xdf, 0x63, 0x25, 0xc1, 0xb4, 0xb0, 0x8a, 0x53, - 0x9b, 0xcd, 0xe7, 0x3f, 0xe7, 0xbc, 0x40, 0x7b, 0x96, 0x36, 0x8d, 0x24, 0xa7, 0x19, 0x16, 0xd4, - 0x23, 0x06, 0x74, 0x39, 0xc9, 0x43, 0x9f, 0x61, 0x15, 0xd0, 0x8e, 0x26, 0xb3, 0x7c, 0xa4, 0x1c, - 0x25, 0xff, 0x1a, 0xac, 0x13, 0xa3, 0x47, 0xbc, 0xa2, 0x43, 0x0b, 0xc8, 0x93, 0x5c, 0x76, 0x74, - 0x4d, 0x25, 0xb6, 0x93, 0x84, 0xf2, 0x75, 0x9c, 0x10, 0xf7, 0x63, 0x2c, 0xbb, 0x1f, 0x60, 0xd9, - 0x65, 0x58, 0xb6, 0xb1, 0x31, 0xd7, 0x1c, 0x2a, 0x7d, 0x8a, 0x6c, 0xf7, 0x5d, 0x64, 0xd3, 0xc2, - 0x4e, 0xe3, 0x1a, 0xbf, 0x6e, 0x68, 0x1d, 0x18, 0xca, 0xd0, 0x4a, 0x7e, 0xa3, 0x23, 0xfc, 0xc1, - 0x1a, 0xa4, 0x85, 0xb8, 0x9f, 0xdf, 0x84, 0x19, 0x74, 0x56, 0x27, 0x2e, 0x74, 0x16, 0x4a, 0x1d, - 0xc1, 0xc2, 0xb5, 0x47, 0x92, 0x9e, 0xa4, 0xc3, 0xe2, 0x10, 0x85, 0x90, 0x47, 0xb8, 0x46, 0x63, - 0x31, 0x14, 0x18, 0x89, 0x3a, 0xed, 0xb8, 0x30, 0x9c, 0xcd, 0xcd, 0xa4, 0xa2, 0x13, 0xc9, 0x0e, - 0x6a, 0xb9, 0xbc, 0x60, 0x1a, 0xa7, 0xd0, 0x91, 0x24, 0xcf, 0xcf, 0x85, 0xac, 0x28, 0x22, 0xe6, - 0x00, 0xec, 0x8d, 0x36, 0x20, 0x30, 0x29, 0xc9, 0xa4, 0x4f, 0xbb, 0x40, 0xb2, 0xfd, 0x34, 0x8c, - 0x19, 0xb0, 0xdd, 0xea, 0x6b, 0xba, 0x0a, 0x35, 0xa1, 0x64, 0xf1, 0xf3, 0xe5, 0x75, 0xaf, 0xfc, - 0xc6, 0xf7, 0x8c, 0xb7, 0x2e, 0x60, 0x81, 0xb8, 0x53, 0x58, 0x28, 0x1b, 0xff, 0xee, 0x02, 0xfb, - 0xd9, 0xea, 0x4a, 0x0a, 0x99, 0x79, 0x4f, 0x03, 0x4d, 0x9f, 0xd6, 0xee, 0x8f, 0x80, 0x69, 0x38, - 0x75, 0x40, 0x67, 0x6d, 0x68, 0xeb, 0x49, 0xca, 0x4f, 0x30, 0x3f, 0x33, 0x36, 0xbb, 0xdd, 0x5c, - 0xdd, 0xe7, 0x7b, 0x94, 0xed, 0xf9, 0xbc, 0x45, 0x15, 0xab, 0x07, 0x67, 0xbd, 0x26, 0xe5, 0x2c, - 0xcd, 0xa6, 0x71, 0xdb, 0x6c, 0x3a, 0x6c, 0xb9, 0x66, 0xf1, 0x73, 0xd0, 0x6e, 0x36, 0x0f, 0x9e, - 0x06, 0xbd, 0xe6, 0xda, 0x7f, 0xbb, 0x83, 0x66, 0xb3, 0xf7, 0x30, 0xbe, 0x6e, 0x35, 0x5f, 0x95, - 0xc7, 0xe3, 0xa7, 0xa3, 0xe6, 0xcd, 0x63, 0xeb, 0xb8, 0x79, 0x3e, 0x6e, 0xbd, 0x99, 0xcd, 0xdd, - 0x16, 0xb0, 0xa8, 0xf1, 0xe3, 0xe1, 0xd1, 0xae, 0x53, 0xde, 0xab, 0x68, 0x17, 0xe3, 0xb7, 0xde, - 0x20, 0x7f, 0xf6, 0x70, 0x66, 0xbc, 0x3d, 0xb5, 0x5e, 0x5c, 0xe3, 0x59, 0x91, 0xcf, 0x53, 0x57, - 0xfa, 0xf1, 0xa9, 0x74, 0x9c, 0x1f, 0xea, 0xb7, 0xa7, 0x96, 0x6e, 0xdd, 0x97, 0x6e, 0x5f, 0xef, - 0x35, 0x93, 0x74, 0xaa, 0xd9, 0xe3, 0x29, 0x11, 0x9f, 0x6f, 0xf5, 0xe3, 0xf1, 0x93, 0x5d, 0x34, - 0x6e, 0xd4, 0xfd, 0xfc, 0xa9, 0xe1, 0xaa, 0x97, 0xa3, 0x66, 0x2f, 0xd5, 0x75, 0x33, 0x5d, 0xd9, - 0x39, 0x75, 0x0e, 0xf4, 0xf3, 0xd3, 0x61, 0x5f, 0x1f, 0x5c, 0x3d, 0x9f, 0x68, 0xe5, 0xf3, 0xcb, - 0xbd, 0xfd, 0xa3, 0xde, 0xf8, 0x66, 0x00, 0x3c, 0x4d, 0x2a, 0x0d, 0x54, 0x3d, 0xd5, 0x39, 0xbc, - 0xdd, 0xed, 0xef, 0x1f, 0xa9, 0x87, 0xed, 0x89, 0xf4, 0x52, 0x76, 0x0a, 0xfb, 0x99, 0xe9, 0x5b, - 0xff, 0xb8, 0xf3, 0xdc, 0x2a, 0xef, 0x5e, 0x5d, 0x9d, 0x76, 0xf7, 0xc6, 0xa6, 0xd5, 0xce, 0x68, - 0x25, 0xe9, 0xb5, 0xb3, 0xaf, 0xef, 0xb7, 0xf7, 0x1e, 0x26, 0x95, 0xa7, 0xbb, 0xfb, 0xe7, 0x69, - 0xde, 0x9e, 0x0e, 0x0a, 0xe7, 0xa5, 0xb6, 0xfe, 0x74, 0x55, 0xe8, 0x0f, 0x53, 0xc6, 0x83, 0x73, - 0x70, 0xb4, 0x77, 0x76, 0xd5, 0xce, 0xf7, 0x9a, 0x13, 0x29, 0x5b, 0x68, 0xf6, 0x9a, 0xb6, 0x7b, - 0x77, 0xd6, 0xef, 0xbe, 0xf4, 0x9e, 0xbb, 0xfb, 0x4d, 0x59, 0x6b, 0xf5, 0xc7, 0xc3, 0xce, 0xd1, - 0x78, 0xff, 0xb6, 0x35, 0x18, 0xaa, 0x97, 0x7d, 0xed, 0x4a, 0xbd, 0x29, 0xd9, 0xa3, 0xa3, 0xe7, - 0xd3, 0xce, 0xf5, 0xd3, 0xfe, 0x78, 0xaf, 0xdf, 0xae, 0xee, 0x1e, 0x39, 0xa6, 0x79, 0x54, 0xcc, - 0xdf, 0x1c, 0x5d, 0x1f, 0x99, 0x47, 0xb7, 0x7b, 0x95, 0x97, 0xe9, 0xf9, 0xd3, 0x51, 0xf9, 0xf6, - 0xb9, 0x39, 0x3d, 0xb3, 0xaf, 0x33, 0xd2, 0x59, 0x66, 0x6f, 0x2c, 0x5d, 0x58, 0xe6, 0x9b, 0xd4, - 0xaf, 0x9e, 0x1e, 0xb4, 0x9c, 0xc7, 0xdc, 0xdb, 0x79, 0xee, 0xf1, 0xe2, 0xcd, 0xc9, 0x9d, 0xe6, - 0x27, 0xaf, 0xe4, 0xdc, 0x2a, 0xbc, 0x3d, 0x3c, 0xbf, 0x56, 0xe4, 0x87, 0x9b, 0x4c, 0xff, 0x6c, - 0xf7, 0xf4, 0x39, 0x53, 0xcc, 0x3f, 0xee, 0x35, 0x8f, 0x3a, 0xa9, 0xf2, 0xb0, 0x54, 0xaa, 0x18, - 0xf9, 0xc3, 0xd4, 0xe1, 0xf5, 0xa5, 0xfa, 0xa4, 0x66, 0x87, 0xf9, 0x9b, 0x37, 0xf5, 0xfa, 0x49, - 0xbd, 0x3b, 0xbb, 0xe9, 0x1e, 0xe9, 0xc5, 0xc3, 0xee, 0x49, 0x4f, 0xcd, 0xca, 0xe5, 0xce, 0xe8, - 0x55, 0xad, 0xde, 0x57, 0x87, 0x96, 0xad, 0x5e, 0x56, 0xae, 0x6e, 0x2e, 0x06, 0x44, 0x7a, 0x2b, - 0xde, 0x5c, 0x5e, 0x5c, 0x1f, 0xeb, 0x7b, 0x7b, 0xcf, 0x87, 0x77, 0xcf, 0x07, 0x62, 0xf3, 0xfc, - 0xec, 0xea, 0xd1, 0x19, 0x5c, 0xdb, 0x27, 0xfa, 0xc0, 0x9a, 0xbe, 0xde, 0x95, 0x5f, 0x86, 0xf2, - 0xd1, 0x55, 0x2b, 0x77, 0xd0, 0x39, 0x7a, 0x69, 0x77, 0x52, 0x67, 0x06, 0x69, 0x1d, 0x17, 0x2a, - 0xc7, 0xc7, 0xed, 0xbb, 0x56, 0xff, 0xaa, 0x3b, 0x1c, 0x9f, 0x9c, 0x59, 0xb9, 0xe9, 0x6d, 0xd5, - 0x1a, 0xbc, 0x66, 0xef, 0x4e, 0x6e, 0xaf, 0x4b, 0x36, 0x71, 0xc5, 0x03, 0x4b, 0xec, 0x3c, 0xdf, - 0x3d, 0x5e, 0x5f, 0xb7, 0x53, 0x0f, 0xcf, 0xe5, 0xd4, 0x85, 0x76, 0xdb, 0x79, 0xc9, 0x1c, 0x1c, - 0xbd, 0x0d, 0xb3, 0x03, 0xed, 0xf0, 0xe9, 0x7e, 0x92, 0xea, 0x55, 0x1e, 0xb3, 0xd7, 0xb7, 0x2f, - 0xee, 0xe5, 0xe0, 0xf5, 0x48, 0x73, 0xaf, 0x6f, 0x1e, 0xee, 0xce, 0xdf, 0xde, 0x5a, 0xee, 0xb0, - 0x7d, 0x79, 0xa2, 0x1c, 0x8a, 0x6f, 0xd7, 0xbb, 0x07, 0xa9, 0xc7, 0x6a, 0xa6, 0x65, 0xf4, 0x77, - 0xa5, 0x9c, 0x38, 0x2a, 0x9a, 0x87, 0x5d, 0x67, 0xff, 0xf6, 0xac, 0xf7, 0x70, 0x76, 0xb9, 0xdf, - 0xbd, 0x28, 0x3e, 0x29, 0xc7, 0x13, 0xb1, 0x7d, 0x74, 0xa9, 0xdd, 0x4d, 0xc7, 0xbd, 0x67, 0xb9, - 0x74, 0x76, 0x34, 0xbc, 0x4b, 0x99, 0x4f, 0x85, 0x51, 0xee, 0xe5, 0xa5, 0x94, 0x79, 0x33, 0x8e, - 0x26, 0x7b, 0x27, 0x76, 0x6f, 0x78, 0x96, 0xcb, 0x4d, 0x53, 0xf2, 0x7d, 0x65, 0x7c, 0x7b, 0xf0, - 0xaa, 0x95, 0xa5, 0xd3, 0x4a, 0xf7, 0xea, 0xf8, 0x6d, 0x6c, 0xb4, 0x9e, 0x2b, 0xee, 0x91, 0x65, - 0xa9, 0x47, 0x55, 0xf9, 0x71, 0xaf, 0x73, 0x77, 0x7c, 0xd7, 0xba, 0x3a, 0x32, 0x34, 0xeb, 0x5e, - 0x3c, 0x94, 0x5d, 0x45, 0x57, 0x6e, 0xca, 0xa3, 0xd6, 0xf4, 0x74, 0xf0, 0x20, 0x75, 0xee, 0xec, - 0xab, 0xce, 0xf9, 0xd9, 0x54, 0x96, 0x8e, 0x8f, 0x77, 0xfb, 0xb9, 0x4b, 0xed, 0xc1, 0x7e, 0x90, - 0x7b, 0x6a, 0xa9, 0x29, 0xbf, 0x12, 0x45, 0xdd, 0xbb, 0xb9, 0xa8, 0xee, 0x5f, 0xed, 0x1f, 0x91, - 0x7b, 0xf1, 0xee, 0xf2, 0xfe, 0x4a, 0x51, 0xaf, 0x2a, 0xba, 0x7b, 0x79, 0xb1, 0x3f, 0x4c, 0x95, - 0x4b, 0xaf, 0xb9, 0xa3, 0xc9, 0xed, 0x8d, 0x79, 0x4c, 0xee, 0xad, 0xee, 0xf3, 0x95, 0x76, 0x78, - 0x78, 0x58, 0x84, 0xa5, 0xb4, 0x77, 0xfa, 0x9c, 0x95, 0x0f, 0x7b, 0x57, 0x93, 0x07, 0xe7, 0x16, - 0x06, 0x74, 0xf2, 0x28, 0xf7, 0x52, 0xad, 0x09, 0xfc, 0x57, 0xaa, 0x92, 0x43, 0xe5, 0x62, 0x04, - 0x0c, 0xfb, 0x38, 0xab, 0x97, 0x64, 0xd1, 0xd8, 0x2b, 0x3f, 0x1f, 0xa4, 0xe4, 0x4e, 0x33, 0xab, - 0xb6, 0x9e, 0xee, 0x26, 0x83, 0x71, 0xe5, 0xe9, 0x38, 0x73, 0xf4, 0xe8, 0x4e, 0x2e, 0x5d, 0xf9, - 0x78, 0xa2, 0x5b, 0x57, 0x99, 0xd3, 0x83, 0xe7, 0xce, 0xab, 0x28, 0xde, 0x0c, 0xd4, 0xf3, 0xa3, - 0xa7, 0x89, 0x7d, 0x40, 0xf4, 0xd4, 0x34, 0x65, 0x3f, 0x1d, 0xdb, 0x66, 0xca, 0xb8, 0xed, 0xe7, - 0x2f, 0xed, 0xf3, 0xa3, 0x83, 0xf1, 0x49, 0xe9, 0xde, 0x7e, 0x38, 0x3f, 0xbb, 0xcb, 0x4d, 0x6e, - 0xc8, 0xf5, 0xfd, 0x61, 0xe7, 0xb9, 0xa3, 0xbc, 0xb8, 0xa7, 0xc7, 0x5d, 0x92, 0xb5, 0x95, 0xb2, - 0x63, 0x4d, 0x47, 0x2f, 0x79, 0xb9, 0x74, 0x57, 0x78, 0x29, 0x54, 0x3a, 0x76, 0xbe, 0x39, 0xc8, - 0x5e, 0x8e, 0x32, 0x57, 0x5a, 0xb7, 0xef, 0x1c, 0xe5, 0x86, 0x67, 0x23, 0xa5, 0x52, 0xca, 0x5f, - 0x68, 0x57, 0x57, 0xd7, 0xe7, 0x26, 0x51, 0xad, 0xcb, 0xee, 0xa1, 0xd1, 0x19, 0x2b, 0xc0, 0x1b, - 0x53, 0xd2, 0xde, 0xfe, 0x7e, 0xa9, 0xac, 0x9c, 0xbc, 0xdd, 0xf4, 0x76, 0xf5, 0xab, 0xde, 0xb3, - 0xf5, 0xdc, 0xbb, 0xd9, 0x33, 0x8e, 0xdd, 0x03, 0xe3, 0x21, 0xf7, 0x2a, 0x0f, 0x1e, 0x8e, 0x4b, - 0xed, 0x8b, 0xdd, 0xd3, 0xa7, 0xf2, 0xd8, 0xb1, 0x53, 0xc7, 0x4f, 0x6f, 0x8f, 0x86, 0xfc, 0xac, - 0xca, 0x2f, 0xad, 0xe1, 0x7e, 0xf7, 0x56, 0x3c, 0x1c, 0xe9, 0xe3, 0x57, 0xd9, 0xbd, 0xed, 0x1d, - 0x97, 0xdf, 0xae, 0x1f, 0xda, 0xe7, 0xc7, 0xce, 0xa8, 0x33, 0xd1, 0xc7, 0x6f, 0xb9, 0xfb, 0x47, - 0x57, 0x2a, 0x4c, 0x9e, 0x6d, 0x2d, 0xd3, 0x75, 0x86, 0xba, 0x61, 0xb4, 0xef, 0x2e, 0xa7, 0xa6, - 0x61, 0x5d, 0x8a, 0xd7, 0xa7, 0x45, 0xf3, 0xee, 0xfc, 0xe4, 0xe5, 0xa5, 0xbb, 0xaf, 0x1f, 0x14, - 0x14, 0xe7, 0x66, 0xef, 0xbc, 0xe9, 0xf4, 0xde, 0x5a, 0xf9, 0xca, 0x41, 0xb9, 0xd7, 0x39, 0xb9, - 0xeb, 0x75, 0x9e, 0xca, 0x83, 0x8c, 0xb2, 0x3f, 0x3a, 0x69, 0x9e, 0x0e, 0x26, 0x27, 0x6f, 0x99, - 0xcc, 0xb0, 0xdc, 0x2f, 0x91, 0xde, 0x61, 0xbb, 0x7c, 0x66, 0x1f, 0x16, 0x9e, 0x8f, 0xad, 0xcc, - 0xd3, 0xa4, 0xf0, 0x9a, 0xcf, 0x49, 0x95, 0x9b, 0x72, 0x76, 0x62, 0x1c, 0xde, 0x5d, 0xb7, 0x0e, - 0xf4, 0x6e, 0xfb, 0xe9, 0xdc, 0x75, 0xd5, 0x5c, 0x5b, 0xb9, 0x95, 0xa4, 0x69, 0x89, 0x54, 0x2f, - 0x5f, 0xfa, 0x43, 0x65, 0x7a, 0x2d, 0x9a, 0x97, 0xc3, 0xec, 0x5b, 0xf6, 0x2d, 0xb3, 0xb7, 0x9b, - 0xaa, 0x8c, 0xb5, 0x49, 0xb3, 0xad, 0x9e, 0xdd, 0x66, 0x7b, 0xc6, 0x60, 0xb7, 0x30, 0x69, 0x8e, - 0x4b, 0x15, 0x6b, 0x7c, 0xa8, 0xdc, 0x3f, 0xeb, 0x6d, 0x7b, 0xd7, 0x78, 0x98, 0x9c, 0x3e, 0x3f, - 0x97, 0xf2, 0xb7, 0x07, 0xbd, 0xd1, 0xf9, 0xc1, 0xdd, 0x41, 0xf3, 0xb8, 0xfd, 0x36, 0x69, 0x8f, - 0x53, 0xf7, 0xe6, 0xc0, 0x28, 0x9f, 0x35, 0x35, 0xf9, 0x4e, 0x1e, 0x96, 0x74, 0x72, 0x78, 0xbd, - 0x5b, 0x74, 0x94, 0xac, 0xd8, 0x3d, 0x75, 0x65, 0x5b, 0xb5, 0x33, 0xc7, 0xaf, 0x77, 0xa5, 0x47, - 0x3b, 0x65, 0x8e, 0xc6, 0x6d, 0xf7, 0xfa, 0x70, 0xbf, 0x7c, 0x56, 0x78, 0x3b, 0xa8, 0x8a, 0xaf, - 0xe7, 0xbb, 0xa5, 0xc7, 0xeb, 0x7d, 0xd3, 0x2c, 0x66, 0x5f, 0xda, 0xc7, 0x92, 0xfc, 0x9a, 0x3f, - 0x27, 0x87, 0x77, 0x27, 0x2a, 0xe9, 0x66, 0xfa, 0xce, 0x59, 0xbb, 0xdd, 0xb1, 0xdc, 0xe2, 0xa0, - 0xf2, 0x30, 0x38, 0x7e, 0xdd, 0xdb, 0x6b, 0x1a, 0xd7, 0xa2, 0x52, 0xc8, 0x56, 0x06, 0x93, 0xc1, - 0xc4, 0xbe, 0x7a, 0xbb, 0x1a, 0x4e, 0x2f, 0x0d, 0xc7, 0xba, 0x1e, 0x77, 0x9b, 0x8f, 0x2f, 0x96, - 0xdb, 0x7f, 0xb3, 0x01, 0x2d, 0x37, 0xd9, 0xc9, 0x79, 0xa7, 0x5b, 0xb8, 0x77, 0x77, 0xcf, 0xce, - 0xaa, 0x7b, 0x57, 0x37, 0xd9, 0xea, 0xf0, 0x34, 0xd5, 0x93, 0x0b, 0xe5, 0x5e, 0xfb, 0xf4, 0x32, - 0xaf, 0xdc, 0x88, 0x95, 0x76, 0xe5, 0xa8, 0xa0, 0x3e, 0x4d, 0x8e, 0xf5, 0x42, 0xf6, 0xc0, 0x99, - 0x54, 0xef, 0x0f, 0xdf, 0x4e, 0x77, 0x2f, 0x0e, 0xdf, 0xee, 0x9f, 0xaf, 0x3b, 0xd5, 0xf3, 0xd3, - 0xd6, 0xc5, 0xed, 0x6e, 0xab, 0x7d, 0x95, 0x1a, 0x1e, 0xf4, 0x77, 0x33, 0x77, 0xe5, 0xa7, 0xb7, - 0xdb, 0xf1, 0xc9, 0x7e, 0xe7, 0x66, 0xb0, 0x67, 0x6b, 0xc7, 0xa9, 0x5b, 0xa4, 0xfd, 0x8c, 0xdc, - 0x7e, 0x68, 0x9f, 0x9d, 0x9e, 0x3a, 0xcf, 0x3d, 0xad, 0xe9, 0x16, 0x2c, 0xab, 0x3c, 0xd4, 0xad, - 0x89, 0x9c, 0x73, 0xdf, 0xf6, 0x2b, 0x47, 0x95, 0x49, 0x7f, 0x7a, 0x78, 0xb1, 0xb7, 0x7b, 0x92, - 0xef, 0x1c, 0xf4, 0x4a, 0x57, 0x97, 0xd9, 0xdc, 0xae, 0x76, 0x99, 0x7f, 0x3c, 0x1b, 0xe7, 0xec, - 0xbd, 0xb6, 0x7b, 0x7f, 0xbb, 0xf7, 0x70, 0x9a, 0x22, 0x8e, 0x31, 0xca, 0x1f, 0x56, 0xaf, 0x26, - 0xaf, 0xdd, 0x81, 0xbc, 0x67, 0xc8, 0x67, 0xa7, 0xcf, 0x07, 0xb7, 0x6d, 0xeb, 0xf5, 0xf5, 0x49, - 0x36, 0xee, 0x3b, 0x3d, 0x51, 0xef, 0xdf, 0x8f, 0xaa, 0xe3, 0xdb, 0x7c, 0xf1, 0xf5, 0xe6, 0xf0, - 0xf5, 0xb2, 0xfa, 0xf6, 0x7a, 0x6b, 0x9f, 0x96, 0x5f, 0x5e, 0x4f, 0x9e, 0x2b, 0x8f, 0xcf, 0x4f, - 0x6f, 0x3d, 0x31, 0x6b, 0xc9, 0xd5, 0xd4, 0xf4, 0xaa, 0xe2, 0x3c, 0x3c, 0x59, 0x8f, 0x93, 0x93, - 0x03, 0xad, 0x7d, 0x7c, 0x73, 0xee, 0x1c, 0x8d, 0xc7, 0xd6, 0xf4, 0xba, 0x50, 0xe8, 0xed, 0x5f, - 0x18, 0x77, 0x99, 0x14, 0x01, 0x42, 0x52, 0x0f, 0xf7, 0x32, 0x39, 0xfd, 0x2a, 0x3f, 0xec, 0x14, - 0xa7, 0xd9, 0xd7, 0xb7, 0xa3, 0x37, 0xf7, 0xe1, 0xf6, 0xfc, 0x72, 0xbf, 0x64, 0xaa, 0x8f, 0xc7, - 0xe2, 0xe5, 0xeb, 0xad, 0x76, 0x7f, 0xec, 0xf6, 0x4e, 0x0e, 0x4e, 0xce, 0x8e, 0x4e, 0x1f, 0x4b, - 0xa2, 0x3a, 0x21, 0x8f, 0x53, 0x43, 0x96, 0x53, 0x4e, 0xfb, 0xe4, 0xe4, 0xf5, 0xdc, 0x10, 0xef, - 0xdf, 0x72, 0xf6, 0xa9, 0x7b, 0x26, 0xef, 0x5e, 0xdd, 0x5f, 0x1a, 0x8f, 0xee, 0xe0, 0x58, 0x2a, - 0xdc, 0xbf, 0xb6, 0xaf, 0x4d, 0x39, 0x53, 0x1d, 0x0c, 0x86, 0x53, 0xe5, 0xea, 0x6e, 0x54, 0xd6, - 0xba, 0xad, 0xf3, 0xd1, 0x83, 0xad, 0xf7, 0xdf, 0x7a, 0x7b, 0xa7, 0x7b, 0x23, 0x50, 0xc9, 0x53, - 0x95, 0xc3, 0xe2, 0xe4, 0xf9, 0xa4, 0x5a, 0xa8, 0x28, 0x7b, 0xc4, 0x4d, 0xb5, 0xa5, 0x87, 0x6e, - 0x27, 0x75, 0xfa, 0x62, 0x66, 0xee, 0xdd, 0xd4, 0xa8, 0xa3, 0xbc, 0x4a, 0xf6, 0x6b, 0xe9, 0xe5, - 0xe9, 0x46, 0x7e, 0x29, 0x9c, 0x4b, 0x27, 0xaf, 0xd6, 0x85, 0xfc, 0xb2, 0xbf, 0x6f, 0x39, 0x92, - 0x52, 0x3d, 0xcd, 0xda, 0xd7, 0xe7, 0x0f, 0xc7, 0xbd, 0x4b, 0xd9, 0xbe, 0x9f, 0xee, 0xa9, 0x8f, - 0xcf, 0xa4, 0xe4, 0xee, 0x5e, 0x35, 0xdf, 0xdc, 0x17, 0xf9, 0xb1, 0x25, 0x8e, 0xf7, 0x48, 0xe1, - 0xd6, 0x38, 0xd7, 0xac, 0x81, 0xf1, 0x04, 0xba, 0xcb, 0x30, 0x33, 0x7c, 0xee, 0x96, 0x4e, 0xba, - 0xe5, 0x11, 0xc9, 0x66, 0x73, 0x87, 0xc3, 0x6e, 0x35, 0xb7, 0x3f, 0xca, 0x94, 0x89, 0xb1, 0x9b, - 0x49, 0x19, 0x97, 0x65, 0x4b, 0x06, 0xa5, 0xf3, 0xea, 0xf8, 0x49, 0xd6, 0xc4, 0xe7, 0x56, 0xc7, - 0x32, 0xcf, 0xab, 0x30, 0xf0, 0x9b, 0x97, 0xe7, 0xf2, 0xf1, 0xd9, 0xd8, 0x92, 0xef, 0x7b, 0xa6, - 0xd5, 0x94, 0xfb, 0xae, 0x7c, 0x71, 0xff, 0x32, 0x75, 0x9b, 0xed, 0xfc, 0x49, 0x2a, 0xf3, 0x6a, - 0x8a, 0x9d, 0x66, 0xe7, 0xfc, 0x3e, 0x77, 0x90, 0x93, 0x4f, 0xbb, 0x86, 0xd3, 0xb7, 0x76, 0x0b, - 0x52, 0x55, 0x1d, 0xbc, 0x95, 0x33, 0x87, 0x93, 0x4c, 0x46, 0x55, 0xf2, 0x17, 0x0f, 0xe7, 0x4f, - 0x05, 0xa0, 0xd5, 0xe9, 0xc3, 0xed, 0x5d, 0x4e, 0x7d, 0xbc, 0x76, 0xf6, 0xaa, 0xe5, 0xd7, 0x93, - 0xd3, 0x72, 0xf5, 0x55, 0x7a, 0x1b, 0xc2, 0xd0, 0x8e, 0xb2, 0xa3, 0xcb, 0x87, 0x9b, 0x72, 0xbe, - 0x5c, 0x94, 0xef, 0x3b, 0x07, 0xa6, 0xb2, 0x6b, 0x76, 0xf7, 0x72, 0xe4, 0xe8, 0xfa, 0xed, 0x58, - 0x54, 0xce, 0x5a, 0x22, 0xe8, 0x6e, 0xe3, 0x2b, 0xb1, 0xd7, 0x1d, 0x0d, 0x3b, 0xea, 0x48, 0xcd, - 0x16, 0xba, 0xd9, 0x21, 0x50, 0xfd, 0xe9, 0xe5, 0x7e, 0xfe, 0xf8, 0xf8, 0xf0, 0xb4, 0x34, 0x6c, - 0xa9, 0x19, 0xa3, 0x68, 0x54, 0xd4, 0x7c, 0xf1, 0xf6, 0xe2, 0xe4, 0xd2, 0x28, 0x19, 0x7d, 0x1b, - 0x04, 0xa4, 0x7d, 0x97, 0x97, 0xd4, 0xbc, 0xf1, 0x96, 0xd3, 0x6e, 0xb4, 0xf3, 0xd3, 0x42, 0xb6, - 0xb0, 0x6f, 0x90, 0xee, 0x69, 0xe6, 0xf8, 0xe0, 0x54, 0xbf, 0x7f, 0x72, 0x9f, 0xee, 0xa5, 0x57, - 0x73, 0xbf, 0x5f, 0x98, 0x74, 0x9e, 0x47, 0xce, 0x81, 0x9c, 0x29, 0x0d, 0xaa, 0xb6, 0xd4, 0xd6, - 0x9d, 0xd3, 0x41, 0x61, 0x78, 0xf8, 0x72, 0x75, 0xaf, 0x8f, 0xca, 0x37, 0x99, 0x31, 0x79, 0x7a, - 0x7b, 0x3e, 0x3c, 0x24, 0xe5, 0xc9, 0x93, 0x76, 0xfb, 0x66, 0x1d, 0x17, 0xef, 0x9b, 0xf7, 0xbb, - 0xa7, 0x7b, 0xe7, 0xe3, 0xeb, 0x93, 0xc9, 0xf8, 0xfa, 0xd1, 0x68, 0x9b, 0x0f, 0x07, 0x13, 0x45, - 0x3a, 0x99, 0x9c, 0x97, 0xf6, 0xae, 0x2b, 0xbb, 0xe7, 0x46, 0xce, 0xac, 0x9e, 0xbf, 0xc2, 0x0c, - 0xbb, 0x23, 0x5b, 0x2a, 0xde, 0x18, 0x47, 0xcf, 0x0f, 0x67, 0xbb, 0xfa, 0xe0, 0xa8, 0xfd, 0x94, - 0x9f, 0x5e, 0x3e, 0x3e, 0xe4, 0xcf, 0xdc, 0xea, 0xa8, 0x38, 0x18, 0x1c, 0x0e, 0xc7, 0x8f, 0xa3, - 0xd1, 0xe4, 0x72, 0x44, 0xec, 0xd3, 0x2a, 0xe9, 0x8c, 0x9c, 0xb7, 0x87, 0xf3, 0xe7, 0xdb, 0x07, - 0xfb, 0x45, 0x7e, 0x55, 0x0e, 0x2e, 0xee, 0xee, 0x73, 0xf2, 0xbe, 0xbc, 0x77, 0x70, 0xa2, 0xe5, - 0xcf, 0x4e, 0xef, 0x6e, 0xee, 0xdf, 0xde, 0xee, 0x0f, 0xdb, 0xc5, 0xc2, 0xee, 0x30, 0x93, 0xb3, - 0x9b, 0xd9, 0xd7, 0x17, 0xb3, 0xa4, 0x57, 0xbb, 0xed, 0xde, 0x9d, 0xbc, 0x3b, 0xb4, 0xbb, 0x77, - 0xbb, 0xf7, 0xed, 0xb6, 0x7e, 0x77, 0x9f, 0x1d, 0xf6, 0x26, 0x17, 0x63, 0xc5, 0x49, 0x55, 0xee, - 0x33, 0x19, 0xe0, 0x4f, 0x4f, 0xc7, 0x1a, 0x39, 0xd5, 0xab, 0xf7, 0x0f, 0xcd, 0x0a, 0x39, 0x38, - 0x2d, 0x2a, 0xf6, 0x6e, 0xb9, 0xdb, 0xbf, 0x38, 0x9b, 0x4e, 0xf4, 0x8a, 0xfc, 0x7c, 0x75, 0x7f, - 0xf0, 0xbc, 0x9b, 0x95, 0xef, 0x33, 0xe6, 0x4b, 0xe9, 0x56, 0x79, 0x25, 0x86, 0x63, 0x97, 0xdb, - 0x95, 0xc3, 0xf2, 0xd0, 0x75, 0x06, 0xea, 0xab, 0x79, 0x38, 0x78, 0xab, 0x56, 0xed, 0xd1, 0x94, - 0xec, 0x67, 0x2e, 0xdf, 0x40, 0x41, 0x28, 0x0c, 0x46, 0x77, 0x0f, 0xa7, 0xcf, 0xd3, 0xc7, 0xca, - 0xa8, 0xf2, 0x5c, 0x7c, 0xe8, 0x3f, 0x91, 0xc3, 0xbc, 0x74, 0xf9, 0x50, 0x2e, 0xaa, 0x96, 0x76, - 0x51, 0x24, 0xe7, 0x99, 0x8b, 0xb7, 0xb1, 0x72, 0x50, 0x7e, 0x7b, 0xe9, 0xea, 0x6e, 0xc6, 0x51, - 0x8b, 0xa4, 0xfc, 0xa8, 0xbc, 0xca, 0x17, 0xe6, 0xb8, 0x7b, 0xdd, 0xcb, 0xe5, 0xae, 0x8b, 0xc5, - 0x4a, 0x51, 0x72, 0x73, 0xa3, 0x87, 0x87, 0x4a, 0xf9, 0x3e, 0xfb, 0x28, 0xf6, 0xae, 0xc4, 0x72, - 0xb5, 0x50, 0x2d, 0x93, 0xc7, 0x9b, 0xec, 0xfe, 0xcb, 0xd4, 0xdc, 0x7f, 0x3d, 0x7b, 0x04, 0x1d, - 0xf0, 0x50, 0xad, 0x5c, 0x8d, 0x4e, 0x0e, 0xec, 0xeb, 0x83, 0x92, 0x7c, 0xfc, 0x78, 0xb3, 0xd7, - 0x6a, 0x3d, 0x3d, 0x1e, 0xec, 0xdf, 0x2b, 0x83, 0xe2, 0x41, 0x16, 0xd0, 0x98, 0xd3, 0x8a, 0x85, - 0xc7, 0xea, 0xbd, 0xab, 0xed, 0x0e, 0x5f, 0xf4, 0xcb, 0x62, 0xf9, 0xd1, 0xdd, 0x7d, 0x3a, 0x6b, - 0xde, 0xeb, 0xc3, 0x5c, 0xf7, 0xf1, 0x6d, 0xef, 0xac, 0x7c, 0x95, 0x2a, 0xb6, 0x81, 0x93, 0x77, - 0xf2, 0x17, 0x6f, 0xc5, 0x67, 0x90, 0x61, 0x47, 0x92, 0xe2, 0xca, 0xf7, 0x97, 0xe6, 0x78, 0x78, - 0xd5, 0x3b, 0x9f, 0x1e, 0xea, 0xc3, 0x13, 0x5d, 0x1a, 0x57, 0xc7, 0x86, 0x7c, 0x31, 0x70, 0x87, - 0xd2, 0xb3, 0x99, 0xb9, 0xeb, 0x8c, 0xab, 0xc0, 0x91, 0x3b, 0xd7, 0xe3, 0x33, 0x65, 0x08, 0x64, - 0xf9, 0x34, 0x6e, 0xf7, 0xfb, 0x25, 0xa7, 0xdc, 0x77, 0x5e, 0x6d, 0xed, 0xbe, 0xe5, 0xf4, 0x9a, - 0x39, 0x27, 0x6f, 0xb4, 0x41, 0x6d, 0x2e, 0x1c, 0x95, 0x2f, 0x52, 0x92, 0x33, 0x19, 0x4f, 0x9e, - 0x64, 0xf7, 0xf4, 0x54, 0xcc, 0xef, 0x57, 0xe5, 0xbe, 0x72, 0x5d, 0x7a, 0x7c, 0xab, 0x0e, 0x8e, - 0xe4, 0xb6, 0x78, 0x5b, 0x2d, 0x9d, 0x88, 0x93, 0x83, 0x66, 0x59, 0x9e, 0x54, 0xa7, 0x29, 0x3d, - 0x97, 0xc9, 0x94, 0xf3, 0xcf, 0xa9, 0xc3, 0x9c, 0x26, 0xee, 0x1f, 0xa8, 0xb9, 0xf2, 0xb0, 0x79, - 0x77, 0x7e, 0x94, 0xb9, 0xef, 0xb7, 0x1e, 0x87, 0xf7, 0xaf, 0x47, 0x7b, 0xd2, 0xe3, 0x44, 0x52, - 0x1d, 0x51, 0x57, 0xee, 0xda, 0x77, 0x29, 0xf5, 0x42, 0x3f, 0x1c, 0xec, 0x4e, 0x32, 0xaf, 0x17, - 0x65, 0xa5, 0x94, 0x19, 0x3e, 0x3d, 0x88, 0xee, 0x35, 0xb9, 0x75, 0x8f, 0xaf, 0x46, 0xa5, 0xc2, - 0x14, 0xc8, 0xb7, 0x39, 0x7a, 0x28, 0x4d, 0xf6, 0xc8, 0x5b, 0xf3, 0x21, 0x53, 0xb9, 0x1f, 0x54, - 0x5a, 0xbd, 0x7e, 0xa6, 0x5a, 0xbc, 0xa8, 0x5e, 0x4c, 0x9c, 0xf3, 0xd6, 0xa3, 0xe1, 0x3c, 0xdc, - 0x5f, 0xa5, 0xca, 0x56, 0xeb, 0xad, 0x92, 0x39, 0x3f, 0x7b, 0x2a, 0x96, 0x9f, 0x9a, 0x47, 0x07, - 0xfb, 0xea, 0xcd, 0x38, 0x25, 0x59, 0x95, 0xbb, 0xd4, 0x51, 0xfe, 0xfc, 0xf6, 0x8e, 0xc0, 0x9a, - 0x1a, 0x6b, 0xa3, 0x94, 0xae, 0x28, 0xaf, 0xcf, 0xd9, 0x72, 0xee, 0xa1, 0xfc, 0x38, 0x2e, 0xf6, - 0x8e, 0x9b, 0xb7, 0x57, 0x07, 0x8f, 0x97, 0x57, 0xa5, 0xab, 0xe9, 0xe4, 0xba, 0xdb, 0x23, 0xad, - 0xd4, 0x95, 0x52, 0xbc, 0x37, 0x9a, 0x67, 0xad, 0xe6, 0x61, 0x7b, 0x54, 0xba, 0x39, 0x76, 0x89, - 0x9b, 0xb7, 0x8c, 0x4c, 0x25, 0x2f, 0x17, 0x1e, 0x5b, 0xcd, 0xa3, 0xdd, 0x51, 0xbe, 0x68, 0x76, - 0xad, 0x9b, 0xeb, 0xa9, 0x5b, 0xbc, 0x7c, 0x06, 0x9d, 0xf4, 0xa6, 0x72, 0xf2, 0xd8, 0xdc, 0xbf, - 0x3a, 0xa9, 0x18, 0xed, 0xde, 0xae, 0x02, 0x6a, 0xf1, 0xed, 0x18, 0x68, 0xff, 0xf5, 0xb0, 0xb3, - 0x7b, 0x62, 0xee, 0x1f, 0x94, 0x4f, 0x9e, 0xae, 0x4e, 0xcf, 0xac, 0x67, 0xb3, 0x38, 0xec, 0x4b, - 0x99, 0xcb, 0xa3, 0xdc, 0x74, 0xb8, 0x7b, 0x7f, 0xd1, 0xba, 0xe9, 0xec, 0x3d, 0x49, 0xcf, 0xd6, - 0xeb, 0x55, 0xa9, 0x92, 0x7a, 0x92, 0xb2, 0x95, 0xe7, 0xde, 0x41, 0xef, 0xf1, 0xec, 0xa6, 0x62, - 0xec, 0xf6, 0x9f, 0x4f, 0x94, 0xb6, 0x7d, 0xd2, 0x7a, 0x6c, 0x97, 0xa6, 0x27, 0x9d, 0xa7, 0xeb, - 0xd3, 0x76, 0xd1, 0xbd, 0x2e, 0x3e, 0x9e, 0xf4, 0x6f, 0xdf, 0xde, 0xce, 0xef, 0xcf, 0x8a, 0xb9, - 0xc1, 0xee, 0x68, 0x78, 0x79, 0xa6, 0x9d, 0x96, 0x27, 0x97, 0x93, 0xc2, 0xad, 0x74, 0xdd, 0x6b, - 0x6b, 0xc7, 0x4f, 0xcd, 0xbb, 0xb6, 0xa3, 0x3c, 0xe5, 0x0e, 0x6f, 0x8f, 0xfa, 0xb7, 0x97, 0xca, - 0xbe, 0x74, 0x58, 0xbc, 0xbf, 0xdf, 0x1b, 0x8d, 0x06, 0x23, 0xf5, 0xb2, 0xab, 0x17, 0x4f, 0xa4, - 0xd6, 0xe8, 0xa2, 0x62, 0x66, 0x53, 0xdd, 0x76, 0x6b, 0x57, 0x2e, 0xf5, 0x47, 0xc3, 0xd3, 0xb7, - 0x8a, 0x7e, 0x76, 0x7d, 0x31, 0xee, 0x3e, 0x5f, 0x9e, 0x57, 0x34, 0xc9, 0xae, 0x8a, 0xd7, 0xad, - 0x96, 0x76, 0xdd, 0x3a, 0xb6, 0xf3, 0xc3, 0xde, 0xeb, 0x61, 0xb7, 0x74, 0xfa, 0xda, 0xbb, 0x7d, - 0x7c, 0x74, 0x8a, 0xfd, 0xb7, 0xd1, 0xb0, 0xea, 0x9e, 0x1d, 0x5d, 0xdc, 0xda, 0x99, 0x89, 0x35, - 0xba, 0x76, 0xce, 0xef, 0x46, 0xea, 0x53, 0xc6, 0x4a, 0x0d, 0x76, 0x2b, 0x46, 0xf9, 0x2e, 0x07, - 0x5c, 0x51, 0xbc, 0x49, 0x49, 0xd7, 0xfd, 0x4b, 0xeb, 0xbc, 0xef, 0x9c, 0xb7, 0x2f, 0x5e, 0x27, - 0xe6, 0x7e, 0x6e, 0x28, 0x3a, 0xc3, 0xd7, 0x1b, 0xcd, 0xea, 0x4d, 0x8a, 0x95, 0xa3, 0xe3, 0x26, - 0x75, 0x59, 0x34, 0xf8, 0x44, 0xd7, 0xb4, 0x07, 0x92, 0x9b, 0xfc, 0x86, 0x06, 0xd4, 0x37, 0x7e, - 0x5e, 0xb3, 0x4d, 0xd3, 0x9d, 0x6d, 0x6d, 0x29, 0x5b, 0xd9, 0xda, 0xd7, 0x6c, 0x36, 0x5b, 0xc7, - 0xc7, 0x6e, 0xed, 0x6b, 0xb7, 0xdb, 0xa5, 0x8f, 0xb9, 0x1a, 0x3a, 0x8a, 0xe8, 0x63, 0xbe, 0xf6, - 0x35, 0x9f, 0xcf, 0xd3, 0xc7, 0x42, 0xed, 0x6b, 0xa1, 0x50, 0xa0, 0x8f, 0xc5, 0xda, 0xd7, 0x62, - 0xb1, 0x48, 0x1f, 0x4b, 0xb5, 0xaf, 0xa5, 0x52, 0x89, 0x3e, 0x56, 0x6a, 0x5f, 0x2b, 0x95, 0x0a, - 0x7d, 0x94, 0x6b, 0x5f, 0x65, 0x59, 0xa6, 0x8f, 0x4a, 0xed, 0xab, 0xa2, 0x28, 0xf4, 0x91, 0xd4, - 0xbe, 0x12, 0x42, 0xe8, 0xa3, 0x5a, 0xfb, 0xaa, 0xaa, 0x2a, 0x7d, 0xb4, 0x21, 0xb5, 0xc0, 0x5a, - 0xeb, 0x41, 0x13, 0x84, 0x3d, 0xea, 0xf0, 0x58, 0x91, 0xe0, 0xd1, 0x05, 0x60, 0x69, 0xd6, 0x96, - 0x59, 0xb3, 0x7b, 0xb2, 0x94, 0xcc, 0x17, 0x84, 0x84, 0xff, 0x97, 0xae, 0xf2, 0x34, 0xcb, 0x95, - 0x97, 0xf3, 0xc0, 0xb0, 0x4f, 0xd2, 0xfa, 0xbc, 0x5f, 0x46, 0x62, 0x85, 0xb2, 0x62, 0x4e, 0x48, - 0x2c, 0x3e, 0x96, 0xcb, 0xf5, 0x59, 0xb9, 0x62, 0x56, 0x48, 0xf8, 0x7f, 0xd1, 0x42, 0x6e, 0xbf, - 0x56, 0x16, 0xad, 0x09, 0x3e, 0x59, 0xfe, 0x13, 0xd4, 0x2a, 0xe5, 0x59, 0x9a, 0x6c, 0xd5, 0xb2, - 0x05, 0x6b, 0x92, 0xa8, 0xc0, 0x5f, 0xd6, 0xcb, 0x85, 0xb4, 0x2a, 0xfc, 0x14, 0x13, 0x65, 0xfc, - 0xa4, 0xe5, 0xd5, 0x9a, 0x61, 0x1a, 0x88, 0x0f, 0x79, 0xe0, 0xd6, 0xc4, 0x39, 0xfa, 0x10, 0x67, - 0xd4, 0x75, 0xb0, 0x25, 0x31, 0x6f, 0xc9, 0x40, 0x02, 0xe5, 0x7e, 0xa8, 0x53, 0x67, 0xc3, 0x5c, - 0x36, 0xd5, 0xe9, 0x6c, 0x20, 0xd9, 0x3d, 0xcd, 0xa8, 0x89, 0x75, 0x74, 0x27, 0xf5, 0x6c, 0x73, - 0x68, 0xa8, 0xcc, 0xcb, 0x57, 0x63, 0x1d, 0x84, 0x29, 0xe5, 0xeb, 0x61, 0x63, 0xfa, 0x90, 0xe8, - 0x23, 0xe2, 0x6a, 0x8a, 0x24, 0xdc, 0x11, 0x5b, 0x95, 0x0c, 0x49, 0x70, 0x24, 0xc3, 0xd9, 0x72, - 0x88, 0xad, 0x75, 0x59, 0x41, 0x47, 0x7b, 0x23, 0xb5, 0x2c, 0xf4, 0xaa, 0x1e, 0x05, 0xd4, 0xe5, - 0xeb, 0x2e, 0x99, 0xb8, 0x5b, 0x92, 0xae, 0xf5, 0x8c, 0x9a, 0x42, 0xd0, 0x75, 0x50, 0x47, 0x87, - 0xe0, 0x8b, 0xe6, 0x6e, 0xb1, 0x6e, 0x2a, 0x92, 0xae, 0xa3, 0x0b, 0x87, 0x0d, 0xc3, 0xcb, 0x1a, - 0x02, 0x6c, 0x80, 0xaf, 0x13, 0xc5, 0xcf, 0x18, 0x98, 0x6f, 0xab, 0x52, 0x9d, 0xe5, 0xc4, 0xe5, - 0x52, 0x7e, 0x7b, 0x92, 0xb5, 0xd5, 0xd7, 0x7a, 0x7d, 0x1d, 0x5d, 0x4d, 0xde, 0x88, 0x5d, 0x1b, - 0x46, 0x62, 0x49, 0x36, 0xf4, 0xac, 0xee, 0x28, 0xb6, 0xa9, 0xeb, 0xb2, 0x64, 0x33, 0x2f, 0x6a, - 0xad, 0x04, 0xc3, 0x59, 0xa4, 0x45, 0x07, 0xe6, 0xc8, 0x7c, 0x22, 0x54, 0x97, 0x22, 0x56, 0xa0, - 0xc8, 0xef, 0x13, 0x04, 0x5f, 0xcb, 0x8a, 0xe2, 0x3f, 0xeb, 0x0c, 0x0e, 0x7d, 0xb4, 0x4c, 0x47, - 0xa3, 0xf3, 0xd1, 0xd5, 0x26, 0x44, 0xad, 0x9b, 0x20, 0x33, 0x19, 0xec, 0x2d, 0x99, 0xf4, 0xa5, - 0x91, 0x06, 0xb0, 0xb1, 0xb3, 0xf3, 0xaf, 0x72, 0x2f, 0x04, 0x62, 0xd4, 0x5f, 0xc0, 0x18, 0x8d, - 0xe3, 0x40, 0xde, 0xb6, 0x34, 0x43, 0x25, 0x93, 0xda, 0x56, 0x36, 0x32, 0x97, 0x41, 0x29, 0x0f, - 0xdf, 0xa1, 0x2c, 0x9b, 0x58, 0x44, 0x42, 0xb4, 0x78, 0x4f, 0xe1, 0x3c, 0x3a, 0x87, 0x0a, 0x76, - 0xac, 0x6e, 0x5a, 0x92, 0xa2, 0xb9, 0x53, 0x20, 0x11, 0x3a, 0x46, 0x06, 0xcd, 0x4b, 0x4c, 0xe4, - 0x9c, 0xb9, 0xe5, 0xd3, 0x10, 0x12, 0x26, 0x90, 0x63, 0x0e, 0x3f, 0xe7, 0x92, 0x20, 0xd5, 0x46, - 0x1a, 0x94, 0x26, 0xaa, 0x60, 0xcd, 0xa2, 0xf8, 0x52, 0xf9, 0x70, 0xf6, 0x8c, 0x12, 0x85, 0x4a, - 0x14, 0xd3, 0xa6, 0x74, 0xc9, 0x86, 0x2e, 0x0f, 0x5d, 0xd7, 0x34, 0x66, 0x40, 0x0c, 0xba, 0x66, - 0x10, 0x68, 0x5c, 0x19, 0xda, 0x0e, 0xc0, 0xb0, 0x4c, 0x2d, 0x3e, 0x8e, 0xe5, 0xc9, 0x93, 0x4d, - 0x5b, 0x25, 0x76, 0xb4, 0xc7, 0xb4, 0x54, 0x22, 0x9d, 0x77, 0x84, 0x78, 0x55, 0x4c, 0x0c, 0x53, - 0x6e, 0x75, 0x89, 0x72, 0x15, 0xbe, 0x3e, 0xd0, 0x0c, 0x8f, 0x12, 0x0a, 0xb8, 0xfe, 0xf0, 0xa7, - 0x37, 0x33, 0xf8, 0xdb, 0xeb, 0x6e, 0xad, 0x8f, 0x18, 0x9b, 0x2d, 0x1a, 0x08, 0x20, 0x14, 0xf8, - 0x79, 0x5a, 0x97, 0x64, 0xa2, 0x2f, 0x16, 0x9c, 0x25, 0xa9, 0xaa, 0x66, 0xf4, 0x90, 0xb2, 0x00, - 0x6b, 0xe2, 0xfc, 0x2b, 0x7a, 0xcb, 0x59, 0x99, 0xd8, 0xd4, 0xca, 0x26, 0x00, 0x1f, 0xd4, 0x60, - 0x71, 0x28, 0x49, 0x06, 0x50, 0xee, 0xf3, 0x89, 0x54, 0x02, 0x6a, 0xf2, 0x75, 0x9b, 0x75, 0x62, - 0xa9, 0xcf, 0x25, 0x3e, 0x8e, 0xb2, 0xb1, 0x0d, 0x40, 0x8d, 0x1e, 0xac, 0x1e, 0x95, 0xd4, 0xa0, - 0x9f, 0xb8, 0x88, 0xf5, 0x2d, 0x5b, 0x9f, 0xa7, 0xc7, 0x36, 0x3a, 0xd8, 0xec, 0x78, 0xbb, 0xae, - 0x69, 0x41, 0x3f, 0x75, 0xd2, 0x05, 0x66, 0xe2, 0xb5, 0x13, 0xa6, 0xad, 0xa0, 0x29, 0x57, 0xe6, - 0x03, 0xf2, 0xcb, 0xce, 0xd3, 0x8c, 0xd2, 0x82, 0x81, 0x26, 0xa4, 0xa1, 0x6b, 0x7a, 0x94, 0x9b, - 0xcf, 0x21, 0xb2, 0xd2, 0xe8, 0xc4, 0x77, 0x56, 0xb9, 0xe8, 0xd8, 0x2c, 0xa0, 0x33, 0x0f, 0xa8, - 0x00, 0x44, 0x8c, 0x1e, 0x9a, 0x97, 0x1c, 0x8e, 0x11, 0x89, 0xc1, 0x47, 0x7c, 0xb6, 0xae, 0x6a, - 0x8e, 0xa5, 0x4b, 0xd3, 0x9a, 0x66, 0xd0, 0x74, 0x19, 0x5d, 0xc1, 0x75, 0xaf, 0xdd, 0x2d, 0x4a, - 0x87, 0x89, 0x02, 0x65, 0x8e, 0x94, 0xc4, 0x9c, 0xbe, 0xa4, 0x9a, 0x63, 0x58, 0x20, 0x90, 0x44, - 0x3f, 0xc4, 0x84, 0x3f, 0x82, 0x3c, 0x2f, 0xac, 0x4e, 0xa5, 0x29, 0x2b, 0xcb, 0xc6, 0x13, 0xe7, - 0xe9, 0xfe, 0xb0, 0xe7, 0xf9, 0x1d, 0x69, 0x7f, 0x0b, 0x39, 0x3a, 0x54, 0xa3, 0x0b, 0xa2, 0xd1, - 0xc5, 0xbd, 0x8e, 0x2d, 0xcf, 0x3f, 0xcd, 0x90, 0xbb, 0x60, 0x07, 0xf3, 0xf4, 0x0b, 0x99, 0xba, - 0xde, 0x3a, 0x60, 0xcc, 0x11, 0x71, 0xee, 0x13, 0xc8, 0x96, 0x37, 0xfd, 0x15, 0x04, 0x37, 0x92, - 0xf4, 0x68, 0x49, 0x3a, 0x2d, 0xeb, 0x8b, 0x26, 0xb4, 0x50, 0x8f, 0x1c, 0x40, 0x28, 0xcc, 0xb6, - 0x43, 0x7d, 0xd5, 0x74, 0x27, 0x65, 0x46, 0x17, 0x08, 0x4a, 0x73, 0xb6, 0x7e, 0x40, 0x32, 0x90, - 0x24, 0xa0, 0x4c, 0xc8, 0x23, 0x69, 0x2d, 0xad, 0xda, 0xb4, 0xa6, 0xcf, 0x56, 0xe2, 0x3c, 0xa0, - 0x26, 0xd6, 0xa9, 0x81, 0xa6, 0xaa, 0x3a, 0x99, 0xa7, 0x61, 0xd8, 0xb3, 0x77, 0x17, 0xea, 0x72, - 0x0b, 0x50, 0x25, 0xe1, 0xad, 0xfd, 0x77, 0x6b, 0x76, 0x75, 0x13, 0x78, 0x17, 0xc5, 0xd3, 0xdf, - 0x5b, 0xed, 0xe5, 0x0f, 0x56, 0x7b, 0x01, 0x71, 0x09, 0x2b, 0xc1, 0xef, 0x95, 0xbf, 0x6c, 0x3d, - 0xf9, 0x2d, 0x5b, 0xbc, 0x4f, 0x71, 0x62, 0xb8, 0xf7, 0x4b, 0xac, 0x20, 0x26, 0x33, 0x40, 0x27, - 0x88, 0x23, 0x98, 0x44, 0x86, 0x9f, 0x46, 0x91, 0x3d, 0x22, 0xef, 0x41, 0x90, 0xf8, 0x2f, 0xda, - 0x00, 0x77, 0x00, 0xa5, 0x25, 0x54, 0x76, 0x01, 0xd6, 0x47, 0x00, 0x4a, 0xef, 0x57, 0xc7, 0xad, - 0x3c, 0x09, 0xa6, 0xd8, 0x9e, 0x85, 0x24, 0x97, 0xb7, 0xf4, 0x28, 0x2b, 0xc2, 0x84, 0xc4, 0x96, - 0xaf, 0xc8, 0x58, 0x7c, 0xf0, 0x0c, 0x43, 0xf3, 0x91, 0xb2, 0x85, 0x3c, 0x24, 0x28, 0xb1, 0x5e, - 0xd2, 0xe1, 0xc0, 0xbd, 0xbd, 0xc3, 0x05, 0x17, 0xb2, 0x09, 0x6a, 0x2a, 0x23, 0x12, 0x16, 0x9d, - 0xb2, 0x39, 0xc1, 0x89, 0xc3, 0x19, 0x60, 0xf3, 0x0e, 0x34, 0x3f, 0x59, 0x90, 0x00, 0x36, 0x00, - 0xa4, 0x31, 0xae, 0x51, 0xa6, 0x13, 0x16, 0xbf, 0xeb, 0x9b, 0x76, 0x06, 0xa0, 0xbd, 0xf6, 0x67, - 0x21, 0xea, 0x09, 0x56, 0x45, 0x22, 0xc4, 0x73, 0xbb, 0x42, 0x96, 0xff, 0x57, 0xba, 0xe8, 0xf0, - 0x09, 0x22, 0x39, 0x64, 0x0b, 0x56, 0x32, 0xed, 0xf5, 0x56, 0x94, 0xad, 0x03, 0x4f, 0xd8, 0x2a, - 0x52, 0x9e, 0x13, 0x5b, 0x93, 0x94, 0x8e, 0xb0, 0x13, 0xb0, 0x78, 0xe2, 0x8c, 0x76, 0x8d, 0x9a, - 0x10, 0xe1, 0xbf, 0x6b, 0xa7, 0x31, 0xcf, 0xc7, 0x99, 0xa4, 0xbf, 0x44, 0xbb, 0x3a, 0x99, 0xd4, - 0xe9, 0x8a, 0xdc, 0x02, 0x41, 0x3b, 0x70, 0x7c, 0x1d, 0xe0, 0x79, 0xe8, 0xb8, 0x5a, 0x77, 0xba, - 0xe5, 0x21, 0xdc, 0x4f, 0x0e, 0x58, 0x78, 0x36, 0x90, 0xf9, 0xe9, 0x6a, 0x31, 0xbc, 0xaa, 0xd2, - 0x65, 0xa7, 0xee, 0x49, 0x93, 0x2d, 0x82, 0x7b, 0x50, 0x8e, 0xa7, 0xa7, 0xb8, 0xa6, 0xe4, 0xb8, - 0xb3, 0x85, 0xa6, 0xb0, 0xb6, 0xb3, 0x45, 0x24, 0x8c, 0x89, 0xb7, 0xb6, 0xaa, 0x30, 0xc6, 0x4f, - 0xa8, 0x88, 0xde, 0x3c, 0xdb, 0x92, 0xaa, 0x0d, 0x9d, 0x1a, 0x20, 0x37, 0x10, 0x9d, 0x59, 0xd4, - 0xca, 0xd6, 0xe8, 0x41, 0x45, 0x86, 0xb8, 0x22, 0xe2, 0x71, 0x99, 0xc9, 0x3d, 0x24, 0xb7, 0x20, - 0x87, 0x5f, 0x2b, 0x5a, 0x73, 0x39, 0x64, 0x80, 0x31, 0x36, 0xb1, 0x7e, 0xe8, 0x69, 0xa7, 0x6f, - 0x8e, 0x83, 0xf1, 0x67, 0xeb, 0xa0, 0x66, 0x0f, 0x98, 0x32, 0xd3, 0x95, 0x54, 0xa2, 0x19, 0x09, - 0xa0, 0x1b, 0x61, 0xf1, 0x98, 0xc8, 0xe1, 0x87, 0x4d, 0x90, 0x24, 0x03, 0x10, 0xc4, 0xb6, 0x4d, - 0x3b, 0x04, 0x63, 0x09, 0x87, 0x5f, 0xe5, 0xdc, 0x6a, 0xc8, 0xf3, 0x34, 0x88, 0x74, 0x69, 0x49, - 0x6d, 0xf0, 0x09, 0x87, 0x0d, 0x71, 0x21, 0xc1, 0x91, 0xac, 0x42, 0x03, 0x76, 0xfb, 0xb8, 0x72, - 0xb3, 0x38, 0xde, 0xb5, 0xd3, 0x66, 0xf2, 0xab, 0x90, 0xf8, 0x48, 0x59, 0x00, 0x5f, 0x5f, 0xb9, - 0x72, 0xd2, 0x05, 0x27, 0x98, 0x27, 0x90, 0x47, 0x61, 0x1a, 0x45, 0x05, 0x2a, 0xb2, 0x50, 0xe7, - 0x5f, 0x51, 0x4c, 0x0a, 0x5f, 0x0d, 0xd0, 0x4c, 0x9c, 0x99, 0x3f, 0x83, 0xf9, 0xf9, 0x57, 0x9b, - 0x32, 0x51, 0x3f, 0x21, 0x07, 0x3a, 0x92, 0xaa, 0xbb, 0x81, 0xbe, 0xc9, 0x34, 0x4d, 0x56, 0xc8, - 0x71, 0xa5, 0x95, 0xfa, 0x4b, 0x6c, 0xa0, 0xa9, 0x44, 0x11, 0x07, 0x4a, 0x51, 0x93, 0x0d, 0x2d, - 0x15, 0x6a, 0x1b, 0x44, 0xf5, 0xa5, 0xf9, 0x57, 0x58, 0x1f, 0x06, 0xb4, 0xfc, 0x59, 0x75, 0x6c, - 0x01, 0xb9, 0x10, 0xa2, 0x51, 0xa4, 0xd7, 0x65, 0x0a, 0x5e, 0x9e, 0x5c, 0xa9, 0x2a, 0x2e, 0x74, - 0x78, 0x18, 0xa9, 0x36, 0xe8, 0x8d, 0x67, 0xef, 0x29, 0x38, 0x28, 0xe4, 0xbf, 0xbe, 0x18, 0xc2, - 0xd7, 0x97, 0xd1, 0xca, 0x72, 0x0c, 0xa9, 0x09, 0xaa, 0x7a, 0x78, 0xa8, 0x65, 0x3f, 0x3e, 0xd0, - 0x46, 0xbc, 0x6a, 0x6a, 0x50, 0x47, 0x9d, 0xad, 0x50, 0x2f, 0x58, 0xa9, 0xb4, 0xec, 0x1a, 0xfe, - 0x74, 0x14, 0x83, 0x54, 0x0a, 0x9f, 0xe6, 0x45, 0xda, 0x8d, 0x94, 0x16, 0xfd, 0x26, 0x2b, 0x62, - 0x50, 0x4f, 0xd5, 0x46, 0x7e, 0x05, 0x78, 0xf4, 0xc4, 0x4e, 0xa1, 0x4a, 0xf5, 0xed, 0xb0, 0x32, - 0x89, 0xc3, 0x5e, 0xd1, 0x2d, 0xa4, 0x87, 0xf9, 0xd7, 0x3e, 0x91, 0x6c, 0x77, 0xb6, 0xac, 0x0a, - 0x54, 0x23, 0x52, 0xbf, 0x14, 0x48, 0x7d, 0x9b, 0xa8, 0x73, 0xc0, 0xf5, 0x6c, 0xc1, 0x96, 0x28, - 0xef, 0xc5, 0x9f, 0x21, 0xb6, 0x0c, 0x3a, 0xb2, 0x36, 0xa3, 0x31, 0x28, 0x60, 0x2c, 0xc1, 0x1c, - 0xd9, 0x38, 0xb5, 0x16, 0xa0, 0x0e, 0xd7, 0x81, 0x5a, 0x8f, 0xe7, 0x28, 0x36, 0x4c, 0xc8, 0x16, - 0x51, 0x7b, 0xc4, 0xf1, 0xc6, 0x99, 0x43, 0xeb, 0x68, 0xfe, 0x6f, 0xd0, 0xf4, 0xba, 0x36, 0xe8, - 0xf9, 0x4e, 0x82, 0x2d, 0xdf, 0x59, 0xd7, 0x36, 0x07, 0xb3, 0x60, 0x89, 0x06, 0x1c, 0x74, 0xee, - 0x9a, 0xb3, 0xf7, 0x79, 0x53, 0xc0, 0x28, 0xe6, 0xbe, 0x46, 0x87, 0x5a, 0xbc, 0x6f, 0x2e, 0xe6, - 0x11, 0x69, 0x5e, 0xcb, 0x45, 0x31, 0xcc, 0x25, 0x03, 0xa1, 0xea, 0xa1, 0xb4, 0xc0, 0x16, 0x11, - 0x8d, 0x77, 0x70, 0x12, 0x61, 0x50, 0x41, 0x50, 0xc6, 0x02, 0xff, 0x9e, 0x89, 0x27, 0xfa, 0x4d, - 0x7a, 0x74, 0x37, 0xf3, 0x25, 0xc9, 0xb7, 0x6f, 0x8b, 0x86, 0x24, 0xd9, 0x31, 0xf5, 0xa1, 0x4b, - 0xe8, 0x32, 0xa4, 0x4e, 0x0b, 0xba, 0x36, 0x90, 0x17, 0x30, 0x4e, 0x84, 0x4f, 0x5e, 0x77, 0x2b, - 0x91, 0x25, 0x11, 0xb2, 0x9a, 0x62, 0x4b, 0xc7, 0x63, 0xf8, 0x4b, 0x6c, 0x38, 0x64, 0xfd, 0xc6, - 0x87, 0xe2, 0x77, 0xd1, 0x6b, 0x29, 0x87, 0x4d, 0x31, 0xc1, 0x1a, 0x60, 0x3d, 0x6a, 0xe1, 0x00, - 0x43, 0xc1, 0xe1, 0xc7, 0xeb, 0x87, 0xba, 0x87, 0x6b, 0x4c, 0xb2, 0xb7, 0x7a, 0xd8, 0x29, 0x8c, - 0xe9, 0xa8, 0x8a, 0x2a, 0xe9, 0x09, 0x5f, 0x45, 0x11, 0x30, 0x23, 0x00, 0x3d, 0xf1, 0xf3, 0xaf, - 0xbd, 0xbf, 0x03, 0xe2, 0xab, 0xd8, 0x15, 0x01, 0x86, 0xfc, 0xf7, 0x60, 0x88, 0xa0, 0xc4, 0x7d, - 0x1d, 0xff, 0x2d, 0x18, 0xdd, 0x2e, 0xc2, 0x78, 0xf9, 0x6b, 0x30, 0xba, 0xdd, 0x4a, 0x37, 0xdb, - 0xf5, 0xc0, 0x24, 0x40, 0xda, 0x0a, 0x5f, 0x15, 0x59, 0x95, 0x29, 0xc8, 0xb1, 0x2c, 0xe9, 0xff, - 0x4f, 0x20, 0xaa, 0x05, 0x22, 0x22, 0x44, 0x0f, 0x96, 0x3c, 0x94, 0x91, 0xc1, 0x79, 0x94, 0x5b, - 0x58, 0x49, 0xf7, 0x2b, 0x79, 0x6a, 0x8c, 0xcc, 0xc4, 0xd5, 0xf4, 0x98, 0xe7, 0x97, 0xf5, 0x15, - 0x9f, 0xcf, 0xe3, 0x3a, 0xc2, 0xbf, 0x5c, 0x44, 0xd6, 0xa1, 0xd7, 0xce, 0x23, 0x2c, 0x74, 0xe5, - 0x85, 0xd8, 0x12, 0x7a, 0x3f, 0x64, 0x4d, 0x47, 0x27, 0x4a, 0x3a, 0x07, 0xda, 0x00, 0x2a, 0x95, - 0x82, 0xef, 0x56, 0x09, 0x52, 0x42, 0xde, 0x97, 0x45, 0x85, 0x5a, 0x1f, 0xec, 0x2b, 0x62, 0xcc, - 0x81, 0x7d, 0x5b, 0x43, 0x37, 0x32, 0x74, 0xaa, 0x87, 0x84, 0x4a, 0xd2, 0x47, 0x9d, 0x84, 0xb8, - 0x45, 0x9a, 0x55, 0x9e, 0x85, 0x25, 0xdf, 0x3c, 0x14, 0x1e, 0x44, 0xa3, 0x83, 0x7e, 0xce, 0x7c, - 0x3f, 0x19, 0x3a, 0x06, 0x24, 0x48, 0x53, 0x08, 0x5b, 0x68, 0x61, 0x2f, 0x96, 0x37, 0x72, 0xb1, - 0xbe, 0xde, 0x89, 0x18, 0x31, 0xf6, 0x62, 0xe2, 0xd5, 0x5b, 0xa7, 0xcb, 0x6d, 0xfb, 0x7c, 0x2b, - 0x17, 0x62, 0xfc, 0xcb, 0x5d, 0xac, 0xd5, 0xfc, 0x3e, 0x7a, 0x06, 0xad, 0x3d, 0x34, 0x0c, 0x2a, - 0xd9, 0xa0, 0x51, 0xe5, 0x65, 0x85, 0xd5, 0x42, 0x99, 0xe2, 0x5a, 0x3f, 0x12, 0xea, 0xee, 0x9f, - 0x68, 0xc5, 0xed, 0x0f, 0x07, 0x60, 0xd5, 0x32, 0x83, 0x03, 0x35, 0x10, 0xe0, 0x72, 0x9a, 0x9a, - 0xc0, 0x25, 0xe3, 0xb7, 0x93, 0x0b, 0x31, 0x5f, 0x71, 0x59, 0xfc, 0xa3, 0x15, 0xb3, 0x4c, 0x5b, - 0xdd, 0x25, 0x7f, 0xcd, 0xba, 0x29, 0x08, 0x59, 0x56, 0x68, 0x54, 0xac, 0xea, 0x32, 0x3a, 0x48, - 0xe9, 0x8f, 0xf7, 0x71, 0xb1, 0x56, 0xdf, 0x03, 0xf6, 0xf3, 0x01, 0xd8, 0xd5, 0x58, 0x08, 0x2d, - 0x94, 0xbf, 0x89, 0x8b, 0x95, 0xea, 0x26, 0x6a, 0x58, 0xeb, 0xe9, 0xe6, 0x4f, 0xa6, 0xea, 0x5d, - 0x28, 0x9f, 0x1e, 0x66, 0x16, 0x7a, 0x73, 0x69, 0x13, 0x87, 0xb8, 0x20, 0x6e, 0x74, 0xcd, 0x71, - 0x67, 0x21, 0xb5, 0x21, 0x97, 0x2d, 0x86, 0xf4, 0xdc, 0xad, 0x69, 0x8d, 0x59, 0x9f, 0x8b, 0x94, - 0x89, 0xb7, 0x8e, 0x7d, 0xf4, 0x54, 0x22, 0x8a, 0x0e, 0xfe, 0x47, 0x31, 0x86, 0x7e, 0xed, 0xa0, - 0x8e, 0xef, 0x1b, 0x03, 0x32, 0x88, 0x7b, 0xa8, 0x99, 0x39, 0x12, 0xe9, 0x4e, 0x08, 0x23, 0x7e, - 0xe1, 0xe8, 0xba, 0xff, 0xda, 0x21, 0x3d, 0x1a, 0x2a, 0xba, 0x4a, 0xf0, 0xe7, 0xa8, 0x46, 0x47, - 0xb9, 0xbf, 0xe0, 0x85, 0x6a, 0x0a, 0x5f, 0xed, 0x9e, 0xcc, 0x12, 0x46, 0xec, 0x0b, 0x39, 0xb9, - 0xc0, 0xc4, 0x4c, 0x14, 0x74, 0xba, 0xaf, 0x06, 0x09, 0xbe, 0xf6, 0x82, 0x92, 0x51, 0xb6, 0x35, - 0x5a, 0x98, 0x39, 0x70, 0x98, 0xfb, 0x6a, 0xc9, 0x57, 0x20, 0x0f, 0x5c, 0x28, 0xca, 0xda, 0x0c, - 0xeb, 0x21, 0xa0, 0x93, 0x3b, 0xfa, 0xa2, 0x33, 0x0e, 0xe9, 0xa1, 0xe6, 0x11, 0x71, 0x40, 0xa3, - 0x82, 0x88, 0x0a, 0x4a, 0x48, 0xd7, 0x0c, 0xa5, 0x47, 0x70, 0x1d, 0xf3, 0xf9, 0xbe, 0x67, 0x61, - 0xc7, 0x1d, 0x55, 0x4b, 0x6c, 0x84, 0x91, 0x48, 0x76, 0xd5, 0x4a, 0x88, 0x92, 0x3c, 0x62, 0x35, - 0x24, 0x07, 0xb6, 0xd4, 0xa1, 0xe7, 0xf6, 0x46, 0xbf, 0x94, 0x3f, 0x5d, 0xd8, 0x15, 0x0c, 0x63, - 0xdc, 0x5a, 0x62, 0xfa, 0x8b, 0x0d, 0x8c, 0xe5, 0x05, 0x92, 0x57, 0x93, 0xa2, 0x00, 0xff, 0xf1, - 0x0b, 0xeb, 0x4a, 0xd1, 0x35, 0x8b, 0x99, 0xd4, 0xd1, 0xa4, 0x98, 0xff, 0x3a, 0xe2, 0x57, 0xa5, - 0x0e, 0x6d, 0xc4, 0xdf, 0x47, 0x3e, 0xac, 0x40, 0x3d, 0x5b, 0x31, 0x6e, 0x74, 0x78, 0x03, 0x88, - 0xad, 0x89, 0xe3, 0xeb, 0xf1, 0xb9, 0x85, 0xba, 0x57, 0x08, 0x71, 0xf6, 0xb0, 0xad, 0x04, 0xcb, - 0xb2, 0x3b, 0xd9, 0x45, 0xb3, 0xc1, 0x92, 0x74, 0xf8, 0x5e, 0xdf, 0x74, 0xee, 0x9d, 0xa6, 0x73, - 0xbc, 0x07, 0x86, 0xf5, 0xdf, 0x07, 0xf6, 0xd1, 0x68, 0xf2, 0xfc, 0x7b, 0xb3, 0xc8, 0x46, 0x43, - 0x7d, 0xa6, 0x1e, 0xb5, 0x2e, 0x94, 0xd8, 0x95, 0xde, 0xcf, 0x95, 0x7a, 0xc6, 0x3c, 0xfd, 0xaa, - 0x38, 0x3e, 0x59, 0xe6, 0x96, 0xd8, 0x61, 0x36, 0xec, 0xbd, 0x89, 0xe8, 0x27, 0x3e, 0xd9, 0x2e, - 0x70, 0x48, 0x9f, 0xc3, 0xd3, 0x96, 0xa3, 0x5e, 0x5f, 0x80, 0x2f, 0x07, 0x2b, 0x26, 0x54, 0xba, - 0x14, 0x2f, 0x5d, 0x0a, 0x5a, 0x5f, 0x31, 0x5e, 0xd0, 0xa8, 0x58, 0xb0, 0xf4, 0xec, 0xf3, 0x8b, - 0xa2, 0x1b, 0x91, 0x19, 0x06, 0x30, 0x4e, 0x62, 0xff, 0x14, 0x42, 0x49, 0x48, 0x86, 0x3f, 0x67, - 0x9f, 0x54, 0xab, 0x7c, 0x8f, 0xde, 0x52, 0xc7, 0xde, 0x71, 0x07, 0x55, 0x16, 0x54, 0x85, 0x9b, - 0x2a, 0xfe, 0x9f, 0x18, 0x5f, 0xe8, 0x21, 0x2d, 0x6c, 0xd9, 0x3b, 0x9c, 0x73, 0xea, 0x8b, 0x4d, - 0x27, 0x86, 0x48, 0x6a, 0x40, 0xad, 0x90, 0xc6, 0x38, 0xa0, 0xae, 0x46, 0x74, 0x95, 0xed, 0x48, - 0xae, 0xcc, 0x59, 0x95, 0x38, 0xaf, 0xd5, 0xd8, 0x96, 0x64, 0x14, 0xc1, 0xc1, 0xf0, 0xe5, 0x55, - 0x98, 0xac, 0x75, 0x4d, 0x65, 0xe8, 0x2c, 0xe1, 0x93, 0x25, 0xaf, 0x82, 0x52, 0x5a, 0x09, 0x25, - 0x90, 0x08, 0x9a, 0x61, 0xe0, 0xd6, 0xa8, 0x05, 0x94, 0xcc, 0x1c, 0xce, 0xc2, 0x7b, 0xa5, 0x01, - 0x25, 0xd1, 0xd2, 0xeb, 0x14, 0xc4, 0x79, 0xda, 0xd2, 0x42, 0x1e, 0x93, 0x88, 0x11, 0x18, 0x58, - 0x5a, 0x81, 0xff, 0x8e, 0xed, 0xd1, 0x88, 0x89, 0x6c, 0x4c, 0x6b, 0x2e, 0x45, 0x95, 0x86, 0x65, - 0x9f, 0x60, 0x94, 0x5e, 0x00, 0x61, 0xe9, 0x09, 0x70, 0x9a, 0xb5, 0x82, 0x9a, 0x84, 0x5d, 0xdd, - 0x0b, 0xc7, 0x7e, 0xc0, 0x8f, 0x0a, 0x0b, 0xca, 0x29, 0x46, 0xf8, 0x11, 0x82, 0xdd, 0x1a, 0x7b, - 0x80, 0xfd, 0x2d, 0x01, 0x6b, 0x12, 0x82, 0x16, 0x5a, 0xcc, 0x21, 0x6a, 0xf1, 0x00, 0x33, 0xd3, - 0x7b, 0x01, 0x0d, 0x56, 0xa7, 0x40, 0x7b, 0xfa, 0xd1, 0x86, 0x54, 0x69, 0xe5, 0x86, 0x54, 0x69, - 0xe5, 0x86, 0x54, 0x69, 0xd5, 0x86, 0x14, 0xcc, 0x7e, 0xda, 0x72, 0x5c, 0x67, 0xb6, 0xb4, 0xb2, - 0x16, 0x2b, 0x04, 0x4a, 0x8c, 0xed, 0xd9, 0x07, 0xdb, 0x86, 0x74, 0x1f, 0x61, 0xb6, 0x62, 0x7b, - 0xa0, 0x4f, 0x94, 0x17, 0x21, 0x8d, 0xcb, 0xd0, 0x5c, 0xed, 0xa7, 0x5a, 0x36, 0xbd, 0x62, 0x42, - 0x73, 0x69, 0x5a, 0xc1, 0x8c, 0x53, 0xfa, 0x2f, 0x7a, 0xd8, 0x7e, 0x43, 0xba, 0xd9, 0xa2, 0x3b, - 0x69, 0xb4, 0x41, 0xa6, 0xaf, 0x79, 0xcd, 0xb2, 0x1f, 0x2b, 0x88, 0x6d, 0x61, 0x34, 0xc5, 0x5a, - 0xf4, 0xa6, 0xc5, 0x5f, 0xd8, 0xa2, 0x07, 0x15, 0x50, 0xe2, 0x0f, 0x05, 0x1f, 0xd7, 0x92, 0x6f, - 0xdc, 0x63, 0xf0, 0x97, 0x64, 0x09, 0x88, 0xa7, 0x50, 0x53, 0x3e, 0x3b, 0x2e, 0x2c, 0x28, 0xbe, - 0xb0, 0x4a, 0x4d, 0x0e, 0xf5, 0x34, 0xa8, 0x53, 0x0c, 0xf9, 0x78, 0x96, 0x65, 0x89, 0x18, 0x20, - 0x8d, 0x49, 0x3e, 0x86, 0xad, 0xff, 0x0e, 0xc1, 0x79, 0x47, 0xb0, 0x47, 0xd0, 0x5d, 0xa3, 0xcf, - 0x44, 0xfd, 0x54, 0xdd, 0x12, 0x1f, 0xea, 0x6a, 0x4d, 0xea, 0x02, 0xda, 0x43, 0xa8, 0x65, 0x09, - 0x81, 0xbf, 0x88, 0xe3, 0x56, 0xf8, 0x8b, 0xa2, 0x6a, 0xe4, 0xfb, 0xfd, 0x88, 0x34, 0x10, 0x2f, - 0x15, 0x6f, 0xd5, 0x07, 0xec, 0x89, 0x62, 0x06, 0x39, 0x0e, 0x6b, 0x46, 0xe7, 0xb6, 0xea, 0x91, - 0xde, 0x02, 0xc5, 0xc5, 0xc5, 0xaa, 0xce, 0x2e, 0x0c, 0x99, 0xda, 0x3a, 0xf1, 0xe4, 0x11, 0x58, - 0x02, 0xac, 0x7e, 0xfa, 0x27, 0xae, 0x50, 0xdc, 0x6c, 0xd3, 0xa5, 0xfb, 0xad, 0x45, 0x95, 0xf4, - 0x78, 0xaa, 0xe7, 0xaf, 0xcb, 0x5b, 0x93, 0xee, 0x11, 0x52, 0x62, 0x69, 0xa4, 0x9e, 0xbd, 0x17, - 0x52, 0xb9, 0xe8, 0x33, 0x1d, 0x11, 0x98, 0x5c, 0xc1, 0xce, 0x88, 0xbf, 0x57, 0x5e, 0xfa, 0xbc, - 0x65, 0x06, 0x8a, 0x7d, 0x68, 0x4b, 0x39, 0x9b, 0x5f, 0xda, 0x3e, 0x45, 0x66, 0x4c, 0x6d, 0xa1, - 0x75, 0xfb, 0x78, 0x4c, 0xf9, 0x7e, 0x57, 0x08, 0x17, 0x1d, 0xbf, 0x6b, 0x54, 0x6d, 0xa7, 0x1f, - 0xb9, 0x15, 0x2a, 0x7b, 0x44, 0xa3, 0xa1, 0x3b, 0x6c, 0xba, 0xe3, 0x1e, 0xcd, 0x3e, 0x8a, 0x15, - 0x09, 0x69, 0x91, 0x81, 0x5a, 0xec, 0xa9, 0xd7, 0x31, 0x65, 0x5d, 0x0c, 0x29, 0x64, 0xeb, 0xb8, - 0xda, 0x3b, 0x2b, 0x3d, 0xac, 0x9a, 0xb0, 0xc0, 0xad, 0x88, 0x23, 0x35, 0xac, 0x86, 0xb3, 0xee, - 0x33, 0xbd, 0x80, 0xa8, 0xab, 0x04, 0x7a, 0x91, 0x67, 0xc3, 0xfb, 0x20, 0xca, 0x04, 0x4a, 0xf8, - 0x3b, 0xa9, 0x21, 0xb3, 0x7f, 0xb5, 0x8e, 0x1a, 0x88, 0x26, 0x8a, 0x5d, 0x10, 0x1f, 0xc5, 0xa8, - 0xb4, 0x45, 0x42, 0x61, 0x20, 0x31, 0x38, 0x65, 0x36, 0xee, 0x6b, 0x2e, 0x01, 0x2d, 0x40, 0xa2, - 0xc2, 0x1e, 0xcd, 0xb8, 0x25, 0x61, 0x81, 0x65, 0x2d, 0x9b, 0x8c, 0x56, 0xb8, 0x1c, 0x2a, 0x61, - 0x77, 0x5c, 0xb0, 0xda, 0x63, 0x3c, 0x75, 0x9e, 0x56, 0x55, 0x7f, 0x63, 0x32, 0x62, 0x50, 0xae, - 0xa8, 0xea, 0x93, 0x13, 0x32, 0xcc, 0x60, 0xf3, 0x72, 0xa1, 0xf1, 0x8a, 0x9f, 0x34, 0xbf, 0x17, - 0x48, 0xc8, 0x2e, 0x34, 0xc8, 0xad, 0xc0, 0x6b, 0xfd, 0x47, 0xf6, 0x77, 0xa8, 0xf7, 0x1f, 0x1a, - 0xdf, 0xe9, 0x6e, 0x78, 0x6f, 0xc9, 0x81, 0xe9, 0x79, 0x99, 0x7a, 0x82, 0x66, 0x31, 0x9a, 0x95, - 0xbe, 0x01, 0xba, 0x09, 0x02, 0xb4, 0x22, 0xd9, 0x4a, 0x9f, 0xd9, 0x24, 0x1f, 0x79, 0xdd, 0xe9, - 0x3a, 0x5d, 0xe5, 0x38, 0x0f, 0xc9, 0x9c, 0xb0, 0x28, 0x0a, 0x21, 0x01, 0x35, 0x8e, 0x48, 0x78, - 0x0f, 0x9e, 0xfb, 0x5b, 0xd7, 0x6a, 0x64, 0xc6, 0x82, 0x2e, 0x30, 0x53, 0x89, 0xf1, 0x8a, 0xe8, - 0xd2, 0x5c, 0xdf, 0x4e, 0x5c, 0xd1, 0xa5, 0xd8, 0x8a, 0x2e, 0xc5, 0x0f, 0xc3, 0x02, 0xc2, 0xab, - 0xaf, 0x50, 0xf1, 0xe2, 0x27, 0x0b, 0x95, 0x88, 0xb2, 0xe7, 0x3b, 0x06, 0xe2, 0xd1, 0x37, 0x2b, - 0xac, 0xf6, 0xbf, 0x64, 0x8d, 0x16, 0xf8, 0x95, 0x43, 0x59, 0xd2, 0xdb, 0x97, 0x45, 0xf0, 0xca, - 0x6a, 0xcc, 0xa4, 0x5d, 0x99, 0x65, 0x98, 0x6e, 0xb2, 0x06, 0xe8, 0x51, 0x48, 0xdf, 0xd4, 0xb1, - 0xef, 0xe8, 0x0c, 0x36, 0xf8, 0xf7, 0x4c, 0x38, 0x98, 0x4d, 0x01, 0xf8, 0xf9, 0xb2, 0x22, 0xb6, - 0x8a, 0x78, 0x83, 0x40, 0xc8, 0x55, 0xb9, 0x9e, 0xa3, 0x31, 0xe6, 0x4e, 0x5d, 0x59, 0x90, 0xf9, - 0xd4, 0x96, 0xb9, 0x97, 0x23, 0x2f, 0x76, 0xb5, 0xd2, 0xb9, 0x65, 0x3b, 0x6f, 0x3d, 0xb4, 0xf5, - 0x1c, 0xd1, 0x91, 0xfb, 0xfc, 0xfc, 0xdf, 0x03, 0xa2, 0x6a, 0x52, 0x02, 0xf0, 0x93, 0x90, 0x74, - 0x3d, 0x21, 0x19, 0x6a, 0x22, 0x49, 0x6b, 0x50, 0x32, 0xe5, 0x67, 0x21, 0xdf, 0x17, 0x83, 0x94, - 0x5a, 0xe1, 0x59, 0x7f, 0xdf, 0xab, 0xee, 0xb7, 0x11, 0xc0, 0x5f, 0x6c, 0x27, 0xe6, 0xf3, 0xe8, - 0xb6, 0x9c, 0x45, 0x81, 0x45, 0x18, 0xc1, 0x3b, 0x95, 0x8b, 0x68, 0x41, 0xf0, 0x5e, 0x6a, 0x10, - 0x94, 0x94, 0x2f, 0x17, 0x10, 0xe4, 0x62, 0x0f, 0xd6, 0xdf, 0x36, 0xa5, 0x5e, 0x2f, 0x6f, 0x59, - 0x14, 0x3f, 0xd8, 0x58, 0x65, 0xb1, 0x78, 0xef, 0xb5, 0x8d, 0x8e, 0x20, 0xe8, 0x78, 0x28, 0xf8, - 0xc9, 0x03, 0x5d, 0x4a, 0x97, 0xfe, 0x19, 0x59, 0x5c, 0x5e, 0x9c, 0xdd, 0x0a, 0x68, 0x41, 0x9f, - 0x8b, 0x85, 0xec, 0x62, 0x24, 0x41, 0x1b, 0x65, 0x14, 0xe3, 0x2b, 0xdb, 0x28, 0xa4, 0x73, 0x9f, - 0x6d, 0x63, 0x09, 0x5a, 0xc8, 0xf5, 0x88, 0x08, 0x5e, 0x58, 0x6b, 0x0b, 0xf7, 0x63, 0x88, 0xf1, - 0x88, 0x21, 0x6b, 0x8e, 0x79, 0x25, 0xd9, 0xac, 0xe0, 0x01, 0x63, 0x7a, 0xae, 0x38, 0xf1, 0x3d, - 0xe3, 0xdd, 0xbe, 0x80, 0x91, 0xbd, 0xf0, 0x05, 0x48, 0x4c, 0x68, 0x6a, 0x83, 0x53, 0x46, 0x5c, - 0x42, 0xd1, 0x25, 0xc7, 0x69, 0x70, 0x5e, 0x64, 0x0f, 0xb7, 0x8d, 0x67, 0xa0, 0xa1, 0xcb, 0x09, - 0x3c, 0xc1, 0x9f, 0xb8, 0x3d, 0x4a, 0xa7, 0xd3, 0xdf, 0x33, 0x50, 0x7e, 0x3b, 0xb1, 0xf1, 0xdd, - 0x30, 0xbd, 0x03, 0xcb, 0x14, 0x40, 0xac, 0x62, 0x82, 0xb6, 0x05, 0xbf, 0x7d, 0x9a, 0xe2, 0xb6, - 0x37, 0x3a, 0xa6, 0x6d, 0x4f, 0x05, 0x1f, 0x54, 0xc2, 0x20, 0x44, 0x75, 0x12, 0xc7, 0xd2, 0x48, - 0xea, 0x50, 0x38, 0x5f, 0x18, 0xe4, 0xef, 0x99, 0x00, 0xf0, 0xa2, 0x6b, 0x72, 0x8f, 0xdb, 0xf6, - 0x1a, 0xa6, 0x69, 0x1b, 0x5e, 0x73, 0x5e, 0xa8, 0x27, 0x47, 0x0b, 0xc1, 0xe8, 0x39, 0x2f, 0xdf, - 0xcb, 0xc6, 0xf8, 0xb3, 0xe5, 0x54, 0xa0, 0x2a, 0xac, 0x87, 0xa9, 0x6c, 0x92, 0x12, 0x1b, 0xb4, - 0x0d, 0xfa, 0x7c, 0x69, 0x8e, 0x11, 0x9e, 0x69, 0x28, 0x3a, 0x9e, 0xf4, 0x07, 0xa0, 0xbd, 0x9e, - 0x4e, 0x68, 0x6a, 0x92, 0x87, 0x4e, 0x68, 0x3e, 0x14, 0x1a, 0xf5, 0xc9, 0x6d, 0x6f, 0x7e, 0x9d, - 0x10, 0xb1, 0xd2, 0xad, 0x7f, 0xcf, 0x68, 0xdb, 0xdf, 0xad, 0xa0, 0x63, 0x41, 0x28, 0x15, 0xb7, - 0x4d, 0xeb, 0x7e, 0xcf, 0x58, 0x30, 0x00, 0xd6, 0xc4, 0xa2, 0xdd, 0x45, 0xb3, 0x47, 0x5c, 0x62, - 0x23, 0xd6, 0xe6, 0x11, 0xd0, 0xfa, 0xfa, 0x26, 0x4b, 0x25, 0xbf, 0xc9, 0xe5, 0x16, 0xb1, 0xe6, - 0xc6, 0x47, 0x2d, 0x9e, 0xe3, 0x02, 0x5a, 0x1a, 0x28, 0x4d, 0x5d, 0xd9, 0xea, 0x06, 0x36, 0x9b, - 0xcb, 0xa9, 0xeb, 0x9b, 0xa5, 0x75, 0x23, 0xcd, 0xfa, 0x53, 0xe6, 0xa3, 0xd9, 0x6f, 0xec, 0xdb, - 0x18, 0xe4, 0xa2, 0x39, 0x4e, 0x83, 0xdc, 0xa3, 0xde, 0xe2, 0x34, 0xbb, 0x1a, 0x23, 0xe3, 0x10, - 0x17, 0x63, 0x7a, 0x1d, 0xee, 0xdb, 0x9a, 0x51, 0x4b, 0xb9, 0x77, 0x10, 0xdd, 0x32, 0x8d, 0xae, - 0xd6, 0xfb, 0x68, 0xdc, 0xad, 0xcb, 0xf0, 0xa0, 0x7b, 0x7a, 0xeb, 0x92, 0x0d, 0x77, 0x63, 0x45, - 0x7b, 0x39, 0x39, 0xbf, 0x7e, 0xb8, 0xfb, 0x13, 0x0b, 0x16, 0x6c, 0xac, 0xb9, 0x30, 0x8d, 0xd2, - 0x36, 0xd9, 0x02, 0x45, 0x5a, 0x0b, 0x60, 0xd0, 0xfa, 0x89, 0xbe, 0xca, 0x6d, 0x1f, 0xe8, 0x26, - 0x6e, 0x1d, 0xcb, 0xb6, 0x7f, 0x43, 0x04, 0x42, 0x8b, 0xd0, 0xaa, 0xa6, 0x63, 0x55, 0x2d, 0x18, - 0x2e, 0xed, 0x5c, 0x22, 0x14, 0xf3, 0x1a, 0x1d, 0xcc, 0x0d, 0xde, 0x6b, 0x82, 0xe3, 0xa1, 0xbd, - 0x97, 0x18, 0x8d, 0x44, 0x97, 0xcc, 0x42, 0x3a, 0x24, 0x3c, 0xe0, 0x28, 0x7d, 0x29, 0x82, 0x58, - 0xd6, 0xae, 0xad, 0x51, 0xa0, 0xf4, 0x5e, 0x08, 0x48, 0x24, 0x2e, 0xa4, 0x00, 0x4c, 0x9c, 0x3e, - 0x5a, 0xb6, 0xc1, 0xb1, 0x6b, 0x22, 0x6e, 0x6c, 0x49, 0xd3, 0x93, 0x6e, 0x5f, 0x73, 0x20, 0x13, - 0xd8, 0x56, 0x83, 0xcb, 0x15, 0x8b, 0xf0, 0xa4, 0x19, 0x0d, 0x2e, 0xcb, 0x25, 0xc2, 0xd7, 0x33, - 0x80, 0xfe, 0xa0, 0x0f, 0xe1, 0x57, 0x36, 0x57, 0xe1, 0x56, 0xf6, 0xc7, 0x63, 0x70, 0x8b, 0x55, - 0xee, 0x7d, 0x31, 0xd1, 0x95, 0x88, 0x94, 0x65, 0x42, 0x07, 0x8b, 0xb2, 0x5c, 0x64, 0x46, 0xd1, - 0x5a, 0xa1, 0x59, 0xf0, 0x6a, 0x06, 0xe1, 0x9f, 0xcb, 0x1c, 0xc2, 0x53, 0x70, 0xb9, 0xf0, 0xb4, - 0x5d, 0x0d, 0x01, 0xa3, 0xc8, 0xfb, 0x02, 0x8e, 0xc8, 0x34, 0x89, 0x55, 0xf3, 0xc8, 0x6d, 0xd3, - 0xd2, 0x09, 0x2c, 0xbe, 0x98, 0x3f, 0x84, 0x62, 0xbd, 0x02, 0x82, 0x37, 0x56, 0x74, 0x8a, 0x36, - 0xd1, 0xea, 0x7c, 0x0a, 0x78, 0x87, 0xea, 0x5f, 0x54, 0xd5, 0xa1, 0xd0, 0x37, 0x02, 0x08, 0xaf, - 0x8a, 0xb3, 0x35, 0x5e, 0x01, 0x23, 0x34, 0x3c, 0x28, 0xb2, 0x20, 0x90, 0x6f, 0x56, 0x2b, 0xc9, - 0x7d, 0xed, 0x76, 0x45, 0xf8, 0xc7, 0xf1, 0xdf, 0x12, 0x1b, 0xf4, 0x42, 0x96, 0x06, 0x77, 0x4d, - 0xd4, 0x80, 0x5f, 0x2f, 0x69, 0x57, 0x36, 0x64, 0x6e, 0xaf, 0x40, 0x28, 0x85, 0xbc, 0x11, 0x07, - 0x2d, 0x79, 0xa0, 0x3d, 0xc8, 0x17, 0xde, 0xec, 0xaf, 0x03, 0xee, 0xd7, 0xd8, 0x0e, 0x84, 0xca, - 0x47, 0x7d, 0x57, 0x2a, 0x91, 0x06, 0x1e, 0x89, 0x0e, 0x76, 0x0c, 0x74, 0xe4, 0x9d, 0x16, 0x68, - 0x95, 0xcf, 0x0f, 0x01, 0x98, 0x4c, 0xb8, 0x85, 0x7b, 0xc9, 0x1e, 0x24, 0xee, 0xd1, 0x52, 0x7c, - 0x77, 0x18, 0xb4, 0xd6, 0x62, 0xae, 0x3f, 0x1a, 0x06, 0xfe, 0x0b, 0x37, 0xc2, 0xe0, 0xbf, 0x37, - 0x8a, 0xee, 0xba, 0x21, 0x24, 0x70, 0x8f, 0x64, 0x69, 0x1c, 0xa2, 0x28, 0x46, 0xa7, 0x62, 0x17, - 0x34, 0xe9, 0x97, 0x77, 0x86, 0x10, 0x9a, 0x86, 0xef, 0xb2, 0xfd, 0x99, 0xa9, 0x10, 0xc5, 0xc8, - 0x18, 0x2e, 0x35, 0xe3, 0xe5, 0xdd, 0x21, 0x88, 0xdd, 0xf5, 0xb3, 0xb0, 0xdc, 0x79, 0x06, 0x7b, - 0x23, 0xe8, 0xfd, 0x90, 0xbc, 0xdb, 0xf9, 0xee, 0xa7, 0x67, 0x18, 0x41, 0x2b, 0x95, 0x50, 0xc7, - 0x5b, 0x53, 0xc9, 0x78, 0x1f, 0x36, 0x96, 0xff, 0x2c, 0x89, 0x82, 0x2e, 0xd0, 0x8d, 0x20, 0xfe, - 0xc0, 0x26, 0xc4, 0x78, 0x0f, 0x31, 0x5e, 0x8d, 0xcf, 0xe1, 0xc6, 0x36, 0xd4, 0xc8, 0xd2, 0x05, - 0x09, 0x64, 0x0e, 0x56, 0x41, 0x5f, 0x8a, 0x3a, 0x02, 0xb3, 0x90, 0x8a, 0x19, 0x0c, 0xe9, 0x12, - 0x4c, 0xba, 0x30, 0x31, 0xf2, 0x48, 0x14, 0x7a, 0xd8, 0x41, 0x1a, 0x61, 0x25, 0x58, 0x43, 0xdb, - 0xd2, 0xc9, 0x9a, 0x70, 0x85, 0xad, 0x2c, 0xaa, 0xbc, 0x40, 0xe4, 0xd7, 0xeb, 0xb9, 0x2d, 0xe5, - 0x7a, 0xec, 0x1a, 0xa4, 0x38, 0x5f, 0x8a, 0x17, 0x63, 0x11, 0x0b, 0x5c, 0x20, 0x07, 0xa2, 0xfc, - 0x0b, 0x4b, 0x8c, 0x7c, 0xc9, 0x19, 0xc2, 0xc8, 0x1a, 0xe9, 0xb5, 0xb1, 0x10, 0x5f, 0x77, 0x41, - 0xcb, 0xa0, 0x47, 0x62, 0x0a, 0x62, 0xd0, 0x93, 0x5b, 0x18, 0x9e, 0x78, 0x87, 0xa2, 0x2c, 0x22, - 0xde, 0xd8, 0xe5, 0x48, 0xa2, 0x2f, 0xc4, 0xc0, 0x02, 0x87, 0x5e, 0x51, 0x29, 0x26, 0xae, 0x91, - 0x62, 0x58, 0xc2, 0x71, 0x89, 0xd5, 0xe0, 0x24, 0x63, 0xba, 0xb2, 0x87, 0x71, 0x79, 0xb6, 0x11, - 0x5a, 0x5a, 0x71, 0x4c, 0xbc, 0xfc, 0xa5, 0x71, 0x9e, 0x7c, 0x30, 0xce, 0x93, 0x77, 0xc6, 0xb9, - 0xe1, 0x0f, 0xb4, 0x9a, 0xf5, 0xe5, 0x75, 0x55, 0x5c, 0x33, 0xd8, 0x12, 0x18, 0x6d, 0xef, 0x0f, - 0x71, 0xe3, 0x7d, 0x7a, 0xf0, 0x62, 0x2c, 0x3e, 0x25, 0xec, 0x36, 0xae, 0x0f, 0x76, 0x13, 0xd8, - 0x65, 0x83, 0xe8, 0x4e, 0x54, 0x98, 0xda, 0x11, 0x20, 0x0c, 0x29, 0x7f, 0x84, 0xb0, 0xeb, 0x55, - 0x08, 0xf3, 0xd1, 0x83, 0x18, 0xbb, 0xee, 0xc9, 0xc9, 0x65, 0x4d, 0x06, 0x89, 0xe1, 0x03, 0x55, - 0xe6, 0x53, 0x9a, 0x4c, 0x9c, 0xb5, 0x62, 0xc7, 0x7a, 0x7f, 0x69, 0x4c, 0x8b, 0x21, 0x1d, 0x2c, - 0x96, 0xcf, 0x9f, 0x8e, 0x69, 0xed, 0x90, 0x36, 0xfe, 0xd2, 0x98, 0x16, 0x96, 0xda, 0xd2, 0x90, - 0x36, 0xfe, 0x6c, 0x4c, 0xbb, 0xcb, 0xd3, 0xb4, 0xf1, 0x77, 0xc7, 0xf4, 0x27, 0x1a, 0xe7, 0xfa, - 0x75, 0x3a, 0x66, 0x43, 0xdb, 0xf8, 0x04, 0x1d, 0x53, 0x81, 0xee, 0x13, 0xf2, 0x92, 0x52, 0x1f, - 0xc3, 0xc1, 0xc6, 0x32, 0x12, 0xee, 0xdf, 0xa3, 0xd5, 0x65, 0x96, 0xf5, 0x1f, 0xa2, 0xd6, 0x90, - 0x42, 0x8c, 0x81, 0x51, 0xef, 0x0d, 0x15, 0xb2, 0x71, 0xd3, 0xfc, 0xa3, 0xa1, 0x02, 0xed, 0xc7, - 0x87, 0xda, 0xfc, 0x60, 0xa8, 0xbb, 0x0c, 0x32, 0xb5, 0x33, 0xd2, 0x74, 0x34, 0x91, 0x51, 0x6f, - 0x7c, 0x72, 0xf2, 0x3f, 0x33, 0xea, 0x75, 0xaa, 0x7a, 0x47, 0x37, 0x5d, 0xe7, 0x53, 0xfc, 0x8b, - 0xce, 0x0b, 0x98, 0x67, 0x50, 0x1e, 0x51, 0xb1, 0x11, 0x72, 0xae, 0x38, 0x7a, 0x1c, 0x82, 0xaf, - 0x73, 0x84, 0x9d, 0x3b, 0x21, 0xa7, 0x84, 0x57, 0x78, 0x32, 0x71, 0x12, 0xb2, 0x6b, 0x84, 0xfd, - 0x03, 0x6c, 0x5b, 0x05, 0x7b, 0x85, 0x24, 0xb0, 0x9d, 0x5d, 0x36, 0x77, 0x3f, 0x55, 0x37, 0x0b, - 0x75, 0x73, 0x7f, 0xb1, 0x6e, 0x0e, 0xea, 0xe6, 0x97, 0xed, 0xde, 0x38, 0xe2, 0xbc, 0x78, 0xbc, - 0xf7, 0xa4, 0xbc, 0x17, 0xf5, 0xb6, 0x44, 0x81, 0x7e, 0xbe, 0x17, 0x02, 0xf8, 0xb9, 0x75, 0xe7, - 0x15, 0x5e, 0x22, 0xc3, 0x2e, 0xa8, 0x4d, 0x0b, 0x99, 0xc0, 0x48, 0x05, 0xdd, 0xc4, 0x5c, 0xb8, - 0x40, 0x22, 0xe4, 0x6d, 0xc6, 0xbe, 0xe3, 0x7e, 0xc4, 0x42, 0xa8, 0x7e, 0x63, 0x1b, 0x14, 0x94, - 0x0e, 0x05, 0xce, 0xa2, 0x7d, 0x46, 0x4d, 0xcc, 0x34, 0xa8, 0xef, 0x1b, 0x07, 0x12, 0xe4, 0xf3, - 0xcc, 0x68, 0x8f, 0xd8, 0xec, 0x8b, 0x8d, 0x86, 0x90, 0xc9, 0x8e, 0x89, 0x86, 0x5f, 0x85, 0x7a, - 0x58, 0xf2, 0x9e, 0x2f, 0x69, 0xa9, 0x7e, 0x68, 0x7f, 0xc4, 0x77, 0x86, 0x64, 0xbd, 0x92, 0x71, - 0x05, 0x8c, 0xf6, 0x2d, 0xc0, 0x17, 0xee, 0x5e, 0xae, 0xc5, 0xee, 0x3e, 0x98, 0x2e, 0xca, 0x27, - 0x89, 0x7b, 0x83, 0x15, 0x5e, 0x20, 0xd7, 0x53, 0x42, 0x59, 0x72, 0xc2, 0xb1, 0x08, 0x51, 0x57, - 0x0c, 0x3c, 0xec, 0xac, 0xa0, 0x1d, 0xcf, 0xe7, 0x8a, 0xac, 0xe3, 0x1b, 0x7f, 0x24, 0x18, 0x3a, - 0x14, 0x7e, 0x94, 0x39, 0xd0, 0xb4, 0x3f, 0xf5, 0x4d, 0x88, 0xff, 0x33, 0xbe, 0x89, 0x65, 0x8c, - 0xe1, 0xa6, 0x11, 0xee, 0x1a, 0x4f, 0x3f, 0xc0, 0x5a, 0xd8, 0x35, 0xd8, 0xd3, 0x4f, 0x71, 0x3e, - 0x1c, 0xdf, 0xc9, 0x53, 0x10, 0xab, 0x21, 0x27, 0xcf, 0xa7, 0x95, 0xa1, 0xa3, 0xa0, 0xe9, 0x28, - 0x42, 0x83, 0x74, 0xa6, 0x3d, 0xae, 0xc7, 0xe9, 0xc6, 0x1f, 0x23, 0xf5, 0x33, 0xfa, 0xf1, 0x67, - 0x91, 0x1a, 0x91, 0x4f, 0x1e, 0x1b, 0x8d, 0x9d, 0x9f, 0xc2, 0xfd, 0x00, 0xbf, 0xe9, 0x30, 0xfa, - 0xda, 0x93, 0x3d, 0xdb, 0xb4, 0x54, 0x73, 0x6c, 0xe0, 0x10, 0x7d, 0xb2, 0xf7, 0x58, 0x1d, 0x22, - 0x88, 0x06, 0x5b, 0xae, 0x73, 0xbb, 0x92, 0x0a, 0xc3, 0x36, 0xf5, 0xca, 0x44, 0x7a, 0x11, 0x6e, - 0xe3, 0x52, 0xd2, 0xd7, 0x37, 0x42, 0x97, 0x28, 0x8d, 0xe1, 0x5c, 0xd3, 0x08, 0x7a, 0x1d, 0x37, - 0xb0, 0x95, 0x3d, 0xd2, 0x95, 0x86, 0xba, 0x1b, 0x5f, 0xb3, 0xdd, 0x60, 0x04, 0x01, 0xe8, 0xc5, - 0x3e, 0x2d, 0xb7, 0x8a, 0xf1, 0xf9, 0x52, 0xf7, 0x8f, 0x18, 0xdf, 0xc6, 0x6a, 0xce, 0xd7, 0x9d, - 0x50, 0x86, 0x02, 0xac, 0xef, 0x1d, 0xce, 0xb7, 0xf1, 0x87, 0xac, 0x2f, 0xce, 0xf9, 0x36, 0xfe, - 0x22, 0xeb, 0xf3, 0x3a, 0x97, 0x88, 0xb0, 0xbe, 0x28, 0x9f, 0xc1, 0x2d, 0x7d, 0x2e, 0x81, 0xb7, - 0xa6, 0x6e, 0x61, 0x0d, 0x31, 0xd4, 0x25, 0xa0, 0x7f, 0xb6, 0x32, 0xa9, 0x58, 0xfd, 0x2e, 0x25, - 0x98, 0x5b, 0xfa, 0xab, 0x18, 0x15, 0x82, 0xe1, 0x42, 0x1e, 0x1d, 0x48, 0xdb, 0x1f, 0xd8, 0xc4, - 0x0b, 0x82, 0x58, 0x30, 0xe6, 0x0f, 0x26, 0xed, 0x83, 0x39, 0xdb, 0xf8, 0x13, 0x69, 0x25, 0xe9, - 0x1f, 0x4f, 0xda, 0x46, 0xe2, 0x7f, 0x68, 0xd2, 0xfc, 0xde, 0xfd, 0xf5, 0x59, 0x83, 0xf5, 0x46, - 0x5c, 0x97, 0x7c, 0x30, 0x6d, 0xe1, 0x52, 0xc1, 0xd2, 0x92, 0xb6, 0xe3, 0xcd, 0x60, 0xbc, 0x47, - 0xe0, 0x0a, 0x5b, 0xad, 0x1f, 0x86, 0xad, 0x83, 0x77, 0xe7, 0xdd, 0x3b, 0x73, 0x1b, 0xdb, 0xbc, - 0x62, 0x9b, 0x55, 0x52, 0x58, 0x2c, 0xfb, 0x15, 0x82, 0x5b, 0x53, 0xde, 0xd9, 0x99, 0x89, 0x83, - 0xc2, 0x4d, 0xd1, 0x00, 0x79, 0xf4, 0xec, 0x74, 0x58, 0xbf, 0xc2, 0x93, 0xb7, 0x74, 0x7e, 0x07, - 0x3d, 0xbf, 0xcc, 0x58, 0xe3, 0x12, 0x92, 0x0e, 0xf2, 0x80, 0x5e, 0xc9, 0x1c, 0xba, 0x90, 0xdc, - 0x32, 0x7a, 0xfe, 0x8d, 0xc1, 0xda, 0xdd, 0xee, 0xc5, 0xf5, 0x58, 0x3c, 0x39, 0xe8, 0x99, 0x78, - 0x4b, 0xd6, 0x79, 0xe7, 0xb6, 0xbf, 0x7f, 0x8b, 0x37, 0x04, 0xef, 0xd2, 0x5b, 0xb3, 0xda, 0xad, - 0xe6, 0x23, 0x7c, 0xb5, 0x8a, 0xed, 0x61, 0xb7, 0x48, 0xaf, 0x08, 0x7e, 0x38, 0xef, 0x5c, 0x8b, - 0x47, 0x4d, 0xdb, 0x29, 0x28, 0x25, 0x7a, 0x27, 0xf9, 0xb5, 0x71, 0x75, 0x9b, 0xdd, 0x85, 0x32, - 0x93, 0xe7, 0xf1, 0xa8, 0xf2, 0x78, 0x75, 0x8b, 0x89, 0xc7, 0xca, 0x7e, 0xff, 0x49, 0x19, 0x37, - 0x9b, 0x7b, 0xce, 0x19, 0xfc, 0x2c, 0xef, 0x35, 0x15, 0x75, 0xf4, 0x7a, 0x80, 0x15, 0x76, 0xe5, - 0xce, 0xed, 0xf5, 0xee, 0x5d, 0xab, 0x7f, 0xa3, 0x3f, 0x56, 0xe5, 0x3d, 0xb3, 0x39, 0xde, 0x3b, - 0x3b, 0xbf, 0x2f, 0x1b, 0x55, 0x63, 0xdc, 0xd2, 0xac, 0xa9, 0x7b, 0x75, 0x5e, 0x78, 0xaa, 0xb8, - 0xb2, 0x7d, 0x73, 0x38, 0xd8, 0x1b, 0xb4, 0x0b, 0xe6, 0xe5, 0xdb, 0x54, 0x57, 0xc7, 0xd7, 0xaf, - 0x56, 0xb6, 0xd3, 0x51, 0x8d, 0xbb, 0xcc, 0xf9, 0xf0, 0x69, 0xf8, 0xf6, 0x0a, 0x06, 0xc5, 0xee, - 0x74, 0xf2, 0xf0, 0x66, 0xec, 0x8e, 0xf3, 0x5a, 0xef, 0x85, 0xb4, 0xf7, 0xbb, 0x0f, 0xd3, 0xdb, - 0x61, 0xff, 0x24, 0x33, 0x6d, 0x9f, 0x89, 0xad, 0xc9, 0x71, 0x77, 0xfa, 0xfa, 0xf0, 0xb4, 0x7f, - 0xa1, 0x94, 0x32, 0x1d, 0xbb, 0x9a, 0x91, 0xbb, 0xe5, 0xe1, 0x51, 0xab, 0x78, 0x3e, 0x56, 0xcb, - 0xa6, 0x7d, 0x36, 0x6a, 0x5e, 0xae, 0xbc, 0xc5, 0x7c, 0x85, 0x9d, 0xfb, 0x32, 0x0a, 0x36, 0x47, - 0x83, 0x4d, 0xd1, 0xa0, 0xc4, 0x92, 0x32, 0x1d, 0x53, 0xa4, 0x6d, 0xf2, 0x3a, 0x24, 0x8e, 0x7b, - 0xec, 0xe0, 0x85, 0xd0, 0xdc, 0xf6, 0x35, 0xe9, 0x82, 0xde, 0xda, 0x5f, 0xab, 0x8a, 0xc7, 0x6a, - 0x47, 0xb7, 0x07, 0x5b, 0xba, 0xe9, 0x90, 0x04, 0xfe, 0xfa, 0xb3, 0xfa, 0x01, 0x3d, 0x1d, 0x19, - 0x8e, 0x8b, 0x16, 0x56, 0x02, 0xaf, 0xe0, 0xfe, 0x00, 0x06, 0x75, 0xc4, 0xa0, 0x8a, 0x4d, 0x7f, - 0x2e, 0xd8, 0x82, 0xd1, 0xbd, 0xc6, 0x54, 0x36, 0x18, 0xd9, 0x34, 0xdd, 0x04, 0xbb, 0xf2, 0x3d, - 0x6e, 0x1f, 0x38, 0x96, 0x14, 0x40, 0x44, 0x8d, 0xf2, 0x4c, 0x52, 0x49, 0x62, 0xac, 0xb9, 0x7d, - 0x2f, 0x0b, 0xe1, 0xd3, 0x23, 0xcf, 0xc8, 0x32, 0xb2, 0xa2, 0x58, 0x29, 0xd4, 0x81, 0x75, 0xb4, - 0xf7, 0xc5, 0x7d, 0x60, 0x1d, 0x58, 0x62, 0x3b, 0x21, 0x4f, 0x13, 0x4d, 0xcd, 0x56, 0x4c, 0xd3, - 0x7c, 0xd1, 0x08, 0xdd, 0x32, 0x77, 0xfb, 0x24, 0x01, 0xab, 0xde, 0xbb, 0x5f, 0xbf, 0xef, 0xba, - 0x96, 0x53, 0xcb, 0x64, 0xc6, 0x3a, 0x51, 0xd3, 0xa0, 0x66, 0x28, 0xe6, 0xd0, 0x76, 0x48, 0x1a, - 0xbd, 0xa2, 0x56, 0x06, 0x94, 0x14, 0xc9, 0xee, 0xe1, 0x5b, 0x01, 0xfe, 0x4b, 0x06, 0xb3, 0xf2, - 0x85, 0xa3, 0x57, 0xd3, 0x27, 0x14, 0x73, 0x30, 0x18, 0x1a, 0xa0, 0xf5, 0x30, 0x4e, 0xce, 0x1a, - 0xda, 0x58, 0x5a, 0x9b, 0x6c, 0xc7, 0x74, 0xdd, 0x42, 0xc3, 0xc3, 0xfc, 0x1e, 0x3c, 0xcd, 0x43, - 0xa9, 0xb3, 0xb4, 0x56, 0x5f, 0x8c, 0x3f, 0x26, 0x9b, 0x00, 0xcb, 0x78, 0x31, 0x7a, 0x30, 0x6b, - 0x1b, 0x9f, 0x22, 0x9a, 0x75, 0x73, 0xce, 0x88, 0x46, 0x0f, 0x4f, 0xf8, 0x46, 0x9c, 0x87, 0x69, - 0xcc, 0xed, 0xe6, 0x5f, 0x47, 0xc0, 0x45, 0xc5, 0x03, 0x5e, 0x0f, 0x14, 0x65, 0xc2, 0xa7, 0xcc, - 0x23, 0xc1, 0xb4, 0xd2, 0xac, 0xc8, 0x54, 0x18, 0x36, 0x36, 0xff, 0xc6, 0x7f, 0xbc, 0x4b, 0x5e, - 0x37, 0x15, 0xcd, 0x12, 0xc0, 0x94, 0x64, 0x0e, 0x60, 0xc1, 0x62, 0x5c, 0xd9, 0xd9, 0x03, 0x36, - 0x24, 0x8c, 0x1d, 0x76, 0x3f, 0xbd, 0xc0, 0xae, 0x7e, 0x17, 0x5c, 0x76, 0x7f, 0xba, 0x00, 0x95, - 0x1a, 0x5f, 0xb2, 0xf8, 0x65, 0xd9, 0xa6, 0x6b, 0xb2, 0x59, 0xae, 0x71, 0x82, 0x61, 0x9e, 0x93, - 0x31, 0x58, 0x99, 0x0e, 0xe6, 0x6a, 0xce, 0x85, 0xc1, 0xbe, 0x71, 0x35, 0xb0, 0x27, 0x3a, 0x62, - 0xf6, 0x78, 0xdd, 0x93, 0xc7, 0xf8, 0xa4, 0x28, 0x6e, 0x83, 0x5e, 0xc4, 0xaf, 0x41, 0xab, 0x8d, - 0x1f, 0xf4, 0x8c, 0xd1, 0x4f, 0xc1, 0xc2, 0x5d, 0x7a, 0xa2, 0x36, 0x7e, 0x7c, 0x81, 0x1f, 0x7e, - 0xdc, 0x62, 0x7b, 0xd2, 0x10, 0x83, 0x1f, 0x20, 0x3e, 0xe0, 0x97, 0x02, 0x3f, 0xf1, 0x6b, 0x68, - 0xe3, 0x29, 0x50, 0x66, 0x6f, 0x36, 0xb6, 0xa0, 0x6b, 0xc0, 0xce, 0x6f, 0xa9, 0x9a, 0x4c, 0xab, - 0xf4, 0x5a, 0xe6, 0xd0, 0x70, 0xe1, 0x11, 0xa8, 0x30, 0x78, 0x84, 0x26, 0xa0, 0x90, 0x31, 0x74, - 0xa0, 0x1d, 0x51, 0x00, 0x05, 0x1a, 0x7a, 0x8e, 0xe9, 0xec, 0xcb, 0xb5, 0x1b, 0x65, 0x41, 0x0d, - 0xae, 0xa7, 0x17, 0xba, 0x13, 0xe4, 0xcc, 0x8d, 0x1f, 0xd0, 0x37, 0x64, 0x14, 0x8d, 0xd9, 0x5c, - 0x20, 0xfe, 0x83, 0xee, 0x3f, 0x58, 0xe7, 0x0d, 0x8e, 0x13, 0xac, 0x23, 0xa8, 0x6f, 0x9d, 0x0f, - 0x07, 0xf8, 0x35, 0x70, 0x1b, 0x59, 0xfc, 0x3c, 0xed, 0xb0, 0x5f, 0xa7, 0xd0, 0x33, 0x6c, 0x05, - 0xbe, 0x50, 0x52, 0x60, 0x2d, 0xa5, 0xdb, 0x6b, 0xcc, 0xe8, 0x3b, 0x30, 0x6a, 0x33, 0xe4, 0xf7, - 0x35, 0x10, 0x02, 0xf6, 0x0b, 0x27, 0xc8, 0xbd, 0xda, 0x6c, 0x68, 0xeb, 0x35, 0x8e, 0x9b, 0x0b, - 0x92, 0x6e, 0xf5, 0x25, 0xc8, 0xee, 0xd5, 0xd2, 0x25, 0xc1, 0x95, 0xe4, 0x5a, 0xba, 0x02, 0x15, - 0xe9, 0x96, 0x05, 0x26, 0x42, 0x11, 0xfc, 0x39, 0xb0, 0x6a, 0x2c, 0x9a, 0xde, 0xa9, 0xcd, 0x98, - 0xe3, 0xbf, 0xf6, 0x45, 0x14, 0xec, 0x9e, 0x8c, 0xef, 0x3a, 0x78, 0xc5, 0x7d, 0x51, 0xfc, 0xdd, - 0x27, 0x13, 0xf8, 0x0d, 0xdd, 0xa6, 0xa6, 0x0b, 0xa6, 0x58, 0xca, 0x00, 0xf4, 0x74, 0x2c, 0x64, - 0x69, 0x2a, 0x26, 0x00, 0xca, 0x74, 0x62, 0x60, 0xa9, 0xb9, 0x00, 0x4a, 0x4d, 0xe3, 0x07, 0x4c, - 0x4c, 0x36, 0x2b, 0xe4, 0x0a, 0x42, 0x41, 0x08, 0xd6, 0xb4, 0x14, 0x2c, 0xfc, 0x74, 0x0f, 0x98, - 0xc6, 0x50, 0x4e, 0x6b, 0x66, 0x66, 0x32, 0x90, 0x9c, 0x34, 0x48, 0x2e, 0xee, 0xa7, 0x00, 0x75, - 0x72, 0x42, 0xb6, 0x2c, 0x64, 0x17, 0x55, 0xa8, 0x60, 0x73, 0xd2, 0x74, 0x34, 0x8a, 0x89, 0x6f, - 0x35, 0x48, 0x43, 0xaf, 0x33, 0x85, 0x6a, 0x16, 0xff, 0xb2, 0xb9, 0x7c, 0xfa, 0xd9, 0xa2, 0x55, - 0x73, 0x62, 0x2e, 0x27, 0xe4, 0xb1, 0x76, 0xee, 0x83, 0x06, 0x09, 0x60, 0x92, 0xd8, 0x7e, 0x93, - 0x50, 0x2f, 0x0f, 0xf5, 0xaa, 0x7f, 0x5e, 0xad, 0x00, 0x55, 0xf2, 0xd9, 0x3f, 0xaa, 0xf7, 0xb3, - 0x1e, 0xbc, 0x34, 0x03, 0x6c, 0x36, 0x55, 0x27, 0x77, 0x41, 0x18, 0x57, 0x8b, 0x1a, 0x71, 0x49, - 0x7e, 0xf6, 0x45, 0xf5, 0x0e, 0x45, 0x6f, 0x6e, 0xe2, 0x7b, 0x2a, 0x60, 0x5d, 0xe1, 0xed, 0x18, - 0x3e, 0x75, 0x6e, 0xe7, 0x49, 0x7e, 0x73, 0x33, 0x22, 0x80, 0xe6, 0x01, 0x4c, 0x07, 0xd6, 0x64, - 0x92, 0x08, 0x2e, 0x3f, 0x03, 0xd6, 0xe9, 0xd1, 0xa1, 0xf7, 0xaa, 0x87, 0x34, 0xb5, 0xb2, 0xf0, - 0x05, 0x0c, 0x97, 0xa0, 0xc8, 0x12, 0x1b, 0x2c, 0x44, 0x2c, 0xb8, 0xa8, 0xdb, 0x3b, 0x52, 0x93, - 0x84, 0x9f, 0xd9, 0xc4, 0x1d, 0xda, 0x46, 0x42, 0x0d, 0xbd, 0xb9, 0x63, 0x77, 0x4a, 0xb3, 0x42, - 0x45, 0xf7, 0x77, 0x5b, 0xe7, 0x6b, 0x0a, 0x3b, 0xbb, 0xd3, 0x16, 0xf2, 0x19, 0xfa, 0xa2, 0x8f, - 0x70, 0x25, 0xcd, 0xd9, 0x1f, 0x58, 0xd8, 0x6a, 0x50, 0x4d, 0x6c, 0x34, 0x1a, 0x17, 0xf2, 0x33, - 0x2c, 0x4e, 0xbc, 0x72, 0xcc, 0x81, 0x9c, 0x34, 0x90, 0x50, 0xcf, 0xed, 0x87, 0x2b, 0x41, 0x81, - 0x50, 0x15, 0xb2, 0xb9, 0xc9, 0x99, 0xb4, 0x0a, 0xd7, 0x68, 0xa0, 0x66, 0x6d, 0x76, 0x31, 0xed, - 0x4b, 0xd3, 0xb6, 0xa5, 0x69, 0x5a, 0x73, 0xe8, 0x77, 0xa4, 0x59, 0x7c, 0x9f, 0xc5, 0xb4, 0xd5, - 0xed, 0x01, 0x62, 0x15, 0x16, 0x5d, 0xc1, 0xd1, 0x4b, 0x16, 0xf1, 0x4d, 0x12, 0xb0, 0x8c, 0xd2, - 0x74, 0x15, 0xa5, 0x71, 0x11, 0xb1, 0x57, 0x65, 0x90, 0x50, 0x2a, 0x5d, 0x18, 0x69, 0xb9, 0x57, - 0x87, 0x26, 0x28, 0x6a, 0x39, 0x7a, 0xcc, 0x96, 0x13, 0x88, 0xff, 0x5a, 0x0d, 0x2c, 0x8b, 0x8b, - 0x88, 0x15, 0x75, 0xea, 0x88, 0x44, 0x6f, 0x5f, 0x9f, 0xf7, 0x30, 0xee, 0x59, 0xca, 0x0d, 0x37, - 0x4d, 0x97, 0xd3, 0x0e, 0x47, 0xa3, 0x45, 0xb9, 0x1a, 0x47, 0xdd, 0x85, 0xf5, 0x2e, 0x70, 0x5d, - 0x84, 0x65, 0x2e, 0x60, 0xb1, 0x55, 0x26, 0x38, 0x0d, 0x15, 0xaa, 0x10, 0x7b, 0xda, 0xa1, 0x0c, - 0xcc, 0xb4, 0x9b, 0x3a, 0xf4, 0x60, 0x71, 0xc9, 0x13, 0xc7, 0x0b, 0x46, 0x43, 0xac, 0x1b, 0xdf, - 0x1d, 0x0f, 0x6d, 0x75, 0x23, 0x95, 0xe2, 0x9d, 0x1f, 0xc6, 0xcf, 0x58, 0xcb, 0x66, 0xbc, 0xcd, - 0x35, 0x90, 0x3d, 0xa8, 0xb4, 0x4b, 0x7f, 0x11, 0x72, 0x72, 0x09, 0x34, 0xc0, 0xed, 0xab, 0x1c, - 0xcf, 0x7f, 0x50, 0x53, 0xf0, 0xf1, 0x2b, 0xcb, 0x16, 0x27, 0x40, 0x6e, 0xe8, 0x32, 0x51, 0x28, - 0xe3, 0xdd, 0xf4, 0x41, 0x43, 0xee, 0x60, 0xdc, 0x41, 0x61, 0x00, 0x2d, 0xc4, 0x41, 0x85, 0xb2, - 0x07, 0x2e, 0xcd, 0x46, 0x4f, 0x42, 0x8d, 0x2b, 0xc2, 0xe7, 0x22, 0xcf, 0xdd, 0x92, 0x39, 0x61, - 0x31, 0xd5, 0x94, 0xbf, 0x20, 0x6e, 0xa1, 0x84, 0xf6, 0x06, 0xcb, 0x10, 0x65, 0x95, 0xa4, 0x77, - 0x60, 0x04, 0xc0, 0x7f, 0x70, 0xd9, 0x1c, 0xb9, 0x64, 0x90, 0xe4, 0x50, 0x2b, 0xb9, 0xd5, 0x80, - 0x9e, 0x38, 0xe1, 0xb8, 0x73, 0x71, 0x0e, 0xa3, 0xc2, 0x1b, 0x56, 0xb4, 0xee, 0x34, 0x09, 0xb0, - 0xf8, 0x10, 0xdd, 0x2d, 0x82, 0x79, 0x66, 0x51, 0x32, 0x6b, 0xac, 0xa3, 0xbf, 0x1d, 0xc6, 0xc4, - 0x6b, 0x5e, 0xbe, 0xb0, 0xa0, 0xdc, 0x08, 0x54, 0xdf, 0x7d, 0x34, 0x8b, 0xd1, 0x4b, 0xe3, 0x4b, - 0x9c, 0x80, 0x56, 0x01, 0xf0, 0xd6, 0x00, 0xac, 0x28, 0xb2, 0x93, 0x8c, 0xd0, 0x34, 0x87, 0x97, - 0xd7, 0x86, 0x10, 0xa4, 0x6c, 0x75, 0x31, 0x91, 0x46, 0x21, 0x84, 0x12, 0x73, 0x98, 0xa8, 0xaa, - 0x6a, 0x24, 0x31, 0x8f, 0x89, 0xb2, 0x2c, 0x47, 0x12, 0x0b, 0x98, 0x28, 0x49, 0x52, 0x24, 0xb1, - 0x88, 0x89, 0xd5, 0x6a, 0x35, 0x92, 0x58, 0x5a, 0x95, 0x58, 0xc1, 0xc4, 0x4a, 0xa5, 0x12, 0x49, - 0x94, 0x31, 0xb1, 0x50, 0x28, 0x44, 0x12, 0x15, 0x4c, 0xcc, 0xe7, 0xf3, 0x91, 0x44, 0x82, 0x89, - 0xd9, 0x6c, 0x36, 0x92, 0xa8, 0x62, 0x22, 0xbe, 0x21, 0x2a, 0x9c, 0x68, 0x63, 0xa2, 0x92, 0x8b, - 0x96, 0xec, 0xd1, 0x92, 0x4a, 0x34, 0x51, 0xa7, 0x89, 0x25, 0x25, 0x92, 0x68, 0x42, 0x22, 0xbd, - 0x4e, 0x37, 0x27, 0x16, 0x84, 0xc4, 0xe2, 0x43, 0x4c, 0x57, 0xf9, 0x48, 0x41, 0x47, 0xf6, 0xf0, - 0x99, 0x8f, 0x25, 0xf7, 0xbd, 0xf4, 0x52, 0x24, 0xdd, 0x95, 0xd7, 0x00, 0x0e, 0x5d, 0xd5, 0x1b, - 0xab, 0x20, 0xf9, 0x35, 0xb2, 0x65, 0x51, 0x48, 0x2c, 0x3e, 0xd6, 0xd7, 0xe8, 0x7f, 0xaa, 0x0d, - 0xca, 0xd5, 0xa8, 0x1d, 0xea, 0x2f, 0xe3, 0xae, 0xa6, 0xbb, 0xe8, 0xb6, 0xd0, 0x0c, 0x3c, 0xc9, - 0x91, 0x14, 0xd3, 0x15, 0x28, 0x57, 0x8b, 0x13, 0x54, 0x1c, 0xfd, 0x94, 0xa0, 0x68, 0xe4, 0x4c, - 0x9c, 0xa0, 0xe2, 0x73, 0x92, 0x5f, 0x35, 0xa5, 0x85, 0x55, 0x93, 0x4f, 0x09, 0xaa, 0x58, 0x2c, - 0x2e, 0x13, 0x54, 0xa9, 0x54, 0xfa, 0x24, 0x41, 0xc5, 0x29, 0x97, 0x12, 0x94, 0xa2, 0x28, 0xcb, - 0x04, 0x15, 0x5f, 0x22, 0xea, 0xaa, 0xd5, 0x40, 0x09, 0x8a, 0x14, 0x72, 0xcb, 0x04, 0x55, 0x20, - 0xb9, 0x65, 0x82, 0x2a, 0x54, 0xa4, 0xd5, 0x04, 0x15, 0xbe, 0xec, 0x79, 0x0d, 0x35, 0x01, 0x32, - 0x57, 0x52, 0x13, 0xa4, 0x17, 0xd7, 0x50, 0xd3, 0x9a, 0x2b, 0xa4, 0xd7, 0x92, 0xd2, 0xda, 0xcb, - 0xa4, 0xd7, 0x91, 0xd2, 0x9a, 0x6b, 0xa5, 0xdf, 0xa5, 0xa3, 0xa1, 0x01, 0x1c, 0x96, 0x0b, 0xf1, - 0x29, 0xb4, 0x95, 0x76, 0x7b, 0xc8, 0xa7, 0xd8, 0x2b, 0xa1, 0x56, 0xbc, 0x50, 0x8c, 0xaa, 0x25, - 0x18, 0x59, 0xcc, 0x0b, 0xe6, 0xda, 0xf7, 0x5b, 0x41, 0x6b, 0x20, 0xd1, 0x4c, 0xfa, 0xf2, 0x2a, - 0x22, 0x98, 0xef, 0xbe, 0xae, 0x0a, 0xc5, 0xb0, 0xd3, 0xb0, 0xf0, 0xf5, 0x4b, 0x6d, 0x0c, 0xbc, - 0x4e, 0xc6, 0xc5, 0x83, 0xdc, 0xe3, 0xeb, 0x60, 0x92, 0x48, 0xe7, 0x49, 0x87, 0xdf, 0xdc, 0x04, - 0x59, 0x97, 0x2e, 0xf1, 0x82, 0xaf, 0x59, 0x79, 0x91, 0xd2, 0x0d, 0x27, 0x48, 0x59, 0x04, 0xf3, - 0x1c, 0xa1, 0x12, 0xdb, 0xf8, 0x85, 0xaf, 0x7b, 0xfa, 0xc7, 0x8c, 0x76, 0x66, 0xce, 0xff, 0x82, - 0x5e, 0x1b, 0x43, 0x5d, 0x9f, 0xc7, 0x46, 0xdd, 0x79, 0xd1, 0x8c, 0x56, 0xa7, 0x83, 0x43, 0xd7, - 0xba, 0xc9, 0x2f, 0x4c, 0x2d, 0xe3, 0x67, 0xb1, 0xd7, 0x78, 0x7d, 0xf4, 0x5e, 0xb5, 0xf5, 0x18, - 0xc1, 0xf7, 0xdb, 0x51, 0x94, 0x80, 0x75, 0x88, 0x18, 0x61, 0xaf, 0xba, 0xc3, 0x0e, 0x3b, 0x7d, - 0x42, 0x50, 0x60, 0xa6, 0x17, 0x2e, 0xcb, 0x8c, 0xe2, 0x38, 0x98, 0x42, 0x4d, 0x73, 0x68, 0xf3, - 0xf6, 0xfa, 0x34, 0xc9, 0x65, 0x1c, 0xe8, 0x62, 0x1a, 0x73, 0x00, 0xf3, 0x69, 0x1a, 0xfe, 0xde, - 0xe0, 0x24, 0x5d, 0xa7, 0xaf, 0x03, 0x0b, 0xbd, 0x1a, 0xcb, 0xe4, 0xe7, 0x21, 0x9d, 0x91, 0x55, - 0x0e, 0x54, 0xb9, 0x24, 0xc8, 0xd7, 0x1d, 0xdf, 0x1e, 0x4c, 0x71, 0x99, 0x0c, 0x97, 0xa2, 0x96, - 0x25, 0x18, 0x26, 0x7c, 0x8a, 0xcc, 0x25, 0x67, 0x6a, 0x28, 0x89, 0xa0, 0xb6, 0xff, 0x32, 0x2f, - 0x4a, 0x0d, 0xa4, 0x11, 0x0b, 0x3f, 0xae, 0x03, 0xa2, 0x38, 0x20, 0x25, 0xb0, 0x83, 0x1a, 0x0d, - 0x92, 0xa6, 0x20, 0x41, 0x21, 0xe3, 0xa9, 0xd5, 0x29, 0x0a, 0x49, 0x0a, 0xb8, 0x11, 0x11, 0xe8, - 0x3d, 0x5f, 0xa0, 0x43, 0xea, 0x91, 0x05, 0xfa, 0xc9, 0xef, 0xdf, 0x5e, 0x31, 0xa8, 0x0d, 0x7a, - 0x6a, 0x92, 0x6b, 0x03, 0xbc, 0xc4, 0x19, 0x58, 0x1c, 0xe9, 0xc4, 0xa5, 0x8e, 0x97, 0x1f, 0x25, - 0xe8, 0xd6, 0x1a, 0x0b, 0x7f, 0x3f, 0xba, 0xfc, 0xc2, 0xad, 0x53, 0x11, 0x18, 0x44, 0x81, 0x42, - 0xe3, 0xf9, 0x3a, 0x48, 0x62, 0xe2, 0x11, 0x31, 0x74, 0x4d, 0x72, 0xfb, 0xe8, 0x22, 0x84, 0xf9, - 0xa1, 0xe7, 0x39, 0x14, 0x92, 0xcc, 0x02, 0xd6, 0x00, 0x65, 0xce, 0x3d, 0x18, 0x0c, 0x80, 0x5b, - 0x8e, 0xdf, 0xd9, 0xca, 0xd6, 0x46, 0xa6, 0xa6, 0x26, 0x44, 0x58, 0x25, 0x16, 0x98, 0x06, 0x34, - 0xb5, 0xee, 0xed, 0xa5, 0x38, 0xa8, 0x38, 0x98, 0x30, 0xc5, 0x9b, 0x9b, 0x40, 0x48, 0x7d, 0xad, - 0xeb, 0x32, 0x5d, 0x85, 0xd9, 0xd5, 0x8b, 0xc1, 0xb3, 0xf6, 0x21, 0xa1, 0x6f, 0x3a, 0x2e, 0x36, - 0x99, 0x4a, 0x42, 0xa6, 0x69, 0xbb, 0x3b, 0xa0, 0x61, 0xa4, 0xd8, 0x23, 0xe2, 0x1a, 0x66, 0x90, - 0xe9, 0x78, 0xdb, 0x22, 0xe8, 0xd6, 0xdc, 0x17, 0x06, 0x7c, 0x27, 0xe9, 0xe1, 0x8e, 0x42, 0x49, - 0x35, 0xa0, 0x07, 0x29, 0x33, 0xfd, 0x6c, 0x6a, 0x06, 0xed, 0x0c, 0x5f, 0xf3, 0x4c, 0x1e, 0xec, - 0x8c, 0xdf, 0x38, 0xac, 0x08, 0x56, 0x89, 0x9f, 0x33, 0x62, 0x5d, 0x8d, 0xf0, 0x85, 0x06, 0xc5, - 0xe3, 0xbc, 0xb9, 0xf8, 0xee, 0x36, 0x30, 0x67, 0x07, 0xc4, 0xee, 0x91, 0x3d, 0x42, 0x2c, 0xfc, - 0xc5, 0x74, 0x2b, 0xba, 0x12, 0x93, 0x2e, 0xcf, 0xf3, 0x60, 0x6b, 0xbf, 0x90, 0xfb, 0x0e, 0x8c, - 0x74, 0xa1, 0xd3, 0x08, 0x1c, 0x17, 0xd1, 0xa0, 0x7a, 0x69, 0x58, 0x5e, 0xbf, 0x7f, 0x07, 0xb6, - 0x18, 0x58, 0xb3, 0xce, 0x70, 0x90, 0xb6, 0xfa, 0xd0, 0x35, 0x27, 0x93, 0xad, 0xe6, 0xc4, 0x4c, - 0x56, 0xac, 0x88, 0x31, 0xbd, 0x8b, 0xd6, 0x62, 0xab, 0xcb, 0x5c, 0x4a, 0xaf, 0x77, 0x89, 0xab, - 0xf4, 0x93, 0x01, 0xdd, 0xf7, 0x71, 0xb3, 0x40, 0x9a, 0x3a, 0xe9, 0x67, 0xb0, 0xbb, 0x00, 0x75, - 0xb3, 0x01, 0x71, 0xfb, 0xa6, 0x5a, 0xe3, 0xa0, 0x04, 0x37, 0xe7, 0xb1, 0xae, 0x91, 0x04, 0x4e, - 0x42, 0x68, 0x81, 0x24, 0xbf, 0x48, 0x99, 0xc5, 0x0d, 0x14, 0x18, 0x35, 0x5a, 0xc9, 0x60, 0xa9, - 0xf0, 0x69, 0x20, 0x62, 0x68, 0x85, 0xbe, 0x9d, 0xd0, 0x34, 0x1c, 0x13, 0x38, 0x87, 0x6e, 0xf6, - 0x60, 0x31, 0x87, 0x5b, 0x4b, 0xa8, 0x26, 0x71, 0xe8, 0x99, 0x21, 0x2f, 0x12, 0x3a, 0x21, 0x21, - 0xa4, 0x04, 0xd8, 0x3f, 0x41, 0xb9, 0x84, 0xe7, 0x14, 0x77, 0x28, 0x1f, 0x21, 0x6a, 0x9a, 0x43, - 0xe8, 0x5d, 0xcd, 0x80, 0xb5, 0x39, 0x65, 0x2f, 0xd2, 0xf3, 0xad, 0x0d, 0xd2, 0xf0, 0x4d, 0x4b, - 0xc1, 0x05, 0x4d, 0xdf, 0xfd, 0x0e, 0x40, 0x7c, 0x5d, 0xdf, 0x05, 0x5d, 0xdf, 0xe3, 0x85, 0x60, - 0xa1, 0x41, 0xc6, 0x0f, 0xf7, 0x27, 0x92, 0x04, 0x9d, 0xc3, 0x36, 0x70, 0xac, 0x47, 0x02, 0x5c, - 0x9d, 0xaf, 0x05, 0x39, 0x60, 0x86, 0xf8, 0xd0, 0x92, 0x8e, 0xe0, 0x25, 0x67, 0x7f, 0xfa, 0x4f, - 0xb9, 0x9f, 0x40, 0xa0, 0x8b, 0x12, 0x06, 0xbe, 0xd1, 0x11, 0x16, 0x0b, 0xfd, 0xa1, 0x23, 0x4c, - 0xfa, 0xc4, 0xa7, 0xbc, 0xe2, 0x79, 0x28, 0x4e, 0xb6, 0x1b, 0x60, 0xfd, 0x92, 0xef, 0x3a, 0xa0, - 0xc9, 0xf4, 0xbb, 0x50, 0xf8, 0xc9, 0xcf, 0x19, 0x81, 0x6e, 0x6e, 0x7a, 0xe2, 0x01, 0x38, 0x0c, - 0x3f, 0xc7, 0x05, 0xe6, 0xcb, 0x8b, 0xa5, 0x99, 0xad, 0x87, 0x59, 0x2a, 0x87, 0x8c, 0xab, 0x85, - 0x7c, 0x2b, 0x30, 0xbb, 0x9c, 0x06, 0x15, 0x4a, 0x18, 0xdd, 0x01, 0x13, 0x81, 0x6c, 0xcb, 0x26, - 0xc6, 0x07, 0x76, 0xd5, 0x82, 0xaf, 0x53, 0x17, 0x18, 0x8d, 0x90, 0x4b, 0x82, 0x9a, 0x85, 0xff, - 0xf3, 0x60, 0x5d, 0x85, 0xa3, 0x3b, 0x3e, 0xfd, 0x5a, 0x47, 0xe6, 0xf0, 0x59, 0xbf, 0x64, 0x2e, - 0xc1, 0x96, 0xc1, 0x85, 0x2e, 0xa9, 0xde, 0x36, 0x88, 0xc3, 0x66, 0x34, 0x9c, 0x82, 0x2e, 0xb8, - 0xa4, 0x4d, 0x54, 0x5b, 0x1a, 0x43, 0xd2, 0xa5, 0x4d, 0x46, 0xac, 0x46, 0xfb, 0x61, 0x51, 0xb6, - 0xfd, 0x40, 0x4b, 0x79, 0xa0, 0x58, 0xb8, 0x05, 0xcb, 0x8d, 0xfa, 0x14, 0xe8, 0x7f, 0x82, 0xba, - 0x42, 0x60, 0x2e, 0x4e, 0x9e, 0xf9, 0xaf, 0x9e, 0x5c, 0xed, 0xca, 0x10, 0xbe, 0x64, 0x03, 0x63, - 0x8a, 0x21, 0x79, 0x14, 0xc8, 0x7d, 0x5f, 0x58, 0x8a, 0xd4, 0x8e, 0xd6, 0x57, 0xd9, 0xa3, 0x2b, - 0x5f, 0x12, 0xb9, 0x98, 0x38, 0x09, 0x49, 0x5f, 0xe7, 0xa5, 0x15, 0x1d, 0xa4, 0x2f, 0x6f, 0x40, - 0x97, 0x27, 0xbe, 0xb6, 0x92, 0xfa, 0x4d, 0x77, 0xe9, 0x06, 0x34, 0x70, 0x8f, 0x75, 0xa5, 0xe9, - 0xac, 0x44, 0xca, 0x86, 0x9c, 0x2a, 0x7d, 0x73, 0x7c, 0x83, 0xbb, 0x3d, 0xe8, 0x30, 0x69, 0xc0, - 0xa0, 0x66, 0xc8, 0xb3, 0xd8, 0x88, 0xbc, 0xed, 0x21, 0x7e, 0x1d, 0x65, 0xf8, 0x07, 0xff, 0x6c, - 0x50, 0x7f, 0xea, 0x8c, 0xc9, 0xd0, 0x8a, 0x6c, 0xf7, 0x88, 0x4a, 0x61, 0xbc, 0xf8, 0xe4, 0xf0, - 0xe6, 0xec, 0x94, 0x0a, 0x63, 0xc5, 0x77, 0x9d, 0x34, 0x80, 0x4f, 0xd3, 0x2b, 0x78, 0x81, 0x5b, - 0x63, 0x07, 0xc0, 0x56, 0xc5, 0xfd, 0x3c, 0xff, 0x7d, 0x94, 0x9e, 0x5f, 0x15, 0xb9, 0x37, 0x6b, - 0x39, 0xb8, 0x88, 0xb7, 0xe1, 0xd9, 0xd3, 0x5e, 0x89, 0x46, 0xf8, 0x25, 0x96, 0x38, 0xcb, 0x5e, - 0x1b, 0x38, 0x7e, 0x10, 0xfd, 0x03, 0x73, 0x04, 0x6a, 0x03, 0x6d, 0x80, 0x9f, 0x0b, 0xb9, 0xaa, - 0x08, 0x14, 0x0b, 0xa3, 0x0b, 0xf3, 0xa1, 0x38, 0x2a, 0xf6, 0xb1, 0x57, 0x0c, 0x1f, 0xfc, 0x6c, - 0xec, 0x6c, 0x6e, 0x8e, 0x9d, 0xd0, 0x9b, 0x38, 0x81, 0xbb, 0xde, 0x13, 0xb9, 0x03, 0xe6, 0x38, - 0x71, 0xd3, 0x17, 0x97, 0xfb, 0xe7, 0x80, 0x2a, 0x28, 0xa0, 0xa0, 0xbf, 0x1a, 0xe8, 0x60, 0xec, - 0x50, 0x9d, 0x27, 0x70, 0x66, 0xa6, 0xc7, 0xce, 0xf6, 0x56, 0x76, 0x73, 0x33, 0xd4, 0x4b, 0xc6, - 0xea, 0x85, 0x22, 0x74, 0x05, 0xc8, 0x27, 0xc0, 0x3d, 0xd7, 0x02, 0x5c, 0x13, 0xcf, 0x0a, 0x36, - 0x13, 0xd4, 0x46, 0x4e, 0x74, 0x25, 0x10, 0xd2, 0xea, 0x17, 0x4e, 0x40, 0xa1, 0xb3, 0xb0, 0x71, - 0x11, 0x53, 0x91, 0x6e, 0x86, 0x71, 0x1e, 0xc2, 0xf1, 0xea, 0x64, 0x18, 0x0d, 0xdd, 0x9a, 0x4d, - 0x7a, 0x13, 0x00, 0x82, 0x86, 0x8f, 0xe8, 0x31, 0xd7, 0x43, 0x03, 0xb1, 0xdb, 0x71, 0x6d, 0x54, - 0x67, 0x98, 0xac, 0xa3, 0xb2, 0xea, 0x08, 0xf4, 0x2b, 0x82, 0xda, 0xe8, 0x19, 0x88, 0xf9, 0x74, - 0x57, 0x37, 0x81, 0x56, 0xdd, 0x4c, 0xa5, 0x54, 0x40, 0xb4, 0x3a, 0xe1, 0xd4, 0xa4, 0xbb, 0x45, - 0x93, 0xff, 0x65, 0xf2, 0x99, 0x7c, 0x09, 0xb3, 0x8d, 0xd5, 0xd9, 0x5b, 0x98, 0xfb, 0x2f, 0x87, - 0xcf, 0x94, 0x44, 0xe4, 0xa2, 0xe6, 0x0e, 0xe8, 0x4a, 0x09, 0x2e, 0x95, 0xcc, 0x36, 0xd0, 0x85, - 0x02, 0x6c, 0x9f, 0x43, 0xdf, 0xef, 0x14, 0x58, 0x5a, 0x8a, 0x13, 0x12, 0x1c, 0x5e, 0x61, 0xe1, - 0xb9, 0xca, 0xf4, 0x54, 0xc3, 0xf9, 0xfd, 0xdb, 0xdc, 0x71, 0x82, 0x0a, 0xce, 0x0e, 0xc8, 0x94, - 0x21, 0x52, 0x14, 0x7e, 0x41, 0x15, 0x28, 0x2d, 0x7c, 0x01, 0x6e, 0xea, 0xa0, 0xe8, 0x06, 0x21, - 0x0f, 0x00, 0x60, 0xfa, 0xb7, 0x8b, 0xd5, 0xcd, 0xcd, 0x2f, 0x26, 0x4b, 0x33, 0x52, 0x34, 0x3e, - 0x04, 0xd3, 0xbf, 0x63, 0x57, 0x36, 0x37, 0x59, 0x7e, 0xa8, 0xbc, 0x97, 0x8e, 0x29, 0xee, 0x56, - 0x49, 0xfc, 0x17, 0x56, 0x71, 0x08, 0x1a, 0x4f, 0x7a, 0xc8, 0x91, 0x07, 0x93, 0x6d, 0x9b, 0x63, - 0x5c, 0x42, 0x80, 0x1f, 0xc0, 0xa8, 0xa7, 0x06, 0xfe, 0xfa, 0xee, 0xda, 0xdb, 0xdf, 0x5d, 0xd5, - 0xdf, 0x9c, 0xa0, 0xef, 0x1e, 0xe0, 0xb6, 0xff, 0x31, 0x23, 0xf3, 0xef, 0x19, 0x57, 0x0d, 0x67, - 0xd1, 0x37, 0x08, 0x60, 0x96, 0x3b, 0x07, 0x25, 0xda, 0xcb, 0xce, 0x40, 0xf5, 0x5f, 0x8b, 0x66, - 0x2c, 0xcf, 0xed, 0xe8, 0xcd, 0x8a, 0x17, 0x7c, 0x06, 0xe3, 0x27, 0x3e, 0x5a, 0xa8, 0x2f, 0x7e, - 0x73, 0x93, 0x7e, 0xfd, 0x20, 0x3f, 0x17, 0x4f, 0x69, 0x48, 0x4d, 0xc2, 0x44, 0x06, 0x3f, 0x61, - 0x68, 0x61, 0x47, 0xe4, 0xa5, 0x2e, 0x4d, 0x71, 0xc3, 0x25, 0xe4, 0x8d, 0x0c, 0xca, 0x5a, 0x5e, - 0x5e, 0x08, 0x9a, 0x9f, 0x94, 0xb6, 0x9c, 0x50, 0xf7, 0x24, 0x4b, 0xbb, 0x93, 0x74, 0x5f, 0xb7, - 0xa7, 0x85, 0x7f, 0xff, 0xfe, 0xe2, 0x57, 0xe2, 0x19, 0x5c, 0x98, 0x43, 0xd6, 0x7d, 0xcf, 0x39, - 0x0a, 0xa3, 0xd7, 0x7a, 0x46, 0x12, 0x77, 0x0b, 0xfc, 0x82, 0xfe, 0x68, 0xdc, 0x34, 0xa8, 0xc2, - 0x3b, 0xf4, 0xb3, 0x96, 0x54, 0x09, 0xbe, 0x22, 0x17, 0xd2, 0x0c, 0x21, 0x78, 0xb4, 0x16, 0x8f, - 0xaf, 0x7a, 0xdc, 0x65, 0xe5, 0x86, 0x1d, 0x56, 0xaf, 0xba, 0x8f, 0xbb, 0x0f, 0x31, 0xf5, 0xaa, - 0xef, 0x84, 0x9e, 0x71, 0x2b, 0x61, 0xb1, 0xf6, 0xac, 0x5d, 0xfa, 0x1e, 0x68, 0xa6, 0x64, 0xd0, - 0x05, 0x26, 0x2b, 0x68, 0x6f, 0x10, 0xef, 0x32, 0x09, 0x60, 0x02, 0x54, 0x57, 0xee, 0xf8, 0x57, - 0x4e, 0xd1, 0xb7, 0x03, 0x83, 0xf8, 0xac, 0xd2, 0x7f, 0x28, 0x72, 0xc8, 0x84, 0x28, 0x2d, 0x73, - 0x30, 0x00, 0xa9, 0x82, 0x2c, 0xd6, 0x9a, 0x72, 0x31, 0x46, 0x60, 0x69, 0x44, 0x45, 0x26, 0x80, - 0x77, 0xc7, 0xc9, 0xa6, 0x64, 0x03, 0x07, 0x88, 0x19, 0x51, 0xbe, 0x60, 0x23, 0x94, 0xdd, 0x50, - 0x6c, 0x13, 0x18, 0xc0, 0xc0, 0x6d, 0x34, 0xa8, 0xa0, 0xa5, 0xcf, 0xdb, 0x22, 0x1f, 0x1e, 0x6a, - 0x23, 0xa4, 0x74, 0xbe, 0x23, 0x87, 0x41, 0xfb, 0x15, 0x2c, 0x93, 0xbe, 0xb6, 0x88, 0xf8, 0xcd, - 0xf0, 0xc1, 0x3e, 0x0d, 0x7c, 0x0b, 0x54, 0x79, 0x07, 0x6e, 0x57, 0x4f, 0x92, 0xdf, 0xbf, 0x21, - 0xe1, 0x4b, 0xc3, 0xcb, 0x45, 0xad, 0x2f, 0x5c, 0x30, 0xa6, 0x5e, 0x5a, 0x0c, 0xda, 0x47, 0xda, - 0x25, 0xe8, 0xf1, 0xe6, 0xcb, 0xef, 0xdf, 0x71, 0x5e, 0x2c, 0x04, 0x5a, 0x67, 0x48, 0xed, 0x5c, - 0x62, 0x85, 0xde, 0x5e, 0x14, 0x59, 0x1e, 0x42, 0xa0, 0x88, 0x2e, 0xde, 0x75, 0x0c, 0xb4, 0x10, - 0x16, 0x7e, 0x5f, 0x50, 0x9d, 0x89, 0x4a, 0x06, 0x3e, 0xa6, 0x5f, 0x92, 0x08, 0x2b, 0x27, 0x30, - 0xa9, 0x58, 0x26, 0x36, 0x37, 0xbe, 0xfe, 0xe2, 0x4f, 0x4e, 0x0c, 0x0d, 0x38, 0x8a, 0x8c, 0xbf, - 0xab, 0xf8, 0x1f, 0xc3, 0x03, 0xdb, 0x81, 0xf3, 0x56, 0x18, 0x28, 0x04, 0xb6, 0x86, 0x3d, 0x0a, - 0x4d, 0xad, 0xdf, 0xcb, 0xcf, 0x21, 0x66, 0x15, 0x26, 0x08, 0x55, 0xa3, 0x22, 0x63, 0x07, 0x4d, - 0xec, 0xbd, 0x51, 0x13, 0x2f, 0x9a, 0xf3, 0x3f, 0x35, 0x68, 0xf2, 0xc1, 0xa0, 0xbd, 0x68, 0xd2, - 0xff, 0xd7, 0x63, 0xa6, 0x1a, 0xe7, 0x7b, 0xe3, 0x66, 0x5b, 0xa5, 0xff, 0xb1, 0x61, 0x27, 0xbd, - 0xad, 0x58, 0x58, 0x8e, 0x3f, 0x7e, 0xf2, 0x81, 0xd5, 0xcc, 0x52, 0xd3, 0x43, 0x83, 0x25, 0x70, - 0xff, 0xae, 0x7f, 0xa9, 0x73, 0x6b, 0x86, 0xbe, 0xd8, 0xcc, 0xfd, 0x1c, 0x12, 0x04, 0x16, 0x72, - 0x79, 0x7b, 0x44, 0xf1, 0x81, 0xdc, 0x10, 0x3b, 0xea, 0x2d, 0x0c, 0xc1, 0xba, 0x3a, 0x05, 0x50, - 0x8b, 0xbd, 0x40, 0x1f, 0xff, 0x57, 0xa7, 0x01, 0xeb, 0x04, 0x21, 0x00, 0x4c, 0x0b, 0x0a, 0x06, - 0xe6, 0x39, 0xef, 0xab, 0xbe, 0x2e, 0xa8, 0xbe, 0x34, 0xc7, 0x01, 0x1b, 0x3e, 0x49, 0xb7, 0xf1, - 0xc0, 0xe6, 0x04, 0x43, 0x6c, 0xdb, 0x85, 0x0f, 0x1e, 0xa1, 0xd3, 0x81, 0xf2, 0x24, 0xd5, 0xf8, - 0xb5, 0x1c, 0x55, 0x90, 0x60, 0x17, 0x61, 0x26, 0xf0, 0x3e, 0x36, 0x2f, 0x9a, 0x11, 0x64, 0x2a, - 0xd4, 0x9c, 0xbf, 0xea, 0x32, 0xe7, 0x87, 0xb8, 0x62, 0x52, 0xee, 0xe7, 0x0e, 0x7e, 0x20, 0x83, - 0x8f, 0xc5, 0x6b, 0x51, 0xa6, 0x91, 0xf4, 0xaa, 0xf1, 0x75, 0x2a, 0x95, 0xc1, 0xe4, 0x9b, 0x07, - 0xd1, 0x08, 0xbf, 0xd8, 0x56, 0x18, 0x9e, 0xa0, 0xe5, 0xc3, 0x3a, 0xee, 0x7c, 0x69, 0xcc, 0x01, - 0x03, 0x42, 0x26, 0x4d, 0xb9, 0x13, 0x3f, 0xf3, 0x64, 0x16, 0x13, 0x32, 0xe2, 0xcf, 0xba, 0x8f, - 0x12, 0xc1, 0x8d, 0x13, 0x2f, 0xab, 0x50, 0x77, 0x19, 0x2e, 0x94, 0x81, 0x75, 0xc9, 0xfb, 0xd8, - 0x65, 0xea, 0x36, 0xa2, 0xd9, 0xb7, 0xf5, 0x28, 0xde, 0xd8, 0x2e, 0xbb, 0xcb, 0x30, 0x44, 0xc5, - 0x30, 0xdb, 0x64, 0x74, 0xa0, 0xff, 0x3c, 0x8f, 0xd6, 0xb5, 0x66, 0x0c, 0x89, 0xf7, 0x26, 0xfa, - 0x40, 0xad, 0x73, 0x10, 0xb3, 0x14, 0xa4, 0xd1, 0xc0, 0x92, 0x20, 0xf7, 0xea, 0x28, 0x1c, 0x61, - 0x16, 0xac, 0xa1, 0xd3, 0x4f, 0xfe, 0x70, 0x05, 0x43, 0x60, 0xda, 0x87, 0xcb, 0xff, 0x44, 0xbd, - 0x9c, 0x26, 0x83, 0x86, 0x4e, 0x27, 0x21, 0x16, 0xa2, 0x96, 0x50, 0x12, 0xc8, 0xec, 0x17, 0xd8, - 0x9f, 0x9b, 0xeb, 0x10, 0x3c, 0xe7, 0xb9, 0xed, 0x5f, 0x14, 0xc8, 0x3f, 0x66, 0x21, 0x25, 0xc4, - 0xe5, 0x77, 0xb8, 0x20, 0xf8, 0xf4, 0x1b, 0x0b, 0xe9, 0xf0, 0xaf, 0x04, 0xfd, 0x46, 0x43, 0x38, - 0xb2, 0x79, 0x16, 0x58, 0x8c, 0x3a, 0xe1, 0x3c, 0x12, 0xb8, 0xe3, 0x5f, 0xa0, 0x84, 0xb3, 0xe6, - 0x77, 0x79, 0xee, 0x45, 0xcd, 0xb0, 0xe0, 0x91, 0x5f, 0x34, 0x18, 0x21, 0x95, 0x9a, 0xb3, 0x49, - 0x64, 0xb1, 0xf2, 0x11, 0x53, 0x85, 0x91, 0xf7, 0x65, 0x33, 0xb9, 0x60, 0x1e, 0x48, 0xbc, 0xcc, - 0x18, 0xf7, 0xe3, 0x1d, 0xc2, 0x8a, 0x0f, 0xc5, 0x23, 0x46, 0x3c, 0x79, 0xf4, 0xed, 0x5b, 0x00, - 0x02, 0xba, 0xc5, 0xb0, 0x37, 0x8c, 0x60, 0x16, 0xf1, 0x73, 0xe1, 0xf6, 0x5c, 0x58, 0xe8, 0xba, - 0x36, 0x22, 0x54, 0x43, 0xe3, 0x92, 0xa7, 0xf0, 0xc8, 0x83, 0x52, 0xe7, 0x52, 0xcf, 0x97, 0x9f, - 0xe8, 0xa5, 0xa8, 0x69, 0x46, 0xc1, 0xae, 0x1f, 0x32, 0x02, 0x55, 0x89, 0xea, 0xa4, 0xc7, 0xa3, - 0x45, 0x2c, 0x87, 0x97, 0xa4, 0xe0, 0x0f, 0x3f, 0x8e, 0xc3, 0x4b, 0x83, 0x5f, 0x0e, 0xe9, 0xd1, - 0x28, 0x0c, 0x92, 0xee, 0x3a, 0x69, 0x94, 0xd3, 0x18, 0x71, 0xe2, 0x57, 0x51, 0xdc, 0x65, 0x12, - 0xa6, 0x03, 0x5b, 0x28, 0x9d, 0x9c, 0x80, 0x8e, 0xb8, 0xae, 0x4d, 0x48, 0x9f, 0x48, 0x56, 0x26, - 0x4b, 0xf2, 0x75, 0xb3, 0x61, 0xa6, 0x5d, 0xb3, 0x8d, 0x2f, 0xb7, 0x00, 0x73, 0xbf, 0xce, 0x3c, - 0x0f, 0x1e, 0x48, 0x6b, 0x6c, 0x83, 0xf6, 0xcf, 0x9d, 0xa3, 0x6f, 0x47, 0xd2, 0x15, 0x0a, 0x51, - 0xe5, 0xea, 0xce, 0x36, 0x54, 0xdc, 0x31, 0x1a, 0x49, 0x07, 0xfe, 0xcf, 0x34, 0xe0, 0x07, 0x1f, - 0x80, 0x80, 0x3c, 0x71, 0x47, 0xac, 0x65, 0x79, 0xd0, 0xfa, 0x13, 0x4d, 0xae, 0xe6, 0xa0, 0xf3, - 0x2e, 0x49, 0xcb, 0x16, 0xc5, 0x7f, 0x51, 0x43, 0x82, 0x5a, 0xa1, 0x50, 0xb1, 0x28, 0xd2, 0x42, - 0x83, 0xa6, 0x67, 0x80, 0xea, 0x1e, 0x67, 0x21, 0xe9, 0x21, 0x65, 0x28, 0x48, 0x39, 0x60, 0x65, - 0x0b, 0xe6, 0x4f, 0xb0, 0xa7, 0xe3, 0x92, 0x01, 0xca, 0xf0, 0x26, 0x50, 0xfb, 0x0e, 0xe8, 0xf6, - 0xbe, 0x06, 0x0f, 0x45, 0xa9, 0x83, 0x19, 0x97, 0x4b, 0x2d, 0x9a, 0xce, 0x5a, 0x90, 0x1a, 0xdc, - 0xc9, 0x70, 0xd8, 0x97, 0x5e, 0x86, 0x1c, 0x68, 0x7d, 0x23, 0x62, 0xa7, 0xa9, 0x2d, 0xee, 0x39, - 0x38, 0xc5, 0x74, 0xb6, 0x90, 0xe6, 0x50, 0x13, 0x82, 0x72, 0x87, 0x26, 0xb0, 0x5e, 0x0e, 0xd9, - 0x38, 0x16, 0xd3, 0x60, 0x01, 0x0c, 0x31, 0xc0, 0x89, 0xdb, 0x92, 0x75, 0xbf, 0x48, 0x67, 0x68, - 0xfd, 0x9f, 0xff, 0x0d, 0xa0, 0xb0, 0x90, 0x62, 0xd0, 0x34, 0x7c, 0x00, 0xe5, 0x1c, 0x96, 0xc4, - 0x08, 0xec, 0x04, 0xac, 0x3a, 0x4f, 0x00, 0xbf, 0x92, 0xe6, 0x1c, 0x46, 0x2b, 0xd1, 0x3f, 0xfa, - 0x86, 0x8f, 0xed, 0xff, 0x65, 0xfc, 0x63, 0xa6, 0xcf, 0xf1, 0xd3, 0xef, 0x24, 0xb7, 0x3b, 0xd4, - 0x74, 0x74, 0xf7, 0xa7, 0x47, 0x9a, 0xca, 0x47, 0xb3, 0x3a, 0xa0, 0x64, 0x4b, 0x7a, 0x02, 0xd4, - 0x63, 0xca, 0x70, 0xb1, 0xd0, 0x58, 0xeb, 0x6a, 0x69, 0x87, 0xa6, 0xa7, 0xb8, 0x7f, 0x26, 0x92, - 0xe8, 0x38, 0xa5, 0x69, 0x36, 0xa8, 0xe4, 0x02, 0x97, 0x50, 0x77, 0x07, 0x60, 0xd8, 0x47, 0xc1, - 0xdc, 0x5a, 0x68, 0x1c, 0x72, 0x42, 0xcc, 0x50, 0x4c, 0x0f, 0x69, 0x3a, 0x1f, 0x2b, 0x7d, 0x43, - 0xcb, 0x92, 0x34, 0xcd, 0x8b, 0x66, 0xb5, 0x81, 0x80, 0x12, 0x48, 0x41, 0x40, 0x4f, 0xd0, 0xd6, - 0xcb, 0xae, 0xd7, 0x12, 0x01, 0x93, 0xc2, 0x96, 0x06, 0x3b, 0xd1, 0x82, 0x97, 0x9d, 0xeb, 0xe6, - 0x19, 0x27, 0x24, 0xbd, 0xdc, 0x4c, 0x56, 0xcc, 0x15, 0xf8, 0x10, 0xcd, 0x79, 0x10, 0x90, 0x19, - 0x44, 0x5a, 0xd9, 0x87, 0x65, 0x38, 0x40, 0x8a, 0x4b, 0x78, 0x21, 0x51, 0x9c, 0x60, 0xc4, 0x3a, - 0xd2, 0x04, 0x0c, 0x83, 0x1e, 0x9c, 0x68, 0x5f, 0x76, 0xb0, 0xab, 0x94, 0x68, 0xbb, 0x96, 0x13, - 0x2b, 0x75, 0xd6, 0x6c, 0x25, 0x24, 0x55, 0x05, 0xc6, 0xe5, 0x60, 0xa9, 0x81, 0xa4, 0xc4, 0xc7, - 0x03, 0xb6, 0xba, 0x33, 0x75, 0x40, 0x93, 0xc6, 0x7c, 0x58, 0x5a, 0xc3, 0x14, 0xba, 0x95, 0xe9, - 0xa3, 0x9b, 0xc2, 0xee, 0x21, 0x82, 0x43, 0xc4, 0x9b, 0x05, 0xcb, 0x97, 0x15, 0xcc, 0xb0, 0x42, - 0x40, 0xc8, 0xff, 0x5c, 0xc2, 0xf7, 0xbe, 0x31, 0xd2, 0x6c, 0xd3, 0x18, 0xd0, 0xae, 0x93, 0x34, - 0x06, 0x2d, 0x53, 0x8b, 0x17, 0xc3, 0x37, 0x6c, 0x02, 0x8f, 0x74, 0xd6, 0xf4, 0xb1, 0x66, 0xa5, - 0x38, 0x56, 0x19, 0x8c, 0x46, 0x4a, 0x1e, 0xbf, 0x98, 0x5b, 0xea, 0x65, 0x14, 0xe5, 0x35, 0xcb, - 0xeb, 0xdb, 0x3f, 0x06, 0x15, 0x5e, 0xe3, 0xb8, 0x86, 0x82, 0x30, 0xb1, 0x24, 0x9a, 0x34, 0x3d, - 0xa6, 0x5d, 0x30, 0x71, 0x1d, 0x0f, 0x16, 0xf3, 0x62, 0xc4, 0xfc, 0x1a, 0xdb, 0x59, 0x7e, 0x11, - 0xf8, 0x21, 0xd6, 0xcd, 0xef, 0x7e, 0xc6, 0xe6, 0xa6, 0xf9, 0xbd, 0x50, 0x37, 0x17, 0x2e, 0x58, - 0x0a, 0xf9, 0x87, 0xf9, 0x93, 0x0a, 0x24, 0x23, 0x24, 0x90, 0xd2, 0x40, 0xc0, 0x75, 0x2f, 0xea, - 0xed, 0x87, 0xf1, 0xb3, 0xe1, 0xa4, 0x4d, 0x74, 0x5c, 0x36, 0xc2, 0x0d, 0x53, 0x97, 0x7c, 0xa8, - 0x1f, 0x46, 0x0a, 0x08, 0xc1, 0xd8, 0xc6, 0xce, 0x60, 0x16, 0xf6, 0xc9, 0x5b, 0x49, 0x11, 0x09, - 0xe5, 0x1f, 0x18, 0xfa, 0xc7, 0xcc, 0x41, 0xab, 0x98, 0x3a, 0x5d, 0xe1, 0x69, 0x07, 0xfe, 0x6a, - 0xfe, 0x99, 0x30, 0xc0, 0x30, 0xda, 0xe0, 0x28, 0x2d, 0x00, 0xa3, 0xec, 0x2b, 0xf1, 0x9d, 0x55, - 0xf5, 0xcf, 0x4b, 0xd0, 0x1b, 0x2d, 0xe9, 0x1d, 0xaa, 0x1c, 0xe6, 0x26, 0x36, 0x0d, 0xd9, 0xb1, - 0xea, 0xf8, 0x14, 0x89, 0x8d, 0xa7, 0xe5, 0x64, 0x73, 0xc2, 0xf9, 0xe7, 0xc9, 0xfe, 0x31, 0x33, - 0xe6, 0x8e, 0x17, 0x42, 0x1d, 0x1c, 0x6d, 0xc1, 0xde, 0x26, 0x31, 0x87, 0xe7, 0x12, 0xd8, 0x31, - 0x48, 0xd9, 0xe1, 0xbc, 0xcb, 0x35, 0xa9, 0x8c, 0xa3, 0x4d, 0x44, 0x04, 0x5d, 0x70, 0x97, 0x26, - 0xed, 0x04, 0xe7, 0x47, 0x86, 0x62, 0x47, 0x33, 0xb4, 0xa7, 0xf4, 0x31, 0x76, 0x5b, 0x0b, 0xeb, - 0xde, 0xda, 0xc3, 0x3c, 0x09, 0x60, 0xd7, 0xd0, 0xfe, 0x02, 0xf1, 0x3b, 0x9c, 0xa4, 0xb8, 0x1c, - 0xd3, 0x91, 0x42, 0xfd, 0x87, 0x62, 0x51, 0x91, 0x0e, 0xdd, 0xbf, 0x1c, 0xdb, 0xfe, 0x08, 0x02, - 0x2d, 0x0b, 0x70, 0x3a, 0x8f, 0xde, 0x42, 0x44, 0x3b, 0x10, 0x9c, 0xae, 0x63, 0x47, 0xa7, 0x18, - 0x4c, 0x7a, 0xb3, 0xcb, 0xea, 0x23, 0x42, 0x58, 0x29, 0x72, 0xe4, 0x8a, 0xd5, 0x90, 0x97, 0xee, - 0x82, 0x01, 0x50, 0x78, 0x1d, 0x8c, 0xd7, 0x8d, 0xbf, 0x7f, 0x23, 0x0c, 0x8e, 0x00, 0x5a, 0x81, - 0xc1, 0x67, 0xbc, 0x4e, 0x7c, 0x74, 0x56, 0x88, 0x8e, 0x6f, 0xf1, 0xf4, 0xa9, 0x03, 0x43, 0x74, - 0xca, 0x3c, 0x5a, 0x63, 0x1a, 0x0a, 0x53, 0x4d, 0xfc, 0xc3, 0x87, 0x91, 0x05, 0x1c, 0x28, 0x7c, - 0x9e, 0x1b, 0x3f, 0x58, 0x5a, 0x06, 0x2c, 0x2d, 0xf4, 0xe5, 0x87, 0x07, 0x8b, 0x60, 0x7e, 0x2d, - 0xb0, 0xf5, 0x2b, 0x6c, 0xad, 0xca, 0x38, 0x60, 0x6a, 0xf8, 0x8c, 0x35, 0xba, 0x45, 0xc3, 0xcf, - 0x14, 0xdc, 0x08, 0xcc, 0xd5, 0xe8, 0x57, 0x3e, 0x57, 0xf3, 0x1c, 0x36, 0xfb, 0x9d, 0xcb, 0x7c, - 0x8e, 0xab, 0xd3, 0xd4, 0x2c, 0xcb, 0xac, 0x84, 0x33, 0x2b, 0xb9, 0x52, 0x89, 0x9b, 0x7b, 0xbf, - 0x77, 0x42, 0xee, 0x12, 0xd9, 0x88, 0xf8, 0x5c, 0x38, 0xdc, 0x5c, 0xa4, 0x7b, 0x98, 0x98, 0xbe, - 0x43, 0xd2, 0x9a, 0x55, 0x63, 0xcf, 0xcb, 0x4c, 0x89, 0xc5, 0x02, 0xd3, 0x60, 0x3f, 0xc6, 0x46, - 0x40, 0xef, 0x70, 0xf0, 0x03, 0x47, 0x8d, 0x1b, 0x6b, 0x69, 0x1a, 0xef, 0xcc, 0xcf, 0xbc, 0x87, - 0xa8, 0xb5, 0x40, 0x81, 0xd2, 0x0d, 0x54, 0x9d, 0xb4, 0xcc, 0x01, 0xbe, 0x13, 0x05, 0x6b, 0x48, - 0x28, 0xa1, 0x02, 0xfc, 0xe9, 0x00, 0x49, 0xff, 0xee, 0xd7, 0xf7, 0x36, 0x43, 0x74, 0x9f, 0x37, - 0x49, 0x0d, 0x2f, 0xe7, 0x87, 0xfe, 0x13, 0x1b, 0x94, 0x58, 0x75, 0x67, 0xa1, 0x12, 0xac, 0x32, - 0x3e, 0x80, 0xf5, 0x86, 0xa8, 0x5f, 0x82, 0x11, 0xce, 0x23, 0x21, 0xd2, 0xde, 0x85, 0x52, 0x9e, - 0xcf, 0xeb, 0x1b, 0x8d, 0x13, 0xce, 0x64, 0xbc, 0x92, 0xdf, 0x98, 0xa9, 0xc1, 0xb0, 0x26, 0xf1, - 0x21, 0x73, 0x43, 0x00, 0xf5, 0x98, 0x4d, 0x97, 0x44, 0xb7, 0xaf, 0x21, 0x0f, 0xf5, 0x00, 0x0d, - 0x4a, 0x8b, 0x8d, 0x86, 0x84, 0xe2, 0x7e, 0x87, 0x3b, 0xcf, 0x80, 0xae, 0x44, 0x9f, 0xe7, 0xb8, - 0xd0, 0x7e, 0x01, 0x2f, 0x04, 0x1d, 0x77, 0x0e, 0xc8, 0x50, 0x95, 0xef, 0xe2, 0x8e, 0x99, 0x6a, - 0x70, 0x91, 0x60, 0xfa, 0x84, 0x86, 0x37, 0xd4, 0x39, 0x28, 0x2c, 0xd4, 0x34, 0x57, 0x03, 0x40, - 0xa8, 0x80, 0x60, 0xb1, 0x73, 0x33, 0x61, 0x82, 0xc1, 0x69, 0x2f, 0x22, 0xc5, 0x13, 0x5d, 0x94, - 0x59, 0x69, 0xdc, 0x50, 0x45, 0x76, 0xca, 0x5e, 0x31, 0xe6, 0x33, 0x11, 0x7c, 0xeb, 0x2a, 0x5d, - 0xa3, 0xb0, 0x5a, 0xe6, 0xf4, 0x2b, 0x10, 0x5f, 0x2d, 0x26, 0x75, 0x03, 0x40, 0x35, 0x14, 0x62, - 0x14, 0x91, 0x73, 0x4a, 0xf4, 0x51, 0x51, 0x65, 0x44, 0x28, 0xdd, 0x8c, 0x1a, 0xda, 0x5e, 0x74, - 0xf8, 0x4a, 0x0b, 0x9b, 0xc5, 0xbe, 0x7f, 0xca, 0xc0, 0x0e, 0xdc, 0x6c, 0x43, 0x5d, 0xa5, 0x3b, - 0x8e, 0x08, 0x3b, 0x81, 0xc0, 0x69, 0xc0, 0x39, 0xf3, 0xb6, 0x7f, 0xd6, 0xdb, 0x14, 0x21, 0xd6, - 0x40, 0xe7, 0x27, 0x7f, 0xd5, 0xdb, 0xb4, 0xbc, 0x0c, 0x02, 0x97, 0x85, 0x67, 0x57, 0x50, 0x17, - 0x87, 0x40, 0x25, 0x34, 0xf1, 0x2d, 0x7d, 0x4a, 0xd0, 0xcc, 0xa0, 0xc3, 0xbd, 0x4e, 0x12, 0xde, - 0xe9, 0x24, 0x3f, 0xdc, 0x9f, 0x8d, 0x99, 0xa6, 0xd6, 0x88, 0xbf, 0x99, 0x09, 0xb8, 0x67, 0x3f, - 0xc0, 0x9e, 0x45, 0x18, 0x9f, 0x5d, 0x36, 0x80, 0x12, 0xdf, 0x95, 0x80, 0xf0, 0x44, 0x06, 0x89, - 0xa3, 0x27, 0xcc, 0xd0, 0xb5, 0x20, 0x02, 0xbe, 0x83, 0x9e, 0x30, 0xd6, 0x44, 0xc2, 0x3b, 0x8c, - 0xa8, 0x94, 0xe3, 0x26, 0x23, 0x6d, 0x82, 0xde, 0x3b, 0x7a, 0xd1, 0x4d, 0x72, 0xd7, 0x9d, 0xbb, - 0x3d, 0x8e, 0xff, 0x2e, 0xfa, 0xab, 0x7c, 0x45, 0x91, 0x7f, 0xa3, 0x7f, 0x14, 0x07, 0x6c, 0x6e, - 0x8b, 0x3b, 0x4e, 0xa8, 0x84, 0x33, 0x94, 0x41, 0x9b, 0x4d, 0x9a, 0x7c, 0xcd, 0x6c, 0x54, 0xab, - 0x55, 0x14, 0xf4, 0x3d, 0xdc, 0xf4, 0x02, 0xb4, 0x21, 0x79, 0xa3, 0x53, 0xf3, 0xd0, 0x1d, 0xe8, - 0x49, 0xae, 0x3b, 0x01, 0xaa, 0xc3, 0x6a, 0x9a, 0x2a, 0x2c, 0x55, 0x17, 0x41, 0xb1, 0x17, 0x16, - 0xc7, 0xe6, 0x70, 0x3f, 0x04, 0xff, 0x07, 0xfd, 0x8f, 0xd2, 0xa4, 0x7f, 0x9e, 0xf0, 0x7d, 0x15, - 0x6a, 0xe1, 0x4e, 0xf3, 0xed, 0x3f, 0x9c, 0xa7, 0xff, 0x4f, 0xa6, 0xc8, 0xdb, 0x37, 0xc7, 0xf9, - 0x09, 0xd4, 0x3b, 0xbf, 0x3f, 0x4c, 0x3d, 0x0b, 0xfa, 0x83, 0x9a, 0xd9, 0x5a, 0x34, 0x7a, 0x4e, - 0x4b, 0xc4, 0xa5, 0xe9, 0xe1, 0xd2, 0x64, 0xb8, 0x14, 0x42, 0xe7, 0xd7, 0x38, 0xe1, 0xdb, 0x7b, - 0x47, 0xd6, 0x80, 0xc7, 0x31, 0xab, 0xdb, 0x3f, 0xf3, 0xb7, 0x1a, 0xb1, 0x91, 0x6d, 0xde, 0x20, - 0x30, 0x66, 0x55, 0x5c, 0xef, 0x57, 0x0f, 0x52, 0x82, 0xde, 0x86, 0xcc, 0xbd, 0x8b, 0xea, 0x19, - 0x1b, 0x32, 0xe2, 0x36, 0x8d, 0x0e, 0x2f, 0xe8, 0x35, 0x8e, 0xc3, 0x61, 0x29, 0xf1, 0xc0, 0xde, - 0xa0, 0xeb, 0x7c, 0x1d, 0xb7, 0x90, 0x1c, 0xb6, 0x17, 0x89, 0xc8, 0xf1, 0xfa, 0xd5, 0x72, 0x1c, - 0xa0, 0xbe, 0x68, 0x18, 0x50, 0x38, 0x8f, 0xed, 0x83, 0x84, 0x4f, 0x90, 0x2c, 0xf6, 0xd3, 0x16, - 0x69, 0x3f, 0x08, 0x95, 0x2f, 0x5f, 0x5c, 0x7f, 0x7f, 0xc4, 0xbf, 0x70, 0x21, 0xc1, 0x82, 0x8e, - 0xb3, 0x0d, 0x90, 0x44, 0x6c, 0x10, 0xe8, 0x0b, 0x00, 0xa2, 0x68, 0xa0, 0x5f, 0x4a, 0x88, 0xc6, - 0x5c, 0x60, 0x3a, 0xef, 0xe5, 0x43, 0x6e, 0x03, 0x34, 0x1b, 0x9e, 0x8f, 0x3a, 0x89, 0x18, 0x0e, - 0xc5, 0x3a, 0xf9, 0xee, 0xc3, 0xab, 0x13, 0x44, 0x0a, 0xb5, 0x91, 0x41, 0x17, 0x77, 0xb1, 0x27, - 0x74, 0xf5, 0x0a, 0xba, 0x20, 0x09, 0x76, 0xe3, 0x4b, 0x16, 0x3b, 0x16, 0x6d, 0xc7, 0xe1, 0x79, - 0xbb, 0x81, 0xee, 0xa2, 0x0c, 0xb4, 0xf0, 0x2f, 0xb0, 0x61, 0x04, 0xe6, 0x31, 0x12, 0x74, 0xf8, - 0xca, 0xfd, 0x14, 0x24, 0xf8, 0xca, 0xff, 0xa4, 0x61, 0x41, 0x09, 0x8c, 0x5b, 0xb2, 0x41, 0xde, - 0x3b, 0xbc, 0x81, 0xfd, 0xf1, 0x2c, 0x77, 0x7a, 0x27, 0x14, 0xba, 0xa8, 0x57, 0xa4, 0x49, 0xcb, - 0x69, 0x01, 0xa8, 0xe0, 0x4c, 0x8e, 0x4f, 0x0d, 0xd8, 0xec, 0x56, 0xb6, 0x0e, 0xed, 0xfb, 0x39, - 0x30, 0x00, 0xc4, 0x8c, 0x1e, 0x4d, 0xc9, 0xd2, 0x5e, 0x85, 0x53, 0x72, 0x3f, 0xe7, 0x5f, 0x00, - 0xad, 0x0d, 0x1b, 0x10, 0x66, 0x37, 0x48, 0xc6, 0xc7, 0x07, 0x8e, 0x27, 0x70, 0x6e, 0xfd, 0xc2, - 0xb8, 0x07, 0xd4, 0x9b, 0x04, 0x34, 0xb3, 0x05, 0xb4, 0xc0, 0x79, 0x10, 0x6d, 0xf6, 0xfc, 0x9f, - 0xbf, 0x78, 0x4f, 0xd9, 0xf9, 0x15, 0xba, 0xd0, 0x2a, 0xb1, 0xf6, 0x46, 0x2b, 0x8c, 0x89, 0xa3, - 0xb1, 0x45, 0xc0, 0xe2, 0xeb, 0xbf, 0xa2, 0xd4, 0x42, 0x97, 0xd9, 0x05, 0x7d, 0xfb, 0x4b, 0xb0, - 0xd0, 0xa8, 0xd2, 0xe3, 0xef, 0x1f, 0xb2, 0x37, 0xc3, 0x2c, 0xd4, 0x51, 0x32, 0x67, 0x7b, 0x84, - 0xa0, 0x3b, 0xd2, 0x9c, 0xf0, 0xf6, 0xe0, 0xca, 0x65, 0x4b, 0xb7, 0x24, 0x05, 0x07, 0x7d, 0x30, - 0x9c, 0x80, 0xee, 0x11, 0x40, 0x46, 0x78, 0x83, 0x32, 0xee, 0xbb, 0xc3, 0xc1, 0x86, 0x8e, 0xb2, - 0x62, 0x5b, 0xde, 0x4f, 0x68, 0xb0, 0xc1, 0x1c, 0x11, 0xa0, 0xd1, 0xb4, 0x98, 0x46, 0x83, 0x12, - 0xdf, 0xf7, 0xe3, 0xc5, 0xac, 0x8d, 0xd0, 0xdd, 0xe8, 0xdc, 0xb2, 0xf1, 0xb2, 0xf0, 0xd2, 0x51, - 0xb5, 0x1a, 0xb7, 0x3c, 0x99, 0xe6, 0xbc, 0xb0, 0x61, 0x3c, 0x1d, 0x1a, 0xa7, 0x60, 0xa1, 0x17, - 0x07, 0x83, 0x0d, 0x6b, 0xb9, 0x6c, 0xa1, 0xa1, 0x03, 0xfe, 0x4b, 0x23, 0x30, 0x62, 0x49, 0xba, - 0x2f, 0x39, 0x4d, 0xd7, 0xb5, 0x35, 0xd0, 0xa2, 0x48, 0x92, 0x03, 0x85, 0x9f, 0xe3, 0x41, 0xe9, - 0x94, 0xfc, 0x24, 0xea, 0x0d, 0x63, 0x77, 0xb6, 0xd4, 0x80, 0xec, 0x04, 0xb3, 0xc1, 0x4c, 0x72, - 0x9a, 0x92, 0x71, 0xeb, 0x49, 0x73, 0x61, 0x8f, 0xc2, 0x32, 0xff, 0x5e, 0x14, 0x99, 0x7a, 0x94, - 0xf3, 0x3d, 0x5c, 0xbf, 0x56, 0xbf, 0x3a, 0x31, 0xf4, 0x82, 0x02, 0x3a, 0xae, 0x7f, 0x0a, 0xa1, - 0xfb, 0xa9, 0x59, 0x0a, 0xff, 0xab, 0x8e, 0xd1, 0x72, 0xa8, 0x1a, 0xa1, 0xee, 0xb0, 0xee, 0x80, - 0x49, 0xcc, 0xc2, 0xc0, 0xd0, 0xc7, 0xa5, 0x50, 0x8c, 0x86, 0xe3, 0xf9, 0x6d, 0x23, 0x00, 0xd7, - 0xc1, 0x0e, 0x62, 0x29, 0x99, 0xe5, 0x41, 0x41, 0xa2, 0xa7, 0x37, 0x69, 0x84, 0xfd, 0x9f, 0xde, - 0x45, 0x36, 0x21, 0x52, 0x0d, 0x07, 0x8f, 0xd0, 0xf0, 0xfa, 0x34, 0x3b, 0xa9, 0xf8, 0x57, 0xdb, - 0x0c, 0x85, 0x69, 0x30, 0xd0, 0x49, 0x2e, 0xfe, 0x66, 0xc5, 0xf0, 0xa6, 0xe7, 0xc2, 0x1f, 0xeb, - 0x6f, 0xbd, 0xd2, 0x33, 0x3a, 0x1c, 0x75, 0x33, 0x7f, 0x28, 0x5d, 0x57, 0xc5, 0x84, 0x78, 0xa7, - 0xe6, 0x70, 0xeb, 0x36, 0x00, 0x86, 0x3b, 0x06, 0x7f, 0x13, 0x18, 0x90, 0x61, 0xe4, 0xec, 0xdd, - 0xb6, 0xe8, 0x93, 0x23, 0xb5, 0xc4, 0xac, 0x7f, 0xcc, 0x22, 0xd9, 0x73, 0xf3, 0x17, 0x5f, 0x07, - 0xd3, 0xcd, 0x0d, 0x41, 0x95, 0x54, 0x35, 0x0c, 0x52, 0x48, 0xae, 0xab, 0xfb, 0xaa, 0xcb, 0x60, - 0xcf, 0xbd, 0x5b, 0x79, 0x1e, 0x47, 0x21, 0xee, 0xd8, 0xb0, 0x78, 0x91, 0xf0, 0x7d, 0xc2, 0xe1, - 0xa8, 0x11, 0x3c, 0xa6, 0x48, 0x8d, 0x7e, 0x6d, 0x44, 0x68, 0xc0, 0x05, 0x43, 0x38, 0x35, 0xba, - 0x74, 0xb6, 0x67, 0x4e, 0xbf, 0x3c, 0xbc, 0xf0, 0x41, 0xd0, 0x1d, 0xc3, 0x57, 0x38, 0x8f, 0xe2, - 0xcc, 0xaf, 0x86, 0xa8, 0x03, 0x86, 0xd2, 0x08, 0x9d, 0x57, 0x04, 0x32, 0x02, 0x73, 0x56, 0xb6, - 0x89, 0xf4, 0x32, 0xf7, 0x95, 0x02, 0xbc, 0x77, 0x22, 0xac, 0x13, 0x7c, 0x5b, 0x7b, 0x07, 0x05, - 0x3d, 0xac, 0xff, 0x2d, 0xa5, 0x07, 0x11, 0x0d, 0x68, 0x47, 0xa2, 0x96, 0xd9, 0x10, 0xd9, 0x4e, - 0xe0, 0xe6, 0x26, 0x59, 0xea, 0xa8, 0x37, 0xa9, 0x2b, 0x3a, 0x49, 0x56, 0x75, 0xb2, 0x3d, 0x09, - 0xf7, 0xd1, 0x53, 0x51, 0xc3, 0x0d, 0x46, 0xd4, 0x54, 0xd0, 0xa4, 0x1a, 0x94, 0x47, 0x34, 0xe8, - 0x56, 0xbf, 0xa7, 0x3f, 0x7e, 0x6e, 0x44, 0xc1, 0xd5, 0x1d, 0xdf, 0x52, 0xd1, 0x06, 0x42, 0x6a, - 0xea, 0x3c, 0x6e, 0xd9, 0x87, 0xae, 0xc4, 0xe5, 0xfd, 0x3d, 0xb9, 0xa5, 0x5c, 0x76, 0x31, 0xcd, - 0xfa, 0xfc, 0xc5, 0x5d, 0x2b, 0xbc, 0xd7, 0x67, 0x76, 0x93, 0x58, 0xfc, 0x4c, 0x13, 0xdb, 0x6f, - 0x88, 0x1f, 0x6c, 0x62, 0x15, 0xf0, 0xfa, 0xad, 0x78, 0x79, 0x45, 0x71, 0x57, 0x16, 0x7e, 0x59, - 0x09, 0x9d, 0x96, 0xa6, 0xa5, 0x6a, 0x5e, 0xa5, 0xf0, 0x26, 0x4c, 0x4c, 0x1d, 0xf4, 0xb3, 0x3a, - 0x2c, 0x66, 0x38, 0xe9, 0x33, 0xe4, 0xf8, 0x11, 0x21, 0xe3, 0xe3, 0x93, 0x60, 0x8c, 0x20, 0x22, - 0xc4, 0x40, 0xa9, 0x20, 0xda, 0x3b, 0x27, 0x36, 0x92, 0x50, 0x44, 0xc8, 0xc0, 0xba, 0x0c, 0x4b, - 0xec, 0x04, 0xc1, 0xed, 0x33, 0x63, 0x07, 0x14, 0x76, 0x7c, 0xf0, 0xe3, 0x64, 0x76, 0xb8, 0xff, - 0x86, 0xba, 0x09, 0x0c, 0xfe, 0xa6, 0xf9, 0x7c, 0x4c, 0x85, 0xa7, 0x7a, 0xdb, 0x8a, 0xd2, 0x34, - 0xd9, 0x60, 0x31, 0x17, 0xa2, 0x30, 0x33, 0x86, 0x03, 0x62, 0x6b, 0x4a, 0xed, 0x8b, 0x38, 0xe7, - 0x6b, 0xc1, 0x9e, 0xe8, 0xa2, 0x37, 0x7e, 0x20, 0x31, 0x8a, 0xc3, 0xb1, 0xe3, 0x29, 0x94, 0x75, - 0xa6, 0x2e, 0x61, 0x44, 0x7a, 0x60, 0x35, 0x8f, 0x81, 0xd3, 0x2d, 0x22, 0xc1, 0xd0, 0x0d, 0x01, - 0x56, 0xcf, 0x98, 0x06, 0x4d, 0x8d, 0x31, 0xbc, 0x98, 0x4b, 0x2d, 0xdd, 0x81, 0xed, 0x07, 0x5a, - 0xd3, 0xca, 0xf5, 0x24, 0xc6, 0xba, 0x91, 0x71, 0x22, 0x08, 0x87, 0xc3, 0x30, 0xfe, 0x34, 0x3a, - 0xaa, 0x1d, 0x07, 0x4f, 0x03, 0xf8, 0x27, 0x0e, 0xdc, 0x70, 0xdc, 0x09, 0xa1, 0x5a, 0x37, 0xcf, - 0xd4, 0x5d, 0xea, 0x69, 0xe7, 0x67, 0x91, 0xc0, 0xbf, 0xd0, 0x2e, 0x32, 0x2f, 0x84, 0x7e, 0x2c, - 0xc2, 0xea, 0xbc, 0x43, 0xcc, 0x41, 0x7c, 0xef, 0xb2, 0x51, 0xfe, 0x67, 0xa1, 0x8b, 0x3a, 0xcf, - 0x79, 0x5a, 0x32, 0x98, 0x02, 0x60, 0xbc, 0xd7, 0xcd, 0x9d, 0xc0, 0x90, 0x6f, 0x98, 0x42, 0x68, - 0x67, 0xcf, 0x3b, 0xb8, 0xbd, 0xb9, 0x19, 0xd9, 0x17, 0x03, 0xc5, 0x00, 0xcc, 0xcf, 0xc0, 0xf4, - 0xc7, 0x50, 0x41, 0x1a, 0x29, 0x98, 0xc4, 0x63, 0x12, 0xf0, 0xbd, 0xe3, 0x7d, 0xd7, 0x5c, 0x60, - 0xc6, 0xc2, 0x18, 0xdd, 0xd8, 0x34, 0x5a, 0x90, 0x22, 0xe8, 0x8f, 0xa3, 0x2c, 0xff, 0x30, 0xc2, - 0xd0, 0x6b, 0xd0, 0xb4, 0x88, 0x41, 0xdb, 0x1b, 0xa3, 0x5f, 0x19, 0xc3, 0x8e, 0x66, 0xdf, 0x46, - 0xdf, 0x6a, 0xae, 0x3d, 0x04, 0x6d, 0x12, 0x17, 0xd7, 0xab, 0x73, 0x4a, 0x7a, 0x92, 0x8e, 0x11, - 0xf1, 0x4b, 0xf8, 0x9c, 0x87, 0x8d, 0x32, 0x7f, 0x70, 0x7e, 0xa8, 0x28, 0x4e, 0x24, 0xf1, 0xc8, - 0x0c, 0xad, 0x05, 0x3c, 0xe2, 0x4e, 0xd0, 0x53, 0x1f, 0xe7, 0x4e, 0x4c, 0xa3, 0x80, 0x3c, 0xd9, - 0xd6, 0x04, 0x43, 0x6f, 0xa2, 0x0f, 0x50, 0xa7, 0x2e, 0x7d, 0x7d, 0x6f, 0x68, 0xb3, 0x5f, 0xea, - 0xd0, 0x86, 0x9f, 0x37, 0x92, 0xf7, 0xd3, 0x65, 0x45, 0xdb, 0x92, 0x4a, 0x58, 0x02, 0xbe, 0xc4, - 0x5d, 0xc0, 0x83, 0x13, 0x1d, 0x18, 0x03, 0x24, 0x0d, 0x55, 0xcb, 0xa0, 0xe3, 0x89, 0x1d, 0x77, - 0x07, 0x4d, 0x44, 0xff, 0x2e, 0xee, 0xe0, 0x56, 0x51, 0x0d, 0x9f, 0xf1, 0xe8, 0x3a, 0xe8, 0x2b, - 0xc1, 0x2b, 0x90, 0x32, 0x59, 0xd1, 0x9b, 0x72, 0x11, 0x4c, 0x3f, 0xb1, 0xbe, 0x62, 0x1f, 0x24, - 0xa6, 0x04, 0x2c, 0x6f, 0x80, 0x30, 0x73, 0x92, 0x6e, 0x34, 0xe2, 0x06, 0x06, 0x32, 0x0c, 0x02, - 0xf2, 0xcc, 0x04, 0x6d, 0x8c, 0xc9, 0x0a, 0x27, 0x95, 0x9a, 0xfb, 0x7a, 0x99, 0xb7, 0xc5, 0x81, - 0xc8, 0x32, 0xfc, 0x98, 0xac, 0x90, 0x2b, 0xea, 0xdc, 0x4c, 0xf8, 0x4d, 0x7b, 0xde, 0x27, 0xba, - 0xdc, 0x17, 0x02, 0xbb, 0x1e, 0x18, 0x2f, 0x0d, 0x03, 0x8f, 0xe2, 0x7a, 0x3b, 0x9d, 0x2b, 0x42, - 0xbb, 0x43, 0x76, 0x9e, 0x1f, 0xf0, 0x0e, 0x16, 0x12, 0xd9, 0x46, 0xab, 0x6f, 0x6b, 0xcb, 0x73, - 0x6c, 0x0a, 0xb6, 0xa0, 0x09, 0x4a, 0x5d, 0x62, 0xc0, 0x3c, 0x9b, 0xc9, 0x5e, 0xfc, 0x02, 0x7b, - 0x49, 0x5b, 0xfc, 0x02, 0x9b, 0x8e, 0x71, 0x7e, 0x3c, 0xc9, 0xb0, 0x48, 0xc6, 0x38, 0x76, 0x7c, - 0x78, 0x2f, 0x68, 0x9c, 0x4b, 0x49, 0x29, 0x60, 0x2b, 0x29, 0x9b, 0x7e, 0x6a, 0xb8, 0x41, 0xb5, - 0x80, 0xc5, 0x2e, 0x38, 0x00, 0x08, 0x0b, 0x25, 0x5b, 0xc1, 0x90, 0xd8, 0x45, 0x78, 0x39, 0xde, - 0x65, 0xc0, 0xa3, 0x44, 0x0f, 0x11, 0xd3, 0x7d, 0x40, 0x4a, 0x5e, 0x7d, 0x2c, 0xf4, 0x53, 0x30, - 0x70, 0xe7, 0x7a, 0x73, 0x93, 0x7e, 0x6d, 0x53, 0x19, 0x1c, 0xaa, 0xd3, 0x0c, 0xea, 0xd0, 0x7c, - 0x5e, 0x58, 0x16, 0x8e, 0x41, 0xbe, 0x33, 0x11, 0x56, 0x8b, 0xc6, 0xa0, 0x84, 0x36, 0x11, 0x48, - 0x9a, 0x86, 0xce, 0x6e, 0x6e, 0x8a, 0x60, 0x6e, 0xb0, 0x67, 0x86, 0x5a, 0x15, 0x5d, 0x2b, 0xbe, - 0x37, 0xdd, 0xcf, 0x60, 0x6e, 0x73, 0xb1, 0x46, 0x2f, 0x15, 0xf6, 0x9d, 0x8e, 0x03, 0x74, 0xd9, - 0x27, 0xba, 0xc1, 0x9e, 0xe1, 0x17, 0x8e, 0xd1, 0x8d, 0xe7, 0x64, 0xcf, 0x62, 0x69, 0xdc, 0x32, - 0x27, 0x86, 0x39, 0xec, 0xf5, 0x13, 0xf4, 0x2d, 0x50, 0x18, 0x13, 0xe8, 0x48, 0x23, 0x92, 0x60, - 0x91, 0x74, 0xb1, 0x2a, 0xb9, 0x5a, 0x70, 0x1b, 0x21, 0x6d, 0xc1, 0x73, 0xd8, 0x46, 0xca, 0xe4, - 0xb1, 0xcc, 0x99, 0xe6, 0x38, 0xf8, 0xce, 0x8c, 0xa3, 0x6b, 0xea, 0xe3, 0x8c, 0x15, 0xa9, 0x62, - 0x91, 0x66, 0xa8, 0x67, 0x09, 0x3a, 0x8c, 0x04, 0xd8, 0x52, 0x09, 0x53, 0x81, 0x85, 0x86, 0xbe, - 0xe2, 0x79, 0x88, 0x7a, 0x29, 0xaf, 0xa0, 0x1b, 0x92, 0xb4, 0x60, 0x8a, 0xab, 0xc1, 0x0f, 0x95, - 0xc6, 0x0e, 0x85, 0xaf, 0xa6, 0x30, 0x40, 0x04, 0xe8, 0xe1, 0x9b, 0x2b, 0x8c, 0x74, 0x77, 0x12, - 0x0e, 0x23, 0x42, 0xfc, 0x85, 0x38, 0x51, 0xb6, 0x1e, 0x62, 0x3b, 0x8b, 0xc8, 0xfd, 0x50, 0xc4, - 0xe3, 0x9f, 0x33, 0xcf, 0x2f, 0xe4, 0xf7, 0xef, 0xa0, 0x09, 0x7e, 0x16, 0x92, 0x2f, 0xbf, 0x7f, - 0x87, 0x45, 0x4f, 0x38, 0xaa, 0x3c, 0x1a, 0x93, 0x25, 0xe4, 0x49, 0x9e, 0xf7, 0xdd, 0x68, 0x94, - 0x11, 0x9b, 0x8d, 0x8f, 0x83, 0xc4, 0xd1, 0xc1, 0xb4, 0xc3, 0x59, 0x20, 0x40, 0x39, 0xe6, 0x99, - 0xc6, 0x13, 0xf7, 0x49, 0x8c, 0x41, 0x46, 0x1e, 0x05, 0x6d, 0x83, 0xc1, 0xd5, 0x60, 0x5e, 0x67, - 0xdc, 0x28, 0x0f, 0x87, 0x4a, 0xa3, 0x8c, 0x4b, 0x1b, 0xe6, 0x38, 0xc9, 0x63, 0xa0, 0x05, 0x35, - 0x06, 0x62, 0x51, 0xae, 0x28, 0x76, 0xbd, 0x18, 0xaa, 0x2c, 0xde, 0x9d, 0x90, 0xc4, 0xab, 0x45, - 0x60, 0x21, 0x99, 0x3b, 0x3e, 0xb7, 0x87, 0xd1, 0x7d, 0x9b, 0x71, 0x23, 0x8e, 0x31, 0xfc, 0x6f, - 0x7c, 0x0d, 0x83, 0x45, 0xb1, 0xe5, 0x88, 0xd8, 0x08, 0x61, 0x59, 0xc8, 0xa1, 0x1b, 0x64, 0x95, - 0x9f, 0xdd, 0xd1, 0x42, 0x4e, 0x76, 0x47, 0xc0, 0x03, 0x79, 0x04, 0xef, 0xd6, 0xc0, 0xf0, 0x75, - 0x34, 0xf4, 0xb7, 0x70, 0x73, 0x02, 0x06, 0x89, 0xe7, 0x98, 0x34, 0xa6, 0x38, 0xd0, 0x8a, 0x75, - 0xbc, 0x6c, 0xd6, 0x46, 0xe6, 0x7c, 0x7b, 0xd3, 0xde, 0xaa, 0x70, 0x73, 0x01, 0x5f, 0xee, 0x52, - 0x73, 0xff, 0x62, 0x0c, 0x5c, 0xf2, 0x7f, 0x58, 0x69, 0xe8, 0xf1, 0x78, 0x49, 0xc2, 0x0e, 0x2a, - 0xe7, 0x8a, 0x02, 0x0a, 0x0f, 0x9d, 0x42, 0x8d, 0x2a, 0x07, 0x0b, 0xe5, 0x81, 0xa5, 0x7c, 0xac, - 0x41, 0xf8, 0x15, 0x78, 0x3e, 0xa4, 0x3d, 0x10, 0x4f, 0x7b, 0xf0, 0xbe, 0x6b, 0x24, 0x2a, 0xa6, - 0xf9, 0x5a, 0x78, 0x05, 0xe2, 0xc5, 0x13, 0xb0, 0x4a, 0x1c, 0x0b, 0xac, 0x09, 0xc2, 0x4e, 0x0b, - 0xfc, 0xb5, 0xfd, 0x87, 0x65, 0x8b, 0xdf, 0x7b, 0xb3, 0x4c, 0xe4, 0xf4, 0xcc, 0xcc, 0x34, 0x6a, - 0xec, 0x32, 0x1b, 0xfc, 0x0c, 0xc7, 0x43, 0x86, 0xaf, 0x7e, 0x9a, 0x79, 0xb7, 0xdb, 0x80, 0x7d, - 0x1a, 0xbe, 0xdc, 0x47, 0x48, 0xfa, 0xf7, 0xdf, 0xb0, 0x6f, 0x3e, 0x76, 0xdb, 0x87, 0x77, 0x8a, - 0x16, 0xef, 0x0c, 0xf3, 0xa7, 0x21, 0xb8, 0xee, 0xbd, 0xc1, 0xaa, 0xec, 0x70, 0xa1, 0x6b, 0xdf, - 0xf1, 0xad, 0x49, 0x40, 0x70, 0xa1, 0x14, 0x7c, 0x45, 0x19, 0xef, 0xd9, 0x1a, 0xfe, 0xdb, 0x6b, - 0xa2, 0x06, 0x2e, 0x03, 0xb2, 0x30, 0x71, 0xe3, 0x03, 0xf0, 0x77, 0x9a, 0xfc, 0xe9, 0x0a, 0x0f, - 0x0b, 0xfb, 0xef, 0xdd, 0xda, 0xe3, 0x3d, 0xf0, 0xec, 0xbc, 0x96, 0x3f, 0x3e, 0x16, 0xe7, 0xc5, - 0xf6, 0xa3, 0x56, 0x0c, 0x80, 0x16, 0xfb, 0xe3, 0x11, 0x9c, 0x7b, 0xf0, 0xc2, 0xa3, 0xf0, 0x20, - 0xad, 0x1c, 0x06, 0x7b, 0x6f, 0x8c, 0x1f, 0x6b, 0xe9, 0x15, 0x01, 0xbe, 0x14, 0x02, 0xd9, 0xba, - 0x0c, 0xc3, 0xab, 0xaf, 0xcd, 0x41, 0xd6, 0x85, 0x2b, 0x9a, 0xc1, 0x60, 0x9d, 0xf2, 0xee, 0xd0, - 0x8f, 0xdb, 0x70, 0x24, 0x6e, 0xc1, 0xd1, 0xc2, 0xa3, 0x95, 0xf6, 0xde, 0xea, 0xb2, 0xfe, 0x65, - 0xec, 0x1f, 0x95, 0xf6, 0x37, 0x32, 0xd8, 0x2f, 0x7f, 0x60, 0xec, 0x22, 0xe4, 0x58, 0xdd, 0xfa, - 0xfa, 0xac, 0x46, 0xdc, 0xe4, 0x8c, 0x62, 0x30, 0x14, 0x10, 0xe3, 0x3b, 0x60, 0xc8, 0x5c, 0x71, - 0x20, 0xeb, 0x17, 0x9f, 0xf6, 0x42, 0x33, 0xea, 0x8b, 0x1c, 0x33, 0xfb, 0x6b, 0x05, 0xfc, 0x65, - 0x03, 0xd8, 0x2b, 0x9d, 0xfb, 0xf5, 0xf9, 0xde, 0x78, 0xe1, 0x21, 0x24, 0xb6, 0x0e, 0x41, 0xaf, - 0xac, 0xd1, 0x8d, 0x23, 0x94, 0xab, 0xb5, 0xc5, 0x56, 0x3f, 0x41, 0xc9, 0xbb, 0xe8, 0xe3, 0x7c, - 0x1e, 0xbd, 0x62, 0x23, 0x72, 0xfd, 0x67, 0xf8, 0x28, 0x43, 0xf8, 0x1a, 0x48, 0xaf, 0x73, 0xf5, - 0x45, 0xf7, 0x16, 0xc8, 0x0e, 0xd2, 0x56, 0xce, 0x61, 0xe8, 0xfe, 0xcf, 0xf8, 0x08, 0x3d, 0x2c, - 0xac, 0x80, 0xb4, 0xb9, 0xb9, 0xaa, 0x07, 0xf4, 0xc5, 0x73, 0xa0, 0x84, 0x99, 0x77, 0x1a, 0x19, - 0x27, 0x67, 0x32, 0xe9, 0x4b, 0x23, 0xcd, 0xb4, 0x6b, 0x9c, 0x33, 0x30, 0x4d, 0x8c, 0x61, 0xa3, - 0x80, 0x6a, 0xfe, 0xb5, 0xc0, 0xb1, 0x71, 0x86, 0xaf, 0x52, 0x0d, 0x0f, 0x73, 0xb9, 0x83, 0x7f, - 0x61, 0x94, 0x2b, 0x70, 0xf5, 0xf9, 0x61, 0x46, 0x7b, 0xf0, 0x37, 0x46, 0xb9, 0x08, 0xbc, 0x59, - 0x4f, 0x1b, 0xc0, 0xad, 0xbf, 0xf8, 0xf1, 0x3c, 0xe4, 0xe7, 0x7c, 0xb9, 0x3a, 0x06, 0xcc, 0xac, - 0xaf, 0x0e, 0x56, 0x58, 0x2d, 0xd0, 0xd0, 0xc3, 0x34, 0x46, 0xc3, 0x49, 0x02, 0x4f, 0x71, 0x14, - 0xaa, 0x77, 0x05, 0x29, 0x69, 0x88, 0xfc, 0x2c, 0x36, 0x13, 0xc2, 0x72, 0x3b, 0xdd, 0x49, 0x2d, - 0x7c, 0xc0, 0xac, 0x3b, 0x51, 0x49, 0x17, 0x5d, 0x1c, 0x31, 0xa0, 0xfe, 0x05, 0x99, 0xbe, 0x0e, - 0x18, 0x27, 0xe5, 0x15, 0x90, 0x61, 0x96, 0x6a, 0x24, 0x0e, 0x87, 0xbe, 0x2f, 0x2a, 0x3a, 0xdc, - 0xa5, 0x41, 0x2e, 0xdb, 0xae, 0x7c, 0x1c, 0x71, 0xec, 0x6e, 0xe7, 0x15, 0x68, 0x73, 0x26, 0x2b, - 0x61, 0x45, 0x4c, 0x8d, 0x25, 0x8c, 0x85, 0x6e, 0x36, 0x5e, 0x35, 0x13, 0xab, 0x41, 0x2e, 0xd9, - 0x27, 0x4b, 0x60, 0xf1, 0xd6, 0xbb, 0xf8, 0xdc, 0xe2, 0x1d, 0x69, 0x24, 0x8e, 0x5b, 0x16, 0x91, - 0x1d, 0x30, 0xbc, 0x19, 0xda, 0xce, 0xf3, 0x7a, 0xe4, 0x5c, 0x18, 0xee, 0x2e, 0x82, 0xc9, 0x4e, - 0x35, 0xd5, 0x90, 0xfa, 0xe1, 0xbf, 0x83, 0xcf, 0xf2, 0x0f, 0xa3, 0xf9, 0xa7, 0xd4, 0xbc, 0xe0, - 0x44, 0x1a, 0x97, 0x18, 0x99, 0x1b, 0x37, 0xd2, 0x76, 0x60, 0xef, 0x61, 0xfc, 0x11, 0x5e, 0x5f, - 0x47, 0xea, 0x0b, 0xa6, 0xbb, 0xde, 0xbe, 0x5d, 0xda, 0xc7, 0xc4, 0xed, 0xcb, 0x15, 0xce, 0x79, - 0xfa, 0x4e, 0x79, 0x8e, 0xaf, 0xc7, 0xb2, 0xa9, 0xa3, 0xdc, 0xcb, 0x13, 0x10, 0x01, 0x54, 0xa4, - 0x25, 0xdd, 0xb5, 0x26, 0x6d, 0xc4, 0x6c, 0x5c, 0x32, 0x43, 0xc9, 0xcf, 0x0f, 0x7d, 0x94, 0xd4, - 0xc2, 0x41, 0x65, 0xaf, 0x0f, 0x7d, 0x5f, 0x44, 0x10, 0xb4, 0xbc, 0xdd, 0x2b, 0xfa, 0xee, 0x9c, - 0x06, 0x6e, 0x5f, 0x01, 0x81, 0xcf, 0xfa, 0x35, 0x51, 0x70, 0xe0, 0x6f, 0x84, 0x6f, 0x5c, 0x05, - 0x6d, 0x2e, 0x72, 0xbc, 0x32, 0x08, 0x82, 0xf6, 0xb6, 0x48, 0x53, 0x45, 0x91, 0xaf, 0xab, 0xe6, - 0x8c, 0xa4, 0xfb, 0xe1, 0x62, 0xf9, 0x52, 0xac, 0x1c, 0x3f, 0x87, 0xde, 0xea, 0x24, 0x49, 0x13, - 0x25, 0x19, 0x23, 0xa0, 0xfb, 0xf4, 0xee, 0xb5, 0x3e, 0x6e, 0x6e, 0xf1, 0x75, 0xd6, 0x39, 0x48, - 0x9c, 0x2f, 0x10, 0x42, 0x28, 0x76, 0xfc, 0x17, 0x3a, 0x2c, 0xed, 0xc8, 0x04, 0xa3, 0xf3, 0x18, - 0x2c, 0x3b, 0x0f, 0xce, 0x6e, 0x16, 0x03, 0x61, 0x5e, 0x0f, 0xe1, 0xec, 0x3a, 0xe4, 0x05, 0xb2, - 0xc3, 0xc8, 0x3c, 0x08, 0x65, 0xf4, 0x22, 0x9e, 0xa3, 0xb0, 0xdf, 0xa8, 0x1e, 0x06, 0xdd, 0x27, - 0x93, 0x0e, 0xb5, 0x80, 0x3c, 0xf7, 0x38, 0x3c, 0xf9, 0x81, 0xe7, 0x6e, 0xc4, 0x33, 0x50, 0x77, - 0x31, 0x76, 0x1c, 0x37, 0x99, 0x3a, 0x5e, 0xa9, 0x52, 0xe4, 0xa4, 0xb2, 0xff, 0x52, 0x1e, 0x3c, - 0xab, 0xcc, 0x9a, 0x0a, 0x37, 0x43, 0x53, 0x3c, 0xdf, 0x32, 0x4c, 0x49, 0xa4, 0x07, 0x43, 0x90, - 0xba, 0x91, 0x14, 0x47, 0x72, 0x87, 0x36, 0x35, 0x79, 0xbc, 0x59, 0x13, 0x8c, 0x86, 0x66, 0x9b, - 0xe9, 0x16, 0x2b, 0xef, 0x8c, 0x6e, 0x4c, 0x7c, 0x35, 0x88, 0x83, 0x3b, 0xdf, 0x9e, 0x7b, 0xc4, - 0x48, 0x33, 0xd7, 0x88, 0x91, 0xee, 0x79, 0xdf, 0x32, 0xae, 0x16, 0xe8, 0x8b, 0x41, 0x26, 0xfe, - 0x0e, 0x5a, 0x47, 0x93, 0x75, 0x3a, 0xd2, 0xd5, 0xb7, 0xae, 0xac, 0xd9, 0x83, 0xc4, 0x1b, 0x97, - 0x12, 0xe2, 0x3f, 0x05, 0xba, 0x9f, 0xcb, 0xff, 0x0a, 0xa3, 0xf5, 0x24, 0x40, 0x6b, 0xb8, 0xfb, - 0x2f, 0x44, 0x1f, 0x69, 0x46, 0x94, 0x29, 0xf8, 0x24, 0xe0, 0x31, 0x05, 0xb4, 0x9f, 0x82, 0x11, - 0xa1, 0x97, 0xcc, 0x65, 0x70, 0xb6, 0xc5, 0x9d, 0x08, 0x22, 0x08, 0x1e, 0xe0, 0xa8, 0xc5, 0x92, - 0x5a, 0xec, 0x6d, 0x23, 0x49, 0x0e, 0x30, 0x01, 0x63, 0x85, 0xbf, 0x30, 0x39, 0x79, 0xaf, 0x3e, - 0x9a, 0x7d, 0x58, 0x69, 0xe9, 0xe6, 0xbe, 0xc5, 0x14, 0xfa, 0x2c, 0x30, 0x02, 0xf4, 0x64, 0x19, - 0x68, 0x72, 0xc6, 0xc6, 0x5a, 0x5b, 0x07, 0x2b, 0x40, 0xd0, 0x3c, 0x06, 0x8c, 0xbe, 0xda, 0x65, - 0xb6, 0xc0, 0x8c, 0x17, 0x22, 0xb0, 0x8a, 0xc8, 0x31, 0x60, 0x60, 0x15, 0x8d, 0xc7, 0xd2, 0x77, - 0x17, 0x4d, 0xfd, 0x5a, 0xb3, 0xd2, 0x82, 0xc4, 0x88, 0x36, 0x1a, 0x67, 0x8c, 0x59, 0x60, 0x1d, - 0x9b, 0x9b, 0xd1, 0xbb, 0x1a, 0x1a, 0x0d, 0x97, 0xad, 0x82, 0xd5, 0x1c, 0x6d, 0x73, 0xf3, 0x43, - 0x6c, 0xd3, 0x78, 0x88, 0x77, 0x81, 0xc4, 0x57, 0x3c, 0x5b, 0x66, 0x42, 0xee, 0x0b, 0x76, 0x27, - 0x19, 0x5e, 0x8a, 0x8d, 0x55, 0x12, 0x2c, 0x60, 0xa4, 0x41, 0xb0, 0x4a, 0x0c, 0x9e, 0x00, 0x2b, - 0x8f, 0x8a, 0x40, 0x48, 0xa9, 0xfd, 0xf8, 0x61, 0x02, 0xeb, 0x30, 0x81, 0x4b, 0x98, 0x69, 0x59, - 0x08, 0x03, 0xff, 0x29, 0xfc, 0xc0, 0xff, 0x41, 0xbd, 0xa9, 0x67, 0x69, 0xd3, 0x31, 0xd3, 0x60, - 0xb5, 0xc5, 0x02, 0x76, 0x3b, 0xfa, 0x48, 0x7a, 0xe9, 0xee, 0x04, 0x34, 0x15, 0x01, 0x70, 0x88, - 0xc0, 0x76, 0xa2, 0x4d, 0x02, 0xdc, 0xf7, 0x5a, 0x85, 0x26, 0x6b, 0x39, 0x56, 0x91, 0x5e, 0x9a, - 0x14, 0xab, 0xfa, 0x5e, 0x6d, 0x54, 0xc6, 0x22, 0x82, 0xd1, 0x89, 0x29, 0x2a, 0xde, 0xbb, 0x65, - 0x56, 0x2a, 0x67, 0x8a, 0xe2, 0x86, 0xb5, 0xa6, 0xb9, 0x77, 0x0e, 0xaf, 0xaf, 0x84, 0xa5, 0x0b, - 0x7a, 0xfe, 0x0f, 0x0e, 0xf1, 0x26, 0x03, 0xb6, 0x9b, 0x83, 0xbf, 0x93, 0xc1, 0x1d, 0x32, 0xde, - 0x25, 0x9e, 0x78, 0xe1, 0xe8, 0xe2, 0xce, 0xe2, 0x0c, 0x06, 0xe9, 0x66, 0xc6, 0xda, 0x0b, 0x68, - 0x3e, 0x73, 0x4f, 0x31, 0xb1, 0x61, 0x8a, 0xd8, 0xf1, 0x3f, 0xdf, 0x24, 0x4e, 0x26, 0xfb, 0x4a, - 0xaa, 0x91, 0xad, 0xf0, 0xdb, 0x79, 0x7a, 0x3a, 0x1e, 0x9b, 0xe5, 0x85, 0xbe, 0xb2, 0x9d, 0xf3, - 0x7f, 0xe6, 0xc5, 0x12, 0x60, 0xb4, 0x50, 0x68, 0x34, 0xfa, 0x0a, 0x4d, 0x49, 0x35, 0xf2, 0x98, - 0x22, 0x56, 0x42, 0x29, 0x00, 0x80, 0x71, 0x26, 0x76, 0xab, 0xb2, 0x3f, 0x3d, 0x74, 0xf6, 0x1b, - 0xbf, 0xfa, 0x0e, 0x5e, 0x28, 0xd5, 0x57, 0xe6, 0x78, 0x3b, 0x17, 0xf2, 0xb2, 0x22, 0xd8, 0xc5, - 0xbf, 0xf8, 0xb9, 0x50, 0xcd, 0x8a, 0x8c, 0x5c, 0x14, 0xa3, 0x6b, 0x47, 0x7c, 0x85, 0x8b, 0xab, - 0x9e, 0xe9, 0xde, 0x04, 0xe6, 0x47, 0x74, 0xff, 0xe0, 0x76, 0xe8, 0xe0, 0x8c, 0x39, 0x89, 0xb4, - 0xc9, 0x7d, 0xc5, 0x97, 0xdd, 0x09, 0x24, 0xb4, 0x5f, 0xcb, 0xd1, 0x17, 0xb7, 0xda, 0x83, 0x04, - 0xbb, 0x3a, 0x9a, 0xa3, 0xde, 0xf9, 0x24, 0x6b, 0x19, 0xd6, 0xe9, 0x9a, 0x77, 0xc5, 0xd2, 0x86, - 0xb8, 0xd5, 0x47, 0x83, 0x23, 0x07, 0x46, 0xe3, 0x11, 0x62, 0xde, 0x9e, 0xdd, 0x47, 0x77, 0x0c, - 0x01, 0xac, 0x89, 0x77, 0xc5, 0x10, 0xef, 0xda, 0x53, 0x04, 0x93, 0x8c, 0xec, 0xb5, 0xb9, 0x2c, - 0x34, 0x60, 0x84, 0xdb, 0xd9, 0xc1, 0x6e, 0x11, 0x1e, 0x0b, 0xf2, 0x0f, 0x85, 0x87, 0x1a, 0x6d, - 0xe0, 0x49, 0x7a, 0x3a, 0x2c, 0x76, 0xbc, 0x93, 0x9f, 0x7b, 0x97, 0xf6, 0xf0, 0xb3, 0x79, 0xa4, - 0xdc, 0x6c, 0x8e, 0x07, 0x7f, 0x22, 0xe3, 0x10, 0x05, 0xef, 0xf2, 0x95, 0x75, 0xf7, 0x49, 0xd2, - 0x9e, 0xc6, 0xcf, 0xe6, 0xcf, 0xac, 0x5a, 0xe4, 0x66, 0x65, 0xe8, 0x58, 0x2d, 0xdc, 0xcb, 0x39, - 0x46, 0x33, 0xae, 0x3a, 0x6d, 0x1d, 0xb9, 0xaa, 0x22, 0x8a, 0x50, 0xdc, 0x84, 0x5d, 0x73, 0xd8, - 0x7a, 0xb2, 0x63, 0xa1, 0xb0, 0x04, 0x6d, 0x34, 0x16, 0x23, 0xfc, 0x37, 0x5c, 0x98, 0x7f, 0xc1, - 0x77, 0x69, 0x02, 0xa2, 0x22, 0xf8, 0x5c, 0xbe, 0x02, 0x21, 0x8c, 0x14, 0x33, 0x6d, 0x01, 0x8c, - 0xef, 0x66, 0x7a, 0xb0, 0x13, 0xbf, 0xe7, 0x64, 0x69, 0xf0, 0xa9, 0x2c, 0x5e, 0x77, 0x2b, 0x80, - 0x1a, 0x57, 0x73, 0x93, 0xd1, 0x6b, 0x97, 0x96, 0x8e, 0xf4, 0x86, 0x99, 0x0c, 0x7d, 0xcb, 0x02, - 0x6e, 0xe7, 0x2d, 0x6e, 0x12, 0x58, 0xaf, 0x7c, 0x04, 0x06, 0x2e, 0x1e, 0x99, 0xf1, 0xa2, 0x84, - 0xe2, 0x2e, 0x8e, 0x20, 0x60, 0x1f, 0xd7, 0x9b, 0xcb, 0xaf, 0xdc, 0x7f, 0x5f, 0x04, 0x6a, 0x6a, - 0x18, 0x58, 0xf2, 0xdd, 0xbf, 0xa4, 0xab, 0xae, 0x2d, 0x4e, 0x06, 0x99, 0x3f, 0x34, 0xbc, 0x7a, - 0xc9, 0x59, 0x19, 0x96, 0x49, 0x23, 0xc7, 0xbc, 0xa0, 0x8a, 0x1b, 0xe8, 0x2d, 0xe8, 0x77, 0xb7, - 0xf8, 0xa6, 0xed, 0x96, 0x84, 0xf7, 0xb0, 0xd4, 0x9d, 0x58, 0x7f, 0x8d, 0x20, 0x4c, 0xc3, 0xeb, - 0x74, 0xb4, 0x3c, 0xbf, 0xbd, 0x95, 0xa5, 0x4e, 0x2e, 0xb6, 0xb7, 0x3f, 0x8f, 0xde, 0xb5, 0x62, - 0xb0, 0x78, 0xa7, 0x55, 0x26, 0x7e, 0xdd, 0x8f, 0x34, 0xc3, 0x30, 0x51, 0xcd, 0x1c, 0x3a, 0x51, - 0xac, 0xf9, 0xfa, 0x11, 0x3d, 0xda, 0x9b, 0xa6, 0x2f, 0xb6, 0x48, 0xe2, 0x8d, 0x7a, 0x08, 0x04, - 0x67, 0x87, 0x5e, 0xd5, 0x93, 0x44, 0xad, 0x8a, 0x3d, 0xb1, 0x3b, 0x94, 0xb8, 0x70, 0x1c, 0xf8, - 0x90, 0xbd, 0x0f, 0x63, 0xa1, 0x66, 0x2f, 0x19, 0xa7, 0xb2, 0x3e, 0xb4, 0x93, 0x2b, 0xf7, 0xb4, - 0x96, 0x73, 0xc2, 0xf6, 0x22, 0xcb, 0x9d, 0xb3, 0xe0, 0xcf, 0xff, 0x6a, 0xad, 0xb8, 0xd8, 0x76, - 0xf1, 0x52, 0x62, 0x5e, 0x38, 0x6f, 0x64, 0x69, 0x18, 0xc1, 0x58, 0xd0, 0x68, 0x5f, 0x1a, 0xa2, - 0x30, 0x11, 0x99, 0x83, 0x9d, 0xf9, 0x2f, 0x3a, 0xf4, 0x06, 0x71, 0x74, 0x37, 0x45, 0xf8, 0xf1, - 0xd0, 0x60, 0x7b, 0x14, 0x41, 0x74, 0x44, 0x9a, 0x1d, 0xd6, 0x51, 0x6f, 0xe8, 0xbd, 0x44, 0xce, - 0x4e, 0x3c, 0xe1, 0x87, 0xf8, 0xb3, 0x16, 0x3a, 0x0e, 0xd2, 0x97, 0x9c, 0x23, 0xdb, 0xa4, 0x11, - 0x71, 0xf4, 0x9c, 0x7a, 0x24, 0xd6, 0x88, 0x2c, 0x6d, 0xc6, 0xb2, 0xc8, 0x8d, 0xc5, 0x71, 0x4c, - 0xa8, 0x0b, 0xe8, 0xf4, 0xf6, 0xa7, 0xc5, 0xb9, 0xbf, 0x51, 0x1d, 0x66, 0xcb, 0xca, 0x4b, 0x32, - 0x14, 0x32, 0xe8, 0x45, 0xb5, 0x05, 0x76, 0x22, 0x3d, 0xeb, 0x1a, 0x09, 0x75, 0xf3, 0x2f, 0x9c, - 0x0e, 0x8a, 0xc0, 0x2c, 0x7b, 0x98, 0x72, 0x92, 0xc1, 0x4b, 0xe2, 0xf8, 0xdf, 0xbf, 0xc3, 0x5d, - 0x77, 0x63, 0xbf, 0x4d, 0xbc, 0x90, 0x0f, 0x10, 0xe8, 0xa3, 0x07, 0xa0, 0xa1, 0xf2, 0xfe, 0x10, - 0x20, 0xd3, 0x0b, 0x49, 0x0b, 0xbd, 0xff, 0x99, 0xff, 0xc1, 0x30, 0xff, 0xd3, 0x73, 0x18, 0xdd, - 0x98, 0x96, 0xf0, 0x5f, 0xad, 0x55, 0x71, 0x74, 0x9e, 0xd7, 0xe8, 0x4b, 0xd2, 0x9f, 0x0f, 0x91, - 0x0f, 0x93, 0x14, 0x35, 0x8b, 0x99, 0xcd, 0xc9, 0x0a, 0xf8, 0xa3, 0x5f, 0xea, 0x8c, 0xd9, 0x70, - 0xb7, 0x26, 0xa2, 0x7f, 0xb5, 0x0f, 0x65, 0x51, 0x26, 0x5e, 0xe5, 0x93, 0x4a, 0x3a, 0xff, 0x32, - 0x33, 0xe3, 0xc5, 0xf9, 0xcb, 0x1c, 0x5f, 0x17, 0xbf, 0x34, 0xf0, 0xde, 0x28, 0xd6, 0xc7, 0x6d, - 0x11, 0x98, 0xe1, 0x77, 0x91, 0x0f, 0x12, 0xbe, 0x63, 0xc2, 0x36, 0x26, 0x18, 0xdb, 0xe9, 0x6c, - 0x6e, 0x73, 0xf3, 0x53, 0xe3, 0x6b, 0x34, 0x3c, 0x74, 0x00, 0x1c, 0x18, 0xea, 0xf2, 0x15, 0xdf, - 0xdc, 0xd6, 0x96, 0xc6, 0x79, 0x14, 0xb9, 0xd5, 0x70, 0xb0, 0x6f, 0xd9, 0x2d, 0xc3, 0x0f, 0x74, - 0x92, 0x70, 0x11, 0xbe, 0x38, 0x5e, 0x17, 0x40, 0xa0, 0xac, 0x83, 0xd1, 0xc5, 0x43, 0xa1, 0x9f, - 0x45, 0x26, 0xee, 0xad, 0x79, 0xa4, 0x1f, 0x62, 0x14, 0xec, 0x22, 0xb0, 0xb0, 0xa6, 0xe1, 0x9a, - 0x16, 0xe7, 0xa3, 0xf2, 0x90, 0x60, 0x20, 0x70, 0x3d, 0xb8, 0x9c, 0x19, 0x4f, 0xdf, 0xa6, 0xb8, - 0xe8, 0x85, 0xcd, 0x16, 0xa4, 0x6d, 0x25, 0x63, 0x6a, 0xab, 0xff, 0x7e, 0xf6, 0x98, 0xde, 0xba, - 0x23, 0xd6, 0x62, 0xd9, 0xac, 0x1d, 0xc0, 0x19, 0x1f, 0x83, 0x4b, 0x2f, 0x2e, 0xc5, 0x1b, 0xa2, - 0xc3, 0x14, 0x10, 0x5c, 0x46, 0x48, 0x84, 0x74, 0x3a, 0xed, 0x32, 0x5d, 0xc9, 0x77, 0xa6, 0xf8, - 0x0a, 0x02, 0xa9, 0x33, 0xde, 0x40, 0xef, 0x72, 0xf4, 0x8e, 0x31, 0x40, 0x39, 0xff, 0xce, 0xf2, - 0xcd, 0x4d, 0xf6, 0x64, 0xf2, 0x8b, 0x83, 0xd6, 0x09, 0x3c, 0xe8, 0x93, 0x30, 0x79, 0x2f, 0x07, - 0x56, 0x23, 0xbf, 0x43, 0x17, 0xe5, 0xef, 0xdf, 0x51, 0x49, 0x47, 0x84, 0x19, 0xa4, 0xd6, 0x66, - 0xa8, 0x00, 0x87, 0x7a, 0x03, 0x69, 0x02, 0xad, 0xc5, 0xd7, 0x56, 0x96, 0xc7, 0xbc, 0x79, 0xa0, - 0xb9, 0x2d, 0x0d, 0x63, 0xee, 0x5d, 0xc7, 0xe6, 0xa9, 0x64, 0xcb, 0x97, 0xa1, 0x81, 0x52, 0x06, - 0x25, 0x38, 0x7a, 0x6d, 0x1b, 0xbd, 0xbf, 0x0d, 0xe6, 0x7c, 0xb9, 0xd4, 0xc0, 0xc4, 0xd3, 0xa4, - 0xe8, 0x9c, 0xa5, 0x1c, 0x6d, 0x7d, 0xc1, 0xf0, 0x4d, 0x6c, 0xef, 0x97, 0xa4, 0x20, 0x41, 0x78, - 0x73, 0x02, 0xae, 0xbe, 0x0f, 0xca, 0x0d, 0xad, 0x8f, 0x8a, 0x2d, 0x2e, 0x75, 0xf3, 0xcb, 0x6d, - 0x7c, 0xcf, 0x78, 0x6f, 0xb1, 0x48, 0x7c, 0xcf, 0xe0, 0xde, 0x2a, 0x7e, 0xf7, 0xdd, 0x81, 0xbe, - 0x9d, 0xf8, 0xbf, 0x16, 0x26, 0xdb, 0xb6, 0xee, 0xc4, 0x00, 0x00 -}; From e4ec65622f6902e8aad6a9a1c61bf56b58cbe7fe Mon Sep 17 00:00:00 2001 From: Woody Date: Tue, 14 Nov 2023 21:19:38 +0100 Subject: [PATCH 10/67] Enable simplifiedUI by default --- wled00/cfg.cpp | 4 ---- wled00/data/settings_ui.htm | 5 +---- wled00/set.cpp | 6 ------ wled00/wled.h | 2 +- wled00/xml.cpp | 4 ---- 5 files changed, 2 insertions(+), 19 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index e36b2f61d..51806ca56 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -31,9 +31,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { getStringFromJson(cmDNS, id[F("mdns")], 33); getStringFromJson(serverDescription, id[F("name")], 33); getStringFromJson(alexaInvocationName, id[F("inv")], 33); -#ifdef WLED_ENABLE_SIMPLE_UI CJSON(simplifiedUI, id[F("sui")]); -#endif JsonObject nw = doc["nw"]; #ifndef WLED_DISABLE_ESPNOW @@ -656,9 +654,7 @@ void serializeConfig() { id[F("mdns")] = cmDNS; id[F("name")] = serverDescription; id[F("inv")] = alexaInvocationName; -#ifdef WLED_ENABLE_SIMPLE_UI id[F("sui")] = simplifiedUI; -#endif JsonObject nw = doc.createNestedObject("nw"); #ifndef WLED_DISABLE_ESPNOW diff --git a/wled00/data/settings_ui.htm b/wled00/data/settings_ui.htm index d56199e2d..ba84a77d8 100644 --- a/wled00/data/settings_ui.htm +++ b/wled00/data/settings_ui.htm @@ -267,10 +267,7 @@

Web Setup

Server description:
-
- This firmware build does not include simplified UI support.
-
-
Enable simplified UI:
+ Enable simplified UI:
The following UI customization settings are unique both to the WLED device and this browser.
You will need to set them again if using a different browser, device or WLED IP address.
Refresh the main UI to apply changes.

diff --git a/wled00/set.cpp b/wled00/set.cpp index a12ecd30b..ab830a97c 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -296,13 +296,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) { strlcpy(serverDescription, request->arg(F("DS")).c_str(), 33); //syncToggleReceive = request->hasArg(F("ST")); - #ifdef WLED_ENABLE_SIMPLE_UI - if (simplifiedUI ^ request->hasArg(F("SU"))) { - // UI selection changed, invalidate browser cache - cacheInvalidate++; - } simplifiedUI = request->hasArg(F("SU")); - #endif DEBUG_PRINTLN(F("Enumerating ledmaps")); enumerateLedmaps(); DEBUG_PRINTLN(F("Loading custom palettes")); diff --git a/wled00/wled.h b/wled00/wled.h index 7690679f2..25be2c9ec 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -365,7 +365,7 @@ WLED_GLOBAL char serverDescription[33] _INIT(SERVERNAME); // use predefined nam #endif //WLED_GLOBAL bool syncToggleReceive _INIT(false); // UIs which only have a single button for sync should toggle send+receive if this is true, only send otherwise WLED_GLOBAL bool simplifiedUI _INIT(false); // enable simplified UI -WLED_GLOBAL byte cacheInvalidate _INIT(0); // used to invalidate browser cache when switching from regular to simplified UI +WLED_GLOBAL byte cacheInvalidate _INIT(0); // used to invalidate browser cache // Sync CONFIG WLED_GLOBAL NodesMap Nodes; diff --git a/wled00/xml.cpp b/wled00/xml.cpp index c5bae5805..9a7fc4acd 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -475,11 +475,7 @@ void getSettingsJS(byte subPage, char* dest) { sappends('s',SET_F("DS"),serverDescription); //sappend('c',SET_F("ST"),syncToggleReceive); - #ifdef WLED_ENABLE_SIMPLE_UI sappend('c',SET_F("SU"),simplifiedUI); - #else - oappend(SET_F("toggle('Simple');")); // hide Simplified UI settings - #endif } if (subPage == SUBPAGE_SYNC) From 029403ea10ae38ca54ca310d04fbbda525a9938e Mon Sep 17 00:00:00 2001 From: Woody Date: Tue, 14 Nov 2023 21:52:17 +0100 Subject: [PATCH 11/67] Only Effect Search should stay on top --- wled00/data/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wled00/data/index.js b/wled00/data/index.js index 62f7d18d6..10e884ca4 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -3046,11 +3046,13 @@ function simplifyUI() { // Chage height of palette list gId("pallist").style.height = "300px"; gId("pallist").style.overflow = "scroll"; - // fix shadow + // Fix shadow gId("pallist").style.margin = "0px -16px"; gId("pallist").style.padding = "0px 16px"; - // set correct position of selected and sticky palette + // Set correct position of selected and sticky palette gId("pallist").classList.add("simplified"); + // We only want Effect Search to stay on top + gId("palw").firstElementChild.classList.remove("staytop"); // Hide filter options gId("filters").style.display = "none"; From 0a97717b35fe278d994e13be06e9f9ba300d0dc4 Mon Sep 17 00:00:00 2001 From: Woody Date: Thu, 16 Nov 2023 14:43:50 +0100 Subject: [PATCH 12/67] Add simplified segments --- wled00/data/index.css | 2 +- wled00/data/index.js | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/wled00/data/index.css b/wled00/data/index.css index c9bf8b665..ab446a21d 100644 --- a/wled00/data/index.css +++ b/wled00/data/index.css @@ -1421,7 +1421,7 @@ TD .checkmark, TD .radiomark { .expanded { display: inline-block !important; } -.hide, .expanded .segin.hide, .expanded .presin.hide, .expanded .sbs.hide, .expanded .frz, .expanded .g-icon { +.hide, .expanded .segin.hide, .expanded .presin.hide, .expanded .sbs.hide, .expanded .frz, .expanded .g-icon, .nosimple { display: none !important; } diff --git a/wled00/data/index.js b/wled00/data/index.js index 10e884ca4..57359637d 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -770,23 +770,23 @@ function populateSegments(s) ``+ ``+ ``; - cn += `
`+ - `