Resultados previos
En trabajos anteriores se realizó la simulación del tiempo de contagio que podemos durar en cuarentena, ne Colombia (https://rpubs.com/alexjzc/covid-19).
Según estos resultados se replica el proceso para estimar el número de casos dias diarios que se puede tener para Bogotá. Para lo anterior, se procede a estimar el número de días días que nos falta para alcanzar el máximo de casos diarios para Bogotá.
Para ellos se descarga los casos diarios que se han dado para Bogotá según el portal de Datos Abiertos. Los datos está disponible el el siguiente link (https://www.datos.gov.co/Salud-y-Protecci-n-Social/Casos-positivos-de-COVID-19-en-Colombia/gt2j-8ykr/data).
A continuación se presentan los datos:
Distribución de nuevos casos en Bogotá

Construcción del modelo para predecir el número de casos de Coronavirus en Bogotá
Se desea construir un modelo que permita estimar el número de casos confirmados acumulados. Para ellos se construye un modelo quasipoisson el que se tiene en cuenta el número de casos confirmados acumulados como variable dependiente (valores) y como variables independientes el tiempo que ha transcurrido despues del primer caso (tiempo).
Para determinar que tan bueno es el modelo se excluyen los últimos 5 datos para tratar de predecir con el modelo.
los resultados son los siguientes
Call:
glm(formula = conteo ~ tiempo, family = quasipoisson(link = "log"),
data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-29.915 -6.603 -2.592 2.215 34.510
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.1029355 0.1100047 28.21 <0.0000000000000002 ***
tiempo 0.0333088 0.0007804 42.68 <0.0000000000000002 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for quasipoisson family taken to be 85.20307)
Null deviance: 275328 on 166 degrees of freedom
Residual deviance: 13878 on 165 degrees of freedom
AIC: NA
Number of Fisher Scoring iterations: 4
Analysis of Deviance Table
Model: quasipoisson, link: log
Response: conteo
Terms added sequentially (first to last)
Df Deviance Resid. Df Resid. Dev Pr(>Chi)
NULL 166 275328
tiempo 1 261450 165 13878 < 0.00000000000000022 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Según los resultados son significativas, por lo que se utilizan para realizar las estimaciones.
Estimación la tasa de contagio por día
Estimate 2.5 % 97.5 %
1.033870 1.032308 1.035471
Según el valor anterior, tenemos que la tasa de contagio es del 1.0338698. Por lo que por cada día que pasa el tiempo la tasa de infección aumenta en un 3.4%, con intervalo entre el 3.2% y 3.5%.
Ajuste del modelo
Se determina que tan bueno es el ajuste del modelo. Calculando la función envelope para determinar que tan bueno se ajusta el modelo.
Quasi-Poisson model

Observando el modelo, notamos que se ajustan bien los resultados, ya que la mayoría de los residuales se encuentra dentro de los límites de la gráfica envelope.
Predicciones del modelo
Realizando las predicciones respectivas para determinar el número de casos acumulados encontramos que las predicciones son buenas. Los valores que se se encuentran por encima de la linea vertical, son valores que se están prediciendo.

En la siguiente tabla se puede observar las predicciones (pred_cum) los valores del intervalo al 95% (lower_cum, upper_cum), los valores de confirmados (valores) y las fechas actuales.
Estimación del número de días que puede llegar durar la cuarentena en Bogotá
Para estimar el número de días, se tiene en cuenta el modelo SIR (Susceptible-Infectado-Recuperado), este modelo consiste en solucionar un sistema de ecuaciones diferenciales que relaciona el número de personas susceptible a ser infectadas de una población, el número de personas infectadas el cual y el número de personas recuperadas. El sistema de ecuaciones el el siguiente: \[
\begin{align*}
\frac{dS}{dt} &= -\frac{\beta IS}{N}\\
\frac{dI}{dt} &= \frac{\beta IS}{N}-\gamma I\\
\frac{dR}{dt} &= \gamma I\\
\end{align*}
\] Donde \(\beta\) es el parámetro de que controla la transición de entre los suceptibles (S) e infectados (I) y \(\gamma\) que controla la transición entre los infectados (I) y recuperados (R).
Para realizar la estimación en el caso colombiano, se tiene en cuenta la información tomada en el blog de Learning Machines (https://blog.ephorie.de/epidemiology-how-contagious-is-novel-coronavirus-2019-ncov). La data arreglar queda de la siguiente manera:
Simulación para Bogotá a la fecha
Para nuestro caso tenemos una población de personas de 7743955 según el DANE. Las simulaciones se realizaran con la información actual y además teniendo en cuenta que según los estudios del INS la población máxima que se puede contagiar es del 80%.
A continuación se simula el \(R_0\) y cuando se tendría y la fecha máxima que se tendría el número máximo de infectados. Tengamos presente que los resultados hacen parte de un proceso de simulación y también que debido a las diferentes intervenciones que realizó el gobierno de Colombia y la alcaldía de Bogotá estos datos pueden variar.
A continuación los nuevos valores de \(\beta\) y \(\gamma\) son los siguientes:.
beta gamma
0.3624985 0.2807653
La estimación de \(R_0\) a la fecha actual es la siguiente:
R0
1.291109
Según el resultado anterior, por cada persona infectada en Bogotá, está tiene la capacidad de infectar 1.29 personas.
El número de dias para llegar al máximo a la fecha de hoy es de:
[1] 167
Por lo que el máximo se alcanzaría a los 167 dias. A fecha de hoy 2020-08-25 han pasado 172 días por lo que ya hemos alcanzado el máximo según el modelo ajustado.
Estimación de los parametros de la distribución de infectados
Recordemos que la estimación del número promedio de días que vamos a estar en cuarentena según el modelo SIR es de \(168.7764918\). A continuación se estiman el número de casos que se pueden dar en los siguientes días teniendo en cuenta los siguientes supuestos.
- Según la literatura y el ajuste del modelo quasi-poisson construido se tiene que los parámetros son los siguientes \(\mu = 365.3574878\) y \(\theta = 85.2030706\) (estos valores son tomados del ajuste obtenido en la regresión anterior como en la simulación de dias).
- Se asume que a partir de la media se reflejan el 50% de los casos actuales que se pueden tener a la fecha.
Teniendo en cuenta lo anterior se procede a realizar un proceso de simulación y los resultados finales son los siguientes:
A continuación se revisa el ajuste mediante el gráfico de casos acumulados


LS0tDQp0aXRsZTogIkNPVklELTE5IEJvZ290w6E6IEVzdGltYWNpw7NuIGRlbCB0aWVtcG8gZGVsIG7Dum1lcm8gZGUgY29udGFnaW9zIGRpYXJpb3MgZW4gQm9nb3TDoSINCmF1dGhvcjogIkFsZXggWmFtYnJhbm8gYWxleC56QG1vbnRlY2hlbG8uY29tLmNvIg0KZGF0ZTogIkluZm9ybWUgYWN0dWFsaXphZG8gYWw6IGByIGRhdGUoKWAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyBSZXN1bHRhZG9zIHByZXZpb3MNCg0KRW4gdHJhYmFqb3MgYW50ZXJpb3JlcyBzZSByZWFsaXrDsyBsYSBzaW11bGFjacOzbiBkZWwgdGllbXBvIGRlIGNvbnRhZ2lvIHF1ZSBwb2RlbW9zIGR1cmFyIGVuIGN1YXJlbnRlbmEsIG5lIENvbG9tYmlhIChodHRwczovL3JwdWJzLmNvbS9hbGV4anpjL2NvdmlkLTE5KS4NCg0KU2Vnw7puIGVzdG9zIHJlc3VsdGFkb3Mgc2UgcmVwbGljYSBlbCBwcm9jZXNvIHBhcmEgZXN0aW1hciBlbCBuw7ptZXJvIGRlIGNhc29zIGRpYXMgZGlhcmlvcyBxdWUgc2UgcHVlZGUgdGVuZXIgcGFyYSBCb2dvdMOhLiBQYXJhIGxvIGFudGVyaW9yLCBzZSBwcm9jZWRlIGEgZXN0aW1hciBlbCBuw7ptZXJvIGRlIGTDrWFzIGTDrWFzIHF1ZSBub3MgZmFsdGEgcGFyYSBhbGNhbnphciBlbCBtw6F4aW1vIGRlIGNhc29zIGRpYXJpb3MgcGFyYSBCb2dvdMOhLg0KDQpQYXJhIGVsbG9zIHNlIGRlc2NhcmdhIGxvcyBjYXNvcyBkaWFyaW9zIHF1ZSBzZSBoYW4gZGFkbyBwYXJhIEJvZ290w6Egc2Vnw7puIGVsIHBvcnRhbCBkZSBEYXRvcyBBYmllcnRvcy4gTG9zIGRhdG9zIGVzdMOhIGRpc3BvbmlibGUgZWwgZWwgc2lndWllbnRlIGxpbmsgKGh0dHBzOi8vd3d3LmRhdG9zLmdvdi5jby9TYWx1ZC15LVByb3RlY2NpLW4tU29jaWFsL0Nhc29zLXBvc2l0aXZvcy1kZS1DT1ZJRC0xOS1lbi1Db2xvbWJpYS9ndDJqLTh5a3IvZGF0YSkuDQoNCkEgY29udGludWFjacOzbiBzZSBwcmVzZW50YW4gbG9zIGRhdG9zOg0KYGBge3IgbGVjdHVyYSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY2lUb29scykNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KDQojIExlY3R1cmEgZGUgbG9zIGRhdG9zICMjIyMNCmRiIDwtIHJlYWRfY3N2KCJodHRwczovL3d3dy5kYXRvcy5nb3YuY28vYXBpL3ZpZXdzL2d0MmotOHlrci9yb3dzLmNzdj9hY2Nlc3NUeXBlPURPV05MT0FEJmJvbT10cnVlJmZvcm1hdD10cnVlIikNCg0KZGIgPC0gZGIgJT4lIGRhdGEuZnJhbWUoKQ0KZGIgPC0gZGIgJT4lIGZpbHRlcihkYiRDb2RpZ28uZGVwYXJ0YW1lbnRvID09IDExKQ0KDQppbmZlY3RhZG9zIDwtIGRiICU+JQ0KICBncm91cF9ieShmZWNoYXMgPSBkYiRmZWNoYS5yZXBvcnRlLndlYikgJT4lDQogIHN1bW1hcmlzZShpbmZlY3RhZG9zID0gbigpKSAlPiUgbmEub21pdCgpDQppbmZlY3RhZG9zJGZlY2hhcyA8LSBhcy5EYXRlKGluZmVjdGFkb3MkZmVjaGFzLCAiJXktJW0tJWQiKQ0KDQptdWVydGVzIDwtIGRiICU+JQ0KICBncm91cF9ieShmZWNoYXMgPSBkYiRGZWNoYS5kZS5tdWVydGUpICU+JQ0KICBzdW1tYXJpc2UobXVlcnRlcyA9IG4oKSkgJT4lICBuYS5vbWl0KCkNCm11ZXJ0ZXMkZmVjaGFzIDwtIGFzLkRhdGUobXVlcnRlcyRmZWNoYXMsICIleS0lbS0lZCIpDQoNCnJlY3VwZXJhZG9zIDwtIGRiICU+JQ0KICBncm91cF9ieShmZWNoYXMgPSBkYiRGZWNoYS5yZWN1cGVyYWRvKSAlPiUNCiAgc3VtbWFyaXNlKHJlY3VwZXJhZG9zID0gbigpKSAlPiUgIG5hLm9taXQoKQ0KcmVjdXBlcmFkb3MkZmVjaGFzIDwtIGFzLkRhdGUocmVjdXBlcmFkb3MkZmVjaGFzLCAiJXktJW0tJWQiKSAgICANCg0KZGIgPC0gZGF0YS5mcmFtZSgNCiAgZmVjaGFzID0gYXNfZGF0ZShtaW4oaW5mZWN0YWRvcyRmZWNoYXMpOm1heChpbmZlY3RhZG9zJGZlY2hhcykpKQ0KDQpkYiA8LSBsZWZ0X2pvaW4oZGIsaW5mZWN0YWRvcykNCmRiIDwtIGxlZnRfam9pbihkYixtdWVydGVzKQ0KZGIgPC0gbGVmdF9qb2luKGRiLHJlY3VwZXJhZG9zKQ0KZGIkaW5mZWN0YWRvcyA8LSByZXBsYWNlX25hKGRiJGluZmVjdGFkb3MsIDApIA0KZGIkbXVlcnRlcyA8LSByZXBsYWNlX25hKGRiJG11ZXJ0ZXMsIDApDQpkYiRyZWN1cGVyYWRvcyA8LSByZXBsYWNlX25hKGRiJHJlY3VwZXJhZG9zLCAwKQ0KZGIkZGlhcyA8LSAxOm5yb3coZGIpDQoNCmRmIDwtIGRiICU+JSBzZWxlY3QoZmVjaGFzLGluZmVjdGFkb3MpDQpkZiA8LSBkZiAlPiUgcmVuYW1lKGZlY2hhID0gZmVjaGFzLCBjb250ZW8gPSBpbmZlY3RhZG9zKQ0KZGYkYWN1bXVsYWRvIDwtIGN1bXN1bShkZiRjb250ZW8pDQpgYGANCg0KYGBge3IgZGF0b3MsZWNobz1GQUxTRX0NCmRmDQpgYGANCg0KIyBEaXN0cmlidWNpw7NuIGRlIG51ZXZvcyBjYXNvcyBlbiBCb2dvdMOhDQoNCmBgYHtyICBjYXNvc19udWV2b3MsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkZiAlPiUgZ2dwbG90KGFlcyhmZWNoYSxjb250ZW8pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIHNjYWxlX3hfZGF0ZShicmVha3MgPSBkZiRmZWNoYSwgZGF0ZV9sYWJlbHMgPSAiJWIgJWQiLCBleHBhbmQgPSBjKDAsMCkpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhmZWNoYSwgY29udGVvLCBsYWJlbCA9IGNvbnRlbyksIHNpemU9MiwgaGp1c3Q9MC41KSArDQogIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTkwLHNpemU9Nywgdmp1c3QgPSAwLjUpKSArIHlsYWIoIkNhc29zIG51ZXZvcyIpICMgZ3LDoWZpY2EgZGVsIG7Dum1lcm8gZGUgZGlhcyBzaW4gYWN1bXVsYXINCmBgYA0KIyBDb25zdHJ1Y2Npw7NuIGRlbCBtb2RlbG8gcGFyYSBwcmVkZWNpciBlbCBuw7ptZXJvIGRlIGNhc29zIGRlIENvcm9uYXZpcnVzIGVuIEJvZ290w6ENCg0KU2UgZGVzZWEgY29uc3RydWlyIHVuIG1vZGVsbyBxdWUgcGVybWl0YSBlc3RpbWFyIGVsIG7Dum1lcm8gZGUgY2Fzb3MgY29uZmlybWFkb3MgYWN1bXVsYWRvcy4gUGFyYSBlbGxvcyBzZSBjb25zdHJ1eWUgdW4gbW9kZWxvIHF1YXNpcG9pc3NvbiBlbCBxdWUgc2UgdGllbmUgZW4gY3VlbnRhIGVsIG7Dum1lcm8gZGUgY2Fzb3MgY29uZmlybWFkb3MgYWN1bXVsYWRvcyBjb21vIHZhcmlhYmxlIGRlcGVuZGllbnRlICh2YWxvcmVzKSB5IGNvbW8gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGVsIHRpZW1wbyBxdWUgaGEgdHJhbnNjdXJyaWRvIGRlc3B1ZXMgZGVsIHByaW1lciBjYXNvICh0aWVtcG8pLg0KDQpQYXJhIGRldGVybWluYXIgcXVlIHRhbiBidWVubyBlcyBlbCBtb2RlbG8gc2UgZXhjbHV5ZW4gbG9zIMO6bHRpbW9zIDUgZGF0b3MgcGFyYSB0cmF0YXIgZGUgcHJlZGVjaXIgY29uIGVsIG1vZGVsby4NCg0KDQpsb3MgcmVzdWx0YWRvcyBzb24gbG9zIHNpZ3VpZW50ZXMNCmBgYHtyIGNvcnJpZGFfbW9kZWxvLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbiA8LSBkaW0oZGYpWzFdDQpkZiR5IDwtIGRmJGNvbnRlbw0KI2RmJHkgPC0gZGYkdmFsb3Jlcw0KZGlmZl9jb3J0ZXMgPC0gcmVwKDA6dHJ1bmMobGVuZ3RoKGRmJHkpLzE0KSxlYWNoPTE0KQ0KZGYkY29ydGVzIDwtIGRpZmZfY29ydGVzWzE6bGVuZ3RoKGRmJHkpXQ0KZGYkY29ydGVzIDwtIGFzLmZhY3RvcihkZiRjb3J0ZXMpDQpkZl90ZXN0IDwtIGRmWyhuLTQpOm4sXQ0KZGYgPC0gZGZbMToobi01KSxdDQpuaXZlbGVzIDwtIGxldmVscyhkZiRjb3J0ZXMpDQpkZl90ZXN0JGNvcnRlcyA8LSByZXBsYWNlKA0KICBkZl90ZXN0JGNvcnRlcywgZGZfdGVzdCRjb3J0ZXMgIT0gYXMuY2hhcmFjdGVyKHRhaWwoZGYsMSkkY29ydGVzKSwNCiAgYXMuY2hhcmFjdGVyKHRhaWwoZGYsMSkkY29ydGVzKSkNCmRmX3Rlc3QkY29ydGVzIDwtIGZhY3RvcihkZl90ZXN0JGNvcnRlcyxsZXZlbHMgPSBuaXZlbGVzKQ0KZGYkdGllbXBvIDwtIDE6bnJvdyhkZikNCg0KbW9kZWxvIDwtIGdsbShjb250ZW8gfiB0aWVtcG8sIGRmLGZhbWlseSA9IHF1YXNpcG9pc3NvbihsaW5rID0gImxvZyIpKQ0KI21vZGVsbyA8LSBNQVNTOjpnbG0ubmIodmFsb3JlcyB+IHRpZW1wbyArIGNvcnRlcywgY29sb21iaWEpDQpzdW1tYXJ5KG1vZGVsbykNCmFub3ZhKG1vZGVsbyx0ZXN0ID0gIkNoaXNxIikNCmBgYA0KU2Vnw7puIGxvcyByZXN1bHRhZG9zIHNvbiBzaWduaWZpY2F0aXZhcywgcG9yIGxvIHF1ZSBzZSB1dGlsaXphbiBwYXJhIHJlYWxpemFyIGxhcyBlc3RpbWFjaW9uZXMuDQoNCiMjIEVzdGltYWNpw7NuIGxhIHRhc2EgZGUgY29udGFnaW8gcG9yIGTDrWENCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQplc3QgPC0gY2JpbmQoRXN0aW1hdGUgPSBjb2VmKG1vZGVsbyksIGNvbmZpbnQobW9kZWxvKSkNCmV4cChlc3RbMixdKQ0KYGBgDQpTZWfDum4gZWwgdmFsb3IgYW50ZXJpb3IsIHRlbmVtb3MgcXVlIGxhIHRhc2EgZGUgY29udGFnaW8gZXMgZGVsIGByIGV4cChlc3RbMiwxXSlgLiBQb3IgbG8gcXVlIHBvciBjYWRhIGTDrWEgcXVlIHBhc2EgZWwgdGllbXBvIGxhIHRhc2EgZGUgaW5mZWNjacOzbiBhdW1lbnRhIGVuIHVuIGByIHJvdW5kKGV4cChlc3RbMiwxXSktMSwzKSoxMDBgJSwgY29uIGludGVydmFsbyBlbnRyZSBlbCBgciByb3VuZChleHAoZXN0WzIsMl0pLTEsMykqMTAwYCUgeSBgciByb3VuZChleHAoZXN0WzIsM10pLTEsMykqMTAwYCUuDQoNCiMjIEFqdXN0ZSBkZWwgbW9kZWxvDQoNClNlIGRldGVybWluYSBxdWUgdGFuIGJ1ZW5vIGVzIGVsIGFqdXN0ZSBkZWwgbW9kZWxvLiBDYWxjdWxhbmRvIGxhIGZ1bmNpw7NuIGVudmVsb3BlIHBhcmEgZGV0ZXJtaW5hciBxdWUgdGFuIGJ1ZW5vIHNlIGFqdXN0YSBlbCBtb2RlbG8uDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBSZXZpc2FuZG8gcXVlIHRhbiBidWVubyBlcyBlbCBtb2RlbG8gIyMjIw0KaG5wOjpobnAobW9kZWxvKQ0KI3NvdXJjZSgnaHR0cDovL3d3dy5wb2xldG8uY29tL2Z1bmNvZXMvZW52ZWwubmIudHh0JykNCiNlbnZlbC5uYihtb2RlbG8sY29uZj0wLjk1KQ0KYGBgDQoNCg0KT2JzZXJ2YW5kbyBlbCBtb2RlbG8sIG5vdGFtb3MgcXVlIHNlIGFqdXN0YW4gYmllbiBsb3MgcmVzdWx0YWRvcywgeWEgcXVlIGxhIG1heW9yw61hIGRlIGxvcyByZXNpZHVhbGVzIHNlIGVuY3VlbnRyYSBkZW50cm8gZGUgbG9zIGzDrW1pdGVzIGRlIGxhIGdyw6FmaWNhIGVudmVsb3BlLg0KDQojIyBQcmVkaWNjaW9uZXMgZGVsIG1vZGVsbw0KDQpSZWFsaXphbmRvIGxhcyBwcmVkaWNjaW9uZXMgcmVzcGVjdGl2YXMgcGFyYSBkZXRlcm1pbmFyIGVsIG7Dum1lcm8gZGUgY2Fzb3MgYWN1bXVsYWRvcyBlbmNvbnRyYW1vcyBxdWUgbGFzIHByZWRpY2Npb25lcyBzb24gYnVlbmFzLiBMb3MgdmFsb3JlcyBxdWUgc2Ugc2UgZW5jdWVudHJhbiBwb3IgZW5jaW1hIGRlIGxhIGxpbmVhIHZlcnRpY2FsLCBzb24gdmFsb3JlcyBxdWUgc2UgZXN0w6FuIHByZWRpY2llbmRvLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGllbXBvMiA8LSAxOihucm93KGRmKStucm93KGRmX3Rlc3QpKzUpDQpjb3J0ZXMyIDwtIA0KICBjKGFzLm51bWVyaWMobGV2ZWxzKGRmJGNvcnRlcykpW2RmJGNvcnRlc10sDQogICAgYXMubnVtZXJpYyhsZXZlbHMoZGZfdGVzdCRjb3J0ZXMpKVtkZl90ZXN0JGNvcnRlc10sDQogICAgYXMubnVtZXJpYyhsZXZlbHMoZGZfdGVzdCRjb3J0ZXMpKVtkZl90ZXN0JGNvcnRlc10pDQpjb3J0ZXMyIDwtIGZhY3Rvcihjb3J0ZXMyLCBsZXZlbHMgPSBsZXZlbHMoZGYkY29ydGVzKSkNCiAgICAgICAgICAgICAgICAgICAgICAgDQoNCiMgQ29uc3RydXllbmRvIHByZWRpY2Npb25lcyAjIyMjDQpkZl9wcmVkaWN0aXZlIDwtIGFkZF9jaShkYXRhLmZyYW1lKHRpZW1wbyA9IHRpZW1wbzIsIGNvcnRlcyA9IGNvcnRlczIpLGZpdCA9IG1vZGVsbywgYWxwaGEgPSAwLjA1LCBuYW1lcyA9IGMoImxvd2VyIiwgInVwcGVyIikpDQoNCiMgUGVnYW5kbyBiYXNlcyAjIyMjDQpkZiA8LSBkZiAlPiUgZnVsbF9qb2luKGRmX3ByZWRpY3RpdmUpDQpkZlthcy5udW1lcmljKHJvdy5uYW1lcyhkZl90ZXN0KSksYygiZmVjaGEiLCAiY29udGVvIiwgImFjdW11bGFkbyIsICJ5IiwgImNvcnRlcyIpXSA8LSBkZl90ZXN0DQoNCg0KZGYkcHJlZF9jdW0gPC0gY3Vtc3VtKGRmJHByZWQpDQpkZiRsb3dlcl9jdW0gPC0gY3Vtc3VtKGRmJGxvd2VyKQ0KZGYkdXBwZXJfY3VtIDwtIGN1bXN1bShkZiR1cHBlcikNCg0KIyBQcmVkaWNjacOzbiA1IGTDrWFzICMjIyMNCmRmICU+JSBnZ3Bsb3QoYWVzKHggPSB0aWVtcG8pKSArIGdlb21fbGluZShhZXMoeSA9IHByZWRfY3VtKSkgKyBnZW9tX2xpbmUoYWVzKHkgPSBsb3dlcl9jdW0sY29sb3VyID0gIlJlZCIpKSArDQogIGdlb21fbGluZShhZXMoeSA9IHVwcGVyX2N1bSxjb2xvdXIgPSAiUmVkIikpICsgZ2VvbV9wb2ludChhZXMoeSA9IGFjdW11bGFkbykpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbnJvdyhkZiktMTApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbnJvdyhkZikpLCBicmVha3MgPSBzZXEoMCwgMzAwLCBieSA9IDIpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsc2l6ZT03LCB2anVzdCA9IDAuNSkpICsgeWxhYigiUHJlZGljY2lvbmVzIGRlIGNhc29zIikNCmBgYA0KRW4gbGEgc2lndWllbnRlIHRhYmxhIHNlIHB1ZWRlIG9ic2VydmFyIGxhcyBwcmVkaWNjaW9uZXMgKHByZWRfY3VtKSBsb3MgdmFsb3JlcyBkZWwgaW50ZXJ2YWxvIGFsIDk1JSAobG93ZXJfY3VtLCB1cHBlcl9jdW0pLCBsb3MgdmFsb3JlcyBkZSBjb25maXJtYWRvcyAodmFsb3JlcykgeSBsYXMgZmVjaGFzIGFjdHVhbGVzLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGYgJT4lIHNlbGVjdChmZWNoYSx0aWVtcG8sICB5LCBhY3VtdWxhZG8sIGxvd2VyX2N1bSwgcHJlZF9jdW0sIHVwcGVyX2N1bSkNCmBgYA0KDQojIEVzdGltYWNpw7NuIGRlbCBuw7ptZXJvIGRlIGTDrWFzIHF1ZSBwdWVkZSBsbGVnYXIgZHVyYXIgbGEgY3VhcmVudGVuYSBlbiBCb2dvdMOhDQoNClBhcmEgZXN0aW1hciBlbCBuw7ptZXJvIGRlIGTDrWFzLCBzZSB0aWVuZSBlbiBjdWVudGEgZWwgbW9kZWxvIFNJUiAoU3VzY2VwdGlibGUtSW5mZWN0YWRvLVJlY3VwZXJhZG8pLCBlc3RlIG1vZGVsbyBjb25zaXN0ZSBlbiBzb2x1Y2lvbmFyIHVuIHNpc3RlbWEgZGUgZWN1YWNpb25lcyBkaWZlcmVuY2lhbGVzIHF1ZSByZWxhY2lvbmEgZWwgbsO6bWVybyBkZSBwZXJzb25hcyBzdXNjZXB0aWJsZSBhIHNlciBpbmZlY3RhZGFzIGRlIHVuYSBwb2JsYWNpw7NuLCBlbCBuw7ptZXJvIGRlIHBlcnNvbmFzIGluZmVjdGFkYXMgZWwgY3VhbCB5IGVsIG7Dum1lcm8gZGUgcGVyc29uYXMgcmVjdXBlcmFkYXMuIEVsIHNpc3RlbWEgZGUgZWN1YWNpb25lcyBlbCBlbCBzaWd1aWVudGU6DQokJA0KXGJlZ2lue2FsaWduKn0NClxmcmFje2RTfXtkdH0gJj0gLVxmcmFje1xiZXRhIElTfXtOfVxcDQpcZnJhY3tkSX17ZHR9ICY9IFxmcmFje1xiZXRhIElTfXtOfS1cZ2FtbWEgSVxcDQpcZnJhY3tkUn17ZHR9ICY9IFxnYW1tYSBJXFwNClxlbmR7YWxpZ24qfQ0KJCQNCkRvbmRlICRcYmV0YSQgZXMgZWwgcGFyw6FtZXRybyBkZSBxdWUgY29udHJvbGEgbGEgdHJhbnNpY2nDs24gZGUgZW50cmUgbG9zIHN1Y2VwdGlibGVzIChTKSBlIGluZmVjdGFkb3MgKEkpIHkgJFxnYW1tYSQgcXVlIGNvbnRyb2xhIGxhIHRyYW5zaWNpw7NuIGVudHJlIGxvcyBpbmZlY3RhZG9zIChJKSB5IHJlY3VwZXJhZG9zIChSKS4NCg0KUGFyYSByZWFsaXphciBsYSBlc3RpbWFjacOzbiBlbiBlbCBjYXNvIGNvbG9tYmlhbm8sIHNlIHRpZW5lIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2nDs24gdG9tYWRhIGVuIGVsIGJsb2cgZGUgTGVhcm5pbmcgTWFjaGluZXMgKGh0dHBzOi8vYmxvZy5lcGhvcmllLmRlL2VwaWRlbWlvbG9neS1ob3ctY29udGFnaW91cy1pcy1ub3ZlbC1jb3JvbmF2aXJ1cy0yMDE5LW5jb3YpLiBMYSBkYXRhIGFycmVnbGFyIHF1ZWRhIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCmBgYHtyIGxlY3R1cmEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KZGYyIDwtIGRiDQoNCmRmMiRpbmZlY3RhZG9zIDwtIGN1bXN1bShkZjIkaW5mZWN0YWRvcykNCmRmMiRtdWVydGVzIDwtIGN1bXN1bShkZjIkbXVlcnRlcykNCmRmMiRyZWN1cGVyYWRvcyA8LSBjdW1zdW0oZGYyJHJlY3VwZXJhZG9zKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpkZjINCmBgYA0KIyMgU2ltdWxhY2nDs24gcGFyYSBCb2dvdMOhIGEgbGEgZmVjaGENCg0KUGFyYSBudWVzdHJvIGNhc28gdGVuZW1vcyB1bmEgcG9ibGFjacOzbiBkZSBwZXJzb25hcyBkZSA3NzQzOTU1IHNlZ8O6biBlbCBEQU5FLiBMYXMgc2ltdWxhY2lvbmVzIHNlIHJlYWxpemFyYW4gY29uIGxhIGluZm9ybWFjacOzbiBhY3R1YWwgeSBhZGVtw6FzIHRlbmllbmRvIGVuIGN1ZW50YSBxdWUgc2Vnw7puIGxvcyBlc3R1ZGlvcyBkZWwgSU5TIGxhIHBvYmxhY2nDs24gbcOheGltYSBxdWUgc2UgcHVlZGUgY29udGFnaWFyIGVzIGRlbCA4MFwlLg0KDQpBIGNvbnRpbnVhY2nDs24gc2Ugc2ltdWxhIGVsICRSXzAkIHkgY3VhbmRvIHNlIHRlbmRyw61hIHkgbGEgZmVjaGEgbcOheGltYSBxdWUgc2UgdGVuZHLDrWEgZWwgbsO6bWVybyBtw6F4aW1vIGRlIGluZmVjdGFkb3MuIFRlbmdhbW9zIHByZXNlbnRlIHF1ZSBsb3MgcmVzdWx0YWRvcyBoYWNlbiBwYXJ0ZSBkZSB1biBwcm9jZXNvIGRlIHNpbXVsYWNpw7NuIHkgdGFtYmnDqW4gcXVlIGRlYmlkbyBhIGxhcyBkaWZlcmVudGVzIGludGVydmVuY2lvbmVzIHF1ZSByZWFsaXrDsyBlbCBnb2JpZXJubyBkZSBDb2xvbWJpYSB5IGxhIGFsY2FsZMOtYSBkZSBCb2dvdMOhIGVzdG9zIGRhdG9zIHB1ZWRlbiB2YXJpYXIuDQoNCkEgY29udGludWFjacOzbiBsb3MgbnVldm9zIHZhbG9yZXMgZGUgJFxiZXRhJCB5ICRcZ2FtbWEkIHNvbiBsb3Mgc2lndWllbnRlczouDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShkZVNvbHZlKQ0KDQpOIDwtIDc3NDM5NTUqMC44ICMgODAlIGRlIGxhIHBvYmxhY2nDs24gZGUgQm9nb3TDoSBzZWfDum4gZWwgREFORQ0KDQpJbmZlY3RlZCA8LSBkZjIkaW5mZWN0YWRvcw0KUiA8LSBkZjIkcmVjdXBlcmFkb3MNCkRheSA8LSBkZjIkZGlhcw0KDQojDQojIE9ERSBlcXVhdGlvbiB1c2VkIGZvciBmaXR0aW5nDQojDQpTSVIgPC0gZnVuY3Rpb24odGltZSwgc3RhdGUsIHBhcmFtZXRlcnMpIHsNCiAgcGFyIDwtIGFzLmxpc3QoYyhzdGF0ZSwgcGFyYW1ldGVycykpDQogIHdpdGgocGFyLCB7DQogICAgZFMgPC0gLWJldGEvTiAqIEkgKiBTDQogICAgZEkgPC0gYmV0YS9OICogSSAqIFMgLSBnYW1tYSAqIEkNCiAgICBkUiA8LSBnYW1tYSAqIEkNCiAgICBsaXN0KGMoZFMsIGRJLCBkUikpDQogIH0pDQp9DQoNCiMNCiMgY29zdCBmdW5jdGlvbiB0byBiZSBvcHRpbWl6ZWQgaW4gdGhlIGZpdHRpbmcNCiMNClJTUyA8LSBmdW5jdGlvbihwYXJhbWV0ZXJzKSB7DQogIG5hbWVzKHBhcmFtZXRlcnMpIDwtIGMoImJldGEiLCAiZ2FtbWEiKQ0KICBvdXQgPC0gb2RlKHkgPSBpbml0LCB0aW1lcyA9IERheSwgZnVuYyA9IFNJUiwgcGFybXMgPSBwYXJhbWV0ZXJzKQ0KICBmaXRJbmZlY3RlZCA8LSBvdXRbLDNdDQogIHN1bSgoSW5mZWN0ZWQgLSBmaXRJbmZlY3RlZCleMikNCn0NCg0KIyBzdGFydGluZyBjb25kaXRpb24NCmluaXQgPC0gYyhTID0gTi1JbmZlY3RlZFsxXSwgSSA9IEluZmVjdGVkWzFdLCBSID0gUlsxXSkNCiNpbml0IDwtIGMoUyA9IE4tSW5mZWN0ZWRbMV0sIEkgPSBJbmZlY3RlZFsxXS1SWzFdLURbMV0pICB1c2UgdGhpcyBzdGFydGluZyBjb25kaXRpb24gd2hlbiBhcHBseWluZyB0aGUgZGlmZmVyZW50IGxpbmUgaW4gdGhlIFJTUyBmdW5jdGlvbg0KDQojIHBlcmZvcm1pbmcgdGhlIGZpdA0KT3B0IDwtIG9wdGltKGMoMC41LCAwLjUpLCBSU1MsIG1ldGhvZCA9ICJMLUJGR1MtQiIsIGxvd2VyID0gYygwLCAwKSwgdXBwZXIgPSBjKDEsIDEpKSAjIG9wdGltaXplIHdpdGggc29tZSBzZW5zaWJsZSBjb25kaXRpb25zDQoNCk9wdF9wYXJfbmV3IDwtIHNldE5hbWVzKE9wdCRwYXIsIGMoImJldGEiLCAiZ2FtbWEiKSkNCk9wdF9wYXJfbmV3DQpgYGANCg0KTGEgZXN0aW1hY2nDs24gZGUgJFJfMCQgYSBsYSBmZWNoYSBhY3R1YWwgZXMgbGEgc2lndWllbnRlOg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClIwX25ldyA8LSBzZXROYW1lcyhPcHRfcGFyX25ld1siYmV0YSJdIC8gT3B0X3Bhcl9uZXdbImdhbW1hIl0sICJSMCIpDQpSMF9uZXcNCmBgYA0KU2Vnw7puIGVsIHJlc3VsdGFkbyBhbnRlcmlvciwgcG9yIGNhZGEgcGVyc29uYSBpbmZlY3RhZGEgZW4gQm9nb3TDoSwgZXN0w6EgdGllbmUgbGEgY2FwYWNpZGFkIGRlIGluZmVjdGFyIGByIHJvdW5kKFIwX25ldywyKWAgcGVyc29uYXMuDQoNCkVsIG7Dum1lcm8gZGUgZGlhcyBwYXJhIGxsZWdhciBhbCBtw6F4aW1vIGEgbGEgZmVjaGEgZGUgaG95IGVzIGRlOg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnQgPC0gMTozMDAgIyB0aW1lIGluIGRheXMNCmZpdCA8LSBkYXRhLmZyYW1lKG9kZSh5ID0gaW5pdCwgdGltZXMgPSB0LCBmdW5jID0gU0lSLCBwYXJtcyA9IE9wdF9wYXJfbmV3KSkNCg0KbWF4aW1vIDwtIGZpdFtmaXQkSSA9PSBtYXgoZml0JEkpLCAiSSIsIGRyb3AgPSBGQUxTRV0gIyBoZWlnaHQgb2YgcGFuZGVtaWMNCmRpYXNfbWF4X25ldyA8LSBhcy5udW1lcmljKHJvdy5uYW1lcyhtYXhpbW8pKQ0KZGlhc19tYXhfbmV3DQpgYGANClBvciBsbyBxdWUgZWwgbcOheGltbyBzZSBhbGNhbnphcsOtYSBhIGxvcyBgciBkaWFzX21heF9uZXdgIGRpYXMuIEEgZmVjaGEgZGUgaG95IGByIFN5cy5EYXRlKClgIGhhbiBwYXNhZG8gYHIgbnJvdyhkZjIpYCAgZMOtYXMgcG9yIGxvIHF1ZSB5YSBoZW1vcyBhbGNhbnphZG8gZWwgbcOheGltbyBzZWfDum4gZWwgbW9kZWxvIGFqdXN0YWRvLg0KDQojIEVzdGltYWNpw7NuIGRlIGxvcyBwYXJhbWV0cm9zIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgaW5mZWN0YWRvcw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0YS5zaW11bGEgPC0gZGF0YS5mcmFtZShkaWFzID0gMTozMDAsZnJlY3VlbmNpYT1maXQkSSkNCg0KbWVkaWEgPC0gSG1pc2M6Ond0ZC5tZWFuKGRhdGEuc2ltdWxhJGRpYXMsZGF0YS5zaW11bGEkZnJlY3VlbmNpYSkNCnZhcmlhIDwtIEhtaXNjOjp3dGQudmFyKGRhdGEuc2ltdWxhJGRpYXMsZGF0YS5zaW11bGEkZnJlY3VlbmNpYSkNCmRlc3ZpYSA8LSBzcXJ0KHZhcmlhKQ0KDQptdSA8LSBleHAoY29lZihsbShsb2cobW9kZWxvJGZpdHRlZC52YWx1ZXMpfjEpKSkNCmRpc3BlciA8LSBzdW1tYXJ5KG1vZGVsbykkZGlzcGVyc2lvbg0KYGBgDQpSZWNvcmRlbW9zIHF1ZSBsYSBlc3RpbWFjacOzbiBkZWwgbsO6bWVybyBwcm9tZWRpbyBkZSBkw61hcyBxdWUgdmFtb3MgYSBlc3RhciBlbiBjdWFyZW50ZW5hIHNlZ8O6biBlbCBtb2RlbG8gU0lSIGVzIGRlICRgciBtZWRpYWAkLiBBIGNvbnRpbnVhY2nDs24gc2UgZXN0aW1hbiBlbCBuw7ptZXJvIGRlIGNhc29zIHF1ZSBzZSBwdWVkZW4gZGFyIGVuIGxvcyBzaWd1aWVudGVzIGTDrWFzIHRlbmllbmRvIGVuIGN1ZW50YSBsb3Mgc2lndWllbnRlcyBzdXB1ZXN0b3MuDQoNCg0KKiBTZWfDum4gbGEgbGl0ZXJhdHVyYSB5IGVsIGFqdXN0ZSBkZWwgbW9kZWxvIHF1YXNpLXBvaXNzb24gY29uc3RydWlkbyBzZSB0aWVuZSBxdWUgIGxvcyBwYXLDoW1ldHJvcyBzb24gbG9zIHNpZ3VpZW50ZXMgJFxtdSA9IGByIG11YCQgeSAkXHRoZXRhID0gYHIgZGlzcGVyYCQgKGVzdG9zIHZhbG9yZXMgc29uIHRvbWFkb3MgZGVsIGFqdXN0ZSBvYnRlbmlkbyBlbiBsYSByZWdyZXNpw7NuIGFudGVyaW9yIGNvbW8gZW4gbGEgc2ltdWxhY2nDs24gZGUgZGlhcykuDQoqIFNlIGFzdW1lIHF1ZSBhIHBhcnRpciBkZSBsYSBtZWRpYSBzZSByZWZsZWphbiBlbCA1MCUgZGUgbG9zIGNhc29zIGFjdHVhbGVzIHF1ZSBzZSBwdWVkZW4gdGVuZXIgYSBsYSBmZWNoYS4NCg0KVGVuaWVuZG8gZW4gY3VlbnRhIGxvIGFudGVyaW9yIHNlIHByb2NlZGUgYSByZWFsaXphciB1biBwcm9jZXNvIGRlIHNpbXVsYWNpw7NuIHkgbG9zIHJlc3VsdGFkb3MgZmluYWxlcyBzb24gbG9zIHNpZ3VpZW50ZXM6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQphanVzdGUgPC0gZGF0YS5mcmFtZShmZWNoYXMgPSBhc19kYXRlKGFzLkRhdGUoIjIwMjAvMDMvMDYiKTooYXMuRGF0ZSgiMjAyMC8wMy8wNiIpICsgMjk5KSkpDQphanVzdGUkbW9kZWxvX1NJUiA8LSByb3VuZChmaXQkSSkNCmFqdXN0ZSRtb2RlbG9fcXVhc2lwb2lzc29uIDwtIE5BDQpkYXRhX3ByZWRpYyA8LSBwcmVkaWN0KG9iamVjdCA9IG1vZGVsbyxuZXdkYXRhID0gZGF0YS5mcmFtZSh0aWVtcG8gPSAxOm11KSx0eXBlID0gInJlc3BvbnNlIikNCmFqdXN0ZVsxOmxlbmd0aChkYXRhX3ByZWRpYyksXSRtb2RlbG9fcXVhc2lwb2lzc29uIDwtIGRhdGFfcHJlZGljDQoNCmRpZl9taW4gPC0gbWluKGFwcGx5KGFqdXN0ZVssMjozXSwxLGRpc3QpLG5hLnJtID0gVCkNCg0KcHVudG8xIDwtIGFzLm51bWVyaWMocm93Lm5hbWVzKG5hLm9taXQoYWp1c3RlW2FwcGx5KGFqdXN0ZVssMjozXSwxLGRpc3QpID09IGRpZl9taW4sXSkpKQ0KcHVudG8yIDwtIHJvdW5kKG1lZGlhICsgZGlzcGVyKQ0KYWp1c3RlIDwtIGFqdXN0ZVsxOjMwMCxdDQphanVzdGUkYXJyZWdsbyA8LSByb3VuZChjKGFqdXN0ZVsxOihwdW50bzEtMSksXSRtb2RlbG9fU0lSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhanVzdGVbcHVudG8xOihwdW50bzItMSksXSRtb2RlbG9fcXVhc2lwb2lzc29uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBhanVzdGVbcHVudG8yOjMwMCxdJG1vZGVsb19TSVIpKQ0KYWp1c3RlJGFycmVnbG8gPC0gcmVwbGFjZShhanVzdGUkYXJyZWdsbywgYWp1c3RlJGFycmVnbG8gPiA0MDAwLCBOQSkgIyBBcnJlZ2xvDQphanVzdGUkdGllbXBvIDwtIDE6bnJvdyhhanVzdGUpDQpsaWJyYXJ5KG1pY2UpDQppbXAgPC0gbWljZShzZWxlY3QoYWp1c3RlLHRpZW1wbywgYXJyZWdsbyksbWV0aG9kID0gInJmIikNCmFqdXN0ZSRhcnJlZ2xvIDwtIGNvbXBsZXRlKGltcCkkYXJyZWdsbw0KYWp1c3RlJGNvbnRlbyA8LSBOQQ0KYWp1c3RlWzE6bGVuZ3RoKGRmJGNvbnRlbyksXSRjb250ZW8gPC0gZGYkY29udGVvDQphanVzdGUkYWN1bXVsYWRvIDwtIE5BDQphanVzdGVbMTpsZW5ndGgoZGYkY29udGVvKSxdJGFjdW11bGFkbyA8LSBjdW1zdW0oZGYkY29udGVvKQ0KDQphanVzdGUkcHJlZCA8LSBhanVzdGUkYXJyZWdsbw0KYWp1c3RlJHByZWRfY3VtIDwtIGN1bXN1bShhanVzdGUkYXJyZWdsbykNCmBgYA0KDQoNCmBgYHtyIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojcnFwb2lzIDwtIGZ1bmN0aW9uKG4sbXUsdGhldGEpew0KIyAgcm5iaW5vbShuPW4sIG11ID0gbXUsIHNpemUgPSBtdS8odGhldGEtMSkpDQojfQ0KDQojaSA8LSAwDQojaiA8LSAxDQojd2hpbGUoaiA8IG11KXsNCiMgIGogPC0gaipleHAobW9kZWxvJGNvZWZmaWNpZW50cylbMl0NCiMgIGkgPC0gaSsxDQojfQ0KDQojY2Fzb3M1MDwtc3VtKHByZWRpY3Qob2JqZWN0ID0gbW9kZWxvLG5ld2RhdGEgPSBkYXRhLmZyYW1lKHRpZW1wbyA9IDE6aSksdHlwZSA9ICJyZXNwb25zZSIpKQ0KI211IDwtIGV4cChjb2VmKGxtKGxvZyhtb2RlbG8kZml0dGVkLnZhbHVlcyl+MSkpKQ0KI2Rpc3BlciA8LSBzdW1tYXJ5KG1vZGVsbykkZGlzcGVyc2lvbg0KIyANCiNzZXQuc2VlZCgxNTA3MjAyMCkNCiNzaW11bGEgPC0gcnFwb2lzKDMqY2Fzb3M1MCxtZWRpYSxkaXNwZXIpDQojIA0KI2RpYXNfbWluIDwtIG1pbihzaW11bGEpDQojZGlhc19tYXggPC0gbWF4KHNpbXVsYSkNCiMgDQojcmVzdWx0YWRvcyA8LSBoaXN0KHNpbXVsYSxicmVha3MgPSAwOihkaWFzX21heCsxKSxwbG90ID0gRkFMU0UpJGNvdW50cw0KIyANCiNwbG90KGRmJGNvbnRlbykNCiMgbGluZXMocmVzdWx0YWRvc1sxOmxlbmd0aChkZiRjb250ZW8pXSkNCiMgbGluZXMobW9kZWxvJGZpdHRlZC52YWx1ZXMpDQojIGRhdGEuZnJhbWUoY3Vtc3VtKGRmJGNvbnRlbyksY3Vtc3VtKHJlc3VsdGFkb3NbMTpsZW5ndGgoZGYkY29udGVvKV0pKQ0KIyANCiMgcGxvdChjdW1zdW0oZGYkY29udGVvKSkNCiMgbGluZXMoY3Vtc3VtKHJlc3VsdGFkb3NbMTpsZW5ndGgoZGYkY29udGVvKV0pKQ0KIyANCiMgc2V0LnNlZWQoMTUwNzIwMjApDQojIHNpbXVsYSA8LSBtYXRyaXgoTkEsbmNvbCA9IDEwMDAsbnJvdyA9IDIqY2Fzb3M1MCkNCiMgZm9yKGkgaW4gMToxMDAwKXsNCiMgICBzaW11bGFbLGldIDwtIHJxcG9pcygyKmNhc29zNTAsbXUsZGlzcGVyKQ0KIyB9DQojIA0KIyBkaWFzX21pbiA8LSBtaW4oc2ltdWxhKQ0KIyBkaWFzX21heCA8LSBtYXgoc2ltdWxhKQ0KIyANCiMgc2ltdWxhIDwtIGRhdGEuZnJhbWUoc2ltdWxhKQ0KIyANCiMgcmVzdWx0YWRvcyA8LSBhcHBseShzaW11bGEsMixoaXN0LGJyZWFrcyA9IGRpYXNfbWluOmRpYXNfbWF4LHBsb3QgPSBGQUxTRSkNCiMgDQojIGhpc3RvZ3JhbWFzIDwtIG1hdHJpeChOQSxuY29sID0gZGlhc19tYXgsIG5yb3cgPSAxMDAwKQ0KIyBmb3IoaSBpbiAxOjEwMDApew0KIyAgIGhpc3RvZ3JhbWFzW2ksXSA8LSByZXN1bHRhZG9zW1tpXV0kY291bnRzDQojIH0NCiMgDQojIGludGVydmFsbyA8LSBkYXRhLmZyYW1lKHQoYXBwbHkoaGlzdG9ncmFtYXMsMixxdWFudGlsZSxjKDAuMDUvMiwxLTAuMDUvMikpKSkNCiMgbmFtZXMoaW50ZXJ2YWxvKSA8LSBjKCJsb3dlciIsInVwcGVyIikNCiMgaW50ZXJ2YWxvJHByZWQgPC0gYXBwbHkoaGlzdG9ncmFtYXMsMixtZWFuKQ0KIyBpbnRlcnZhbG8gPC0gaW50ZXJ2YWxvICU+JSBzZWxlY3QobG93ZXIsIHByZWQsIHVwcGVyKQ0KDQoNCiMgaW50ZXJ2YWxvJGxvd2VyX2N1bSA8LSBjdW1zdW0oaW50ZXJ2YWxvJGxvd2VyKQ0KIyBpbnRlcnZhbG8kcHJlZF9jdW0gPC0gY3Vtc3VtKGludGVydmFsbyRwcmVkKQ0KIyBpbnRlcnZhbG8kdXBwZXJfY3VtIDwtIGN1bXN1bShpbnRlcnZhbG8kdXBwZXIpDQojIGludGVydmFsbyR0aWVtcG8gPC0gMTpucm93KGludGVydmFsbykNCiMgaW50ZXJ2YWxvJGFjdW11bGFkbyA8LSBOQQ0KIyBpbnRlcnZhbG9bMTpsZW5ndGgoZGYkYWN1bXVsYWRvKSxdJGFjdW11bGFkbyA8LSBkZiRhY3VtdWxhZG8NCiMgaW50ZXJ2YWxvJGNvbnRlbyA8LSBOQQ0KIyBpbnRlcnZhbG9bMTpsZW5ndGgoZGYkY29udGVvKSxdJGNvbnRlbyA8LSBkZiRjb250ZW8NCiMgbmFtZXMoaW50ZXJ2YWxvKSA8LSBjKA0KIyAgICJsb3dlciIsICJwcmVkIiwgInVwcGVyIiwgImxvd2VyX2N1bSIsICJwcmVkX2N1bSIsICJ1cHBlcl9jdW0iLCAidGllbXBvIiwgImFjdW11bGFkbyIsICJjb250ZW8iKQ0KIyANCiMgaW50ZXJ2YWxvJGZlY2hhcyA8LSBhc19kYXRlKGFzLkRhdGUoIjIwMjAvMDMvMDYiKTooYXMuRGF0ZSgiMjAyMC8wMy8wNiIpICsgbnJvdyhpbnRlcnZhbG8pLTEpKQ0KIyANCiMgDQojIA0KIyANCiMgaW50ZXJ2YWxvJHBydWViYSA8LSBOQQ0KIyBpbnRlcnZhbG9bMTpsZW5ndGgoZml0JEkpLF0kcHJ1ZWJhIDwtIGZpdCRJDQojIGludGVydmFsbyRwcnVlYmEyIDwtIE5BDQojIGFqdXN0ZSA8LSBwcmVkaWN0KG9iamVjdCA9IG1vZGVsbyxuZXdkYXRhID0gZGF0YS5mcmFtZSh0aWVtcG8gPSAxOnJvdW5kKG1lZGlhK2Rpc3BlcikpLHR5cGUgPSAicmVzcG9uc2UiKQ0KIyBpbnRlcnZhbG9bMTpsZW5ndGgoYWp1c3RlKSxdJHBydWViYTIgPC0gYWp1c3RlDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQphanVzdGUgJT4lIHNlbGVjdChmZWNoYXMsIHByZWQsIHByZWRfY3VtLCBjb250ZW8sICBhY3VtdWxhZG8pDQpgYGANCg0KQSBjb250aW51YWNpw7NuIHNlIHJldmlzYSBlbCBhanVzdGUgbWVkaWFudGUgZWwgZ3LDoWZpY28gZGUgY2Fzb3MgYWN1bXVsYWRvcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFqdXN0ZSAlPiUgZ2dwbG90KGFlcyh4ID0gdGllbXBvKSkgKyBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkX2N1bSxjb2xvdXIgPSAiUmVkIikpICtnZW9tX3BvaW50KGFlcyh5ID0gYWN1bXVsYWRvKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCBucm93KGFqdXN0ZSkpLCBicmVha3MgPSBzZXEoMCwgMzAwLCBieSA9IDIpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsc2l6ZT03LCB2anVzdCA9IDAuNSkpICsgeWxhYigiUHJlZGljY2lvbmVzIGRlIGNhc29zIHNpbXVsYWRvcyIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFqdXN0ZSAlPiUgZ2dwbG90KGFlcyh4ID0gdGllbXBvKSkgKyBnZW9tX2xpbmUoYWVzKHkgPSBwcmVkLGNvbG91ciA9ICJSZWQiKSkgKyBnZW9tX3BvaW50KGFlcyh5ID0gY29udGVvKSkgKyBnZW9tX2xpbmUoYWVzKHkgPSBjb250ZW8pKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIG5yb3coYWp1c3RlKSksIGJyZWFrcyA9IHNlcSgwLCAzMDAsIGJ5ID0gMikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbWF4KGFqdXN0ZSRjb250ZW8sbmEucm0gPSBUKSs1MDApLCBicmVha3MgPSBzZXEoMCwgbWF4KGFqdXN0ZSRjb250ZW8sbmEucm0gPSBUKSs1MDAsIGJ5ID0gMTAwMCkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIixheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT05MCxzaXplPTcsIHZqdXN0ID0gMC41KSkgKyB5bGFiKCJQcmVkaWNjaW9uZXMgZGUgY2Fzb3Mgc2ltdWxhZG9zIGRpYXJpb3MiKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm9wZW54bHN4Ojp3cml0ZS54bHN4KHggPSBhanVzdGUsZmlsZSA9ICJyZXMvaW50ZXJ2YWxvLnhsc3giKQ0KYGBgDQo=