Impostazione del disegno sperimentale


Si sono voluti valutare gli effetti di tre componenti di una generica miscela per gelato sulla viscosità finale della miscela stessa, parametro quest’ultimo che influenza in maniera importante le caratteristiche del prodotto finito.

Sono stati presi in esame tre addensanti comunemente utilizzati nel settore:

Si è impostato un disegno di miscela del tipo Simplex Lattice con k=3 e m=3, le cui possibili combinazioni hanno portato a effettuare 10 condizioni sperimentali. Si sono effettuate 3 repliche in 3 settimane diverse, anche se per quest’analisi si è scelto di prendere in considerazione solo gli ultimi due set di repliche.



ID Week F T G Visc Visc_log
1 2_0_1 1 0.6666667 0.0000000 0.3333333 7050 3.848189
2 0_2_1 1 0.0000000 0.6666667 0.3333333 7200 3.857333
3 0_1_2 1 0.0000000 0.3333333 0.6666667 6810 3.833147
4 1_2_0 1 0.3333333 0.6666667 0.0000000 8370 3.922725
5 1_1_1 1 0.3333333 0.3333333 0.3333333 7080 3.850033
6 0_0_3 1 0.0000000 0.0000000 1.0000000 5790 3.762679
7 1_0_2 1 0.3333333 0.0000000 0.6666667 6330 3.801404
8 0_3_0 1 0.0000000 1.0000000 0.0000000 9330 3.969882
9 2_1_0 1 0.6666667 0.3333333 0.0000000 7950 3.900367
10 3_0_0 1 1.0000000 0.0000000 0.0000000 6330 3.801404
11 0_0_3 2 0.0000000 0.0000000 1.0000000 4272 3.630631
12 2_1_0 2 0.6666667 0.3333333 0.0000000 6780 3.831230
13 0_2_1 2 0.0000000 0.6666667 0.3333333 5610 3.748963
14 1_2_0 2 0.3333333 0.6666667 0.0000000 7500 3.875061
15 1_1_1 2 0.3333333 0.3333333 0.3333333 6510 3.813581
16 3_0_0 2 1.0000000 0.0000000 0.0000000 5730 3.758155
17 0_3_0 2 0.0000000 1.0000000 0.0000000 8130 3.910090
18 1_0_2 2 0.3333333 0.0000000 0.6666667 6450 3.809560
19 0_1_2 2 0.0000000 0.3333333 0.6666667 5610 3.748963
20 2_0_1 2 0.6666667 0.0000000 0.3333333 5610 3.748963

Modello postulato


Una volta effettuati gli esperimenti i dati possono essere elaborati secondo un modello di Scheffè semplificato (special cubic), che consente di tenere conto degli effetti dati dalle possibili interazioni tra le 3 variabili F, T e G.

Il modello è il seguente:

\[ Y = b_0+b_1x_1+b_2x_2+b_3x_3+b_{12}x_1x_2+b_{13}x_1x_3+b_{23}x_2x_3+b_{123}x_1x_2x_3 \]

Al dataset di partenza quindi si aggiungono ulteriori colonne relative alle interazioni a 2 e all’interazione a 3 componenti.

ID Week F T G F_T T_G F_G F_T_G Visc Visc_log
1 2_0_1 1 0.6666667 0.0000000 0.3333333 0.0000000 0.0000000 0.2222222 0.000000 7050 3.848189
2 0_2_1 1 0.0000000 0.6666667 0.3333333 0.0000000 0.2222222 0.0000000 0.000000 7200 3.857333
3 0_1_2 1 0.0000000 0.3333333 0.6666667 0.0000000 0.2222222 0.0000000 0.000000 6810 3.833147
4 1_2_0 1 0.3333333 0.6666667 0.0000000 0.2222222 0.0000000 0.0000000 0.000000 8370 3.922725
5 1_1_1 1 0.3333333 0.3333333 0.3333333 0.1111111 0.1111111 0.1111111 0.037037 7080 3.850033
6 0_0_3 1 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 0.000000 5790 3.762679
7 1_0_2 1 0.3333333 0.0000000 0.6666667 0.0000000 0.0000000 0.2222222 0.000000 6330 3.801404
8 0_3_0 1 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 9330 3.969882
9 2_1_0 1 0.6666667 0.3333333 0.0000000 0.2222222 0.0000000 0.0000000 0.000000 7950 3.900367
10 3_0_0 1 1.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 6330 3.801404
11 0_0_3 2 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 0.000000 4272 3.630631
12 2_1_0 2 0.6666667 0.3333333 0.0000000 0.2222222 0.0000000 0.0000000 0.000000 6780 3.831230
13 0_2_1 2 0.0000000 0.6666667 0.3333333 0.0000000 0.2222222 0.0000000 0.000000 5610 3.748963
14 1_2_0 2 0.3333333 0.6666667 0.0000000 0.2222222 0.0000000 0.0000000 0.000000 7500 3.875061
15 1_1_1 2 0.3333333 0.3333333 0.3333333 0.1111111 0.1111111 0.1111111 0.037037 6510 3.813581
16 3_0_0 2 1.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 5730 3.758155
17 0_3_0 2 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.000000 8130 3.910090
18 1_0_2 2 0.3333333 0.0000000 0.6666667 0.0000000 0.0000000 0.2222222 0.000000 6450 3.809560
19 0_1_2 2 0.0000000 0.3333333 0.6666667 0.0000000 0.2222222 0.0000000 0.000000 5610 3.748963
20 2_0_1 2 0.6666667 0.0000000 0.3333333 0.0000000 0.0000000 0.2222222 0.000000 5610 3.748963

Regressione


Si effettua una regressione per trovare i coefficienti ottimali secondo il modello, valutandone la significatività (limite di confidenza del 95%).

Essendo un modello relativo a una miscela ternaria non ho il valore relativo all’intercetta come per una regressione lineare “tradizionale”.


## 
## Call:
## lm(formula = Visc ~ 0 + F + T + G + F_T + F_G + T_G + F_T_G, 
##     data = df_complete)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1247.4  -416.2   160.9   395.6  1052.4 
## 
## Coefficients:
##       Estimate Std. Error t value Pr(>|t|)    
## F       6021.0      509.5  11.818 2.51e-08 ***
## T       8534.6      509.5  16.751 3.51e-10 ***
## G       5235.4      509.5  10.276 1.31e-07 ***
## F_T     1675.0     2381.5   0.703    0.494    
## F_G     3293.0     2381.5   1.383    0.190    
## T_G    -2598.7     2381.5  -1.091    0.295    
## F_T_G  -1761.8    17464.7  -0.101    0.921    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 757.5 on 13 degrees of freedom
## Multiple R-squared:  0.992,  Adjusted R-squared:  0.9877 
## F-statistic: 229.6 on 7 and 13 DF,  p-value: 1.369e-12


In realtà trovo che tutti i coefficienti relativi alle 4 interazioni risultano essere statisticamente non significativi pertanto rimuovo la variabile con il P-value maggiore e reitero la procedura, questo perché i tre vettori di partenza sono tra loro linearmente dipendenti.


## 
## Call:
## lm(formula = Visc ~ 0 + F + T + G + F_T + F_G + T_G, data = df_complete)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1236.2  -419.0   172.1   402.1  1063.5 
## 
## Coefficients:
##     Estimate Std. Error t value Pr(>|t|)    
## F       6028        486  12.405 6.10e-09 ***
## T       8542        486  17.578 6.14e-11 ***
## G       5243        486  10.789 3.62e-08 ***
## F_T     1591       2151   0.740    0.472    
## F_G     3209       2151   1.492    0.158    
## T_G    -2683       2151  -1.247    0.233    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 730.2 on 14 degrees of freedom
## Multiple R-squared:  0.992,  Adjusted R-squared:  0.9885 
## F-statistic: 288.3 on 6 and 14 DF,  p-value: 7.634e-14

Levo anche F_T

## 
## Call:
## lm(formula = Visc ~ 0 + F + T + G + F_G + T_G, data = df_complete)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1295.1  -404.5   118.4   494.6  1063.5 
## 
## Coefficients:
##     Estimate Std. Error t value Pr(>|t|)    
## F     6205.2      416.7  14.893 2.15e-10 ***
## T     8718.8      416.7  20.925 1.64e-12 ***
## G     5242.9      478.6  10.956 1.48e-08 ***
## F_G   2944.0     2088.9   1.409    0.179    
## T_G  -2947.8     2088.9  -1.411    0.179    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 719.1 on 15 degrees of freedom
## Multiple R-squared:  0.9917, Adjusted R-squared:  0.9889 
## F-statistic: 356.6 on 5 and 15 DF,  p-value: 4.942e-15

Poi T_G

## 
## Call:
## lm(formula = Visc ~ 0 + F + T + G + F_G, data = df_complete)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1650.71  -417.62     3.95   533.83   963.05 
## 
## Coefficients:
##     Estimate Std. Error t value Pr(>|t|)    
## F     6261.4      427.4  14.649 1.09e-10 ***
## T     8438.1      377.3  22.366 1.70e-13 ***
## G     4906.0      427.4  11.478 3.91e-09 ***
## F_G   3365.1     2130.5   1.579    0.134    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 741.1 on 16 degrees of freedom
## Multiple R-squared:  0.9905, Adjusted R-squared:  0.9882 
## F-statistic: 419.3 on 4 and 16 DF,  p-value: 5.677e-16

E infine F_G poiché ha continuato a rivelarsi non significativo.

## 
## Call:
## lm(formula = Visc ~ 0 + F + T + G, data = df_complete)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1688.1  -429.4  -147.0   624.0  1004.1 
## 
## Coefficients:
##   Estimate Std. Error t value Pr(>|t|)    
## F   6597.9      386.5   17.07 3.91e-12 ***
## T   8325.9      386.5   21.54 8.85e-14 ***
## G   5242.5      386.5   13.56 1.51e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 773 on 17 degrees of freedom
## Multiple R-squared:  0.9891, Adjusted R-squared:  0.9871 
## F-statistic: 513.1 on 3 and 17 DF,  p-value: < 2.2e-16


Coefficienti e residui


I coefficienti del mio modello saranno dunque

##      F      T      G 
## 6597.9 8325.9 5242.5

E un valore di r² di

## [1] 0.9890763


Posso anche tracciare un grafico che metta in relazione la risposta ottenuta sperimentalmente con quella calcolata dal modello di regressione


## 
## Call:
## lm(formula = Visc ~ Visc_calc, data = df_visc)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1688.1  -429.4  -147.0   624.0  1004.1 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 4.881e-12  1.277e+03   0.000        1    
## Visc_calc   1.000e+00  1.883e-01   5.312 4.75e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 751.2 on 18 degrees of freedom
## Multiple R-squared:  0.6105, Adjusted R-squared:  0.5889 
## F-statistic: 28.22 on 1 and 18 DF,  p-value: 4.749e-05


Superficie di risposta


Partendo dai coefficienti ottenuti dal modello posso visualizzarne la superficie di risposta

LS0tDQp0aXRsZTogIk1peHR1cmUgZGVzaWduIg0KYXV0aG9yOiAiQXJ0dXJvIEZyaXNpbmEiDQpzdWJ0aXRsZTogQWRkZW5zYW50aSBwZXIgbWlzY2VsZSBnZWxhdG8NCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICB0b2M6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRydWUNCiAgICANCiAgICANCi0tLQ0KDQpgYGB7ciBMaWJyYXJpZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Rlcm4pDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KFRlcm5hcnkpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHBsb3RseSkNCg0KYGBgDQoNCjxici8+DQoNCiMjIEltcG9zdGF6aW9uZSBkZWwgZGlzZWdubyBzcGVyaW1lbnRhbGUNCg0KPGJyLz4NCg0KU2kgc29ubyB2b2x1dGkgdmFsdXRhcmUgZ2xpIGVmZmV0dGkgZGkgdHJlIGNvbXBvbmVudGkgZGkgdW5hIGdlbmVyaWNhIG1pc2NlbGEgcGVyIGdlbGF0byBzdWxsYSAqKnZpc2Nvc2l0w6AqKiBmaW5hbGUgZGVsbGEgbWlzY2VsYSBzdGVzc2EsIHBhcmFtZXRybyBxdWVzdCd1bHRpbW8gY2hlIGluZmx1ZW56YSBpbiBtYW5pZXJhIGltcG9ydGFudGUgbGUgY2FyYXR0ZXJpc3RpY2hlIGRlbCBwcm9kb3R0byBmaW5pdG8uDQoNClNvbm8gc3RhdGkgcHJlc2kgaW4gZXNhbWUgdHJlIGFkZGVuc2FudGkgY29tdW5lbWVudGUgdXRpbGl6emF0aSBuZWwgc2V0dG9yZToNCg0KLSAgIEZhcmluYSBkaSBzZW1pIGRpIGNhcnJ1YmUgKEYpDQotICAgR29tbWEgZGkgdGFyYSAoVCkNCi0gICBHb21tYSBkaSBndWFyIChHKQ0KDQpTaSDDqCBpbXBvc3RhdG8gdW4gZGlzZWdubyBkaSBtaXNjZWxhIGRlbCB0aXBvICpTaW1wbGV4IExhdHRpY2UqIGNvbiAqaz0zKiBlICptPTMsKiBsZSBjdWkgcG9zc2liaWxpIGNvbWJpbmF6aW9uaSBoYW5ubyBwb3J0YXRvIGEgZWZmZXR0dWFyZSAxMCBjb25kaXppb25pIHNwZXJpbWVudGFsaS4gU2kgc29ubyBlZmZldHR1YXRlIDMgcmVwbGljaGUgaW4gMyBzZXR0aW1hbmUgZGl2ZXJzZSwgYW5jaGUgc2UgcGVyIHF1ZXN0J2FuYWxpc2kgc2kgw6ggc2NlbHRvIGRpIHByZW5kZXJlIGluIGNvbnNpZGVyYXppb25lIHNvbG8gZ2xpIHVsdGltaSBkdWUgc2V0IGRpIHJlcGxpY2hlLg0KDQo8YnIvPg0KDQo8aHIvPg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpleGwgPSByZWFkX2V4Y2VsKCdDOi9Vc2Vycy8zOTMzOC9Eb2N1bWVudHMvUi9BZGRlbnNhbnRpX3B5Lnhsc3gnKQ0KZGY9IGRhdGEuZnJhbWUoZXhsKQ0KDQprYWJsZShkZiwgcm93Lm5hbWVzID0gVCkgJT4lIGthYmxlX3N0eWxpbmcoJ3N0cmlwZWQnLCBmaXhlZF90aGVhZCA9IFQsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lDQogIHNjcm9sbF9ib3goIGhlaWdodCA9ICI1MDBweCIpDQoNCg0KYGBgDQoNCiMjIE1vZGVsbG8gcG9zdHVsYXRvDQo8YnIvPg0KDQpVbmEgdm9sdGEgZWZmZXR0dWF0aSBnbGkgZXNwZXJpbWVudGkgaSBkYXRpIHBvc3Nvbm8gZXNzZXJlIGVsYWJvcmF0aSBzZWNvbmRvIHVuIG1vZGVsbG8gZGkgKlNjaGVmZsOoKiBzZW1wbGlmaWNhdG8gKCpzcGVjaWFsIGN1YmljKiksIGNoZSBjb25zZW50ZSBkaSB0ZW5lcmUgY29udG8gZGVnbGkgZWZmZXR0aSBkYXRpIGRhbGxlIHBvc3NpYmlsaSBpbnRlcmF6aW9uaSB0cmEgbGUgMyB2YXJpYWJpbGkgRiwgVCBlIEcuDQoNCklsIG1vZGVsbG8gw6ggaWwgc2VndWVudGU6DQoNCiQkDQogIFkgPSBiXzArYl8xeF8xK2JfMnhfMitiXzN4XzMrYl97MTJ9eF8xeF8yK2JfezEzfXhfMXhfMytiX3syM314XzJ4XzMrYl97MTIzfXhfMXhfMnhfMw0KJCRcDQoNCkFsIGRhdGFzZXQgZGkgcGFydGVuemEgcXVpbmRpIHNpIGFnZ2l1bmdvbm8gdWx0ZXJpb3JpIGNvbG9ubmUgcmVsYXRpdmUgYWxsZSBpbnRlcmF6aW9uaSBhIDIgZSBhbGwnaW50ZXJhemlvbmUgYSAzIGNvbXBvbmVudGkuIFwNCjxici8+DQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCmRmJEZfVCA9IGRmJEYqZGYkVA0KZGYkVF9HID0gZGYkVCpkZiRHDQpkZiRGX0cgPSBkZiRGKmRmJEcNCmRmJEZfVF9HID0gZGYkRipkZiRUKmRmJEcNCg0KZGZfY29tcGxldGUgPSByZWxvY2F0ZShkZiwgVmlzYywgVmlzY19sb2csIC5hZnRlciA9IGxhc3RfY29sKCkpDQoNCmthYmxlKGRmX2NvbXBsZXRlLCByb3cubmFtZXMgPSBUKSAlPiUga2FibGVfc3R5bGluZygnc3RyaXBlZCcsIGZpeGVkX3RoZWFkID0gVCwgZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUNCiAgc2Nyb2xsX2JveCggaGVpZ2h0ID0gIjUwMHB4IikNCg0KDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyBSZWdyZXNzaW9uZQ0KPGJyLz4NCg0KU2kgZWZmZXR0dWEgdW5hIHJlZ3Jlc3Npb25lIHBlciB0cm92YXJlIGkgY29lZmZpY2llbnRpIG90dGltYWxpIHNlY29uZG8gaWwgbW9kZWxsbywgdmFsdXRhbmRvbmUgbGEgc2lnbmlmaWNhdGl2aXTDoCAobGltaXRlIGRpIGNvbmZpZGVuemEgZGVsIDk1JSkuDQoNCkVzc2VuZG8gdW4gbW9kZWxsbyByZWxhdGl2byBhIHVuYSBtaXNjZWxhIHRlcm5hcmlhIG5vbiBobyBpbCB2YWxvcmUgcmVsYXRpdm8gYWxsJ2ludGVyY2V0dGEgY29tZSBwZXIgdW5hIHJlZ3Jlc3Npb25lIGxpbmVhcmUgInRyYWRpemlvbmFsZSIuDQoNCjxoci8+DQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCm1vZGVsID0gbG0oVmlzY34gMCtGK1QrRytGX1QrRl9HK1RfRytGX1RfRywgZGZfY29tcGxldGUpDQpzdW1tYXJ5KG1vZGVsKQ0KDQoNCmBgYA0KDQo8YnIvPg0KDQpJbiByZWFsdMOgIHRyb3ZvIGNoZSB0dXR0aSBpIGNvZWZmaWNpZW50aSByZWxhdGl2aSBhbGxlIDQgaW50ZXJhemlvbmkgcmlzdWx0YW5vIGVzc2VyZSBzdGF0aXN0aWNhbWVudGUgbm9uIHNpZ25pZmljYXRpdmkgcGVydGFudG8gcmltdW92byBsYSB2YXJpYWJpbGUgY29uIGlsICpQLXZhbHVlKiBtYWdnaW9yZSBlIHJlaXRlcm8gbGEgcHJvY2VkdXJhLCBxdWVzdG8gcGVyY2jDqSBpIHRyZSB2ZXR0b3JpIGRpIHBhcnRlbnphIHNvbm8gdHJhIGxvcm8gbGluZWFybWVudGUgZGlwZW5kZW50aS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClx0aW55DQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCm1vZGVsID0gbG0oVmlzY34gMCtGK1QrRytGX1QrRl9HK1RfRywgZGZfY29tcGxldGUpDQpzdW1tYXJ5KG1vZGVsKQ0KYGBgDQoNCkxldm8gYW5jaGUgYEZfVGANCg0KYGBge3IgZWNobz1GQUxTRX0NCm1vZGVsID0gbG0oVmlzY34gMCtGK1QrRytGX0crVF9HLCBkZl9jb21wbGV0ZSkNCnN1bW1hcnkobW9kZWwpDQpgYGANCg0KUG9pIGBUX0dgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQptb2RlbCA9IGxtKFZpc2N+IDArRitUK0crRl9HLCBkZl9jb21wbGV0ZSkNCnN1bW1hcnkobW9kZWwpDQpgYGANCg0KRSBpbmZpbmUgYEZfR2AgcG9pY2jDqSBoYSBjb250aW51YXRvIGEgcml2ZWxhcnNpIG5vbiBzaWduaWZpY2F0aXZvLlwNCg0KYGBge3IgZWNobz1GQUxTRX0NCm1vZGVsID0gbG0oVmlzY34gMCtGK1QrRywgZGZfY29tcGxldGUpDQpzdW1tYXJ5KG1vZGVsKQ0KDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCjxici8+DQoNCiMjIyBDb2VmZmljaWVudGkgZSByZXNpZHVpDQo8YnIvPg0KDQpJIGNvZWZmaWNpZW50aSBkZWwgbWlvIG1vZGVsbG8gc2FyYW5ubyBkdW5xdWUNCg0KYGBge3IgZWNobz1GQUxTRX0NCm1vZGVsID0gbG0oVmlzY34gMCtGK1QrRywgZGZfY29tcGxldGUpDQpjb2VmZmljaWVudHMobW9kZWwpDQoNCmBgYA0KDQoNCg0KDQpFIHVuIHZhbG9yZSBkaSBywrIgZGkNCg0KYGBge3IgZWNobz1GQUxTRX0NCnN1bW1hcnkobW9kZWwpJHIuc3F1YXJlZA0KDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCjxici8+DQoNClBvc3NvIGFuY2hlIHRyYWNjaWFyZSB1biBncmFmaWNvIGNoZSBtZXR0YSBpbiByZWxhemlvbmUgbGEgcmlzcG9zdGEgb3R0ZW51dGEgc3BlcmltZW50YWxtZW50ZSBjb24gcXVlbGxhIGNhbGNvbGF0YSBkYWwgbW9kZWxsbyBkaSByZWdyZXNzaW9uZQ0KDQo8YnIvPg0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpyZXNpZHVpID0gcmVzaWR1YWxzKG1vZGVsKQ0KDQpkZl92aXNjID0gZGF0YS5mcmFtZSgnVmlzYycgPSBkZiRWaXNjLCAnVmlzY19jYWxjJyA9IGRmJFZpc2MtcmVzaWR1aSwgJ1dlZWsnID1hcy5jaGFyYWN0ZXIoZGYkV2VlayksICdpZCcgPSBhcy5jaGFyYWN0ZXIoZGYkSUQpKQ0KYmlzZXR0cmljZSA9IGRhdGEuZnJhbWUoeD0gYyg0MDAwLDk1MDApLHk9Yyg0MDAwLDk1MDApKQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpmaWcgPSBnZ3Bsb3QoZGZfdmlzYywgYWVzKHg9VmlzYywgeT1WaXNjX2NhbGMsIGNvbG9yID0gV2VlaykpKyBnZW9tX3BvaW50KCkrDQogIGdlb21fdGV4dChsYWJlbD1kZl92aXNjJGlkLCBzaXplPTMsIGhqdXN0PTAsIHZqdXN0PS0wLjMpKw0KICBnZW9tX2xpbmUoZGF0YT1iaXNldHRyaWNlLCBhZXMoeCx5KSwgY29sb3VyID0gJ2dyZXknKSsNCiAgZ2d0aXRsZSgnU3BlcmltZW50YWxpIHZzIGNhbGNvbGF0aScpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KICANCmdncGxvdGx5KGZpZykgIA0KDQoNCmBgYA0KYGBge3IgZWNobz1GQUxTRX0NCg0Kc3VtbWFyeShsbShWaXNjIH4gVmlzY19jYWxjLCBkZl92aXNjKSkNCg0KDQpgYGANCg0KPGhyLz4NCjxici8+DQoNCiMjIFN1cGVyZmljaWUgZGkgcmlzcG9zdGENCjxici8+DQoNClBhcnRlbmRvIGRhaSBjb2VmZmljaWVudGkgb3R0ZW51dGkgZGFsIG1vZGVsbG8gcG9zc28gdmlzdWFsaXp6YXJuZSBsYSBzdXBlcmZpY2llIGRpIHJpc3Bvc3RhIA0KDQoNCmBgYHtyLCBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0NCg0KZnNjID0gZGYkRg0KdGFyYSA9IGRmJFQNCmd1YXIgPSBkZiRHDQoNCnBhcihtYXIgPSByZXAoMC4yLCA0KSkNCg0KVGVybmFyeVBsb3QoYWxhYj0ndGFyYScsYmxhYiA9ICAnZ3VhcicsY2xhYiA9ICAnZnNjJykNCg0KDQpGdSA9IGZ1bmN0aW9uKHRhcmEsIGd1YXIsIGZzYykgew0KICAgICAgICBtb2RlbCRjb2VmZmljaWVudHNbJ0YnXSpmc2MrDQogICAgICAgIG1vZGVsJGNvZWZmaWNpZW50c1snRyddKmd1YXIrDQogICAgICAgIG1vZGVsJGNvZWZmaWNpZW50c1snVCddKnRhcmENCiAgICAgICAgDQp9DQoNCnZhbHVlcyA9IFRlcm5hcnlQb2ludFZhbHVlcyhGdSkNCkNvbG91clRlcm5hcnkodmFsdWVzKQ0KDQpUZXJuYXJ5Q29udG91cihGdSwgcmVzb2x1dGlvbiA9IDM2TCkNCg0KDQpgYGANCg0KDQoNCg0KDQoNCg==