Stimuli
The headwords within the Kaytetye print dictionary (Turpin & Ross, 2012) were read aloud by AR, a 41-year-old native speaker of Kaytetye who is literate in both Kaytetye and English. Two repetitions of each headword were produced, cited and uttered in uninflected forms. Derived words and reduplications listed in the dictionary were not recorded. Data from these recordings sessions account for 2816 headwords out of the 4697 currently listed in Kaytetye lexicon database.
The recordings were made at the University of Queensland Music Department’s Recording Studio on a Roland Portable Recording Unit R-26 and were encoded at a sample rate of 48000 Hz in 24-bit wave format. The microphone varied between the recording sessions—the Roland R-26 internal microphone was used on Day 1 and a 106 Sony ECM 44S condenser microphone on Day 2. Turpin monitored the recordings throughout the sessions.
Word selection
The total number of unique headwords analyzed in this paper is 1324, which amounts to 47% of the 2816 recorded headwords, and 28.2% of the currently known Kaytetye lexicon. The analyses are based on phonetic transcriptions which form part of an ongoing project that will eventually obtain phonetic transcription of the 2816 recordings by at least two independent transcribers. For practicality, transcription jobs were broken into collections of headwords, or ‘batches’. As of 14 February 2019, there have been 2719 words selected across 18 batches. For the initial batches (b001-b009), the headword forms were selected by one of the authors to ensure adequate coverage for developing and refining annotation instructions. For all subsequent batches (b010-), headword forms were randomly pooled from those which had not been assigned to previous batches. After the selection step for all batches, the headwords were anonymized and these anonymized files were supplied to transcribers (e.g. audio given as b018_162.wav
and not artnangke.wav
).
Annotation
Background of transcribers
The language backgrounds and phonetic transcription experience of transcribers no doubt exert an influence on their transcriptions. Thus, we took several steps to minimize the influence of ‘top-down’ lexical and phonological knowledge on the phonetic transcriptions. Firstly, as mentioned, headwords were anonymized prior to being dispatched for transcription, and transcribers therefore did not have access to any orthographic information about the vowels (consonants discussed below). Secondly, we intentionally recruited phonetically-trained but Kaytetye-naïve transcribers to create multiple, independent transcriptions of the headwords. For this paper, vowels were not analyzed if at least two independent transcriptions were not yet available (exclusion criteria described further below). Relevant background information for all transcribers are reported in the Appendix.
Consonantal skeleton generation
While transcribers were not given orthographic forms of the headwords (e.g. arralkenke ‘to yawn’), they were however provided basic information about the consonantal structure in IPA forms (e.g. ɾ in place of rr). Unlike for vowels, the consonantal place oppositions of Kaytetye follow the standard Maximal Australian inventory (Fletcher & Butcher, 2014, p. 101–102). Thus, as vowels were the priority of the project, transcribers were provided with consonantal skeletons, which were derived by converting the orthographic forms to hypothetical IPA forms, and then removing the vowel symbols—e.g. arralkenke → [ɐɾɐlkənkə] → [ɾlknk]. Additionally, as the Kaytetye glides /w, j/ have been described to interact with vowels to render various further vocalic qualities (e.g. diphthongs), the IPA labels [w] and [j] were also removed from the skeletons—with the goal being annotators will be required to fill in perceived semi-vocalic qualities where they do. It was emphasized that provided skeletons were hypothetical forms, and transcribers were instructed to replace or remove any IPA labels where they disagreed with the script-generated labels.
Annotation environment
All annotations of the sound files were carried out in Praat (Boersma & Weenink, 2018). Annotators were given separate anonymized sound files and accompanying TextGrid, and annotators did not see each other’s transcriptions. At the start of each session, annotators reset all Praat settings and turned off all overlays. Spectrogram settings were adjusted to the following values: View range, 0-8 kHz; Dynamic range: 40.0 dB. Waveform settings were left to Praat’s standard values. Pitch and intensity overlays were turned off and were only used as to gather additional cues when necessary, e.g. adjusting the display settings to determine local inflection points in the signal.
Annotation procedure
The steps reported below gives an overview of the instructions provided to the annotators. The full instructions are provided in the Appendix. Prior to being given anonymized files to annotate for the first time, all annotators are given test sets for practice and on which they receive feedback.
Adjust the word boundaries given by the consonantal skeleton on the IPA tier to approximate locations.
For each vocalic interval perceived in the word, give an IPA label placing it within the consonantal skeleton as appropriate, e.g. [ɾlknk] → [ɐɾˈʌlkənk]. Put a stress mark on the left edge of the vowel perceived most prominent within the word.
For each IPA vowel label used within the word, place an interval on the Vowels tier and adjust the vowel boundaries to appropriate locations by inspecting changes in the waveform and spectrogram. If the vowel is perceived as the primary stressed vowel, place a stress marker on the left of the label, e.g. [ˈʌ]. If the vowel is word-initial or word-final, place a boundary marker # on the relevant side of the vowel label, e.g. [#ɐ].
Figure X provides an overview of the annotation data generated by the procedure above on two repetitions of a Kaytetye headword arralkenke ‘to yawn’, which had been anonymized as b006_file15.wav
and whose consonantal skeleton was approximated as [ɾlknk], from which two annotators (KR, NS) provided independent transcriptions (placed on the ‘IPA’ tier) as well as temporal locations for all perceived vocalic intervals (placed on the ‘Vowels’ tier).
Figure X An illustration of word-level and vowel-level segmentations by two annotators (KR, NS) of two repetitions of a Kaytetye word arralkenke ‘to yawn’, accessed as an anonymized file b006_file15.wav
with an estimate of the word’s consonantal skeleton (ɾlknk).
Data pre-processing
Annotation data
Annotation data from all TextGrids were processed within R (R Core Team, 2018). All processing scripts and resulting data are openly accessible via a Zenodo archive (San et al., 2018). Thus, a conceptual overview is provided here.
Table X provides a sample of 8 rows from our analysis dataset. This subset is the result of processing the TextGrid information provided in Figure X. As can be seen from the rows, the primary observation units in the dataset are the vowel labels, which had been provided by the annotators (e.g. kr, ns) as TextGrid intervals on the Vowels tier. Using the mid-point of the TextGrid intervals, corresponding word-level information (i.e. repetition number and transcription) were then retrieved for each vowel label from transcriptions provided by the annotators on the IPA tier. For each vowel label set within a repetition (e.g. [ɐ, ʌ, ə] for repetition 1 annotated by kr) and the corresponding word-level transcription (e.g. [ɐɾʌlkənk]), a consonantal context set was derived (e.g. [#_ɾ, ɾ_l, k_n]). Initial- and final-vowels, i.e. those having ‘#’ their derived context, were then excluded, and vowel numbers were assigned to remaining medial vowels, starting from the left (e.g. [ʌ] is the first medial vowel in [ɐɾʌlkənk]).
Analysis dataset
Using the mid-point value of the vowel labels, corresponding first and second formant values for each vowel were retrieved. Table X displays the result of appending formant information to the annotation data. For all formant values, z-scores were calculated for both raw values, e.g. for F1 (Praat), F1 (Forest), etc., as well as tracker-differences (e.g. F1 (Forest) - F1 (Praat), F2 (Forest) - F2 (Praat)).
For data sanitization purposes, files with differing number of transcribed word repetitions between annotators were excluded. Word repetitions whose vowel label set differed between the Vowels and IPA tiers in the TextGrid were excluded. Vowels whose consonantal context could not be derived by the script were excluded. Word repetitions for which annotators disagreed on the number of medial vowels were excluded. Based on the formant information z-scores, we exlcuded all observations any of whose z-scores lied outside of 3 standard deviations from the mean. Vowels for which only observations from a single annotator remained due to these exclusion criteria were also subsequently excluded. The resulting sanitised dataset amounted to 64% of the raw medial-vowel data (11703 out of 18165 observations).
Unsupervised clustering procedure
To quantitatively generate candidate sets of acoustic vowel categories, we performed unsupervised clustering on the z-normalized mid-point \(F_1\) and \(F_2\) values using finite Gaussian mixture models (GMMs), implemented by the mclust
R package (v. 5.4.1: Scrucca, Fop, Murphy, & Raftery, 2016). GMMs model data as a mixture distribution, comprising a finite number of component Gaussian distributions, \(G\), each parameterized by a mean μ and standard deviation σ (e.g. a 1-dimensional bimodal distribution could be modelled as a mixture of two latent Gaussian distributions, \(G_1: <μ_1, σ_1>\) and \(G_2: <μ_2, σ_2>\), whose peaks occur at \(μ_1\) and \(μ_2\) respectively). Within a given mixture model, optimal parameters were estimated iteratively using the Expectation Maximization algorithm (for an introduction to EM, see Do & Batzoglou, 2008). Between mixture models (e.g. 2- vs. 3-component models), the optimal model was determined according to the integrated complete-data likelihood (ICL) criterion (Scrucca et al., 2016, p. 299).
Given that random parameters values are initially selected to be optimized by the EM algorithm, the subsequent fit of a GMM can be limited by the initialization settings. Thus, for each distribution of mid-point \(F_1\) and \(F_2\) values as measured by two separate formant trackers (Forest and Praat), we performed 10,000 iterations of GMM fitting. Further, as each vocalic interval was identified by multiple annotators whose marking of the mid-point location may vary slightly (and thus the measured \(F_1\) and \(F_2\) values), each iteration sampled different combinations of the mid-point locations. For analytical reproducibility, we pre-computed random seeds and the same seed was supplied for all procedures involving randomization within a given iteration. The fitting process took approximately 4 hours on a dedicated compute server with 24 CPU cores (at 2.2 GHz each) and 256 GB RAM, running Ubuntu 18.04.01 LTS and R 3.5.0.
LS0tCnRpdGxlOiAiUmVwcm9kdWNpYmxlIG1ldGhvZCBzZWN0aW9uIGZvciBLYXl0ZXR5ZSBtZWRpYWwgdm93ZWxzIHBhcGVyIgphdXRob3I6ICJOYXkgU2FuIgpkYXRlOiAiR2VuZXJhdGVkIGByIGZvcm1hdChTeXMudGltZSgpLCAnJUYgJVIgVVRDJXonKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IGthYmxlCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vCiAgICB0b2M6IHllcwotLS0KCmBgYHtyIFNldHVwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCiAgICAKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShEVCkgICAgCgprZGJfaGVhZHdvcmRzIDwtIDQ2OTcgICAgICAgICMgRGVyaXZlZCBmcm9tIEtEQi50eHQgdmVyc2lvbiAyODAzMjliZjFlM2YwOGY4NDIxMzYzNzcyZjMwYTRhOWI2MTFlMmUzCmhlYWR3b3Jkc19yZWNvcmRlZCA8LSAyODE2ICAgIyBTYW1lIGZpZ3VyZSBhcyByZXBvcnRlZCBpbiBTYW4gKDIwMTYpIE1SZXMgdGhlc2lzLCBwLiAxMwp0b2RheSA8LSBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkICVCICVZIikKCmhlYWR3b3JkcyA8LSByZWFkX2NzdihoZXJlKCJkYXRhL2V4dGVybmFsL2hlYWR3b3Jkcy5jc3YiKSwgY29sX3R5cGVzID0gImNjIikKdm93ZWxzX21lZF9hbmFseXNpcyA8LSByZWFkX2NzdihoZXJlKCJkYXRhL3Byb2Nlc3NlZC92b3dlbHNfbWVkX2FuYWx5c2lzLmNzdiIpLCBjb2xfdHlwZXMgPSAiY2lpY2NjY2NkZGNkZGRkZGRkZGRkIikKICAgIAojIFNvbWUgaGVscGVycwpwbGFjZWhvbGRlciA8LSAnPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+WDwvc3Bhbj4nCmBgYAoKIyBTdGltdWxpCgpUaGUgaGVhZHdvcmRzIHdpdGhpbiB0aGUgS2F5dGV0eWUgcHJpbnQgZGljdGlvbmFyeSAoVHVycGluICYgUm9zcywgMjAxMikgd2VyZSByZWFkIGFsb3VkIGJ5IEFSLCBhIDQxLXllYXItb2xkIG5hdGl2ZSBzcGVha2VyIG9mIEtheXRldHllIHdobyBpcyBsaXRlcmF0ZSBpbiBib3RoIEtheXRldHllIGFuZCBFbmdsaXNoLgpUd28gcmVwZXRpdGlvbnMgb2YgZWFjaCBoZWFkd29yZCB3ZXJlIHByb2R1Y2VkLCBjaXRlZCBhbmQgdXR0ZXJlZCBpbiB1bmluZmxlY3RlZCBmb3Jtcy4gRGVyaXZlZCB3b3JkcyBhbmQgcmVkdXBsaWNhdGlvbnMgbGlzdGVkIGluIHRoZSBkaWN0aW9uYXJ5IHdlcmUgbm90IHJlY29yZGVkLgpEYXRhIGZyb20gdGhlc2UgcmVjb3JkaW5ncyBzZXNzaW9ucyBhY2NvdW50IGZvciBgciBoZWFkd29yZHNfcmVjb3JkZWRgIGhlYWR3b3JkcyBvdXQgb2YgdGhlIGByIGtkYl9oZWFkd29yZHNgIGN1cnJlbnRseSBsaXN0ZWQgaW4gS2F5dGV0eWUgbGV4aWNvbiBkYXRhYmFzZS4KClRoZSByZWNvcmRpbmdzIHdlcmUgbWFkZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBRdWVlbnNsYW5kIE11c2ljIERlcGFydG1lbnTigJlzIFJlY29yZGluZyBTdHVkaW8gb24gYSBSb2xhbmQgUG9ydGFibGUgUmVjb3JkaW5nIFVuaXQgUi0yNiBhbmQgd2VyZSBlbmNvZGVkIGF0IGEgc2FtcGxlIHJhdGUgb2YgNDgwMDAgSHogaW4gMjQtYml0IHdhdmUgZm9ybWF0LgpUaGUgbWljcm9waG9uZSB2YXJpZWQgYmV0d2VlbiB0aGUgcmVjb3JkaW5nIHNlc3Npb25z4oCUdGhlIFJvbGFuZCBSLTI2IGludGVybmFsIG1pY3JvcGhvbmUgd2FzIHVzZWQgb24gRGF5IDEgYW5kIGEgMTA2IFNvbnkgRUNNIDQ0UyBjb25kZW5zZXIgbWljcm9waG9uZSBvbiBEYXkgMi4KVHVycGluIG1vbml0b3JlZCB0aGUgcmVjb3JkaW5ncyB0aHJvdWdob3V0IHRoZSBzZXNzaW9ucy4KCiMgV29yZCBzZWxlY3Rpb24KCmBgYHtyIENhbGN1bGF0ZWQgdW5pcXVlIGhlYWR3b3JkcyBhbmFseXplZCwgaW5jbHVkZT1GQUxTRX0KaGVhZHdvcmRzX3VuaXF1ZSA8LQogICAgdm93ZWxzX21lZF9hbmFseXNpcyAlPiUKICAgIGxlZnRfam9pbihoZWFkd29yZHMpICU+JQogICAgZ3JvdXBfYnkoaGVhZHdvcmQpICU+JQogICAgdGFsbHkoKSAlPiUKICAgIG5yb3coKQpgYGAKClRoZSB0b3RhbCBudW1iZXIgb2YgdW5pcXVlIGhlYWR3b3JkcyBhbmFseXplZCBpbiB0aGlzIHBhcGVyIGlzIGByIGhlYWR3b3Jkc191bmlxdWVgLCB3aGljaCBhbW91bnRzIHRvIGByIHJvdW5kKGhlYWR3b3Jkc191bmlxdWUgLyBoZWFkd29yZHNfcmVjb3JkZWQgKiAxMDAsIDEpYCUgb2YgdGhlIGByIGhlYWR3b3Jkc19yZWNvcmRlZGAgcmVjb3JkZWQgaGVhZHdvcmRzLCBhbmQgYHIgcm91bmQoaGVhZHdvcmRzX3VuaXF1ZSAvIGtkYl9oZWFkd29yZHMgKiAxMDAsIDEpYCUgb2YgdGhlIGN1cnJlbnRseSBrbm93biBLYXl0ZXR5ZSBsZXhpY29uLgpUaGUgYW5hbHlzZXMgYXJlIGJhc2VkIG9uIHBob25ldGljIHRyYW5zY3JpcHRpb25zIHdoaWNoIGZvcm0gcGFydCBvZiBhbiBvbmdvaW5nIHByb2plY3QgdGhhdCB3aWxsIGV2ZW50dWFsbHkgb2J0YWluIHBob25ldGljIHRyYW5zY3JpcHRpb24gb2YgdGhlIGByIGhlYWR3b3Jkc19yZWNvcmRlZGAgcmVjb3JkaW5ncyBieSBhdCBsZWFzdCB0d28gaW5kZXBlbmRlbnQgdHJhbnNjcmliZXJzLgpGb3IgcHJhY3RpY2FsaXR5LCB0cmFuc2NyaXB0aW9uIGpvYnMgd2VyZSBicm9rZW4gaW50byBjb2xsZWN0aW9ucyBvZiBoZWFkd29yZHMsIG9yICdiYXRjaGVzJzwhLS0gLCBhbiBvdmVydmlldyBvZiB3aGljaCBpcyBwcm92aWRlZCBpbiBUYWJsZSBgciBwbGFjZWhvbGRlcmAgLy8tLT4uCkFzIG9mIGByIHRvZGF5YCwgdGhlcmUgaGF2ZSBiZWVuIGByIHVuaXF1ZShoZWFkd29yZHMkaGVhZHdvcmQpICU+JSBsZW5ndGgoKWAgd29yZHMgc2VsZWN0ZWQgYWNyb3NzIGByIHN0cl9leHRyYWN0KGhlYWR3b3JkcyRzb3VyY2VfZmlsZSwgImJcXGQrIikgJT4lIHVuaXF1ZSgpICU+JSBsZW5ndGgoKWAgYmF0Y2hlcy4KRm9yIHRoZSBpbml0aWFsIGJhdGNoZXMgKGIwMDEtYjAwOSksIHRoZSBoZWFkd29yZCBmb3JtcyB3ZXJlIHNlbGVjdGVkIGJ5IG9uZSBvZiB0aGUgYXV0aG9ycyB0byBlbnN1cmUgYWRlcXVhdGUgY292ZXJhZ2UgZm9yIGRldmVsb3BpbmcgYW5kIHJlZmluaW5nIGFubm90YXRpb24gaW5zdHJ1Y3Rpb25zLgpGb3IgYWxsIHN1YnNlcXVlbnQgYmF0Y2hlcyAoYjAxMC0pLCBoZWFkd29yZCBmb3JtcyB3ZXJlIHJhbmRvbWx5IHBvb2xlZCBmcm9tIHRob3NlIHdoaWNoIGhhZCBub3QgYmVlbiBhc3NpZ25lZCB0byBwcmV2aW91cyBiYXRjaGVzLgpBZnRlciB0aGUgc2VsZWN0aW9uIHN0ZXAgZm9yIGFsbCBiYXRjaGVzLCB0aGUgaGVhZHdvcmRzIHdlcmUgYW5vbnltaXplZCBhbmQgdGhlc2UgYW5vbnltaXplZCBmaWxlcyB3ZXJlIHN1cHBsaWVkIHRvIHRyYW5zY3JpYmVycyAoZS5nLiBhdWRpbyBnaXZlbiBhcyBgYjAxOF8xNjIud2F2YCBhbmQgbm90IGBhcnRuYW5na2Uud2F2YCkuCjwhLS0gRm9yIGVhY2ggYmF0Y2gsIFRhYmxlIGByIHBsYWNlaG9sZGVyYCBhbHNvIGRpc3BsYXlzIHRoZSBwcm9wb3J0aW9uIG9mIHNlbGVjdGVkIGhlYWR3b3JkcyB3aXRoaW4gZWFjaCBiYXRjaCB3aGljaCBzYXRpc2ZpZXMgdGhlIHByZS1wcm9jZXNzaW5nIGNyaXRlcmlhIGZvciB0aGUgY3VycmVudCBhbmFseXNlcyAoZS5nLiBoYXZlIGJlZW4gYW5ub3RhdGVkIGJ5IGF0IGxlYXN0IDIgZGlmZmVyZW50IHBlb3BsZTsgcHJlLXByb2Nlc3Npbmcgc3RlcHMgb3V0bGluZWQgZnVydGhlciBiZWxvdykuIC8vLS0+CgpgYGB7ciBCYXRjaCB0YWJsZSwgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyAyMDE4LTA4LTE2LiBEZWNpZGVkIG5vdCB0byByZXBvcnQgcHJvamVjdC1pbnRlcm5hbCBicmVha2Rvd25zIG9mIGhvdyB2YXJpb3VzIHRyYW5zY3JpcHRpb24gYmF0Y2hlcyBhcmUgcHJvZ3Jlc3NpbmcgKGUuZy4gYjAwMSAxMDAlIGNvbXBsZXRlLCBiMDE1IDUwJSBjb21wbGV0ZSwgZXRjLikKaGVhZHdvcmRzICU+JQogICAgbXV0YXRlKGJhdGNoID0gc3RyX2V4dHJhY3Qoc291cmNlX2ZpbGUsICJiXFxkKyIpKSAlPiUgCiAgICBsZWZ0X2pvaW4oc2VsZWN0KHZvd2Vsc19tZWRfYW5hbHlzaXMsIHNvdXJjZV9maWxlLCBhbm5vdGF0b3IpKSAlPiUKICAgIGdyb3VwX2J5KGJhdGNoLCBzb3VyY2VfZmlsZSwgaGVhZHdvcmQsIGFubm90YXRvcikgJT4lCiAgICBzdW1tYXJpc2UoaW5fYW5hbHlzaXNfc2V0ID0gaWZlbHNlKGFsbChpcy5uYShhbm5vdGF0b3IpKSwgRkFMU0UsIFRSVUUpKSAlPiUKICAgIGdyb3VwX2J5KGJhdGNoLCBzb3VyY2VfZmlsZSwgaGVhZHdvcmQpICU+JQogICAgc3VtbWFyaXNlKGhhc18yX2Fubm90YXRvcnMgPSBzdW0oaW5fYW5hbHlzaXNfc2V0KSA+PSAyKSAlPiUKICAgIGdyb3VwX2J5KGJhdGNoKSAlPiUKICAgIHN1bW1hcmlzZSgKICAgICAgICBuX292ZXJfMiA9IHN1bShoYXNfMl9hbm5vdGF0b3JzKSwKICAgICAgICB0b3RhbCAgICA9IG4oKQogICAgKSAlPiUKICAgIG11dGF0ZSgKICAgICAgICBjb3ZlcmFnZSA9IChuX292ZXJfMiAvIHRvdGFsICogMTAwKSAlPiUgcm91bmQoZGlnaXRzID0gMSkKICAgICkgJT4lCiAgICBzZWxlY3QoCiAgICAgICAgQmF0Y2ggPSBiYXRjaCwKICAgICAgICBgSGVhZHdvcmRzIHNlbGVjdGVkYCAgPSB0b3RhbCwKICAgICAgICBgSGVhZHdvcmRzIGFuYWx5emVkYCAgPSBuX292ZXJfMiwKICAgICAgICBgUGVyY2VudCBhbmFseXplZGAgICAgPSBjb3ZlcmFnZQogICAgKSAKYGBgCgojIEFubm90YXRpb24KCiMjIEJhY2tncm91bmQgb2YgdHJhbnNjcmliZXJzCgpUaGUgbGFuZ3VhZ2UgYmFja2dyb3VuZHMgYW5kIHBob25ldGljIHRyYW5zY3JpcHRpb24gZXhwZXJpZW5jZSBvZiB0cmFuc2NyaWJlcnMgbm8gZG91YnQgZXhlcnQgYW4gaW5mbHVlbmNlIG9uIHRoZWlyIHRyYW5zY3JpcHRpb25zLgpUaHVzLCB3ZSB0b29rIHNldmVyYWwgc3RlcHMgdG8gbWluaW1pemUgdGhlIGluZmx1ZW5jZSBvZiAndG9wLWRvd24nIGxleGljYWwgYW5kIHBob25vbG9naWNhbCBrbm93bGVkZ2Ugb24gdGhlIHBob25ldGljIHRyYW5zY3JpcHRpb25zLgpGaXJzdGx5LCBhcyBtZW50aW9uZWQsIGhlYWR3b3JkcyB3ZXJlIGFub255bWl6ZWQgcHJpb3IgdG8gYmVpbmcgZGlzcGF0Y2hlZCBmb3IgdHJhbnNjcmlwdGlvbiwgYW5kIHRyYW5zY3JpYmVycyB0aGVyZWZvcmUgZGlkIG5vdCBoYXZlIGFjY2VzcyB0byBhbnkgb3J0aG9ncmFwaGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2b3dlbHMgKGNvbnNvbmFudHMgZGlzY3Vzc2VkIGJlbG93KS4KU2Vjb25kbHksIHdlIGludGVudGlvbmFsbHkgcmVjcnVpdGVkIHBob25ldGljYWxseS10cmFpbmVkIGJ1dCBLYXl0ZXR5ZS1uYcOvdmUgdHJhbnNjcmliZXJzIHRvIGNyZWF0ZSBtdWx0aXBsZSwgaW5kZXBlbmRlbnQgdHJhbnNjcmlwdGlvbnMgb2YgdGhlIGhlYWR3b3Jkcy4KRm9yIHRoaXMgcGFwZXIsIHZvd2VscyB3ZXJlIG5vdCBhbmFseXplZCBpZiBhdCBsZWFzdCB0d28gaW5kZXBlbmRlbnQgdHJhbnNjcmlwdGlvbnMgd2VyZSBub3QgeWV0IGF2YWlsYWJsZSAoZXhjbHVzaW9uIGNyaXRlcmlhIGRlc2NyaWJlZCBmdXJ0aGVyIGJlbG93KS4KUmVsZXZhbnQgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBmb3IgYWxsIHRyYW5zY3JpYmVycyBhcmUgcmVwb3J0ZWQgaW4gdGhlIEFwcGVuZGl4LgoKIyMgQ29uc29uYW50YWwgc2tlbGV0b24gZ2VuZXJhdGlvbgoKV2hpbGUgdHJhbnNjcmliZXJzIHdlcmUgbm90IGdpdmVuIG9ydGhvZ3JhcGhpYyBmb3JtcyBvZiB0aGUgaGVhZHdvcmRzIChlLmcuICphcnJhbGtlbmtlKiAndG8geWF3bicpLCB0aGV5IHdlcmUgaG93ZXZlciBwcm92aWRlZCBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29uc29uYW50YWwgc3RydWN0dXJlIGluIElQQSBmb3JtcyAoZS5nLiDJviBpbiBwbGFjZSBvZiAqcnIqKS4KVW5saWtlIGZvciB2b3dlbHMsIHRoZSBjb25zb25hbnRhbCBwbGFjZSBvcHBvc2l0aW9ucyBvZiBLYXl0ZXR5ZSBmb2xsb3cgdGhlIHN0YW5kYXJkIE1heGltYWwgQXVzdHJhbGlhbiBpbnZlbnRvcnkgKEZsZXRjaGVyICYgQnV0Y2hlciwgMjAxNCwgcC4gMTAx4oCTMTAyKS4KVGh1cywgYXMgdm93ZWxzIHdlcmUgdGhlIHByaW9yaXR5IG9mIHRoZSBwcm9qZWN0LCB0cmFuc2NyaWJlcnMgd2VyZSBwcm92aWRlZCB3aXRoIGNvbnNvbmFudGFsIHNrZWxldG9ucywgd2hpY2ggd2VyZSBkZXJpdmVkIGJ5IGNvbnZlcnRpbmcgdGhlIG9ydGhvZ3JhcGhpYyBmb3JtcyB0byBoeXBvdGhldGljYWwgSVBBIGZvcm1zLCBhbmQgdGhlbiByZW1vdmluZyB0aGUgdm93ZWwgc3ltYm9sc+KAlGUuZy4gKmFycmFsa2Vua2UqIOKGkiBbyZDJvsmQbGvJmW5ryZldIOKGkiBbyb5sa25rXS4KQWRkaXRpb25hbGx5LCBhcyB0aGUgS2F5dGV0eWUgZ2xpZGVzIC93LCBqLyBoYXZlIGJlZW4gZGVzY3JpYmVkIHRvIGludGVyYWN0IHdpdGggdm93ZWxzIHRvIHJlbmRlciB2YXJpb3VzIGZ1cnRoZXIgdm9jYWxpYyBxdWFsaXRpZXMgKGUuZy4gZGlwaHRob25ncyksIHRoZSBJUEEgbGFiZWxzIFt3XSBhbmQgW2pdIHdlcmUgYWxzbyByZW1vdmVkIGZyb20gdGhlIHNrZWxldG9uc+KAlHdpdGggdGhlIGdvYWwgYmVpbmcgYW5ub3RhdG9ycyB3aWxsIGJlIHJlcXVpcmVkIHRvIGZpbGwgaW4gcGVyY2VpdmVkIHNlbWktdm9jYWxpYyBxdWFsaXRpZXMgd2hlcmUgdGhleSBkby4KSXQgd2FzIGVtcGhhc2l6ZWQgdGhhdCBwcm92aWRlZCBza2VsZXRvbnMgd2VyZSBoeXBvdGhldGljYWwgZm9ybXMsIGFuZCB0cmFuc2NyaWJlcnMgd2VyZSBpbnN0cnVjdGVkIHRvIHJlcGxhY2Ugb3IgcmVtb3ZlIGFueSBJUEEgbGFiZWxzIHdoZXJlIHRoZXkgZGlzYWdyZWVkIHdpdGggdGhlIHNjcmlwdC1nZW5lcmF0ZWQgbGFiZWxzLgoKIyMgQW5ub3RhdGlvbiBlbnZpcm9ubWVudAoKQWxsIGFubm90YXRpb25zIG9mIHRoZSBzb3VuZCBmaWxlcyB3ZXJlIGNhcnJpZWQgb3V0IGluIFByYWF0IChCb2Vyc21hICYgV2VlbmluaywgMjAxOCkuCkFubm90YXRvcnMgd2VyZSBnaXZlbiBzZXBhcmF0ZSBhbm9ueW1pemVkIHNvdW5kIGZpbGVzIGFuZCBhY2NvbXBhbnlpbmcgVGV4dEdyaWQsIGFuZCBhbm5vdGF0b3JzIGRpZCBub3Qgc2VlIGVhY2ggb3RoZXIncyB0cmFuc2NyaXB0aW9ucy4KQXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2Vzc2lvbiwgYW5ub3RhdG9ycyByZXNldCBhbGwgUHJhYXQgc2V0dGluZ3MgYW5kIHR1cm5lZCBvZmYgYWxsIG92ZXJsYXlzLgpTcGVjdHJvZ3JhbSBzZXR0aW5ncyB3ZXJlIGFkanVzdGVkIHRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBWaWV3IHJhbmdlLCAwLTgga0h6OyBEeW5hbWljIHJhbmdlOiA0MC4wIGRCLgpXYXZlZm9ybSBzZXR0aW5ncyB3ZXJlIGxlZnQgdG8gUHJhYXTigJlzIHN0YW5kYXJkIHZhbHVlcy4KUGl0Y2ggYW5kIGludGVuc2l0eSBvdmVybGF5cyB3ZXJlIHR1cm5lZCBvZmYgYW5kIHdlcmUgb25seSB1c2VkIGFzIHRvIGdhdGhlciBhZGRpdGlvbmFsIGN1ZXMgd2hlbiBuZWNlc3NhcnksIGUuZy4gYWRqdXN0aW5nIHRoZSBkaXNwbGF5IHNldHRpbmdzIHRvIGRldGVybWluZSBsb2NhbCBpbmZsZWN0aW9uIHBvaW50cyBpbiB0aGUgc2lnbmFsLgoKIyMgQW5ub3RhdGlvbiBwcm9jZWR1cmUKClRoZSBzdGVwcyByZXBvcnRlZCBiZWxvdyBnaXZlcyBhbiBvdmVydmlldyBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIHRvIHRoZSBhbm5vdGF0b3JzLgpUaGUgZnVsbCBpbnN0cnVjdGlvbnMgYXJlIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeC4KUHJpb3IgdG8gYmVpbmcgZ2l2ZW4gYW5vbnltaXplZCBmaWxlcyB0byBhbm5vdGF0ZSBmb3IgdGhlIGZpcnN0IHRpbWUsIGFsbCBhbm5vdGF0b3JzIGFyZSBnaXZlbiB0ZXN0IHNldHMgZm9yIHByYWN0aWNlIGFuZCBvbiB3aGljaCB0aGV5IHJlY2VpdmUgZmVlZGJhY2suCgoxLiBBZGp1c3QgdGhlIHdvcmQgYm91bmRhcmllcyBnaXZlbiBieSB0aGUgY29uc29uYW50YWwgc2tlbGV0b24gb24gdGhlIElQQSB0aWVyIHRvIGFwcHJveGltYXRlIGxvY2F0aW9ucy4KCjIuIEZvciBlYWNoIHZvY2FsaWMgaW50ZXJ2YWwgcGVyY2VpdmVkIGluIHRoZSB3b3JkLCBnaXZlIGFuIElQQSBsYWJlbCBwbGFjaW5nIGl0IHdpdGhpbiB0aGUgY29uc29uYW50YWwgc2tlbGV0b24gYXMgYXBwcm9wcmlhdGUsIGUuZy4gW8m+bGtua10g4oaSIFvJkMm+y4jKjGxryZlua10uIFB1dCBhIHN0cmVzcyBtYXJrIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHZvd2VsIHBlcmNlaXZlZCBtb3N0IHByb21pbmVudCB3aXRoaW4gdGhlIHdvcmQuCgozLiBGb3IgZWFjaCBJUEEgdm93ZWwgbGFiZWwgdXNlZCB3aXRoaW4gdGhlIHdvcmQsIHBsYWNlIGFuIGludGVydmFsIG9uIHRoZSBWb3dlbHMgdGllciBhbmQgYWRqdXN0IHRoZSB2b3dlbCBib3VuZGFyaWVzIHRvIGFwcHJvcHJpYXRlIGxvY2F0aW9ucyBieSBpbnNwZWN0aW5nIGNoYW5nZXMgaW4gdGhlIHdhdmVmb3JtIGFuZCBzcGVjdHJvZ3JhbS4gSWYgdGhlIHZvd2VsIGlzIHBlcmNlaXZlZCBhcyB0aGUgcHJpbWFyeSBzdHJlc3NlZCB2b3dlbCwgcGxhY2UgYSBzdHJlc3MgbWFya2VyIG9uIHRoZSBsZWZ0IG9mIHRoZSBsYWJlbCwgZS5nLiBby4jKjF0uIElmIHRoZSB2b3dlbCBpcyB3b3JkLWluaXRpYWwgb3Igd29yZC1maW5hbCwgcGxhY2UgYSBib3VuZGFyeSBtYXJrZXIgIyBvbiB0aGUgcmVsZXZhbnQgc2lkZSBvZiB0aGUgdm93ZWwgbGFiZWwsIGUuZy4gWyPJkF0uCgpGaWd1cmUgYHIgcGxhY2Vob2xkZXJgIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIHRoZSBhbm5vdGF0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHRoZSBwcm9jZWR1cmUgYWJvdmUgb24gdHdvIHJlcGV0aXRpb25zIG9mIGEgS2F5dGV0eWUgaGVhZHdvcmQgKmFycmFsa2Vua2UqIOKAmHRvIHlhd27igJksIHdoaWNoIGhhZCBiZWVuIGFub255bWl6ZWQgYXMgYGIwMDZfZmlsZTE1LndhdmAgYW5kIHdob3NlIGNvbnNvbmFudGFsIHNrZWxldG9uIHdhcyBhcHByb3hpbWF0ZWQgYXMgW8m+bGtua10sIGZyb20gd2hpY2ggdHdvIGFubm90YXRvcnMgKEtSLCBOUykgcHJvdmlkZWQgaW5kZXBlbmRlbnQgdHJhbnNjcmlwdGlvbnMgKHBsYWNlZCBvbiB0aGUgJ0lQQScgdGllcikgYXMgd2VsbCBhcyB0ZW1wb3JhbCBsb2NhdGlvbnMgZm9yIGFsbCBwZXJjZWl2ZWQgdm9jYWxpYyBpbnRlcnZhbHMgKHBsYWNlZCBvbiB0aGUgJ1Zvd2VscycgdGllcikuCgo8cCBhbGlnbj0iY2VudGVyIj4hW10oYHIgaGVyZSgicmVwb3J0cy9maWd1cmVzL2IwMDZfZmlsZTE1X2VkaXRlZC5wbmciKWApPC9wPgoKKipGaWd1cmUgYHIgcGxhY2Vob2xkZXJgKiogQW4gaWxsdXN0cmF0aW9uIG9mIHdvcmQtbGV2ZWwgYW5kIHZvd2VsLWxldmVsIHNlZ21lbnRhdGlvbnMgYnkgdHdvIGFubm90YXRvcnMgKEtSLCBOUykgb2YgdHdvIHJlcGV0aXRpb25zIG9mIGEgS2F5dGV0eWUgd29yZCAqYXJyYWxrZW5rZSog4oCYdG8geWF3buKAmSwgYWNjZXNzZWQgYXMgYW4gYW5vbnltaXplZCBmaWxlIGBiMDA2X2ZpbGUxNS53YXZgIHdpdGggYW4gZXN0aW1hdGUgb2YgdGhlIHdvcmTigJlzIGNvbnNvbmFudGFsIHNrZWxldG9uICjJvmxrbmspLgoKIyBEYXRhIHByZS1wcm9jZXNzaW5nCgojIyBBbm5vdGF0aW9uIGRhdGEKCkFubm90YXRpb24gZGF0YSBmcm9tIGFsbCBUZXh0R3JpZHMgd2VyZSBwcm9jZXNzZWQgd2l0aGluIFIgKFIgQ29yZSBUZWFtLCAyMDE4KS4gQWxsIHByb2Nlc3Npbmcgc2NyaXB0cyBhbmQgcmVzdWx0aW5nIGRhdGEgYXJlIG9wZW5seSBhY2Nlc3NpYmxlIHZpYSBhIFplbm9kbyBhcmNoaXZlIChTYW4gZXQgYWwuLCAyMDE4KS4gVGh1cywgYSBjb25jZXB0dWFsIG92ZXJ2aWV3IGlzIHByb3ZpZGVkIGhlcmUuCgpUYWJsZSBgciBwbGFjZWhvbGRlcmAgcHJvdmlkZXMgYSBzYW1wbGUgb2YgOCByb3dzIGZyb20gb3VyIGFuYWx5c2lzIGRhdGFzZXQuClRoaXMgc3Vic2V0IGlzIHRoZSByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgVGV4dEdyaWQgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gRmlndXJlIGByIHBsYWNlaG9sZGVyYC4KQXMgY2FuIGJlIHNlZW4gZnJvbSB0aGUgcm93cywgdGhlIHByaW1hcnkgb2JzZXJ2YXRpb24gdW5pdHMgaW4gdGhlIGRhdGFzZXQgYXJlIHRoZSB2b3dlbCBsYWJlbHMsIHdoaWNoIGhhZCBiZWVuIHByb3ZpZGVkIGJ5IHRoZSBhbm5vdGF0b3JzIChlLmcuIGtyLCBucykgYXMgVGV4dEdyaWQgaW50ZXJ2YWxzIG9uIHRoZSBWb3dlbHMgdGllci4KVXNpbmcgdGhlIG1pZC1wb2ludCBvZiB0aGUgVGV4dEdyaWQgaW50ZXJ2YWxzLCBjb3JyZXNwb25kaW5nIHdvcmQtbGV2ZWwgaW5mb3JtYXRpb24gKGkuZS4gcmVwZXRpdGlvbiBudW1iZXIgYW5kIHRyYW5zY3JpcHRpb24pIHdlcmUgdGhlbiByZXRyaWV2ZWQgZm9yIGVhY2ggdm93ZWwgbGFiZWwgZnJvbSB0cmFuc2NyaXB0aW9ucyBwcm92aWRlZCBieSB0aGUgYW5ub3RhdG9ycyBvbiB0aGUgSVBBIHRpZXIuCkZvciBlYWNoIHZvd2VsIGxhYmVsIHNldCB3aXRoaW4gYSByZXBldGl0aW9uIChlLmcuIFvJkCwgyowsIMmZXSBmb3IgcmVwZXRpdGlvbiAxIGFubm90YXRlZCBieSBrcikgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHdvcmQtbGV2ZWwgdHJhbnNjcmlwdGlvbiAoZS5nLiBbyZDJvsqMbGvJmW5rXSksIGEgY29uc29uYW50YWwgY29udGV4dCBzZXQgd2FzIGRlcml2ZWQgKGUuZy4gWyNfyb4sIMm+X2wsIGtfbl0pLgpJbml0aWFsLSBhbmQgZmluYWwtdm93ZWxzLCBpLmUuIHRob3NlIGhhdmluZyAnIycgdGhlaXIgZGVyaXZlZCBjb250ZXh0LCB3ZXJlIHRoZW4gZXhjbHVkZWQsIGFuZCB2b3dlbCBudW1iZXJzIHdlcmUgYXNzaWduZWQgdG8gcmVtYWluaW5nIG1lZGlhbCB2b3dlbHMsIHN0YXJ0aW5nIGZyb20gdGhlIGxlZnQgKGUuZy4gW8qMXSBpcyB0aGUgZmlyc3QgbWVkaWFsIHZvd2VsIGluIFvJkMm+yoxsa8mZbmtdKS4gCgpgYGB7ciBBbmFseXNpcyB0YWJsZX0Kc2V0LnNlZWQoMTApCnZvd2Vsc19tZWRfYW5hbHlzaXMgJT4lCiAgICBtdXRhdGUobWlkcG9pbnQgPSAodm93ZWwueG1pbiArICgodm93ZWwueG1heCAtIHZvd2VsLnhtaW4pIC8gMikpICU+JSByb3VuZChkaWdpdHMgPSAyKSkgJT4lIAogICAgc2VsZWN0KAogICAgICAgIGBWb3dlbCBsYWJlbGAgPSBiYXNlX3Zvd2VsLAogICAgICAgIGBDb250ZXh0YCA9IGNvbnN0X2N0eCwKICAgICAgICBgQW5ub3RhdG9yYCA9IGFubm90YXRvciwKICAgICAgICBgTWVkaWFsIHZvd2VsYCA9IHZvd2VsX251bSwKICAgICAgICBgVm93ZWwgbWlkcG9pbnRgID0gbWlkcG9pbnQsCiAgICAgICAgYFdvcmQgcmVwLmAgPSByZXBfbnVtLAogICAgICAgIGBXb3JkIElQQWAgPSBiYXNlX3RyYW5zY3JpcHRpb24sCiAgICAgICAgYEZpbGVgID0gc291cmNlX2ZpbGUKICAgICkgJT4lCiAgICBmaWx0ZXIoRmlsZSA9PSAiYjAwNl9maWxlMTUiKQoKYGBgCgojIyBGb3JtYW50IGRhdGEKCkZvcm1hbnQgZGF0YSBmb3IgZWFjaCAud2F2IGZpbGUgKGUuZy4gYGIwMDZfZmlsZTE1LndhdmApIHdlcmUgZGVyaXZlZCB1c2luZyB0d28gZm9ybWFudCB0cmFja2VyczogUHJhYXQgYW5kIEZvcmVzdCwgKipGb3IqKm1hbnQgKiplc3QqKmltYXRpb24gZnVuY3Rpb24gYGZvcmVzdCgpYCBmcm9tIHRoZSB3cmFzc3AgUiBwYWNha2dlIChCb21iaWVuLCBXaW5rZWxtYW5uICYgU2NoZWZmZXJzLCAyMDE4KS4KUHJhYXQgZm9ybWFudCB0cmFja2luZyB3YXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBCdXJnIG1ldGhvZCBhbmQgdGhlIGRlZmF1bHQgcGFyYW1ldGVyczogVGltZSBzdGVwIDAuMCBzLCBNYXhpbXVtIG51bWJlciBvZiBmb3JtYW50czogNSwgTWF4aW11bSBmb3JtYW50OiA1NTAwIEh6LCBXaW5kb3cgbGVuZ3RoOiAwLjAyNSBzLCBQcmUtZW1waGFzaXM6IDUwIEh6LgpGb3Jlc3QgZm9ybWFudCB0cmFja2luZyB3YXMgYWxzbyBwZXJmb3JtZWQgdXNpbmcgZGVmYXVsdCBwYXJhbWV0ZXJzIG9mIHRoZSBmb3Jlc3QoKSBSIGZ1bmN0aW9uOiB3aW5kb3dTaGlmdDogNSwgd2luZG93U2l6ZTogMzAsIG5vbWluYWxGMTogNTAwIEh6LCBudW1Gb3JtYW50czogNCwgd2luZG93OiBCTEFDS01BTiwgcHJlZW1waGFzaXM6IGRlcml2ZWQgZnJvbSBzYW1wbGUgcmF0ZSBhbmQgbm9taW5hbCBGMS4KRGF0YSBmcm9tIGJvdGggdHJhY2tlcnMgd2VyZSBleHBvcnRlZCBpbnRvIGNvcnJlc3BvbmRpbmcgQ1NWIGZpbGVzIChlLmcuIGBiMDA2X2ZpbGUxNS5mb3JtYW50cy5mb3Jlc3QuY3N2YCBhbmQgYGBiMDA2X2ZpbGUxNS5mb3JtYW50cy5wcmFhdC5jc3ZgYCkuClRhYmxlIGByIHBsYWNlaG9sZGVyYCBiZWxvdyBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgcmVzdWx0aW5nIGZvcm1hbnQgZGF0YSwgZGlzcGxheWluZyAzIHJhbmRvbWx5IHNhbXBsZWQgdGltZSBwb2ludHMgZm9yIGVhY2ggdHJhY2tlciBmb3IgdGhlIGZpbGUgYGIwMDZfZmlsZTE1YC4KCmBgYHtyIEZvcm1hbnRzIHRhYmxlLCBtZXNzYWdlPUZBTFNFfQpzZXQuc2VlZCg1KQogICAgCmxpc3QuZmlsZXMoIi4uLy4uL2RhdGEvcmF3L2IwMDYvYjAwNl8xNSIsIHBhdHRlcm4gPSAiY3N2IiwgZnVsbC5uYW1lcyA9IFRSVUUpICU+JQogICAgbWFwKHJlYWRfY3N2KSAlPiUKICAgIG1hcF9pZih+IG5jb2woLikgPT0gNSwgfiBzZWxlY3QoLiwgdGltZSwgZjEsIGYyKSAlPiUgbXV0YXRlKHRyYWNrZXIgPSAiZm9yZXN0IikpICU+JQogICAgbWFwX2lmKH4gbmNvbCguKSA+IDUsIH4gc2VsZWN0KC4sIHRpbWUgPSBgdGltZShzKWAsIGYxID0gYEYxKEh6KWAsIGYyID0gYEYyKEh6KWApICU+JSBtdXRhdGUodHJhY2tlciA9ICJwcmFhdCIpKSAlPiUKICAgIGJpbmRfcm93cygpICU+JQogICAgbXV0YXRlKGZpbGUgPSAiYjAwNl9maWxlMTUiKSAlPiUKICAgIGZpbHRlcihmMSA+IDAsIGYyID4gMCkgJT4lCiAgICBncm91cF9ieSh0cmFja2VyKSAlPiUgCiAgICBzYW1wbGVfbigzKSAlPiUKICAgIG11dGF0ZV9pZihpcy5udW1lcmljLCB+IHJvdW5kKC4sIGRpZ2l0cyA9IDIpKSAlPiUgCiAgICBzZWxlY3QoCiAgICAgICAgRmlsZSAgICAgICA9IGZpbGUsCiAgICAgICAgVHJhY2tlciAgICA9IHRyYWNrZXIsCiAgICAgICAgYFRpbWUgKHMpYCA9IHRpbWUsCiAgICAgICAgYEYxIChIeilgICA9IGYxLAogICAgICAgIGBGMiAoSHopYCAgPSBmMgogICAgKQoKYGBgCgojIyBBbmFseXNpcyBkYXRhc2V0CgpVc2luZyB0aGUgbWlkLXBvaW50IHZhbHVlIG9mIHRoZSB2b3dlbCBsYWJlbHMsIGNvcnJlc3BvbmRpbmcgZmlyc3QgYW5kIHNlY29uZCBmb3JtYW50IHZhbHVlcyBmb3IgZWFjaCB2b3dlbCB3ZXJlIHJldHJpZXZlZC4gClRhYmxlIGByIHBsYWNlaG9sZGVyYCBkaXNwbGF5cyB0aGUgcmVzdWx0IG9mIGFwcGVuZGluZyBmb3JtYW50IGluZm9ybWF0aW9uIHRvIHRoZSBhbm5vdGF0aW9uIGRhdGEuCkZvciBhbGwgZm9ybWFudCB2YWx1ZXMsIHotc2NvcmVzIHdlcmUgY2FsY3VsYXRlZCBmb3IgYm90aCByYXcgdmFsdWVzLCBlLmcuIGZvciBGMSAoUHJhYXQpLCBGMSAoRm9yZXN0KSwgZXRjLiwgYXMgd2VsbCBhcyB0cmFja2VyLWRpZmZlcmVuY2VzIChlLmcuIEYxIChGb3Jlc3QpIC0gRjEgKFByYWF0KSwgRjIgKEZvcmVzdCkgLSBGMiAoUHJhYXQpKS4gCgpgYGB7cn0Kdm93ZWxzX21lZF9hbmFseXNpcyAlPiUKICAgIGZpbHRlcihzb3VyY2VfZmlsZSA9PSAiYjAwNl9maWxlMTUiLCByZXBfbnVtID09IDEpICU+JSAKICAgIG11dGF0ZShtaWRwb2ludCA9ICh2b3dlbC54bWluICsgKCh2b3dlbC54bWF4IC0gdm93ZWwueG1pbikgLyAyKSkgJT4lIHJvdW5kKGRpZ2l0cyA9IDIpKSAlPiUgCiAgICB1bmdyb3VwICU+JSAKICAgIG11dGF0ZV9pZihpcy5udW1lcmljLCB+IHJvdW5kKC4sIGRpZ2l0cyA9IDIpKSAlPiUgCiAgICBzZWxlY3QoCiAgICAgICAgYFZvd2VsIGxhYmVsYCA9IGJhc2Vfdm93ZWwsCiAgICAgICAgYENvbnRleHRgID0gY29uc3RfY3R4LAogICAgICAgIGBBbm5vdGF0b3JgID0gYW5ub3RhdG9yLAogICAgICAgIGBNZWRpYWwgdm93ZWxgID0gdm93ZWxfbnVtLAogICAgICAgIGBWb3dlbCBtaWRwb2ludGAgPSBtaWRwb2ludCwKICAgICAgICBgV29yZCByZXAuYCA9IHJlcF9udW0sCiAgICAgICAgYEZpbGVgID0gc291cmNlX2ZpbGUsCiAgICAgICAgYEYxIChQcmFhdClgID0gcHJhYXQuZjEsCiAgICAgICAgYEYyIChQcmFhdClgID0gcHJhYXQuZjIsCiAgICAgICAgYEYxIChGb3Jlc3QpYCA9IGZvcmVzdC5mMSwKICAgICAgICBgRjIgKEZvcmVzdClgID0gZm9yZXN0LmYyCiAgICApCgpgYGAKCkZvciBkYXRhIHNhbml0aXphdGlvbiBwdXJwb3NlcywgZmlsZXMgd2l0aCBkaWZmZXJpbmcgbnVtYmVyIG9mIHRyYW5zY3JpYmVkIHdvcmQgcmVwZXRpdGlvbnMgYmV0d2VlbiBhbm5vdGF0b3JzIHdlcmUgZXhjbHVkZWQuCldvcmQgcmVwZXRpdGlvbnMgd2hvc2Ugdm93ZWwgbGFiZWwgc2V0IGRpZmZlcmVkIGJldHdlZW4gdGhlIFZvd2VscyBhbmQgSVBBIHRpZXJzIGluIHRoZSBUZXh0R3JpZCB3ZXJlIGV4Y2x1ZGVkLgpWb3dlbHMgd2hvc2UgY29uc29uYW50YWwgY29udGV4dCBjb3VsZCBub3QgYmUgZGVyaXZlZCBieSB0aGUgc2NyaXB0IHdlcmUgZXhjbHVkZWQuCldvcmQgcmVwZXRpdGlvbnMgZm9yIHdoaWNoIGFubm90YXRvcnMgZGlzYWdyZWVkIG9uIHRoZSBudW1iZXIgb2YgbWVkaWFsIHZvd2VscyB3ZXJlIGV4Y2x1ZGVkLgpCYXNlZCBvbiB0aGUgZm9ybWFudCBpbmZvcm1hdGlvbiB6LXNjb3Jlcywgd2UgZXhsY3VkZWQgYWxsIG9ic2VydmF0aW9ucyBhbnkgb2Ygd2hvc2Ugei1zY29yZXMgbGllZCBvdXRzaWRlIG9mIDMgc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuLgpWb3dlbHMgZm9yIHdoaWNoIG9ubHkgb2JzZXJ2YXRpb25zIGZyb20gYSBzaW5nbGUgYW5ub3RhdG9yIHJlbWFpbmVkIGR1ZSB0byB0aGVzZSBleGNsdXNpb24gY3JpdGVyaWEgd2VyZSBhbHNvIHN1YnNlcXVlbnRseSBleGNsdWRlZC4KVGhlIHJlc3VsdGluZyBzYW5pdGlzZWQgZGF0YXNldCBhbW91bnRlZCB0byA2NCUgb2YgdGhlIHJhdyBtZWRpYWwtdm93ZWwgZGF0YSAoMTE3MDMgb3V0IG9mIDE4MTY1IG9ic2VydmF0aW9ucykuCgojIFVuc3VwZXJ2aXNlZCBjbHVzdGVyaW5nIHByb2NlZHVyZQoKVG8gcXVhbnRpdGF0aXZlbHkgZ2VuZXJhdGUgY2FuZGlkYXRlIHNldHMgb2YgYWNvdXN0aWMgdm93ZWwgY2F0ZWdvcmllcywgd2UgcGVyZm9ybWVkIHVuc3VwZXJ2aXNlZCBjbHVzdGVyaW5nIG9uIHRoZSB6LW5vcm1hbGl6ZWQgbWlkLXBvaW50ICRGXzEkIGFuZCAkRl8yJCB2YWx1ZXMgdXNpbmcgZmluaXRlIEdhdXNzaWFuIG1peHR1cmUgbW9kZWxzIChHTU1zKSwgaW1wbGVtZW50ZWQgYnkgdGhlIGBtY2x1c3RgIFIgcGFja2FnZSAodi4gNS40LjE6IFNjcnVjY2EsIEZvcCwgTXVycGh5LCAmIFJhZnRlcnksIDIwMTYpLgpHTU1zIG1vZGVsIGRhdGEgYXMgYSBtaXh0dXJlIGRpc3RyaWJ1dGlvbiwgY29tcHJpc2luZyBhIGZpbml0ZSBudW1iZXIgb2YgY29tcG9uZW50IEdhdXNzaWFuIGRpc3RyaWJ1dGlvbnMsICRHJCwgZWFjaCBwYXJhbWV0ZXJpemVkIGJ5IGEgbWVhbiDOvCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIM+DIChlLmcuIGEgMS1kaW1lbnNpb25hbCBiaW1vZGFsIGRpc3RyaWJ1dGlvbiBjb3VsZCBiZSBtb2RlbGxlZCBhcyBhIG1peHR1cmUgb2YgdHdvIGxhdGVudCBHYXVzc2lhbiBkaXN0cmlidXRpb25zLCAkR18xOiA8zrxfMSwgz4NfMT4kIGFuZCAkR18yOiA8zrxfMiwgz4NfMj4kLCB3aG9zZSBwZWFrcyBvY2N1ciBhdCAkzrxfMSQgYW5kICTOvF8yJCByZXNwZWN0aXZlbHkpLgpXaXRoaW4gYSBnaXZlbiBtaXh0dXJlIG1vZGVsLCBvcHRpbWFsIHBhcmFtZXRlcnMgd2VyZSBlc3RpbWF0ZWQgaXRlcmF0aXZlbHkgdXNpbmcgdGhlIEV4cGVjdGF0aW9uIE1heGltaXphdGlvbiBhbGdvcml0aG0gKGZvciBhbiBpbnRyb2R1Y3Rpb24gdG8gRU0sIHNlZSBEbyAmIEJhdHpvZ2xvdSwgMjAwOCkuCkJldHdlZW4gbWl4dHVyZSBtb2RlbHMgKGUuZy4gMi0gdnMuIDMtY29tcG9uZW50IG1vZGVscyksIHRoZSBvcHRpbWFsIG1vZGVsIHdhcyBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgaW50ZWdyYXRlZCBjb21wbGV0ZS1kYXRhIGxpa2VsaWhvb2QgKElDTCkgY3JpdGVyaW9uIChTY3J1Y2NhIGV0IGFsLiwgMjAxNiwgcC4gMjk5KS4KCkdpdmVuIHRoYXQgcmFuZG9tIHBhcmFtZXRlcnMgdmFsdWVzIGFyZSBpbml0aWFsbHkgc2VsZWN0ZWQgdG8gYmUgb3B0aW1pemVkIGJ5IHRoZSBFTSBhbGdvcml0aG0sIHRoZSBzdWJzZXF1ZW50IGZpdCBvZiBhIEdNTSBjYW4gYmUgbGltaXRlZCBieSB0aGUgaW5pdGlhbGl6YXRpb24gc2V0dGluZ3MuClRodXMsIGZvciBlYWNoIGRpc3RyaWJ1dGlvbiBvZiBtaWQtcG9pbnQgJEZfMSQgYW5kICRGXzIkIHZhbHVlcyBhcyBtZWFzdXJlZCBieSB0d28gc2VwYXJhdGUgZm9ybWFudCB0cmFja2VycyAoRm9yZXN0IGFuZCBQcmFhdCksIHdlIHBlcmZvcm1lZCAxMCwwMDAgaXRlcmF0aW9ucyBvZiBHTU0gZml0dGluZy4KRnVydGhlciwgYXMgZWFjaCB2b2NhbGljIGludGVydmFsIHdhcyBpZGVudGlmaWVkIGJ5IG11bHRpcGxlIGFubm90YXRvcnMgd2hvc2UgbWFya2luZyBvZiB0aGUgbWlkLXBvaW50IGxvY2F0aW9uIG1heSB2YXJ5IHNsaWdodGx5IChhbmQgdGh1cyB0aGUgbWVhc3VyZWQgJEZfMSQgYW5kICRGXzIkIHZhbHVlcyksIGVhY2ggaXRlcmF0aW9uIHNhbXBsZWQgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiB0aGUgbWlkLXBvaW50IGxvY2F0aW9ucy4KRm9yIGFuYWx5dGljYWwgcmVwcm9kdWNpYmlsaXR5LCB3ZSBwcmUtY29tcHV0ZWQgcmFuZG9tIHNlZWRzIGFuZCB0aGUgc2FtZSBzZWVkIHdhcyBzdXBwbGllZCBmb3IgYWxsIHByb2NlZHVyZXMgaW52b2x2aW5nIHJhbmRvbWl6YXRpb24gd2l0aGluIGEgZ2l2ZW4gaXRlcmF0aW9uLgpUaGUgZml0dGluZyBwcm9jZXNzIHRvb2sgYXBwcm94aW1hdGVseSA0IGhvdXJzIG9uIGEgZGVkaWNhdGVkIGNvbXB1dGUgc2VydmVyIHdpdGggMjQgQ1BVIGNvcmVzIChhdCAyLjIgR0h6IGVhY2gpIGFuZCAyNTYgR0IgUkFNLCBydW5uaW5nIFVidW50dSAxOC4wNC4wMSBMVFMgYW5kIFIgMy41LjAuCgoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KaDEsIGgyLCBoMywgaDQsIGg1IHsgZm9udC1zaXplOjEuMWVtIH0KPC9zdHlsZT4K