경험과학적 자료를 분석하는 수준 (황정규(1998))
- 제1차 분석(primary analysis): 연구에서 얻은 원자료(original data)를 직접 분석
- 제2차분석(secondary analysis): 제1차 분석 자료를 재분석, 제1차분석의 연구문제에 대해 보다 나은 통계적 방법을 사용하거나 새로운 연구 질문에 대답을 구하려는 목적
- 메타분석(meta-analysis): 개별적 연구·결과들을 통계적으로 분석하는 이론 및 방법
메타분석 결과해석에 포함되어야 할 사항
- 메타분석에 포함된 개별연구의 수와 편의의 위험이 포함된 제시된 증거
- 효과크기 수준 및 연구 수준의 효과에 대한 정확도에 대한 평가
- 메타분석에 포함된 개별연구들이 동일 모집단에서 추출된 것인지에 대한 판단을 위해 연구간 효과들의 동질성 검정
- 개별효과 크기들을 종합한 효과크기를 계산하면서, 추정치(point estimate)에 대한 크기와 방향, 신뢰구간, 통계적 및 실체적 유의성, 잠재적 편의 위험에 대해 해석 및 논의
- 조절변인분석 실시 및 해석을 실시
통계적 방법 절차
- 효과크기 추정: 독립된 두 그룹 또는 단일군/ 연속형 또는 이분형
- 통합추정치 추정: 고정효과모형/ 랜덤효과모형
- 이질성 검토: 통계적 이질성, 하위그룹분석, 메타회귀분석
- 출판 비뚤림 검토: funnel plot, Beg’s test, Egger’s test trim-and-fill 방법, fall-safe N 방법, 누적 메타분석
- 민감도 분석: standardized residuals, Cook’s distances, leave-one-out analyses
1. Standardized outcome measure(효과크기추정)
effect size (θ, 효과크기) : standardized measure of effect (such as r, Cohen’s d, or the odds ratio), or to an unstandardized measure (e.g., the difference between group means or the unstandardized regression coefficients). 출처 https://en.wikipedia.org/wiki/Effect_size
- 효과크기에 대한 일반적인 해석기준 (Cohen(1988))
- 작은 효과크기: 상관계수(r) 0.1, 평균차 효과크기(d) 0.2
- 중간 효과크기: 상관계수 0.3, 평균차 효과크기 0.5
큰 효과크기: 상관계수 0.5, 평균차 효과크기 0.8
- Rate (비): a comparison between two measurements of different units (eg. 40 miles/hour)
Ratio(비율) : the relationship between the number, size of two or more similar things (eg. The ratio of Romy’s mangoes to Edgar’s is 3:6) 출처 http://www.differencebetween.net/science/mathematics-statistics/difference-between-rate-and-ratio/
2. Calculating overall effect(통합추정치 추정)
• 개별연구의 중요도에 따른 가중치를 이용 개별 연구의 가중치가 클수록 해당 연구가 통합추정치에 크게 기여한다. 더 정밀한 추정치를 제공한 연구 또는 표본 크기가 더 큰 연구에 더 많은 가중치 부여하는 것이 원칙 • 더 정밀한 추정치를 제공한 연구 분산의 역수이용 표본 크기가 더 큰 연구에 더 많은 가중치 부여하는 것이 원칙
1) Fixed effect model (FE, 고정효과모형):
메타분석에 포함된 연구들의 특성이 동질적일 때 이용 \(Y_i=\theta+\epsilon_i\) (i=1,…,k)
개별 연구의 가중치를 \(W_i\)라고 할 때, 통합추정치 \(\hat{\theta}\)는 가중평균으로 산출
\[\hat{\theta}=\frac{\sum_{k}^{i=1}W_iY_i}{\sum_{k}^{i=1}W_i}\] ① Inversevariance (IV, 역분산가중치) => 결과 발생이 드문 관심사건에 대한 메타분석은 bias가 생길 가능성이 높으므로, IV방법은 적합하지 않음
② Mantel-Haenszel (MH, 멘텔-헨젤)
③ Peto
2) Random effect model (RE, 랜덤효과모형):
메타분석에 포함된 연구들의 특성이 이질적일 때 이용 개별 연구들의 효과크기의 참값은 하나만 존재하는 것이 아니라 전체 평균을 중심으로 하는 정규분포를 따른다고 가정하는 모형
i번째 연구의 효과크기의 참값 \(\theta_i\)는 전체 평균 \(\mu\)를 평균으로 정규분포를 따른다고 가정.
\[Y_i = \theta_i+\epsilon_i = \mu+\zeta_i+\epsilon_i, (i=1,\cdots,k)\] \(\theta_i\)는 전체평균 \(\mu\)와 효과크기 변동을 나타내는 \(\zeta_i\)로 나타낼 수 있고, \(\epsilon_i\)는 i번째 연구 내 표본오차 \[\zeta_i \sim N(0, \tau^2)\] \[\epsilon_i \sim N(0, \sigma^2)\] \(\theta_i^2\)는 효과크기의 연구간 분산, \(\sigma^2\)은 i번째 연구의 표본오차인 \(\epsilon_i\)의 분산.
여기서 \(Var(Y_i) = \tau^2+\sigma^2\)이 되는데, RE 모형에서는 통합추정치의 분산을 최소화하기 위해 \(Var(Y_i)\)의 역수를 가중치로 이용한다.
Random effect 모형에서 사용 가능한 방법 : DerSimonian-Laird (DL), Hunter-Schmidt (HS), Hedges (HE), maximum likelihood (ML), and restricted maximum likelihood (REML) DL 방법이 많이 사용되며 결과 발생이 드문 관심사건에서 bias가 커지기 때문에 권하지 않음
-> FE or RE 의 선택은 Heterogeneity (이질성) 고려 후에 판단
3. Heterogeneity
Heterogeneity in effect sizes means the dispersion in the true effect size • Causes of heterogeneity ( Clinical, Statistical) : - Participants : condition, demographics, geographical variation, trial inclusion criteria - Interventions : type, duration, mode of administration, additional components, experience of practitioners, nature of controls - Outcomes : type, follow-up duration, ways of measuring, definition of an event - Design : randomised, non-randomised, cluster randomised, parallel vs. crossover, length - Conduct : allocation concealment, blinding, approach to analysis, imputation methods for missing data - Variation in true treatment effects in magnitude or direction
3-1. Assessing Heterogeneity : Q-statistics & \(H^2\)
코크란의 Q통계량: 개별 연구들의 효과크기가 통합추정치와 떨어져 있는 정도 \[Q=\sum_{i=1}^{k}W_i(Y_i-\hat\theta)^2=\sum_{i=1}^{k}W_iY_i^2-\frac{(\sum_{i=1}^{k}W_iY_i)^2}{\sum_{i=1}^{k}W_i}\sim\chi^2(k-1)\] 통계량이 자유도에 비해 클수록 효과크기가 통계적 이질성이 있을 가능성이 높아진다.
-> 연구수가 작거나, 연구 내 표본수가 작거나, 관심결과 발생이 드문 경우 또는 하나의 연구가 다른 연구에 비해 가중치가 많이 클 경우 power(검정력)가 낮다.
-> 유의수준은 0.05보다 0.1을 많이 사용한다.
Q 통계량을 이용하여 정의하는 \(H^2\)통계량은
\(H^2=\frac{Q}{df}\)
로 정의하고, \(H^2>1\) 일 경우 설명할 수 없는 이질성이 있다고 판단한다.
3-2. Assessing Heterogeneity : \(\tau^2\) & \(I^2\)-statistics
\(\tau^2\) 통계량: 효과크기의 연구간 변동을 나타내는 분산 \[\tau^2=\frac{Q-df}{C}\] 여기서 C는 \(C=\sum_{i=1}^{k}W_i-\frac{\sum_{i=1}^{k}W_i^2}{\sum_{i=1}^{k}W_i}\)
\(\tau^2\)값이 클수록 연구간 변동이 크다는 뜻
\(I^2\) 통계량: 통계적 이질성으로 인한 효과크기의 변동을 백분율로 나타내는 것. ->효과크기의 총 변동 중 연구간 변동의 비 \(I^2=\frac{Q-df}{Q}X100\)%
\(I^2\)=0~40%: 통계적 이질성이 중요하지 않을 수 있음 \(I^2\)=30~60%: 중간정도의 통계적 이질성이 있을 수 있음 \(I^2\)=50~90%: 상당한 통계적 이질성이 있을 수 있음 \(I^2\)=75~100%: 무시할 수 없는 통계적 이질성이 있을 수 있음
4. Publication bias
효과크기가 크고, 유의한 결과를 가지는 연구가 출판되는 경향이 높고, 연구 결과의 방향에 따라 출판여부가 달라지는 경향이 있다.
->실제 효과크기에 비해 과대 추정된 효과크기를 산출 출판비뚤림
Funnel plot: 시각적인 방법 깔대기 그림이 비대칭적인지에 대한 가설검정: Begg’s, Egger’s test 위의 방법을 통해 출판비뚤림이 있다고 판단되면, 출판 비뚤림이 연구결과에 미치는 영향을 파악할 필요 있다 trim-and-fill, fial-safe N
Funnel plot:X축은 효과를 나타내고, Y축은 표본크기를 나타내 표본수, 표준오차, 표준오차의 역수, 분산, 분산의 역수가 쓰일 수 있다. 95% Pseudo CI (=통합추정치\(\pm1.95SE\))밖에 위치한 연구수가 많을수록 이질적 이다고 할 수 있다.
Trim & Fill method
이 방법은 funnel plot에서 효과크기의 분포를 확인하는 방법으로 균등 한 분포를 보인 경우에는 출판오류가 없는 것으로 판단할 수 있다. 균등하지 못한 분포를 보인 경우에는 가상의 연구 결측값을 넣어 보정하게 되는데 보정 이후에 효과크기의 변화가 <10%이면 출판오류 가 없는 것으로 판단 (Sutton et al., 2000)
Fail-safe number (Nfs)
고정효과모형에서 확인할 수 있는 안전계수(Nfs) 산정이다. 이 방법은 종 합적 치료 효과크기가 유의하지 않은 것으로 나타나기 위해 숨겨진 연구 들이 얼마나 더 필요한지 계산하는 방법이다 (Orwin, 1983). 자명 효과(trivial effect)가 0.20, 결측연구 효과(missing study effect)가 0인 상황에서 효과크기 값을 0.20 미만으로 만들기 위해 필요한 연구 수로 확인. 안전계수는 ‘충분히 크다’라고 판단할 수 있는 기준이 일반적으로 5n+10 (n=분석에 포함된 연구의 수) 이상이어야 한다.
5. Sensitivity analysis (민감도분석)
민감도 분석이란 영향력 있는 study 혹은 outliers 를 찾아내거나, 또는 각 단계에서 행하여진 방법에 따라 통합추정치가 얼마나 바뀌는지 살펴보는 것. Standardized residuals, Cook’s distances, leave-one-out analyses등이 사용 가능함 leave-one-out analyses의 경우 study를 하나씩 빼가며 통합추정치를 구하고 이때 결과가 크게 달라지는 보는 것임
[Ex1] Fixed effect model using IV-평균차 (MD)이용
MD와 MD의 분산을 계산하여 dat_MD라는 데이터셋으로 저장함
library(metafor)
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
#dat.normand1999: 특별치료 vs 일반치료(뇌졸증 환자대상)의 입원일수 비교, continuous outcomes: Mean Diffrence, Standarized Mean Difference
dat <- get(data(dat.normand1999))
head(dat,3)
dat <- get(data(dat.normand1999))
dat_MD <- escalc(measure="MD", m1i=m1i, sd1i=sd1i, n1i=n1i, m2i=m2i, sd2i=sd2i, n2i=n2i, data=dat)
head(dat_MD,3)
study source n1i m1i sd1i n2i m2i sd2i yi vi
1 1 Edinburgh 155 55 47 156 75 64 -20.0000 40.5080
2 2 Orpington-Mild 31 27 7 32 29 4 -2.0000 2.0806
3 3 Orpington-Moderate 75 64 17 71 119 29 -55.0000 15.6984
MD의 IV(역분산가중치)방법 이용한 통합추정치 계산
#Normand(1999)-stroke patients
#1= specialized care
#2= routine non-specialist care
#n= no of patients
#m= avg length of hospital stay
#sd=sd of hospital stay
res1<- rma(yi, vi, data= dat_MD, method="FE")
res1
Fixed-Effects Model (k = 9)
Test for Heterogeneity:
Q(df = 8) = 238.9158, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-3.4636 0.7648 -4.5286 <.0001 -4.9626 -1.9646 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(res1)
Fixed-Effects Model (k = 9)
logLik deviance AIC BIC AICc
-140.0210 238.9158 282.0421 282.2393 282.6135
Test for Heterogeneity:
Q(df = 8) = 238.9158, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-3.4636 0.7648 -4.5286 <.0001 -4.9626 -1.9646 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
해석: \(\hat{\theta}\)=-3.4636, \(SE\hat{\theta}\)=0.7648, 95%CI=[-4.9626, -1.9646], p-val<0.001 ->특별치료 군의 입원일수가 일반치료 군보다 3.46일 짧다고 할 수 있다.
[Ex2] Fixed effect model using IV-오즈비 (OR) 이용
#dat.bcg: Coldtiz (1994), 백신 접종군 vs 대조군 (event=결핵 발생자), binary outcomes: OR, RR, RD(Risk difference)
data(dat.bcg)
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
dat_lnOR <- escalc(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
head(dat_lnOR ,3)
trial author year tpos tneg cpos cneg ablat alloc yi vi
1 1 Aronson 1948 4 119 11 128 44 random -0.9387 0.3571
2 2 Ferguson & Simes 1949 6 300 29 274 55 random -1.6662 0.2081
3 3 Rosenthal et al 1960 3 228 11 209 42 random -1.3863 0.4334
ln(OR)의 IV(역분산가중치)방법 이용한 통합추정치 계산
res2 <- rma(yi, vi, data= dat_lnOR, method="FE")
res2
Fixed-Effects Model (k = 13)
Test for Heterogeneity:
Q(df = 12) = 163.1649, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-0.4361 0.0423 -10.3190 <.0001 -0.5190 -0.3533 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
\(ln(\hat{OR})\)=-0.4361, \(SE(\hat{\theta})\)=0.0423, 95%CI=[-0.5190, -0.3533]
predict(res2, transf=exp, digits=4)
pred ci.lb ci.ub
0.6465 0.5951 0.7024
해석: predict()함수를 통해 지수 변환된 값은 \(\hat{OR}\)=exp(-0.4361)=0.6465, 95%CI for \(\hat{OR}\)=[0.5951, 0.7024]
->BCG 백순군에서 대조군에 비해 결핵발생이 35% 감소한다고 할 수 있다.
[Ex3] Fixed effect model using MH-오즈비 (OR) 이용
Mantel-Haenszel(MH)방법은 이분형 자료에서만 사용할 수 있기에, 효과크기가 위험비(RR), 오즈비(OR), 위험차(RD)인 경우에 사용할 수 있다. R 함수: rma.mhሺሻ()
res3 <- rma.mh(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="OR")
res3
Fixed-Effects Model (k = 13)
Test for Heterogeneity:
Q(df = 12) = 163.9426, p-val < .0001
Model Results (log scale):
estimate se zval pval ci.lb ci.ub
-0.4734 0.0410 -11.5444 <.0001 -0.5538 -0.3930
Model Results (OR scale):
estimate ci.lb ci.ub
0.6229 0.5748 0.6750
Cochran-Mantel-Haenszel Test: CMH = 135.6889, df = 1, p-val < 0.0001
Tarone's Test for Heterogeneity: X^2 = 171.7567, df = 12, p-val < 0.0001
함수 rma.mh는 ln\(\hat{OR}\)와 \(\hat{OR}\) 각각의 결과를 보여줌
① ln\(\hat{OR}\)=-0.4763, SE(ln\(\hat{OR}\))=0.0410, 95%CI for ln\(\hat{OR}\)ሻ=[-0.5538,-0.3930] ② \(\hat{OR}\)=0.6229, 95%CI for \(\hat{OR}\)=[0.5748, 0.6750] ③ CMH검정: 모든 개별연구의 OR가 1인지 검정 p-val<0.001이므로 모든 개별연구의 OR가 1로 동일하다고 할 수 없다.
[Ex4] Fixed effect model using MH-위험비 (RR) 이용
res4 <- rma.mh(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR")
res4
Fixed-Effects Model (k = 13)
Test for Heterogeneity:
Q(df = 12) = 152.5676, p-val < .0001
Model Results (log scale):
estimate se zval pval ci.lb ci.ub
-0.4537 0.0393 -11.5338 <.0001 -0.5308 -0.3766
Model Results (RR scale):
estimate ci.lb ci.ub
0.6353 0.5881 0.6862
Mantel-Haenszel(MH)방법에 의한 로그 위험비의 통합추정치는 다음과 같다.
① \(ln\hat{RR}\)==-0.4537, \(SE(ln\hat{RR})\)=0.0393, 95%CI for \(ln\hat{RR}\)=[-0.5308,-0.3766] p-val<0.001이므로 BCG백신군과 대조군간에 결핵발생이 다르다고 할 수 있다.
②\(hat{RR}\)=0.6353, 95%CI for ܴ\(hat{RR}\)=[0.5881, 0.6862] ->대조군에 비해 BCG백신군에서 결핵발생이 36.5% 감소한다고 할 수 있다.
[Ex5] Fixed effect model using MH-위험차 (RD) 이용
res5<- rma.mh(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RD")
res5
Fixed-Effects Model (k = 13)
Test for Heterogeneity:
Q(df = 12) = 386.7759, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-0.0033 0.0003 -11.4708 <.0001 -0.0039 -0.0027
Mantel-Haenszel(MH)방법에 의한 위험차의 통합추정치는 다음과 같다.
\(\hat{RD}\)=0.0033, 95%CI for \(hat{RD}\)=[-0.0039, -0.0027] ->p-val<0.001이므로 위험차가 0이라는 귀무가설을 기각함. 즉, BCG백신 군과 대조군 간에 결핵발생이 다르다고 할 수 있고, 대조 군에 비해 BCG백신 군에서 결핵발생이 0.33% 낮다고 할 수 있다.
[Ex6] Fixed effect model using Peto -오즈비 (OR) 이용
Peto 방법은 오즈비의 통합에만 사용할 수 있다.
R 함수: rma.petoሺ ()
res6<- rma.peto(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
res6
Fixed-Effects Model (k = 13)
Test for Heterogeneity:
Q(df = 12) = 167.7302, p-val < .0001
Model Results (log scale):
estimate se zval pval ci.lb ci.ub
-0.4744 0.0407 -11.6689 <.0001 -0.5541 -0.3948
Model Results (OR scale):
estimate ci.lb ci.ub
0.6222 0.5746 0.6738
함수 rma.peto는 ln\(\hat{OR}\)와 \(\hat{OR}\) 각각의 결과를 보여줌
① ln\(\hat{OR}\)=-0.4744, SE(ln\(\hat{OR}\))=0.0407, 95%CI for ln\(\hat{OR}\)ሻ=[-0.5541, -0.3948]
->p-val<0.001이므로 BCG백신 군과 대조 군간에 결핵발생이 다르다고 할 수 있다.
② \(\hat{OR}\)=0.6222, 95%CI for \(\hat{OR}\)=[0.5746, 0.6738]
->대조 군의 결핵발생에 대한 OR에 비해 BCG백신 군의 결핵발생에 대한 OR가 0.62배라고 할 수 있다.
[Ex7] Random effect model using DL-평균차 (MD)이용
MD와 MD의 분산 계산
dat_MD <- escalc(measure="MD", m1i=m1i, sd1i=sd1i, n1i=n1i, m2i=m2i, sd2i=sd2i, n2i=n2i, data=dat)
MD의 DerSimonian-Laird 방법 통합추정치 계산
res7<- rma(yi, vi, data= dat_MD, method="DL")
res7
Random-Effects Model (k = 9; tau^2 estimator: DL)
tau^2 (estimated amount of total heterogeneity): 205.4094 (SE = 179.7183)
tau (square root of estimated tau^2 value): 14.3321
I^2 (total heterogeneity / total variability): 96.65%
H^2 (total variability / sampling variability): 29.86
Test for Heterogeneity:
Q(df = 8) = 238.9158, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-13.9817 5.1267 -2.7272 0.0064 -24.0299 -3.9336 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
① DL방법으로 추정된 연구간 분산 \(\hat\tau^2=205.4094\)
② Q의 유의확률이 p‐val<0.0001로 개별연구들의 효과크기가 상당히 이질적임. Random effect model로 통합추정치를 구하는 것이 적절함
③ \(\hat{MD}=-13.9817, SE(\hat{MD})=5.1267, p-val=0.0064,95%CI=[-24.0299, -3.9339]\)
-> 특별치료 군의 입원일수가 일반치료 군의 것보다 13.98일 짧다고 할 수 있다.
[Ex8] Random effect model using DL-오즈비 (OR) 이용
ln(OR)의 DerSimonian-Laird 방법 통합추정치 계산
#dat_lnOR <- escalc(measure="OR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
res8<- rma(yi, vi, data= dat_lnOR, method="DL")
res8
Random-Effects Model (k = 13; tau^2 estimator: DL)
tau^2 (estimated amount of total heterogeneity): 0.3663 (SE = 0.2659)
tau (square root of estimated tau^2 value): 0.6053
I^2 (total heterogeneity / total variability): 92.65%
H^2 (total variability / sampling variability): 13.60
Test for Heterogeneity:
Q(df = 12) = 163.1649, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-0.7474 0.1923 -3.8873 0.0001 -1.1242 -0.3706 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
① DL방법으로 추정된 연구간 분산 \(\hat\tau^2=20.3663\)
② Q의 유의확률이 p‐val<0.0001로 개별연구들의 효과크기가 상당히 이질적임. ->Random effect model로 통합추정치를 구하는 것이 적절함
③ \(ln(\hat{MD})=-13.9817, SE(ln(\hat{MD}))=5.1267, p-val=0.0001,95%CI=[-1.1242,-0.3706]\)
->\(\hat{MD}=exp(-13.9817)=0.4736, 95%CI for \hat{OR}=[0.3249, 0.6903]\)
대조 군에 비해 BCG 백신 군에서 결핵발생이 53% 감소한다고 할 수 있다.
[Ex9] Heterogeneity : Forest plot
res_RE <- rma(yi, vi, data= dat_lnOR, method="DL")
forest(res_RE, xlim=c(-16, 10), at=log(c(.05, .25, 1, 4)), atransf=exp,
ilab=cbind(dat.bcg$tpos, dat.bcg$tneg, dat.bcg$cpos, dat.bcg$cneg),
ilab.xpos=c(-9.5,-8,-6,-4.5), cex=.75, showweight=TRUE)
text(c(-9.5,-8,-6,-4.5), 15, c("TB+", "TB-", "TB+", "TB-"), cex=0.75)
text(c(-8.75,-5.25), 16, c("Vaccinated", "Control"), cex=0.75)
text(5, 15, "Weights", pos=2, cex=0.75)
text(9, 15, "OR[95% CI]", pos=2, cex=0.75)
[Ex10] Heterogeneity : Q-statistics & H^2
res <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="OR", method="DL")
# Q-value
res$QE
[1] 163.1649
res$QEp
[1] 1.188773e-28
summary(res)
Random-Effects Model (k = 13; tau^2 estimator: DL)
logLik deviance AIC BIC AICc
-13.1398 37.3865 30.2795 31.4094 31.4795
tau^2 (estimated amount of total heterogeneity): 0.3663 (SE = 0.2659)
tau (square root of estimated tau^2 value): 0.6053
I^2 (total heterogeneity / total variability): 92.65%
H^2 (total variability / sampling variability): 13.60
Test for Heterogeneity:
Q(df = 12) = 163.1649, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-0.7474 0.1923 -3.8873 0.0001 -1.1242 -0.3706 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
names(res)
[1] "b" "beta" "se" "zval" "pval" "ci.lb" "ci.ub" "vb" "tau2"
[10] "se.tau2" "tau2.fix" "k" "k.f" "k.eff" "p" "p.eff" "parms" "m"
[19] "QE" "QEp" "QM" "QMp" "I2" "H2" "R2" "int.only" "int.incl"
[28] "allvipos" "coef.na" "yi" "vi" "X" "weights" "yi.f" "vi.f" "X.f"
[37] "weights.f" "M" "ai.f" "bi.f" "ci.f" "di.f" "x1i.f" "x2i.f" "t1i.f"
[46] "t2i.f" "ni" "ni.f" "ids" "not.na" "subset" "slab" "slab.null" "measure"
[55] "method" "weighted" "test" "dfs" "s2w" "btt" "intercept" "digits" "level"
[64] "control" "verbose" "add" "to" "drop00" "fit.stats" "version" "model" "call"
[Ex11] Heterogeneity : tau^2 and I^2 statistics
res$I2
[1] 92.64548
res$tau2
[1] 0.3663434
confint(res) # confidence intervals
estimate ci.lb ci.ub
tau^2 0.3663 0.1302 1.1812
tau 0.6053 0.3608 1.0868
I^2(%) 92.6455 81.7376 97.5971
H^2 13.5971 5.4757 41.6164
\(I^2\) 통계량=92.6455, 95%CI=[81.74%, 97.60%]이므로 무시할 수 없는 통계적 이질성이 있다고 할 수 있다. ※ 이질성 판단여부는 효과크기의 방향과 크기, Q 통계량을 이용한 가설검정 결과, \(I^2\) 통계량의 신뢰구간 등을 함께 고려해야 한다.
[Ex12] Subgroup analysis
개별 연구들간 효과크기의 이질성의 원인을 파악하기 위하여, 전체 대상 연구들을 동질적 이라 예상되는 하위그룹으로 구분하여 메타분석을 하위 그룹별로 각각 실시한다
# Total and subgroups
res <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR", slab=paste(author, year, sep=", "), method="DL")
res.s <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR", subset=(alloc=="systematic"), method="DL")
res.r <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR", subset=(alloc=="random"), method="DL")
res.a <- rma(ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg, measure="RR", subset=(alloc=="alternate"), method="DL")
forest(res, xlim=c(-16, 6), at=log(c(.05, .25, 1, 4)), atransf=exp,
ilab=cbind(dat.bcg$tpos, dat.bcg$tneg, dat.bcg$cpos, dat.bcg$cneg),
ilab.xpos=c(-9.5,-8,-6,-4.5), cex=.75, ylim=c(-1,27), order=order(dat.bcg$alloc),
rows=c(3:4, 9:15, 20:23), xlab="Relative Risk", mlab="RE Model for All studies")
text(-16, c(24, 16, 5), pos=4, c("Systematic Allocation","Random Allocation", "Alternate Allocation"), cex=.75, font=4)
text(c(-9.5,-8,-6,-4.5), 26, c("TB+", "TB-", "TB+", "TB-"), cex=0.75)
text(c(-8.75,-5.25), 27, c("Vaccinated", "Control"), cex=0.75)
text(-16, 26, "Author(s) and Year", pos=4, cex=0.75)
text(6, 26, "Relative Risk [95% CI]", pos=2, cex=0.75)
# Add polygons to forest plosts for subgroup
addpoly(res.s, row=18.5, cex=.75, atransf=exp, mlab="RE Model for Subgroup")
addpoly(res.r, row=7.5, cex=.75, atransf=exp, mlab="RE Model for Subgroup")
addpoly(res.a, row=1.5, cex=.75, atransf=exp, mlab="RE Model for Subgroup")
res.s
Random-Effects Model (k = 4; tau^2 estimator: DL)
tau^2 (estimated amount of total heterogeneity): 0.2850 (SE = 0.3334)
tau (square root of estimated tau^2 value): 0.5338
I^2 (total heterogeneity / total variability): 81.92%
H^2 (total variability / sampling variability): 5.53
Test for Heterogeneity:
Q(df = 3) = 16.5919, p-val = 0.0009
Model Results:
estimate se zval pval ci.lb ci.ub
-0.4393 0.3133 -1.4021 0.1609 -1.0535 0.1748
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
res.r
Random-Effects Model (k = 7; tau^2 estimator: DL)
tau^2 (estimated amount of total heterogeneity): 0.7631 (SE = 0.7774)
tau (square root of estimated tau^2 value): 0.8735
I^2 (total heterogeneity / total variability): 94.56%
H^2 (total variability / sampling variability): 18.37
Test for Heterogeneity:
Q(df = 6) = 110.2133, p-val < .0001
Model Results:
estimate se zval pval ci.lb ci.ub
-1.0042 0.3621 -2.7731 0.0056 -1.7139 -0.2944 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
res.a
Random-Effects Model (k = 2; tau^2 estimator: DL)
tau^2 (estimated amount of total heterogeneity): 0.1326 (SE = 0.2286)
tau (square root of estimated tau^2 value): 0.3641
I^2 (total heterogeneity / total variability): 82.02%
H^2 (total variability / sampling variability): 5.56
Test for Heterogeneity:
Q(df = 1) = 5.5625, p-val = 0.0183
Model Results:
estimate se zval pval ci.lb ci.ub
-0.5408 0.2816 -1.9204 0.0548 -1.0927 0.0111 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
[Ex13] Publication bias : Funnel plot
dat <- get(data(dat.hackshaw1998))
res <- rma(yi, vi, data=dat, measure="OR", method="FE")
par(mfrow=c(1,3))
funnel(res, atransf=exp, xlab="Odds Ratio", at=log(c(.25, .5, 1, 2, 4)))
# contour-enhanced funnel plot centered at 0
funnel(res, level=c(90, 95, 99), shade=c("white","gray","darkgray"),
refline=0, atransf=exp, xlab="Odds Ratio", at=log(c(.25, .5, 1, 2, 4)))
# contour-enhanced funnel plot : Y-axis=inverse of the standard error
funnel(res, level=c(90, 95, 99), shade=c("white","gray","darkgray"),
refline=0, atransf=exp, xlab="Odds Ratio", at=log(c(.25, .5, 1, 2, 4)), yaxis="seinv")
X축은 effect size, Y축은 표본크기(표본수, SE, 분산 등)를 나타내고, 출판삐뚤림이 없으면 표본크기가 작은 연구들은 아래쪽에 골고루, 표본크기가 큰 연구들은 윗쪽에 집중적으로 보임.
첫번째 그림에서 좌측 하단 연구들이 없음->표본크기 작고, 효과크기가 1보다 작은 연구들은 포함되어있지 않으므로, 출판삐뚤림이 의심됨
[Ex14] Publication bias : Begg’s test, Egger’s test
# Begg’s test
ranktest(res)
Rank Correlation Test for Funnel Plot Asymmetry
Kendall's tau = 0.1441, p = 0.2157
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
p-value=0.2157 -> 출판 비뚤림이 있다고 할 수 없다
# Egger’s test
regtest(res)
Regression Test for Funnel Plot Asymmetry
model: fixed-effects meta-regression model
predictor: standard error
test for funnel plot asymmetry: z = 2.5759, p = 0.0100
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
p-value=0.0100 -> 출판 비뚤림이 있다고 할 수 없다
※ Begg, Egger 방법은 메타 분석에 포함된 연구수가 10개보다 작거나, 심각한 출판 비뚤림이 없는 경우 검정력이 낮다. 회귀분석 방법을 이용한 Egger방법이 Begg에 비해 검정력이 다소 높다.
[Ex15] Publication bias : Trim-and-fill, Fail-safe N
res <- rma(yi, vi, data=dat, method="FE")
res.tf <- trimfill(res)
res.tf
Estimated number of missing studies on the left side: 7 (SE = 4.0407)
Fixed-Effects Model (k = 44)
Test for Heterogeneity:
Q(df = 43) = 61.8712, p-val = 0.0310
Model Results:
estimate se zval pval ci.lb ci.ub
0.1555 0.0364 4.2706 <.0001 0.0842 0.2269 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Trim-and-fill결과:원래 통합추정치는 0.1857, 수정된 통합추정치는 0.1555
funnel(res.tf, atransf=exp, xlab="Odds Ratio", at=log(c(.25, .5, 1, 2, 4)))
fsn(yi, vi, data=dat, type="Rosenthal")
Fail-safe N Calculation Using the Rosenthal Approach
Observed Significance Level: <.0001
Target Significance Level: 0.05
Fail-safe N: 393
Fail-safe N 결과: 5k+10보다 크면 전체 효과크기에 미치는 영향이 크지 않다고 한다. Fail-safe N은 393으로 5*37+10=195 보다 크므로 전체 효과 크기가 출판 비뚤림에 영향을 받는다고 할 수 없다.
[Ex17] Sensitivity analysis
### calculate log relative risks and corresponding sampling variances
dat <- escalc(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
res <- rma(yi, vi, data=dat) # deault는 random effect
leave1out(res); LO1<- leave1out(res, transf=exp);
estimate se zval pval ci.lb ci.ub Q Qp tau2 I2 H2
1 -0.7071 0.1900 -3.7223 0.0002 -1.0794 -0.3348 151.5826 0.0000 0.3362 93.2259 14.7622
2 -0.6540 0.1807 -3.6195 0.0003 -1.0082 -0.2999 145.3176 0.0000 0.2926 92.2540 12.9098
3 -0.6856 0.1857 -3.6916 0.0002 -1.0495 -0.3216 150.1970 0.0000 0.3207 92.9354 14.1551
4 -0.6284 0.1766 -3.5580 0.0004 -0.9746 -0.2822 96.5626 0.0000 0.2628 90.4125 10.4302
5 -0.7642 0.1918 -3.9845 0.0001 -1.1401 -0.3883 151.3200 0.0000 0.3278 92.7634 13.8187
6 -0.7109 0.2003 -3.5499 0.0004 -1.1034 -0.3184 128.1867 0.0000 0.3596 90.9118 11.0033
7 -0.6552 0.1805 -3.6307 0.0003 -1.0090 -0.3015 145.8296 0.0000 0.2930 92.2777 12.9495
8 -0.7948 0.1799 -4.4184 0.0000 -1.1473 -0.4422 67.9858 0.0000 0.2732 87.0314 7.7109
9 -0.7412 0.1967 -3.7686 0.0002 -1.1267 -0.3557 152.2051 0.0000 0.3495 93.2133 14.7346
10 -0.6530 0.1843 -3.5439 0.0004 -1.0142 -0.2919 139.8271 0.0000 0.2987 92.2322 12.8737
11 -0.7579 0.1958 -3.8708 0.0001 -1.1416 -0.3741 151.4655 0.0000 0.3405 91.8110 12.2114
12 -0.7598 0.1821 -4.1727 0.0000 -1.1167 -0.4029 150.7868 0.0000 0.3082 92.6782 13.6579
13 -0.7775 0.1855 -4.1908 0.0000 -1.1412 -0.4139 149.7884 0.0000 0.3037 92.3444 13.0623
### meta-analysis of the (log) relative risks using the Mantel-Haenszel method
res <- rma.mh(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
leave1out(res);LO2<- leave1out(res, transf=exp);
estimate se zval pval ci.lb ci.ub Q Qp
1 -0.4514 0.0394 -11.4462 0.0000 -0.5287 -0.3741 151.9153 0.0000
2 -0.4410 0.0395 -11.1512 0.0000 -0.5185 -0.3635 145.5727 0.0000
3 -0.4495 0.0394 -11.4001 0.0000 -0.5267 -0.3722 150.5130 0.0000
4 -0.3392 0.0414 -8.1874 0.0000 -0.4205 -0.2580 96.5629 0.0000
5 -0.4614 0.0400 -11.5474 0.0000 -0.5397 -0.3831 151.6611 0.0000
6 -0.3666 0.0448 -8.1809 0.0000 -0.4544 -0.2788 129.2200 0.0000
7 -0.4466 0.0395 -11.3046 0.0000 -0.5241 -0.3692 146.2134 0.0000
8 -0.7758 0.0520 -14.9267 0.0000 -0.8777 -0.6739 68.3763 0.0000
9 -0.4532 0.0399 -11.3633 0.0000 -0.5314 -0.3751 152.5497 0.0000
10 -0.4278 0.0399 -10.7338 0.0000 -0.5059 -0.3497 140.0446 0.0000
11 -0.4698 0.0421 -11.1706 0.0000 -0.5522 -0.3874 151.8140 0.0000
12 -0.4566 0.0394 -11.5865 0.0000 -0.5338 -0.3794 151.1253 0.0000
13 -0.4637 0.0398 -11.6542 0.0000 -0.5417 -0.3858 150.1246 0.0000
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
leave1out(res);LO3<- leave1out(res, transf=exp);
estimate se zval pval ci.lb ci.ub Q Qp
1 -0.4722 0.0408 -11.5791 0.0000 -0.5521 -0.3923 167.2005 0.0000
2 -0.4616 0.0409 -11.2751 0.0000 -0.5418 -0.3814 160.5154 0.0000
3 -0.4702 0.0408 -11.5317 0.0000 -0.5501 -0.3903 165.7913 0.0000
4 -0.3591 0.0435 -8.2533 0.0000 -0.4443 -0.2738 112.1274 0.0000
5 -0.4832 0.0413 -11.6873 0.0000 -0.5642 -0.4021 166.3727 0.0000
6 -0.3710 0.0451 -8.2328 0.0000 -0.4593 -0.2827 139.3918 0.0000
7 -0.4660 0.0408 -11.4343 0.0000 -0.5459 -0.3861 158.6048 0.0000
8 -0.8161 0.0531 -15.3842 0.0000 -0.9201 -0.7122 67.1837 0.0000
9 -0.4747 0.0413 -11.4973 0.0000 -0.5557 -0.3938 167.7284 0.0000
10 -0.4486 0.0413 -10.8488 0.0000 -0.5296 -0.3675 155.8992 0.0000
11 -0.4911 0.0434 -11.3135 0.0000 -0.5762 -0.4060 166.5326 0.0000
12 -0.4775 0.0407 -11.7236 0.0000 -0.5573 -0.3976 166.0703 0.0000
13 -0.4853 0.0411 -11.7960 0.0000 -0.5659 -0.4046 164.7427 0.0000
LO1;LO2;LO3
estimate zval pval ci.lb ci.ub Q Qp tau2 I2 H2
1 0.4931 -3.7223 0.0002 0.3398 0.7155 151.5826 0.0000 0.3362 93.2259 14.7622
2 0.5199 -3.6195 0.0003 0.3649 0.7409 145.3176 0.0000 0.2926 92.2540 12.9098
3 0.5038 -3.6916 0.0002 0.3501 0.7250 150.1970 0.0000 0.3207 92.9354 14.1551
4 0.5334 -3.5580 0.0004 0.3774 0.7541 96.5626 0.0000 0.2628 90.4125 10.4302
5 0.4657 -3.9845 0.0001 0.3198 0.6782 151.3200 0.0000 0.3278 92.7634 13.8187
6 0.4912 -3.5499 0.0004 0.3318 0.7273 128.1867 0.0000 0.3596 90.9118 11.0033
7 0.5193 -3.6307 0.0003 0.3646 0.7397 145.8296 0.0000 0.2930 92.2777 12.9495
8 0.4517 -4.4184 0.0000 0.3175 0.6426 67.9858 0.0000 0.2732 87.0314 7.7109
9 0.4765 -3.7686 0.0002 0.3241 0.7007 152.2051 0.0000 0.3495 93.2133 14.7346
10 0.5205 -3.5439 0.0004 0.3627 0.7469 139.8271 0.0000 0.2987 92.2322 12.8737
11 0.4687 -3.8708 0.0001 0.3193 0.6879 151.4655 0.0000 0.3405 91.8110 12.2114
12 0.4678 -4.1727 0.0000 0.3274 0.6684 150.7868 0.0000 0.3082 92.6782 13.6579
13 0.4595 -4.1908 0.0000 0.3194 0.6611 149.7884 0.0000 0.3037 92.3444 13.0623
estimate zval pval ci.lb ci.ub Q Qp
1 0.6367 -11.4462 0.0000 0.5894 0.6879 151.9153 0.0000
2 0.6434 -11.1512 0.0000 0.5954 0.6952 145.5727 0.0000
3 0.6380 -11.4001 0.0000 0.5905 0.6892 150.5130 0.0000
4 0.7123 -8.1874 0.0000 0.6568 0.7726 96.5629 0.0000
5 0.6304 -11.5474 0.0000 0.5829 0.6818 151.6611 0.0000
6 0.6931 -8.1809 0.0000 0.6348 0.7567 129.2200 0.0000
7 0.6398 -11.3046 0.0000 0.5921 0.6913 146.2134 0.0000
8 0.4603 -14.9267 0.0000 0.4158 0.5097 68.3763 0.0000
9 0.6356 -11.3633 0.0000 0.5878 0.6872 152.5497 0.0000
10 0.6520 -10.7338 0.0000 0.6030 0.7049 140.0446 0.0000
11 0.6251 -11.1706 0.0000 0.5757 0.6788 151.8140 0.0000
12 0.6334 -11.5865 0.0000 0.5864 0.6843 151.1253 0.0000
13 0.6289 -11.6542 0.0000 0.5817 0.6799 150.1246 0.0000
estimate zval pval ci.lb ci.ub Q Qp
1 0.6236 -11.5791 0.0000 0.5757 0.6755 167.2005 0.0000
2 0.6303 -11.2751 0.0000 0.5817 0.6829 160.5154 0.0000
3 0.6249 -11.5317 0.0000 0.5769 0.6769 165.7913 0.0000
4 0.6983 -8.2533 0.0000 0.6413 0.7605 112.1274 0.0000
5 0.6168 -11.6873 0.0000 0.5688 0.6689 166.3727 0.0000
6 0.6900 -8.2328 0.0000 0.6317 0.7538 139.3918 0.0000
7 0.6275 -11.4343 0.0000 0.5793 0.6797 158.6048 0.0000
8 0.4421 -15.3842 0.0000 0.3985 0.4906 67.1837 0.0000
9 0.6220 -11.4973 0.0000 0.5737 0.6745 167.7284 0.0000
10 0.6385 -10.8488 0.0000 0.5888 0.6924 155.8992 0.0000
11 0.6120 -11.3135 0.0000 0.5621 0.6663 166.5326 0.0000
12 0.6204 -11.7236 0.0000 0.5728 0.6719 166.0703 0.0000
13 0.6155 -11.7960 0.0000 0.5679 0.6672 164.7427 0.0000
[Ex18] IRR 기준으로 hart1999 데이터 메타 분석 및 시각화
#dat.hart1999: 와파린 군 vs 대조군 (심방세동 환자대상)의 뇌졸증 발생수, events counts: Log Incidence Rate ratio(IRR), Incidence Rate Difference(IRD), squre-root transformed incidence rate difference(IRSD)
dat <- get(data(dat.hart1999))
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
### calculate log incidence rate ratios and corresponding sampling variances
dat <- escalc(measure="IRR", x1i=x1i, x2i=x2i, t1i=t1i, t2i=t2i, data=dat)
dat
trial study year x1i n1i t1i x2i n2i t2i compgrp prevtype trinr yi vi
1 1 AFASAK 1989 9 335 413 19 336 398 placebo primary 2.8-4.2 -0.7842 0.1637
2 2 SPAF 1991 8 210 263 19 211 245 placebo primary 2.0-4.5 -0.9359 0.1776
3 3 BAATAF 1990 3 212 487 13 208 435 control primary 1.5-2.7 -1.5793 0.4103
4 4 CAFA 1991 6 187 237 9 191 241 placebo primary 2.0-3.0 -0.3887 0.2778
5 5 SPINAF 1992 7 281 489 23 290 483 placebo primary 1.4-2.8 -1.2019 0.1863
6 6 EAFT 1993 20 225 507 50 214 405 placebo secondary 2.5-4.0 -1.1409 0.0700
### meta-analysis of log incidence rate ratios using a random-effects model
res <- rma(yi, vi, data=dat)
res
Random-Effects Model (k = 6; tau^2 estimator: REML)
tau^2 (estimated amount of total heterogeneity): 0 (SE = 0.0987)
tau (square root of estimated tau^2 value): 0
I^2 (total heterogeneity / total variability): 0.00%
H^2 (total variability / sampling variability): 1.00
Test for Heterogeneity:
Q(df = 5) = 2.9625, p-val = 0.7058
Model Results:
estimate se zval pval ci.lb ci.ub
-1.0168 0.1635 -6.2206 <.0001 -1.3372 -0.6964 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
### average incidence rate ratio with 95% CI
predict(res, transf=exp)
pred ci.lb ci.ub cr.lb cr.ub
0.3617 0.2626 0.4984 0.2626 0.4984
### forest plot with extra annotations
par(mar=c(5,4,1,2))
forest(res, xlim=c(-11, 5), at=log(c(.05, .25, 1, 4)), atransf=exp,
slab=paste0(dat$study, " (", dat$year, ")"),
ilab=cbind(paste(dat$x1i, "/", dat$t1i, sep=" "),
paste(dat$x2i, "/", dat$t2i, sep=" ")),
ilab.xpos=c(-6.5,-4), cex=.85)
op <- par(cex=.85, font=2)
text(-11, 7.5, "Study (Year)", pos=4)
text( 5, 7.5, "IRR [95% CI]", pos=2)
text(c(-6.5,-4), 8.0, c("Warfarin", "Control"))
text(c(-6.5,-4), 7.5, c("Strokes / PT", "Strokes / PT"))
segments(x0=-7.75, y0=7.75, x1=-2.75, y1=7.75)
par(op)
### meta-analysis of incidence rate differences using a random-effects model
res <- rma(measure="IRD", x1i=x1i, x2i=x2i, t1i=t1i, t2i=t2i, data=dat)
[Ex19] RR 기준으로 hart1999 데이터 메타 분석 및 시각화
res <- rma(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, mods = ~ ablat,
slab=paste(author, year, sep=", "), data=dat.bcg)
### forest plot of the observed relative risks
forest(res, addfit=FALSE, atransf=exp, xlim=c(-8,5), ylim=c(-4.5,16), cex=.8,
order=order(dat.bcg$ablat), ilab=dat.bcg$ablat, ilab.xpos=-2.8, ilab.pos=2)
### predicted average log relative risk for 10, 30, and 50 degrees absolute latitude
x <- predict(res, newmods=c(10, 30, 50))
### add predicted average relative risks to forest plot
addpoly(x$pred, sei=x$se, atransf=exp, col="white", rows=-2,
mlab=c("- at 10 Degrees", "- at 30 Degrees", "- at 50 Degrees"), cex=.8)
abline(h=0)
text(-8, -1, "Model-Based Estimates of RR:", pos=4, cex=.8)
text(-8, 15, "Author(s) and Year", pos=4, cex=.8)
text(5, 15, "Relative Risk [95% CI]", pos=2, cex=.8)
text(-3.3, 15, "Latitude", cex=.8)
### forest plot of the observed relative risks
jpeg('myplot.jpeg')
forest(res, addfit=FALSE, atransf=exp, xlim=c(-8,5), ylim=c(-4.5,16), cex=.8,
order=order(dat.bcg$ablat), ilab=dat.bcg$ablat, ilab.xpos=-2.8, ilab.pos=2)
### predicted average log relative risk for 10, 30, and 50 degrees absolute latitude
x <- predict(res, newmods=c(10, 30, 50))
### add predicted average relative risks to forest plot
addpoly(x$pred, sei=x$se, atransf=exp, col="white", rows=-2,
mlab=c("- at 10 Degrees", "- at 30 Degrees", "- at 50 Degrees"), cex=.8)
abline(h=0)
text(-8, -1, "Model-Based Estimates of RR:", pos=4, cex=.8)
text(-8, 15, "Author(s) and Year", pos=4, cex=.8)
text(5, 15, "Relative Risk [95% CI]", pos=2, cex=.8)
text(-3.3, 15, "Latitude", cex=.8)
dev.off()
null device
1
[Ex20] ZCOR 기준으로 molloy2014 데이터 메타 분석 및 시각화
Warning message:
In strsplit(code, "\n", fixed = TRUE) :
input string 1 is invalid in this locale
### calculate r-to-z transformed correlations and corresponding sampling variances
dat <- escalc(measure="ZCOR", ri=ri, ni=ni, data=dat, slab=paste(authors, year, sep=", "))
dat
authors year ni ri controls design a_measure c_measure meanage quality yi vi
1 Axelsson et al. 2009 109 0.187 none cross-sectional self-report other 22.00 1 0.1892 0.0094
2 Axelsson et al. 2011 749 0.162 none cross-sectional self-report NEO 53.59 1 0.1634 0.0013
3 Bruce et al. 2010 55 0.340 none prospective other NEO 43.36 2 0.3541 0.0192
4 Christensen et al. 1999 107 0.320 none cross-sectional self-report other 41.70 1 0.3316 0.0096
5 Christensen & Smith 1995 72 0.270 none prospective other NEO 46.39 2 0.2769 0.0145
6 Cohen et al. 2004 65 0.000 none prospective other NEO 41.20 2 0.0000 0.0161
7 Dobbels et al. 2005 174 0.175 none cross-sectional self-report NEO 52.30 1 0.1768 0.0058
8 Ediger et al. 2007 326 0.050 multiple prospective self-report NEO 41.00 3 0.0500 0.0031
9 Insel et al. 2006 58 0.260 none prospective other other 77.00 2 0.2661 0.0182
10 Jerant et al. 2011 771 0.010 multiple prospective other NEO 78.60 3 0.0100 0.0013
11 Moran et al. 1997 56 -0.090 multiple prospective other NEO 57.20 2 -0.0902 0.0189
12 O'Cleirigh et al. 2007 91 0.370 none prospective self-report NEO 37.90 2 0.3884 0.0114
13 Penedo et al. 2003 116 0.000 none cross-sectional self-report NEO 39.20 1 0.0000 0.0088
14 Quine et al. 2012 537 0.150 none prospective self-report other 69.00 2 0.1511 0.0019
15 Stilley et al. 2004 158 0.240 none prospective other NEO 46.20 3 0.2448 0.0065
16 Wiebe & Christensen 1997 65 0.040 none prospective other NEO 56.00 1 0.0400 0.0161
### meta-analysis of the transformed correlations using a random-effects model
res <- rma(yi, vi, data=dat)
res
Random-Effects Model (k = 16; tau^2 estimator: REML)
tau^2 (estimated amount of total heterogeneity): 0.0081 (SE = 0.0055)
tau (square root of estimated tau^2 value): 0.0901
I^2 (total heterogeneity / total variability): 61.73%
H^2 (total variability / sampling variability): 2.61
Test for Heterogeneity:
Q(df = 15) = 38.1595, p-val = 0.0009
Model Results:
estimate se zval pval ci.lb ci.ub
0.1499 0.0316 4.7501 <.0001 0.0881 0.2118 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
### average correlation with 95% CI
predict(res, digits=3, transf=transf.ztor)
pred ci.lb ci.ub cr.lb cr.ub
0.149 0.088 0.209 -0.037 0.325
### forest plot
forest(res, addcred=TRUE, xlim=c(-1.6,1.6), atransf=transf.ztor,
at=transf.rtoz(c(-.4,-.2,0,.2,.4,.6)), digits=c(2,1), cex=.8)
text(-1.6, 18, "Author(s), Year", pos=4, cex=.8)
text( 1.6, 18, "Correlation [95% CI]", pos=2, cex=.8)
### funnel plot
funnel(res)
LS0tDQp0aXRsZTogIlLsnYQg7J207Jqp7ZWcIOuplO2DgOu2hOyEnSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KIyMgSGVpcmFyY2h5IG9mIEV2aWRlbmNlDQohW10oaW1nL01lZGljYWwtSGVpcmFyY2h5LW9mLUV2aWRlbmNlLnBuZykNCg0KIyMg6rK97ZeY6rO87ZWZ7KCBIOyekOujjOulvCDrtoTshJ3tlZjripQg7IiY7KSAICjtmansoJXqt5woMTk5OCkpDQotIOygnDHssKgg67aE7ISdKHByaW1hcnkgYW5hbHlzaXMpOiDsl7Dqtazsl5DshJwg7Ja77J2AIOybkOyekOujjChvcmlnaW5hbCBkYXRhKeulvCDsp4HsoJEg67aE7ISdDQotIOygnDLssKjrtoTshJ0oc2Vjb25kYXJ5IGFuYWx5c2lzKTog7KCcMeywqCDrtoTshJ0g7J6Q66OM66W8IOyerOu2hOyEnSwg7KCcMeywqOu2hOyEneydmCDsl7DqtazrrLjsoJzsl5Ag64yA7ZW0IOuztOuLpCDrgpjsnYAg7Ya16rOE7KCBIOuwqeuyleydhCDsgqzsmqntlZjqsbDrgpgg7IOI66Gc7Jq0IOyXsOq1rCDsp4jrrLjsl5Ag64yA64u17J2EIOq1rO2VmOugpOuKlCDrqqnsoIENCi0g66mU7YOA67aE7ISdKG1ldGEtYW5hbHlzaXMpOiDqsJzrs4TsoIEg7Jew6rWswrfqsrDqs7zrk6TsnYQg7Ya16rOE7KCB7Jy866GcIOu2hOyEne2VmOuKlCDsnbTroaAg67CPIOuwqeuylQ0KDQojIyBJbnRyb2R1Y3Rpb24gdG8gbWV0YS1hbmFseXNpcw0KLSDrqZTtg4DrtoTshJ06IO2VmOuCmOydmCDso7zsoJzsl5Ag64yA7ZW0IOyXsOq1rO2VnCDsl6zrn6wg6rCc67OEIOyEoO2WieyXsOq1rOuTpOydmCDqsrDqs7zrpbwg7JaR7KCB7Jy866GcDQrthrXtlantlZjquLAg7JyE7ZW0IOyCrOyaqe2VmOuKlCDthrXqs4TsoIEg67Cp67KVLg0KLSDtlYTsmpTshLE6DQogMS4g6rCc67OEIOyXsOq1rOuTpOydmCDsl7DqtazqsrDqs7zqsIAg7J286rSA7ISx7J20IOyeiOuKlCDqsr3smrAg6rKA7KCV66Cl7J20IOuGkuyVhOyngOupsCwg7Kad6rCAIO2RnOuzuOyImOuhnCDsnbjtlbQg7KCV67CA64+EIOymneqwgA0KIDIuIOqwnOuzhCDsl7Dqtazrk6TsnZgg7Jew6rWs6rKw6rO86rCAIOydvOq0gOyEseydtCDsl4bripQg6rK97JqwIOyXsOq1rOqysOqzvOyXkCDsmIHtlqXsnYQg7KO864qUIOyalOyduOuTpOydhCDtjIzslYUgKOyYiDogQ29sZGl0eiBldC4gYWwgKDE5OTQpIEJDRyDrsLHsi6DsnZgg7Zqo6rO8KQ0KIDMuIOyDiOuhnOyatCDsl7DqtazqsIAg7ZWE7JqU7ZWgIOuVjCwg7Jew6rWs7ISk6rOE7JeQIOuPhOybgA0KLSDsnKDsnZjtlaAg7KCQOg0KIDEuIOqwnOuzhCDsl7DqtazsnZgg7Yq57ISx7J20IOyEnOuhnCDsnbTsp4jsoIHsnbTslrTshJwg7Ya17ZWp7J6Q7LK06rCAIOydmOuvuOqwgCDsl4bripQg6rK97JqwDQogMi4g6rCc67OEIOyXsOq1rCDsnpDssrTqsIAg7Ius6rCB7ZWcIOu5hOuapOumvChiaWFzKeydhCDqsIDsp4Dqs6Ag7J6I7J2EIOuVjA0KIDMuIOyLrOqwge2VnCDstpztjJAg67mE65qk66a8KHB1YmxpY2F0aW9uIGJpYXMp7J20IOyeiOuKlCDqsr3smrANCuKAuyDslYTrrLTrpqwg7ZuM66Wt7ZWcIOuplO2DgOu2hOyEneuPhCDsl7DqtazsnZgg7KeI7J20IOuCruydgCDqsJzrs4Qg7Jew6rWs7J2YIO2VnOqzhOygkOydhCDqt7nrs7XtlaAg7IiYIOyXhuuLpOuKlCDsoJANCg0KIyMgUHJvY2VkdXJlcyBvZiBtZXRhLWFuYWx5c2lzDQoxLiDsl7Dqtazso7zsoJzrpbwg66qF7ZmV7Z6IIOyEpOyglQ0KMi4g7ZSE66Gc7Yag7L2cIOyekeyEsTog6rKA7IOJ7ZWgIOyXsOq1rCDtirnshLEo7Jew6rWs64yA7IOB7J6QLCDqsrDqs7zrs4DsiJgg65OxKSwg6rKA7IOJ67Cp67KVLCDsl7Dqtazrk6TsnZgg7ISg7KCVL+ygnOyZuOq4sOykgCDrk7Eg7Y+s7ZWoDQozLiDtlITroZzthqDsvZwg67CU7YOV7Jy866GcIOuplO2DgOu2hOyEneydhCDsnITtlZwg7Jew6rWs65Ok7J2EIOy1nOyihSDshKDsoJXtlZjqs6AsIO2VhOyalO2VnCDsnpDro4wg7LaU7Lac7ZWY7JesIOygleumrA0KNC4g7ISg7KCV65CcIOyXsOq1rOuTpOydmCDsl7DqtaztirnshLEg67CPIOyXsOq1rOuwqeuylSDrk7HsnYQg6rOg66Ck7ZWY7JesIOyXsOq1rOuTpOydtCDrj5nsp4jtlZjri6Tqs6Ag7YyQ64uo7J20IOuQmOuKlCDqsr3smrDsl5Ag66mU7YOA67aE7ISdIOyImO2Wie2VqC4NCg0KIVtdKGltZy9maWcxLnBuZykNCg0KIyMgIOuplO2DgOu2hOyEnSDrsKnrspXsnZgg7ISg7KCVICjstpzsspggOiBIZWFsdGggSW5mb3JtYXRpb24gYW5kIFF1YWxpdHkgQXV0aG9yaXR5LCAyMDExKQ0KIVtdKGltZy9tZXRhQW5hbHlzZXNfc2VsZWN0aW9uLnBuZykNCg0KIyMg66mU7YOA67aE7ISdIOqysOqzvO2VtOyEneyXkCDtj6ztlajrkJjslrTslbwg7ZWgIOyCrO2VrQ0KMS4g66mU7YOA67aE7ISd7JeQIO2PrO2VqOuQnCDqsJzrs4Tsl7DqtazsnZgg7IiY7JmAIO2OuOydmOydmCDsnITtl5jsnbQg7Y+s7ZWo65CcIOygnOyLnOuQnCDspp3qsbANCjIuIO2aqOqzvO2BrOq4sCDsiJjspIAg67CPIOyXsOq1rCDsiJjspIDsnZgg7Zqo6rO87JeQIOuMgO2VnCDsoJXtmZXrj4Tsl5Ag64yA7ZWcIO2PieqwgA0KMy4g66mU7YOA67aE7ISd7JeQIO2PrO2VqOuQnCDqsJzrs4Tsl7Dqtazrk6TsnbQg64+Z7J28IOuqqOynkeuLqOyXkOyEnCDstpTstpzrkJwg6rKD7J247KeA7JeQIOuMgO2VnCDtjJDri6jsnYQg7JyE7ZW0IOyXsOq1rOqwhCDtmqjqs7zrk6TsnZgg64+Z7KeI7ISxIOqygOyglQ0KNC4g6rCc67OE7Zqo6rO8IO2BrOq4sOuTpOydhCDsooXtlantlZwg7Zqo6rO87YGs6riw66W8IOqzhOyCsO2VmOuptOyEnCwg7LaU7KCV7LmYKHBvaW50IGVzdGltYXRlKeyXkCDrjIDtlZwg7YGs6riw7JmAIOuwqe2WpSwg7Iug66Kw6rWs6rCELCDthrXqs4TsoIEg67CPIOyLpOyytOyggSDsnKDsnZjshLEsIOyeoOyerOyggSDtjrjsnZgg7JyE7ZeY7JeQIOuMgO2VtCDtlbTshJ0g67CPIOuFvOydmA0KNS4g7KGw7KCI67OA7J2467aE7ISdIOyLpOyLnCDrsI8g7ZW07ISd7J2EIOyLpOyLnA0KDQojIyMg7Ya16rOE7KCBIOuwqeuylSDsoIjssKgNCjEuIO2aqOqzvO2BrOq4sCDstpTsoJU6IOuPheumveuQnCDrkZAg6re466O5IOuYkOuKlCDri6jsnbzqtbAvIOyXsOyGje2YlSDrmJDripQg7J2067aE7ZiVDQoyLiDthrXtlanstpTsoJXsuZgg7LaU7KCVOiDqs6DsoJXtmqjqs7zrqqjtmJUvIOuenOuNpO2aqOqzvOuqqO2YlQ0KMy4g7J207KeI7ISxIOqygO2GoDog7Ya16rOE7KCBIOydtOyniOyEsSwg7ZWY7JyE6re466O567aE7ISdLCDrqZTtg4Dtmozqt4DrtoTshJ0NCjQuIOy2nO2MkCDruYTrmqTrprwg6rKA7YagOiBmdW5uZWwgcGxvdCwgQmVn4oCZcyB0ZXN0LCBFZ2dlcuKAmXMgdGVzdA0KdHJpbS1hbmQtZmlsbCDrsKnrspUsIGZhbGwtc2FmZSBOIOuwqeuylSwg64iE7KCBIOuplO2DgOu2hOyEnQ0KNS4g66+86rCQ64+EIOu2hOyEnTogc3RhbmRhcmRpemVkIHJlc2lkdWFscywgQ29va+KAmXMgZGlzdGFuY2VzLA0KbGVhdmUtb25lLW91dCBhbmFseXNlcw0KDQohW10oaW1nL2ZpZzIucG5nKQ0KDQojIyMjIDEuIFN0YW5kYXJkaXplZCBvdXRjb21lIG1lYXN1cmUo7Zqo6rO87YGs6riw7LaU7KCVKQ0KDQohW10oaW1nL2ZpZzMucG5nKQ0KDQotIGVmZmVjdCBzaXplICjOuCwg7Zqo6rO87YGs6riwKSA6IHN0YW5kYXJkaXplZCBtZWFzdXJlIG9mIGVmZmVjdCAoc3VjaCBhcyByLCBDb2hlbidzIGQsIG9yIHRoZSBvZGRzIHJhdGlvKSwgb3IgdG8gYW4gdW5zdGFuZGFyZGl6ZWQgbWVhc3VyZSAoZS5nLiwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBncm91cCBtZWFucyBvciB0aGUgdW5zdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmZmljaWVudHMpLg0K7Lac7LKYIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VmZmVjdF9zaXplDQoNCi0g7Zqo6rO87YGs6riw7JeQIOuMgO2VnCDsnbzrsJjsoIHsnbgg7ZW07ISd6riw7KSAIChDb2hlbigxOTg4KSkNCisgIOyekeydgCDtmqjqs7ztgazquLA6IOyDgeq0gOqzhOyImChyKSAwLjEsIO2Pieq3oOywqCDtmqjqs7ztgazquLAoZCkgMC4yDQorICDspJHqsIQg7Zqo6rO87YGs6riwOiDsg4HqtIDqs4TsiJggMC4zLCDtj4nqt6DssKgg7Zqo6rO87YGs6riwIDAuNQ0KKyAg7YGwIO2aqOqzvO2BrOq4sDog7IOB6rSA6rOE7IiYIDAuNSwg7Y+J6reg7LCoIO2aqOqzvO2BrOq4sCAwLjgNCg0KLSBSYXRlICjruYQpOiBhIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gbWVhc3VyZW1lbnRzIG9mIGRpZmZlcmVudCB1bml0cyAoZWcuIDQwIG1pbGVzL2hvdXIpDQotIFJhdGlvKOu5hOycqCkgOiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciwgc2l6ZSBvZiB0d28gb3IgbW9yZSBzaW1pbGFyIHRoaW5ncyAoZWcuIFRoZQ0KcmF0aW8gb2YgUm9teeKAmXMgbWFuZ29lcyB0byBFZGdhcuKAmXMgaXMgMzo2KQ0K7Lac7LKYIGh0dHA6Ly93d3cuZGlmZmVyZW5jZWJldHdlZW4ubmV0L3NjaWVuY2UvbWF0aGVtYXRpY3Mtc3RhdGlzdGljcy9kaWZmZXJlbmNlLWJldHdlZW4tcmF0ZS1hbmQtcmF0aW8vDQoNCiMjIyMgMi4gQ2FsY3VsYXRpbmcgb3ZlcmFsbCBlZmZlY3Qo7Ya17ZWp7LaU7KCV7LmYIOy2lOyglSkNCuKAoiDqsJzrs4Tsl7DqtazsnZgg7KSR7JqU64+E7JeQIOuUsOuluCDqsIDspJHsuZjrpbwg7J207JqpDQrvg6Ag6rCc67OEIOyXsOq1rOydmCDqsIDspJHsuZjqsIAg7YG07IiY66GdIO2VtOuLuSDsl7DqtazqsIAg7Ya17ZWp7LaU7KCV7LmY7JeQIO2BrOqyjCDquLDsl6ztlZzri6QuDQrrjZQg7KCV67CA7ZWcIOy2lOygley5mOulvCDsoJzqs7XtlZwg7Jew6rWsIOuYkOuKlCDtkZzrs7gg7YGs6riw6rCAIOuNlCDtgbAg7Jew6rWs7JeQIOuNlCDrp47snYANCuqwgOykkey5mCDrtoDsl6ztlZjripQg6rKD7J20IOybkOy5mQ0K4oCiIOuNlCDsoJXrsIDtlZwg7LaU7KCV7LmY66W8IOygnOqzte2VnCDsl7Dqtazvg6gg67aE7IKw7J2YIOyXreyImOydtOyaqQ0K7ZGc67O4IO2BrOq4sOqwgCDrjZQg7YGwIOyXsOq1rOyXkCDrjZQg66eO7J2AIOqwgOykkey5mCDrtoDsl6ztlZjripQg6rKD7J20IOybkOy5mQ0KDQojIyMjIyAxKSBGaXhlZCBlZmZlY3QgbW9kZWwgKEZFLCDqs6DsoJXtmqjqs7zrqqjtmJUpOg0K66mU7YOA67aE7ISd7JeQIO2PrO2VqOuQnCDsl7Dqtazrk6TsnZgg7Yq57ISx7J20IOuPmeyniOyggeydvCDrlYwg7J207JqpDQokWV9pPVx0aGV0YStcZXBzaWxvbl9pJCAoaT0xLC4uLixrKQ0KDQrqsJzrs4Qg7Jew6rWs7J2YIOqwgOykkey5mOulvCAkV19pJOudvOqzoCDtlaAg65WMLCDthrXtlanstpTsoJXsuZggJFxoYXR7XHRoZXRhfSTripQg6rCA7KSR7Y+J6reg7Jy866GcIOyCsOy2nA0KDQokJFxoYXR7XHRoZXRhfT1cZnJhY3tcc3VtX3trfV57aT0xfVdfaVlfaX17XHN1bV97a31ee2k9MX1XX2l9JCQNCuKRoCBJbnZlcnNldmFyaWFuY2UgKElWLCDsl63rtoTsgrDqsIDspJHsuZgpID0+IOqysOqzvCDrsJzsg53snbQg65Oc66y4IOq0gOyLrOyCrOqxtOyXkCDrjIDtlZwg66mU7YOA67aE7ISd7J2AIGJpYXPqsIAg7IOd6ri4IOqwgOuKpeyEseydtCDrhpLsnLzrr4DroZwsDQpJVuuwqeuyleydgCDsoIHtlantlZjsp4Ag7JWK7J2MDQoNCuKRoSBNYW50ZWwtSGFlbnN6ZWwgKE1ILCDrqZjthZQt7Zeo7KCkKQ0KDQrikaIgUGV0bw0KDQojIyMjIyAyKSBSYW5kb20gZWZmZWN0IG1vZGVsIChSRSwg656c642k7Zqo6rO866qo7ZiVKToNCuuplO2DgOu2hOyEneyXkCDtj6ztlajrkJwg7Jew6rWs65Ok7J2YIO2KueyEseydtCDsnbTsp4jsoIHsnbwg65WMIOydtOyaqQ0K6rCc67OEIOyXsOq1rOuTpOydmCDtmqjqs7ztgazquLDsnZgg7LC46rCS7J2AIO2VmOuCmOunjCDsobTsnqztlZjripQg6rKD7J20IOyVhOuLiOudvA0K7KCE7LK0IO2Pieq3oOydhCDspJHsi6zsnLzroZwg7ZWY64qUIOygleq3nOu2hO2PrOulvCDrlLDrpbjri6Tqs6Ag6rCA7KCV7ZWY64qUIOuqqO2YlQ0KDQpp67KI7Ke4IOyXsOq1rOydmCDtmqjqs7ztgazquLDsnZgg7LC46rCSICRcdGhldGFfaSTripQg7KCE7LK0IO2Pieq3oCAkXG11JOulvCDtj4nqt6DsnLzroZwg7KCV6rec67aE7Y+s66W8IOuUsOuluOuLpOqzoCDqsIDsoJUuDQoNCiQkWV9pID0gXHRoZXRhX2krXGVwc2lsb25faSA9IFxtdStcemV0YV9pK1xlcHNpbG9uX2ksIChpPTEsXGNkb3RzLGspJCQNCiRcdGhldGFfaSTripQg7KCE7LK07Y+J6regICRcbXUk7JmAIO2aqOqzvO2BrOq4sCDrs4Drj5nsnYQg64KY7YOA64K064qUICRcemV0YV9pJOuhnCDrgpjtg4Drgrwg7IiYIOyeiOqzoCwNCiRcZXBzaWxvbl9pJOuKlCBp67KI7Ke4IOyXsOq1rCDrgrQg7ZGc67O47Jik7LCoDQokJFx6ZXRhX2kgXHNpbSBOKDAsIFx0YXVeMikkJA0KJCRcZXBzaWxvbl9pIFxzaW0gTigwLCBcc2lnbWFeMikkJA0KJFx0aGV0YV9pXjIk64qUIO2aqOqzvO2BrOq4sOydmCDsl7DqtazqsIQg67aE7IKwLCAkXHNpZ21hXjIk7J2AIGnrsojsp7gg7Jew6rWs7J2YIO2RnOuzuOyYpOywqOyduCAkXGVwc2lsb25faSTsnZgg67aE7IKwLg0KDQrsl6zquLDshJwgJFZhcihZX2kpID0gXHRhdV4yK1xzaWdtYV4yJOydtCDrkJjripTrjbAsIFJFIOuqqO2YleyXkOyEnOuKlCDthrXtlanstpTsoJXsuZjsnZgg67aE7IKw7J2EIOy1nOyGjO2ZlO2VmOq4sCDsnITtlbQgJFZhcihZX2kpJOydmCDsl63siJjrpbwg6rCA7KSR7LmY66GcIOydtOyaqe2VnOuLpC4NCg0KUmFuZG9tIGVmZmVjdCDrqqjtmJXsl5DshJwg7IKs7JqpIOqwgOuKpe2VnCDrsKnrspUgOg0KRGVyU2ltb25pYW4tTGFpcmQgKERMKSwgSHVudGVyLVNjaG1pZHQgKEhTKSwgSGVkZ2VzIChIRSksIG1heGltdW0NCmxpa2VsaWhvb2QgKE1MKSwgYW5kIHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIChSRU1MKQ0KREwg67Cp67KV7J20IOunjuydtCDsgqzsmqnrkJjrqbAg6rKw6rO8IOuwnOyDneydtCDrk5zrrLgg6rSA7Ius7IKs6rG07JeQ7IScIGJpYXPqsIAg7Luk7KeA6riwIOuVjOusuOyXkCDqtoztlZjsp4Ag7JWK7J2MDQoNCi0+IEZFIG9yIFJFIOydmCDshKDtg53snYAgSGV0ZXJvZ2VuZWl0eSAo7J207KeI7ISxKSDqs6DroKQg7ZuE7JeQIO2MkOuLqA0KDQojIyMjIDMuIEhldGVyb2dlbmVpdHkNCkhldGVyb2dlbmVpdHkgaW4gZWZmZWN0IHNpemVzIG1lYW5zIHRoZSBkaXNwZXJzaW9uIGluIHRoZSB0cnVlIGVmZmVjdCBzaXplDQrigKIgQ2F1c2VzIG9mIGhldGVyb2dlbmVpdHkgKO+DpyBDbGluaWNhbCwgU3RhdGlzdGljYWwpIDoNCu+DvC0gIFBhcnRpY2lwYW50cyA6IGNvbmRpdGlvbiwgZGVtb2dyYXBoaWNzLCBnZW9ncmFwaGljYWwgdmFyaWF0aW9uLCB0cmlhbCBpbmNsdXNpb24gY3JpdGVyaWENCu+DvC0gIEludGVydmVudGlvbnMgOiB0eXBlLCBkdXJhdGlvbiwgbW9kZSBvZiBhZG1pbmlzdHJhdGlvbiwgYWRkaXRpb25hbCBjb21wb25lbnRzLA0KIGV4cGVyaWVuY2Ugb2YgcHJhY3RpdGlvbmVycywgbmF0dXJlIG9mIGNvbnRyb2xzDQrvg7wtICBPdXRjb21lcyA6IHR5cGUsIGZvbGxvdy11cCBkdXJhdGlvbiwgd2F5cyBvZiBtZWFzdXJpbmcsIGRlZmluaXRpb24gb2YgYW4gZXZlbnQNCu+DvC0gIERlc2lnbiA6IHJhbmRvbWlzZWQsIG5vbi1yYW5kb21pc2VkLCBjbHVzdGVyIHJhbmRvbWlzZWQsDQogcGFyYWxsZWwgdnMuIGNyb3Nzb3ZlciwgbGVuZ3RoDQrvg7wtICBDb25kdWN0IDogYWxsb2NhdGlvbiBjb25jZWFsbWVudCwgYmxpbmRpbmcsIGFwcHJvYWNoIHRvIGFuYWx5c2lzLA0KIGltcHV0YXRpb24gbWV0aG9kcyBmb3IgbWlzc2luZyBkYXRhDQot74O8IFZhcmlhdGlvbiBpbiB0cnVlIHRyZWF0bWVudCBlZmZlY3RzIGluIG1hZ25pdHVkZSBvciBkaXJlY3Rpb24NCg0KIyMjIyAzLTEuIEFzc2Vzc2luZyBIZXRlcm9nZW5laXR5IDogUS1zdGF0aXN0aWNzICYgJEheMiQNCuy9lO2BrOuegOydmCBR7Ya16rOE65+JOiDqsJzrs4Qg7Jew6rWs65Ok7J2YIO2aqOqzvO2BrOq4sOqwgCDthrXtlanstpTsoJXsuZjsmYAg65ao7Ja07KC4IOyeiOuKlCDsoJXrj4QNCiQkUT1cc3VtX3tpPTF9XntrfVdfaShZX2ktXGhhdFx0aGV0YSleMj1cc3VtX3tpPTF9XntrfVdfaVlfaV4yLVxmcmFjeyhcc3VtX3tpPTF9XntrfVdfaVlfaSleMn17XHN1bV97aT0xfV57a31XX2l9XHNpbVxjaGleMihrLTEpJCQNCu2GteqzhOufieydtCDsnpDsnKDrj4Tsl5Ag67mE7ZW0IO2BtOyImOuhnSDtmqjqs7ztgazquLDqsIAg7Ya16rOE7KCBIOydtOyniOyEseydtCDsnojsnYQg6rCA64ql7ISx7J20IOuGkuyVhOynhOuLpC4NCg0KLT4g7Jew6rWs7IiY6rCAIOyekeqxsOuCmCwg7Jew6rWsIOuCtCDtkZzrs7jsiJjqsIAg7J6R6rGw64KYLCDqtIDsi6zqsrDqs7wg67Cc7IOd7J20IOuTnOusuCDqsr3smrAg65iQ64qUIO2VmOuCmOydmA0K7Jew6rWs6rCAIOuLpOuluCDsl7Dqtazsl5Ag67mE7ZW0IOqwgOykkey5mOqwgCDrp47snbQg7YG0IOqyveyasCBwb3dlcijqsoDsoJXroKUp6rCAIOuCruuLpC4NCg0KLT4g7Jyg7J2Y7IiY7KSA7J2AIDAuMDXrs7Tri6QgMC4x7J2EIOunjuydtCDsgqzsmqntlZzri6QuDQoNClEg7Ya16rOE65+J7J2EIOydtOyaqe2VmOyXrCDsoJXsnZjtlZjripQgJEheMiTthrXqs4Trn4nsnYANCg0KJEheMj1cZnJhY3tRfXtkZn0kDQoNCuuhnCDsoJXsnZjtlZjqs6AsICRIXjI+MSQg7J28IOqyveyasCDshKTrqoXtlaAg7IiYIOyXhuuKlCDsnbTsp4jshLHsnbQg7J6I64uk6rOgIO2MkOuLqO2VnOuLpC4NCg0KIyMjIyAzLTIuIEFzc2Vzc2luZyBIZXRlcm9nZW5laXR5IDogJFx0YXVeMiQgJiAkSV4yJC1zdGF0aXN0aWNzDQokXHRhdV4yJCDthrXqs4Trn4k6IO2aqOqzvO2BrOq4sOydmCDsl7DqtazqsIQg67OA64+Z7J2EIOuCmO2DgOuCtOuKlCDrtoTsgrANCiQkXHRhdV4yPVxmcmFje1EtZGZ9e0N9JCQNCuyXrOq4sOyEnCBD64qUICRDPVxzdW1fe2k9MX1ee2t9V19pLVxmcmFje1xzdW1fe2k9MX1ee2t9V19pXjJ9e1xzdW1fe2k9MX1ee2t9V19pfSQNCg0KJFx0YXVeMiTqsJLsnbQg7YG07IiY66GdIOyXsOq1rOqwhCDrs4Drj5nsnbQg7YGs64uk64qUIOucuw0KDQokSV4yJCDthrXqs4Trn4k6IO2GteqzhOyggSDsnbTsp4jshLHsnLzroZwg7J247ZWcIO2aqOqzvO2BrOq4sOydmCDrs4Drj5nsnYQg67Cx67aE7Jyo66GcIOuCmO2DgOuCtOuKlCDqsoMuDQotPu+DoO2aqOqzvO2BrOq4sOydmCDstJ0g67OA64+ZIOykkSDsl7DqtazqsIQg67OA64+Z7J2YIOu5hA0KJEleMj1cZnJhY3tRLWRmfXtRfVgxMDAkJQ0KDQokSV4yJD0wfjQwJTog7Ya16rOE7KCBIOydtOyniOyEseydtCDspJHsmpTtlZjsp4Ag7JWK7J2EIOyImCDsnojsnYwNCiRJXjIkPTMwfjYwJTog7KSR6rCE7KCV64+E7J2YIO2GteqzhOyggSDsnbTsp4jshLHsnbQg7J6I7J2EIOyImCDsnojsnYwNCiRJXjIkPTUwfjkwJTog7IOB64u57ZWcIO2GteqzhOyggSDsnbTsp4jshLHsnbQg7J6I7J2EIOyImCDsnojsnYwNCiRJXjIkPTc1fjEwMCU6IOustOyLnO2VoCDsiJgg7JeG64qUIO2GteqzhOyggSDsnbTsp4jshLHsnbQg7J6I7J2EIOyImCDsnojsnYwNCg0KDQojIyMjIyBSIHBhY2thZ2VzDQotIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy9NZXRhQW5hbHlzaXMuaHRtbA0KLSBodHRwOi8vd3d3Lm1ldGFmb3ItcHJvamVjdC5vcmcNCi0gaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL21ldGFmb3IvbWV0YWZvci5wZGYNCg0KIyMjIyA0LiBQdWJsaWNhdGlvbiBiaWFzDQrtmqjqs7ztgazquLDqsIAg7YGs6rOgLCDsnKDsnZjtlZwg6rKw6rO866W8IOqwgOyngOuKlCDsl7DqtazqsIAg7Lac7YyQ65CY64qUIOqyve2WpeydtCDrhpLqs6AsDQrsl7Dqtawg6rKw6rO87J2YIOuwqe2WpeyXkCDrlLDrnbwg7Lac7YyQ7Jes67aA6rCAIOuLrOudvOyngOuKlCDqsr3tlqXsnbQg7J6I64ukLg0KDQotPuyLpOygnCDtmqjqs7ztgazquLDsl5Ag67mE7ZW0IOqzvOuMgCDstpTsoJXrkJwg7Zqo6rO87YGs6riw66W8IOyCsOy2nO+DqCDstpztjJDruYTrmqTrprwNCg0KRnVubmVsIHBsb3Q6IOyLnOqwgeyggeyduCDrsKnrspUNCuq5lOuMgOq4sCDqt7jrprzsnbQg67mE64yA7Lmt7KCB7J247KeA7JeQIOuMgO2VnCDqsIDshKTqsoDsoJU6IEJlZ2figJlzLCBFZ2dlcuKAmXMgdGVzdA0K7JyE7J2YIOuwqeuyleydhCDthrXtlbQg7Lac7YyQ67mE65qk66a87J20IOyeiOuLpOqzoCDtjJDri6jrkJjrqbQsIOy2nO2MkCDruYTrmqTrprzsnbQNCuyXsOq1rOqysOqzvOyXkCDrr7jsuZjripQg7JiB7Zal7J2EIO2MjOyVhe2VoCDtlYTsmpQg7J6I64uk74OgIHRyaW0tYW5kLWZpbGwsIGZpYWwtc2FmZSBODQoNCkZ1bm5lbCBwbG90OljstpXsnYAg7Zqo6rO866W8IOuCmO2DgOuCtOqzoCwgWey2leydgCDtkZzrs7jtgazquLDrpbwg64KY7YOA64K0IO2RnOuzuOyImCwNCu2RnOykgOyYpOywqCwg7ZGc7KSA7Jik7LCo7J2YIOyXreyImCwg67aE7IKwLCDrtoTsgrDsnZgg7Jet7IiY6rCAIOyTsOydvCDsiJgg7J6I64ukLg0KOTUlIFBzZXVkbyBDSSAoPe2Gte2Vqey2lOygley5mCRccG0xLjk1U0UkKeuwluyXkCDsnITsuZjtlZwg7Jew6rWs7IiY6rCADQrrp47snYTsiJjroZ0g7J207KeI7KCBIOydtOuLpOqzoCDtlaAg7IiYIOyeiOuLpC4NCg0KIVtdKGltZy9mdW5uZWxwbG90MS5wbmcpDQoNCiFbXShpbWcvZnVubmVscGxvdDIucG5nKQ0KDQojIyMjIyBUcmltICYgRmlsbCBtZXRob2QNCuydtCDrsKnrspXsnYAgZnVubmVsIHBsb3Tsl5DshJwg7Zqo6rO87YGs6riw7J2YIOu2hO2PrOulvCDtmZXsnbjtlZjripQg67Cp67KV7Jy866GcIOq3oOuTsQ0K7ZWcIOu2hO2PrOulvCDrs7Tsnbgg6rK97Jqw7JeQ64qUIOy2nO2MkOyYpOulmOqwgCDsl4bripQg6rKD7Jy866GcIO2MkOuLqO2VoCDsiJgg7J6I64ukLg0K6reg65Ox7ZWY7KeAIOuqu+2VnCDrtoTtj6zrpbwg67O07J24IOqyveyasOyXkOuKlCDqsIDsg4HsnZgg7Jew6rWsIOqysOy4oeqwkuydhCDrhKPslrQNCuuztOygle2VmOqyjCDrkJjripTrjbAg67O07KCVIOydtO2bhOyXkCDtmqjqs7ztgazquLDsnZgg67OA7ZmU6rCAIDwxMCXsnbTrqbQg7Lac7YyQ7Jik66WYDQrqsIAg7JeG64qUIOqyg+ycvOuhnCDtjJDri6ggKFN1dHRvbiBldCBhbC4sIDIwMDApDQoNCiFbXShpbWcvdHJpbWFuZGZpbGwucG5nKQ0KDQojIyMjIyBGYWlsLXNhZmUgbnVtYmVyIChOZnMpDQrqs6DsoJXtmqjqs7zrqqjtmJXsl5DshJwg7ZmV7J247ZWgIOyImCDsnojripQg7JWI7KCE6rOE7IiYKE5mcykg7IKw7KCV7J2064ukLiDsnbQg67Cp67KV7J2AIOyihQ0K7ZWp7KCBIOy5mOujjCDtmqjqs7ztgazquLDqsIAg7Jyg7J2Y7ZWY7KeAIOyViuydgCDqsoPsnLzroZwg64KY7YOA64KY6riwIOychO2VtCDsiKjqsqjsp4Qg7Jew6rWsDQrrk6TsnbQg7Ja866eI64KYIOuNlCDtlYTsmpTtlZzsp4Ag6rOE7IKw7ZWY64qUIOuwqeuyleydtOuLpCAoT3J3aW4sIDE5ODMpLg0K74OoIOyekOuqhSDtmqjqs7wodHJpdmlhbCBlZmZlY3Qp6rCAIDAuMjAsIOqysOy4oeyXsOq1rCDtmqjqs7wobWlzc2luZyBzdHVkeSBlZmZlY3Qp6rCAIDDsnbgNCuyDge2ZqeyXkOyEnCDtmqjqs7ztgazquLAg6rCS7J2EIDAuMjAg66+466eM7Jy866GcIOunjOuTpOq4sCDsnITtlbQg7ZWE7JqU7ZWcIOyXsOq1rCDsiJjroZwg7ZmV7J24Lg0K74OoIOyViOyghOqzhOyImOuKlCDigJjstqnrtoTtnogg7YGs64uk4oCZ65286rOgIO2MkOuLqO2VoCDsiJgg7J6I64qUIOq4sOykgOydtCDsnbzrsJjsoIHsnLzroZwgNW4rMTANCihuPeu2hOyEneyXkCDtj6ztlajrkJwg7Jew6rWs7J2YIOyImCkg7J207IOB7J207Ja07JW8IO2VnOuLpC4NCg0KIyMjIyA1LiBTZW5zaXRpdml0eSBhbmFseXNpcyAo66+86rCQ64+E67aE7ISdKQ0K66+86rCQ64+EIOu2hOyEneydtOuegCDsmIHtlqXroKUg7J6I64qUIHN0dWR5IO2YueydgCBvdXRsaWVycyDrpbwg7LC+7JWE64K06rGw64KYLCDrmJDripQg6rCBIOuLqOqzhOyXkOyEnA0K7ZaJ7ZWY7Jes7KeEIOuwqeuyleyXkCDrlLDrnbwg7Ya17ZWp7LaU7KCV7LmY6rCAIOyWvOuniOuCmCDrsJTrgIzripTsp4Ag7IK07Y6067O064qUIOqygy4NClN0YW5kYXJkaXplZCByZXNpZHVhbHMsIENvb2vigJlzIGRpc3RhbmNlcywgbGVhdmUtb25lLW91dCBhbmFseXNlc+uTseydtCDsgqzsmqkg6rCA64ql7ZWoDQpsZWF2ZS1vbmUtb3V0IGFuYWx5c2Vz7J2YIOqyveyasCBzdHVkeeulvCDtlZjrgpjslKkg67m86rCA66mwIO2Gte2Vqey2lOygley5mOulvCDqtaztlZjqs6Ag7J2065WMDQrqsrDqs7zqsIAg7YGs6rKMIOuLrOudvOyngOuKlCDrs7TripQg6rKD7J6EDQoNCiMjIOuplO2DgOu2hOyEnSDsi6TsirUNCg0KIyMjIE1ldGEtQW5hbHlzZXMgaW4gUiB3aXRoIHRoZSAgbWV0YWZvciBQYWNrYWdlDQoNCiFbXShpbWcvbWV0YWZvcl9wYXBlci5wbmcpDQoNCiFbXShpbWcvbWV0YUFuYWx5c2VzX3BhY2thZ2VzLnBuZykNCg0K4oC7IE1lYXN1cmVzDQohW10oaW1nL21ldGFmb3JfbWVhc3VyZS5wbmcpDQoNCuKAuyDtlajsiJjsoJXrpqwNCi0gZXNjYWxjOiDtmqjqs7ztgazquLAoeWkp7JmAIOu2hOyCsCh2aSnrpbwg6rOE7IKwDQotIHJtYTog7Ya17ZWp7LaU7KCV7LmYIOqzhOyCsCAtIEZFKElW67Cp67KVKSwgUkUoREzrsKnrspUpIO+DnyBSReqwgCBkZWZhdWx07J6EDQotIHJtYS5taDog7Ya17ZWp7LaU7KCV7LmYIOqzhOyCsCAoRml4ZWQgZWZmZWN0IG1vZGVsIE1hbnRlbC1IYWVuc3pl67Cp67KVKQ0KLSBybWEucGV0bzrthrXtlanstpTsoJXsuZgg6rOE7IKwIChGaXhlZCBlZmZlY3QgbW9kZWwgUGV0byDrsKnrspUpDQoNCmBgYHtyfQ0KZ2V0d2QoKQ0KYGBgDQoNCmBgYHtyfQ0KI2RhdDwtIHJlYWQudGFibGUgKCdub3JtYW5kMTk5OS5jc3YnLCBoZWFkZXI9VFJVRSwgc2VwPSIsIikNCiNkYXQNCmBgYA0KDQojIyBbRXgxXSBGaXhlZCBlZmZlY3QgbW9kZWwgdXNpbmcgSVYt7Y+J6reg7LCoIChNRCnsnbTsmqkNCk1E7JmAIE1E7J2YIOu2hOyCsOydhCDqs4TsgrDtlZjsl6wgZGF0X01E652864qUIOuNsOydtO2EsOyFi+ycvOuhnCDsoIDsnqXtlagNCg0KYGBge3J9DQpsaWJyYXJ5KG1ldGFmb3IpDQoNCiNkYXQubm9ybWFuZDE5OTk6IO2KueuzhOy5mOujjCB2cyDsnbzrsJjsuZjro4wo64eM7KG47KadIO2ZmOyekOuMgOyDgSnsnZgg7J6F7JuQ7J287IiYIOu5hOq1kCwgY29udGludW91cyBvdXRjb21lczogTWVhbiBEaWZmcmVuY2UsIFN0YW5kYXJpemVkIE1lYW4gRGlmZmVyZW5jZQ0KDQpkYXQgPC0gZ2V0KGRhdGEoZGF0Lm5vcm1hbmQxOTk5KSkNCmhlYWQoZGF0LDMpDQpgYGANCg0KYGBge3J9DQpkYXQgPC0gZ2V0KGRhdGEoZGF0Lm5vcm1hbmQxOTk5KSkNCmRhdF9NRCA8LSBlc2NhbGMobWVhc3VyZT0iTUQiLCBtMWk9bTFpLCBzZDFpPXNkMWksIG4xaT1uMWksIG0yaT1tMmksIHNkMmk9c2QyaSwgbjJpPW4yaSwgZGF0YT1kYXQpICANCmhlYWQoZGF0X01ELDMpDQpgYGANCg0KIyMjIE1E7J2YIElWKOyXreu2hOyCsOqwgOykkey5mCnrsKnrspUg7J207Jqp7ZWcIO2Gte2Vqey2lOygley5mCDqs4TsgrANCg0KYGBge3J9DQojTm9ybWFuZCgxOTk5KS1zdHJva2UgcGF0aWVudHMNCiMxPSBzcGVjaWFsaXplZCBjYXJlDQojMj0gcm91dGluZSBub24tc3BlY2lhbGlzdCBjYXJlDQojbj0gbm8gb2YgcGF0aWVudHMNCiNtPSBhdmcgbGVuZ3RoIG9mIGhvc3BpdGFsIHN0YXkNCiNzZD1zZCBvZiBob3NwaXRhbCBzdGF5IA0KDQpyZXMxPC0gcm1hKHlpLCB2aSwgZGF0YT0gZGF0X01ELCBtZXRob2Q9IkZFIikNCnJlczENCnN1bW1hcnkocmVzMSkNCmBgYA0K7ZW07ISdOiAkXGhhdHtcdGhldGF9JD0tMy40NjM2LCAkU0VcaGF0e1x0aGV0YX0kPTAuNzY0OCwgOTUlQ0k9Wy00Ljk2MjYsIC0xLjk2NDZdLCBwLXZhbDwwLjAwMQ0KLT7tirnrs4TsuZjro4wg6rWw7J2YIOyeheybkOydvOyImOqwgCDsnbzrsJjsuZjro4wg6rWw67O064ukIDMuNDbsnbwg7Ken64uk6rOgIO2VoCDsiJgg7J6I64ukLg0KDQojIyBbRXgyXSBGaXhlZCBlZmZlY3QgbW9kZWwgdXNpbmcgSVYt7Jik7KaI67mEIChPUikg7J207JqpDQoNCmBgYHtyfQ0KI2RhdC5iY2c6IENvbGR0aXogKDE5OTQpLCDrsLHsi6Ag7KCR7KKF6rWwIHZzIOuMgOyhsOq1sCAoZXZlbnQ96rKw7ZW1IOuwnOyDneyekCksIGJpbmFyeSBvdXRjb21lczogT1IsIFJSLCBSRChSaXNrIGRpZmZlcmVuY2UpDQpkYXRhKGRhdC5iY2cpICAgICANCmRhdF9sbk9SIDwtIGVzY2FsYyhtZWFzdXJlPSJPUiIsIGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZykNCmhlYWQoZGF0X2xuT1IgLDMpDQpgYGANCg0KIyMjIGxuKE9SKeydmCBJVijsl63rtoTsgrDqsIDspJHsuZgp67Cp67KVIOydtOyaqe2VnCDthrXtlanstpTsoJXsuZgg6rOE7IKwIA0KYGBge3J9DQpyZXMyIDwtIHJtYSh5aSwgdmksIGRhdGE9IGRhdF9sbk9SLCBtZXRob2Q9IkZFIikgDQpyZXMyDQpgYGANCiRsbihcaGF0e09SfSkkPS0wLjQzNjEsICRTRShcaGF0e1x0aGV0YX0pJD0wLjA0MjMsIDk1JUNJPVstMC41MTkwLCAtMC4zNTMzXQ0KDQpgYGB7cn0NCnByZWRpY3QocmVzMiwgdHJhbnNmPWV4cCwgZGlnaXRzPTQpDQpgYGANCu2VtOyEnTogcHJlZGljdCgp7ZWo7IiY66W8IO2Gte2VtCDsp4DsiJgg67OA7ZmY65CcIOqwkuydgCAkXGhhdHtPUn0kPWV4cCgtMC40MzYxKT0wLjY0NjUsIDk1JUNJIGZvciAkXGhhdHtPUn0kPVswLjU5NTEsIDAuNzAyNF0NCg0KLT5CQ0cg67Cx7Iic6rWw7JeQ7IScIOuMgOyhsOq1sOyXkCDruYTtlbQg6rKw7ZW167Cc7IOd7J20IDM1JSDqsJDshoztlZzri6Tqs6Ag7ZWgIOyImCDsnojri6QuDQoNCg0KIyNbRXgzXSBGaXhlZCBlZmZlY3QgbW9kZWwgdXNpbmcgTUgt7Jik7KaI67mEIChPUikg7J207JqpDQpNYW50ZWwtSGFlbnN6ZWwoTUgp67Cp67KV7J2AIOydtOu2hO2YlSDsnpDro4zsl5DshJzrp4wg7IKs7Jqp7ZWgIOyImCDsnojquLDsl5AsDQrtmqjqs7ztgazquLDqsIAg7JyE7ZeY67mEKFJSKSwg7Jik7KaI67mEKE9SKSwg7JyE7ZeY7LCoKFJEKeyduCDqsr3smrDsl5Ag7IKs7Jqp7ZWgIOyImCDsnojri6QuDQpSCe2VqOyImDrvg6ggcm1hLm1o4Yi64Yi7KCkNCmBgYHtyfQ0KcmVzMyA8LSBybWEubWgoYWk9dHBvcywgYmk9dG5lZywgY2k9Y3BvcywgZGk9Y25lZywgZGF0YT1kYXQuYmNnLCBtZWFzdXJlPSJPUiIpIA0KcmVzMw0KYGBgDQoNCu2VqOyImCBybWEubWjripQgbG4kXGhhdHtPUn0k7JmAICRcaGF0e09SfSQg6rCB6rCB7J2YIOqysOqzvOulvCDrs7Tsl6zspIwNCg0K4pGgIGxuJFxoYXR7T1J9JD0tMC40NzYzLCBTRShsbiRcaGF0e09SfSQpPTAuMDQxMCwgOTUlQ0kgZm9yIGxuJFxoYXR7T1J9JOGIuz1bLTAuNTUzOCwtMC4zOTMwXQ0K4pGhCSRcaGF0e09SfSQ9MC42MjI5LCA5NSVDSSBmb3IgJFxoYXR7T1J9JD1bMC41NzQ4LCAwLjY3NTBdDQrikaIgQ01I6rKA7KCVOiDrqqjrk6Ag6rCc67OE7Jew6rWs7J2YICBPUuqwgCAx7J247KeAIOqygOyglQ0K74OoIHAtdmFsPDAuMDAx7J2066+A66GcIOuqqOuToCDqsJzrs4Tsl7DqtazsnZggT1LqsIAgMeuhnCDrj5nsnbztlZjri6Tqs6Ag7ZWgIOyImCDsl4bri6QuDQoNCiMjIFtFeDRdIEZpeGVkIGVmZmVjdCBtb2RlbCB1c2luZyBNSC3snITtl5jruYQgKFJSKSDsnbTsmqkNCmBgYHtyfQ0KcmVzNCA8LSBybWEubWgoYWk9dHBvcywgYmk9dG5lZywgY2k9Y3BvcywgZGk9Y25lZywgZGF0YT1kYXQuYmNnLCBtZWFzdXJlPSJSUiIpIA0KcmVzNA0KYGBgDQoNCk1hbnRlbC1IYWVuc3plbChNSCnrsKnrspXsl5Ag7J2Y7ZWcIOuhnOq3uCDsnITtl5jruYTsnZgg7Ya17ZWp7LaU7KCV7LmY64qUIOuLpOydjOqzvCDqsJnri6QuDQoNCuKRoCAkbG5caGF0e1JSfSQ9PS0wLjQ1MzcsICRTRShsblxoYXR7UlJ9KSQ9MC4wMzkzLA0KOTUlQ0kgZm9yICRsblxoYXR7UlJ9JD1bLTAuNTMwOCwtMC4zNzY2XQ0K74OoIHAtdmFsPDAuMDAx7J2066+A66GcIEJDR+uwseyLoOq1sOqzvCDrjIDsobDqtbDqsITsl5Ag6rKw7ZW167Cc7IOd7J20IOuLpOultOuLpOqzoCDtlaAg7IiYIOyeiOuLpC4NCg0K4pGhJGhhdHtSUn0kPTAuNjM1MywgOTUlQ0kgZm9yINy0JGhhdHtSUn0kPVswLjU4ODEsIDAuNjg2Ml0NCi0+64yA7KGw6rWw7JeQIOu5hO2VtCBCQ0frsLHsi6DqtbDsl5DshJwg6rKw7ZW167Cc7IOd7J20IDM2LjUlIOqwkOyGjO2VnOuLpOqzoCDtlaAg7IiYIOyeiOuLpC4gDQoNCiMjIFtFeDVdIEZpeGVkIGVmZmVjdCBtb2RlbCB1c2luZyBNSC3snITtl5jssKggKFJEKSDsnbTsmqkNCmBgYHtyfQ0KcmVzNTwtIHJtYS5taChhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2csIG1lYXN1cmU9IlJEIikgDQpyZXM1DQpgYGANCk1hbnRlbC1IYWVuc3plbChNSCnrsKnrspXsl5Ag7J2Y7ZWcIOychO2XmOywqOydmCDthrXtlanstpTsoJXsuZjripQg64uk7J2M6rO8IOqwmeuLpC4NCg0KJFxoYXR7UkR9JD0wLjAwMzMsIDk1JUNJIGZvciAkaGF0e1JEfSQ9Wy0wLjAwMzksICAtMC4wMDI3XQ0KLT5wLXZhbDwwLjAwMeydtOuvgOuhnCDsnITtl5jssKjqsIAgMOydtOudvOuKlCDqt4DrrLTqsIDshKTsnYQg6riw6rCB7ZWoLg0K7KaJLCBCQ0frsLHsi6Ag6rWw6rO8IOuMgOyhsOq1sCDqsITsl5Ag6rKw7ZW167Cc7IOd7J20IOuLpOultOuLpOqzoCDtlaAg7IiYIOyeiOqzoCwNCuuMgOyhsCDqtbDsl5Ag67mE7ZW0IEJDR+uwseyLoCDqtbDsl5DshJwg6rKw7ZW167Cc7IOd7J20IDAuMzMlIOuCruuLpOqzoCDtlaAg7IiYIOyeiOuLpC4gDQoNCiMjIFtFeDZdIEZpeGVkIGVmZmVjdCBtb2RlbCB1c2luZyBQZXRvIC3smKTspojruYQgKE9SKSDsnbTsmqkNClBldG8g67Cp67KV7J2AIOyYpOymiOu5hOydmCDthrXtlansl5Drp4wg7IKs7Jqp7ZWgIOyImCDsnojri6QuDQoNClIJ7ZWo7IiYOu+DqCBybWEucGV0b+GIuiAoKQ0KYGBge3J9DQpyZXM2PC0gcm1hLnBldG8oYWk9dHBvcywgYmk9dG5lZywgY2k9Y3BvcywgZGk9Y25lZywgZGF0YT1kYXQuYmNnKSANCnJlczYNCmBgYA0K7ZWo7IiYIHJtYS5wZXRv64qUIGxuJFxoYXR7T1J9JOyZgCAkXGhhdHtPUn0kIOqwgeqwgeydmCDqsrDqs7zrpbwg67O07Jes7KSMDQoNCuKRoCBsbiRcaGF0e09SfSQ9LTAuNDc0NCwgU0UobG4kXGhhdHtPUn0kKT0wLjA0MDcsIDk1JUNJIGZvciBsbiRcaGF0e09SfSThiLs9Wy0wLjU1NDEsIC0wLjM5NDhdDQoNCi0+cC12YWw8MC4wMDHsnbTrr4DroZwgQkNH67Cx7IugIOq1sOqzvCDrjIDsobAg6rWw6rCE7JeQIOqysO2VteuwnOyDneydtCDri6TrpbTri6Tqs6Ag7ZWgIOyImCDsnojri6QuIA0KDQrikaEJJFxoYXR7T1J9JD0wLjYyMjIsIDk1JUNJIGZvciAkXGhhdHtPUn0kPVswLjU3NDYsIDAuNjczOF0NCg0KLT7rjIDsobAg6rWw7J2YIOqysO2VteuwnOyDneyXkCDrjIDtlZwgT1Lsl5Ag67mE7ZW0IEJDR+uwseyLoCDqtbDsnZgg6rKw7ZW167Cc7IOd7JeQIOuMgO2VnCBPUuqwgCAwLjYy67Cw65286rOgDQrtlaAg7IiYIOyeiOuLpC4gDQoNCiMjICBbRXg3XSBSYW5kb20gZWZmZWN0IG1vZGVsIHVzaW5nIERMLe2Pieq3oOywqCAoTUQp7J207JqpDQpNROyZgCBNROydmCDrtoTsgrAg6rOE7IKwIA0KYGBge3J9DQpkYXRfTUQgPC0gZXNjYWxjKG1lYXN1cmU9Ik1EIiwgbTFpPW0xaSwgc2QxaT1zZDFpLCBuMWk9bjFpLCBtMmk9bTJpLCBzZDJpPXNkMmksIG4yaT1uMmksIGRhdGE9ZGF0KQ0KYGBgDQoNCk1E7J2YIERlclNpbW9uaWFuLUxhaXJkIOuwqeuylSDthrXtlanstpTsoJXsuZgg6rOE7IKwIA0KYGBge3J9DQpyZXM3PC0gcm1hKHlpLCB2aSwgZGF0YT0gZGF0X01ELCBtZXRob2Q9IkRMIikgDQpyZXM3DQpgYGANCg0K4pGgIERM67Cp67KV7Jy866GcIOy2lOygleuQnCDsl7DqtazqsIQg67aE7IKwICRcaGF0XHRhdV4yPTIwNS40MDk0JA0KDQrikaEgUeydmCDsnKDsnZjtmZXrpaDsnbQgcOKAkHZhbDwwLjAwMDHroZwg6rCc67OE7Jew6rWs65Ok7J2YIO2aqOqzvO2BrOq4sOqwgCDsg4Hri7ntnogg7J207KeI7KCB7J6ELgkNCu+DqFJhbmRvbQllZmZlY3QJbW9kZWzroZwg7Ya17ZWp7LaU7KCV7LmY66W8IOq1rO2VmOuKlCDqsoPsnbQg7KCB7KCI7ZWoDQoNCuKRoiAkXGhhdHtNRH09LTEzLjk4MTcsIFNFKFxoYXR7TUR9KT01LjEyNjcsIHAtdmFsPTAuMDA2NCw5NSVDST1bLTI0LjAyOTksIC0zLjkzMzldJA0KDQotPiDtirnrs4TsuZjro4wg6rWw7J2YIOyeheybkOydvOyImOqwgCDsnbzrsJjsuZjro4wg6rWw7J2YIOqyg+uztOuLpCAxMy45OOydvCDsp6fri6Tqs6Ag7ZWgIOyImCDsnojri6QuDQoNCg0KIyMgIFtFeDhdIFJhbmRvbSBlZmZlY3QgbW9kZWwgdXNpbmcgREwt7Jik7KaI67mEIChPUikg7J207JqpDQpsbihPUinsnZggRGVyU2ltb25pYW4tTGFpcmQg67Cp67KVIO2Gte2Vqey2lOygley5mCDqs4TsgrAgDQpgYGB7cn0NCiNkYXRfbG5PUiA8LSBlc2NhbGMobWVhc3VyZT0iT1IiLCBhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2cpICAgICANCnJlczg8LSBybWEoeWksIHZpLCBkYXRhPSBkYXRfbG5PUiwgbWV0aG9kPSJETCIpIA0KcmVzOA0KYGBgDQoNCuKRoCBETOuwqeuyleycvOuhnCDstpTsoJXrkJwg7Jew6rWs6rCEIOu2hOyCsCAkXGhhdFx0YXVeMj0yMC4zNjYzJA0KDQrikaEgUeydmCDsnKDsnZjtmZXrpaDsnbQgcOKAkHZhbDwwLjAwMDHroZwg6rCc67OE7Jew6rWs65Ok7J2YIO2aqOqzvO2BrOq4sOqwgCDsg4Hri7ntnogg7J207KeI7KCB7J6ELgkNCi0+UmFuZG9tCWVmZmVjdAltb2RlbOuhnCDthrXtlanstpTsoJXsuZjrpbwg6rWs7ZWY64qUIOqyg+ydtCDsoIHsoIjtlagNCg0K4pGiICRsbihcaGF0e01EfSk9LTEzLjk4MTcsIFNFKGxuKFxoYXR7TUR9KSk9NS4xMjY3LCBwLXZhbD0wLjAwMDEsOTUlQ0k9Wy0xLjEyNDIsLTAuMzcwNl0kDQoNCi0+JFxoYXR7TUR9PWV4cCgtMTMuOTgxNyk9MC40NzM2LCA5NSVDSSBmb3IgXGhhdHtPUn09WzAuMzI0OSwgMC42OTAzXSQNCg0K64yA7KGwIOq1sOyXkCDruYTtlbQgQkNHIOuwseyLoCDqtbDsl5DshJwg6rKw7ZW167Cc7IOd7J20IDUzJSDqsJDshoztlZzri6Tqs6Ag7ZWgIOyImCDsnojri6QuDQoNCiMjICBbRXg5XSBIZXRlcm9nZW5laXR5IDogRm9yZXN0IHBsb3QNCmBgYHtyfQ0KcmVzX1JFIDwtIHJtYSh5aSwgdmksIGRhdGE9IGRhdF9sbk9SLCBtZXRob2Q9IkRMIikNCmZvcmVzdChyZXNfUkUsIHhsaW09YygtMTYsIDEwKSwgYXQ9bG9nKGMoLjA1LCAuMjUsIDEsIDQpKSwgYXRyYW5zZj1leHAsIA0KICAgICAgIGlsYWI9Y2JpbmQoZGF0LmJjZyR0cG9zLCBkYXQuYmNnJHRuZWcsIGRhdC5iY2ckY3BvcywgZGF0LmJjZyRjbmVnKSwgDQogICAgICAgaWxhYi54cG9zPWMoLTkuNSwtOCwtNiwtNC41KSwgY2V4PS43NSwgc2hvd3dlaWdodD1UUlVFKQ0KDQp0ZXh0KGMoLTkuNSwtOCwtNiwtNC41KSwgMTUsIGMoIlRCKyIsICJUQi0iLCAiVEIrIiwgIlRCLSIpLCBjZXg9MC43NSkNCg0KdGV4dChjKC04Ljc1LC01LjI1KSwgMTYsIGMoIlZhY2NpbmF0ZWQiLCAiQ29udHJvbCIpLCBjZXg9MC43NSkNCnRleHQoNSwgMTUsICJXZWlnaHRzIiwgcG9zPTIsIGNleD0wLjc1KQ0KdGV4dCg5LCAxNSwgIk9SWzk1JSBDSV0iLCBwb3M9MiwgY2V4PTAuNzUpDQpgYGANCiANCiMjICBbRXgxMF0gSGV0ZXJvZ2VuZWl0eSA6IFEtc3RhdGlzdGljcyAmIEheMg0KYGBge3J9DQpyZXMgPC0gcm1hKGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZywgbWVhc3VyZT0iT1IiLCBtZXRob2Q9IkRMIikgICANCmBgYA0KDQpgYGB7cn0NCiMgUS12YWx1ZQ0KcmVzJFFFDQpgYGANCg0KYGBge3J9DQpyZXMkUUVwDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KHJlcykNCm5hbWVzKHJlcykNCmBgYA0KDQojIyBbRXgxMV0gSGV0ZXJvZ2VuZWl0eSA6IHRhdV4yIGFuZCBJXjIgc3RhdGlzdGljcw0KYGBge3J9DQpyZXMkSTINCmBgYA0KDQpgYGB7cn0NCnJlcyR0YXUyDQpgYGANCg0KYGBge3J9DQpjb25maW50KHJlcykgIyBjb25maWRlbmNlIGludGVydmFscw0KYGBgDQoNCiRJXjIkIO2GteqzhOufiT05Mi42NDU1LCA5NSVDST1bODEuNzQlLCA5Ny42MCVd7J2066+A66GcIOustOyLnO2VoCDsiJgg7JeG64qUIO2GteqzhOyggQ0K7J207KeI7ISx7J20IOyeiOuLpOqzoCDtlaAg7IiYIOyeiOuLpC4NCuKAuyDsnbTsp4jshLEg7YyQ64uo7Jes67aA64qUIO2aqOqzvO2BrOq4sOydmCDrsKntlqXqs7wg7YGs6riwLCBRIO2GteqzhOufieydhCDsnbTsmqntlZwg6rCA7ISk6rKA7KCVIOqysOqzvCwNCiRJXjIkIO2GteqzhOufieydmCDsi6DrorDqtazqsIQg65Ox7J2EIO2VqOq7mCDqs6DroKTtlbTslbwg7ZWc64ukLiANCg0KIyMgW0V4MTJdIFN1Ymdyb3VwIGFuYWx5c2lzDQrqsJzrs4Qg7Jew6rWs65Ok6rCEIO2aqOqzvO2BrOq4sOydmCDsnbTsp4jshLHsnZgg7JuQ7J247J2EIO2MjOyVhe2VmOq4sCDsnITtlZjsl6wsIOyghOyytCDrjIDsg4Eg7Jew6rWs65Ok7J2EIOuPmeyniOyggQ0K7J206528IOyYiOyDgeuQmOuKlCDtlZjsnITqt7jro7nsnLzroZwg6rWs67aE7ZWY7JesIOuplO2DgOu2hOyEneydhCDtlZjsnIQg6re466O567OE66GcIOqwgeqwgSDsi6Tsi5ztlZzri6QNCg0KYGBge3J9DQojIFRvdGFsIGFuZCBzdWJncm91cHMNCnJlcyAgIDwtIHJtYShhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2csIG1lYXN1cmU9IlJSIiwgc2xhYj1wYXN0ZShhdXRob3IsIHllYXIsIHNlcD0iLCAiKSwgbWV0aG9kPSJETCIpIA0KcmVzLnMgPC0gcm1hKGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZywgbWVhc3VyZT0iUlIiLCBzdWJzZXQ9KGFsbG9jPT0ic3lzdGVtYXRpYyIpLCBtZXRob2Q9IkRMIikgICANCnJlcy5yIDwtIHJtYShhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2csIG1lYXN1cmU9IlJSIiwgc3Vic2V0PShhbGxvYz09InJhbmRvbSIpLCBtZXRob2Q9IkRMIikgIA0KcmVzLmEgPC0gcm1hKGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZywgbWVhc3VyZT0iUlIiLCBzdWJzZXQ9KGFsbG9jPT0iYWx0ZXJuYXRlIiksIG1ldGhvZD0iREwiKSAgDQpgYGANCg0KYGBge3J9DQpmb3Jlc3QocmVzLCB4bGltPWMoLTE2LCA2KSwgYXQ9bG9nKGMoLjA1LCAuMjUsIDEsIDQpKSwgYXRyYW5zZj1leHAsIA0KICAgICAgIGlsYWI9Y2JpbmQoZGF0LmJjZyR0cG9zLCBkYXQuYmNnJHRuZWcsIGRhdC5iY2ckY3BvcywgZGF0LmJjZyRjbmVnKSwgDQogICAgICAgaWxhYi54cG9zPWMoLTkuNSwtOCwtNiwtNC41KSwgY2V4PS43NSwgeWxpbT1jKC0xLDI3KSwgIG9yZGVyPW9yZGVyKGRhdC5iY2ckYWxsb2MpLCANCiAgICAgICByb3dzPWMoMzo0LCA5OjE1LCAyMDoyMyksICAgeGxhYj0iUmVsYXRpdmUgUmlzayIsIG1sYWI9IlJFIE1vZGVsIGZvciBBbGwgc3R1ZGllcyIpDQp0ZXh0KC0xNiwgYygyNCwgMTYsIDUpLCBwb3M9NCwgYygiU3lzdGVtYXRpYyBBbGxvY2F0aW9uIiwiUmFuZG9tIEFsbG9jYXRpb24iLCAiQWx0ZXJuYXRlIEFsbG9jYXRpb24iKSwgY2V4PS43NSwgZm9udD00KQ0KdGV4dChjKC05LjUsLTgsLTYsLTQuNSksIDI2LCBjKCJUQisiLCAiVEItIiwgIlRCKyIsICJUQi0iKSwgY2V4PTAuNzUpDQp0ZXh0KGMoLTguNzUsLTUuMjUpLCAyNywgYygiVmFjY2luYXRlZCIsICJDb250cm9sIiksIGNleD0wLjc1KQ0KdGV4dCgtMTYsICAgICAgICAgICAgMjYsICJBdXRob3IocykgYW5kIFllYXIiLCBwb3M9NCwgY2V4PTAuNzUpDQp0ZXh0KDYsICAgICAgICAgICAgICAyNiwgIlJlbGF0aXZlIFJpc2sgWzk1JSBDSV0iLCBwb3M9MiwgY2V4PTAuNzUpDQoNCiMgQWRkIHBvbHlnb25zIHRvIGZvcmVzdCBwbG9zdHMgZm9yIHN1Ymdyb3VwDQphZGRwb2x5KHJlcy5zLCByb3c9MTguNSwgY2V4PS43NSwgYXRyYW5zZj1leHAsIG1sYWI9IlJFIE1vZGVsIGZvciBTdWJncm91cCIpDQphZGRwb2x5KHJlcy5yLCByb3c9Ny41LCBjZXg9Ljc1LCBhdHJhbnNmPWV4cCwgbWxhYj0iUkUgTW9kZWwgZm9yIFN1Ymdyb3VwIikNCmFkZHBvbHkocmVzLmEsIHJvdz0xLjUsIGNleD0uNzUsIGF0cmFuc2Y9ZXhwLCBtbGFiPSJSRSBNb2RlbCBmb3IgU3ViZ3JvdXAiKQ0KYGBgDQoNCmBgYHtyfQ0KcmVzLnMNCnJlcy5yDQpyZXMuYQ0KYGBgDQoNCg0KIyNbRXgxM10gUHVibGljYXRpb24gYmlhcyA6IEZ1bm5lbCBwbG90DQpgYGB7cn0NCmRhdCA8LSBnZXQoZGF0YShkYXQuaGFja3NoYXcxOTk4KSkNCnJlcyA8LSBybWEoeWksIHZpLCBkYXRhPWRhdCwgbWVhc3VyZT0iT1IiLCBtZXRob2Q9IkZFIikNCmBgYA0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMykpDQpmdW5uZWwocmVzLCBhdHJhbnNmPWV4cCwgeGxhYj0iT2RkcyBSYXRpbyIsIGF0PWxvZyhjKC4yNSwgLjUsIDEsIDIsIDQpKSkNCiMgY29udG91ci1lbmhhbmNlZCBmdW5uZWwgcGxvdCBjZW50ZXJlZCBhdCAwDQpmdW5uZWwocmVzLCBsZXZlbD1jKDkwLCA5NSwgOTkpLCBzaGFkZT1jKCJ3aGl0ZSIsImdyYXkiLCJkYXJrZ3JheSIpLCANCiAgICAgICByZWZsaW5lPTAsIGF0cmFuc2Y9ZXhwLCB4bGFiPSJPZGRzIFJhdGlvIiwgYXQ9bG9nKGMoLjI1LCAuNSwgMSwgMiwgNCkpKQ0KIyBjb250b3VyLWVuaGFuY2VkIGZ1bm5lbCBwbG90IDogWS1heGlzPWludmVyc2Ugb2YgdGhlIHN0YW5kYXJkIGVycm9yDQpmdW5uZWwocmVzLCBsZXZlbD1jKDkwLCA5NSwgOTkpLCBzaGFkZT1jKCJ3aGl0ZSIsImdyYXkiLCJkYXJrZ3JheSIpLCANCiAgICAgICByZWZsaW5lPTAsIGF0cmFuc2Y9ZXhwLCB4bGFiPSJPZGRzIFJhdGlvIiwgYXQ9bG9nKGMoLjI1LCAuNSwgMSwgMiwgNCkpLCB5YXhpcz0ic2VpbnYiKQ0KYGBgDQpY7LaV7J2AIGVmZmVjdCBzaXplLCBZ7LaV7J2AIO2RnOuzuO2BrOq4sCjtkZzrs7jsiJgsIFNFLCDrtoTsgrAg65OxKeulvCDrgpjtg4DrgrTqs6AsIOy2nO2MkOyCkOuapOumvOydtA0K7JeG7Jy866m0IO2RnOuzuO2BrOq4sOqwgCDsnpHsnYAg7Jew6rWs65Ok7J2AIOyVhOuemOyqveyXkCDqs6jqs6Dro6gsIO2RnOuzuO2BrOq4sOqwgCDtgbAg7Jew6rWs65Ok7J2AIOycl+yqveyXkA0K7KeR7KSR7KCB7Jy866GcIOuztOyehC4NCg0K7LKr67KI7Ke4IOq3uOumvOyXkOyEnCDsoozsuKEg7ZWY64uoIOyXsOq1rOuTpOydtCDsl4bsnYzvg6gtPu2RnOuzuO2BrOq4sCDsnpHqs6AsIO2aqOqzvO2BrOq4sOqwgCAx67O064ukIOyekeydgCDsl7Dqtazrk6TsnYANCu2PrO2VqOuQmOyWtOyeiOyngCDslYrsnLzrr4DroZwsIOy2nO2MkOyCkOuapOumvOydtCDsnZjsi6zrkKgNCg0KIyNbRXgxNF0gUHVibGljYXRpb24gYmlhcyA6IEJlZ2figJlzIHRlc3QsIEVnZ2Vy4oCZcyB0ZXN0IA0KYGBge3J9DQojIEJlZ2figJlzIHRlc3QNCnJhbmt0ZXN0KHJlcykgDQpgYGANCnAtdmFsdWU9MC4yMTU3IC0+74OgIOy2nO2MkCDruYTrmqTrprzsnbQg7J6I64uk6rOgIO2VoCDsiJgg7JeG64ukDQoNCmBgYHtyfQ0KIyBFZ2dlcuKAmXMgdGVzdCANCnJlZ3Rlc3QocmVzKQ0KYGBgDQpwLXZhbHVlPTAuMDEwMCAtPu+DoCDstpztjJAg67mE65qk66a87J20IOyeiOuLpOqzoCDtlaAg7IiYIOyXhuuLpA0KDQrigLsgQmVnZywgRWdnZXIg67Cp67KV7J2AIOuplO2DgCDrtoTshJ3sl5Ag7Y+s7ZWo65CcIOyXsOq1rOyImOqwgCAxMOqwnOuztOuLpCDsnpHqsbDrgpgsDQrsi6zqsIHtlZwg7Lac7YyQIOu5hOuapOumvOydtCDsl4bripQg6rK97JqwIOqygOygleugpeydtCDrgq7ri6QuIO2ajOq3gOu2hOyEnSDrsKnrspXsnYQg7J207Jqp7ZWcDQpFZ2dlcuuwqeuyleydtCBCZWdn7JeQIOu5hO2VtCDqsoDsoJXroKXsnbQg64uk7IaMIOuGkuuLpC4gDQoNCiMjW0V4MTVdIFB1YmxpY2F0aW9uIGJpYXMgOiBUcmltLWFuZC1maWxsLCBGYWlsLXNhZmUgTg0KYGBge3J9DQpyZXMgPC0gcm1hKHlpLCB2aSwgZGF0YT1kYXQsIG1ldGhvZD0iRkUiKQ0KcmVzLnRmIDwtIHRyaW1maWxsKHJlcykNCnJlcy50Zg0KYGBgDQpUcmltLWFuZC1maWxs6rKw6rO8OuybkOuemCDthrXtlanstpTsoJXsuZjripQgMC4xODU3LCDsiJjsoJXrkJwg7Ya17ZWp7LaU7KCV7LmY64qUIDAuMTU1NQ0KDQpgYGB7cn0NCmZ1bm5lbChyZXMudGYsIGF0cmFuc2Y9ZXhwLCB4bGFiPSJPZGRzIFJhdGlvIiwgYXQ9bG9nKGMoLjI1LCAuNSwgMSwgMiwgNCkpKQ0KYGBgDQogDQpgYGB7cn0NCmZzbih5aSwgdmksIGRhdGE9ZGF0LCB0eXBlPSJSb3NlbnRoYWwiKQ0KYGBgDQpGYWlsLXNhZmUgTiDqsrDqs7w6IDVrKzEw67O064ukIO2BrOuptCDsoITssrQg7Zqo6rO87YGs6riw7JeQIOuvuOy5mOuKlCDsmIHtlqXsnbQNCu2BrOyngCDslYrri6Tqs6Ag7ZWc64ukLiBGYWlsLXNhZmUgTuydgCAzOTPsnLzroZwgNSozNysxMD0xOTUg67O064ukDQrtgazrr4DroZwg7KCE7LK0IO2aqOqzvCDtgazquLDqsIAg7Lac7YyQIOu5hOuapOumvOyXkCDsmIHtlqXsnYQg67Cb64qU64uk6rOgIO2VoCDsiJgg7JeG64ukLg0KDQojI1tFeDE2XSBDdW11bGF0aXZlIG1ldGEtYW5hbHlzaXMgKGkuZS4sIGFkZGluZyBvbmUgb2JlcnZhdGlvbiBhdCBhIHRpbWUpIA0KYGBge3J9DQpyZXMgPC0gcm1hKHlpLCB2aSwgZGF0YT1kYXQsIG1ldGhvZD0iRkUiLCBzbGFiPXBhc3RlKGF1dGhvciwgeWVhciwgc2VwPSIsIikpDQpgYGANCg0KYGBge3J9DQojIEJ5IHRoZSBzaXplIG9mIGNhc2UgDQpjdW11bF9jYXNlIDwtIGN1bXVsKHJlcywgb3JkZXI9b3JkZXIoZGF0JGNhc2VzLCBkZWNyZWFzaW5nID0gVFJVRSkpDQpmb3Jlc3QoY3VtdWxfY2FzZSwgYXQ9bG9nKGMoLjc1LCAxLCAyKSksIGF0cmFuc2Y9ZXhwLCBjZXg9MC43NSwgeGxhYj0iT2RkcyBSYXRpbyIpDQp0ZXh0KGMoLTAuNiwwLjg1KSwgNDAsIGMoIlN0dWR5IiwgIk9SIFs5NSUgQ0ldIiksIGNleD0wLjc1KQ0KYGBgDQoNCmBgYHtyfQ0KIyBCeSBwdWJsaXNoZWQgeWVhciAoZnJvbSBuZXcgdG8gb2xkKQ0KY3VtdWxfeWVhciA8LSBjdW11bChyZXMsIG9yZGVyPW9yZGVyKGRhdCR5ZWFyLCBkZWNyZWFzaW5nID0gVFJVRSkpDQpmb3Jlc3QoY3VtdWxfeWVhciwgYXQ9bG9nKGMoLjc1LCAxLCAyKSksIGF0cmFuc2Y9ZXhwLCBjZXg9MC43NSwgeGxhYj0iT2RkcyBSYXRpbyIpDQp0ZXh0KGMoLTAuNiwwLjg1KSwgNDAsIGMoIlN0dWR5IiwgIk9SIFs5NSUgQ0ldIiksIGNleD0wLjc1KQ0KYGBgDQoNCiMjW0V4MTddIFNlbnNpdGl2aXR5IGFuYWx5c2lzIA0KYGBge3J9DQojIyMgY2FsY3VsYXRlIGxvZyByZWxhdGl2ZSByaXNrcyBhbmQgY29ycmVzcG9uZGluZyBzYW1wbGluZyB2YXJpYW5jZXMNCmRhdCA8LSBlc2NhbGMobWVhc3VyZT0iUlIiLCBhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2cpICANCnJlcyA8LSBybWEoeWksIHZpLCBkYXRhPWRhdCkgICMgZGVhdWx064qUIHJhbmRvbSBlZmZlY3QNCmxlYXZlMW91dChyZXMpOyBMTzE8LSBsZWF2ZTFvdXQocmVzLCB0cmFuc2Y9ZXhwKTsNCmBgYA0KDQpgYGB7cn0NCiMjIyBtZXRhLWFuYWx5c2lzIG9mIHRoZSAobG9nKSByZWxhdGl2ZSByaXNrcyB1c2luZyB0aGUgTWFudGVsLUhhZW5zemVsIG1ldGhvZA0KcmVzIDwtIHJtYS5taChtZWFzdXJlPSJSUiIsIGFpPXRwb3MsIGJpPXRuZWcsIGNpPWNwb3MsIGRpPWNuZWcsIGRhdGE9ZGF0LmJjZykNCmxlYXZlMW91dChyZXMpO0xPMjwtIGxlYXZlMW91dChyZXMsIHRyYW5zZj1leHApOw0KYGBgDQoNCmBgYHtyfQ0KIyMjIG1ldGEtYW5hbHlzaXMgb2YgdGhlIChsb2cpIG9kZHMgcmF0aW9zIHVzaW5nIFBldG8ncyBtZXRob2QNCnJlcyA8LSBybWEucGV0byhhaT10cG9zLCBiaT10bmVnLCBjaT1jcG9zLCBkaT1jbmVnLCBkYXRhPWRhdC5iY2cpI09S7J20IGRlZmF1bHTsnoQNCmxlYXZlMW91dChyZXMpO0xPMzwtIGxlYXZlMW91dChyZXMsIHRyYW5zZj1leHApOw0KTE8xO0xPMjtMTzMNCmBgYA0KDQojI1tFeDE4XSBJUlIg6riw7KSA7Jy866GcIGhhcnQxOTk5IOuNsOydtO2EsCDrqZTtg4Ag67aE7ISdIOuwjyDsi5zqsIHtmZQNCg0KYGBge3J9DQojZGF0LmhhcnQxOTk5OiDsmYDtjIzrprAg6rWwIHZzIOuMgOyhsOq1sCAo7Ius67Cp7IS464+ZIO2ZmOyekOuMgOyDgSnsnZgg64eM7KG47KadIOuwnOyDneyImCwgZXZlbnRzIGNvdW50czogTG9nIEluY2lkZW5jZSBSYXRlIHJhdGlvKElSUiksIEluY2lkZW5jZSBSYXRlIERpZmZlcmVuY2UoSVJEKSwgc3F1cmUtcm9vdCB0cmFuc2Zvcm1lZCBpbmNpZGVuY2UgcmF0ZSBkaWZmZXJlbmNlKElSU0QpDQpkYXQgPC0gZ2V0KGRhdGEoZGF0LmhhcnQxOTk5KSkNCiMjIyBjYWxjdWxhdGUgbG9nIGluY2lkZW5jZSByYXRlIHJhdGlvcyBhbmQgY29ycmVzcG9uZGluZyBzYW1wbGluZyB2YXJpYW5jZXMNCmRhdCA8LSBlc2NhbGMobWVhc3VyZT0iSVJSIiwgeDFpPXgxaSwgeDJpPXgyaSwgdDFpPXQxaSwgdDJpPXQyaSwgZGF0YT1kYXQpDQpkYXQNCmBgYA0KDQpgYGB7cn0NCiMjIyBtZXRhLWFuYWx5c2lzIG9mIGxvZyBpbmNpZGVuY2UgcmF0ZSByYXRpb3MgdXNpbmcgYSByYW5kb20tZWZmZWN0cyBtb2RlbA0KcmVzIDwtIHJtYSh5aSwgdmksIGRhdGE9ZGF0KQ0KcmVzDQpgYGANCg0KYGBge3J9DQojIyMgYXZlcmFnZSBpbmNpZGVuY2UgcmF0ZSByYXRpbyB3aXRoIDk1JSBDSQ0KcHJlZGljdChyZXMsIHRyYW5zZj1leHApDQpgYGANCg0KYGBge3J9DQojIyMgZm9yZXN0IHBsb3Qgd2l0aCBleHRyYSBhbm5vdGF0aW9ucw0KcGFyKG1hcj1jKDUsNCwxLDIpKQ0KZm9yZXN0KHJlcywgeGxpbT1jKC0xMSwgNSksIGF0PWxvZyhjKC4wNSwgLjI1LCAxLCA0KSksIGF0cmFuc2Y9ZXhwLA0KICAgICAgIHNsYWI9cGFzdGUwKGRhdCRzdHVkeSwgIiAoIiwgZGF0JHllYXIsICIpIiksDQogICAgICAgaWxhYj1jYmluZChwYXN0ZShkYXQkeDFpLCAiLyIsIGRhdCR0MWksIHNlcD0iICIpLA0KICAgICAgICAgICAgICAgICAgcGFzdGUoZGF0JHgyaSwgIi8iLCBkYXQkdDJpLCBzZXA9IiAiKSksDQogICAgICAgaWxhYi54cG9zPWMoLTYuNSwtNCksIGNleD0uODUpDQpvcCA8LSBwYXIoY2V4PS44NSwgZm9udD0yKQ0KdGV4dCgtMTEsIDcuNSwgIlN0dWR5IChZZWFyKSIsIHBvcz00KQ0KdGV4dCggNSwgNy41LCAiSVJSIFs5NSUgQ0ldIiwgcG9zPTIpDQp0ZXh0KGMoLTYuNSwtNCksIDguMCwgYygiV2FyZmFyaW4iLCAiQ29udHJvbCIpKQ0KdGV4dChjKC02LjUsLTQpLCA3LjUsIGMoIlN0cm9rZXMgLyBQVCIsICJTdHJva2VzIC8gUFQiKSkNCnNlZ21lbnRzKHgwPS03Ljc1LCB5MD03Ljc1LCB4MT0tMi43NSwgeTE9Ny43NSkNCnBhcihvcCkNCmBgYA0KDQpgYGB7cn0NCiMjIyBtZXRhLWFuYWx5c2lzIG9mIGluY2lkZW5jZSByYXRlIGRpZmZlcmVuY2VzIHVzaW5nIGEgcmFuZG9tLWVmZmVjdHMgbW9kZWwNCnJlcyA8LSBybWEobWVhc3VyZT0iSVJEIiwgeDFpPXgxaSwgeDJpPXgyaSwgdDFpPXQxaSwgdDJpPXQyaSwgZGF0YT1kYXQpDQpgYGANCg0KDQojI1tFeDE5XSBSUiDquLDspIDsnLzroZwgaGFydDE5OTkg642w7J207YSwIOuplO2DgCDrtoTshJ0g67CPIOyLnOqwge2ZlA0KYGBge3J9DQpyZXMgPC0gcm1hKG1lYXN1cmU9IlJSIiwgYWk9dHBvcywgYmk9dG5lZywgY2k9Y3BvcywgZGk9Y25lZywgbW9kcyA9IH4gYWJsYXQsDQogICAgICAgICAgIHNsYWI9cGFzdGUoYXV0aG9yLCB5ZWFyLCBzZXA9IiwgIiksIGRhdGE9ZGF0LmJjZykNCmBgYA0KDQoNCmBgYHtyfQ0KIyMjIGZvcmVzdCBwbG90IG9mIHRoZSBvYnNlcnZlZCByZWxhdGl2ZSByaXNrcw0KZm9yZXN0KHJlcywgYWRkZml0PUZBTFNFLCBhdHJhbnNmPWV4cCwgeGxpbT1jKC04LDUpLCB5bGltPWMoLTQuNSwxNiksIGNleD0uOCwNCiAgICAgICBvcmRlcj1vcmRlcihkYXQuYmNnJGFibGF0KSwgaWxhYj1kYXQuYmNnJGFibGF0LCBpbGFiLnhwb3M9LTIuOCwgaWxhYi5wb3M9MikNCg0KIyMjIHByZWRpY3RlZCBhdmVyYWdlIGxvZyByZWxhdGl2ZSByaXNrIGZvciAxMCwgMzAsIGFuZCA1MCBkZWdyZWVzIGFic29sdXRlIGxhdGl0dWRlDQp4IDwtIHByZWRpY3QocmVzLCBuZXdtb2RzPWMoMTAsIDMwLCA1MCkpDQoNCiMjIyBhZGQgcHJlZGljdGVkIGF2ZXJhZ2UgcmVsYXRpdmUgcmlza3MgdG8gZm9yZXN0IHBsb3QNCmFkZHBvbHkoeCRwcmVkLCBzZWk9eCRzZSwgYXRyYW5zZj1leHAsIGNvbD0id2hpdGUiLCByb3dzPS0yLA0KICAgICAgICBtbGFiPWMoIi0gYXQgMTAgRGVncmVlcyIsICItIGF0IDMwIERlZ3JlZXMiLCAiLSBhdCA1MCBEZWdyZWVzIiksIGNleD0uOCkNCmFibGluZShoPTApDQp0ZXh0KC04LCAtMSwgIk1vZGVsLUJhc2VkIEVzdGltYXRlcyBvZiBSUjoiLCBwb3M9NCwgY2V4PS44KQ0KdGV4dCgtOCwgMTUsICJBdXRob3IocykgYW5kIFllYXIiLCBwb3M9NCwgY2V4PS44KQ0KdGV4dCg1LCAxNSwgIlJlbGF0aXZlIFJpc2sgWzk1JSBDSV0iLCBwb3M9MiwgY2V4PS44KQ0KdGV4dCgtMy4zLCAxNSwgIkxhdGl0dWRlIiwgY2V4PS44KQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIGZvcmVzdCBwbG90IG9mIHRoZSBvYnNlcnZlZCByZWxhdGl2ZSByaXNrcw0KanBlZygnbXlwbG90LmpwZWcnKQ0KZm9yZXN0KHJlcywgYWRkZml0PUZBTFNFLCBhdHJhbnNmPWV4cCwgeGxpbT1jKC04LDUpLCB5bGltPWMoLTQuNSwxNiksIGNleD0uOCwNCiAgICAgICBvcmRlcj1vcmRlcihkYXQuYmNnJGFibGF0KSwgaWxhYj1kYXQuYmNnJGFibGF0LCBpbGFiLnhwb3M9LTIuOCwgaWxhYi5wb3M9MikNCg0KIyMjIHByZWRpY3RlZCBhdmVyYWdlIGxvZyByZWxhdGl2ZSByaXNrIGZvciAxMCwgMzAsIGFuZCA1MCBkZWdyZWVzIGFic29sdXRlIGxhdGl0dWRlDQp4IDwtIHByZWRpY3QocmVzLCBuZXdtb2RzPWMoMTAsIDMwLCA1MCkpDQoNCiMjIyBhZGQgcHJlZGljdGVkIGF2ZXJhZ2UgcmVsYXRpdmUgcmlza3MgdG8gZm9yZXN0IHBsb3QNCmFkZHBvbHkoeCRwcmVkLCBzZWk9eCRzZSwgYXRyYW5zZj1leHAsIGNvbD0id2hpdGUiLCByb3dzPS0yLA0KICAgICAgICBtbGFiPWMoIi0gYXQgMTAgRGVncmVlcyIsICItIGF0IDMwIERlZ3JlZXMiLCAiLSBhdCA1MCBEZWdyZWVzIiksIGNleD0uOCkNCmFibGluZShoPTApDQp0ZXh0KC04LCAtMSwgIk1vZGVsLUJhc2VkIEVzdGltYXRlcyBvZiBSUjoiLCBwb3M9NCwgY2V4PS44KQ0KdGV4dCgtOCwgMTUsICJBdXRob3IocykgYW5kIFllYXIiLCBwb3M9NCwgY2V4PS44KQ0KdGV4dCg1LCAxNSwgIlJlbGF0aXZlIFJpc2sgWzk1JSBDSV0iLCBwb3M9MiwgY2V4PS44KQ0KdGV4dCgtMy4zLCAxNSwgIkxhdGl0dWRlIiwgY2V4PS44KQ0KZGV2Lm9mZigpDQpgYGANCg0KIyNbRXgyMF0gWkNPUiDquLDspIDsnLzroZwgbW9sbG95MjAxNCDrjbDsnbTthLAg66mU7YOAIOu2hOyEnSDrsI8g7Iuc6rCB7ZmUDQpgYGB7cn0NCiNkYXQubW9sbG95MjAxNDog7ISx7Iuk7ZWo6rO8IOyVveygnCDsuZjro4zsnbTtlonqs7zsnZgg7IOB6rSA6rSA6rOEDQojTWVhc3VyZXMgZm9yIFR3byBRdWFudGl0YXRpdmUgVmFyaWFibGVzOiByYXcgY29ycmVsYXRpb24gY29lZmZpY2llbnQoQ09SKSwNCiNyYXcgY29ycmVsYXRpb24gY29lZmZpY2llbnQgY29ycmVjdGVkIGZvciBpdHMgc2xpZ2h0IG5lZ2F0aXZlIGJpYXMgKFVDT1IpLA0KI0Zpc2hlcidzIHItdG8teiB0cmFuc2Zvcm1lZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAoWkNPUikNCmRhdCA8LSBnZXQoZGF0YShkYXQubW9sbG95MjAxNCkpDQoNCiMjIyBjYWxjdWxhdGUgci10by16IHRyYW5zZm9ybWVkIGNvcnJlbGF0aW9ucyBhbmQgY29ycmVzcG9uZGluZyBzYW1wbGluZyB2YXJpYW5jZXMNCmRhdCA8LSBlc2NhbGMobWVhc3VyZT0iWkNPUiIsIHJpPXJpLCBuaT1uaSwgZGF0YT1kYXQsIHNsYWI9cGFzdGUoYXV0aG9ycywgeWVhciwgc2VwPSIsICIpKQ0KZGF0DQpgYGANCg0KYGBge3J9DQojIyMgbWV0YS1hbmFseXNpcyBvZiB0aGUgdHJhbnNmb3JtZWQgY29ycmVsYXRpb25zIHVzaW5nIGEgcmFuZG9tLWVmZmVjdHMgbW9kZWwNCnJlcyA8LSBybWEoeWksIHZpLCBkYXRhPWRhdCkNCnJlcw0KYGBgDQoNCmBgYHtyfQ0KIyMjIGF2ZXJhZ2UgY29ycmVsYXRpb24gd2l0aCA5NSUgQ0kNCnByZWRpY3QocmVzLCBkaWdpdHM9MywgdHJhbnNmPXRyYW5zZi56dG9yKQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIGZvcmVzdCBwbG90DQpmb3Jlc3QocmVzLCBhZGRjcmVkPVRSVUUsIHhsaW09YygtMS42LDEuNiksIGF0cmFuc2Y9dHJhbnNmLnp0b3IsDQogICAgICAgYXQ9dHJhbnNmLnJ0b3ooYygtLjQsLS4yLDAsLjIsLjQsLjYpKSwgZGlnaXRzPWMoMiwxKSwgY2V4PS44KQ0KdGV4dCgtMS42LCAxOCwgIkF1dGhvcihzKSwgWWVhciIsIHBvcz00LCBjZXg9LjgpDQp0ZXh0KCAxLjYsIDE4LCAiQ29ycmVsYXRpb24gWzk1JSBDSV0iLCBwb3M9MiwgY2V4PS44KQ0KYGBgDQoNCmBgYHtyfQ0KIyMjIGZ1bm5lbCBwbG90DQpmdW5uZWwocmVzKQ0KYGBgDQoNCiMjIFJlZmVyZW5jZQ0KLSBJbnRyb2R1Y3Rpb24gdG8gTWV0YS1BbmFseXNpcywgQm9yZW5zdGVpbiBldCBhbC4NCi0gUuqzvCBXaW5CVUdT66W8IOydtOyaqe2VnCDrqZTtg4DrtoTshJ0tIOq5gOuLrO2YuCBldCBhbC4NCi0gaHR0cHM6Ly9ibG9nLm5hdmVyLmNvbS9Qb3N0TGlzdC5uaG4/YmxvZ0lkPTkwNjUwMzENCi0gaHR0cDovL2hhbmRib29rLmNvY2hyYW5lLm9yZw0KLSBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvdmlld3MvTWV0YUFuYWx5c2lzLmh0bWwNCi0gaHR0cDovL3d3dy5tZXRhZm9yLXByb2plY3Qub3JnDQotIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VmZmVjdF9zaXplDQotIGh0dHA6Ly93d3cuZGlmZmVyZW5jZWJldHdlZW4ubmV0L3NjaWVuY2UvbWF0aGVtYXRpY3Mtc3RhdGlzdGljcw0KLSBodHRwOi8vaGluZWNhLmtyL2VudHJ5L1ZvbDQtOCVFQyU5QiU5NCVFRCU5OCVCOC0lRUMlOTUlOEMlRUElQjglQjAtJUVDJTg5JUFDJUVDJTlBJUI0LUVCTS0lRUIlODQlQTQlRUQlOEElQjglRUMlOUIlOEMlRUQlODElQUMtJUVCJUE5JTk0JUVEJTgzJTgwJUVCJUI2JTg0JUVDJTg0JTlEDQoNCg==