From efec738c89bb6b931ca2a577341318880faf6377 Mon Sep 17 00:00:00 2001 From: cpq Date: Wed, 2 Nov 2022 23:30:31 +0000 Subject: [PATCH] ARP lookup hosts in the same net. Use up-to-date code in zephyr dash example --- examples/zephyr/device-dashboard/Makefile | 4 +- .../zephyr/device-dashboard/src/mongoose.c | 153 +- .../zephyr/device-dashboard/src/mongoose.h | 19 +- examples/zephyr/device-dashboard/src/net.c | 4 + .../zephyr/device-dashboard/src/packed_fs.c | 3760 ++++++----------- mip/mip.c | 81 +- mongoose.c | 81 +- 7 files changed, 1506 insertions(+), 2596 deletions(-) diff --git a/examples/zephyr/device-dashboard/Makefile b/examples/zephyr/device-dashboard/Makefile index 1c329a82..59d4f872 100644 --- a/examples/zephyr/device-dashboard/Makefile +++ b/examples/zephyr/device-dashboard/Makefile @@ -24,7 +24,9 @@ example: true build: - cp $(MONGOOSE_ROOT)/mongoose.[c,h] src/ + cp $(MONGOOSE_ROOT)/mongoose.[ch] src/ + cp $(MONGOOSE_ROOT)/examples/device-dashboard/net.c src/ + cp $(MONGOOSE_ROOT)/examples/device-dashboard/packed_fs.c src/ $(DOCKER) $(REPO) /bin/sh -c 'cd $(DOCKER_ZEPHYR_PATH)/zephyr && \ west build -b $(BOARD) -p auto $(DOCKER_PROJECT_PATH) $(OVERLAY) --build-dir $(DOCKER_PROJECT_PATH)/build' diff --git a/examples/zephyr/device-dashboard/src/mongoose.c b/examples/zephyr/device-dashboard/src/mongoose.c index ee00a90c..3d2306b9 100644 --- a/examples/zephyr/device-dashboard/src/mongoose.c +++ b/examples/zephyr/device-dashboard/src/mongoose.c @@ -1349,6 +1349,7 @@ struct mg_fs mg_fs_posix = {p_stat, p_list, p_open, p_close, p_read, + // Chunk deletion marker is the MSB in the "processed" counter #define MG_DMARK ((size_t) 1 << (sizeof(size_t) * 8 - 1)) @@ -1694,7 +1695,9 @@ static void static_cb(struct mg_connection *c, int ev, void *ev_data, if (ev == MG_EV_WRITE || ev == MG_EV_POLL) { struct mg_fd *fd = (struct mg_fd *) fn_data; // Read to send IO buffer directly, avoid extra on-stack buffer - size_t n, max = MG_IO_SIZE, space, *cl = (size_t *) c->label; + size_t n, max = MG_IO_SIZE, space; + size_t *cl = (size_t *) &c->label[(sizeof(c->label) - sizeof(size_t)) / + sizeof(size_t) * sizeof(size_t)]; if (c->send.size < max) mg_iobuf_resize(&c->send, max); if (c->send.len >= c->send.size) return; // Rate limit if ((space = c->send.size - c->send.len) > *cl) space = *cl; @@ -1865,9 +1868,12 @@ void mg_http_serve_file(struct mg_connection *c, struct mg_http_message *hm, c->is_resp = 0; mg_fs_close(fd); } else { + // Track to-be-sent content length at the end of c->label, aligned + size_t *clp = (size_t *) &c->label[(sizeof(c->label) - sizeof(size_t)) / + sizeof(size_t) * sizeof(size_t)]; c->pfn = static_cb; c->pfn_data = fd; - *(size_t *) c->label = (size_t) cl; // Track to-be-sent content length + *clp = (size_t) cl; } } } @@ -2237,7 +2243,7 @@ static void deliver_chunked_chunks(struct mg_connection *c, size_t hlen, ofs += pl + dl + 2, del += pl + 2; // 2 is for \r\n suffix processed += dl; if (c->recv.len != saved) processed -= dl, buf -= dl; - mg_hexdump(c->recv.buf, hlen + processed); + // mg_hexdump(c->recv.buf, hlen + processed); last = (dl == 0); } mg_iobuf_del(&c->recv, hlen + processed, del); @@ -2310,6 +2316,34 @@ static void http_cb(struct mg_connection *c, int ev, void *evd, void *fnd) { (void) evd, (void) fnd; } +static void mg_hfn(struct mg_connection *c, int ev, void *ev_data, void *fnd) { + if (ev == MG_EV_HTTP_MSG) { + struct mg_http_message *hm = (struct mg_http_message *) ev_data; + if (mg_http_match_uri(hm, "/quit")) { + mg_http_reply(c, 200, "", "ok\n"); + c->is_draining = 1; + c->label[0] = 'X'; + } else if (mg_http_match_uri(hm, "/debug")) { + int level = (int) mg_json_get_long(hm->body, "$.level", MG_LL_DEBUG); + mg_log_set(level); + mg_http_reply(c, 200, "", "Debug level set to %d\n", level); + } else { + mg_http_reply(c, 200, "", "hi\n"); + } + } else if (ev == MG_EV_CLOSE) { + if (c->label[0] == 'X') *(bool *) fnd = true; + } +} + +void mg_hello(const char *url) { + struct mg_mgr mgr; + bool done = false; + mg_mgr_init(&mgr); + if (mg_http_listen(&mgr, url, mg_hfn, &done) == NULL) done = true; + while (done == false) mg_mgr_poll(&mgr, 100); + mg_mgr_free(&mgr); +} + struct mg_connection *mg_http_connect(struct mg_mgr *mgr, const char *url, mg_event_handler_t fn, void *fn_data) { struct mg_connection *c = mg_connect(mgr, url, fn, fn_data); @@ -3432,6 +3466,7 @@ struct mg_connection *mg_connect(struct mg_mgr *mgr, const char *url, } else { LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c); c->is_udp = (strncmp(url, "udp:", 4) == 0); + c->fd = (void *) (size_t) -1; // Set to INVALID_SOCKET c->fn = fn; c->is_client = true; c->fn_data = fn_data; @@ -4127,14 +4162,12 @@ static void mg_set_non_blocking_mode(SOCKET fd) { fcntl(fd, F_SETFL, O_NONBLOCK); #elif MG_ARCH == MG_ARCH_TIRTOS int val = 0; - setsockopt(fd, 0, SO_BLOCKING, &val, sizeof(val)); - int status = 0; - int res = SockStatus(fd, FDSTATUS_SEND, &status); - if (res == 0 && status > 0) { - val = status / 2; - int val_size = sizeof(val); - res = SockSet(fd, SOL_SOCKET, SO_SNDLOWAT, &val, val_size); - } + setsockopt(fd, SOL_SOCKET, SO_BLOCKING, &val, sizeof(val)); + // SPRU524J section 3.3.3 page 63, SO_SNDLOWAT + int sz = sizeof(val); + getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &sz); + val /= 2; // set send low-water mark at half send buffer size + setsockopt(fd, SOL_SOCKET, SO_SNDLOWAT, &val, sizeof(val)); #else fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK); // Non-blocking mode fcntl(fd, F_SETFD, FD_CLOEXEC); // Set close-on-exec @@ -4298,6 +4331,11 @@ void mg_connect_resolved(struct mg_connection *c) { mg_error(c, "socket(): %d", MG_SOCK_ERRNO); } else if (c->is_udp) { MG_EPOLL_ADD(c); +#if MG_ARCH == MG_ARCH_TIRTOS + union usa usa; // TI-RTOS NDK requires binding to receive on UDP sockets + socklen_t slen = tousa(&c->loc, &usa); + if (bind(c->fd, &usa.sa, slen) != 0) MG_ERROR(("bind: %d", MG_SOCK_ERRNO)); +#endif mg_call(c, MG_EV_RESOLVE, NULL); mg_call(c, MG_EV_CONNECT, NULL); } else { @@ -4317,6 +4355,7 @@ void mg_connect_resolved(struct mg_connection *c) { mg_error(c, "connect: %d", MG_SOCK_ERRNO); } } + (void) rc; } static SOCKET raccept(SOCKET sock, union usa *usa, socklen_t len) { @@ -5325,11 +5364,13 @@ void mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) { } } if (opts->ciphers != NULL) SSL_set_cipher_list(tls->ssl, opts->ciphers); +#if OPENSSL_VERSION_NUMBER >= 0x10100000L if (opts->srvname.len > 0) { char *s = mg_mprintf("%.*s", (int) opts->srvname.len, opts->srvname.ptr); SSL_set1_host(tls->ssl, s); free(s); } +#endif c->tls = tls; c->is_tls = 1; c->is_tls_hs = 1; @@ -5585,6 +5626,8 @@ uint64_t mg_millis(void) { return xTaskGetTickCount() * portTICK_PERIOD_MS; #elif MG_ARCH == MG_ARCH_AZURERTOS return tx_time_get() * (1000 /* MS per SEC */ / TX_TIMER_TICKS_PER_SECOND); +#elif MG_ARCH == MG_ARCH_TIRTOS + return (uint64_t) Clock_getTicks(); #elif MG_ARCH == MG_ARCH_ZEPHYR return (uint64_t) k_uptime_get(); #elif MG_ARCH == MG_ARCH_UNIX && defined(__APPLE__) @@ -5812,9 +5855,10 @@ static void mg_ws_cb(struct mg_connection *c, int ev, void *ev_data, if (final) mg_call(c, MG_EV_WS_MSG, &m); break; case WEBSOCKET_OP_CLOSE: - MG_DEBUG(("%lu Got WS CLOSE", c->id)); + MG_DEBUG(("%lu WS CLOSE", c->id)); mg_call(c, MG_EV_WS_CTL, &m); - mg_ws_send(c, "", 0, WEBSOCKET_OP_CLOSE); + // Echo the payload of the received CLOSE message back to the sender + mg_ws_send(c, m.data.ptr, m.data.len, WEBSOCKET_OP_CLOSE); c->is_draining = 1; break; default: @@ -6089,7 +6133,7 @@ static bool mip_driver_stm32_init(uint8_t *mac, void *userdata) { // Set MDC clock divider. If user told us the value, use it. Otherwise, guess int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr; - ETH->MACMIIAR = ((uint32_t)cr & 3) << 2; + ETH->MACMIIAR = ((uint32_t)cr & 7) << 2; // NOTE(cpq): we do not use extended descriptor bit 7, and do not use // hardware checksum. Therefore, descriptor size is 4, not 8 @@ -6564,6 +6608,13 @@ static void arp_cache_add(struct mip_if *ifp, uint32_t ip, uint8_t mac[6]) { mac[0], mac[1], mac[2], mac[3], mac[4], mac[5])); } +static size_t ether_output(struct mip_if *ifp, size_t len) { + // size_t min = 64; // Pad short frames to 64 bytes (minimum Ethernet size) + // if (len < min) memset(ifp->tx.buf + len, 0, min - len), len = min; + // mg_hexdump(ifp->tx.buf, len); + return ifp->driver->tx(ifp->tx.buf, len, ifp->driver_data); +} + static void arp_ask(struct mip_if *ifp, uint32_t ip) { struct eth *eth = (struct eth *) ifp->tx.buf; struct arp *arp = (struct arp *) (eth + 1); @@ -6575,7 +6626,7 @@ static void arp_ask(struct mip_if *ifp, uint32_t ip) { arp->plen = 4; arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip; memcpy(arp->sha, ifp->mac, sizeof(arp->sha)); - ifp->driver->tx(eth, PDIFF(eth, arp + 1), ifp->driver_data); + ether_output(ifp, PDIFF(eth, arp + 1)); } static size_t mg_print_ipv4(mg_pfn_t fn, void *fn_data, va_list *ap) { @@ -6601,11 +6652,12 @@ static struct ip *tx_ip(struct mip_if *ifp, uint8_t proto, uint32_t ip_src, uint32_t ip_dst, size_t plen) { struct eth *eth = (struct eth *) ifp->tx.buf; struct ip *ip = (struct ip *) (eth + 1); - uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ? - if (!mac) mac = arp_cache_find(ifp, ifp->gw); // No, use gateway - if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it - if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast - memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup + uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ? + if (!mac && (ip_dst & ifp->mask)) arp_ask(ifp, ip_dst); // Same net, lookup + if (!mac) mac = arp_cache_find(ifp, ifp->gw); // Use gateway MAC + if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it + if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast + memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup eth->type = mg_htons(0x800); memset(ip, 0, sizeof(*ip)); ip->ver = 0x45; // Version 4, header length 5 words @@ -6637,24 +6689,11 @@ static void tx_udp(struct mip_if *ifp, uint32_t ip_src, uint16_t sport, udp->csum = csumfin(cs); memmove(udp + 1, buf, len); // MG_DEBUG(("UDP LEN %d %d", (int) len, (int) ifp->frame_len)); - ifp->driver->tx(ifp->tx.buf, - sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len, - ifp->driver_data); + ether_output(ifp, sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len); } static void tx_dhcp(struct mip_if *ifp, uint32_t src, uint32_t dst, uint8_t *opts, size_t optslen) { -#if 0 -struct dhcp { - uint8_t op, htype, hlen, hops; - uint32_t xid; - uint16_t secs, flags; - uint32_t ciaddr, yiaddr, siaddr, giaddr; - uint8_t hwaddr[208]; - uint32_t magic; - uint8_t options[32]; -}; -#endif struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}}; dhcp.magic = mg_htonl(0x63825363); memcpy(&dhcp.hwaddr, ifp->mac, sizeof(ifp->mac)); @@ -6703,7 +6742,7 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) { arp->tpa = pkt->arp->spa; arp->spa = ifp->ip; MG_DEBUG(("ARP response: we're %#lx", (long) mg_ntohl(ifp->ip))); - ifp->driver->tx(ifp->tx.buf, PDIFF(eth, arp + 1), ifp->driver_data); + ether_output(ifp, PDIFF(eth, arp + 1)); } else if (pkt->arp->op == mg_htons(2)) { if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return; // MG_INFO(("ARP RESPONSE")); @@ -6714,15 +6753,16 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) { static void rx_icmp(struct mip_if *ifp, struct pkt *pkt) { // MG_DEBUG(("ICMP %d", (int) len)); if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) { - struct ip *ip = tx_ip(ifp, 1, ifp->ip, pkt->ip->src, - sizeof(struct icmp) + pkt->pay.len); + size_t hlen = sizeof(struct eth) + sizeof(struct ip) + sizeof(struct icmp); + size_t space = ifp->tx.len - hlen, plen = pkt->pay.len; + if (plen > space) plen = space; + struct ip *ip = + tx_ip(ifp, 1, ifp->ip, pkt->ip->src, sizeof(struct icmp) + plen); struct icmp *icmp = (struct icmp *) (ip + 1); - size_t len = PDIFF(ifp->tx.buf, icmp + 1), left = ifp->tx.len - len; - if (left > pkt->pay.len) left = pkt->pay.len; // Don't overflow TX - memset(icmp, 0, sizeof(*icmp)); // Set csum to 0 - memcpy(icmp + 1, pkt->pay.buf, left); // Copy RX payload to TX - icmp->csum = ipcsum(icmp, sizeof(*icmp) + left); - ifp->driver->tx(ifp->tx.buf, len + left, ifp->driver_data); + memset(icmp, 0, sizeof(*icmp)); // Set csum to 0 + memcpy(icmp + 1, pkt->pay.buf, plen); // Copy RX payload to TX + icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen); + ether_output(ifp, hlen + plen); } } @@ -6806,8 +6846,7 @@ static size_t tx_tcp(struct mip_if *ifp, uint32_t dst_ip, uint8_t flags, cs = csumup(cs, &ip->dst, sizeof(ip->dst)); cs = csumup(cs, pseudo, sizeof(pseudo)); tcp->csum = csumfin(cs); - return ifp->driver->tx(ifp->tx.buf, PDIFF(ifp->tx.buf, tcp + 1) + len, - ifp->driver_data); + return ether_output(ifp, PDIFF(ifp->tx.buf, tcp + 1) + len); } static size_t tx_tcp_pkt(struct mip_if *ifp, struct pkt *pkt, uint8_t flags, @@ -6876,16 +6915,17 @@ long mg_io_recv(struct mg_connection *c, void *buf, size_t len) { static void read_conn(struct mg_connection *c, struct pkt *pkt) { struct connstate *s = (struct connstate *) (c + 1); struct mg_iobuf *io = c->is_tls ? &s->raw : &c->recv; + uint32_t seq = mg_ntohl(pkt->tcp->seq); s->raw.align = c->recv.align; if (pkt->tcp->flags & TH_FIN) { s->ack = mg_htonl(pkt->tcp->seq) + 1, s->seq = mg_htonl(pkt->tcp->ack); c->is_closing = 1; } else if (pkt->pay.len == 0) { // TODO(cpq): handle this peer's ACK - } else if (mg_ntohl(pkt->tcp->seq) != s->ack) { + } else if (seq != s->ack) { // TODO(cpq): peer sent us SEQ which we don't expect. Retransmit rather // than close this connection - mg_error(c, "SEQ != ACK: %x %x", mg_ntohl(pkt->tcp->seq), s->ack); + mg_error(c, "SEQ != ACK: %x %x", seq, s->ack); } else if (io->size - io->len < pkt->pay.len && !mg_iobuf_resize(io, io->len + pkt->pay.len)) { mg_error(c, "oom"); @@ -6897,9 +6937,18 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) { // call back mg_io_recv() which grabs raw data from s->raw memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len); io->len += pkt->pay.len; - // Advance ACK counter and setup a timer to send an ACK back + + MG_DEBUG(("%lu SEQ %x -> %x", c->id, mg_htonl(pkt->tcp->seq), s->ack)); s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len); +#if 1 + // Send ACK immediately + MG_DEBUG((" imm ACK", c->id, mg_htonl(pkt->tcp->seq), s->ack)); + tx_tcp((struct mip_if *) c->mgr->priv, c->rem.ip, TH_ACK, c->loc.port, + c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0); +#else + // Advance ACK counter and setup a timer to send an ACK back settmout(c, MIP_TTYPE_ACK); +#endif if (c->is_tls) { // TLS connection. Make room for decrypted data in c->recv @@ -6967,7 +7016,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) { } static void rx_ip(struct mip_if *ifp, struct pkt *pkt) { - // MG_DEBUG(("IP %d", (int) pkt->pay.len)); + // MG_DEBUG(("IP %d", (int) pkt->pay.len)); if (pkt->ip->proto == 1) { pkt->icmp = (struct icmp *) (pkt->ip + 1); if (pkt->pay.len < sizeof(*pkt->icmp)) return; @@ -7039,6 +7088,10 @@ static void mip_rx(struct mip_if *ifp, void *buf, size_t len) { pkt.ip = (struct ip *) (pkt.eth + 1); if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return; // Truncated if ((pkt.ip->ver >> 4) != 4) return; // Not IP + // MG_DEBUG(("%u %u", mg_ntohs(pkt.ip->len) + 14, pkt.raw.len)); + if ((size_t) mg_ntohs(pkt.ip->len) + 14 < pkt.raw.len) { + pkt.raw.len -= pkt.raw.len - (mg_ntohs(pkt.ip->len) + 14); + } mkpay(&pkt, pkt.ip + 1); rx_ip(ifp, &pkt); } else { @@ -7091,7 +7144,7 @@ static void mip_poll(struct mip_if *ifp, uint64_t uptime_ms) { struct connstate *s = (struct connstate *) (c + 1); if (uptime_ms > s->timer) { if (s->ttype == MIP_TTYPE_ACK) { - MG_DEBUG(("%lu ack", c->id)); + MG_DEBUG(("%lu ack %x %x", c->id, s->seq, s->ack)); tx_tcp(ifp, c->rem.ip, TH_ACK, c->loc.port, c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0); } else { diff --git a/examples/zephyr/device-dashboard/src/mongoose.h b/examples/zephyr/device-dashboard/src/mongoose.h index 03f916ad..575e6a30 100644 --- a/examples/zephyr/device-dashboard/src/mongoose.h +++ b/examples/zephyr/device-dashboard/src/mongoose.h @@ -49,19 +49,19 @@ extern "C" { #define MG_ARCH MG_ARCH_WIN32 #elif defined(ICACHE_FLASH) || defined(ICACHE_RAM_ATTR) #define MG_ARCH MG_ARCH_ESP8266 +#elif defined(__ZEPHYR__) +#define MG_ARCH MG_ARCH_ZEPHYR #elif defined(ESP_PLATFORM) #define MG_ARCH MG_ARCH_ESP32 #elif defined(FREERTOS_IP_H) #define MG_ARCH MG_ARCH_FREERTOS_TCP #elif defined(AZURE_RTOS_THREADX) #define MG_ARCH MG_ARCH_AZURERTOS -#elif defined(__ZEPHYR__) -#define MG_ARCH MG_ARCH_ZEPHYR #elif defined(PICO_TARGET_NAME) #define MG_ARCH MG_ARCH_RP2040 #endif -#if !defined(MG_ARCH) +#if !defined(MG_ARCH) || (MG_ARCH == MG_ARCH_CUSTOM) #include "mongoose_custom.h" // keep this include #endif @@ -293,6 +293,12 @@ struct timeval { #define EINTR pdFREERTOS_ERRNO_EINTR #endif +// FreeRTOS-TCP uses non-standard semantics for listen() backlog size. It is +// not a backlog size for pending SYN connections, but a max socket number +#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE +#define MG_SOCK_LISTEN_BACKLOG_SIZE 128 +#endif + #endif // MG_ARCH == MG_ARCH_FREERTOS_TCP @@ -414,13 +420,11 @@ struct timeval { #include #include #include -#include -#include +#include #include -extern int SockStatus(SOCKET hSock, int request, int *results ); -extern int SockSet(SOCKET hSock, int Type, int Prop, void *pbuf, int size); +#include #endif @@ -1174,6 +1178,7 @@ void mg_http_bauth(struct mg_connection *, const char *user, const char *pass); struct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v); size_t mg_http_next_multipart(struct mg_str, size_t, struct mg_http_part *); int mg_http_status(const struct mg_http_message *hm); +void mg_hello(const char *url); void mg_http_serve_ssi(struct mg_connection *c, const char *root, diff --git a/examples/zephyr/device-dashboard/src/net.c b/examples/zephyr/device-dashboard/src/net.c index db5eab60..07e77ddb 100644 --- a/examples/zephyr/device-dashboard/src/net.c +++ b/examples/zephyr/device-dashboard/src/net.c @@ -170,6 +170,10 @@ void device_dashboard_fn(struct mg_connection *c, int ev, void *ev_data, // u ? u->name : "NULL")); if (mg_http_match_uri(hm, "/api/hi")) { mg_http_reply(c, 200, "", "hi\n"); // Testing endpoint + } else if (mg_http_match_uri(hm, "/api/debug")) { + int level = mg_json_get_long(hm->body, "$.level", MG_LL_DEBUG); + mg_log_set(level); + mg_http_reply(c, 200, "", "Debug level set to %d\n", level); } else if (u == NULL && mg_http_match_uri(hm, "/api/#")) { // All URIs starting with /api/ must be authenticated mg_http_reply(c, 403, "", "Denied\n"); diff --git a/examples/zephyr/device-dashboard/src/packed_fs.c b/examples/zephyr/device-dashboard/src/packed_fs.c index 796f97c6..ac0b61e8 100644 --- a/examples/zephyr/device-dashboard/src/packed_fs.c +++ b/examples/zephyr/device-dashboard/src/packed_fs.c @@ -3,2279 +3,40 @@ #include static const unsigned char v1[] = { - 39, 117, 115, 101, 32, 115, 116, 114, 105, 99, 116, 39, // 'use strict' - 59, 10, 105, 109, 112, 111, 114, 116, 32, 123, 67, 111, // ;.import {Co - 109, 112, 111, 110, 101, 110, 116, 44, 32, 104, 44, 32, // mponent, h, - 104, 116, 109, 108, 44, 32, 114, 101, 110, 100, 101, 114, // html, render - 44, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // , useEffect, - 32, 117, 115, 101, 83, 116, 97, 116, 101, 44, 32, 117, // useState, u - 115, 101, 82, 101, 102, 125, 32, 102, 114, 111, 109, 32, // seRef} from - 39, 46, 47, 112, 114, 101, 97, 99, 116, 46, 109, 105, // './preact.mi - 110, 46, 106, 115, 39, 59, 10, 10, 99, 111, 110, 115, // n.js';..cons - 116, 32, 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, // t MaxMetrics - 68, 97, 116, 97, 80, 111, 105, 110, 116, 115, 32, 61, // DataPoints = - 32, 53, 48, 59, 10, 10, 47, 47, 32, 84, 104, 105, // 50;..// Thi - 115, 32, 115, 105, 109, 112, 108, 101, 32, 112, 117, 98, // s simple pub - 108, 105, 115, 104, 47, 115, 117, 98, 115, 99, 114, 105, // lish/subscri - 98, 101, 32, 105, 115, 32, 117, 115, 101, 100, 32, 116, // be is used t - 111, 32, 112, 97, 115, 115, 32, 110, 111, 116, 105, 102, // o pass notif - 105, 99, 97, 116, 105, 111, 110, 115, 32, 116, 104, 97, // ications tha - 116, 32, 119, 101, 114, 101, 10, 47, 47, 32, 114, 101, // t were.// re - 99, 101, 105, 118, 101, 100, 32, 102, 114, 111, 109, 32, // ceived from - 116, 104, 101, 32, 115, 101, 114, 118, 101, 114, 44, 32, // the server, - 116, 111, 32, 97, 108, 108, 32, 99, 104, 105, 108, 100, // to all child - 32, 99, 111, 109, 112, 111, 110, 101, 110, 116, 115, 32, // components - 111, 102, 32, 116, 104, 101, 32, 97, 112, 112, 46, 10, // of the app.. - 118, 97, 114, 32, 80, 117, 98, 83, 117, 98, 32, 61, // var PubSub = - 32, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // (function() - 32, 123, 10, 32, 32, 118, 97, 114, 32, 104, 97, 110, // {. var han - 100, 108, 101, 114, 115, 32, 61, 32, 123, 125, 44, 32, // dlers = {}, - 105, 100, 32, 61, 32, 48, 59, 10, 32, 32, 114, 101, // id = 0;. re - 116, 117, 114, 110, 32, 123, 10, 32, 32, 32, 32, 115, // turn {. s - 117, 98, 115, 99, 114, 105, 98, 101, 58, 32, 102, 117, // ubscribe: fu - 110, 99, 116, 105, 111, 110, 40, 102, 110, 41, 32, 123, // nction(fn) { - 10, 32, 32, 32, 32, 32, 32, 104, 97, 110, 100, 108, // . handl - 101, 114, 115, 91, 105, 100, 43, 43, 93, 32, 61, 32, // ers[id++] = - 102, 110, 59, 10, 32, 32, 32, 32, 125, 44, 10, 32, // fn;. },. - 32, 32, 32, 117, 110, 115, 117, 98, 115, 99, 114, 105, // unsubscri - 98, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, // be: function - 40, 105, 100, 41, 32, 123, 10, 32, 32, 32, 32, 32, // (id) {. - 32, 100, 101, 108, 101, 116, 101, 32, 104, 97, 110, 100, // delete hand - 108, 101, 114, 115, 91, 105, 100, 93, 59, 10, 32, 32, // lers[id];. - 32, 32, 125, 44, 10, 32, 32, 32, 32, 112, 117, 98, // },. pub - 108, 105, 115, 104, 58, 32, 102, 117, 110, 99, 116, 105, // lish: functi - 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, 32, // on(data) {. - 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, // for (va - 114, 32, 107, 32, 105, 110, 32, 104, 97, 110, 100, 108, // r k in handl - 101, 114, 115, 41, 32, 104, 97, 110, 100, 108, 101, 114, // ers) handler - 115, 91, 107, 93, 40, 100, 97, 116, 97, 41, 59, 10, // s[k](data);. - 32, 32, 32, 32, 125, 10, 32, 32, 125, 59, 10, 125, // }. };.} - 41, 40, 41, 59, 10, 10, 99, 111, 110, 115, 116, 32, // )();..const - 78, 97, 118, 32, 61, 32, 112, 114, 111, 112, 115, 32, // Nav = props - 61, 62, 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, // => html`.. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. < - 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 102, // div style="f - 108, 101, 120, 58, 32, 49, 32, 49, 32, 97, 117, 116, // lex: 1 1 aut - 111, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, // o; display: - 102, 108, 101, 120, 59, 32, 97, 108, 105, 103, 110, 45, // flex; align- - 105, 116, 101, 109, 115, 58, 32, 99, 101, 110, 116, 101, // items: cente - 114, 59, 34, 62, 10, 32, 32, 32, 32, 32, 32, 60, // r;">. < - 98, 62, 89, 111, 117, 114, 32, 80, 114, 111, 100, 117, // b>Your Produ - 99, 116, 60, 47, 98, 62, 10, 32, 32, 32, 32, 60, // ct. < - 47, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 100, // /div>. . < - 115, 112, 97, 110, 62, 76, 111, 103, 103, 101, 100, 32, // span>Logged - 105, 110, 32, 97, 115, 58, 60, 47, 115, 112, 97, 110, // in as:. . - 32, 32, 32, 32, 60, 115, 112, 97, 110, 62, 36, 123, // ${ - 112, 114, 111, 112, 115, 46, 117, 115, 101, 114, 125, 60, // props.user}< - 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, 32, // /span>. - 32, 60, 97, 32, 99, 108, 97, 115, 115, 61, 34, 98, // logout - 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, // .
. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 60, 47, 100, // .`;...cons - 116, 32, 72, 101, 114, 111, 32, 61, 32, 112, 114, 111, // t Hero = pro - 112, 115, 32, 61, 62, 32, 104, 116, 109, 108, 96, 10, // ps => html`. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. - 10, 32, 32, 60, 104, 49, 32, 115, 116, 121, 108, 101, // .

Inte - 114, 97, 99, 116, 105, 118, 101, 32, 68, 101, 118, 105, // ractive Devi - 99, 101, 32, 68, 97, 115, 104, 98, 111, 97, 114, 100, // ce Dashboard - 60, 47, 104, 49, 62, 10, 10, 32, 32, 60, 112, 62, //

..

- 10, 32, 32, 84, 104, 105, 115, 32, 100, 101, 118, 105, // . This devi - 99, 101, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // ce dashboard - 32, 105, 115, 32, 100, 101, 118, 101, 108, 111, 112, 101, // is develope - 100, 32, 117, 115, 105, 110, 103, 32, 116, 104, 101, 32, // d using the - 109, 111, 100, 101, 114, 110, 32, 97, 110, 100, 32, 99, // modern and c - 111, 109, 112, 97, 99, 116, 32, 80, 114, 101, 97, 99, // ompact Preac - 116, 32, 102, 114, 97, 109, 101, 119, 111, 114, 107, 44, // t framework, - 10, 32, 32, 105, 110, 32, 111, 114, 100, 101, 114, 32, // . in order - 116, 111, 32, 102, 105, 116, 32, 111, 110, 32, 118, 101, // to fit on ve - 114, 121, 32, 115, 109, 97, 108, 108, 32, 100, 101, 118, // ry small dev - 105, 99, 101, 115, 46, 32, 84, 104, 105, 115, 32, 105, // ices. This i - 115, 10, 32, 32, 97, 32, 60, 97, 32, 104, 114, 101, // s. a h - 121, 98, 114, 105, 100, 32, 115, 101, 114, 118, 101, 114, // ybrid server - 60, 47, 97, 62, 32, 119, 104, 105, 99, 104, 10, 32, // which. - 32, 112, 114, 111, 118, 105, 100, 101, 115, 32, 98, 111, // provides bo - 116, 104, 32, 115, 116, 97, 116, 105, 99, 32, 97, 110, // th static an - 100, 32, 100, 121, 110, 97, 109, 105, 99, 32, 99, 111, // d dynamic co - 110, 116, 101, 110, 116, 46, 32, 32, 83, 116, 97, 116, // ntent. Stat - 105, 99, 32, 102, 105, 108, 101, 115, 44, 32, 108, 105, // ic files, li - 107, 101, 32, 67, 83, 83, 47, 74, 83, 47, 72, 84, // ke CSS/JS/HT - 77, 76, 10, 32, 32, 111, 114, 32, 105, 109, 97, 103, // ML. or imag - 101, 115, 44, 32, 97, 114, 101, 32, 99, 111, 109, 112, // es, are comp - 105, 108, 101, 100, 32, 105, 110, 116, 111, 32, 116, 104, // iled into th - 101, 32, 115, 101, 114, 118, 101, 114, 32, 98, 105, 110, // e server bin - 97, 114, 121, 46, 10, 10, 32, 32, 84, 104, 105, 115, // ary... This - 32, 85, 73, 32, 117, 115, 101, 115, 32, 116, 104, 101, // UI uses the - 32, 82, 69, 83, 84, 32, 65, 80, 73, 32, 105, 109, // REST API im - 112, 108, 101, 109, 101, 110, 116, 101, 100, 32, 98, 121, // plemented by - 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, 101, 44, // the device, - 32, 119, 104, 105, 99, 104, 32, 121, 111, 117, 32, 99, // which you c - 97, 110, 32, 101, 120, 97, 109, 105, 110, 101, 10, 32, // an examine. - 32, 117, 115, 105, 110, 103, 32, 32, 60, 99, 111, 100, // using curl command-li - 110, 101, 32, 117, 116, 105, 108, 105, 116, 121, 58, 10, // ne utility:. - 32, 32, 60, 47, 112, 62, 10, 10, 32, 32, 60, 100, //

.. cur - 108, 32, 45, 117, 32, 97, 100, 109, 105, 110, 58, 112, // l -u admin:p - 97, 115, 115, 48, 32, 108, 111, 99, 97, 108, 104, 111, // ass0 localho - 115, 116, 58, 56, 48, 48, 48, 47, 97, 112, 105, 47, // st:8000/api/ - 99, 111, 110, 102, 105, 103, 47, 103, 101, 116, 60, 47, // config/get
- 10, 32, 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, // .
curl -u ad - 109, 105, 110, 58, 112, 97, 115, 115, 48, 32, 108, 111, // min:pass0 lo - 99, 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, // calhost:8000 - 47, 97, 112, 105, 47, 99, 111, 110, 102, 105, 103, 47, // /api/config/ - 115, 101, 116, 32, 45, 100, 32, 39, 112, 117, 98, 61, // set -d 'pub= - 109, 103, 47, 116, 111, 112, 105, 99, 39, 60, 47, 99, // mg/topic'
. - 32, 32, 60, 100, 105, 118, 62, 60, 99, 111, 100, 101, //
curl -u adm - 105, 110, 58, 112, 97, 115, 115, 48, 32, 108, 111, 99, // in:pass0 loc - 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, 47, // alhost:8000/ - 97, 112, 105, 47, 109, 101, 115, 115, 97, 103, 101, 47, // api/message/ - 115, 101, 110, 100, 32, 45, 100, 32, 39, 109, 101, 115, // send -d 'mes - 115, 97, 103, 101, 61, 104, 101, 108, 108, 111, 39, 60, // sage=hello'< - 47, 99, 111, 100, 101, 62, 32, 60, 47, 100, 105, 118, // /code>
..

. T - 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, 99, 97, // he device ca - 110, 32, 115, 101, 110, 100, 32, 110, 111, 116, 105, 102, // n send notif - 105, 99, 97, 116, 105, 111, 110, 115, 32, 116, 111, 32, // ications to - 116, 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, 97, // this dashboa - 114, 100, 32, 97, 116, 32, 97, 110, 121, 116, 105, 109, // rd at anytim - 101, 46, 32, 78, 111, 116, 105, 102, 105, 99, 97, 116, // e. Notificat - 105, 111, 110, 115, 10, 32, 32, 97, 114, 101, 32, 115, // ions. are s - 101, 110, 116, 32, 111, 118, 101, 114, 32, 87, 101, 98, // ent over Web - 83, 111, 99, 107, 101, 116, 32, 97, 116, 32, 85, 82, // Socket at UR - 73, 32, 60, 99, 111, 100, 101, 62, 47, 97, 112, 105, // I /api - 47, 119, 97, 116, 99, 104, 60, 47, 99, 111, 100, 101, // /watch as JSON st - 114, 105, 110, 103, 115, 58, 32, 60, 99, 111, 100, 101, // rings: {"name": ". - 46, 34, 44, 32, 34, 100, 97, 116, 97, 34, 58, 32, // .", "data": - 46, 46, 46, 125, 60, 47, 99, 111, 100, 101, 62, 10, // ...}. - 32, 32, 60, 100, 105, 118, 62, 84, 114, 121, 32, 60, //

Try < - 99, 111, 100, 101, 62, 119, 115, 99, 97, 116, 32, 45, // code>wscat - - 45, 97, 117, 116, 104, 32, 117, 115, 101, 114, 49, 58, // -auth user1: - 112, 97, 115, 115, 49, 32, 45, 45, 99, 111, 110, 110, // pass1 --conn - 101, 99, 116, 32, 119, 115, 58, 47, 47, 108, 111, 99, // ect ws://loc - 97, 108, 104, 111, 115, 116, 58, 56, 48, 48, 48, 47, // alhost:8000/ - 97, 112, 105, 47, 119, 97, 116, 99, 104, 60, 47, 99, // api/watch
. - 32, 60, 47, 112, 62, 10, 60, 47, 100, 105, 118, 62, //

. - 10, 60, 47, 100, 105, 118, 62, 96, 59, 10, 10, 99, // .`;..c - 111, 110, 115, 116, 32, 76, 111, 103, 105, 110, 32, 61, // onst Login = - 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, 114, // function(pr - 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, 110, // ops) {. con - 115, 116, 32, 91, 117, 115, 101, 114, 44, 32, 115, 101, // st [user, se - 116, 85, 115, 101, 114, 93, 32, 61, 32, 117, 115, 101, // tUser] = use - 83, 116, 97, 116, 101, 40, 39, 39, 41, 59, 10, 32, // State('');. - 32, 99, 111, 110, 115, 116, 32, 91, 112, 97, 115, 115, // const [pass - 44, 32, 115, 101, 116, 80, 97, 115, 115, 93, 32, 61, // , setPass] = - 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState('' - 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, // );. const l - 111, 103, 105, 110, 32, 61, 32, 101, 118, 32, 61, 62, // ogin = ev => - 10, 32, 32, 32, 32, 32, 32, 102, 101, 116, 99, 104, // . fetch - 40, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // (. - 39, 47, 97, 112, 105, 47, 108, 111, 103, 105, 110, 39, // '/api/login' - 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ,. - 123, 104, 101, 97, 100, 101, 114, 115, 58, 32, 123, 65, // {headers: {A - 117, 116, 104, 111, 114, 105, 122, 97, 116, 105, 111, 110, // uthorization - 58, 32, 39, 66, 97, 115, 105, 99, 32, 39, 32, 43, // : 'Basic ' + - 32, 98, 116, 111, 97, 40, 117, 115, 101, 114, 32, 43, // btoa(user + - 32, 39, 58, 39, 32, 43, 32, 112, 97, 115, 115, 41, // ':' + pass) - 125, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, // }}). - 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, 62, // .then(r => - 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 10, 32, // r.json()). - 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, // .th - 101, 110, 40, 114, 32, 61, 62, 32, 114, 32, 38, 38, // en(r => r && - 32, 112, 114, 111, 112, 115, 46, 108, 111, 103, 105, 110, // props.login - 40, 114, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, // (r)). - 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, 101, 114, // .catch(er - 114, 32, 61, 62, 32, 101, 114, 114, 41, 59, 10, 32, // r => err);. - 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, 108, // return html - 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, // `.
- 10, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, // .
. - 60, 104, 49, 32, 115, 116, 121, 108, 101, 61, 34, 99, //

Device Dash - 98, 111, 97, 114, 100, 32, 76, 111, 103, 105, 110, 32, // board Login - 60, 47, 104, 49, 62, 10, 32, 32, 32, 32, 60, 100, //

. . < - 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 39, // input type=' - 116, 101, 120, 116, 39, 32, 112, 108, 97, 99, 101, 104, // text' placeh - 111, 108, 100, 101, 114, 61, 39, 78, 97, 109, 101, 39, // older='Name' - 32, 115, 116, 121, 108, 101, 61, 34, 119, 105, 100, 116, // style="widt - 104, 58, 32, 49, 48, 48, 37, 59, 34, 10, 32, 32, // h: 100%;". - 32, 32, 32, 32, 32, 32, 111, 110, 105, 110, 112, 117, // oninpu - 116, 61, 36, 123, 101, 118, 32, 61, 62, 32, 115, 101, // t=${ev => se - 116, 85, 115, 101, 114, 40, 101, 118, 46, 116, 97, 114, // tUser(ev.tar - 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, // get.value)} - 118, 97, 108, 117, 101, 61, 36, 123, 117, 115, 101, 114, // value=${user - 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, 47, 100, // } />. .
. setPass( - 101, 118, 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, // ev.target.va - 108, 117, 101, 41, 125, 32, 118, 97, 108, 117, 101, 61, // lue)} value= - 36, 123, 112, 97, 115, 115, 125, 10, 32, 32, 32, 32, // ${pass}. - 32, 32, 32, 32, 111, 110, 99, 104, 97, 110, 103, 101, // onchange - 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, 62, // =${login} /> - 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, // .
. - 32, 32, 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, //
. - 32, 32, 32, 60, 98, 117, 116, 116, 111, 110, 32, 99, // . - 32, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, //
. - 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
. - 32, 32, 32, 32, 86, 97, 108, 105, 100, 32, 108, 111, // Valid lo - 103, 105, 110, 115, 58, 32, 97, 100, 109, 105, 110, 58, // gins: admin: - 112, 97, 115, 115, 48, 44, 32, 117, 115, 101, 114, 49, // pass0, user1 - 58, 112, 97, 115, 115, 49, 44, 32, 117, 115, 101, 114, // :pass1, user - 50, 58, 112, 97, 115, 115, 50, 10, 32, 32, 32, 32, // 2:pass2. - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, 100, //
. .
`; - 10, 125, 59, 10, 10, 10, 99, 111, 110, 115, 116, 32, // .};...const - 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // Configuratio - 110, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // n = function - 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, // (props) {. - 99, 111, 110, 115, 116, 32, 91, 117, 114, 108, 44, 32, // const [url, - 115, 101, 116, 85, 114, 108, 93, 32, 61, 32, 117, 115, // setUrl] = us - 101, 83, 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, // eState(props - 46, 99, 111, 110, 102, 105, 103, 46, 117, 114, 108, 32, // .config.url - 124, 124, 32, 39, 39, 41, 59, 10, 32, 32, 99, 111, // || '');. co - 110, 115, 116, 32, 91, 112, 117, 98, 44, 32, 115, 101, // nst [pub, se - 116, 80, 117, 98, 93, 32, 61, 32, 117, 115, 101, 83, // tPub] = useS - 116, 97, 116, 101, 40, 112, 114, 111, 112, 115, 46, 99, // tate(props.c - 111, 110, 102, 105, 103, 46, 112, 117, 98, 32, 124, 124, // onfig.pub || - 32, 39, 39, 41, 59, 10, 32, 32, 99, 111, 110, 115, // '');. cons - 116, 32, 91, 115, 117, 98, 44, 32, 115, 101, 116, 83, // t [sub, setS - 117, 98, 93, 32, 61, 32, 117, 115, 101, 83, 116, 97, // ub] = useSta - 116, 101, 40, 112, 114, 111, 112, 115, 46, 99, 111, 110, // te(props.con - 102, 105, 103, 46, 115, 117, 98, 32, 124, 124, 32, 39, // fig.sub || ' - 39, 41, 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, // ');.. useEf - 102, 101, 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, // fect(() => { - 10, 32, 32, 32, 32, 115, 101, 116, 85, 114, 108, 40, // . setUrl( - 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, // props.config - 46, 117, 114, 108, 41, 59, 10, 32, 32, 32, 32, 115, // .url);. s - 101, 116, 80, 117, 98, 40, 112, 114, 111, 112, 115, 46, // etPub(props. - 99, 111, 110, 102, 105, 103, 46, 112, 117, 98, 41, 59, // config.pub); - 10, 32, 32, 32, 32, 115, 101, 116, 83, 117, 98, 40, // . setSub( - 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, 103, // props.config - 46, 115, 117, 98, 41, 59, 10, 32, 32, 125, 44, 32, // .sub);. }, - 91, 112, 114, 111, 112, 115, 46, 99, 111, 110, 102, 105, // [props.confi - 103, 93, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, // g]);.. cons - 116, 32, 117, 112, 100, 97, 116, 101, 32, 61, 32, 40, // t update = ( - 110, 97, 109, 101, 44, 32, 118, 97, 108, 41, 32, 61, // name, val) = - 62, 32, 102, 101, 116, 99, 104, 40, 39, 47, 97, 112, // > fetch('/ap - 105, 47, 99, 111, 110, 102, 105, 103, 47, 115, 101, 116, // i/config/set - 39, 44, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // ', {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 109, 101, 116, 104, 111, 100, 58, 32, 39, // method: ' - 112, 111, 115, 116, 39, 44, 10, 32, 32, 32, 32, 32, // post',. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 98, 111, 100, 121, 58, 32, 96, // body: ` - 36, 123, 110, 97, 109, 101, 125, 61, 36, 123, 101, 110, // ${name}=${en - 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, 112, 111, // codeURICompo - 110, 101, 110, 116, 40, 118, 97, 108, 41, 125, 96, 10, // nent(val)}`. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 46, 99, // }).c - 97, 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, // atch(err => - 101, 114, 114, 41, 59, 10, 32, 32, 99, 111, 110, 115, // err);. cons - 116, 32, 117, 112, 100, 97, 116, 101, 117, 114, 108, 32, // t updateurl - 61, 32, 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, // = ev => upda - 116, 101, 40, 39, 117, 114, 108, 39, 44, 32, 117, 114, // te('url', ur - 108, 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, // l);. const - 117, 112, 100, 97, 116, 101, 112, 117, 98, 32, 61, 32, // updatepub = - 101, 118, 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, // ev => update - 40, 39, 112, 117, 98, 39, 44, 32, 112, 117, 98, 41, // ('pub', pub) - 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 117, 112, // ;. const up - 100, 97, 116, 101, 115, 117, 98, 32, 61, 32, 101, 118, // datesub = ev - 32, 61, 62, 32, 117, 112, 100, 97, 116, 101, 40, 39, // => update(' - 115, 117, 98, 39, 44, 32, 115, 117, 98, 41, 59, 10, // sub', sub);. - 10, 32, 32, 99, 111, 110, 115, 111, 108, 101, 46, 108, // . console.l - 111, 103, 40, 112, 114, 111, 112, 115, 44, 32, 91, 117, // og(props, [u - 114, 108, 44, 32, 112, 117, 98, 44, 32, 115, 117, 98, // rl, pub, sub - 93, 41, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ]);. return - 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.

. - 32, 32, 68, 101, 118, 105, 99, 101, 32, 67, 111, 110, // Device Con - 102, 105, 103, 117, 114, 97, 116, 105, 111, 110, 60, 47, // figuration.
. M - 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, 58, 60, // QTT server:< - 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, 60, // /span>. < - 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 34, // input type=" - 116, 101, 120, 116, 34, 32, 115, 116, 121, 108, 101, 61, // text" style= - 34, 102, 108, 101, 120, 58, 32, 49, 32, 49, 48, 48, // "flex: 1 100 - 37, 59, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, // %;". - 32, 32, 118, 97, 108, 117, 101, 61, 36, 123, 117, 114, // value=${ur - 108, 125, 32, 111, 110, 99, 104, 97, 110, 103, 101, 61, // l} onchange= - 36, 123, 117, 112, 100, 97, 116, 101, 117, 114, 108, 125, // ${updateurl} - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 111, // . o - 110, 105, 110, 112, 117, 116, 61, 36, 123, 101, 118, 32, // ninput=${ev - 61, 62, 32, 115, 101, 116, 85, 114, 108, 40, 101, 118, // => setUrl(ev - 46, 116, 97, 114, 103, 101, 116, 46, 118, 97, 108, 117, // .target.valu - 101, 41, 125, 32, 47, 62, 10, 32, 32, 32, 32, 60, // e)} />. < - 98, 117, 116, 116, 111, 110, 32, 99, 108, 97, 115, 115, // button class - 61, 34, 98, 116, 110, 34, 32, 100, 105, 115, 97, 98, // ="btn" disab - 108, 101, 100, 61, 36, 123, 33, 117, 114, 108, 125, 32, // led=${!url} - 111, 110, 99, 108, 105, 99, 107, 61, 36, 123, 117, 112, // onclick=${up - 100, 97, 116, 101, 117, 114, 108, 125, 10, 32, 32, 32, // dateurl}. - 32, 32, 32, 115, 116, 121, 108, 101, 61, 34, 109, 97, // style="ma - 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, 32, 49, // rgin-left: 1 - 101, 109, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // em; backgrou - 110, 100, 58, 32, 35, 56, 97, 97, 59, 34, 62, 85, // nd: #8aa;">U - 112, 100, 97, 116, 101, 60, 47, 98, 117, 116, 116, 111, // pdate.
. - 32, 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, //
- 10, 32, 32, 32, 32, 60, 115, 112, 97, 110, 32, 99, // . Subs - 99, 114, 105, 98, 101, 32, 116, 111, 112, 105, 99, 58, // cribe topic: - 60, 47, 115, 112, 97, 110, 62, 10, 32, 32, 32, 32, // . - 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // - 115, 101, 116, 83, 117, 98, 40, 101, 118, 46, 116, 97, // setSub(ev.ta - 114, 103, 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, // rget.value)} - 32, 47, 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, // />. Upda - 116, 101, 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, // te. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < - 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, 109, // div style="m - 97, 114, 103, 105, 110, 58, 32, 48, 46, 53, 101, 109, // argin: 0.5em - 32, 48, 59, 32, 100, 105, 115, 112, 108, 97, 121, 58, // 0; display: - 32, 102, 108, 101, 120, 59, 34, 62, 10, 32, 32, 32, // flex;">. - 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // Publish - 116, 111, 112, 105, 99, 58, 60, 47, 115, 112, 97, 110, // topic:. se - 116, 80, 117, 98, 40, 101, 118, 46, 116, 97, 114, 103, // tPub(ev.targ - 101, 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, // et.value)} / - 62, 10, 32, 32, 32, 32, 60, 98, 117, 116, 116, 111, // >. Update - 60, 47, 98, 117, 116, 116, 111, 110, 62, 10, 32, 32, // . - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 100, 105, //

. . You c - 97, 110, 32, 117, 115, 101, 32, 60, 97, 32, 104, 114, // an use . Hive - 77, 81, 32, 87, 101, 98, 115, 111, 99, 107, 101, 116, // MQ Websocket - 32, 119, 101, 98, 32, 99, 108, 105, 101, 110, 116, 60, // web client< - 47, 97, 62, 32, 116, 111, 32, 115, 101, 110, 100, 32, // /a> to send - 109, 101, 115, 115, 97, 103, 101, 115, 32, 116, 111, 32, // messages to - 116, 104, 105, 115, 32, 99, 111, 110, 115, 111, 108, 101, // this console - 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // ..
. - 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, //
. T - 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, 107, 101, // he device ke - 101, 112, 115, 32, 97, 32, 112, 101, 114, 115, 105, 115, // eps a persis - 116, 101, 110, 116, 32, 99, 111, 110, 110, 101, 99, 116, // tent connect - 105, 111, 110, 32, 116, 111, 32, 116, 104, 101, 32, 99, // ion to the c - 111, 110, 102, 105, 103, 117, 114, 101, 100, 32, 77, 81, // onfigured MQ - 84, 84, 32, 115, 101, 114, 118, 101, 114, 46, 10, 32, // TT server.. - 32, 32, 32, 67, 104, 97, 110, 103, 101, 115, 32, 116, // Changes t - 111, 32, 116, 104, 105, 115, 32, 99, 111, 110, 102, 105, // o this confi - 103, 117, 114, 97, 116, 105, 111, 110, 32, 97, 114, 101, // guration are - 32, 112, 114, 111, 112, 97, 103, 97, 116, 101, 100, 32, // propagated - 116, 111, 32, 97, 108, 108, 32, 100, 97, 115, 104, 98, // to all dashb - 111, 97, 114, 100, 115, 58, 32, 116, 114, 121, 10, 32, // oards: try. - 32, 32, 32, 99, 104, 97, 110, 103, 105, 110, 103, 32, // changing - 116, 104, 101, 109, 32, 105, 110, 32, 116, 104, 105, 115, // them in this - 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, 32, 97, // dashboard a - 110, 100, 32, 111, 98, 115, 101, 114, 118, 101, 32, 99, // nd observe c - 104, 97, 110, 103, 101, 115, 32, 105, 110, 32, 111, 116, // hanges in ot - 104, 101, 114, 32, 111, 112, 101, 110, 101, 100, 10, 32, // her opened. - 32, 32, 32, 100, 97, 115, 104, 98, 111, 97, 114, 100, // dashboard - 115, 46, 10, 32, 32, 60, 47, 100, 105, 118, 62, 60, // s..
< - 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 109, // div class="m - 115, 103, 34, 62, 10, 32, 32, 32, 32, 78, 111, 116, // sg">. Not - 101, 58, 32, 97, 100, 109, 105, 110, 105, 115, 116, 114, // e: administr - 97, 116, 111, 114, 115, 32, 99, 97, 110, 32, 115, 101, // ators can se - 101, 32, 116, 104, 105, 115, 32, 115, 101, 99, 116, 105, // e this secti - 111, 110, 32, 97, 110, 100, 32, 99, 97, 110, 32, 99, // on and can c - 104, 97, 110, 103, 101, 32, 100, 101, 118, 105, 99, 101, // hange device - 10, 32, 32, 32, 32, 99, 111, 110, 102, 105, 103, 117, // . configu - 114, 97, 116, 105, 111, 110, 44, 32, 119, 104, 105, 108, // ration, whil - 115, 116, 32, 117, 115, 101, 114, 115, 32, 99, 97, 110, // st users can - 110, 111, 116, 46, 10, 32, 32, 60, 47, 100, 105, 118, // not.. .`;.} - 59, 10, 10, 10, 99, 111, 110, 115, 116, 32, 77, 101, // ;...const Me - 115, 115, 97, 103, 101, 32, 61, 32, 109, 32, 61, 62, // ssage = m => - 32, 104, 116, 109, 108, 96, 60, 100, 105, 118, 32, 115, // html`
- 10, 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, // . qos - 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag - 101, 46, 113, 111, 115, 125, 32, 60, 47, 115, 112, 97, // e.qos} . topic: ${m. - 109, 101, 115, 115, 97, 103, 101, 46, 116, 111, 112, 105, // message.topi - 99, 125, 32, 60, 47, 115, 112, 97, 110, 62, 10, 32, // c} . - 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, // data - 58, 32, 36, 123, 109, 46, 109, 101, 115, 115, 97, 103, // : ${m.messag - 101, 46, 100, 97, 116, 97, 125, 60, 47, 115, 112, 97, // e.data}.
`;. - 10, 99, 111, 110, 115, 116, 32, 77, 101, 115, 115, 97, // .const Messa - 103, 101, 115, 32, 61, 32, 102, 117, 110, 99, 116, 105, // ges = functi - 111, 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, // on(props) {. - 32, 32, 99, 111, 110, 115, 116, 32, 91, 109, 101, 115, // const [mes - 115, 97, 103, 101, 115, 44, 32, 115, 101, 116, 77, 101, // sages, setMe - 115, 115, 97, 103, 101, 115, 93, 32, 61, 32, 117, 115, // ssages] = us - 101, 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, // eState([]);. - 32, 32, 99, 111, 110, 115, 116, 32, 91, 116, 120, 116, // const [txt - 44, 32, 115, 101, 116, 84, 120, 116, 93, 32, 61, 32, // , setTxt] = - 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, 41, // useState('') - 59, 10, 10, 32, 32, 117, 115, 101, 69, 102, 102, 101, // ;.. useEffe - 99, 116, 40, 40, 41, 32, 61, 62, 32, 123, 10, 32, // ct(() => {. - 32, 32, 32, 99, 111, 110, 115, 116, 32, 105, 100, 32, // const id - 61, 32, 80, 117, 98, 83, 117, 98, 46, 115, 117, 98, // = PubSub.sub - 115, 99, 114, 105, 98, 101, 40, 102, 117, 110, 99, 116, // scribe(funct - 105, 111, 110, 40, 109, 115, 103, 41, 32, 123, 10, 32, // ion(msg) {. - 32, 32, 32, 32, 32, 105, 102, 32, 40, 109, 115, 103, // if (msg - 46, 110, 97, 109, 101, 32, 61, 61, 32, 39, 109, 101, // .name == 'me - 115, 115, 97, 103, 101, 39, 41, 32, 115, 101, 116, 77, // ssage') setM - 101, 115, 115, 97, 103, 101, 115, 40, 120, 32, 61, 62, // essages(x => - 32, 120, 46, 99, 111, 110, 99, 97, 116, 40, 91, 109, // x.concat([m - 115, 103, 46, 100, 97, 116, 97, 93, 41, 41, 59, 10, // sg.data]));. - 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, 32, // });. - 114, 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, 117, // return PubSu - 98, 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, 98, // b.unsubscrib - 101, 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, 32, // e(id);. }, - 91, 93, 41, 59, 10, 10, 32, 32, 99, 111, 110, 115, // []);.. cons - 116, 32, 115, 101, 110, 100, 109, 101, 115, 115, 97, 103, // t sendmessag - 101, 32, 61, 32, 101, 118, 32, 61, 62, 32, 102, 101, // e = ev => fe - 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 109, 101, // tch('/api/me - 115, 115, 97, 103, 101, 47, 115, 101, 110, 100, 39, 44, // ssage/send', - 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 32, 32, 109, 101, 116, // met - 104, 111, 100, 58, 32, 39, 112, 111, 115, 116, 39, 44, // hod: 'post', - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // . - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 32, 98, 111, 100, 121, 58, // body: - 32, 96, 109, 101, 115, 115, 97, 103, 101, 61, 36, 123, // `message=${ - 101, 110, 99, 111, 100, 101, 85, 82, 73, 67, 111, 109, // encodeURICom - 112, 111, 110, 101, 110, 116, 40, 116, 120, 116, 41, 125, // ponent(txt)} - 96, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // `. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 32, 32, 125, 41, 46, 116, 104, 101, // }).the - 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, 84, 120, // n(r => setTx - 116, 40, 39, 39, 41, 41, 59, 10, 32, 32, 99, 111, // t(''));. co - 110, 115, 116, 32, 99, 111, 110, 110, 115, 116, 97, 116, // nst connstat - 117, 115, 32, 61, 32, 112, 114, 111, 112, 115, 46, 99, // us = props.c - 111, 110, 102, 105, 103, 46, 99, 111, 110, 110, 101, 99, // onfig.connec - 116, 101, 100, 32, 63, 32, 39, 99, 111, 110, 110, 101, // ted ? 'conne - 99, 116, 101, 100, 39, 32, 58, 32, 39, 100, 105, 115, // cted' : 'dis - 99, 111, 110, 110, 101, 99, 116, 101, 100, 39, 59, 10, // connected';. - 32, 32, 114, 101, 116, 117, 114, 110, 32, 104, 116, 109, // return htm - 108, 96, 10, 60, 100, 105, 118, 32, 99, 108, 97, 115, // l`.
- 10, 32, 32, 60, 104, 51, 32, 115, 116, 121, 108, 101, // .

MQTT me - 115, 115, 97, 103, 101, 115, 60, 47, 104, 51, 62, 10, // ssages

. - 32, 32, 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, //
. - 77, 81, 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, // MQTT server - 115, 116, 97, 116, 117, 115, 58, 32, 60, 98, 62, 36, // status: $ - 123, 99, 111, 110, 110, 115, 116, 97, 116, 117, 115, 125, // {connstatus} - 60, 47, 98, 62, 10, 32, 32, 60, 47, 100, 105, 118, // .
.
. - 36, 123, 109, 101, 115, 115, 97, 103, 101, 115, 46, 109, // ${messages.m - 97, 112, 40, 109, 101, 115, 115, 97, 103, 101, 32, 61, // ap(message = - 62, 32, 104, 40, 77, 101, 115, 115, 97, 103, 101, 44, // > h(Message, - 32, 123, 109, 101, 115, 115, 97, 103, 101, 125, 41, 41, // {message})) - 125, 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, // }.
. - 32, 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, //
. - 32, 32, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // Publish - 32, 109, 101, 115, 115, 97, 103, 101, 58, 60, 47, 115, // message:. set - 84, 120, 116, 40, 101, 118, 46, 116, 97, 114, 103, 101, // Txt(ev.targe - 116, 46, 118, 97, 108, 117, 101, 41, 125, 32, 47, 62, // t.value)} /> - 10, 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, // .
. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. Th - 101, 32, 109, 101, 115, 115, 97, 103, 101, 32, 103, 101, // e message ge - 116, 115, 32, 112, 97, 115, 115, 101, 100, 32, 116, 111, // ts passed to - 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, 101, 32, // the device - 118, 105, 97, 32, 82, 69, 83, 84, 46, 32, 84, 104, // via REST. Th - 101, 110, 32, 116, 104, 101, 32, 100, 101, 118, 105, 99, // en the devic - 101, 32, 115, 101, 110, 100, 115, 32, 105, 116, 32, 116, // e sends it t - 111, 10, 32, 32, 32, 32, 116, 104, 101, 32, 77, 81, // o. the MQ - 84, 84, 32, 115, 101, 114, 118, 101, 114, 32, 111, 118, // TT server ov - 101, 114, 32, 77, 81, 84, 84, 46, 32, 65, 108, 108, // er MQTT. All - 32, 77, 81, 84, 84, 32, 109, 101, 115, 115, 97, 103, // MQTT messag - 101, 115, 32, 111, 110, 32, 97, 32, 115, 117, 98, 115, // es on a subs - 99, 114, 105, 98, 101, 100, 32, 116, 111, 112, 105, 99, // cribed topic - 10, 32, 32, 32, 32, 114, 101, 99, 101, 105, 118, 101, // . receive - 100, 32, 98, 121, 32, 116, 104, 101, 32, 100, 101, 118, // d by the dev - 105, 99, 101, 44, 32, 97, 114, 101, 32, 112, 114, 111, // ice, are pro - 112, 97, 103, 97, 116, 101, 100, 32, 116, 111, 32, 116, // pagated to t - 104, 105, 115, 32, 100, 97, 115, 104, 98, 111, 97, 114, // his dashboar - 100, 32, 118, 105, 97, 32, 47, 97, 112, 105, 47, 119, // d via /api/w - 97, 116, 99, 104, 46, 10, 32, 32, 60, 47, 100, 105, // atch.. .
`;. - 125, 59, 10, 10, 47, 47, 32, 69, 120, 112, 101, 99, // };..// Expec - 116, 101, 100, 32, 97, 114, 103, 117, 109, 101, 110, 116, // ted argument - 115, 58, 10, 47, 47, 32, 100, 97, 116, 97, 58, 32, // s:.// data: - 116, 105, 109, 101, 115, 101, 114, 105, 101, 115, 44, 32, // timeseries, - 101, 46, 103, 46, 32, 91, 32, 91, 49, 54, 53, 52, // e.g. [ [1654 - 51, 54, 49, 51, 53, 50, 44, 32, 49, 57, 93, 44, // 361352, 19], - 32, 91, 49, 54, 53, 52, 51, 54, 49, 51, 53, 51, // [1654361353 - 44, 32, 49, 56, 93, 44, 32, 46, 46, 46, 32, 93, // , 18], ... ] - 10, 47, 47, 32, 119, 105, 100, 116, 104, 44, 32, 104, // .// width, h - 101, 105, 103, 104, 116, 44, 32, 121, 116, 105, 99, 107, // eight, ytick - 115, 44, 32, 120, 116, 105, 99, 107, 115, 44, 32, 121, // s, xticks, y - 109, 105, 110, 44, 32, 121, 109, 97, 120, 44, 32, 120, // min, ymax, x - 109, 105, 110, 44, 32, 120, 109, 97, 120, 10, 99, 111, // min, xmax.co - 110, 115, 116, 32, 83, 86, 71, 32, 61, 32, 102, 117, // nst SVG = fu - 110, 99, 116, 105, 111, 110, 40, 112, 114, 111, 112, 115, // nction(props - 41, 32, 123, 10, 32, 32, 47, 47, 32, 32, 32, 32, // ) {. // - 32, 32, 32, 32, 32, 32, 32, 32, 119, 10, 32, 32, // w. - 47, 47, 32, 32, 32, 43, 45, 45, 45, 45, 45, 45, // // +------ - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ - 45, 45, 45, 43, 10, 32, 32, 47, 47, 32, 32, 32, // ---+. // - 124, 32, 32, 32, 32, 32, 32, 32, 32, 104, 49, 32, // | h1 - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 10, // |. - 32, 32, 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, // // | - 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +----------- - 43, 32, 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, // + |. // - 32, 32, 124, 32, 32, 32, 32, 124, 32, 32, 32, 32, // | | - 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 32, 32, // | - 124, 32, 32, 104, 10, 32, 32, 47, 47, 32, 32, 32, // | h. // - 124, 32, 119, 49, 32, 124, 32, 32, 32, 32, 32, 32, // | w1 | - 32, 32, 32, 32, 32, 124, 32, 119, 50, 32, 124, 10, // | w2 |. - 32, 32, 47, 47, 32, 32, 32, 124, 32, 32, 32, 32, // // | - 43, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // +----------- - 43, 32, 32, 32, 32, 124, 10, 32, 32, 47, 47, 32, // + |. // - 32, 32, 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, // | - 104, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // h2 - 124, 10, 32, 32, 47, 47, 32, 32, 32, 43, 45, 45, // |. // +-- - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, // ------------ - 45, 45, 45, 45, 45, 45, 45, 43, 10, 32, 32, 47, // -------+. / - 47, 10, 32, 32, 108, 101, 116, 32, 119, 32, 61, 32, // /. let w = - 112, 114, 111, 112, 115, 46, 119, 105, 100, 116, 104, 44, // props.width, - 32, 104, 32, 61, 32, 112, 114, 111, 112, 115, 46, 104, // h = props.h - 101, 105, 103, 104, 116, 44, 32, 119, 49, 32, 61, 32, // eight, w1 = - 51, 48, 44, 32, 119, 50, 32, 61, 32, 48, 44, 32, // 30, w2 = 0, - 104, 49, 32, 61, 32, 56, 44, 32, 104, 50, 32, 61, // h1 = 8, h2 = - 32, 49, 56, 59, 10, 32, 32, 108, 101, 116, 32, 121, // 18;. let y - 116, 105, 99, 107, 115, 32, 61, 32, 112, 114, 111, 112, // ticks = prop - 115, 46, 121, 116, 105, 99, 107, 115, 32, 124, 124, 32, // s.yticks || - 52, 44, 32, 120, 116, 105, 99, 107, 115, 32, 61, 32, // 4, xticks = - 112, 114, 111, 112, 115, 46, 120, 116, 105, 99, 107, 115, // props.xticks - 32, 124, 124, 32, 53, 59, 10, 32, 32, 108, 101, 116, // || 5;. let - 32, 100, 97, 116, 97, 32, 61, 32, 112, 114, 111, 112, // data = prop - 115, 46, 100, 97, 116, 97, 32, 124, 124, 32, 91, 93, // s.data || [] - 59, 10, 32, 32, 108, 101, 116, 32, 121, 109, 105, 110, // ;. let ymin - 32, 61, 32, 112, 114, 111, 112, 115, 46, 121, 109, 105, // = props.ymi - 110, 32, 124, 124, 32, 48, 59, 10, 32, 32, 108, 101, // n || 0;. le - 116, 32, 121, 109, 97, 120, 32, 61, 32, 112, 114, 111, // t ymax = pro - 112, 115, 46, 121, 109, 97, 120, 32, 124, 124, 32, 77, // ps.ymax || M - 97, 116, 104, 46, 109, 97, 120, 46, 97, 112, 112, 108, // ath.max.appl - 121, 40, 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, // y(null, data - 46, 109, 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, // .map(p => p[ - 49, 93, 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, // 1]));. let - 120, 109, 105, 110, 32, 61, 32, 112, 114, 111, 112, 115, // xmin = props - 46, 120, 109, 105, 110, 32, 124, 124, 32, 77, 97, 116, // .xmin || Mat - 104, 46, 109, 105, 110, 46, 97, 112, 112, 108, 121, 40, // h.min.apply( - 110, 117, 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, // null, data.m - 97, 112, 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, // ap(p => p[0] - 41, 41, 59, 10, 32, 32, 108, 101, 116, 32, 120, 109, // ));. let xm - 97, 120, 32, 61, 32, 112, 114, 111, 112, 115, 46, 120, // ax = props.x - 109, 97, 120, 32, 124, 124, 32, 77, 97, 116, 104, 46, // max || Math. - 109, 97, 120, 46, 97, 112, 112, 108, 121, 40, 110, 117, // max.apply(nu - 108, 108, 44, 32, 100, 97, 116, 97, 46, 109, 97, 112, // ll, data.map - 40, 112, 32, 61, 62, 32, 112, 91, 48, 93, 41, 41, // (p => p[0])) - 59, 10, 10, 32, 32, 47, 47, 32, 89, 45, 97, 120, // ;.. // Y-ax - 105, 115, 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, // is tick line - 115, 32, 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, // s and labels - 10, 32, 32, 108, 101, 116, 32, 121, 116, 97, 32, 61, // . let yta = - 32, 40, 110, 101, 119, 32, 65, 114, 114, 97, 121, 40, // (new Array( - 121, 116, 105, 99, 107, 115, 32, 43, 32, 49, 41, 41, // yticks + 1)) - 46, 102, 105, 108, 108, 40, 48, 41, 46, 109, 97, 112, // .fill(0).map - 40, 40, 95, 44, 32, 105, 41, 32, 61, 62, 32, 105, // ((_, i) => i - 41, 59, 32, 32, 47, 47, 32, 105, 110, 100, 105, 99, // ); // indic - 101, 115, 10, 32, 32, 108, 101, 116, 32, 121, 116, 105, // es. let yti - 32, 61, 32, 105, 32, 61, 62, 32, 104, 32, 45, 32, // = i => h - - 104, 50, 32, 45, 32, 40, 104, 32, 45, 32, 104, 49, // h2 - (h - h1 - 32, 45, 32, 104, 50, 41, 32, 42, 32, 105, 32, 47, // - h2) * i / - 32, 121, 116, 105, 99, 107, 115, 59, 32, 32, 32, 32, // yticks; - 32, 32, 32, 32, 32, 32, 47, 47, 32, 105, 110, 100, // // ind - 101, 120, 39, 115, 32, 89, 10, 32, 32, 108, 101, 116, // ex's Y. let - 32, 121, 116, 118, 32, 61, 32, 105, 32, 61, 62, 32, // ytv = i => - 40, 121, 109, 97, 120, 32, 45, 32, 121, 109, 105, 110, // (ymax - ymin - 41, 32, 42, 32, 105, 32, 47, 32, 121, 116, 105, 99, // ) * i / ytic - 107, 115, 59, 10, 32, 32, 108, 101, 116, 32, 121, 116, // ks;. let yt - 108, 32, 61, 32, 121, 32, 61, 62, 32, 104, 116, 109, // l = y => htm - 108, 96, 60, 108, 105, 110, 101, 32, 120, 49, 61, 36, // l``;. - 108, 101, 116, 32, 121, 116, 116, 32, 61, 32, 40, 121, // let ytt = (y - 44, 32, 118, 41, 32, 61, 62, 32, 104, 116, 109, 108, // , v) => html - 96, 60, 116, 101, 120, 116, 32, 120, 61, 48, 32, 121, // ` - 36, 123, 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, // ${v}` - 59, 10, 10, 32, 32, 47, 47, 32, 88, 45, 97, 120, // ;.. // X-ax - 105, 115, 32, 116, 105, 99, 107, 32, 108, 105, 110, 101, // is tick line - 115, 32, 97, 110, 100, 32, 108, 97, 98, 101, 108, 115, // s and labels - 10, 32, 32, 108, 101, 116, 32, 100, 97, 116, 101, 102, // . let datef - 109, 116, 32, 61, 32, 117, 110, 105, 120, 32, 61, 62, // mt = unix => - 32, 40, 110, 101, 119, 32, 68, 97, 116, 101, 40, 117, // (new Date(u - 110, 105, 120, 32, 42, 32, 49, 48, 48, 48, 41, 41, // nix * 1000)) - 46, 116, 111, 73, 83, 79, 83, 116, 114, 105, 110, 103, // .toISOString - 40, 41, 46, 115, 117, 98, 115, 116, 114, 40, 49, 52, // ().substr(14 - 44, 32, 53, 41, 59, 10, 32, 32, 108, 101, 116, 32, // , 5);. let - 120, 116, 97, 32, 61, 32, 40, 110, 101, 119, 32, 65, // xta = (new A - 114, 114, 97, 121, 40, 120, 116, 105, 99, 107, 115, 32, // rray(xticks - 43, 32, 49, 41, 41, 46, 102, 105, 108, 108, 40, 48, // + 1)).fill(0 - 41, 46, 109, 97, 112, 40, 40, 95, 44, 32, 105, 41, // ).map((_, i) - 32, 61, 62, 32, 105, 41, 59, 32, 32, 47, 47, 32, // => i); // - 105, 110, 100, 105, 99, 101, 115, 10, 32, 32, 108, 101, // indices. le - 116, 32, 120, 116, 105, 32, 61, 32, 105, 32, 61, 62, // t xti = i => - 32, 119, 49, 32, 43, 32, 40, 119, 32, 45, 32, 119, // w1 + (w - w - 49, 32, 45, 32, 119, 50, 41, 32, 42, 32, 105, 32, // 1 - w2) * i - 47, 32, 120, 116, 105, 99, 107, 115, 59, 32, 32, 32, // / xticks; - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, // / - 47, 32, 105, 110, 100, 101, 120, 39, 115, 32, 88, 10, // / index's X. - 32, 32, 108, 101, 116, 32, 120, 116, 118, 32, 61, 32, // let xtv = - 105, 32, 61, 62, 32, 100, 97, 116, 101, 102, 109, 116, // i => datefmt - 40, 120, 109, 105, 110, 32, 43, 32, 40, 120, 109, 97, // (xmin + (xma - 120, 32, 45, 32, 120, 109, 105, 110, 41, 32, 42, 32, // x - xmin) * - 105, 32, 47, 32, 120, 116, 105, 99, 107, 115, 41, 59, // i / xticks); - 10, 32, 32, 108, 101, 116, 32, 120, 116, 108, 32, 61, // . let xtl = - 32, 120, 32, 61, 62, 32, 104, 116, 109, 108, 96, 60, // x => html`< - 112, 97, 116, 104, 32, 100, 61, 34, 77, 32, 36, 123, // path d="M ${ - 120, 125, 44, 36, 123, 104, 49, 125, 32, 76, 32, 36, // x},${h1} L $ - 123, 120, 125, 44, 36, 123, 104, 32, 45, 32, 104, 50, // {x},${h - h2 - 125, 34, 32, 99, 108, 97, 115, 115, 61, 34, 116, 105, // }" class="ti - 99, 107, 34, 47, 62, 96, 59, 10, 32, 32, 108, 101, // ck"/>`;. le - 116, 32, 120, 116, 116, 32, 61, 32, 40, 120, 44, 32, // t xtt = (x, - 118, 41, 32, 61, 62, 10, 32, 32, 32, 32, 32, 32, // v) =>. - 104, 116, 109, 108, 96, 60, 116, 101, 120, 116, 32, 120, // html` - 36, 123, 118, 125, 60, 47, 116, 101, 120, 116, 62, 96, // ${v}` - 59, 10, 10, 32, 32, 47, 47, 32, 84, 114, 97, 110, // ;.. // Tran - 115, 102, 111, 114, 109, 32, 100, 97, 116, 97, 32, 112, // sform data p - 111, 105, 110, 116, 115, 32, 97, 114, 114, 97, 121, 32, // oints array - 105, 110, 116, 111, 32, 99, 111, 111, 114, 100, 105, 110, // into coordin - 97, 116, 101, 10, 32, 32, 108, 101, 116, 32, 100, 120, // ate. let dx - 32, 61, 32, 118, 32, 61, 62, 32, 119, 49, 32, 43, // = v => w1 + - 32, 40, 118, 32, 45, 32, 120, 109, 105, 110, 41, 32, // (v - xmin) - 47, 32, 40, 40, 120, 109, 97, 120, 32, 45, 32, 120, // / ((xmax - x - 109, 105, 110, 41, 32, 124, 124, 32, 49, 41, 32, 42, // min) || 1) * - 32, 40, 119, 32, 45, 32, 119, 49, 32, 45, 32, 119, // (w - w1 - w - 50, 41, 59, 10, 32, 32, 108, 101, 116, 32, 100, 121, // 2);. let dy - 32, 61, 32, 118, 32, 61, 62, 32, 104, 32, 45, 32, // = v => h - - 104, 50, 32, 45, 32, 40, 118, 32, 45, 32, 121, 109, // h2 - (v - ym - 105, 110, 41, 32, 47, 32, 40, 40, 121, 109, 97, 120, // in) / ((ymax - 32, 45, 32, 121, 109, 105, 110, 41, 32, 124, 124, 32, // - ymin) || - 49, 41, 32, 42, 32, 40, 104, 32, 45, 32, 104, 49, // 1) * (h - h1 - 32, 45, 32, 104, 50, 41, 59, 10, 32, 32, 108, 101, // - h2);. le - 116, 32, 100, 100, 32, 61, 32, 100, 97, 116, 97, 46, // t dd = data. - 109, 97, 112, 40, 112, 32, 61, 62, 32, 91, 77, 97, // map(p => [Ma - 116, 104, 46, 114, 111, 117, 110, 100, 40, 100, 120, 40, // th.round(dx( - 112, 91, 48, 93, 41, 41, 44, 32, 77, 97, 116, 104, // p[0])), Math - 46, 114, 111, 117, 110, 100, 40, 100, 121, 40, 112, 91, // .round(dy(p[ - 49, 93, 41, 41, 93, 41, 59, 10, 32, 32, 108, 101, // 1]))]);. le - 116, 32, 100, 100, 108, 32, 61, 32, 100, 100, 46, 108, // t ddl = dd.l - 101, 110, 103, 116, 104, 59, 10, 32, 32, 47, 47, 32, // ength;. // - 65, 110, 100, 32, 112, 108, 111, 116, 32, 116, 104, 101, // And plot the - 32, 100, 97, 116, 97, 32, 97, 115, 32, 60, 112, 97, // data as element. - 32, 32, 108, 101, 116, 32, 98, 101, 103, 105, 110, 48, // let begin0 - 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, 77, 32, // = ddl ? `M - 36, 123, 100, 100, 91, 48, 93, 91, 48, 93, 125, 44, // ${dd[0][0]}, - 36, 123, 100, 100, 91, 48, 93, 91, 49, 93, 125, 96, // ${dd[0][1]}` - 32, 58, 32, 96, 77, 32, 48, 44, 48, 96, 59, 10, // : `M 0,0`;. - 32, 32, 108, 101, 116, 32, 98, 101, 103, 105, 110, 32, // let begin - 61, 32, 96, 77, 32, 36, 123, 119, 49, 125, 44, 36, // = `M ${w1},$ - 123, 104, 32, 45, 32, 104, 50, 125, 96, 59, 32, 32, // {h - h2}`; - 47, 47, 32, 73, 110, 105, 116, 105, 97, 108, 32, 112, // // Initial p - 111, 105, 110, 116, 10, 32, 32, 108, 101, 116, 32, 101, // oint. let e - 110, 100, 32, 61, 32, 100, 100, 108, 32, 63, 32, 96, // nd = ddl ? ` - 76, 32, 36, 123, 100, 100, 91, 100, 100, 108, 32, 45, // L ${dd[ddl - - 32, 49, 93, 91, 48, 93, 125, 44, 36, 123, 104, 32, // 1][0]},${h - 45, 32, 104, 50, 125, 96, 32, 58, 32, 96, 76, 32, // - h2}` : `L - 36, 123, 119, 49, 125, 44, 36, 123, 104, 32, 45, 32, // ${w1},${h - - 104, 50, 125, 96, 59, 10, 32, 32, 108, 101, 116, 32, // h2}`;. let - 115, 101, 114, 105, 101, 115, 32, 61, 32, 100, 100, 108, // series = ddl - 32, 63, 32, 100, 100, 46, 109, 97, 112, 40, 112, 32, // ? dd.map(p - 61, 62, 32, 96, 76, 32, 36, 123, 112, 91, 48, 93, // => `L ${p[0] - 125, 32, 36, 123, 112, 91, 49, 93, 125, 96, 41, 32, // } ${p[1]}`) - 58, 32, 91, 93, 59, 10, 10, 32, 32, 114, 101, 116, // : [];.. ret - 117, 114, 110, 32, 104, 116, 109, 108, 96, 10, 60, 115, // urn html`.. . - 32, 36, 123, 121, 116, 97, 46, 109, 97, 112, 40, 105, // ${yta.map(i - 32, 61, 62, 32, 121, 116, 108, 40, 121, 116, 105, 40, // => ytl(yti( - 105, 41, 41, 41, 125, 10, 32, 32, 36, 123, 121, 116, // i)))}. ${yt - 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, 121, // a.map(i => y - 116, 116, 40, 121, 116, 105, 40, 105, 41, 44, 32, 121, // tt(yti(i), y - 116, 118, 40, 105, 41, 41, 41, 125, 10, 32, 32, 36, // tv(i)))}. $ - 123, 120, 116, 97, 46, 109, 97, 112, 40, 105, 32, 61, // {xta.map(i = - 62, 32, 120, 116, 108, 40, 120, 116, 105, 40, 105, 41, // > xtl(xti(i) - 41, 41, 125, 10, 32, 32, 36, 123, 100, 97, 116, 97, // ))}. ${data - 46, 108, 101, 110, 103, 116, 104, 32, 63, 32, 120, 116, // .length ? xt - 97, 46, 109, 97, 112, 40, 105, 32, 61, 62, 32, 120, // a.map(i => x - 116, 116, 40, 120, 116, 105, 40, 105, 41, 44, 32, 120, // tt(xti(i), x - 116, 118, 40, 105, 41, 41, 41, 32, 58, 32, 39, 39, // tv(i))) : '' - 125, 10, 32, 32, 60, 112, 97, 116, 104, 32, 100, 61, // }. . - 60, 112, 97, 116, 104, 32, 100, 61, 34, 36, 123, 98, // .`;.};... - 99, 111, 110, 115, 116, 32, 67, 104, 97, 114, 116, 32, // const Chart - 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 112, // = function(p - 114, 111, 112, 115, 41, 32, 123, 10, 32, 32, 99, 111, // rops) {. co - 110, 115, 116, 32, 91, 100, 97, 116, 97, 44, 32, 115, // nst [data, s - 101, 116, 68, 97, 116, 97, 93, 32, 61, 32, 117, 115, // etData] = us - 101, 83, 116, 97, 116, 101, 40, 91, 93, 41, 59, 10, // eState([]);. - 32, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 40, // useEffect( - 40, 41, 32, 61, 62, 32, 123, 10, 32, 32, 32, 32, // () => {. - 99, 111, 110, 115, 116, 32, 105, 100, 32, 61, 32, 80, // const id = P - 117, 98, 83, 117, 98, 46, 115, 117, 98, 115, 99, 114, // ubSub.subscr - 105, 98, 101, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ibe(function - 40, 109, 115, 103, 41, 32, 123, 10, 32, 32, 32, 32, // (msg) {. - 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, 110, 97, // if (msg.na - 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, 114, 105, // me != 'metri - 99, 115, 39, 41, 32, 114, 101, 116, 117, 114, 110, 59, // cs') return; - 10, 32, 32, 32, 32, 32, 32, 115, 101, 116, 68, 97, // . setDa - 116, 97, 40, 120, 32, 61, 62, 32, 120, 46, 99, 111, // ta(x => x.co - 110, 99, 97, 116, 40, 91, 109, 115, 103, 46, 100, 97, // ncat([msg.da - 116, 97, 93, 41, 46, 115, 112, 108, 105, 99, 101, 40, // ta]).splice( - 45, 77, 97, 120, 77, 101, 116, 114, 105, 99, 115, 68, // -MaxMetricsD - 97, 116, 97, 80, 111, 105, 110, 116, 115, 41, 41, 59, // ataPoints)); - 10, 32, 32, 32, 32, 125, 41, 59, 10, 32, 32, 32, // . });. - 32, 114, 101, 116, 117, 114, 110, 32, 80, 117, 98, 83, // return PubS - 117, 98, 46, 117, 110, 115, 117, 98, 115, 99, 114, 105, // ub.unsubscri - 98, 101, 40, 105, 100, 41, 59, 10, 32, 32, 125, 44, // be(id);. }, - 32, 91, 93, 41, 59, 10, 10, 32, 32, 108, 101, 116, // []);.. let - 32, 120, 109, 97, 120, 32, 61, 32, 48, 44, 32, 109, // xmax = 0, m - 105, 115, 115, 105, 110, 103, 32, 61, 32, 77, 97, 120, // issing = Max - 77, 101, 116, 114, 105, 99, 115, 68, 97, 116, 97, 80, // MetricsDataP - 111, 105, 110, 116, 115, 32, 45, 32, 100, 97, 116, 97, // oints - data - 46, 108, 101, 110, 103, 116, 104, 59, 10, 32, 32, 105, // .length;. i - 102, 32, 40, 109, 105, 115, 115, 105, 110, 103, 32, 62, // f (missing > - 32, 48, 41, 32, 120, 109, 97, 120, 32, 61, 32, 77, // 0) xmax = M - 97, 116, 104, 46, 114, 111, 117, 110, 100, 40, 68, 97, // ath.round(Da - 116, 101, 46, 110, 111, 119, 40, 41, 32, 47, 32, 49, // te.now() / 1 - 48, 48, 48, 41, 32, 43, 32, 109, 105, 115, 115, 105, // 000) + missi - 110, 103, 59, 10, 32, 32, 114, 101, 116, 117, 114, 110, // ng;. return - 32, 104, 116, 109, 108, 96, 10, 60, 100, 105, 118, 32, // html`.
.

Data C - 104, 97, 114, 116, 60, 47, 104, 51, 62, 10, 32, 32, // hart

. - 60, 100, 105, 118, 32, 115, 116, 121, 108, 101, 61, 34, //
. < - 36, 123, 83, 86, 71, 125, 32, 104, 101, 105, 103, 104, // ${SVG} heigh - 116, 61, 50, 52, 48, 32, 119, 105, 100, 116, 104, 61, // t=240 width= - 54, 48, 48, 32, 121, 109, 105, 110, 61, 48, 32, 121, // 600 ymin=0 y - 109, 97, 120, 61, 50, 48, 32, 120, 109, 97, 120, 61, // max=20 xmax= - 36, 123, 120, 109, 97, 120, 125, 32, 100, 97, 116, 97, // ${xmax} data - 61, 36, 123, 100, 97, 116, 97, 125, 32, 47, 62, 10, // =${data} />. - 32, 32, 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, //
. < - 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 109, // div class="m - 115, 103, 34, 62, 10, 32, 32, 32, 32, 84, 104, 105, // sg">. Thi - 115, 32, 99, 104, 97, 114, 116, 32, 112, 108, 111, 116, // s chart plot - 115, 32, 108, 105, 118, 101, 32, 115, 101, 110, 115, 111, // s live senso - 114, 32, 100, 97, 116, 97, 44, 32, 115, 101, 110, 116, // r data, sent - 32, 98, 121, 32, 116, 104, 101, 32, 100, 101, 118, 105, // by the devi - 99, 101, 32, 118, 105, 97, 32, 47, 97, 112, 105, 47, // ce via /api/ - 119, 97, 116, 99, 104, 46, 10, 32, 32, 60, 47, 100, // watch.. .
`; - 10, 125, 59, 10, 10, 99, 111, 110, 115, 116, 32, 65, // .};..const A - 112, 112, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, // pp = functio - 110, 40, 112, 114, 111, 112, 115, 41, 32, 123, 10, 32, // n(props) {. - 32, 99, 111, 110, 115, 116, 32, 91, 117, 115, 101, 114, // const [user - 44, 32, 115, 101, 116, 85, 115, 101, 114, 93, 32, 61, // , setUser] = - 32, 117, 115, 101, 83, 116, 97, 116, 101, 40, 39, 39, // useState('' - 41, 59, 10, 32, 32, 99, 111, 110, 115, 116, 32, 91, // );. const [ - 99, 111, 110, 102, 105, 103, 44, 32, 115, 101, 116, 67, // config, setC - 111, 110, 102, 105, 103, 93, 32, 61, 32, 117, 115, 101, // onfig] = use - 83, 116, 97, 116, 101, 40, 123, 125, 41, 59, 10, 10, // State({});.. - 32, 32, 99, 111, 110, 115, 116, 32, 103, 101, 116, 99, // const getc - 111, 110, 102, 105, 103, 32, 61, 32, 40, 41, 32, 61, // onfig = () = - 62, 10, 32, 32, 32, 32, 32, 32, 102, 101, 116, 99, // >. fetc - 104, 40, 39, 47, 97, 112, 105, 47, 99, 111, 110, 102, // h('/api/conf - 105, 103, 47, 103, 101, 116, 39, 44, 32, 123, 104, 101, // ig/get', {he - 97, 100, 101, 114, 115, 58, 32, 123, 65, 117, 116, 104, // aders: {Auth - 111, 114, 105, 122, 97, 116, 105, 111, 110, 58, 32, 39, // orization: ' - 39, 125, 125, 41, 10, 32, 32, 32, 32, 32, 32, 32, // '}}). - 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, // .then(r = - 62, 32, 114, 46, 106, 115, 111, 110, 40, 41, 41, 10, // > r.json()). - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, // .t - 104, 101, 110, 40, 114, 32, 61, 62, 32, 115, 101, 116, // hen(r => set - 67, 111, 110, 102, 105, 103, 40, 114, 41, 41, 10, 32, // Config(r)). - 32, 32, 32, 32, 32, 32, 32, 32, 32, 46, 99, 97, // .ca - 116, 99, 104, 40, 101, 114, 114, 32, 61, 62, 32, 99, // tch(err => c - 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 101, // onsole.log(e - 114, 114, 41, 41, 59, 10, 10, 32, 32, 99, 111, 110, // rr));.. con - 115, 116, 32, 108, 111, 103, 105, 110, 32, 61, 32, 102, // st login = f - 117, 110, 99, 116, 105, 111, 110, 40, 117, 41, 32, 123, // unction(u) { - 10, 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, 110, // . documen - 116, 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, 96, // t.cookie = ` - 97, 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, 110, // access_token - 61, 36, 123, 117, 46, 116, 111, 107, 101, 110, 125, 59, // =${u.token}; - 112, 97, 116, 104, 61, 47, 59, 109, 97, 120, 45, 97, // path=/;max-a - 103, 101, 61, 51, 54, 48, 48, 96, 59, 10, 32, 32, // ge=3600`;. - 32, 32, 115, 101, 116, 85, 115, 101, 114, 40, 117, 46, // setUser(u. - 117, 115, 101, 114, 41, 59, 10, 32, 32, 32, 32, 114, // user);. r - 101, 116, 117, 114, 110, 32, 103, 101, 116, 99, 111, 110, // eturn getcon - 102, 105, 103, 40, 41, 59, 10, 32, 32, 125, 59, 10, // fig();. };. - 10, 32, 32, 99, 111, 110, 115, 116, 32, 108, 111, 103, // . const log - 111, 117, 116, 32, 61, 32, 101, 118, 32, 61, 62, 32, // out = ev => - 123, 10, 32, 32, 32, 32, 100, 111, 99, 117, 109, 101, // {. docume - 110, 116, 46, 99, 111, 111, 107, 105, 101, 32, 61, 32, // nt.cookie = - 96, 97, 99, 99, 101, 115, 115, 95, 116, 111, 107, 101, // `access_toke - 110, 61, 59, 112, 97, 116, 104, 61, 47, 59, 109, 97, // n=;path=/;ma - 120, 45, 97, 103, 101, 61, 48, 96, 59, 10, 32, 32, // x-age=0`;. - 32, 32, 115, 101, 116, 85, 115, 101, 114, 40, 39, 39, // setUser('' - 41, 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 47, // );. };.. / - 47, 32, 87, 97, 116, 99, 104, 32, 102, 111, 114, 32, // / Watch for - 110, 111, 116, 105, 102, 105, 99, 97, 116, 105, 111, 110, // notification - 115, 46, 32, 65, 115, 32, 115, 111, 111, 110, 32, 97, // s. As soon a - 115, 32, 97, 32, 110, 111, 116, 105, 102, 105, 99, 97, // s a notifica - 116, 105, 111, 110, 32, 97, 114, 114, 105, 118, 101, 115, // tion arrives - 44, 32, 112, 97, 115, 115, 32, 105, 116, 32, 111, 110, // , pass it on - 10, 32, 32, 47, 47, 32, 116, 111, 32, 97, 108, 108, // . // to all - 32, 115, 117, 98, 115, 99, 114, 105, 98, 101, 100, 32, // subscribed - 99, 111, 109, 112, 111, 110, 101, 110, 116, 115, 10, 32, // components. - 32, 99, 111, 110, 115, 116, 32, 119, 97, 116, 99, 104, // const watch - 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, // = function( - 41, 32, 123, 10, 32, 32, 32, 32, 118, 97, 114, 32, // ) {. var - 108, 32, 61, 32, 119, 105, 110, 100, 111, 119, 46, 108, // l = window.l - 111, 99, 97, 116, 105, 111, 110, 44, 32, 112, 114, 111, // ocation, pro - 116, 111, 32, 61, 32, 108, 46, 112, 114, 111, 116, 111, // to = l.proto - 99, 111, 108, 46, 114, 101, 112, 108, 97, 99, 101, 40, // col.replace( - 39, 104, 116, 116, 112, 39, 44, 32, 39, 119, 115, 39, // 'http', 'ws' - 41, 59, 10, 32, 32, 32, 32, 118, 97, 114, 32, 116, // );. var t - 105, 100, 44, 32, 119, 115, 85, 82, 73, 32, 61, 32, // id, wsURI = - 112, 114, 111, 116, 111, 32, 43, 32, 39, 47, 47, 39, // proto + '//' - 32, 43, 32, 108, 46, 104, 111, 115, 116, 32, 43, 32, // + l.host + - 39, 47, 97, 112, 105, 47, 119, 97, 116, 99, 104, 39, // '/api/watch' - 10, 32, 32, 32, 32, 118, 97, 114, 32, 114, 101, 99, // . var rec - 111, 110, 110, 101, 99, 116, 32, 61, 32, 102, 117, 110, // onnect = fun - 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, // ction() {. - 32, 32, 32, 32, 118, 97, 114, 32, 119, 115, 32, 61, // var ws = - 32, 110, 101, 119, 32, 87, 101, 98, 83, 111, 99, 107, // new WebSock - 101, 116, 40, 119, 115, 85, 82, 73, 41, 59, 10, 32, // et(wsURI);. - 32, 32, 32, 32, 32, 119, 115, 46, 111, 110, 111, 112, // ws.onop - 101, 110, 32, 61, 32, 40, 41, 32, 61, 62, 32, 99, // en = () => c - 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 40, 39, // onsole.log(' - 119, 115, 32, 99, 111, 110, 110, 101, 99, 116, 101, 100, // ws connected - 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 119, 115, // ');. ws - 46, 111, 110, 109, 101, 115, 115, 97, 103, 101, 32, 61, // .onmessage = - 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 118, // function(ev - 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ) {. - 116, 114, 121, 32, 123, 10, 32, 32, 32, 32, 32, 32, // try {. - 32, 32, 32, 32, 118, 97, 114, 32, 109, 115, 103, 32, // var msg - 61, 32, 74, 83, 79, 78, 46, 112, 97, 114, 115, 101, // = JSON.parse - 40, 101, 118, 46, 100, 97, 116, 97, 41, 59, 10, 32, // (ev.data);. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 80, 117, 98, // Pub - 83, 117, 98, 46, 112, 117, 98, 108, 105, 115, 104, 40, // Sub.publish( - 109, 115, 103, 41, 59, 10, 32, 32, 32, 32, 32, 32, // msg);. - 32, 32, 32, 32, 105, 102, 32, 40, 109, 115, 103, 46, // if (msg. - 110, 97, 109, 101, 32, 33, 61, 32, 39, 109, 101, 116, // name != 'met - 114, 105, 99, 115, 39, 41, 32, 99, 111, 110, 115, 111, // rics') conso - 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, 45, 62, // le.log('ws-> - 39, 44, 32, 109, 115, 103, 41, 59, 10, 32, 32, 32, // ', msg);. - 32, 32, 32, 32, 32, 125, 32, 99, 97, 116, 99, 104, // } catch - 32, 40, 101, 41, 32, 123, 10, 32, 32, 32, 32, 32, // (e) {. - 32, 32, 32, 32, 32, 99, 111, 110, 115, 111, 108, 101, // console - 46, 108, 111, 103, 40, 39, 73, 110, 118, 97, 108, 105, // .log('Invali - 100, 32, 119, 115, 32, 102, 114, 97, 109, 101, 58, 39, // d ws frame:' - 44, 32, 101, 118, 46, 100, 97, 116, 97, 41, 59, 32, // , ev.data); - 32, 47, 47, 32, 101, 115, 108, 105, 110, 116, 45, 100, // // eslint-d - 105, 115, 97, 98, 108, 101, 45, 108, 105, 110, 101, 10, // isable-line. - 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, // }. - 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, 32, 32, // };. - 32, 119, 115, 46, 111, 110, 99, 108, 111, 115, 101, 32, // ws.onclose - 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // = function() - 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, // {. c - 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout( - 116, 105, 100, 41, 59, 10, 32, 32, 32, 32, 32, 32, // tid);. - 32, 32, 116, 105, 100, 32, 61, 32, 115, 101, 116, 84, // tid = setT - 105, 109, 101, 111, 117, 116, 40, 114, 101, 99, 111, 110, // imeout(recon - 110, 101, 99, 116, 44, 32, 49, 48, 48, 48, 41, 59, // nect, 1000); - 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 111, 110, // . con - 115, 111, 108, 101, 46, 108, 111, 103, 40, 39, 119, 115, // sole.log('ws - 32, 100, 105, 115, 99, 111, 110, 110, 101, 99, 116, 101, // disconnecte - 100, 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 125, // d');. } - 59, 10, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // ;. };. - 32, 114, 101, 99, 111, 110, 110, 101, 99, 116, 40, 41, // reconnect() - 59, 10, 32, 32, 125, 59, 10, 10, 32, 32, 117, 115, // ;. };.. us - 101, 69, 102, 102, 101, 99, 116, 40, 40, 41, 32, 61, // eEffect(() = - 62, 32, 123, 10, 32, 32, 32, 32, 47, 47, 32, 67, // > {. // C - 97, 108, 108, 101, 100, 32, 111, 110, 99, 101, 32, 97, // alled once a - 116, 32, 105, 110, 105, 116, 32, 116, 105, 109, 101, 10, // t init time. - 32, 32, 32, 32, 80, 117, 98, 83, 117, 98, 46, 115, // PubSub.s - 117, 98, 115, 99, 114, 105, 98, 101, 40, 109, 115, 103, // ubscribe(msg - 32, 61, 62, 32, 109, 115, 103, 46, 110, 97, 109, 101, // => msg.name - 32, 61, 61, 32, 39, 99, 111, 110, 102, 105, 103, 39, // == 'config' - 32, 38, 38, 32, 103, 101, 116, 99, 111, 110, 102, 105, // && getconfi - 103, 40, 41, 41, 59, 10, 32, 32, 32, 32, 102, 101, // g());. fe - 116, 99, 104, 40, 39, 47, 97, 112, 105, 47, 108, 111, // tch('/api/lo - 103, 105, 110, 39, 44, 32, 123, 104, 101, 97, 100, 101, // gin', {heade - 114, 115, 58, 32, 123, 65, 117, 116, 104, 111, 114, 105, // rs: {Authori - 122, 97, 116, 105, 111, 110, 58, 32, 39, 39, 125, 125, // zation: ''}} - 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, // ). .t - 104, 101, 110, 40, 114, 32, 61, 62, 32, 114, 46, 106, // hen(r => r.j - 115, 111, 110, 40, 41, 41, 10, 32, 32, 32, 32, 32, // son()). - 32, 32, 32, 46, 116, 104, 101, 110, 40, 114, 32, 61, // .then(r = - 62, 32, 108, 111, 103, 105, 110, 40, 114, 41, 41, 10, // > login(r)). - 32, 32, 32, 32, 32, 32, 32, 32, 46, 116, 104, 101, // .the - 110, 40, 119, 97, 116, 99, 104, 41, 10, 32, 32, 32, // n(watch). - 32, 32, 32, 32, 32, 46, 99, 97, 116, 99, 104, 40, // .catch( - 101, 114, 114, 32, 61, 62, 32, 115, 101, 116, 85, 115, // err => setUs - 101, 114, 40, 39, 39, 41, 41, 59, 10, 32, 32, 125, // er(''));. } - 44, 32, 91, 93, 41, 59, 10, 10, 32, 32, 105, 102, // , []);.. if - 32, 40, 33, 117, 115, 101, 114, 41, 32, 114, 101, 116, // (!user) ret - 117, 114, 110, 32, 104, 116, 109, 108, 96, 60, 36, 123, // urn html`<${ - 76, 111, 103, 105, 110, 125, 32, 108, 111, 103, 105, 110, // Login} login - 61, 36, 123, 108, 111, 103, 105, 110, 125, 32, 47, 62, // =${login} /> - 96, 59, 10, 10, 32, 32, 114, 101, 116, 117, 114, 110, // `;.. return - 32, 104, 116, 109, 108, 96, 10, 60, 36, 123, 78, 97, // html`.<${Na - 118, 125, 32, 117, 115, 101, 114, 61, 36, 123, 117, 115, // v} user=${us - 101, 114, 125, 32, 108, 111, 103, 111, 117, 116, 61, 36, // er} logout=$ - 123, 108, 111, 103, 111, 117, 116, 125, 32, 47, 62, 10, // {logout} />. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
. - 32, 32, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, //
. - 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, //
< - 36, 123, 72, 101, 114, 111, 125, 32, 47, 62, 60, 47, // ${Hero} />. <${C - 104, 97, 114, 116, 125, 32, 47, 62, 60, 47, 100, 105, // hart} />.
. - 32, 36, 123, 117, 115, 101, 114, 32, 61, 61, 32, 39, // ${user == ' - 97, 100, 109, 105, 110, 39, 32, 38, 38, 32, 104, 40, // admin' && h( - 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, // Configuratio - 110, 44, 32, 123, 99, 111, 110, 102, 105, 103, 125, 41, // n, {config}) - 125, 10, 32, 32, 32, 32, 60, 47, 100, 105, 118, 62, // }.
- 10, 32, 32, 32, 32, 60, 100, 105, 118, 32, 99, 108, // .
<${Messa - 103, 101, 115, 125, 32, 99, 111, 110, 102, 105, 103, 61, // ges} config= - 36, 123, 99, 111, 110, 102, 105, 103, 125, 32, 47, 62, // ${config} /> - 60, 47, 100, 105, 118, 62, 10, 32, 32, 60, 47, 100, //
. .
`; - 10, 125, 59, 10, 10, 119, 105, 110, 100, 111, 119, 46, // .};..window. - 111, 110, 108, 111, 97, 100, 32, 61, 32, 40, 41, 32, // onload = () - 61, 62, 32, 114, 101, 110, 100, 101, 114, 40, 104, 40, // => render(h( - 65, 112, 112, 41, 44, 32, 100, 111, 99, 117, 109, 101, // App), docume - 110, 116, 46, 98, 111, 100, 121, 41, 59, 10, 0 // nt.body);. + 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, // .. < + 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, // head>. Device + 68, 97, 115, 104, 98, 111, 97, 114, 100, 60, 47, 116, // Dashboard. . + 32, 32, 32, 60, 109, 101, 116, 97, 32, 104, 116, 116, // . + 32, 32, 32, 60, 109, 101, 116, 97, 32, 110, 97, 109, // . . + 10, 32, 32, 60, 98, 111, 100, 121, 62, 60, 47, 98, // . . . + 10, 0 // . }; static const unsigned char v2[] = { - 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t, - 111, 44, 114, 44, 117, 44, 108, 61, 123, 125, 44, 105, // o,r,u,l={},i - 61, 91, 93, 44, 99, 61, 47, 97, 99, 105, 116, 124, // =[],c=/acit| - 101, 120, 40, 63, 58, 115, 124, 103, 124, 110, 124, 112, // ex(?:s|g|n|p - 124, 36, 41, 124, 114, 112, 104, 124, 103, 114, 105, 100, // |$)|rph|grid - 124, 111, 119, 115, 124, 109, 110, 99, 124, 110, 116, 119, // |ows|mnc|ntw - 124, 105, 110, 101, 91, 99, 104, 93, 124, 122, 111, 111, // |ine[ch]|zoo - 124, 94, 111, 114, 100, 124, 105, 116, 101, 114, 97, 47, // |^ord|itera/ - 105, 59, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, // i;function s - 40, 101, 44, 110, 41, 123, 102, 111, 114, 40, 118, 97, // (e,n){for(va - 114, 32, 95, 32, 105, 110, 32, 110, 41, 101, 91, 95, // r _ in n)e[_ - 93, 61, 110, 91, 95, 93, 59, 114, 101, 116, 117, 114, // ]=n[_];retur - 110, 32, 101, 125, 102, 117, 110, 99, 116, 105, 111, 110, // n e}function - 32, 102, 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, // f(e){var n= - 101, 46, 112, 97, 114, 101, 110, 116, 78, 111, 100, 101, // e.parentNode - 59, 110, 38, 38, 110, 46, 114, 101, 109, 111, 118, 101, // ;n&&n.remove - 67, 104, 105, 108, 100, 40, 101, 41, 125, 102, 117, 110, // Child(e)}fun - 99, 116, 105, 111, 110, 32, 97, 40, 110, 44, 95, 44, // ction a(n,_, - 116, 41, 123, 118, 97, 114, 32, 111, 44, 114, 44, 117, // t){var o,r,u - 44, 108, 61, 123, 125, 59, 102, 111, 114, 40, 117, 32, // ,l={};for(u - 105, 110, 32, 95, 41, 34, 107, 101, 121, 34, 61, 61, // in _)"key"== - 117, 63, 111, 61, 95, 91, 117, 93, 58, 34, 114, 101, // u?o=_[u]:"re - 102, 34, 61, 61, 117, 63, 114, 61, 95, 91, 117, 93, // f"==u?r=_[u] - 58, 108, 91, 117, 93, 61, 95, 91, 117, 93, 59, 105, // :l[u]=_[u];i - 102, 40, 97, 114, 103, 117, 109, 101, 110, 116, 115, 46, // f(arguments. - 108, 101, 110, 103, 116, 104, 62, 50, 38, 38, 40, 108, // length>2&&(l - 46, 99, 104, 105, 108, 100, 114, 101, 110, 61, 97, 114, // .children=ar - 103, 117, 109, 101, 110, 116, 115, 46, 108, 101, 110, 103, // guments.leng - 116, 104, 62, 51, 63, 101, 46, 99, 97, 108, 108, 40, // th>3?e.call( - 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 50, 41, // arguments,2) - 58, 116, 41, 44, 34, 102, 117, 110, 99, 116, 105, 111, // :t),"functio - 110, 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, // n"==typeof n - 38, 38, 110, 117, 108, 108, 33, 61, 110, 46, 100, 101, // &&null!=n.de - 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 102, // faultProps)f - 111, 114, 40, 117, 32, 105, 110, 32, 110, 46, 100, 101, // or(u in n.de - 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 118, // faultProps)v - 111, 105, 100, 32, 48, 61, 61, 61, 108, 91, 117, 93, // oid 0===l[u] - 38, 38, 40, 108, 91, 117, 93, 61, 110, 46, 100, 101, // &&(l[u]=n.de - 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 91, 117, // faultProps[u - 93, 41, 59, 114, 101, 116, 117, 114, 110, 32, 112, 40, // ]);return p( - 110, 44, 108, 44, 111, 44, 114, 44, 110, 117, 108, 108, // n,l,o,r,null - 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 112, // )}function p - 40, 101, 44, 116, 44, 111, 44, 114, 44, 117, 41, 123, // (e,t,o,r,u){ - 118, 97, 114, 32, 108, 61, 123, 116, 121, 112, 101, 58, // var l={type: - 101, 44, 112, 114, 111, 112, 115, 58, 116, 44, 107, 101, // e,props:t,ke - 121, 58, 111, 44, 114, 101, 102, 58, 114, 44, 95, 95, // y:o,ref:r,__ - 107, 58, 110, 117, 108, 108, 44, 95, 95, 58, 110, 117, // k:null,__:nu - 108, 108, 44, 95, 95, 98, 58, 48, 44, 95, 95, 101, // ll,__b:0,__e - 58, 110, 117, 108, 108, 44, 95, 95, 100, 58, 118, 111, // :null,__d:vo - 105, 100, 32, 48, 44, 95, 95, 99, 58, 110, 117, 108, // id 0,__c:nul - 108, 44, 95, 95, 104, 58, 110, 117, 108, 108, 44, 99, // l,__h:null,c - 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 58, 118, // onstructor:v - 111, 105, 100, 32, 48, 44, 95, 95, 118, 58, 110, 117, // oid 0,__v:nu - 108, 108, 61, 61, 117, 63, 43, 43, 95, 58, 117, 125, // ll==u?++_:u} - 59, 114, 101, 116, 117, 114, 110, 32, 110, 117, 108, 108, // ;return null - 33, 61, 110, 46, 118, 110, 111, 100, 101, 38, 38, 110, // !=n.vnode&&n - 46, 118, 110, 111, 100, 101, 40, 108, 41, 44, 108, 125, // .vnode(l),l} - 102, 117, 110, 99, 116, 105, 111, 110, 32, 104, 40, 101, // function h(e - 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, 46, 99, // ){return e.c - 104, 105, 108, 100, 114, 101, 110, 125, 102, 117, 110, 99, // hildren}func - 116, 105, 111, 110, 32, 100, 40, 101, 44, 110, 41, 123, // tion d(e,n){ - 116, 104, 105, 115, 46, 112, 114, 111, 112, 115, 61, 101, // this.props=e - 44, 116, 104, 105, 115, 46, 99, 111, 110, 116, 101, 120, // ,this.contex - 116, 61, 110, 125, 102, 117, 110, 99, 116, 105, 111, 110, // t=n}function - 32, 118, 40, 101, 44, 110, 41, 123, 105, 102, 40, 110, // v(e,n){if(n - 117, 108, 108, 61, 61, 110, 41, 114, 101, 116, 117, 114, // ull==n)retur - 110, 32, 101, 46, 95, 95, 63, 118, 40, 101, 46, 95, // n e.__?v(e._ - 95, 44, 101, 46, 95, 95, 46, 95, 95, 107, 46, 105, // _,e.__.__k.i - 110, 100, 101, 120, 79, 102, 40, 101, 41, 43, 49, 41, // ndexOf(e)+1) - 58, 110, 117, 108, 108, 59, 102, 111, 114, 40, 118, 97, // :null;for(va - 114, 32, 95, 59, 110, 60, 101, 46, 95, 95, 107, 46, // r _;n0?p(m. - 116, 121, 112, 101, 44, 109, 46, 112, 114, 111, 112, 115, // type,m.props - 44, 109, 46, 107, 101, 121, 44, 110, 117, 108, 108, 44, // ,m.key,null, - 109, 46, 95, 95, 118, 41, 58, 109, 41, 41, 123, 105, // m.__v):m)){i - 102, 40, 109, 46, 95, 95, 61, 95, 44, 109, 46, 95, // f(m.__=_,m._ - 95, 98, 61, 95, 46, 95, 95, 98, 43, 49, 44, 110, // _b=_.__b+1,n - 117, 108, 108, 61, 61, 61, 40, 121, 61, 72, 91, 97, // ull===(y=H[a - 93, 41, 124, 124, 121, 38, 38, 109, 46, 107, 101, 121, // ])||y&&m.key - 61, 61, 121, 46, 107, 101, 121, 38, 38, 109, 46, 116, // ==y.key&&m.t - 121, 112, 101, 61, 61, 61, 121, 46, 116, 121, 112, 101, // ype===y.type - 41, 72, 91, 97, 93, 61, 118, 111, 105, 100, 32, 48, // )H[a]=void 0 - 59, 101, 108, 115, 101, 32, 102, 111, 114, 40, 100, 61, // ;else for(d= - 48, 59, 100, 60, 69, 59, 100, 43, 43, 41, 123, 105, // 0;d=t.__.len - 103, 116, 104, 38, 38, 116, 46, 95, 95, 46, 112, 117, // gth&&t.__.pu - 115, 104, 40, 123, 125, 41, 44, 116, 46, 95, 95, 91, // sh({}),t.__[ - 101, 93, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // e]}function - 71, 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, // G(e){return - 82, 61, 49, 44, 122, 40, 105, 101, 44, 101, 41, 125, // R=1,z(ie,e)} - 102, 117, 110, 99, 116, 105, 111, 110, 32, 122, 40, 101, // function z(e - 44, 110, 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, // ,n,_){var t= - 106, 40, 76, 43, 43, 44, 50, 41, 59, 114, 101, 116, // j(L++,2);ret - 117, 114, 110, 32, 116, 46, 116, 61, 101, 44, 116, 46, // urn t.t=e,t. - 95, 95, 99, 124, 124, 40, 116, 46, 95, 95, 61, 91, // __c||(t.__=[ - 95, 63, 95, 40, 110, 41, 58, 105, 101, 40, 118, 111, // _?_(n):ie(vo - 105, 100, 32, 48, 44, 110, 41, 44, 102, 117, 110, 99, // id 0,n),func - 116, 105, 111, 110, 40, 101, 41, 123, 118, 97, 114, 32, // tion(e){var - 110, 61, 116, 46, 116, 40, 116, 46, 95, 95, 91, 48, // n=t.t(t.__[0 - 93, 44, 101, 41, 59, 116, 46, 95, 95, 91, 48, 93, // ],e);t.__[0] - 33, 61, 61, 110, 38, 38, 40, 116, 46, 95, 95, 61, // !==n&&(t.__= - 91, 110, 44, 116, 46, 95, 95, 91, 49, 93, 93, 44, // [n,t.__[1]], - 116, 46, 95, 95, 99, 46, 115, 101, 116, 83, 116, 97, // t.__c.setSta - 116, 101, 40, 123, 125, 41, 41, 125, 93, 44, 116, 46, // te({}))}],t. - 95, 95, 99, 61, 78, 41, 44, 116, 46, 95, 95, 125, // __c=N),t.__} - 102, 117, 110, 99, 116, 105, 111, 110, 32, 74, 40, 101, // function J(e - 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, 106, 40, // ,_){var t=j( - 76, 43, 43, 44, 51, 41, 59, 33, 110, 46, 95, 95, // L++,3);!n.__ - 115, 38, 38, 108, 101, 40, 116, 46, 95, 95, 72, 44, // s&&le(t.__H, - 95, 41, 38, 38, 40, 116, 46, 95, 95, 61, 101, 44, // _)&&(t.__=e, - 116, 46, 95, 95, 72, 61, 95, 44, 78, 46, 95, 95, // t.__H=_,N.__ - 72, 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, // H.__h.push(t - 41, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ))}function - 75, 40, 101, 44, 95, 41, 123, 118, 97, 114, 32, 116, // K(e,_){var t - 61, 106, 40, 76, 43, 43, 44, 52, 41, 59, 33, 110, // =j(L++,4);!n - 46, 95, 95, 115, 38, 38, 108, 101, 40, 116, 46, 95, // .__s&&le(t._ - 95, 72, 44, 95, 41, 38, 38, 40, 116, 46, 95, 95, // _H,_)&&(t.__ - 61, 101, 44, 116, 46, 95, 95, 72, 61, 95, 44, 78, // =e,t.__H=_,N - 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, 41, // .__h.push(t) - 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 81, // )}function Q - 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // (e){return R - 61, 53, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =5,Y(functio - 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 123, 99, // n(){return{c - 117, 114, 114, 101, 110, 116, 58, 101, 125, 125, 44, 91, // urrent:e}},[ - 93, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ])}function - 88, 40, 101, 44, 110, 44, 95, 41, 123, 82, 61, 54, // X(e,n,_){R=6 - 44, 75, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, // ,K(function( - 41, 123, 34, 102, 117, 110, 99, 116, 105, 111, 110, 34, // ){"function" - 61, 61, 116, 121, 112, 101, 111, 102, 32, 101, 63, 101, // ==typeof e?e - 40, 110, 40, 41, 41, 58, 101, 38, 38, 40, 101, 46, // (n()):e&&(e. - 99, 117, 114, 114, 101, 110, 116, 61, 110, 40, 41, 41, // current=n()) - 125, 44, 110, 117, 108, 108, 61, 61, 95, 63, 95, 58, // },null==_?_: - 95, 46, 99, 111, 110, 99, 97, 116, 40, 101, 41, 41, // _.concat(e)) - 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 89, 40, // }function Y( - 101, 44, 110, 41, 123, 118, 97, 114, 32, 95, 61, 106, // e,n){var _=j - 40, 76, 43, 43, 44, 55, 41, 59, 114, 101, 116, 117, // (L++,7);retu - 114, 110, 32, 108, 101, 40, 95, 46, 95, 95, 72, 44, // rn le(_.__H, - 110, 41, 38, 38, 40, 95, 46, 95, 95, 61, 101, 40, // n)&&(_.__=e( - 41, 44, 95, 46, 95, 95, 72, 61, 110, 44, 95, 46, // ),_.__H=n,_. - 95, 95, 104, 61, 101, 41, 44, 95, 46, 95, 95, 125, // __h=e),_.__} - 102, 117, 110, 99, 116, 105, 111, 110, 32, 90, 40, 101, // function Z(e - 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // ,n){return R - 61, 56, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =8,Y(functio - 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, // n(){return e - 125, 44, 110, 41, 125, 102, 117, 110, 99, 116, 105, 111, // },n)}functio - 110, 32, 101, 101, 40, 101, 41, 123, 118, 97, 114, 32, // n ee(e){var - 110, 61, 78, 46, 99, 111, 110, 116, 101, 120, 116, 91, // n=N.context[ - 101, 46, 95, 95, 99, 93, 44, 95, 61, 106, 40, 76, // e.__c],_=j(L - 43, 43, 44, 57, 41, 59, 114, 101, 116, 117, 114, 110, // ++,9);return - 32, 95, 46, 99, 61, 101, 44, 110, 63, 40, 110, 117, // _.c=e,n?(nu - 108, 108, 61, 61, 95, 46, 95, 95, 38, 38, 40, 95, // ll==_.__&&(_ - 46, 95, 95, 61, 33, 48, 44, 110, 46, 115, 117, 98, // .__=!0,n.sub - 40, 78, 41, 41, 44, 110, 46, 112, 114, 111, 112, 115, // (N)),n.props - 46, 118, 97, 108, 117, 101, 41, 58, 101, 46, 95, 95, // .value):e.__ - 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 110, 101, // }function ne - 40, 101, 44, 95, 41, 123, 110, 46, 117, 115, 101, 68, // (e,_){n.useD - 101, 98, 117, 103, 86, 97, 108, 117, 101, 38, 38, 110, // ebugValue&&n - 46, 117, 115, 101, 68, 101, 98, 117, 103, 86, 97, 108, // .useDebugVal - 117, 101, 40, 95, 63, 95, 40, 101, 41, 58, 101, 41, // ue(_?_(e):e) - 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 95, 101, // }function _e - 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, 106, 40, // (e){var n=j( - 76, 43, 43, 44, 49, 48, 41, 44, 95, 61, 71, 40, // L++,10),_=G( - 41, 59, 114, 101, 116, 117, 114, 110, 32, 110, 46, 95, // );return n._ - 95, 61, 101, 44, 78, 46, 99, 111, 109, 112, 111, 110, // _=e,N.compon - 101, 110, 116, 68, 105, 100, 67, 97, 116, 99, 104, 124, // entDidCatch| - 124, 40, 78, 46, 99, 111, 109, 112, 111, 110, 101, 110, // |(N.componen - 116, 68, 105, 100, 67, 97, 116, 99, 104, 61, 102, 117, // tDidCatch=fu - 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 110, 46, // nction(e){n. - 95, 95, 38, 38, 110, 46, 95, 95, 40, 101, 41, 44, // __&&n.__(e), - 95, 91, 49, 93, 40, 101, 41, 125, 41, 44, 91, 95, // _[1](e)}),[_ - 91, 48, 93, 44, 102, 117, 110, 99, 116, 105, 111, 110, // [0],function - 40, 41, 123, 95, 91, 49, 93, 40, 118, 111, 105, 100, // (){_[1](void - 32, 48, 41, 125, 93, 125, 102, 117, 110, 99, 116, 105, // 0)}]}functi - 111, 110, 32, 116, 101, 40, 41, 123, 73, 46, 102, 111, // on te(){I.fo - 114, 69, 97, 99, 104, 40, 102, 117, 110, 99, 116, 105, // rEach(functi - 111, 110, 40, 101, 41, 123, 105, 102, 40, 101, 46, 95, // on(e){if(e._ - 95, 80, 41, 116, 114, 121, 123, 101, 46, 95, 95, 72, // _P)try{e.__H - 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach - 40, 114, 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, // (re),e.__H._ - 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, 40, 117, // _h.forEach(u - 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, 95, 104, // e),e.__H.__h - 61, 91, 93, 125, 99, 97, 116, 99, 104, 40, 95, 41, // =[]}catch(_) - 123, 101, 46, 95, 95, 72, 46, 95, 95, 104, 61, 91, // {e.__H.__h=[ - 93, 44, 110, 46, 95, 95, 101, 40, 95, 44, 101, 46, // ],n.__e(_,e. - 95, 95, 118, 41, 125, 125, 41, 44, 73, 61, 91, 93, // __v)}}),I=[] - 125, 110, 46, 95, 95, 98, 61, 102, 117, 110, 99, 116, // }n.__b=funct - 105, 111, 110, 40, 101, 41, 123, 78, 61, 110, 117, 108, // ion(e){N=nul - 108, 44, 79, 38, 38, 79, 40, 101, 41, 125, 44, 110, // l,O&&O(e)},n - 46, 95, 95, 114, 61, 102, 117, 110, 99, 116, 105, 111, // .__r=functio - 110, 40, 101, 41, 123, 86, 38, 38, 86, 40, 101, 41, // n(e){V&&V(e) - 44, 76, 61, 48, 59, 118, 97, 114, 32, 110, 61, 40, // ,L=0;var n=( - 78, 61, 101, 46, 95, 95, 99, 41, 46, 95, 95, 72, // N=e.__c).__H - 59, 110, 38, 38, 40, 110, 46, 95, 95, 104, 46, 102, // ;n&&(n.__h.f - 111, 114, 69, 97, 99, 104, 40, 114, 101, 41, 44, 110, // orEach(re),n - 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach - 40, 117, 101, 41, 44, 110, 46, 95, 95, 104, 61, 91, // (ue),n.__h=[ - 93, 41, 125, 44, 110, 46, 100, 105, 102, 102, 101, 100, // ])},n.diffed - 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, // =function(e) - 123, 113, 38, 38, 113, 40, 101, 41, 59, 118, 97, 114, // {q&&q(e);var - 32, 95, 61, 101, 46, 95, 95, 99, 59, 95, 38, 38, // _=e.__c;_&& - 95, 46, 95, 95, 72, 38, 38, 95, 46, 95, 95, 72, // _.__H&&_.__H - 46, 95, 95, 104, 46, 108, 101, 110, 103, 116, 104, 38, // .__h.length& - 38, 40, 49, 33, 61, 61, 73, 46, 112, 117, 115, 104, // &(1!==I.push - 40, 95, 41, 38, 38, 87, 61, 61, 61, 110, 46, 114, // (_)&&W===n.r - 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, // equestAnimat - 105, 111, 110, 70, 114, 97, 109, 101, 124, 124, 40, 40, // ionFrame||(( - 87, 61, 110, 46, 114, 101, 113, 117, 101, 115, 116, 65, // W=n.requestA - 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, 97, 109, // nimationFram - 101, 41, 124, 124, 102, 117, 110, 99, 116, 105, 111, 110, // e)||function - 40, 101, 41, 123, 118, 97, 114, 32, 110, 44, 95, 61, // (e){var n,_= - 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 123, 99, // function(){c - 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout( - 116, 41, 44, 111, 101, 38, 38, 99, 97, 110, 99, 101, // t),oe&&cance - 108, 65, 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, // lAnimationFr - 97, 109, 101, 40, 110, 41, 44, 115, 101, 116, 84, 105, // ame(n),setTi - 109, 101, 111, 117, 116, 40, 101, 41, 125, 44, 116, 61, // meout(e)},t= - 115, 101, 116, 84, 105, 109, 101, 111, 117, 116, 40, 95, // setTimeout(_ - 44, 49, 48, 48, 41, 59, 111, 101, 38, 38, 40, 110, // ,100);oe&&(n - 61, 114, 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, // =requestAnim - 97, 116, 105, 111, 110, 70, 114, 97, 109, 101, 40, 95, // ationFrame(_ - 41, 41, 125, 41, 40, 116, 101, 41, 41, 44, 78, 61, // ))})(te)),N= - 118, 111, 105, 100, 32, 48, 125, 44, 110, 46, 95, 95, // void 0},n.__ - 99, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // c=function(e - 44, 95, 41, 123, 95, 46, 115, 111, 109, 101, 40, 102, // ,_){_.some(f - 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 116, // unction(e){t - 114, 121, 123, 101, 46, 95, 95, 104, 46, 102, 111, 114, // ry{e.__h.for - 69, 97, 99, 104, 40, 114, 101, 41, 44, 101, 46, 95, // Each(re),e._ - 95, 104, 61, 101, 46, 95, 95, 104, 46, 102, 105, 108, // _h=e.__h.fil - 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ter(function - 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 33, 101, // (e){return!e - 46, 95, 95, 124, 124, 117, 101, 40, 101, 41, 125, 41, // .__||ue(e)}) - 125, 99, 97, 116, 99, 104, 40, 116, 41, 123, 95, 46, // }catch(t){_. - 115, 111, 109, 101, 40, 102, 117, 110, 99, 116, 105, 111, // some(functio - 110, 40, 101, 41, 123, 101, 46, 95, 95, 104, 38, 38, // n(e){e.__h&& - 40, 101, 46, 95, 95, 104, 61, 91, 93, 41, 125, 41, // (e.__h=[])}) - 44, 95, 61, 91, 93, 44, 110, 46, 95, 95, 101, 40, // ,_=[],n.__e( - 116, 44, 101, 46, 95, 95, 118, 41, 125, 125, 41, 44, // t,e.__v)}}), - 66, 38, 38, 66, 40, 101, 44, 95, 41, 125, 44, 110, // B&&B(e,_)},n - 46, 117, 110, 109, 111, 117, 110, 116, 61, 102, 117, 110, // .unmount=fun - 99, 116, 105, 111, 110, 40, 101, 41, 123, 36, 38, 38, // ction(e){$&& - 36, 40, 101, 41, 59, 118, 97, 114, 32, 95, 61, 101, // $(e);var _=e - 46, 95, 95, 99, 59, 105, 102, 40, 95, 38, 38, 95, // .__c;if(_&&_ - 46, 95, 95, 72, 41, 116, 114, 121, 123, 95, 46, 95, // .__H)try{_._ - 95, 72, 46, 95, 95, 46, 102, 111, 114, 69, 97, 99, // _H.__.forEac - 104, 40, 114, 101, 41, 125, 99, 97, 116, 99, 104, 40, // h(re)}catch( - 101, 41, 123, 110, 46, 95, 95, 101, 40, 101, 44, 95, // e){n.__e(e,_ - 46, 95, 95, 118, 41, 125, 125, 59, 118, 97, 114, 32, // .__v)}};var - 111, 101, 61, 34, 102, 117, 110, 99, 116, 105, 111, 110, // oe="function - 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 114, 101, // "==typeof re - 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, 105, // questAnimati - 111, 110, 70, 114, 97, 109, 101, 59, 102, 117, 110, 99, // onFrame;func - 116, 105, 111, 110, 32, 114, 101, 40, 101, 41, 123, 118, // tion re(e){v - 97, 114, 32, 110, 61, 78, 59, 34, 102, 117, 110, 99, // ar n=N;"func - 116, 105, 111, 110, 34, 61, 61, 116, 121, 112, 101, 111, // tion"==typeo - 102, 32, 101, 46, 95, 95, 99, 38, 38, 101, 46, 95, // f e.__c&&e._ - 95, 99, 40, 41, 44, 78, 61, 110, 125, 102, 117, 110, // _c(),N=n}fun - 99, 116, 105, 111, 110, 32, 117, 101, 40, 101, 41, 123, // ction ue(e){ - 118, 97, 114, 32, 110, 61, 78, 59, 101, 46, 95, 95, // var n=N;e.__ - 99, 61, 101, 46, 95, 95, 40, 41, 44, 78, 61, 110, // c=e.__(),N=n - 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 108, 101, // }function le - 40, 101, 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, // (e,n){return - 33, 101, 124, 124, 101, 46, 108, 101, 110, 103, 116, 104, // !e||e.length - 33, 61, 61, 110, 46, 108, 101, 110, 103, 116, 104, 124, // !==n.length| - 124, 110, 46, 115, 111, 109, 101, 40, 102, 117, 110, 99, // |n.some(func - 116, 105, 111, 110, 40, 110, 44, 95, 41, 123, 114, 101, // tion(n,_){re - 116, 117, 114, 110, 32, 110, 33, 61, 61, 101, 91, 95, // turn n!==e[_ - 93, 125, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, // ]})}function - 32, 105, 101, 40, 101, 44, 110, 41, 123, 114, 101, 116, // ie(e,n){ret - 117, 114, 110, 34, 102, 117, 110, 99, 116, 105, 111, 110, // urn"function - 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, 63, // "==typeof n? - 110, 40, 101, 41, 58, 110, 125, 118, 97, 114, 32, 99, // n(e):n}var c - 101, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // e=function(e - 44, 110, 44, 95, 44, 116, 41, 123, 118, 97, 114, 32, // ,n,_,t){var - 111, 59, 110, 91, 48, 93, 61, 48, 59, 102, 111, 114, // o;n[0]=0;for - 40, 118, 97, 114, 32, 114, 61, 49, 59, 114, 60, 110, // (var r=1;r=5&& - 40, 40, 111, 124, 124, 33, 101, 38, 38, 53, 61, 61, // ((o||!e&&5== - 61, 116, 41, 38, 38, 40, 117, 46, 112, 117, 115, 104, // =t)&&(u.push - 40, 116, 44, 48, 44, 111, 44, 95, 41, 44, 116, 61, // (t,0,o,_),t= - 54, 41, 44, 101, 38, 38, 40, 117, 46, 112, 117, 115, // 6),e&&(u.pus - 104, 40, 116, 44, 101, 44, 48, 44, 95, 41, 44, 116, // h(t,e,0,_),t - 61, 54, 41, 41, 44, 111, 61, 34, 34, 125, 44, 105, // =6)),o=""},i - 61, 48, 59, 105, 60, 101, 46, 108, 101, 110, 103, 116, // =0;i"===n?(t=1, - 111, 61, 34, 34, 41, 58, 111, 61, 110, 43, 111, 91, // o=""):o=n+o[ - 48, 93, 58, 114, 63, 110, 61, 61, 61, 114, 63, 114, // 0]:r?n===r?r - 61, 34, 34, 58, 111, 43, 61, 110, 58, 39, 34, 39, // ="":o+=n:'"' - 61, 61, 61, 110, 124, 124, 34, 39, 34, 61, 61, 61, // ===n||"'"=== - 110, 63, 114, 61, 110, 58, 34, 62, 34, 61, 61, 61, // n?r=n:">"=== - 110, 63, 40, 108, 40, 41, 44, 116, 61, 49, 41, 58, // n?(l(),t=1): - 116, 38, 38, 40, 34, 61, 34, 61, 61, 61, 110, 63, // t&&("="===n? - 40, 116, 61, 53, 44, 95, 61, 111, 44, 111, 61, 34, // (t=5,_=o,o=" - 34, 41, 58, 34, 47, 34, 61, 61, 61, 110, 38, 38, // "):"/"===n&& - 40, 116, 60, 53, 124, 124, 34, 62, 34, 61, 61, 61, // (t<5||">"=== - 101, 91, 105, 93, 91, 99, 43, 49, 93, 41, 63, 40, // e[i][c+1])?( - 108, 40, 41, 44, 51, 61, 61, 61, 116, 38, 38, 40, // l(),3===t&&( - 117, 61, 117, 91, 48, 93, 41, 44, 116, 61, 117, 44, // u=u[0]),t=u, - 40, 117, 61, 117, 91, 48, 93, 41, 46, 112, 117, 115, // (u=u[0]).pus - 104, 40, 50, 44, 48, 44, 116, 41, 44, 116, 61, 48, // h(2,0,t),t=0 - 41, 58, 34, 32, 34, 61, 61, 61, 110, 124, 124, 34, // ):" "===n||" - 92, 116, 34, 61, 61, 61, 110, 124, 124, 34, 92, 110, // .t"===n||".n - 34, 61, 61, 61, 110, 124, 124, 34, 92, 114, 34, 61, // "===n||".r"= - 61, 61, 110, 63, 40, 108, 40, 41, 44, 116, 61, 50, // ==n?(l(),t=2 - 41, 58, 111, 43, 61, 110, 41, 44, 51, 61, 61, 61, // ):o+=n),3=== - 116, 38, 38, 34, 33, 45, 45, 34, 61, 61, 61, 111, // t&&"!--"===o - 38, 38, 40, 116, 61, 52, 44, 117, 61, 117, 91, 48, // &&(t=4,u=u[0 - 93, 41, 125, 114, 101, 116, 117, 114, 110, 32, 108, 40, // ])}return l( - 41, 44, 117, 125, 40, 101, 41, 41, 44, 110, 41, 44, // ),u}(e)),n), - 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 91, 93, // arguments,[] - 41, 41, 46, 108, 101, 110, 103, 116, 104, 62, 49, 63, // )).length>1? - 110, 58, 110, 91, 48, 93, 125, 46, 98, 105, 110, 100, // n:n[0]}.bind - 40, 97, 41, 59, 101, 120, 112, 111, 114, 116, 123, 97, // (a);export{a - 32, 97, 115, 32, 104, 44, 102, 101, 32, 97, 115, 32, // as h,fe as - 104, 116, 109, 108, 44, 77, 32, 97, 115, 32, 114, 101, // html,M as re - 110, 100, 101, 114, 44, 100, 32, 97, 115, 32, 67, 111, // nder,d as Co - 109, 112, 111, 110, 101, 110, 116, 44, 70, 32, 97, 115, // mponent,F as - 32, 99, 114, 101, 97, 116, 101, 67, 111, 110, 116, 101, // createConte - 120, 116, 44, 71, 32, 97, 115, 32, 117, 115, 101, 83, // xt,G as useS - 116, 97, 116, 101, 44, 122, 32, 97, 115, 32, 117, 115, // tate,z as us - 101, 82, 101, 100, 117, 99, 101, 114, 44, 74, 32, 97, // eReducer,J a - 115, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // s useEffect, - 75, 32, 97, 115, 32, 117, 115, 101, 76, 97, 121, 111, // K as useLayo - 117, 116, 69, 102, 102, 101, 99, 116, 44, 81, 32, 97, // utEffect,Q a - 115, 32, 117, 115, 101, 82, 101, 102, 44, 88, 32, 97, // s useRef,X a - 115, 32, 117, 115, 101, 73, 109, 112, 101, 114, 97, 116, // s useImperat - 105, 118, 101, 72, 97, 110, 100, 108, 101, 44, 89, 32, // iveHandle,Y - 97, 115, 32, 117, 115, 101, 77, 101, 109, 111, 44, 90, // as useMemo,Z - 32, 97, 115, 32, 117, 115, 101, 67, 97, 108, 108, 98, // as useCallb - 97, 99, 107, 44, 101, 101, 32, 97, 115, 32, 117, 115, // ack,ee as us - 101, 67, 111, 110, 116, 101, 120, 116, 44, 110, 101, 32, // eContext,ne - 97, 115, 32, 117, 115, 101, 68, 101, 98, 117, 103, 86, // as useDebugV - 97, 108, 117, 101, 44, 95, 101, 32, 97, 115, 32, 117, // alue,_e as u - 115, 101, 69, 114, 114, 111, 114, 66, 111, 117, 110, 100, // seErrorBound - 97, 114, 121, 125, 59, 10, 0 // ary};. -}; -static const unsigned char v3[] = { 39, 117, 115, 101, 32, 115, 116, 114, 105, 99, 116, 39, // 'use strict' 59, 10, 105, 109, 112, 111, 114, 116, 32, 123, 67, 111, // ;.import {Co 109, 112, 111, 110, 101, 110, 116, 44, 32, 104, 44, 32, // mponent, h, @@ -3469,7 +1230,1264 @@ static const unsigned char v3[] = { 65, 112, 112, 41, 44, 32, 100, 111, 99, 117, 109, 101, // App), docume 110, 116, 46, 98, 111, 100, 121, 41, 59, 10, 0 // nt.body);. }; +static const unsigned char v3[] = { + 118, 97, 114, 32, 101, 44, 110, 44, 95, 44, 116, 44, // var e,n,_,t, + 111, 44, 114, 44, 117, 44, 108, 61, 123, 125, 44, 105, // o,r,u,l={},i + 61, 91, 93, 44, 99, 61, 47, 97, 99, 105, 116, 124, // =[],c=/acit| + 101, 120, 40, 63, 58, 115, 124, 103, 124, 110, 124, 112, // ex(?:s|g|n|p + 124, 36, 41, 124, 114, 112, 104, 124, 103, 114, 105, 100, // |$)|rph|grid + 124, 111, 119, 115, 124, 109, 110, 99, 124, 110, 116, 119, // |ows|mnc|ntw + 124, 105, 110, 101, 91, 99, 104, 93, 124, 122, 111, 111, // |ine[ch]|zoo + 124, 94, 111, 114, 100, 124, 105, 116, 101, 114, 97, 47, // |^ord|itera/ + 105, 59, 102, 117, 110, 99, 116, 105, 111, 110, 32, 115, // i;function s + 40, 101, 44, 110, 41, 123, 102, 111, 114, 40, 118, 97, // (e,n){for(va + 114, 32, 95, 32, 105, 110, 32, 110, 41, 101, 91, 95, // r _ in n)e[_ + 93, 61, 110, 91, 95, 93, 59, 114, 101, 116, 117, 114, // ]=n[_];retur + 110, 32, 101, 125, 102, 117, 110, 99, 116, 105, 111, 110, // n e}function + 32, 102, 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, // f(e){var n= + 101, 46, 112, 97, 114, 101, 110, 116, 78, 111, 100, 101, // e.parentNode + 59, 110, 38, 38, 110, 46, 114, 101, 109, 111, 118, 101, // ;n&&n.remove + 67, 104, 105, 108, 100, 40, 101, 41, 125, 102, 117, 110, // Child(e)}fun + 99, 116, 105, 111, 110, 32, 97, 40, 110, 44, 95, 44, // ction a(n,_, + 116, 41, 123, 118, 97, 114, 32, 111, 44, 114, 44, 117, // t){var o,r,u + 44, 108, 61, 123, 125, 59, 102, 111, 114, 40, 117, 32, // ,l={};for(u + 105, 110, 32, 95, 41, 34, 107, 101, 121, 34, 61, 61, // in _)"key"== + 117, 63, 111, 61, 95, 91, 117, 93, 58, 34, 114, 101, // u?o=_[u]:"re + 102, 34, 61, 61, 117, 63, 114, 61, 95, 91, 117, 93, // f"==u?r=_[u] + 58, 108, 91, 117, 93, 61, 95, 91, 117, 93, 59, 105, // :l[u]=_[u];i + 102, 40, 97, 114, 103, 117, 109, 101, 110, 116, 115, 46, // f(arguments. + 108, 101, 110, 103, 116, 104, 62, 50, 38, 38, 40, 108, // length>2&&(l + 46, 99, 104, 105, 108, 100, 114, 101, 110, 61, 97, 114, // .children=ar + 103, 117, 109, 101, 110, 116, 115, 46, 108, 101, 110, 103, // guments.leng + 116, 104, 62, 51, 63, 101, 46, 99, 97, 108, 108, 40, // th>3?e.call( + 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 50, 41, // arguments,2) + 58, 116, 41, 44, 34, 102, 117, 110, 99, 116, 105, 111, // :t),"functio + 110, 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, // n"==typeof n + 38, 38, 110, 117, 108, 108, 33, 61, 110, 46, 100, 101, // &&null!=n.de + 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 102, // faultProps)f + 111, 114, 40, 117, 32, 105, 110, 32, 110, 46, 100, 101, // or(u in n.de + 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 41, 118, // faultProps)v + 111, 105, 100, 32, 48, 61, 61, 61, 108, 91, 117, 93, // oid 0===l[u] + 38, 38, 40, 108, 91, 117, 93, 61, 110, 46, 100, 101, // &&(l[u]=n.de + 102, 97, 117, 108, 116, 80, 114, 111, 112, 115, 91, 117, // faultProps[u + 93, 41, 59, 114, 101, 116, 117, 114, 110, 32, 112, 40, // ]);return p( + 110, 44, 108, 44, 111, 44, 114, 44, 110, 117, 108, 108, // n,l,o,r,null + 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 112, // )}function p + 40, 101, 44, 116, 44, 111, 44, 114, 44, 117, 41, 123, // (e,t,o,r,u){ + 118, 97, 114, 32, 108, 61, 123, 116, 121, 112, 101, 58, // var l={type: + 101, 44, 112, 114, 111, 112, 115, 58, 116, 44, 107, 101, // e,props:t,ke + 121, 58, 111, 44, 114, 101, 102, 58, 114, 44, 95, 95, // y:o,ref:r,__ + 107, 58, 110, 117, 108, 108, 44, 95, 95, 58, 110, 117, // k:null,__:nu + 108, 108, 44, 95, 95, 98, 58, 48, 44, 95, 95, 101, // ll,__b:0,__e + 58, 110, 117, 108, 108, 44, 95, 95, 100, 58, 118, 111, // :null,__d:vo + 105, 100, 32, 48, 44, 95, 95, 99, 58, 110, 117, 108, // id 0,__c:nul + 108, 44, 95, 95, 104, 58, 110, 117, 108, 108, 44, 99, // l,__h:null,c + 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 58, 118, // onstructor:v + 111, 105, 100, 32, 48, 44, 95, 95, 118, 58, 110, 117, // oid 0,__v:nu + 108, 108, 61, 61, 117, 63, 43, 43, 95, 58, 117, 125, // ll==u?++_:u} + 59, 114, 101, 116, 117, 114, 110, 32, 110, 117, 108, 108, // ;return null + 33, 61, 110, 46, 118, 110, 111, 100, 101, 38, 38, 110, // !=n.vnode&&n + 46, 118, 110, 111, 100, 101, 40, 108, 41, 44, 108, 125, // .vnode(l),l} + 102, 117, 110, 99, 116, 105, 111, 110, 32, 104, 40, 101, // function h(e + 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, 46, 99, // ){return e.c + 104, 105, 108, 100, 114, 101, 110, 125, 102, 117, 110, 99, // hildren}func + 116, 105, 111, 110, 32, 100, 40, 101, 44, 110, 41, 123, // tion d(e,n){ + 116, 104, 105, 115, 46, 112, 114, 111, 112, 115, 61, 101, // this.props=e + 44, 116, 104, 105, 115, 46, 99, 111, 110, 116, 101, 120, // ,this.contex + 116, 61, 110, 125, 102, 117, 110, 99, 116, 105, 111, 110, // t=n}function + 32, 118, 40, 101, 44, 110, 41, 123, 105, 102, 40, 110, // v(e,n){if(n + 117, 108, 108, 61, 61, 110, 41, 114, 101, 116, 117, 114, // ull==n)retur + 110, 32, 101, 46, 95, 95, 63, 118, 40, 101, 46, 95, // n e.__?v(e._ + 95, 44, 101, 46, 95, 95, 46, 95, 95, 107, 46, 105, // _,e.__.__k.i + 110, 100, 101, 120, 79, 102, 40, 101, 41, 43, 49, 41, // ndexOf(e)+1) + 58, 110, 117, 108, 108, 59, 102, 111, 114, 40, 118, 97, // :null;for(va + 114, 32, 95, 59, 110, 60, 101, 46, 95, 95, 107, 46, // r _;n0?p(m. + 116, 121, 112, 101, 44, 109, 46, 112, 114, 111, 112, 115, // type,m.props + 44, 109, 46, 107, 101, 121, 44, 110, 117, 108, 108, 44, // ,m.key,null, + 109, 46, 95, 95, 118, 41, 58, 109, 41, 41, 123, 105, // m.__v):m)){i + 102, 40, 109, 46, 95, 95, 61, 95, 44, 109, 46, 95, // f(m.__=_,m._ + 95, 98, 61, 95, 46, 95, 95, 98, 43, 49, 44, 110, // _b=_.__b+1,n + 117, 108, 108, 61, 61, 61, 40, 121, 61, 72, 91, 97, // ull===(y=H[a + 93, 41, 124, 124, 121, 38, 38, 109, 46, 107, 101, 121, // ])||y&&m.key + 61, 61, 121, 46, 107, 101, 121, 38, 38, 109, 46, 116, // ==y.key&&m.t + 121, 112, 101, 61, 61, 61, 121, 46, 116, 121, 112, 101, // ype===y.type + 41, 72, 91, 97, 93, 61, 118, 111, 105, 100, 32, 48, // )H[a]=void 0 + 59, 101, 108, 115, 101, 32, 102, 111, 114, 40, 100, 61, // ;else for(d= + 48, 59, 100, 60, 69, 59, 100, 43, 43, 41, 123, 105, // 0;d=t.__.len + 103, 116, 104, 38, 38, 116, 46, 95, 95, 46, 112, 117, // gth&&t.__.pu + 115, 104, 40, 123, 125, 41, 44, 116, 46, 95, 95, 91, // sh({}),t.__[ + 101, 93, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // e]}function + 71, 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, // G(e){return + 82, 61, 49, 44, 122, 40, 105, 101, 44, 101, 41, 125, // R=1,z(ie,e)} + 102, 117, 110, 99, 116, 105, 111, 110, 32, 122, 40, 101, // function z(e + 44, 110, 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, // ,n,_){var t= + 106, 40, 76, 43, 43, 44, 50, 41, 59, 114, 101, 116, // j(L++,2);ret + 117, 114, 110, 32, 116, 46, 116, 61, 101, 44, 116, 46, // urn t.t=e,t. + 95, 95, 99, 124, 124, 40, 116, 46, 95, 95, 61, 91, // __c||(t.__=[ + 95, 63, 95, 40, 110, 41, 58, 105, 101, 40, 118, 111, // _?_(n):ie(vo + 105, 100, 32, 48, 44, 110, 41, 44, 102, 117, 110, 99, // id 0,n),func + 116, 105, 111, 110, 40, 101, 41, 123, 118, 97, 114, 32, // tion(e){var + 110, 61, 116, 46, 116, 40, 116, 46, 95, 95, 91, 48, // n=t.t(t.__[0 + 93, 44, 101, 41, 59, 116, 46, 95, 95, 91, 48, 93, // ],e);t.__[0] + 33, 61, 61, 110, 38, 38, 40, 116, 46, 95, 95, 61, // !==n&&(t.__= + 91, 110, 44, 116, 46, 95, 95, 91, 49, 93, 93, 44, // [n,t.__[1]], + 116, 46, 95, 95, 99, 46, 115, 101, 116, 83, 116, 97, // t.__c.setSta + 116, 101, 40, 123, 125, 41, 41, 125, 93, 44, 116, 46, // te({}))}],t. + 95, 95, 99, 61, 78, 41, 44, 116, 46, 95, 95, 125, // __c=N),t.__} + 102, 117, 110, 99, 116, 105, 111, 110, 32, 74, 40, 101, // function J(e + 44, 95, 41, 123, 118, 97, 114, 32, 116, 61, 106, 40, // ,_){var t=j( + 76, 43, 43, 44, 51, 41, 59, 33, 110, 46, 95, 95, // L++,3);!n.__ + 115, 38, 38, 108, 101, 40, 116, 46, 95, 95, 72, 44, // s&&le(t.__H, + 95, 41, 38, 38, 40, 116, 46, 95, 95, 61, 101, 44, // _)&&(t.__=e, + 116, 46, 95, 95, 72, 61, 95, 44, 78, 46, 95, 95, // t.__H=_,N.__ + 72, 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, // H.__h.push(t + 41, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ))}function + 75, 40, 101, 44, 95, 41, 123, 118, 97, 114, 32, 116, // K(e,_){var t + 61, 106, 40, 76, 43, 43, 44, 52, 41, 59, 33, 110, // =j(L++,4);!n + 46, 95, 95, 115, 38, 38, 108, 101, 40, 116, 46, 95, // .__s&&le(t._ + 95, 72, 44, 95, 41, 38, 38, 40, 116, 46, 95, 95, // _H,_)&&(t.__ + 61, 101, 44, 116, 46, 95, 95, 72, 61, 95, 44, 78, // =e,t.__H=_,N + 46, 95, 95, 104, 46, 112, 117, 115, 104, 40, 116, 41, // .__h.push(t) + 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 81, // )}function Q + 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // (e){return R + 61, 53, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =5,Y(functio + 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 123, 99, // n(){return{c + 117, 114, 114, 101, 110, 116, 58, 101, 125, 125, 44, 91, // urrent:e}},[ + 93, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ])}function + 88, 40, 101, 44, 110, 44, 95, 41, 123, 82, 61, 54, // X(e,n,_){R=6 + 44, 75, 40, 102, 117, 110, 99, 116, 105, 111, 110, 40, // ,K(function( + 41, 123, 34, 102, 117, 110, 99, 116, 105, 111, 110, 34, // ){"function" + 61, 61, 116, 121, 112, 101, 111, 102, 32, 101, 63, 101, // ==typeof e?e + 40, 110, 40, 41, 41, 58, 101, 38, 38, 40, 101, 46, // (n()):e&&(e. + 99, 117, 114, 114, 101, 110, 116, 61, 110, 40, 41, 41, // current=n()) + 125, 44, 110, 117, 108, 108, 61, 61, 95, 63, 95, 58, // },null==_?_: + 95, 46, 99, 111, 110, 99, 97, 116, 40, 101, 41, 41, // _.concat(e)) + 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 89, 40, // }function Y( + 101, 44, 110, 41, 123, 118, 97, 114, 32, 95, 61, 106, // e,n){var _=j + 40, 76, 43, 43, 44, 55, 41, 59, 114, 101, 116, 117, // (L++,7);retu + 114, 110, 32, 108, 101, 40, 95, 46, 95, 95, 72, 44, // rn le(_.__H, + 110, 41, 38, 38, 40, 95, 46, 95, 95, 61, 101, 40, // n)&&(_.__=e( + 41, 44, 95, 46, 95, 95, 72, 61, 110, 44, 95, 46, // ),_.__H=n,_. + 95, 95, 104, 61, 101, 41, 44, 95, 46, 95, 95, 125, // __h=e),_.__} + 102, 117, 110, 99, 116, 105, 111, 110, 32, 90, 40, 101, // function Z(e + 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, 32, 82, // ,n){return R + 61, 56, 44, 89, 40, 102, 117, 110, 99, 116, 105, 111, // =8,Y(functio + 110, 40, 41, 123, 114, 101, 116, 117, 114, 110, 32, 101, // n(){return e + 125, 44, 110, 41, 125, 102, 117, 110, 99, 116, 105, 111, // },n)}functio + 110, 32, 101, 101, 40, 101, 41, 123, 118, 97, 114, 32, // n ee(e){var + 110, 61, 78, 46, 99, 111, 110, 116, 101, 120, 116, 91, // n=N.context[ + 101, 46, 95, 95, 99, 93, 44, 95, 61, 106, 40, 76, // e.__c],_=j(L + 43, 43, 44, 57, 41, 59, 114, 101, 116, 117, 114, 110, // ++,9);return + 32, 95, 46, 99, 61, 101, 44, 110, 63, 40, 110, 117, // _.c=e,n?(nu + 108, 108, 61, 61, 95, 46, 95, 95, 38, 38, 40, 95, // ll==_.__&&(_ + 46, 95, 95, 61, 33, 48, 44, 110, 46, 115, 117, 98, // .__=!0,n.sub + 40, 78, 41, 41, 44, 110, 46, 112, 114, 111, 112, 115, // (N)),n.props + 46, 118, 97, 108, 117, 101, 41, 58, 101, 46, 95, 95, // .value):e.__ + 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 110, 101, // }function ne + 40, 101, 44, 95, 41, 123, 110, 46, 117, 115, 101, 68, // (e,_){n.useD + 101, 98, 117, 103, 86, 97, 108, 117, 101, 38, 38, 110, // ebugValue&&n + 46, 117, 115, 101, 68, 101, 98, 117, 103, 86, 97, 108, // .useDebugVal + 117, 101, 40, 95, 63, 95, 40, 101, 41, 58, 101, 41, // ue(_?_(e):e) + 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 95, 101, // }function _e + 40, 101, 41, 123, 118, 97, 114, 32, 110, 61, 106, 40, // (e){var n=j( + 76, 43, 43, 44, 49, 48, 41, 44, 95, 61, 71, 40, // L++,10),_=G( + 41, 59, 114, 101, 116, 117, 114, 110, 32, 110, 46, 95, // );return n._ + 95, 61, 101, 44, 78, 46, 99, 111, 109, 112, 111, 110, // _=e,N.compon + 101, 110, 116, 68, 105, 100, 67, 97, 116, 99, 104, 124, // entDidCatch| + 124, 40, 78, 46, 99, 111, 109, 112, 111, 110, 101, 110, // |(N.componen + 116, 68, 105, 100, 67, 97, 116, 99, 104, 61, 102, 117, // tDidCatch=fu + 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 110, 46, // nction(e){n. + 95, 95, 38, 38, 110, 46, 95, 95, 40, 101, 41, 44, // __&&n.__(e), + 95, 91, 49, 93, 40, 101, 41, 125, 41, 44, 91, 95, // _[1](e)}),[_ + 91, 48, 93, 44, 102, 117, 110, 99, 116, 105, 111, 110, // [0],function + 40, 41, 123, 95, 91, 49, 93, 40, 118, 111, 105, 100, // (){_[1](void + 32, 48, 41, 125, 93, 125, 102, 117, 110, 99, 116, 105, // 0)}]}functi + 111, 110, 32, 116, 101, 40, 41, 123, 73, 46, 102, 111, // on te(){I.fo + 114, 69, 97, 99, 104, 40, 102, 117, 110, 99, 116, 105, // rEach(functi + 111, 110, 40, 101, 41, 123, 105, 102, 40, 101, 46, 95, // on(e){if(e._ + 95, 80, 41, 116, 114, 121, 123, 101, 46, 95, 95, 72, // _P)try{e.__H + 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach + 40, 114, 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, // (re),e.__H._ + 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, 40, 117, // _h.forEach(u + 101, 41, 44, 101, 46, 95, 95, 72, 46, 95, 95, 104, // e),e.__H.__h + 61, 91, 93, 125, 99, 97, 116, 99, 104, 40, 95, 41, // =[]}catch(_) + 123, 101, 46, 95, 95, 72, 46, 95, 95, 104, 61, 91, // {e.__H.__h=[ + 93, 44, 110, 46, 95, 95, 101, 40, 95, 44, 101, 46, // ],n.__e(_,e. + 95, 95, 118, 41, 125, 125, 41, 44, 73, 61, 91, 93, // __v)}}),I=[] + 125, 110, 46, 95, 95, 98, 61, 102, 117, 110, 99, 116, // }n.__b=funct + 105, 111, 110, 40, 101, 41, 123, 78, 61, 110, 117, 108, // ion(e){N=nul + 108, 44, 79, 38, 38, 79, 40, 101, 41, 125, 44, 110, // l,O&&O(e)},n + 46, 95, 95, 114, 61, 102, 117, 110, 99, 116, 105, 111, // .__r=functio + 110, 40, 101, 41, 123, 86, 38, 38, 86, 40, 101, 41, // n(e){V&&V(e) + 44, 76, 61, 48, 59, 118, 97, 114, 32, 110, 61, 40, // ,L=0;var n=( + 78, 61, 101, 46, 95, 95, 99, 41, 46, 95, 95, 72, // N=e.__c).__H + 59, 110, 38, 38, 40, 110, 46, 95, 95, 104, 46, 102, // ;n&&(n.__h.f + 111, 114, 69, 97, 99, 104, 40, 114, 101, 41, 44, 110, // orEach(re),n + 46, 95, 95, 104, 46, 102, 111, 114, 69, 97, 99, 104, // .__h.forEach + 40, 117, 101, 41, 44, 110, 46, 95, 95, 104, 61, 91, // (ue),n.__h=[ + 93, 41, 125, 44, 110, 46, 100, 105, 102, 102, 101, 100, // ])},n.diffed + 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, // =function(e) + 123, 113, 38, 38, 113, 40, 101, 41, 59, 118, 97, 114, // {q&&q(e);var + 32, 95, 61, 101, 46, 95, 95, 99, 59, 95, 38, 38, // _=e.__c;_&& + 95, 46, 95, 95, 72, 38, 38, 95, 46, 95, 95, 72, // _.__H&&_.__H + 46, 95, 95, 104, 46, 108, 101, 110, 103, 116, 104, 38, // .__h.length& + 38, 40, 49, 33, 61, 61, 73, 46, 112, 117, 115, 104, // &(1!==I.push + 40, 95, 41, 38, 38, 87, 61, 61, 61, 110, 46, 114, // (_)&&W===n.r + 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, // equestAnimat + 105, 111, 110, 70, 114, 97, 109, 101, 124, 124, 40, 40, // ionFrame||(( + 87, 61, 110, 46, 114, 101, 113, 117, 101, 115, 116, 65, // W=n.requestA + 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, 97, 109, // nimationFram + 101, 41, 124, 124, 102, 117, 110, 99, 116, 105, 111, 110, // e)||function + 40, 101, 41, 123, 118, 97, 114, 32, 110, 44, 95, 61, // (e){var n,_= + 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 123, 99, // function(){c + 108, 101, 97, 114, 84, 105, 109, 101, 111, 117, 116, 40, // learTimeout( + 116, 41, 44, 111, 101, 38, 38, 99, 97, 110, 99, 101, // t),oe&&cance + 108, 65, 110, 105, 109, 97, 116, 105, 111, 110, 70, 114, // lAnimationFr + 97, 109, 101, 40, 110, 41, 44, 115, 101, 116, 84, 105, // ame(n),setTi + 109, 101, 111, 117, 116, 40, 101, 41, 125, 44, 116, 61, // meout(e)},t= + 115, 101, 116, 84, 105, 109, 101, 111, 117, 116, 40, 95, // setTimeout(_ + 44, 49, 48, 48, 41, 59, 111, 101, 38, 38, 40, 110, // ,100);oe&&(n + 61, 114, 101, 113, 117, 101, 115, 116, 65, 110, 105, 109, // =requestAnim + 97, 116, 105, 111, 110, 70, 114, 97, 109, 101, 40, 95, // ationFrame(_ + 41, 41, 125, 41, 40, 116, 101, 41, 41, 44, 78, 61, // ))})(te)),N= + 118, 111, 105, 100, 32, 48, 125, 44, 110, 46, 95, 95, // void 0},n.__ + 99, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // c=function(e + 44, 95, 41, 123, 95, 46, 115, 111, 109, 101, 40, 102, // ,_){_.some(f + 117, 110, 99, 116, 105, 111, 110, 40, 101, 41, 123, 116, // unction(e){t + 114, 121, 123, 101, 46, 95, 95, 104, 46, 102, 111, 114, // ry{e.__h.for + 69, 97, 99, 104, 40, 114, 101, 41, 44, 101, 46, 95, // Each(re),e._ + 95, 104, 61, 101, 46, 95, 95, 104, 46, 102, 105, 108, // _h=e.__h.fil + 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, 111, 110, // ter(function + 40, 101, 41, 123, 114, 101, 116, 117, 114, 110, 33, 101, // (e){return!e + 46, 95, 95, 124, 124, 117, 101, 40, 101, 41, 125, 41, // .__||ue(e)}) + 125, 99, 97, 116, 99, 104, 40, 116, 41, 123, 95, 46, // }catch(t){_. + 115, 111, 109, 101, 40, 102, 117, 110, 99, 116, 105, 111, // some(functio + 110, 40, 101, 41, 123, 101, 46, 95, 95, 104, 38, 38, // n(e){e.__h&& + 40, 101, 46, 95, 95, 104, 61, 91, 93, 41, 125, 41, // (e.__h=[])}) + 44, 95, 61, 91, 93, 44, 110, 46, 95, 95, 101, 40, // ,_=[],n.__e( + 116, 44, 101, 46, 95, 95, 118, 41, 125, 125, 41, 44, // t,e.__v)}}), + 66, 38, 38, 66, 40, 101, 44, 95, 41, 125, 44, 110, // B&&B(e,_)},n + 46, 117, 110, 109, 111, 117, 110, 116, 61, 102, 117, 110, // .unmount=fun + 99, 116, 105, 111, 110, 40, 101, 41, 123, 36, 38, 38, // ction(e){$&& + 36, 40, 101, 41, 59, 118, 97, 114, 32, 95, 61, 101, // $(e);var _=e + 46, 95, 95, 99, 59, 105, 102, 40, 95, 38, 38, 95, // .__c;if(_&&_ + 46, 95, 95, 72, 41, 116, 114, 121, 123, 95, 46, 95, // .__H)try{_._ + 95, 72, 46, 95, 95, 46, 102, 111, 114, 69, 97, 99, // _H.__.forEac + 104, 40, 114, 101, 41, 125, 99, 97, 116, 99, 104, 40, // h(re)}catch( + 101, 41, 123, 110, 46, 95, 95, 101, 40, 101, 44, 95, // e){n.__e(e,_ + 46, 95, 95, 118, 41, 125, 125, 59, 118, 97, 114, 32, // .__v)}};var + 111, 101, 61, 34, 102, 117, 110, 99, 116, 105, 111, 110, // oe="function + 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 114, 101, // "==typeof re + 113, 117, 101, 115, 116, 65, 110, 105, 109, 97, 116, 105, // questAnimati + 111, 110, 70, 114, 97, 109, 101, 59, 102, 117, 110, 99, // onFrame;func + 116, 105, 111, 110, 32, 114, 101, 40, 101, 41, 123, 118, // tion re(e){v + 97, 114, 32, 110, 61, 78, 59, 34, 102, 117, 110, 99, // ar n=N;"func + 116, 105, 111, 110, 34, 61, 61, 116, 121, 112, 101, 111, // tion"==typeo + 102, 32, 101, 46, 95, 95, 99, 38, 38, 101, 46, 95, // f e.__c&&e._ + 95, 99, 40, 41, 44, 78, 61, 110, 125, 102, 117, 110, // _c(),N=n}fun + 99, 116, 105, 111, 110, 32, 117, 101, 40, 101, 41, 123, // ction ue(e){ + 118, 97, 114, 32, 110, 61, 78, 59, 101, 46, 95, 95, // var n=N;e.__ + 99, 61, 101, 46, 95, 95, 40, 41, 44, 78, 61, 110, // c=e.__(),N=n + 125, 102, 117, 110, 99, 116, 105, 111, 110, 32, 108, 101, // }function le + 40, 101, 44, 110, 41, 123, 114, 101, 116, 117, 114, 110, // (e,n){return + 33, 101, 124, 124, 101, 46, 108, 101, 110, 103, 116, 104, // !e||e.length + 33, 61, 61, 110, 46, 108, 101, 110, 103, 116, 104, 124, // !==n.length| + 124, 110, 46, 115, 111, 109, 101, 40, 102, 117, 110, 99, // |n.some(func + 116, 105, 111, 110, 40, 110, 44, 95, 41, 123, 114, 101, // tion(n,_){re + 116, 117, 114, 110, 32, 110, 33, 61, 61, 101, 91, 95, // turn n!==e[_ + 93, 125, 41, 125, 102, 117, 110, 99, 116, 105, 111, 110, // ]})}function + 32, 105, 101, 40, 101, 44, 110, 41, 123, 114, 101, 116, // ie(e,n){ret + 117, 114, 110, 34, 102, 117, 110, 99, 116, 105, 111, 110, // urn"function + 34, 61, 61, 116, 121, 112, 101, 111, 102, 32, 110, 63, // "==typeof n? + 110, 40, 101, 41, 58, 110, 125, 118, 97, 114, 32, 99, // n(e):n}var c + 101, 61, 102, 117, 110, 99, 116, 105, 111, 110, 40, 101, // e=function(e + 44, 110, 44, 95, 44, 116, 41, 123, 118, 97, 114, 32, // ,n,_,t){var + 111, 59, 110, 91, 48, 93, 61, 48, 59, 102, 111, 114, // o;n[0]=0;for + 40, 118, 97, 114, 32, 114, 61, 49, 59, 114, 60, 110, // (var r=1;r=5&& + 40, 40, 111, 124, 124, 33, 101, 38, 38, 53, 61, 61, // ((o||!e&&5== + 61, 116, 41, 38, 38, 40, 117, 46, 112, 117, 115, 104, // =t)&&(u.push + 40, 116, 44, 48, 44, 111, 44, 95, 41, 44, 116, 61, // (t,0,o,_),t= + 54, 41, 44, 101, 38, 38, 40, 117, 46, 112, 117, 115, // 6),e&&(u.pus + 104, 40, 116, 44, 101, 44, 48, 44, 95, 41, 44, 116, // h(t,e,0,_),t + 61, 54, 41, 41, 44, 111, 61, 34, 34, 125, 44, 105, // =6)),o=""},i + 61, 48, 59, 105, 60, 101, 46, 108, 101, 110, 103, 116, // =0;i"===n?(t=1, + 111, 61, 34, 34, 41, 58, 111, 61, 110, 43, 111, 91, // o=""):o=n+o[ + 48, 93, 58, 114, 63, 110, 61, 61, 61, 114, 63, 114, // 0]:r?n===r?r + 61, 34, 34, 58, 111, 43, 61, 110, 58, 39, 34, 39, // ="":o+=n:'"' + 61, 61, 61, 110, 124, 124, 34, 39, 34, 61, 61, 61, // ===n||"'"=== + 110, 63, 114, 61, 110, 58, 34, 62, 34, 61, 61, 61, // n?r=n:">"=== + 110, 63, 40, 108, 40, 41, 44, 116, 61, 49, 41, 58, // n?(l(),t=1): + 116, 38, 38, 40, 34, 61, 34, 61, 61, 61, 110, 63, // t&&("="===n? + 40, 116, 61, 53, 44, 95, 61, 111, 44, 111, 61, 34, // (t=5,_=o,o=" + 34, 41, 58, 34, 47, 34, 61, 61, 61, 110, 38, 38, // "):"/"===n&& + 40, 116, 60, 53, 124, 124, 34, 62, 34, 61, 61, 61, // (t<5||">"=== + 101, 91, 105, 93, 91, 99, 43, 49, 93, 41, 63, 40, // e[i][c+1])?( + 108, 40, 41, 44, 51, 61, 61, 61, 116, 38, 38, 40, // l(),3===t&&( + 117, 61, 117, 91, 48, 93, 41, 44, 116, 61, 117, 44, // u=u[0]),t=u, + 40, 117, 61, 117, 91, 48, 93, 41, 46, 112, 117, 115, // (u=u[0]).pus + 104, 40, 50, 44, 48, 44, 116, 41, 44, 116, 61, 48, // h(2,0,t),t=0 + 41, 58, 34, 32, 34, 61, 61, 61, 110, 124, 124, 34, // ):" "===n||" + 92, 116, 34, 61, 61, 61, 110, 124, 124, 34, 92, 110, // .t"===n||".n + 34, 61, 61, 61, 110, 124, 124, 34, 92, 114, 34, 61, // "===n||".r"= + 61, 61, 110, 63, 40, 108, 40, 41, 44, 116, 61, 50, // ==n?(l(),t=2 + 41, 58, 111, 43, 61, 110, 41, 44, 51, 61, 61, 61, // ):o+=n),3=== + 116, 38, 38, 34, 33, 45, 45, 34, 61, 61, 61, 111, // t&&"!--"===o + 38, 38, 40, 116, 61, 52, 44, 117, 61, 117, 91, 48, // &&(t=4,u=u[0 + 93, 41, 125, 114, 101, 116, 117, 114, 110, 32, 108, 40, // ])}return l( + 41, 44, 117, 125, 40, 101, 41, 41, 44, 110, 41, 44, // ),u}(e)),n), + 97, 114, 103, 117, 109, 101, 110, 116, 115, 44, 91, 93, // arguments,[] + 41, 41, 46, 108, 101, 110, 103, 116, 104, 62, 49, 63, // )).length>1? + 110, 58, 110, 91, 48, 93, 125, 46, 98, 105, 110, 100, // n:n[0]}.bind + 40, 97, 41, 59, 101, 120, 112, 111, 114, 116, 123, 97, // (a);export{a + 32, 97, 115, 32, 104, 44, 102, 101, 32, 97, 115, 32, // as h,fe as + 104, 116, 109, 108, 44, 77, 32, 97, 115, 32, 114, 101, // html,M as re + 110, 100, 101, 114, 44, 100, 32, 97, 115, 32, 67, 111, // nder,d as Co + 109, 112, 111, 110, 101, 110, 116, 44, 70, 32, 97, 115, // mponent,F as + 32, 99, 114, 101, 97, 116, 101, 67, 111, 110, 116, 101, // createConte + 120, 116, 44, 71, 32, 97, 115, 32, 117, 115, 101, 83, // xt,G as useS + 116, 97, 116, 101, 44, 122, 32, 97, 115, 32, 117, 115, // tate,z as us + 101, 82, 101, 100, 117, 99, 101, 114, 44, 74, 32, 97, // eReducer,J a + 115, 32, 117, 115, 101, 69, 102, 102, 101, 99, 116, 44, // s useEffect, + 75, 32, 97, 115, 32, 117, 115, 101, 76, 97, 121, 111, // K as useLayo + 117, 116, 69, 102, 102, 101, 99, 116, 44, 81, 32, 97, // utEffect,Q a + 115, 32, 117, 115, 101, 82, 101, 102, 44, 88, 32, 97, // s useRef,X a + 115, 32, 117, 115, 101, 73, 109, 112, 101, 114, 97, 116, // s useImperat + 105, 118, 101, 72, 97, 110, 100, 108, 101, 44, 89, 32, // iveHandle,Y + 97, 115, 32, 117, 115, 101, 77, 101, 109, 111, 44, 90, // as useMemo,Z + 32, 97, 115, 32, 117, 115, 101, 67, 97, 108, 108, 98, // as useCallb + 97, 99, 107, 44, 101, 101, 32, 97, 115, 32, 117, 115, // ack,ee as us + 101, 67, 111, 110, 116, 101, 120, 116, 44, 110, 101, 32, // eContext,ne + 97, 115, 32, 117, 115, 101, 68, 101, 98, 117, 103, 86, // as useDebugV + 97, 108, 117, 101, 44, 95, 101, 32, 97, 115, 32, 117, // alue,_e as u + 115, 101, 69, 114, 114, 111, 114, 66, 111, 117, 110, 100, // seErrorBound + 97, 114, 121, 125, 59, 10, 0 // ary};. +}; static const unsigned char v4[] = { + 42, 32, 123, 32, 98, 111, 120, 45, 115, 105, 122, 105, // * { box-sizi + 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, // ng: border-b + 111, 120, 59, 32, 125, 10, 104, 116, 109, 108, 44, 32, // ox; }.html, + 98, 111, 100, 121, 32, 123, 32, 109, 97, 114, 103, 105, // body { margi + 110, 58, 32, 48, 59, 32, 112, 97, 100, 100, 105, 110, // n: 0; paddin + 103, 58, 32, 48, 59, 32, 104, 101, 105, 103, 104, 116, // g: 0; height + 58, 32, 49, 48, 48, 37, 59, 32, 102, 111, 110, 116, // : 100%; font + 58, 32, 49, 54, 112, 120, 32, 115, 97, 110, 115, 45, // : 16px sans- + 115, 101, 114, 105, 102, 59, 32, 125, 10, 115, 101, 108, // serif; }.sel + 101, 99, 116, 44, 32, 105, 110, 112, 117, 116, 44, 32, // ect, input, + 108, 97, 98, 101, 108, 58, 58, 98, 101, 102, 111, 114, // label::befor + 101, 44, 32, 116, 101, 120, 116, 97, 114, 101, 97, 32, // e, textarea + 123, 32, 111, 117, 116, 108, 105, 110, 101, 58, 32, 110, // { outline: n + 111, 110, 101, 59, 32, 98, 111, 120, 45, 115, 104, 97, // one; box-sha + 100, 111, 119, 58, 110, 111, 110, 101, 32, 33, 105, 109, // dow:none !im + 112, 111, 114, 116, 97, 110, 116, 59, 32, 98, 111, 114, // portant; bor + 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, // der: 1px sol + 105, 100, 32, 35, 99, 99, 99, 32, 33, 105, 109, 112, // id #ccc !imp + 111, 114, 116, 97, 110, 116, 59, 32, 125, 10, 99, 111, // ortant; }.co + 100, 101, 44, 32, 112, 114, 101, 32, 123, 32, 99, 111, // de, pre { co + 108, 111, 114, 58, 32, 35, 51, 55, 51, 59, 32, 102, // lor: #373; f + 111, 110, 116, 45, 102, 97, 109, 105, 108, 121, 58, 32, // ont-family: + 109, 111, 110, 111, 115, 112, 97, 99, 101, 59, 32, 102, // monospace; f + 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, 32, // ont-weight: + 98, 111, 108, 100, 101, 114, 59, 32, 102, 111, 110, 116, // bolder; font + 45, 115, 105, 122, 101, 58, 32, 115, 109, 97, 108, 108, // -size: small + 101, 114, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // er; backgrou + 110, 100, 58, 32, 35, 100, 100, 100, 59, 32, 112, 97, // nd: #ddd; pa + 100, 100, 105, 110, 103, 58, 32, 48, 46, 49, 101, 109, // dding: 0.1em + 32, 48, 46, 51, 101, 109, 59, 32, 98, 111, 114, 100, // 0.3em; bord + 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0 + 46, 50, 101, 109, 59, 32, 125, 10, 116, 101, 120, 116, // .2em; }.text + 97, 114, 101, 97, 44, 32, 105, 110, 112, 117, 116, 44, // area, input, + 32, 46, 97, 100, 100, 111, 110, 32, 123, 32, 102, 111, // .addon { fo + 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, 53, 112, // nt-size: 15p + 120, 59, 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, // x; border: 1 + 112, 120, 32, 115, 111, 108, 105, 100, 32, 35, 99, 99, // px solid #cc + 99, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // c; padding: + 48, 46, 53, 101, 109, 59, 32, 125, 10, 97, 44, 32, // 0.5em; }.a, + 97, 58, 118, 105, 115, 105, 116, 101, 100, 44, 32, 97, // a:visited, a + 58, 97, 99, 116, 105, 118, 101, 32, 123, 32, 99, 111, // :active { co + 108, 111, 114, 58, 32, 35, 53, 53, 102, 59, 32, 125, // lor: #55f; } + 10, 46, 97, 100, 100, 111, 110, 32, 123, 32, 98, 97, // ..addon { ba + 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, 101, // ckground: #e + 101, 101, 59, 32, 32, 109, 105, 110, 45, 119, 105, 100, // ee; min-wid + 116, 104, 58, 32, 57, 101, 109, 59, 125, 10, 46, 98, // th: 9em;}..b + 116, 110, 32, 123, 10, 32, 32, 98, 97, 99, 107, 103, // tn {. backg + 114, 111, 117, 110, 100, 58, 32, 35, 99, 99, 99, 59, // round: #ccc; + 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi + 117, 115, 58, 32, 48, 46, 51, 101, 109, 59, 32, 98, // us: 0.3em; b + 111, 114, 100, 101, 114, 58, 32, 48, 59, 32, 99, 111, // order: 0; co + 108, 111, 114, 58, 32, 35, 102, 102, 102, 59, 32, 99, // lor: #fff; c + 117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, // ursor: point + 101, 114, 59, 10, 32, 32, 100, 105, 115, 112, 108, 97, // er;. displa + 121, 58, 32, 105, 110, 108, 105, 110, 101, 45, 98, 108, // y: inline-bl + 111, 99, 107, 59, 32, 112, 97, 100, 100, 105, 110, 103, // ock; padding + 58, 32, 48, 46, 54, 101, 109, 32, 50, 101, 109, 59, // : 0.6em 2em; + 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, // font-weight + 58, 32, 98, 111, 108, 100, 101, 114, 59, 10, 125, 10, // : bolder;.}. + 46, 98, 116, 110, 91, 100, 105, 115, 97, 98, 108, 101, // .btn[disable + 100, 93, 32, 123, 32, 111, 112, 97, 99, 105, 116, 121, // d] { opacity + 58, 32, 48, 46, 53, 59, 32, 99, 117, 114, 115, 111, // : 0.5; curso + 114, 58, 32, 97, 117, 116, 111, 59, 125, 10, 46, 115, // r: auto;}..s + 109, 111, 111, 116, 104, 32, 123, 32, 116, 114, 97, 110, // mooth { tran + 115, 105, 116, 105, 111, 110, 58, 32, 97, 108, 108, 32, // sition: all + 46, 50, 115, 59, 32, 125, 10, 46, 99, 111, 110, 116, // .2s; }..cont + 97, 105, 110, 101, 114, 32, 123, 32, 109, 97, 114, 103, // ainer { marg + 105, 110, 58, 32, 48, 32, 50, 48, 112, 120, 59, 32, // in: 0 20px; + 119, 105, 100, 116, 104, 58, 32, 97, 117, 116, 111, 59, // width: auto; + 32, 125, 10, 46, 100, 45, 102, 108, 101, 120, 32, 123, // }..d-flex { + 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 102, 108, // display: fl + 101, 120, 59, 32, 125, 10, 46, 100, 45, 110, 111, 110, // ex; }..d-non + 101, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, // e { display: + 32, 110, 111, 110, 101, 59, 32, 125, 10, 46, 98, 111, // none; }..bo + 114, 100, 101, 114, 32, 123, 32, 98, 111, 114, 100, 101, // rder { borde + 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, 100, // r: 1px solid + 32, 35, 100, 100, 100, 59, 32, 125, 10, 46, 114, 111, // #ddd; }..ro + 117, 110, 100, 101, 100, 32, 123, 32, 98, 111, 114, 100, // unded { bord + 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0 + 46, 53, 101, 109, 59, 32, 125, 10, 46, 110, 111, 119, // .5em; }..now + 114, 97, 112, 32, 123, 32, 119, 104, 105, 116, 101, 45, // rap { white- + 115, 112, 97, 99, 101, 58, 32, 110, 111, 119, 114, 97, // space: nowra + 112, 59, 32, 125, 10, 46, 109, 115, 103, 32, 123, 32, // p; }..msg { + 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, // background: + 35, 100, 101, 102, 59, 32, 98, 111, 114, 100, 101, 114, // #def; border + 45, 108, 101, 102, 116, 58, 32, 53, 112, 120, 32, 115, // -left: 5px s + 111, 108, 105, 100, 32, 35, 53, 57, 100, 59, 32, 112, // olid #59d; p + 97, 100, 100, 105, 110, 103, 58, 32, 48, 46, 53, 101, // adding: 0.5e + 109, 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, // m; font-size + 58, 32, 57, 48, 37, 59, 32, 109, 97, 114, 103, 105, // : 90%; margi + 110, 58, 32, 49, 101, 109, 32, 48, 59, 32, 125, 10, // n: 1em 0; }. + 46, 115, 101, 99, 116, 105, 111, 110, 32, 123, 32, 109, // .section { m + 97, 114, 103, 105, 110, 58, 32, 48, 32, 49, 101, 109, // argin: 0 1em + 59, 32, 125, 10, 46, 116, 111, 112, 105, 99, 44, 32, // ; }..topic, + 46, 100, 97, 116, 97, 44, 32, 46, 113, 111, 115, 32, // .data, .qos + 123, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // { padding: + 48, 46, 50, 101, 109, 32, 48, 46, 53, 101, 109, 59, // 0.2em 0.5em; + 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi + 117, 115, 58, 32, 48, 46, 52, 101, 109, 59, 32, 109, // us: 0.4em; m + 97, 114, 103, 105, 110, 45, 114, 105, 103, 104, 116, 58, // argin-right: + 32, 48, 46, 53, 101, 109, 59, 32, 32, 125, 10, 46, // 0.5em; }.. + 113, 111, 115, 32, 123, 32, 98, 97, 99, 107, 103, 114, // qos { backgr + 111, 117, 110, 100, 58, 32, 35, 101, 102, 97, 59, 32, // ound: #efa; + 125, 10, 46, 116, 111, 112, 105, 99, 32, 123, 32, 98, // }..topic { b + 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, // ackground: # + 102, 101, 97, 59, 32, 125, 10, 46, 100, 97, 116, 97, // fea; }..data + 32, 123, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // { backgroun + 100, 58, 32, 35, 97, 101, 102, 59, 32, 125, 10, 10, // d: #aef; }.. + 47, 42, 32, 71, 114, 105, 100, 32, 42, 47, 10, 46, // /* Grid */.. + 114, 111, 119, 32, 123, 32, 100, 105, 115, 112, 108, 97, // row { displa + 121, 58, 32, 102, 108, 101, 120, 59, 32, 102, 108, 101, // y: flex; fle + 120, 45, 119, 114, 97, 112, 58, 32, 119, 114, 97, 112, // x-wrap: wrap + 59, 32, 125, 10, 46, 99, 111, 108, 32, 123, 32, 109, // ; }..col { m + 97, 114, 103, 105, 110, 58, 32, 48, 59, 32, 112, 97, // argin: 0; pa + 100, 100, 105, 110, 103, 58, 32, 48, 59, 32, 111, 118, // dding: 0; ov + 101, 114, 102, 108, 111, 119, 58, 32, 97, 117, 116, 111, // erflow: auto + 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 50, 32, // ; }..col-12 + 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100 + 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 49, // %; }..col-11 + 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 57, 49, // { width: 91 + 46, 54, 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, // .66%; }..col + 45, 49, 48, 32, 123, 32, 119, 105, 100, 116, 104, 58, // -10 { width: + 32, 56, 51, 46, 51, 51, 37, 59, 32, 125, 10, 46, // 83.33%; }.. + 99, 111, 108, 45, 57, 32, 123, 32, 119, 105, 100, 116, // col-9 { widt + 104, 58, 32, 55, 53, 37, 59, 32, 125, 10, 46, 99, // h: 75%; }..c + 111, 108, 45, 56, 32, 123, 32, 119, 105, 100, 116, 104, // ol-8 { width + 58, 32, 54, 54, 46, 54, 54, 37, 59, 32, 125, 10, // : 66.66%; }. + 46, 99, 111, 108, 45, 55, 32, 123, 32, 119, 105, 100, // .col-7 { wid + 116, 104, 58, 32, 53, 56, 46, 51, 51, 37, 59, 32, // th: 58.33%; + 125, 10, 46, 99, 111, 108, 45, 54, 32, 123, 32, 119, // }..col-6 { w + 105, 100, 116, 104, 58, 32, 53, 48, 37, 59, 32, 125, // idth: 50%; } + 10, 46, 99, 111, 108, 45, 53, 32, 123, 32, 119, 105, // ..col-5 { wi + 100, 116, 104, 58, 32, 52, 49, 46, 54, 54, 37, 59, // dth: 41.66%; + 32, 125, 10, 46, 99, 111, 108, 45, 52, 32, 123, 32, // }..col-4 { + 119, 105, 100, 116, 104, 58, 32, 51, 51, 46, 51, 51, // width: 33.33 + 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 51, 32, // %; }..col-3 + 123, 32, 119, 105, 100, 116, 104, 58, 32, 50, 53, 37, // { width: 25% + 59, 32, 125, 10, 46, 99, 111, 108, 45, 50, 32, 123, // ; }..col-2 { + 32, 119, 105, 100, 116, 104, 58, 32, 49, 54, 46, 54, // width: 16.6 + 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, // 6%; }..col-1 + 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 56, 46, // { width: 8. + 51, 51, 37, 59, 32, 125, 10, 64, 109, 101, 100, 105, // 33%; }.@medi + 97, 32, 40, 109, 105, 110, 45, 119, 105, 100, 116, 104, // a (min-width + 58, 32, 49, 51, 49, 48, 112, 120, 41, 32, 123, 32, // : 1310px) { + 46, 99, 111, 110, 116, 97, 105, 110, 101, 114, 32, 123, // .container { + 32, 109, 97, 114, 103, 105, 110, 58, 32, 97, 117, 116, // margin: aut + 111, 59, 32, 119, 105, 100, 116, 104, 58, 32, 49, 50, // o; width: 12 + 55, 48, 112, 120, 59, 32, 125, 32, 125, 10, 64, 109, // 70px; } }.@m + 101, 100, 105, 97, 32, 40, 109, 97, 120, 45, 119, 105, // edia (max-wi + 100, 116, 104, 58, 32, 57, 50, 48, 112, 120, 41, 32, // dth: 920px) + 123, 32, 46, 114, 111, 119, 32, 46, 99, 111, 108, 32, // { .row .col + 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100 + 37, 59, 32, 125, 32, 125, 10, 0 // %; } }. +}; +static const unsigned char v5[] = { 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, // .PNG........ 73, 72, 68, 82, 0, 0, 0, 128, 0, 0, 0, 128, // IHDR........ 8, 6, 0, 0, 0, 195, 62, 97, 203, 0, 0, 0, // ......>a.... @@ -3793,195 +2811,6 @@ static const unsigned char v4[] = { 126, 121, 49, 188, 0, 0, 0, 0, 73, 69, 78, 68, // ~y1.....IEND 174, 66, 96, 130, 0 // .B`. }; -static const unsigned char v5[] = { - 42, 32, 123, 32, 98, 111, 120, 45, 115, 105, 122, 105, // * { box-sizi - 110, 103, 58, 32, 98, 111, 114, 100, 101, 114, 45, 98, // ng: border-b - 111, 120, 59, 32, 125, 10, 104, 116, 109, 108, 44, 32, // ox; }.html, - 98, 111, 100, 121, 32, 123, 32, 109, 97, 114, 103, 105, // body { margi - 110, 58, 32, 48, 59, 32, 112, 97, 100, 100, 105, 110, // n: 0; paddin - 103, 58, 32, 48, 59, 32, 104, 101, 105, 103, 104, 116, // g: 0; height - 58, 32, 49, 48, 48, 37, 59, 32, 102, 111, 110, 116, // : 100%; font - 58, 32, 49, 54, 112, 120, 32, 115, 97, 110, 115, 45, // : 16px sans- - 115, 101, 114, 105, 102, 59, 32, 125, 10, 115, 101, 108, // serif; }.sel - 101, 99, 116, 44, 32, 105, 110, 112, 117, 116, 44, 32, // ect, input, - 108, 97, 98, 101, 108, 58, 58, 98, 101, 102, 111, 114, // label::befor - 101, 44, 32, 116, 101, 120, 116, 97, 114, 101, 97, 32, // e, textarea - 123, 32, 111, 117, 116, 108, 105, 110, 101, 58, 32, 110, // { outline: n - 111, 110, 101, 59, 32, 98, 111, 120, 45, 115, 104, 97, // one; box-sha - 100, 111, 119, 58, 110, 111, 110, 101, 32, 33, 105, 109, // dow:none !im - 112, 111, 114, 116, 97, 110, 116, 59, 32, 98, 111, 114, // portant; bor - 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, // der: 1px sol - 105, 100, 32, 35, 99, 99, 99, 32, 33, 105, 109, 112, // id #ccc !imp - 111, 114, 116, 97, 110, 116, 59, 32, 125, 10, 99, 111, // ortant; }.co - 100, 101, 44, 32, 112, 114, 101, 32, 123, 32, 99, 111, // de, pre { co - 108, 111, 114, 58, 32, 35, 51, 55, 51, 59, 32, 102, // lor: #373; f - 111, 110, 116, 45, 102, 97, 109, 105, 108, 121, 58, 32, // ont-family: - 109, 111, 110, 111, 115, 112, 97, 99, 101, 59, 32, 102, // monospace; f - 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, 32, // ont-weight: - 98, 111, 108, 100, 101, 114, 59, 32, 102, 111, 110, 116, // bolder; font - 45, 115, 105, 122, 101, 58, 32, 115, 109, 97, 108, 108, // -size: small - 101, 114, 59, 32, 98, 97, 99, 107, 103, 114, 111, 117, // er; backgrou - 110, 100, 58, 32, 35, 100, 100, 100, 59, 32, 112, 97, // nd: #ddd; pa - 100, 100, 105, 110, 103, 58, 32, 48, 46, 49, 101, 109, // dding: 0.1em - 32, 48, 46, 51, 101, 109, 59, 32, 98, 111, 114, 100, // 0.3em; bord - 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0 - 46, 50, 101, 109, 59, 32, 125, 10, 116, 101, 120, 116, // .2em; }.text - 97, 114, 101, 97, 44, 32, 105, 110, 112, 117, 116, 44, // area, input, - 32, 46, 97, 100, 100, 111, 110, 32, 123, 32, 102, 111, // .addon { fo - 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, 53, 112, // nt-size: 15p - 120, 59, 32, 98, 111, 114, 100, 101, 114, 58, 32, 49, // x; border: 1 - 112, 120, 32, 115, 111, 108, 105, 100, 32, 35, 99, 99, // px solid #cc - 99, 59, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // c; padding: - 48, 46, 53, 101, 109, 59, 32, 125, 10, 97, 44, 32, // 0.5em; }.a, - 97, 58, 118, 105, 115, 105, 116, 101, 100, 44, 32, 97, // a:visited, a - 58, 97, 99, 116, 105, 118, 101, 32, 123, 32, 99, 111, // :active { co - 108, 111, 114, 58, 32, 35, 53, 53, 102, 59, 32, 125, // lor: #55f; } - 10, 46, 97, 100, 100, 111, 110, 32, 123, 32, 98, 97, // ..addon { ba - 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, 101, // ckground: #e - 101, 101, 59, 32, 32, 109, 105, 110, 45, 119, 105, 100, // ee; min-wid - 116, 104, 58, 32, 57, 101, 109, 59, 125, 10, 46, 98, // th: 9em;}..b - 116, 110, 32, 123, 10, 32, 32, 98, 97, 99, 107, 103, // tn {. backg - 114, 111, 117, 110, 100, 58, 32, 35, 99, 99, 99, 59, // round: #ccc; - 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi - 117, 115, 58, 32, 48, 46, 51, 101, 109, 59, 32, 98, // us: 0.3em; b - 111, 114, 100, 101, 114, 58, 32, 48, 59, 32, 99, 111, // order: 0; co - 108, 111, 114, 58, 32, 35, 102, 102, 102, 59, 32, 99, // lor: #fff; c - 117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, // ursor: point - 101, 114, 59, 10, 32, 32, 100, 105, 115, 112, 108, 97, // er;. displa - 121, 58, 32, 105, 110, 108, 105, 110, 101, 45, 98, 108, // y: inline-bl - 111, 99, 107, 59, 32, 112, 97, 100, 100, 105, 110, 103, // ock; padding - 58, 32, 48, 46, 54, 101, 109, 32, 50, 101, 109, 59, // : 0.6em 2em; - 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, // font-weight - 58, 32, 98, 111, 108, 100, 101, 114, 59, 10, 125, 10, // : bolder;.}. - 46, 98, 116, 110, 91, 100, 105, 115, 97, 98, 108, 101, // .btn[disable - 100, 93, 32, 123, 32, 111, 112, 97, 99, 105, 116, 121, // d] { opacity - 58, 32, 48, 46, 53, 59, 32, 99, 117, 114, 115, 111, // : 0.5; curso - 114, 58, 32, 97, 117, 116, 111, 59, 125, 10, 46, 115, // r: auto;}..s - 109, 111, 111, 116, 104, 32, 123, 32, 116, 114, 97, 110, // mooth { tran - 115, 105, 116, 105, 111, 110, 58, 32, 97, 108, 108, 32, // sition: all - 46, 50, 115, 59, 32, 125, 10, 46, 99, 111, 110, 116, // .2s; }..cont - 97, 105, 110, 101, 114, 32, 123, 32, 109, 97, 114, 103, // ainer { marg - 105, 110, 58, 32, 48, 32, 50, 48, 112, 120, 59, 32, // in: 0 20px; - 119, 105, 100, 116, 104, 58, 32, 97, 117, 116, 111, 59, // width: auto; - 32, 125, 10, 46, 100, 45, 102, 108, 101, 120, 32, 123, // }..d-flex { - 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 102, 108, // display: fl - 101, 120, 59, 32, 125, 10, 46, 100, 45, 110, 111, 110, // ex; }..d-non - 101, 32, 123, 32, 100, 105, 115, 112, 108, 97, 121, 58, // e { display: - 32, 110, 111, 110, 101, 59, 32, 125, 10, 46, 98, 111, // none; }..bo - 114, 100, 101, 114, 32, 123, 32, 98, 111, 114, 100, 101, // rder { borde - 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, 100, // r: 1px solid - 32, 35, 100, 100, 100, 59, 32, 125, 10, 46, 114, 111, // #ddd; }..ro - 117, 110, 100, 101, 100, 32, 123, 32, 98, 111, 114, 100, // unded { bord - 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 48, // er-radius: 0 - 46, 53, 101, 109, 59, 32, 125, 10, 46, 110, 111, 119, // .5em; }..now - 114, 97, 112, 32, 123, 32, 119, 104, 105, 116, 101, 45, // rap { white- - 115, 112, 97, 99, 101, 58, 32, 110, 111, 119, 114, 97, // space: nowra - 112, 59, 32, 125, 10, 46, 109, 115, 103, 32, 123, 32, // p; }..msg { - 98, 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, // background: - 35, 100, 101, 102, 59, 32, 98, 111, 114, 100, 101, 114, // #def; border - 45, 108, 101, 102, 116, 58, 32, 53, 112, 120, 32, 115, // -left: 5px s - 111, 108, 105, 100, 32, 35, 53, 57, 100, 59, 32, 112, // olid #59d; p - 97, 100, 100, 105, 110, 103, 58, 32, 48, 46, 53, 101, // adding: 0.5e - 109, 59, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, // m; font-size - 58, 32, 57, 48, 37, 59, 32, 109, 97, 114, 103, 105, // : 90%; margi - 110, 58, 32, 49, 101, 109, 32, 48, 59, 32, 125, 10, // n: 1em 0; }. - 46, 115, 101, 99, 116, 105, 111, 110, 32, 123, 32, 109, // .section { m - 97, 114, 103, 105, 110, 58, 32, 48, 32, 49, 101, 109, // argin: 0 1em - 59, 32, 125, 10, 46, 116, 111, 112, 105, 99, 44, 32, // ; }..topic, - 46, 100, 97, 116, 97, 44, 32, 46, 113, 111, 115, 32, // .data, .qos - 123, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, // { padding: - 48, 46, 50, 101, 109, 32, 48, 46, 53, 101, 109, 59, // 0.2em 0.5em; - 32, 98, 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, // border-radi - 117, 115, 58, 32, 48, 46, 52, 101, 109, 59, 32, 109, // us: 0.4em; m - 97, 114, 103, 105, 110, 45, 114, 105, 103, 104, 116, 58, // argin-right: - 32, 48, 46, 53, 101, 109, 59, 32, 32, 125, 10, 46, // 0.5em; }.. - 113, 111, 115, 32, 123, 32, 98, 97, 99, 107, 103, 114, // qos { backgr - 111, 117, 110, 100, 58, 32, 35, 101, 102, 97, 59, 32, // ound: #efa; - 125, 10, 46, 116, 111, 112, 105, 99, 32, 123, 32, 98, // }..topic { b - 97, 99, 107, 103, 114, 111, 117, 110, 100, 58, 32, 35, // ackground: # - 102, 101, 97, 59, 32, 125, 10, 46, 100, 97, 116, 97, // fea; }..data - 32, 123, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // { backgroun - 100, 58, 32, 35, 97, 101, 102, 59, 32, 125, 10, 10, // d: #aef; }.. - 47, 42, 32, 71, 114, 105, 100, 32, 42, 47, 10, 46, // /* Grid */.. - 114, 111, 119, 32, 123, 32, 100, 105, 115, 112, 108, 97, // row { displa - 121, 58, 32, 102, 108, 101, 120, 59, 32, 102, 108, 101, // y: flex; fle - 120, 45, 119, 114, 97, 112, 58, 32, 119, 114, 97, 112, // x-wrap: wrap - 59, 32, 125, 10, 46, 99, 111, 108, 32, 123, 32, 109, // ; }..col { m - 97, 114, 103, 105, 110, 58, 32, 48, 59, 32, 112, 97, // argin: 0; pa - 100, 100, 105, 110, 103, 58, 32, 48, 59, 32, 111, 118, // dding: 0; ov - 101, 114, 102, 108, 111, 119, 58, 32, 97, 117, 116, 111, // erflow: auto - 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 50, 32, // ; }..col-12 - 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100 - 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, 49, // %; }..col-11 - 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 57, 49, // { width: 91 - 46, 54, 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, // .66%; }..col - 45, 49, 48, 32, 123, 32, 119, 105, 100, 116, 104, 58, // -10 { width: - 32, 56, 51, 46, 51, 51, 37, 59, 32, 125, 10, 46, // 83.33%; }.. - 99, 111, 108, 45, 57, 32, 123, 32, 119, 105, 100, 116, // col-9 { widt - 104, 58, 32, 55, 53, 37, 59, 32, 125, 10, 46, 99, // h: 75%; }..c - 111, 108, 45, 56, 32, 123, 32, 119, 105, 100, 116, 104, // ol-8 { width - 58, 32, 54, 54, 46, 54, 54, 37, 59, 32, 125, 10, // : 66.66%; }. - 46, 99, 111, 108, 45, 55, 32, 123, 32, 119, 105, 100, // .col-7 { wid - 116, 104, 58, 32, 53, 56, 46, 51, 51, 37, 59, 32, // th: 58.33%; - 125, 10, 46, 99, 111, 108, 45, 54, 32, 123, 32, 119, // }..col-6 { w - 105, 100, 116, 104, 58, 32, 53, 48, 37, 59, 32, 125, // idth: 50%; } - 10, 46, 99, 111, 108, 45, 53, 32, 123, 32, 119, 105, // ..col-5 { wi - 100, 116, 104, 58, 32, 52, 49, 46, 54, 54, 37, 59, // dth: 41.66%; - 32, 125, 10, 46, 99, 111, 108, 45, 52, 32, 123, 32, // }..col-4 { - 119, 105, 100, 116, 104, 58, 32, 51, 51, 46, 51, 51, // width: 33.33 - 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 51, 32, // %; }..col-3 - 123, 32, 119, 105, 100, 116, 104, 58, 32, 50, 53, 37, // { width: 25% - 59, 32, 125, 10, 46, 99, 111, 108, 45, 50, 32, 123, // ; }..col-2 { - 32, 119, 105, 100, 116, 104, 58, 32, 49, 54, 46, 54, // width: 16.6 - 54, 37, 59, 32, 125, 10, 46, 99, 111, 108, 45, 49, // 6%; }..col-1 - 32, 123, 32, 119, 105, 100, 116, 104, 58, 32, 56, 46, // { width: 8. - 51, 51, 37, 59, 32, 125, 10, 64, 109, 101, 100, 105, // 33%; }.@medi - 97, 32, 40, 109, 105, 110, 45, 119, 105, 100, 116, 104, // a (min-width - 58, 32, 49, 51, 49, 48, 112, 120, 41, 32, 123, 32, // : 1310px) { - 46, 99, 111, 110, 116, 97, 105, 110, 101, 114, 32, 123, // .container { - 32, 109, 97, 114, 103, 105, 110, 58, 32, 97, 117, 116, // margin: aut - 111, 59, 32, 119, 105, 100, 116, 104, 58, 32, 49, 50, // o; width: 12 - 55, 48, 112, 120, 59, 32, 125, 32, 125, 10, 64, 109, // 70px; } }.@m - 101, 100, 105, 97, 32, 40, 109, 97, 120, 45, 119, 105, // edia (max-wi - 100, 116, 104, 58, 32, 57, 50, 48, 112, 120, 41, 32, // dth: 920px) - 123, 32, 46, 114, 111, 119, 32, 46, 99, 111, 108, 32, // { .row .col - 123, 32, 119, 105, 100, 116, 104, 58, 32, 49, 48, 48, // { width: 100 - 37, 59, 32, 125, 32, 125, 10, 0 // %; } }. -}; -static const unsigned char v6[] = { - 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, // .. < - 104, 101, 97, 100, 62, 10, 32, 32, 32, 32, 60, 116, // head>. Device - 68, 97, 115, 104, 98, 111, 97, 114, 100, 60, 47, 116, // Dashboard. . - 32, 32, 32, 60, 109, 101, 116, 97, 32, 104, 116, 116, // . - 32, 32, 32, 60, 109, 101, 116, 97, 32, 110, 97, 109, // . . - 10, 32, 32, 60, 98, 111, 100, 121, 62, 60, 47, 98, // . . . - 10, 0 // . -}; static const struct packed_file { const char *name; @@ -3989,12 +2818,11 @@ static const struct packed_file { size_t size; time_t mtime; } packed_files[] = { - {"/web_root/main.js.orig", v1, sizeof(v1), 1656079031}, - {"/web_root/preact.min.js", v2, sizeof(v2), 1655487950}, - {"/web_root/main.js", v3, sizeof(v3), 1663771957}, - {"/web_root/user.png", v4, sizeof(v4), 1655487950}, - {"/web_root/style.css", v5, sizeof(v5), 1655487950}, - {"/web_root/index.html", v6, sizeof(v6), 1655487950}, + {"/web_root/index.html", v1, sizeof(v1), 1659483223}, + {"/web_root/main.js", v2, sizeof(v2), 1662621376}, + {"/web_root/preact.min.js", v3, sizeof(v3), 1659483223}, + {"/web_root/style.css", v4, sizeof(v4), 1659483223}, + {"/web_root/user.png", v5, sizeof(v5), 1659483223}, {NULL, NULL, 0, 0} }; diff --git a/mip/mip.c b/mip/mip.c index 37723361..eb6a2540 100644 --- a/mip/mip.c +++ b/mip/mip.c @@ -296,6 +296,13 @@ static void arp_cache_add(struct mip_if *ifp, uint32_t ip, uint8_t mac[6]) { mac[0], mac[1], mac[2], mac[3], mac[4], mac[5])); } +static size_t ether_output(struct mip_if *ifp, size_t len) { + // size_t min = 64; // Pad short frames to 64 bytes (minimum Ethernet size) + // if (len < min) memset(ifp->tx.buf + len, 0, min - len), len = min; + // mg_hexdump(ifp->tx.buf, len); + return ifp->driver->tx(ifp->tx.buf, len, ifp->driver_data); +} + static void arp_ask(struct mip_if *ifp, uint32_t ip) { struct eth *eth = (struct eth *) ifp->tx.buf; struct arp *arp = (struct arp *) (eth + 1); @@ -307,7 +314,7 @@ static void arp_ask(struct mip_if *ifp, uint32_t ip) { arp->plen = 4; arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip; memcpy(arp->sha, ifp->mac, sizeof(arp->sha)); - ifp->driver->tx(eth, PDIFF(eth, arp + 1), ifp->driver_data); + ether_output(ifp, PDIFF(eth, arp + 1)); } static size_t mg_print_ipv4(mg_pfn_t fn, void *fn_data, va_list *ap) { @@ -333,11 +340,12 @@ static struct ip *tx_ip(struct mip_if *ifp, uint8_t proto, uint32_t ip_src, uint32_t ip_dst, size_t plen) { struct eth *eth = (struct eth *) ifp->tx.buf; struct ip *ip = (struct ip *) (eth + 1); - uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ? - if (!mac) mac = arp_cache_find(ifp, ifp->gw); // No, use gateway - if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it - if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast - memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup + uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ? + if (!mac && (ip_dst & ifp->mask)) arp_ask(ifp, ip_dst); // Same net, lookup + if (!mac) mac = arp_cache_find(ifp, ifp->gw); // Use gateway MAC + if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it + if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast + memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup eth->type = mg_htons(0x800); memset(ip, 0, sizeof(*ip)); ip->ver = 0x45; // Version 4, header length 5 words @@ -369,24 +377,11 @@ static void tx_udp(struct mip_if *ifp, uint32_t ip_src, uint16_t sport, udp->csum = csumfin(cs); memmove(udp + 1, buf, len); // MG_DEBUG(("UDP LEN %d %d", (int) len, (int) ifp->frame_len)); - ifp->driver->tx(ifp->tx.buf, - sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len, - ifp->driver_data); + ether_output(ifp, sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len); } static void tx_dhcp(struct mip_if *ifp, uint32_t src, uint32_t dst, uint8_t *opts, size_t optslen) { -#if 0 -struct dhcp { - uint8_t op, htype, hlen, hops; - uint32_t xid; - uint16_t secs, flags; - uint32_t ciaddr, yiaddr, siaddr, giaddr; - uint8_t hwaddr[208]; - uint32_t magic; - uint8_t options[32]; -}; -#endif struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}}; dhcp.magic = mg_htonl(0x63825363); memcpy(&dhcp.hwaddr, ifp->mac, sizeof(ifp->mac)); @@ -435,7 +430,7 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) { arp->tpa = pkt->arp->spa; arp->spa = ifp->ip; MG_DEBUG(("ARP response: we're %#lx", (long) mg_ntohl(ifp->ip))); - ifp->driver->tx(ifp->tx.buf, PDIFF(eth, arp + 1), ifp->driver_data); + ether_output(ifp, PDIFF(eth, arp + 1)); } else if (pkt->arp->op == mg_htons(2)) { if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return; // MG_INFO(("ARP RESPONSE")); @@ -446,15 +441,16 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) { static void rx_icmp(struct mip_if *ifp, struct pkt *pkt) { // MG_DEBUG(("ICMP %d", (int) len)); if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) { - struct ip *ip = tx_ip(ifp, 1, ifp->ip, pkt->ip->src, - sizeof(struct icmp) + pkt->pay.len); + size_t hlen = sizeof(struct eth) + sizeof(struct ip) + sizeof(struct icmp); + size_t space = ifp->tx.len - hlen, plen = pkt->pay.len; + if (plen > space) plen = space; + struct ip *ip = + tx_ip(ifp, 1, ifp->ip, pkt->ip->src, sizeof(struct icmp) + plen); struct icmp *icmp = (struct icmp *) (ip + 1); - size_t len = PDIFF(ifp->tx.buf, icmp + 1), left = ifp->tx.len - len; - if (left > pkt->pay.len) left = pkt->pay.len; // Don't overflow TX - memset(icmp, 0, sizeof(*icmp)); // Set csum to 0 - memcpy(icmp + 1, pkt->pay.buf, left); // Copy RX payload to TX - icmp->csum = ipcsum(icmp, sizeof(*icmp) + left); - ifp->driver->tx(ifp->tx.buf, len + left, ifp->driver_data); + memset(icmp, 0, sizeof(*icmp)); // Set csum to 0 + memcpy(icmp + 1, pkt->pay.buf, plen); // Copy RX payload to TX + icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen); + ether_output(ifp, hlen + plen); } } @@ -538,8 +534,7 @@ static size_t tx_tcp(struct mip_if *ifp, uint32_t dst_ip, uint8_t flags, cs = csumup(cs, &ip->dst, sizeof(ip->dst)); cs = csumup(cs, pseudo, sizeof(pseudo)); tcp->csum = csumfin(cs); - return ifp->driver->tx(ifp->tx.buf, PDIFF(ifp->tx.buf, tcp + 1) + len, - ifp->driver_data); + return ether_output(ifp, PDIFF(ifp->tx.buf, tcp + 1) + len); } static size_t tx_tcp_pkt(struct mip_if *ifp, struct pkt *pkt, uint8_t flags, @@ -608,16 +603,17 @@ long mg_io_recv(struct mg_connection *c, void *buf, size_t len) { static void read_conn(struct mg_connection *c, struct pkt *pkt) { struct connstate *s = (struct connstate *) (c + 1); struct mg_iobuf *io = c->is_tls ? &s->raw : &c->recv; + uint32_t seq = mg_ntohl(pkt->tcp->seq); s->raw.align = c->recv.align; if (pkt->tcp->flags & TH_FIN) { s->ack = mg_htonl(pkt->tcp->seq) + 1, s->seq = mg_htonl(pkt->tcp->ack); c->is_closing = 1; } else if (pkt->pay.len == 0) { // TODO(cpq): handle this peer's ACK - } else if (mg_ntohl(pkt->tcp->seq) != s->ack) { + } else if (seq != s->ack) { // TODO(cpq): peer sent us SEQ which we don't expect. Retransmit rather // than close this connection - mg_error(c, "SEQ != ACK: %x %x", mg_ntohl(pkt->tcp->seq), s->ack); + mg_error(c, "SEQ != ACK: %x %x", seq, s->ack); } else if (io->size - io->len < pkt->pay.len && !mg_iobuf_resize(io, io->len + pkt->pay.len)) { mg_error(c, "oom"); @@ -629,9 +625,18 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) { // call back mg_io_recv() which grabs raw data from s->raw memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len); io->len += pkt->pay.len; - // Advance ACK counter and setup a timer to send an ACK back + + MG_DEBUG(("%lu SEQ %x -> %x", c->id, mg_htonl(pkt->tcp->seq), s->ack)); s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len); +#if 1 + // Send ACK immediately + MG_DEBUG((" imm ACK", c->id, mg_htonl(pkt->tcp->seq), s->ack)); + tx_tcp((struct mip_if *) c->mgr->priv, c->rem.ip, TH_ACK, c->loc.port, + c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0); +#else + // Advance ACK counter and setup a timer to send an ACK back settmout(c, MIP_TTYPE_ACK); +#endif if (c->is_tls) { // TLS connection. Make room for decrypted data in c->recv @@ -699,7 +704,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) { } static void rx_ip(struct mip_if *ifp, struct pkt *pkt) { - // MG_DEBUG(("IP %d", (int) pkt->pay.len)); + // MG_DEBUG(("IP %d", (int) pkt->pay.len)); if (pkt->ip->proto == 1) { pkt->icmp = (struct icmp *) (pkt->ip + 1); if (pkt->pay.len < sizeof(*pkt->icmp)) return; @@ -771,6 +776,10 @@ static void mip_rx(struct mip_if *ifp, void *buf, size_t len) { pkt.ip = (struct ip *) (pkt.eth + 1); if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return; // Truncated if ((pkt.ip->ver >> 4) != 4) return; // Not IP + // Truncate frame to what IP header tells us + if ((size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth) < pkt.raw.len) { + pkt.raw.len = (size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth); + } mkpay(&pkt, pkt.ip + 1); rx_ip(ifp, &pkt); } else { @@ -823,7 +832,7 @@ static void mip_poll(struct mip_if *ifp, uint64_t uptime_ms) { struct connstate *s = (struct connstate *) (c + 1); if (uptime_ms > s->timer) { if (s->ttype == MIP_TTYPE_ACK) { - MG_DEBUG(("%lu ack", c->id)); + MG_DEBUG(("%lu ack %x %x", c->id, s->seq, s->ack)); tx_tcp(ifp, c->rem.ip, TH_ACK, c->loc.port, c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0); } else { diff --git a/mongoose.c b/mongoose.c index 5c567a62..1ebd29c9 100644 --- a/mongoose.c +++ b/mongoose.c @@ -6608,6 +6608,13 @@ static void arp_cache_add(struct mip_if *ifp, uint32_t ip, uint8_t mac[6]) { mac[0], mac[1], mac[2], mac[3], mac[4], mac[5])); } +static size_t ether_output(struct mip_if *ifp, size_t len) { + // size_t min = 64; // Pad short frames to 64 bytes (minimum Ethernet size) + // if (len < min) memset(ifp->tx.buf + len, 0, min - len), len = min; + // mg_hexdump(ifp->tx.buf, len); + return ifp->driver->tx(ifp->tx.buf, len, ifp->driver_data); +} + static void arp_ask(struct mip_if *ifp, uint32_t ip) { struct eth *eth = (struct eth *) ifp->tx.buf; struct arp *arp = (struct arp *) (eth + 1); @@ -6619,7 +6626,7 @@ static void arp_ask(struct mip_if *ifp, uint32_t ip) { arp->plen = 4; arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip; memcpy(arp->sha, ifp->mac, sizeof(arp->sha)); - ifp->driver->tx(eth, PDIFF(eth, arp + 1), ifp->driver_data); + ether_output(ifp, PDIFF(eth, arp + 1)); } static size_t mg_print_ipv4(mg_pfn_t fn, void *fn_data, va_list *ap) { @@ -6645,11 +6652,12 @@ static struct ip *tx_ip(struct mip_if *ifp, uint8_t proto, uint32_t ip_src, uint32_t ip_dst, size_t plen) { struct eth *eth = (struct eth *) ifp->tx.buf; struct ip *ip = (struct ip *) (eth + 1); - uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ? - if (!mac) mac = arp_cache_find(ifp, ifp->gw); // No, use gateway - if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it - if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast - memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup + uint8_t *mac = arp_cache_find(ifp, ip_dst); // Dst IP in ARP cache ? + if (!mac && (ip_dst & ifp->mask)) arp_ask(ifp, ip_dst); // Same net, lookup + if (!mac) mac = arp_cache_find(ifp, ifp->gw); // Use gateway MAC + if (mac) memcpy(eth->dst, mac, sizeof(eth->dst)); // Found? Use it + if (!mac) memset(eth->dst, 255, sizeof(eth->dst)); // No? Use broadcast + memcpy(eth->src, ifp->mac, sizeof(eth->src)); // TODO(cpq): ARP lookup eth->type = mg_htons(0x800); memset(ip, 0, sizeof(*ip)); ip->ver = 0x45; // Version 4, header length 5 words @@ -6681,24 +6689,11 @@ static void tx_udp(struct mip_if *ifp, uint32_t ip_src, uint16_t sport, udp->csum = csumfin(cs); memmove(udp + 1, buf, len); // MG_DEBUG(("UDP LEN %d %d", (int) len, (int) ifp->frame_len)); - ifp->driver->tx(ifp->tx.buf, - sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len, - ifp->driver_data); + ether_output(ifp, sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len); } static void tx_dhcp(struct mip_if *ifp, uint32_t src, uint32_t dst, uint8_t *opts, size_t optslen) { -#if 0 -struct dhcp { - uint8_t op, htype, hlen, hops; - uint32_t xid; - uint16_t secs, flags; - uint32_t ciaddr, yiaddr, siaddr, giaddr; - uint8_t hwaddr[208]; - uint32_t magic; - uint8_t options[32]; -}; -#endif struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}}; dhcp.magic = mg_htonl(0x63825363); memcpy(&dhcp.hwaddr, ifp->mac, sizeof(ifp->mac)); @@ -6747,7 +6742,7 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) { arp->tpa = pkt->arp->spa; arp->spa = ifp->ip; MG_DEBUG(("ARP response: we're %#lx", (long) mg_ntohl(ifp->ip))); - ifp->driver->tx(ifp->tx.buf, PDIFF(eth, arp + 1), ifp->driver_data); + ether_output(ifp, PDIFF(eth, arp + 1)); } else if (pkt->arp->op == mg_htons(2)) { if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return; // MG_INFO(("ARP RESPONSE")); @@ -6758,15 +6753,16 @@ static void rx_arp(struct mip_if *ifp, struct pkt *pkt) { static void rx_icmp(struct mip_if *ifp, struct pkt *pkt) { // MG_DEBUG(("ICMP %d", (int) len)); if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) { - struct ip *ip = tx_ip(ifp, 1, ifp->ip, pkt->ip->src, - sizeof(struct icmp) + pkt->pay.len); + size_t hlen = sizeof(struct eth) + sizeof(struct ip) + sizeof(struct icmp); + size_t space = ifp->tx.len - hlen, plen = pkt->pay.len; + if (plen > space) plen = space; + struct ip *ip = + tx_ip(ifp, 1, ifp->ip, pkt->ip->src, sizeof(struct icmp) + plen); struct icmp *icmp = (struct icmp *) (ip + 1); - size_t len = PDIFF(ifp->tx.buf, icmp + 1), left = ifp->tx.len - len; - if (left > pkt->pay.len) left = pkt->pay.len; // Don't overflow TX - memset(icmp, 0, sizeof(*icmp)); // Set csum to 0 - memcpy(icmp + 1, pkt->pay.buf, left); // Copy RX payload to TX - icmp->csum = ipcsum(icmp, sizeof(*icmp) + left); - ifp->driver->tx(ifp->tx.buf, len + left, ifp->driver_data); + memset(icmp, 0, sizeof(*icmp)); // Set csum to 0 + memcpy(icmp + 1, pkt->pay.buf, plen); // Copy RX payload to TX + icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen); + ether_output(ifp, hlen + plen); } } @@ -6850,8 +6846,7 @@ static size_t tx_tcp(struct mip_if *ifp, uint32_t dst_ip, uint8_t flags, cs = csumup(cs, &ip->dst, sizeof(ip->dst)); cs = csumup(cs, pseudo, sizeof(pseudo)); tcp->csum = csumfin(cs); - return ifp->driver->tx(ifp->tx.buf, PDIFF(ifp->tx.buf, tcp + 1) + len, - ifp->driver_data); + return ether_output(ifp, PDIFF(ifp->tx.buf, tcp + 1) + len); } static size_t tx_tcp_pkt(struct mip_if *ifp, struct pkt *pkt, uint8_t flags, @@ -6920,16 +6915,17 @@ long mg_io_recv(struct mg_connection *c, void *buf, size_t len) { static void read_conn(struct mg_connection *c, struct pkt *pkt) { struct connstate *s = (struct connstate *) (c + 1); struct mg_iobuf *io = c->is_tls ? &s->raw : &c->recv; + uint32_t seq = mg_ntohl(pkt->tcp->seq); s->raw.align = c->recv.align; if (pkt->tcp->flags & TH_FIN) { s->ack = mg_htonl(pkt->tcp->seq) + 1, s->seq = mg_htonl(pkt->tcp->ack); c->is_closing = 1; } else if (pkt->pay.len == 0) { // TODO(cpq): handle this peer's ACK - } else if (mg_ntohl(pkt->tcp->seq) != s->ack) { + } else if (seq != s->ack) { // TODO(cpq): peer sent us SEQ which we don't expect. Retransmit rather // than close this connection - mg_error(c, "SEQ != ACK: %x %x", mg_ntohl(pkt->tcp->seq), s->ack); + mg_error(c, "SEQ != ACK: %x %x", seq, s->ack); } else if (io->size - io->len < pkt->pay.len && !mg_iobuf_resize(io, io->len + pkt->pay.len)) { mg_error(c, "oom"); @@ -6941,9 +6937,18 @@ static void read_conn(struct mg_connection *c, struct pkt *pkt) { // call back mg_io_recv() which grabs raw data from s->raw memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len); io->len += pkt->pay.len; - // Advance ACK counter and setup a timer to send an ACK back + + MG_DEBUG(("%lu SEQ %x -> %x", c->id, mg_htonl(pkt->tcp->seq), s->ack)); s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len); +#if 1 + // Send ACK immediately + MG_DEBUG((" imm ACK", c->id, mg_htonl(pkt->tcp->seq), s->ack)); + tx_tcp((struct mip_if *) c->mgr->priv, c->rem.ip, TH_ACK, c->loc.port, + c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0); +#else + // Advance ACK counter and setup a timer to send an ACK back settmout(c, MIP_TTYPE_ACK); +#endif if (c->is_tls) { // TLS connection. Make room for decrypted data in c->recv @@ -7011,7 +7016,7 @@ static void rx_tcp(struct mip_if *ifp, struct pkt *pkt) { } static void rx_ip(struct mip_if *ifp, struct pkt *pkt) { - // MG_DEBUG(("IP %d", (int) pkt->pay.len)); + // MG_DEBUG(("IP %d", (int) pkt->pay.len)); if (pkt->ip->proto == 1) { pkt->icmp = (struct icmp *) (pkt->ip + 1); if (pkt->pay.len < sizeof(*pkt->icmp)) return; @@ -7083,6 +7088,10 @@ static void mip_rx(struct mip_if *ifp, void *buf, size_t len) { pkt.ip = (struct ip *) (pkt.eth + 1); if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return; // Truncated if ((pkt.ip->ver >> 4) != 4) return; // Not IP + // Truncate frame to what IP header tells us + if ((size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth) < pkt.raw.len) { + pkt.raw.len = (size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth); + } mkpay(&pkt, pkt.ip + 1); rx_ip(ifp, &pkt); } else { @@ -7135,7 +7144,7 @@ static void mip_poll(struct mip_if *ifp, uint64_t uptime_ms) { struct connstate *s = (struct connstate *) (c + 1); if (uptime_ms > s->timer) { if (s->ttype == MIP_TTYPE_ACK) { - MG_DEBUG(("%lu ack", c->id)); + MG_DEBUG(("%lu ack %x %x", c->id, s->seq, s->ack)); tx_tcp(ifp, c->rem.ip, TH_ACK, c->loc.port, c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), "", 0); } else {