Great job, Lillian! I did a bit of basic coding and data cleaning to
prep for our meeting tomorrow. Im going to share that with you. We can
adapt this in any way that you want, this was just to get us thinking
about your results. We will go over it line by line together as well.
Feel free to do more if you would like. Coding isnt really part of the
SMP, so it’s not something I make you do, but you should understand what
was done.
You should be really excited about these results because you didn’t
just show that bacteria become resistant… you actually captured how that
process happens over time. Your data clearly show that resistance
evolves in very different ways depending on the antibiotic. Ampicillin
resistance appeared almost immediately, jumping to very high levels,
while kanamycin resistance increased more gradually and was much more
variable. That contrast is not something everyone gets, and it points to
real biological differences in how these drugs interact with cells and
how bacteria adapt to them.
What makes your project especially strong is that all of your
measurements tell the same story from different angles. The MIC data,
growth scores, dose-response curves, and disk diffusion assays all line
up and reinforce each other, which is exactly what you want in a solid
scientific study. You also captured the process of adaptation, not just
the endpoint, which is a much deeper level of analysis. This puts you in
a great position to not only explain what happened, but to start asking
why it happened.
Data Cleansing
names(disc)
[1] "Timepoint" "Plate" "Disc" "Radius"
[5] "Radius.1"
Figure 1 (MOST IMPORTANT): Resistance Trajectories “Amp resistance
evolved extremely rapidly, exceeding our measurement range within one
week”
p1 <- ggplot(mic, aes(x = Week, y = `log2(MIC)`, color = `Culture`, group = `Culture`)) +
geom_line(linewidth = 1) +
geom_point(aes(shape = Censored), size = 3) +
scale_shape_manual(values = c(`FALSE` = 16, `TRUE` = 17)) +
labs(
title = "Resistance trajectories over time",
x = "Week",
y = expression(log[2]*"(MIC90, µg/mL)"),
color = "Culture",
shape = "At assay ceiling"
) +
theme_classic(base_size = 14)
p1

Figure 3: Growth Under Selection
p3 <- ggplot(pass, aes(x = Passage, y = Growth.Score, color = Antibiotic, group = Line)) +
geom_line(alpha = 0.8, linewidth = 0.9) +
geom_point(size = 2) +
labs(
title = "Growth scores during serial passaging",
x = "Passage",
y = "Growth score",
color = "Antibiotic"
) +
theme_classic(base_size = 14)
p3

Figure 4: Antibiotic Concentration Over Time
p4 <- ggplot(pass, aes(x = Passage, y = Conc.Num, color = Antibiotic, group = Line)) +
geom_step(alpha = 0.8, linewidth = 0.9) +
geom_point(size = 2) +
scale_y_log10() +
labs(
title = "Selection pressure during serial passaging",
x = "Passage",
y = expression("Concentration ("*mu*"g/mL, log scale)"),
color = "Antibiotic"
) +
theme_classic(base_size = 14)
p4

Figure 6: Disk Diffusion X-axis: Strain (Ancestor vs Evolved) Y-axis:
Zone diameter (mm) Points = individual disks
p6 <- ggplot(disc, aes(x = Timepoint, y = Zone_diameter_mm, fill = Timepoint)) +
geom_boxplot(alpha = 0.6, outlier.shape = NA) +
geom_jitter(width = 0.1, size = 2.5) +
labs(
title = "Disk diffusion zones",
x = "Timepoint",
y = "Zone diameter (mm)"
) +
theme_classic(base_size = 14) +
theme(legend.position = "none")
p6

Figure 7: Heatmap of MIC curves X-axis: concentration Y-axis:
timepoint Color: OD
p7 <- ggplot(od_long, aes(x = Timepoint, y = factor(Concentration, levels = sort(unique(Concentration), decreasing = TRUE)), fill = OD)) +
geom_tile(color = "white") +
facet_wrap(~Culture) +
labs(
title = "Heatmap of OD across concentration and time",
x = "Week",
y = expression("Concentration ("*mu*"g/mL)"),
fill = expression(OD[600])
) +
theme_classic(base_size = 14)
p7

Figure 8: OD vs concentration curves (per week)
Plot dose-response curves: W0 vs W5 vs W10 etc. Very strong for
showing: rightward shift = resistance
p8 <- ggplot(od_long, aes(x = Concentration, y = OD, color = Timepoint, group = Timepoint)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
scale_x_log10() +
facet_wrap(~Culture) +
labs(
title = "Dose-response curves across time",
x = expression("Concentration ("*mu*"g/mL, log scale)"),
y = expression(OD[600]),
color = "Week"
) +
theme_classic(base_size = 14)
p8
Key takeaways to consider:
- Resistance does not evolve in a single uniform way — it depends
strongly on the antibiotic and underlying mechanism.
- Resistance can evolve extremely fast (Amp Log2 from 7-9 in one
week). Ampicillin resistance can arise through large-effect mutations
that rapidly confer high-level resistance. 3.Resistance can evolve
gradually and unstably. Kanamycin resistance likely requires multiple or
smaller-effect changes, leading to slower and more variable evolutionary
trajectories.
- Adaptation happens before full resistance. Cells survive and
fluctuate before MIC increases. Populations first undergo physiological
adaptation, followed by stable genetic resistance.
- Phenotype matches quantitative data. Resistance observed in MIC
assays translates directly into clinically relevant phenotypic
resistance.
Discussion Points (tie to above)
This study demonstrates how bacterial populations adapt to
sub-lethal antibiotic exposure, with distinct evolutionary trajectories
depending on the antibiotic.
The rapid evolution of ampicillin resistance suggests selection
of large-effect mutations (e.g., porin loss or efflux regulation), while
the gradual trajectory of kanamycin resistance indicates a more complex
adaptive pathway. I would read into this more as you’re writing your
thesis.
These results highlight that antibiotic resistance is not a
uniform process and that different drugs can drive fundamentally
different evolutionary dynamics, which has implications for treatment
strategies and resistance management.
For your conclusion, consider a figure that depicts a future
direction. Even just a diagram with text explanation:
Amp → efflux / porin mutation Kan → multi-step adaptation
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpHcmVhdCBqb2IsIExpbGxpYW4hIEkgZGlkIGEgYml0IG9mIGJhc2ljIGNvZGluZyBhbmQgZGF0YSBjbGVhbmluZyB0byBwcmVwIGZvciBvdXIgbWVldGluZyB0b21vcnJvdy4gSW0gZ29pbmcgdG8gc2hhcmUgdGhhdCB3aXRoIHlvdS4gV2UgY2FuIGFkYXB0IHRoaXMgaW4gYW55IHdheSB0aGF0IHlvdSB3YW50LCB0aGlzIHdhcyBqdXN0IHRvIGdldCB1cyB0aGlua2luZyBhYm91dCB5b3VyIHJlc3VsdHMuIFdlIHdpbGwgZ28gb3ZlciBpdCBsaW5lIGJ5IGxpbmUgdG9nZXRoZXIgIGFzIHdlbGwuIEZlZWwgZnJlZSB0byBkbyBtb3JlIGlmIHlvdSB3b3VsZCBsaWtlLiBDb2RpbmcgaXNudCByZWFsbHkgcGFydCBvZiB0aGUgU01QLCBzbyBpdCdzIG5vdCBzb21ldGhpbmcgSSBtYWtlIHlvdSBkbywgYnV0IHlvdSBzaG91bGQgdW5kZXJzdGFuZCB3aGF0IHdhcyBkb25lLiAKCllvdSBzaG91bGQgYmUgcmVhbGx5IGV4Y2l0ZWQgYWJvdXQgdGhlc2UgcmVzdWx0cyBiZWNhdXNlIHlvdSBkaWRu4oCZdCBqdXN0IHNob3cgdGhhdCBiYWN0ZXJpYSBiZWNvbWUgcmVzaXN0YW50Li4uIHlvdSBhY3R1YWxseSBjYXB0dXJlZCBob3cgdGhhdCBwcm9jZXNzIGhhcHBlbnMgb3ZlciB0aW1lLiBZb3VyIGRhdGEgY2xlYXJseSBzaG93IHRoYXQgcmVzaXN0YW5jZSBldm9sdmVzIGluIHZlcnkgZGlmZmVyZW50IHdheXMgZGVwZW5kaW5nIG9uIHRoZSBhbnRpYmlvdGljLiBBbXBpY2lsbGluIHJlc2lzdGFuY2UgYXBwZWFyZWQgYWxtb3N0IGltbWVkaWF0ZWx5LCBqdW1waW5nIHRvIHZlcnkgaGlnaCBsZXZlbHMsIHdoaWxlIGthbmFteWNpbiByZXNpc3RhbmNlIGluY3JlYXNlZCBtb3JlIGdyYWR1YWxseSBhbmQgd2FzIG11Y2ggbW9yZSB2YXJpYWJsZS4gVGhhdCBjb250cmFzdCBpcyBub3Qgc29tZXRoaW5nIGV2ZXJ5b25lIGdldHMsIGFuZCBpdCBwb2ludHMgdG8gcmVhbCBiaW9sb2dpY2FsIGRpZmZlcmVuY2VzIGluIGhvdyB0aGVzZSBkcnVncyBpbnRlcmFjdCB3aXRoIGNlbGxzIGFuZCBob3cgYmFjdGVyaWEgYWRhcHQgdG8gdGhlbS4KCldoYXQgbWFrZXMgeW91ciBwcm9qZWN0IGVzcGVjaWFsbHkgc3Ryb25nIGlzIHRoYXQgYWxsIG9mIHlvdXIgbWVhc3VyZW1lbnRzIHRlbGwgdGhlIHNhbWUgc3RvcnkgZnJvbSBkaWZmZXJlbnQgYW5nbGVzLiBUaGUgTUlDIGRhdGEsIGdyb3d0aCBzY29yZXMsIGRvc2UtcmVzcG9uc2UgY3VydmVzLCBhbmQgZGlzayBkaWZmdXNpb24gYXNzYXlzIGFsbCBsaW5lIHVwIGFuZCByZWluZm9yY2UgZWFjaCBvdGhlciwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHlvdSB3YW50IGluIGEgc29saWQgc2NpZW50aWZpYyBzdHVkeS4gWW91IGFsc28gY2FwdHVyZWQgdGhlIHByb2Nlc3Mgb2YgYWRhcHRhdGlvbiwgbm90IGp1c3QgdGhlIGVuZHBvaW50LCB3aGljaCBpcyBhIG11Y2ggZGVlcGVyIGxldmVsIG9mIGFuYWx5c2lzLiBUaGlzIHB1dHMgeW91IGluIGEgZ3JlYXQgcG9zaXRpb24gdG8gbm90IG9ubHkgZXhwbGFpbiB3aGF0IGhhcHBlbmVkLCBidXQgdG8gc3RhcnQgYXNraW5nIHdoeSBpdCBoYXBwZW5lZC4KCiMgRGF0YSBDbGVhbnNpbmcKCmBgYHtyfQoKbGlicmFyeShkcGx5cikKbWljIDwtIHJlYWQuY3N2KCJNSUNTdW1tYXJ5LmNzdiIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCm9kICA8LSByZWFkLmNzdigiT0RTdW1tYXJ5LmNzdiIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCmRpc2MgPC0gcmVhZC5jc3YoIkRpc2NEaWZmLmNzdiIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCnBhc3MgPC0gcmVhZC5jc3YoIlBhc3NhZ2VzLmNzdiIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCgpuYW1lcyhtaWMpICA8LSB0cmltd3MobmFtZXMobWljKSkKbmFtZXMob2QpICAgPC0gdHJpbXdzKG5hbWVzKG9kKSkKbmFtZXMoZGlzYykgPC0gdHJpbXdzKG5hbWVzKGRpc2MpKQpuYW1lcyhkaXNjKSA8LSBtYWtlLnVuaXF1ZShuYW1lcyhkaXNjKSkKbmFtZXMoZGlzYykKbmFtZXMocGFzcykgPC0gdHJpbXdzKG5hbWVzKHBhc3MpKQoKd2Vla19sZXZlbHMgPC0gYygiVzAiLCJXMSIsIlcyIiwiVzMiLCJXNCIsIlc1IikKCm1pYyRXZWVrIDwtIGZhY3RvcihtaWMkV2VlaywgbGV2ZWxzID0gd2Vla19sZXZlbHMpCm9kJFRpbWVwb2ludCA8LSBmYWN0b3Iob2QkVGltZXBvaW50LCBsZXZlbHMgPSB3ZWVrX2xldmVscykKCiMgcGFzc2FnaW5nCnBhc3MkQW50aWJpb3RpYyA8LSB0cmltd3MocGFzcyRBbnRpYmlvdGljKQpwYXNzJExpbmUgPC0gcGFzdGUocGFzcyRBbnRpYmlvdGljLCBwYXNzJGBDdWx0dXJlIElEYCwgc2VwID0gIl8iKQoKIyBkaXNjIGRpZmZ1c2lvbgpkaXNjJFRpbWVwb2ludCA8LSB0cmltd3MoZGlzYyRUaW1lcG9pbnQpCgojIHVzZSB0aGUgNXRoIGNvbHVtbiwgd2hpY2ggaXMgdGhlIG51bWVyaWMgcmFkaXVzIGNvbHVtbgpkaXNjJFJhZGl1c19tbSA8LSBhcy5udW1lcmljKGRpc2NbWzVdXSkKZGlzYyRab25lX2RpYW1ldGVyX21tIDwtIGRpc2MkUmFkaXVzX21tICogMgoKIyBBZGQgY2Vuc29yZWQgZmxhZyBmb3IgTUlDcyB0aGF0IGhpdCBhc3NheSBjZWlsaW5nCm1heF90ZXN0ZWQgPC0gNTEyCm1pYyRDZW5zb3JlZCA8LSBtaWMkTUlDOTAgPj0gbWF4X3Rlc3RlZAoKbGlicmFyeSh0aWR5dmVyc2UpCgoKb2RfbG9uZyA8LSBvZCAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYyhgT0QgS2FuYCwgYE9EIEFtcGApLAogICAgbmFtZXNfdG8gPSAiQ3VsdHVyZSIsCiAgICB2YWx1ZXNfdG8gPSAiT0QiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBDdWx0dXJlID0gcmVjb2RlKEN1bHR1cmUsCiAgICAgICAgICAgICAgICAgICAgIGBPRCBLYW5gID0gIkthbiIsCiAgICAgICAgICAgICAgICAgICAgIGBPRCBBbXBgID0gIkFtcCIpLAogICAgQ29uY2VudHJhdGlvbiA9IGBDb25jZW50cmF0aW9uICh1Zy9tTClgCiAgKQoKYGBgCgpGaWd1cmUgMSAoTU9TVCBJTVBPUlRBTlQpOiBSZXNpc3RhbmNlIFRyYWplY3RvcmllcwrigJxBbXAgcmVzaXN0YW5jZSBldm9sdmVkIGV4dHJlbWVseSByYXBpZGx5LCBleGNlZWRpbmcgb3VyIG1lYXN1cmVtZW50IHJhbmdlIHdpdGhpbiBvbmUgd2Vla+KAnQoKYGBge3J9CnAxIDwtIGdncGxvdChtaWMsIGFlcyh4ID0gV2VlaywgeSA9IGBsb2cyKE1JQylgLCBjb2xvciA9IGBDdWx0dXJlYCwgZ3JvdXAgPSBgQ3VsdHVyZWApKSArCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IENlbnNvcmVkKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYyhgRkFMU0VgID0gMTYsIGBUUlVFYCA9IDE3KSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZXNpc3RhbmNlIHRyYWplY3RvcmllcyBvdmVyIHRpbWUiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSBleHByZXNzaW9uKGxvZ1syXSoiKE1JQzkwLCDCtWcvbUwpIiksCiAgICBjb2xvciA9ICJDdWx0dXJlIiwKICAgIHNoYXBlID0gIkF0IGFzc2F5IGNlaWxpbmciCiAgKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNCkKCnAxCgpgYGAKCkZpZ3VyZSAzOiBHcm93dGggVW5kZXIgU2VsZWN0aW9uIAoKYGBge3J9CnAzIDwtIGdncGxvdChwYXNzLCBhZXMoeCA9IFBhc3NhZ2UsIHkgPSBHcm93dGguU2NvcmUsIGNvbG9yID0gQW50aWJpb3RpYywgZ3JvdXAgPSBMaW5lKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuOCwgbGluZXdpZHRoID0gMC45KSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJHcm93dGggc2NvcmVzIGR1cmluZyBzZXJpYWwgcGFzc2FnaW5nIiwKICAgIHggPSAiUGFzc2FnZSIsCiAgICB5ID0gIkdyb3d0aCBzY29yZSIsCiAgICBjb2xvciA9ICJBbnRpYmlvdGljIgogICkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTQpCgpwMwoKYGBgCkZpZ3VyZSA0OiBBbnRpYmlvdGljIENvbmNlbnRyYXRpb24gT3ZlciBUaW1lCgpgYGB7cn0KcDQgPC0gZ2dwbG90KHBhc3MsIGFlcyh4ID0gUGFzc2FnZSwgeSA9IENvbmMuTnVtLCBjb2xvciA9IEFudGliaW90aWMsIGdyb3VwID0gTGluZSkpICsKICBnZW9tX3N0ZXAoYWxwaGEgPSAwLjgsIGxpbmV3aWR0aCA9IDAuOSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV95X2xvZzEwKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJTZWxlY3Rpb24gcHJlc3N1cmUgZHVyaW5nIHNlcmlhbCBwYXNzYWdpbmciLAogICAgeCA9ICJQYXNzYWdlIiwKICAgIHkgPSBleHByZXNzaW9uKCJDb25jZW50cmF0aW9uICgiKm11KiJnL21MLCBsb2cgc2NhbGUpIiksCiAgICBjb2xvciA9ICJBbnRpYmlvdGljIgogICkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTQpCgpwNAoKYGBgCgoKRmlndXJlIDY6IERpc2sgRGlmZnVzaW9uIApYLWF4aXM6IFN0cmFpbiAoQW5jZXN0b3IgdnMgRXZvbHZlZCkKWS1heGlzOiBab25lIGRpYW1ldGVyIChtbSkKUG9pbnRzID0gaW5kaXZpZHVhbCBkaXNrcwoKYGBge3J9CgpwNiA8LSBnZ3Bsb3QoZGlzYywgYWVzKHggPSBUaW1lcG9pbnQsIHkgPSBab25lX2RpYW1ldGVyX21tLCBmaWxsID0gVGltZXBvaW50KSkgKwogIGdlb21fYm94cGxvdChhbHBoYSA9IDAuNiwgb3V0bGllci5zaGFwZSA9IE5BKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjEsIHNpemUgPSAyLjUpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRGlzayBkaWZmdXNpb24gem9uZXMiLAogICAgeCA9ICJUaW1lcG9pbnQiLAogICAgeSA9ICJab25lIGRpYW1ldGVyIChtbSkiCiAgKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCnA2CmBgYAoKRmlndXJlIDc6IEhlYXRtYXAgb2YgTUlDIGN1cnZlcwpYLWF4aXM6IGNvbmNlbnRyYXRpb24KWS1heGlzOiB0aW1lcG9pbnQKQ29sb3I6IE9ECgpgYGB7cn0KCnA3IDwtIGdncGxvdChvZF9sb25nLCBhZXMoeCA9IFRpbWVwb2ludCwgeSA9IGZhY3RvcihDb25jZW50cmF0aW9uLCBsZXZlbHMgPSBzb3J0KHVuaXF1ZShDb25jZW50cmF0aW9uKSwgZGVjcmVhc2luZyA9IFRSVUUpKSwgZmlsbCA9IE9EKSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJ3aGl0ZSIpICsKICBmYWNldF93cmFwKH5DdWx0dXJlKSArCiAgbGFicygKICAgIHRpdGxlID0gIkhlYXRtYXAgb2YgT0QgYWNyb3NzIGNvbmNlbnRyYXRpb24gYW5kIHRpbWUiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSBleHByZXNzaW9uKCJDb25jZW50cmF0aW9uICgiKm11KiJnL21MKSIpLAogICAgZmlsbCA9IGV4cHJlc3Npb24oT0RbNjAwXSkKICApICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE0KQoKcDcKYGBgCgoKRmlndXJlIDg6IE9EIHZzIGNvbmNlbnRyYXRpb24gY3VydmVzIChwZXIgd2VlaykKClBsb3QgZG9zZS1yZXNwb25zZSBjdXJ2ZXM6ClcwIHZzIFc1IHZzIFcxMCBldGMuClZlcnkgc3Ryb25nIGZvciBzaG93aW5nOgpyaWdodHdhcmQgc2hpZnQgPSByZXNpc3RhbmNlCgoKYGBge3J9CgpwOCA8LSBnZ3Bsb3Qob2RfbG9uZywgYWVzKHggPSBDb25jZW50cmF0aW9uLCB5ID0gT0QsIGNvbG9yID0gVGltZXBvaW50LCBncm91cCA9IFRpbWVwb2ludCkpICsKICBnZW9tX2xpbmUobGluZXdpZHRoID0gMSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV94X2xvZzEwKCkgKwogIGZhY2V0X3dyYXAofkN1bHR1cmUpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRG9zZS1yZXNwb25zZSBjdXJ2ZXMgYWNyb3NzIHRpbWUiLAogICAgeCA9IGV4cHJlc3Npb24oIkNvbmNlbnRyYXRpb24gKCIqbXUqImcvbUwsIGxvZyBzY2FsZSkiKSwKICAgIHkgPSBleHByZXNzaW9uKE9EWzYwMF0pLAogICAgY29sb3IgPSAiV2VlayIKICApICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE0KQoKcDgKCmBgYAoKCiMjIEtleSB0YWtlYXdheXMgdG8gY29uc2lkZXI6IAoKMS4gUmVzaXN0YW5jZSBkb2VzIG5vdCBldm9sdmUgaW4gYSBzaW5nbGUgdW5pZm9ybSB3YXkg4oCUIGl0IGRlcGVuZHMgc3Ryb25nbHkgb24gdGhlIGFudGliaW90aWMgYW5kIHVuZGVybHlpbmcgbWVjaGFuaXNtLgoyLiBSZXNpc3RhbmNlIGNhbiBldm9sdmUgZXh0cmVtZWx5IGZhc3QgKEFtcCBMb2cyIGZyb20gNy05IGluIG9uZSB3ZWVrKS4gQW1waWNpbGxpbiByZXNpc3RhbmNlIGNhbiBhcmlzZSB0aHJvdWdoIGxhcmdlLWVmZmVjdCBtdXRhdGlvbnMgdGhhdCByYXBpZGx5IGNvbmZlciBoaWdoLWxldmVsIHJlc2lzdGFuY2UuCjMuUmVzaXN0YW5jZSBjYW4gZXZvbHZlIGdyYWR1YWxseSBhbmQgdW5zdGFibHkuIEthbmFteWNpbiByZXNpc3RhbmNlIGxpa2VseSByZXF1aXJlcyBtdWx0aXBsZSBvciBzbWFsbGVyLWVmZmVjdCBjaGFuZ2VzLCBsZWFkaW5nIHRvIHNsb3dlciBhbmQgbW9yZSB2YXJpYWJsZSBldm9sdXRpb25hcnkgdHJhamVjdG9yaWVzLgo0LiBBZGFwdGF0aW9uIGhhcHBlbnMgYmVmb3JlIGZ1bGwgcmVzaXN0YW5jZS4gQ2VsbHMgc3Vydml2ZSBhbmQgZmx1Y3R1YXRlIGJlZm9yZSBNSUMgaW5jcmVhc2VzLiBQb3B1bGF0aW9ucyBmaXJzdCB1bmRlcmdvIHBoeXNpb2xvZ2ljYWwgYWRhcHRhdGlvbiwgZm9sbG93ZWQgYnkgc3RhYmxlIGdlbmV0aWMgcmVzaXN0YW5jZS4KNS4gUGhlbm90eXBlIG1hdGNoZXMgcXVhbnRpdGF0aXZlIGRhdGEuIFJlc2lzdGFuY2Ugb2JzZXJ2ZWQgaW4gTUlDIGFzc2F5cyB0cmFuc2xhdGVzIGRpcmVjdGx5IGludG8gY2xpbmljYWxseSByZWxldmFudCBwaGVub3R5cGljIHJlc2lzdGFuY2UuIAoKIyMgRGlzY3Vzc2lvbiBQb2ludHMgKHRpZSB0byBhYm92ZSkKCjEuIFRoaXMgc3R1ZHkgZGVtb25zdHJhdGVzIGhvdyBiYWN0ZXJpYWwgcG9wdWxhdGlvbnMgYWRhcHQgdG8gc3ViLWxldGhhbCBhbnRpYmlvdGljIGV4cG9zdXJlLCB3aXRoIGRpc3RpbmN0IGV2b2x1dGlvbmFyeSB0cmFqZWN0b3JpZXMgZGVwZW5kaW5nIG9uIHRoZSBhbnRpYmlvdGljLgoKMi4gVGhlIHJhcGlkIGV2b2x1dGlvbiBvZiBhbXBpY2lsbGluIHJlc2lzdGFuY2Ugc3VnZ2VzdHMgc2VsZWN0aW9uIG9mIGxhcmdlLWVmZmVjdCBtdXRhdGlvbnMgKGUuZy4sIHBvcmluIGxvc3Mgb3IgZWZmbHV4IHJlZ3VsYXRpb24pLCB3aGlsZSB0aGUgZ3JhZHVhbCB0cmFqZWN0b3J5IG9mIGthbmFteWNpbiByZXNpc3RhbmNlIGluZGljYXRlcyBhIG1vcmUgY29tcGxleCBhZGFwdGl2ZSBwYXRod2F5LiBJIHdvdWxkIHJlYWQgaW50byB0aGlzIG1vcmUgYXMgeW91J3JlIHdyaXRpbmcgeW91ciB0aGVzaXMuIAoKMy4gVGhlc2UgcmVzdWx0cyBoaWdobGlnaHQgdGhhdCBhbnRpYmlvdGljIHJlc2lzdGFuY2UgaXMgbm90IGEgdW5pZm9ybSBwcm9jZXNzIGFuZCB0aGF0IGRpZmZlcmVudCBkcnVncyBjYW4gZHJpdmUgZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgZXZvbHV0aW9uYXJ5IGR5bmFtaWNzLCB3aGljaCBoYXMgaW1wbGljYXRpb25zIGZvciB0cmVhdG1lbnQgc3RyYXRlZ2llcyBhbmQgcmVzaXN0YW5jZSBtYW5hZ2VtZW50LgoKCkZvciB5b3VyIGNvbmNsdXNpb24sIGNvbnNpZGVyIGEgZmlndXJlIHRoYXQgZGVwaWN0cyBhIGZ1dHVyZSBkaXJlY3Rpb24uIApFdmVuIGp1c3QgYSBkaWFncmFtIHdpdGggdGV4dCBleHBsYW5hdGlvbjoKCkFtcCDihpIgZWZmbHV4IC8gcG9yaW4gbXV0YXRpb24KS2FuIOKGkiBtdWx0aS1zdGVwIGFkYXB0YXRpb24=