NEW analyses 12/02

CogState scores by group: Linear models (2 groups w/premorbid IQ & remote/non-remote)

2 groups: Non-PTSD (low-exposed controls & resilient); PTSD

Reference group = Non-PTSD

NO participants in the PTSD group completed the CogState remotely so cannot look at interaction

We see effects of PTSD vs non-PTSD on GML, GMR, ISRL (but only when standarized IQ is in model)

Groton maze learning test (Executive function)


Call:
lm(formula = score ~ group_2grp * wtar_standard + cogState_remote, 
    data = gml)

Residuals:
    Min      1Q  Median      3Q     Max 
-23.188 -11.051  -2.282   8.155  44.707 

Coefficients:
                             Estimate Std. Error t value Pr(>|t|)   
(Intercept)                  104.9436    32.0552   3.274  0.00213 **
group_2grpPTSD               -95.1573    52.6810  -1.806  0.07804 . 
wtar_standard                 -0.4688     0.2865  -1.637  0.10921   
cogState_remote1               5.8503     6.1573   0.950  0.34748   
group_2grpPTSD:wtar_standard   0.9285     0.4962   1.871  0.06828 . 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 15.15 on 42 degrees of freedom
  (6 observations deleted due to missingness)
Multiple R-squared:  0.112, Adjusted R-squared:  0.02746 
F-statistic: 1.325 on 4 and 42 DF,  p-value: 0.2766
`geom_smooth()` using formula 'y ~ x'

(In the above plot, TRUE = standardized WTAR is above the sample mean)

Groton maze learning test - delayed recall (Memory)


Call:
lm(formula = score ~ group_2grp * wtar_standard + cogState_remote, 
    data = gmr)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.3581 -2.9329  0.1011  2.2804  7.9636 

Coefficients:
                              Estimate Std. Error t value Pr(>|t|)   
(Intercept)                   25.78259    7.56086   3.410   0.0015 **
group_2grpPTSD               -29.20027   12.25624  -2.382   0.0220 * 
wtar_standard                 -0.15747    0.06758  -2.330   0.0249 * 
cogState_remote1              -2.82138    1.59295  -1.771   0.0842 . 
group_2grpPTSD:wtar_standard   0.26307    0.11534   2.281   0.0280 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.496 on 40 degrees of freedom
  (8 observations deleted due to missingness)
Multiple R-squared:  0.2076,    Adjusted R-squared:  0.1284 
F-statistic: 2.621 on 4 and 40 DF,  p-value: 0.04903
`geom_smooth()` using formula 'y ~ x'

(In the above plot, TRUE = standardized WTAR is above the sample mean)

International shopping list - delayed recall (Verbal memory)


Call:
lm(formula = score ~ group_2grp * wtar_standard + cogState_remote, 
    data = isrl)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.2657 -0.9958  0.2083  1.0347  2.8018 

Coefficients:
                              Estimate Std. Error t value Pr(>|t|)    
(Intercept)                   13.21375    3.39601   3.891 0.000369 ***
group_2grpPTSD               -12.91514    5.52466  -2.338 0.024491 *  
wtar_standard                 -0.03374    0.03038  -1.111 0.273267    
cogState_remote1               0.42271    0.67874   0.623 0.536960    
group_2grpPTSD:wtar_standard   0.12402    0.05202   2.384 0.021945 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.579 on 40 degrees of freedom
  (8 observations deleted due to missingness)
Multiple R-squared:  0.1333,    Adjusted R-squared:  0.04664 
F-statistic: 1.538 on 4 and 40 DF,  p-value: 0.2096
`geom_smooth()` using formula 'y ~ x'

(In the above plot, TRUE = standardized WTAR is above the sample mean)

 

 

 

 

 

 

 

  # 11/30/21

Number of exposures and CogState

New analyses 11/28/21

NEW: Premorbid IQ (WTAR)

3 groups

2 groups

NEW: CogState scores by group: Linear models (2 groups w/premorbid IQ & REMOTE)

2 groups: Non-PTSD (low-exposed controls & resilient); PTSD

Reference group = Non-PTSD

NO participants in the PTSD group completed the CogState remotely so cannot look at interaction

Detection test (Psychomotor function)

(not administered remotely)

Groton maze learning test (Executive function)

Groton maze learning - delayed recall test (Memory)

Identification test (Attention)

(not administered remotely)

International shopping list test (Verbal learning)

International shopping list - delayed recall test (Memory)

One-card learning test (Visual memory)

One-back test (Working memory)

(not administered remotely)

Composite score

LS0tCnRpdGxlOiAiQ29nc3RhdGUgZm9yIGdyYW50IHN1Ym1pc3Npb24iCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpybShsaXN0ID0gbHMoKSkKc2V0d2QoIi9Wb2x1bWVzL0V4dGVybmFsL1dUQ19yZXNpbGllbmNlX2ltYWdpbmcvYW5hbHlzaXMiKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2djb3JycGxvdCkKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3JlcGVsKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KI2ltcG9ydCBzY29yZWQgQ29nU3RhdGUgZGF0YSBmcm9tIGRhdGFzZXQgdy9vIG1pc3NpbmcgaW1wdXRlZApjc2RhdDwtcmVhZC5jc3YoJy9Wb2x1bWVzL0V4dGVybmFsL1dUQ19yZXNpbGllbmNlX2ltYWdpbmcvZGF0YS9jb2dzdGF0ZV9kYXRhL2NvZ3N0YXRlX291dHB1dF9zY29yZWRfMTEyNzIxLmNzdicpWy1jKDEpXQpkYXRhPC1yZWFkLmNzdignL1ZvbHVtZXMvRXh0ZXJuYWwvV1RDX3Jlc2lsaWVuY2VfaW1hZ2luZy9kYXRhL2NsaW5pY2FsX2RhdGEvbWFzdGVyX2NsaW5pY2FsX2RlbW9nX2luZGl2XzExMjQyMS5jc3YnKVstYygxKV0gCgojIGZvciBncm91cCB2YXJpYWJsZQpncnA8LXJlYWQudGFibGUoIi9Wb2x1bWVzL0V4dGVybmFsL1dUQ19yZXNpbGllbmNlX2ltYWdpbmcvZGF0YS9CSURTX2RhdGEvcGFydGljaXBhbnRzY3VycmVudC50c3YiLCBzZXAgPSAiXHQiLCBoZWFkZXIgPSBUUlVFKQpncnAgPC0gZHBseXI6OnJlbmFtZShncnAsIGJpZHNfaWQgPSBCSURTX0lELCBncm91cCA9IGdyb3VwLmZhY3Rvci55KQpncnA8LWRwbHlyOjpzZWxlY3QoZ3JwLCBjKGJpZHNfaWQgLCBncm91cCkpICU+JSBtdXRhdGUoZ3JvdXAgPSBhcy5mYWN0b3IoZ3JvdXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfUFRTRHJlZiA9IHJlbGV2ZWwoZ3JvdXAsICJTeW1wdG9tYXRpYyAoUFRTRCkiKSkKCgojbWVyZ2UgdG9nZXRoZXIKZGF0YTE8LWxlZnRfam9pbihjc2RhdCwgZGF0YSwgYnk9InJlY29yZF9pZCIpCmRhdGE8LWxlZnRfam9pbihkYXRhMSwgZ3JwLCBieT0iYmlkc19pZCIpCgpkYXRhJGdyb3VwW2RhdGEkcmVjb3JkX2lkPT0iTldUQy0wMzQiXTwtIkxvdy1FeHBvc2VkIENvbnRyb2wiCmRhdGEkZ3JvdXBfUFRTRHJlZltkYXRhJHJlY29yZF9pZD09Ik5XVEMtMDM0Il08LSJMb3ctRXhwb3NlZCBDb250cm9sIgpkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZShncm91cF8yZ3JwID0gaWZlbHNlKGdyb3VwPT0iU3ltcHRvbWF0aWMgKFBUU0QpIiwgIlBUU0QiLCJOb24tUFRTRCIpKSAlPiUgZmlsdGVyKCFncm91cCAlaW4lIGMoTkEpKQoKIyMgYWRkIGluIHJlbW90ZSB2cy4gaW4tcGVyc29uIENvZ1N0YXRlIGNvbXBsZXRpb24KcmVtb3RlcyA8LSBjKCJOV1RDLTA1OSIsCQoiTldUQy0wNjAiLAoiTldUQy0wNjIiLAoiTldUQy0wNjciLAoiTldUQy0wNjgiLAoiTldUQy0wNzAiLAoiTldUQy0wNzIiLAoiTldUQy0wNzMiLAkKIk5XVEMtMDc0IiwKIk5XVEMtMDc4IiwKIk5XVEMtMDgyIikKCmRhdGEkV1RDZXhwb3N1cmVfc2NvcmVbZGF0YSRyZWNvcmRfaWQ9PSJOV1RDLTAzNCJdPC0yCmRhdGEkV1RDZXhwb3N1cmVfc2NvcmVbZGF0YSRyZWNvcmRfaWQ9PSJOV1RDLTA2OCJdPC00CmRhdGEkV1RDZXhwb3N1cmVfc2NvcmVbZGF0YSRyZWNvcmRfaWQ9PSJOV1RDLTA3MyJdPC01CmRhdGEkV1RDZXhwb3N1cmVfc2NvcmVbZGF0YSRyZWNvcmRfaWQ9PSJOV1RDLTA3NCJdPC00CmRhdGEkV1RDZXhwb3N1cmVfc2NvcmVbZGF0YSRyZWNvcmRfaWQ9PSJOV1RDLTA3NiJdPC0yCmRhdGEkV1RDZXhwb3N1cmVfc2NvcmVbZGF0YSRyZWNvcmRfaWQ9PSJOV1RDLTA3OCJdPC00CgpkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZShjb2dTdGF0ZV9yZW1vdGUgPSBpZl9lbHNlKHJlY29yZF9pZCAlaW4lIHJlbW90ZXMsIDEsMCksCiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19leHBvc2VkID0gaWZfZWxzZShXVENleHBvc3VyZV9zY29yZTw9MywgMSwwKSkgIyBjcmVhdGUgdmFyaWFibGUgZm9yIHdobyBjb21wbGV0ZWQgY29nc3RhdGUgcmVtb3RlbHkgJiBoaWdoL2xvdyBleHBvc2VkCgojZGF0YSAlPiUgZHBseXI6OmZpbHRlcihpcy5uYShXVENleHBvc3VyZV9zY29yZSkpICU+JSBzZWxlY3QocmVjb3JkX2lkLFdUQ2V4cG9zdXJlX3Njb3JlKQoKCgoKIyBob3cgbWFueSBpbiBlYWNoIGdyb3VwPwojIGRhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoIWdyb3VwICVpbiUgYyhOQSkpICU+JSBjb3VudChncm91cCwgY29nU3RhdGVfcmVtb3RlKSAKIyA3IGxvdyBleHBvc2VkIGNvbnRyb2wsIDMwIHJlc2lsaWVudCwgMTYgcHRzZApgYGAKCgojIE5FVyBhbmFseXNlcyAxMi8wMgoKIyMgQ29nU3RhdGUgc2NvcmVzIGJ5IGdyb3VwOiBMaW5lYXIgbW9kZWxzICgyIGdyb3VwcyB3L3ByZW1vcmJpZCBJUSAmIHJlbW90ZS9ub24tcmVtb3RlKQoKMiBncm91cHM6IE5vbi1QVFNEIChsb3ctZXhwb3NlZCBjb250cm9scyAmIHJlc2lsaWVudCk7IFBUU0QKClJlZmVyZW5jZSBncm91cCA9IE5vbi1QVFNECgo8Zm9udCBjb2xvcj0icmVkIj4qKk5PIHBhcnRpY2lwYW50cyBpbiB0aGUgUFRTRCBncm91cCBjb21wbGV0ZWQgdGhlIENvZ1N0YXRlIHJlbW90ZWx5IHNvIGNhbm5vdCBsb29rIGF0IGludGVyYWN0aW9uKio8L2ZvbnQ+Cgo8Zm9udCBjb2xvcj0iYmx1ZSI+KipXZSBzZWUgZWZmZWN0cyBvZiBQVFNEIHZzIG5vbi1QVFNEIG9uIEdNTCwgR01SLCBJU1JMIChidXQgb25seSB3aGVuIHN0YW5kYXJpemVkIElRIGlzIGluIG1vZGVsKSoqPC9mb250PgoKCgpgYGB7ciwgZWNobz1GQUxTRSxpbmNsdWRlPUZBTFNFfQojIGdldCByaWQgb2YgZHVwbGljYXRlIHZhcnMgKHVzZSBub24taW1wdXRlZCB2cy4gaW1wdXRlZCkKc2NvcmVzVyA8LSBkYXRhICU+JSBzZWxlY3RfYXQodmFycyhzdGFydHNfd2l0aCgic2NvcmUiKSAmICFlbmRzX3dpdGgoImludiIpIHwgc3RhcnRzX3dpdGgoImdyb3VwIikgfCBzdGFydHNfd2l0aCgicmVjb3JkIikgfCBzdGFydHNfd2l0aCgiYWdlIikgfCBzdGFydHNfd2l0aCgiZ2VuZGVyIikgfCBzdGFydHNfd2l0aCgiZWR1IikgfCBzdGFydHNfd2l0aCgiY29nU3RhdGVfcmVtb3RlIikgfCBzdGFydHNfd2l0aCgid3RhciIpKSkgCmNvbG5hbWVzKHNjb3Jlc1cpPC1nc3ViKCIueCIsIiIsY29sbmFtZXMoc2NvcmVzVykpCiNzY29yZXNXIDwtc2NvcmVzVyAlPiUgc2VsZWN0KCFtYXRjaGVzKCcxJHwyJHwzJHw0JHw1JCcpKQp1c2Uuc2NvcmVzVzwtc2NvcmVzVyAlPiUgc2VsZWN0X2F0KHZhcnMoc3RhcnRzX3dpdGgoInNjb3JlIil8c3RhcnRzX3dpdGgoImdyb3VwIil8c3RhcnRzX3dpdGgoImNvZ1N0YXRlXyIpKSkKY29sbmFtZXModXNlLnNjb3Jlc1cpPC1nc3ViKCJzY29yZS4iLCIiLGNvbG5hbWVzKHVzZS5zY29yZXNXKSkKCiMgIyB1c2UgaW1wdXRlZAojIHNjb3Jlc19pbXAgPC0gZGF0YSAlPiUgc2VsZWN0X2F0KHZhcnMoc3RhcnRzX3dpdGgoInVzZSIpICYgIWVuZHNfd2l0aCgiLngiKSB8IHN0YXJ0c193aXRoKCJncm91cCIpIHwgc3RhcnRzX3dpdGgoInJlY29yZCIpIHwgc3RhcnRzX3dpdGgoImFnZSIpIHwgc3RhcnRzX3dpdGgoImdlbmRlciIpIHwgc3RhcnRzX3dpdGgoImVkdSIpIHwgc3RhcnRzX3dpdGgoInd0YXIiKSkpIAojIGNvbG5hbWVzKHNjb3Jlc19pbXApPC1nc3ViKCIueSIsIiIsY29sbmFtZXMoc2NvcmVzX2ltcCkpCiMgI2NvbG5hbWVzKHNjb3Jlc19pbXApPC1nc3ViKCJ1c2UuIiwiIixjb2xuYW1lcyhzY29yZXMpKQojIHNjb3Jlc19pbXAgPC1zY29yZXNfaW1wICU+JSBzZWxlY3QoIW1hdGNoZXMoJzEkfDIkfDMkfDQkfDUkJykpCiMgdXNlLnNjb3Jlcy5pbXA8LXNjb3Jlc19pbXAgJT4lIHNlbGVjdF9hdCh2YXJzKHN0YXJ0c193aXRoKCJ1c2UiKXxzdGFydHNfd2l0aCgiZ3JvdXAiKSkpCgojIHdpZGUgdG8gbG9uZwpzY29yZXNMPC1nYXRoZXIoc2NvcmVzVywga2V5PSJ0ZXN0IiwgdmFsdWU9InNjb3JlIiwgLWMocmVjb3JkX2lkLCBncm91cCxncm91cF9QVFNEcmVmLGdyb3VwXzJncnAsYWdlLGdlbmRlcixnZW5kZXJfMWlzTSxnZW5kZXJfMWlzRixlZHVjYXRpb25MZXZlbCx3dGFyX3N0YW5kYXJkLGNvZ1N0YXRlX3JlbW90ZSkpCnNjb3Jlc0w8LXNjb3Jlc0wgJT4lIG11dGF0ZSh0ZXN0ID0gYXMuZmFjdG9yKHRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2dTdGF0ZV9yZW1vdGUgPSBhcy5mYWN0b3IoY29nU3RhdGVfcmVtb3RlKSkKdXNlLnNjb3Jlc0w8LWdhdGhlcih1c2Uuc2NvcmVzVyxrZXk9InRlc3QiLCB2YWx1ZT0ic2NvcmUiLCAtYyhncm91cCxncm91cF9QVFNEcmVmLGdyb3VwXzJncnApKSAlPiUgZmlsdGVyKCFpcy5uYShzY29yZSkpCgpkZXQgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5ERVQiKQpnbWwgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5HTUwiKQpnbXIgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5HTVIiKQppZG4gPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5JRE4iKQppc2wgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5JU0wiKQppc3JsIDwtIHNjb3Jlc0wgJT4lIGZpbHRlcih0ZXN0PT0ic2NvcmUuSVNSTCIpCm9jbCA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLk9DTCIpCm9uYiA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLk9OQiIpCgpkYXRhIDwtIGRhdGElPiUgbXV0YXRlKGdyb3VwXzJncnBCaW5hcnkgPSBpZmVsc2UoZ3JvdXBfMmdycD09IlBUU0QiLDEsMCkpCmRhdGEgPC0gZGF0YSU+JSBtdXRhdGUoZ3JwX3hfd3RhciA9IChncm91cF8yZ3JwQmluYXJ5Knd0YXJfc3RhbmRhcmQpKQpgYGAKCiMjIyBHcm90b24gbWF6ZSBsZWFybmluZyB0ZXN0IChFeGVjdXRpdmUgZnVuY3Rpb24pCmBgYHtyfQptMiA8LSBsbShzY29yZSB+IGdyb3VwXzJncnAqd3Rhcl9zdGFuZGFyZCtjb2dTdGF0ZV9yZW1vdGUsIGdtbCkKc3VtbWFyeShtMikKCiBwMSA8LSBnZ3Bsb3QobTJbWyJtb2RlbCJdXSwgYWVzKGNvbG9yPWdyb3VwXzJncnAsIHg9KHd0YXJfc3RhbmRhcmQtbWVhbih3dGFyX3N0YW5kYXJkKSksIHk9c2NvcmUpKSArIAogICBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikrIHhsYWIoIklRIGVzdGltYXRlIChtZWFuLWNlbnRlcmVkKSIpICsgeWxhYigiR01MIHBlcmZvcm1hbmNlIChoaWdoZXI9d29yc2UpIikgKyB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyBmYWNldF93cmFwKH4gZ3JvdXBfMmdycCkgCiBwMQogCiAgIHAxIDwtIGdncGxvdChtMltbIm1vZGVsIl1dLCBhZXMoY29sb3I9Z3JvdXBfMmdycCwgeD1ncm91cF8yZ3JwLCB5PXNjb3JlKSkgKyAKICAgZ2VvbV9ib3hwbG90KCkrIGdlb21fcG9pbnQoKSArIHhsYWIoImdyb3VwIikgKyB5bGFiKCJHTUwgcGVyZm9ybWFuY2UgKGhpZ2hlcj13b3JzZSkiKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIGZhY2V0X3dyYXAofiB3dGFyX3N0YW5kYXJkPj1tZWFuKHd0YXJfc3RhbmRhcmQpKSAKIHAxCmBgYAooSW4gdGhlIGFib3ZlIHBsb3QsIFRSVUUgPSBzdGFuZGFyZGl6ZWQgV1RBUiBpcyBhYm92ZSB0aGUgc2FtcGxlIG1lYW4pCgoKIyMjIEdyb3RvbiBtYXplIGxlYXJuaW5nIHRlc3QgLSBkZWxheWVkIHJlY2FsbCAoTWVtb3J5KQoKYGBge3J9Cm0zIDwtIGxtKHNjb3JlIH4gZ3JvdXBfMmdycCp3dGFyX3N0YW5kYXJkK2NvZ1N0YXRlX3JlbW90ZSwgZ21yKQpzdW1tYXJ5KG0zKQoKIHAxIDwtIGdncGxvdChtM1tbIm1vZGVsIl1dLCBhZXMoY29sb3I9Z3JvdXBfMmdycCwgeD0od3Rhcl9zdGFuZGFyZC1tZWFuKHd0YXJfc3RhbmRhcmQpKSwgeT1zY29yZSkpICsgCiAgIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSsgeGxhYigiSVEgZXN0aW1hdGUgKG1lYW4tY2VudGVyZWQpIikgKyB5bGFiKCJHTVIgcGVyZm9ybWFuY2UgKGhpZ2hlcj13b3JzZSkiKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIGZhY2V0X3dyYXAofiBncm91cF8yZ3JwKSAKIHAxCiAKICAgcDEgPC0gZ2dwbG90KG0zW1sibW9kZWwiXV0sIGFlcyhjb2xvcj1ncm91cF8yZ3JwLCB4PWdyb3VwXzJncnAsIHk9c2NvcmUpKSArIAogICBnZW9tX2JveHBsb3QoKSsgZ2VvbV9wb2ludCgpICsgIHhsYWIoImdyb3VwIikgKyB5bGFiKCJHTVIgcGVyZm9ybWFuY2UgKGhpZ2hlcj13b3JzZSkiKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIGZhY2V0X3dyYXAofiB3dGFyX3N0YW5kYXJkPj1tZWFuKHd0YXJfc3RhbmRhcmQpKSAKIHAxCmBgYAooSW4gdGhlIGFib3ZlIHBsb3QsIFRSVUUgPSBzdGFuZGFyZGl6ZWQgV1RBUiBpcyBhYm92ZSB0aGUgc2FtcGxlIG1lYW4pCgoKCiMjIyBJbnRlcm5hdGlvbmFsIHNob3BwaW5nIGxpc3QgLSBkZWxheWVkIHJlY2FsbCAoVmVyYmFsIG1lbW9yeSkKYGBge3J9Cm0zIDwtIGxtKHNjb3JlIH4gZ3JvdXBfMmdycCp3dGFyX3N0YW5kYXJkK2NvZ1N0YXRlX3JlbW90ZSwgaXNybCkKc3VtbWFyeShtMykKCiBwMSA8LSBnZ3Bsb3QobTNbWyJtb2RlbCJdXSwgYWVzKGNvbG9yPWdyb3VwXzJncnAsIHg9KHd0YXJfc3RhbmRhcmQtbWVhbih3dGFyX3N0YW5kYXJkKSksIHk9c2NvcmUpKSArIAogICBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikrIHhsYWIoIklRIGVzdGltYXRlIChtZWFuLWNlbnRlcmVkKSIpICsgeWxhYigiSVNSTCBwZXJmb3JtYW5jZSAoaGlnaGVyPWJldHRlcikiKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIGZhY2V0X3dyYXAofiBncm91cF8yZ3JwKSAKIHAxCiAKICAgcDEgPC0gZ2dwbG90KG0zW1sibW9kZWwiXV0sIGFlcyhjb2xvcj1ncm91cF8yZ3JwLCB4PWdyb3VwXzJncnAsIHk9c2NvcmUpKSArIAogICBnZW9tX2JveHBsb3QoKSsgZ2VvbV9wb2ludCgpICsgIHhsYWIoImdyb3VwIikgKyB5bGFiKCJJU1JMIHBlcmZvcm1hbmNlIChoaWdoZXI9YmV0dGVyKSIpICsgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNikpICsgZmFjZXRfd3JhcCh+IHd0YXJfc3RhbmRhcmQ+PW1lYW4od3Rhcl9zdGFuZGFyZCkpIAogcDEKYGBgCihJbiB0aGUgYWJvdmUgcGxvdCwgVFJVRSA9IHN0YW5kYXJkaXplZCBXVEFSIGlzIGFib3ZlIHRoZSBzYW1wbGUgbWVhbikKCgoKPHA+Jm5ic3A7CjxwPiZuYnNwOwo8cD4mbmJzcDs8cD4mbmJzcDsKPHA+Jm5ic3A7PHA+Jm5ic3A7PHA+Jm5ic3A7PHA+Jm5ic3A7CiMgMTEvMzAvMjEKCiMjIE51bWJlciBvZiBleHBvc3VyZXMgYW5kIENvZ1N0YXRlCgpgYGB7cn0KI2ZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTgKZGF0IDwtIGRhdGEgJT4lIHNlbGVjdF9hdCh2YXJzKHN0YXJ0c193aXRoKCJ1c2UiKSAmICFlbmRzX3dpdGgoIi55IikgfCBzdGFydHNfd2l0aCgiYWdlIikgfCBzdGFydHNfd2l0aCgiV1RDZXhwb3N1cmVfc2NvcmUiKSB8IHN0YXJ0c193aXRoKCJ3dGFyIikgfCBzdGFydHNfd2l0aCgiZ3JvdXAiKSkpIApjb2xuYW1lcyhkYXQpPC1nc3ViKCIueCIsIiIsY29sbmFtZXMoZGF0KSkKZGF0VyA8LSBkYXQgJT4lIHNlbGVjdCghbWF0Y2hlcygnMSR8MiR8MyR8NCR8NSQnKSkKZGF0TDwtZ2F0aGVyKGRhdCxrZXk9InRlc3QiLCB2YWx1ZT0ic2NvcmUiLCAtYyhncm91cCxncm91cF8yZ3JwLGdyb3VwX1BUU0RyZWYsYWdlLFdUQ3Bvc3VyZV9zY29yZSx3dGFyX3N0YW5kYXJkKSkgJT4lIGZpbHRlcighaXMubmEoc2NvcmUpKQoKIHAxIDwtIGdncGxvdChkYXRMLCBhZXMoY29sb3I9dGVzdCwgeT1XVENwb3N1cmVfc2NvcmUsIHg9c2NvcmUpKSArIAogICBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikrIHlsYWIoIm4gZXhwb3N1cmVzIikgKyB4bGFiKCJzY29yZXMiKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIGZhY2V0X3dyYXAoLiB+IHRlc3QsIG5jb2w9MikgCiBwMQpgYGAKIApgYGB7cn0KIHN1bW1hcnkobG0odXNlLkdNUiB+IFdUQ3Bvc3VyZV9zY29yZSpncm91cF8yZ3JwLGRhdFcpKQogCiAgcDEgPC0gZ2dwbG90KGRhdFcsIGFlcyhjb2xvcj1ncm91cF8yZ3JwLCB5PVdUQ3Bvc3VyZV9zY29yZSwgeD11c2UuR01SKSkgKyAKICAgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyB5bGFiKCJuIGV4cG9zdXJlcyIpICsgeGxhYigic2NvcmVzIikgKyB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyBmYWNldF93cmFwKH4gZ3JvdXBfMmdycCkgCiBwMQpgYGAKCmBgYHtyfQogc3VtbWFyeShsbSh1c2UuR01MIH4gV1RDcG9zdXJlX3Njb3JlKmdyb3VwXzJncnAsZGF0VykpCiAKICBwMSA8LSBnZ3Bsb3QoZGF0VywgYWVzKGNvbG9yPWdyb3VwXzJncnAsIHk9V1RDcG9zdXJlX3Njb3JlLCB4PXVzZS5HTUwpKSArIAogICBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikrIHlsYWIoIm4gZXhwb3N1cmVzIikgKyB4bGFiKCJzY29yZXMiKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIGZhY2V0X3dyYXAofiBncm91cF8yZ3JwKSAKIHAxCmBgYAoKYGBge3J9CiBzdW1tYXJ5KGxtKHVzZS5JRE4gfiBXVENwb3N1cmVfc2NvcmUqZ3JvdXBfMmdycCxkYXRXKSkKIAogIHAxIDwtIGdncGxvdChkYXRXLCBhZXMoY29sb3I9Z3JvdXBfMmdycCwgeT1XVENwb3N1cmVfc2NvcmUsIHg9dXNlLklETikpICsgCiAgIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSsgeWxhYigibiBleHBvc3VyZXMiKSArIHhsYWIoInNjb3JlcyIpICsgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNikpICsgZmFjZXRfd3JhcCh+IGdyb3VwXzJncnApIAogcDEKYGBgCgpgYGB7cn0KIHN1bW1hcnkobG0odXNlLkRFVCB+IFdUQ3Bvc3VyZV9zY29yZSpncm91cF8yZ3JwLGRhdFcpKQogCiAgcDEgPC0gZ2dwbG90KGRhdFcsIGFlcyhjb2xvcj1ncm91cF8yZ3JwLCB5PVdUQ3Bvc3VyZV9zY29yZSwgeD11c2UuREVUKSkgKyAKICAgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyB5bGFiKCJuIGV4cG9zdXJlcyIpICsgeGxhYigic2NvcmVzIikgKyB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyBmYWNldF93cmFwKH4gZ3JvdXBfMmdycCkgCiBwMQpgYGAKCgoKCiMgTmV3IGFuYWx5c2VzIDExLzI4LzIxCgoKIyMgTkVXOiBQcmVtb3JiaWQgSVEgKFdUQVIpCgojIyMgMyBncm91cHMKYGBge3J9CiMgMyBncm91cHMsIFBUU0QgZ3JvdXAgaXMgcmVmZXJlbmNlIGxldmVsCnN1bW1hcnkobG0od3Rhcl9zdGFuZGFyZCB+IGdyb3VwX1BUU0RyZWYsIGRhdGEpKQoKcDEgPC0gZ2dwbG90KGRhdGEsIGFlcyhjb2xvcj1ncm91cCwgeT13dGFyX3N0YW5kYXJkLCB4PWdyb3VwKSkgKyAKICAgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMSkgKwogICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiM2MTlDRkYiLCIjMDBCQTM4IiwiI0Y4NzY2RCIpLG5hbWU9Ikdyb3VwIikgKyB5bGFiKCJXVEFSIChoaWdoZXI9YmV0dGVyKSIpICsgeGxhYigiR3JvdXAiKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLCBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTE2LCBhbmdsZT05MCwgaGp1c3QgPSAwLjk1KSkKIHAxCmBgYAoKCgojIyMgMiBncm91cHMKYGBge3J9CiAKIyAyIGdyb3Vwcywgbm9uLVBUU0QgZ3JvdXAgaXMgcmVmZXJlbmNlIGxldmVsCnQudGVzdCh3dGFyX3N0YW5kYXJkIH4gZ3JvdXBfMmdycCwgZGF0YSkKCnAxIDwtIGdncGxvdChkYXRhLCBhZXMoY29sb3I9Z3JvdXBfMmdycCwgeT13dGFyX3N0YW5kYXJkLCB4PWdyb3VwXzJncnApKSArIAogICBnZW9tX2JveHBsb3QoKSArIGdlb21fcG9pbnQoKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4xKSArCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzYxOUNGRiIsIiNGODc2NkQiKSxuYW1lPSJHcm91cCIpICsgeWxhYigiV1RBUiAoaGlnaGVyPWJldHRlcikiKSArIHhsYWIoIkdyb3VwIikgKyB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSxheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xNiwgYW5nbGU9OTAsIGhqdXN0ID0gMC45NSkpCiBwMQoKYGBgCgoKCgoKIyMgTkVXOiBDb2dTdGF0ZSBzY29yZXMgYnkgZ3JvdXA6IExpbmVhciBtb2RlbHMgKDIgZ3JvdXBzIHcvcHJlbW9yYmlkIElRICYgKlJFTU9URSopCgoyIGdyb3VwczogTm9uLVBUU0QgKGxvdy1leHBvc2VkIGNvbnRyb2xzICYgcmVzaWxpZW50KTsgUFRTRAoKUmVmZXJlbmNlIGdyb3VwID0gTm9uLVBUU0QKCjxmb250IGNvbG9yPSJyZWQiPioqTk8gcGFydGljaXBhbnRzIGluIHRoZSBQVFNEIGdyb3VwIGNvbXBsZXRlZCB0aGUgQ29nU3RhdGUgcmVtb3RlbHkgc28gY2Fubm90IGxvb2sgYXQgaW50ZXJhY3Rpb24qKjwvZm9udD4KCgoKYGBge3J9CiMgZ2V0IHJpZCBvZiBkdXBsaWNhdGUgdmFycyAodXNlIG5vbi1pbXB1dGVkIHZzLiBpbXB1dGVkKQpzY29yZXNXIDwtIGRhdGEgJT4lIHNlbGVjdF9hdCh2YXJzKHN0YXJ0c193aXRoKCJzY29yZSIpICYgIWVuZHNfd2l0aCgiaW52IikgfCBzdGFydHNfd2l0aCgiZ3JvdXAiKSB8IHN0YXJ0c193aXRoKCJyZWNvcmQiKSB8IHN0YXJ0c193aXRoKCJhZ2UiKSB8IHN0YXJ0c193aXRoKCJnZW5kZXIiKSB8IHN0YXJ0c193aXRoKCJlZHUiKSB8IHN0YXJ0c193aXRoKCJjb2dTdGF0ZV9yZW1vdGUiKSB8IHN0YXJ0c193aXRoKCJ3dGFyIikpKSAKY29sbmFtZXMoc2NvcmVzVyk8LWdzdWIoIi54IiwiIixjb2xuYW1lcyhzY29yZXNXKSkKI3Njb3Jlc1cgPC1zY29yZXNXICU+JSBzZWxlY3QoIW1hdGNoZXMoJzEkfDIkfDMkfDQkfDUkJykpCnVzZS5zY29yZXNXPC1zY29yZXNXICU+JSBzZWxlY3RfYXQodmFycyhzdGFydHNfd2l0aCgic2NvcmUiKXxzdGFydHNfd2l0aCgiZ3JvdXAiKXxzdGFydHNfd2l0aCgiY29nU3RhdGVfIikpKQpjb2xuYW1lcyh1c2Uuc2NvcmVzVyk8LWdzdWIoInNjb3JlLiIsIiIsY29sbmFtZXModXNlLnNjb3Jlc1cpKQoKIyAjIHVzZSBpbXB1dGVkCiMgc2NvcmVzX2ltcCA8LSBkYXRhICU+JSBzZWxlY3RfYXQodmFycyhzdGFydHNfd2l0aCgidXNlIikgJiAhZW5kc193aXRoKCIueCIpIHwgc3RhcnRzX3dpdGgoImdyb3VwIikgfCBzdGFydHNfd2l0aCgicmVjb3JkIikgfCBzdGFydHNfd2l0aCgiYWdlIikgfCBzdGFydHNfd2l0aCgiZ2VuZGVyIikgfCBzdGFydHNfd2l0aCgiZWR1IikgfCBzdGFydHNfd2l0aCgid3RhciIpKSkgCiMgY29sbmFtZXMoc2NvcmVzX2ltcCk8LWdzdWIoIi55IiwiIixjb2xuYW1lcyhzY29yZXNfaW1wKSkKIyAjY29sbmFtZXMoc2NvcmVzX2ltcCk8LWdzdWIoInVzZS4iLCIiLGNvbG5hbWVzKHNjb3JlcykpCiMgc2NvcmVzX2ltcCA8LXNjb3Jlc19pbXAgJT4lIHNlbGVjdCghbWF0Y2hlcygnMSR8MiR8MyR8NCR8NSQnKSkKIyB1c2Uuc2NvcmVzLmltcDwtc2NvcmVzX2ltcCAlPiUgc2VsZWN0X2F0KHZhcnMoc3RhcnRzX3dpdGgoInVzZSIpfHN0YXJ0c193aXRoKCJncm91cCIpKSkKCiMgd2lkZSB0byBsb25nCnNjb3Jlc0w8LWdhdGhlcihzY29yZXNXLCBrZXk9InRlc3QiLCB2YWx1ZT0ic2NvcmUiLCAtYyhyZWNvcmRfaWQsIGdyb3VwLGdyb3VwX1BUU0RyZWYsZ3JvdXBfMmdycCxhZ2UsZ2VuZGVyLGdlbmRlcl8xaXNNLGdlbmRlcl8xaXNGLGVkdWNhdGlvbkxldmVsLHd0YXJfc3RhbmRhcmQsY29nU3RhdGVfcmVtb3RlKSkKc2NvcmVzTDwtc2NvcmVzTCAlPiUgbXV0YXRlKHRlc3QgPSBhcy5mYWN0b3IodGVzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZ1N0YXRlX3JlbW90ZSA9IGFzLmZhY3Rvcihjb2dTdGF0ZV9yZW1vdGUpKQp1c2Uuc2NvcmVzTDwtZ2F0aGVyKHVzZS5zY29yZXNXLGtleT0idGVzdCIsIHZhbHVlPSJzY29yZSIsIC1jKGdyb3VwLGdyb3VwX1BUU0RyZWYsZ3JvdXBfMmdycCkpICU+JSBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkKCmRldCA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLkRFVCIpCmdtbCA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLkdNTCIpCmdtciA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLkdNUiIpCmlkbiA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLklETiIpCmlzbCA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLklTTCIpCmlzcmwgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5JU1JMIikKb2NsIDwtIHNjb3Jlc0wgJT4lIGZpbHRlcih0ZXN0PT0ic2NvcmUuT0NMIikKb25iIDwtIHNjb3Jlc0wgJT4lIGZpbHRlcih0ZXN0PT0ic2NvcmUuT05CIikKCmRhdGEgPC0gZGF0YSU+JSBtdXRhdGUoZ3JvdXBfMmdycEJpbmFyeSA9IGlmZWxzZShncm91cF8yZ3JwPT0iUFRTRCIsMSwwKSkKZGF0YSA8LSBkYXRhJT4lIG11dGF0ZShncnBfeF93dGFyID0gKGdyb3VwXzJncnBCaW5hcnkqd3Rhcl9zdGFuZGFyZCkpCmBgYAoKIyMjIERldGVjdGlvbiB0ZXN0IChQc3ljaG9tb3RvciBmdW5jdGlvbikKCihub3QgYWRtaW5pc3RlcmVkIHJlbW90ZWx5KQpgYGB7cn0KbTEgPC0gbG0oc2NvcmUgfiBncm91cF8yZ3JwKnd0YXJfc3RhbmRhcmQsIGRldCkKc3VtbWFyeShtMSkKYGBgCgojIyMgR3JvdG9uIG1hemUgbGVhcm5pbmcgdGVzdCAoRXhlY3V0aXZlIGZ1bmN0aW9uKQpgYGB7cn0KbTIgPC0gbG0oc2NvcmUgfiBncm91cF8yZ3JwKnd0YXJfc3RhbmRhcmQrY29nU3RhdGVfcmVtb3RlLCBnbWwpCnN1bW1hcnkobTIpCgogcDEgPC0gZ2dwbG90KG0yW1sibW9kZWwiXV0sIGFlcyhjb2xvcj1ncm91cF8yZ3JwLCB4PSh3dGFyX3N0YW5kYXJkLW1lYW4od3Rhcl9zdGFuZGFyZCkpLCB5PXNjb3JlKSkgKyAKICAgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpKyB4bGFiKCJJUSBlc3RpbWF0ZSAobWVhbi1jZW50ZXJlZCkiKSArIHlsYWIoIkdNTCBwZXJmb3JtYW5jZSAoaGlnaGVyPXdvcnNlKSIpICsgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNikpICsgZmFjZXRfd3JhcCh+IGdyb3VwXzJncnApIAogcDEKIAogIHAxIDwtIGdncGxvdChtMltbIm1vZGVsIl1dLCBhZXMoY29sb3I9Z3JvdXBfMmdycCwgeD1ncm91cF8yZ3JwLCB5PXNjb3JlKSkgKyAKICAgZ2VvbV9wb2ludCgpICsgZ2VvbV9ib3hwbG90KCkrIHhsYWIoIklRIGVzdGltYXRlIChtZWFuLWNlbnRlcmVkKSIpICsgeWxhYigiR01MIHBlcmZvcm1hbmNlIChoaWdoZXI9d29yc2UpIikgKyB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyBmYWNldF93cmFwKH4gd3Rhcl9zdGFuZGFyZD4xMTEpIAogcDEKIAogICBwMSA8LSBnZ3Bsb3QobTJbWyJtb2RlbCJdXSwgYWVzKGNvbG9yPWdyb3VwXzJncnAsIHg9Z3JvdXBfMmdycCwgeT1zY29yZSkpICsgCiAgIGdlb21fcG9pbnQoKSArIGdlb21fYm94cGxvdCgpKyB4bGFiKCJJUSBlc3RpbWF0ZSAobWVhbi1jZW50ZXJlZCkiKSArIHlsYWIoIkdNTCBwZXJmb3JtYW5jZSAoaGlnaGVyPXdvcnNlKSIpICsgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNikpICsgZmFjZXRfd3JhcCh+IHd0YXJfc3RhbmRhcmQ+MTExKSAKIHAxCmBgYAoKIyMjIEdyb3RvbiBtYXplIGxlYXJuaW5nIC0gZGVsYXllZCByZWNhbGwgdGVzdCAoTWVtb3J5KQpgYGB7cn0KbTMgPC0gbG0oc2NvcmUgfiBncm91cF8yZ3JwKnd0YXJfc3RhbmRhcmQrY29nU3RhdGVfcmVtb3RlLCBnbXIpCnN1bW1hcnkobTMpCgpgYGAKCiMjIyBJZGVudGlmaWNhdGlvbiB0ZXN0IChBdHRlbnRpb24pCgoobm90IGFkbWluaXN0ZXJlZCByZW1vdGVseSkKCmBgYHtyfQptNCA8LSBsbShzY29yZSB+IGdyb3VwXzJncnAqd3Rhcl9zdGFuZGFyZCwgaWRuKQpzdW1tYXJ5KG00KQpgYGAKCiMjIyBJbnRlcm5hdGlvbmFsIHNob3BwaW5nIGxpc3QgdGVzdCAoVmVyYmFsIGxlYXJuaW5nKQoKYGBge3J9Cm01IDwtIGxtKHNjb3JlIH4gZ3JvdXBfMmdycCp3dGFyX3N0YW5kYXJkK2NvZ1N0YXRlX3JlbW90ZSwgaXNsKQpzdW1tYXJ5KG01KQpgYGAKCiMjIyBJbnRlcm5hdGlvbmFsIHNob3BwaW5nIGxpc3QgLSBkZWxheWVkIHJlY2FsbCB0ZXN0IChNZW1vcnkpCmBgYHtyfQptNiA8LSBsbShzY29yZSB+IGdyb3VwXzJncnAqd3Rhcl9zdGFuZGFyZCArIGNvZ1N0YXRlX3JlbW90ZSwgaXNybCkKc3VtbWFyeShtNikKYGBgCgojIyMgT25lLWNhcmQgbGVhcm5pbmcgdGVzdCAoVmlzdWFsIG1lbW9yeSkKCmBgYHtyfQptNyA8LSBsbShzY29yZSB+IGdyb3VwXzJncnAqd3Rhcl9zdGFuZGFyZCArIGNvZ1N0YXRlX3JlbW90ZSwgb2NsKQpzdW1tYXJ5KG03KQpgYGAKCiMjIyBPbmUtYmFjayB0ZXN0IChXb3JraW5nIG1lbW9yeSkKCihub3QgYWRtaW5pc3RlcmVkIHJlbW90ZWx5KQoKYGBge3J9Cm04IDwtIGxtKHNjb3JlIH4gZ3JvdXBfMmdycCp3dGFyX3N0YW5kYXJkLCBvbmIpCnN1bW1hcnkobTgpCmBgYAoKIyMjIENvbXBvc2l0ZSBzY29yZSAKCmBgYHtyfQptOSA8LSBsbShjb21wU2NvcmUgfiBncm91cF8yZ3JwKnd0YXJfc3RhbmRhcmQgKyBjb2dTdGF0ZV9yZW1vdGUsIGRhdGEpCnN1bW1hcnkobTkpCmBgYAoKCgoKCgoKCgojIFByZXZpb3VzCiMjIENvZ1N0YXRlIE1lYW4vU0QgYnkgZ3JvdXAKIyMjIDMgZ3JvdXBzCmBgYHtyfQpzY29yZU1lYW5zPC1zY29yZXNMICU+JSAKICBncm91cF9ieSh0ZXN0LGdyb3VwKSAlPiUKICBzdW1tYXJpemUobWVhbl9zY29yZSA9IG1lYW4oc2NvcmUsIG5hLnJtID0gVFJVRSksIHNkID0gc2Qoc2NvcmUsbmEucm0gPSBUUlVFKSkKcHJpbnQoc2NvcmVNZWFucyxuPTQ4KQpgYGAKCiMjIyAyIGdyb3VwcwpOb24tUFRTRCA9IExvdy1leHBvc2VkIGNvbnRyb2xzICYgUmVzaWxpZW50CmBgYHtyfQpzY29yZU1lYW5zMjwtc2NvcmVzTCAlPiUKICBncm91cF9ieSh0ZXN0LGdyb3VwXzJncnApICU+JQogIHN1bW1hcml6ZShtZWFuX3Njb3JlID0gbWVhbihzY29yZSwgbmEucm0gPSBUUlVFKSwgc2QgPSBzZChzY29yZSxuYS5ybSA9IFRSVUUpKQpwcmludChzY29yZU1lYW5zMixuPTMyKQpgYGAKCiMjIFBsb3RzIGZvciBDb2dTdGF0ZSBzY29yZXMgYnkgZ3JvdXAKCiMjIyBQbG90IGFsbCBzY29yZXMgb24gc2FtZSBwbG90OiAzIGdyb3VwcwogCmBgYHtyLGZpZy53aWR0aCA9IDEwLGZpZy5oZWlnaHQgPSAyMH0KdXNlLnNjb3JlczwtZGF0YSAlPiUgc2VsZWN0X2F0KHZhcnMoc3RhcnRzX3dpdGgoInVzZSIpICYgZW5kc193aXRoKCJ4Iil8c3RhcnRzX3dpdGgoImdyb3VwIikpKQpjb2xuYW1lcyh1c2Uuc2NvcmVzKTwtZ3N1YigidXNlLiIsIiIsY29sbmFtZXModXNlLnNjb3JlcykpCmNvbG5hbWVzKHVzZS5zY29yZXMpPC1nc3ViKCIueCIsIiIsY29sbmFtZXModXNlLnNjb3JlcykpCnVzZS5zY29yZXMgPC0gdXNlLnNjb3JlcyAlPiUgc2VsZWN0KCFtYXRjaGVzKCcxJHwyJHwzJHw0JHw1JCcpKQp1c2Uuc2NvcmVzPC1nYXRoZXIodXNlLnNjb3JlcyxrZXk9InRlc3QiLCB2YWx1ZT0ic2NvcmUiLCAtYyhncm91cCxncm91cF9QVFNEcmVmLGdyb3VwXzJncnApKSAlPiUgZmlsdGVyKCFpcy5uYShzY29yZSkpCgoKCiBwMSA8LSBnZ3Bsb3QodXNlLnNjb3JlcywgYWVzKGNvbG9yPWdyb3VwX1BUU0RyZWYsIHk9c2NvcmUsIHg9Z3JvdXBfUFRTRHJlZikpICsgCiAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjEpICsKICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRjg3NjZEIiwiIzYxOUNGRiIsIiMwMEJBMzgiKSxuYW1lPSJHcm91cCIpICsgeWxhYigiKGhpZ2hlciA9IGJldHRlciBwZXJmb3JtYW5jZSkiKSArIHhsYWIoIkdyb3VwIikgKyBmYWNldF93cmFwKC4gfiB0ZXN0LCBuY29sPTIpICsgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MTYsIGFuZ2xlPTkwLCBoanVzdCA9IDAuOTUpKQogcDEKIyBnZ3NhdmUoIi9Wb2x1bWVzL0V4dGVybmFsL1dUQ19yZXNpbGllbmNlX2ltYWdpbmcvZGF0YS9jb2dzdGF0ZV9kYXRhL2NvZ3N0YXRlX2J5X2dyb3VwLnBuZyIsIHBsb3QgPSBwMSwgZHBpPTYwMCwgd2lkdGggPSAxNCwgaGVpZ2h0ID0gMTApCiAKICMgYXMgYSBsb29wOgogIyBzY29yZW5hbWVzIDwtIHNjb3Jlc1dbLCBncmVwKCdec2NvcmUnLCBuYW1lcyhzY29yZXNXKSldIAogI1pfY29scz1ncmVwbCgiXnNjb3JlIiwgbmFtZXMoc2NvcmVuYW1lc1opKQogI3Njb3JlbmFtZXNaW1pfY29sc108LXNjYWxlKHNjb3JlbmFtZXNaW1pfY29sc10pCiMgZm9yKGkgaW4gMTpsZW5ndGgoc2NvcmVuYW1lcykpIHsKIyAgIHByaW50KGdncGxvdChzY29yZXNXLCBhZXMoeSA9IHNjb3JlbmFtZXNbICwgaV0sIHg9Z3JvdXAsIGNvbG9yPWdyb3VwKSkgKwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjNjE5Q0ZGIiwgIyIjMDBCQTM4IiwgIiNGODc2NkQiKSwgbmFtZT0iR3JvdXAiKSArCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiKCJHcm91cCIpICsKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIobmFtZXMoc2NvcmVuYW1lc1sgLCBpXSkpKX0KCmBgYAoKIyMjIFBsb3QgYWxsIHNjb3JlcyBvbiBzYW1lIHBsb3Q6IDIgZ3JvdXBzIChpbmNsdWRpbmcgTG93LWV4cG9zZWQpCgpgYGB7cixmaWcud2lkdGggPSAxMCxmaWcuaGVpZ2h0ID0gMjB9CgogcDEgPC0gZ2dwbG90KHVzZS5zY29yZXMsIGFlcyhjb2xvcj1ncm91cF8yZ3JwLCB5PXNjb3JlLCB4PWdyb3VwXzJncnApKSArIAogICBnZW9tX2JveHBsb3QoKSArIGdlb21fcG9pbnQoKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4xKSArCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzYxOUNGRiIsIiNGODc2NkQiKSxuYW1lPSJHcm91cCIpICsgeWxhYigiWi1zY2FsZWQgc2NvcmUiKSArIHhsYWIoIkdyb3VwIikgKyBmYWNldF93cmFwKC4gfiB0ZXN0LCBuY29sPTIpICsgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MTYsIGFuZ2xlPTkwLCBoanVzdCA9IDAuOTUpKQogcDEKYGBgCgojIyMgUGxvdCBhbGwgc2NvcmVzIG9uIHNhbWUgcGxvdDogMiBncm91cHMgKE5PVCBpbmNsdWRpbmcgTG93LWV4cG9zZWQpCgpgYGB7cixmaWcud2lkdGggPSAxMCxmaWcuaGVpZ2h0ID0gMjB9CnVzZS5zY29yZXMubm9MRUMgPC0gdXNlLnNjb3JlcyAlPiUgZmlsdGVyKCFncm91cD09Ikxvdy1FeHBvc2VkIENvbnRyb2wiKQogcDEgPC0gZ2dwbG90KHVzZS5zY29yZXMubm9MRUMsIGFlcyhjb2xvcj1ncm91cCwgeT1zY29yZSwgeD1ncm91cCkpICsgCiAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjEpICsKICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjNjE5Q0ZGIiwiI0Y4NzY2RCIpLG5hbWU9Ikdyb3VwIikgKyB5bGFiKCJaLXNjYWxlZCBzY29yZSIpICsgeGxhYigiR3JvdXAgKE5PVCBpbmNsdWRpbmcgbG93LWV4cG9zZWQpIikgKyBmYWNldF93cmFwKC4gfiB0ZXN0LCBuY29sPTIpICsgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MTYsIGFuZ2xlPTkwLCBoanVzdCA9IDAuOTUpKQogcDEKYGBgCgoKCgoKYGBge3J9CmRldCA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLkRFVCIpCmdtbCA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLkdNTCIpCmdtciA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLkdNUiIpCmlkbiA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLklETiIpCmlzbCA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLklTTCIpCmlzcmwgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5JU1JMIikKb2NsIDwtIHNjb3Jlc0wgJT4lIGZpbHRlcih0ZXN0PT0ic2NvcmUuT0NMIikKb25iIDwtIHNjb3Jlc0wgJT4lIGZpbHRlcih0ZXN0PT0ic2NvcmUuT05CIikKYGBgCgojIyMgRGV0ZWN0aW9uCmBgYHtyfQpwMSA8LSBnZ3Bsb3QoZGV0LCBhZXMoY29sb3I9Z3JvdXBfUFRTRHJlZiwgeT1zY29yZSwgeD1ncm91cF9QVFNEcmVmLGxhYmVsPXJlY29yZF9pZCkpICsgCiAgICAgICBnZW9tX2JveHBsb3QoKSArIGdlb21fcG9pbnQoKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0Y4NzY2RCIsIiM2MTlDRkYiLCIjMDBCQTM4IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9Imdyb3VwIikgKyB5bGFiKCIobG93ZXIgPSBiZXR0ZXIgcGVyZm9ybWFuY2UpIikgKyB4bGFiKCJHcm91cCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsPWlmZWxzZShzY29yZT4yLjd8c2NvcmU8Mi41LGFzLmNoYXJhY3RlcihyZWNvcmRfaWQpLCcnKSksaGp1c3Q9MCx2anVzdD0wKQpwMQpwcmludChwYXN0ZTAoJ24gPSAnLHN1bSghaXMubmEocDFbWyJkYXRhIl1dW1sic2NvcmUiXV0pKSkpCgoKYGBgCiAKIyMjIEdyb3RvbiBtYXplIGxlYXJuaW5nCmBgYHtyfQogcDEgPC0gZ2dwbG90KGdtbCwgYWVzKGNvbG9yPWdyb3VwX1BUU0RyZWYsIHk9c2NvcmUsIHg9Z3JvdXBfUFRTRHJlZixsYWJlbD1yZWNvcmRfaWQpKSArIAogICAgICAgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX3BvaW50KCkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGODc2NkQiLCIjNjE5Q0ZGIiwiIzAwQkEzOCIpLG5hbWU9Ikdyb3VwIikgKyB5bGFiKCIobG93ZXIgPSBiZXR0ZXIgcGVyZm9ybWFuY2UpIikgKyB4bGFiKCJHcm91cCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsPWlmZWxzZShzY29yZT44MHxzY29yZTwzMCxhcy5jaGFyYWN0ZXIocmVjb3JkX2lkKSwnJykpLGhqdXN0PTAsdmp1c3Q9MCkKIHAxCnByaW50KHBhc3RlMCgnbiA9ICcsc3VtKCFpcy5uYShwMVtbImRhdGEiXV1bWyJzY29yZSJdXSkpKSkKYGBgCgojIyMgR3JvdG9uIG1hemUgbGVhcm5pbmcgLSBkZWxheWVkIHJlY2FsbApgYGB7cn0KIHAxIDwtIGdncGxvdChnbXIsIGFlcyhjb2xvcj1ncm91cF9QVFNEcmVmLCB5PXNjb3JlLCB4PWdyb3VwX1BUU0RyZWYsbGFiZWw9cmVjb3JkX2lkKSkgKyAKICAgICAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRjg3NjZEIiwiIzYxOUNGRiIsIiMwMEJBMzgiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iR3JvdXAiKSArIHlsYWIoIihsb3dlciA9IGJldHRlciBwZXJmb3JtYW5jZSkiKSArIHhsYWIoIkdyb3VwIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWw9aWZlbHNlKHNjb3JlPj0xNXxzY29yZTwyLjUsYXMuY2hhcmFjdGVyKHJlY29yZF9pZCksJycpKSxoanVzdD0wLHZqdXN0PTApCiBwMQogcHJpbnQocGFzdGUwKCduID0gJyxzdW0oIWlzLm5hKHAxW1siZGF0YSJdXVtbInNjb3JlIl1dKSkpKQpgYGAKIAojIyMgSWRlbnRpZmljYXRpb24KYGBge3J9CiBwMSA8LSBnZ3Bsb3QoaWRuLCBhZXMoY29sb3I9Z3JvdXBfUFRTRHJlZiwgeT1zY29yZSwgeD1ncm91cF9QVFNEcmVmLGxhYmVsPXJlY29yZF9pZCkpICsgCiAgICAgICBnZW9tX2JveHBsb3QoKSArIGdlb21fcG9pbnQoKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0Y4NzY2RCIsIiM2MTlDRkYiLCIjMDBCQTM4IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ikdyb3VwIikgKyB5bGFiKCIobG93ZXIgPSBiZXR0ZXIgcGVyZm9ybWFuY2UpIikgKyB4bGFiKCJHcm91cCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsPWlmZWxzZShzY29yZT4yLjgxfHNjb3JlPDIuNjUsYXMuY2hhcmFjdGVyKHJlY29yZF9pZCksJycpKSxoanVzdD0wLHZqdXN0PTApCiBwMQogcHJpbnQocGFzdGUwKCduID0gJyxzdW0oIWlzLm5hKHAxW1siZGF0YSJdXVtbInNjb3JlIl1dKSkpKQpgYGAKIAojIyMgSW50ZXJuYXRpb25hbCBzaG9wcGluZyBsaXN0CmBgYHtyfQogcDEgPC0gZ2dwbG90KGlzbCwgYWVzKGNvbG9yPWdyb3VwX1BUU0RyZWYsIHk9c2NvcmUsIHg9Z3JvdXBfUFRTRHJlZixsYWJlbD1yZWNvcmRfaWQpKSArIAogICAgICAgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX3BvaW50KCkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGODc2NkQiLCIjNjE5Q0ZGIiwiIzAwQkEzOCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJHcm91cCIpICsgeWxhYigiKGhpZ2hlciA9IGJldHRlciBwZXJmb3JtYW5jZSkiKSArIHhsYWIoIkdyb3VwIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWw9aWZlbHNlKHNjb3JlPjMzfHNjb3JlPDIwLGFzLmNoYXJhY3RlcihyZWNvcmRfaWQpLCcnKSksaGp1c3Q9MCx2anVzdD0wKQogcDEKIHByaW50KHBhc3RlMCgnbiA9ICcsc3VtKCFpcy5uYShwMVtbImRhdGEiXV1bWyJzY29yZSJdXSkpKSkKYGBgCiAKIyMjIEludGVybmF0aW9uYWwgc2hvcHBpbmcgbGlzdCAtIGRlbGF5ZWQgcmVjYWxsCmBgYHtyfQogcDEgPC0gZ2dwbG90KGlzcmwsIGFlcyhjb2xvcj1ncm91cF9QVFNEcmVmLCB5PXNjb3JlLCB4PWdyb3VwX1BUU0RyZWYsbGFiZWw9cmVjb3JkX2lkKSkgKyAKICAgICAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRjg3NjZEIiwiIzYxOUNGRiIsIiMwMEJBMzgiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iR3JvdXAiKSArIHlsYWIoIihoaWdoZXIgPSBiZXR0ZXIgcGVyZm9ybWFuY2UpIikgKyB4bGFiKCJHcm91cCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsPWlmZWxzZShzY29yZT4xMXxzY29yZTw3LGFzLmNoYXJhY3RlcihyZWNvcmRfaWQpLCcnKSksaGp1c3Q9MCx2anVzdD0wKQogcDEKIHByaW50KHBhc3RlMCgnbiA9ICcsc3VtKCFpcy5uYShwMVtbImRhdGEiXV1bWyJzY29yZSJdXSkpKSkKYGBgCiAKIyMjIE9uZS1jYXJkIGxlYXJuaW5nCmBgYHtyfQogcDEgPC0gZ2dwbG90KG9jbCwgYWVzKGNvbG9yPWdyb3VwX1BUU0RyZWYsIHk9c2NvcmUsIHg9Z3JvdXBfUFRTRHJlZixsYWJlbD1yZWNvcmRfaWQpKSArIAogICAgICAgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX3BvaW50KCkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGODc2NkQiLCIjNjE5Q0ZGIiwiIzAwQkEzOCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lPSJHcm91cCIpICsgeWxhYigiKGhpZ2hlciA9IGJldHRlciBwZXJmb3JtYW5jZSkiKSArIHhsYWIoIkdyb3VwIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWw9aWZlbHNlKHNjb3JlPjEuMXxzY29yZTwuODUsYXMuY2hhcmFjdGVyKHJlY29yZF9pZCksJycpKSxoanVzdD0xLHZqdXN0PTEpCiBwMQogcHJpbnQocGFzdGUwKCduID0gJyxzdW0oIWlzLm5hKHAxW1siZGF0YSJdXVtbInNjb3JlIl1dKSkpKQpgYGAKCgojIyMgT25lLWJhY2sgdGVzdApgYGB7cn0KIHAxIDwtIGdncGxvdChvbmIsIGFlcyhjb2xvcj1ncm91cF9QVFNEcmVmLCB5PXNjb3JlLCB4PWdyb3VwX1BUU0RyZWYsbGFiZWw9cmVjb3JkX2lkKSkgKyAKICAgICAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRjg3NjZEIiwiIzYxOUNGRiIsIiMwMEJBMzgiKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZT0iR3JvdXAiKSArIHlsYWIoIihsb3dlciA9IGJldHRlciBwZXJmb3JtYW5jZSkiKSArIHhsYWIoIkdyb3VwIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWw9aWZlbHNlKHNjb3JlPjN8c2NvcmU8Mi44Myxhcy5jaGFyYWN0ZXIocmVjb3JkX2lkKSwnJykpLGhqdXN0PTAsdmp1c3Q9MCwgbWF4Lm92ZXJsYXBzID0gMTUpCiBwMQogcHJpbnQocGFzdGUwKCduID0gJyxzdW0oIWlzLm5hKHAxW1siZGF0YSJdXVtbInNjb3JlIl1dKSkpKQpgYGAKIyMjIENvbXBvc2l0ZSBzY29yZQoKYGBge3J9CiBwMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKGNvbG9yPWdyb3VwX1BUU0RyZWYsIHk9Y29tcFNjb3JlLCB4PWdyb3VwX1BUU0RyZWYsbGFiZWw9cmVjb3JkX2lkKSkgKyAKICAgICAgIGdlb21fYm94cGxvdCgpICsgZ2VvbV9wb2ludCgpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRjg3NjZEIiwiIzYxOUNGRiIsIiMwMEJBMzgiKSxuYW1lPSJHcm91cCIpICsgeWxhYigiKGhpZ2hlciA9IGJldHRlciBwZXJmb3JtYW5jZSkiKSArIHhsYWIoIkdyb3VwIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWw9aWZlbHNlKGNvbXBTY29yZT4uNnxjb21wU2NvcmU8KC0xKSxhcy5jaGFyYWN0ZXIocmVjb3JkX2lkKSwnJykpLGhqdXN0PTAsdmp1c3Q9MCwgbWF4Lm92ZXJsYXBzID0gMTIpCiBwMQogcHJpbnQocGFzdGUwKCduID0gJyxzdW0oIWlzLm5hKHAxW1siZGF0YSJdXVtbImNvbXBTY29yZSJdXSkpKSkKYGBgCgojIyBDb2dTdGF0ZSBzY29yZXMgYnkgZ3JvdXA6IExpbmVhciBtb2RlbHMgKDMgZ3JvdXBzKQoKMyBncm91cHM6IExvdy1leHBvc2VkIGNvbnRyb2xzOyBSZXNpbGllbnQ7IFBUU0QKUmVmZXJlbmNlIGdyb3VwID0gUFRTRAoKCiMjIyBEZXRlY3Rpb24gdGVzdCAoUHN5Y2hvbW90b3IgZnVuY3Rpb24pCmBgYHtyfQpkZXQgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5ERVQiKQpnbWwgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5HTUwiKQpnbXIgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5HTVIiKQppZG4gPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5JRE4iKQppc2wgPC0gc2NvcmVzTCAlPiUgZmlsdGVyKHRlc3Q9PSJzY29yZS5JU0wiKQppc3JsIDwtIHNjb3Jlc0wgJT4lIGZpbHRlcih0ZXN0PT0ic2NvcmUuSVNSTCIpCm9jbCA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLk9DTCIpCm9uYiA8LSBzY29yZXNMICU+JSBmaWx0ZXIodGVzdD09InNjb3JlLk9OQiIpCgptMSA8LSBsbShzY29yZSB+IGdyb3VwX1BUU0RyZWYsIGRldCkKc3VtbWFyeShtMSkKYGBgCgojIyMgR3JvdG9uIG1hemUgbGVhcm5pbmcgdGVzdCAoRXhlY3V0aXZlIGZ1bmN0aW9uKQpgYGB7cn0KbTIgPC0gbG0oc2NvcmUgfiBncm91cF9QVFNEcmVmLCBnbWwpCnN1bW1hcnkobTIpCmBgYAoKIyMjIEdyb3RvbiBtYXplIGxlYXJuaW5nIC0gZGVsYXllZCByZWNhbGwgdGVzdCAoTWVtb3J5KQpgYGB7cn0KbTMgPC0gbG0oc2NvcmUgfiBncm91cF9QVFNEcmVmLCBnbXIpCnN1bW1hcnkobTMpCmBgYAoKIyMjIElkZW50aWZpY2F0aW9uIHRlc3QgKEF0dGVudGlvbikKYGBge3J9Cm00IDwtIGxtKHNjb3JlIH4gZ3JvdXBfUFRTRHJlZiwgaWRuKQpzdW1tYXJ5KG00KQpgYGAKCiMjIyBJbnRlcm5hdGlvbmFsIHNob3BwaW5nIGxpc3QgdGVzdCAoVmVyYmFsIGxlYXJuaW5nKQpgYGB7cn0KbTUgPC0gbG0oc2NvcmUgfiBncm91cF9QVFNEcmVmLCBpc2wpCnN1bW1hcnkobTUpCmBgYAoKIyMjIEludGVybmF0aW9uYWwgc2hvcHBpbmcgbGlzdCAtIGRlbGF5ZWQgcmVjYWxsIHRlc3QgKE1lbW9yeSkKYGBge3J9Cm02IDwtIGxtKHNjb3JlIH4gZ3JvdXBfUFRTRHJlZiwgaXNybCkKc3VtbWFyeShtNikKYGBgCgojIyMgT25lLWNhcmQgbGVhcm5pbmcgdGVzdCAoVmlzdWFsIG1lbW9yeSkKYGBge3J9Cm03IDwtIGxtKHNjb3JlIH4gZ3JvdXBfUFRTRHJlZiwgb2NsKQpzdW1tYXJ5KG03KQpgYGAKCiMjIyBPbmUtYmFjayB0ZXN0IChXb3JraW5nIG1lbW9yeSkKYGBge3J9Cm04IDwtIGxtKHNjb3JlIH4gZ3JvdXBfUFRTRHJlZiwgb25iKQpzdW1tYXJ5KG04KQpgYGAKCiMjIyBDb21wb3NpdGUgc2NvcmUgCmBgYHtyfQptOSA8LSBsbShjb21wU2NvcmUgfiBncm91cF9QVFNEcmVmLCBkYXRhKQpzdW1tYXJ5KG05KQpgYGAKCgojIyBDb2dTdGF0ZSBzY29yZXMgYnkgZ3JvdXA6IFQtdGVzdHMgKDIgZ3JvdXBzKQoKMiBncm91cHM6IE5vbi1QVFNEIChpLmUsIExvdy1leHBvc2VkIGNvbnRyb2xzICYgUmVzaWxpZW50KTsgUFRTRAoKIyMjIERldGVjdGlvbiB0ZXN0IChQc3ljaG9tb3RvciBmdW5jdGlvbikKYGBge3J9CnQudGVzdChzY29yZSB+IGdyb3VwXzJncnAsIGRldCkKYGBgCgojIyMgR3JvdG9uIG1hemUgbGVhcm5pbmcgdGVzdCAoRXhlY3V0aXZlIGZ1bmN0aW9uKQpgYGB7cn0KdC50ZXN0KHNjb3JlIH4gZ3JvdXBfMmdycCwgZ21sKQpgYGAKCiMjIyBHcm90b24gbWF6ZSBsZWFybmluZyAtIGRlbGF5ZWQgcmVjYWxsIHRlc3QgKE1lbW9yeSkKYGBge3J9CnQudGVzdChzY29yZSB+IGdyb3VwXzJncnAsIGdtbCkKYGBgCgojIyMgSWRlbnRpZmljYXRpb24gdGVzdCAoQXR0ZW50aW9uKQpgYGB7cn0KdC50ZXN0KHNjb3JlIH4gZ3JvdXBfMmdycCwgaWRuKQpgYGAKCiMjIyBJbnRlcm5hdGlvbmFsIHNob3BwaW5nIGxpc3QgdGVzdCAoVmVyYmFsIGxlYXJuaW5nKQpgYGB7cn0KdC50ZXN0KHNjb3JlIH4gZ3JvdXBfMmdycCwgaXNsKQpgYGAKCiMjIyBJbnRlcm5hdGlvbmFsIHNob3BwaW5nIGxpc3QgLSBkZWxheWVkIHJlY2FsbCB0ZXN0IChNZW1vcnkpCmBgYHtyfQp0LnRlc3Qoc2NvcmUgfiBncm91cF8yZ3JwLCBpc3JsKQpgYGAKCiMjIyBPbmUtY2FyZCBsZWFybmluZyB0ZXN0IChWaXN1YWwgbWVtb3J5KQpgYGB7cn0KdC50ZXN0KHNjb3JlIH4gZ3JvdXBfMmdycCwgb2NsKQpgYGAKCiMjIyBPbmUtYmFjayB0ZXN0IChXb3JraW5nIG1lbW9yeSkKYGBge3J9CnQudGVzdChzY29yZSB+IGdyb3VwXzJncnAsIG9uYikKYGBgCgojIyMgQ29tcG9zaXRlIHNjb3JlIApgYGB7cn0KdC50ZXN0KGNvbXBTY29yZSB+IGdyb3VwXzJncnAsIGRhdGEpCmBgYAoKCgoKIyMgTU9DQQoKIyMjIE1PQ0Egc2NvcmUgKDMgZ3JvdXBzKQpgYGB7cn0KCiBwMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKGNvbG9yPWdyb3VwLCB5PW1vY2Ffc2NvcmUsIHg9Z3JvdXApKSArIAogICBnZW9tX2JveHBsb3QoKSArIGdlb21fcG9pbnQoKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4xKSArCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzYxOUNGRiIsIiMwMEJBMzgiLCIjRjg3NjZEIiksbmFtZT0iR3JvdXAiKSArIHlsYWIoIk1PQ0EgKGhpZ2hlcj1iZXR0ZXIpIikgKyB4bGFiKCJHcm91cCIpICsgdGhlbWVfYncoYmFzZV9zaXplID0gMTYpICsgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MTYsIGFuZ2xlPTkwLCBoanVzdCA9IDAuOTUpKQogcDEKYGBgCgoKIyMjIE1PQ0Egc2NvcmUgKDIgZ3JvdXBzKQoKTm9uLVBUU0QgPSByZXNpbGllbnQgJiBsb3ctZXhwb3NlZCBjb250cm9scy4KCmBgYHtyfQoKIHAxIDwtIGdncGxvdChkYXRhLCBhZXMoY29sb3I9Z3JvdXBfMmdycCwgeT1tb2NhX3Njb3JlLCB4PWdyb3VwXzJncnApKSArIAogICBnZW9tX2JveHBsb3QoKSArIGdlb21fcG9pbnQoKSArIGdlb21faml0dGVyKHdpZHRoID0gMC4xKSArCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzYxOUNGRiIsIiNGODc2NkQiKSxuYW1lPSJHcm91cCIpICsgeWxhYigiTU9DQSAoaGlnaGVyPWJldHRlcikiKSArIHhsYWIoIkdyb3VwIikgKyB0aGVtZV9idyhiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSxheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xNiwgYW5nbGU9OTAsIGhqdXN0ID0gMC45NSkpCiBwMQogCmBgYAo=