The Analysis
The following analysis pulled geochemistry data from shells of juvenile mussels rasied in separate bays in eastern Maine in 2015 (along side the larvae from the previous analysis), and tested the effects of source (bay), and co-variance matrix prior, on the ability of the infinite mixture model (IMM) to correctly assign juvenile chemistry to sources. During analysis, each juvenile was removed from the overall data set, and the remaining juveniles used as baseline data to train the IMM. The individual juvenile removed from the data set was then assigned to a source based on the IMM, allowing for 7 possible extra, and untrained, source assignments, using each of four different co-variance matrix priors:
- The Identity Matrix for all sources
- Source Specific Co-variance Matrices for baseline sources, and then the Identity Matrix for extra sources
- Source Specific Co-variance Matrices for baseline sources, and then the Universal Co-variance Matrix for extra sources
- The Universal Co-variance Matrix for all sources
For each co-variance matrix prior for each juvenile, the IMM was run for an initial 1000 adaptation and 2000 burn-in iterations. The posterior distribution of source assignments for a final 3000 iterations were retained and used for further analysis.
The Data Set
Data were \(Log(x+1)\) transformed, and centered (by elemental mean) and scaled (by elemental standard deviation) prior to analysis. Together, these transformations were meant to normalize the elemental data, and then standardize the center and variance so that unknown sources could be easily modeled in the IMM. Principal Component Analysis suggested a lot of overlap in the multivariate geochemical signals among sources along the first 2 principle components (accounting for 72 and 12 percent of total variation respectively). Of all elements, Mn and Co accounted for the most variation among individual larvae, while La accounted for the least.

Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
Standard deviation 0.8952 0.3571 0.24539 0.19649 0.17896 0.15648 0.11961 0.08027
Proportion of Variance 0.7252 0.1154 0.05449 0.03494 0.02898 0.02216 0.01295 0.00583
Cumulative Proportion 0.7252 0.8407 0.89514 0.93008 0.95907 0.98122 0.99417 1.00000
Results by Individual
Below are the posterior distribution results of the IMM assignment for each individual juveniles (color) to each potential source (x-axis; numbers represent possible extra sources). Results are separated by the actual juvenile source (panel rows) and the co-variance matrix prior used in the IMM (panel columns).

We can see that generally, individual sources assign most frequently to one source, which is usually the correct one. Depending on the covariance used, sources like MBR, GB and DB are more multi-modal and diffuse in their assignments though.
Results by Source
To summarize assignment results by site, we take the mode source assignment for each individual and use that as the IMM predicted source assignment. Then, for each co-variance matrix prior (panels), we plot the percent of individuals from each source (Actual Source) assigned to each possible source by the IMM (Predicted Source).

Just as before, when we looked at data on an individual level, we generally see IMM assignment to correct sources, but, depending on the covariance used, MBR and GB are mostly confused with DB, and DB is confused with GB. Maximum percentage correctly assigned was ~ 88% for FBE though.
Effects of Source and Coviariance Matrix Prior on Correct Assignment
To understand what is driving misclassification by the IMM, we test the effects of Actual Source, Co-variance Prior, and their interaction with a GLM (family=binomial, link=log), using individual nested within actual source as a random effect.
Analysis of Deviance Table (Type III Wald chisquare tests)
Response: Correct
Chisq Df Pr(>Chisq)
(Intercept) 0.9668 1 0.325467
Actual_Source 17.3475 4 0.001654 **
Cov_Prior 15.9057 3 0.001186 **
Actual_Source:Cov_Prior 44.2806 12 1.368e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
We find that a juveniles’s actual source interacts with the covariance used to affect correct classifications.
We can use the regression coefficient summaries for a more in-depth look.
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [glmerMod]
Family: binomial ( logit )
Formula: Correct ~ Actual_Source * Cov_Prior + (1 | Actual_Source/Individual_Code)
Data: leave.one.out.results.byind.assignment.table
Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 20000))
AIC BIC logLik deviance df.resid
404.7 499.5 -180.4 360.7 526
Scaled residuals:
Min 1Q Median 3Q Max
-28.9230 -0.0205 0.0143 0.0461 25.5696
Random effects:
Groups Name Variance Std.Dev.
Individual_Code:Actual_Source (Intercept) 3.751e+01 6.124e+00
Actual_Source (Intercept) 3.435e-15 5.861e-08
Number of obs: 548, groups: Individual_Code:Actual_Source, 137; Actual_Source, 5
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.4624 1.4873 -0.983 0.325467
Actual_SourceFBE 9.8616 3.0361 3.248 0.001162 **
Actual_SourceGB 4.4980 2.0893 2.153 0.031331 *
Actual_SourceMBR 8.6472 2.5131 3.441 0.000580 ***
Actual_SourcePHB 7.5958 2.1069 3.605 0.000312 ***
Cov_PriorSource_and_ID 5.8002 1.6774 3.458 0.000544 ***
Cov_PriorSource_and_Universal 5.8002 1.6775 3.458 0.000545 ***
Cov_PriorUniversal -0.8929 0.9713 -0.919 0.357924
Actual_SourceFBE:Cov_PriorSource_and_ID -5.8002 3.0633 -1.893 0.058294 .
Actual_SourceGB:Cov_PriorSource_and_ID -12.9372 2.5655 -5.043 4.59e-07 ***
Actual_SourceMBR:Cov_PriorSource_and_ID -20.8495 4.0346 -5.168 2.37e-07 ***
Actual_SourcePHB:Cov_PriorSource_and_ID -5.1599 2.0087 -2.569 0.010207 *
Actual_SourceFBE:Cov_PriorSource_and_Universal -8.0393 3.1013 -2.592 0.009536 **
Actual_SourceGB:Cov_PriorSource_and_Universal -12.5134 2.5307 -4.945 7.63e-07 ***
Actual_SourceMBR:Cov_PriorSource_and_Universal -20.8495 4.0349 -5.167 2.37e-07 ***
Actual_SourcePHB:Cov_PriorSource_and_Universal -5.8002 1.9956 -2.906 0.003655 **
Actual_SourceFBE:Cov_PriorUniversal 0.8929 2.7411 0.326 0.744604
Actual_SourceGB:Cov_PriorUniversal 1.3311 1.3566 0.981 0.326494
Actual_SourceMBR:Cov_PriorUniversal -0.3952 1.9531 -0.202 0.839635
Actual_SourcePHB:Cov_PriorUniversal 1.5333 1.5010 1.021 0.307028
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Relative to the intercept (reflecting the DB source and using the ID co-variance matrix), it seems that, generally, using the ID co-variance matrix, or the universal covariance matrix, give better assignments than integrating source specific covariance-matrices.
Results by Covariance Matrix Prior
If we wanted to look at the effect of different co-variance matrices in more detail, we again see that, generally, using the ID or University co-variance matrices leads to the best assignments.

Taken together, the results suggest that for best assignment, we should run the IMM with ID or universal co-variance priors, which is somewhat different than what the larval data suggested (that using source-specific covariance matrices is better). Taking these IMM assignments and projecting the correct and incorrect assignments onto the PCA from before, we see that where there is multivariate overlap in geochemistry, individuals are misassigned.

Overall, we learn that ID or universal co-variance matrices produce better IMM results when assigning juveniles, and that IMM misclassifications are mostly confined to the mutivariate overlap in geochemistry.
LS0tCnRpdGxlOiAiSW5maW5pdGUgTWl4dHVyZSBNb2RlbCBMZWF2ZS1PbmUtT3V0IEFuYWx5c2lzIGZvciAqTXl0aWx1cyBlZHVsaXMqIEp1dmVuaWxlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoInBseXIiKQpsaWJyYXJ5KCJhYmluZCIpCmxpYnJhcnkoInJlc2hhcGUiKQpsaWJyYXJ5KCJnZ3Bsb3QyIikKbGlicmFyeSgiY2FyIikKbGlicmFyeSgibG1lNCIpCmxpYnJhcnkoImdnZm9ydGlmeSIpCgojIyMgc29tZSBlbGVtZW50IGRhdGEKCklDUE1TLmFsbC4yMDE1LmRhdDwtcmVhZC5jc3YoIi9Vc2Vycy9zY290dG1vcmVsbG8vRHJvcGJveC9BcmNoaXZlcy9BY2FkZW1pYy9VTWFzcyBCb3N0b24vRXR0ZXIgTGFiL1Byb2plY3RzL1RyYWNlIEVsZW1lbnQgTXVzc2VsIENvbm5lY3Rpdml0eS8yMDE1IElDUE1TIERhdGFzZXRzLzIwMTUuQWxsLkRhdGEuY3N2IikKCklDUE1TLmFsbC4yMDE1Lmp1dmRhdDwtc3Vic2V0KElDUE1TLmFsbC4yMDE1LmRhdCxUeXBlPT0iSnV2ZW5pbGUiKQp0b3Auc291cmNlczwtbmFtZXMoc29ydChzdW1tYXJ5KElDUE1TLmFsbC4yMDE1Lmp1dmRhdCRTaXRlKSxkZWNyZWFzaW5nID0gVFJVRSkpWzE6NV0KSUNQTVMuYWxsLjIwMTUuanV2ZGF0PC1zdWJzZXQoSUNQTVMuYWxsLjIwMTUuanV2ZGF0LFNpdGU9PXRvcC5zb3VyY2VzWzFdfFNpdGU9PXRvcC5zb3VyY2VzWzJdfFNpdGU9PXRvcC5zb3VyY2VzWzNdfFNpdGU9PXRvcC5zb3VyY2VzWzRdfFNpdGU9PXRvcC5zb3VyY2VzWzVdKQpJQ1BNUy5hbGwuMjAxNS5qdXZkYXQkU2l0ZTwtZmFjdG9yKElDUE1TLmFsbC4yMDE1Lmp1dmRhdCRTaXRlKQpJQ1BNUy5hbGwuMjAxNS5qdXZkYXQuZW52PC1JQ1BNUy5hbGwuMjAxNS5qdXZkYXRbLGMoMTo0KV0KSUNQTVMuYWxsLjIwMTUuanV2ZGF0LnZhbDwtSUNQTVMuYWxsLjIwMTUuanV2ZGF0WywtYygxOjQpXQpJQ1BNUy5hbGwuMjAxNS5qdXZkYXQudmFsLnRyYW5zPC1sb2coSUNQTVMuYWxsLjIwMTUuanV2ZGF0LnZhbCsxLDEwKQoKCmxlYXZlLm9uZS5vdXQucmVzdWx0czwtcmVhZFJEUygiL1VzZXJzL3Njb3R0bW9yZWxsby9Ecm9wYm94L0FyY2hpdmVzL0FjYWRlbWljL1VNYXNzIEJvc3Rvbi9FdHRlciBMYWIvUHJvamVjdHMvVHJhY2UgRWxlbWVudCBNdXNzZWwgQ29ubmVjdGl2aXR5L1IgV29yay9JbmZpbml0ZSBNaXh0dXJlIE1vZGVsIGluIFIvSmFnc19Xb3JrL2xlYXZlb25lb3V0cmVzdWx0c0p1di5yZHMiKQoKYGBgCiMjIFRoZSBBbmFseXNpcwogIFRoZSBmb2xsb3dpbmcgYW5hbHlzaXMgcHVsbGVkIGdlb2NoZW1pc3RyeSBkYXRhIGZyb20gc2hlbGxzIG9mIGp1dmVuaWxlIG11c3NlbHMgcmFzaWVkIGluIHNlcGFyYXRlIGJheXMgaW4gZWFzdGVybiBNYWluZSBpbiAyMDE1IChhbG9uZyBzaWRlIHRoZSBsYXJ2YWUgZnJvbSB0aGUgcHJldmlvdXMgYW5hbHlzaXMpLCBhbmQgdGVzdGVkIHRoZSBlZmZlY3RzIG9mIHNvdXJjZSAoYmF5KSwgYW5kIGNvLXZhcmlhbmNlIG1hdHJpeCBwcmlvciwgb24gdGhlIGFiaWxpdHkgb2YgdGhlIGluZmluaXRlIG1peHR1cmUgbW9kZWwgKElNTSkgdG8gY29ycmVjdGx5IGFzc2lnbiBqdXZlbmlsZSBjaGVtaXN0cnkgdG8gc291cmNlcy4gRHVyaW5nIGFuYWx5c2lzLCBlYWNoIGp1dmVuaWxlIHdhcyByZW1vdmVkIGZyb20gdGhlIG92ZXJhbGwgZGF0YSBzZXQsIGFuZCB0aGUgcmVtYWluaW5nIGp1dmVuaWxlcyB1c2VkIGFzIGJhc2VsaW5lIGRhdGEgdG8gdHJhaW4gdGhlIElNTS4gVGhlIGluZGl2aWR1YWwganV2ZW5pbGUgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhIHNldCB3YXMgdGhlbiBhc3NpZ25lZCB0byBhIHNvdXJjZSBiYXNlZCBvbiB0aGUgSU1NLCBhbGxvd2luZyBmb3IgNyBwb3NzaWJsZSBleHRyYSwgYW5kIHVudHJhaW5lZCwgc291cmNlIGFzc2lnbm1lbnRzLCB1c2luZyBlYWNoIG9mIGZvdXIgZGlmZmVyZW50IGNvLXZhcmlhbmNlIG1hdHJpeCBwcmlvcnM6CgoqIFRoZSBJZGVudGl0eSBNYXRyaXggZm9yIGFsbCBzb3VyY2VzCiogU291cmNlIFNwZWNpZmljIENvLXZhcmlhbmNlIE1hdHJpY2VzIGZvciBiYXNlbGluZSBzb3VyY2VzLCBhbmQgdGhlbiB0aGUgSWRlbnRpdHkgTWF0cml4IGZvciBleHRyYSBzb3VyY2VzCiogU291cmNlIFNwZWNpZmljIENvLXZhcmlhbmNlIE1hdHJpY2VzIGZvciBiYXNlbGluZSBzb3VyY2VzLCBhbmQgdGhlbiB0aGUgVW5pdmVyc2FsIENvLXZhcmlhbmNlIE1hdHJpeCBmb3IgZXh0cmEgc291cmNlcwoqIFRoZSBVbml2ZXJzYWwgQ28tdmFyaWFuY2UgTWF0cml4IGZvciBhbGwgc291cmNlcwoKRm9yIGVhY2ggY28tdmFyaWFuY2UgbWF0cml4IHByaW9yIGZvciBlYWNoIGp1dmVuaWxlLCB0aGUgSU1NIHdhcyBydW4gZm9yIGFuIGluaXRpYWwgMTAwMCBhZGFwdGF0aW9uIGFuZCAyMDAwIGJ1cm4taW4gaXRlcmF0aW9ucy4gVGhlIHBvc3RlcmlvciBkaXN0cmlidXRpb24gb2Ygc291cmNlIGFzc2lnbm1lbnRzIGZvciBhIGZpbmFsIDMwMDAgaXRlcmF0aW9ucyB3ZXJlIHJldGFpbmVkIGFuZCB1c2VkIGZvciBmdXJ0aGVyIGFuYWx5c2lzLgoKCiMjIFRoZSBEYXRhIFNldAoKICBEYXRhIHdlcmUgJExvZyh4KzEpJCB0cmFuc2Zvcm1lZCwgYW5kIGNlbnRlcmVkIChieSBlbGVtZW50YWwgbWVhbikgYW5kIHNjYWxlZCAoYnkgZWxlbWVudGFsIHN0YW5kYXJkIGRldmlhdGlvbikgcHJpb3IgdG8gYW5hbHlzaXMuIFRvZ2V0aGVyLCB0aGVzZSB0cmFuc2Zvcm1hdGlvbnMgd2VyZSBtZWFudCB0byBub3JtYWxpemUgdGhlIGVsZW1lbnRhbCBkYXRhLCBhbmQgdGhlbiBzdGFuZGFyZGl6ZSB0aGUgY2VudGVyIGFuZCB2YXJpYW5jZSBzbyB0aGF0IHVua25vd24gc291cmNlcyBjb3VsZCBiZSBlYXNpbHkgbW9kZWxlZCBpbiB0aGUgSU1NLiBQcmluY2lwYWwgQ29tcG9uZW50IEFuYWx5c2lzIHN1Z2dlc3RlZCBhIGxvdCBvZiBvdmVybGFwIGluIHRoZSBtdWx0aXZhcmlhdGUgZ2VvY2hlbWljYWwgc2lnbmFscyBhbW9uZyBzb3VyY2VzIGFsb25nIHRoZSBmaXJzdCAyIHByaW5jaXBsZSBjb21wb25lbnRzIChhY2NvdW50aW5nIGZvciA3MiBhbmQgMTIgcGVyY2VudCBvZiB0b3RhbCB2YXJpYXRpb24gcmVzcGVjdGl2ZWx5KS4gT2YgYWxsIGVsZW1lbnRzLCAqKk1uKiogYW5kICoqQ28qKiBhY2NvdW50ZWQgZm9yIHRoZSBtb3N0IHZhcmlhdGlvbiBhbW9uZyBpbmRpdmlkdWFsIGxhcnZhZSwgd2hpbGUgKipMYSoqIGFjY291bnRlZCBmb3IgdGhlIGxlYXN0LgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0yLCBmaWcud2lkdGg9MywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmF1dG9wbG90KHByY29tcChJQ1BNUy5hbGwuMjAxNS5qdXZkYXQudmFsLnRyYW5zKSwgCiAgICAgICAgIGRhdGEgPSBJQ1BNUy5hbGwuMjAxNS5qdXZkYXQuZW52LCAKICAgICAgICAgY29sb3VyID0gIlNpdGUiLAogICAgICAgICBsb2FkaW5ncyA9IFRSVUUsCiAgICAgICAgIGxvYWRpbmdzLmxhYmVsID0gVFJVRSwKICAgICAgICAgZnJhbWUgPSBUUlVFLCAKICAgICAgICAgZnJhbWUudHlwZSA9ICdub3JtJykrCiAgdGhlbWVfYncoKQpgYGAKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnN1bW1hcnkocHJjb21wKElDUE1TLmFsbC4yMDE1Lmp1dmRhdC52YWwudHJhbnMpKQpgYGAKCgojIyBSZXN1bHRzIGJ5IEluZGl2aWR1YWwKCiAgQmVsb3cgYXJlIHRoZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uIHJlc3VsdHMgb2YgdGhlIElNTSBhc3NpZ25tZW50IGZvciBlYWNoIGluZGl2aWR1YWwganV2ZW5pbGVzIChjb2xvcikgdG8gZWFjaCBwb3RlbnRpYWwgc291cmNlICh4LWF4aXM7IG51bWJlcnMgcmVwcmVzZW50IHBvc3NpYmxlIGV4dHJhIHNvdXJjZXMpLiBSZXN1bHRzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlIGFjdHVhbCBqdXZlbmlsZSBzb3VyY2UgKHBhbmVsIHJvd3MpIGFuZCB0aGUgY28tdmFyaWFuY2UgbWF0cml4IHByaW9yIHVzZWQgaW4gdGhlIElNTSAocGFuZWwgY29sdW1ucykuCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGU8LW1lbHQobGVhdmUub25lLm91dC5yZXN1bHRzLGlkLnZhcnM9YygiSW5kaXZpZHVhbCIsIkNvdl9QcmlvciIsIkFjdHVhbCIpKQpjb2xuYW1lcyhsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUpWzM6NV08LWMoIkFjdHVhbF9Tb3VyY2UiLCJQcmVkaWN0ZWRfU291cmNlIiwiUGVyY2VudF9Bc3NpZ25tZW50IikKCmxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC50YWJsZSRQcmVkaWN0ZWRfU291cmNlPC1mYWN0b3IobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlJFByZWRpY3RlZF9Tb3VyY2UpCmxldmVscyhsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUkUHJlZGljdGVkX1NvdXJjZSk8LWMobGV2ZWxzKElDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnZbc2FtcGluZCwiU2l0ZSJdKSxjKHJlZnNpdGUubisxOmV4dHJhc2l0ZS5uKSkKCmxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC50YWJsZSRBY3R1YWxfU291cmNlPC1mYWN0b3IobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlJEFjdHVhbF9Tb3VyY2UpCmxldmVscyhsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUkQWN0dWFsX1NvdXJjZSk8LWMobGV2ZWxzKElDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnZbc2FtcGluZCwiU2l0ZSJdKSxjKHJlZnNpdGUubisxOmV4dHJhc2l0ZS5uKSkKCgpjb2xvdXIudmVjPC1yYWluYm93KG1heChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUkSW5kaXZpZHVhbCksIHM9LjYsIHY9LjkpW3NhbXBsZShjKDE6bWF4KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC50YWJsZSRJbmRpdmlkdWFsKSksbWF4KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC50YWJsZSRJbmRpdmlkdWFsKSldCmNvbG91ci52ZWM8LWNvbG91ci52ZWNbbWF0Y2gobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlJEluZGl2aWR1YWwsYygxOm1heChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQudGFibGUkSW5kaXZpZHVhbCkpKV0KCgpnZ3Bsb3QobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlLGFlcyh4PVByZWRpY3RlZF9Tb3VyY2UsZ3JvdXA9SW5kaXZpZHVhbCx5PVBlcmNlbnRfQXNzaWdubWVudCxjb2xvdXI9ZmFjdG9yKEluZGl2aWR1YWwpKSkrCiAgICBmYWNldF9ncmlkKEFjdHVhbF9Tb3VyY2V+Q292X1ByaW9yKSsKICAgIGdlb21fbGluZSgpICsgCiAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbG91ci52ZWMpKwogICAgdGhlbWVfYncoKSsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksbGVnZW5kLnBvc2l0aW9uPSJub25lIikKYGBgCldlIGNhbiBzZWUgdGhhdCBnZW5lcmFsbHksIGluZGl2aWR1YWwgc291cmNlcyBhc3NpZ24gbW9zdCBmcmVxdWVudGx5IHRvIG9uZSBzb3VyY2UsIHdoaWNoIGlzIHVzdWFsbHkgdGhlIGNvcnJlY3Qgb25lLiBEZXBlbmRpbmcgb24gdGhlIGNvdmFyaWFuY2UgdXNlZCwgc291cmNlcyBsaWtlIE1CUiwgR0IgYW5kIERCIGFyZSBtb3JlIG11bHRpLW1vZGFsIGFuZCBkaWZmdXNlIGluIHRoZWlyIGFzc2lnbm1lbnRzIHRob3VnaC4KCgojIyBSZXN1bHRzIGJ5IFNvdXJjZQoKVG8gc3VtbWFyaXplIGFzc2lnbm1lbnQgcmVzdWx0cyBieSBzaXRlLCB3ZSB0YWtlIHRoZSBtb2RlIHNvdXJjZSBhc3NpZ25tZW50IGZvciBlYWNoIGluZGl2aWR1YWwgYW5kIHVzZSB0aGF0IGFzIHRoZSBJTU0gcHJlZGljdGVkIHNvdXJjZSBhc3NpZ25tZW50LiBUaGVuLCBmb3IgZWFjaCBjby12YXJpYW5jZSBtYXRyaXggcHJpb3IgKHBhbmVscyksIHdlIHBsb3QgdGhlIHBlcmNlbnQgb2YgaW5kaXZpZHVhbHMgZnJvbSBlYWNoIHNvdXJjZSAoQWN0dWFsIFNvdXJjZSkgYXNzaWduZWQgdG8gZWFjaCBwb3NzaWJsZSBzb3VyY2UgYnkgdGhlIElNTSAoUHJlZGljdGVkIFNvdXJjZSkuCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEsIGZpZy53aWR0aD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudDwtZGRwbHkobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLnRhYmxlLC4oSW5kaXZpZHVhbCxDb3ZfUHJpb3IsQWN0dWFsX1NvdXJjZSksc3VtbWFyaXplLFByZWRpY3RlZF9Tb3VyY2U9d2hpY2gubWF4KFBlcmNlbnRfQXNzaWdubWVudCkpCmxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50JFByZWRpY3RlZF9Tb3VyY2U8LWZhY3RvcihsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudCRQcmVkaWN0ZWRfU291cmNlKQpsZXZlbHMobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQkUHJlZGljdGVkX1NvdXJjZSk8LWMobGV2ZWxzKElDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnZbc2FtcGluZCwiU2l0ZSJdKSxjKHJlZnNpdGUubisxOmV4dHJhc2l0ZS5uKSlbMTpsZW5ndGgodW5pcXVlKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50JFByZWRpY3RlZF9Tb3VyY2UpKV0KCiNJRApJRC5hc3NpZ24udGFibGU8LSh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iSUQiKVssYygzOjQpXSkvcm93U3Vtcyh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iSUQiKVssYygzOjQpXSkpKVtjKDE6NSksXQoKI1NvdXJjZV9hbmRfSUQKU291cmNlX2FuZF9JRC5hc3NpZ24udGFibGU8LSh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iU291cmNlX2FuZF9JRCIpWyxjKDM6NCldKS9yb3dTdW1zKHRhYmxlKHN1YnNldChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudCxDb3ZfUHJpb3I9PSJTb3VyY2VfYW5kX0lEIilbLGMoMzo0KV0pKSlbYygxOjUpLF0KCiNTb3VyY2VfYW5kX1VuaXZlcnNhbApTb3VyY2VfYW5kX1VuaXZlcnNhbC5hc3NpZ24udGFibGU8LSh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iU291cmNlX2FuZF9Vbml2ZXJzYWwiKVssYygzOjQpXSkvcm93U3Vtcyh0YWJsZShzdWJzZXQobGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQsQ292X1ByaW9yPT0iU291cmNlX2FuZF9Vbml2ZXJzYWwiKVssYygzOjQpXSkpKVtjKDE6NSksXQoKI1VuaXZlcnNhbApVbml2ZXJzYWwuYXNzaWduLnRhYmxlPC0odGFibGUoc3Vic2V0KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LENvdl9Qcmlvcj09IlVuaXZlcnNhbCIpWyxjKDM6NCldKS9yb3dTdW1zKHRhYmxlKHN1YnNldChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudCxDb3ZfUHJpb3I9PSJVbml2ZXJzYWwiKVssYygzOjQpXSkpKVtjKDE6NSksXQoKbGVhdmUub25lLm91dC5yZXN1bHRzLmFsbC5hc3NpZ25tZW50PC1jYmluZChkYXRhLmZyYW1lKENvdl9Qcmlvcj1yZXAoYygiSUQiLCJTb3VyY2VfYW5kX0lEIiwiU291cmNlX2FuZF9Vbml2ZXJzYWwiLCJVbml2ZXJzYWwiKSxlYWNoPTUpLEFjdHVhbF9Tb3VyY2U9cmVwKHJvdy5uYW1lcyhJRC5hc3NpZ24udGFibGUpLDQpKSxyYmluZChJRC5hc3NpZ24udGFibGUsU291cmNlX2FuZF9JRC5hc3NpZ24udGFibGUsU291cmNlX2FuZF9Vbml2ZXJzYWwuYXNzaWduLnRhYmxlLFVuaXZlcnNhbC5hc3NpZ24udGFibGUpKQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYWxsLmFzc2lnbm1lbnQ8LW1lbHQobGVhdmUub25lLm91dC5yZXN1bHRzLmFsbC5hc3NpZ25tZW50KQpjb2xuYW1lcyhsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYWxsLmFzc2lnbm1lbnQpWzM6NF08LWMoIlByZWRpY3RlZF9Tb3VyY2UiLCJQZXJjZW50X0Fzc2lnbmVkIikKCgpnZ3Bsb3QobGVhdmUub25lLm91dC5yZXN1bHRzLmFsbC5hc3NpZ25tZW50LGFlcyh4PVByZWRpY3RlZF9Tb3VyY2UseT1BY3R1YWxfU291cmNlLGZpbGw9UGVyY2VudF9Bc3NpZ25lZCkpKwogIGZhY2V0X3dyYXAofkNvdl9QcmlvcixuY29sPTQpKwogIGdlb21fdGlsZShjb2xvdXIgPSAid2hpdGUiKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiLGxpbWl0cz1jKDAsMSkpKwogIHRoZW1lX2J3KCkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKYGBgCkp1c3QgYXMgYmVmb3JlLCB3aGVuIHdlIGxvb2tlZCBhdCBkYXRhIG9uIGFuIGluZGl2aWR1YWwgbGV2ZWwsIHdlIGdlbmVyYWxseSBzZWUgSU1NIGFzc2lnbm1lbnQgdG8gY29ycmVjdCBzb3VyY2VzLCBidXQsIGRlcGVuZGluZyBvbiB0aGUgY292YXJpYW5jZSB1c2VkLCBNQlIgYW5kIEdCIGFyZSBtb3N0bHkgY29uZnVzZWQgd2l0aCBEQiwgYW5kIERCIGlzIGNvbmZ1c2VkIHdpdGggR0IuIE1heGltdW0gcGVyY2VudGFnZSBjb3JyZWN0bHkgYXNzaWduZWQgd2FzIH4gODglIGZvciBGQkUgdGhvdWdoLgoKCiMjIEVmZmVjdHMgb2YgU291cmNlIGFuZCBDb3ZpYXJpYW5jZSBNYXRyaXggUHJpb3Igb24gQ29ycmVjdCBBc3NpZ25tZW50CgpUbyB1bmRlcnN0YW5kIHdoYXQgaXMgZHJpdmluZyBtaXNjbGFzc2lmaWNhdGlvbiBieSB0aGUgSU1NLCB3ZSB0ZXN0IHRoZSBlZmZlY3RzIG9mIEFjdHVhbCBTb3VyY2UsIENvLXZhcmlhbmNlIFByaW9yLCBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aCBhIEdMTSAoZmFtaWx5PWJpbm9taWFsLCBsaW5rPWxvZyksIHVzaW5nIGluZGl2aWR1YWwgbmVzdGVkIHdpdGhpbiBhY3R1YWwgc291cmNlIGFzIGEgcmFuZG9tIGVmZmVjdC4KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LnRhYmxlPC1sZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudApsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSRDb3JyZWN0PC1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSRBY3R1YWxfU291cmNlKT09YXMuY2hhcmFjdGVyKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LnRhYmxlJFByZWRpY3RlZF9Tb3VyY2UpKQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSRJbmRpdmlkdWFsX0NvZGU8LXBhc3RlMChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSRBY3R1YWxfU291cmNlLGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LnRhYmxlJEluZGl2aWR1YWwpCgpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50LmxtMjwtZ2xtZXIoQ29ycmVjdH5BY3R1YWxfU291cmNlKkNvdl9QcmlvcisoMXxBY3R1YWxfU291cmNlL0luZGl2aWR1YWxfQ29kZSksZGF0YT1sZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSxmYW1pbHk9Ymlub21pYWwpCnNzIDwtIGdldE1FKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQubG0yLGMoInRoZXRhIiwiZml4ZWYiKSkKbGVhdmUub25lLm91dC5yZXN1bHRzLmNvcnJlY3QuYXNzaWdubWVudC5sbTwtdXBkYXRlKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQubG0yLHN0YXJ0PXNzLGNvbnRyb2w9Z2xtZXJDb250cm9sKG9wdGltaXplcj0iYm9ieXFhIixvcHRDdHJsPWxpc3QobWF4ZnVuPTJlNCkpKQpBbm92YShsZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50LmxtLHR5cGU9MykKYGBgCldlIGZpbmQgdGhhdCBhIGp1dmVuaWxlcydzIGFjdHVhbCBzb3VyY2UgaW50ZXJhY3RzIHdpdGggdGhlIGNvdmFyaWFuY2UgdXNlZCB0byBhZmZlY3QgY29ycmVjdCBjbGFzc2lmaWNhdGlvbnMuCgpXZSBjYW4gdXNlIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IHN1bW1hcmllcyBmb3IgYSBtb3JlIGluLWRlcHRoIGxvb2suCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdW1tYXJ5KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQubG0pCmBgYApSZWxhdGl2ZSB0byB0aGUgaW50ZXJjZXB0IChyZWZsZWN0aW5nIHRoZSBEQiBzb3VyY2UgYW5kIHVzaW5nIHRoZSBJRCBjby12YXJpYW5jZSBtYXRyaXgpLCBpdCBzZWVtcyB0aGF0LCBnZW5lcmFsbHksIHVzaW5nIHRoZSBJRCBjby12YXJpYW5jZSBtYXRyaXgsIG9yIHRoZSB1bml2ZXJzYWwgY292YXJpYW5jZSBtYXRyaXgsIGdpdmUgYmV0dGVyIGFzc2lnbm1lbnRzIHRoYW4gaW50ZWdyYXRpbmcgc291cmNlIHNwZWNpZmljIGNvdmFyaWFuY2UtbWF0cmljZXMuCgoKIyMgUmVzdWx0cyBieSBDb3ZhcmlhbmNlIE1hdHJpeCBQcmlvcgpJZiB3ZSB3YW50ZWQgdG8gbG9vayBhdCB0aGUgZWZmZWN0IG9mIGRpZmZlcmVudCBjby12YXJpYW5jZSBtYXRyaWNlcyBpbiBtb3JlIGRldGFpbCwgd2UgYWdhaW4gc2VlIHRoYXQsIGdlbmVyYWxseSwgdXNpbmcgdGhlIElEIG9yIFVuaXZlcnNpdHkgY28tdmFyaWFuY2UgbWF0cmljZXMgbGVhZHMgdG8gdGhlIGJlc3QgYXNzaWdubWVudHMuCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD00LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50PC1kZHBseShsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC50YWJsZSwuKENvdl9QcmlvcixBY3R1YWxfU291cmNlKSxzdW1tYXJpemUsQ29ycmVjdGx5X0Fzc2lnbmVkPXN1bShDb3JyZWN0KSxUb3RhbD1sZW5ndGgoQ29ycmVjdCkpCmxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQkUGVyY2VudF9Db3JyZWN0PC1sZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50JENvcnJlY3RseV9Bc3NpZ25lZC9sZWF2ZS5vbmUub3V0LnJlc3VsdHMuY29ycmVjdC5hc3NpZ25tZW50JFRvdGFsCgoKZ2dwbG90KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5jb3JyZWN0LmFzc2lnbm1lbnQsYWVzKHg9QWN0dWFsX1NvdXJjZSx5PVBlcmNlbnRfQ29ycmVjdCxmaWxsPUNvdl9QcmlvcikpKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iixwb3NpdGlvbj0iZG9kZ2UiKSsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lPSJDb3ZhcmlhbmNlIFByaW9yIixicmVha3M9YygiSUQiLCAiU291cmNlX2FuZF9JRCIsIlNvdXJjZV9hbmRfVW5pdmVyc2FsIiwiVW5pdmVyc2FsIiksbGFiZWxzPWMoIklkZW50aXR5IE1hdHJpeCIsICJTb3VyY2UgU3BlY2lmaWMgQ292YXJpYW5jZSxcbnRoZW4gSWRlbnRpdHkgTWF0cmljZXMiLCJTb3VyY2UgU3BlY2lmaWMgQ292YXJpYW5jZSxcbnRoZW4gVW5pdmVyc2FsIENvdmFyaWFuY2UgTWF0cmljZXMiLCJVbml2ZXJzYWwgQ292YXJpYW5jZSBNYXRyaXgiKSkrCiAgeGxhYigiQWN0dWFsIFNvdXJjZSIpKwogIHlsYWIoIlBlcmNlbnQgQ29ycmVjdGx5IEFzc2lnbmVkIikrCiAgdGhlbWVfYncoKQpgYGAKClRha2VuIHRvZ2V0aGVyLCB0aGUgcmVzdWx0cyBzdWdnZXN0IHRoYXQgZm9yIGJlc3QgYXNzaWdubWVudCwgd2Ugc2hvdWxkIHJ1biB0aGUgSU1NIHdpdGggSUQgb3IgdW5pdmVyc2FsIGNvLXZhcmlhbmNlIHByaW9ycywgd2hpY2ggaXMgc29tZXdoYXQgZGlmZmVyZW50IHRoYW4gd2hhdCB0aGUgbGFydmFsIGRhdGEgc3VnZ2VzdGVkICh0aGF0IHVzaW5nIHNvdXJjZS1zcGVjaWZpYyBjb3ZhcmlhbmNlIG1hdHJpY2VzIGlzIGJldHRlcikuIFRha2luZyB0aGVzZSBJTU0gYXNzaWdubWVudHMgYW5kIHByb2plY3RpbmcgdGhlIGNvcnJlY3QgYW5kIGluY29ycmVjdCBhc3NpZ25tZW50cyBvbnRvIHRoZSBQQ0EgZnJvbSBiZWZvcmUsIHdlIHNlZSB0aGF0IHdoZXJlIHRoZXJlIGlzIG11bHRpdmFyaWF0ZSBvdmVybGFwIGluIGdlb2NoZW1pc3RyeSwgaW5kaXZpZHVhbHMgYXJlIG1pc2Fzc2lnbmVkLgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0yLCBmaWcud2lkdGg9MywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQuY29ycmVjdDwtc3Vic2V0KGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LnRhYmxlLENvdl9Qcmlvcj09IlNvdXJjZV9hbmRfVW5pdmVyc2FsIikKbGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQuY29ycmVjdCRDb3JyZWN0W3doaWNoKGxlYXZlLm9uZS5vdXQucmVzdWx0cy5ieWluZC5hc3NpZ25tZW50LmNvcnJlY3QkQ29ycmVjdD09MSldPC0iQ29ycmVjdCIKbGVhdmUub25lLm91dC5yZXN1bHRzLmJ5aW5kLmFzc2lnbm1lbnQuY29ycmVjdCRDb3JyZWN0Wy13aGljaChsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC5jb3JyZWN0JENvcnJlY3Q9PSJDb3JyZWN0IildPC0iSW5jb3JyZWN0IgoKCklDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnYyPC1JQ1BNUy5hbGwuMjAxNS5qdXZkYXQuZW52CklDUE1TLmFsbC4yMDE1Lmp1dmRhdC5lbnYyJENvcnJlY3Q8LWZhY3RvcihsZWF2ZS5vbmUub3V0LnJlc3VsdHMuYnlpbmQuYXNzaWdubWVudC5jb3JyZWN0JENvcnJlY3QpCgphdXRvcGxvdChwcmNvbXAoSUNQTVMuYWxsLjIwMTUuanV2ZGF0LnZhbC50cmFucyksIAogICAgICAgICBkYXRhID0gSUNQTVMuYWxsLjIwMTUuanV2ZGF0LmVudjIsIAogICAgICAgICBjb2xvdXIgPSAiU2l0ZSIsCiAgICAgICAgIHNoYXBlPSJDb3JyZWN0IiwKICAgICAgICAgbG9hZGluZ3MgPSBUUlVFLAogICAgICAgICBsb2FkaW5ncy5sYWJlbCA9IFRSVUUsCiAgICAgICAgIGZyYW1lID0gVFJVRSwgCiAgICAgICAgIGZyYW1lLnR5cGUgPSAnbm9ybScpKwogIHRoZW1lX2J3KCkKYGBgCgpPdmVyYWxsLCB3ZSBsZWFybiB0aGF0IElEIG9yIHVuaXZlcnNhbCBjby12YXJpYW5jZSBtYXRyaWNlcyBwcm9kdWNlIGJldHRlciBJTU0gcmVzdWx0cyB3aGVuIGFzc2lnbmluZyBqdXZlbmlsZXMsIGFuZCB0aGF0IElNTSBtaXNjbGFzc2lmaWNhdGlvbnMgYXJlIG1vc3RseSBjb25maW5lZCB0byB0aGUgbXV0aXZhcmlhdGUgb3ZlcmxhcCBpbiBnZW9jaGVtaXN0cnku